@mnaoumov/obsidian-dev-toolkit 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/dist/demo-vault-helper/main.js +678 -18
- package/dist/integration-test-plugin/main.js +12075 -3087
- package/dist/integration-test-plugin/manifest.json +2 -2
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +6 -38
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/dependency.cjs +5 -37
- package/dist/lib/cjs/bundlers/esbuild-impl/dependency.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +5 -37
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +7 -66
- package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +7 -39
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +5 -37
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.cjs +5 -37
- package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild.cjs +1 -60
- package/dist/lib/cjs/bundlers/esbuild.d.cts +1 -1
- package/dist/lib/cjs/bundlers/index.cjs +3 -62
- package/dist/lib/cjs/bundlers/index.d.cts +1 -1
- package/dist/lib/cjs/demo-vault-app-json.cjs +5 -37
- package/dist/lib/cjs/demo-vault-app-json.d.cts +1 -1
- package/dist/lib/cjs/demo-vault-buttons.cjs +6 -38
- package/dist/lib/cjs/demo-vault-buttons.d.cts +8 -8
- package/dist/lib/cjs/demo-vault-coverage.cjs +7 -38
- package/dist/lib/cjs/demo-vault-coverage.d.cts +1 -1
- package/dist/lib/cjs/demo-vault.cjs +6 -38
- package/dist/lib/cjs/demo-vault.d.cts +1 -1
- package/dist/lib/cjs/formatters/dprint.cjs +5 -37
- package/dist/lib/cjs/formatters/dprint.d.cts +1 -1
- package/dist/lib/cjs/formatters/index.cjs +2 -61
- package/dist/lib/cjs/formatters/index.d.cts +1 -1
- package/dist/lib/cjs/index.cjs +12 -71
- package/dist/lib/cjs/integration-test-setup.cjs +1 -60
- package/dist/lib/cjs/integration-test-setup.d.cts +5 -5
- package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +6 -38
- package/dist/lib/cjs/integration-test-vitest-global-setup.d.cts +7 -7
- package/dist/lib/cjs/jest-setup.cjs +5 -37
- package/dist/lib/cjs/jest-setup.d.cts +1 -1
- package/dist/lib/cjs/library-references.d.cts +2 -0
- package/dist/lib/cjs/linters/eslint-config.cjs +71 -49
- package/dist/lib/cjs/linters/eslint-config.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +26 -73
- package/dist/lib/cjs/linters/eslint-rules/index.d.cts +6 -2
- package/dist/lib/cjs/linters/eslint-rules/manifest-description.cjs +1 -60
- package/dist/lib/cjs/linters/eslint-rules/manifest-description.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.cjs +6 -38
- package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/manifest-id.cjs +1 -60
- package/dist/lib/cjs/linters/eslint-rules/manifest-id.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/manifest-name.cjs +1 -60
- package/dist/lib/cjs/linters/eslint-rules/manifest-name.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/manifest-schema.cjs +1 -60
- package/dist/lib/cjs/linters/eslint-rules/manifest-schema.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.cjs +240 -0
- package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +5 -37
- package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.cjs +5 -37
- package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-toolkit-plugin.cjs +136 -0
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-toolkit-plugin.d.cts +16 -0
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.cjs +217 -0
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.d.cts +30 -0
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.cjs +169 -0
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.d.cts +29 -0
- package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.cjs +5 -37
- package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.d.cts +1 -1
- package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.cjs +287 -0
- package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint.cjs +5 -37
- package/dist/lib/cjs/linters/eslint.d.cts +1 -1
- package/dist/lib/cjs/linters/index.cjs +17 -67
- package/dist/lib/cjs/linters/index.d.cts +4 -1
- package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +152 -0
- package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +12 -0
- package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +118 -0
- package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +2 -0
- package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.cjs +200 -0
- package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.d.cts +32 -0
- package/dist/lib/cjs/linters/markdownlint.cjs +5 -37
- package/dist/lib/cjs/linters/markdownlint.d.cts +1 -1
- package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.cjs +1 -60
- package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.d.cts +1 -1
- package/dist/lib/cjs/linters/plugin-names.cjs +203 -0
- package/dist/lib/cjs/linters/plugin-names.d.cts +81 -0
- package/dist/lib/cjs/obsidian-plugin-repo-paths.cjs +1 -60
- package/dist/lib/cjs/obsidian-plugin-repo-paths.d.cts +1 -1
- package/dist/lib/cjs/setup.cjs +5 -37
- package/dist/lib/cjs/setup.d.cts +1 -1
- package/dist/lib/cjs/templates.cjs +5 -37
- package/dist/lib/cjs/templates.d.cts +1 -1
- package/dist/lib/cjs/test-runners/index.cjs +4 -63
- package/dist/lib/cjs/test-runners/index.d.cts +1 -1
- package/dist/lib/cjs/test-runners/integration-test-plugin.cjs +12 -44
- package/dist/lib/cjs/test-runners/integration-test-plugin.d.cts +5 -5
- package/dist/lib/cjs/test-runners/performance-eval-cap.cjs +1 -60
- package/dist/lib/cjs/test-runners/performance-eval-cap.d.cts +1 -1
- package/dist/lib/cjs/test-runners/stale-build-global-setup.cjs +5 -37
- package/dist/lib/cjs/test-runners/stale-build-global-setup.d.cts +1 -1
- package/dist/lib/cjs/test-runners/vitest-config.cjs +9 -41
- package/dist/lib/cjs/test-runners/vitest-config.d.cts +2 -3
- package/dist/lib/cjs/version.cjs +5 -37
- package/dist/lib/cjs/version.d.cts +1 -1
- package/dist/lib/cjs/vitest-setup.cjs +5 -37
- package/dist/lib/cjs/vitest-setup.d.cts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +5 -22
- package/dist/lib/esm/bundlers/esbuild-impl/dependency.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/dependency.mjs +5 -22
- package/dist/lib/esm/bundlers/esbuild-impl/fix-source-maps-plugin.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +5 -22
- package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +1 -45
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +5 -22
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +5 -22
- package/dist/lib/esm/bundlers/esbuild-impl/rename-css-plugin.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/rename-css-plugin.mjs +5 -22
- package/dist/lib/esm/bundlers/esbuild.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild.mjs +1 -45
- package/dist/lib/esm/bundlers/index.d.mts +1 -1
- package/dist/lib/esm/bundlers/index.mjs +1 -45
- package/dist/lib/esm/demo-vault-app-json.d.mts +1 -1
- package/dist/lib/esm/demo-vault-app-json.mjs +5 -22
- package/dist/lib/esm/demo-vault-buttons.d.mts +8 -8
- package/dist/lib/esm/demo-vault-buttons.mjs +5 -22
- package/dist/lib/esm/demo-vault-coverage.d.mts +1 -1
- package/dist/lib/esm/demo-vault-coverage.mjs +7 -23
- package/dist/lib/esm/demo-vault.d.mts +1 -1
- package/dist/lib/esm/demo-vault.mjs +6 -23
- package/dist/lib/esm/formatters/dprint.d.mts +1 -1
- package/dist/lib/esm/formatters/dprint.mjs +5 -22
- package/dist/lib/esm/formatters/index.d.mts +1 -1
- package/dist/lib/esm/formatters/index.mjs +1 -45
- package/dist/lib/esm/index.mjs +1 -45
- package/dist/lib/esm/integration-test-setup.d.mts +5 -5
- package/dist/lib/esm/integration-test-setup.mjs +1 -45
- package/dist/lib/esm/integration-test-vitest-global-setup.d.mts +7 -7
- package/dist/lib/esm/integration-test-vitest-global-setup.mjs +7 -24
- package/dist/lib/esm/jest-setup.d.mts +1 -1
- package/dist/lib/esm/jest-setup.mjs +5 -22
- package/dist/lib/esm/library-references.d.mts +2 -0
- package/dist/lib/esm/linters/eslint-config.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-config.mjs +70 -33
- package/dist/lib/esm/linters/eslint-rules/index.d.mts +6 -2
- package/dist/lib/esm/linters/eslint-rules/index.mjs +12 -48
- package/dist/lib/esm/linters/eslint-rules/manifest-description.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/manifest-description.mjs +1 -45
- package/dist/lib/esm/linters/eslint-rules/manifest-helpers.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/manifest-helpers.mjs +5 -22
- package/dist/lib/esm/linters/eslint-rules/manifest-id.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/manifest-id.mjs +1 -45
- package/dist/lib/esm/linters/eslint-rules/manifest-name.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/manifest-name.mjs +1 -45
- package/dist/lib/esm/linters/eslint-rules/manifest-schema.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/manifest-schema.mjs +1 -45
- package/dist/lib/esm/linters/eslint-rules/no-local-obsidian-internals.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/no-local-obsidian-internals.mjs +141 -0
- package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +5 -22
- package/dist/lib/esm/linters/eslint-rules/no-untrusted-input-events.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/no-untrusted-input-events.mjs +5 -22
- package/dist/lib/esm/linters/eslint-rules/obsidian-dev-toolkit-plugin.d.mts +16 -0
- package/dist/lib/esm/linters/eslint-rules/obsidian-dev-toolkit-plugin.mjs +37 -0
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code-in-ui.d.mts +30 -0
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code-in-ui.mjs +121 -0
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code.d.mts +29 -0
- package/dist/lib/esm/linters/eslint-rules/plugin-name-as-code.mjs +72 -0
- package/dist/lib/esm/linters/eslint-rules/require-component-suffix.d.mts +1 -1
- package/dist/lib/esm/linters/eslint-rules/require-component-suffix.mjs +5 -22
- package/dist/lib/esm/linters/eslint-rules/require-plugin-api-contract-schemas.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/require-plugin-api-contract-schemas.mjs +188 -0
- package/dist/lib/esm/linters/eslint.d.mts +1 -1
- package/dist/lib/esm/linters/eslint.mjs +5 -22
- package/dist/lib/esm/linters/index.d.mts +4 -1
- package/dist/lib/esm/linters/index.mjs +8 -46
- package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +12 -0
- package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +57 -0
- package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +2 -0
- package/dist/lib/esm/linters/markdownlint-rules/index.mjs +10 -0
- package/dist/lib/esm/linters/markdownlint-rules/plugin-name-as-code.d.mts +32 -0
- package/dist/lib/esm/linters/markdownlint-rules/plugin-name-as-code.mjs +94 -0
- package/dist/lib/esm/linters/markdownlint.d.mts +1 -1
- package/dist/lib/esm/linters/markdownlint.mjs +5 -22
- package/dist/lib/esm/linters/obsidianmd-rule-custom-message.d.mts +1 -1
- package/dist/lib/esm/linters/obsidianmd-rule-custom-message.mjs +1 -45
- package/dist/lib/esm/linters/plugin-names.d.mts +81 -0
- package/dist/lib/esm/linters/plugin-names.mjs +105 -0
- package/dist/lib/esm/obsidian-plugin-repo-paths.d.mts +1 -1
- package/dist/lib/esm/obsidian-plugin-repo-paths.mjs +1 -45
- package/dist/lib/esm/setup.d.mts +1 -1
- package/dist/lib/esm/setup.mjs +5 -22
- package/dist/lib/esm/templates.d.mts +1 -1
- package/dist/lib/esm/templates.mjs +5 -22
- package/dist/lib/esm/test-runners/index.d.mts +1 -1
- package/dist/lib/esm/test-runners/index.mjs +1 -45
- package/dist/lib/esm/test-runners/integration-test-plugin.d.mts +5 -5
- package/dist/lib/esm/test-runners/integration-test-plugin.mjs +11 -28
- package/dist/lib/esm/test-runners/performance-eval-cap.d.mts +1 -1
- package/dist/lib/esm/test-runners/performance-eval-cap.mjs +1 -45
- package/dist/lib/esm/test-runners/stale-build-global-setup.d.mts +1 -1
- package/dist/lib/esm/test-runners/stale-build-global-setup.mjs +5 -22
- package/dist/lib/esm/test-runners/vitest-config.d.mts +2 -3
- package/dist/lib/esm/test-runners/vitest-config.mjs +8 -25
- package/dist/lib/esm/version.d.mts +1 -1
- package/dist/lib/esm/version.mjs +5 -22
- package/dist/lib/esm/vitest-setup.d.mts +1 -1
- package/dist/lib/esm/vitest-setup.mjs +5 -22
- package/dist/templates/scripts/markdownlint-cli2-config.ts +2 -2
- package/linters/eslint-rules/no-local-obsidian-internals/package.json +6 -0
- package/linters/eslint-rules/{obsidian-dev-utils-plugin → obsidian-dev-toolkit-plugin}/package.json +3 -3
- package/linters/eslint-rules/plugin-name-as-code/package.json +6 -0
- package/linters/eslint-rules/plugin-name-as-code-in-ui/package.json +6 -0
- package/linters/eslint-rules/require-plugin-api-contract-schemas/package.json +6 -0
- package/linters/markdownlint-cli2-config/package.json +6 -0
- package/linters/markdownlint-rules/index/package.json +6 -0
- package/linters/markdownlint-rules/package.json +6 -0
- package/linters/markdownlint-rules/plugin-name-as-code/package.json +6 -0
- package/linters/plugin-names/package.json +6 -0
- package/package.json +86 -25
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +0 -186
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-utils-plugin.d.cts +0 -13
- package/dist/lib/esm/linters/eslint-rules/obsidian-dev-utils-plugin.d.mts +0 -13
- package/dist/lib/esm/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +0 -73
|
@@ -2,63 +2,32 @@
|
|
|
2
2
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
3
|
if you want to view the source, please visit the github repository of this plugin
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
(function () {
|
|
7
|
-
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
-
symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
|
|
9
|
-
symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
|
|
10
|
-
}
|
|
11
|
-
|
|
12
6
|
function ensureBrowserProcess() {
|
|
13
7
|
const browserProcess = {
|
|
14
8
|
browser: true,
|
|
15
9
|
cwd() {
|
|
16
|
-
return
|
|
10
|
+
return "/";
|
|
17
11
|
},
|
|
18
12
|
env: {},
|
|
19
|
-
platform:
|
|
13
|
+
platform: "android"
|
|
20
14
|
};
|
|
21
|
-
|
|
22
|
-
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
23
15
|
const existingProcess = globalThis.process;
|
|
24
|
-
|
|
25
16
|
if (!existingProcess) {
|
|
26
|
-
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
27
17
|
globalThis.process = browserProcess;
|
|
28
18
|
return;
|
|
29
19
|
}
|
|
30
|
-
|
|
31
20
|
if (existingProcess.versions?.node) {
|
|
32
21
|
return;
|
|
33
22
|
}
|
|
34
|
-
|
|
35
23
|
const existingProcessRecord = existingProcess;
|
|
36
|
-
|
|
37
24
|
for (const [key, value] of Object.entries(browserProcess)) {
|
|
38
25
|
existingProcessRecord[key] ??= value;
|
|
39
26
|
}
|
|
40
|
-
|
|
41
|
-
existingProcessRecord['browser'] = true;
|
|
27
|
+
existingProcessRecord["browser"] = true;
|
|
42
28
|
}
|
|
43
29
|
|
|
44
|
-
|
|
45
|
-
return $unknown;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
(function initCjs() {
|
|
49
|
-
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
50
|
-
const globalThisRecord = globalThis;
|
|
51
|
-
ensureDisposeSymbols();
|
|
52
|
-
globalThisRecord['__name'] ??= keepName;
|
|
53
|
-
globalThisRecord['__extractDefault'] ??= extractDefault;
|
|
54
|
-
|
|
55
|
-
ensureBrowserProcess();
|
|
56
|
-
|
|
57
|
-
// eslint-disable-next-line unicorn/consistent-function-scoping -- Serialized with initCjs into the banner; at module scope it would be left out of it.
|
|
58
|
-
function extractDefault(module) {
|
|
59
|
-
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
60
|
-
}
|
|
61
|
-
})();
|
|
30
|
+
ensureBrowserProcess();
|
|
62
31
|
})();
|
|
63
32
|
(function patchObsidianRequire() {
|
|
64
33
|
const originalRequire = require;
|
|
@@ -66,7 +35,6 @@ function keepName($unknown) {
|
|
|
66
35
|
return;
|
|
67
36
|
}
|
|
68
37
|
|
|
69
|
-
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
|
|
70
38
|
require = Object.assign(
|
|
71
39
|
(id) => requirePatched(id),
|
|
72
40
|
originalRequire,
|
|
@@ -196,4 +164,4 @@ function parseDemoVaultAppJson(params) {
|
|
|
196
164
|
findOwnedDemoVaultAppJsonSettings,
|
|
197
165
|
parseDemoVaultAppJson
|
|
198
166
|
});
|
|
199
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vLXZhdWx0LWFwcC1qc29uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGUgYC5vYnNpZGlhbi9hcHAuanNvbmAgc2V0dGluZ3MgYG9ic2lkaWFuLWRldi11dGlsc2Agb3ducyBpbiBldmVyeSBkZW1vIHZhdWx0LlxuICpcbiAqIEEgZGVtbyB2YXVsdCBpcyBkb2N1bWVudGF0aW9uIGZpcnN0IGFuZCBhbiBlZGl0aW5nIHN1cmZhY2Ugc2Vjb25kLCBzbyBmb3VyIE9ic2lkaWFuIHNldHRpbmdzIGhhdmUgdG8gYmVcbiAqIHRoZSBzYW1lIGluIGV2ZXJ5IG9uZSBvZiB0aGVtLiBUaGV5IGFyZSAqKm5vdCoqIGNvbW1pdHRlZDogYSB2YXVsdCB0aGF0IHdyb3RlIHRoZW0gaXRzZWxmIHdvdWxkIGRyaWZ0XG4gKiAobWVhc3VyZWQgMjAyNi0wOC0xMywgb25seSAzIG9mIDIzIHZhdWx0cyBoYWQgdGhlIGZpcnN0IHBhaXIgYW5kIDEgb2YgMjMgdGhlIHNlY29uZCksIHNvIHRoaXMgcGFja2FnZVxuICogb3ducyB0aGVtIGluc3RlYWQg4oCUIHtAbGluayBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0fSBtZXJnZXMgdGhlbSBpbnRvIHRoZSBgYXBwLmpzb25gIG9mIHRoZSBhcmNoaXZlZCBjb3B5XG4gKiBhdCByZWxlYXNlIHRpbWUsIGFuZCB0aGUgZGVtby12YXVsdCBjb3ZlcmFnZSBzdWl0ZSBmYWlscyBhIHZhdWx0IHRoYXQgY29tbWl0cyBhbnkgb2YgdGhlbS5cbiAqXG4gKiAtIGBkZWZhdWx0Vmlld01vZGU6ICdwcmV2aWV3J2AgKyBgbGl2ZVByZXZpZXc6IGZhbHNlYCDigJQgYSBub3RlIG9wZW5zIGFzIGEgcmVhZGVyIHNlZXMgaXQgcmF0aGVyIHRoYW4gYXNcbiAqICAgcmF3IG1hcmt1cC4gT2JzaWRpYW4tb25seTogR2l0SHViIG5ldmVyIHJlYWRzIGBhcHAuanNvbmAgYW5kIHJlbmRlcnMgZXZlcnkgbm90ZSBhcyBIVE1MIHJlZ2FyZGxlc3MuXG4gKiAtIGB1c2VNYXJrZG93bkxpbmtzOiB0cnVlYCArIGBuZXdMaW5rRm9ybWF0OiAncmVsYXRpdmUnYCDigJQgd2hhdCBPYnNpZGlhbiB3cml0ZXMgd2hlbiBhIGxpbmsgaXMgY3JlYXRlZFxuICogICBpbnNpZGUgdGhlIHZhdWx0LiBMZWZ0IGF0IE9ic2lkaWFuJ3MgZGVmYXVsdHMgKGBmYWxzZWAgLyBgJ3Nob3J0ZXN0J2ApIGV2ZXJ5IG5ldyBsaW5rIGNvbWVzIG91dCBhcyBhXG4gKiAgIHNob3J0ZXN0LXBhdGggYFtbd2lraWxpbmtdXWAsIHRoZSBmb3JtIHRoZSBjb3ZlcmFnZSBzdWl0ZSByZWplY3RzIGFuZCBHaXRIdWIgcmVuZGVycyBhcyBsaXRlcmFsXG4gKiAgIGJyYWNrZXRzLiBgcmVsYXRpdmVgIHJhdGhlciB0aGFuIGBhYnNvbHV0ZWAgc28gbm90ZXMga2VlcCByZXNvbHZpbmcgb25jZSB0aGUgdmF1bHQgaXMgZXh0cmFjdGVkIHRvIGFuXG4gKiAgIGFyYml0cmFyeSBmb2xkZXIuXG4gKlxuICogQWxsIGZvdXIgYXJlIHdyaXR0ZW4gZXhwbGljaXRseSwgbmV2ZXIgbGVmdCB0byBhbiBPYnNpZGlhbiBkZWZhdWx0OiBhIHZhdWx0IGxlYW5pbmcgb24gYSBkZWZhdWx0IGNoYW5nZXNcbiAqIGJlaGF2aW9yIHdoZW4gdGhhdCBkZWZhdWx0IGRvZXMuXG4gKlxuICogS2VwdCBmcmVlIG9mIGJvdGggYHZpdGVzdGAgYW5kIGBmZmxhdGVgIG9uIHB1cnBvc2Ug4oCUIHRoZSBjb3ZlcmFnZSBzdWl0ZSBwdWxscyBpbiB0aGUgZm9ybWVyIGFuZCB0aGVcbiAqIGFyY2hpdmVyIHRoZSBsYXR0ZXIsIGFuZCBuZWl0aGVyIG1heSByZWFjaCB0aGUgb3RoZXIncyBlbnZpcm9ubWVudC5cbiAqL1xuXG5pbXBvcnQgeyB0b0pzb24gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYnVpbGRBcmNoaXZlZERlbW9WYXVsdEFwcEpzb25Db250ZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZEFyY2hpdmVkRGVtb1ZhdWx0QXBwSnNvbkNvbnRlbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRlbW8gdmF1bHQncyBjb21taXR0ZWQgYGFwcC5qc29uYCwgcGFyc2VkIGJ5IHtAbGluayBwYXJzZURlbW9WYXVsdEFwcEpzb259LlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwSnNvbjogRGVtb1ZhdWx0QXBwSnNvbjtcbn1cblxuLyoqXG4gKiBBIHBhcnNlZCBgLm9ic2lkaWFuL2FwcC5qc29uYC4gT25seSB0aGUgc2V0dGluZ3MgaW4ge0BsaW5rIERFTU9fVkFVTFRfQVBQX0pTT05fU0VUVElOR1N9IGFyZSBpbnRlcnByZXRlZDtcbiAqIGV2ZXJ5IG90aGVyIHNldHRpbmcgaXMgY2FycmllZCB0aHJvdWdoIHVudG91Y2hlZC5cbiAqL1xuZXhwb3J0IHR5cGUgRGVtb1ZhdWx0QXBwSnNvbiA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kT3duZWREZW1vVmF1bHRBcHBKc29uU2V0dGluZ3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRPd25lZERlbW9WYXVsdEFwcEpzb25TZXR0aW5nc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZGVtbyB2YXVsdCdzIGNvbW1pdHRlZCBgYXBwLmpzb25gLCBwYXJzZWQgYnkge0BsaW5rIHBhcnNlRGVtb1ZhdWx0QXBwSnNvbn0uXG4gICAqL1xuICByZWFkb25seSBhcHBKc29uOiBEZW1vVmF1bHRBcHBKc29uO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBwYXJzZURlbW9WYXVsdEFwcEpzb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlRGVtb1ZhdWx0QXBwSnNvblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcmF3IGZpbGUgY29udGVudCwgb3IgYG51bGxgIHdoZW4gdGhlIHZhdWx0IGNvbW1pdHMgbm8gYGFwcC5qc29uYCBhdCBhbGwg4oCUIHdoaWNoIGlzIHRoZSBleHBlY3RlZFxuICAgKiBzdGF0ZSBmb3IgYSB2YXVsdCB0aGF0IGhhcyBub3RoaW5nIGVsc2UgdG8gY29uZmlndXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogbnVsbCB8IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggdGhlIGNvbnRlbnQgd2FzIHJlYWQgZnJvbSwgbmFtZWQgaW4gdGhlIGVycm9yIHdoZW4gaXQgZG9lcyBub3QgcGFyc2UuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGAub2JzaWRpYW4vYXBwLmpzb25gIHNldHRpbmdzIHRoaXMgcGFja2FnZSB3cml0ZXMgaW50byBldmVyeSBhcmNoaXZlZCBkZW1vIHZhdWx0LCBhbmQgdGhhdCBhIGRlbW9cbiAqIHZhdWx0IG11c3QgdGhlcmVmb3JlIG5ldmVyIGNvbW1pdC4gU2VlIHRoZSBmaWxlIG92ZXJ2aWV3IGZvciB3aGF0IGVhY2ggb25lIGJ1eXMuXG4gKi9cbmV4cG9ydCBjb25zdCBERU1PX1ZBVUxUX0FQUF9KU09OX1NFVFRJTkdTOiBEZW1vVmF1bHRBcHBKc29uID0ge1xuICBkZWZhdWx0Vmlld01vZGU6ICdwcmV2aWV3JyxcbiAgbGl2ZVByZXZpZXc6IGZhbHNlLFxuICBuZXdMaW5rRm9ybWF0OiAncmVsYXRpdmUnLFxuICB1c2VNYXJrZG93bkxpbmtzOiB0cnVlXG59O1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgYGFwcC5qc29uYCBjb250ZW50IGZvciB0aGUgYXJjaGl2ZWQgY29weSBvZiBhIGRlbW8gdmF1bHQ6IHRoZSBjb21taXR0ZWQgc2V0dGluZ3Mgd2l0aCB0aGVcbiAqIG93bmVkIG9uZXMgbWVyZ2VkIG92ZXIgdGhlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBidWlsZC5cbiAqIEByZXR1cm5zIFRoZSBKU09OIHRleHQgdG8gc3RvcmUgYXMgdGhlIGFyY2hpdmUncyBgLm9ic2lkaWFuL2FwcC5qc29uYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXJjaGl2ZWREZW1vVmF1bHRBcHBKc29uQ29udGVudChwYXJhbXM6IEJ1aWxkQXJjaGl2ZWREZW1vVmF1bHRBcHBKc29uQ29udGVudFBhcmFtcyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtcbiAgICB0b0pzb24oe1xuICAgICAgLi4ucGFyYW1zLmFwcEpzb24sXG4gICAgICAuLi5ERU1PX1ZBVUxUX0FQUF9KU09OX1NFVFRJTkdTXG4gICAgfSlcbiAgfVxcbmA7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIG93bmVkIHNldHRpbmdzIGEgZGVtbyB2YXVsdCBoYXMgY29tbWl0dGVkLiBUaGV5IGJlbG9uZyB0byB0aGlzIHBhY2thZ2UsIHdoaWNoIGluamVjdHMgdGhlbSBhdFxuICogcmVsZWFzZSB0aW1lLCBzbyBhIGNvbW1pdHRlZCBvbmUgaXMgZHJpZnQgd2FpdGluZyB0byBoYXBwZW4gcmF0aGVyIHRoYW4gYSBsb2NhbCBwcmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAqIEByZXR1cm5zIFRoZSBuYW1lcyBvZiB0aGUgb3duZWQgc2V0dGluZ3MgcHJlc2VudCBpbiB0aGUgY29tbWl0dGVkIGBhcHAuanNvbmAsIGluIHRoZSBvcmRlciB0aGV5IGFyZVxuICogZGVjbGFyZWQgaW4ge0BsaW5rIERFTU9fVkFVTFRfQVBQX0pTT05fU0VUVElOR1N9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE93bmVkRGVtb1ZhdWx0QXBwSnNvblNldHRpbmdzKHBhcmFtczogRmluZE93bmVkRGVtb1ZhdWx0QXBwSnNvblNldHRpbmdzUGFyYW1zKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoREVNT19WQVVMVF9BUFBfSlNPTl9TRVRUSU5HUykuZmlsdGVyKChzZXR0aW5nKSA9PiBPYmplY3QuaGFzT3duKHBhcmFtcy5hcHBKc29uLCBzZXR0aW5nKSk7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgZGVtbyB2YXVsdCdzIGNvbW1pdHRlZCBgYXBwLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIHBhcnNlLlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBzZXR0aW5ncywgb3IgYW4gZW1wdHkgb2JqZWN0IHdoZW4gdGhlIHZhdWx0IGNvbW1pdHMgbm8gYGFwcC5qc29uYC5cbiAqIEB0aHJvd3MgV2hlbiB0aGUgY29udGVudCBpcyBub3QgdmFsaWQgSlNPTiwgbmFtaW5nIHRoZSBmaWxlIGl0IGNhbWUgZnJvbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGVtb1ZhdWx0QXBwSnNvbihwYXJhbXM6IFBhcnNlRGVtb1ZhdWx0QXBwSnNvblBhcmFtcyk6IERlbW9WYXVsdEFwcEpzb24ge1xuICBpZiAocGFyYW1zLmNvbnRlbnQgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHBhcmFtcy5jb250ZW50KSBhcyBEZW1vVmF1bHRBcHBKc29uO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlICR7cGFyYW1zLnBhdGh9LmAsIHsgY2F1c2U6IGVycm9yIH0pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMEJBLDBCQUF1QjtBQWdEaEIsTUFBTSwrQkFBaUQ7QUFBQSxFQUM1RCxpQkFBaUI7QUFBQSxFQUNqQixhQUFhO0FBQUEsRUFDYixlQUFlO0FBQUEsRUFDZixrQkFBa0I7QUFDcEI7QUFTTyxTQUFTLHFDQUFxQyxRQUE0RDtBQUMvRyxTQUFPLE9BQ0wsNEJBQU87QUFBQSxJQUNMLEdBQUcsT0FBTztBQUFBLElBQ1YsR0FBRztBQUFBLEVBQ0wsQ0FBQyxDQUNIO0FBQUE7QUFDRjtBQVVPLFNBQVMsa0NBQWtDLFFBQTJEO0FBQzNHLFNBQU8sT0FBTyxLQUFLLDRCQUE0QixFQUFFLE9BQU8sQ0FBQyxZQUFZLE9BQU8sT0FBTyxPQUFPLFNBQVMsT0FBTyxDQUFDO0FBQzdHO0FBU08sU0FBUyxzQkFBc0IsUUFBdUQ7QUFDM0YsTUFBSSxPQUFPLFlBQVksTUFBTTtBQUMzQixXQUFPLENBQUM7QUFBQSxFQUNWO0FBRUEsTUFBSTtBQUNGLFdBQU8sS0FBSyxNQUFNLE9BQU8sT0FBTztBQUFBLEVBQ2xDLFNBQVMsT0FBTztBQUNkLFVBQU0sSUFBSSxNQUFNLG1CQUFtQixPQUFPLElBQUksS0FBSyxFQUFFLE9BQU8sTUFBTSxDQUFDO0FBQUEsRUFDckU7QUFDRjsiLCJuYW1lcyI6W119
|
|
@@ -2,63 +2,32 @@
|
|
|
2
2
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
3
|
if you want to view the source, please visit the github repository of this plugin
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
(function () {
|
|
7
|
-
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
-
symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
|
|
9
|
-
symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
|
|
10
|
-
}
|
|
11
|
-
|
|
12
6
|
function ensureBrowserProcess() {
|
|
13
7
|
const browserProcess = {
|
|
14
8
|
browser: true,
|
|
15
9
|
cwd() {
|
|
16
|
-
return
|
|
10
|
+
return "/";
|
|
17
11
|
},
|
|
18
12
|
env: {},
|
|
19
|
-
platform:
|
|
13
|
+
platform: "android"
|
|
20
14
|
};
|
|
21
|
-
|
|
22
|
-
// eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
|
|
23
15
|
const existingProcess = globalThis.process;
|
|
24
|
-
|
|
25
16
|
if (!existingProcess) {
|
|
26
|
-
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
27
17
|
globalThis.process = browserProcess;
|
|
28
18
|
return;
|
|
29
19
|
}
|
|
30
|
-
|
|
31
20
|
if (existingProcess.versions?.node) {
|
|
32
21
|
return;
|
|
33
22
|
}
|
|
34
|
-
|
|
35
23
|
const existingProcessRecord = existingProcess;
|
|
36
|
-
|
|
37
24
|
for (const [key, value] of Object.entries(browserProcess)) {
|
|
38
25
|
existingProcessRecord[key] ??= value;
|
|
39
26
|
}
|
|
40
|
-
|
|
41
|
-
existingProcessRecord['browser'] = true;
|
|
27
|
+
existingProcessRecord["browser"] = true;
|
|
42
28
|
}
|
|
43
29
|
|
|
44
|
-
|
|
45
|
-
return $unknown;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
(function initCjs() {
|
|
49
|
-
// eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
|
|
50
|
-
const globalThisRecord = globalThis;
|
|
51
|
-
ensureDisposeSymbols();
|
|
52
|
-
globalThisRecord['__name'] ??= keepName;
|
|
53
|
-
globalThisRecord['__extractDefault'] ??= extractDefault;
|
|
54
|
-
|
|
55
|
-
ensureBrowserProcess();
|
|
56
|
-
|
|
57
|
-
// eslint-disable-next-line unicorn/consistent-function-scoping -- Serialized with initCjs into the banner; at module scope it would be left out of it.
|
|
58
|
-
function extractDefault(module) {
|
|
59
|
-
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
60
|
-
}
|
|
61
|
-
})();
|
|
30
|
+
ensureBrowserProcess();
|
|
62
31
|
})();
|
|
63
32
|
(function patchObsidianRequire() {
|
|
64
33
|
const originalRequire = require;
|
|
@@ -66,7 +35,6 @@ function keepName($unknown) {
|
|
|
66
35
|
return;
|
|
67
36
|
}
|
|
68
37
|
|
|
69
|
-
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
|
|
70
38
|
require = Object.assign(
|
|
71
39
|
(id) => requirePatched(id),
|
|
72
40
|
originalRequire,
|
|
@@ -180,7 +148,7 @@ module.exports = __toCommonJS(demo_vault_buttons_exports);
|
|
|
180
148
|
var import_root = require('@mnaoumov/typescript-dev-toolkit/root');
|
|
181
149
|
var import_node_fs = require('node:fs');
|
|
182
150
|
var import_node_path = require('node:path');
|
|
183
|
-
var import_node_process = __toESM(
|
|
151
|
+
var import_node_process = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('node:process')), 1);
|
|
184
152
|
var import_obsidian_integration_testing = require('obsidian-integration-testing');
|
|
185
153
|
var import_vitest_global_setup_plugin = require('obsidian-integration-testing/vitest-global-setup-plugin');
|
|
186
154
|
var import_vitest = require('vitest');
|
|
@@ -577,4 +545,4 @@ async function openNoteAndListButtonCaptions(note, settleTimeoutInMilliseconds)
|
|
|
577
545
|
registerDemoVaultButtonSuite,
|
|
578
546
|
selectUnexpectedFailures
|
|
579
547
|
});
|
|
580
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RlbW8tdmF1bHQtYnV0dG9ucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgdml0ZXN0IHN1aXRlIHRoYXQgb3BlbnMgZXZlcnkgbm90ZSBvZiBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCwgY2xpY2tzIGVhY2ggYGNvZGUtYnV0dG9uYFxuICogaW4gaXQgYWdhaW5zdCBhIHJlYWwgT2JzaWRpYW4sIGFuZCBmYWlscyBvbiBhbnkgYnV0dG9uIHRoYXQgZXJyb3JzIG9yIG5ldmVyIHJlcG9ydHMgYSByZXN1bHQuXG4gKlxuICogQSBkZW1vIHZhdWx0J3MgYnV0dG9ucyBhcmUgdGhlIG9uZSBwYXJ0IG9mIGl0IG5vIG90aGVyIGdhdGUgY2FuIGNoZWNrLiBgbGludDptZGAgcmVhZHMgdGhlIG1hcmtkb3duLFxuICogdGhlIGNvdmVyYWdlIHN1aXRlICh7QGxpbmsgLi9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIHwgYHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZWB9KSBjaGVja3MgdGhlXG4gKiBhdXRob3JpbmcgY29udmVudGlvbnMsIGFuZCBuZWl0aGVyIGV4ZWN1dGVzIGFueXRoaW5nIFx1MjAxNCBhIGJ1dHRvbiB3aG9zZSBgcmVxdWlyZSgnL2RlbW9TZXR1cC50cycpYCBwYXRoXG4gKiBpcyB3cm9uZywgb3IgdGhhdCBjYWxscyBhbiBBUEkgdGhhdCBoYXMgc2luY2UgY2hhbmdlZCBzaGFwZSwgZmFpbHMgYXQgY2xpY2sgdGltZSBhbmQgbm93aGVyZSBlbHNlLlxuICpcbiAqIFRoZSBjb21wYW5pb24gaGFsZiBcdTIwMTQgc2VlZGluZyB0aGUgdGVtcCB2YXVsdCB3aXRoIHRoZSBkZW1vLXZhdWx0IHRyZWUsIGl0cyBgLm9ic2lkaWFuYCBjb25maWcsIGFuZCB0aGVcbiAqIENvZGVTY3JpcHQgVG9vbGtpdCBiaW5hcnkgdGhhdCB0dXJucyBgYGBgIGBgYGNvZGUtYnV0dG9uIGBgYGAgZmVuY2VzIGludG8gYnV0dG9ucyBcdTIwMTQgaXNcbiAqIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYCBpbiBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2A7IGhhbmQgaXRzIHJlc3VsdCB0byB0aGUgcHJvamVjdCdzXG4gKiBgZ2xvYmFsU2V0dXBgIGFuZCBuYW1lIENvZGVTY3JpcHQgVG9vbGtpdCBpbiBgZW5hYmxlQ29tbXVuaXR5UGx1Z2luc2AuXG4gKi9cblxuaW1wb3J0IHsgZ2V0Um9vdEZvbGRlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L3Jvb3QnO1xuaW1wb3J0IHtcbiAgcmVhZGRpclN5bmMsXG4gIHJlYWRGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTLFxuICBldmFsSW5PYnNpZGlhblxufSBmcm9tICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJztcbmltcG9ydCB7IGdldFRlbXBvcmFyeVZhdWx0IH0gZnJvbSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3QtZ2xvYmFsLXNldHVwLXBsdWdpbic7XG5pbXBvcnQge1xuICBiZWZvcmVBbGwsXG4gIGRlc2NyaWJlLFxuICBleHBlY3QsXG4gIGl0XG59IGZyb20gJ3ZpdGVzdCc7XG5cbi8qKlxuICogQ29kZVNjcmlwdCBUb29sa2l0J3MgbWFuaWZlc3QgaWQuIEl0IGlzIHN0aWxsIHRoZSBwbHVnaW4ncyBvcmlnaW5hbCBgZml4LXJlcXVpcmUtbW9kdWxlc2AgaWQsIHdoaWNoXG4gKiBubyBsb25nZXIgbWF0Y2hlcyBpdHMgbmFtZSBcdTIwMTQgdGhlIGlkIGlzIHB1Ymxpc2hlZCwgc28gaXQgY2Fubm90IGJlIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCA9ICdmaXgtcmVxdWlyZS1tb2R1bGVzJztcblxuLyoqXG4gKiBUaGUgd2FpdGluZyBidWRnZXRzIGEgc2luZ2xlIGJ1dHRvbiBjbGljayBpcyBhbGxvd2VkLlxuICpcbiAqIEJvdGggYXJlIHNwZW50IGluc2lkZSBPTkUgdHJhbnNwb3J0IGNhbGwsIHNvIGl0IGlzIHRoZWlyIFNVTSB0aGF0XG4gKiB7QGxpbmsgYXNzZXJ0Q2xpY2tCdWRnZXRzRml0VHJhbnNwb3J0Q2FwfSBib3VuZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpY2tCdXR0b25UaW1lb3V0cyB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgY2xpY2tlZCBidXR0b24gdG8gcmVwb3J0IGEgcmVzdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSBidXR0b24gaXRzZWxmIHRvIG1vdW50LlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIG91dGNvbWUgb2YgY2xpY2tpbmcgb25lIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRCdXR0b25SZXN1bHQge1xuICAvKipcbiAgICogVGhlIGJ1dHRvbidzIGNhcHRpb24sIGFzIHJlbmRlcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0IGxpbmUgQ29kZVNjcmlwdCBUb29sa2l0IHByaW50ZWQgdW5kZXIgdGhlIGJ1dHRvbiwgdHJ1bmNhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGJ1dHRvbiByZXBvcnRlZCBzdWNjZXNzLCByZXBvcnRlZCBhbiBlcnJvciwgb3IgbmV2ZXIgcmVwb3J0ZWQgYXQgYWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzOiAnZXJyb3InIHwgJ29rJyB8ICd0aW1lb3V0JyB8ICd1bmtub3duJztcbn1cblxuLyoqXG4gKiBPbmUgZGVtby12YXVsdCBub3RlIGFuZCBob3cgbWFueSBidXR0b25zIGl0cyBzb3VyY2UgZGVjbGFyZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVtb1ZhdWx0Tm90ZSB7XG4gIC8qKlxuICAgKiBIb3cgbWFueSBidXR0b25zIHRoZSBub3RlJ3Mgc291cmNlIHJlbmRlcnMsIGFzIGNvdW50ZWQgYnkge0BsaW5rIGNvdW50UmVuZGVyZWRCdXR0b25zfS5cbiAgICovXG4gIHJlYWRvbmx5IGJ1dHRvbkNvdW50OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjYXB0aW9ucyBvZiB0aG9zZSBidXR0b25zLCBpbiBzb3VyY2Ugb3JkZXIsIGFzIHJlYWQgYnkge0BsaW5rIGxpc3RSZW5kZXJlZEJ1dHRvbkNhcHRpb25zfS5cbiAgICovXG4gIHJlYWRvbmx5IGNhcHRpb25zOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIG5vdGUncyBmaWxlIG5hbWUsIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBidXR0b24gdGhhdCBpcyBFWFBFQ1RFRCBub3QgdG8gcmVwb3J0IHN1Y2Nlc3MsIHNvIHRoZSBzdWl0ZSBkb2VzIG5vdCBmYWlsIG9uIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cGVjdGVkTm9uT2tCdXR0b24ge1xuICAvKipcbiAgICogQSBzdWJzdHJpbmcgb2YgdGhlIGJ1dHRvbidzIHJlbmRlcmVkIGNhcHRpb24uXG4gICAqL1xuICByZWFkb25seSBjYXB0aW9uSW5jbHVkZXM6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGUgaG9sZGluZyB0aGUgYnV0dG9uLCByZWxhdGl2ZSB0byB0aGUgZGVtbyB2YXVsdCByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgbm90ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIHRoZSBidXR0b24gaXMgZXhwZWN0ZWQgdG8gZW5kIGluLiBBbnkgb3RoZXIgc3RhdHVzIHN0aWxsIGZhaWxzLCBzbyBhbiBlcnJvciBkZW1vIHRoYXRcbiAgICogc3RhcnRzIHRpbWluZyBvdXQgaW5zdGVhZCBpcyByZXBvcnRlZCByYXRoZXIgdGhhbiB3YXZlZCB0aHJvdWdoLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzOiBFeGNsdWRlPERlbW9WYXVsdEJ1dHRvblJlc3VsdFsnc3RhdHVzJ10sICdvayc+O1xufVxuXG4vKipcbiAqIFRoZSBvcHRpb25zIGZvciB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZU9wdGlvbnMge1xuICAvKipcbiAgICogSG93IGxvbmcsIGluIG1pbGxpc2Vjb25kcywgdG8gd2FpdCBmb3IgYSBjbGlja2VkIGJ1dHRvbiB0byByZXBvcnQgYSByZXN1bHQuXG4gICAqXG4gICAqIEJvdW5kZWQgYnkgdGhlIHNhbWUgc3VtIGFzIHtAbGluayBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9ucy5zZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHN9LFxuICAgKiBhbmQgcmVmdXNlZCBieSB0aGUgc2FtZSB0aHJvdyBhdCByZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogRm9sZGVycyB0byBza2lwIHdob2xlLCBtYXRjaGVkIGFnYWluc3QgYm90aCB0aGUgZm9sZGVyIG5hbWUgYW5kIGl0cyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0XG4gICAqIHJvb3QgXHUyMDE0IGZvciBhIGdyb3VwIHdob3NlIG5vdGVzIGNhbm5vdCBydW4gdW5hdHRlbmRlZCwgc3VjaCBhcyBvbmVzIHRoYXQgZmlyc3QgaW5zdGFsbCBhIHRoaXJkLXBhcnR5XG4gICAqIHBsdWdpbiBmcm9tIHRoZSBjb21tdW5pdHkgc3RvcmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbXWBcbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGVkRm9sZGVycz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOb3RlIGZpbGUgbmFtZXMgKHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHJvb3QpIHRvIHNraXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbJ1JFQURNRS5tZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROb3Rlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBCdXR0b25zIHRoYXQgbGVnaXRpbWF0ZWx5IGRvIG5vdCByZXBvcnQgc3VjY2VzczogYW4gZXJyb3IgZGVtbywgb3IgYSBidXR0b24gdGhhdCB0dXJucyBzeXN0ZW1cbiAgICogbWVzc2FnZXMgb2ZmIGFuZCBzbyBuZXZlciBwcmludHMgdGhlIHJlc3VsdCBsaW5lIHRoZSBzdWl0ZSBjbGFzc2lmaWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgW11gXG4gICAqL1xuICByZWFkb25seSBleHBlY3RlZE5vbk9rQnV0dG9ucz86IHJlYWRvbmx5IEV4cGVjdGVkTm9uT2tCdXR0b25bXTtcblxuICAvKipcbiAgICogVGhlIHJlcG9zaXRvcnkgcm9vdCBob2xkaW5nIGBkZW1vLXZhdWx0L2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSByZXNvbHZlZCByZXBvIHJvb3QsIGZhbGxpbmcgYmFjayB0byBgcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSByb290Rm9sZGVyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZywgaW4gbWlsbGlzZWNvbmRzLCB0byB3YWl0IGZvciBhIG5vdGUncyBwcmV2aWV3IGFuZCBpdHMgYnV0dG9ucyB0byBtb3VudC5cbiAgICpcbiAgICogVG9nZXRoZXIgd2l0aCBgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzYCB0aGlzIG11c3Qgc3RheSB1bmRlciB0aGUgdHJhbnNwb3J0J3MgfjMwIHMgc2NyaXB0XG4gICAqIHRpbWVvdXQ6IG9uZSBidXR0b24gY2xpY2sgc3BlbmRzIGJvdGggaW5zaWRlIGEgU0lOR0xFIGV2YWx1YXRpb24sIHNvIGEgc3VtIGF0IG9yIG92ZXIgdGhlIGNhcCBjYW5ub3RcbiAgICogYmUgaG9ub3VyZWQgYW5kIHR1cm5zIGEgcmVhbCB0aW1lb3V0IGludG8gYSBiYXJlIGBzY3JpcHQgdGltZW91dGAgbmFtaW5nIG9ubHkgdGhlIHRyYW5zcG9ydC5cbiAgICoge0BsaW5rIHJlZ2lzdGVyRGVtb1ZhdWx0QnV0dG9uU3VpdGV9IHRocm93cyBvbiBzdWNoIGEgcGFpciByYXRoZXIgdGhhbiByZWdpc3RlcmluZyBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYDEyMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRpc21pc3MgYW55IG9wZW4gbW9kYWwgd2hpbGUgd2FpdGluZyBmb3IgYSBjbGlja2VkIGJ1dHRvbidzIHJlc3VsdCwgYW5kIGFnYWluIG9uY2UgaXQgaXNcbiAgICogY2xhc3NpZmllZC5cbiAgICpcbiAgICogQSBidXR0b24gdGhhdCBgYXdhaXRgcyBhbiBgYWxlcnRgIC8gYGNvbmZpcm1gIC8gYHByb21wdGAgY2Fubm90IHJlcG9ydCBhIHJlc3VsdCB1bnRpbCBzb21lYm9keSBjbG9zZXNcbiAgICogdGhlIGRpYWxvZywgc28gd2l0aG91dCB0aGlzIGl0IGVuZHMgYXMgYHRpbWVvdXRgIFx1MjAxNCBhbmQgdGhlIGRpYWxvZyBpdCBsZWZ0IG9wZW4gdGhlbiBzaXRzIG92ZXIgZXZlcnlcbiAgICogbGF0ZXIgYnV0dG9uIGluIHRoZSBydW4uIE9mZiBieSBkZWZhdWx0LCBzbyBubyBzdWl0ZSBjaGFuZ2VzIGJlaGF2aW9yIHVuYXNrZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZERpc21pc3NNb2RhbHM/OiBib29sZWFuO1xufVxuXG4vKlxuICogVGhlc2UgdHdvIGFyZSBzcGVudCBJTlNJREUgT05FIGBldmFsSW5PYnNpZGlhbmAgY2xvc3VyZSBieSBgY2xpY2tCdXR0b25gLCB3aGljaCB3YWl0cyBmb3IgdGhlIGJ1dHRvbiB0b1xuICogbW91bnQgYW5kIHRoZW4gZm9yIGl0cyByZXN1bHQsIHNvIGl0IGlzIHRoZWlyIFNVTSB0aGF0IGhhcyB0byBzdGF5IHVuZGVyIHRoZSB0cmFuc3BvcnQncyB+MzAgcyBzY3JpcHRcbiAqIHRpbWVvdXQgXHUyMDE0IG5vdCBlaXRoZXIgb25lIGFsb25lLiBUaGUgZm9ybWVyIDIwIDAwMCArIDE1IDAwMCBhc2tlZCBmb3IgMzUgcywgd2hpY2ggdGhlIHRyYW5zcG9ydCBjYW4gbmV2ZXJcbiAqIGdyYW50OiBhIHNsb3cgYnV0dG9uIGRpZCBub3QgcmVwb3J0IFwibmV2ZXIgcmVwb3J0ZWQgYSByZXN1bHRcIiwgaXQgZGllZCBhcyBhIGJhcmUgYHNjcmlwdCB0aW1lb3V0YCBuYW1pbmdcbiAqIG9ubHkgdGhlIHRyYW5zcG9ydC4gYG5vLW92ZXItY2FwLXdhaXQtaW4tZXZhbC1pbi1vYnNpZGlhbmAgY2Fubm90IGNhdGNoIHRoaXMgb25lLCBiZWNhdXNlIHRoZSBidWRnZXRzXG4gKiByZWFjaCB0aGUgY2xvc3VyZSBmcm9tIGEgY2FsbGVyIHR3byBsZXZlbHMgdXAgcmF0aGVyIHRoYW4gYmVpbmcgd3JpdHRlbiBhdCB0aGUgd2FpdCBcdTIwMTQgd2hpY2ggaXMgd2h5XG4gKiBgYXNzZXJ0Q2xpY2tCdWRnZXRzRml0VHJhbnNwb3J0Q2FwYCBiZWxvdyBlbmZvcmNlcyBhdCBydW50aW1lIHdoYXQgdGhlIHJ1bGUgY2Fubm90IHNlZS4gT3ZlcnJpZGluZ1xuICogZWl0aGVyIGRlZmF1bHQgdmlhIGBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9uc2AgaXMgc3ViamVjdCB0byB0aGUgc2FtZSBzdW0uXG4gKi9cbmNvbnN0IERFRkFVTFRfQlVUVE9OX1JFU1VMVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcbmNvbnN0IERFRkFVTFRfU0VUVExFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTJfMDAwO1xuXG5pbnRlcmZhY2UgQ2xpY2tCdXR0b25QYXJhbXMge1xuICAvKipcbiAgICogVGhlIGJ1dHRvbidzIHJlbmRlcmVkIGNhcHRpb24sIHdoaWNoIGlzIGhvdyBpdCBpcyBhZGRyZXNzZWQuXG4gICAqL1xuICByZWFkb25seSBidXR0b25DYXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RlIGhvbGRpbmcgdGhlIGJ1dHRvbi5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzbWlzcyB0aGUgbW9kYWxzIHRoZSBidXR0b24gb3BlbnMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGREaXNtaXNzTW9kYWxzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVuZGVyIGFuZCByZXN1bHQgYnVkZ2V0cy5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRzOiBDbGlja0J1dHRvblRpbWVvdXRzO1xufVxuXG5jb25zdCBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDEwMDtcbmNvbnN0IE9VVFBVVF9FWENFUlBUX0xFTkdUSCA9IDQwMDtcblxuLy8gYFJFQURNRS5tZGAgaXMgdGhlIHJlcG8tZmFjaW5nIHBhZ2UgR2l0SHViIHJlbmRlcnMsIG5vdCBhIHdhbGt0aHJvdWdoLiBgMDAgU3RhcnQubWRgIGlzIGRlbGliZXJhdGVseVxuLy8gTk9UIGV4Y2x1ZGVkOiB0aGUgbGFuZGluZyBub3RlcyBjYXJyeSBidXR0b25zIG9mIHRoZWlyIG93bi5cbmNvbnN0IERFRkFVTFRfRVhDTFVERURfTk9URVMgPSBbJ1JFQURNRS5tZCddO1xuXG4vLyBBIGZlbmNlIGxpbmU6IGl0cyBtYXJrZXIgcnVuICh0aHJlZSBvciBtb3JlIGJhY2t0aWNrcyBvciB0aWxkZXMpIGFuZCB3aGF0ZXZlciBmb2xsb3dzIGl0LlxuY29uc3QgRkVOQ0VfUkVHX0VYUCA9IC9eKD88aW5kZW50PlxccyopKD88bWFya2VyPmB7Myx9fH57Myx9KSg/PGluZm8+LiopJC87XG5jb25zdCBDT0RFX0JVVFRPTl9GRU5DRV9JTkZPID0gJ2NvZGUtYnV0dG9uJztcbmNvbnN0IEZST05UX01BVFRFUl9ERUxJTUlURVIgPSAnLS0tJztcbmNvbnN0IFJBV19NT0RFX0NPTkZJR19SRUdfRVhQID0gL15pc1JhdzpcXHMqdHJ1ZVxccyokL207XG5jb25zdCBDQVBUSU9OX0NPTkZJR19SRUdfRVhQID0gL15jYXB0aW9uOig/PHZhbHVlPi4qKSQvbTtcbmNvbnN0IFBMQUlOX1NDQUxBUl9DT01NRU5UX1JFR19FWFAgPSAvXFxzKyMuKiQvO1xuY29uc3QgU0lOR0xFX1FVT1RFRF9TQ0FMQVJfUkVHX0VYUCA9IC9eJyg/PGNvbnRlbnQ+LiopJyQvO1xuY29uc3QgRE9VQkxFX1FVT1RFRF9TQ0FMQVJfUkVHX0VYUCA9IC9eXCIoPzxjb250ZW50Pi4qKVwiJC87XG4vLyBDb2RlU2NyaXB0IFRvb2xraXQncyBvd24gZGVmYXVsdCwgd2hpY2ggYSBmZW5jZSBuYW1pbmcgbm8gY2FwdGlvbiByZW5kZXJzLlxuY29uc3QgREVGQVVMVF9DT0RFX0JVVFRPTl9DQVBUSU9OID0gJyhubyBjYXB0aW9uKSc7XG5cbi8vIFRoZSByZW5kZXJlZC1idXR0b24gc2VsZWN0b3IgaXMgYDpzY29wZSAuYmxvY2stbGFuZ3VhZ2UtY29kZS1idXR0b24gYnV0dG9uLm1vZC1jdGFgLiBJdCBpcyB3cml0dGVuXG4vLyBvdXQgYXQgZWFjaCB1c2Ugc2l0ZSByYXRoZXIgdGhhbiBoZWxkIGluIGEgY29uc3RhbnQgaGVyZTogZXZlcnkgY2xvc3VyZSBiZWxvdyBpcyBzZXJpYWxpemVkIHdpdGhcbi8vIGB0b1N0cmluZygpYCBhbmQgZXZhbHVhdGVkIGluc2lkZSBPYnNpZGlhbiwgd2hlcmUgbm90aGluZyBmcm9tIHRoaXMgbW9kdWxlJ3Mgc2NvcGUgZXhpc3RzLlxuXG4vKipcbiAqIFJlZnVzZXMgYSBzZXR0bGUvcmVzdWx0IGJ1ZGdldCBwYWlyIHRoYXQgYSBzaW5nbGUgdHJhbnNwb3J0IGNhbGwgY291bGQgbmV2ZXIgaG9ub3VyLlxuICpcbiAqIGBjbGlja0J1dHRvbmAgd2FpdHMgZm9yIHRoZSBidXR0b24gdG8gbW91bnQgYW5kIHRoZW4gZm9yIGl0cyByZXN1bHQgSU5TSURFIE9ORSBgZXZhbEluT2JzaWRpYW5gXG4gKiBjbG9zdXJlLCBzbyB0aGUgdHJhbnNwb3J0J3Mgc2NyaXB0IHRpbWVvdXQgYm91bmRzIHRoZWlyIHN1bSByYXRoZXIgdGhhbiBlaXRoZXIgb25lIGFsb25lIFx1MjAxNCBhbmRcbiAqIGBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9uc2AgbGV0cyBhIGNvbnN1bWVyIHJhaXNlIGVhY2ggaW5kZXBlbmRlbnRseSwgd2l0aCBub3RoaW5nIHN1bW1pbmdcbiAqIHRoZW0uIFJhaXNpbmcgYHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc2AgdG8gMjAgMDAwIGZvciBvbmUgc2xvdyBub3RlIGlzIGFuIG9yZGluYXJ5IHRoaW5nIHRvIGRvIGFuZFxuICogc2lsZW50bHkgcHV0cyB0aGUgcGFpciBhdCB0aGUgY2FwLlxuICpcbiAqIFRocm93aW5nIGhlcmUsIGF0IHN1aXRlIHJlZ2lzdHJhdGlvbiwgaXMgdGhlIHdob2xlIHZhbHVlOiB0aGUgZmFpbHVyZSBpdCByZXBsYWNlcyBpcyBhXG4gKiBgV2ViRHJpdmVyRXJyb3I6IHNjcmlwdCB0aW1lb3V0YCByYWlzZWQgbWlkLXJ1biBhZ2FpbnN0IHdoaWNoZXZlciBidXR0b24gaGFwcGVuZWQgdG8gYmUgc2xvd2VzdCxcbiAqIG5hbWluZyB0aGUgdHJhbnNwb3J0IGFuZCBuZWl0aGVyIGJ1ZGdldC5cbiAqXG4gKiBAcGFyYW0gdGltZW91dHMgLSBUaGUge0BsaW5rIENsaWNrQnV0dG9uVGltZW91dHN9IHRvIGJvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q2xpY2tCdWRnZXRzRml0VHJhbnNwb3J0Q2FwKHRpbWVvdXRzOiBDbGlja0J1dHRvblRpbWVvdXRzKTogdm9pZCB7XG4gIGNvbnN0IHRvdGFsSW5NaWxsaXNlY29uZHMgPSB0aW1lb3V0cy5zZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMgKyB0aW1lb3V0cy5idXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHM7XG5cbiAgLypcbiAgICogVGhlIGNvbXBhcmlzb24gaXMgYDxgIHJhdGhlciB0aGFuIGA8PWAgYmVjYXVzZSBhIHN1bSB0aGF0IG1lcmVseSBSRUFDSEVTIHRoZSBjYXAgY2FuIGFscmVhZHkgbmV2ZXJcbiAgICogYmUgaG9ub3VyZWQ6IGBuby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW5gIHJlcG9ydHMgYXQgdGhlIGNhcCBhcyB3ZWxsIGFzIG92ZXIgaXQsIGFuZCBhXG4gICAqIGNsb3N1cmUgaGFuZGVkIGV4YWN0bHkgdGhlIHRyYW5zcG9ydCdzIGJ1ZGdldCBoYXMgbm90aGluZyBsZWZ0IGZvciB0aGUgZGlzcGF0Y2ggaXRzZWxmLlxuICAgKi9cbiAgaWYgKHRvdGFsSW5NaWxsaXNlY29uZHMgPCBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgT25lIGRlbW8tdmF1bHQgYnV0dG9uIGNsaWNrIHNwZW5kcyBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMgKCR7U3RyaW5nKHRpbWVvdXRzLnNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1zKSBhbmQgYFxuICAgICAgKyBgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzICgke1N0cmluZyh0aW1lb3V0cy5idXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtcykgaW5zaWRlIGEgc2luZ2xlIHRyYW5zcG9ydCBjYWxsLCBgXG4gICAgICArIGBzbyB0aGVpciBzdW0gb2YgJHtTdHJpbmcodG90YWxJbk1pbGxpc2Vjb25kcyl9IG1zIGlzIGF0IG9yIG92ZXIgdGhlIHRyYW5zcG9ydCdzIGBcbiAgICAgICsgYCR7U3RyaW5nKERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTKX0gbXMgc2NyaXB0IHRpbWVvdXQgYW5kIGNhbiBuZXZlciBiZSBob25vdXJlZC4gYFxuICAgICAgKyAnTG93ZXIgZWl0aGVyIGJ1ZGdldCBpbiBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9ucy4nXG4gICk7XG59XG5cbi8qKlxuICogQ291bnRzIHRoZSBidXR0b25zIGEgbm90ZSdzIHNvdXJjZSB3aWxsIGFjdHVhbGx5IHJlbmRlci5cbiAqXG4gKiBUaHJlZSBraW5kcyBvZiBgIGBgYGNvZGUtYnV0dG9uIGAgZmVuY2UgcmVuZGVyIG5vIGNsaWNrYWJsZSBidXR0b24sIGFuZCBhIHZhdWx0IHRoYXQgRE9DVU1FTlRTIGNvZGVcbiAqIGJ1dHRvbnMgaXMgZnVsbCBvZiB0aGUgZmlyc3QgdHdvOlxuICpcbiAqIC0gQSBmZW5jZSBuZXN0ZWQgaW5zaWRlIGEgbG9uZ2VyIG9yIGRpZmZlcmVudCBmZW5jZSAoYSBgYGBgIGBgYGBtYXJrZG93biBgYGBgIG9yIGB+fn5gIGJsb2NrKSBpcyBhXG4gKiAgIG1hcmtkb3duIFNBTVBMRSBzaG93biB0byB0aGUgcmVhZGVyOyB0aGUgcmVuZGVyZXIgbmV2ZXIgc2VlcyBpdCBhcyBhIGJsb2NrLlxuICogLSBBbiBgaXNSYXc6IHRydWVgIGZlbmNlIHJlbmRlcnMgaXRzIG91dHB1dCBkaXJlY3RseSBhbmQgbm8gYnV0dG9uIGVsZW1lbnQgYXQgYWxsLlxuICogLSBBIGZlbmNlIHdob3NlIGluZm8gc3RyaW5nIGNhcnJpZXMgYW55dGhpbmcgYWZ0ZXIgYGNvZGUtYnV0dG9uYCB1c2VzIHRoZSBsZWdhY3kgYXJndW1lbnQgc3ludGF4LCB3aGljaFxuICogICByZW5kZXJzIGFuIGVycm9yIGJhbm5lciBhc2tpbmcgdG8gdXBkYXRlIHRoZSBjb25maWcgcmF0aGVyIHRoYW4gdGhlIGJ1dHRvbi5cbiAqXG4gKiBDb3VudGluZyBhbnkgb2YgdGhlbSBtYWtlcyB0aGUgc3VpdGUncyBzaG9ydGZhbGwgYXNzZXJ0aW9uIHVuc2F0aXNmaWFibGUgXHUyMDE0IGl0IGRlbWFuZHMgbW9yZSBidXR0b25zXG4gKiB0aGFuIHRoZSBub3RlIGNhbiBldmVyIHJlbmRlciBcdTIwMTQgYW5kIGFuIGFzc2VydGlvbiB0aGF0IGNhbm5vdCBwYXNzIGdhdGVzIG5vdGhpbmcuXG4gKlxuICogVGhlIHNjYW4gZm9sbG93cyBDb21tb25NYXJrJ3MgZmVuY2UgcnVsZXM6IGEgZmVuY2UgY2xvc2VzIG9ubHkgb24gYSBydW4gb2YgdGhlIFNBTUUgY2hhcmFjdGVyIGF0IGxlYXN0XG4gKiBhcyBsb25nIGFzIHRoZSBvcGVuZXIsIHdpdGggbm8gaW5mbyBzdHJpbmcsIGFuZCBvbmUgbGVmdCBvcGVuIHJ1bnMgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIHdoZXJlIGl0XG4gKiBzdGlsbCByZW5kZXJzLlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgbm90ZSdzIG1hcmtkb3duLlxuICogQHJldHVybnMgSG93IG1hbnkgYnV0dG9ucyBpdCByZW5kZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY291bnRSZW5kZXJlZEJ1dHRvbnMoc291cmNlOiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gbGlzdFJlbmRlcmVkQnV0dG9uQ2FwdGlvbnMoc291cmNlKS5sZW5ndGg7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGNhcHRpb25zIGRlY2xhcmVkIGJ5IG1vcmUgdGhhbiBvbmUgYnV0dG9uLlxuICpcbiAqIFRoZSBzdWl0ZSBhZGRyZXNzZXMgYSBidXR0b24gYnkgaXRzIGNhcHRpb24gXHUyMDE0IGl0IGNvbGxlY3RzIHRoZSBjYXB0aW9ucyB0aGF0IG1vdW50ZWQgYW5kIGNsaWNrcyB0aGVcbiAqIGJ1dHRvbiBjYXJyeWluZyBlYWNoIG9uZSBcdTIwMTQgc28gdHdvIGJ1dHRvbnMgc2hhcmluZyBhIGNhcHRpb24gY29sbGFwc2UgaW50byBvbmU6IHRoZSBzZWNvbmQgaXMgbmV2ZXJcbiAqIGNsaWNrZWQsIGFuZCB0aGUgbm90ZSByZWFkcyBhcyBkZWNsYXJpbmcgYSBidXR0b24gdGhhdCBuZXZlciByZW5kZXJlZC5cbiAqXG4gKiBAcGFyYW0gY2FwdGlvbnMgLSBBIG5vdGUncyBidXR0b24gY2FwdGlvbnMuXG4gKiBAcmV0dXJucyBFYWNoIGNhcHRpb24gb2NjdXJyaW5nIG1vcmUgdGhhbiBvbmNlLCBsaXN0ZWQgb25jZSwgaW4gb3JkZXIgb2YgZmlyc3QgcmVwZWF0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZER1cGxpY2F0ZUNhcHRpb25zKGNhcHRpb25zOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc2VlbkNhcHRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGR1cGxpY2F0ZUNhcHRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgY2FwdGlvbiBvZiBjYXB0aW9ucykge1xuICAgIGlmIChzZWVuQ2FwdGlvbnMuaGFzKGNhcHRpb24pKSB7XG4gICAgICBkdXBsaWNhdGVDYXB0aW9ucy5hZGQoY2FwdGlvbik7XG4gICAgfVxuICAgIHNlZW5DYXB0aW9ucy5hZGQoY2FwdGlvbik7XG4gIH1cbiAgcmV0dXJuIFsuLi5kdXBsaWNhdGVDYXB0aW9uc107XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBhc3NlcnRpb24gbWVzc2FnZSBmb3IgYSBub3RlJ3MgZmFpbGluZyBidXR0b25zLlxuICpcbiAqIFRoZSBjYXB0dXJlZCBvdXRwdXQgaXMgaW5jbHVkZWQgYmVjYXVzZSBhIGJ1dHRvbidzIGZhaWx1cmUgaXMgYSBydW50aW1lIG9uZSBcdTIwMTQgdGhlIHN0YWNrIENvZGVTY3JpcHRcbiAqIFRvb2xraXQgcHJpbnRzIHVuZGVyIGl0IGlzIHRoZSBvbmx5IGRpYWdub3NpcyB0aGVyZSBpcy5cbiAqXG4gKiBAcGFyYW0gbm90ZU5hbWUgLSBUaGUgbm90ZSB0aGUgYnV0dG9ucyBiZWxvbmcgdG8uXG4gKiBAcGFyYW0gZmFpbHVyZXMgLSBUaGUgZmFpbGluZyBidXR0b25zLlxuICogQHJldHVybnMgVGhlIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGYWlsdXJlcyhub3RlTmFtZTogc3RyaW5nLCBmYWlsdXJlczogcmVhZG9ubHkgRGVtb1ZhdWx0QnV0dG9uUmVzdWx0W10pOiBzdHJpbmcge1xuICBpZiAoZmFpbHVyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgZGV0YWlscyA9IGZhaWx1cmVzXG4gICAgLm1hcCgoZmFpbHVyZSkgPT4gYCAgLSBcIiR7ZmFpbHVyZS5jYXB0aW9ufVwiIFske2ZhaWx1cmUuc3RhdHVzfV06ICR7ZmFpbHVyZS5vdXRwdXQucmVwbGFjZUFsbCgvXFxzKy9nLCAnICcpLnRyaW0oKX1gKVxuICAgIC5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIGAke1N0cmluZyhmYWlsdXJlcy5sZW5ndGgpfSBidXR0b24ocykgaW4gJHtub3RlTmFtZX0gZGlkIG5vdCBydW4gY2xlYW5seTpcXG4ke2RldGFpbHN9YDtcbn1cblxuLyoqXG4gKiBMaXN0cyB0aGUgY2FwdGlvbnMgb2YgdGhlIGJ1dHRvbnMgYSBub3RlJ3Mgc291cmNlIHdpbGwgYWN0dWFsbHkgcmVuZGVyLCBpbiBzb3VyY2Ugb3JkZXIuXG4gKlxuICogV2hpY2ggZmVuY2VzIHJlbmRlciBhIGJ1dHRvbiBpcyBkZWNpZGVkIGV4YWN0bHkgYXMge0BsaW5rIGNvdW50UmVuZGVyZWRCdXR0b25zfSBkZXNjcmliZXMuIEEgY2FwdGlvbiBpc1xuICogcmVhZCBmcm9tIHRoZSBmZW5jZSdzIG93biBjb25maWcgYmxvY2s7IGEgZmVuY2UgbmFtaW5nIG5vbmUgdGFrZXMgQ29kZVNjcmlwdCBUb29sa2l0J3MgZGVmYXVsdCxcbiAqIGAobm8gY2FwdGlvbilgLCB3aGljaCBpcyB3aGF0IGl0cyBidXR0b24gdGhlbiBzaG93cy5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIG5vdGUncyBtYXJrZG93bi5cbiAqIEByZXR1cm5zIFRoZSBjYXB0aW9ucywgb25lIHBlciByZW5kZXJlZCBidXR0b24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0UmVuZGVyZWRCdXR0b25DYXB0aW9ucyhzb3VyY2U6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgY2FwdGlvbnM6IHN0cmluZ1tdID0gW107XG4gIGxldCBvcGVuTWFya2VyID0gJyc7XG4gIGxldCBpc0NvZGVCdXR0b25GZW5jZSA9IGZhbHNlO1xuICBsZXQgZmVuY2VCb2R5OiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZmVuY2VJbmRlbnRMZW5ndGggPSAwO1xuXG4gIGZ1bmN0aW9uIGNsb3NlRmVuY2UoKTogdm9pZCB7XG4gICAgaWYgKGlzQ29kZUJ1dHRvbkZlbmNlICYmICFpc1Jhd0ZlbmNlKGZlbmNlQm9keSkpIHtcbiAgICAgIGNhcHRpb25zLnB1c2gocmVhZENhcHRpb24oZmVuY2VCb2R5KSk7XG4gICAgfVxuICAgIG9wZW5NYXJrZXIgPSAnJztcbiAgfVxuXG4gIGZvciAoY29uc3QgbGluZSBvZiBzb3VyY2Uuc3BsaXQoL1xccj9cXG4vKSkge1xuICAgIGNvbnN0IG1hdGNoID0gRkVOQ0VfUkVHX0VYUC5leGVjKGxpbmUpO1xuICAgIGNvbnN0IGluZGVudCA9IG1hdGNoPy5ncm91cHM/LlsnaW5kZW50J10gPz8gJyc7XG4gICAgY29uc3QgbWFya2VyID0gbWF0Y2g/Lmdyb3Vwcz8uWydtYXJrZXInXSA/PyAnJztcbiAgICBjb25zdCBpbmZvID0gKG1hdGNoPy5ncm91cHM/LlsnaW5mbyddID8/ICcnKS50cmltKCk7XG5cbiAgICBpZiAob3Blbk1hcmtlciA9PT0gJycpIHtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICBvcGVuTWFya2VyID0gbWFya2VyO1xuICAgICAgICBpc0NvZGVCdXR0b25GZW5jZSA9IGluZm8gPT09IENPREVfQlVUVE9OX0ZFTkNFX0lORk87XG4gICAgICAgIGZlbmNlQm9keSA9IFtdO1xuICAgICAgICBmZW5jZUluZGVudExlbmd0aCA9IGluZGVudC5sZW5ndGg7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBBbnl0aGluZyBlbHNlIHdoaWxlIGEgZmVuY2UgaXMgb3BlbiBpcyBpdHMgY29udGVudCBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSBob3cgYSBgYGBgbWFya2Rvd24gc2FtcGxlXG4gICAgLy8gaG9sZHMgYSBgYGBjb2RlLWJ1dHRvbi5cbiAgICBpZiAobWFya2VyLnN0YXJ0c1dpdGgob3Blbk1hcmtlci5jaGFyQXQoMCkpICYmIG1hcmtlci5sZW5ndGggPj0gb3Blbk1hcmtlci5sZW5ndGggJiYgaW5mbyA9PT0gJycpIHtcbiAgICAgIGNsb3NlRmVuY2UoKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIENvbW1vbk1hcmsgc3RyaXBzIHVwIHRvIHRoZSBvcGVuaW5nIGZlbmNlJ3MgaW5kZW50YXRpb24gZnJvbSBlYWNoIGNvbnRlbnQgbGluZSwgc28gYSBmZW5jZSBuZXN0ZWQgaW5cbiAgICAvLyBhIGxpc3QgaXRlbSBjYXJyaWVzIGl0cyBgY2FwdGlvbjpgIC8gYGlzUmF3OmAga2V5cyBhdCBjb2x1bW4gMCBsaWtlIGFueSBvdGhlci5cbiAgICBmZW5jZUJvZHkucHVzaChsaW5lLnNsaWNlKE1hdGgubWluKGZlbmNlSW5kZW50TGVuZ3RoLCBsaW5lLmxlbmd0aCAtIGxpbmUudHJpbVN0YXJ0KCkubGVuZ3RoKSkpO1xuICB9XG5cbiAgaWYgKG9wZW5NYXJrZXIgIT09ICcnKSB7XG4gICAgY2xvc2VGZW5jZSgpO1xuICB9XG5cbiAgcmV0dXJuIGNhcHRpb25zO1xufVxuXG4vKipcbiAqIFBpY2tzIHRoZSBidXR0b25zIHRoYXQgZmFpbGVkIGFuZCB3ZXJlIG5vdCBleHBlY3RlZCB0by5cbiAqXG4gKiBAcGFyYW0gbm90ZU5hbWUgLSBUaGUgbm90ZSB0aGUgcmVzdWx0cyBiZWxvbmcgdG8sIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHJvb3QuXG4gKiBAcGFyYW0gcmVzdWx0cyAtIEV2ZXJ5IGJ1dHRvbidzIHJlc3VsdCBpbiB0aGF0IG5vdGUuXG4gKiBAcGFyYW0gZXhwZWN0ZWROb25Pa0J1dHRvbnMgLSBUaGUgYnV0dG9ucyBhbGxvd2VkIHRvIGVuZCBpbiBhIGdpdmVuIG5vbi1gb2tgIHN0YXR1cy5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHRzIHRoYXQgYXJlIG5vdCBgb2tgIGFuZCBtYXRjaCBubyB7QGxpbmsgRXhwZWN0ZWROb25Pa0J1dHRvbn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RVbmV4cGVjdGVkRmFpbHVyZXMoXG4gIG5vdGVOYW1lOiBzdHJpbmcsXG4gIHJlc3VsdHM6IHJlYWRvbmx5IERlbW9WYXVsdEJ1dHRvblJlc3VsdFtdLFxuICBleHBlY3RlZE5vbk9rQnV0dG9uczogcmVhZG9ubHkgRXhwZWN0ZWROb25Pa0J1dHRvbltdXG4pOiBEZW1vVmF1bHRCdXR0b25SZXN1bHRbXSB7XG4gIHJldHVybiByZXN1bHRzLmZpbHRlcigocmVzdWx0KSA9PlxuICAgIHJlc3VsdC5zdGF0dXMgIT09ICdvaydcbiAgICAmJiBleHBlY3RlZE5vbk9rQnV0dG9ucy5ldmVyeSgoZXhwZWN0ZWQpID0+XG4gICAgICAhKGV4cGVjdGVkLm5vdGUgPT09IG5vdGVOYW1lXG4gICAgICAgICYmIGV4cGVjdGVkLnN0YXR1cyA9PT0gcmVzdWx0LnN0YXR1c1xuICAgICAgICAmJiByZXN1bHQuY2FwdGlvbi5pbmNsdWRlcyhleHBlY3RlZC5jYXB0aW9uSW5jbHVkZXMpKVxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgYGNvZGUtYnV0dG9uYCBmZW5jZSdzIG93biBZQU1MIGNvbmZpZyBhc2tzIGZvciByYXcgbW9kZS5cbiAqXG4gKiBSZWFkIGZyb20gdGhlIGxlYWRpbmcgYC0tLWAgYmxvY2sgcmF0aGVyIHRoYW4gZnJvbSB0aGUgd2hvbGUgYm9keSwgc28gYW4gYGlzUmF3OiB0cnVlYCB3cml0dGVuIGluc2lkZVxuICogYSBidXR0b24ncyBDT0RFIFx1MjAxNCBhIGJ1dHRvbiB0aGF0IGRlbW9uc3RyYXRlcyB0aGUga2V5IFx1MjAxNCBpcyBub3QgbWlzdGFrZW4gZm9yIHRoZSBidXR0b24ncyBvd24gY29uZmlnLlxuICpcbiAqIEBwYXJhbSBmZW5jZUJvZHkgLSBUaGUgZmVuY2UncyBsaW5lcywgd2l0aG91dCB0aGUgZmVuY2UgbWFya2Vycy5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZlbmNlIHJlbmRlcnMgbm8gYnV0dG9uLlxuICovXG5mdW5jdGlvbiBpc1Jhd0ZlbmNlKGZlbmNlQm9keTogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3QgY29uZmlnID0gcmVhZENvbmZpZ0Jsb2NrKGZlbmNlQm9keSk7XG4gIHJldHVybiBjb25maWcgIT09IG51bGwgJiYgUkFXX01PREVfQ09ORklHX1JFR19FWFAudGVzdChjb25maWcpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjYXB0aW9uIGEgYGNvZGUtYnV0dG9uYCBmZW5jZSdzIG93biBjb25maWcgYmxvY2sgZ2l2ZXMgaXRzIGJ1dHRvbi5cbiAqXG4gKiBBIGRlbGliZXJhdGVseSBzbWFsbCByZWFkaW5nIG9mIFlBTUwgXHUyMDE0IGEgcGxhaW4sIHNpbmdsZS1xdW90ZWQgb3IgZG91YmxlLXF1b3RlZCBzY2FsYXIgb24gdGhlIGBjYXB0aW9uOmBcbiAqIGxpbmUgXHUyMDE0IHNpbmNlIHRoZSB2YWx1ZSBvbmx5IGV2ZXIgbmFtZXMgYSBidXR0b24uIEEgdmFsdWUgaXQgY2Fubm90IHJlYWQgZXhhY3RseSwgc3VjaCBhcyBhIGJsb2NrXG4gKiBzY2FsYXIsIGlzIHJldHVybmVkIGFzIHdyaXR0ZW46IHRoYXQgY2FuIG1ha2Ugb25lIGNhcHRpb24gcmVhZCB3cm9uZywgYnV0IGl0IGNhbm5vdCBtYWtlIHR3b1xuICogZGlmZmVyZW50IG9uZXMgY29tcGFyZSBlcXVhbC5cbiAqXG4gKiBAcGFyYW0gZmVuY2VCb2R5IC0gVGhlIGZlbmNlJ3MgbGluZXMsIHdpdGhvdXQgdGhlIGZlbmNlIG1hcmtlcnMuXG4gKiBAcmV0dXJucyBUaGUgY2FwdGlvbi5cbiAqL1xuZnVuY3Rpb24gcmVhZENhcHRpb24oZmVuY2VCb2R5OiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbmZpZyA9IHJlYWRDb25maWdCbG9jayhmZW5jZUJvZHkpO1xuICBjb25zdCByYXdWYWx1ZSA9IGNvbmZpZyA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IENBUFRJT05fQ09ORklHX1JFR19FWFAuZXhlYyhjb25maWcpPy5ncm91cHM/LlsndmFsdWUnXTtcbiAgaWYgKHJhd1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gREVGQVVMVF9DT0RFX0JVVFRPTl9DQVBUSU9OO1xuICB9XG5cbiAgY29uc3QgdmFsdWUgPSByYXdWYWx1ZS50cmltKCk7XG4gIGNvbnN0IHNpbmdsZVF1b3RlZENvbnRlbnQgPSBTSU5HTEVfUVVPVEVEX1NDQUxBUl9SRUdfRVhQLmV4ZWModmFsdWUpPy5ncm91cHM/LlsnY29udGVudCddO1xuICBpZiAoc2luZ2xlUXVvdGVkQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHNpbmdsZVF1b3RlZENvbnRlbnQucmVwbGFjZUFsbCgnXFwnXFwnJywgJ1xcJycpO1xuICB9XG4gIGNvbnN0IGRvdWJsZVF1b3RlZENvbnRlbnQgPSBET1VCTEVfUVVPVEVEX1NDQUxBUl9SRUdfRVhQLmV4ZWModmFsdWUpPy5ncm91cHM/LlsnY29udGVudCddO1xuICBpZiAoZG91YmxlUXVvdGVkQ29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKSBhcyBzdHJpbmc7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZG91YmxlUXVvdGVkQ29udGVudDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoUExBSU5fU0NBTEFSX0NPTU1FTlRfUkVHX0VYUCwgJycpO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgYGNvZGUtYnV0dG9uYCBmZW5jZSdzIGxlYWRpbmcgYC0tLWAgY29uZmlnIGJsb2NrLlxuICpcbiAqIE9ubHkgdGhlIGxlYWRpbmcgYmxvY2sgY291bnRzLCBzbyBhIGAtLS1gIGJsb2NrIHdyaXR0ZW4gaW5zaWRlIGEgYnV0dG9uJ3MgQ09ERSBpcyBub3QgbWlzdGFrZW4gZm9yIHRoZVxuICogYnV0dG9uJ3Mgb3duIGNvbmZpZy5cbiAqXG4gKiBAcGFyYW0gZmVuY2VCb2R5IC0gVGhlIGZlbmNlJ3MgbGluZXMsIHdpdGhvdXQgdGhlIGZlbmNlIG1hcmtlcnMuXG4gKiBAcmV0dXJucyBUaGUgYmxvY2sncyBjb250ZW50LCBvciBgbnVsbGAgd2hlbiB0aGUgZmVuY2Ugb3BlbnMgd2l0aCBubyB0ZXJtaW5hdGVkIGJsb2NrLlxuICovXG5mdW5jdGlvbiByZWFkQ29uZmlnQmxvY2soZmVuY2VCb2R5OiByZWFkb25seSBzdHJpbmdbXSk6IG51bGwgfCBzdHJpbmcge1xuICBpZiAoZmVuY2VCb2R5WzBdPy50cmltKCkgIT09IEZST05UX01BVFRFUl9ERUxJTUlURVIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGVuZEluZGV4ID0gZmVuY2VCb2R5LmZpbmRJbmRleCgobGluZSwgaW5kZXgpID0+IGluZGV4ID4gMCAmJiBsaW5lLnRyaW0oKSA9PT0gRlJPTlRfTUFUVEVSX0RFTElNSVRFUik7XG4gIHJldHVybiBlbmRJbmRleCA9PT0gLTEgPyBudWxsIDogZmVuY2VCb2R5LnNsaWNlKDEsIGVuZEluZGV4KS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBGb2xkZXJzIHRoYXQgbmV2ZXIgaG9sZCBhIHdhbGt0aHJvdWdoLiBgTWF0ZXJpYWxzL2AgaG9sZHMgdGhlIGZpeHR1cmVzIHRoZSB3YWxrdGhyb3VnaHMgYWN0IG9uO1xuICogYF9hc3NldHMvYCBob2xkcyB0aGUgZGVtbyBzY3JpcHRzOyBgLm9ic2lkaWFuL2AgaXMgdmF1bHQgY29uZmlnLiBBIGZvbGRlciBzdGFydGluZyB3aXRoIGAuYCBvciBgX2BcbiAqIGlzIHNraXBwZWQgb24gdGhlIHNhbWUgcmVhc29uaW5nLCB3aXRob3V0IGhhdmluZyB0byBiZSBsaXN0ZWQuXG4gKi9cbmNvbnN0IE5PTl9XQUxLVEhST1VHSF9GT0xERVJTID0gbmV3IFNldChbJ01hdGVyaWFscyddKTtcblxuLyoqXG4gKiBMaXN0cyB0aGUgZGVtbyB2YXVsdCdzIG5vdGVzIHRoYXQgZGVjbGFyZSBhdCBsZWFzdCBvbmUgYGNvZGUtYnV0dG9uYCwgd2Fsa2luZyBncm91cCBmb2xkZXJzIHRvby5cbiAqXG4gKiBBIHZhdWx0IGJpZyBlbm91Z2ggdG8gbmVlZCBncm91cGluZyBwdXRzIGl0cyB3YWxrdGhyb3VnaHMgaW4gbnVtYmVyZWQgZm9sZGVycyBcdTIwMTQgYW5kIGEgcm9vdC1vbmx5IHdhbGtcbiAqIGZpbmRzIE5PTkUgb2YgdGhlbSwgd2hpY2ggaXMgd29yc2UgdGhhbiBpdCBzb3VuZHM6IGEgdmF1bHQgd2hvc2Ugbm90ZXMgYXJlIGFsbCBncm91cGVkIHJlcG9ydHMgemVyb1xuICogbm90ZXMsIGFuZCBvbmUgdGhhdCBpcyBwYXJ0bHkgZ3JvdXBlZCBzaWxlbnRseSBnYXRlcyBvbmx5IHRoZSB1bmdyb3VwZWQgcGFydC4gRml4dHVyZSBhbmQgYXNzZXRcbiAqIGZvbGRlcnMgYXJlIHN0aWxsIHNraXBwZWQsIHNvIHdoYXQgaXMgd2Fsa2VkIGlzIHdhbGt0aHJvdWdocyBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqIEBwYXJhbSBkZW1vVmF1bHRQYXRoIC0gVGhlIGRlbW8gdmF1bHQgcm9vdC5cbiAqIEBwYXJhbSBleGNsdWRlZE5vdGVzIC0gTm90ZSBuYW1lcyB0byBza2lwLCBtYXRjaGVkIGFnYWluc3QgYm90aCB0aGUgZmlsZSBuYW1lIGFuZCB0aGUgcGF0aCByZWxhdGl2ZVxuICogdG8gdGhlIHZhdWx0IHJvb3QuXG4gKiBAcGFyYW0gZXhjbHVkZWRGb2xkZXJzIC0gRm9sZGVycyB0byBza2lwIHdob2xlLCBtYXRjaGVkIHRoZSBzYW1lIHdheS5cbiAqIEByZXR1cm5zIFRoZSBub3Rlcywgc29ydGVkIGJ5IHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0Tm90ZXNXaXRoQnV0dG9ucyhcbiAgZGVtb1ZhdWx0UGF0aDogc3RyaW5nLFxuICBleGNsdWRlZE5vdGVzOiBSZWFkb25seVNldDxzdHJpbmc+LFxuICBleGNsdWRlZEZvbGRlcnM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KClcbik6IERlbW9WYXVsdE5vdGVbXSB7XG4gIGNvbnN0IG5vdGVzOiBEZW1vVmF1bHROb3RlW10gPSBbXTtcblxuICBmdW5jdGlvbiB3YWxrKGZvbGRlcjogc3RyaW5nLCByZWxhdGl2ZUZvbGRlcjogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhmb2xkZXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVGb2xkZXIgPT09ICcnID8gZW50cnkubmFtZSA6IGAke3JlbGF0aXZlRm9sZGVyfS8ke2VudHJ5Lm5hbWV9YDtcblxuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJy4nKSAmJiAhZW50cnkubmFtZS5zdGFydHNXaXRoKCdfJykgJiYgIU5PTl9XQUxLVEhST1VHSF9GT0xERVJTLmhhcyhlbnRyeS5uYW1lKVxuICAgICAgICAgICYmICFleGNsdWRlZEZvbGRlcnMuaGFzKGVudHJ5Lm5hbWUpICYmICFleGNsdWRlZEZvbGRlcnMuaGFzKHJlbGF0aXZlUGF0aClcbiAgICAgICAgKSB7XG4gICAgICAgICAgd2Fsayhqb2luKGZvbGRlciwgZW50cnkubmFtZSksIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghZW50cnkubmFtZS5lbmRzV2l0aCgnLm1kJykgfHwgZXhjbHVkZWROb3Rlcy5oYXMoZW50cnkubmFtZSkgfHwgZXhjbHVkZWROb3Rlcy5oYXMocmVsYXRpdmVQYXRoKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FwdGlvbnMgPSBsaXN0UmVuZGVyZWRCdXR0b25DYXB0aW9ucyhyZWFkRmlsZVN5bmMoam9pbihmb2xkZXIsIGVudHJ5Lm5hbWUpLCAndXRmLTgnKSk7XG4gICAgICBpZiAoY2FwdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBub3Rlcy5wdXNoKHsgYnV0dG9uQ291bnQ6IGNhcHRpb25zLmxlbmd0aCwgY2FwdGlvbnMsIG5hbWU6IHJlbGF0aXZlUGF0aCB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3YWxrKGRlbW9WYXVsdFBhdGgsICcnKTtcbiAgcmV0dXJuIG5vdGVzLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSwgJ2VuJykpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRXZlcnkgYXNzZXJ0aW9uIGJlbG93IHJ1bnMgYWdhaW5zdCBhIHJlYWwgT2JzaWRpYW4gb3ZlciBDRFAsIGRyaXZlbiBieSBjbG9zdXJlcyB0aGlzIHByb2Nlc3Mgc2VyaWFsaXplcyBhbmQgYW5vdGhlciBleGVjdXRlcy4gVGhlIHRlc3RhYmxlIHBhcnRzIGFyZSBsaXN0Tm90ZXNXaXRoQnV0dG9ucyBhbmQgZm9ybWF0RmFpbHVyZXMsIHdoaWNoIGhhdmUgdGhlaXIgb3duIHVuaXQgdGVzdHMuICovXG4vKipcbiAqIFJlZ2lzdGVycyBhIHZpdGVzdCBzdWl0ZSB0aGF0IGNsaWNrcyBldmVyeSBgY29kZS1idXR0b25gIGluIHRoZSByZXBvJ3MgZGVtbyB2YXVsdC5cbiAqXG4gKiBPbmUgYGl0YCBwZXIgbm90ZSwgYW5kIG9uZSBgZXZhbEluT2JzaWRpYW5gIHBlciBidXR0b246IGEgc2luZ2xlIGNsb3N1cmUgcnVucyBhcyBvbmUgQ0RQXG4gKiBgUnVudGltZS5ldmFsdWF0ZWAsIHdoaWNoIHRoZSBoYXJuZXNzIGNhcHMgYXQgMzAgcywgc28gYSBub3RlIHdpdGggYSBkb3plbiBidXR0b25zIHdvdWxkIG90aGVyd2lzZVxuICogdGltZSBvdXQgYXMgYSB3aG9sZSByYXRoZXIgdGhhbiByZXBvcnRpbmcgd2hpY2ggYnV0dG9uIGZhaWxlZC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgUmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZU9wdGlvbnN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZShvcHRpb25zOiBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIGNvbnN0IHJvb3RGb2xkZXIgPSBvcHRpb25zLnJvb3RGb2xkZXIgPz8gZ2V0Um9vdEZvbGRlcigpID8/IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IGRlbW9WYXVsdFBhdGggPSBqb2luKHJvb3RGb2xkZXIsICdkZW1vLXZhdWx0Jyk7XG4gIGNvbnN0IGV4Y2x1ZGVkTm90ZXMgPSBuZXcgU2V0KG9wdGlvbnMuZXhjbHVkZWROb3RlcyA/PyBERUZBVUxUX0VYQ0xVREVEX05PVEVTKTtcbiAgY29uc3QgZXhjbHVkZWRGb2xkZXJzID0gbmV3IFNldChvcHRpb25zLmV4Y2x1ZGVkRm9sZGVycyk7XG4gIGNvbnN0IGV4cGVjdGVkTm9uT2tCdXR0b25zID0gb3B0aW9ucy5leHBlY3RlZE5vbk9rQnV0dG9ucyA/PyBbXTtcbiAgY29uc3Qgc2hvdWxkRGlzbWlzc01vZGFscyA9IG9wdGlvbnMuc2hvdWxkRGlzbWlzc01vZGFscyA/PyBmYWxzZTtcbiAgY29uc3Qgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzID0gb3B0aW9ucy5zZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9TRVRUTEVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gIGNvbnN0IGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IG9wdGlvbnMuYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfQlVUVE9OX1JFU1VMVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcblxuICAvLyBSZXNvbHZlZCBPTkNFIGFuZCBoYW5kZWQgdG8gYm90aCB0aGUgYm91bmQgYW5kIHRoZSBjbGljaywgc28gdGhlIHBhaXIgdGhhdCBpcyBhc3NlcnRlZCBhbmQgdGhlIHBhaXJcbiAgLy8gdGhhdCBpcyBzcGVudCBjYW5ub3QgZHJpZnQgYXBhcnQuXG4gIGNvbnN0IGNsaWNrQnV0dG9uVGltZW91dHM6IENsaWNrQnV0dG9uVGltZW91dHMgPSB7XG4gICAgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICB9O1xuICBhc3NlcnRDbGlja0J1ZGdldHNGaXRUcmFuc3BvcnRDYXAoY2xpY2tCdXR0b25UaW1lb3V0cyk7XG5cbiAgY29uc3Qgbm90ZXMgPSBsaXN0Tm90ZXNXaXRoQnV0dG9ucyhkZW1vVmF1bHRQYXRoLCBleGNsdWRlZE5vdGVzLCBleGNsdWRlZEZvbGRlcnMpO1xuXG4gIGRlc2NyaWJlKCdkZW1vLXZhdWx0IGJ1dHRvbnMnLCAoKSA9PiB7XG4gICAgYmVmb3JlQWxsKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGlzQ29kZVNjcmlwdFRvb2xraXRMb2FkZWQgPSBhd2FpdCBjaGVja0NvZGVTY3JpcHRUb29sa2l0TG9hZGVkKHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgICAvLyBXaXRob3V0IGl0IGV2ZXJ5IGBjb2RlLWJ1dHRvbmAgZmVuY2Ugc3RheXMgYSBwbGFpbiBjb2RlIGJsb2NrLCBzbyBldmVyeSBub3RlIGJlbG93IHdvdWxkIHJlcG9ydFxuICAgICAgLy8gemVybyBidXR0b25zIGFuZCBwYXNzIHZhY3VvdXNseS4gRmFpbCBoZXJlIGluc3RlYWQsIG9uY2UsIHdpdGggdGhlIHJlYXNvbi5cbiAgICAgIGV4cGVjdChpc0NvZGVTY3JpcHRUb29sa2l0TG9hZGVkLCAnQ29kZVNjcmlwdCBUb29sa2l0IGRpZCBub3QgbG9hZCwgc28gbm8gYnV0dG9uIGNvdWxkIHJlbmRlcicpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBBIGRlbW8gdmF1bHQgaGFzIHRvIGRlbW9uc3RyYXRlIGV2ZXJ5IGhlYWRsaW5lIGZlYXR1cmUsIHNvIGEgdmF1bHQgd2hvc2Ugbm90ZXMgZGVjbGFyZSBubyBidXR0b25zXG4gICAgLy8gaXMgYSByZWFsIGZhaWx1cmUgb2YgaXRzIGludGVyYWN0aXZlIGhhbGYsIG5vdCBhIHJlYXNvbiB0byByZWdpc3RlciBub3RoaW5nIGFuZCByZXBvcnQgZ3JlZW4uXG4gICAgaXQoJ2hhcyBhdCBsZWFzdCBvbmUgbm90ZSB3aXRoIGEgY29kZSBidXR0b24nLCAoKSA9PiB7XG4gICAgICBleHBlY3Qobm90ZXMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMCk7XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IG5vdGUgb2Ygbm90ZXMpIHtcbiAgICAgIGl0KGBydW5zIGV2ZXJ5IGNvZGUgYnV0dG9uIGluICR7bm90ZS5uYW1lfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gQ2hlY2tlZCBmcm9tIHRoZSBzb3VyY2UsIGJlZm9yZSBhbnl0aGluZyBpcyBvcGVuZWQ6IGJ1dHRvbnMgYXJlIGFkZHJlc3NlZCBieSBjYXB0aW9uLCBzbyBhXG4gICAgICAgIC8vIHNoYXJlZCBvbmUgd291bGQgb3RoZXJ3aXNlIHN1cmZhY2UgYmVsb3cgYXMgYSBidXR0b24gdGhhdCBcIm5ldmVyIHJlbmRlcmVkXCIuXG4gICAgICAgIGNvbnN0IGR1cGxpY2F0ZUNhcHRpb25zID0gZmluZER1cGxpY2F0ZUNhcHRpb25zKG5vdGUuY2FwdGlvbnMpO1xuICAgICAgICBleHBlY3QoXG4gICAgICAgICAgZHVwbGljYXRlQ2FwdGlvbnMsXG4gICAgICAgICAgYCR7bm90ZS5uYW1lfSBkZWNsYXJlcyBtb3JlIHRoYW4gb25lIGJ1dHRvbiBjYXB0aW9uZWQgJHtkdXBsaWNhdGVDYXB0aW9ucy5tYXAoKGNhcHRpb24pID0+IGBcIiR7Y2FwdGlvbn1cImApLmpvaW4oJywgJyl9LiBgXG4gICAgICAgICAgICArICdUaGlzIHN1aXRlIGFkZHJlc3NlcyBhIGJ1dHRvbiBieSBpdHMgY2FwdGlvbiwgc28gb25seSB0aGUgZmlyc3Qgb2YgdGhlbSBjb3VsZCBldmVyIGJlIGNsaWNrZWQuIEdpdmUgZWFjaCBidXR0b24gYSBkaXN0aW5jdCBjYXB0aW9uLidcbiAgICAgICAgKS50b0VxdWFsKFtdKTtcblxuICAgICAgICBjb25zdCBjYXB0aW9ucyA9IGF3YWl0IG9wZW5Ob3RlQW5kTGlzdEJ1dHRvbkNhcHRpb25zKG5vdGUsIHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgICAgIC8vIFJlYWRpbmcgdmlldyBtb3VudHMgYSBub3RlJ3MgbGVhZGluZyBzZWN0aW9ucyBtb3JlIHRoYW4gb25jZSB3aGlsZSBpdCBzZXR0bGVzLCBzbyB0aGUgRE9NIGNhblxuICAgICAgICAvLyBob2xkIHNldmVyYWwgZWxlbWVudHMgcGVyIGZlbmNlLiBUaGUgY2FwdGlvbnMgYXJlIGRlZHVwbGljYXRlZCwgYW5kIHRoZSBhc3NlcnRpb24gaXMgdGhhdCBhdFxuICAgICAgICAvLyBsZWFzdCBhcyBtYW55IERJU1RJTkNUIGJ1dHRvbnMgcmVuZGVyZWQgYXMgdGhlIHNvdXJjZSBkZWNsYXJlcyBcdTIwMTQgYSBmZW5jZSB0aGF0IHNpbGVudGx5IHN0YXllZFxuICAgICAgICAvLyBBIHBsYWluIGNvZGUgYmxvY2sgaXMgdGhlIGZhaWx1cmUgdGhpcyBjYXRjaGVzLlxuICAgICAgICBjb25zdCBtaXNzaW5nQ2FwdGlvbnMgPSBub3RlLmNhcHRpb25zLmZpbHRlcigoY2FwdGlvbikgPT4gIWNhcHRpb25zLmluY2x1ZGVzKGNhcHRpb24pKTtcbiAgICAgICAgZXhwZWN0KFxuICAgICAgICAgIGNhcHRpb25zLmxlbmd0aCxcbiAgICAgICAgICBgJHtub3RlLm5hbWV9IGRlY2xhcmVzICR7U3RyaW5nKG5vdGUuYnV0dG9uQ291bnQpfSBidXR0b24ocykgYnV0IG9ubHkgJHtTdHJpbmcoY2FwdGlvbnMubGVuZ3RoKX0gcmVuZGVyZWQ7IGBcbiAgICAgICAgICAgICsgYG5ldmVyIHNlZW46ICR7bWlzc2luZ0NhcHRpb25zLm1hcCgoY2FwdGlvbikgPT4gYFwiJHtjYXB0aW9ufVwiYCkuam9pbignLCAnKX1gXG4gICAgICAgIClcbiAgICAgICAgICAudG9CZUdyZWF0ZXJUaGFuT3JFcXVhbChub3RlLmJ1dHRvbkNvdW50KTtcblxuICAgICAgICBjb25zdCByZXN1bHRzOiBEZW1vVmF1bHRCdXR0b25SZXN1bHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNhcHRpb24gb2YgY2FwdGlvbnMpIHtcbiAgICAgICAgICByZXN1bHRzLnB1c2goYXdhaXQgY2xpY2tCdXR0b24oeyBidXR0b25DYXB0aW9uOiBjYXB0aW9uLCBub3RlUGF0aDogbm90ZS5uYW1lLCBzaG91bGREaXNtaXNzTW9kYWxzLCB0aW1lb3V0czogY2xpY2tCdXR0b25UaW1lb3V0cyB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmYWlsdXJlcyA9IHNlbGVjdFVuZXhwZWN0ZWRGYWlsdXJlcyhub3RlLm5hbWUsIHJlc3VsdHMsIGV4cGVjdGVkTm9uT2tCdXR0b25zKTtcblxuICAgICAgICBleHBlY3QoZmFpbHVyZXMsIGZvcm1hdEZhaWx1cmVzKG5vdGUubmFtZSwgZmFpbHVyZXMpKS50b0VxdWFsKFtdKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBEcml2ZXMgYSByZWFsIE9ic2lkaWFuIG92ZXIgQ0RQOiB0aGUgY2xvc3VyZSBpcyBzZXJpYWxpemVkIGhlcmUgYW5kIGV4ZWN1dGVkIGluIGFub3RoZXIgcHJvY2Vzcywgc28gaXQgY2Fubm90IGJlIGV4ZXJjaXNlZCBieSBhIHVuaXQgdGVzdC4gKi9cbi8qKlxuICogVHVybnMgcmVzdHJpY3RlZCBtb2RlIG9mZiBhbmQgZW5hYmxlcyBDb2RlU2NyaXB0IFRvb2xraXQsIHdob3NlIGJpbmFyeSB0aGUgZ2xvYmFsIHNldHVwIHNlZWRlZC5cbiAqXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gSG93IGxvbmcgdG8gd2FpdCBmb3IgaXQgdG8gbG9hZC5cbiAqIEByZXR1cm5zIFdoZXRoZXIgQ29kZVNjcmlwdCBUb29sa2l0IGlzIGxvYWRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tDb2RlU2NyaXB0VG9vbGtpdExvYWRlZCh0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gZXZhbEluT2JzaWRpYW4oe1xuICAgIGFzeW5jIGNhbGxiYWNrKHsgYXBwLCBjb2RlU2NyaXB0VG9vbGtpdFBsdWdpbklkLCBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLCBsaWI6IHsgd2FpdFVudGlsIH0sIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGltZW91dCB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBpZiAodHlwZW9mIGFwcC5wbHVnaW5zLmlzRW5hYmxlZCA9PT0gJ2Z1bmN0aW9uJyAmJiAhYXBwLnBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgYXBwLnBsdWdpbnMuc2V0RW5hYmxlKHRydWUpO1xuICAgICAgfVxuICAgICAgaWYgKCFhcHAucGx1Z2lucy5nZXRQbHVnaW4oY29kZVNjcmlwdFRvb2xraXRQbHVnaW5JZCkpIHtcbiAgICAgICAgYXdhaXQgYXBwLnBsdWdpbnMuZW5hYmxlUGx1Z2luKGNvZGVTY3JpcHRUb29sa2l0UGx1Z2luSWQpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsKHtcbiAgICAgICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIG1lc3NhZ2U6ICdDb2RlU2NyaXB0IFRvb2xraXQgbmV2ZXIgbG9hZGVkJyxcbiAgICAgICAgICBwcmVkaWNhdGU6ICgpOiBib29sZWFuID0+IGFwcC5wbHVnaW5zLmdldFBsdWdpbihjb2RlU2NyaXB0VG9vbGtpdFBsdWdpbklkKSAhPT0gbnVsbCxcbiAgICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHRpbWVvdXRcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgY29kZVNjcmlwdFRvb2xraXRQbHVnaW5JZDogQ09ERV9TQ1JJUFRfVE9PTEtJVF9QTFVHSU5fSUQsXG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzOiBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0sXG4gICAgdmF1bHRQYXRoOiBnZXRUZW1wb3JhcnlWYXVsdCgpLnBhdGhcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBEcml2ZXMgYSByZWFsIE9ic2lkaWFuIG92ZXIgQ0RQOiB0aGUgY2xvc3VyZSBpcyBzZXJpYWxpemVkIGhlcmUgYW5kIGV4ZWN1dGVkIGluIGFub3RoZXIgcHJvY2Vzcywgc28gaXQgY2Fubm90IGJlIGV4ZXJjaXNlZCBieSBhIHVuaXQgdGVzdC4gKi9cbi8qKlxuICogQ2xpY2tzIG9uZSBidXR0b24gYW5kIHJlYWRzIHRoZSByZXN1bHQgbGluZSBDb2RlU2NyaXB0IFRvb2xraXQgd3JpdGVzIHVuZGVyIGl0LlxuICpcbiAqIEEgYnV0dG9uIHRoYXQgcmUtcmVuZGVycyBpdHMgb3duIG5vdGUgKGEgc2V0dGluZ3MgY2hhbmdlLCBhIHJlbG9hZCkgZGV0YWNoZXMgdGhlIGJsb2NrIGl0IGxpdmVzIGluLFxuICogc28gdGhlIGJsb2NrIGVsZW1lbnQgaXMgY2FwdHVyZWQgQkVGT1JFIHRoZSBjbGljayBhbmQgcmVhZCBhZnRlcndhcmRzIFx1MjAxNCBDb2RlU2NyaXB0IFRvb2xraXQgd3JpdGVzIHRoZVxuICogcmVzdWx0IGludG8gdGhhdCBzYW1lIGVsZW1lbnQgZXZlbiBvbmNlIGl0IGlzIGRldGFjaGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENsaWNrQnV0dG9uUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgRGVtb1ZhdWx0QnV0dG9uUmVzdWx0fS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2xpY2tCdXR0b24ocGFyYW1zOiBDbGlja0J1dHRvblBhcmFtcyk6IFByb21pc2U8RGVtb1ZhdWx0QnV0dG9uUmVzdWx0PiB7XG4gIHJldHVybiBldmFsSW5PYnNpZGlhbih7XG4gICAgYXN5bmMgY2FsbGJhY2soe1xuICAgICAgYXBwLFxuICAgICAgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgY2FwdGlvbixcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMsXG4gICAgICBsaWI6IHsgcHJlc3NLZXksIHdhaXRVbnRpbCB9LFxuICAgICAgbm90ZVBhdGg6IG5vdGVQYXRoVG9PcGVuLFxuICAgICAgb2JzaWRpYW5Nb2R1bGUsXG4gICAgICBvdXRwdXRFeGNlcnB0TGVuZ3RoLFxuICAgICAgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgc2hvdWxkRGlzbWlzc01vZGFsczogc2hvdWxkRGlzbWlzc1xuICAgIH0pOiBQcm9taXNlPERlbW9WYXVsdEJ1dHRvblJlc3VsdD4ge1xuICAgICAgZnVuY3Rpb24gdmlldygpOiBJbnN0YW5jZVR5cGU8dHlwZW9mIG9ic2lkaWFuTW9kdWxlLk1hcmtkb3duVmlldz4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShvYnNpZGlhbk1vZHVsZS5NYXJrZG93blZpZXcpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcHJldmlld0VsKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB2aWV3KCk/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCc6c2NvcGUgLm1hcmtkb3duLXByZXZpZXctdmlldycpID8/IG51bGw7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBidXR0b25zKCk6IEhUTUxCdXR0b25FbGVtZW50W10ge1xuICAgICAgICByZXR1cm4gWy4uLnZpZXcoKT8uY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJzpzY29wZSAuYmxvY2stbGFuZ3VhZ2UtY29kZS1idXR0b24gYnV0dG9uLm1vZC1jdGEnKSA/PyBbXV07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGZpbmRCdXR0b24oKTogSFRNTEJ1dHRvbkVsZW1lbnQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gYnV0dG9ucygpLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnRleHRDb250ZW50ID09PSBjYXB0aW9uKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZGluZyB2aWV3IG1vdW50cyBsYXppbHkgYW5kIHVubW91bnRzIHNlY3Rpb25zIGZhciBvZmYtc2NyZWVuLCBzbyBOTyBzaW5nbGUgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAvLyBob2xkcyBhIHdob2xlIG5vdGUncyBidXR0b25zLiBBZHZhbmNlIGEgdmlld3BvcnQgYXQgYSB0aW1lIGFuZCB3cmFwIGJhY2sgdG8gdGhlIHRvcCwgcmVtb3VudGluZ1xuICAgICAgLy8gZXZlcnkgc2VjdGlvbiBpbiB0dXJuIHVudGlsIHRoZSBvbmUgYmVpbmcgbG9va2VkIGZvciBhcHBlYXJzLiBQaW5uaW5nIHRvIHRoZSBCT1RUT00gaW5zdGVhZCBcdTIwMTRcbiAgICAgIC8vIHdoYXQgdGhpcyBkaWQgdW50aWwgOTQuNC4xIFx1MjAxNCBvbmx5IGV2ZXIgbW91bnRzIHRoZSBub3RlJ3MgdGFpbCwgc28gYSBidXR0b24gYW55d2hlcmUgYnV0IGF0IHRoZVxuICAgICAgLy8gZW5kIG9mIGl0cyBub3RlIHdhcyByZXBvcnRlZCBhcyBuZXZlciByZW5kZXJlZCAoYHN0YXR1czogJ3RpbWVvdXQnYCwgZW1wdHkgb3V0cHV0KSBob3dldmVyXG4gICAgICAvLyBoZWFsdGh5IGl0IHdhcy5cbiAgICAgIGNvbnN0IFNDUk9MTF9CT1RUT01fVE9MRVJBTkNFX0lOX1BJWEVMUyA9IDQ7XG4gICAgICBjb25zdCBTQ1JPTExfU1RFUF9SQVRJTyA9IDAuODtcbiAgICAgIGZ1bmN0aW9uIGFkdmFuY2VTY3JvbGwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNjcm9sbGVyID0gcHJldmlld0VsKCk7XG4gICAgICAgIGlmICghc2Nyb2xsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNBdEJvdHRvbSA9IHNjcm9sbGVyLnNjcm9sbFRvcCArIHNjcm9sbGVyLmNsaWVudEhlaWdodCA+PSBzY3JvbGxlci5zY3JvbGxIZWlnaHQgLSBTQ1JPTExfQk9UVE9NX1RPTEVSQU5DRV9JTl9QSVhFTFM7XG4gICAgICAgIHNjcm9sbGVyLnNjcm9sbFRvcCA9IGlzQXRCb3R0b20gPyAwIDogc2Nyb2xsZXIuc2Nyb2xsVG9wICsgTWF0aC5mbG9vcihzY3JvbGxlci5jbGllbnRIZWlnaHQgKiBTQ1JPTExfU1RFUF9SQVRJTyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEJvdGggdGhlIHByZS0xLjEzIGFuZCB0aGUgMS4xMyBuYW1lIG9mIGEgbW9kYWwncyBYOiB0aGUgb2xkIG9uZSBhbG9uZSBtYXRjaGVzIG5vdGhpbmcgb24gYSBjdXJyZW50XG4gICAgICAvLyBPYnNpZGlhbiwgYW5kIGNsaWNraW5nIG5vdGhpbmcgaXMgYSBzaWxlbnQgbm8tb3AgcmF0aGVyIHRoYW4gYW4gZXJyb3IuXG4gICAgICBhc3luYyBmdW5jdGlvbiBkaXNtaXNzTW9kYWxzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXNob3VsZERpc21pc3MpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBjbG9zZUJ1dHRvbiBvZiBhY3RpdmVEb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCc6c2NvcGUgLm1vZGFsLWNvbnRhaW5lciA6aXMoLm1vZGFsLWNsb3NlLWJ1dHRvbiwgLm1vZGFsLWhlYWRlci1idXR0b24pJykpIHtcbiAgICAgICAgICBjbG9zZUJ1dHRvbi5jbGljaygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEEgdHJ1c3RlZCBFc2NhcGUgXHUyMDE0IHdoYXQgYSB1c2VyIHByZXNzZXMgXHUyMDE0IGJ1dCBvbmx5IHdoaWxlIHNvbWV0aGluZyBpcyBzdGlsbCBvcGVuOiB0aGlzIHJ1bnMgb25cbiAgICAgICAgLy8gZXZlcnkgcG9sbCwgYW5kIGFuIHVuY29uZGl0aW9uYWwga2V5IHByZXNzIHdvdWxkIGxhbmQgaW4gd2hhdGV2ZXIgdGhlIG5leHQgYnV0dG9uIGlzIGRvaW5nLlxuICAgICAgICBpZiAoYWN0aXZlRG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1vZGFsLWNvbnRhaW5lciwgLnByb21wdCcpKSB7XG4gICAgICAgICAgYXdhaXQgcHJlc3NLZXkoeyBrZXk6ICdFc2NhcGUnIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlLW9wZW4gdGhlIG5vdGUgYmVmb3JlIGV2ZXJ5IGNsaWNrIGluc3RlYWQgb2YgYXNzdW1pbmcgdGhlIHByZXZpb3VzIGJ1dHRvbiBsZWZ0IHRoZSB3b3Jrc3BhY2VcbiAgICAgIC8vIHdoZXJlIGl0IHdhcyBmb3VuZC4gRXZlcnkgaGVscGVyIGFib3ZlIHJlYWRzIHRoZSBBQ1RJVkUgdmlldywgYW5kIG9wZW5pbmcgYSBub3RlIGlzIG9uZSBvZiB0aGVcbiAgICAgIC8vIG1vc3Qgb3JkaW5hcnkgdGhpbmdzIGEgZGVtbyBidXR0b24gZG9lcyBcdTIwMTQgc28gdGhlIGZpcnN0IHN1Y2ggYnV0dG9uIHdvdWxkIG90aGVyd2lzZSBzZW5kIGVhY2hcbiAgICAgIC8vIGxhdGVyIGJ1dHRvbiBpbiBpdHMgbm90ZSB0byBgc3RhdHVzOiAndGltZW91dCdgIHdpdGggYW4gZW1wdHkgb3V0cHV0LCB3aGljaCBpcyB0aGUgc2hhcGUgb2YgYVxuICAgICAgLy8gYnV0dG9uIHRoYXQgbmV2ZXIgcmVuZGVyZWQgcmF0aGVyIHRoYW4gb25lIHRoYXQgd2FzIGxvb2tlZCBmb3IgaW4gdGhlIHdyb25nIHZpZXcuXG4gICAgICBhd2FpdCBhcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChub3RlUGF0aFRvT3Blbi5yZXBsYWNlKC9cXC5tZCQvLCAnJyksICcnLCBmYWxzZSk7XG4gICAgICBhd2FpdCBhcHAud29ya3NwYWNlLmdldExlYWYoZmFsc2UpLnNldFZpZXdTdGF0ZSh7IHN0YXRlOiB7IGZpbGU6IG5vdGVQYXRoVG9PcGVuLCBtb2RlOiAncHJldmlldycgfSwgdHlwZTogJ21hcmtkb3duJyB9KTtcblxuICAgICAgLy8gSGVsZCBmcm9tIHRoZSBwcmVkaWNhdGUgcmF0aGVyIHRoYW4gcmUtcXVlcmllZCBhZnRlciBpdDogdGhlIHdhbGsgYWJvdmUga2VlcHMgbW92aW5nIHRoZVxuICAgICAgLy8gdmlld3BvcnQsIHNvIGEgYnV0dG9uIGZvdW5kIG9uIG9uZSBwb2xsIGNhbiBiZSB1bm1vdW50ZWQgYWdhaW4gYnkgdGhlIG5leHQuXG4gICAgICBsZXQgYnV0dG9uOiBIVE1MQnV0dG9uRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBtZXNzYWdlOiBgY29kZSBidXR0b24gXCIke2NhcHRpb259XCIgbmV2ZXIgcmVuZGVyZWRgLFxuICAgICAgICAgIHByZWRpY2F0ZTogKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgYWR2YW5jZVNjcm9sbCgpO1xuICAgICAgICAgICAgYnV0dG9uID0gZmluZEJ1dHRvbigpO1xuICAgICAgICAgICAgcmV0dXJuIGJ1dHRvbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHsgY2FwdGlvbiwgb3V0cHV0OiAnJywgc3RhdHVzOiAndGltZW91dCcgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFidXR0b24pIHtcbiAgICAgICAgcmV0dXJuIHsgY2FwdGlvbiwgb3V0cHV0OiAnJywgc3RhdHVzOiAndGltZW91dCcgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYmxvY2sgPSBidXR0b24uY2xvc2VzdDxIVE1MRWxlbWVudD4oJy5ibG9jay1sYW5ndWFnZS1jb2RlLWJ1dHRvbicpID8/IGJ1dHRvbi5wYXJlbnRFbGVtZW50O1xuICAgICAgYnV0dG9uLnNjcm9sbEludG9WaWV3KCk7XG4gICAgICBidXR0b24uY2xpY2soKTtcblxuICAgICAgbGV0IHN0YXR1czogRGVtb1ZhdWx0QnV0dG9uUmVzdWx0WydzdGF0dXMnXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBtZXNzYWdlOiBgYnV0dG9uIFwiJHtjYXB0aW9ufVwiIG5ldmVyIHJlcG9ydGVkIGEgcmVzdWx0YCxcbiAgICAgICAgICBwcmVkaWNhdGU6IGFzeW5jICgpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgICAgIC8vIEEgYnV0dG9uIHRoYXQgYXdhaXRzIGFuIGFsZXJ0IC8gY29uZmlybSAvIHByb21wdCByZXBvcnRzIG5vdGhpbmcgdW50aWwgdGhlIGRpYWxvZyBjbG9zZXMuXG4gICAgICAgICAgICBhd2FpdCBkaXNtaXNzTW9kYWxzKCk7XG4gICAgICAgICAgICByZXR1cm4gL0V4ZWN1dGVkICg/OnN1Y2Nlc3NmdWxseXx3aXRoIGVycm9yKS8udGVzdChibG9jaz8udGV4dENvbnRlbnQgPz8gJycpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBidXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBibG9jaz8udGV4dENvbnRlbnQgPz8gJyc7XG4gICAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdFeGVjdXRlZCB3aXRoIGVycm9yJykpIHtcbiAgICAgICAgICBzdGF0dXMgPSAnZXJyb3InO1xuICAgICAgICB9IGVsc2UgaWYgKHRleHQuaW5jbHVkZXMoJ0V4ZWN1dGVkIHN1Y2Nlc3NmdWxseScpKSB7XG4gICAgICAgICAgc3RhdHVzID0gJ29rJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0dXMgPSAndW5rbm93bic7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBzdGF0dXMgPSAndGltZW91dCc7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoYXRldmVyIHRoaXMgYnV0dG9uIGxlZnQgb3BlbiB3b3VsZCBvdGhlcndpc2Ugc2l0IG92ZXIgdGhlIG5leHQgb25lLlxuICAgICAgYXdhaXQgZGlzbWlzc01vZGFscygpO1xuXG4gICAgICByZXR1cm4geyBjYXB0aW9uLCBvdXRwdXQ6IChibG9jaz8udGV4dENvbnRlbnQgPz8gJycpLnNsaWNlKDAsIG91dHB1dEV4Y2VycHRMZW5ndGgpLCBzdGF0dXMgfTtcbiAgICB9LFxuICAgIGlucHV0OiB7XG4gICAgICBidXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHBhcmFtcy50aW1lb3V0cy5idXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICBjYXB0aW9uOiBwYXJhbXMuYnV0dG9uQ2FwdGlvbixcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHM6IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbm90ZVBhdGg6IHBhcmFtcy5ub3RlUGF0aCxcbiAgICAgIG91dHB1dEV4Y2VycHRMZW5ndGg6IE9VVFBVVF9FWENFUlBUX0xFTkdUSCxcbiAgICAgIHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogcGFyYW1zLnRpbWVvdXRzLnNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICAgIHNob3VsZERpc21pc3NNb2RhbHM6IHBhcmFtcy5zaG91bGREaXNtaXNzTW9kYWxzXG4gICAgfSxcbiAgICB2YXVsdFBhdGg6IGdldFRlbXBvcmFyeVZhdWx0KCkucGF0aFxuICB9KTtcbn1cblxuLyoqXG4gKiBPcGVucyBhIG5vdGUgaW4gcmVhZGluZyB2aWV3IGFuZCBsaXN0cyB0aGUgY2FwdGlvbnMgb2YgdGhlIGJ1dHRvbnMgdGhhdCBtb3VudGVkLCBkZWR1cGxpY2F0ZWQgYW5kIGluXG4gKiBkb2N1bWVudCBvcmRlci5cbiAqXG4gKiBUd28gcXVpcmtzIG9mIHJlYWRpbmcgdmlldyBzaGFwZSB0aGlzLiBJdCByZW5kZXJzIGxhemlseSBhbmQgdW5tb3VudHMgc2VjdGlvbnMgZmFyIG9mZi1zY3JlZW4sIHNvIG5vXG4gKiBzaW5nbGUgc2Nyb2xsIHBvc2l0aW9uIGhvbGRzIGEgd2hvbGUgbm90ZSdzIGJ1dHRvbnMgXHUyMDE0IHRoZSBwcmV2aWV3IGlzIHdhbGtlZCB0b3AgdG8gYm90dG9tIGFuZCBiYWNrXG4gKiB3aGlsZSB3YWl0aW5nLCBhbmQgdGhlIGNhcHRpb25zIHNlZW4gYWxvbmcgdGhlIHdheSBhcmUgQUNDVU1VTEFURUQgcmF0aGVyIHRoYW4gcmVhZCBvbmNlIGF0IHRoZSBlbmQuXG4gKiBBbmQgd2hpbGUgaXQgc2V0dGxlcyBpdCBjYW4gaG9sZCBTRVZFUkFMIGVsZW1lbnRzIHBlciBmZW5jZSBcdTIwMTQgdGhlIHNhbWUgYnV0dG9uIHdhcyBvYnNlcnZlZCByZW5kZXJlZFxuICogdHdpY2UgXHUyMDE0IHNvIHRoZSBjYXB0aW9ucyBhcmUgZGVkdXBsaWNhdGVkOyBjbGlja2luZyBieSBjYXB0aW9uIHRoZW4gYWRkcmVzc2VzIGVhY2ggYnV0dG9uIG9uY2UgaG93ZXZlclxuICogbWFueSBjb3BpZXMgb2YgaXQgdGhlIERPTSBpcyBob2xkaW5nLlxuICpcbiAqIEBwYXJhbSBub3RlIC0gVGhlIG5vdGUgdG8gb3Blbi5cbiAqIEBwYXJhbSBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMgLSBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgYnV0dG9ucyB0byBtb3VudC5cbiAqIEByZXR1cm5zIFRoZSBkaXN0aW5jdCBidXR0b24gY2FwdGlvbnMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5Ob3RlQW5kTGlzdEJ1dHRvbkNhcHRpb25zKG5vdGU6IERlbW9WYXVsdE5vdGUsIHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICByZXR1cm4gZXZhbEluT2JzaWRpYW4oe1xuICAgIGFzeW5jIGNhbGxiYWNrKHsgYXBwLCBleHBlY3RlZEJ1dHRvbkNvdW50LCBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLCBsaWI6IHsgd2FpdFVudGlsIH0sIG5vdGVQYXRoLCBvYnNpZGlhbk1vZHVsZSwgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICBmdW5jdGlvbiB2aWV3KCk6IEluc3RhbmNlVHlwZTx0eXBlb2Ygb2JzaWRpYW5Nb2R1bGUuTWFya2Rvd25WaWV3PiB8IG51bGwge1xuICAgICAgICByZXR1cm4gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKG9ic2lkaWFuTW9kdWxlLk1hcmtkb3duVmlldyk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBwcmV2aWV3RWwoKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHZpZXcoKT8uY29udGFpbmVyRWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJzpzY29wZSAubWFya2Rvd24tcHJldmlldy12aWV3JykgPz8gbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIEFjY3VtdWxhdGVkIGFjcm9zcyB0aGUgd2FsayBiZWxvdywgbmV2ZXIgcmVhZCBmcm9tIG9uZSBzbmFwc2hvdDogd2l0aCB0aGUgdmlld3BvcnQgbW92aW5nLCBhbnlcbiAgICAgIC8vIHNpbmdsZSByZWFkaW5nIGhvbGRzIG9ubHkgdGhlIHNlY3Rpb25zIGN1cnJlbnRseSBtb3VudGVkLlxuICAgICAgY29uc3Qgc2VlbkNhcHRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmdW5jdGlvbiBjYXB0aW9ucygpOiBzdHJpbmdbXSB7XG4gICAgICAgIGZvciAoY29uc3QgYnV0dG9uIG9mIHZpZXcoKT8uY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbDxIVE1MQnV0dG9uRWxlbWVudD4oJzpzY29wZSAuYmxvY2stbGFuZ3VhZ2UtY29kZS1idXR0b24gYnV0dG9uLm1vZC1jdGEnKSA/PyBbXSkge1xuICAgICAgICAgIGlmIChidXR0b24udGV4dENvbnRlbnQgIT09ICcnKSB7XG4gICAgICAgICAgICBzZWVuQ2FwdGlvbnMuYWRkKGJ1dHRvbi50ZXh0Q29udGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbLi4uc2VlbkNhcHRpb25zXTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FtZSB3YWxrIGFzIGBjbGlja0J1dHRvbmAsIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uOiBhIG5vdGUgd2hvc2UgYnV0dG9ucyBhcmUgaW4gdGhlIE1JRERMRVxuICAgICAgLy8gbmV2ZXIgbW91bnRzIHRoZW0gaWYgdGhlIHByZXZpZXcgaXMgcGlubmVkIHRvIHRoZSBib3R0b20uXG4gICAgICBjb25zdCBTQ1JPTExfQk9UVE9NX1RPTEVSQU5DRV9JTl9QSVhFTFMgPSA0O1xuICAgICAgY29uc3QgU0NST0xMX1NURVBfUkFUSU8gPSAwLjg7XG4gICAgICBmdW5jdGlvbiBhZHZhbmNlU2Nyb2xsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzY3JvbGxlciA9IHByZXZpZXdFbCgpO1xuICAgICAgICBpZiAoIXNjcm9sbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQXRCb3R0b20gPSBzY3JvbGxlci5zY3JvbGxUb3AgKyBzY3JvbGxlci5jbGllbnRIZWlnaHQgPj0gc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0IC0gU0NST0xMX0JPVFRPTV9UT0xFUkFOQ0VfSU5fUElYRUxTO1xuICAgICAgICBzY3JvbGxlci5zY3JvbGxUb3AgPSBpc0F0Qm90dG9tID8gMCA6IHNjcm9sbGVyLnNjcm9sbFRvcCArIE1hdGguZmxvb3Ioc2Nyb2xsZXIuY2xpZW50SGVpZ2h0ICogU0NST0xMX1NURVBfUkFUSU8pO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBhcHAud29ya3NwYWNlLm9wZW5MaW5rVGV4dChub3RlUGF0aC5yZXBsYWNlKC9cXC5tZCQvLCAnJyksICcnLCBmYWxzZSk7XG4gICAgICBhd2FpdCBhcHAud29ya3NwYWNlLmdldExlYWYoZmFsc2UpLnNldFZpZXdTdGF0ZSh7IHN0YXRlOiB7IGZpbGU6IG5vdGVQYXRoLCBtb2RlOiAncHJldmlldycgfSwgdHlwZTogJ21hcmtkb3duJyB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsKHtcbiAgICAgICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIG1lc3NhZ2U6IGBcIiR7bm90ZVBhdGh9XCIgbmV2ZXIgbW91bnRlZCBhbGwgJHtTdHJpbmcoZXhwZWN0ZWRCdXR0b25Db3VudCl9IG9mIGl0cyBidXR0b25zYCxcbiAgICAgICAgICBwcmVkaWNhdGU6ICgpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGFkdmFuY2VTY3JvbGwoKTtcbiAgICAgICAgICAgIHJldHVybiBjYXB0aW9ucygpLmxlbmd0aCA+PSBleHBlY3RlZEJ1dHRvbkNvdW50O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFRoZSBjYXB0aW9ucyBhcmUgcmV0dXJuZWQgZWl0aGVyIHdheTsgdGhlIGNhbGxlciBhc3NlcnRzIG9uIHRoZW0gYW5kIHJlcG9ydHMgdGhlIHNob3J0ZmFsbC5cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNhcHRpb25zKCk7XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgZXhwZWN0ZWRCdXR0b25Db3VudDogbm90ZS5idXR0b25Db3VudCxcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHM6IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbm90ZVBhdGg6IG5vdGUubmFtZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSxcbiAgICB2YXVsdFBhdGg6IGdldFRlbXBvcmFyeVZhdWx0KCkucGF0aFxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJt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
|
|
548
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZW1vLXZhdWx0LWJ1dHRvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgdml0ZXN0IHN1aXRlIHRoYXQgb3BlbnMgZXZlcnkgbm90ZSBvZiBhIHBsdWdpbidzIGluLXJlcG8gYGRlbW8tdmF1bHQvYCwgY2xpY2tzIGVhY2ggYGNvZGUtYnV0dG9uYFxuICogaW4gaXQgYWdhaW5zdCBhIHJlYWwgT2JzaWRpYW4sIGFuZCBmYWlscyBvbiBhbnkgYnV0dG9uIHRoYXQgZXJyb3JzIG9yIG5ldmVyIHJlcG9ydHMgYSByZXN1bHQuXG4gKlxuICogQSBkZW1vIHZhdWx0J3MgYnV0dG9ucyBhcmUgdGhlIG9uZSBwYXJ0IG9mIGl0IG5vIG90aGVyIGdhdGUgY2FuIGNoZWNrLiBgbGludDptZGAgcmVhZHMgdGhlIG1hcmtkb3duLFxuICogdGhlIGNvdmVyYWdlIHN1aXRlICh7QGxpbmsgLi9kZW1vLXZhdWx0LWNvdmVyYWdlLnRzIHwgYHJlZ2lzdGVyRGVtb1ZhdWx0Q292ZXJhZ2VTdWl0ZWB9KSBjaGVja3MgdGhlXG4gKiBhdXRob3JpbmcgY29udmVudGlvbnMsIGFuZCBuZWl0aGVyIGV4ZWN1dGVzIGFueXRoaW5nIOKAlCBhIGJ1dHRvbiB3aG9zZSBgcmVxdWlyZSgnL2RlbW9TZXR1cC50cycpYCBwYXRoXG4gKiBpcyB3cm9uZywgb3IgdGhhdCBjYWxscyBhbiBBUEkgdGhhdCBoYXMgc2luY2UgY2hhbmdlZCBzaGFwZSwgZmFpbHMgYXQgY2xpY2sgdGltZSBhbmQgbm93aGVyZSBlbHNlLlxuICpcbiAqIFRoZSBjb21wYW5pb24gaGFsZiDigJQgc2VlZGluZyB0aGUgdGVtcCB2YXVsdCB3aXRoIHRoZSBkZW1vLXZhdWx0IHRyZWUsIGl0cyBgLm9ic2lkaWFuYCBjb25maWcsIGFuZCB0aGVcbiAqIGBDb2RlU2NyaXB0IFRvb2xraXRgIGJpbmFyeSB0aGF0IHR1cm5zIGBgYGAgYGBgY29kZS1idXR0b24gYGBgYCBmZW5jZXMgaW50byBidXR0b25zIOKAlCBpc1xuICogYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVgIGluIGBvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nYDsgaGFuZCBpdHMgcmVzdWx0IHRvIHRoZSBwcm9qZWN0J3NcbiAqIGBnbG9iYWxTZXR1cGAgYW5kIG5hbWUgYENvZGVTY3JpcHQgVG9vbGtpdGAgaW4gYGVuYWJsZUNvbW11bml0eVBsdWdpbnNgLlxuICovXG5cbmltcG9ydCB7IGdldFJvb3RGb2xkZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yb290JztcbmltcG9ydCB7XG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge1xuICBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUyxcbiAgZXZhbEluT2JzaWRpYW5cbn0gZnJvbSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyc7XG5pbXBvcnQgeyBnZXRUZW1wb3JhcnlWYXVsdCB9IGZyb20gJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3Rpbmcvdml0ZXN0LWdsb2JhbC1zZXR1cC1wbHVnaW4nO1xuaW1wb3J0IHtcbiAgYmVmb3JlQWxsLFxuICBkZXNjcmliZSxcbiAgZXhwZWN0LFxuICBpdFxufSBmcm9tICd2aXRlc3QnO1xuXG4vKipcbiAqIGBDb2RlU2NyaXB0IFRvb2xraXRgJ3MgbWFuaWZlc3QgaWQuIEl0IGlzIHN0aWxsIHRoZSBwbHVnaW4ncyBvcmlnaW5hbCBgZml4LXJlcXVpcmUtbW9kdWxlc2AgaWQsIHdoaWNoXG4gKiBubyBsb25nZXIgbWF0Y2hlcyBpdHMgbmFtZSDigJQgdGhlIGlkIGlzIHB1Ymxpc2hlZCwgc28gaXQgY2Fubm90IGJlIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBDT0RFX1NDUklQVF9UT09MS0lUX1BMVUdJTl9JRCA9ICdmaXgtcmVxdWlyZS1tb2R1bGVzJztcblxuLyoqXG4gKiBUaGUgd2FpdGluZyBidWRnZXRzIGEgc2luZ2xlIGJ1dHRvbiBjbGljayBpcyBhbGxvd2VkLlxuICpcbiAqIEJvdGggYXJlIHNwZW50IGluc2lkZSBPTkUgdHJhbnNwb3J0IGNhbGwsIHNvIGl0IGlzIHRoZWlyIFNVTSB0aGF0XG4gKiB7QGxpbmsgYXNzZXJ0Q2xpY2tCdWRnZXRzRml0VHJhbnNwb3J0Q2FwfSBib3VuZHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpY2tCdXR0b25UaW1lb3V0cyB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgY2xpY2tlZCBidXR0b24gdG8gcmVwb3J0IGEgcmVzdWx0LlxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSBidXR0b24gaXRzZWxmIHRvIG1vdW50LlxuICAgKi9cbiAgcmVhZG9ubHkgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIG91dGNvbWUgb2YgY2xpY2tpbmcgb25lIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHRCdXR0b25SZXN1bHQge1xuICAvKipcbiAgICogVGhlIGJ1dHRvbidzIGNhcHRpb24sIGFzIHJlbmRlcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FwdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzdWx0IGxpbmUgYENvZGVTY3JpcHQgVG9vbGtpdGAgcHJpbnRlZCB1bmRlciB0aGUgYnV0dG9uLCB0cnVuY2F0ZWQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYnV0dG9uIHJlcG9ydGVkIHN1Y2Nlc3MsIHJlcG9ydGVkIGFuIGVycm9yLCBvciBuZXZlciByZXBvcnRlZCBhdCBhbGwuXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM6ICdlcnJvcicgfCAnb2snIHwgJ3RpbWVvdXQnIHwgJ3Vua25vd24nO1xufVxuXG4vKipcbiAqIE9uZSBkZW1vLXZhdWx0IG5vdGUgYW5kIGhvdyBtYW55IGJ1dHRvbnMgaXRzIHNvdXJjZSBkZWNsYXJlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZW1vVmF1bHROb3RlIHtcbiAgLyoqXG4gICAqIEhvdyBtYW55IGJ1dHRvbnMgdGhlIG5vdGUncyBzb3VyY2UgcmVuZGVycywgYXMgY291bnRlZCBieSB7QGxpbmsgY291bnRSZW5kZXJlZEJ1dHRvbnN9LlxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uQ291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGNhcHRpb25zIG9mIHRob3NlIGJ1dHRvbnMsIGluIHNvdXJjZSBvcmRlciwgYXMgcmVhZCBieSB7QGxpbmsgbGlzdFJlbmRlcmVkQnV0dG9uQ2FwdGlvbnN9LlxuICAgKi9cbiAgcmVhZG9ubHkgY2FwdGlvbnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSdzIGZpbGUgbmFtZSwgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIGJ1dHRvbiB0aGF0IGlzIEVYUEVDVEVEIG5vdCB0byByZXBvcnQgc3VjY2Vzcywgc28gdGhlIHN1aXRlIGRvZXMgbm90IGZhaWwgb24gaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwZWN0ZWROb25Pa0J1dHRvbiB7XG4gIC8qKlxuICAgKiBBIHN1YnN0cmluZyBvZiB0aGUgYnV0dG9uJ3MgcmVuZGVyZWQgY2FwdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGNhcHRpb25JbmNsdWRlczogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90ZSBob2xkaW5nIHRoZSBidXR0b24sIHJlbGF0aXZlIHRvIHRoZSBkZW1vIHZhdWx0IHJvb3QuXG4gICAqL1xuICByZWFkb25seSBub3RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgdGhlIGJ1dHRvbiBpcyBleHBlY3RlZCB0byBlbmQgaW4uIEFueSBvdGhlciBzdGF0dXMgc3RpbGwgZmFpbHMsIHNvIGFuIGVycm9yIGRlbW8gdGhhdFxuICAgKiBzdGFydHMgdGltaW5nIG91dCBpbnN0ZWFkIGlzIHJlcG9ydGVkIHJhdGhlciB0aGFuIHdhdmVkIHRocm91Z2guXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM6IEV4Y2x1ZGU8RGVtb1ZhdWx0QnV0dG9uUmVzdWx0WydzdGF0dXMnXSwgJ29rJz47XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIHtAbGluayByZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZywgaW4gbWlsbGlzZWNvbmRzLCB0byB3YWl0IGZvciBhIGNsaWNrZWQgYnV0dG9uIHRvIHJlcG9ydCBhIHJlc3VsdC5cbiAgICpcbiAgICogQm91bmRlZCBieSB0aGUgc2FtZSBzdW0gYXMge0BsaW5rIFJlZ2lzdGVyRGVtb1ZhdWx0QnV0dG9uU3VpdGVPcHRpb25zLnNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc30sXG4gICAqIGFuZCByZWZ1c2VkIGJ5IHRoZSBzYW1lIHRocm93IGF0IHJlZ2lzdHJhdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYDEwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGb2xkZXJzIHRvIHNraXAgd2hvbGUsIG1hdGNoZWQgYWdhaW5zdCBib3RoIHRoZSBmb2xkZXIgbmFtZSBhbmQgaXRzIHBhdGggcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHRcbiAgICogcm9vdCDigJQgZm9yIGEgZ3JvdXAgd2hvc2Ugbm90ZXMgY2Fubm90IHJ1biB1bmF0dGVuZGVkLCBzdWNoIGFzIG9uZXMgdGhhdCBmaXJzdCBpbnN0YWxsIGEgdGhpcmQtcGFydHlcbiAgICogcGx1Z2luIGZyb20gdGhlIGNvbW11bml0eSBzdG9yZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYFtdYFxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWRGb2xkZXJzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE5vdGUgZmlsZSBuYW1lcyAocmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgcm9vdCkgdG8gc2tpcC5cbiAgICpcbiAgICogQGRlZmF1bHQgYFsnUkVBRE1FLm1kJ11gXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZE5vdGVzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEJ1dHRvbnMgdGhhdCBsZWdpdGltYXRlbHkgZG8gbm90IHJlcG9ydCBzdWNjZXNzOiBhbiBlcnJvciBkZW1vLCBvciBhIGJ1dHRvbiB0aGF0IHR1cm5zIHN5c3RlbVxuICAgKiBtZXNzYWdlcyBvZmYgYW5kIHNvIG5ldmVyIHByaW50cyB0aGUgcmVzdWx0IGxpbmUgdGhlIHN1aXRlIGNsYXNzaWZpZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbXWBcbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdGVkTm9uT2tCdXR0b25zPzogcmVhZG9ubHkgRXhwZWN0ZWROb25Pa0J1dHRvbltdO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVwb3NpdG9yeSByb290IGhvbGRpbmcgYGRlbW8tdmF1bHQvYC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIHJlc29sdmVkIHJlcG8gcm9vdCwgZmFsbGluZyBiYWNrIHRvIGBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nLCBpbiBtaWxsaXNlY29uZHMsIHRvIHdhaXQgZm9yIGEgbm90ZSdzIHByZXZpZXcgYW5kIGl0cyBidXR0b25zIHRvIG1vdW50LlxuICAgKlxuICAgKiBUb2dldGhlciB3aXRoIGBidXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHNgIHRoaXMgbXVzdCBzdGF5IHVuZGVyIHRoZSB0cmFuc3BvcnQncyB+MzAgcyBzY3JpcHRcbiAgICogdGltZW91dDogb25lIGJ1dHRvbiBjbGljayBzcGVuZHMgYm90aCBpbnNpZGUgYSBTSU5HTEUgZXZhbHVhdGlvbiwgc28gYSBzdW0gYXQgb3Igb3ZlciB0aGUgY2FwIGNhbm5vdFxuICAgKiBiZSBob25vdXJlZCBhbmQgdHVybnMgYSByZWFsIHRpbWVvdXQgaW50byBhIGJhcmUgYHNjcmlwdCB0aW1lb3V0YCBuYW1pbmcgb25seSB0aGUgdHJhbnNwb3J0LlxuICAgKiB7QGxpbmsgcmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZX0gdGhyb3dzIG9uIHN1Y2ggYSBwYWlyIHJhdGhlciB0aGFuIHJlZ2lzdGVyaW5nIGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTIwMDBgXG4gICAqL1xuICByZWFkb25seSBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzbWlzcyBhbnkgb3BlbiBtb2RhbCB3aGlsZSB3YWl0aW5nIGZvciBhIGNsaWNrZWQgYnV0dG9uJ3MgcmVzdWx0LCBhbmQgYWdhaW4gb25jZSBpdCBpc1xuICAgKiBjbGFzc2lmaWVkLlxuICAgKlxuICAgKiBBIGJ1dHRvbiB0aGF0IGBhd2FpdGBzIGFuIGBhbGVydGAgLyBgY29uZmlybWAgLyBgcHJvbXB0YCBjYW5ub3QgcmVwb3J0IGEgcmVzdWx0IHVudGlsIHNvbWVib2R5IGNsb3Nlc1xuICAgKiB0aGUgZGlhbG9nLCBzbyB3aXRob3V0IHRoaXMgaXQgZW5kcyBhcyBgdGltZW91dGAg4oCUIGFuZCB0aGUgZGlhbG9nIGl0IGxlZnQgb3BlbiB0aGVuIHNpdHMgb3ZlciBldmVyeVxuICAgKiBsYXRlciBidXR0b24gaW4gdGhlIHJ1bi4gT2ZmIGJ5IGRlZmF1bHQsIHNvIG5vIHN1aXRlIGNoYW5nZXMgYmVoYXZpb3IgdW5hc2tlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRGlzbWlzc01vZGFscz86IGJvb2xlYW47XG59XG5cbi8qXG4gKiBUaGVzZSB0d28gYXJlIHNwZW50IElOU0lERSBPTkUgYGV2YWxJbk9ic2lkaWFuYCBjbG9zdXJlIGJ5IGBjbGlja0J1dHRvbmAsIHdoaWNoIHdhaXRzIGZvciB0aGUgYnV0dG9uIHRvXG4gKiBtb3VudCBhbmQgdGhlbiBmb3IgaXRzIHJlc3VsdCwgc28gaXQgaXMgdGhlaXIgU1VNIHRoYXQgaGFzIHRvIHN0YXkgdW5kZXIgdGhlIHRyYW5zcG9ydCdzIH4zMCBzIHNjcmlwdFxuICogdGltZW91dCDigJQgbm90IGVpdGhlciBvbmUgYWxvbmUuIFRoZSBmb3JtZXIgMjAgMDAwICsgMTUgMDAwIGFza2VkIGZvciAzNSBzLCB3aGljaCB0aGUgdHJhbnNwb3J0IGNhbiBuZXZlclxuICogZ3JhbnQ6IGEgc2xvdyBidXR0b24gZGlkIG5vdCByZXBvcnQgXCJuZXZlciByZXBvcnRlZCBhIHJlc3VsdFwiLCBpdCBkaWVkIGFzIGEgYmFyZSBgc2NyaXB0IHRpbWVvdXRgIG5hbWluZ1xuICogb25seSB0aGUgdHJhbnNwb3J0LiBgbm8tb3Zlci1jYXAtd2FpdC1pbi1ldmFsLWluLW9ic2lkaWFuYCBjYW5ub3QgY2F0Y2ggdGhpcyBvbmUsIGJlY2F1c2UgdGhlIGJ1ZGdldHNcbiAqIHJlYWNoIHRoZSBjbG9zdXJlIGZyb20gYSBjYWxsZXIgdHdvIGxldmVscyB1cCByYXRoZXIgdGhhbiBiZWluZyB3cml0dGVuIGF0IHRoZSB3YWl0IOKAlCB3aGljaCBpcyB3aHlcbiAqIGBhc3NlcnRDbGlja0J1ZGdldHNGaXRUcmFuc3BvcnRDYXBgIGJlbG93IGVuZm9yY2VzIGF0IHJ1bnRpbWUgd2hhdCB0aGUgcnVsZSBjYW5ub3Qgc2VlLiBPdmVycmlkaW5nXG4gKiBlaXRoZXIgZGVmYXVsdCB2aWEgYFJlZ2lzdGVyRGVtb1ZhdWx0QnV0dG9uU3VpdGVPcHRpb25zYCBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHN1bS5cbiAqL1xuY29uc3QgREVGQVVMVF9CVVRUT05fUkVTVUxUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuY29uc3QgREVGQVVMVF9TRVRUTEVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMl8wMDA7XG5cbmludGVyZmFjZSBDbGlja0J1dHRvblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnV0dG9uJ3MgcmVuZGVyZWQgY2FwdGlvbiwgd2hpY2ggaXMgaG93IGl0IGlzIGFkZHJlc3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1dHRvbkNhcHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGUgaG9sZGluZyB0aGUgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbm90ZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBkaXNtaXNzIHRoZSBtb2RhbHMgdGhlIGJ1dHRvbiBvcGVucy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZERpc21pc3NNb2RhbHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSByZW5kZXIgYW5kIHJlc3VsdCBidWRnZXRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dHM6IENsaWNrQnV0dG9uVGltZW91dHM7XG59XG5cbmNvbnN0IFBPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMTAwO1xuY29uc3QgT1VUUFVUX0VYQ0VSUFRfTEVOR1RIID0gNDAwO1xuXG4vLyBgUkVBRE1FLm1kYCBpcyB0aGUgcmVwby1mYWNpbmcgcGFnZSBHaXRIdWIgcmVuZGVycywgbm90IGEgd2Fsa3Rocm91Z2guIGAwMCBTdGFydC5tZGAgaXMgZGVsaWJlcmF0ZWx5XG4vLyBOT1QgZXhjbHVkZWQ6IHRoZSBsYW5kaW5nIG5vdGVzIGNhcnJ5IGJ1dHRvbnMgb2YgdGhlaXIgb3duLlxuY29uc3QgREVGQVVMVF9FWENMVURFRF9OT1RFUyA9IFsnUkVBRE1FLm1kJ107XG5cbi8vIEEgZmVuY2UgbGluZTogaXRzIG1hcmtlciBydW4gKHRocmVlIG9yIG1vcmUgYmFja3RpY2tzIG9yIHRpbGRlcykgYW5kIHdoYXRldmVyIGZvbGxvd3MgaXQuXG5jb25zdCBGRU5DRV9SRUdfRVhQID0gL14oPzxpbmRlbnQ+XFxzKikoPzxtYXJrZXI+YHszLH18fnszLH0pKD88aW5mbz4uKikkLztcbmNvbnN0IENPREVfQlVUVE9OX0ZFTkNFX0lORk8gPSAnY29kZS1idXR0b24nO1xuY29uc3QgRlJPTlRfTUFUVEVSX0RFTElNSVRFUiA9ICctLS0nO1xuY29uc3QgUkFXX01PREVfQ09ORklHX1JFR19FWFAgPSAvXmlzUmF3Olxccyp0cnVlXFxzKiQvbTtcbmNvbnN0IENBUFRJT05fQ09ORklHX1JFR19FWFAgPSAvXmNhcHRpb246KD88dmFsdWU+LiopJC9tO1xuY29uc3QgUExBSU5fU0NBTEFSX0NPTU1FTlRfUkVHX0VYUCA9IC9cXHMrIy4qJC87XG5jb25zdCBTSU5HTEVfUVVPVEVEX1NDQUxBUl9SRUdfRVhQID0gL14nKD88Y29udGVudD4uKiknJC87XG5jb25zdCBET1VCTEVfUVVPVEVEX1NDQUxBUl9SRUdfRVhQID0gL15cIig/PGNvbnRlbnQ+LiopXCIkLztcbi8vIGBDb2RlU2NyaXB0IFRvb2xraXRgJ3Mgb3duIGRlZmF1bHQsIHdoaWNoIGEgZmVuY2UgbmFtaW5nIG5vIGNhcHRpb24gcmVuZGVycy5cbmNvbnN0IERFRkFVTFRfQ09ERV9CVVRUT05fQ0FQVElPTiA9ICcobm8gY2FwdGlvbiknO1xuXG4vLyBUaGUgcmVuZGVyZWQtYnV0dG9uIHNlbGVjdG9yIGlzIGA6c2NvcGUgLmJsb2NrLWxhbmd1YWdlLWNvZGUtYnV0dG9uIGJ1dHRvbi5tb2QtY3RhYC4gSXQgaXMgd3JpdHRlblxuLy8gb3V0IGF0IGVhY2ggdXNlIHNpdGUgcmF0aGVyIHRoYW4gaGVsZCBpbiBhIGNvbnN0YW50IGhlcmU6IGV2ZXJ5IGNsb3N1cmUgYmVsb3cgaXMgc2VyaWFsaXplZCB3aXRoXG4vLyBgdG9TdHJpbmcoKWAgYW5kIGV2YWx1YXRlZCBpbnNpZGUgT2JzaWRpYW4sIHdoZXJlIG5vdGhpbmcgZnJvbSB0aGlzIG1vZHVsZSdzIHNjb3BlIGV4aXN0cy5cblxuLyoqXG4gKiBSZWZ1c2VzIGEgc2V0dGxlL3Jlc3VsdCBidWRnZXQgcGFpciB0aGF0IGEgc2luZ2xlIHRyYW5zcG9ydCBjYWxsIGNvdWxkIG5ldmVyIGhvbm91ci5cbiAqXG4gKiBgY2xpY2tCdXR0b25gIHdhaXRzIGZvciB0aGUgYnV0dG9uIHRvIG1vdW50IGFuZCB0aGVuIGZvciBpdHMgcmVzdWx0IElOU0lERSBPTkUgYGV2YWxJbk9ic2lkaWFuYFxuICogY2xvc3VyZSwgc28gdGhlIHRyYW5zcG9ydCdzIHNjcmlwdCB0aW1lb3V0IGJvdW5kcyB0aGVpciBzdW0gcmF0aGVyIHRoYW4gZWl0aGVyIG9uZSBhbG9uZSDigJQgYW5kXG4gKiBgUmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZU9wdGlvbnNgIGxldHMgYSBjb25zdW1lciByYWlzZSBlYWNoIGluZGVwZW5kZW50bHksIHdpdGggbm90aGluZyBzdW1taW5nXG4gKiB0aGVtLiBSYWlzaW5nIGBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHNgIHRvIDIwIDAwMCBmb3Igb25lIHNsb3cgbm90ZSBpcyBhbiBvcmRpbmFyeSB0aGluZyB0byBkbyBhbmRcbiAqIHNpbGVudGx5IHB1dHMgdGhlIHBhaXIgYXQgdGhlIGNhcC5cbiAqXG4gKiBUaHJvd2luZyBoZXJlLCBhdCBzdWl0ZSByZWdpc3RyYXRpb24sIGlzIHRoZSB3aG9sZSB2YWx1ZTogdGhlIGZhaWx1cmUgaXQgcmVwbGFjZXMgaXMgYVxuICogYFdlYkRyaXZlckVycm9yOiBzY3JpcHQgdGltZW91dGAgcmFpc2VkIG1pZC1ydW4gYWdhaW5zdCB3aGljaGV2ZXIgYnV0dG9uIGhhcHBlbmVkIHRvIGJlIHNsb3dlc3QsXG4gKiBuYW1pbmcgdGhlIHRyYW5zcG9ydCBhbmQgbmVpdGhlciBidWRnZXQuXG4gKlxuICogQHBhcmFtIHRpbWVvdXRzIC0gVGhlIHtAbGluayBDbGlja0J1dHRvblRpbWVvdXRzfSB0byBib3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydENsaWNrQnVkZ2V0c0ZpdFRyYW5zcG9ydENhcCh0aW1lb3V0czogQ2xpY2tCdXR0b25UaW1lb3V0cyk6IHZvaWQge1xuICBjb25zdCB0b3RhbEluTWlsbGlzZWNvbmRzID0gdGltZW91dHMuc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzICsgdGltZW91dHMuYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzO1xuXG4gIC8qXG4gICAqIFRoZSBjb21wYXJpc29uIGlzIGA8YCByYXRoZXIgdGhhbiBgPD1gIGJlY2F1c2UgYSBzdW0gdGhhdCBtZXJlbHkgUkVBQ0hFUyB0aGUgY2FwIGNhbiBhbHJlYWR5IG5ldmVyXG4gICAqIGJlIGhvbm91cmVkOiBgbm8tb3Zlci1jYXAtd2FpdC1pbi1ldmFsLWluLW9ic2lkaWFuYCByZXBvcnRzIGF0IHRoZSBjYXAgYXMgd2VsbCBhcyBvdmVyIGl0LCBhbmQgYVxuICAgKiBjbG9zdXJlIGhhbmRlZCBleGFjdGx5IHRoZSB0cmFuc3BvcnQncyBidWRnZXQgaGFzIG5vdGhpbmcgbGVmdCBmb3IgdGhlIGRpc3BhdGNoIGl0c2VsZi5cbiAgICovXG4gIGlmICh0b3RhbEluTWlsbGlzZWNvbmRzIDwgREVGQVVMVF9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYE9uZSBkZW1vLXZhdWx0IGJ1dHRvbiBjbGljayBzcGVuZHMgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzICgke1N0cmluZyh0aW1lb3V0cy5zZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtcykgYW5kIGBcbiAgICAgICsgYGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyAoJHtTdHJpbmcodGltZW91dHMuYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzKX0gbXMpIGluc2lkZSBhIHNpbmdsZSB0cmFuc3BvcnQgY2FsbCwgYFxuICAgICAgKyBgc28gdGhlaXIgc3VtIG9mICR7U3RyaW5nKHRvdGFsSW5NaWxsaXNlY29uZHMpfSBtcyBpcyBhdCBvciBvdmVyIHRoZSB0cmFuc3BvcnQncyBgXG4gICAgICArIGAke1N0cmluZyhERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUyl9IG1zIHNjcmlwdCB0aW1lb3V0IGFuZCBjYW4gbmV2ZXIgYmUgaG9ub3VyZWQuIGBcbiAgICAgICsgJ0xvd2VyIGVpdGhlciBidWRnZXQgaW4gUmVnaXN0ZXJEZW1vVmF1bHRCdXR0b25TdWl0ZU9wdGlvbnMuJ1xuICApO1xufVxuXG4vKipcbiAqIENvdW50cyB0aGUgYnV0dG9ucyBhIG5vdGUncyBzb3VyY2Ugd2lsbCBhY3R1YWxseSByZW5kZXIuXG4gKlxuICogVGhyZWUga2luZHMgb2YgYCBgYGBjb2RlLWJ1dHRvbiBgIGZlbmNlIHJlbmRlciBubyBjbGlja2FibGUgYnV0dG9uLCBhbmQgYSB2YXVsdCB0aGF0IERPQ1VNRU5UUyBjb2RlXG4gKiBidXR0b25zIGlzIGZ1bGwgb2YgdGhlIGZpcnN0IHR3bzpcbiAqXG4gKiAtIEEgZmVuY2UgbmVzdGVkIGluc2lkZSBhIGxvbmdlciBvciBkaWZmZXJlbnQgZmVuY2UgKGEgYGBgYCBgYGBgbWFya2Rvd24gYGBgYCBvciBgfn5+YCBibG9jaykgaXMgYVxuICogICBtYXJrZG93biBTQU1QTEUgc2hvd24gdG8gdGhlIHJlYWRlcjsgdGhlIHJlbmRlcmVyIG5ldmVyIHNlZXMgaXQgYXMgYSBibG9jay5cbiAqIC0gQW4gYGlzUmF3OiB0cnVlYCBmZW5jZSByZW5kZXJzIGl0cyBvdXRwdXQgZGlyZWN0bHkgYW5kIG5vIGJ1dHRvbiBlbGVtZW50IGF0IGFsbC5cbiAqIC0gQSBmZW5jZSB3aG9zZSBpbmZvIHN0cmluZyBjYXJyaWVzIGFueXRoaW5nIGFmdGVyIGBjb2RlLWJ1dHRvbmAgdXNlcyB0aGUgbGVnYWN5IGFyZ3VtZW50IHN5bnRheCwgd2hpY2hcbiAqICAgcmVuZGVycyBhbiBlcnJvciBiYW5uZXIgYXNraW5nIHRvIHVwZGF0ZSB0aGUgY29uZmlnIHJhdGhlciB0aGFuIHRoZSBidXR0b24uXG4gKlxuICogQ291bnRpbmcgYW55IG9mIHRoZW0gbWFrZXMgdGhlIHN1aXRlJ3Mgc2hvcnRmYWxsIGFzc2VydGlvbiB1bnNhdGlzZmlhYmxlIOKAlCBpdCBkZW1hbmRzIG1vcmUgYnV0dG9uc1xuICogdGhhbiB0aGUgbm90ZSBjYW4gZXZlciByZW5kZXIg4oCUIGFuZCBhbiBhc3NlcnRpb24gdGhhdCBjYW5ub3QgcGFzcyBnYXRlcyBub3RoaW5nLlxuICpcbiAqIFRoZSBzY2FuIGZvbGxvd3MgQ29tbW9uTWFyaydzIGZlbmNlIHJ1bGVzOiBhIGZlbmNlIGNsb3NlcyBvbmx5IG9uIGEgcnVuIG9mIHRoZSBTQU1FIGNoYXJhY3RlciBhdCBsZWFzdFxuICogYXMgbG9uZyBhcyB0aGUgb3BlbmVyLCB3aXRoIG5vIGluZm8gc3RyaW5nLCBhbmQgb25lIGxlZnQgb3BlbiBydW5zIHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LCB3aGVyZSBpdFxuICogc3RpbGwgcmVuZGVycy5cbiAqXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIG5vdGUncyBtYXJrZG93bi5cbiAqIEByZXR1cm5zIEhvdyBtYW55IGJ1dHRvbnMgaXQgcmVuZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50UmVuZGVyZWRCdXR0b25zKHNvdXJjZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgcmV0dXJuIGxpc3RSZW5kZXJlZEJ1dHRvbkNhcHRpb25zKHNvdXJjZSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBjYXB0aW9ucyBkZWNsYXJlZCBieSBtb3JlIHRoYW4gb25lIGJ1dHRvbi5cbiAqXG4gKiBUaGUgc3VpdGUgYWRkcmVzc2VzIGEgYnV0dG9uIGJ5IGl0cyBjYXB0aW9uIOKAlCBpdCBjb2xsZWN0cyB0aGUgY2FwdGlvbnMgdGhhdCBtb3VudGVkIGFuZCBjbGlja3MgdGhlXG4gKiBidXR0b24gY2FycnlpbmcgZWFjaCBvbmUg4oCUIHNvIHR3byBidXR0b25zIHNoYXJpbmcgYSBjYXB0aW9uIGNvbGxhcHNlIGludG8gb25lOiB0aGUgc2Vjb25kIGlzIG5ldmVyXG4gKiBjbGlja2VkLCBhbmQgdGhlIG5vdGUgcmVhZHMgYXMgZGVjbGFyaW5nIGEgYnV0dG9uIHRoYXQgbmV2ZXIgcmVuZGVyZWQuXG4gKlxuICogQHBhcmFtIGNhcHRpb25zIC0gQSBub3RlJ3MgYnV0dG9uIGNhcHRpb25zLlxuICogQHJldHVybnMgRWFjaCBjYXB0aW9uIG9jY3VycmluZyBtb3JlIHRoYW4gb25jZSwgbGlzdGVkIG9uY2UsIGluIG9yZGVyIG9mIGZpcnN0IHJlcGVhdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmREdXBsaWNhdGVDYXB0aW9ucyhjYXB0aW9uczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlZW5DYXB0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBkdXBsaWNhdGVDYXB0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGNhcHRpb24gb2YgY2FwdGlvbnMpIHtcbiAgICBpZiAoc2VlbkNhcHRpb25zLmhhcyhjYXB0aW9uKSkge1xuICAgICAgZHVwbGljYXRlQ2FwdGlvbnMuYWRkKGNhcHRpb24pO1xuICAgIH1cbiAgICBzZWVuQ2FwdGlvbnMuYWRkKGNhcHRpb24pO1xuICB9XG4gIHJldHVybiBbLi4uZHVwbGljYXRlQ2FwdGlvbnNdO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgYXNzZXJ0aW9uIG1lc3NhZ2UgZm9yIGEgbm90ZSdzIGZhaWxpbmcgYnV0dG9ucy5cbiAqXG4gKiBUaGUgY2FwdHVyZWQgb3V0cHV0IGlzIGluY2x1ZGVkIGJlY2F1c2UgYSBidXR0b24ncyBmYWlsdXJlIGlzIGEgcnVudGltZSBvbmUg4oCUIHRoZSBzdGFja1xuICogYENvZGVTY3JpcHQgVG9vbGtpdGAgcHJpbnRzIHVuZGVyIGl0IGlzIHRoZSBvbmx5IGRpYWdub3NpcyB0aGVyZSBpcy5cbiAqXG4gKiBAcGFyYW0gbm90ZU5hbWUgLSBUaGUgbm90ZSB0aGUgYnV0dG9ucyBiZWxvbmcgdG8uXG4gKiBAcGFyYW0gZmFpbHVyZXMgLSBUaGUgZmFpbGluZyBidXR0b25zLlxuICogQHJldHVybnMgVGhlIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGYWlsdXJlcyhub3RlTmFtZTogc3RyaW5nLCBmYWlsdXJlczogcmVhZG9ubHkgRGVtb1ZhdWx0QnV0dG9uUmVzdWx0W10pOiBzdHJpbmcge1xuICBpZiAoZmFpbHVyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgZGV0YWlscyA9IGZhaWx1cmVzXG4gICAgLm1hcCgoZmFpbHVyZSkgPT4gYCAgLSBcIiR7ZmFpbHVyZS5jYXB0aW9ufVwiIFske2ZhaWx1cmUuc3RhdHVzfV06ICR7ZmFpbHVyZS5vdXRwdXQucmVwbGFjZUFsbCgvXFxzKy9nLCAnICcpLnRyaW0oKX1gKVxuICAgIC5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIGAke1N0cmluZyhmYWlsdXJlcy5sZW5ndGgpfSBidXR0b24ocykgaW4gJHtub3RlTmFtZX0gZGlkIG5vdCBydW4gY2xlYW5seTpcXG4ke2RldGFpbHN9YDtcbn1cblxuLyoqXG4gKiBMaXN0cyB0aGUgY2FwdGlvbnMgb2YgdGhlIGJ1dHRvbnMgYSBub3RlJ3Mgc291cmNlIHdpbGwgYWN0dWFsbHkgcmVuZGVyLCBpbiBzb3VyY2Ugb3JkZXIuXG4gKlxuICogV2hpY2ggZmVuY2VzIHJlbmRlciBhIGJ1dHRvbiBpcyBkZWNpZGVkIGV4YWN0bHkgYXMge0BsaW5rIGNvdW50UmVuZGVyZWRCdXR0b25zfSBkZXNjcmliZXMuIEEgY2FwdGlvbiBpc1xuICogcmVhZCBmcm9tIHRoZSBmZW5jZSdzIG93biBjb25maWcgYmxvY2s7IGEgZmVuY2UgbmFtaW5nIG5vbmUgdGFrZXMgYENvZGVTY3JpcHQgVG9vbGtpdGAncyBkZWZhdWx0LFxuICogYChubyBjYXB0aW9uKWAsIHdoaWNoIGlzIHdoYXQgaXRzIGJ1dHRvbiB0aGVuIHNob3dzLlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgbm90ZSdzIG1hcmtkb3duLlxuICogQHJldHVybnMgVGhlIGNhcHRpb25zLCBvbmUgcGVyIHJlbmRlcmVkIGJ1dHRvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RSZW5kZXJlZEJ1dHRvbkNhcHRpb25zKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBjYXB0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG9wZW5NYXJrZXIgPSAnJztcbiAgbGV0IGlzQ29kZUJ1dHRvbkZlbmNlID0gZmFsc2U7XG4gIGxldCBmZW5jZUJvZHk6IHN0cmluZ1tdID0gW107XG4gIGxldCBmZW5jZUluZGVudExlbmd0aCA9IDA7XG5cbiAgZnVuY3Rpb24gY2xvc2VGZW5jZSgpOiB2b2lkIHtcbiAgICBpZiAoaXNDb2RlQnV0dG9uRmVuY2UgJiYgIWlzUmF3RmVuY2UoZmVuY2VCb2R5KSkge1xuICAgICAgY2FwdGlvbnMucHVzaChyZWFkQ2FwdGlvbihmZW5jZUJvZHkpKTtcbiAgICB9XG4gICAgb3Blbk1hcmtlciA9ICcnO1xuICB9XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIHNvdXJjZS5zcGxpdCgvXFxyP1xcbi8pKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBGRU5DRV9SRUdfRVhQLmV4ZWMobGluZSk7XG4gICAgY29uc3QgaW5kZW50ID0gbWF0Y2g/Lmdyb3Vwcz8uWydpbmRlbnQnXSA/PyAnJztcbiAgICBjb25zdCBtYXJrZXIgPSBtYXRjaD8uZ3JvdXBzPy5bJ21hcmtlciddID8/ICcnO1xuICAgIGNvbnN0IGluZm8gPSAobWF0Y2g/Lmdyb3Vwcz8uWydpbmZvJ10gPz8gJycpLnRyaW0oKTtcblxuICAgIGlmIChvcGVuTWFya2VyID09PSAnJykge1xuICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgIG9wZW5NYXJrZXIgPSBtYXJrZXI7XG4gICAgICAgIGlzQ29kZUJ1dHRvbkZlbmNlID0gaW5mbyA9PT0gQ09ERV9CVVRUT05fRkVOQ0VfSU5GTztcbiAgICAgICAgZmVuY2VCb2R5ID0gW107XG4gICAgICAgIGZlbmNlSW5kZW50TGVuZ3RoID0gaW5kZW50Lmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEFueXRoaW5nIGVsc2Ugd2hpbGUgYSBmZW5jZSBpcyBvcGVuIGlzIGl0cyBjb250ZW50IOKAlCB3aGljaCBpcyBleGFjdGx5IGhvdyBhIGBgYGBtYXJrZG93biBzYW1wbGVcbiAgICAvLyBob2xkcyBhIGBgYGNvZGUtYnV0dG9uLlxuICAgIGlmIChtYXJrZXIuc3RhcnRzV2l0aChvcGVuTWFya2VyLmNoYXJBdCgwKSkgJiYgbWFya2VyLmxlbmd0aCA+PSBvcGVuTWFya2VyLmxlbmd0aCAmJiBpbmZvID09PSAnJykge1xuICAgICAgY2xvc2VGZW5jZSgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gQ29tbW9uTWFyayBzdHJpcHMgdXAgdG8gdGhlIG9wZW5pbmcgZmVuY2UncyBpbmRlbnRhdGlvbiBmcm9tIGVhY2ggY29udGVudCBsaW5lLCBzbyBhIGZlbmNlIG5lc3RlZCBpblxuICAgIC8vIGEgbGlzdCBpdGVtIGNhcnJpZXMgaXRzIGBjYXB0aW9uOmAgLyBgaXNSYXc6YCBrZXlzIGF0IGNvbHVtbiAwIGxpa2UgYW55IG90aGVyLlxuICAgIGZlbmNlQm9keS5wdXNoKGxpbmUuc2xpY2UoTWF0aC5taW4oZmVuY2VJbmRlbnRMZW5ndGgsIGxpbmUubGVuZ3RoIC0gbGluZS50cmltU3RhcnQoKS5sZW5ndGgpKSk7XG4gIH1cblxuICBpZiAob3Blbk1hcmtlciAhPT0gJycpIHtcbiAgICBjbG9zZUZlbmNlKCk7XG4gIH1cblxuICByZXR1cm4gY2FwdGlvbnM7XG59XG5cbi8qKlxuICogUGlja3MgdGhlIGJ1dHRvbnMgdGhhdCBmYWlsZWQgYW5kIHdlcmUgbm90IGV4cGVjdGVkIHRvLlxuICpcbiAqIEBwYXJhbSBub3RlTmFtZSAtIFRoZSBub3RlIHRoZSByZXN1bHRzIGJlbG9uZyB0bywgcmVsYXRpdmUgdG8gdGhlIGRlbW8gdmF1bHQgcm9vdC5cbiAqIEBwYXJhbSByZXN1bHRzIC0gRXZlcnkgYnV0dG9uJ3MgcmVzdWx0IGluIHRoYXQgbm90ZS5cbiAqIEBwYXJhbSBleHBlY3RlZE5vbk9rQnV0dG9ucyAtIFRoZSBidXR0b25zIGFsbG93ZWQgdG8gZW5kIGluIGEgZ2l2ZW4gbm9uLWBva2Agc3RhdHVzLlxuICogQHJldHVybnMgVGhlIHJlc3VsdHMgdGhhdCBhcmUgbm90IGBva2AgYW5kIG1hdGNoIG5vIHtAbGluayBFeHBlY3RlZE5vbk9rQnV0dG9ufS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFVuZXhwZWN0ZWRGYWlsdXJlcyhcbiAgbm90ZU5hbWU6IHN0cmluZyxcbiAgcmVzdWx0czogcmVhZG9ubHkgRGVtb1ZhdWx0QnV0dG9uUmVzdWx0W10sXG4gIGV4cGVjdGVkTm9uT2tCdXR0b25zOiByZWFkb25seSBFeHBlY3RlZE5vbk9rQnV0dG9uW11cbik6IERlbW9WYXVsdEJ1dHRvblJlc3VsdFtdIHtcbiAgcmV0dXJuIHJlc3VsdHMuZmlsdGVyKChyZXN1bHQpID0+XG4gICAgcmVzdWx0LnN0YXR1cyAhPT0gJ29rJ1xuICAgICYmIGV4cGVjdGVkTm9uT2tCdXR0b25zLmV2ZXJ5KChleHBlY3RlZCkgPT5cbiAgICAgICEoZXhwZWN0ZWQubm90ZSA9PT0gbm90ZU5hbWVcbiAgICAgICAgJiYgZXhwZWN0ZWQuc3RhdHVzID09PSByZXN1bHQuc3RhdHVzXG4gICAgICAgICYmIHJlc3VsdC5jYXB0aW9uLmluY2x1ZGVzKGV4cGVjdGVkLmNhcHRpb25JbmNsdWRlcykpXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBgY29kZS1idXR0b25gIGZlbmNlJ3Mgb3duIFlBTUwgY29uZmlnIGFza3MgZm9yIHJhdyBtb2RlLlxuICpcbiAqIFJlYWQgZnJvbSB0aGUgbGVhZGluZyBgLS0tYCBibG9jayByYXRoZXIgdGhhbiBmcm9tIHRoZSB3aG9sZSBib2R5LCBzbyBhbiBgaXNSYXc6IHRydWVgIHdyaXR0ZW4gaW5zaWRlXG4gKiBhIGJ1dHRvbidzIENPREUg4oCUIGEgYnV0dG9uIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBrZXkg4oCUIGlzIG5vdCBtaXN0YWtlbiBmb3IgdGhlIGJ1dHRvbidzIG93biBjb25maWcuXG4gKlxuICogQHBhcmFtIGZlbmNlQm9keSAtIFRoZSBmZW5jZSdzIGxpbmVzLCB3aXRob3V0IHRoZSBmZW5jZSBtYXJrZXJzLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZmVuY2UgcmVuZGVycyBubyBidXR0b24uXG4gKi9cbmZ1bmN0aW9uIGlzUmF3RmVuY2UoZmVuY2VCb2R5OiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBjb25maWcgPSByZWFkQ29uZmlnQmxvY2soZmVuY2VCb2R5KTtcbiAgcmV0dXJuIGNvbmZpZyAhPT0gbnVsbCAmJiBSQVdfTU9ERV9DT05GSUdfUkVHX0VYUC50ZXN0KGNvbmZpZyk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGNhcHRpb24gYSBgY29kZS1idXR0b25gIGZlbmNlJ3Mgb3duIGNvbmZpZyBibG9jayBnaXZlcyBpdHMgYnV0dG9uLlxuICpcbiAqIEEgZGVsaWJlcmF0ZWx5IHNtYWxsIHJlYWRpbmcgb2YgWUFNTCDigJQgYSBwbGFpbiwgc2luZ2xlLXF1b3RlZCBvciBkb3VibGUtcXVvdGVkIHNjYWxhciBvbiB0aGUgYGNhcHRpb246YFxuICogbGluZSDigJQgc2luY2UgdGhlIHZhbHVlIG9ubHkgZXZlciBuYW1lcyBhIGJ1dHRvbi4gQSB2YWx1ZSBpdCBjYW5ub3QgcmVhZCBleGFjdGx5LCBzdWNoIGFzIGEgYmxvY2tcbiAqIHNjYWxhciwgaXMgcmV0dXJuZWQgYXMgd3JpdHRlbjogdGhhdCBjYW4gbWFrZSBvbmUgY2FwdGlvbiByZWFkIHdyb25nLCBidXQgaXQgY2Fubm90IG1ha2UgdHdvXG4gKiBkaWZmZXJlbnQgb25lcyBjb21wYXJlIGVxdWFsLlxuICpcbiAqIEBwYXJhbSBmZW5jZUJvZHkgLSBUaGUgZmVuY2UncyBsaW5lcywgd2l0aG91dCB0aGUgZmVuY2UgbWFya2Vycy5cbiAqIEByZXR1cm5zIFRoZSBjYXB0aW9uLlxuICovXG5mdW5jdGlvbiByZWFkQ2FwdGlvbihmZW5jZUJvZHk6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgY29uZmlnID0gcmVhZENvbmZpZ0Jsb2NrKGZlbmNlQm9keSk7XG4gIGNvbnN0IHJhd1ZhbHVlID0gY29uZmlnID09PSBudWxsID8gdW5kZWZpbmVkIDogQ0FQVElPTl9DT05GSUdfUkVHX0VYUC5leGVjKGNvbmZpZyk/Lmdyb3Vwcz8uWyd2YWx1ZSddO1xuICBpZiAocmF3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBERUZBVUxUX0NPREVfQlVUVE9OX0NBUFRJT047XG4gIH1cblxuICBjb25zdCB2YWx1ZSA9IHJhd1ZhbHVlLnRyaW0oKTtcbiAgY29uc3Qgc2luZ2xlUXVvdGVkQ29udGVudCA9IFNJTkdMRV9RVU9URURfU0NBTEFSX1JFR19FWFAuZXhlYyh2YWx1ZSk/Lmdyb3Vwcz8uWydjb250ZW50J107XG4gIGlmIChzaW5nbGVRdW90ZWRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc2luZ2xlUXVvdGVkQ29udGVudC5yZXBsYWNlQWxsKCdcXCdcXCcnLCAnXFwnJyk7XG4gIH1cbiAgY29uc3QgZG91YmxlUXVvdGVkQ29udGVudCA9IERPVUJMRV9RVU9URURfU0NBTEFSX1JFR19FWFAuZXhlYyh2YWx1ZSk/Lmdyb3Vwcz8uWydjb250ZW50J107XG4gIGlmIChkb3VibGVRdW90ZWRDb250ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpIGFzIHN0cmluZztcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBkb3VibGVRdW90ZWRDb250ZW50O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWUucmVwbGFjZShQTEFJTl9TQ0FMQVJfQ09NTUVOVF9SRUdfRVhQLCAnJyk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBgY29kZS1idXR0b25gIGZlbmNlJ3MgbGVhZGluZyBgLS0tYCBjb25maWcgYmxvY2suXG4gKlxuICogT25seSB0aGUgbGVhZGluZyBibG9jayBjb3VudHMsIHNvIGEgYC0tLWAgYmxvY2sgd3JpdHRlbiBpbnNpZGUgYSBidXR0b24ncyBDT0RFIGlzIG5vdCBtaXN0YWtlbiBmb3IgdGhlXG4gKiBidXR0b24ncyBvd24gY29uZmlnLlxuICpcbiAqIEBwYXJhbSBmZW5jZUJvZHkgLSBUaGUgZmVuY2UncyBsaW5lcywgd2l0aG91dCB0aGUgZmVuY2UgbWFya2Vycy5cbiAqIEByZXR1cm5zIFRoZSBibG9jaydzIGNvbnRlbnQsIG9yIGBudWxsYCB3aGVuIHRoZSBmZW5jZSBvcGVucyB3aXRoIG5vIHRlcm1pbmF0ZWQgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIHJlYWRDb25maWdCbG9jayhmZW5jZUJvZHk6IHJlYWRvbmx5IHN0cmluZ1tdKTogbnVsbCB8IHN0cmluZyB7XG4gIGlmIChmZW5jZUJvZHlbMF0/LnRyaW0oKSAhPT0gRlJPTlRfTUFUVEVSX0RFTElNSVRFUikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZW5kSW5kZXggPSBmZW5jZUJvZHkuZmluZEluZGV4KChsaW5lLCBpbmRleCkgPT4gaW5kZXggPiAwICYmIGxpbmUudHJpbSgpID09PSBGUk9OVF9NQVRURVJfREVMSU1JVEVSKTtcbiAgcmV0dXJuIGVuZEluZGV4ID09PSAtMSA/IG51bGwgOiBmZW5jZUJvZHkuc2xpY2UoMSwgZW5kSW5kZXgpLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIEZvbGRlcnMgdGhhdCBuZXZlciBob2xkIGEgd2Fsa3Rocm91Z2guIGBNYXRlcmlhbHMvYCBob2xkcyB0aGUgZml4dHVyZXMgdGhlIHdhbGt0aHJvdWdocyBhY3Qgb247XG4gKiBgX2Fzc2V0cy9gIGhvbGRzIHRoZSBkZW1vIHNjcmlwdHM7IGAub2JzaWRpYW4vYCBpcyB2YXVsdCBjb25maWcuIEEgZm9sZGVyIHN0YXJ0aW5nIHdpdGggYC5gIG9yIGBfYFxuICogaXMgc2tpcHBlZCBvbiB0aGUgc2FtZSByZWFzb25pbmcsIHdpdGhvdXQgaGF2aW5nIHRvIGJlIGxpc3RlZC5cbiAqL1xuY29uc3QgTk9OX1dBTEtUSFJPVUdIX0ZPTERFUlMgPSBuZXcgU2V0KFsnTWF0ZXJpYWxzJ10pO1xuXG4vKipcbiAqIExpc3RzIHRoZSBkZW1vIHZhdWx0J3Mgbm90ZXMgdGhhdCBkZWNsYXJlIGF0IGxlYXN0IG9uZSBgY29kZS1idXR0b25gLCB3YWxraW5nIGdyb3VwIGZvbGRlcnMgdG9vLlxuICpcbiAqIEEgdmF1bHQgYmlnIGVub3VnaCB0byBuZWVkIGdyb3VwaW5nIHB1dHMgaXRzIHdhbGt0aHJvdWdocyBpbiBudW1iZXJlZCBmb2xkZXJzIOKAlCBhbmQgYSByb290LW9ubHkgd2Fsa1xuICogZmluZHMgTk9ORSBvZiB0aGVtLCB3aGljaCBpcyB3b3JzZSB0aGFuIGl0IHNvdW5kczogYSB2YXVsdCB3aG9zZSBub3RlcyBhcmUgYWxsIGdyb3VwZWQgcmVwb3J0cyB6ZXJvXG4gKiBub3RlcywgYW5kIG9uZSB0aGF0IGlzIHBhcnRseSBncm91cGVkIHNpbGVudGx5IGdhdGVzIG9ubHkgdGhlIHVuZ3JvdXBlZCBwYXJ0LiBGaXh0dXJlIGFuZCBhc3NldFxuICogZm9sZGVycyBhcmUgc3RpbGwgc2tpcHBlZCwgc28gd2hhdCBpcyB3YWxrZWQgaXMgd2Fsa3Rocm91Z2hzIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogQHBhcmFtIGRlbW9WYXVsdFBhdGggLSBUaGUgZGVtbyB2YXVsdCByb290LlxuICogQHBhcmFtIGV4Y2x1ZGVkTm90ZXMgLSBOb3RlIG5hbWVzIHRvIHNraXAsIG1hdGNoZWQgYWdhaW5zdCBib3RoIHRoZSBmaWxlIG5hbWUgYW5kIHRoZSBwYXRoIHJlbGF0aXZlXG4gKiB0byB0aGUgdmF1bHQgcm9vdC5cbiAqIEBwYXJhbSBleGNsdWRlZEZvbGRlcnMgLSBGb2xkZXJzIHRvIHNraXAgd2hvbGUsIG1hdGNoZWQgdGhlIHNhbWUgd2F5LlxuICogQHJldHVybnMgVGhlIG5vdGVzLCBzb3J0ZWQgYnkgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3ROb3Rlc1dpdGhCdXR0b25zKFxuICBkZW1vVmF1bHRQYXRoOiBzdHJpbmcsXG4gIGV4Y2x1ZGVkTm90ZXM6IFJlYWRvbmx5U2V0PHN0cmluZz4sXG4gIGV4Y2x1ZGVkRm9sZGVyczogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKVxuKTogRGVtb1ZhdWx0Tm90ZVtdIHtcbiAgY29uc3Qgbm90ZXM6IERlbW9WYXVsdE5vdGVbXSA9IFtdO1xuXG4gIGZ1bmN0aW9uIHdhbGsoZm9sZGVyOiBzdHJpbmcsIHJlbGF0aXZlRm9sZGVyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHJlYWRkaXJTeW5jKGZvbGRlciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pKSB7XG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZUZvbGRlciA9PT0gJycgPyBlbnRyeS5uYW1lIDogYCR7cmVsYXRpdmVGb2xkZXJ9LyR7ZW50cnkubmFtZX1gO1xuXG4gICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWVudHJ5Lm5hbWUuc3RhcnRzV2l0aCgnLicpICYmICFlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJ18nKSAmJiAhTk9OX1dBTEtUSFJPVUdIX0ZPTERFUlMuaGFzKGVudHJ5Lm5hbWUpXG4gICAgICAgICAgJiYgIWV4Y2x1ZGVkRm9sZGVycy5oYXMoZW50cnkubmFtZSkgJiYgIWV4Y2x1ZGVkRm9sZGVycy5oYXMocmVsYXRpdmVQYXRoKVxuICAgICAgICApIHtcbiAgICAgICAgICB3YWxrKGpvaW4oZm9sZGVyLCBlbnRyeS5uYW1lKSwgcmVsYXRpdmVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFlbnRyeS5uYW1lLmVuZHNXaXRoKCcubWQnKSB8fCBleGNsdWRlZE5vdGVzLmhhcyhlbnRyeS5uYW1lKSB8fCBleGNsdWRlZE5vdGVzLmhhcyhyZWxhdGl2ZVBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYXB0aW9ucyA9IGxpc3RSZW5kZXJlZEJ1dHRvbkNhcHRpb25zKHJlYWRGaWxlU3luYyhqb2luKGZvbGRlciwgZW50cnkubmFtZSksICd1dGYtOCcpKTtcbiAgICAgIGlmIChjYXB0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5vdGVzLnB1c2goeyBidXR0b25Db3VudDogY2FwdGlvbnMubGVuZ3RoLCBjYXB0aW9ucywgbmFtZTogcmVsYXRpdmVQYXRoIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHdhbGsoZGVtb1ZhdWx0UGF0aCwgJycpO1xuICByZXR1cm4gbm90ZXMuc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lLCAnZW4nKSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBFdmVyeSBhc3NlcnRpb24gYmVsb3cgcnVucyBhZ2FpbnN0IGEgcmVhbCBPYnNpZGlhbiBvdmVyIENEUCwgZHJpdmVuIGJ5IGNsb3N1cmVzIHRoaXMgcHJvY2VzcyBzZXJpYWxpemVzIGFuZCBhbm90aGVyIGV4ZWN1dGVzLiBUaGUgdGVzdGFibGUgcGFydHMgYXJlIGxpc3ROb3Rlc1dpdGhCdXR0b25zIGFuZCBmb3JtYXRGYWlsdXJlcywgd2hpY2ggaGF2ZSB0aGVpciBvd24gdW5pdCB0ZXN0cy4gKi9cbi8qKlxuICogUmVnaXN0ZXJzIGEgdml0ZXN0IHN1aXRlIHRoYXQgY2xpY2tzIGV2ZXJ5IGBjb2RlLWJ1dHRvbmAgaW4gdGhlIHJlcG8ncyBkZW1vIHZhdWx0LlxuICpcbiAqIE9uZSBgaXRgIHBlciBub3RlLCBhbmQgb25lIGBldmFsSW5PYnNpZGlhbmAgcGVyIGJ1dHRvbjogYSBzaW5nbGUgY2xvc3VyZSBydW5zIGFzIG9uZSBDRFBcbiAqIGBSdW50aW1lLmV2YWx1YXRlYCwgd2hpY2ggdGhlIGhhcm5lc3MgY2FwcyBhdCAzMCBzLCBzbyBhIG5vdGUgd2l0aCBhIGRvemVuIGJ1dHRvbnMgd291bGQgb3RoZXJ3aXNlXG4gKiB0aW1lIG91dCBhcyBhIHdob2xlIHJhdGhlciB0aGFuIHJlcG9ydGluZyB3aGljaCBidXR0b24gZmFpbGVkLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBSZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlT3B0aW9uc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlbW9WYXVsdEJ1dHRvblN1aXRlKG9wdGlvbnM6IFJlZ2lzdGVyRGVtb1ZhdWx0QnV0dG9uU3VpdGVPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgY29uc3Qgcm9vdEZvbGRlciA9IG9wdGlvbnMucm9vdEZvbGRlciA/PyBnZXRSb290Rm9sZGVyKCkgPz8gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgZGVtb1ZhdWx0UGF0aCA9IGpvaW4ocm9vdEZvbGRlciwgJ2RlbW8tdmF1bHQnKTtcbiAgY29uc3QgZXhjbHVkZWROb3RlcyA9IG5ldyBTZXQob3B0aW9ucy5leGNsdWRlZE5vdGVzID8/IERFRkFVTFRfRVhDTFVERURfTk9URVMpO1xuICBjb25zdCBleGNsdWRlZEZvbGRlcnMgPSBuZXcgU2V0KG9wdGlvbnMuZXhjbHVkZWRGb2xkZXJzKTtcbiAgY29uc3QgZXhwZWN0ZWROb25Pa0J1dHRvbnMgPSBvcHRpb25zLmV4cGVjdGVkTm9uT2tCdXR0b25zID8/IFtdO1xuICBjb25zdCBzaG91bGREaXNtaXNzTW9kYWxzID0gb3B0aW9ucy5zaG91bGREaXNtaXNzTW9kYWxzID8/IGZhbHNlO1xuICBjb25zdCBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBvcHRpb25zLnNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1NFVFRMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgY29uc3QgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzID0gb3B0aW9ucy5idXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9CVVRUT05fUkVTVUxUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuXG4gIC8vIFJlc29sdmVkIE9OQ0UgYW5kIGhhbmRlZCB0byBib3RoIHRoZSBib3VuZCBhbmQgdGhlIGNsaWNrLCBzbyB0aGUgcGFpciB0aGF0IGlzIGFzc2VydGVkIGFuZCB0aGUgcGFpclxuICAvLyB0aGF0IGlzIHNwZW50IGNhbm5vdCBkcmlmdCBhcGFydC5cbiAgY29uc3QgY2xpY2tCdXR0b25UaW1lb3V0czogQ2xpY2tCdXR0b25UaW1lb3V0cyA9IHtcbiAgICBidXR0b25SZXN1bHRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gIH07XG4gIGFzc2VydENsaWNrQnVkZ2V0c0ZpdFRyYW5zcG9ydENhcChjbGlja0J1dHRvblRpbWVvdXRzKTtcblxuICBjb25zdCBub3RlcyA9IGxpc3ROb3Rlc1dpdGhCdXR0b25zKGRlbW9WYXVsdFBhdGgsIGV4Y2x1ZGVkTm90ZXMsIGV4Y2x1ZGVkRm9sZGVycyk7XG5cbiAgZGVzY3JpYmUoJ2RlbW8tdmF1bHQgYnV0dG9ucycsICgpID0+IHtcbiAgICBiZWZvcmVBbGwoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaXNDb2RlU2NyaXB0VG9vbGtpdExvYWRlZCA9IGF3YWl0IGNoZWNrQ29kZVNjcmlwdFRvb2xraXRMb2FkZWQoc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgICAgIC8vIFdpdGhvdXQgaXQgZXZlcnkgYGNvZGUtYnV0dG9uYCBmZW5jZSBzdGF5cyBhIHBsYWluIGNvZGUgYmxvY2ssIHNvIGV2ZXJ5IG5vdGUgYmVsb3cgd291bGQgcmVwb3J0XG4gICAgICAvLyB6ZXJvIGJ1dHRvbnMgYW5kIHBhc3MgdmFjdW91c2x5LiBGYWlsIGhlcmUgaW5zdGVhZCwgb25jZSwgd2l0aCB0aGUgcmVhc29uLlxuICAgICAgZXhwZWN0KGlzQ29kZVNjcmlwdFRvb2xraXRMb2FkZWQsICdDb2RlU2NyaXB0IFRvb2xraXQgZGlkIG5vdCBsb2FkLCBzbyBubyBidXR0b24gY291bGQgcmVuZGVyJykudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIC8vIEEgZGVtbyB2YXVsdCBoYXMgdG8gZGVtb25zdHJhdGUgZXZlcnkgaGVhZGxpbmUgZmVhdHVyZSwgc28gYSB2YXVsdCB3aG9zZSBub3RlcyBkZWNsYXJlIG5vIGJ1dHRvbnNcbiAgICAvLyBpcyBhIHJlYWwgZmFpbHVyZSBvZiBpdHMgaW50ZXJhY3RpdmUgaGFsZiwgbm90IGEgcmVhc29uIHRvIHJlZ2lzdGVyIG5vdGhpbmcgYW5kIHJlcG9ydCBncmVlbi5cbiAgICBpdCgnaGFzIGF0IGxlYXN0IG9uZSBub3RlIHdpdGggYSBjb2RlIGJ1dHRvbicsICgpID0+IHtcbiAgICAgIGV4cGVjdChub3Rlcy5sZW5ndGgpLnRvQmVHcmVhdGVyVGhhbigwKTtcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3Qgbm90ZSBvZiBub3Rlcykge1xuICAgICAgaXQoYHJ1bnMgZXZlcnkgY29kZSBidXR0b24gaW4gJHtub3RlLm5hbWV9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBDaGVja2VkIGZyb20gdGhlIHNvdXJjZSwgYmVmb3JlIGFueXRoaW5nIGlzIG9wZW5lZDogYnV0dG9ucyBhcmUgYWRkcmVzc2VkIGJ5IGNhcHRpb24sIHNvIGFcbiAgICAgICAgLy8gc2hhcmVkIG9uZSB3b3VsZCBvdGhlcndpc2Ugc3VyZmFjZSBiZWxvdyBhcyBhIGJ1dHRvbiB0aGF0IFwibmV2ZXIgcmVuZGVyZWRcIi5cbiAgICAgICAgY29uc3QgZHVwbGljYXRlQ2FwdGlvbnMgPSBmaW5kRHVwbGljYXRlQ2FwdGlvbnMobm90ZS5jYXB0aW9ucyk7XG4gICAgICAgIGV4cGVjdChcbiAgICAgICAgICBkdXBsaWNhdGVDYXB0aW9ucyxcbiAgICAgICAgICBgJHtub3RlLm5hbWV9IGRlY2xhcmVzIG1vcmUgdGhhbiBvbmUgYnV0dG9uIGNhcHRpb25lZCAke2R1cGxpY2F0ZUNhcHRpb25zLm1hcCgoY2FwdGlvbikgPT4gYFwiJHtjYXB0aW9ufVwiYCkuam9pbignLCAnKX0uIGBcbiAgICAgICAgICAgICsgJ1RoaXMgc3VpdGUgYWRkcmVzc2VzIGEgYnV0dG9uIGJ5IGl0cyBjYXB0aW9uLCBzbyBvbmx5IHRoZSBmaXJzdCBvZiB0aGVtIGNvdWxkIGV2ZXIgYmUgY2xpY2tlZC4gR2l2ZSBlYWNoIGJ1dHRvbiBhIGRpc3RpbmN0IGNhcHRpb24uJ1xuICAgICAgICApLnRvRXF1YWwoW10pO1xuXG4gICAgICAgIGNvbnN0IGNhcHRpb25zID0gYXdhaXQgb3Blbk5vdGVBbmRMaXN0QnV0dG9uQ2FwdGlvbnMobm90ZSwgc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgLy8gUmVhZGluZyB2aWV3IG1vdW50cyBhIG5vdGUncyBsZWFkaW5nIHNlY3Rpb25zIG1vcmUgdGhhbiBvbmNlIHdoaWxlIGl0IHNldHRsZXMsIHNvIHRoZSBET00gY2FuXG4gICAgICAgIC8vIGhvbGQgc2V2ZXJhbCBlbGVtZW50cyBwZXIgZmVuY2UuIFRoZSBjYXB0aW9ucyBhcmUgZGVkdXBsaWNhdGVkLCBhbmQgdGhlIGFzc2VydGlvbiBpcyB0aGF0IGF0XG4gICAgICAgIC8vIGxlYXN0IGFzIG1hbnkgRElTVElOQ1QgYnV0dG9ucyByZW5kZXJlZCBhcyB0aGUgc291cmNlIGRlY2xhcmVzIOKAlCBhIGZlbmNlIHRoYXQgc2lsZW50bHkgc3RheWVkXG4gICAgICAgIC8vIEEgcGxhaW4gY29kZSBibG9jayBpcyB0aGUgZmFpbHVyZSB0aGlzIGNhdGNoZXMuXG4gICAgICAgIGNvbnN0IG1pc3NpbmdDYXB0aW9ucyA9IG5vdGUuY2FwdGlvbnMuZmlsdGVyKChjYXB0aW9uKSA9PiAhY2FwdGlvbnMuaW5jbHVkZXMoY2FwdGlvbikpO1xuICAgICAgICBleHBlY3QoXG4gICAgICAgICAgY2FwdGlvbnMubGVuZ3RoLFxuICAgICAgICAgIGAke25vdGUubmFtZX0gZGVjbGFyZXMgJHtTdHJpbmcobm90ZS5idXR0b25Db3VudCl9IGJ1dHRvbihzKSBidXQgb25seSAke1N0cmluZyhjYXB0aW9ucy5sZW5ndGgpfSByZW5kZXJlZDsgYFxuICAgICAgICAgICAgKyBgbmV2ZXIgc2VlbjogJHttaXNzaW5nQ2FwdGlvbnMubWFwKChjYXB0aW9uKSA9PiBgXCIke2NhcHRpb259XCJgKS5qb2luKCcsICcpfWBcbiAgICAgICAgKVxuICAgICAgICAgIC50b0JlR3JlYXRlclRoYW5PckVxdWFsKG5vdGUuYnV0dG9uQ291bnQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdHM6IERlbW9WYXVsdEJ1dHRvblJlc3VsdFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY2FwdGlvbiBvZiBjYXB0aW9ucykge1xuICAgICAgICAgIHJlc3VsdHMucHVzaChhd2FpdCBjbGlja0J1dHRvbih7IGJ1dHRvbkNhcHRpb246IGNhcHRpb24sIG5vdGVQYXRoOiBub3RlLm5hbWUsIHNob3VsZERpc21pc3NNb2RhbHMsIHRpbWVvdXRzOiBjbGlja0J1dHRvblRpbWVvdXRzIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZhaWx1cmVzID0gc2VsZWN0VW5leHBlY3RlZEZhaWx1cmVzKG5vdGUubmFtZSwgcmVzdWx0cywgZXhwZWN0ZWROb25Pa0J1dHRvbnMpO1xuXG4gICAgICAgIGV4cGVjdChmYWlsdXJlcywgZm9ybWF0RmFpbHVyZXMobm90ZS5uYW1lLCBmYWlsdXJlcykpLnRvRXF1YWwoW10pO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERyaXZlcyBhIHJlYWwgT2JzaWRpYW4gb3ZlciBDRFA6IHRoZSBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgaGVyZSBhbmQgZXhlY3V0ZWQgaW4gYW5vdGhlciBwcm9jZXNzLCBzbyBpdCBjYW5ub3QgYmUgZXhlcmNpc2VkIGJ5IGEgdW5pdCB0ZXN0LiAqL1xuLyoqXG4gKiBUdXJucyByZXN0cmljdGVkIG1vZGUgb2ZmIGFuZCBlbmFibGVzIGBDb2RlU2NyaXB0IFRvb2xraXRgLCB3aG9zZSBiaW5hcnkgdGhlIGdsb2JhbCBzZXR1cCBzZWVkZWQuXG4gKlxuICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIEhvdyBsb25nIHRvIHdhaXQgZm9yIGl0IHRvIGxvYWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGBDb2RlU2NyaXB0IFRvb2xraXRgIGlzIGxvYWRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2hlY2tDb2RlU2NyaXB0VG9vbGtpdExvYWRlZCh0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gZXZhbEluT2JzaWRpYW4oe1xuICAgIGFzeW5jIGNhbGxiYWNrKHsgYXBwLCBjb2RlU2NyaXB0VG9vbGtpdFBsdWdpbklkLCBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLCBsaWI6IHsgd2FpdFVudGlsIH0sIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGltZW91dCB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICBpZiAodHlwZW9mIGFwcC5wbHVnaW5zLmlzRW5hYmxlZCA9PT0gJ2Z1bmN0aW9uJyAmJiAhYXBwLnBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgYXBwLnBsdWdpbnMuc2V0RW5hYmxlKHRydWUpO1xuICAgICAgfVxuICAgICAgaWYgKCFhcHAucGx1Z2lucy5nZXRQbHVnaW4oY29kZVNjcmlwdFRvb2xraXRQbHVnaW5JZCkpIHtcbiAgICAgICAgYXdhaXQgYXBwLnBsdWdpbnMuZW5hYmxlUGx1Z2luKGNvZGVTY3JpcHRUb29sa2l0UGx1Z2luSWQpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsKHtcbiAgICAgICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLFxuICAgICAgICAgIG1lc3NhZ2U6ICdDb2RlU2NyaXB0IFRvb2xraXQgbmV2ZXIgbG9hZGVkJyxcbiAgICAgICAgICBwcmVkaWNhdGU6ICgpOiBib29sZWFuID0+IGFwcC5wbHVnaW5zLmdldFBsdWdpbihjb2RlU2NyaXB0VG9vbGtpdFBsdWdpbklkKSAhPT0gbnVsbCxcbiAgICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHRpbWVvdXRcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgY29kZVNjcmlwdFRvb2xraXRQbHVnaW5JZDogQ09ERV9TQ1JJUFRfVE9PTEtJVF9QTFVHSU5fSUQsXG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzOiBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0sXG4gICAgdmF1bHRQYXRoOiBnZXRUZW1wb3JhcnlWYXVsdCgpLnBhdGhcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBEcml2ZXMgYSByZWFsIE9ic2lkaWFuIG92ZXIgQ0RQOiB0aGUgY2xvc3VyZSBpcyBzZXJpYWxpemVkIGhlcmUgYW5kIGV4ZWN1dGVkIGluIGFub3RoZXIgcHJvY2Vzcywgc28gaXQgY2Fubm90IGJlIGV4ZXJjaXNlZCBieSBhIHVuaXQgdGVzdC4gKi9cbi8qKlxuICogQ2xpY2tzIG9uZSBidXR0b24gYW5kIHJlYWRzIHRoZSByZXN1bHQgbGluZSBgQ29kZVNjcmlwdCBUb29sa2l0YCB3cml0ZXMgdW5kZXIgaXQuXG4gKlxuICogQSBidXR0b24gdGhhdCByZS1yZW5kZXJzIGl0cyBvd24gbm90ZSAoYSBzZXR0aW5ncyBjaGFuZ2UsIGEgcmVsb2FkKSBkZXRhY2hlcyB0aGUgYmxvY2sgaXQgbGl2ZXMgaW4sXG4gKiBzbyB0aGUgYmxvY2sgZWxlbWVudCBpcyBjYXB0dXJlZCBCRUZPUkUgdGhlIGNsaWNrIGFuZCByZWFkIGFmdGVyd2FyZHMg4oCUIGBDb2RlU2NyaXB0IFRvb2xraXRgIHdyaXRlcyB0aGVcbiAqIHJlc3VsdCBpbnRvIHRoYXQgc2FtZSBlbGVtZW50IGV2ZW4gb25jZSBpdCBpcyBkZXRhY2hlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDbGlja0J1dHRvblBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIERlbW9WYXVsdEJ1dHRvblJlc3VsdH0uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNsaWNrQnV0dG9uKHBhcmFtczogQ2xpY2tCdXR0b25QYXJhbXMpOiBQcm9taXNlPERlbW9WYXVsdEJ1dHRvblJlc3VsdD4ge1xuICByZXR1cm4gZXZhbEluT2JzaWRpYW4oe1xuICAgIGFzeW5jIGNhbGxiYWNrKHtcbiAgICAgIGFwcCxcbiAgICAgIGJ1dHRvblJlc3VsdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICAgIGNhcHRpb24sXG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzLFxuICAgICAgbGliOiB7IHByZXNzS2V5LCB3YWl0VW50aWwgfSxcbiAgICAgIG5vdGVQYXRoOiBub3RlUGF0aFRvT3BlbixcbiAgICAgIG9ic2lkaWFuTW9kdWxlLFxuICAgICAgb3V0cHV0RXhjZXJwdExlbmd0aCxcbiAgICAgIHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICAgIHNob3VsZERpc21pc3NNb2RhbHM6IHNob3VsZERpc21pc3NcbiAgICB9KTogUHJvbWlzZTxEZW1vVmF1bHRCdXR0b25SZXN1bHQ+IHtcbiAgICAgIGZ1bmN0aW9uIHZpZXcoKTogSW5zdGFuY2VUeXBlPHR5cGVvZiBvYnNpZGlhbk1vZHVsZS5NYXJrZG93blZpZXc+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUob2JzaWRpYW5Nb2R1bGUuTWFya2Rvd25WaWV3KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHByZXZpZXdFbCgpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdmlldygpPy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignOnNjb3BlIC5tYXJrZG93bi1wcmV2aWV3LXZpZXcnKSA/PyBudWxsO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gYnV0dG9ucygpOiBIVE1MQnV0dG9uRWxlbWVudFtdIHtcbiAgICAgICAgcmV0dXJuIFsuLi52aWV3KCk/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCc6c2NvcGUgLmJsb2NrLWxhbmd1YWdlLWNvZGUtYnV0dG9uIGJ1dHRvbi5tb2QtY3RhJykgPz8gW11dO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmaW5kQnV0dG9uKCk6IEhUTUxCdXR0b25FbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGJ1dHRvbnMoKS5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS50ZXh0Q29udGVudCA9PT0gY2FwdGlvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWRpbmcgdmlldyBtb3VudHMgbGF6aWx5IGFuZCB1bm1vdW50cyBzZWN0aW9ucyBmYXIgb2ZmLXNjcmVlbiwgc28gTk8gc2luZ2xlIHNjcm9sbCBwb3NpdGlvblxuICAgICAgLy8gaG9sZHMgYSB3aG9sZSBub3RlJ3MgYnV0dG9ucy4gQWR2YW5jZSBhIHZpZXdwb3J0IGF0IGEgdGltZSBhbmQgd3JhcCBiYWNrIHRvIHRoZSB0b3AsIHJlbW91bnRpbmdcbiAgICAgIC8vIGV2ZXJ5IHNlY3Rpb24gaW4gdHVybiB1bnRpbCB0aGUgb25lIGJlaW5nIGxvb2tlZCBmb3IgYXBwZWFycy4gUGlubmluZyB0byB0aGUgQk9UVE9NIGluc3RlYWQg4oCUXG4gICAgICAvLyB3aGF0IHRoaXMgZGlkIHVudGlsIDk0LjQuMSDigJQgb25seSBldmVyIG1vdW50cyB0aGUgbm90ZSdzIHRhaWwsIHNvIGEgYnV0dG9uIGFueXdoZXJlIGJ1dCBhdCB0aGVcbiAgICAgIC8vIGVuZCBvZiBpdHMgbm90ZSB3YXMgcmVwb3J0ZWQgYXMgbmV2ZXIgcmVuZGVyZWQgKGBzdGF0dXM6ICd0aW1lb3V0J2AsIGVtcHR5IG91dHB1dCkgaG93ZXZlclxuICAgICAgLy8gaGVhbHRoeSBpdCB3YXMuXG4gICAgICBjb25zdCBTQ1JPTExfQk9UVE9NX1RPTEVSQU5DRV9JTl9QSVhFTFMgPSA0O1xuICAgICAgY29uc3QgU0NST0xMX1NURVBfUkFUSU8gPSAwLjg7XG4gICAgICBmdW5jdGlvbiBhZHZhbmNlU2Nyb2xsKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzY3JvbGxlciA9IHByZXZpZXdFbCgpO1xuICAgICAgICBpZiAoIXNjcm9sbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQXRCb3R0b20gPSBzY3JvbGxlci5zY3JvbGxUb3AgKyBzY3JvbGxlci5jbGllbnRIZWlnaHQgPj0gc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0IC0gU0NST0xMX0JPVFRPTV9UT0xFUkFOQ0VfSU5fUElYRUxTO1xuICAgICAgICBzY3JvbGxlci5zY3JvbGxUb3AgPSBpc0F0Qm90dG9tID8gMCA6IHNjcm9sbGVyLnNjcm9sbFRvcCArIE1hdGguZmxvb3Ioc2Nyb2xsZXIuY2xpZW50SGVpZ2h0ICogU0NST0xMX1NURVBfUkFUSU8pO1xuICAgICAgfVxuXG4gICAgICAvLyBCb3RoIHRoZSBwcmUtMS4xMyBhbmQgdGhlIDEuMTMgbmFtZSBvZiBhIG1vZGFsJ3MgWDogdGhlIG9sZCBvbmUgYWxvbmUgbWF0Y2hlcyBub3RoaW5nIG9uIGEgY3VycmVudFxuICAgICAgLy8gT2JzaWRpYW4sIGFuZCBjbGlja2luZyBub3RoaW5nIGlzIGEgc2lsZW50IG5vLW9wIHJhdGhlciB0aGFuIGFuIGVycm9yLlxuICAgICAgYXN5bmMgZnVuY3Rpb24gZGlzbWlzc01vZGFscygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCFzaG91bGREaXNtaXNzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgY2xvc2VCdXR0b24gb2YgYWN0aXZlRG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignOnNjb3BlIC5tb2RhbC1jb250YWluZXIgOmlzKC5tb2RhbC1jbG9zZS1idXR0b24sIC5tb2RhbC1oZWFkZXItYnV0dG9uKScpKSB7XG4gICAgICAgICAgY2xvc2VCdXR0b24uY2xpY2soKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIHRydXN0ZWQgRXNjYXBlIOKAlCB3aGF0IGEgdXNlciBwcmVzc2VzIOKAlCBidXQgb25seSB3aGlsZSBzb21ldGhpbmcgaXMgc3RpbGwgb3BlbjogdGhpcyBydW5zIG9uXG4gICAgICAgIC8vIGV2ZXJ5IHBvbGwsIGFuZCBhbiB1bmNvbmRpdGlvbmFsIGtleSBwcmVzcyB3b3VsZCBsYW5kIGluIHdoYXRldmVyIHRoZSBuZXh0IGJ1dHRvbiBpcyBkb2luZy5cbiAgICAgICAgaWYgKGFjdGl2ZURvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1jb250YWluZXIsIC5wcm9tcHQnKSkge1xuICAgICAgICAgIGF3YWl0IHByZXNzS2V5KHsga2V5OiAnRXNjYXBlJyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBSZS1vcGVuIHRoZSBub3RlIGJlZm9yZSBldmVyeSBjbGljayBpbnN0ZWFkIG9mIGFzc3VtaW5nIHRoZSBwcmV2aW91cyBidXR0b24gbGVmdCB0aGUgd29ya3NwYWNlXG4gICAgICAvLyB3aGVyZSBpdCB3YXMgZm91bmQuIEV2ZXJ5IGhlbHBlciBhYm92ZSByZWFkcyB0aGUgQUNUSVZFIHZpZXcsIGFuZCBvcGVuaW5nIGEgbm90ZSBpcyBvbmUgb2YgdGhlXG4gICAgICAvLyBtb3N0IG9yZGluYXJ5IHRoaW5ncyBhIGRlbW8gYnV0dG9uIGRvZXMg4oCUIHNvIHRoZSBmaXJzdCBzdWNoIGJ1dHRvbiB3b3VsZCBvdGhlcndpc2Ugc2VuZCBlYWNoXG4gICAgICAvLyBsYXRlciBidXR0b24gaW4gaXRzIG5vdGUgdG8gYHN0YXR1czogJ3RpbWVvdXQnYCB3aXRoIGFuIGVtcHR5IG91dHB1dCwgd2hpY2ggaXMgdGhlIHNoYXBlIG9mIGFcbiAgICAgIC8vIGJ1dHRvbiB0aGF0IG5ldmVyIHJlbmRlcmVkIHJhdGhlciB0aGFuIG9uZSB0aGF0IHdhcyBsb29rZWQgZm9yIGluIHRoZSB3cm9uZyB2aWV3LlxuICAgICAgYXdhaXQgYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobm90ZVBhdGhUb09wZW4ucmVwbGFjZSgvXFwubWQkLywgJycpLCAnJywgZmFsc2UpO1xuICAgICAgYXdhaXQgYXBwLndvcmtzcGFjZS5nZXRMZWFmKGZhbHNlKS5zZXRWaWV3U3RhdGUoeyBzdGF0ZTogeyBmaWxlOiBub3RlUGF0aFRvT3BlbiwgbW9kZTogJ3ByZXZpZXcnIH0sIHR5cGU6ICdtYXJrZG93bicgfSk7XG5cbiAgICAgIC8vIEhlbGQgZnJvbSB0aGUgcHJlZGljYXRlIHJhdGhlciB0aGFuIHJlLXF1ZXJpZWQgYWZ0ZXIgaXQ6IHRoZSB3YWxrIGFib3ZlIGtlZXBzIG1vdmluZyB0aGVcbiAgICAgIC8vIHZpZXdwb3J0LCBzbyBhIGJ1dHRvbiBmb3VuZCBvbiBvbmUgcG9sbCBjYW4gYmUgdW5tb3VudGVkIGFnYWluIGJ5IHRoZSBuZXh0LlxuICAgICAgbGV0IGJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3YWl0VW50aWwoe1xuICAgICAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgbWVzc2FnZTogYGNvZGUgYnV0dG9uIFwiJHtjYXB0aW9ufVwiIG5ldmVyIHJlbmRlcmVkYCxcbiAgICAgICAgICBwcmVkaWNhdGU6ICgpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGFkdmFuY2VTY3JvbGwoKTtcbiAgICAgICAgICAgIGJ1dHRvbiA9IGZpbmRCdXR0b24oKTtcbiAgICAgICAgICAgIHJldHVybiBidXR0b24gIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiB7IGNhcHRpb24sIG91dHB1dDogJycsIHN0YXR1czogJ3RpbWVvdXQnIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghYnV0dG9uKSB7XG4gICAgICAgIHJldHVybiB7IGNhcHRpb24sIG91dHB1dDogJycsIHN0YXR1czogJ3RpbWVvdXQnIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJsb2NrID0gYnV0dG9uLmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCcuYmxvY2stbGFuZ3VhZ2UtY29kZS1idXR0b24nKSA/PyBidXR0b24ucGFyZW50RWxlbWVudDtcbiAgICAgIGJ1dHRvbi5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgYnV0dG9uLmNsaWNrKCk7XG5cbiAgICAgIGxldCBzdGF0dXM6IERlbW9WYXVsdEJ1dHRvblJlc3VsdFsnc3RhdHVzJ107XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3YWl0VW50aWwoe1xuICAgICAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMsXG4gICAgICAgICAgbWVzc2FnZTogYGJ1dHRvbiBcIiR7Y2FwdGlvbn1cIiBuZXZlciByZXBvcnRlZCBhIHJlc3VsdGAsXG4gICAgICAgICAgcHJlZGljYXRlOiBhc3luYyAoKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgICAgICAvLyBBIGJ1dHRvbiB0aGF0IGF3YWl0cyBhbiBhbGVydCAvIGNvbmZpcm0gLyBwcm9tcHQgcmVwb3J0cyBub3RoaW5nIHVudGlsIHRoZSBkaWFsb2cgY2xvc2VzLlxuICAgICAgICAgICAgYXdhaXQgZGlzbWlzc01vZGFscygpO1xuICAgICAgICAgICAgcmV0dXJuIC9FeGVjdXRlZCAoPzpzdWNjZXNzZnVsbHl8d2l0aCBlcnJvcikvLnRlc3QoYmxvY2s/LnRleHRDb250ZW50ID8/ICcnKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0ZXh0ID0gYmxvY2s/LnRleHRDb250ZW50ID8/ICcnO1xuICAgICAgICBpZiAodGV4dC5pbmNsdWRlcygnRXhlY3V0ZWQgd2l0aCBlcnJvcicpKSB7XG4gICAgICAgICAgc3RhdHVzID0gJ2Vycm9yJztcbiAgICAgICAgfSBlbHNlIGlmICh0ZXh0LmluY2x1ZGVzKCdFeGVjdXRlZCBzdWNjZXNzZnVsbHknKSkge1xuICAgICAgICAgIHN0YXR1cyA9ICdvayc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdHVzID0gJ3Vua25vd24nO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgc3RhdHVzID0gJ3RpbWVvdXQnO1xuICAgICAgfVxuXG4gICAgICAvLyBXaGF0ZXZlciB0aGlzIGJ1dHRvbiBsZWZ0IG9wZW4gd291bGQgb3RoZXJ3aXNlIHNpdCBvdmVyIHRoZSBuZXh0IG9uZS5cbiAgICAgIGF3YWl0IGRpc21pc3NNb2RhbHMoKTtcblxuICAgICAgcmV0dXJuIHsgY2FwdGlvbiwgb3V0cHV0OiAoYmxvY2s/LnRleHRDb250ZW50ID8/ICcnKS5zbGljZSgwLCBvdXRwdXRFeGNlcnB0TGVuZ3RoKSwgc3RhdHVzIH07XG4gICAgfSxcbiAgICBpbnB1dDoge1xuICAgICAgYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzOiBwYXJhbXMudGltZW91dHMuYnV0dG9uUmVzdWx0VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgY2FwdGlvbjogcGFyYW1zLmJ1dHRvbkNhcHRpb24sXG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzOiBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIG5vdGVQYXRoOiBwYXJhbXMubm90ZVBhdGgsXG4gICAgICBvdXRwdXRFeGNlcnB0TGVuZ3RoOiBPVVRQVVRfRVhDRVJQVF9MRU5HVEgsXG4gICAgICBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHBhcmFtcy50aW1lb3V0cy5zZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgICBzaG91bGREaXNtaXNzTW9kYWxzOiBwYXJhbXMuc2hvdWxkRGlzbWlzc01vZGFsc1xuICAgIH0sXG4gICAgdmF1bHRQYXRoOiBnZXRUZW1wb3JhcnlWYXVsdCgpLnBhdGhcbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbnMgYSBub3RlIGluIHJlYWRpbmcgdmlldyBhbmQgbGlzdHMgdGhlIGNhcHRpb25zIG9mIHRoZSBidXR0b25zIHRoYXQgbW91bnRlZCwgZGVkdXBsaWNhdGVkIGFuZCBpblxuICogZG9jdW1lbnQgb3JkZXIuXG4gKlxuICogVHdvIHF1aXJrcyBvZiByZWFkaW5nIHZpZXcgc2hhcGUgdGhpcy4gSXQgcmVuZGVycyBsYXppbHkgYW5kIHVubW91bnRzIHNlY3Rpb25zIGZhciBvZmYtc2NyZWVuLCBzbyBub1xuICogc2luZ2xlIHNjcm9sbCBwb3NpdGlvbiBob2xkcyBhIHdob2xlIG5vdGUncyBidXR0b25zIOKAlCB0aGUgcHJldmlldyBpcyB3YWxrZWQgdG9wIHRvIGJvdHRvbSBhbmQgYmFja1xuICogd2hpbGUgd2FpdGluZywgYW5kIHRoZSBjYXB0aW9ucyBzZWVuIGFsb25nIHRoZSB3YXkgYXJlIEFDQ1VNVUxBVEVEIHJhdGhlciB0aGFuIHJlYWQgb25jZSBhdCB0aGUgZW5kLlxuICogQW5kIHdoaWxlIGl0IHNldHRsZXMgaXQgY2FuIGhvbGQgU0VWRVJBTCBlbGVtZW50cyBwZXIgZmVuY2Ug4oCUIHRoZSBzYW1lIGJ1dHRvbiB3YXMgb2JzZXJ2ZWQgcmVuZGVyZWRcbiAqIHR3aWNlIOKAlCBzbyB0aGUgY2FwdGlvbnMgYXJlIGRlZHVwbGljYXRlZDsgY2xpY2tpbmcgYnkgY2FwdGlvbiB0aGVuIGFkZHJlc3NlcyBlYWNoIGJ1dHRvbiBvbmNlIGhvd2V2ZXJcbiAqIG1hbnkgY29waWVzIG9mIGl0IHRoZSBET00gaXMgaG9sZGluZy5cbiAqXG4gKiBAcGFyYW0gbm90ZSAtIFRoZSBub3RlIHRvIG9wZW4uXG4gKiBAcGFyYW0gc2V0dGxlVGltZW91dEluTWlsbGlzZWNvbmRzIC0gSG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIGJ1dHRvbnMgdG8gbW91bnQuXG4gKiBAcmV0dXJucyBUaGUgZGlzdGluY3QgYnV0dG9uIGNhcHRpb25zLlxuICovXG5hc3luYyBmdW5jdGlvbiBvcGVuTm90ZUFuZExpc3RCdXR0b25DYXB0aW9ucyhub3RlOiBEZW1vVmF1bHROb3RlLCBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgcmV0dXJuIGV2YWxJbk9ic2lkaWFuKHtcbiAgICBhc3luYyBjYWxsYmFjayh7IGFwcCwgZXhwZWN0ZWRCdXR0b25Db3VudCwgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcywgbGliOiB7IHdhaXRVbnRpbCB9LCBub3RlUGF0aCwgb2JzaWRpYW5Nb2R1bGUsIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgZnVuY3Rpb24gdmlldygpOiBJbnN0YW5jZVR5cGU8dHlwZW9mIG9ic2lkaWFuTW9kdWxlLk1hcmtkb3duVmlldz4gfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIGFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShvYnNpZGlhbk1vZHVsZS5NYXJrZG93blZpZXcpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcHJldmlld0VsKCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB2aWV3KCk/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCc6c2NvcGUgLm1hcmtkb3duLXByZXZpZXctdmlldycpID8/IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBBY2N1bXVsYXRlZCBhY3Jvc3MgdGhlIHdhbGsgYmVsb3csIG5ldmVyIHJlYWQgZnJvbSBvbmUgc25hcHNob3Q6IHdpdGggdGhlIHZpZXdwb3J0IG1vdmluZywgYW55XG4gICAgICAvLyBzaW5nbGUgcmVhZGluZyBob2xkcyBvbmx5IHRoZSBzZWN0aW9ucyBjdXJyZW50bHkgbW91bnRlZC5cbiAgICAgIGNvbnN0IHNlZW5DYXB0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZnVuY3Rpb24gY2FwdGlvbnMoKTogc3RyaW5nW10ge1xuICAgICAgICBmb3IgKGNvbnN0IGJ1dHRvbiBvZiB2aWV3KCk/LmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEJ1dHRvbkVsZW1lbnQ+KCc6c2NvcGUgLmJsb2NrLWxhbmd1YWdlLWNvZGUtYnV0dG9uIGJ1dHRvbi5tb2QtY3RhJykgPz8gW10pIHtcbiAgICAgICAgICBpZiAoYnV0dG9uLnRleHRDb250ZW50ICE9PSAnJykge1xuICAgICAgICAgICAgc2VlbkNhcHRpb25zLmFkZChidXR0b24udGV4dENvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWy4uLnNlZW5DYXB0aW9uc107XG4gICAgICB9XG5cbiAgICAgIC8vIFNhbWUgd2FsayBhcyBgY2xpY2tCdXR0b25gLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogYSBub3RlIHdob3NlIGJ1dHRvbnMgYXJlIGluIHRoZSBNSURETEVcbiAgICAgIC8vIG5ldmVyIG1vdW50cyB0aGVtIGlmIHRoZSBwcmV2aWV3IGlzIHBpbm5lZCB0byB0aGUgYm90dG9tLlxuICAgICAgY29uc3QgU0NST0xMX0JPVFRPTV9UT0xFUkFOQ0VfSU5fUElYRUxTID0gNDtcbiAgICAgIGNvbnN0IFNDUk9MTF9TVEVQX1JBVElPID0gMC44O1xuICAgICAgZnVuY3Rpb24gYWR2YW5jZVNjcm9sbCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBwcmV2aWV3RWwoKTtcbiAgICAgICAgaWYgKCFzY3JvbGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0F0Qm90dG9tID0gc2Nyb2xsZXIuc2Nyb2xsVG9wICsgc2Nyb2xsZXIuY2xpZW50SGVpZ2h0ID49IHNjcm9sbGVyLnNjcm9sbEhlaWdodCAtIFNDUk9MTF9CT1RUT01fVE9MRVJBTkNFX0lOX1BJWEVMUztcbiAgICAgICAgc2Nyb2xsZXIuc2Nyb2xsVG9wID0gaXNBdEJvdHRvbSA/IDAgOiBzY3JvbGxlci5zY3JvbGxUb3AgKyBNYXRoLmZsb29yKHNjcm9sbGVyLmNsaWVudEhlaWdodCAqIFNDUk9MTF9TVEVQX1JBVElPKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobm90ZVBhdGgucmVwbGFjZSgvXFwubWQkLywgJycpLCAnJywgZmFsc2UpO1xuICAgICAgYXdhaXQgYXBwLndvcmtzcGFjZS5nZXRMZWFmKGZhbHNlKS5zZXRWaWV3U3RhdGUoeyBzdGF0ZTogeyBmaWxlOiBub3RlUGF0aCwgbW9kZTogJ3ByZXZpZXcnIH0sIHR5cGU6ICdtYXJrZG93bicgfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICAgICAgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgICBtZXNzYWdlOiBgXCIke25vdGVQYXRofVwiIG5ldmVyIG1vdW50ZWQgYWxsICR7U3RyaW5nKGV4cGVjdGVkQnV0dG9uQ291bnQpfSBvZiBpdHMgYnV0dG9uc2AsXG4gICAgICAgICAgcHJlZGljYXRlOiAoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICBhZHZhbmNlU2Nyb2xsKCk7XG4gICAgICAgICAgICByZXR1cm4gY2FwdGlvbnMoKS5sZW5ndGggPj0gZXhwZWN0ZWRCdXR0b25Db3VudDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBUaGUgY2FwdGlvbnMgYXJlIHJldHVybmVkIGVpdGhlciB3YXk7IHRoZSBjYWxsZXIgYXNzZXJ0cyBvbiB0aGVtIGFuZCByZXBvcnRzIHRoZSBzaG9ydGZhbGwuXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjYXB0aW9ucygpO1xuICAgIH0sXG4gICAgaW5wdXQ6IHtcbiAgICAgIGV4cGVjdGVkQnV0dG9uQ291bnQ6IG5vdGUuYnV0dG9uQ291bnQsXG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzOiBQT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIG5vdGVQYXRoOiBub3RlLm5hbWUsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0sXG4gICAgdmF1bHRQYXRoOiBnZXRUZW1wb3JhcnlWYXVsdCgpLnBhdGhcbiAgfSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/// <reference path="./
|
|
1
|
+
/// <reference path="./library-references.d.cts" />
|
|
2
2
|
/**
|
|
3
3
|
* @file
|
|
4
4
|
*
|
|
@@ -11,12 +11,12 @@
|
|
|
11
11
|
* is wrong, or that calls an API that has since changed shape, fails at click time and nowhere else.
|
|
12
12
|
*
|
|
13
13
|
* The companion half — seeding the temp vault with the demo-vault tree, its `.obsidian` config, and the
|
|
14
|
-
* CodeScript Toolkit binary that turns ```` ```code-button ```` fences into buttons — is
|
|
14
|
+
* `CodeScript Toolkit` binary that turns ```` ```code-button ```` fences into buttons — is
|
|
15
15
|
* `buildDemoVaultPopulate` in `obsidian-integration-testing`; hand its result to the project's
|
|
16
|
-
* `globalSetup` and name CodeScript Toolkit in `enableCommunityPlugins`.
|
|
16
|
+
* `globalSetup` and name `CodeScript Toolkit` in `enableCommunityPlugins`.
|
|
17
17
|
*/
|
|
18
18
|
/**
|
|
19
|
-
* CodeScript Toolkit's manifest id. It is still the plugin's original `fix-require-modules` id, which
|
|
19
|
+
* `CodeScript Toolkit`'s manifest id. It is still the plugin's original `fix-require-modules` id, which
|
|
20
20
|
* no longer matches its name — the id is published, so it cannot be changed.
|
|
21
21
|
*/
|
|
22
22
|
export declare const CODE_SCRIPT_TOOLKIT_PLUGIN_ID = "fix-require-modules";
|
|
@@ -45,7 +45,7 @@ export interface DemoVaultButtonResult {
|
|
|
45
45
|
*/
|
|
46
46
|
readonly caption: string;
|
|
47
47
|
/**
|
|
48
|
-
* The result line CodeScript Toolkit printed under the button, truncated.
|
|
48
|
+
* The result line `CodeScript Toolkit` printed under the button, truncated.
|
|
49
49
|
*/
|
|
50
50
|
readonly output: string;
|
|
51
51
|
/**
|
|
@@ -204,8 +204,8 @@ export declare function findDuplicateCaptions(captions: readonly string[]): stri
|
|
|
204
204
|
/**
|
|
205
205
|
* Builds the assertion message for a note's failing buttons.
|
|
206
206
|
*
|
|
207
|
-
* The captured output is included because a button's failure is a runtime one — the stack
|
|
208
|
-
* Toolkit prints under it is the only diagnosis there is.
|
|
207
|
+
* The captured output is included because a button's failure is a runtime one — the stack
|
|
208
|
+
* `CodeScript Toolkit` prints under it is the only diagnosis there is.
|
|
209
209
|
*
|
|
210
210
|
* @param noteName - The note the buttons belong to.
|
|
211
211
|
* @param failures - The failing buttons.
|
|
@@ -216,7 +216,7 @@ export declare function formatFailures(noteName: string, failures: readonly Demo
|
|
|
216
216
|
* Lists the captions of the buttons a note's source will actually render, in source order.
|
|
217
217
|
*
|
|
218
218
|
* Which fences render a button is decided exactly as {@link countRenderedButtons} describes. A caption is
|
|
219
|
-
* read from the fence's own config block; a fence naming none takes CodeScript Toolkit's default,
|
|
219
|
+
* read from the fence's own config block; a fence naming none takes `CodeScript Toolkit`'s default,
|
|
220
220
|
* `(no caption)`, which is what its button then shows.
|
|
221
221
|
*
|
|
222
222
|
* @param source - The note's markdown.
|