@mnaoumov/obsidian-dev-toolkit 3.1.0 → 3.2.1
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/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +1 -75
- package/dist/lib/cjs/bundlers/esbuild-impl/dependency.cjs +3 -77
- package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +1 -75
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +1 -75
- package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +1 -75
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +1 -75
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +3 -76
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +1 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/rename-css-plugin.cjs +1 -75
- package/dist/lib/cjs/bundlers/esbuild.cjs +1 -75
- package/dist/lib/cjs/bundlers/index.cjs +1 -75
- package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +1 -75
- package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +1 -75
- package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +1 -75
- package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +1 -75
- package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +1 -75
- package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +32 -85
- package/dist/lib/cjs/bundlers/parcel.cjs +112 -81
- package/dist/lib/cjs/bundlers/parcel.d.cts +13 -6
- package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +1 -75
- package/dist/lib/cjs/bundlers/rollup-compatible.cjs +1 -75
- package/dist/lib/cjs/bundlers/rollup.cjs +1 -75
- package/dist/lib/cjs/bundlers/vite.cjs +1 -75
- package/dist/lib/cjs/bundlers/webpack.cjs +3 -77
- package/dist/lib/cjs/demo-vault-app-json.cjs +1 -75
- package/dist/lib/cjs/demo-vault-buttons.cjs +1 -75
- package/dist/lib/cjs/demo-vault-cli.cjs +1 -75
- package/dist/lib/cjs/demo-vault-coverage.cjs +1 -75
- package/dist/lib/cjs/demo-vault.cjs +3 -77
- package/dist/lib/cjs/docs-site/index.cjs +1 -75
- package/dist/lib/cjs/docs-site/obsidian-external-type-links.cjs +1 -75
- package/dist/lib/cjs/formatters/dprint.cjs +1 -75
- package/dist/lib/cjs/formatters/index.cjs +1 -75
- package/dist/lib/cjs/index.cjs +1 -75
- package/dist/lib/cjs/integration-test-setup.cjs +1 -75
- package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +1 -75
- package/dist/lib/cjs/jest-setup.cjs +1 -75
- package/dist/lib/cjs/jest-setup.d.cts +2 -1
- package/dist/lib/cjs/linters/eslint-config.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/manifest-description.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/manifest-helpers.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/manifest-id.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/manifest-name.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/manifest-schema.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/no-local-obsidian-internals.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.cjs +2 -77
- package/dist/lib/cjs/linters/eslint-rules/no-untrusted-input-events.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/obsidian-dev-toolkit-plugin.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code-in-ui.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/plugin-name-as-code.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/require-component-suffix.cjs +1 -75
- package/dist/lib/cjs/linters/eslint-rules/require-plugin-api-contract-schemas.cjs +1 -75
- package/dist/lib/cjs/linters/eslint.cjs +1 -75
- package/dist/lib/cjs/linters/index.cjs +1 -75
- package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +1 -75
- package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +1 -75
- package/dist/lib/cjs/linters/markdownlint-rules/plugin-name-as-code.cjs +1 -75
- package/dist/lib/cjs/linters/markdownlint.cjs +1 -75
- package/dist/lib/cjs/linters/obsidianmd-rule-custom-message.cjs +1 -75
- package/dist/lib/cjs/linters/plugin-names.cjs +1 -75
- package/dist/lib/cjs/obsidian-plugin-repo-paths.cjs +1 -75
- package/dist/lib/cjs/setup.cjs +1 -75
- package/dist/lib/cjs/templates.cjs +3 -77
- package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +1 -75
- package/dist/lib/cjs/test-runners/coverage-badge.cjs +1 -75
- package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +1 -75
- package/dist/lib/cjs/test-runners/index.cjs +4 -75
- package/dist/lib/cjs/test-runners/index.d.cts +1 -0
- package/dist/lib/cjs/test-runners/integration-test-plugin.cjs +3 -77
- package/dist/lib/cjs/test-runners/jest-config.cjs +92 -0
- package/dist/lib/cjs/test-runners/jest-config.d.cts +50 -0
- package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +1 -75
- package/dist/lib/cjs/test-runners/performance-eval-cap.cjs +4 -75
- package/dist/lib/cjs/test-runners/performance-eval-cap.d.cts +12 -3
- package/dist/lib/cjs/test-runners/stale-build-global-setup.cjs +1 -75
- package/dist/lib/cjs/test-runners/vitest-config.cjs +4 -80
- package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +1 -75
- package/dist/lib/cjs/version.cjs +1 -75
- package/dist/lib/cjs/vitest-setup.cjs +1 -75
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +1 -1
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +3 -2
- package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +32 -15
- package/dist/lib/esm/bundlers/parcel.d.mts +13 -6
- package/dist/lib/esm/bundlers/parcel.mjs +110 -5
- package/dist/lib/esm/jest-setup.d.mts +2 -1
- package/dist/lib/esm/jest-setup.mjs +1 -1
- package/dist/lib/esm/linters/eslint-rules/no-over-cap-wait-in-eval-in-obsidian.mjs +2 -2
- package/dist/lib/esm/test-runners/index.d.mts +1 -0
- package/dist/lib/esm/test-runners/index.mjs +3 -1
- package/dist/lib/esm/test-runners/jest-config.d.mts +50 -0
- package/dist/lib/esm/test-runners/jest-config.mjs +68 -0
- package/dist/lib/esm/test-runners/performance-eval-cap.d.mts +12 -3
- package/dist/lib/esm/test-runners/performance-eval-cap.mjs +3 -1
- package/dist/lib/esm/test-runners/vitest-config.mjs +4 -5
- package/package.json +19 -2
- package/test-runners/jest-config/package.json +6 -0
|
@@ -31,8 +31,8 @@ ensureBrowserProcess();
|
|
|
31
31
|
})();
|
|
32
32
|
|
|
33
33
|
import { toTSESTreeNode } from "@mnaoumov/typescript-dev-toolkit/linters/eslint-rules/ts-estree-node";
|
|
34
|
-
import { DEFAULT_EVAL_CAP_IN_MILLISECONDS } from "obsidian-integration-testing";
|
|
35
34
|
import {
|
|
35
|
+
DEFAULT_EVAL_CAP_IN_MILLISECONDS,
|
|
36
36
|
DESKTOP_PERFORMANCE_TEST_FILE_SUFFIX,
|
|
37
37
|
PERFORMANCE_EVAL_CAP_IN_MILLISECONDS
|
|
38
38
|
} from "../../test-runners/performance-eval-cap.mjs";
|
|
@@ -539,4 +539,4 @@ export {
|
|
|
539
539
|
MESSAGE_ID,
|
|
540
540
|
noOverCapWaitInEvalInObsidian
|
|
541
541
|
};
|
|
542
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saW50ZXJzL2VzbGludC1ydWxlcy9uby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEVTTGludCBydWxlOiBuby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW5cbiAqXG4gKiBSZXBvcnRzIGFuIGBldmFsSW5PYnNpZGlhbmAgLyBgcG9sbEluT2JzaWRpYW5gIGNsb3N1cmUgdGhhdCBkZWNsYXJlcyBtb3JlIHdhaXRpbmdcbiAqIHRoYW4gdGhlIHRyYW5zcG9ydCBjYW4gZXZlciBob25vdXIuXG4gKlxuICogQSBzaW5nbGUgY2xvc3VyZSBpcyBldmFsdWF0ZWQgdGhyb3VnaCBvbmUgdHJhbnNwb3J0IGNhbGwsIGFuZCB0aGF0IGNhbGwgaXMgY2FwcGVkIGF0XG4gKiByb3VnaGx5IDMwIHNlY29uZHMg4oCUIEFwcGl1bSBzdXJmYWNlcyB0aGUgY2FwIGFzIGEgYmFyZSBgV2ViRHJpdmVyRXJyb3I6IHNjcmlwdCB0aW1lb3V0YFxuICogbmFtaW5nIG9ubHkgYEFwcGl1bVRyYW5zcG9ydC5ldmFsdWF0ZWAsIENEUCBhcyBhIGNvbW1hbmQgdGltZW91dC4gTmVpdGhlciBuYW1lcyB0aGUgd2FpdFxuICogdGhhdCBhY3R1YWxseSBibGV3IHRoZSBidWRnZXQsIHNvIHRoZSBmYWlsdXJlIHJlYWRzIGFzIGEgYnJva2VuIGRldmljZSByYXRoZXIgdGhhbiBhcyBhXG4gKiBjbG9zdXJlIGFza2luZyBmb3IgbW9yZSB0aW1lIHRoYW4gZXhpc3RzLiBUaGF0IG1pc2RpYWdub3NpcyBjb3N0IHR3byBkYXlzLlxuICpcbiAqIFRoZSBjYXAgdGhlIHJ1bGUgYXNzdW1lcyB3aGVuIGBjYXBJbk1pbGxpc2Vjb25kc2AgaXMgbm90IGNvbmZpZ3VyZWQgaXNcbiAqIGBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EU2AsIGltcG9ydGVkIGZyb20gYG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmdgIOKAlCB0aGUgc2FtZSBjb25zdGFudFxuICogYm90aCBvZiBpdHMgdHJhbnNwb3J0cyBlbmZvcmNlLCBzbyB0aGUgcnVsZSBjYW5ub3QgZHJpZnQgZnJvbSB0aGUgdGhpbmcgaXQgaXMgcHJlZGljdGluZy4gVGhhdCBpbXBvcnRcbiAqIGlzIHdoeSB0aGUgaGFybmVzcyBpcyBhIHJlcXVpcmVkIHBlZXIgb2YgdGhpcyBsaWJyYXJ5IHJhdGhlciB0aGFuIGFuIG9wdGlvbmFsIG9uZTogdGhlIHNoYXJlZCBFU0xpbnRcbiAqIGNvbmZpZyBsb2FkcyB0aGlzIHJ1bGUsIHNvIGV2ZXJ5IGNvbnN1bWluZyByZXBvIHJlc29sdmVzIGl0IGF0IGxpbnQgdGltZS5cbiAqXG4gKiBPTkUgS0lORCBPRiBGSUxFIERFRkFVTFRTIEhJR0hFUjogYSBgKi5kZXNrdG9wLXBlcmZvcm1hbmNlLmludGVncmF0aW9uLnRlc3QudHNgIGlzIG1lYXN1cmVkIGFnYWluc3RcbiAqIGBQRVJGT1JNQU5DRV9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFNgICg2MDAgMDAwKSwgdGhlIHBlci1ldmFsIGNhcCB0aGUgc2hhcmVkIHZpdGVzdCBjb25maWcgZ2l2ZXMgdGhlXG4gKiBgaW50ZWdyYXRpb24tdGVzdHM6ZGVza3RvcC1wZXJmb3JtYW5jZWAgcHJvamVjdCwgaW1wb3J0ZWQgZnJvbSB0aGF0IHNhbWUgbW9kdWxlIHJhdGhlciB0aGFuIHJlc3RhdGVkLlxuICogVGhhdCByYWlzZSBpcyBhIGRlbGliZXJhdGUgQlVER0VUOiBhIHBlcmYgc3VpdGUncyBtZWFzdXJlbWVudCBpcyBvbmUgbG9uZyBpbi1wYWdlIGV2YWx1YXRpb24sIGFuZCBpdHNcbiAqIGZpbGVzIHJ1biBvbiBubyBvdGhlciBwcm9qZWN0LiBFdmVyeSBvdGhlciBmaWxlIGtlZXBzIHRoZSBzaW5nbGUgdHJhbnNwb3J0IGRlZmF1bHQsIGFuZCB0aGF0IGlzIHRoZVxuICogY29udmVudGlvbiByYXRoZXIgdGhhbiBhIGdhcDogYSByZXBvIHRoYXQgcmFpc2VzIGl0cyBvd24gZGVza3RvcCBgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kc2AgaXNcbiAqIHNldHRpbmcgYSBiYWNrc3RvcCwgTk9UIGEgYnVkZ2V0IGEgY2xvc3VyZSBtYXkgc3BlbmQsIHNvIHRoZSBydWxlIGRvZXMgbm90IHJlYWQgdGhhdCByYWlzZSBhbmQga2VlcHNcbiAqIGVuZm9yY2luZyAzMCAwMDAgYWdhaW5zdCBpdC4gQSBjcm9zcy1wbGF0Zm9ybSBzdWl0ZSBjb3VsZCBub3Qgc3BlbmQgaXQgYW55d2F5OiBBcHBpdW0gY2FwcyBldmVyeVxuICogY2xvc3VyZSBhdCAzMCAwMDAgd2hhdGV2ZXIgYSBkZXNrdG9wIHJhaXNlIHNheXMuIEFuIGV4cGxpY2l0IGBjYXBJbk1pbGxpc2Vjb25kc2Agc3RpbGwgb3ZlcnJpZGVzIGJvdGhcbiAqIGRlZmF1bHRzLCBmb3IgZXZlcnkgZmlsZSB0aGUgcnVsZSBpcyBjb25maWd1cmVkIG9uLlxuICpcbiAqIEEgY2xvc3VyZSBkZWNsYXJpbmcgYSAzMCAwMDAgbXMgYHdhaXRVbnRpbGAsIG9yIHR3byAyMCAwMDAgbXMgb25lcywgdGhlcmVmb3JlIGNhbm5vdFxuICogc3VjY2VlZCBvbiBhbnkgbWFjaGluZSBzbG93IGVub3VnaCB0byBuZWVkIHRoZSB0aW1lIGl0IGFza3MgZm9yLiBUaGUgZml4IGlzIHRvIG1vdmUgdGhlXG4gKiB3YWl0aW5nIHRvIE5vZGU6IGBwb2xsSW5PYnNpZGlhbmAgcnVucyBhIFNIT1JUIERPTS1yZWFkaW5nIGBwb2xsYCBjbG9zdXJlIHJlcGVhdGVkbHksXG4gKiBldmFsdWF0ZXMgYHVudGlsYCBpbiBOb2RlLCBhbmQgY2FycmllcyB0aGUgbG9uZyBidWRnZXQgaW4gYHRpbWVvdXRJbk1pbGxpc2Vjb25kc2AsIHNvIG5vXG4gKiBzaW5nbGUgdHJhbnNwb3J0IGNhbGwgaXMgZXZlciBsb25nLlxuICpcbiAqIFdIQVQgQ09VTlRTIHRvd2FyZCBhIGNsb3N1cmUncyBidWRnZXQsIHN1bW1lZCBsZXhpY2FsbHk6IGV2ZXJ5IGB3YWl0VW50aWxgIGluc2lkZSBpdCDigJRcbiAqIHRha2luZyB0aGUgaGVscGVyJ3MgZG9jdW1lbnRlZCA1IDAwMCBtcyBkZWZhdWx0IHdoZW4gYHRpbWVvdXRJbk1pbGxpc2Vjb25kc2AgaXMgb21pdHRlZCxcbiAqIHdoaWNoIGlzIHdoYXQgbWFrZXMgc2V2ZXJhbCBzbWFsbCBzaWJsaW5nIHdhaXRzIGFkZCB1cCBob25lc3RseSDigJQgcGx1cyBldmVyeSBgc2xlZXAobilgXG4gKiBzZXR0bGUuIFdhaXRzIGluc2lkZSBhIGhlbHBlciBkZWNsYXJlZCB3aXRoaW4gdGhlIGNsb3N1cmUgY291bnQgdG9vOyB0aGUgZW5jbG9zaW5nXG4gKiBjbG9zdXJlIGlzIGZvdW5kIGJ5IHdhbGtpbmcgb3V0d2FyZHMsIHNvIGEgbmVzdGVkIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgdG8gdGhlIGNsb3N1cmUgaXRcbiAqIHJ1bnMgaW5zaWRlIC0tIG9uY2UgcGVyIENBTEwgU0lURSwgcGVyIHRoZSBIRUxQRVJTIHBhcmFncmFwaCBiZWxvdy5cbiAqXG4gKiBXSEFUIERPRVMgTk9ULiBBIGJ1ZGdldCB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIG51bWJlciBjb250cmlidXRlcyBub3RoaW5nIGFuZCBpc1xuICogbmV2ZXIgcmVwb3J0ZWQgKG93bmVyLCAyMDI2LTA5LTA5KS4gU2NvcGUgYW5hbHlzaXMgcmVzb2x2ZXMgdGhlIHNoYXBlcyB0aGF0IGFjdHVhbGx5XG4gKiBvY2N1ciDigJQgYSBsaXRlcmFsLCBhIGBjb25zdGAgaW4gYW55IGVuY2xvc2luZyBzY29wZSwgYW5kIGEgZGVzdHJ1Y3R1cmVkIGNhbGxiYWNrXG4gKiBwYXJhbWV0ZXIgZm9sbG93ZWQgYmFjayB0aHJvdWdoIHRoZSBjYWxsJ3Mgb3duIGBpbnB1dGAgb2JqZWN0IOKAlCBhbmQgcmVzb2x2aW5nIHRocm91Z2hcbiAqIHNjb3BlIHJhdGhlciB0aGFuIGJ5IHJlZ2V4IGlzIHRoZSB3aG9sZSByZWFzb24gdGhpcyBpcyBhIHJ1bGUgYW5kIG5vdCBhIHNjcmlwdC4gQnV0IGFcbiAqIHZhbHVlIGFycml2aW5nIGZyb20gYSBjYWxsZXIgKGBvcHRpb25zLnRpbWVvdXQgPz8gREVGQVVMVGAsIHRocmVhZGVkIHRocm91Z2ggYVxuICogcGFyYW1ldGVyKSB3b3VsZCBuZWVkIGFuYWx5c2lzIGFjcm9zcyBjYWxsIGJvdW5kYXJpZXMsIGFuZCByZXBvcnRpbmcgZXZlcnkgc3VjaCBzaXRlIHdvdWxkXG4gKiBtYWtlIGVhY2ggbGVnaXRpbWF0ZWx5IHBhcmFtZXRlcml6ZWQgaGVscGVyIHJlZCBhY3Jvc3MgdGhpcnR5IHJlcG9zLlxuICpcbiAqIExPT1BTIHdlcmUgb25jZSBvdXQgb2Ygc2NvcGUgd2hvbGVzYWxlLCBvbiB0aGUgcmVhc29uaW5nIHRoYXQgYSBgc2xlZXBgIGluIGEgYHdoaWxlYCBoYXMgbm9cbiAqIHN0YXRpY2FsbHkgZGVjbGFyZWQgY2VpbGluZy4gVGhhdCBpcyB0cnVlIG9mIGB3aGlsZSAodHJ1ZSlgIGFuZCBmYWxzZSBvZiB0aGUgbG9vcCB0aGVzZVxuICogc3VpdGVzIGFjdHVhbGx5IHdyaXRlLCB3aGljaCBkZWNsYXJlcyBpdHMgY2VpbGluZyBhcyBwbGFpbmx5IGFzIGFueSBsaXRlcmFsIHRpbWVvdXQg4oCUIGFuZFxuICogbGVhdmluZyB0aGVtIGFsbCBvdXQgaGlkIDIyIG92ZXItY2FwIGNsb3N1cmVzIGFjcm9zcyBzaXggcmVwb3MsIG9uZSBvZiB0aGVtIHRlbiB0aW1lcyBvdmVyLlxuICogVHdvIHNoYXBlcyBhcmUgcmVhZCBub3csIGJvdGggdGhyb3VnaCB0aGUgc2FtZSBzY29wZSB3YWxrIGEgYnVkZ2V0IHVzZXM6XG4gKlxuICogLSBBIERFQURMSU5FIGxvb3Ag4oCUIGBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBCVURHRVRgLCBndWFyZGVkIGJ5IGBEYXRlLm5vdygpIDwgZGVhZGxpbmVgIOKAlFxuICogICBjYW5ub3QgcnVuIGxvbmdlciB0aGFuIGBCVURHRVRgIHdoYXRldmVyIGl0cyBwb2xsIGludGVydmFsLCBzbyBgQlVER0VUYCBpcyBjaGFyZ2VkIHRvIHRoZVxuICogICBjbG9zdXJlIE9OQ0UgcGVyIGxvb3AsIG9uIHRvcCBvZiB0aGUgc2luZ2xlIGl0ZXJhdGlvbiBpdHMgaW5uZXIgd2FpdHMgYXJlIGFscmVhZHkgY2hhcmdlZFxuICogICAoYSBwb2xsIHRoYXQgc3RhcnRzIGp1c3QgdW5kZXIgdGhlIGRlYWRsaW5lIHN0aWxsIHJ1bnMgdG8gY29tcGxldGlvbiwgc28gdGhlIHN1bSBvZiB0aGUgdHdvXG4gKiAgIGlzIHRoZSBob25lc3Qgd29yc3QgY2FzZSByYXRoZXIgdGhhbiBhIGRvdWJsZSBjb3VudCkuIGBwZXJmb3JtYW5jZS5ub3coKWAgY291bnRzIGFzIHdlbGwgYXNcbiAqICAgYERhdGUubm93KClgOiBhIGBwZXJmb3JtYW5jZWAtd3JpdHRlbiBkZWFkbGluZSByZWFkIGFzIHVuYm91bmRlZCBpcyB3aHkgb25lIDI0NSAwMjUgbXNcbiAqICAgY2xvc3VyZSB3YXMgYWJzZW50IGZyb20gZXZlcnkgcm9zdGVyIHByb2R1Y2VkIGJlZm9yZSB0aGlzLlxuICogLSBBIENPVU5USU5HIGBmb3JgIOKAlCBgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCBBVFRFTVBUUzsgYXR0ZW1wdCsrKWAg4oCUIG11bHRpcGxpZXMgZXZlcnlcbiAqICAgd2FpdCBpbnNpZGUgaXQgYnkgaXRzIGl0ZXJhdGlvbiBjb3VudCwgcmVhZCBmcm9tIHRoZSBsb29wJ3Mgb3duIHN0YXJ0LCBib3VuZCBhbmQgc3RlcC5cbiAqXG4gKiBFaXRoZXIgY2VpbGluZyBtYXkgYmUgT05FIENPTkpVTkNUIG9mIGEgY29tcG91bmQgdGVzdCAoYHdoaWxlIChjb3VudCA8IGV4cGVjdGVkICYmIERhdGUubm93KCkgPCBkZWFkbGluZSlgLFxuICogYGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgQVRURU1QVFMgJiYgIWlzT3BlbjsgYXR0ZW1wdCsrKWApLCB3aGljaCBpcyBob3cgYm90aCBhcmUgYWN0dWFsbHlcbiAqIHdyaXR0ZW46IGEgcHJvZ3Jlc3MgY29uZGl0aW9uIGJlc2lkZSB0aGUgZ3VhcmQgZG9lcyBub3QgcmVtb3ZlIHRoZSBjZWlsaW5nIHRoZSBvdGhlciBjb25qdW5jdCBkZWNsYXJlcy5cbiAqXG4gKiBBbnl0aGluZyBlbHNlIGtlZXBzIHRoZSBvbGQgcGVyLWl0ZXJhdGlvbiBjaGFyZ2UgcmF0aGVyIHRoYW4gYSBndWVzcyDigJQgYHdoaWxlICh0cnVlKWAsIGEgYGZvcuKApm9mYCxcbiAqIGEgYm91bmQgb3IgZGVhZGxpbmUgdGhhdCBkb2VzIG5vdCByZXNvbHZlIOKAlCB3aGljaCBpcyB3aGF0IGtlZXBzIGEgZ2VudWluZWx5IHVuYm91bmRlZCBsb29wIHNpbGVudC5cbiAqXG4gKiBBIEhFTFBFUiBkZWNsYXJlZCBpbnNpZGUgdGhlIGNsb3N1cmUgaXMgY2hhcmdlZCBvbmNlIHBlciBDQUxMIFNJVEUsIHdoaWNoIGlzIGhvdyBtYW55IHRpbWVzIGl0cyB3YWl0aW5nXG4gKiBhY3R1YWxseSBydW5zLiBJdHMgb3duIHdhaXRzIGFyZSBzdW1tZWQgb25jZSBhbmQgbXVsdGlwbGllZCBieSB0aGUgY2FsbHMgdGhhdCByZWFjaCBpdCwgZWFjaCBjYWxsXG4gKiBjYXJyeWluZyB0aGUgY291bnRpbmcgbG9vcHMgaXQgaXMgaXRzZWxmIHdyaXR0ZW4gaW5zaWRlIOKAlCBzbyBhIGxvY2FsIGB3YWl0VW50aWwoY2hlY2spYCBvZlxuICogYGZvciAoYXR0ZW1wdCA8IDQwKSBhd2FpdCBzbGVlcCgyNTApYCBjYWxsZWQgdGhyZWUgdGltZXMgZGVjbGFyZXMgMzAgMDAwIG1zIHJhdGhlciB0aGFuIHRoZSAxMCAwMDAgbXMgYVxuICogc2luZ2xlIGF0dHJpYnV0aW9uIHJlcG9ydGVkLiBUaHJlZSBib3VuZHMga2VlcCB0aGF0IGhvbmVzdDpcbiAqXG4gKiAtIEEgaGVscGVyIGRlY2xhcmVkIE9VVFNJREUgdGhlIGNsb3N1cmUgc3RheXMgb3V0IG9mIHNjb3BlLCBmb3IgdGhlIHNhbWUgcmVhc29uIGEgYnVkZ2V0IGFycml2aW5nIGZyb21cbiAqICAgYSBjYWxsZXIgaXM6IHJlYWRpbmcgaXQgbmVlZHMgYW5hbHlzaXMgYWNyb3NzIGNhbGwgYm91bmRhcmllcywgYW5kIHdpZGVuaW5nIHRoZXJlIHdvdWxkIG1ha2UgZXZlcnlcbiAqICAgbGVnaXRpbWF0ZWx5IHBhcmFtZXRlcml6ZWQgaGVscGVyIGluIGV2ZXJ5IGNvbnN1bWluZyByZXBvIHJlZC5cbiAqIC0gUkVDVVJTSU9OIHRlcm1pbmF0ZXMgYnkgY2hhcmdpbmcgYSByZS1lbnRlcmVkIGhlbHBlciBub3RoaW5nLCBzbyBuZWl0aGVyIGEgc2VsZi1jYWxsIG5vciBhIG11dHVhbGx5XG4gKiAgIHJlY3Vyc2l2ZSBwYWlyIGlzIGNoYXJnZWQgZm9yZXZlci4gQSByZWN1cnNpdmUgY2FsbCBjb250cmlidXRlcyB0aGUgc2lsZW5jZSBhbiB1bmJvdW5kZWQgbG9vcCBkb2VzLlxuICogLSBBIGhlbHBlciB0aGUgY2xvc3VyZSBuZXZlciBSRUFDSEVTIOKAlCBkZWFkLCBvciBjYWxsZWQgdGhyb3VnaCBzb21ldGhpbmcgdGhpcyBydWxlIGNhbm5vdCByZXNvbHZlLCBzdWNoXG4gKiAgIGFzIGEgYmFyZSByZWZlcmVuY2UgaGFuZGVkIHRvIGBmb3JFYWNoYCDigJQga2VlcHMgdGhlIGZsYXQgc2luZ2xlIGNoYXJnZSBpdCBoYXMgYWx3YXlzIGhhZC4gU28gbm9cbiAqICAgY2xvc3VyZSB0aGlzIHJ1bGUgcmVwb3J0cyB0b2RheSBmYWxscyBzaWxlbnQgYmVjYXVzZSBhIGNhbGwgc2l0ZSBjb3VsZCBub3QgYmUgcmVhZC5cbiAqXG4gKiBXaGF0IHRoZSBwZXItY2FsbC1zaXRlIGNvdW50IGRvZXMgTk9UIGZpeCBpcyBhIEJSQU5DSFkgaGVscGVyOiBhbiBgaWZgIC8gYGVsc2VgIGlzIHN1bW1lZCBsZXhpY2FsbHkgbGlrZVxuICogYW55IHR3byBzaWJsaW5nIHdhaXRzLCBzbyBib3RoIGFybXMgYXJlIGNoYXJnZWQgYXQgZXZlcnkgY2FsbCBzaXRlLiBBIGhlbHBlciB3aG9zZSB0d28gZGlyZWN0aW9ucyB3YWl0XG4gKiBkaWZmZXJlbnRseSBpcyB0aGVyZWZvcmUgYmV0dGVyIHdyaXR0ZW4gYXMgdHdvIGhlbHBlcnMsIHdoaWNoIGlzIHdoYXQgdGhpcyByZXBvJ3Mgb3duXG4gKiBgc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvc3ludGF4LWhpZ2hsaWdodGluZy1jb21wb25lbnQub2JzaWRpYW4uaW50ZWdyYXRpb24udGVzdC50c2Agbm93IGRvZXMuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXItY2FwIGNsb3N1cmUgY2FuIGJlY29tZSBhIGBwb2xsYCAvIGB1bnRpbGAgcGFpciwgc28gdGhlIHJ1bGUgaXMgbWVhbnQgdG8gYmVcbiAqIGRpc2FibGVkIOKAlCB3aXRoIGEgcmVhc29uIOKAlCBhdCB0aGUgc2l0ZXMgdGhhdCBoYXZlIG9uZS4gYHJlcXVpcmUtZGVzY3JpcHRpb25gIG1ha2VzIHRoYXRcbiAqIHJlYXNvbiBtYW5kYXRvcnksIHdoaWNoIGlzIHRoZSBwb2ludDogaXQgdHVybnMgYW4gaW52aXNpYmxlIGFzc3VtcHRpb24gaW50byBhIHdyaXR0ZW4gb25lLlxuICpcbiAqIEEgQ0xPU1VSRSBERUxJQkVSQVRFTFkgTEVGVCBVTkRFUiBUSEUgQ0FQIFNBWVMgU08sIGluIGEgY29tbWVudCBvcGVuaW5nIHdpdGggdGhlIGV4YWN0IGxpbmVcbiAqXG4gKiAgICAgVW5kZXIgdGhlIHRyYW5zcG9ydCdzIH4zMHMgcGVyLWNsb3N1cmUgY2FwLCBub3QgYXQgaXQuXG4gKlxuICogYW5kIHRoZW4gc2F5aW5nLCBmb3IgdGhhdCBjbG9zdXJlLCB3aGF0IHRoZSBidWRnZXQgaXMgbWFkZSBvZiBhbmQgd2h5IGl0IHN0YXlzLiBUaGlzIHJ1bGUgaXMgc2lsZW50XG4gKiBvbiBzdWNoIGEgY2xvc3VyZSBieSBjb25zdHJ1Y3Rpb24g4oCUIGl0IGlzIHVuZGVyIHRoZSBjYXAg4oCUIHNvIHdpdGhvdXQgdGhlIGxpbmUgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGxcbiAqIGEgYnVkZ2V0IHNvbWVib2R5IHJlYWQgYW5kIGtlcHQgZnJvbSBvbmUgbm9ib2R5IGhhcyBsb29rZWQgYXQsIGFuZCBhIHN3ZWVwIHJ1biB3aXRoIGEgbG93ZXJcbiAqIGBjYXBJbk1pbGxpc2Vjb25kc2AgcmUtb3BlbnMgdGhlIHNhbWUgZGVjaXNpb25zIGV2ZXJ5IHRpbWUuIFRoZSBsaW5lIGlzIHRoZSB3aG9sZSBvZiB0aGUgY29udmVudGlvbixcbiAqIHdoaWNoIGlzIHdoYXQgbGV0cyBzdWNoIGEgc3dlZXAgc3VidHJhY3QgdGhlIGNsb3N1cmVzIGFscmVhZHkgcmVhZCBhbmQgZHJpdmUgdGhlIHJlbWFpbmRlciB0byB6ZXJvLlxuICpcbiAqIFR3byBwbGFjZW1lbnRzLCBiZWNhdXNlIGEgY2VpbGluZyBsaXZlcyBpbiB0d28gcGxhY2VzLiBBIGNvbW1lbnQgSU5TSURFIHRoZSBjbG9zdXJlLCBvdmVyIHRoYXRcbiAqIGNsb3N1cmUncyBvd24gY2VpbGluZyBjb25zdGFudCwgc3BlYWtzIGZvciB0aGF0IGNsb3N1cmUgYWxvbmU7IG9uZSBhdCBNT0RVTEUgc2NvcGUsIG92ZXIgYSBjb25zdGFudFxuICogdGhlIHdob2xlIGZpbGUgc2hhcmVzLCBzcGVha3MgZm9yIGV2ZXJ5IGNsb3N1cmUgaW4gdGhlIGZpbGUuIEEgY2xvc3VyZSB3aXRoIG5vIGNlaWxpbmcgY29uc3RhbnQgYXRcbiAqIGFsbCDigJQgc2V2ZXJhbCBgd2FpdFVudGlsYCBjYWxscyB0YWtpbmcgdGhlIGRvY3VtZW50ZWQgZGVmYXVsdCDigJQgdGFrZXMgdGhlIGluLWNsb3N1cmUgZm9ybSBhdCB0aGUgdG9wXG4gKiBvZiBpdHMgYm9keS5cbiAqXG4gKiBTYXlpbmcgaXQgaXMgTk9UIHRoZSBzYW1lIGFzIGNsZWFyaW5nIGl0LiBBIGJ1ZGdldCB1bmRlciB0aGUgY2FwIGlzIG5vdCBhIGRlZmVjdCwgYW5kIFwicmVhZCwgYW5kIGxlZnRcbiAqIGFzIGl0IGlzXCIgaXMgYSBjb3JyZWN0IG91dGNvbWU6IHRpZ2h0ZW5pbmcgYSBjZWlsaW5nIHRvIGJyaW5nIGEgbnVtYmVyIGRvd24gaXMgaG93IGEgc3VpdGUgc3RhcnRzXG4gKiBmYWlsaW5nIGxlZ2l0aW1hdGVseSBvbiBhIGNvbGQgbWFjaGluZS5cbiAqL1xuaW1wb3J0IHR5cGUgeyBUU0VTVHJlZSB9IGZyb20gJ0B0eXBlc2NyaXB0LWVzbGludC91dGlscyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJ1bGUsXG4gIFNjb3BlXG59IGZyb20gJ2VzbGludCc7XG5cbmltcG9ydCB7IHRvVFNFU1RyZWVOb2RlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvbGludGVycy9lc2xpbnQtcnVsZXMvdHMtZXN0cmVlLW5vZGUnO1xuaW1wb3J0IHsgREVGQVVMVF9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFMgfSBmcm9tICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJztcblxuaW1wb3J0IHtcbiAgREVTS1RPUF9QRVJGT1JNQU5DRV9URVNUX0ZJTEVfU1VGRklYLFxuICBQRVJGT1JNQU5DRV9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFNcbn0gZnJvbSAnLi4vLi4vdGVzdC1ydW5uZXJzL3BlcmZvcm1hbmNlLWV2YWwtY2FwLnRzJztcblxuLyoqXG4gKiBNZXNzYWdlIElEIHJlcG9ydGVkIHdoZW4gYW4gaW4tT2JzaWRpYW4gY2xvc3VyZSBkZWNsYXJlcyBtb3JlIHdhaXRpbmcgdGhhbiB0aGUgdHJhbnNwb3J0J3MgY2FwIGFsbG93cy5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FU1NBR0VfSUQgPSAnbm9PdmVyQ2FwV2FpdEluRXZhbEluT2JzaWRpYW4nO1xuXG4vKipcbiAqIFRoZSBidWRnZXQgYSBgd2FpdFVudGlsYCB0YWtlcyB3aGVuIGl0IG9taXRzIGB0aW1lb3V0SW5NaWxsaXNlY29uZHNgLCBwZXIgYFdhaXRVbnRpbFBhcmFtc2AuXG4gKi9cbmNvbnN0IFdBSVRfVU5USUxfREVGQVVMVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbmNvbnN0IElOUFVUX1BST1BFUlRZX05BTUUgPSAnaW5wdXQnO1xuY29uc3QgU0xFRVBfQ0FMTEVFX05BTUUgPSAnc2xlZXAnO1xuY29uc3QgVElNRU9VVF9QUk9QRVJUWV9OQU1FID0gJ3RpbWVvdXRJbk1pbGxpc2Vjb25kcyc7XG5jb25zdCBXQUlUX1VOVElMX0NBTExFRV9OQU1FID0gJ3dhaXRVbnRpbCc7XG5cbi8qKlxuICogVGhlIGNsb2NrcyBhIGRlYWRsaW5lIG1heSBiZSB0YWtlbiBmcm9tLiBCb3RoIG9jY3VyIGluIHRoZXNlIHN1aXRlcywgYW5kIGEgcnVsZSB0aGF0IGtuZXcgb25seSBgRGF0ZWBcbiAqIHJlYWQgZXZlcnkgYHBlcmZvcm1hbmNlYC13cml0dGVuIGRlYWRsaW5lIGFzIHVuYm91bmRlZC5cbiAqL1xuY29uc3QgQ0xPQ0tfT0JKRUNUX05BTUVTID0gbmV3IFNldChbJ0RhdGUnLCAncGVyZm9ybWFuY2UnXSk7XG5cbmNvbnN0IE5PV19NRVRIT0RfTkFNRSA9ICdub3cnO1xuXG4vKipcbiAqIFdoaWNoIHByb3BlcnRpZXMgb2YgZWFjaCBoZWxwZXIncyBwYXJhbWV0ZXIgb2JqZWN0IGhvbGQgYSBjbG9zdXJlIHRoYXQgcnVucyBJTlNJREUgT2JzaWRpYW4sIGFuZCBpc1xuICogdGhlcmVmb3JlIHN1YmplY3QgdG8gdGhlIGNhcC4gYHBvbGxJbk9ic2lkaWFuYCdzIGB1bnRpbGAgaXMgZGVsaWJlcmF0ZWx5IGFic2VudDogaXQgaXMgZXZhbHVhdGVkIGluXG4gKiBOb2RlLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mIGNvbnZlcnRpbmcgdG8gaXQuXG4gKi9cbmNvbnN0IENMT1NVUkVfTkFNRVNfQllfQ0FMTEVFX05BTUUgPSBuZXcgTWFwPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+KFtcbiAgWydldmFsSW5PYnNpZGlhbicsIFsnY2FsbGJhY2snXV0sXG4gIFsncG9sbEluT2JzaWRpYW4nLCBbJ3BvbGwnLCAnc3RhcnQnXV1cbl0pO1xuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgb25lIGZpbGUgYWNjdW11bGF0ZWQsIGtleWVkIGJ5IHRoZSBmdW5jdGlvbiBlYWNoIGNoYXJnZSB3YXMgd3JpdHRlbiBpbnNpZGUuXG4gKlxuICogQSB3YWl0IGlzIGNoYXJnZWQgdG8gdGhlIGlubmVybW9zdCBmdW5jdGlvbiBpdCBpcyB3cml0dGVuIGluIHJhdGhlciB0aGFuIHN0cmFpZ2h0IHRvIHRoZSBjbG9zdXJlLCBhbmQgYVxuICogY2FsbCB0byBhIGhlbHBlciB0aGUgY2xvc3VyZSBkZWNsYXJlcyBpcyByZWNvcmRlZCBhcyBhbiBlZGdlLCBzbyBhIGNsb3N1cmUncyB0b3RhbCBpcyBpdHMgb3duIHdhaXRpbmdcbiAqIHBsdXMgZWFjaCBoZWxwZXIncyB3YWl0aW5nIG11bHRpcGxpZWQgYnkgdGhlIGNhbGxzIHRoYXQgYWN0dWFsbHkgcmVhY2ggaXQuXG4gKi9cbmludGVyZmFjZSBDYWxsR3JhcGgge1xuICAvKipcbiAgICogSG93IG1hbnkgdGltZXMgZWFjaCBmdW5jdGlvbiBjYWxscyBlYWNoIGhlbHBlciBkZWNsYXJlZCBpbnNpZGUgdGhlIHNhbWUgY2xvc3VyZS5cbiAgICovXG4gIHJlYWRvbmx5IGNhbGxDb3VudEJ5Q2FsbGVlTm9kZUJ5Q2FsbGVyTm9kZTogTWFwPEhlbHBlckZ1bmN0aW9uLCBNYXA8SGVscGVyRnVuY3Rpb24sIG51bWJlcj4+O1xuXG4gIC8qKlxuICAgKiBUaGUgY2xvc3VyZXMgc2VlbiBzbyBmYXIsIGJ5IHRoZSBmdW5jdGlvbiBub2RlIGVhY2ggb25lIGlzIHdyaXR0ZW4gYXMuXG4gICAqL1xuICByZWFkb25seSBzdGF0ZUJ5Q2xvc3VyZU5vZGU6IE1hcDxDbG9zdXJlRnVuY3Rpb24sIENsb3N1cmVTdGF0ZT47XG5cbiAgLyoqXG4gICAqIFRoZSB3YWl0aW5nIHdyaXR0ZW4gRElSRUNUTFkgaW5zaWRlIGVhY2ggZnVuY3Rpb24sIGV4Y2x1ZGluZyB3aGF0ZXZlciB0aGUgaGVscGVycyBpdCBjYWxscyBkZWNsYXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgd2FpdEluTWlsbGlzZWNvbmRzQnlGdW5jdGlvbk5vZGU6IE1hcDxIZWxwZXJGdW5jdGlvbiwgbnVtYmVyPjtcbn1cblxuLyoqXG4gKiBUaGUgcnVsZSdzIHNpbmdsZSBvcHRpb24gb2JqZWN0LlxuICovXG5pbnRlcmZhY2UgQ2FwT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYnVkZ2V0IGF0IG9yIG92ZXIgd2hpY2ggYSBjbG9zdXJlIGlzIHJlcG9ydGVkLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBjYXBJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gYSBjaGFyZ2UgaXMgYXR0cmlidXRlZCB0bywgdG9nZXRoZXIgd2l0aCB0aGUgaW4tT2JzaWRpYW4gY2xvc3VyZSBpdCB1bHRpbWF0ZWx5IHJ1bnMgaW5zaWRlLlxuICovXG5pbnRlcmZhY2UgQ2hhcmdlVGFyZ2V0IHtcbiAgLyoqXG4gICAqIFRoZSBjbG9zdXJlIHRoZSBjaGFyZ2UgcnVucyBpbnNpZGUsIGNhcnJpZWQgc28gYSBidWRnZXQgdGhyZWFkZWQgdGhyb3VnaCBpdHMgY2FsbCBzdGlsbCByZXNvbHZlcy5cbiAgICovXG4gIHJlYWRvbmx5IGNsb3N1cmU6IEV2YWxDbG9zdXJlO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5uZXJtb3N0IGZ1bmN0aW9uIHRoZSBjaGFyZ2UgaXMgd3JpdHRlbiBpbjogdGhlIGNsb3N1cmUgaXRzZWxmLCBvciBhIGhlbHBlciBkZWNsYXJlZCB3aXRoaW4gaXQuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk5vZGU6IEhlbHBlckZ1bmN0aW9uO1xufVxuXG4vKipcbiAqIEEgZnVuY3Rpb24gd3JpdHRlbiBhcyBhbiBvYmplY3QgcHJvcGVydHksIHdoaWNoIGlzIHRoZSBvbmx5IGZvcm0gZWl0aGVyIGhlbHBlcidzIGNsb3N1cmVzIHRha2UuXG4gKi9cbnR5cGUgQ2xvc3VyZUZ1bmN0aW9uID0gVFNFU1RyZWUuQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24gfCBUU0VTVHJlZS5GdW5jdGlvbkV4cHJlc3Npb247XG5cbi8qKlxuICogT25lIGluLU9ic2lkaWFuIGNsb3N1cmUncyBhY2N1bXVsYXRlZCBjaGFyZ2VzLlxuICovXG5pbnRlcmZhY2UgQ2xvc3VyZVN0YXRlIHtcbiAgLyoqXG4gICAqIFRoZSBjbG9zdXJlJ3Mgb3duIGZ1bmN0aW9uIG5vZGUsIHRoZSByb290IGV2ZXJ5IHJlYWNoYWJsZSBoZWxwZXIgaXMgY291bnRlZCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgY2xvc3VyZU5vZGU6IENsb3N1cmVGdW5jdGlvbjtcblxuICAvKipcbiAgICogRXZlcnkgZnVuY3Rpb24gY2hhcmdlZCBpbnNpZGUgdGhpcyBjbG9zdXJlOiB0aGUgY2xvc3VyZSBpdHNlbGYsIGFuZCBlYWNoIGhlbHBlciBpdCBkZWNsYXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uTm9kZXM6IFNldDxIZWxwZXJGdW5jdGlvbj47XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSB0aGUgY2xvc3VyZSBpcyB3cml0dGVuIGFzLCByZXBvcnRlZCBvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG9ydE5vZGU6IFRTRVNUcmVlLk5vZGU7XG59XG5cbi8qKlxuICogQW4gaW4tT2JzaWRpYW4gY2xvc3VyZSwgdG9nZXRoZXIgd2l0aCB0aGUgY2FsbCBpdCBiZWxvbmdzIHRvIChuZWVkZWQgdG8gcmVzb2x2ZSBhIGJ1ZGdldCB0aHJlYWRlZFxuICogdGhyb3VnaCB0aGF0IGNhbGwncyBgaW5wdXRgKSBhbmQgdGhlIG5vZGUgdG8gcmVwb3J0IG9uLlxuICovXG5pbnRlcmZhY2UgRXZhbENsb3N1cmUge1xuICAvKipcbiAgICogVGhlIGNsb3N1cmUncyBmdW5jdGlvbiBub2RlLCB3aGljaCBpZGVudGlmaWVzIHRoZSBjbG9zdXJlIGFjcm9zcyBzaWJsaW5nIHdhaXRzIGFuZCBjYXJyaWVzIHRoZVxuICAgKiBwYXJhbWV0ZXIgcGF0dGVybiBhIGJ1ZGdldCB0aHJlYWRlZCB0aHJvdWdoIGBpbnB1dGAgaXMgZGVzdHJ1Y3R1cmVkIGJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgY2xvc3VyZU5vZGU6IENsb3N1cmVGdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIGhlbHBlcidzIHBhcmFtZXRlciBvYmplY3QsIGNhcnJpZWQgc28gYSBidWRnZXQgdGhyZWFkZWQgdGhyb3VnaCBgaW5wdXRgIGlzIHJlYWQgZnJvbSB0aGUgb2JqZWN0XG4gICAqIHRoZSBjbG9zdXJlIHdhcyBhbHJlYWR5IGZvdW5kIGluIHJhdGhlciB0aGFuIHJlLWRlcml2ZWQgZnJvbSB0aGUgY2FsbC5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtc05vZGU6IFRTRVNUcmVlLk9iamVjdEV4cHJlc3Npb247XG5cbiAgLyoqXG4gICAqIFRoZSBwcm9wZXJ0eSB0aGUgY2xvc3VyZSBpcyB3cml0dGVuIGFzLCByZXBvcnRlZCBvbiBzbyB0aGUgbWVzc2FnZSBwb2ludHMgYXQgYGNhbGxiYWNrYCAvIGBwb2xsYFxuICAgKiByYXRoZXIgdGhhbiBhdCB3aGljaGV2ZXIgd2FpdCBoYXBwZW5lZCB0byBjb21lIGZpcnN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3J0Tm9kZTogVFNFU1RyZWUuTm9kZTtcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHdhaXRpbmcgY2FuIGJlIGNoYXJnZWQgdG86IGFuIGluLU9ic2lkaWFuIGNsb3N1cmUsIG9yIGEgaGVscGVyIGRlY2xhcmVkIGluc2lkZSBvbmUg4oCUIHdoaWNoIGFcbiAqIGBmdW5jdGlvbmAgZGVjbGFyYXRpb24gaXMgYXMgcmVhZGlseSBhcyBhbiBhcnJvdyBvciBhIGZ1bmN0aW9uIGV4cHJlc3Npb24uXG4gKi9cbnR5cGUgSGVscGVyRnVuY3Rpb24gPSBDbG9zdXJlRnVuY3Rpb24gfCBUU0VTVHJlZS5GdW5jdGlvbkRlY2xhcmF0aW9uO1xuXG4vKipcbiAqIEEgbG9vcCB3aG9zZSBvd24gdGVzdCBjYW4gZGVjbGFyZSBhIGNlaWxpbmcuIGBmb3LigKZvZmAgLyBgZm9y4oCmaW5gIGFyZSBkZWxpYmVyYXRlbHkgYWJzZW50OiBuZWl0aGVyXG4gKiBkZWNsYXJlcyBvbmUgc3RhdGljYWxseSwgc28gYm90aCBrZWVwIHRoZSBwZXItaXRlcmF0aW9uIGNoYXJnZSBldmVyeSB1bnNpemVkIGxvb3AgZ2V0cy5cbiAqL1xudHlwZSBMb29wU3RhdGVtZW50ID0gVFNFU1RyZWUuRG9XaGlsZVN0YXRlbWVudCB8IFRTRVNUcmVlLkZvclN0YXRlbWVudCB8IFRTRVNUcmVlLldoaWxlU3RhdGVtZW50O1xuXG4vKipcbiAqIEVTTGludCBydWxlIGRpc2FsbG93aW5nIGFuIGluLU9ic2lkaWFuIGNsb3N1cmUgd2hvc2UgZGVjbGFyZWQgd2FpdGluZyBleGNlZWRzIHRoZSB0cmFuc3BvcnQncyBzY3JpcHQtdGltZW91dCBjYXAuXG4gKi9cbmV4cG9ydCBjb25zdCBub092ZXJDYXBXYWl0SW5FdmFsSW5PYnNpZGlhbjogUnVsZS5SdWxlTW9kdWxlID0ge1xuICBjcmVhdGUoY29udGV4dCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBjb250ZXh0Lm9wdGlvbnNbMF0gYXMgQ2FwT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZWZhdWx0Q2FwSW5NaWxsaXNlY29uZHMgPSBjb250ZXh0LmZpbGVuYW1lLmVuZHNXaXRoKERFU0tUT1BfUEVSRk9STUFOQ0VfVEVTVF9GSUxFX1NVRkZJWClcbiAgICAgID8gUEVSRk9STUFOQ0VfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTXG4gICAgICA6IERFRkFVTFRfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTO1xuICAgIGNvbnN0IGNhcEluTWlsbGlzZWNvbmRzID0gb3B0aW9ucz8uY2FwSW5NaWxsaXNlY29uZHMgPz8gZGVmYXVsdENhcEluTWlsbGlzZWNvbmRzO1xuICAgIGNvbnN0IGNhbGxHcmFwaDogQ2FsbEdyYXBoID0ge1xuICAgICAgY2FsbENvdW50QnlDYWxsZWVOb2RlQnlDYWxsZXJOb2RlOiBuZXcgTWFwPEhlbHBlckZ1bmN0aW9uLCBNYXA8SGVscGVyRnVuY3Rpb24sIG51bWJlcj4+KCksXG4gICAgICBzdGF0ZUJ5Q2xvc3VyZU5vZGU6IG5ldyBNYXA8Q2xvc3VyZUZ1bmN0aW9uLCBDbG9zdXJlU3RhdGU+KCksXG4gICAgICB3YWl0SW5NaWxsaXNlY29uZHNCeUZ1bmN0aW9uTm9kZTogbmV3IE1hcDxIZWxwZXJGdW5jdGlvbiwgbnVtYmVyPigpXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlY29yZHMgdGhhdCBvbmUgZnVuY3Rpb24gY2FsbHMgYSBoZWxwZXIgZGVjbGFyZWQgaW5zaWRlIHRoZSBzYW1lIGNsb3N1cmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGZ1bmN0aW9uIHRoZSBjYWxsIGlzIHdyaXR0ZW4gaW4uXG4gICAgICogQHBhcmFtIGNhbGxlZU5vZGUgLSBUaGUgaGVscGVyIGJlaW5nIGNhbGxlZC5cbiAgICAgKiBAcGFyYW0gY2FsbENvdW50IC0gSG93IG1hbnkgdGltZXMgdGhlIGNhbGwgcnVucywgYXMgdGhlIHByb2R1Y3Qgb2YgaXRzIGVuY2xvc2luZyBjb3VudGluZyBsb29wcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGRDYWxsKHRhcmdldDogQ2hhcmdlVGFyZ2V0LCBjYWxsZWVOb2RlOiBIZWxwZXJGdW5jdGlvbiwgY2FsbENvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gcmVhZENsb3N1cmVTdGF0ZSh0YXJnZXQpO1xuICAgICAgc3RhdGUuZnVuY3Rpb25Ob2Rlcy5hZGQoY2FsbGVlTm9kZSk7XG5cbiAgICAgIGNvbnN0IGNhbGxDb3VudEJ5Q2FsbGVlTm9kZSA9IGNhbGxHcmFwaC5jYWxsQ291bnRCeUNhbGxlZU5vZGVCeUNhbGxlck5vZGUuZ2V0KHRhcmdldC5mdW5jdGlvbk5vZGUpXG4gICAgICAgID8/IG5ldyBNYXA8SGVscGVyRnVuY3Rpb24sIG51bWJlcj4oKTtcbiAgICAgIGNhbGxHcmFwaC5jYWxsQ291bnRCeUNhbGxlZU5vZGVCeUNhbGxlck5vZGUuc2V0KHRhcmdldC5mdW5jdGlvbk5vZGUsIGNhbGxDb3VudEJ5Q2FsbGVlTm9kZSk7XG4gICAgICBjYWxsQ291bnRCeUNhbGxlZU5vZGUuc2V0KGNhbGxlZU5vZGUsIChjYWxsQ291bnRCeUNhbGxlZU5vZGUuZ2V0KGNhbGxlZU5vZGUpID8/IDApICsgY2FsbENvdW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIHdhaXRpbmcgdG8gdGhlIHJ1bm5pbmcgdG90YWwgb2YgdGhlIGZ1bmN0aW9uIGl0IHdhcyB3cml0dGVuIGluLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldCAtIFRoZSBmdW5jdGlvbiB0byBjaGFyZ2UuXG4gICAgICogQHBhcmFtIHdhaXRJbk1pbGxpc2Vjb25kcyAtIFRoZSB3YWl0aW5nIHRvIGFkZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGRXYWl0KHRhcmdldDogQ2hhcmdlVGFyZ2V0LCB3YWl0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgICAgcmVhZENsb3N1cmVTdGF0ZSh0YXJnZXQpO1xuICAgICAgY29uc3QgcnVubmluZ1RvdGFsSW5NaWxsaXNlY29uZHMgPSBjYWxsR3JhcGgud2FpdEluTWlsbGlzZWNvbmRzQnlGdW5jdGlvbk5vZGUuZ2V0KHRhcmdldC5mdW5jdGlvbk5vZGUpID8/IDA7XG4gICAgICBjYWxsR3JhcGgud2FpdEluTWlsbGlzZWNvbmRzQnlGdW5jdGlvbk5vZGUuc2V0KHRhcmdldC5mdW5jdGlvbk5vZGUsIHJ1bm5pbmdUb3RhbEluTWlsbGlzZWNvbmRzICsgd2FpdEluTWlsbGlzZWNvbmRzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWNvcmRzIGEgY2FsbCB0byBhIGhlbHBlciB0aGUgY2xvc3VyZSBkZWNsYXJlcywgc28gaXRzIHdhaXRpbmcgaXMgY291bnRlZCBvbmNlIHBlciBjYWxsIHNpdGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FsbE5vZGUgLSBUaGUgY2FsbCBleHByZXNzaW9uLlxuICAgICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgZnVuY3Rpb24gdGhlIGNhbGwgaXMgd3JpdHRlbiBpbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGFyZ2VIZWxwZXJDYWxsKGNhbGxOb2RlOiBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbiwgdGFyZ2V0OiBDaGFyZ2VUYXJnZXQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGhlbHBlck5vZGUgPSByZWFkQ2FsbGVkSGVscGVyTm9kZShjYWxsTm9kZSwgdGFyZ2V0LmNsb3N1cmUsIGNvbnRleHQpO1xuICAgICAgaWYgKCFoZWxwZXJOb2RlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYWRkQ2FsbCh0YXJnZXQsIGhlbHBlck5vZGUsIHJlYWRMb29wTXVsdGlwbGllcihjYWxsTm9kZSwgdGFyZ2V0LCBjb250ZXh0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhcmdlcyBhIGRlYWRsaW5lLWJvdW5kZWQgbG9vcCBpdHMgd2hvbGUgZGVhZGxpbmUsIG9uY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSAtIFRoZSBsb29wIHN0YXRlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGFyZ2VMb29wRGVhZGxpbmUobm9kZTogUnVsZS5Ob2RlKTogdm9pZCB7XG4gICAgICBjb25zdCBsb29wTm9kZSA9IHRvVFNFU1RyZWVOb2RlKG5vZGUpIGFzIExvb3BTdGF0ZW1lbnQ7XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IGZpbmRDaGFyZ2VUYXJnZXQobG9vcE5vZGUpO1xuICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWFkbGluZUluTWlsbGlzZWNvbmRzID0gcmVhZExvb3BEZWFkbGluZUluTWlsbGlzZWNvbmRzKGxvb3BOb2RlLCB0YXJnZXQuY2xvc3VyZSwgY29udGV4dCk7XG4gICAgICBpZiAoZGVhZGxpbmVJbk1pbGxpc2Vjb25kcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFkZFdhaXQodGFyZ2V0LCBkZWFkbGluZUluTWlsbGlzZWNvbmRzICogcmVhZExvb3BNdWx0aXBsaWVyKGxvb3BOb2RlLCB0YXJnZXQsIGNvbnRleHQpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFyZ2VzIGEgd2FpdCBjYWxsIHRoZSBidWRnZXQgaXQgZGVjbGFyZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FsbE5vZGUgLSBUaGUgY2FsbCBleHByZXNzaW9uLlxuICAgICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgZnVuY3Rpb24gdGhlIGNhbGwgaXMgd3JpdHRlbiBpbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGFyZ2VXYWl0Q2FsbChjYWxsTm9kZTogVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb24sIHRhcmdldDogQ2hhcmdlVGFyZ2V0KTogdm9pZCB7XG4gICAgICBjb25zdCBidWRnZXRFeHByZXNzaW9uID0gcmVhZFdhaXRCdWRnZXRFeHByZXNzaW9uKGNhbGxOb2RlKTtcbiAgICAgIGlmIChidWRnZXRFeHByZXNzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3YWl0SW5NaWxsaXNlY29uZHMgPSBidWRnZXRFeHByZXNzaW9uID09PSBudWxsXG4gICAgICAgID8gV0FJVF9VTlRJTF9ERUZBVUxUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgICAgIDogcmVzb2x2ZU51bWJlcihidWRnZXRFeHByZXNzaW9uLCB0YXJnZXQuY2xvc3VyZSwgY29udGV4dCk7XG4gICAgICBpZiAod2FpdEluTWlsbGlzZWNvbmRzID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYWRkV2FpdCh0YXJnZXQsIHdhaXRJbk1pbGxpc2Vjb25kcyAqIHJlYWRMb29wTXVsdGlwbGllcihjYWxsTm9kZSwgdGFyZ2V0LCBjb250ZXh0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIHRoZSBjbG9zdXJlIGEgY2hhcmdlIGJlbG9uZ3MgdG8sIGFuZCB0aGUgZnVuY3Rpb24gdGhlIGNoYXJnZSB3YXMgd3JpdHRlbiBpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgZnVuY3Rpb24gYmVpbmcgY2hhcmdlZC5cbiAgICAgKiBAcmV0dXJucyBUaGF0IGNsb3N1cmUncyBhY2N1bXVsYXRlZCBzdGF0ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWFkQ2xvc3VyZVN0YXRlKHRhcmdldDogQ2hhcmdlVGFyZ2V0KTogQ2xvc3VyZVN0YXRlIHtcbiAgICAgIGNvbnN0IHN0YXRlID0gY2FsbEdyYXBoLnN0YXRlQnlDbG9zdXJlTm9kZS5nZXQodGFyZ2V0LmNsb3N1cmUuY2xvc3VyZU5vZGUpID8/IHtcbiAgICAgICAgY2xvc3VyZU5vZGU6IHRhcmdldC5jbG9zdXJlLmNsb3N1cmVOb2RlLFxuICAgICAgICBmdW5jdGlvbk5vZGVzOiBuZXcgU2V0PEhlbHBlckZ1bmN0aW9uPigpLFxuICAgICAgICByZXBvcnROb2RlOiB0YXJnZXQuY2xvc3VyZS5yZXBvcnROb2RlXG4gICAgICB9O1xuICAgICAgY2FsbEdyYXBoLnN0YXRlQnlDbG9zdXJlTm9kZS5zZXQodGFyZ2V0LmNsb3N1cmUuY2xvc3VyZU5vZGUsIHN0YXRlKTtcbiAgICAgIHN0YXRlLmZ1bmN0aW9uTm9kZXMuYWRkKHRhcmdldC5mdW5jdGlvbk5vZGUpO1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAnQ2FsbEV4cHJlc3Npb24nKG5vZGU6IFJ1bGUuTm9kZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBjYWxsTm9kZSA9IHRvVFNFU1RyZWVOb2RlKG5vZGUpIGFzIFRTRVNUcmVlLkNhbGxFeHByZXNzaW9uO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGZpbmRDaGFyZ2VUYXJnZXQoY2FsbE5vZGUpO1xuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNoYXJnZVdhaXRDYWxsKGNhbGxOb2RlLCB0YXJnZXQpO1xuICAgICAgICBjaGFyZ2VIZWxwZXJDYWxsKGNhbGxOb2RlLCB0YXJnZXQpO1xuICAgICAgfSxcbiAgICAgIERvV2hpbGVTdGF0ZW1lbnQ6IGNoYXJnZUxvb3BEZWFkbGluZSxcbiAgICAgIEZvclN0YXRlbWVudDogY2hhcmdlTG9vcERlYWRsaW5lLFxuICAgICAgJ1Byb2dyYW06ZXhpdCcoKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgY2FsbEdyYXBoLnN0YXRlQnlDbG9zdXJlTm9kZS52YWx1ZXMoKSkge1xuICAgICAgICAgIGNvbnN0IHRvdGFsSW5NaWxsaXNlY29uZHMgPSByZWFkQ2xvc3VyZVdhaXRJbk1pbGxpc2Vjb25kcyhzdGF0ZSwgY2FsbEdyYXBoKTtcbiAgICAgICAgICBpZiAodG90YWxJbk1pbGxpc2Vjb25kcyA8IGNhcEluTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGNhcEluTWlsbGlzZWNvbmRzOiBTdHJpbmcoY2FwSW5NaWxsaXNlY29uZHMpLFxuICAgICAgICAgICAgICB0b3RhbEluTWlsbGlzZWNvbmRzOiBTdHJpbmcodG90YWxJbk1pbGxpc2Vjb25kcylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXNzYWdlSWQ6IE1FU1NBR0VfSUQsXG4gICAgICAgICAgICBub2RlOiBzdGF0ZS5yZXBvcnROb2RlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBXaGlsZVN0YXRlbWVudDogY2hhcmdlTG9vcERlYWRsaW5lXG4gICAgfTtcbiAgfSxcbiAgbWV0YToge1xuICAgIGRvY3M6IHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGlzYWxsb3cgYW4gaW4tT2JzaWRpYW4gY2xvc3VyZSBkZWNsYXJpbmcgbW9yZSB3YWl0aW5nIHRoYW4gdGhlIHRyYW5zcG9ydFxcJ3Mgc2NyaXB0LXRpbWVvdXQgY2FwIGFsbG93cydcbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICBbTUVTU0FHRV9JRF06ICdUaGlzIGNsb3N1cmUgZGVjbGFyZXMge3sgdG90YWxJbk1pbGxpc2Vjb25kcyB9fSBtcyBvZiB3YWl0aW5nLCBhdCBvciBvdmVyIHRoZSB0cmFuc3BvcnRcXCdzIHt7IGNhcEluTWlsbGlzZWNvbmRzIH19IG1zIGNhcCwgc28gaXQgY2FuIG9ubHkgZXZlciBkaWUgYXMgYSBiYXJlIGBzY3JpcHQgdGltZW91dGA6IHdhaXQgaW4gTm9kZSBpbnN0ZWFkLCB3aXRoIGEgc2hvcnQgRE9NLXJlYWRpbmcgYHBvbGxJbk9ic2lkaWFuYCBgcG9sbGAsIGFuIGB1bnRpbGAgZXZhbHVhdGVkIGluIE5vZGUsIGFuZCB0aGUgbG9uZyBidWRnZXQgaW4gYHRpbWVvdXRJbk1pbGxpc2Vjb25kc2AuJ1xuICAgIH0sXG4gICAgc2NoZW1hOiBbe1xuICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBjYXBJbk1pbGxpc2Vjb25kczoge1xuICAgICAgICAgIG1pbmltdW06IDEsXG4gICAgICAgICAgdHlwZTogJ2ludGVnZXInXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0eXBlOiAnb2JqZWN0J1xuICAgIH1dLFxuICAgIHR5cGU6ICdwcm9ibGVtJ1xuICB9XG59O1xuXG4vKipcbiAqIENvbGxlY3RzIGV2ZXJ5IGhlbHBlciByZWFjaGFibGUgZnJvbSBhIGZ1bmN0aW9uIGJ5IGZvbGxvd2luZyB0aGUgY2FsbHMgcmVjb3JkZWQgZm9yIGl0cyBjbG9zdXJlLlxuICpcbiAqIEEgaGVscGVyIE5PVCBpbiB0aGUgYW5zd2VyIGlzIG9uZSBubyBjYWxsIHNpdGUgY2FuIHJlYWNoLCB3aGljaCBpcyB3aGF0IHRoZSBmbGF0IGZhbGxiYWNrIGNoYXJnZSBpc1xuICoga2V5ZWQgb2ZmOiBpdCBpcyBlaXRoZXIgZGVhZCwgb3IgY2FsbGVkIHRocm91Z2ggc29tZXRoaW5nIHRoaXMgcnVsZSBjYW5ub3QgcmVhZC5cbiAqXG4gKiBAcGFyYW0gZnVuY3Rpb25Ob2RlIC0gVGhlIGZ1bmN0aW9uIHRvIHN0YXJ0IGZyb20uXG4gKiBAcGFyYW0gY2FsbEdyYXBoIC0gVGhlIGZpbGUncyBhY2N1bXVsYXRlZCBjaGFyZ2VzLlxuICogQHBhcmFtIHJlYWNoYWJsZU5vZGVzIC0gVGhlIHNldCB0byBjb2xsZWN0IGludG8sIHdoaWNoIGRvdWJsZXMgYXMgdGhlIHZpc2l0ZWQgc2V0LlxuICovXG5mdW5jdGlvbiBjb2xsZWN0UmVhY2hhYmxlRnVuY3Rpb25Ob2RlcyhmdW5jdGlvbk5vZGU6IEhlbHBlckZ1bmN0aW9uLCBjYWxsR3JhcGg6IENhbGxHcmFwaCwgcmVhY2hhYmxlTm9kZXM6IFNldDxIZWxwZXJGdW5jdGlvbj4pOiB2b2lkIHtcbiAgaWYgKHJlYWNoYWJsZU5vZGVzLmhhcyhmdW5jdGlvbk5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVhY2hhYmxlTm9kZXMuYWRkKGZ1bmN0aW9uTm9kZSk7XG5cbiAgZm9yIChjb25zdCBjYWxsZWVOb2RlIG9mIGNhbGxHcmFwaC5jYWxsQ291bnRCeUNhbGxlZU5vZGVCeUNhbGxlck5vZGUuZ2V0KGZ1bmN0aW9uTm9kZSk/LmtleXMoKSA/PyBbXSkge1xuICAgIGNvbGxlY3RSZWFjaGFibGVGdW5jdGlvbk5vZGVzKGNhbGxlZU5vZGUsIGNhbGxHcmFwaCwgcmVhY2hhYmxlTm9kZXMpO1xuICB9XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGZ1bmN0aW9uIGEgbm9kZSdzIHdhaXRpbmcgaXMgY2hhcmdlZCB0bywgd2Fsa2luZyBvdXR3YXJkcy5cbiAqXG4gKiBUaGUgd2FsayBkb2VzIG5vdCBzdG9wIGF0IHRoZSBmaXJzdCBlbmNsb3NpbmcgZnVuY3Rpb246IGEgd2FpdCBpbnNpZGUgYSBoZWxwZXIgZGVjbGFyZWQgd2l0aGluIHRoZVxuICogY2FsbGJhY2sgc3RpbGwgcnVucyBpbnNpZGUgdGhlIGNhbGxiYWNrLCBzbyBpdCBrZWVwcyBnb2luZyB1bnRpbCBpdCByZWFjaGVzIGEgZnVuY3Rpb24gdGhhdCBJUyBvbmUgb2ZcbiAqIHRoZSBoZWxwZXIncyBpbi1PYnNpZGlhbiBjbG9zdXJlcy4gV2hhdCBpdCBSRU1FTUJFUlMgb24gdGhlIHdheSBpcyB0aGUgaW5uZXJtb3N0IGZ1bmN0aW9uIGl0IHBhc3NlZCwgc29cbiAqIGEgaGVscGVyJ3Mgd2FpdGluZyBpcyBhY2N1bXVsYXRlZCBhZ2FpbnN0IHRoZSBoZWxwZXIgYW5kIGNoYXJnZWQgdG8gdGhlIGNsb3N1cmUgb25jZSBwZXIgY2FsbCBzaXRlLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gc3RhcnQgZnJvbS5cbiAqIEByZXR1cm5zIFRoZSBjaGFyZ2UgdGFyZ2V0LCBvciBgbnVsbGAgd2hlbiB0aGUgbm9kZSBkb2VzIG5vdCBydW4gaW5zaWRlIGFuIGluLU9ic2lkaWFuIGNsb3N1cmUuXG4gKi9cbmZ1bmN0aW9uIGZpbmRDaGFyZ2VUYXJnZXQobm9kZTogVFNFU1RyZWUuTm9kZSk6IENoYXJnZVRhcmdldCB8IG51bGwge1xuICBsZXQgaW5uZXJtb3N0RnVuY3Rpb25Ob2RlOiBIZWxwZXJGdW5jdGlvbiB8IHVuZGVmaW5lZDtcbiAgbGV0IGN1cnJlbnROb2RlOiBUU0VTVHJlZS5Ob2RlIHwgdW5kZWZpbmVkID0gbm9kZS5wYXJlbnQ7XG5cbiAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XG4gICAgY29uc3QgY2xvc3VyZSA9IHJlYWRFdmFsQ2xvc3VyZShjdXJyZW50Tm9kZSk7XG4gICAgaWYgKGNsb3N1cmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsb3N1cmUsXG4gICAgICAgIGZ1bmN0aW9uTm9kZTogaW5uZXJtb3N0RnVuY3Rpb25Ob2RlID8/IGNsb3N1cmUuY2xvc3VyZU5vZGVcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCFpbm5lcm1vc3RGdW5jdGlvbk5vZGUgJiYgaXNGdW5jdGlvbk5vZGUoY3VycmVudE5vZGUpKSB7XG4gICAgICBpbm5lcm1vc3RGdW5jdGlvbk5vZGUgPSBjdXJyZW50Tm9kZTtcbiAgICB9XG5cbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEZpbmRzIGEgdmFyaWFibGUgYnkgbmFtZSwgd2Fsa2luZyBvdXR3YXJkcyBmcm9tIHRoZSBnaXZlbiBzY29wZS5cbiAqXG4gKiBAcGFyYW0gc2NvcGUgLSBUaGUgc2NvcGUgdG8gc3RhcnQgZnJvbS5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHZhcmlhYmxlJ3MgbmFtZS5cbiAqIEByZXR1cm5zIFRoZSB2YXJpYWJsZSwgb3IgYG51bGxgIHdoZW4gbm90aGluZyBpbiBzY29wZSBkZWNsYXJlcyB0aGF0IG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGZpbmRWYXJpYWJsZShzY29wZTogU2NvcGUuU2NvcGUsIG5hbWU6IHN0cmluZyk6IG51bGwgfCBTY29wZS5WYXJpYWJsZSB7XG4gIGxldCBjdXJyZW50U2NvcGU6IG51bGwgfCBTY29wZS5TY29wZSA9IHNjb3BlO1xuXG4gIHdoaWxlIChjdXJyZW50U2NvcGUpIHtcbiAgICBjb25zdCB2YXJpYWJsZSA9IGN1cnJlbnRTY29wZS52YXJpYWJsZXMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PT0gbmFtZSk7XG4gICAgaWYgKHZhcmlhYmxlKSB7XG4gICAgICByZXR1cm4gdmFyaWFibGU7XG4gICAgfVxuICAgIGN1cnJlbnRTY29wZSA9IGN1cnJlbnRTY29wZS51cHBlcjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhbiBhc3NpZ25tZW50IGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhbiBgQXNzaWdubWVudEV4cHJlc3Npb25gLlxuICovXG5mdW5jdGlvbiBpc0Fzc2lnbm1lbnRFeHByZXNzaW9uKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLkFzc2lnbm1lbnRFeHByZXNzaW9uIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0Fzc2lnbm1lbnRFeHByZXNzaW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYSBiaW5hcnkgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGEgYEJpbmFyeUV4cHJlc3Npb25gLlxuICovXG5mdW5jdGlvbiBpc0JpbmFyeUV4cHJlc3Npb24obm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuQmluYXJ5RXhwcmVzc2lvbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdCaW5hcnlFeHByZXNzaW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYSBjYWxsIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBDYWxsRXhwcmVzc2lvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzQ2FsbEV4cHJlc3Npb24obm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb24ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnQ2FsbEV4cHJlc3Npb24nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIGZ1bmN0aW9uIHdyaXR0ZW4gYXMgYW4gb2JqZWN0IHByb3BlcnR5J3MgdmFsdWUuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBGdW5jdGlvbkV4cHJlc3Npb25gIG9yIGFuIGBBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzQ2xvc3VyZUZ1bmN0aW9uKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIENsb3N1cmVGdW5jdGlvbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdGdW5jdGlvbkV4cHJlc3Npb24nIHx8IG5vZGUudHlwZSA9PT0gJ0Fycm93RnVuY3Rpb25FeHByZXNzaW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIHNvbWV3aGVyZSBpbnNpZGUgYW4gaW4tT2JzaWRpYW4gY2xvc3VyZS5cbiAqXG4gKiBBIGhlbHBlciBkZWNsYXJlZCBPVVRTSURFIHRoZSBjbG9zdXJlIGFuc3dlcnMgYGZhbHNlYCwgd2hpY2ggaXMgd2hhdCBrZWVwcyB0aGlzIHJ1bGUncyBhbmFseXNpcyBpbnNpZGVcbiAqIG9uZSBjbG9zdXJlIHJhdGhlciB0aGFuIGZvbGxvd2luZyBjYWxscyBhY3Jvc3MgYm91bmRhcmllcyBpdCBkZWxpYmVyYXRlbHkgZGVjbGluZXMgdG8gcmVhZC5cbiAqXG4gKiBAcGFyYW0gZnVuY3Rpb25Ob2RlIC0gVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHBhcmFtIGNsb3N1cmUgLSBUaGUgY2xvc3VyZSB0byBjaGVjayBhZ2FpbnN0LlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGxleGljYWxseSBpbnNpZGUgdGhlIGNsb3N1cmUuXG4gKi9cbmZ1bmN0aW9uIGlzRGVjbGFyZWRJbnNpZGVDbG9zdXJlKGZ1bmN0aW9uTm9kZTogSGVscGVyRnVuY3Rpb24sIGNsb3N1cmU6IEV2YWxDbG9zdXJlKTogYm9vbGVhbiB7XG4gIGxldCBjdXJyZW50Tm9kZTogVFNFU1RyZWUuTm9kZSB8IHVuZGVmaW5lZCA9IGZ1bmN0aW9uTm9kZS5wYXJlbnQ7XG5cbiAgd2hpbGUgKGN1cnJlbnROb2RlKSB7XG4gICAgaWYgKGN1cnJlbnROb2RlID09PSBjbG9zdXJlLmNsb3N1cmVOb2RlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgY291bnRpbmcgYGZvcmAgc3RhdGVtZW50LlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYSBgRm9yU3RhdGVtZW50YC5cbiAqL1xuZnVuY3Rpb24gaXNGb3JTdGF0ZW1lbnQobm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuRm9yU3RhdGVtZW50IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0ZvclN0YXRlbWVudCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgZnVuY3Rpb24gd2FpdGluZyBjYW4gYmUgY2hhcmdlZCB0by5cbiAqXG4gKiBBIGBmdW5jdGlvbmAgZGVjbGFyYXRpb24gY291bnRzIGFzIHdlbGwgYXMgdGhlIHR3byBleHByZXNzaW9uIGZvcm1zLCBiZWNhdXNlIHRoYXQgaXMgaG93IHRoZXNlIHN1aXRlc1xuICogd3JpdGUgYSBsb2NhbCByZXRyeSBoZWxwZXIuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBGdW5jdGlvbkRlY2xhcmF0aW9uYCwgYSBgRnVuY3Rpb25FeHByZXNzaW9uYCBvciBhbiBgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25gLlxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uTm9kZShub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBIZWxwZXJGdW5jdGlvbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBpc0Nsb3N1cmVGdW5jdGlvbihub2RlKSB8fCBub2RlLnR5cGUgPT09ICdGdW5jdGlvbkRlY2xhcmF0aW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYW4gaWRlbnRpZmllci5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGFuIGBJZGVudGlmaWVyYC5cbiAqL1xuZnVuY3Rpb24gaXNJZGVudGlmaWVyKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLklkZW50aWZpZXIge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnSWRlbnRpZmllcic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGFuIGAmJmAgY2hhaW4sIHdob3NlIGNvbmp1bmN0cyBhIGNlaWxpbmcgbWF5IGJlIGRlY2xhcmVkIGluIG9uZSBvZi5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGEgYExvZ2ljYWxFeHByZXNzaW9uYCB3aXRoIHRoZSBgJiZgIG9wZXJhdG9yLlxuICovXG5mdW5jdGlvbiBpc0xvZ2ljYWxBbmRFeHByZXNzaW9uKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLkxvZ2ljYWxFeHByZXNzaW9uIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0xvZ2ljYWxFeHByZXNzaW9uJyAmJiBub2RlLm9wZXJhdG9yID09PSAnJiYnO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIGxvb3Agd2hvc2Ugb3duIHRlc3QgY2FuIGRlY2xhcmUgYSBjZWlsaW5nLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYSBgV2hpbGVTdGF0ZW1lbnRgLCBhIGBEb1doaWxlU3RhdGVtZW50YCBvciBhIGBGb3JTdGF0ZW1lbnRgLlxuICovXG5mdW5jdGlvbiBpc0xvb3BTdGF0ZW1lbnQobm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgTG9vcFN0YXRlbWVudCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdXaGlsZVN0YXRlbWVudCcgfHwgbm9kZS50eXBlID09PSAnRG9XaGlsZVN0YXRlbWVudCcgfHwgaXNGb3JTdGF0ZW1lbnQobm9kZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgbWVtYmVyIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBNZW1iZXJFeHByZXNzaW9uYC5cbiAqL1xuZnVuY3Rpb24gaXNNZW1iZXJFeHByZXNzaW9uKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLk1lbWJlckV4cHJlc3Npb24ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnTWVtYmVyRXhwcmVzc2lvbic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgbnVtZXJpYyBsaXRlcmFsLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYSBgTGl0ZXJhbGAgaG9sZGluZyBhIG51bWJlci5cbiAqL1xuZnVuY3Rpb24gaXNOdW1lcmljTGl0ZXJhbChub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5OdW1iZXJMaXRlcmFsIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0xpdGVyYWwnICYmIHR5cGVvZiBub2RlLnZhbHVlID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhbiBgT2JqZWN0RXhwcmVzc2lvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0RXhwcmVzc2lvbihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5PYmplY3RFeHByZXNzaW9uIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ09iamVjdEV4cHJlc3Npb24nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhbiBvYmplY3QgZGVzdHJ1Y3R1cmluZyBwYXR0ZXJuLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYW4gYE9iamVjdFBhdHRlcm5gLlxuICovXG5mdW5jdGlvbiBpc09iamVjdFBhdHRlcm4obm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuT2JqZWN0UGF0dGVybiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdPYmplY3RQYXR0ZXJuJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYW4gb2JqZWN0LWxpdGVyYWwgb3Igb2JqZWN0LXBhdHRlcm4gcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBQcm9wZXJ0eWAuXG4gKi9cbmZ1bmN0aW9uIGlzUHJvcGVydHkobm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuUHJvcGVydHkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnUHJvcGVydHknO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhbiB1cGRhdGUgZXhwcmVzc2lvbi5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGFuIGBVcGRhdGVFeHByZXNzaW9uYC5cbiAqL1xuZnVuY3Rpb24gaXNVcGRhdGVFeHByZXNzaW9uKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLlVwZGF0ZUV4cHJlc3Npb24ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnVXBkYXRlRXhwcmVzc2lvbic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgdmFyaWFibGUgZGVjbGFyYXRpb24uXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBWYXJpYWJsZURlY2xhcmF0aW9uYC5cbiAqL1xuZnVuY3Rpb24gaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLlZhcmlhYmxlRGVjbGFyYXRpb24ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdGlvbic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgdmFyaWFibGUgZGVjbGFyYXRvci5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGEgYFZhcmlhYmxlRGVjbGFyYXRvcmAuXG4gKi9cbmZ1bmN0aW9uIGlzVmFyaWFibGVEZWNsYXJhdG9yKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLlZhcmlhYmxlRGVjbGFyYXRvciB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdWYXJpYWJsZURlY2xhcmF0b3InO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBleHByZXNzaW9uIGFuIGlkZW50aWZpZXIgaXMgYm91bmQgdG8uXG4gKlxuICogQSBgY29uc3RgIGFuc3dlcnMgd2l0aCBpdHMgaW5pdGlhbGl6ZXI7IGEgZGVzdHJ1Y3R1cmVkIHBhcmFtZXRlciBvZiBUSElTIGNsb3N1cmUgYW5zd2VycyB3aXRoIHdoYXQgdGhlXG4gKiBjYWxsJ3Mgb3duIGBpbnB1dGAgc3VwcGxpZXMgZm9yIHRoZSBrZXkgaXQgd2FzIGRlc3RydWN0dXJlZCBieSwgd2hpY2ggaXMgaG93IGEgYnVkZ2V0IHdyaXR0ZW4gb25jZSBhdFxuICogdGhlIGNhbGwgc2l0ZSByZWFjaGVzIGEgY2xvc3VyZSB0aGF0IGNhbiBjbG9zZSBvdmVyIG5vdGhpbmcuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgaWRlbnRpZmllciB0byByZXNvbHZlLlxuICogQHBhcmFtIGNsb3N1cmUgLSBUaGUgY2xvc3VyZSB0aGUgaWRlbnRpZmllciB3YXMgd3JpdHRlbiBpbnNpZGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBydWxlIGNvbnRleHQsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgaWRlbnRpZmllciB0aHJvdWdoIHNjb3BlLlxuICogQHJldHVybnMgVGhlIGV4cHJlc3Npb24gaXQgaXMgYm91bmQgdG8sIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgc3RhdGljYWxseSBiaW5kcyBpdC5cbiAqL1xuZnVuY3Rpb24gcmVhZEJvdW5kRXhwcmVzc2lvbihub2RlOiBUU0VTVHJlZS5JZGVudGlmaWVyLCBjbG9zdXJlOiBFdmFsQ2xvc3VyZSwgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IG51bGwgfCBUU0VTVHJlZS5Ob2RlIHtcbiAgY29uc3QgdmFyaWFibGUgPSBmaW5kVmFyaWFibGUoY29udGV4dC5zb3VyY2VDb2RlLmdldFNjb3BlKG5vZGUpLCBub2RlLm5hbWUpO1xuICBpZiAoIXZhcmlhYmxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgdmFyaWFibGUuZGVmcykge1xuICAgIGNvbnN0IGRlZmluaXRpb25Ob2RlID0gdG9UU0VTVHJlZU5vZGUoZGVmaW5pdGlvbi5ub2RlKTtcblxuICAgIGlmIChpc1ZhcmlhYmxlRGVjbGFyYXRvcihkZWZpbml0aW9uTm9kZSkgJiYgZGVmaW5pdGlvbk5vZGUuaW5pdCkge1xuICAgICAgcmV0dXJuIGRlZmluaXRpb25Ob2RlLmluaXQ7XG4gICAgfVxuXG4gICAgaWYgKGRlZmluaXRpb25Ob2RlID09PSBjbG9zdXJlLmNsb3N1cmVOb2RlKSB7XG4gICAgICBjb25zdCBpbnB1dEtleSA9IHJlYWRQYXJhbWV0ZXJJbnB1dEtleShjbG9zdXJlLmNsb3N1cmVOb2RlLCBub2RlLm5hbWUpO1xuICAgICAgcmV0dXJuIGlucHV0S2V5ID09PSBudWxsID8gbnVsbCA6IHJlYWRJbnB1dFByb3BlcnR5VmFsdWUoY2xvc3VyZS5wYXJhbXNOb2RlLCBpbnB1dEtleSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGhlbHBlciBhIGNhbGwgbmFtZXMsIHdoZW4gdGhhdCBoZWxwZXIgaXMgZGVjbGFyZWQgaW5zaWRlIHRoZSBnaXZlbiBjbG9zdXJlLlxuICpcbiAqIEJvdGggZm9ybXMgdGhlc2Ugc3VpdGVzIHdyaXRlIGFyZSByZXNvbHZlZCB0aHJvdWdoIHRoZSBzYW1lIHNjb3BlIHdhbGsgYSBidWRnZXQgdXNlczogYSBgZnVuY3Rpb25gXG4gKiBkZWNsYXJhdGlvbiwgYW5kIGEgYGNvbnN0YCBib3VuZCB0byBhbiBhcnJvdyBvciBhIGZ1bmN0aW9uIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIGNhbGxOb2RlIC0gVGhlIGNhbGwgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBjbG9zdXJlIC0gVGhlIGluLU9ic2lkaWFuIGNsb3N1cmUgdGhlIGNhbGwgcnVucyBpbnNpZGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBydWxlIGNvbnRleHQsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgY2FsbGVlIHRocm91Z2ggc2NvcGUuXG4gKiBAcmV0dXJucyBUaGUgaGVscGVyJ3MgZnVuY3Rpb24gbm9kZSwgb3IgYG51bGxgIHdoZW4gdGhlIGNhbGxlZSBpcyBub3QgYSBoZWxwZXIgb2YgdGhpcyBjbG9zdXJlLlxuICovXG5mdW5jdGlvbiByZWFkQ2FsbGVkSGVscGVyTm9kZShjYWxsTm9kZTogVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb24sIGNsb3N1cmU6IEV2YWxDbG9zdXJlLCBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0KTogSGVscGVyRnVuY3Rpb24gfCBudWxsIHtcbiAgY29uc3QgY2FsbGVlTm9kZSA9IGNhbGxOb2RlLmNhbGxlZSBhcyBUU0VTVHJlZS5Ob2RlO1xuICBpZiAoIWlzSWRlbnRpZmllcihjYWxsZWVOb2RlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgdmFyaWFibGUgPSBmaW5kVmFyaWFibGUoY29udGV4dC5zb3VyY2VDb2RlLmdldFNjb3BlKGNhbGxlZU5vZGUpLCBjYWxsZWVOb2RlLm5hbWUpO1xuICBpZiAoIXZhcmlhYmxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgdmFyaWFibGUuZGVmcykge1xuICAgIGNvbnN0IGZ1bmN0aW9uTm9kZSA9IHJlYWREZWZpbml0aW9uRnVuY3Rpb25Ob2RlKHRvVFNFU1RyZWVOb2RlKGRlZmluaXRpb24ubm9kZSkpO1xuICAgIGlmIChmdW5jdGlvbk5vZGUgJiYgaXNEZWNsYXJlZEluc2lkZUNsb3N1cmUoZnVuY3Rpb25Ob2RlLCBjbG9zdXJlKSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uTm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBTdW1zIGEgZnVuY3Rpb24ncyBvd24gd2FpdGluZyBwbHVzIHRoYXQgb2YgZXZlcnkgaGVscGVyIGl0IGNhbGxzLCBtdWx0aXBsaWVkIGJ5IHRoZSBjYWxscyB0aGF0IHJlYWNoIGl0LlxuICpcbiAqIEEgZnVuY3Rpb24gYWxyZWFkeSBvbiB0aGUgc3RhY2sgY29udHJpYnV0ZXMgTk9USElORywgd2hpY2ggaXMgd2hhdCB0ZXJtaW5hdGVzIGRpcmVjdCBhbmQgbXV0dWFsXG4gKiByZWN1cnNpb24g4oCUIHRoZSBzYW1lIHNpbGVuY2UgYW4gdW5ib3VuZGVkIGxvb3AgZ2V0cywgcmF0aGVyIHRoYW4gYSBndWVzcyBhdCBob3cgb2Z0ZW4gaXQgcmVwZWF0cy4gVGhlXG4gKiBzdGFjayBpcyB1bndvdW5kIG9uIHRoZSB3YXkgb3V0LCBzbyBhIGhlbHBlciByZWFjaGVkIGRvd24gdHdvIGRpZmZlcmVudCBwYXRocyBpcyBjb3VudGVkIG9uIGJvdGguXG4gKlxuICogQHBhcmFtIGZ1bmN0aW9uTm9kZSAtIFRoZSBmdW5jdGlvbiB0byB0b3RhbC5cbiAqIEBwYXJhbSBjYWxsR3JhcGggLSBUaGUgZmlsZSdzIGFjY3VtdWxhdGVkIGNoYXJnZXMuXG4gKiBAcGFyYW0gdmlzaXRlZE5vZGVzIC0gVGhlIGZ1bmN0aW9ucyBjdXJyZW50bHkgYmVpbmcgdG90YWxsZWQsIHdoaWNoIGlzIHRoZSByZWN1cnNpb24gc3RhY2suXG4gKiBAcmV0dXJucyBUaGUgd2FpdGluZywgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5mdW5jdGlvbiByZWFkQ2FsbEdyYXBoV2FpdEluTWlsbGlzZWNvbmRzKGZ1bmN0aW9uTm9kZTogSGVscGVyRnVuY3Rpb24sIGNhbGxHcmFwaDogQ2FsbEdyYXBoLCB2aXNpdGVkTm9kZXM6IFNldDxIZWxwZXJGdW5jdGlvbj4pOiBudW1iZXIge1xuICBpZiAodmlzaXRlZE5vZGVzLmhhcyhmdW5jdGlvbk5vZGUpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICB2aXNpdGVkTm9kZXMuYWRkKGZ1bmN0aW9uTm9kZSk7XG5cbiAgbGV0IHRvdGFsSW5NaWxsaXNlY29uZHMgPSBjYWxsR3JhcGgud2FpdEluTWlsbGlzZWNvbmRzQnlGdW5jdGlvbk5vZGUuZ2V0KGZ1bmN0aW9uTm9kZSkgPz8gMDtcbiAgZm9yIChjb25zdCBbY2FsbGVlTm9kZSwgY2FsbENvdW50XSBvZiBjYWxsR3JhcGguY2FsbENvdW50QnlDYWxsZWVOb2RlQnlDYWxsZXJOb2RlLmdldChmdW5jdGlvbk5vZGUpID8/IFtdKSB7XG4gICAgdG90YWxJbk1pbGxpc2Vjb25kcyArPSBjYWxsQ291bnQgKiByZWFkQ2FsbEdyYXBoV2FpdEluTWlsbGlzZWNvbmRzKGNhbGxlZU5vZGUsIGNhbGxHcmFwaCwgdmlzaXRlZE5vZGVzKTtcbiAgfVxuXG4gIHZpc2l0ZWROb2Rlcy5kZWxldGUoZnVuY3Rpb25Ob2RlKTtcbiAgcmV0dXJuIHRvdGFsSW5NaWxsaXNlY29uZHM7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGNsb2NrIGEgbm9kZSByZWFkcyB0aGUgY3VycmVudCB0aW1lIGZyb20sIGlmIHRoYXQgaXMgd2hhdCBpdCBkb2VzLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIFRoZSBjbG9jayBvYmplY3QncyBuYW1lIChgRGF0ZWAgb3IgYHBlcmZvcm1hbmNlYCksIG9yIGBudWxsYCB3aGVuIHRoZSBub2RlIGlzIG5vdCBhIGNsb2NrIHJlYWRpbmcuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDbG9ja05hbWUobm9kZTogVFNFU1RyZWUuTm9kZSk6IG51bGwgfCBzdHJpbmcge1xuICBpZiAoIWlzQ2FsbEV4cHJlc3Npb24obm9kZSkgfHwgbm9kZS5hcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY2FsbGVlTm9kZSA9IG5vZGUuY2FsbGVlIGFzIFRTRVNUcmVlLk5vZGU7XG4gIGlmICghaXNNZW1iZXJFeHByZXNzaW9uKGNhbGxlZU5vZGUpIHx8IGNhbGxlZU5vZGUuY29tcHV0ZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG9iamVjdE5vZGUgPSBjYWxsZWVOb2RlLm9iamVjdCBhcyBUU0VTVHJlZS5Ob2RlO1xuICBjb25zdCBwcm9wZXJ0eU5vZGUgPSBjYWxsZWVOb2RlLnByb3BlcnR5IGFzIFRTRVNUcmVlLk5vZGU7XG4gIHJldHVybiAhaXNJZGVudGlmaWVyKG9iamVjdE5vZGUpIHx8ICFpc0lkZW50aWZpZXIocHJvcGVydHlOb2RlKSB8fCBwcm9wZXJ0eU5vZGUubmFtZSAhPT0gTk9XX01FVEhPRF9OQU1FIHx8ICFDTE9DS19PQkpFQ1RfTkFNRVMuaGFzKG9iamVjdE5vZGUubmFtZSkgPyBudWxsIDogb2JqZWN0Tm9kZS5uYW1lO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjbG9zdXJlIHByb3BlcnR5IG5hbWVzIGEgY2FsbCdzIHBhcmFtZXRlciBvYmplY3QgbWF5IGNhcnJ5LCBieSB0aGUgaGVscGVyIGl0IGNhbGxzLlxuICpcbiAqIEBwYXJhbSBjYWxsTm9kZSAtIFRoZSBjYWxsIGV4cHJlc3Npb24uXG4gKiBAcmV0dXJucyBUaGUgaW4tT2JzaWRpYW4gY2xvc3VyZSBwcm9wZXJ0eSBuYW1lcywgb3IgYG51bGxgIHdoZW4gdGhlIGNhbGxlZSBpcyBub3Qgb25lIG9mIHRoZSBoZWxwZXJzLlxuICovXG5mdW5jdGlvbiByZWFkQ2xvc3VyZU5hbWVzKGNhbGxOb2RlOiBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbik6IG51bGwgfCByZWFkb25seSBzdHJpbmdbXSB7XG4gIHJldHVybiBpc0lkZW50aWZpZXIoY2FsbE5vZGUuY2FsbGVlKSA/IENMT1NVUkVfTkFNRVNfQllfQ0FMTEVFX05BTUUuZ2V0KGNhbGxOb2RlLmNhbGxlZS5uYW1lKSA/PyBudWxsIDogbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFkcyBvbmUgY2xvc3VyZSdzIHdob2xlIGRlY2xhcmVkIHdhaXRpbmcuXG4gKlxuICogRXZlcnl0aGluZyB0aGUgY2xvc3VyZSBjYW4gUkVBQ0ggaXMgdG90YWxsZWQgdGhyb3VnaCB0aGUgY2FsbCBncmFwaCwgb25jZSBwZXIgY2FsbCBzaXRlLiBFdmVyeXRoaW5nIGl0XG4gKiBjYW5ub3Qg4oCUIGEgaGVscGVyIG5vdGhpbmcgY2FsbHMsIG9yIG9uZSBjYWxsZWQgdGhyb3VnaCBhIHJlZmVyZW5jZSB0aGlzIHJ1bGUgY2Fubm90IGZvbGxvdyDigJQga2VlcHMgdGhlXG4gKiBmbGF0IHNpbmdsZSBjaGFyZ2UgYSBsZXhpY2FsIGF0dHJpYnV0aW9uIGFsd2F5cyBnYXZlIGl0LCBzbyBubyBjbG9zdXJlIHJlcG9ydGVkIGJlZm9yZSB0aGlzIHJ1bGUgY291bnRlZFxuICogY2FsbCBzaXRlcyBmYWxscyBzaWxlbnQgbm93IHRoYXQgaXQgZG9lcy5cbiAqXG4gKiBAcGFyYW0gc3RhdGUgLSBUaGUgY2xvc3VyZSdzIGFjY3VtdWxhdGVkIGNoYXJnZXMuXG4gKiBAcGFyYW0gY2FsbEdyYXBoIC0gVGhlIGZpbGUncyBhY2N1bXVsYXRlZCBjaGFyZ2VzLlxuICogQHJldHVybnMgVGhlIHdhaXRpbmcgdGhlIGNsb3N1cmUgZGVjbGFyZXMsIGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuZnVuY3Rpb24gcmVhZENsb3N1cmVXYWl0SW5NaWxsaXNlY29uZHMoc3RhdGU6IENsb3N1cmVTdGF0ZSwgY2FsbEdyYXBoOiBDYWxsR3JhcGgpOiBudW1iZXIge1xuICBjb25zdCByZWFjaGFibGVOb2RlcyA9IG5ldyBTZXQ8SGVscGVyRnVuY3Rpb24+KCk7XG4gIGNvbGxlY3RSZWFjaGFibGVGdW5jdGlvbk5vZGVzKHN0YXRlLmNsb3N1cmVOb2RlLCBjYWxsR3JhcGgsIHJlYWNoYWJsZU5vZGVzKTtcblxuICBsZXQgdG90YWxJbk1pbGxpc2Vjb25kcyA9IHJlYWRDYWxsR3JhcGhXYWl0SW5NaWxsaXNlY29uZHMoc3RhdGUuY2xvc3VyZU5vZGUsIGNhbGxHcmFwaCwgbmV3IFNldDxIZWxwZXJGdW5jdGlvbj4oKSk7XG5cbiAgZm9yIChjb25zdCBmdW5jdGlvbk5vZGUgb2Ygc3RhdGUuZnVuY3Rpb25Ob2Rlcykge1xuICAgIGNvbnN0IG93bldhaXRJbk1pbGxpc2Vjb25kcyA9IGNhbGxHcmFwaC53YWl0SW5NaWxsaXNlY29uZHNCeUZ1bmN0aW9uTm9kZS5nZXQoZnVuY3Rpb25Ob2RlKTtcbiAgICBpZiAob3duV2FpdEluTWlsbGlzZWNvbmRzID09PSB1bmRlZmluZWQgfHwgcmVhY2hhYmxlTm9kZXMuaGFzKGZ1bmN0aW9uTm9kZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRvdGFsSW5NaWxsaXNlY29uZHMgKz0gb3duV2FpdEluTWlsbGlzZWNvbmRzO1xuICB9XG5cbiAgcmV0dXJuIHRvdGFsSW5NaWxsaXNlY29uZHM7XG59XG5cbi8qKlxuICogRmxhdHRlbnMgYW4gYCYmYCBjaGFpbiBpbnRvIHRoZSBjb25kaXRpb25zIGl0IGlzIGJ1aWx0IGZyb20uXG4gKlxuICogQSB0ZXN0IHRoYXQgaXMgbm90IGFuIGAmJmAgY2hhaW4gYW5zd2VycyB3aXRoIGl0c2VsZiwgc28gYSBjYWxsZXIgbmV2ZXIgc3BlY2lhbC1jYXNlcyB0aGUgc2ltcGxlIGZvcm0uXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgZXhwcmVzc2lvbiB0byBmbGF0dGVuLlxuICogQHJldHVybnMgRXZlcnkgY29uanVuY3QsIGxlZnQgdG8gcmlnaHQuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDb25qdW5jdHMobm9kZTogVFNFU1RyZWUuRXhwcmVzc2lvbik6IFRTRVNUcmVlLkV4cHJlc3Npb25bXSB7XG4gIHJldHVybiBpc0xvZ2ljYWxBbmRFeHByZXNzaW9uKG5vZGUpID8gWy4uLnJlYWRDb25qdW5jdHMobm9kZS5sZWZ0KSwgLi4ucmVhZENvbmp1bmN0cyhub2RlLnJpZ2h0KV0gOiBbbm9kZV07XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGNlaWxpbmcgYSBzaW5nbGUgYGNsb2NrLm5vdygpIDwgZGVhZGxpbmVgIGNvbXBhcmlzb24gZGVjbGFyZXMuXG4gKlxuICogQm90aCBvcGVyYW5kIG9yZGVycyBhcmUgcmVhZCwgc2luY2UgYGRlYWRsaW5lID4gY2xvY2subm93KClgIGlzIHRoZSBzYW1lIGd1YXJkIHdyaXR0ZW4gdGhlIG90aGVyIHdheVxuICogcm91bmQuIFRoZSBiaW5kaW5nIG11c3QgdGFrZSBpdHMgdGltZSBmcm9tIHRoZSBTQU1FIGNsb2NrIGFzIHRoZSBndWFyZDogYSBjb21wYXJpc29uIGFjcm9zcyB0aGUgdHdvXG4gKiBtZWFzdXJlcyBub3RoaW5nLCBhbmQgZGVjbGluaW5nIGl0IGlzIHRoZSBzaWxlbmNlIGFueSB1bnJlc29sdmFibGUgdmFsdWUgYWxyZWFkeSBnZXRzLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIGNvbmRpdGlvbiB0byBpbnNwZWN0LlxuICogQHBhcmFtIGNsb3N1cmUgLSBUaGUgaW4tT2JzaWRpYW4gY2xvc3VyZSB0aGUgbG9vcCBydW5zIGluc2lkZS5cbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHJ1bGUgY29udGV4dCwgdXNlZCB0byByZXNvbHZlIHRoZSBkZWFkbGluZSB0aHJvdWdoIHNjb3BlLlxuICogQHJldHVybnMgVGhlIGNlaWxpbmcgaW4gbWlsbGlzZWNvbmRzLCBvciBgbnVsbGAgd2hlbiB0aGUgY29uZGl0aW9uIGRlY2xhcmVzIG5vbmUuXG4gKi9cbmZ1bmN0aW9uIHJlYWREZWFkbGluZUd1YXJkSW5NaWxsaXNlY29uZHMobm9kZTogVFNFU1RyZWUuTm9kZSwgY2xvc3VyZTogRXZhbENsb3N1cmUsIGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpOiBudWxsIHwgbnVtYmVyIHtcbiAgaWYgKCFpc0JpbmFyeUV4cHJlc3Npb24obm9kZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGlzQ2xvY2tPbkxlZnQgPSBub2RlLm9wZXJhdG9yID09PSAnPCcgfHwgbm9kZS5vcGVyYXRvciA9PT0gJzw9JztcbiAgaWYgKCFpc0Nsb2NrT25MZWZ0ICYmIG5vZGUub3BlcmF0b3IgIT09ICc+JyAmJiBub2RlLm9wZXJhdG9yICE9PSAnPj0nKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjbG9ja05hbWUgPSByZWFkQ2xvY2tOYW1lKGlzQ2xvY2tPbkxlZnQgPyBub2RlLmxlZnQgOiBub2RlLnJpZ2h0KTtcbiAgY29uc3QgZGVhZGxpbmVOb2RlID0gKGlzQ2xvY2tPbkxlZnQgPyBub2RlLnJpZ2h0IDogbm9kZS5sZWZ0KSBhcyBUU0VTVHJlZS5Ob2RlO1xuICBpZiAoY2xvY2tOYW1lID09PSBudWxsIHx8ICFpc0lkZW50aWZpZXIoZGVhZGxpbmVOb2RlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgYm91bmROb2RlID0gcmVhZEJvdW5kRXhwcmVzc2lvbihkZWFkbGluZU5vZGUsIGNsb3N1cmUsIGNvbnRleHQpO1xuICByZXR1cm4gIWJvdW5kTm9kZSB8fCAhaXNCaW5hcnlFeHByZXNzaW9uKGJvdW5kTm9kZSkgfHwgYm91bmROb2RlLm9wZXJhdG9yICE9PSAnKycgfHwgKHJlYWRDbG9ja05hbWUoYm91bmROb2RlLmxlZnQpICE9PSBjbG9ja05hbWUpID8gbnVsbCA6IHJlc29sdmVOdW1iZXIoYm91bmROb2RlLnJpZ2h0LCBjbG9zdXJlLCBjb250ZXh0KTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgZnVuY3Rpb24gYSBzY29wZSBkZWZpbml0aW9uIGRlY2xhcmVzLCBpZiBpdCBkZWNsYXJlcyBvbmUuXG4gKlxuICogQHBhcmFtIGRlZmluaXRpb25Ob2RlIC0gVGhlIG5vZGUgYSB2YXJpYWJsZSdzIGRlZmluaXRpb24gcG9pbnRzIGF0LlxuICogQHJldHVybnMgVGhlIGZ1bmN0aW9uIGl0IGRlY2xhcmVzLCBvciBgbnVsbGAgd2hlbiB0aGUgbmFtZSBpcyBib3VuZCB0byBhbnl0aGluZyBlbHNlLlxuICovXG5mdW5jdGlvbiByZWFkRGVmaW5pdGlvbkZ1bmN0aW9uTm9kZShkZWZpbml0aW9uTm9kZTogVFNFU1RyZWUuTm9kZSk6IEhlbHBlckZ1bmN0aW9uIHwgbnVsbCB7XG4gIGlmIChpc0Z1bmN0aW9uTm9kZShkZWZpbml0aW9uTm9kZSkpIHtcbiAgICByZXR1cm4gZGVmaW5pdGlvbk5vZGU7XG4gIH1cblxuICBpZiAoIWlzVmFyaWFibGVEZWNsYXJhdG9yKGRlZmluaXRpb25Ob2RlKSB8fCAhZGVmaW5pdGlvbk5vZGUuaW5pdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgaW5pdE5vZGUgPSBkZWZpbml0aW9uTm9kZS5pbml0IGFzIFRTRVNUcmVlLk5vZGU7XG4gIHJldHVybiBpc0Z1bmN0aW9uTm9kZShpbml0Tm9kZSkgPyBpbml0Tm9kZSA6IG51bGw7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGluLU9ic2lkaWFuIGNsb3N1cmUgYSBmdW5jdGlvbiBub2RlIGlzLCBpZiBpdCBpcyBvbmUuXG4gKlxuICogQSBjbG9zdXJlIHF1YWxpZmllcyB3aGVuIGl0IGlzIHRoZSB2YWx1ZSBvZiBhIGBjYWxsYmFja2AgLyBgcG9sbGAgLyBgc3RhcnRgIHByb3BlcnR5IG9mIHRoZSBvYmplY3RcbiAqIGxpdGVyYWwgcGFzc2VkIGFzIHRoZSBoZWxwZXIncyBmaXJzdCBhcmd1bWVudCDigJQgd2hpY2ggY292ZXJzIGJvdGggdGhlIG1ldGhvZCBzaG9ydGhhbmRcbiAqIChgYXN5bmMgY2FsbGJhY2soeyDigKYgfSkgeyDigKYgfWApIGFuZCBhbiBhcnJvdyAoYGNhbGxiYWNrOiBhc3luYyAoeyDigKYgfSkgPT4geyDigKYgfWApLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUaGUgY2xvc3VyZSwgb3IgYG51bGxgIHdoZW4gdGhlIG5vZGUgaXMgbm90IGFuIGluLU9ic2lkaWFuIGNsb3N1cmUuXG4gKi9cbmZ1bmN0aW9uIHJlYWRFdmFsQ2xvc3VyZShub2RlOiBUU0VTVHJlZS5Ob2RlKTogRXZhbENsb3N1cmUgfCBudWxsIHtcbiAgaWYgKCFpc0Nsb3N1cmVGdW5jdGlvbihub2RlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcHJvcGVydHlOb2RlID0gbm9kZS5wYXJlbnQ7XG4gIGlmICghaXNQcm9wZXJ0eShwcm9wZXJ0eU5vZGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKlxuICAgKiBUaGUgb2JqZWN0IGNoZWNrIGNvbWVzIEJFRk9SRSB0aGUga2V5IGNoZWNrIGJlY2F1c2UgYSBmdW5jdGlvbiBjYW4gcmVhY2ggYSBwcm9wZXJ0eSB0aHJvdWdoIGl0c1xuICAgKiBDT01QVVRFRCBLRVkgYXMgd2VsbCBhcyB0aHJvdWdoIGl0cyB2YWx1ZSAtLSBgeyBbKCkgPT4gJ2EnXTogMSB9YCBpcyBsZWdhbCAtLSBhbmQgYSBkZXN0cnVjdHVyaW5nXG4gICAqIHBhdHRlcm4gY2FuIGNhcnJ5IG9uZSB0b28uIE5laXRoZXIgaXMgYSBoZWxwZXIgY2FsbCdzIHBhcmFtZXRlciBvYmplY3QuXG4gICAqL1xuICBjb25zdCBwYXJhbXNOb2RlID0gcHJvcGVydHlOb2RlLnBhcmVudDtcbiAgaWYgKCFpc09iamVjdEV4cHJlc3Npb24ocGFyYW1zTm9kZSkgfHwgIWlzSWRlbnRpZmllcihwcm9wZXJ0eU5vZGUua2V5KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY2FsbE5vZGUgPSBwYXJhbXNOb2RlLnBhcmVudDtcbiAgaWYgKCFpc0NhbGxFeHByZXNzaW9uKGNhbGxOb2RlKSB8fCBjYWxsTm9kZS5hcmd1bWVudHNbMF0gIT09IHBhcmFtc05vZGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNsb3N1cmVOYW1lcyA9IHJlYWRDbG9zdXJlTmFtZXMoY2FsbE5vZGUpO1xuICByZXR1cm4gY2xvc3VyZU5hbWVzPy5pbmNsdWRlcyhwcm9wZXJ0eU5vZGUua2V5Lm5hbWUpXG4gICAgPyB7XG4gICAgICBjbG9zdXJlTm9kZTogbm9kZSxcbiAgICAgIHBhcmFtc05vZGUsXG4gICAgICByZXBvcnROb2RlOiBwcm9wZXJ0eU5vZGVcbiAgICB9XG4gICAgOiBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSB2YWx1ZSBhIGNhbGwncyBvd24gYGlucHV0YCBvYmplY3Qgc3VwcGxpZXMgZm9yIG9uZSBrZXkuXG4gKlxuICogVGhpcyBpcyBob3cgYSBidWRnZXQgZGVjbGFyZWQgb25jZSBhdCB0aGUgY2FsbCBzaXRlIHJlYWNoZXMgdGhlIGNsb3N1cmUsIHdoaWNoIGNhbm5vdCBjbG9zZSBvdmVyXG4gKiBhbnl0aGluZzogYGlucHV0OiB7IHNldHRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogU0VUVExFIH1gIGFycml2ZXMgZGVzdHJ1Y3R1cmVkIGluIHRoZSBjYWxsYmFjaydzXG4gKiBwYXJhbWV0ZXIgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXNOb2RlIC0gVGhlIGhlbHBlcidzIHBhcmFtZXRlciBvYmplY3QuXG4gKiBAcGFyYW0ga2V5TmFtZSAtIFRoZSBgaW5wdXRgIHByb3BlcnR5IHRvIHJlYWQuXG4gKiBAcmV0dXJucyBUaGUgZXhwcmVzc2lvbiBzdXBwbHlpbmcgdGhhdCBrZXksIG9yIGBudWxsYCB3aGVuIHRoZSBjYWxsJ3MgYGlucHV0YCBkb2VzIG5vdCBkZWNsYXJlIGl0LlxuICovXG5mdW5jdGlvbiByZWFkSW5wdXRQcm9wZXJ0eVZhbHVlKHBhcmFtc05vZGU6IFRTRVNUcmVlLk9iamVjdEV4cHJlc3Npb24sIGtleU5hbWU6IHN0cmluZyk6IG51bGwgfCBUU0VTVHJlZS5Ob2RlIHtcbiAgY29uc3QgaW5wdXRQcm9wZXJ0eSA9IHBhcmFtc05vZGUucHJvcGVydGllcy5maW5kKChwcm9wZXJ0eSkgPT5cbiAgICBpc1Byb3BlcnR5KHByb3BlcnR5IGFzIFRTRVNUcmVlLk5vZGUpXG4gICAgJiYgaXNJZGVudGlmaWVyKChwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Qcm9wZXJ0eSkua2V5IGFzIFRTRVNUcmVlLk5vZGUpXG4gICAgJiYgKChwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Qcm9wZXJ0eSkua2V5IGFzIFRTRVNUcmVlLklkZW50aWZpZXIpLm5hbWUgPT09IElOUFVUX1BST1BFUlRZX05BTUVcbiAgKSBhcyBUU0VTVHJlZS5Qcm9wZXJ0eSB8IHVuZGVmaW5lZDtcblxuICBjb25zdCBpbnB1dE5vZGUgPSBpbnB1dFByb3BlcnR5Py52YWx1ZSBhcyBUU0VTVHJlZS5Ob2RlIHwgdW5kZWZpbmVkO1xuICBpZiAoIWlucHV0Tm9kZSB8fCAhaXNPYmplY3RFeHByZXNzaW9uKGlucHV0Tm9kZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlUHJvcGVydHkgPSBpbnB1dE5vZGUucHJvcGVydGllcy5maW5kKChwcm9wZXJ0eSkgPT5cbiAgICBpc1Byb3BlcnR5KHByb3BlcnR5IGFzIFRTRVNUcmVlLk5vZGUpXG4gICAgJiYgaXNJZGVudGlmaWVyKChwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Qcm9wZXJ0eSkua2V5IGFzIFRTRVNUcmVlLk5vZGUpXG4gICAgJiYgKChwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Qcm9wZXJ0eSkua2V5IGFzIFRTRVNUcmVlLklkZW50aWZpZXIpLm5hbWUgPT09IGtleU5hbWVcbiAgKSBhcyBUU0VTVHJlZS5Qcm9wZXJ0eSB8IHVuZGVmaW5lZDtcblxuICByZXR1cm4gKHZhbHVlUHJvcGVydHk/LnZhbHVlIGFzIFRTRVNUcmVlLk5vZGUgfCB1bmRlZmluZWQpID8/IG51bGw7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIHdob2xlLWxvb3AgY2VpbGluZyBhIGNsb2NrIGRlYWRsaW5lIGRlY2xhcmVzLCBpbiBtaWxsaXNlY29uZHMuXG4gKlxuICogVGhlIGd1YXJkIGlzIGxvb2tlZCBmb3IgYW1vbmcgdGhlIHRlc3QncyBgJiZgIGNvbmp1bmN0cyByYXRoZXIgdGhhbiBhcyB0aGUgd2hvbGUgdGVzdCwgYmVjYXVzZSB0aGVcbiAqIGxvb3BzIHRoYXQgY2Fycnkgb25lIHBhaXIgaXQgd2l0aCBhIHByb2dyZXNzIGNvbmRpdGlvbiDigJQgYHdoaWxlIChjb3VudCA8IGV4cGVjdGVkICYmIERhdGUubm93KCkgPCBkZWFkbGluZSlgXG4gKiDigJQgYW5kIGEgY29tcG91bmQgdGVzdCBtdXN0IG5vdCByZW1vdmUgYSBjZWlsaW5nIG9uZSBvZiBpdHMgY29uanVuY3RzIHBsYWlubHkgZGVjbGFyZXMuXG4gKlxuICogQHBhcmFtIGxvb3BOb2RlIC0gVGhlIGxvb3AgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSBjbG9zdXJlIC0gVGhlIGluLU9ic2lkaWFuIGNsb3N1cmUgdGhlIGxvb3AgcnVucyBpbnNpZGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBydWxlIGNvbnRleHQsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVhZGxpbmUgdGhyb3VnaCBzY29wZS5cbiAqIEByZXR1cm5zIFRoZSBjZWlsaW5nIGluIG1pbGxpc2Vjb25kcywgb3IgYG51bGxgIHdoZW4gdGhlIGxvb3AgZGVjbGFyZXMgbm9uZS5cbiAqL1xuZnVuY3Rpb24gcmVhZExvb3BEZWFkbGluZUluTWlsbGlzZWNvbmRzKGxvb3BOb2RlOiBMb29wU3RhdGVtZW50LCBjbG9zdXJlOiBFdmFsQ2xvc3VyZSwgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IG51bGwgfCBudW1iZXIge1xuICBpZiAoIWxvb3BOb2RlLnRlc3QpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZvciAoY29uc3QgY29uanVuY3Qgb2YgcmVhZENvbmp1bmN0cyhsb29wTm9kZS50ZXN0KSkge1xuICAgIGNvbnN0IGRlYWRsaW5lSW5NaWxsaXNlY29uZHMgPSByZWFkRGVhZGxpbmVHdWFyZEluTWlsbGlzZWNvbmRzKGNvbmp1bmN0LCBjbG9zdXJlLCBjb250ZXh0KTtcbiAgICBpZiAoZGVhZGxpbmVJbk1pbGxpc2Vjb25kcyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGRlYWRsaW5lSW5NaWxsaXNlY29uZHM7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGZpcnN0IHZhbHVlIGEgbG9vcCdzIHRlc3Qgd2lsbCBub3QgbGV0IGl0cyBjb3VudGVyIHJlYWNoLlxuICpcbiAqIEFuIGluY2x1c2l2ZSBib3VuZCBhbnN3ZXJzIG9uZSBoaWdoZXIgdGhhbiBpdCBpcyB3cml0dGVuLCBzbyBhIGNhbGxlciB3b3JrcyBpbiBvbmUgY3VycmVuY3kgcmF0aGVyIHRoYW5cbiAqIGNhcnJ5aW5nIHRoZSBvcGVyYXRvciBhbG9uZyB3aXRoIHRoZSBudW1iZXIuIFRoZSB0ZXN0IGlzIHJlYWQgYXMgYCYmYCBjb25qdW5jdHMgZm9yIHRoZSBzYW1lIHJlYXNvbiBhXG4gKiBkZWFkbGluZSBndWFyZCBpczogYGF0dGVtcHQgPCBBVFRFTVBUUyAmJiAhaXNPcGVuYCBzdGlsbCBjYW5ub3QgcnVuIG1vcmUgdGhhbiBgQVRURU1QVFNgIHRpbWVzLlxuICpcbiAqIEBwYXJhbSB0ZXN0Tm9kZSAtIFRoZSBsb29wJ3MgdGVzdC5cbiAqIEBwYXJhbSBjb3VudGVyTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVyIHRoZSBsb29wIGFkdmFuY2VzLlxuICogQHBhcmFtIGNsb3N1cmUgLSBUaGUgaW4tT2JzaWRpYW4gY2xvc3VyZSB0aGUgbG9vcCBydW5zIGluc2lkZS5cbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHJ1bGUgY29udGV4dCwgdXNlZCB0byByZXNvbHZlIHRoZSBib3VuZCB0aHJvdWdoIHNjb3BlLlxuICogQHJldHVybnMgVGhlIGV4Y2x1c2l2ZSBib3VuZCwgb3IgYG51bGxgIHdoZW4gbm8gY29uanVuY3QgYm91bmRzIHRoYXQgY291bnRlciBieSBhIHJlc29sdmFibGUgbnVtYmVyLlxuICovXG5mdW5jdGlvbiByZWFkTG9vcEV4Y2x1c2l2ZUJvdW5kKFxuICB0ZXN0Tm9kZTogVFNFU1RyZWUuRXhwcmVzc2lvbixcbiAgY291bnRlck5hbWU6IHN0cmluZyxcbiAgY2xvc3VyZTogRXZhbENsb3N1cmUsXG4gIGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHRcbik6IG51bGwgfCBudW1iZXIge1xuICBmb3IgKGNvbnN0IGNvbmp1bmN0IG9mIHJlYWRDb25qdW5jdHModGVzdE5vZGUpKSB7XG4gICAgaWYgKCFpc0JpbmFyeUV4cHJlc3Npb24oY29uanVuY3QpIHx8IChjb25qdW5jdC5vcGVyYXRvciAhPT0gJzwnICYmIGNvbmp1bmN0Lm9wZXJhdG9yICE9PSAnPD0nKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgY291bnRlck5vZGUgPSBjb25qdW5jdC5sZWZ0IGFzIFRTRVNUcmVlLk5vZGU7XG4gICAgaWYgKCFpc0lkZW50aWZpZXIoY291bnRlck5vZGUpIHx8IGNvdW50ZXJOb2RlLm5hbWUgIT09IGNvdW50ZXJOYW1lKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZFZhbHVlID0gcmVzb2x2ZU51bWJlcihjb25qdW5jdC5yaWdodCwgY2xvc3VyZSwgY29udGV4dCk7XG4gICAgaWYgKGJvdW5kVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBjb25qdW5jdC5vcGVyYXRvciA9PT0gJzwnID8gYm91bmRWYWx1ZSA6IGJvdW5kVmFsdWUgKyAxO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUmVhZHMgaG93IG1hbnkgdGltZXMgYSBjb3VudGluZyBgZm9yYCBydW5zLlxuICpcbiAqIFRoZSBib3VuZCBpcyByZWFkIGZyb20gdGhlIHNhbWUgYCYmYCBjb25qdW5jdHMgYSBkZWFkbGluZSBpcywgZm9yIHRoZSBzYW1lIHJlYXNvbjpcbiAqIGBhdHRlbXB0IDwgQVRURU1QVFMgJiYgIWlzT3BlbmAgc3RpbGwgY2Fubm90IHJ1biBtb3JlIHRoYW4gYEFUVEVNUFRTYCB0aW1lcy4gVGhlIFNURVAgaXMgcmVhZCByYXRoZXJcbiAqIHRoYW4gcHJlc3VtZWQgdG8gYmUgb25lLCBvciBhIGBmb3IgKGxldCBlbGFwc2VkID0gMDsgZWxhcHNlZCA8IEJVREdFVDsgZWxhcHNlZCArPSBJTlRFUlZBTClgIHBvbGwgd291bGRcbiAqIGJlIGNvdW50ZWQgYEJVREdFVGAgdGltZXMuXG4gKlxuICogQHBhcmFtIGxvb3BOb2RlIC0gVGhlIGxvb3AgdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSBjbG9zdXJlIC0gVGhlIGluLU9ic2lkaWFuIGNsb3N1cmUgdGhlIGxvb3AgcnVucyBpbnNpZGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBydWxlIGNvbnRleHQsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgc3RhcnQsIGJvdW5kIGFuZCBzdGVwIHRocm91Z2ggc2NvcGUuXG4gKiBAcmV0dXJucyBUaGUgaXRlcmF0aW9uIGNvdW50LCBvciBgbnVsbGAgd2hlbiBpdCBpcyBub3Qgc3RhdGljYWxseSBrbm93YWJsZS5cbiAqL1xuZnVuY3Rpb24gcmVhZExvb3BJdGVyYXRpb25Db3VudChsb29wTm9kZTogTG9vcFN0YXRlbWVudCwgY2xvc3VyZTogRXZhbENsb3N1cmUsIGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpOiBudWxsIHwgbnVtYmVyIHtcbiAgaWYgKCFpc0ZvclN0YXRlbWVudChsb29wTm9kZSkgfHwgIWxvb3BOb2RlLnRlc3QgfHwgIWxvb3BOb2RlLmluaXQgfHwgIWlzVmFyaWFibGVEZWNsYXJhdGlvbihsb29wTm9kZS5pbml0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGVjbGFyYXRvck5vZGVzID0gbG9vcE5vZGUuaW5pdC5kZWNsYXJhdGlvbnM7XG4gIGNvbnN0IGRlY2xhcmF0b3JOb2RlID0gZGVjbGFyYXRvck5vZGVzLmxlbmd0aCA9PT0gMSA/IGRlY2xhcmF0b3JOb2Rlc1swXSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFkZWNsYXJhdG9yTm9kZT8uaW5pdCB8fCAhaXNJZGVudGlmaWVyKGRlY2xhcmF0b3JOb2RlLmlkKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc3RhcnRWYWx1ZSA9IHJlc29sdmVOdW1iZXIoZGVjbGFyYXRvck5vZGUuaW5pdCwgY2xvc3VyZSwgY29udGV4dCk7XG4gIGNvbnN0IHN0ZXBTaXplID0gcmVhZExvb3BTdGVwU2l6ZShsb29wTm9kZS51cGRhdGUsIGRlY2xhcmF0b3JOb2RlLmlkLCBjbG9zdXJlLCBjb250ZXh0KTtcbiAgY29uc3QgYm91bmRWYWx1ZSA9IHJlYWRMb29wRXhjbHVzaXZlQm91bmQobG9vcE5vZGUudGVzdCwgZGVjbGFyYXRvck5vZGUuaWQubmFtZSwgY2xvc3VyZSwgY29udGV4dCk7XG4gIGlmIChzdGFydFZhbHVlID09PSBudWxsIHx8IHN0ZXBTaXplID09PSBudWxsIHx8IHN0ZXBTaXplIDw9IDAgfHwgYm91bmRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc3BhbiA9IGJvdW5kVmFsdWUgLSBzdGFydFZhbHVlO1xuICByZXR1cm4gc3BhbiA+IDAgPyBNYXRoLmNlaWwoc3BhbiAvIHN0ZXBTaXplKSA6IDA7XG59XG5cbi8qKlxuICogUmVhZHMgaG93IG1hbnkgdGltZXMgc29tZXRoaW5nIHdyaXR0ZW4gYXQgYSBub2RlIGFjdHVhbGx5IHJ1bnMsIGFzIHRoZSBwcm9kdWN0IG9mIGl0cyBlbmNsb3NpbmcgbG9vcHMuXG4gKlxuICogQSBsb29wIHRoYXQgaXMgbm90IHN0YXRpY2FsbHkgY291bnRhYmxlIGNvbnRyaWJ1dGVzIGEgZmFjdG9yIG9mIE9ORSByYXRoZXIgdGhhbiBkaXNxdWFsaWZ5aW5nIHRoZSBzdW06XG4gKiB0aGF0IGlzIHRoZSBwZXItaXRlcmF0aW9uIGNoYXJnZSB0aGlzIHJ1bGUgaGFzIGFsd2F5cyBtYWRlLCBhbmQgaXQgaXMgd2hhdCBrZWVwcyBhbiB1bmJvdW5kZWRcbiAqIGB3aGlsZSAodHJ1ZSlgIHNpbGVudCBpbnN0ZWFkIG9mIGd1ZXNzZWQgYXQuIEEgREVBRExJTkUtYm91bmRlZCBsb29wIGNvbnRyaWJ1dGVzIG9uZSBhcyB3ZWxsLCBiZWNhdXNlXG4gKiBpdHMgd2hvbGUtbG9vcCBjZWlsaW5nIGlzIGNoYXJnZWQgc2VwYXJhdGVseSBhbmQgbXVsdGlwbHlpbmcgdG9vIHdvdWxkIGNvdW50IHRoZSBzYW1lIHdhaXRpbmcgdHdpY2UuXG4gKlxuICogVGhlIHdhbGsgc3RvcHMgYXQgdGhlIGZ1bmN0aW9uIHRoZSBub2RlIGlzIENIQVJHRUQgdG8sIG5vdCBhdCB0aGUgY2xvc3VyZSwgc28gdGhlIGxvb3BzIGFyb3VuZCBhIGhlbHBlcidzXG4gKiBvd24gd2FpdHMgYW5kIHRoZSBsb29wcyBhcm91bmQgZWFjaCBjYWxsIHRvIHRoYXQgaGVscGVyIGFyZSBjb3VudGVkIG9uY2UgZWFjaCByYXRoZXIgdGhhbiB0d2ljZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNvdW50IHRoZSBydW5zIG9mLlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSBmdW5jdGlvbiB0aGUgbm9kZSBpcyBjaGFyZ2VkIHRvLlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcnVsZSBjb250ZXh0LCB1c2VkIHRvIHJlc29sdmUgbG9vcCBib3VuZHMgdGhyb3VnaCBzY29wZS5cbiAqIEByZXR1cm5zIFRoZSBtdWx0aXBsaWVyLCBuZXZlciBsZXNzIHRoYW4gb25lLlxuICovXG5mdW5jdGlvbiByZWFkTG9vcE11bHRpcGxpZXIobm9kZTogVFNFU1RyZWUuTm9kZSwgdGFyZ2V0OiBDaGFyZ2VUYXJnZXQsIGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpOiBudW1iZXIge1xuICBjb25zdCBjbG9zdXJlID0gdGFyZ2V0LmNsb3N1cmU7XG4gIGxldCBtdWx0aXBsaWVyID0gMTtcbiAgbGV0IGN1cnJlbnROb2RlOiBUU0VTVHJlZS5Ob2RlIHwgdW5kZWZpbmVkID0gbm9kZS5wYXJlbnQ7XG5cbiAgd2hpbGUgKGN1cnJlbnROb2RlICYmIGN1cnJlbnROb2RlICE9PSB0YXJnZXQuZnVuY3Rpb25Ob2RlKSB7XG4gICAgaWYgKGlzTG9vcFN0YXRlbWVudChjdXJyZW50Tm9kZSkgJiYgcmVhZExvb3BEZWFkbGluZUluTWlsbGlzZWNvbmRzKGN1cnJlbnROb2RlLCBjbG9zdXJlLCBjb250ZXh0KSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgaXRlcmF0aW9uQ291bnQgPSByZWFkTG9vcEl0ZXJhdGlvbkNvdW50KGN1cnJlbnROb2RlLCBjbG9zdXJlLCBjb250ZXh0KTtcbiAgICAgIGlmIChpdGVyYXRpb25Db3VudCAhPT0gbnVsbCkge1xuICAgICAgICBtdWx0aXBsaWVyICo9IGl0ZXJhdGlvbkNvdW50O1xuICAgICAgfVxuICAgIH1cbiAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBtdWx0aXBsaWVyO1xufVxuXG4vKipcbiAqIFJlYWRzIGhvdyBmYXIgYSBjb3VudGluZyBsb29wJ3MgdmFyaWFibGUgYWR2YW5jZXMgZWFjaCBpdGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHVwZGF0ZU5vZGUgLSBUaGUgbG9vcCdzIHVwZGF0ZSBleHByZXNzaW9uLlxuICogQHBhcmFtIGNvdW50ZXJOb2RlIC0gVGhlIGlkZW50aWZpZXIgdGhlIGxvb3AgY291bnRzIG9uLlxuICogQHBhcmFtIGNsb3N1cmUgLSBUaGUgaW4tT2JzaWRpYW4gY2xvc3VyZSB0aGUgbG9vcCBydW5zIGluc2lkZS5cbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHJ1bGUgY29udGV4dCwgdXNlZCB0byByZXNvbHZlIGEgbm9uLWxpdGVyYWwgc3RlcCB0aHJvdWdoIHNjb3BlLlxuICogQHJldHVybnMgVGhlIHN0ZXAsIG9yIGBudWxsYCB3aGVuIHRoZSB1cGRhdGUgaXMgbm90IGEgcGxhaW4gYWR2YW5jZSBvZiB0aGUgbG9vcCdzIG93biBjb3VudGVyLlxuICovXG5mdW5jdGlvbiByZWFkTG9vcFN0ZXBTaXplKFxuICB1cGRhdGVOb2RlOiBudWxsIHwgVFNFU1RyZWUuRXhwcmVzc2lvbixcbiAgY291bnRlck5vZGU6IFRTRVNUcmVlLklkZW50aWZpZXIsXG4gIGNsb3N1cmU6IEV2YWxDbG9zdXJlLFxuICBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0XG4pOiBudWxsIHwgbnVtYmVyIHtcbiAgaWYgKCF1cGRhdGVOb2RlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoaXNVcGRhdGVFeHByZXNzaW9uKHVwZGF0ZU5vZGUpKSB7XG4gICAgY29uc3QgYXJndW1lbnROb2RlID0gdXBkYXRlTm9kZS5hcmd1bWVudCBhcyBUU0VTVHJlZS5Ob2RlO1xuICAgIHJldHVybiB1cGRhdGVOb2RlLm9wZXJhdG9yID09PSAnKysnICYmIGlzSWRlbnRpZmllcihhcmd1bWVudE5vZGUpICYmIGFyZ3VtZW50Tm9kZS5uYW1lID09PSBjb3VudGVyTm9kZS5uYW1lID8gMSA6IG51bGw7XG4gIH1cblxuICBpZiAoIWlzQXNzaWdubWVudEV4cHJlc3Npb24odXBkYXRlTm9kZSkgfHwgdXBkYXRlTm9kZS5vcGVyYXRvciAhPT0gJys9Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0Tm9kZSA9IHVwZGF0ZU5vZGUubGVmdCBhcyBUU0VTVHJlZS5Ob2RlO1xuICByZXR1cm4gIWlzSWRlbnRpZmllcih0YXJnZXROb2RlKSB8fCB0YXJnZXROb2RlLm5hbWUgIT09IGNvdW50ZXJOb2RlLm5hbWUgPyBudWxsIDogcmVzb2x2ZU51bWJlcih1cGRhdGVOb2RlLnJpZ2h0LCBjbG9zdXJlLCBjb250ZXh0KTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgYGlucHV0YCBrZXkgYSBkZXN0cnVjdHVyZWQgY2xvc3VyZSBwYXJhbWV0ZXIgaXMgYm91bmQgZnJvbS5cbiAqXG4gKiBUaGUgYmluZGluZyBtYXkgYmUgcmVuYW1lZCAoYHRpbWVvdXRJbk1pbGxpc2Vjb25kczogdGltZW91dGApLCBzbyB0aGUgS0VZIGlzIHdoYXQgdGhlIGNhbGwncyBgaW5wdXRgXG4gKiBpcyBsb29rZWQgdXAgYnksIG5ldmVyIHRoZSBsb2NhbCBuYW1lLlxuICpcbiAqIEBwYXJhbSBjbG9zdXJlTm9kZSAtIFRoZSBjbG9zdXJlIHdob3NlIHBhcmFtZXRlcnMgdG8gcmVhZC5cbiAqIEBwYXJhbSBsb2NhbE5hbWUgLSBUaGUgbmFtZSB0aGUgYnVkZ2V0IGlzIGJvdW5kIHRvIGluc2lkZSB0aGUgY2xvc3VyZS5cbiAqIEByZXR1cm5zIFRoZSBgaW5wdXRgIGtleSwgb3IgYG51bGxgIHdoZW4gdGhlIG5hbWUgaXMgbm90IGJvdW5kIGJ5IGEgcGxhaW4gZGVzdHJ1Y3R1cmVkIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiByZWFkUGFyYW1ldGVySW5wdXRLZXkoY2xvc3VyZU5vZGU6IENsb3N1cmVGdW5jdGlvbiwgbG9jYWxOYW1lOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgZm9yIChjb25zdCBwYXJhbWV0ZXJOb2RlIG9mIGNsb3N1cmVOb2RlLnBhcmFtcykge1xuICAgIGlmICghaXNPYmplY3RQYXR0ZXJuKHBhcmFtZXRlck5vZGUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHBhcmFtZXRlck5vZGUucHJvcGVydGllcykge1xuICAgICAgaWYgKCFpc1Byb3BlcnR5KHByb3BlcnR5KSB8fCBwcm9wZXJ0eS5jb21wdXRlZCB8fCAhaXNJZGVudGlmaWVyKHByb3BlcnR5LmtleSkgfHwgIWlzSWRlbnRpZmllcihwcm9wZXJ0eS52YWx1ZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9wZXJ0eS52YWx1ZS5uYW1lID09PSBsb2NhbE5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHByb3BlcnR5LmtleS5uYW1lO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBleHByZXNzaW9uIGNhcnJ5aW5nIGEgd2FpdCBjYWxsJ3MgZGVjbGFyZWQgYnVkZ2V0LlxuICpcbiAqIEBwYXJhbSBjYWxsTm9kZSAtIFRoZSBjYWxsIGV4cHJlc3Npb24gdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIFRoZSBleHByZXNzaW9uIHRvIHJlc29sdmU7IGBudWxsYCBmb3IgYSBgd2FpdFVudGlsYCB0aGF0IG9taXRzIGl0cyB0aW1lb3V0LCB3aGljaCB0YWtlcyB0aGVcbiAqIGhlbHBlcidzIGRlZmF1bHQ7IG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIGNhbGwgaXMgbm90IGEgd2FpdCBhdCBhbGwuXG4gKi9cbmZ1bmN0aW9uIHJlYWRXYWl0QnVkZ2V0RXhwcmVzc2lvbihjYWxsTm9kZTogVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb24pOiBudWxsIHwgVFNFU1RyZWUuTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghaXNJZGVudGlmaWVyKGNhbGxOb2RlLmNhbGxlZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgY2FsbGVlTmFtZSA9IGNhbGxOb2RlLmNhbGxlZS5uYW1lO1xuXG4gIGlmIChjYWxsZWVOYW1lID09PSBTTEVFUF9DQUxMRUVfTkFNRSkge1xuICAgIHJldHVybiAoY2FsbE5vZGUuYXJndW1lbnRzWzBdKSA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoY2FsbGVlTmFtZSAhPT0gV0FJVF9VTlRJTF9DQUxMRUVfTkFNRSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwYXJhbXNOb2RlID0gY2FsbE5vZGUuYXJndW1lbnRzWzBdIGFzIFRTRVNUcmVlLk5vZGUgfCB1bmRlZmluZWQ7XG4gIGlmICghcGFyYW1zTm9kZSB8fCAhaXNPYmplY3RFeHByZXNzaW9uKHBhcmFtc05vZGUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHRpbWVvdXRQcm9wZXJ0eSA9IHBhcmFtc05vZGUucHJvcGVydGllcy5maW5kKChwcm9wZXJ0eSkgPT5cbiAgICBpc1Byb3BlcnR5KHByb3BlcnR5IGFzIFRTRVNUcmVlLk5vZGUpXG4gICAgJiYgaXNJZGVudGlmaWVyKChwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Qcm9wZXJ0eSkua2V5IGFzIFRTRVNUcmVlLk5vZGUpXG4gICAgJiYgKChwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Qcm9wZXJ0eSkua2V5IGFzIFRTRVNUcmVlLklkZW50aWZpZXIpLm5hbWUgPT09IFRJTUVPVVRfUFJPUEVSVFlfTkFNRVxuICApIGFzIFRTRVNUcmVlLlByb3BlcnR5IHwgdW5kZWZpbmVkO1xuXG4gIHJldHVybiAodGltZW91dFByb3BlcnR5Py52YWx1ZSkgPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhbiBleHByZXNzaW9uIHRvIGEgbnVtYmVyLCB0aHJvdWdoIHNjb3BlLlxuICpcbiAqIEV2ZXJ5IG51bWJlciB0aGUgcnVsZSByZWFkcyBjb21lcyB0aHJvdWdoIGhlcmUg4oCUIGEgd2FpdCdzIGJ1ZGdldCwgYSBsb29wJ3MgZGVhZGxpbmUsIGFuZCBhIGNvdW50aW5nXG4gKiBsb29wJ3Mgc3RhcnQsIGJvdW5kIGFuZCBzdGVwIOKAlCB3aGljaCBpcyB3aHkgaXQgaXMgbmFtZWQgZm9yIHdoYXQgaXQgcmVzb2x2ZXMgcmF0aGVyIHRoYW4gZm9yXG4gKiBtaWxsaXNlY29uZHMuXG4gKlxuICogSGFuZGxlcyBhIG51bWVyaWMgbGl0ZXJhbCwgYSBsaXRlcmFsLW9ubHkgcHJvZHVjdCAoYDYwICogMTAwMGApLCBhbiBpZGVudGlmaWVyIGJvdW5kIHRvIGVpdGhlciBpbiBhbnlcbiAqIGVuY2xvc2luZyBzY29wZSwgYW5kIGEgZGVzdHJ1Y3R1cmVkIGNsb3N1cmUgcGFyYW1ldGVyIGZvbGxvd2VkIGJhY2sgdGhyb3VnaCB0aGUgY2FsbCdzIG93biBgaW5wdXRgLlxuICogQW55dGhpbmcgZWxzZSBpcyB1bnJlc29sdmFibGUgYW5kIGFuc3dlcnMgYG51bGxgLCB3aGljaCB0aGUgY2FsbGVyIHRyZWF0cyBhcyBjb250cmlidXRpbmcgbm90aGluZy5cbiAqXG4gKiBFYWNoIGlkZW50aWZpZXIgaXMgcmVzb2x2ZWQgZnJvbSBJVFMgT1dOIHNjb3BlIHJhdGhlciB0aGFuIGZyb20gdGhlIHdhaXQncywgc28gYSB2YWx1ZSBzdXBwbGllZCBieSB0aGVcbiAqIGNhbGwncyBgaW5wdXRgIHJlc29sdmVzIGF0IHRoZSBjYWxsIHNpdGUg4oCUIHdoZXJlIGl0IHdhcyB3cml0dGVuIOKAlCBhbmQgaXMgbm90IGNhcHR1cmVkIGJ5IGEgc2FtZS1uYW1lZFxuICogYmluZGluZyB0aGF0IGhhcHBlbnMgdG8gZXhpc3QgaW5zaWRlIHRoZSBjbG9zdXJlLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIGV4cHJlc3Npb24gdG8gcmVzb2x2ZS5cbiAqIEBwYXJhbSBjbG9zdXJlIC0gVGhlIGNsb3N1cmUgdGhlIGV4cHJlc3Npb24gd2FzIHdyaXR0ZW4gaW5zaWRlLlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcnVsZSBjb250ZXh0LCB1c2VkIHRvIHJlc29sdmUgaWRlbnRpZmllcnMgdGhyb3VnaCBzY29wZS5cbiAqIEByZXR1cm5zIFRoZSBudW1iZXIsIG9yIGBudWxsYCB3aGVuIGl0IGNhbm5vdCBiZSByZXNvbHZlZCBzdGF0aWNhbGx5LlxuICovXG5mdW5jdGlvbiByZXNvbHZlTnVtYmVyKG5vZGU6IFRTRVNUcmVlLk5vZGUsIGNsb3N1cmU6IEV2YWxDbG9zdXJlLCBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0KTogbnVsbCB8IG51bWJlciB7XG4gIGNvbnN0IHZpc2l0ZWROb2RlcyA9IG5ldyBTZXQ8VFNFU1RyZWUuTm9kZT4oKTtcbiAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTtcblxuICB3aGlsZSAoIXZpc2l0ZWROb2Rlcy5oYXMoY3VycmVudE5vZGUpKSB7XG4gICAgdmlzaXRlZE5vZGVzLmFkZChjdXJyZW50Tm9kZSk7XG5cbiAgICBpZiAoaXNOdW1lcmljTGl0ZXJhbChjdXJyZW50Tm9kZSkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNCaW5hcnlFeHByZXNzaW9uKGN1cnJlbnROb2RlKSAmJiBjdXJyZW50Tm9kZS5vcGVyYXRvciA9PT0gJyonKSB7XG4gICAgICBjb25zdCBsZWZ0VmFsdWUgPSByZXNvbHZlTnVtYmVyKGN1cnJlbnROb2RlLmxlZnQsIGNsb3N1cmUsIGNvbnRleHQpO1xuICAgICAgY29uc3QgcmlnaHRWYWx1ZSA9IHJlc29sdmVOdW1iZXIoY3VycmVudE5vZGUucmlnaHQsIGNsb3N1cmUsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gbGVmdFZhbHVlID09PSBudWxsIHx8IHJpZ2h0VmFsdWUgPT09IG51bGwgPyBudWxsIDogbGVmdFZhbHVlICogcmlnaHRWYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzSWRlbnRpZmllcihjdXJyZW50Tm9kZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGJvdW5kTm9kZSA9IHJlYWRCb3VuZEV4cHJlc3Npb24oY3VycmVudE5vZGUsIGNsb3N1cmUsIGNvbnRleHQpO1xuICAgIGlmICghYm91bmROb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjdXJyZW50Tm9kZSA9IGJvdW5kTm9kZTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThIQSxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHdDQUF3QztBQUVqRDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUtBLE1BQU0sYUFBYTtBQUsxQixNQUFNLDZDQUE2QztBQUVuRCxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLG9CQUFvQjtBQUMxQixNQUFNLHdCQUF3QjtBQUM5QixNQUFNLHlCQUF5QjtBQU0vQixNQUFNLHFCQUFxQixvQkFBSSxJQUFJLENBQUMsUUFBUSxhQUFhLENBQUM7QUFFMUQsTUFBTSxrQkFBa0I7QUFPeEIsTUFBTSwrQkFBK0Isb0JBQUksSUFBK0I7QUFBQSxFQUN0RSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztBQUFBLEVBQy9CLENBQUMsa0JBQWtCLENBQUMsUUFBUSxPQUFPLENBQUM7QUFDdEMsQ0FBQztBQW1ITSxNQUFNLGdDQUFpRDtBQUFBLEVBQzVELE9BQU8sU0FBUztBQUNkLFVBQU0sVUFBVSxRQUFRLFFBQVEsQ0FBQztBQUNqQyxVQUFNLDJCQUEyQixRQUFRLFNBQVMsU0FBUyxvQ0FBb0MsSUFDM0YsdUNBQ0E7QUFDSixVQUFNLG9CQUFvQixTQUFTLHFCQUFxQjtBQUN4RCxVQUFNLFlBQXVCO0FBQUEsTUFDM0IsbUNBQW1DLG9CQUFJLElBQWlEO0FBQUEsTUFDeEYsb0JBQW9CLG9CQUFJLElBQW1DO0FBQUEsTUFDM0Qsa0NBQWtDLG9CQUFJLElBQTRCO0FBQUEsSUFDcEU7QUFTQSxhQUFTLFFBQVEsUUFBc0IsWUFBNEIsV0FBeUI7QUFDMUYsWUFBTSxRQUFRLGlCQUFpQixNQUFNO0FBQ3JDLFlBQU0sY0FBYyxJQUFJ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
|
|
542
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saW50ZXJzL2VzbGludC1ydWxlcy9uby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEVTTGludCBydWxlOiBuby1vdmVyLWNhcC13YWl0LWluLWV2YWwtaW4tb2JzaWRpYW5cbiAqXG4gKiBSZXBvcnRzIGFuIGBldmFsSW5PYnNpZGlhbmAgLyBgcG9sbEluT2JzaWRpYW5gIGNsb3N1cmUgdGhhdCBkZWNsYXJlcyBtb3JlIHdhaXRpbmdcbiAqIHRoYW4gdGhlIHRyYW5zcG9ydCBjYW4gZXZlciBob25vdXIuXG4gKlxuICogQSBzaW5nbGUgY2xvc3VyZSBpcyBldmFsdWF0ZWQgdGhyb3VnaCBvbmUgdHJhbnNwb3J0IGNhbGwsIGFuZCB0aGF0IGNhbGwgaXMgY2FwcGVkIGF0XG4gKiByb3VnaGx5IDMwIHNlY29uZHMg4oCUIEFwcGl1bSBzdXJmYWNlcyB0aGUgY2FwIGFzIGEgYmFyZSBgV2ViRHJpdmVyRXJyb3I6IHNjcmlwdCB0aW1lb3V0YFxuICogbmFtaW5nIG9ubHkgYEFwcGl1bVRyYW5zcG9ydC5ldmFsdWF0ZWAsIENEUCBhcyBhIGNvbW1hbmQgdGltZW91dC4gTmVpdGhlciBuYW1lcyB0aGUgd2FpdFxuICogdGhhdCBhY3R1YWxseSBibGV3IHRoZSBidWRnZXQsIHNvIHRoZSBmYWlsdXJlIHJlYWRzIGFzIGEgYnJva2VuIGRldmljZSByYXRoZXIgdGhhbiBhcyBhXG4gKiBjbG9zdXJlIGFza2luZyBmb3IgbW9yZSB0aW1lIHRoYW4gZXhpc3RzLiBUaGF0IG1pc2RpYWdub3NpcyBjb3N0IHR3byBkYXlzLlxuICpcbiAqIFRoZSBjYXAgdGhlIHJ1bGUgYXNzdW1lcyB3aGVuIGBjYXBJbk1pbGxpc2Vjb25kc2AgaXMgbm90IGNvbmZpZ3VyZWQgaXNcbiAqIGBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EU2AgKDMwIDAwMCksIHRoZSBjYXAgYm90aCBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ2AgdHJhbnNwb3J0c1xuICogZW5mb3JjZS4gSXQgaXMgcmVzdGF0ZWQgaW4gYC4uLy4uL3Rlc3QtcnVubmVycy9wZXJmb3JtYW5jZS1ldmFsLWNhcC50c2AgcmF0aGVyIHRoYW4gaW1wb3J0ZWQgZnJvbSB0aGVcbiAqIGhhcm5lc3MsIGJlY2F1c2UgdGhlIGhhcm5lc3MgaXMgYW4gT1BUSU9OQUwgcGVlciBhbmQgdGhlIHNoYXJlZCBFU0xpbnQgY29uZmlnIGxvYWRzIHRoaXMgcnVsZSBpbiBldmVyeVxuICogY29uc3VtaW5nIHJlcG8sIGluY2x1ZGluZyBvbmUgdGhhdCBkb2VzIG5vdCBydW4gaW50ZWdyYXRpb24gdGVzdHM7IGEgdW5pdCB0ZXN0IHRoZXJlIHBpbnMgdGhlIHR3byBudW1iZXJzXG4gKiB0b2dldGhlciwgc28gdGhlIHJ1bGUgc3RpbGwgY2Fubm90IGRyaWZ0IGZyb20gdGhlIHRoaW5nIGl0IGlzIHByZWRpY3RpbmcuXG4gKlxuICogT05FIEtJTkQgT0YgRklMRSBERUZBVUxUUyBISUdIRVI6IGEgYCouZGVza3RvcC1wZXJmb3JtYW5jZS5pbnRlZ3JhdGlvbi50ZXN0LnRzYCBpcyBtZWFzdXJlZCBhZ2FpbnN0XG4gKiBgUEVSRk9STUFOQ0VfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTYCAoNjAwIDAwMCksIHRoZSBwZXItZXZhbCBjYXAgdGhlIHNoYXJlZCB2aXRlc3QgY29uZmlnIGdpdmVzIHRoZVxuICogYGludGVncmF0aW9uLXRlc3RzOmRlc2t0b3AtcGVyZm9ybWFuY2VgIHByb2plY3QsIGltcG9ydGVkIGZyb20gdGhhdCBzYW1lIG1vZHVsZSByYXRoZXIgdGhhbiByZXN0YXRlZC5cbiAqIFRoYXQgcmFpc2UgaXMgYSBkZWxpYmVyYXRlIEJVREdFVDogYSBwZXJmIHN1aXRlJ3MgbWVhc3VyZW1lbnQgaXMgb25lIGxvbmcgaW4tcGFnZSBldmFsdWF0aW9uLCBhbmQgaXRzXG4gKiBmaWxlcyBydW4gb24gbm8gb3RoZXIgcHJvamVjdC4gRXZlcnkgb3RoZXIgZmlsZSBrZWVwcyB0aGUgc2luZ2xlIHRyYW5zcG9ydCBkZWZhdWx0LCBhbmQgdGhhdCBpcyB0aGVcbiAqIGNvbnZlbnRpb24gcmF0aGVyIHRoYW4gYSBnYXA6IGEgcmVwbyB0aGF0IHJhaXNlcyBpdHMgb3duIGRlc2t0b3AgYGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHNgIGlzXG4gKiBzZXR0aW5nIGEgYmFja3N0b3AsIE5PVCBhIGJ1ZGdldCBhIGNsb3N1cmUgbWF5IHNwZW5kLCBzbyB0aGUgcnVsZSBkb2VzIG5vdCByZWFkIHRoYXQgcmFpc2UgYW5kIGtlZXBzXG4gKiBlbmZvcmNpbmcgMzAgMDAwIGFnYWluc3QgaXQuIEEgY3Jvc3MtcGxhdGZvcm0gc3VpdGUgY291bGQgbm90IHNwZW5kIGl0IGFueXdheTogQXBwaXVtIGNhcHMgZXZlcnlcbiAqIGNsb3N1cmUgYXQgMzAgMDAwIHdoYXRldmVyIGEgZGVza3RvcCByYWlzZSBzYXlzLiBBbiBleHBsaWNpdCBgY2FwSW5NaWxsaXNlY29uZHNgIHN0aWxsIG92ZXJyaWRlcyBib3RoXG4gKiBkZWZhdWx0cywgZm9yIGV2ZXJ5IGZpbGUgdGhlIHJ1bGUgaXMgY29uZmlndXJlZCBvbi5cbiAqXG4gKiBBIGNsb3N1cmUgZGVjbGFyaW5nIGEgMzAgMDAwIG1zIGB3YWl0VW50aWxgLCBvciB0d28gMjAgMDAwIG1zIG9uZXMsIHRoZXJlZm9yZSBjYW5ub3RcbiAqIHN1Y2NlZWQgb24gYW55IG1hY2hpbmUgc2xvdyBlbm91Z2ggdG8gbmVlZCB0aGUgdGltZSBpdCBhc2tzIGZvci4gVGhlIGZpeCBpcyB0byBtb3ZlIHRoZVxuICogd2FpdGluZyB0byBOb2RlOiBgcG9sbEluT2JzaWRpYW5gIHJ1bnMgYSBTSE9SVCBET00tcmVhZGluZyBgcG9sbGAgY2xvc3VyZSByZXBlYXRlZGx5LFxuICogZXZhbHVhdGVzIGB1bnRpbGAgaW4gTm9kZSwgYW5kIGNhcnJpZXMgdGhlIGxvbmcgYnVkZ2V0IGluIGB0aW1lb3V0SW5NaWxsaXNlY29uZHNgLCBzbyBub1xuICogc2luZ2xlIHRyYW5zcG9ydCBjYWxsIGlzIGV2ZXIgbG9uZy5cbiAqXG4gKiBXSEFUIENPVU5UUyB0b3dhcmQgYSBjbG9zdXJlJ3MgYnVkZ2V0LCBzdW1tZWQgbGV4aWNhbGx5OiBldmVyeSBgd2FpdFVudGlsYCBpbnNpZGUgaXQg4oCUXG4gKiB0YWtpbmcgdGhlIGhlbHBlcidzIGRvY3VtZW50ZWQgNSAwMDAgbXMgZGVmYXVsdCB3aGVuIGB0aW1lb3V0SW5NaWxsaXNlY29uZHNgIGlzIG9taXR0ZWQsXG4gKiB3aGljaCBpcyB3aGF0IG1ha2VzIHNldmVyYWwgc21hbGwgc2libGluZyB3YWl0cyBhZGQgdXAgaG9uZXN0bHkg4oCUIHBsdXMgZXZlcnkgYHNsZWVwKG4pYFxuICogc2V0dGxlLiBXYWl0cyBpbnNpZGUgYSBoZWxwZXIgZGVjbGFyZWQgd2l0aGluIHRoZSBjbG9zdXJlIGNvdW50IHRvbzsgdGhlIGVuY2xvc2luZ1xuICogY2xvc3VyZSBpcyBmb3VuZCBieSB3YWxraW5nIG91dHdhcmRzLCBzbyBhIG5lc3RlZCBmdW5jdGlvbiBhdHRyaWJ1dGVzIHRvIHRoZSBjbG9zdXJlIGl0XG4gKiBydW5zIGluc2lkZSAtLSBvbmNlIHBlciBDQUxMIFNJVEUsIHBlciB0aGUgSEVMUEVSUyBwYXJhZ3JhcGggYmVsb3cuXG4gKlxuICogV0hBVCBET0VTIE5PVC4gQSBidWRnZXQgdGhhdCBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSBudW1iZXIgY29udHJpYnV0ZXMgbm90aGluZyBhbmQgaXNcbiAqIG5ldmVyIHJlcG9ydGVkIChvd25lciwgMjAyNi0wOS0wOSkuIFNjb3BlIGFuYWx5c2lzIHJlc29sdmVzIHRoZSBzaGFwZXMgdGhhdCBhY3R1YWxseVxuICogb2NjdXIg4oCUIGEgbGl0ZXJhbCwgYSBgY29uc3RgIGluIGFueSBlbmNsb3Npbmcgc2NvcGUsIGFuZCBhIGRlc3RydWN0dXJlZCBjYWxsYmFja1xuICogcGFyYW1ldGVyIGZvbGxvd2VkIGJhY2sgdGhyb3VnaCB0aGUgY2FsbCdzIG93biBgaW5wdXRgIG9iamVjdCDigJQgYW5kIHJlc29sdmluZyB0aHJvdWdoXG4gKiBzY29wZSByYXRoZXIgdGhhbiBieSByZWdleCBpcyB0aGUgd2hvbGUgcmVhc29uIHRoaXMgaXMgYSBydWxlIGFuZCBub3QgYSBzY3JpcHQuIEJ1dCBhXG4gKiB2YWx1ZSBhcnJpdmluZyBmcm9tIGEgY2FsbGVyIChgb3B0aW9ucy50aW1lb3V0ID8/IERFRkFVTFRgLCB0aHJlYWRlZCB0aHJvdWdoIGFcbiAqIHBhcmFtZXRlcikgd291bGQgbmVlZCBhbmFseXNpcyBhY3Jvc3MgY2FsbCBib3VuZGFyaWVzLCBhbmQgcmVwb3J0aW5nIGV2ZXJ5IHN1Y2ggc2l0ZSB3b3VsZFxuICogbWFrZSBlYWNoIGxlZ2l0aW1hdGVseSBwYXJhbWV0ZXJpemVkIGhlbHBlciByZWQgYWNyb3NzIHRoaXJ0eSByZXBvcy5cbiAqXG4gKiBMT09QUyB3ZXJlIG9uY2Ugb3V0IG9mIHNjb3BlIHdob2xlc2FsZSwgb24gdGhlIHJlYXNvbmluZyB0aGF0IGEgYHNsZWVwYCBpbiBhIGB3aGlsZWAgaGFzIG5vXG4gKiBzdGF0aWNhbGx5IGRlY2xhcmVkIGNlaWxpbmcuIFRoYXQgaXMgdHJ1ZSBvZiBgd2hpbGUgKHRydWUpYCBhbmQgZmFsc2Ugb2YgdGhlIGxvb3AgdGhlc2VcbiAqIHN1aXRlcyBhY3R1YWxseSB3cml0ZSwgd2hpY2ggZGVjbGFyZXMgaXRzIGNlaWxpbmcgYXMgcGxhaW5seSBhcyBhbnkgbGl0ZXJhbCB0aW1lb3V0IOKAlCBhbmRcbiAqIGxlYXZpbmcgdGhlbSBhbGwgb3V0IGhpZCAyMiBvdmVyLWNhcCBjbG9zdXJlcyBhY3Jvc3Mgc2l4IHJlcG9zLCBvbmUgb2YgdGhlbSB0ZW4gdGltZXMgb3Zlci5cbiAqIFR3byBzaGFwZXMgYXJlIHJlYWQgbm93LCBib3RoIHRocm91Z2ggdGhlIHNhbWUgc2NvcGUgd2FsayBhIGJ1ZGdldCB1c2VzOlxuICpcbiAqIC0gQSBERUFETElORSBsb29wIOKAlCBgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQlVER0VUYCwgZ3VhcmRlZCBieSBgRGF0ZS5ub3coKSA8IGRlYWRsaW5lYCDigJRcbiAqICAgY2Fubm90IHJ1biBsb25nZXIgdGhhbiBgQlVER0VUYCB3aGF0ZXZlciBpdHMgcG9sbCBpbnRlcnZhbCwgc28gYEJVREdFVGAgaXMgY2hhcmdlZCB0byB0aGVcbiAqICAgY2xvc3VyZSBPTkNFIHBlciBsb29wLCBvbiB0b3Agb2YgdGhlIHNpbmdsZSBpdGVyYXRpb24gaXRzIGlubmVyIHdhaXRzIGFyZSBhbHJlYWR5IGNoYXJnZWRcbiAqICAgKGEgcG9sbCB0aGF0IHN0YXJ0cyBqdXN0IHVuZGVyIHRoZSBkZWFkbGluZSBzdGlsbCBydW5zIHRvIGNvbXBsZXRpb24sIHNvIHRoZSBzdW0gb2YgdGhlIHR3b1xuICogICBpcyB0aGUgaG9uZXN0IHdvcnN0IGNhc2UgcmF0aGVyIHRoYW4gYSBkb3VibGUgY291bnQpLiBgcGVyZm9ybWFuY2Uubm93KClgIGNvdW50cyBhcyB3ZWxsIGFzXG4gKiAgIGBEYXRlLm5vdygpYDogYSBgcGVyZm9ybWFuY2VgLXdyaXR0ZW4gZGVhZGxpbmUgcmVhZCBhcyB1bmJvdW5kZWQgaXMgd2h5IG9uZSAyNDUgMDI1IG1zXG4gKiAgIGNsb3N1cmUgd2FzIGFic2VudCBmcm9tIGV2ZXJ5IHJvc3RlciBwcm9kdWNlZCBiZWZvcmUgdGhpcy5cbiAqIC0gQSBDT1VOVElORyBgZm9yYCDigJQgYGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgQVRURU1QVFM7IGF0dGVtcHQrKylgIOKAlCBtdWx0aXBsaWVzIGV2ZXJ5XG4gKiAgIHdhaXQgaW5zaWRlIGl0IGJ5IGl0cyBpdGVyYXRpb24gY291bnQsIHJlYWQgZnJvbSB0aGUgbG9vcCdzIG93biBzdGFydCwgYm91bmQgYW5kIHN0ZXAuXG4gKlxuICogRWl0aGVyIGNlaWxpbmcgbWF5IGJlIE9ORSBDT05KVU5DVCBvZiBhIGNvbXBvdW5kIHRlc3QgKGB3aGlsZSAoY291bnQgPCBleHBlY3RlZCAmJiBEYXRlLm5vdygpIDwgZGVhZGxpbmUpYCxcbiAqIGBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IEFUVEVNUFRTICYmICFpc09wZW47IGF0dGVtcHQrKylgKSwgd2hpY2ggaXMgaG93IGJvdGggYXJlIGFjdHVhbGx5XG4gKiB3cml0dGVuOiBhIHByb2dyZXNzIGNvbmRpdGlvbiBiZXNpZGUgdGhlIGd1YXJkIGRvZXMgbm90IHJlbW92ZSB0aGUgY2VpbGluZyB0aGUgb3RoZXIgY29uanVuY3QgZGVjbGFyZXMuXG4gKlxuICogQW55dGhpbmcgZWxzZSBrZWVwcyB0aGUgb2xkIHBlci1pdGVyYXRpb24gY2hhcmdlIHJhdGhlciB0aGFuIGEgZ3Vlc3Mg4oCUIGB3aGlsZSAodHJ1ZSlgLCBhIGBmb3LigKZvZmAsXG4gKiBhIGJvdW5kIG9yIGRlYWRsaW5lIHRoYXQgZG9lcyBub3QgcmVzb2x2ZSDigJQgd2hpY2ggaXMgd2hhdCBrZWVwcyBhIGdlbnVpbmVseSB1bmJvdW5kZWQgbG9vcCBzaWxlbnQuXG4gKlxuICogQSBIRUxQRVIgZGVjbGFyZWQgaW5zaWRlIHRoZSBjbG9zdXJlIGlzIGNoYXJnZWQgb25jZSBwZXIgQ0FMTCBTSVRFLCB3aGljaCBpcyBob3cgbWFueSB0aW1lcyBpdHMgd2FpdGluZ1xuICogYWN0dWFsbHkgcnVucy4gSXRzIG93biB3YWl0cyBhcmUgc3VtbWVkIG9uY2UgYW5kIG11bHRpcGxpZWQgYnkgdGhlIGNhbGxzIHRoYXQgcmVhY2ggaXQsIGVhY2ggY2FsbFxuICogY2FycnlpbmcgdGhlIGNvdW50aW5nIGxvb3BzIGl0IGlzIGl0c2VsZiB3cml0dGVuIGluc2lkZSDigJQgc28gYSBsb2NhbCBgd2FpdFVudGlsKGNoZWNrKWAgb2ZcbiAqIGBmb3IgKGF0dGVtcHQgPCA0MCkgYXdhaXQgc2xlZXAoMjUwKWAgY2FsbGVkIHRocmVlIHRpbWVzIGRlY2xhcmVzIDMwIDAwMCBtcyByYXRoZXIgdGhhbiB0aGUgMTAgMDAwIG1zIGFcbiAqIHNpbmdsZSBhdHRyaWJ1dGlvbiByZXBvcnRlZC4gVGhyZWUgYm91bmRzIGtlZXAgdGhhdCBob25lc3Q6XG4gKlxuICogLSBBIGhlbHBlciBkZWNsYXJlZCBPVVRTSURFIHRoZSBjbG9zdXJlIHN0YXlzIG91dCBvZiBzY29wZSwgZm9yIHRoZSBzYW1lIHJlYXNvbiBhIGJ1ZGdldCBhcnJpdmluZyBmcm9tXG4gKiAgIGEgY2FsbGVyIGlzOiByZWFkaW5nIGl0IG5lZWRzIGFuYWx5c2lzIGFjcm9zcyBjYWxsIGJvdW5kYXJpZXMsIGFuZCB3aWRlbmluZyB0aGVyZSB3b3VsZCBtYWtlIGV2ZXJ5XG4gKiAgIGxlZ2l0aW1hdGVseSBwYXJhbWV0ZXJpemVkIGhlbHBlciBpbiBldmVyeSBjb25zdW1pbmcgcmVwbyByZWQuXG4gKiAtIFJFQ1VSU0lPTiB0ZXJtaW5hdGVzIGJ5IGNoYXJnaW5nIGEgcmUtZW50ZXJlZCBoZWxwZXIgbm90aGluZywgc28gbmVpdGhlciBhIHNlbGYtY2FsbCBub3IgYSBtdXR1YWxseVxuICogICByZWN1cnNpdmUgcGFpciBpcyBjaGFyZ2VkIGZvcmV2ZXIuIEEgcmVjdXJzaXZlIGNhbGwgY29udHJpYnV0ZXMgdGhlIHNpbGVuY2UgYW4gdW5ib3VuZGVkIGxvb3AgZG9lcy5cbiAqIC0gQSBoZWxwZXIgdGhlIGNsb3N1cmUgbmV2ZXIgUkVBQ0hFUyDigJQgZGVhZCwgb3IgY2FsbGVkIHRocm91Z2ggc29tZXRoaW5nIHRoaXMgcnVsZSBjYW5ub3QgcmVzb2x2ZSwgc3VjaFxuICogICBhcyBhIGJhcmUgcmVmZXJlbmNlIGhhbmRlZCB0byBgZm9yRWFjaGAg4oCUIGtlZXBzIHRoZSBmbGF0IHNpbmdsZSBjaGFyZ2UgaXQgaGFzIGFsd2F5cyBoYWQuIFNvIG5vXG4gKiAgIGNsb3N1cmUgdGhpcyBydWxlIHJlcG9ydHMgdG9kYXkgZmFsbHMgc2lsZW50IGJlY2F1c2UgYSBjYWxsIHNpdGUgY291bGQgbm90IGJlIHJlYWQuXG4gKlxuICogV2hhdCB0aGUgcGVyLWNhbGwtc2l0ZSBjb3VudCBkb2VzIE5PVCBmaXggaXMgYSBCUkFOQ0hZIGhlbHBlcjogYW4gYGlmYCAvIGBlbHNlYCBpcyBzdW1tZWQgbGV4aWNhbGx5IGxpa2VcbiAqIGFueSB0d28gc2libGluZyB3YWl0cywgc28gYm90aCBhcm1zIGFyZSBjaGFyZ2VkIGF0IGV2ZXJ5IGNhbGwgc2l0ZS4gQSBoZWxwZXIgd2hvc2UgdHdvIGRpcmVjdGlvbnMgd2FpdFxuICogZGlmZmVyZW50bHkgaXMgdGhlcmVmb3JlIGJldHRlciB3cml0dGVuIGFzIHR3byBoZWxwZXJzLCB3aGljaCBpcyB3aGF0IHRoaXMgcmVwbydzIG93blxuICogYHNyYy9vYnNpZGlhbi9jb21wb25lbnRzL3N5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50Lm9ic2lkaWFuLmludGVncmF0aW9uLnRlc3QudHNgIG5vdyBkb2VzLlxuICpcbiAqIE5vdCBldmVyeSBvdmVyLWNhcCBjbG9zdXJlIGNhbiBiZWNvbWUgYSBgcG9sbGAgLyBgdW50aWxgIHBhaXIsIHNvIHRoZSBydWxlIGlzIG1lYW50IHRvIGJlXG4gKiBkaXNhYmxlZCDigJQgd2l0aCBhIHJlYXNvbiDigJQgYXQgdGhlIHNpdGVzIHRoYXQgaGF2ZSBvbmUuIGByZXF1aXJlLWRlc2NyaXB0aW9uYCBtYWtlcyB0aGF0XG4gKiByZWFzb24gbWFuZGF0b3J5LCB3aGljaCBpcyB0aGUgcG9pbnQ6IGl0IHR1cm5zIGFuIGludmlzaWJsZSBhc3N1bXB0aW9uIGludG8gYSB3cml0dGVuIG9uZS5cbiAqXG4gKiBBIENMT1NVUkUgREVMSUJFUkFURUxZIExFRlQgVU5ERVIgVEhFIENBUCBTQVlTIFNPLCBpbiBhIGNvbW1lbnQgb3BlbmluZyB3aXRoIHRoZSBleGFjdCBsaW5lXG4gKlxuICogICAgIFVuZGVyIHRoZSB0cmFuc3BvcnQncyB+MzBzIHBlci1jbG9zdXJlIGNhcCwgbm90IGF0IGl0LlxuICpcbiAqIGFuZCB0aGVuIHNheWluZywgZm9yIHRoYXQgY2xvc3VyZSwgd2hhdCB0aGUgYnVkZ2V0IGlzIG1hZGUgb2YgYW5kIHdoeSBpdCBzdGF5cy4gVGhpcyBydWxlIGlzIHNpbGVudFxuICogb24gc3VjaCBhIGNsb3N1cmUgYnkgY29uc3RydWN0aW9uIOKAlCBpdCBpcyB1bmRlciB0aGUgY2FwIOKAlCBzbyB3aXRob3V0IHRoZSBsaW5lIHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsXG4gKiBhIGJ1ZGdldCBzb21lYm9keSByZWFkIGFuZCBrZXB0IGZyb20gb25lIG5vYm9keSBoYXMgbG9va2VkIGF0LCBhbmQgYSBzd2VlcCBydW4gd2l0aCBhIGxvd2VyXG4gKiBgY2FwSW5NaWxsaXNlY29uZHNgIHJlLW9wZW5zIHRoZSBzYW1lIGRlY2lzaW9ucyBldmVyeSB0aW1lLiBUaGUgbGluZSBpcyB0aGUgd2hvbGUgb2YgdGhlIGNvbnZlbnRpb24sXG4gKiB3aGljaCBpcyB3aGF0IGxldHMgc3VjaCBhIHN3ZWVwIHN1YnRyYWN0IHRoZSBjbG9zdXJlcyBhbHJlYWR5IHJlYWQgYW5kIGRyaXZlIHRoZSByZW1haW5kZXIgdG8gemVyby5cbiAqXG4gKiBUd28gcGxhY2VtZW50cywgYmVjYXVzZSBhIGNlaWxpbmcgbGl2ZXMgaW4gdHdvIHBsYWNlcy4gQSBjb21tZW50IElOU0lERSB0aGUgY2xvc3VyZSwgb3ZlciB0aGF0XG4gKiBjbG9zdXJlJ3Mgb3duIGNlaWxpbmcgY29uc3RhbnQsIHNwZWFrcyBmb3IgdGhhdCBjbG9zdXJlIGFsb25lOyBvbmUgYXQgTU9EVUxFIHNjb3BlLCBvdmVyIGEgY29uc3RhbnRcbiAqIHRoZSB3aG9sZSBmaWxlIHNoYXJlcywgc3BlYWtzIGZvciBldmVyeSBjbG9zdXJlIGluIHRoZSBmaWxlLiBBIGNsb3N1cmUgd2l0aCBubyBjZWlsaW5nIGNvbnN0YW50IGF0XG4gKiBhbGwg4oCUIHNldmVyYWwgYHdhaXRVbnRpbGAgY2FsbHMgdGFraW5nIHRoZSBkb2N1bWVudGVkIGRlZmF1bHQg4oCUIHRha2VzIHRoZSBpbi1jbG9zdXJlIGZvcm0gYXQgdGhlIHRvcFxuICogb2YgaXRzIGJvZHkuXG4gKlxuICogU2F5aW5nIGl0IGlzIE5PVCB0aGUgc2FtZSBhcyBjbGVhcmluZyBpdC4gQSBidWRnZXQgdW5kZXIgdGhlIGNhcCBpcyBub3QgYSBkZWZlY3QsIGFuZCBcInJlYWQsIGFuZCBsZWZ0XG4gKiBhcyBpdCBpc1wiIGlzIGEgY29ycmVjdCBvdXRjb21lOiB0aWdodGVuaW5nIGEgY2VpbGluZyB0byBicmluZyBhIG51bWJlciBkb3duIGlzIGhvdyBhIHN1aXRlIHN0YXJ0c1xuICogZmFpbGluZyBsZWdpdGltYXRlbHkgb24gYSBjb2xkIG1hY2hpbmUuXG4gKi9cbmltcG9ydCB0eXBlIHsgVFNFU1RyZWUgfSBmcm9tICdAdHlwZXNjcmlwdC1lc2xpbnQvdXRpbHMnO1xuaW1wb3J0IHR5cGUge1xuICBSdWxlLFxuICBTY29wZVxufSBmcm9tICdlc2xpbnQnO1xuXG5pbXBvcnQgeyB0b1RTRVNUcmVlTm9kZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWRldi10b29sa2l0L2xpbnRlcnMvZXNsaW50LXJ1bGVzL3RzLWVzdHJlZS1ub2RlJztcblxuaW1wb3J0IHtcbiAgREVGQVVMVF9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFMsXG4gIERFU0tUT1BfUEVSRk9STUFOQ0VfVEVTVF9GSUxFX1NVRkZJWCxcbiAgUEVSRk9STUFOQ0VfRVZBTF9DQVBfSU5fTUlMTElTRUNPTkRTXG59IGZyb20gJy4uLy4uL3Rlc3QtcnVubmVycy9wZXJmb3JtYW5jZS1ldmFsLWNhcC50cyc7XG5cbi8qKlxuICogTWVzc2FnZSBJRCByZXBvcnRlZCB3aGVuIGFuIGluLU9ic2lkaWFuIGNsb3N1cmUgZGVjbGFyZXMgbW9yZSB3YWl0aW5nIHRoYW4gdGhlIHRyYW5zcG9ydCdzIGNhcCBhbGxvd3MuXG4gKi9cbmV4cG9ydCBjb25zdCBNRVNTQUdFX0lEID0gJ25vT3ZlckNhcFdhaXRJbkV2YWxJbk9ic2lkaWFuJztcblxuLyoqXG4gKiBUaGUgYnVkZ2V0IGEgYHdhaXRVbnRpbGAgdGFrZXMgd2hlbiBpdCBvbWl0cyBgdGltZW91dEluTWlsbGlzZWNvbmRzYCwgcGVyIGBXYWl0VW50aWxQYXJhbXNgLlxuICovXG5jb25zdCBXQUlUX1VOVElMX0RFRkFVTFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG5jb25zdCBJTlBVVF9QUk9QRVJUWV9OQU1FID0gJ2lucHV0JztcbmNvbnN0IFNMRUVQX0NBTExFRV9OQU1FID0gJ3NsZWVwJztcbmNvbnN0IFRJTUVPVVRfUFJPUEVSVFlfTkFNRSA9ICd0aW1lb3V0SW5NaWxsaXNlY29uZHMnO1xuY29uc3QgV0FJVF9VTlRJTF9DQUxMRUVfTkFNRSA9ICd3YWl0VW50aWwnO1xuXG4vKipcbiAqIFRoZSBjbG9ja3MgYSBkZWFkbGluZSBtYXkgYmUgdGFrZW4gZnJvbS4gQm90aCBvY2N1ciBpbiB0aGVzZSBzdWl0ZXMsIGFuZCBhIHJ1bGUgdGhhdCBrbmV3IG9ubHkgYERhdGVgXG4gKiByZWFkIGV2ZXJ5IGBwZXJmb3JtYW5jZWAtd3JpdHRlbiBkZWFkbGluZSBhcyB1bmJvdW5kZWQuXG4gKi9cbmNvbnN0IENMT0NLX09CSkVDVF9OQU1FUyA9IG5ldyBTZXQoWydEYXRlJywgJ3BlcmZvcm1hbmNlJ10pO1xuXG5jb25zdCBOT1dfTUVUSE9EX05BTUUgPSAnbm93JztcblxuLyoqXG4gKiBXaGljaCBwcm9wZXJ0aWVzIG9mIGVhY2ggaGVscGVyJ3MgcGFyYW1ldGVyIG9iamVjdCBob2xkIGEgY2xvc3VyZSB0aGF0IHJ1bnMgSU5TSURFIE9ic2lkaWFuLCBhbmQgaXNcbiAqIHRoZXJlZm9yZSBzdWJqZWN0IHRvIHRoZSBjYXAuIGBwb2xsSW5PYnNpZGlhbmAncyBgdW50aWxgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGlzIGV2YWx1YXRlZCBpblxuICogTm9kZSwgd2hpY2ggaXMgdGhlIGVudGlyZSBwb2ludCBvZiBjb252ZXJ0aW5nIHRvIGl0LlxuICovXG5jb25zdCBDTE9TVVJFX05BTUVTX0JZX0NBTExFRV9OQU1FID0gbmV3IE1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPihbXG4gIFsnZXZhbEluT2JzaWRpYW4nLCBbJ2NhbGxiYWNrJ11dLFxuICBbJ3BvbGxJbk9ic2lkaWFuJywgWydwb2xsJywgJ3N0YXJ0J11dXG5dKTtcblxuLyoqXG4gKiBFdmVyeXRoaW5nIG9uZSBmaWxlIGFjY3VtdWxhdGVkLCBrZXllZCBieSB0aGUgZnVuY3Rpb24gZWFjaCBjaGFyZ2Ugd2FzIHdyaXR0ZW4gaW5zaWRlLlxuICpcbiAqIEEgd2FpdCBpcyBjaGFyZ2VkIHRvIHRoZSBpbm5lcm1vc3QgZnVuY3Rpb24gaXQgaXMgd3JpdHRlbiBpbiByYXRoZXIgdGhhbiBzdHJhaWdodCB0byB0aGUgY2xvc3VyZSwgYW5kIGFcbiAqIGNhbGwgdG8gYSBoZWxwZXIgdGhlIGNsb3N1cmUgZGVjbGFyZXMgaXMgcmVjb3JkZWQgYXMgYW4gZWRnZSwgc28gYSBjbG9zdXJlJ3MgdG90YWwgaXMgaXRzIG93biB3YWl0aW5nXG4gKiBwbHVzIGVhY2ggaGVscGVyJ3Mgd2FpdGluZyBtdWx0aXBsaWVkIGJ5IHRoZSBjYWxscyB0aGF0IGFjdHVhbGx5IHJlYWNoIGl0LlxuICovXG5pbnRlcmZhY2UgQ2FsbEdyYXBoIHtcbiAgLyoqXG4gICAqIEhvdyBtYW55IHRpbWVzIGVhY2ggZnVuY3Rpb24gY2FsbHMgZWFjaCBoZWxwZXIgZGVjbGFyZWQgaW5zaWRlIHRoZSBzYW1lIGNsb3N1cmUuXG4gICAqL1xuICByZWFkb25seSBjYWxsQ291bnRCeUNhbGxlZU5vZGVCeUNhbGxlck5vZGU6IE1hcDxIZWxwZXJGdW5jdGlvbiwgTWFwPEhlbHBlckZ1bmN0aW9uLCBudW1iZXI+PjtcblxuICAvKipcbiAgICogVGhlIGNsb3N1cmVzIHNlZW4gc28gZmFyLCBieSB0aGUgZnVuY3Rpb24gbm9kZSBlYWNoIG9uZSBpcyB3cml0dGVuIGFzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGVCeUNsb3N1cmVOb2RlOiBNYXA8Q2xvc3VyZUZ1bmN0aW9uLCBDbG9zdXJlU3RhdGU+O1xuXG4gIC8qKlxuICAgKiBUaGUgd2FpdGluZyB3cml0dGVuIERJUkVDVExZIGluc2lkZSBlYWNoIGZ1bmN0aW9uLCBleGNsdWRpbmcgd2hhdGV2ZXIgdGhlIGhlbHBlcnMgaXQgY2FsbHMgZGVjbGFyZS5cbiAgICovXG4gIHJlYWRvbmx5IHdhaXRJbk1pbGxpc2Vjb25kc0J5RnVuY3Rpb25Ob2RlOiBNYXA8SGVscGVyRnVuY3Rpb24sIG51bWJlcj47XG59XG5cbi8qKlxuICogVGhlIHJ1bGUncyBzaW5nbGUgb3B0aW9uIG9iamVjdC5cbiAqL1xuaW50ZXJmYWNlIENhcE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGJ1ZGdldCBhdCBvciBvdmVyIHdoaWNoIGEgY2xvc3VyZSBpcyByZXBvcnRlZCwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FwSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGZ1bmN0aW9uIGEgY2hhcmdlIGlzIGF0dHJpYnV0ZWQgdG8sIHRvZ2V0aGVyIHdpdGggdGhlIGluLU9ic2lkaWFuIGNsb3N1cmUgaXQgdWx0aW1hdGVseSBydW5zIGluc2lkZS5cbiAqL1xuaW50ZXJmYWNlIENoYXJnZVRhcmdldCB7XG4gIC8qKlxuICAgKiBUaGUgY2xvc3VyZSB0aGUgY2hhcmdlIHJ1bnMgaW5zaWRlLCBjYXJyaWVkIHNvIGEgYnVkZ2V0IHRocmVhZGVkIHRocm91Z2ggaXRzIGNhbGwgc3RpbGwgcmVzb2x2ZXMuXG4gICAqL1xuICByZWFkb25seSBjbG9zdXJlOiBFdmFsQ2xvc3VyZTtcblxuICAvKipcbiAgICogVGhlIGlubmVybW9zdCBmdW5jdGlvbiB0aGUgY2hhcmdlIGlzIHdyaXR0ZW4gaW46IHRoZSBjbG9zdXJlIGl0c2VsZiwgb3IgYSBoZWxwZXIgZGVjbGFyZWQgd2l0aGluIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25Ob2RlOiBIZWxwZXJGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHdyaXR0ZW4gYXMgYW4gb2JqZWN0IHByb3BlcnR5LCB3aGljaCBpcyB0aGUgb25seSBmb3JtIGVpdGhlciBoZWxwZXIncyBjbG9zdXJlcyB0YWtlLlxuICovXG50eXBlIENsb3N1cmVGdW5jdGlvbiA9IFRTRVNUcmVlLkFycm93RnVuY3Rpb25FeHByZXNzaW9uIHwgVFNFU1RyZWUuRnVuY3Rpb25FeHByZXNzaW9uO1xuXG4vKipcbiAqIE9uZSBpbi1PYnNpZGlhbiBjbG9zdXJlJ3MgYWNjdW11bGF0ZWQgY2hhcmdlcy5cbiAqL1xuaW50ZXJmYWNlIENsb3N1cmVTdGF0ZSB7XG4gIC8qKlxuICAgKiBUaGUgY2xvc3VyZSdzIG93biBmdW5jdGlvbiBub2RlLCB0aGUgcm9vdCBldmVyeSByZWFjaGFibGUgaGVscGVyIGlzIGNvdW50ZWQgZnJvbS5cbiAgICovXG4gIHJlYWRvbmx5IGNsb3N1cmVOb2RlOiBDbG9zdXJlRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGZ1bmN0aW9uIGNoYXJnZWQgaW5zaWRlIHRoaXMgY2xvc3VyZTogdGhlIGNsb3N1cmUgaXRzZWxmLCBhbmQgZWFjaCBoZWxwZXIgaXQgZGVjbGFyZXMuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk5vZGVzOiBTZXQ8SGVscGVyRnVuY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgdGhlIGNsb3N1cmUgaXMgd3JpdHRlbiBhcywgcmVwb3J0ZWQgb24uXG4gICAqL1xuICByZWFkb25seSByZXBvcnROb2RlOiBUU0VTVHJlZS5Ob2RlO1xufVxuXG4vKipcbiAqIEFuIGluLU9ic2lkaWFuIGNsb3N1cmUsIHRvZ2V0aGVyIHdpdGggdGhlIGNhbGwgaXQgYmVsb25ncyB0byAobmVlZGVkIHRvIHJlc29sdmUgYSBidWRnZXQgdGhyZWFkZWRcbiAqIHRocm91Z2ggdGhhdCBjYWxsJ3MgYGlucHV0YCkgYW5kIHRoZSBub2RlIHRvIHJlcG9ydCBvbi5cbiAqL1xuaW50ZXJmYWNlIEV2YWxDbG9zdXJlIHtcbiAgLyoqXG4gICAqIFRoZSBjbG9zdXJlJ3MgZnVuY3Rpb24gbm9kZSwgd2hpY2ggaWRlbnRpZmllcyB0aGUgY2xvc3VyZSBhY3Jvc3Mgc2libGluZyB3YWl0cyBhbmQgY2FycmllcyB0aGVcbiAgICogcGFyYW1ldGVyIHBhdHRlcm4gYSBidWRnZXQgdGhyZWFkZWQgdGhyb3VnaCBgaW5wdXRgIGlzIGRlc3RydWN0dXJlZCBieS5cbiAgICovXG4gIHJlYWRvbmx5IGNsb3N1cmVOb2RlOiBDbG9zdXJlRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSBoZWxwZXIncyBwYXJhbWV0ZXIgb2JqZWN0LCBjYXJyaWVkIHNvIGEgYnVkZ2V0IHRocmVhZGVkIHRocm91Z2ggYGlucHV0YCBpcyByZWFkIGZyb20gdGhlIG9iamVjdFxuICAgKiB0aGUgY2xvc3VyZSB3YXMgYWxyZWFkeSBmb3VuZCBpbiByYXRoZXIgdGhhbiByZS1kZXJpdmVkIGZyb20gdGhlIGNhbGwuXG4gICAqL1xuICByZWFkb25seSBwYXJhbXNOb2RlOiBUU0VTVHJlZS5PYmplY3RFeHByZXNzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvcGVydHkgdGhlIGNsb3N1cmUgaXMgd3JpdHRlbiBhcywgcmVwb3J0ZWQgb24gc28gdGhlIG1lc3NhZ2UgcG9pbnRzIGF0IGBjYWxsYmFja2AgLyBgcG9sbGBcbiAgICogcmF0aGVyIHRoYW4gYXQgd2hpY2hldmVyIHdhaXQgaGFwcGVuZWQgdG8gY29tZSBmaXJzdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG9ydE5vZGU6IFRTRVNUcmVlLk5vZGU7XG59XG5cbi8qKlxuICogQSBmdW5jdGlvbiB3YWl0aW5nIGNhbiBiZSBjaGFyZ2VkIHRvOiBhbiBpbi1PYnNpZGlhbiBjbG9zdXJlLCBvciBhIGhlbHBlciBkZWNsYXJlZCBpbnNpZGUgb25lIOKAlCB3aGljaCBhXG4gKiBgZnVuY3Rpb25gIGRlY2xhcmF0aW9uIGlzIGFzIHJlYWRpbHkgYXMgYW4gYXJyb3cgb3IgYSBmdW5jdGlvbiBleHByZXNzaW9uLlxuICovXG50eXBlIEhlbHBlckZ1bmN0aW9uID0gQ2xvc3VyZUZ1bmN0aW9uIHwgVFNFU1RyZWUuRnVuY3Rpb25EZWNsYXJhdGlvbjtcblxuLyoqXG4gKiBBIGxvb3Agd2hvc2Ugb3duIHRlc3QgY2FuIGRlY2xhcmUgYSBjZWlsaW5nLiBgZm9y4oCmb2ZgIC8gYGZvcuKApmluYCBhcmUgZGVsaWJlcmF0ZWx5IGFic2VudDogbmVpdGhlclxuICogZGVjbGFyZXMgb25lIHN0YXRpY2FsbHksIHNvIGJvdGgga2VlcCB0aGUgcGVyLWl0ZXJhdGlvbiBjaGFyZ2UgZXZlcnkgdW5zaXplZCBsb29wIGdldHMuXG4gKi9cbnR5cGUgTG9vcFN0YXRlbWVudCA9IFRTRVNUcmVlLkRvV2hpbGVTdGF0ZW1lbnQgfCBUU0VTVHJlZS5Gb3JTdGF0ZW1lbnQgfCBUU0VTVHJlZS5XaGlsZVN0YXRlbWVudDtcblxuLyoqXG4gKiBFU0xpbnQgcnVsZSBkaXNhbGxvd2luZyBhbiBpbi1PYnNpZGlhbiBjbG9zdXJlIHdob3NlIGRlY2xhcmVkIHdhaXRpbmcgZXhjZWVkcyB0aGUgdHJhbnNwb3J0J3Mgc2NyaXB0LXRpbWVvdXQgY2FwLlxuICovXG5leHBvcnQgY29uc3Qgbm9PdmVyQ2FwV2FpdEluRXZhbEluT2JzaWRpYW46IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgY3JlYXRlKGNvbnRleHQpIHtcbiAgICBjb25zdCBvcHRpb25zID0gY29udGV4dC5vcHRpb25zWzBdIGFzIENhcE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVmYXVsdENhcEluTWlsbGlzZWNvbmRzID0gY29udGV4dC5maWxlbmFtZS5lbmRzV2l0aChERVNLVE9QX1BFUkZPUk1BTkNFX1RFU1RfRklMRV9TVUZGSVgpXG4gICAgICA/IFBFUkZPUk1BTkNFX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EU1xuICAgICAgOiBERUZBVUxUX0VWQUxfQ0FQX0lOX01JTExJU0VDT05EUztcbiAgICBjb25zdCBjYXBJbk1pbGxpc2Vjb25kcyA9IG9wdGlvbnM/LmNhcEluTWlsbGlzZWNvbmRzID8/IGRlZmF1bHRDYXBJbk1pbGxpc2Vjb25kcztcbiAgICBjb25zdCBjYWxsR3JhcGg6IENhbGxHcmFwaCA9IHtcbiAgICAgIGNhbGxDb3VudEJ5Q2FsbGVlTm9kZUJ5Q2FsbGVyTm9kZTogbmV3IE1hcDxIZWxwZXJGdW5jdGlvbiwgTWFwPEhlbHBlckZ1bmN0aW9uLCBudW1iZXI+PigpLFxuICAgICAgc3RhdGVCeUNsb3N1cmVOb2RlOiBuZXcgTWFwPENsb3N1cmVGdW5jdGlvbiwgQ2xvc3VyZVN0YXRlPigpLFxuICAgICAgd2FpdEluTWlsbGlzZWNvbmRzQnlGdW5jdGlvbk5vZGU6IG5ldyBNYXA8SGVscGVyRnVuY3Rpb24sIG51bWJlcj4oKVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZWNvcmRzIHRoYXQgb25lIGZ1bmN0aW9uIGNhbGxzIGEgaGVscGVyIGRlY2xhcmVkIGluc2lkZSB0aGUgc2FtZSBjbG9zdXJlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldCAtIFRoZSBmdW5jdGlvbiB0aGUgY2FsbCBpcyB3cml0dGVuIGluLlxuICAgICAqIEBwYXJhbSBjYWxsZWVOb2RlIC0gVGhlIGhlbHBlciBiZWluZyBjYWxsZWQuXG4gICAgICogQHBhcmFtIGNhbGxDb3VudCAtIEhvdyBtYW55IHRpbWVzIHRoZSBjYWxsIHJ1bnMsIGFzIHRoZSBwcm9kdWN0IG9mIGl0cyBlbmNsb3NpbmcgY291bnRpbmcgbG9vcHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkQ2FsbCh0YXJnZXQ6IENoYXJnZVRhcmdldCwgY2FsbGVlTm9kZTogSGVscGVyRnVuY3Rpb24sIGNhbGxDb3VudDogbnVtYmVyKTogdm9pZCB7XG4gICAgICBjb25zdCBzdGF0ZSA9IHJlYWRDbG9zdXJlU3RhdGUodGFyZ2V0KTtcbiAgICAgIHN0YXRlLmZ1bmN0aW9uTm9kZXMuYWRkKGNhbGxlZU5vZGUpO1xuXG4gICAgICBjb25zdCBjYWxsQ291bnRCeUNhbGxlZU5vZGUgPSBjYWxsR3JhcGguY2FsbENvdW50QnlDYWxsZWVOb2RlQnlDYWxsZXJOb2RlLmdldCh0YXJnZXQuZnVuY3Rpb25Ob2RlKVxuICAgICAgICA/PyBuZXcgTWFwPEhlbHBlckZ1bmN0aW9uLCBudW1iZXI+KCk7XG4gICAgICBjYWxsR3JhcGguY2FsbENvdW50QnlDYWxsZWVOb2RlQnlDYWxsZXJOb2RlLnNldCh0YXJnZXQuZnVuY3Rpb25Ob2RlLCBjYWxsQ291bnRCeUNhbGxlZU5vZGUpO1xuICAgICAgY2FsbENvdW50QnlDYWxsZWVOb2RlLnNldChjYWxsZWVOb2RlLCAoY2FsbENvdW50QnlDYWxsZWVOb2RlLmdldChjYWxsZWVOb2RlKSA/PyAwKSArIGNhbGxDb3VudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyB3YWl0aW5nIHRvIHRoZSBydW5uaW5nIHRvdGFsIG9mIHRoZSBmdW5jdGlvbiBpdCB3YXMgd3JpdHRlbiBpbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgZnVuY3Rpb24gdG8gY2hhcmdlLlxuICAgICAqIEBwYXJhbSB3YWl0SW5NaWxsaXNlY29uZHMgLSBUaGUgd2FpdGluZyB0byBhZGQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkV2FpdCh0YXJnZXQ6IENoYXJnZVRhcmdldCwgd2FpdEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIHJlYWRDbG9zdXJlU3RhdGUodGFyZ2V0KTtcbiAgICAgIGNvbnN0IHJ1bm5pbmdUb3RhbEluTWlsbGlzZWNvbmRzID0gY2FsbEdyYXBoLndhaXRJbk1pbGxpc2Vjb25kc0J5RnVuY3Rpb25Ob2RlLmdldCh0YXJnZXQuZnVuY3Rpb25Ob2RlKSA/PyAwO1xuICAgICAgY2FsbEdyYXBoLndhaXRJbk1pbGxpc2Vjb25kc0J5RnVuY3Rpb25Ob2RlLnNldCh0YXJnZXQuZnVuY3Rpb25Ob2RlLCBydW5uaW5nVG90YWxJbk1pbGxpc2Vjb25kcyArIHdhaXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVjb3JkcyBhIGNhbGwgdG8gYSBoZWxwZXIgdGhlIGNsb3N1cmUgZGVjbGFyZXMsIHNvIGl0cyB3YWl0aW5nIGlzIGNvdW50ZWQgb25jZSBwZXIgY2FsbCBzaXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhbGxOb2RlIC0gVGhlIGNhbGwgZXhwcmVzc2lvbi5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGZ1bmN0aW9uIHRoZSBjYWxsIGlzIHdyaXR0ZW4gaW4uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hhcmdlSGVscGVyQ2FsbChjYWxsTm9kZTogVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb24sIHRhcmdldDogQ2hhcmdlVGFyZ2V0KTogdm9pZCB7XG4gICAgICBjb25zdCBoZWxwZXJOb2RlID0gcmVhZENhbGxlZEhlbHBlck5vZGUoY2FsbE5vZGUsIHRhcmdldC5jbG9zdXJlLCBjb250ZXh0KTtcbiAgICAgIGlmICghaGVscGVyTm9kZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFkZENhbGwodGFyZ2V0LCBoZWxwZXJOb2RlLCByZWFkTG9vcE11bHRpcGxpZXIoY2FsbE5vZGUsIHRhcmdldCwgY29udGV4dCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYXJnZXMgYSBkZWFkbGluZS1ib3VuZGVkIGxvb3AgaXRzIHdob2xlIGRlYWRsaW5lLCBvbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5vZGUgLSBUaGUgbG9vcCBzdGF0ZW1lbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hhcmdlTG9vcERlYWRsaW5lKG5vZGU6IFJ1bGUuTm9kZSk6IHZvaWQge1xuICAgICAgY29uc3QgbG9vcE5vZGUgPSB0b1RTRVNUcmVlTm9kZShub2RlKSBhcyBMb29wU3RhdGVtZW50O1xuXG4gICAgICBjb25zdCB0YXJnZXQgPSBmaW5kQ2hhcmdlVGFyZ2V0KGxvb3BOb2RlKTtcbiAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVhZGxpbmVJbk1pbGxpc2Vjb25kcyA9IHJlYWRMb29wRGVhZGxpbmVJbk1pbGxpc2Vjb25kcyhsb29wTm9kZSwgdGFyZ2V0LmNsb3N1cmUsIGNvbnRleHQpO1xuICAgICAgaWYgKGRlYWRsaW5lSW5NaWxsaXNlY29uZHMgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhZGRXYWl0KHRhcmdldCwgZGVhZGxpbmVJbk1pbGxpc2Vjb25kcyAqIHJlYWRMb29wTXVsdGlwbGllcihsb29wTm9kZSwgdGFyZ2V0LCBjb250ZXh0KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhcmdlcyBhIHdhaXQgY2FsbCB0aGUgYnVkZ2V0IGl0IGRlY2xhcmVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhbGxOb2RlIC0gVGhlIGNhbGwgZXhwcmVzc2lvbi5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGZ1bmN0aW9uIHRoZSBjYWxsIGlzIHdyaXR0ZW4gaW4uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2hhcmdlV2FpdENhbGwoY2FsbE5vZGU6IFRTRVNUcmVlLkNhbGxFeHByZXNzaW9uLCB0YXJnZXQ6IENoYXJnZVRhcmdldCk6IHZvaWQge1xuICAgICAgY29uc3QgYnVkZ2V0RXhwcmVzc2lvbiA9IHJlYWRXYWl0QnVkZ2V0RXhwcmVzc2lvbihjYWxsTm9kZSk7XG4gICAgICBpZiAoYnVkZ2V0RXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgd2FpdEluTWlsbGlzZWNvbmRzID0gYnVkZ2V0RXhwcmVzc2lvbiA9PT0gbnVsbFxuICAgICAgICA/IFdBSVRfVU5USUxfREVGQVVMVF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICAgICAgICA6IHJlc29sdmVOdW1iZXIoYnVkZ2V0RXhwcmVzc2lvbiwgdGFyZ2V0LmNsb3N1cmUsIGNvbnRleHQpO1xuICAgICAgaWYgKHdhaXRJbk1pbGxpc2Vjb25kcyA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFkZFdhaXQodGFyZ2V0LCB3YWl0SW5NaWxsaXNlY29uZHMgKiByZWFkTG9vcE11bHRpcGxpZXIoY2FsbE5vZGUsIHRhcmdldCwgY29udGV4dCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVycyB0aGUgY2xvc3VyZSBhIGNoYXJnZSBiZWxvbmdzIHRvLCBhbmQgdGhlIGZ1bmN0aW9uIHRoZSBjaGFyZ2Ugd2FzIHdyaXR0ZW4gaW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGZ1bmN0aW9uIGJlaW5nIGNoYXJnZWQuXG4gICAgICogQHJldHVybnMgVGhhdCBjbG9zdXJlJ3MgYWNjdW11bGF0ZWQgc3RhdGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVhZENsb3N1cmVTdGF0ZSh0YXJnZXQ6IENoYXJnZVRhcmdldCk6IENsb3N1cmVTdGF0ZSB7XG4gICAgICBjb25zdCBzdGF0ZSA9IGNhbGxHcmFwaC5zdGF0ZUJ5Q2xvc3VyZU5vZGUuZ2V0KHRhcmdldC5jbG9zdXJlLmNsb3N1cmVOb2RlKSA/PyB7XG4gICAgICAgIGNsb3N1cmVOb2RlOiB0YXJnZXQuY2xvc3VyZS5jbG9zdXJlTm9kZSxcbiAgICAgICAgZnVuY3Rpb25Ob2RlczogbmV3IFNldDxIZWxwZXJGdW5jdGlvbj4oKSxcbiAgICAgICAgcmVwb3J0Tm9kZTogdGFyZ2V0LmNsb3N1cmUucmVwb3J0Tm9kZVxuICAgICAgfTtcbiAgICAgIGNhbGxHcmFwaC5zdGF0ZUJ5Q2xvc3VyZU5vZGUuc2V0KHRhcmdldC5jbG9zdXJlLmNsb3N1cmVOb2RlLCBzdGF0ZSk7XG4gICAgICBzdGF0ZS5mdW5jdGlvbk5vZGVzLmFkZCh0YXJnZXQuZnVuY3Rpb25Ob2RlKTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgJ0NhbGxFeHByZXNzaW9uJyhub2RlOiBSdWxlLk5vZGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2FsbE5vZGUgPSB0b1RTRVNUcmVlTm9kZShub2RlKSBhcyBUU0VTVHJlZS5DYWxsRXhwcmVzc2lvbjtcblxuICAgICAgICBjb25zdCB0YXJnZXQgPSBmaW5kQ2hhcmdlVGFyZ2V0KGNhbGxOb2RlKTtcbiAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjaGFyZ2VXYWl0Q2FsbChjYWxsTm9kZSwgdGFyZ2V0KTtcbiAgICAgICAgY2hhcmdlSGVscGVyQ2FsbChjYWxsTm9kZSwgdGFyZ2V0KTtcbiAgICAgIH0sXG4gICAgICBEb1doaWxlU3RhdGVtZW50OiBjaGFyZ2VMb29wRGVhZGxpbmUsXG4gICAgICBGb3JTdGF0ZW1lbnQ6IGNoYXJnZUxvb3BEZWFkbGluZSxcbiAgICAgICdQcm9ncmFtOmV4aXQnKCk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIGNhbGxHcmFwaC5zdGF0ZUJ5Q2xvc3VyZU5vZGUudmFsdWVzKCkpIHtcbiAgICAgICAgICBjb25zdCB0b3RhbEluTWlsbGlzZWNvbmRzID0gcmVhZENsb3N1cmVXYWl0SW5NaWxsaXNlY29uZHMoc3RhdGUsIGNhbGxHcmFwaCk7XG4gICAgICAgICAgaWYgKHRvdGFsSW5NaWxsaXNlY29uZHMgPCBjYXBJbk1pbGxpc2Vjb25kcykge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5yZXBvcnQoe1xuICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICBjYXBJbk1pbGxpc2Vjb25kczogU3RyaW5nKGNhcEluTWlsbGlzZWNvbmRzKSxcbiAgICAgICAgICAgICAgdG90YWxJbk1pbGxpc2Vjb25kczogU3RyaW5nKHRvdGFsSW5NaWxsaXNlY29uZHMpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWVzc2FnZUlkOiBNRVNTQUdFX0lELFxuICAgICAgICAgICAgbm9kZTogc3RhdGUucmVwb3J0Tm9kZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgV2hpbGVTdGF0ZW1lbnQ6IGNoYXJnZUxvb3BEZWFkbGluZVxuICAgIH07XG4gIH0sXG4gIG1ldGE6IHtcbiAgICBkb2NzOiB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0Rpc2FsbG93IGFuIGluLU9ic2lkaWFuIGNsb3N1cmUgZGVjbGFyaW5nIG1vcmUgd2FpdGluZyB0aGFuIHRoZSB0cmFuc3BvcnRcXCdzIHNjcmlwdC10aW1lb3V0IGNhcCBhbGxvd3MnXG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgW01FU1NBR0VfSURdOiAnVGhpcyBjbG9zdXJlIGRlY2xhcmVzIHt7IHRvdGFsSW5NaWxsaXNlY29uZHMgfX0gbXMgb2Ygd2FpdGluZywgYXQgb3Igb3ZlciB0aGUgdHJhbnNwb3J0XFwncyB7eyBjYXBJbk1pbGxpc2Vjb25kcyB9fSBtcyBjYXAsIHNvIGl0IGNhbiBvbmx5IGV2ZXIgZGllIGFzIGEgYmFyZSBgc2NyaXB0IHRpbWVvdXRgOiB3YWl0IGluIE5vZGUgaW5zdGVhZCwgd2l0aCBhIHNob3J0IERPTS1yZWFkaW5nIGBwb2xsSW5PYnNpZGlhbmAgYHBvbGxgLCBhbiBgdW50aWxgIGV2YWx1YXRlZCBpbiBOb2RlLCBhbmQgdGhlIGxvbmcgYnVkZ2V0IGluIGB0aW1lb3V0SW5NaWxsaXNlY29uZHNgLidcbiAgICB9LFxuICAgIHNjaGVtYTogW3tcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgY2FwSW5NaWxsaXNlY29uZHM6IHtcbiAgICAgICAgICBtaW5pbXVtOiAxLFxuICAgICAgICAgIHR5cGU6ICdpbnRlZ2VyJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHlwZTogJ29iamVjdCdcbiAgICB9XSxcbiAgICB0eXBlOiAncHJvYmxlbSdcbiAgfVxufTtcblxuLyoqXG4gKiBDb2xsZWN0cyBldmVyeSBoZWxwZXIgcmVhY2hhYmxlIGZyb20gYSBmdW5jdGlvbiBieSBmb2xsb3dpbmcgdGhlIGNhbGxzIHJlY29yZGVkIGZvciBpdHMgY2xvc3VyZS5cbiAqXG4gKiBBIGhlbHBlciBOT1QgaW4gdGhlIGFuc3dlciBpcyBvbmUgbm8gY2FsbCBzaXRlIGNhbiByZWFjaCwgd2hpY2ggaXMgd2hhdCB0aGUgZmxhdCBmYWxsYmFjayBjaGFyZ2UgaXNcbiAqIGtleWVkIG9mZjogaXQgaXMgZWl0aGVyIGRlYWQsIG9yIGNhbGxlZCB0aHJvdWdoIHNvbWV0aGluZyB0aGlzIHJ1bGUgY2Fubm90IHJlYWQuXG4gKlxuICogQHBhcmFtIGZ1bmN0aW9uTm9kZSAtIFRoZSBmdW5jdGlvbiB0byBzdGFydCBmcm9tLlxuICogQHBhcmFtIGNhbGxHcmFwaCAtIFRoZSBmaWxlJ3MgYWNjdW11bGF0ZWQgY2hhcmdlcy5cbiAqIEBwYXJhbSByZWFjaGFibGVOb2RlcyAtIFRoZSBzZXQgdG8gY29sbGVjdCBpbnRvLCB3aGljaCBkb3VibGVzIGFzIHRoZSB2aXNpdGVkIHNldC5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdFJlYWNoYWJsZUZ1bmN0aW9uTm9kZXMoZnVuY3Rpb25Ob2RlOiBIZWxwZXJGdW5jdGlvbiwgY2FsbEdyYXBoOiBDYWxsR3JhcGgsIHJlYWNoYWJsZU5vZGVzOiBTZXQ8SGVscGVyRnVuY3Rpb24+KTogdm9pZCB7XG4gIGlmIChyZWFjaGFibGVOb2Rlcy5oYXMoZnVuY3Rpb25Ob2RlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlYWNoYWJsZU5vZGVzLmFkZChmdW5jdGlvbk5vZGUpO1xuXG4gIGZvciAoY29uc3QgY2FsbGVlTm9kZSBvZiBjYWxsR3JhcGguY2FsbENvdW50QnlDYWxsZWVOb2RlQnlDYWxsZXJOb2RlLmdldChmdW5jdGlvbk5vZGUpPy5rZXlzKCkgPz8gW10pIHtcbiAgICBjb2xsZWN0UmVhY2hhYmxlRnVuY3Rpb25Ob2RlcyhjYWxsZWVOb2RlLCBjYWxsR3JhcGgsIHJlYWNoYWJsZU5vZGVzKTtcbiAgfVxufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBmdW5jdGlvbiBhIG5vZGUncyB3YWl0aW5nIGlzIGNoYXJnZWQgdG8sIHdhbGtpbmcgb3V0d2FyZHMuXG4gKlxuICogVGhlIHdhbGsgZG9lcyBub3Qgc3RvcCBhdCB0aGUgZmlyc3QgZW5jbG9zaW5nIGZ1bmN0aW9uOiBhIHdhaXQgaW5zaWRlIGEgaGVscGVyIGRlY2xhcmVkIHdpdGhpbiB0aGVcbiAqIGNhbGxiYWNrIHN0aWxsIHJ1bnMgaW5zaWRlIHRoZSBjYWxsYmFjaywgc28gaXQga2VlcHMgZ29pbmcgdW50aWwgaXQgcmVhY2hlcyBhIGZ1bmN0aW9uIHRoYXQgSVMgb25lIG9mXG4gKiB0aGUgaGVscGVyJ3MgaW4tT2JzaWRpYW4gY2xvc3VyZXMuIFdoYXQgaXQgUkVNRU1CRVJTIG9uIHRoZSB3YXkgaXMgdGhlIGlubmVybW9zdCBmdW5jdGlvbiBpdCBwYXNzZWQsIHNvXG4gKiBhIGhlbHBlcidzIHdhaXRpbmcgaXMgYWNjdW11bGF0ZWQgYWdhaW5zdCB0aGUgaGVscGVyIGFuZCBjaGFyZ2VkIHRvIHRoZSBjbG9zdXJlIG9uY2UgcGVyIGNhbGwgc2l0ZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIHN0YXJ0IGZyb20uXG4gKiBAcmV0dXJucyBUaGUgY2hhcmdlIHRhcmdldCwgb3IgYG51bGxgIHdoZW4gdGhlIG5vZGUgZG9lcyBub3QgcnVuIGluc2lkZSBhbiBpbi1PYnNpZGlhbiBjbG9zdXJlLlxuICovXG5mdW5jdGlvbiBmaW5kQ2hhcmdlVGFyZ2V0KG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBDaGFyZ2VUYXJnZXQgfCBudWxsIHtcbiAgbGV0IGlubmVybW9zdEZ1bmN0aW9uTm9kZTogSGVscGVyRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG4gIGxldCBjdXJyZW50Tm9kZTogVFNFU1RyZWUuTm9kZSB8IHVuZGVmaW5lZCA9IG5vZGUucGFyZW50O1xuXG4gIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgIGNvbnN0IGNsb3N1cmUgPSByZWFkRXZhbENsb3N1cmUoY3VycmVudE5vZGUpO1xuICAgIGlmIChjbG9zdXJlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbG9zdXJlLFxuICAgICAgICBmdW5jdGlvbk5vZGU6IGlubmVybW9zdEZ1bmN0aW9uTm9kZSA/PyBjbG9zdXJlLmNsb3N1cmVOb2RlXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICghaW5uZXJtb3N0RnVuY3Rpb25Ob2RlICYmIGlzRnVuY3Rpb25Ob2RlKGN1cnJlbnROb2RlKSkge1xuICAgICAgaW5uZXJtb3N0RnVuY3Rpb25Ob2RlID0gY3VycmVudE5vZGU7XG4gICAgfVxuXG4gICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBGaW5kcyBhIHZhcmlhYmxlIGJ5IG5hbWUsIHdhbGtpbmcgb3V0d2FyZHMgZnJvbSB0aGUgZ2l2ZW4gc2NvcGUuXG4gKlxuICogQHBhcmFtIHNjb3BlIC0gVGhlIHNjb3BlIHRvIHN0YXJ0IGZyb20uXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB2YXJpYWJsZSdzIG5hbWUuXG4gKiBAcmV0dXJucyBUaGUgdmFyaWFibGUsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgaW4gc2NvcGUgZGVjbGFyZXMgdGhhdCBuYW1lLlxuICovXG5mdW5jdGlvbiBmaW5kVmFyaWFibGUoc2NvcGU6IFNjb3BlLlNjb3BlLCBuYW1lOiBzdHJpbmcpOiBudWxsIHwgU2NvcGUuVmFyaWFibGUge1xuICBsZXQgY3VycmVudFNjb3BlOiBudWxsIHwgU2NvcGUuU2NvcGUgPSBzY29wZTtcblxuICB3aGlsZSAoY3VycmVudFNjb3BlKSB7XG4gICAgY29uc3QgdmFyaWFibGUgPSBjdXJyZW50U2NvcGUudmFyaWFibGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUpO1xuICAgIGlmICh2YXJpYWJsZSkge1xuICAgICAgcmV0dXJuIHZhcmlhYmxlO1xuICAgIH1cbiAgICBjdXJyZW50U2NvcGUgPSBjdXJyZW50U2NvcGUudXBwZXI7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYW4gYXNzaWdubWVudCBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYW4gYEFzc2lnbm1lbnRFeHByZXNzaW9uYC5cbiAqL1xuZnVuY3Rpb24gaXNBc3NpZ25tZW50RXhwcmVzc2lvbihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5Bc3NpZ25tZW50RXhwcmVzc2lvbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdBc3NpZ25tZW50RXhwcmVzc2lvbic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgYmluYXJ5IGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBCaW5hcnlFeHByZXNzaW9uYC5cbiAqL1xuZnVuY3Rpb24gaXNCaW5hcnlFeHByZXNzaW9uKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLkJpbmFyeUV4cHJlc3Npb24ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnQmluYXJ5RXhwcmVzc2lvbic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGEgY2FsbCBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYSBgQ2FsbEV4cHJlc3Npb25gLlxuICovXG5mdW5jdGlvbiBpc0NhbGxFeHByZXNzaW9uKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLkNhbGxFeHByZXNzaW9uIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0NhbGxFeHByZXNzaW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYSBmdW5jdGlvbiB3cml0dGVuIGFzIGFuIG9iamVjdCBwcm9wZXJ0eSdzIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYSBgRnVuY3Rpb25FeHByZXNzaW9uYCBvciBhbiBgQXJyb3dGdW5jdGlvbkV4cHJlc3Npb25gLlxuICovXG5mdW5jdGlvbiBpc0Nsb3N1cmVGdW5jdGlvbihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBDbG9zdXJlRnVuY3Rpb24ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnRnVuY3Rpb25FeHByZXNzaW9uJyB8fCBub2RlLnR5cGUgPT09ICdBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBmdW5jdGlvbiBpcyBkZWNsYXJlZCBzb21ld2hlcmUgaW5zaWRlIGFuIGluLU9ic2lkaWFuIGNsb3N1cmUuXG4gKlxuICogQSBoZWxwZXIgZGVjbGFyZWQgT1VUU0lERSB0aGUgY2xvc3VyZSBhbnN3ZXJzIGBmYWxzZWAsIHdoaWNoIGlzIHdoYXQga2VlcHMgdGhpcyBydWxlJ3MgYW5hbHlzaXMgaW5zaWRlXG4gKiBvbmUgY2xvc3VyZSByYXRoZXIgdGhhbiBmb2xsb3dpbmcgY2FsbHMgYWNyb3NzIGJvdW5kYXJpZXMgaXQgZGVsaWJlcmF0ZWx5IGRlY2xpbmVzIHRvIHJlYWQuXG4gKlxuICogQHBhcmFtIGZ1bmN0aW9uTm9kZSAtIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEBwYXJhbSBjbG9zdXJlIC0gVGhlIGNsb3N1cmUgdG8gY2hlY2sgYWdhaW5zdC5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWNsYXJlZCBsZXhpY2FsbHkgaW5zaWRlIHRoZSBjbG9zdXJlLlxuICovXG5mdW5jdGlvbiBpc0RlY2xhcmVkSW5zaWRlQ2xvc3VyZShmdW5jdGlvbk5vZGU6IEhlbHBlckZ1bmN0aW9uLCBjbG9zdXJlOiBFdmFsQ2xvc3VyZSk6IGJvb2xlYW4ge1xuICBsZXQgY3VycmVudE5vZGU6IFRTRVNUcmVlLk5vZGUgfCB1bmRlZmluZWQgPSBmdW5jdGlvbk5vZGUucGFyZW50O1xuXG4gIHdoaWxlIChjdXJyZW50Tm9kZSkge1xuICAgIGlmIChjdXJyZW50Tm9kZSA9PT0gY2xvc3VyZS5jbG9zdXJlTm9kZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50O1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIGNvdW50aW5nIGBmb3JgIHN0YXRlbWVudC5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGEgYEZvclN0YXRlbWVudGAuXG4gKi9cbmZ1bmN0aW9uIGlzRm9yU3RhdGVtZW50KG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLkZvclN0YXRlbWVudCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdGb3JTdGF0ZW1lbnQnO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIGZ1bmN0aW9uIHdhaXRpbmcgY2FuIGJlIGNoYXJnZWQgdG8uXG4gKlxuICogQSBgZnVuY3Rpb25gIGRlY2xhcmF0aW9uIGNvdW50cyBhcyB3ZWxsIGFzIHRoZSB0d28gZXhwcmVzc2lvbiBmb3JtcywgYmVjYXVzZSB0aGF0IGlzIGhvdyB0aGVzZSBzdWl0ZXNcbiAqIHdyaXRlIGEgbG9jYWwgcmV0cnkgaGVscGVyLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYSBgRnVuY3Rpb25EZWNsYXJhdGlvbmAsIGEgYEZ1bmN0aW9uRXhwcmVzc2lvbmAgb3IgYW4gYEFycm93RnVuY3Rpb25FeHByZXNzaW9uYC5cbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbk5vZGUobm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgSGVscGVyRnVuY3Rpb24ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gaXNDbG9zdXJlRnVuY3Rpb24obm9kZSkgfHwgbm9kZS50eXBlID09PSAnRnVuY3Rpb25EZWNsYXJhdGlvbic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGFuIGlkZW50aWZpZXIuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhbiBgSWRlbnRpZmllcmAuXG4gKi9cbmZ1bmN0aW9uIGlzSWRlbnRpZmllcihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5JZGVudGlmaWVyIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ0lkZW50aWZpZXInO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhbiBgJiZgIGNoYWluLCB3aG9zZSBjb25qdW5jdHMgYSBjZWlsaW5nIG1heSBiZSBkZWNsYXJlZCBpbiBvbmUgb2YuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBMb2dpY2FsRXhwcmVzc2lvbmAgd2l0aCB0aGUgYCYmYCBvcGVyYXRvci5cbiAqL1xuZnVuY3Rpb24gaXNMb2dpY2FsQW5kRXhwcmVzc2lvbihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5Mb2dpY2FsRXhwcmVzc2lvbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdMb2dpY2FsRXhwcmVzc2lvbicgJiYgbm9kZS5vcGVyYXRvciA9PT0gJyYmJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYSBsb29wIHdob3NlIG93biB0ZXN0IGNhbiBkZWNsYXJlIGEgY2VpbGluZy5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGEgYFdoaWxlU3RhdGVtZW50YCwgYSBgRG9XaGlsZVN0YXRlbWVudGAgb3IgYSBgRm9yU3RhdGVtZW50YC5cbiAqL1xuZnVuY3Rpb24gaXNMb29wU3RhdGVtZW50KG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIExvb3BTdGF0ZW1lbnQge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnV2hpbGVTdGF0ZW1lbnQnIHx8IG5vZGUudHlwZSA9PT0gJ0RvV2hpbGVTdGF0ZW1lbnQnIHx8IGlzRm9yU3RhdGVtZW50KG5vZGUpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIG1lbWJlciBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYSBgTWVtYmVyRXhwcmVzc2lvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzTWVtYmVyRXhwcmVzc2lvbihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5NZW1iZXJFeHByZXNzaW9uIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ01lbWJlckV4cHJlc3Npb24nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIG51bWVyaWMgbGl0ZXJhbC5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGEgYExpdGVyYWxgIGhvbGRpbmcgYSBudW1iZXIuXG4gKi9cbmZ1bmN0aW9uIGlzTnVtZXJpY0xpdGVyYWwobm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuTnVtYmVyTGl0ZXJhbCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdMaXRlcmFsJyAmJiB0eXBlb2Ygbm9kZS52YWx1ZSA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGFuIG9iamVjdCBsaXRlcmFsLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYW4gYE9iamVjdEV4cHJlc3Npb25gLlxuICovXG5mdW5jdGlvbiBpc09iamVjdEV4cHJlc3Npb24obm9kZTogVFNFU1RyZWUuTm9kZSk6IG5vZGUgaXMgVFNFU1RyZWUuT2JqZWN0RXhwcmVzc2lvbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWVudW0tY29tcGFyaXNvbiAtLSBBU1Qgbm9kZSB0eXBlIHN0cmluZyBsaXRlcmFscyBtYXRjaCB0aGUgVFNFU1RyZWUgZW51bSB2YWx1ZXMuXG4gIHJldHVybiBub2RlLnR5cGUgPT09ICdPYmplY3RFeHByZXNzaW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYW4gb2JqZWN0IGRlc3RydWN0dXJpbmcgcGF0dGVybi5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBub2RlIGlzIGFuIGBPYmplY3RQYXR0ZXJuYC5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RQYXR0ZXJuKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLk9iamVjdFBhdHRlcm4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnT2JqZWN0UGF0dGVybic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGFuIG9iamVjdC1saXRlcmFsIG9yIG9iamVjdC1wYXR0ZXJuIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYSBgUHJvcGVydHlgLlxuICovXG5mdW5jdGlvbiBpc1Byb3BlcnR5KG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBub2RlIGlzIFRTRVNUcmVlLlByb3BlcnR5IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ1Byb3BlcnR5Jztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vZGUgaXMgYW4gdXBkYXRlIGV4cHJlc3Npb24uXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhbiBgVXBkYXRlRXhwcmVzc2lvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzVXBkYXRlRXhwcmVzc2lvbihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5VcGRhdGVFeHByZXNzaW9uIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ1VwZGF0ZUV4cHJlc3Npb24nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIG5vZGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYSBgVmFyaWFibGVEZWNsYXJhdGlvbmAuXG4gKi9cbmZ1bmN0aW9uIGlzVmFyaWFibGVEZWNsYXJhdGlvbihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5WYXJpYWJsZURlY2xhcmF0aW9uIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZW51bS1jb21wYXJpc29uIC0tIEFTVCBub2RlIHR5cGUgc3RyaW5nIGxpdGVyYWxzIG1hdGNoIHRoZSBUU0VTVHJlZSBlbnVtIHZhbHVlcy5cbiAgcmV0dXJuIG5vZGUudHlwZSA9PT0gJ1ZhcmlhYmxlRGVjbGFyYXRpb24nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm9kZSBpcyBhIHZhcmlhYmxlIGRlY2xhcmF0b3IuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBhIGBWYXJpYWJsZURlY2xhcmF0b3JgLlxuICovXG5mdW5jdGlvbiBpc1ZhcmlhYmxlRGVjbGFyYXRvcihub2RlOiBUU0VTVHJlZS5Ob2RlKTogbm9kZSBpcyBUU0VTVHJlZS5WYXJpYWJsZURlY2xhcmF0b3Ige1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1lbnVtLWNvbXBhcmlzb24gLS0gQVNUIG5vZGUgdHlwZSBzdHJpbmcgbGl0ZXJhbHMgbWF0Y2ggdGhlIFRTRVNUcmVlIGVudW0gdmFsdWVzLlxuICByZXR1cm4gbm9kZS50eXBlID09PSAnVmFyaWFibGVEZWNsYXJhdG9yJztcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgZXhwcmVzc2lvbiBhbiBpZGVudGlmaWVyIGlzIGJvdW5kIHRvLlxuICpcbiAqIEEgYGNvbnN0YCBhbnN3ZXJzIHdpdGggaXRzIGluaXRpYWxpemVyOyBhIGRlc3RydWN0dXJlZCBwYXJhbWV0ZXIgb2YgVEhJUyBjbG9zdXJlIGFuc3dlcnMgd2l0aCB3aGF0IHRoZVxuICogY2FsbCdzIG93biBgaW5wdXRgIHN1cHBsaWVzIGZvciB0aGUga2V5IGl0IHdhcyBkZXN0cnVjdHVyZWQgYnksIHdoaWNoIGlzIGhvdyBhIGJ1ZGdldCB3cml0dGVuIG9uY2UgYXRcbiAqIHRoZSBjYWxsIHNpdGUgcmVhY2hlcyBhIGNsb3N1cmUgdGhhdCBjYW4gY2xvc2Ugb3ZlciBub3RoaW5nLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIGlkZW50aWZpZXIgdG8gcmVzb2x2ZS5cbiAqIEBwYXJhbSBjbG9zdXJlIC0gVGhlIGNsb3N1cmUgdGhlIGlkZW50aWZpZXIgd2FzIHdyaXR0ZW4gaW5zaWRlLlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcnVsZSBjb250ZXh0LCB1c2VkIHRvIHJlc29sdmUgdGhlIGlkZW50aWZpZXIgdGhyb3VnaCBzY29wZS5cbiAqIEByZXR1cm5zIFRoZSBleHByZXNzaW9uIGl0IGlzIGJvdW5kIHRvLCBvciBgbnVsbGAgd2hlbiBub3RoaW5nIHN0YXRpY2FsbHkgYmluZHMgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCb3VuZEV4cHJlc3Npb24obm9kZTogVFNFU1RyZWUuSWRlbnRpZmllciwgY2xvc3VyZTogRXZhbENsb3N1cmUsIGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpOiBudWxsIHwgVFNFU1RyZWUuTm9kZSB7XG4gIGNvbnN0IHZhcmlhYmxlID0gZmluZFZhcmlhYmxlKGNvbnRleHQuc291cmNlQ29kZS5nZXRTY29wZShub2RlKSwgbm9kZS5uYW1lKTtcbiAgaWYgKCF2YXJpYWJsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChjb25zdCBkZWZpbml0aW9uIG9mIHZhcmlhYmxlLmRlZnMpIHtcbiAgICBjb25zdCBkZWZpbml0aW9uTm9kZSA9IHRvVFNFU1RyZWVOb2RlKGRlZmluaXRpb24ubm9kZSk7XG5cbiAgICBpZiAoaXNWYXJpYWJsZURlY2xhcmF0b3IoZGVmaW5pdGlvbk5vZGUpICYmIGRlZmluaXRpb25Ob2RlLmluaXQpIHtcbiAgICAgIHJldHVybiBkZWZpbml0aW9uTm9kZS5pbml0O1xuICAgIH1cblxuICAgIGlmIChkZWZpbml0aW9uTm9kZSA9PT0gY2xvc3VyZS5jbG9zdXJlTm9kZSkge1xuICAgICAgY29uc3QgaW5wdXRLZXkgPSByZWFkUGFyYW1ldGVySW5wdXRLZXkoY2xvc3VyZS5jbG9zdXJlTm9kZSwgbm9kZS5uYW1lKTtcbiAgICAgIHJldHVybiBpbnB1dEtleSA9PT0gbnVsbCA/IG51bGwgOiByZWFkSW5wdXRQcm9wZXJ0eVZhbHVlKGNsb3N1cmUucGFyYW1zTm9kZSwgaW5wdXRLZXkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBoZWxwZXIgYSBjYWxsIG5hbWVzLCB3aGVuIHRoYXQgaGVscGVyIGlzIGRlY2xhcmVkIGluc2lkZSB0aGUgZ2l2ZW4gY2xvc3VyZS5cbiAqXG4gKiBCb3RoIGZvcm1zIHRoZXNlIHN1aXRlcyB3cml0ZSBhcmUgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgc2FtZSBzY29wZSB3YWxrIGEgYnVkZ2V0IHVzZXM6IGEgYGZ1bmN0aW9uYFxuICogZGVjbGFyYXRpb24sIGFuZCBhIGBjb25zdGAgYm91bmQgdG8gYW4gYXJyb3cgb3IgYSBmdW5jdGlvbiBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSBjYWxsTm9kZSAtIFRoZSBjYWxsIGV4cHJlc3Npb24uXG4gKiBAcGFyYW0gY2xvc3VyZSAtIFRoZSBpbi1PYnNpZGlhbiBjbG9zdXJlIHRoZSBjYWxsIHJ1bnMgaW5zaWRlLlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcnVsZSBjb250ZXh0LCB1c2VkIHRvIHJlc29sdmUgdGhlIGNhbGxlZSB0aHJvdWdoIHNjb3BlLlxuICogQHJldHVybnMgVGhlIGhlbHBlcidzIGZ1bmN0aW9uIG5vZGUsIG9yIGBudWxsYCB3aGVuIHRoZSBjYWxsZWUgaXMgbm90IGEgaGVscGVyIG9mIHRoaXMgY2xvc3VyZS5cbiAqL1xuZnVuY3Rpb24gcmVhZENhbGxlZEhlbHBlck5vZGUoY2FsbE5vZGU6IFRTRVNUcmVlLkNhbGxFeHByZXNzaW9uLCBjbG9zdXJlOiBFdmFsQ2xvc3VyZSwgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IEhlbHBlckZ1bmN0aW9uIHwgbnVsbCB7XG4gIGNvbnN0IGNhbGxlZU5vZGUgPSBjYWxsTm9kZS5jYWxsZWUgYXMgVFNFU1RyZWUuTm9kZTtcbiAgaWYgKCFpc0lkZW50aWZpZXIoY2FsbGVlTm9kZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHZhcmlhYmxlID0gZmluZFZhcmlhYmxlKGNvbnRleHQuc291cmNlQ29kZS5nZXRTY29wZShjYWxsZWVOb2RlKSwgY2FsbGVlTm9kZS5uYW1lKTtcbiAgaWYgKCF2YXJpYWJsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChjb25zdCBkZWZpbml0aW9uIG9mIHZhcmlhYmxlLmRlZnMpIHtcbiAgICBjb25zdCBmdW5jdGlvbk5vZGUgPSByZWFkRGVmaW5pdGlvbkZ1bmN0aW9uTm9kZSh0b1RTRVNUcmVlTm9kZShkZWZpbml0aW9uLm5vZGUpKTtcbiAgICBpZiAoZnVuY3Rpb25Ob2RlICYmIGlzRGVjbGFyZWRJbnNpZGVDbG9zdXJlKGZ1bmN0aW9uTm9kZSwgY2xvc3VyZSkpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbk5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogU3VtcyBhIGZ1bmN0aW9uJ3Mgb3duIHdhaXRpbmcgcGx1cyB0aGF0IG9mIGV2ZXJ5IGhlbHBlciBpdCBjYWxscywgbXVsdGlwbGllZCBieSB0aGUgY2FsbHMgdGhhdCByZWFjaCBpdC5cbiAqXG4gKiBBIGZ1bmN0aW9uIGFscmVhZHkgb24gdGhlIHN0YWNrIGNvbnRyaWJ1dGVzIE5PVEhJTkcsIHdoaWNoIGlzIHdoYXQgdGVybWluYXRlcyBkaXJlY3QgYW5kIG11dHVhbFxuICogcmVjdXJzaW9uIOKAlCB0aGUgc2FtZSBzaWxlbmNlIGFuIHVuYm91bmRlZCBsb29wIGdldHMsIHJhdGhlciB0aGFuIGEgZ3Vlc3MgYXQgaG93IG9mdGVuIGl0IHJlcGVhdHMuIFRoZVxuICogc3RhY2sgaXMgdW53b3VuZCBvbiB0aGUgd2F5IG91dCwgc28gYSBoZWxwZXIgcmVhY2hlZCBkb3duIHR3byBkaWZmZXJlbnQgcGF0aHMgaXMgY291bnRlZCBvbiBib3RoLlxuICpcbiAqIEBwYXJhbSBmdW5jdGlvbk5vZGUgLSBUaGUgZnVuY3Rpb24gdG8gdG90YWwuXG4gKiBAcGFyYW0gY2FsbEdyYXBoIC0gVGhlIGZpbGUncyBhY2N1bXVsYXRlZCBjaGFyZ2VzLlxuICogQHBhcmFtIHZpc2l0ZWROb2RlcyAtIFRoZSBmdW5jdGlvbnMgY3VycmVudGx5IGJlaW5nIHRvdGFsbGVkLCB3aGljaCBpcyB0aGUgcmVjdXJzaW9uIHN0YWNrLlxuICogQHJldHVybnMgVGhlIHdhaXRpbmcsIGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuZnVuY3Rpb24gcmVhZENhbGxHcmFwaFdhaXRJbk1pbGxpc2Vjb25kcyhmdW5jdGlvbk5vZGU6IEhlbHBlckZ1bmN0aW9uLCBjYWxsR3JhcGg6IENhbGxHcmFwaCwgdmlzaXRlZE5vZGVzOiBTZXQ8SGVscGVyRnVuY3Rpb24+KTogbnVtYmVyIHtcbiAgaWYgKHZpc2l0ZWROb2Rlcy5oYXMoZnVuY3Rpb25Ob2RlKSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgdmlzaXRlZE5vZGVzLmFkZChmdW5jdGlvbk5vZGUpO1xuXG4gIGxldCB0b3RhbEluTWlsbGlzZWNvbmRzID0gY2FsbEdyYXBoLndhaXRJbk1pbGxpc2Vjb25kc0J5RnVuY3Rpb25Ob2RlLmdldChmdW5jdGlvbk5vZGUpID8/IDA7XG4gIGZvciAoY29uc3QgW2NhbGxlZU5vZGUsIGNhbGxDb3VudF0gb2YgY2FsbEdyYXBoLmNhbGxDb3VudEJ5Q2FsbGVlTm9kZUJ5Q2FsbGVyTm9kZS5nZXQoZnVuY3Rpb25Ob2RlKSA/PyBbXSkge1xuICAgIHRvdGFsSW5NaWxsaXNlY29uZHMgKz0gY2FsbENvdW50ICogcmVhZENhbGxHcmFwaFdhaXRJbk1pbGxpc2Vjb25kcyhjYWxsZWVOb2RlLCBjYWxsR3JhcGgsIHZpc2l0ZWROb2Rlcyk7XG4gIH1cblxuICB2aXNpdGVkTm9kZXMuZGVsZXRlKGZ1bmN0aW9uTm9kZSk7XG4gIHJldHVybiB0b3RhbEluTWlsbGlzZWNvbmRzO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjbG9jayBhIG5vZGUgcmVhZHMgdGhlIGN1cnJlbnQgdGltZSBmcm9tLCBpZiB0aGF0IGlzIHdoYXQgaXQgZG9lcy5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyBUaGUgY2xvY2sgb2JqZWN0J3MgbmFtZSAoYERhdGVgIG9yIGBwZXJmb3JtYW5jZWApLCBvciBgbnVsbGAgd2hlbiB0aGUgbm9kZSBpcyBub3QgYSBjbG9jayByZWFkaW5nLlxuICovXG5mdW5jdGlvbiByZWFkQ2xvY2tOYW1lKG5vZGU6IFRTRVNUcmVlLk5vZGUpOiBudWxsIHwgc3RyaW5nIHtcbiAgaWYgKCFpc0NhbGxFeHByZXNzaW9uKG5vZGUpIHx8IG5vZGUuYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNhbGxlZU5vZGUgPSBub2RlLmNhbGxlZSBhcyBUU0VTVHJlZS5Ob2RlO1xuICBpZiAoIWlzTWVtYmVyRXhwcmVzc2lvbihjYWxsZWVOb2RlKSB8fCBjYWxsZWVOb2RlLmNvbXB1dGVkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBvYmplY3ROb2RlID0gY2FsbGVlTm9kZS5vYmplY3QgYXMgVFNFU1RyZWUuTm9kZTtcbiAgY29uc3QgcHJvcGVydHlOb2RlID0gY2FsbGVlTm9kZS5wcm9wZXJ0eSBhcyBUU0VTVHJlZS5Ob2RlO1xuICByZXR1cm4gIWlzSWRlbnRpZmllcihvYmplY3ROb2RlKSB8fCAhaXNJZGVudGlmaWVyKHByb3BlcnR5Tm9kZSkgfHwgcHJvcGVydHlOb2RlLm5hbWUgIT09IE5PV19NRVRIT0RfTkFNRSB8fCAhQ0xPQ0tfT0JKRUNUX05BTUVTLmhhcyhvYmplY3ROb2RlLm5hbWUpID8gbnVsbCA6IG9iamVjdE5vZGUubmFtZTtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgY2xvc3VyZSBwcm9wZXJ0eSBuYW1lcyBhIGNhbGwncyBwYXJhbWV0ZXIgb2JqZWN0IG1heSBjYXJyeSwgYnkgdGhlIGhlbHBlciBpdCBjYWxscy5cbiAqXG4gKiBAcGFyYW0gY2FsbE5vZGUgLSBUaGUgY2FsbCBleHByZXNzaW9uLlxuICogQHJldHVybnMgVGhlIGluLU9ic2lkaWFuIGNsb3N1cmUgcHJvcGVydHkgbmFtZXMsIG9yIGBudWxsYCB3aGVuIHRoZSBjYWxsZWUgaXMgbm90IG9uZSBvZiB0aGUgaGVscGVycy5cbiAqL1xuZnVuY3Rpb24gcmVhZENsb3N1cmVOYW1lcyhjYWxsTm9kZTogVFNFU1RyZWUuQ2FsbEV4cHJlc3Npb24pOiBudWxsIHwgcmVhZG9ubHkgc3RyaW5nW10ge1xuICByZXR1cm4gaXNJZGVudGlmaWVyKGNhbGxOb2RlLmNhbGxlZSkgPyBDTE9TVVJFX05BTUVTX0JZX0NBTExFRV9OQU1FLmdldChjYWxsTm9kZS5jYWxsZWUubmFtZSkgPz8gbnVsbCA6IG51bGw7XG59XG5cbi8qKlxuICogUmVhZHMgb25lIGNsb3N1cmUncyB3aG9sZSBkZWNsYXJlZCB3YWl0aW5nLlxuICpcbiAqIEV2ZXJ5dGhpbmcgdGhlIGNsb3N1cmUgY2FuIFJFQUNIIGlzIHRvdGFsbGVkIHRocm91Z2ggdGhlIGNhbGwgZ3JhcGgsIG9uY2UgcGVyIGNhbGwgc2l0ZS4gRXZlcnl0aGluZyBpdFxuICogY2Fubm90IOKAlCBhIGhlbHBlciBub3RoaW5nIGNhbGxzLCBvciBvbmUgY2FsbGVkIHRocm91Z2ggYSByZWZlcmVuY2UgdGhpcyBydWxlIGNhbm5vdCBmb2xsb3cg4oCUIGtlZXBzIHRoZVxuICogZmxhdCBzaW5nbGUgY2hhcmdlIGEgbGV4aWNhbCBhdHRyaWJ1dGlvbiBhbHdheXMgZ2F2ZSBpdCwgc28gbm8gY2xvc3VyZSByZXBvcnRlZCBiZWZvcmUgdGhpcyBydWxlIGNvdW50ZWRcbiAqIGNhbGwgc2l0ZXMgZmFsbHMgc2lsZW50IG5vdyB0aGF0IGl0IGRvZXMuXG4gKlxuICogQHBhcmFtIHN0YXRlIC0gVGhlIGNsb3N1cmUncyBhY2N1bXVsYXRlZCBjaGFyZ2VzLlxuICogQHBhcmFtIGNhbGxHcmFwaCAtIFRoZSBmaWxlJ3MgYWNjdW11bGF0ZWQgY2hhcmdlcy5cbiAqIEByZXR1cm5zIFRoZSB3YWl0aW5nIHRoZSBjbG9zdXJlIGRlY2xhcmVzLCBpbiBtaWxsaXNlY29uZHMuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDbG9zdXJlV2FpdEluTWlsbGlzZWNvbmRzKHN0YXRlOiBDbG9zdXJlU3RhdGUsIGNhbGxHcmFwaDogQ2FsbEdyYXBoKTogbnVtYmVyIHtcbiAgY29uc3QgcmVhY2hhYmxlTm9kZXMgPSBuZXcgU2V0PEhlbHBlckZ1bmN0aW9uPigpO1xuICBjb2xsZWN0UmVhY2hhYmxlRnVuY3Rpb25Ob2RlcyhzdGF0ZS5jbG9zdXJlTm9kZSwgY2FsbEdyYXBoLCByZWFjaGFibGVOb2Rlcyk7XG5cbiAgbGV0IHRvdGFsSW5NaWxsaXNlY29uZHMgPSByZWFkQ2FsbEdyYXBoV2FpdEluTWlsbGlzZWNvbmRzKHN0YXRlLmNsb3N1cmVOb2RlLCBjYWxsR3JhcGgsIG5ldyBTZXQ8SGVscGVyRnVuY3Rpb24+KCkpO1xuXG4gIGZvciAoY29uc3QgZnVuY3Rpb25Ob2RlIG9mIHN0YXRlLmZ1bmN0aW9uTm9kZXMpIHtcbiAgICBjb25zdCBvd25XYWl0SW5NaWxsaXNlY29uZHMgPSBjYWxsR3JhcGgud2FpdEluTWlsbGlzZWNvbmRzQnlGdW5jdGlvbk5vZGUuZ2V0KGZ1bmN0aW9uTm9kZSk7XG4gICAgaWYgKG93bldhaXRJbk1pbGxpc2Vjb25kcyA9PT0gdW5kZWZpbmVkIHx8IHJlYWNoYWJsZU5vZGVzLmhhcyhmdW5jdGlvbk5vZGUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0b3RhbEluTWlsbGlzZWNvbmRzICs9IG93bldhaXRJbk1pbGxpc2Vjb25kcztcbiAgfVxuXG4gIHJldHVybiB0b3RhbEluTWlsbGlzZWNvbmRzO1xufVxuXG4vKipcbiAqIEZsYXR0ZW5zIGFuIGAmJmAgY2hhaW4gaW50byB0aGUgY29uZGl0aW9ucyBpdCBpcyBidWlsdCBmcm9tLlxuICpcbiAqIEEgdGVzdCB0aGF0IGlzIG5vdCBhbiBgJiZgIGNoYWluIGFuc3dlcnMgd2l0aCBpdHNlbGYsIHNvIGEgY2FsbGVyIG5ldmVyIHNwZWNpYWwtY2FzZXMgdGhlIHNpbXBsZSBmb3JtLlxuICpcbiAqIEBwYXJhbSBub2RlIC0gVGhlIGV4cHJlc3Npb24gdG8gZmxhdHRlbi5cbiAqIEByZXR1cm5zIEV2ZXJ5IGNvbmp1bmN0LCBsZWZ0IHRvIHJpZ2h0LlxuICovXG5mdW5jdGlvbiByZWFkQ29uanVuY3RzKG5vZGU6IFRTRVNUcmVlLkV4cHJlc3Npb24pOiBUU0VTVHJlZS5FeHByZXNzaW9uW10ge1xuICByZXR1cm4gaXNMb2dpY2FsQW5kRXhwcmVzc2lvbihub2RlKSA/IFsuLi5yZWFkQ29uanVuY3RzKG5vZGUubGVmdCksIC4uLnJlYWRDb25qdW5jdHMobm9kZS5yaWdodCldIDogW25vZGVdO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjZWlsaW5nIGEgc2luZ2xlIGBjbG9jay5ub3coKSA8IGRlYWRsaW5lYCBjb21wYXJpc29uIGRlY2xhcmVzLlxuICpcbiAqIEJvdGggb3BlcmFuZCBvcmRlcnMgYXJlIHJlYWQsIHNpbmNlIGBkZWFkbGluZSA+IGNsb2NrLm5vdygpYCBpcyB0aGUgc2FtZSBndWFyZCB3cml0dGVuIHRoZSBvdGhlciB3YXlcbiAqIHJvdW5kLiBUaGUgYmluZGluZyBtdXN0IHRha2UgaXRzIHRpbWUgZnJvbSB0aGUgU0FNRSBjbG9jayBhcyB0aGUgZ3VhcmQ6IGEgY29tcGFyaXNvbiBhY3Jvc3MgdGhlIHR3b1xuICogbWVhc3VyZXMgbm90aGluZywgYW5kIGRlY2xpbmluZyBpdCBpcyB0aGUgc2lsZW5jZSBhbnkgdW5yZXNvbHZhYmxlIHZhbHVlIGFscmVhZHkgZ2V0cy5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBjb25kaXRpb24gdG8gaW5zcGVjdC5cbiAqIEBwYXJhbSBjbG9zdXJlIC0gVGhlIGluLU9ic2lkaWFuIGNsb3N1cmUgdGhlIGxvb3AgcnVucyBpbnNpZGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBydWxlIGNvbnRleHQsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVhZGxpbmUgdGhyb3VnaCBzY29wZS5cbiAqIEByZXR1cm5zIFRoZSBjZWlsaW5nIGluIG1pbGxpc2Vjb25kcywgb3IgYG51bGxgIHdoZW4gdGhlIGNvbmRpdGlvbiBkZWNsYXJlcyBub25lLlxuICovXG5mdW5jdGlvbiByZWFkRGVhZGxpbmVHdWFyZEluTWlsbGlzZWNvbmRzKG5vZGU6IFRTRVNUcmVlLk5vZGUsIGNsb3N1cmU6IEV2YWxDbG9zdXJlLCBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0KTogbnVsbCB8IG51bWJlciB7XG4gIGlmICghaXNCaW5hcnlFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBpc0Nsb2NrT25MZWZ0ID0gbm9kZS5vcGVyYXRvciA9PT0gJzwnIHx8IG5vZGUub3BlcmF0b3IgPT09ICc8PSc7XG4gIGlmICghaXNDbG9ja09uTGVmdCAmJiBub2RlLm9wZXJhdG9yICE9PSAnPicgJiYgbm9kZS5vcGVyYXRvciAhPT0gJz49Jykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgY2xvY2tOYW1lID0gcmVhZENsb2NrTmFtZShpc0Nsb2NrT25MZWZ0ID8gbm9kZS5sZWZ0IDogbm9kZS5yaWdodCk7XG4gIGNvbnN0IGRlYWRsaW5lTm9kZSA9IChpc0Nsb2NrT25MZWZ0ID8gbm9kZS5yaWdodCA6IG5vZGUubGVmdCkgYXMgVFNFU1RyZWUuTm9kZTtcbiAgaWYgKGNsb2NrTmFtZSA9PT0gbnVsbCB8fCAhaXNJZGVudGlmaWVyKGRlYWRsaW5lTm9kZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGJvdW5kTm9kZSA9IHJlYWRCb3VuZEV4cHJlc3Npb24oZGVhZGxpbmVOb2RlLCBjbG9zdXJlLCBjb250ZXh0KTtcbiAgcmV0dXJuICFib3VuZE5vZGUgfHwgIWlzQmluYXJ5RXhwcmVzc2lvbihib3VuZE5vZGUpIHx8IGJvdW5kTm9kZS5vcGVyYXRvciAhPT0gJysnIHx8IChyZWFkQ2xvY2tOYW1lKGJvdW5kTm9kZS5sZWZ0KSAhPT0gY2xvY2tOYW1lKSA/IG51bGwgOiByZXNvbHZlTnVtYmVyKGJvdW5kTm9kZS5yaWdodCwgY2xvc3VyZSwgY29udGV4dCk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGZ1bmN0aW9uIGEgc2NvcGUgZGVmaW5pdGlvbiBkZWNsYXJlcywgaWYgaXQgZGVjbGFyZXMgb25lLlxuICpcbiAqIEBwYXJhbSBkZWZpbml0aW9uTm9kZSAtIFRoZSBub2RlIGEgdmFyaWFibGUncyBkZWZpbml0aW9uIHBvaW50cyBhdC5cbiAqIEByZXR1cm5zIFRoZSBmdW5jdGlvbiBpdCBkZWNsYXJlcywgb3IgYG51bGxgIHdoZW4gdGhlIG5hbWUgaXMgYm91bmQgdG8gYW55dGhpbmcgZWxzZS5cbiAqL1xuZnVuY3Rpb24gcmVhZERlZmluaXRpb25GdW5jdGlvbk5vZGUoZGVmaW5pdGlvbk5vZGU6IFRTRVNUcmVlLk5vZGUpOiBIZWxwZXJGdW5jdGlvbiB8IG51bGwge1xuICBpZiAoaXNGdW5jdGlvbk5vZGUoZGVmaW5pdGlvbk5vZGUpKSB7XG4gICAgcmV0dXJuIGRlZmluaXRpb25Ob2RlO1xuICB9XG5cbiAgaWYgKCFpc1ZhcmlhYmxlRGVjbGFyYXRvcihkZWZpbml0aW9uTm9kZSkgfHwgIWRlZmluaXRpb25Ob2RlLmluaXQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGluaXROb2RlID0gZGVmaW5pdGlvbk5vZGUuaW5pdCBhcyBUU0VTVHJlZS5Ob2RlO1xuICByZXR1cm4gaXNGdW5jdGlvbk5vZGUoaW5pdE5vZGUpID8gaW5pdE5vZGUgOiBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBpbi1PYnNpZGlhbiBjbG9zdXJlIGEgZnVuY3Rpb24gbm9kZSBpcywgaWYgaXQgaXMgb25lLlxuICpcbiAqIEEgY2xvc3VyZSBxdWFsaWZpZXMgd2hlbiBpdCBpcyB0aGUgdmFsdWUgb2YgYSBgY2FsbGJhY2tgIC8gYHBvbGxgIC8gYHN0YXJ0YCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0XG4gKiBsaXRlcmFsIHBhc3NlZCBhcyB0aGUgaGVscGVyJ3MgZmlyc3QgYXJndW1lbnQg4oCUIHdoaWNoIGNvdmVycyBib3RoIHRoZSBtZXRob2Qgc2hvcnRoYW5kXG4gKiAoYGFzeW5jIGNhbGxiYWNrKHsg4oCmIH0pIHsg4oCmIH1gKSBhbmQgYW4gYXJyb3cgKGBjYWxsYmFjazogYXN5bmMgKHsg4oCmIH0pID0+IHsg4oCmIH1gKS5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlIHRvIGNoZWNrLlxuICogQHJldHVybnMgVGhlIGNsb3N1cmUsIG9yIGBudWxsYCB3aGVuIHRoZSBub2RlIGlzIG5vdCBhbiBpbi1PYnNpZGlhbiBjbG9zdXJlLlxuICovXG5mdW5jdGlvbiByZWFkRXZhbENsb3N1cmUobm9kZTogVFNFU1RyZWUuTm9kZSk6IEV2YWxDbG9zdXJlIHwgbnVsbCB7XG4gIGlmICghaXNDbG9zdXJlRnVuY3Rpb24obm9kZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHByb3BlcnR5Tm9kZSA9IG5vZGUucGFyZW50O1xuICBpZiAoIWlzUHJvcGVydHkocHJvcGVydHlOb2RlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLypcbiAgICogVGhlIG9iamVjdCBjaGVjayBjb21lcyBCRUZPUkUgdGhlIGtleSBjaGVjayBiZWNhdXNlIGEgZnVuY3Rpb24gY2FuIHJlYWNoIGEgcHJvcGVydHkgdGhyb3VnaCBpdHNcbiAgICogQ09NUFVURUQgS0VZIGFzIHdlbGwgYXMgdGhyb3VnaCBpdHMgdmFsdWUgLS0gYHsgWygpID0+ICdhJ106IDEgfWAgaXMgbGVnYWwgLS0gYW5kIGEgZGVzdHJ1Y3R1cmluZ1xuICAgKiBwYXR0ZXJuIGNhbiBjYXJyeSBvbmUgdG9vLiBOZWl0aGVyIGlzIGEgaGVscGVyIGNhbGwncyBwYXJhbWV0ZXIgb2JqZWN0LlxuICAgKi9cbiAgY29uc3QgcGFyYW1zTm9kZSA9IHByb3BlcnR5Tm9kZS5wYXJlbnQ7XG4gIGlmICghaXNPYmplY3RFeHByZXNzaW9uKHBhcmFtc05vZGUpIHx8ICFpc0lkZW50aWZpZXIocHJvcGVydHlOb2RlLmtleSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGNhbGxOb2RlID0gcGFyYW1zTm9kZS5wYXJlbnQ7XG4gIGlmICghaXNDYWxsRXhwcmVzc2lvbihjYWxsTm9kZSkgfHwgY2FsbE5vZGUuYXJndW1lbnRzWzBdICE9PSBwYXJhbXNOb2RlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBjbG9zdXJlTmFtZXMgPSByZWFkQ2xvc3VyZU5hbWVzKGNhbGxOb2RlKTtcbiAgcmV0dXJuIGNsb3N1cmVOYW1lcz8uaW5jbHVkZXMocHJvcGVydHlOb2RlLmtleS5uYW1lKVxuICAgID8ge1xuICAgICAgY2xvc3VyZU5vZGU6IG5vZGUsXG4gICAgICBwYXJhbXNOb2RlLFxuICAgICAgcmVwb3J0Tm9kZTogcHJvcGVydHlOb2RlXG4gICAgfVxuICAgIDogbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgdmFsdWUgYSBjYWxsJ3Mgb3duIGBpbnB1dGAgb2JqZWN0IHN1cHBsaWVzIGZvciBvbmUga2V5LlxuICpcbiAqIFRoaXMgaXMgaG93IGEgYnVkZ2V0IGRlY2xhcmVkIG9uY2UgYXQgdGhlIGNhbGwgc2l0ZSByZWFjaGVzIHRoZSBjbG9zdXJlLCB3aGljaCBjYW5ub3QgY2xvc2Ugb3ZlclxuICogYW55dGhpbmc6IGBpbnB1dDogeyBzZXR0bGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IFNFVFRMRSB9YCBhcnJpdmVzIGRlc3RydWN0dXJlZCBpbiB0aGUgY2FsbGJhY2snc1xuICogcGFyYW1ldGVyIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zTm9kZSAtIFRoZSBoZWxwZXIncyBwYXJhbWV0ZXIgb2JqZWN0LlxuICogQHBhcmFtIGtleU5hbWUgLSBUaGUgYGlucHV0YCBwcm9wZXJ0eSB0byByZWFkLlxuICogQHJldHVybnMgVGhlIGV4cHJlc3Npb24gc3VwcGx5aW5nIHRoYXQga2V5LCBvciBgbnVsbGAgd2hlbiB0aGUgY2FsbCdzIGBpbnB1dGAgZG9lcyBub3QgZGVjbGFyZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVhZElucHV0UHJvcGVydHlWYWx1ZShwYXJhbXNOb2RlOiBUU0VTVHJlZS5PYmplY3RFeHByZXNzaW9uLCBrZXlOYW1lOiBzdHJpbmcpOiBudWxsIHwgVFNFU1RyZWUuTm9kZSB7XG4gIGNvbnN0IGlucHV0UHJvcGVydHkgPSBwYXJhbXNOb2RlLnByb3BlcnRpZXMuZmluZCgocHJvcGVydHkpID0+XG4gICAgaXNQcm9wZXJ0eShwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmIGlzSWRlbnRpZmllcigocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmICgocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5JZGVudGlmaWVyKS5uYW1lID09PSBJTlBVVF9QUk9QRVJUWV9OQU1FXG4gICkgYXMgVFNFU1RyZWUuUHJvcGVydHkgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3QgaW5wdXROb2RlID0gaW5wdXRQcm9wZXJ0eT8udmFsdWUgYXMgVFNFU1RyZWUuTm9kZSB8IHVuZGVmaW5lZDtcbiAgaWYgKCFpbnB1dE5vZGUgfHwgIWlzT2JqZWN0RXhwcmVzc2lvbihpbnB1dE5vZGUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB2YWx1ZVByb3BlcnR5ID0gaW5wdXROb2RlLnByb3BlcnRpZXMuZmluZCgocHJvcGVydHkpID0+XG4gICAgaXNQcm9wZXJ0eShwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmIGlzSWRlbnRpZmllcigocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmICgocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5JZGVudGlmaWVyKS5uYW1lID09PSBrZXlOYW1lXG4gICkgYXMgVFNFU1RyZWUuUHJvcGVydHkgfCB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuICh2YWx1ZVByb3BlcnR5Py52YWx1ZSBhcyBUU0VTVHJlZS5Ob2RlIHwgdW5kZWZpbmVkKSA/PyBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSB3aG9sZS1sb29wIGNlaWxpbmcgYSBjbG9jayBkZWFkbGluZSBkZWNsYXJlcywgaW4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIFRoZSBndWFyZCBpcyBsb29rZWQgZm9yIGFtb25nIHRoZSB0ZXN0J3MgYCYmYCBjb25qdW5jdHMgcmF0aGVyIHRoYW4gYXMgdGhlIHdob2xlIHRlc3QsIGJlY2F1c2UgdGhlXG4gKiBsb29wcyB0aGF0IGNhcnJ5IG9uZSBwYWlyIGl0IHdpdGggYSBwcm9ncmVzcyBjb25kaXRpb24g4oCUIGB3aGlsZSAoY291bnQgPCBleHBlY3RlZCAmJiBEYXRlLm5vdygpIDwgZGVhZGxpbmUpYFxuICog4oCUIGFuZCBhIGNvbXBvdW5kIHRlc3QgbXVzdCBub3QgcmVtb3ZlIGEgY2VpbGluZyBvbmUgb2YgaXRzIGNvbmp1bmN0cyBwbGFpbmx5IGRlY2xhcmVzLlxuICpcbiAqIEBwYXJhbSBsb29wTm9kZSAtIFRoZSBsb29wIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0gY2xvc3VyZSAtIFRoZSBpbi1PYnNpZGlhbiBjbG9zdXJlIHRoZSBsb29wIHJ1bnMgaW5zaWRlLlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcnVsZSBjb250ZXh0LCB1c2VkIHRvIHJlc29sdmUgdGhlIGRlYWRsaW5lIHRocm91Z2ggc2NvcGUuXG4gKiBAcmV0dXJucyBUaGUgY2VpbGluZyBpbiBtaWxsaXNlY29uZHMsIG9yIGBudWxsYCB3aGVuIHRoZSBsb29wIGRlY2xhcmVzIG5vbmUuXG4gKi9cbmZ1bmN0aW9uIHJlYWRMb29wRGVhZGxpbmVJbk1pbGxpc2Vjb25kcyhsb29wTm9kZTogTG9vcFN0YXRlbWVudCwgY2xvc3VyZTogRXZhbENsb3N1cmUsIGNvbnRleHQ6IFJ1bGUuUnVsZUNvbnRleHQpOiBudWxsIHwgbnVtYmVyIHtcbiAgaWYgKCFsb29wTm9kZS50ZXN0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmb3IgKGNvbnN0IGNvbmp1bmN0IG9mIHJlYWRDb25qdW5jdHMobG9vcE5vZGUudGVzdCkpIHtcbiAgICBjb25zdCBkZWFkbGluZUluTWlsbGlzZWNvbmRzID0gcmVhZERlYWRsaW5lR3VhcmRJbk1pbGxpc2Vjb25kcyhjb25qdW5jdCwgY2xvc3VyZSwgY29udGV4dCk7XG4gICAgaWYgKGRlYWRsaW5lSW5NaWxsaXNlY29uZHMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBkZWFkbGluZUluTWlsbGlzZWNvbmRzO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBmaXJzdCB2YWx1ZSBhIGxvb3AncyB0ZXN0IHdpbGwgbm90IGxldCBpdHMgY291bnRlciByZWFjaC5cbiAqXG4gKiBBbiBpbmNsdXNpdmUgYm91bmQgYW5zd2VycyBvbmUgaGlnaGVyIHRoYW4gaXQgaXMgd3JpdHRlbiwgc28gYSBjYWxsZXIgd29ya3MgaW4gb25lIGN1cnJlbmN5IHJhdGhlciB0aGFuXG4gKiBjYXJyeWluZyB0aGUgb3BlcmF0b3IgYWxvbmcgd2l0aCB0aGUgbnVtYmVyLiBUaGUgdGVzdCBpcyByZWFkIGFzIGAmJmAgY29uanVuY3RzIGZvciB0aGUgc2FtZSByZWFzb24gYVxuICogZGVhZGxpbmUgZ3VhcmQgaXM6IGBhdHRlbXB0IDwgQVRURU1QVFMgJiYgIWlzT3BlbmAgc3RpbGwgY2Fubm90IHJ1biBtb3JlIHRoYW4gYEFUVEVNUFRTYCB0aW1lcy5cbiAqXG4gKiBAcGFyYW0gdGVzdE5vZGUgLSBUaGUgbG9vcCdzIHRlc3QuXG4gKiBAcGFyYW0gY291bnRlck5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgY291bnRlciB0aGUgbG9vcCBhZHZhbmNlcy5cbiAqIEBwYXJhbSBjbG9zdXJlIC0gVGhlIGluLU9ic2lkaWFuIGNsb3N1cmUgdGhlIGxvb3AgcnVucyBpbnNpZGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBydWxlIGNvbnRleHQsIHVzZWQgdG8gcmVzb2x2ZSB0aGUgYm91bmQgdGhyb3VnaCBzY29wZS5cbiAqIEByZXR1cm5zIFRoZSBleGNsdXNpdmUgYm91bmQsIG9yIGBudWxsYCB3aGVuIG5vIGNvbmp1bmN0IGJvdW5kcyB0aGF0IGNvdW50ZXIgYnkgYSByZXNvbHZhYmxlIG51bWJlci5cbiAqL1xuZnVuY3Rpb24gcmVhZExvb3BFeGNsdXNpdmVCb3VuZChcbiAgdGVzdE5vZGU6IFRTRVNUcmVlLkV4cHJlc3Npb24sXG4gIGNvdW50ZXJOYW1lOiBzdHJpbmcsXG4gIGNsb3N1cmU6IEV2YWxDbG9zdXJlLFxuICBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0XG4pOiBudWxsIHwgbnVtYmVyIHtcbiAgZm9yIChjb25zdCBjb25qdW5jdCBvZiByZWFkQ29uanVuY3RzKHRlc3ROb2RlKSkge1xuICAgIGlmICghaXNCaW5hcnlFeHByZXNzaW9uKGNvbmp1bmN0KSB8fCAoY29uanVuY3Qub3BlcmF0b3IgIT09ICc8JyAmJiBjb25qdW5jdC5vcGVyYXRvciAhPT0gJzw9JykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50ZXJOb2RlID0gY29uanVuY3QubGVmdCBhcyBUU0VTVHJlZS5Ob2RlO1xuICAgIGlmICghaXNJZGVudGlmaWVyKGNvdW50ZXJOb2RlKSB8fCBjb3VudGVyTm9kZS5uYW1lICE9PSBjb3VudGVyTmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgYm91bmRWYWx1ZSA9IHJlc29sdmVOdW1iZXIoY29uanVuY3QucmlnaHQsIGNsb3N1cmUsIGNvbnRleHQpO1xuICAgIGlmIChib3VuZFZhbHVlID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uanVuY3Qub3BlcmF0b3IgPT09ICc8JyA/IGJvdW5kVmFsdWUgOiBib3VuZFZhbHVlICsgMTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIGhvdyBtYW55IHRpbWVzIGEgY291bnRpbmcgYGZvcmAgcnVucy5cbiAqXG4gKiBUaGUgYm91bmQgaXMgcmVhZCBmcm9tIHRoZSBzYW1lIGAmJmAgY29uanVuY3RzIGEgZGVhZGxpbmUgaXMsIGZvciB0aGUgc2FtZSByZWFzb246XG4gKiBgYXR0ZW1wdCA8IEFUVEVNUFRTICYmICFpc09wZW5gIHN0aWxsIGNhbm5vdCBydW4gbW9yZSB0aGFuIGBBVFRFTVBUU2AgdGltZXMuIFRoZSBTVEVQIGlzIHJlYWQgcmF0aGVyXG4gKiB0aGFuIHByZXN1bWVkIHRvIGJlIG9uZSwgb3IgYSBgZm9yIChsZXQgZWxhcHNlZCA9IDA7IGVsYXBzZWQgPCBCVURHRVQ7IGVsYXBzZWQgKz0gSU5URVJWQUwpYCBwb2xsIHdvdWxkXG4gKiBiZSBjb3VudGVkIGBCVURHRVRgIHRpbWVzLlxuICpcbiAqIEBwYXJhbSBsb29wTm9kZSAtIFRoZSBsb29wIHRvIGluc3BlY3QuXG4gKiBAcGFyYW0gY2xvc3VyZSAtIFRoZSBpbi1PYnNpZGlhbiBjbG9zdXJlIHRoZSBsb29wIHJ1bnMgaW5zaWRlLlxuICogQHBhcmFtIGNvbnRleHQgLSBUaGUgcnVsZSBjb250ZXh0LCB1c2VkIHRvIHJlc29sdmUgdGhlIHN0YXJ0LCBib3VuZCBhbmQgc3RlcCB0aHJvdWdoIHNjb3BlLlxuICogQHJldHVybnMgVGhlIGl0ZXJhdGlvbiBjb3VudCwgb3IgYG51bGxgIHdoZW4gaXQgaXMgbm90IHN0YXRpY2FsbHkga25vd2FibGUuXG4gKi9cbmZ1bmN0aW9uIHJlYWRMb29wSXRlcmF0aW9uQ291bnQobG9vcE5vZGU6IExvb3BTdGF0ZW1lbnQsIGNsb3N1cmU6IEV2YWxDbG9zdXJlLCBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0KTogbnVsbCB8IG51bWJlciB7XG4gIGlmICghaXNGb3JTdGF0ZW1lbnQobG9vcE5vZGUpIHx8ICFsb29wTm9kZS50ZXN0IHx8ICFsb29wTm9kZS5pbml0IHx8ICFpc1ZhcmlhYmxlRGVjbGFyYXRpb24obG9vcE5vZGUuaW5pdCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGRlY2xhcmF0b3JOb2RlcyA9IGxvb3BOb2RlLmluaXQuZGVjbGFyYXRpb25zO1xuICBjb25zdCBkZWNsYXJhdG9yTm9kZSA9IGRlY2xhcmF0b3JOb2Rlcy5sZW5ndGggPT09IDEgPyBkZWNsYXJhdG9yTm9kZXNbMF0gOiB1bmRlZmluZWQ7XG4gIGlmICghZGVjbGFyYXRvck5vZGU/LmluaXQgfHwgIWlzSWRlbnRpZmllcihkZWNsYXJhdG9yTm9kZS5pZCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0VmFsdWUgPSByZXNvbHZlTnVtYmVyKGRlY2xhcmF0b3JOb2RlLmluaXQsIGNsb3N1cmUsIGNvbnRleHQpO1xuICBjb25zdCBzdGVwU2l6ZSA9IHJlYWRMb29wU3RlcFNpemUobG9vcE5vZGUudXBkYXRlLCBkZWNsYXJhdG9yTm9kZS5pZCwgY2xvc3VyZSwgY29udGV4dCk7XG4gIGNvbnN0IGJvdW5kVmFsdWUgPSByZWFkTG9vcEV4Y2x1c2l2ZUJvdW5kKGxvb3BOb2RlLnRlc3QsIGRlY2xhcmF0b3JOb2RlLmlkLm5hbWUsIGNsb3N1cmUsIGNvbnRleHQpO1xuICBpZiAoc3RhcnRWYWx1ZSA9PT0gbnVsbCB8fCBzdGVwU2l6ZSA9PT0gbnVsbCB8fCBzdGVwU2l6ZSA8PSAwIHx8IGJvdW5kVmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNwYW4gPSBib3VuZFZhbHVlIC0gc3RhcnRWYWx1ZTtcbiAgcmV0dXJuIHNwYW4gPiAwID8gTWF0aC5jZWlsKHNwYW4gLyBzdGVwU2l6ZSkgOiAwO1xufVxuXG4vKipcbiAqIFJlYWRzIGhvdyBtYW55IHRpbWVzIHNvbWV0aGluZyB3cml0dGVuIGF0IGEgbm9kZSBhY3R1YWxseSBydW5zLCBhcyB0aGUgcHJvZHVjdCBvZiBpdHMgZW5jbG9zaW5nIGxvb3BzLlxuICpcbiAqIEEgbG9vcCB0aGF0IGlzIG5vdCBzdGF0aWNhbGx5IGNvdW50YWJsZSBjb250cmlidXRlcyBhIGZhY3RvciBvZiBPTkUgcmF0aGVyIHRoYW4gZGlzcXVhbGlmeWluZyB0aGUgc3VtOlxuICogdGhhdCBpcyB0aGUgcGVyLWl0ZXJhdGlvbiBjaGFyZ2UgdGhpcyBydWxlIGhhcyBhbHdheXMgbWFkZSwgYW5kIGl0IGlzIHdoYXQga2VlcHMgYW4gdW5ib3VuZGVkXG4gKiBgd2hpbGUgKHRydWUpYCBzaWxlbnQgaW5zdGVhZCBvZiBndWVzc2VkIGF0LiBBIERFQURMSU5FLWJvdW5kZWQgbG9vcCBjb250cmlidXRlcyBvbmUgYXMgd2VsbCwgYmVjYXVzZVxuICogaXRzIHdob2xlLWxvb3AgY2VpbGluZyBpcyBjaGFyZ2VkIHNlcGFyYXRlbHkgYW5kIG11bHRpcGx5aW5nIHRvbyB3b3VsZCBjb3VudCB0aGUgc2FtZSB3YWl0aW5nIHR3aWNlLlxuICpcbiAqIFRoZSB3YWxrIHN0b3BzIGF0IHRoZSBmdW5jdGlvbiB0aGUgbm9kZSBpcyBDSEFSR0VEIHRvLCBub3QgYXQgdGhlIGNsb3N1cmUsIHNvIHRoZSBsb29wcyBhcm91bmQgYSBoZWxwZXInc1xuICogb3duIHdhaXRzIGFuZCB0aGUgbG9vcHMgYXJvdW5kIGVhY2ggY2FsbCB0byB0aGF0IGhlbHBlciBhcmUgY291bnRlZCBvbmNlIGVhY2ggcmF0aGVyIHRoYW4gdHdpY2UuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZSB0byBjb3VudCB0aGUgcnVucyBvZi5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgZnVuY3Rpb24gdGhlIG5vZGUgaXMgY2hhcmdlZCB0by5cbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHJ1bGUgY29udGV4dCwgdXNlZCB0byByZXNvbHZlIGxvb3AgYm91bmRzIHRocm91Z2ggc2NvcGUuXG4gKiBAcmV0dXJucyBUaGUgbXVsdGlwbGllciwgbmV2ZXIgbGVzcyB0aGFuIG9uZS5cbiAqL1xuZnVuY3Rpb24gcmVhZExvb3BNdWx0aXBsaWVyKG5vZGU6IFRTRVNUcmVlLk5vZGUsIHRhcmdldDogQ2hhcmdlVGFyZ2V0LCBjb250ZXh0OiBSdWxlLlJ1bGVDb250ZXh0KTogbnVtYmVyIHtcbiAgY29uc3QgY2xvc3VyZSA9IHRhcmdldC5jbG9zdXJlO1xuICBsZXQgbXVsdGlwbGllciA9IDE7XG4gIGxldCBjdXJyZW50Tm9kZTogVFNFU1RyZWUuTm9kZSB8IHVuZGVmaW5lZCA9IG5vZGUucGFyZW50O1xuXG4gIHdoaWxlIChjdXJyZW50Tm9kZSAmJiBjdXJyZW50Tm9kZSAhPT0gdGFyZ2V0LmZ1bmN0aW9uTm9kZSkge1xuICAgIGlmIChpc0xvb3BTdGF0ZW1lbnQoY3VycmVudE5vZGUpICYmIHJlYWRMb29wRGVhZGxpbmVJbk1pbGxpc2Vjb25kcyhjdXJyZW50Tm9kZSwgY2xvc3VyZSwgY29udGV4dCkgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGl0ZXJhdGlvbkNvdW50ID0gcmVhZExvb3BJdGVyYXRpb25Db3VudChjdXJyZW50Tm9kZSwgY2xvc3VyZSwgY29udGV4dCk7XG4gICAgICBpZiAoaXRlcmF0aW9uQ291bnQgIT09IG51bGwpIHtcbiAgICAgICAgbXVsdGlwbGllciAqPSBpdGVyYXRpb25Db3VudDtcbiAgICAgIH1cbiAgICB9XG4gICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gbXVsdGlwbGllcjtcbn1cblxuLyoqXG4gKiBSZWFkcyBob3cgZmFyIGEgY291bnRpbmcgbG9vcCdzIHZhcmlhYmxlIGFkdmFuY2VzIGVhY2ggaXRlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSB1cGRhdGVOb2RlIC0gVGhlIGxvb3AncyB1cGRhdGUgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBjb3VudGVyTm9kZSAtIFRoZSBpZGVudGlmaWVyIHRoZSBsb29wIGNvdW50cyBvbi5cbiAqIEBwYXJhbSBjbG9zdXJlIC0gVGhlIGluLU9ic2lkaWFuIGNsb3N1cmUgdGhlIGxvb3AgcnVucyBpbnNpZGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBydWxlIGNvbnRleHQsIHVzZWQgdG8gcmVzb2x2ZSBhIG5vbi1saXRlcmFsIHN0ZXAgdGhyb3VnaCBzY29wZS5cbiAqIEByZXR1cm5zIFRoZSBzdGVwLCBvciBgbnVsbGAgd2hlbiB0aGUgdXBkYXRlIGlzIG5vdCBhIHBsYWluIGFkdmFuY2Ugb2YgdGhlIGxvb3AncyBvd24gY291bnRlci5cbiAqL1xuZnVuY3Rpb24gcmVhZExvb3BTdGVwU2l6ZShcbiAgdXBkYXRlTm9kZTogbnVsbCB8IFRTRVNUcmVlLkV4cHJlc3Npb24sXG4gIGNvdW50ZXJOb2RlOiBUU0VTVHJlZS5JZGVudGlmaWVyLFxuICBjbG9zdXJlOiBFdmFsQ2xvc3VyZSxcbiAgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dFxuKTogbnVsbCB8IG51bWJlciB7XG4gIGlmICghdXBkYXRlTm9kZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGlzVXBkYXRlRXhwcmVzc2lvbih1cGRhdGVOb2RlKSkge1xuICAgIGNvbnN0IGFyZ3VtZW50Tm9kZSA9IHVwZGF0ZU5vZGUuYXJndW1lbnQgYXMgVFNFU1RyZWUuTm9kZTtcbiAgICByZXR1cm4gdXBkYXRlTm9kZS5vcGVyYXRvciA9PT0gJysrJyAmJiBpc0lkZW50aWZpZXIoYXJndW1lbnROb2RlKSAmJiBhcmd1bWVudE5vZGUubmFtZSA9PT0gY291bnRlck5vZGUubmFtZSA/IDEgOiBudWxsO1xuICB9XG5cbiAgaWYgKCFpc0Fzc2lnbm1lbnRFeHByZXNzaW9uKHVwZGF0ZU5vZGUpIHx8IHVwZGF0ZU5vZGUub3BlcmF0b3IgIT09ICcrPScpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHRhcmdldE5vZGUgPSB1cGRhdGVOb2RlLmxlZnQgYXMgVFNFU1RyZWUuTm9kZTtcbiAgcmV0dXJuICFpc0lkZW50aWZpZXIodGFyZ2V0Tm9kZSkgfHwgdGFyZ2V0Tm9kZS5uYW1lICE9PSBjb3VudGVyTm9kZS5uYW1lID8gbnVsbCA6IHJlc29sdmVOdW1iZXIodXBkYXRlTm9kZS5yaWdodCwgY2xvc3VyZSwgY29udGV4dCk7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIGBpbnB1dGAga2V5IGEgZGVzdHJ1Y3R1cmVkIGNsb3N1cmUgcGFyYW1ldGVyIGlzIGJvdW5kIGZyb20uXG4gKlxuICogVGhlIGJpbmRpbmcgbWF5IGJlIHJlbmFtZWQgKGB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IHRpbWVvdXRgKSwgc28gdGhlIEtFWSBpcyB3aGF0IHRoZSBjYWxsJ3MgYGlucHV0YFxuICogaXMgbG9va2VkIHVwIGJ5LCBuZXZlciB0aGUgbG9jYWwgbmFtZS5cbiAqXG4gKiBAcGFyYW0gY2xvc3VyZU5vZGUgLSBUaGUgY2xvc3VyZSB3aG9zZSBwYXJhbWV0ZXJzIHRvIHJlYWQuXG4gKiBAcGFyYW0gbG9jYWxOYW1lIC0gVGhlIG5hbWUgdGhlIGJ1ZGdldCBpcyBib3VuZCB0byBpbnNpZGUgdGhlIGNsb3N1cmUuXG4gKiBAcmV0dXJucyBUaGUgYGlucHV0YCBrZXksIG9yIGBudWxsYCB3aGVuIHRoZSBuYW1lIGlzIG5vdCBib3VuZCBieSBhIHBsYWluIGRlc3RydWN0dXJlZCBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gcmVhZFBhcmFtZXRlcklucHV0S2V5KGNsb3N1cmVOb2RlOiBDbG9zdXJlRnVuY3Rpb24sIGxvY2FsTmFtZTogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gIGZvciAoY29uc3QgcGFyYW1ldGVyTm9kZSBvZiBjbG9zdXJlTm9kZS5wYXJhbXMpIHtcbiAgICBpZiAoIWlzT2JqZWN0UGF0dGVybihwYXJhbWV0ZXJOb2RlKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwYXJhbWV0ZXJOb2RlLnByb3BlcnRpZXMpIHtcbiAgICAgIGlmICghaXNQcm9wZXJ0eShwcm9wZXJ0eSkgfHwgcHJvcGVydHkuY29tcHV0ZWQgfHwgIWlzSWRlbnRpZmllcihwcm9wZXJ0eS5rZXkpIHx8ICFpc0lkZW50aWZpZXIocHJvcGVydHkudmFsdWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvcGVydHkudmFsdWUubmFtZSA9PT0gbG9jYWxOYW1lKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eS5rZXkubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWFkcyB0aGUgZXhwcmVzc2lvbiBjYXJyeWluZyBhIHdhaXQgY2FsbCdzIGRlY2xhcmVkIGJ1ZGdldC5cbiAqXG4gKiBAcGFyYW0gY2FsbE5vZGUgLSBUaGUgY2FsbCBleHByZXNzaW9uIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyBUaGUgZXhwcmVzc2lvbiB0byByZXNvbHZlOyBgbnVsbGAgZm9yIGEgYHdhaXRVbnRpbGAgdGhhdCBvbWl0cyBpdHMgdGltZW91dCwgd2hpY2ggdGFrZXMgdGhlXG4gKiBoZWxwZXIncyBkZWZhdWx0OyBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBjYWxsIGlzIG5vdCBhIHdhaXQgYXQgYWxsLlxuICovXG5mdW5jdGlvbiByZWFkV2FpdEJ1ZGdldEV4cHJlc3Npb24oY2FsbE5vZGU6IFRTRVNUcmVlLkNhbGxFeHByZXNzaW9uKTogbnVsbCB8IFRTRVNUcmVlLk5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAoIWlzSWRlbnRpZmllcihjYWxsTm9kZS5jYWxsZWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGNhbGxlZU5hbWUgPSBjYWxsTm9kZS5jYWxsZWUubmFtZTtcblxuICBpZiAoY2FsbGVlTmFtZSA9PT0gU0xFRVBfQ0FMTEVFX05BTUUpIHtcbiAgICByZXR1cm4gKGNhbGxOb2RlLmFyZ3VtZW50c1swXSkgPz8gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKGNhbGxlZU5hbWUgIT09IFdBSVRfVU5USUxfQ0FMTEVFX05BTUUpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgcGFyYW1zTm9kZSA9IGNhbGxOb2RlLmFyZ3VtZW50c1swXSBhcyBUU0VTVHJlZS5Ob2RlIHwgdW5kZWZpbmVkO1xuICBpZiAoIXBhcmFtc05vZGUgfHwgIWlzT2JqZWN0RXhwcmVzc2lvbihwYXJhbXNOb2RlKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCB0aW1lb3V0UHJvcGVydHkgPSBwYXJhbXNOb2RlLnByb3BlcnRpZXMuZmluZCgocHJvcGVydHkpID0+XG4gICAgaXNQcm9wZXJ0eShwcm9wZXJ0eSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmIGlzSWRlbnRpZmllcigocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5Ob2RlKVxuICAgICYmICgocHJvcGVydHkgYXMgVFNFU1RyZWUuUHJvcGVydHkpLmtleSBhcyBUU0VTVHJlZS5JZGVudGlmaWVyKS5uYW1lID09PSBUSU1FT1VUX1BST1BFUlRZX05BTUVcbiAgKSBhcyBUU0VTVHJlZS5Qcm9wZXJ0eSB8IHVuZGVmaW5lZDtcblxuICByZXR1cm4gKHRpbWVvdXRQcm9wZXJ0eT8udmFsdWUpID8/IG51bGw7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYW4gZXhwcmVzc2lvbiB0byBhIG51bWJlciwgdGhyb3VnaCBzY29wZS5cbiAqXG4gKiBFdmVyeSBudW1iZXIgdGhlIHJ1bGUgcmVhZHMgY29tZXMgdGhyb3VnaCBoZXJlIOKAlCBhIHdhaXQncyBidWRnZXQsIGEgbG9vcCdzIGRlYWRsaW5lLCBhbmQgYSBjb3VudGluZ1xuICogbG9vcCdzIHN0YXJ0LCBib3VuZCBhbmQgc3RlcCDigJQgd2hpY2ggaXMgd2h5IGl0IGlzIG5hbWVkIGZvciB3aGF0IGl0IHJlc29sdmVzIHJhdGhlciB0aGFuIGZvclxuICogbWlsbGlzZWNvbmRzLlxuICpcbiAqIEhhbmRsZXMgYSBudW1lcmljIGxpdGVyYWwsIGEgbGl0ZXJhbC1vbmx5IHByb2R1Y3QgKGA2MCAqIDEwMDBgKSwgYW4gaWRlbnRpZmllciBib3VuZCB0byBlaXRoZXIgaW4gYW55XG4gKiBlbmNsb3Npbmcgc2NvcGUsIGFuZCBhIGRlc3RydWN0dXJlZCBjbG9zdXJlIHBhcmFtZXRlciBmb2xsb3dlZCBiYWNrIHRocm91Z2ggdGhlIGNhbGwncyBvd24gYGlucHV0YC5cbiAqIEFueXRoaW5nIGVsc2UgaXMgdW5yZXNvbHZhYmxlIGFuZCBhbnN3ZXJzIGBudWxsYCwgd2hpY2ggdGhlIGNhbGxlciB0cmVhdHMgYXMgY29udHJpYnV0aW5nIG5vdGhpbmcuXG4gKlxuICogRWFjaCBpZGVudGlmaWVyIGlzIHJlc29sdmVkIGZyb20gSVRTIE9XTiBzY29wZSByYXRoZXIgdGhhbiBmcm9tIHRoZSB3YWl0J3MsIHNvIGEgdmFsdWUgc3VwcGxpZWQgYnkgdGhlXG4gKiBjYWxsJ3MgYGlucHV0YCByZXNvbHZlcyBhdCB0aGUgY2FsbCBzaXRlIOKAlCB3aGVyZSBpdCB3YXMgd3JpdHRlbiDigJQgYW5kIGlzIG5vdCBjYXB0dXJlZCBieSBhIHNhbWUtbmFtZWRcbiAqIGJpbmRpbmcgdGhhdCBoYXBwZW5zIHRvIGV4aXN0IGluc2lkZSB0aGUgY2xvc3VyZS5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBleHByZXNzaW9uIHRvIHJlc29sdmUuXG4gKiBAcGFyYW0gY2xvc3VyZSAtIFRoZSBjbG9zdXJlIHRoZSBleHByZXNzaW9uIHdhcyB3cml0dGVuIGluc2lkZS5cbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIHJ1bGUgY29udGV4dCwgdXNlZCB0byByZXNvbHZlIGlkZW50aWZpZXJzIHRocm91Z2ggc2NvcGUuXG4gKiBAcmV0dXJucyBUaGUgbnVtYmVyLCBvciBgbnVsbGAgd2hlbiBpdCBjYW5ub3QgYmUgcmVzb2x2ZWQgc3RhdGljYWxseS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU51bWJlcihub2RlOiBUU0VTVHJlZS5Ob2RlLCBjbG9zdXJlOiBFdmFsQ2xvc3VyZSwgY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IG51bGwgfCBudW1iZXIge1xuICBjb25zdCB2aXNpdGVkTm9kZXMgPSBuZXcgU2V0PFRTRVNUcmVlLk5vZGU+KCk7XG4gIGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7XG5cbiAgd2hpbGUgKCF2aXNpdGVkTm9kZXMuaGFzKGN1cnJlbnROb2RlKSkge1xuICAgIHZpc2l0ZWROb2Rlcy5hZGQoY3VycmVudE5vZGUpO1xuXG4gICAgaWYgKGlzTnVtZXJpY0xpdGVyYWwoY3VycmVudE5vZGUpKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGUudmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKGlzQmluYXJ5RXhwcmVzc2lvbihjdXJyZW50Tm9kZSkgJiYgY3VycmVudE5vZGUub3BlcmF0b3IgPT09ICcqJykge1xuICAgICAgY29uc3QgbGVmdFZhbHVlID0gcmVzb2x2ZU51bWJlcihjdXJyZW50Tm9kZS5sZWZ0LCBjbG9zdXJlLCBjb250ZXh0KTtcbiAgICAgIGNvbnN0IHJpZ2h0VmFsdWUgPSByZXNvbHZlTnVtYmVyKGN1cnJlbnROb2RlLnJpZ2h0LCBjbG9zdXJlLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIGxlZnRWYWx1ZSA9PT0gbnVsbCB8fCByaWdodFZhbHVlID09PSBudWxsID8gbnVsbCA6IGxlZnRWYWx1ZSAqIHJpZ2h0VmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKCFpc0lkZW50aWZpZXIoY3VycmVudE5vZGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZE5vZGUgPSByZWFkQm91bmRFeHByZXNzaW9uKGN1cnJlbnROb2RlLCBjbG9zdXJlLCBjb250ZXh0KTtcbiAgICBpZiAoIWJvdW5kTm9kZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY3VycmVudE5vZGUgPSBib3VuZE5vZGU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErSEEsU0FBUyxzQkFBc0I7QUFFL0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS0EsTUFBTSxhQUFhO0FBSzFCLE1BQU0sNkNBQTZDO0FBRW5ELE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sd0JBQXdCO0FBQzlCLE1BQU0seUJBQXlCO0FBTS9CLE1BQU0scUJBQXFCLG9CQUFJLElBQUksQ0FBQyxRQUFRLGFBQWEsQ0FBQztBQUUxRCxNQUFNLGtCQUFrQjtBQU94QixNQUFNLCtCQUErQixvQkFBSSxJQUErQjtBQUFBLEVBQ3RFLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDO0FBQUEsRUFDL0IsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLE9BQU8sQ0FBQztBQUN0QyxDQUFDO0FBbUhNLE1BQU0sZ0NBQWlEO0FBQUEsRUFDNUQsT0FBTyxTQUFTO0FBQ2QsVUFBTSxVQUFVLFFBQVEsUUFBUSxDQUFDO0FBQ2pDLFVBQU0sMkJBQTJCLFFBQVEsU0FBUyxTQUFTLG9DQUFvQyxJQUMzRix1Q0FDQTtBQUNKLFVBQU0sb0JBQW9CLFNBQVMscUJBQXFCO0FBQ3hELFVBQU0sWUFBdUI7QUFBQSxNQUMzQixtQ0FBbUMsb0JBQUksSUFBaUQ7QUFBQSxNQUN4RixvQkFBb0Isb0JBQUksSUFBbUM7QUFBQSxNQUMzRCxrQ0FBa0Msb0JBQUksSUFBNEI7QUFBQSxJQUNwRTtBQVNBLGFBQVMsUUFBUSxRQUFzQixZQUE0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
|
|
@@ -3,6 +3,7 @@ export * as 'coverage-badge-cli' from './coverage-badge-cli.mjs';
|
|
|
3
3
|
export * as 'coverage-badge' from './coverage-badge.mjs';
|
|
4
4
|
export * as 'e2e-runner-support' from './e2e-runner-support.mjs';
|
|
5
5
|
export * as 'integration-test-plugin' from './integration-test-plugin.mjs';
|
|
6
|
+
export * as 'jest-config' from './jest-config.mjs';
|
|
6
7
|
export * as 'obsidian-test-runner' from './obsidian-test-runner.mjs';
|
|
7
8
|
export * as 'performance-eval-cap' from './performance-eval-cap.mjs';
|
|
8
9
|
export * as 'vitest-config' from './vitest-config.mjs';
|
|
@@ -7,6 +7,7 @@ import * as coverage_badge_cli from "./coverage-badge-cli.mjs";
|
|
|
7
7
|
import * as coverage_badge from "./coverage-badge.mjs";
|
|
8
8
|
import * as e2e_runner_support from "./e2e-runner-support.mjs";
|
|
9
9
|
import * as integration_test_plugin from "./integration-test-plugin.mjs";
|
|
10
|
+
import * as jest_config from "./jest-config.mjs";
|
|
10
11
|
import * as obsidian_test_runner from "./obsidian-test-runner.mjs";
|
|
11
12
|
import * as performance_eval_cap from "./performance-eval-cap.mjs";
|
|
12
13
|
import * as vitest_config from "./vitest-config.mjs";
|
|
@@ -16,9 +17,10 @@ export {
|
|
|
16
17
|
coverage_badge_cli as "coverage-badge-cli",
|
|
17
18
|
e2e_runner_support as "e2e-runner-support",
|
|
18
19
|
integration_test_plugin as "integration-test-plugin",
|
|
20
|
+
jest_config as "jest-config",
|
|
19
21
|
obsidian_test_runner as "obsidian-test-runner",
|
|
20
22
|
performance_eval_cap as "performance-eval-cap",
|
|
21
23
|
vitest_config as "vitest-config",
|
|
22
24
|
wdio_obsidian as "wdio-obsidian"
|
|
23
25
|
};
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3Rlc3QtcnVubmVycy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdjb3ZlcmFnZS1iYWRnZS1jbGknIGZyb20gJy4vY292ZXJhZ2UtYmFkZ2UtY2xpLnRzJztcbmV4cG9ydCAqIGFzICdjb3ZlcmFnZS1iYWRnZScgZnJvbSAnLi9jb3ZlcmFnZS1iYWRnZS50cyc7XG5leHBvcnQgKiBhcyAnZTJlLXJ1bm5lci1zdXBwb3J0JyBmcm9tICcuL2UyZS1ydW5uZXItc3VwcG9ydC50cyc7XG5leHBvcnQgKiBhcyAnaW50ZWdyYXRpb24tdGVzdC1wbHVnaW4nIGZyb20gJy4vaW50ZWdyYXRpb24tdGVzdC1wbHVnaW4udHMnO1xuZXhwb3J0ICogYXMgJ2plc3QtY29uZmlnJyBmcm9tICcuL2plc3QtY29uZmlnLnRzJztcbmV4cG9ydCAqIGFzICdvYnNpZGlhbi10ZXN0LXJ1bm5lcicgZnJvbSAnLi9vYnNpZGlhbi10ZXN0LXJ1bm5lci50cyc7XG5leHBvcnQgKiBhcyAncGVyZm9ybWFuY2UtZXZhbC1jYXAnIGZyb20gJy4vcGVyZm9ybWFuY2UtZXZhbC1jYXAudHMnO1xuZXhwb3J0ICogYXMgJ3ZpdGVzdC1jb25maWcnIGZyb20gJy4vdml0ZXN0LWNvbmZpZy50cyc7XG5leHBvcnQgKiBhcyAnd2Rpby1vYnNpZGlhbicgZnJvbSAnLi93ZGlvLW9ic2lkaWFuLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBRUEsWUFBWUEsd0JBQTBCO0FBQ3RDLFlBQVlDLG9CQUFzQjtBQUNsQyxZQUFZQyx3QkFBMEI7QUFDdEMsWUFBWUMsNkJBQStCO0FBQzNDLFlBQVlDLGlCQUFtQjtBQUMvQixZQUFZQywwQkFBNEI7QUFDeEMsWUFBWUMsMEJBQTRCO0FBQ3hDLFlBQVlDLG1CQUFxQjtBQUNqQyxZQUFZQyxtQkFBcUI7IiwKICAibmFtZXMiOiBbImNvdmVyYWdlLWJhZGdlLWNsaSIsICJjb3ZlcmFnZS1iYWRnZSIsICJlMmUtcnVubmVyLXN1cHBvcnQiLCAiaW50ZWdyYXRpb24tdGVzdC1wbHVnaW4iLCAiamVzdC1jb25maWciLCAib2JzaWRpYW4tdGVzdC1ydW5uZXIiLCAicGVyZm9ybWFuY2UtZXZhbC1jYXAiLCAidml0ZXN0LWNvbmZpZyIsICJ3ZGlvLW9ic2lkaWFuIl0KfQo=
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.mts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Shared jest configuration for Obsidian plugins: {@link defineObsidianPluginJestConfig}, the jest counterpart of
|
|
6
|
+
* `defineObsidianPluginVitestConfig`'s `unit-tests` project.
|
|
7
|
+
*
|
|
8
|
+
* It is the generic `defineJestConfig` from `@mnaoumov/typescript-dev-toolkit` plus what a plugin's unit tests need on
|
|
9
|
+
* top: the `jsdom` environment, `obsidian` resolved onto `obsidian-test-mocks` (the `obsidian` npm package carries
|
|
10
|
+
* types only), the two per-test setup files, and the integration tests left to their own runner. A plugin runs it with
|
|
11
|
+
* `test` / `testCoverage` / `testWatch` from `@mnaoumov/typescript-dev-toolkit/test-runners/auto`, which picks jest
|
|
12
|
+
* whenever a jest configuration file exists.
|
|
13
|
+
*/
|
|
14
|
+
import type { DefineJestConfigOptions } from '@mnaoumov/typescript-dev-toolkit/test-runners/jest-config';
|
|
15
|
+
import type { Config } from 'jest';
|
|
16
|
+
/**
|
|
17
|
+
* Resolves `obsidian` onto the mocks, as the vitest configuration's `obsidian` alias does.
|
|
18
|
+
*/
|
|
19
|
+
export declare const OBSIDIAN_JEST_MODULE_NAME_MAPPER: Readonly<Record<string, string>>;
|
|
20
|
+
/**
|
|
21
|
+
* The per-test setup files, in the order the vitest configuration loads them: the mocks' globals and mocked `app`
|
|
22
|
+
* first, then this package's reset of the shared state before each test.
|
|
23
|
+
*
|
|
24
|
+
* They go in `setupFilesAfterEnv`, not `setupFiles`, because this package's setup registers `beforeEach` and
|
|
25
|
+
* `afterEach` hooks, which exist only once the test framework is installed.
|
|
26
|
+
*/
|
|
27
|
+
export declare const OBSIDIAN_JEST_SETUP_FILES_AFTER_ENV: readonly string[];
|
|
28
|
+
/**
|
|
29
|
+
* The integration tests, which run in a real Obsidian through `obsidian-integration-testing` and never under jest.
|
|
30
|
+
*/
|
|
31
|
+
export declare const OBSIDIAN_JEST_INTEGRATION_TEST_PATH_IGNORE_PATTERN: string;
|
|
32
|
+
/**
|
|
33
|
+
* Options for {@link defineObsidianPluginJestConfig}: the same ones `defineJestConfig` takes.
|
|
34
|
+
*/
|
|
35
|
+
export type DefineObsidianPluginJestConfigOptions = DefineJestConfigOptions;
|
|
36
|
+
/**
|
|
37
|
+
* Defines an Obsidian plugin's jest configuration.
|
|
38
|
+
*
|
|
39
|
+
* On top of `defineJestConfig`'s defaults: the `jsdom` environment (the mocks' setup writes to `Document.prototype`,
|
|
40
|
+
* `Element.prototype` and `window`), `obsidian` mapped onto `obsidian-test-mocks/obsidian`, the
|
|
41
|
+
* {@link OBSIDIAN_JEST_SETUP_FILES_AFTER_ENV} setup files and `*.integration.test.ts` left out. Every jest option in
|
|
42
|
+
* `options` replaces its default, except `moduleNameMapper`, whose entries are added to the `obsidian` one, and
|
|
43
|
+
* `setupFilesAfterEnv` and `testPathIgnorePatterns`, whose entries are appended to this function's own.
|
|
44
|
+
*
|
|
45
|
+
* The `jsdom` environment needs `jest-environment-jsdom` installed beside `jest` and `ts-jest`.
|
|
46
|
+
*
|
|
47
|
+
* @param options - The configuration options, the same `defineJestConfig` takes.
|
|
48
|
+
* @returns The jest configuration.
|
|
49
|
+
*/
|
|
50
|
+
export declare function defineObsidianPluginJestConfig(options?: DefineObsidianPluginJestConfigOptions): Config;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return "/";
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: "android"
|
|
14
|
+
};
|
|
15
|
+
const existingProcess = globalThis.process;
|
|
16
|
+
if (!existingProcess) {
|
|
17
|
+
globalThis.process = browserProcess;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (existingProcess.versions?.node) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const existingProcessRecord = existingProcess;
|
|
24
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
25
|
+
existingProcessRecord[key] ??= value;
|
|
26
|
+
}
|
|
27
|
+
existingProcessRecord["browser"] = true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
ensureBrowserProcess();
|
|
31
|
+
})();
|
|
32
|
+
|
|
33
|
+
import {
|
|
34
|
+
DEFAULT_JEST_TEST_PATH_IGNORE_PATTERNS,
|
|
35
|
+
defineJestConfig
|
|
36
|
+
} from "@mnaoumov/typescript-dev-toolkit/test-runners/jest-config";
|
|
37
|
+
const OBSIDIAN_JEST_MODULE_NAME_MAPPER = {
|
|
38
|
+
"^obsidian$": "obsidian-test-mocks/obsidian"
|
|
39
|
+
};
|
|
40
|
+
const OBSIDIAN_JEST_SETUP_FILES_AFTER_ENV = [
|
|
41
|
+
"obsidian-test-mocks/jest-setup",
|
|
42
|
+
"@mnaoumov/obsidian-dev-toolkit/jest-setup"
|
|
43
|
+
];
|
|
44
|
+
const OBSIDIAN_JEST_INTEGRATION_TEST_PATH_IGNORE_PATTERN = String.raw`\.integration\.test\.ts$`;
|
|
45
|
+
function defineObsidianPluginJestConfig(options = {}) {
|
|
46
|
+
const { moduleNameMapper, setupFilesAfterEnv = [], testPathIgnorePatterns = [], ...overrides } = options;
|
|
47
|
+
return defineJestConfig({
|
|
48
|
+
testEnvironment: "jsdom",
|
|
49
|
+
...overrides,
|
|
50
|
+
moduleNameMapper: {
|
|
51
|
+
...OBSIDIAN_JEST_MODULE_NAME_MAPPER,
|
|
52
|
+
...moduleNameMapper
|
|
53
|
+
},
|
|
54
|
+
setupFilesAfterEnv: [...OBSIDIAN_JEST_SETUP_FILES_AFTER_ENV, ...setupFilesAfterEnv],
|
|
55
|
+
testPathIgnorePatterns: [
|
|
56
|
+
...DEFAULT_JEST_TEST_PATH_IGNORE_PATTERNS,
|
|
57
|
+
OBSIDIAN_JEST_INTEGRATION_TEST_PATH_IGNORE_PATTERN,
|
|
58
|
+
...testPathIgnorePatterns
|
|
59
|
+
]
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
export {
|
|
63
|
+
OBSIDIAN_JEST_INTEGRATION_TEST_PATH_IGNORE_PATTERN,
|
|
64
|
+
OBSIDIAN_JEST_MODULE_NAME_MAPPER,
|
|
65
|
+
OBSIDIAN_JEST_SETUP_FILES_AFTER_ENV,
|
|
66
|
+
defineObsidianPluginJestConfig
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90ZXN0LXJ1bm5lcnMvamVzdC1jb25maWcudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNoYXJlZCBqZXN0IGNvbmZpZ3VyYXRpb24gZm9yIE9ic2lkaWFuIHBsdWdpbnM6IHtAbGluayBkZWZpbmVPYnNpZGlhblBsdWdpbkplc3RDb25maWd9LCB0aGUgamVzdCBjb3VudGVycGFydCBvZlxuICogYGRlZmluZU9ic2lkaWFuUGx1Z2luVml0ZXN0Q29uZmlnYCdzIGB1bml0LXRlc3RzYCBwcm9qZWN0LlxuICpcbiAqIEl0IGlzIHRoZSBnZW5lcmljIGBkZWZpbmVKZXN0Q29uZmlnYCBmcm9tIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdGAgcGx1cyB3aGF0IGEgcGx1Z2luJ3MgdW5pdCB0ZXN0cyBuZWVkIG9uXG4gKiB0b3A6IHRoZSBganNkb21gIGVudmlyb25tZW50LCBgb2JzaWRpYW5gIHJlc29sdmVkIG9udG8gYG9ic2lkaWFuLXRlc3QtbW9ja3NgICh0aGUgYG9ic2lkaWFuYCBucG0gcGFja2FnZSBjYXJyaWVzXG4gKiB0eXBlcyBvbmx5KSwgdGhlIHR3byBwZXItdGVzdCBzZXR1cCBmaWxlcywgYW5kIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0cyBsZWZ0IHRvIHRoZWlyIG93biBydW5uZXIuIEEgcGx1Z2luIHJ1bnMgaXQgd2l0aFxuICogYHRlc3RgIC8gYHRlc3RDb3ZlcmFnZWAgLyBgdGVzdFdhdGNoYCBmcm9tIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC90ZXN0LXJ1bm5lcnMvYXV0b2AsIHdoaWNoIHBpY2tzIGplc3RcbiAqIHdoZW5ldmVyIGEgamVzdCBjb25maWd1cmF0aW9uIGZpbGUgZXhpc3RzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGVmaW5lSmVzdENvbmZpZ09wdGlvbnMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC90ZXN0LXJ1bm5lcnMvamVzdC1jb25maWcnO1xuaW1wb3J0IHR5cGUgeyBDb25maWcgfSBmcm9tICdqZXN0JztcblxuaW1wb3J0IHtcbiAgREVGQVVMVF9KRVNUX1RFU1RfUEFUSF9JR05PUkVfUEFUVEVSTlMsXG4gIGRlZmluZUplc3RDb25maWdcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtZGV2LXRvb2xraXQvdGVzdC1ydW5uZXJzL2plc3QtY29uZmlnJztcblxuLyoqXG4gKiBSZXNvbHZlcyBgb2JzaWRpYW5gIG9udG8gdGhlIG1vY2tzLCBhcyB0aGUgdml0ZXN0IGNvbmZpZ3VyYXRpb24ncyBgb2JzaWRpYW5gIGFsaWFzIGRvZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBPQlNJRElBTl9KRVNUX01PRFVMRV9OQU1FX01BUFBFUjogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4gPSB7XG4gICdeb2JzaWRpYW4kJzogJ29ic2lkaWFuLXRlc3QtbW9ja3Mvb2JzaWRpYW4nXG59O1xuXG4vKipcbiAqIFRoZSBwZXItdGVzdCBzZXR1cCBmaWxlcywgaW4gdGhlIG9yZGVyIHRoZSB2aXRlc3QgY29uZmlndXJhdGlvbiBsb2FkcyB0aGVtOiB0aGUgbW9ja3MnIGdsb2JhbHMgYW5kIG1vY2tlZCBgYXBwYFxuICogZmlyc3QsIHRoZW4gdGhpcyBwYWNrYWdlJ3MgcmVzZXQgb2YgdGhlIHNoYXJlZCBzdGF0ZSBiZWZvcmUgZWFjaCB0ZXN0LlxuICpcbiAqIFRoZXkgZ28gaW4gYHNldHVwRmlsZXNBZnRlckVudmAsIG5vdCBgc2V0dXBGaWxlc2AsIGJlY2F1c2UgdGhpcyBwYWNrYWdlJ3Mgc2V0dXAgcmVnaXN0ZXJzIGBiZWZvcmVFYWNoYCBhbmRcbiAqIGBhZnRlckVhY2hgIGhvb2tzLCB3aGljaCBleGlzdCBvbmx5IG9uY2UgdGhlIHRlc3QgZnJhbWV3b3JrIGlzIGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9CU0lESUFOX0pFU1RfU0VUVVBfRklMRVNfQUZURVJfRU5WOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgJ29ic2lkaWFuLXRlc3QtbW9ja3MvamVzdC1zZXR1cCcsXG4gICdAbW5hb3Vtb3Yvb2JzaWRpYW4tZGV2LXRvb2xraXQvamVzdC1zZXR1cCdcbl07XG5cbi8qKlxuICogVGhlIGludGVncmF0aW9uIHRlc3RzLCB3aGljaCBydW4gaW4gYSByZWFsIE9ic2lkaWFuIHRocm91Z2ggYG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmdgIGFuZCBuZXZlciB1bmRlciBqZXN0LlxuICovXG5leHBvcnQgY29uc3QgT0JTSURJQU5fSkVTVF9JTlRFR1JBVElPTl9URVNUX1BBVEhfSUdOT1JFX1BBVFRFUk4gPSBTdHJpbmcucmF3YFxcLmludGVncmF0aW9uXFwudGVzdFxcLnRzJGA7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGRlZmluZU9ic2lkaWFuUGx1Z2luSmVzdENvbmZpZ306IHRoZSBzYW1lIG9uZXMgYGRlZmluZUplc3RDb25maWdgIHRha2VzLlxuICovXG5leHBvcnQgdHlwZSBEZWZpbmVPYnNpZGlhblBsdWdpbkplc3RDb25maWdPcHRpb25zID0gRGVmaW5lSmVzdENvbmZpZ09wdGlvbnM7XG5cbi8qKlxuICogRGVmaW5lcyBhbiBPYnNpZGlhbiBwbHVnaW4ncyBqZXN0IGNvbmZpZ3VyYXRpb24uXG4gKlxuICogT24gdG9wIG9mIGBkZWZpbmVKZXN0Q29uZmlnYCdzIGRlZmF1bHRzOiB0aGUgYGpzZG9tYCBlbnZpcm9ubWVudCAodGhlIG1vY2tzJyBzZXR1cCB3cml0ZXMgdG8gYERvY3VtZW50LnByb3RvdHlwZWAsXG4gKiBgRWxlbWVudC5wcm90b3R5cGVgIGFuZCBgd2luZG93YCksIGBvYnNpZGlhbmAgbWFwcGVkIG9udG8gYG9ic2lkaWFuLXRlc3QtbW9ja3Mvb2JzaWRpYW5gLCB0aGVcbiAqIHtAbGluayBPQlNJRElBTl9KRVNUX1NFVFVQX0ZJTEVTX0FGVEVSX0VOVn0gc2V0dXAgZmlsZXMgYW5kIGAqLmludGVncmF0aW9uLnRlc3QudHNgIGxlZnQgb3V0LiBFdmVyeSBqZXN0IG9wdGlvbiBpblxuICogYG9wdGlvbnNgIHJlcGxhY2VzIGl0cyBkZWZhdWx0LCBleGNlcHQgYG1vZHVsZU5hbWVNYXBwZXJgLCB3aG9zZSBlbnRyaWVzIGFyZSBhZGRlZCB0byB0aGUgYG9ic2lkaWFuYCBvbmUsIGFuZFxuICogYHNldHVwRmlsZXNBZnRlckVudmAgYW5kIGB0ZXN0UGF0aElnbm9yZVBhdHRlcm5zYCwgd2hvc2UgZW50cmllcyBhcmUgYXBwZW5kZWQgdG8gdGhpcyBmdW5jdGlvbidzIG93bi5cbiAqXG4gKiBUaGUgYGpzZG9tYCBlbnZpcm9ubWVudCBuZWVkcyBgamVzdC1lbnZpcm9ubWVudC1qc2RvbWAgaW5zdGFsbGVkIGJlc2lkZSBgamVzdGAgYW5kIGB0cy1qZXN0YC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHRoZSBzYW1lIGBkZWZpbmVKZXN0Q29uZmlnYCB0YWtlcy5cbiAqIEByZXR1cm5zIFRoZSBqZXN0IGNvbmZpZ3VyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVPYnNpZGlhblBsdWdpbkplc3RDb25maWcob3B0aW9uczogRGVmaW5lT2JzaWRpYW5QbHVnaW5KZXN0Q29uZmlnT3B0aW9ucyA9IHt9KTogQ29uZmlnIHtcbiAgY29uc3QgeyBtb2R1bGVOYW1lTWFwcGVyLCBzZXR1cEZpbGVzQWZ0ZXJFbnYgPSBbXSwgdGVzdFBhdGhJZ25vcmVQYXR0ZXJucyA9IFtdLCAuLi5vdmVycmlkZXMgfSA9IG9wdGlvbnM7XG5cbiAgcmV0dXJuIGRlZmluZUplc3RDb25maWcoe1xuICAgIHRlc3RFbnZpcm9ubWVudDogJ2pzZG9tJyxcbiAgICAuLi5vdmVycmlkZXMsXG4gICAgbW9kdWxlTmFtZU1hcHBlcjoge1xuICAgICAgLi4uT0JTSURJQU5fSkVTVF9NT0RVTEVfTkFNRV9NQVBQRVIsXG4gICAgICAuLi5tb2R1bGVOYW1lTWFwcGVyXG4gICAgfSxcbiAgICBzZXR1cEZpbGVzQWZ0ZXJFbnY6IFsuLi5PQlNJRElBTl9KRVNUX1NFVFVQX0ZJTEVTX0FGVEVSX0VOViwgLi4uc2V0dXBGaWxlc0FmdGVyRW52XSxcbiAgICB0ZXN0UGF0aElnbm9yZVBhdHRlcm5zOiBbXG4gICAgICAuLi5ERUZBVUxUX0pFU1RfVEVTVF9QQVRIX0lHTk9SRV9QQVRURVJOUyxcbiAgICAgIE9CU0lESUFOX0pFU1RfSU5URUdSQVRJT05fVEVTVF9QQVRIX0lHTk9SRV9QQVRURVJOLFxuICAgICAgLi4udGVzdFBhdGhJZ25vcmVQYXR0ZXJuc1xuICAgIF1cbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS0EsTUFBTSxtQ0FBcUU7QUFBQSxFQUNoRixjQUFjO0FBQ2hCO0FBU08sTUFBTSxzQ0FBeUQ7QUFBQSxFQUNwRTtBQUFBLEVBQ0E7QUFDRjtBQUtPLE1BQU0scURBQXFELE9BQU87QUFxQmxFLFNBQVMsK0JBQStCLFVBQWlELENBQUMsR0FBVztBQUMxRyxRQUFNLEVBQUUsa0JBQWtCLHFCQUFxQixDQUFDLEdBQUcseUJBQXlCLENBQUMsR0FBRyxHQUFHLFVBQVUsSUFBSTtBQUVqRyxTQUFPLGlCQUFpQjtBQUFBLElBQ3RCLGlCQUFpQjtBQUFBLElBQ2pCLEdBQUc7QUFBQSxJQUNILGtCQUFrQjtBQUFBLE1BQ2hCLEdBQUc7QUFBQSxNQUNILEdBQUc7QUFBQSxJQUNMO0FBQUEsSUFDQSxvQkFBb0IsQ0FBQyxHQUFHLHFDQUFxQyxHQUFHLGtCQUFrQjtBQUFBLElBQ2xGLHdCQUF3QjtBQUFBLE1BQ3RCLEdBQUc7QUFBQSxNQUNIO0FBQUEsTUFDQSxHQUFHO0FBQUEsSUFDTDtBQUFBLEVBQ0YsQ0FBQztBQUNIOyIsIm5hbWVzIjpbXX0=
|