@mnaoumov/typescript-dev-toolkit 0.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +15 -1
- package/bundlers/esbuild-impl/change-extension-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/custom-esbuild-options-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/fix-esm-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/index/package.json +6 -0
- package/bundlers/esbuild-impl/package.json +6 -0
- package/bundlers/esbuild-impl/preprocess-plugin/package.json +6 -0
- package/bundlers/esbuild-impl/svelte-wrapper-plugin/package.json +6 -0
- package/bundlers/index/package.json +6 -0
- package/bundlers/package.json +6 -0
- package/dist/lib/cjs/build.cjs +191 -0
- package/dist/lib/cjs/build.d.cts +59 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.cjs +139 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/change-extension-plugin.d.cts +25 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +96 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.cts +14 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.cjs +106 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/fix-esm-plugin.d.cts +13 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +111 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +6 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.cjs +211 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/preprocess-plugin.d.cts +143 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +129 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/svelte-wrapper-plugin.d.cts +14 -0
- package/dist/lib/cjs/bundlers/index.cjs +99 -0
- package/dist/lib/cjs/bundlers/index.d.cts +2 -0
- package/dist/lib/cjs/check-project-types.cjs +163 -0
- package/dist/lib/cjs/check-project-types.d.cts +92 -0
- package/dist/lib/cjs/cli-utils.cjs +276 -0
- package/dist/lib/cjs/cli-utils.d.cts +123 -0
- package/dist/lib/cjs/code-generator.cjs +96 -0
- package/dist/lib/cjs/code-generator.d.cts +14 -0
- package/dist/lib/cjs/commitlint-config.cjs +110 -0
- package/dist/lib/cjs/commitlint-config.d.cts +14 -0
- package/dist/lib/cjs/commitlint-forbidden-patterns.cjs +110 -0
- package/dist/lib/cjs/commitlint-forbidden-patterns.d.cts +37 -0
- package/dist/lib/cjs/commitlint-spellcheck-header.cjs +126 -0
- package/dist/lib/cjs/commitlint-spellcheck-header.d.cts +40 -0
- package/dist/lib/cjs/env-toggle.cjs +133 -0
- package/dist/lib/cjs/env-toggle.d.cts +42 -0
- package/dist/lib/cjs/exec.cjs +455 -0
- package/dist/lib/cjs/exec.d.cts +162 -0
- package/dist/lib/cjs/forbidden-patterns.cjs +157 -0
- package/dist/lib/cjs/forbidden-patterns.d.cts +57 -0
- package/dist/lib/cjs/formatters/dprint.cjs +108 -0
- package/dist/lib/cjs/formatters/dprint.d.cts +33 -0
- package/dist/lib/cjs/formatters/index.cjs +99 -0
- package/dist/lib/cjs/formatters/index.d.cts +2 -0
- package/dist/lib/cjs/fs.cjs +123 -0
- package/dist/lib/cjs/fs.d.cts +80 -0
- package/dist/lib/cjs/gate.cjs +140 -0
- package/dist/lib/cjs/gate.d.cts +93 -0
- package/dist/lib/cjs/git.cjs +109 -0
- package/dist/lib/cjs/git.d.cts +37 -0
- package/dist/lib/cjs/index.cjs +186 -0
- package/dist/lib/cjs/index.d.cts +35 -0
- package/dist/lib/cjs/json.cjs +141 -0
- package/dist/lib/cjs/json.d.cts +102 -0
- package/dist/lib/cjs/library-build.cjs +483 -0
- package/dist/lib/cjs/library-build.d.cts +101 -0
- package/dist/lib/cjs/library-references.d.cts +5 -0
- package/dist/lib/cjs/linters/cspell-content.cjs +124 -0
- package/dist/lib/cjs/linters/cspell-content.d.cts +46 -0
- package/dist/lib/cjs/linters/cspell.cjs +103 -0
- package/dist/lib/cjs/linters/cspell.d.cts +36 -0
- package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.cjs +94 -0
- package/dist/lib/cjs/linters/eslint-agnostic-core-boundary.d.cts +49 -0
- package/dist/lib/cjs/linters/eslint-config.cjs +1068 -0
- package/dist/lib/cjs/linters/eslint-config.d.cts +123 -0
- package/dist/lib/cjs/linters/eslint-no-restricted-syntax.cjs +130 -0
- package/dist/lib/cjs/linters/eslint-no-restricted-syntax.d.cts +27 -0
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.cjs +116 -0
- package/dist/lib/cjs/linters/eslint-rules/in-house-plugin.d.cts +26 -0
- package/dist/lib/cjs/linters/eslint-rules/index.cjs +132 -0
- package/dist/lib/cjs/linters/eslint-rules/index.d.cts +13 -0
- package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +175 -0
- package/dist/lib/cjs/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.cjs +290 -0
- package/dist/lib/cjs/linters/eslint-rules/no-unresolved-jsdoc-link.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.cjs +265 -0
- package/dist/lib/cjs/linters/eslint-rules/no-unused-params-members.d.cts +41 -0
- package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.cjs +134 -0
- package/dist/lib/cjs/linters/eslint-rules/no-used-underscore-variables.d.cts +20 -0
- package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.cjs +217 -0
- package/dist/lib/cjs/linters/eslint-rules/params-options-name-match.d.cts +36 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.cjs +126 -0
- package/dist/lib/cjs/linters/eslint-rules/prefer-noop-async.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.cjs +125 -0
- package/dist/lib/cjs/linters/eslint-rules/readonly-params-options-result-members.d.cts +20 -0
- package/dist/lib/cjs/linters/eslint-rules/require-method-template.cjs +181 -0
- package/dist/lib/cjs/linters/eslint-rules/require-method-template.d.cts +14 -0
- package/dist/lib/cjs/linters/eslint-rules/require-super-call.cjs +217 -0
- package/dist/lib/cjs/linters/eslint-rules/require-super-call.d.cts +10 -0
- package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.cjs +92 -0
- package/dist/lib/cjs/linters/eslint-rules/rule-tester-helper.d.cts +18 -0
- package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.cjs +92 -0
- package/dist/lib/cjs/linters/eslint-rules/ts-estree-node.d.cts +23 -0
- package/dist/lib/cjs/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.cts +20 -0
- package/dist/lib/cjs/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.cts +17 -0
- package/dist/lib/cjs/linters/eslint.cjs +196 -0
- package/dist/lib/cjs/linters/eslint.d.cts +74 -0
- package/dist/lib/cjs/linters/index.cjs +138 -0
- package/dist/lib/cjs/linters/index.d.cts +15 -0
- package/dist/lib/cjs/linters/lint-ignores.cjs +91 -0
- package/dist/lib/cjs/linters/lint-ignores.d.cts +30 -0
- package/dist/lib/cjs/linters/markdownlint-cli2-config.cjs +169 -0
- package/dist/lib/cjs/linters/markdownlint-cli2-config.d.cts +11 -0
- package/dist/lib/cjs/linters/markdownlint-content.cjs +120 -0
- package/dist/lib/cjs/linters/markdownlint-content.d.cts +47 -0
- package/dist/lib/cjs/linters/markdownlint-ignores.cjs +95 -0
- package/dist/lib/cjs/linters/markdownlint-ignores.d.cts +35 -0
- package/dist/lib/cjs/linters/markdownlint-rules/index.cjs +99 -0
- package/dist/lib/cjs/linters/markdownlint-rules/index.d.cts +2 -0
- package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.cjs +152 -0
- package/dist/lib/cjs/linters/markdownlint-rules/no-soft-break-in-paragraph.d.cts +35 -0
- package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.cts +1344 -0
- package/dist/lib/cjs/linters/markdownlint-types/@types/markdownlint-cli2.d.cts +67 -0
- package/dist/lib/cjs/linters/markdownlint.cjs +151 -0
- package/dist/lib/cjs/linters/markdownlint.d.cts +32 -0
- package/dist/lib/cjs/linters/over-exposure.cjs +685 -0
- package/dist/lib/cjs/linters/over-exposure.d.cts +357 -0
- package/dist/lib/cjs/nano-staged-config.cjs +148 -0
- package/dist/lib/cjs/nano-staged-config.d.cts +54 -0
- package/dist/lib/cjs/npm-publish.cjs +93 -0
- package/dist/lib/cjs/npm-publish.d.cts +19 -0
- package/dist/lib/cjs/npm-run.cjs +120 -0
- package/dist/lib/cjs/npm-run.d.cts +34 -0
- package/dist/lib/cjs/npm.cjs +200 -0
- package/dist/lib/cjs/npm.d.cts +168 -0
- package/dist/lib/cjs/package-lock-integrity.cjs +134 -0
- package/dist/lib/cjs/package-lock-integrity.d.cts +38 -0
- package/dist/lib/cjs/package-manager.cjs +291 -0
- package/dist/lib/cjs/package-manager.d.cts +93 -0
- package/dist/lib/cjs/released-issues.cjs +178 -0
- package/dist/lib/cjs/released-issues.d.cts +79 -0
- package/dist/lib/cjs/repo-paths.cjs +167 -0
- package/dist/lib/cjs/repo-paths.d.cts +318 -0
- package/dist/lib/cjs/root.cjs +150 -0
- package/dist/lib/cjs/root.d.cts +107 -0
- package/dist/lib/cjs/test-runners/index.cjs +102 -0
- package/dist/lib/cjs/test-runners/index.d.cts +3 -0
- package/dist/lib/cjs/test-runners/vitest-config.cjs +126 -0
- package/dist/lib/cjs/test-runners/vitest-config.d.cts +90 -0
- package/dist/lib/cjs/test-runners/vitest.cjs +115 -0
- package/dist/lib/cjs/test-runners/vitest.d.cts +52 -0
- package/dist/lib/cjs/validate-declarations.cjs +120 -0
- package/dist/lib/cjs/validate-declarations.d.cts +37 -0
- package/dist/lib/cjs/version.cjs +758 -0
- package/dist/lib/cjs/version.d.cts +418 -0
- package/dist/lib/esm/build.d.mts +59 -0
- package/dist/lib/esm/build.mjs +165 -0
- package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.d.mts +25 -0
- package/dist/lib/esm/bundlers/esbuild-impl/change-extension-plugin.mjs +101 -0
- package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.d.mts +14 -0
- package/dist/lib/esm/bundlers/esbuild-impl/custom-esbuild-options-plugin.mjs +59 -0
- package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.d.mts +13 -0
- package/dist/lib/esm/bundlers/esbuild-impl/fix-esm-plugin.mjs +69 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +6 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +60 -0
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.d.mts +143 -0
- package/dist/lib/esm/bundlers/esbuild-impl/preprocess-plugin.mjs +176 -0
- package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.d.mts +14 -0
- package/dist/lib/esm/bundlers/esbuild-impl/svelte-wrapper-plugin.mjs +82 -0
- package/dist/lib/esm/bundlers/index.d.mts +2 -0
- package/dist/lib/esm/bundlers/index.mjs +52 -0
- package/dist/lib/esm/check-project-types.d.mts +92 -0
- package/dist/lib/esm/check-project-types.mjs +123 -0
- package/dist/lib/esm/cli-utils.d.mts +123 -0
- package/dist/lib/esm/cli-utils.mjs +225 -0
- package/dist/lib/esm/code-generator.d.mts +14 -0
- package/dist/lib/esm/code-generator.mjs +59 -0
- package/dist/lib/esm/commitlint-config.d.mts +14 -0
- package/dist/lib/esm/commitlint-config.mjs +79 -0
- package/dist/lib/esm/commitlint-forbidden-patterns.d.mts +37 -0
- package/dist/lib/esm/commitlint-forbidden-patterns.mjs +75 -0
- package/dist/lib/esm/commitlint-spellcheck-header.d.mts +40 -0
- package/dist/lib/esm/commitlint-spellcheck-header.mjs +87 -0
- package/dist/lib/esm/env-toggle.d.mts +42 -0
- package/dist/lib/esm/env-toggle.mjs +84 -0
- package/dist/lib/esm/exec.d.mts +162 -0
- package/dist/lib/esm/exec.mjs +410 -0
- package/dist/lib/esm/forbidden-patterns.d.mts +57 -0
- package/dist/lib/esm/forbidden-patterns.mjs +108 -0
- package/dist/lib/esm/formatters/dprint.d.mts +33 -0
- package/dist/lib/esm/formatters/dprint.mjs +75 -0
- package/dist/lib/esm/formatters/index.d.mts +2 -0
- package/dist/lib/esm/formatters/index.mjs +52 -0
- package/dist/lib/esm/fs.d.mts +80 -0
- package/dist/lib/esm/fs.mjs +89 -0
- package/dist/lib/esm/gate.d.mts +93 -0
- package/dist/lib/esm/gate.mjs +106 -0
- package/dist/lib/esm/git.d.mts +37 -0
- package/dist/lib/esm/git.mjs +72 -0
- package/dist/lib/esm/index.d.mts +35 -0
- package/dist/lib/esm/index.mjs +110 -0
- package/dist/lib/esm/json.d.mts +102 -0
- package/dist/lib/esm/json.mjs +106 -0
- package/dist/lib/esm/library-build.d.mts +101 -0
- package/dist/lib/esm/library-build.mjs +443 -0
- package/dist/lib/esm/library-references.d.mts +5 -0
- package/dist/lib/esm/linters/cspell-content.d.mts +46 -0
- package/dist/lib/esm/linters/cspell-content.mjs +87 -0
- package/dist/lib/esm/linters/cspell.d.mts +36 -0
- package/dist/lib/esm/linters/cspell.mjs +69 -0
- package/dist/lib/esm/linters/eslint-agnostic-core-boundary.d.mts +49 -0
- package/dist/lib/esm/linters/eslint-agnostic-core-boundary.mjs +57 -0
- package/dist/lib/esm/linters/eslint-config.d.mts +123 -0
- package/dist/lib/esm/linters/eslint-config.mjs +1022 -0
- package/dist/lib/esm/linters/eslint-no-restricted-syntax.d.mts +27 -0
- package/dist/lib/esm/linters/eslint-no-restricted-syntax.mjs +93 -0
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.d.mts +26 -0
- package/dist/lib/esm/linters/eslint-rules/in-house-plugin.mjs +77 -0
- package/dist/lib/esm/linters/eslint-rules/index.d.mts +13 -0
- package/dist/lib/esm/linters/eslint-rules/index.mjs +74 -0
- package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +144 -0
- package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/no-unresolved-jsdoc-link.mjs +277 -0
- package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.d.mts +41 -0
- package/dist/lib/esm/linters/eslint-rules/no-unused-params-members.mjs +227 -0
- package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.d.mts +20 -0
- package/dist/lib/esm/linters/eslint-rules/no-used-underscore-variables.mjs +96 -0
- package/dist/lib/esm/linters/eslint-rules/params-options-name-match.d.mts +36 -0
- package/dist/lib/esm/linters/eslint-rules/params-options-name-match.mjs +179 -0
- package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/prefer-noop-async.mjs +88 -0
- package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.d.mts +20 -0
- package/dist/lib/esm/linters/eslint-rules/readonly-params-options-result-members.mjs +87 -0
- package/dist/lib/esm/linters/eslint-rules/require-method-template.d.mts +14 -0
- package/dist/lib/esm/linters/eslint-rules/require-method-template.mjs +142 -0
- package/dist/lib/esm/linters/eslint-rules/require-super-call.d.mts +10 -0
- package/dist/lib/esm/linters/eslint-rules/require-super-call.mjs +183 -0
- package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.d.mts +18 -0
- package/dist/lib/esm/linters/eslint-rules/rule-tester-helper.mjs +55 -0
- package/dist/lib/esm/linters/eslint-rules/ts-estree-node.d.mts +23 -0
- package/dist/lib/esm/linters/eslint-rules/ts-estree-node.mjs +55 -0
- package/dist/lib/esm/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs.d.mts +20 -0
- package/dist/lib/esm/linters/eslint-types/@types/eslint-plugin-verify-tsdoc.d.mts +17 -0
- package/dist/lib/esm/linters/eslint.d.mts +74 -0
- package/dist/lib/esm/linters/eslint.mjs +159 -0
- package/dist/lib/esm/linters/index.d.mts +15 -0
- package/dist/lib/esm/linters/index.mjs +78 -0
- package/dist/lib/esm/linters/lint-ignores.d.mts +30 -0
- package/dist/lib/esm/linters/lint-ignores.mjs +54 -0
- package/dist/lib/esm/linters/markdownlint-cli2-config.d.mts +11 -0
- package/dist/lib/esm/linters/markdownlint-cli2-config.mjs +122 -0
- package/dist/lib/esm/linters/markdownlint-content.d.mts +47 -0
- package/dist/lib/esm/linters/markdownlint-content.mjs +83 -0
- package/dist/lib/esm/linters/markdownlint-ignores.d.mts +35 -0
- package/dist/lib/esm/linters/markdownlint-ignores.mjs +57 -0
- package/dist/lib/esm/linters/markdownlint-rules/index.d.mts +2 -0
- package/dist/lib/esm/linters/markdownlint-rules/index.mjs +52 -0
- package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.d.mts +35 -0
- package/dist/lib/esm/linters/markdownlint-rules/no-soft-break-in-paragraph.mjs +114 -0
- package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2-config-schema.d.mts +1344 -0
- package/dist/lib/esm/linters/markdownlint-types/@types/markdownlint-cli2.d.mts +67 -0
- package/dist/lib/esm/linters/markdownlint.d.mts +32 -0
- package/dist/lib/esm/linters/markdownlint.mjs +124 -0
- package/dist/lib/esm/linters/over-exposure.d.mts +357 -0
- package/dist/lib/esm/linters/over-exposure.mjs +672 -0
- package/dist/lib/esm/nano-staged-config.d.mts +54 -0
- package/dist/lib/esm/nano-staged-config.mjs +103 -0
- package/dist/lib/esm/npm-publish.d.mts +19 -0
- package/dist/lib/esm/npm-publish.mjs +56 -0
- package/dist/lib/esm/npm-run.d.mts +34 -0
- package/dist/lib/esm/npm-run.mjs +81 -0
- package/dist/lib/esm/npm.d.mts +168 -0
- package/dist/lib/esm/npm.mjs +155 -0
- package/dist/lib/esm/package-lock-integrity.d.mts +38 -0
- package/dist/lib/esm/package-lock-integrity.mjs +99 -0
- package/dist/lib/esm/package-manager.d.mts +93 -0
- package/dist/lib/esm/package-manager.mjs +245 -0
- package/dist/lib/esm/released-issues.d.mts +79 -0
- package/dist/lib/esm/released-issues.mjs +143 -0
- package/dist/lib/esm/repo-paths.d.mts +318 -0
- package/dist/lib/esm/repo-paths.mjs +130 -0
- package/dist/lib/esm/root.d.mts +107 -0
- package/dist/lib/esm/root.mjs +115 -0
- package/dist/lib/esm/test-runners/index.d.mts +3 -0
- package/dist/lib/esm/test-runners/index.mjs +54 -0
- package/dist/lib/esm/test-runners/vitest-config.d.mts +90 -0
- package/dist/lib/esm/test-runners/vitest-config.mjs +86 -0
- package/dist/lib/esm/test-runners/vitest.d.mts +52 -0
- package/dist/lib/esm/test-runners/vitest.mjs +76 -0
- package/dist/lib/esm/validate-declarations.d.mts +37 -0
- package/dist/lib/esm/validate-declarations.mjs +87 -0
- package/dist/lib/esm/version.d.mts +418 -0
- package/dist/lib/esm/version.mjs +723 -0
- package/formatters/dprint/package.json +6 -0
- package/formatters/index/package.json +6 -0
- package/formatters/package.json +6 -0
- package/linters/cspell/package.json +6 -0
- package/linters/cspell-content/package.json +6 -0
- package/linters/eslint/package.json +6 -0
- package/linters/eslint-agnostic-core-boundary/package.json +6 -0
- package/linters/eslint-config/package.json +6 -0
- package/linters/eslint-no-restricted-syntax/package.json +6 -0
- package/linters/eslint-rules/in-house-plugin/package.json +6 -0
- package/linters/eslint-rules/index/package.json +6 -0
- package/linters/eslint-rules/no-async-callback-to-unsafe-return/package.json +6 -0
- package/linters/eslint-rules/no-unresolved-jsdoc-link/package.json +6 -0
- package/linters/eslint-rules/no-unused-params-members/package.json +6 -0
- package/linters/eslint-rules/no-used-underscore-variables/package.json +6 -0
- package/linters/eslint-rules/package.json +6 -0
- package/linters/eslint-rules/params-options-name-match/package.json +6 -0
- package/linters/eslint-rules/prefer-noop-async/package.json +6 -0
- package/linters/eslint-rules/readonly-params-options-result-members/package.json +6 -0
- package/linters/eslint-rules/require-method-template/package.json +6 -0
- package/linters/eslint-rules/require-super-call/package.json +6 -0
- package/linters/eslint-rules/rule-tester-helper/package.json +6 -0
- package/linters/eslint-rules/ts-estree-node/package.json +6 -0
- package/linters/eslint-types/@types/@eslint-community__eslint-plugin-eslint-comments__configs/package.json +4 -0
- package/linters/eslint-types/@types/eslint-plugin-verify-tsdoc/package.json +4 -0
- package/linters/index/package.json +6 -0
- package/linters/lint-ignores/package.json +6 -0
- package/linters/markdownlint/package.json +6 -0
- package/linters/markdownlint-cli2-config/package.json +6 -0
- package/linters/markdownlint-content/package.json +6 -0
- package/linters/markdownlint-ignores/package.json +6 -0
- package/linters/markdownlint-rules/index/package.json +6 -0
- package/linters/markdownlint-rules/no-soft-break-in-paragraph/package.json +6 -0
- package/linters/markdownlint-rules/package.json +6 -0
- package/linters/markdownlint-types/@types/markdownlint-cli2/package.json +4 -0
- package/linters/markdownlint-types/@types/markdownlint-cli2-config-schema/package.json +4 -0
- package/linters/over-exposure/package.json +6 -0
- package/linters/package.json +6 -0
- package/package.json +329 -13
- package/test-runners/index/package.json +6 -0
- package/test-runners/package.json +6 -0
- package/test-runners/vitest/package.json +6 -0
- package/test-runners/vitest-config/package.json +6 -0
|
@@ -0,0 +1,1068 @@
|
|
|
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
|
+
|
|
6
|
+
(function () {
|
|
7
|
+
function ensureDisposeSymbols(symbolConstructor = Symbol) {
|
|
8
|
+
symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
|
|
9
|
+
symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function ensureBrowserProcess() {
|
|
13
|
+
const browserProcess = {
|
|
14
|
+
browser: true,
|
|
15
|
+
cwd() {
|
|
16
|
+
return '/';
|
|
17
|
+
},
|
|
18
|
+
env: {},
|
|
19
|
+
platform: 'android'
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const existingProcess = globalThis.process;
|
|
23
|
+
|
|
24
|
+
if (!existingProcess) {
|
|
25
|
+
globalThis.process = browserProcess;
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (existingProcess.versions?.node) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const existingProcessRecord = existingProcess;
|
|
34
|
+
|
|
35
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
36
|
+
existingProcessRecord[key] ??= value;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
existingProcessRecord['browser'] = true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function keepName($unknown) {
|
|
43
|
+
return $unknown;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
(function initCjs() {
|
|
47
|
+
const globalThisRecord = globalThis;
|
|
48
|
+
ensureDisposeSymbols();
|
|
49
|
+
globalThisRecord['__name'] ??= keepName;
|
|
50
|
+
globalThisRecord['__extractDefault'] ??= extractDefault;
|
|
51
|
+
|
|
52
|
+
ensureBrowserProcess();
|
|
53
|
+
|
|
54
|
+
// eslint-disable-next-line unicorn/consistent-function-scoping -- Serialized with initCjs into the banner; at module scope it would be left out of it.
|
|
55
|
+
function extractDefault(module) {
|
|
56
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
57
|
+
}
|
|
58
|
+
})();
|
|
59
|
+
})();
|
|
60
|
+
|
|
61
|
+
"use strict";
|
|
62
|
+
var __create = Object.create;
|
|
63
|
+
var __defProp = Object.defineProperty;
|
|
64
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
65
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
66
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
67
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
68
|
+
var __export = (target, all) => {
|
|
69
|
+
for (var name in all)
|
|
70
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
71
|
+
};
|
|
72
|
+
var __copyProps = (to, from, except, desc) => {
|
|
73
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
74
|
+
for (let key of __getOwnPropNames(from))
|
|
75
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
76
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
77
|
+
}
|
|
78
|
+
return to;
|
|
79
|
+
};
|
|
80
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
81
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
82
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
83
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
84
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
85
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
86
|
+
mod
|
|
87
|
+
));
|
|
88
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
89
|
+
var eslint_config_exports = {};
|
|
90
|
+
__export(eslint_config_exports, {
|
|
91
|
+
EslintConfigContext: () => EslintConfigContext,
|
|
92
|
+
createDefaultEslintConfigContext: () => createDefaultEslintConfigContext,
|
|
93
|
+
defineEslintConfigs: () => defineEslintConfigs,
|
|
94
|
+
getEslintCoreConfigs: () => getEslintCoreConfigs,
|
|
95
|
+
getGlobalIgnoreConfigs: () => getGlobalIgnoreConfigs,
|
|
96
|
+
getTypeScriptEslintConfigs: () => getTypeScriptEslintConfigs
|
|
97
|
+
});
|
|
98
|
+
module.exports = __toCommonJS(eslint_config_exports);
|
|
99
|
+
var import_configs = __toESM(__extractDefault(require('@eslint-community/eslint-plugin-eslint-comments/configs')), 1);
|
|
100
|
+
var import_config_helpers = require('@eslint/config-helpers');
|
|
101
|
+
var import_js = __toESM(__extractDefault(require('@eslint/js')), 1);
|
|
102
|
+
var import_path = require('@mnaoumov/typescript-lib/path');
|
|
103
|
+
var import_eslint_plugin = __toESM(__extractDefault(require('@stylistic/eslint-plugin')), 1);
|
|
104
|
+
var import_eslint_import_resolver_typescript = require('eslint-import-resolver-typescript');
|
|
105
|
+
var import_eslint_plugin_import_x = require('eslint-plugin-import-x');
|
|
106
|
+
var import_eslint_plugin_n = __toESM(__extractDefault(require('eslint-plugin-n')), 1);
|
|
107
|
+
var import_eslint_plugin_perfectionist = require('eslint-plugin-perfectionist');
|
|
108
|
+
var import_eslint_plugin_unicorn = __toESM(__extractDefault(require('eslint-plugin-unicorn')), 1);
|
|
109
|
+
var import_config = require('eslint/config');
|
|
110
|
+
var import_node_fs = require('node:fs');
|
|
111
|
+
var import_typescript_eslint = __toESM(__extractDefault(require('typescript-eslint')), 1);
|
|
112
|
+
var import_repo_paths = require('../repo-paths.cjs');
|
|
113
|
+
var import_root = require('../root.cjs');
|
|
114
|
+
var import_eslint_no_restricted_syntax = require('./eslint-no-restricted-syntax.cjs');
|
|
115
|
+
var import_in_house_plugin = require('./eslint-rules/in-house-plugin.cjs');
|
|
116
|
+
var import_lint_ignores = require('./lint-ignores.cjs');
|
|
117
|
+
class EslintConfigContext {
|
|
118
|
+
/**
|
|
119
|
+
* The root configuration files.
|
|
120
|
+
*/
|
|
121
|
+
rootConfigFiles = [];
|
|
122
|
+
/**
|
|
123
|
+
* The script files.
|
|
124
|
+
*/
|
|
125
|
+
scriptFiles = [];
|
|
126
|
+
/**
|
|
127
|
+
* The source files.
|
|
128
|
+
*/
|
|
129
|
+
sourceFiles = [];
|
|
130
|
+
/**
|
|
131
|
+
* The folders holding the project's sources, by default `src` alone. A workspace whose packages each have their own
|
|
132
|
+
* `src` adds them here, so the rules keyed on a file's name inside a source folder reach those packages too.
|
|
133
|
+
*/
|
|
134
|
+
sourceFolders = [];
|
|
135
|
+
/**
|
|
136
|
+
* The test files.
|
|
137
|
+
*/
|
|
138
|
+
testFiles = [];
|
|
139
|
+
/**
|
|
140
|
+
* The all files.
|
|
141
|
+
*
|
|
142
|
+
* @returns The all files.
|
|
143
|
+
*/
|
|
144
|
+
allFiles() {
|
|
145
|
+
return [...this.testFiles, ...this.scriptFiles, ...this.rootConfigFiles, ...this.sourceFiles];
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function createDefaultEslintConfigContext() {
|
|
149
|
+
const context = new EslintConfigContext();
|
|
150
|
+
context.sourceFolders.push(import_repo_paths.RepoPaths.Src);
|
|
151
|
+
context.rootConfigFiles.push(
|
|
152
|
+
import_repo_paths.RepoPaths.CommitlintConfigTs,
|
|
153
|
+
import_repo_paths.RepoPaths.EslintConfigMts,
|
|
154
|
+
import_repo_paths.RepoPaths.VitestConfigTs
|
|
155
|
+
);
|
|
156
|
+
context.scriptFiles.push(
|
|
157
|
+
(0, import_path.join)(import_repo_paths.RepoPaths.Scripts, import_repo_paths.RepoPaths.AnyPath, import_repo_paths.RepoPaths.AnyTs)
|
|
158
|
+
);
|
|
159
|
+
context.sourceFiles.push(
|
|
160
|
+
(0, import_path.join)(import_repo_paths.RepoPaths.Src, import_repo_paths.RepoPaths.AnyPath, import_repo_paths.RepoPaths.AnyTs),
|
|
161
|
+
(0, import_path.join)(import_repo_paths.RepoPaths.Src, import_repo_paths.RepoPaths.AnyPath, import_repo_paths.RepoPaths.AnyTsx)
|
|
162
|
+
);
|
|
163
|
+
context.testFiles.push(
|
|
164
|
+
(0, import_path.join)(import_repo_paths.RepoPaths.Tests, import_repo_paths.RepoPaths.AnyPath, import_repo_paths.RepoPaths.AnyTs),
|
|
165
|
+
(0, import_path.join)(import_repo_paths.RepoPaths.Mocks, import_repo_paths.RepoPaths.AnyPath, import_repo_paths.RepoPaths.AnyTs),
|
|
166
|
+
(0, import_path.join)(import_repo_paths.RepoPaths.Src, import_repo_paths.RepoPaths.AnyPath, import_repo_paths.RepoPaths.AnyTestTs),
|
|
167
|
+
/*
|
|
168
|
+
* A build-script test is a TEST, and this convention puts it in a `*.test.ts` under `scripts/` -- beside the
|
|
169
|
+
* script it covers rather than under `src/`. Without this glob it matched `scriptFiles` alone, so every relaxation
|
|
170
|
+
* that keys on `context.testFiles` missed it: `no-magic-numbers` fired on a suite whose whole subject is recorded
|
|
171
|
+
* numbers, and `unicorn/consistent-function-scoping` on the per-suite fixture factories the block at the bottom
|
|
172
|
+
* of `getUnicornConfigs` says tests exist to allow.
|
|
173
|
+
*
|
|
174
|
+
* The file now matches BOTH lists, and that is deliberate rather than an overlap to resolve: everything scoped to
|
|
175
|
+
* `context.scriptFiles` only turns rules OFF (`import-x/no-nodejs-modules`, `unicorn/no-process-exit`), both of
|
|
176
|
+
* which a script test wants as much as the script does, so the two sets compose instead of competing. Keep it that
|
|
177
|
+
* way -- a rule turned ON for `scriptFiles` would land on these files too, and flat-config order, not intent,
|
|
178
|
+
* would decide which side won.
|
|
179
|
+
*/
|
|
180
|
+
(0, import_path.join)(import_repo_paths.RepoPaths.Scripts, import_repo_paths.RepoPaths.AnyPath, import_repo_paths.RepoPaths.AnyTestTs)
|
|
181
|
+
);
|
|
182
|
+
return context;
|
|
183
|
+
}
|
|
184
|
+
function defineEslintConfigs(options = {}) {
|
|
185
|
+
const context = createDefaultEslintConfigContext();
|
|
186
|
+
options.editContext?.(context);
|
|
187
|
+
const customConfigs = options.customConfigs?.(context) ?? [];
|
|
188
|
+
return (0, import_config.defineConfig)(
|
|
189
|
+
...getGlobalIgnoreConfigs(),
|
|
190
|
+
...getTypeScriptEslintConfigs({
|
|
191
|
+
context,
|
|
192
|
+
...options.minimumNodeVersion !== void 0 && { minimumNodeVersion: options.minimumNodeVersion }
|
|
193
|
+
}),
|
|
194
|
+
...customConfigs
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
function getEslintCoreConfigs(context) {
|
|
198
|
+
return (0, import_config.defineConfig)([
|
|
199
|
+
{
|
|
200
|
+
extends: [import_js.default.configs.recommended],
|
|
201
|
+
files: context.allFiles(),
|
|
202
|
+
rules: {
|
|
203
|
+
"accessor-pairs": "error",
|
|
204
|
+
"array-callback-return": "error",
|
|
205
|
+
"camelcase": "error",
|
|
206
|
+
/*
|
|
207
|
+
* The rule reports per comment TOKEN, so every continuation line of a wrapped `//` comment is its own token
|
|
208
|
+
* that would have to start with a capital — which is how prose ends up with capitals mid-sentence.
|
|
209
|
+
* `ignoreConsecutiveComments` exempts a line comment that directly follows another one, which is exactly the
|
|
210
|
+
* shape of a wrapped block, while still holding its FIRST line to a capital. Block comments need no such
|
|
211
|
+
* option: a block comment is a single token however many lines it spans.
|
|
212
|
+
* `ignorePattern` covers the half that leaves behind: a comment whose FIRST word is a camelCase identifier is
|
|
213
|
+
* exempt, so a comment that opens by naming a symbol keeps the name a reader can grep instead of a PascalCase
|
|
214
|
+
* one that exists nowhere. The rule anchors the pattern at the start of the comment and `[a-zA-Z0-9]` matches
|
|
215
|
+
* no whitespace, so it can only ever match that first word — ordinary lowercase prose stays reported. Both
|
|
216
|
+
* option bags need it, and `block` keeps its `v8` exemption by alternation rather than losing it.
|
|
217
|
+
*/
|
|
218
|
+
"capitalized-comments": [
|
|
219
|
+
"error",
|
|
220
|
+
"always",
|
|
221
|
+
{
|
|
222
|
+
block: { ignorePattern: "v8|[a-z][a-zA-Z0-9]*[A-Z]" },
|
|
223
|
+
line: { ignoreConsecutiveComments: true, ignorePattern: "[a-z][a-zA-Z0-9]*[A-Z]" }
|
|
224
|
+
}
|
|
225
|
+
],
|
|
226
|
+
"complexity": "error",
|
|
227
|
+
"consistent-this": "error",
|
|
228
|
+
"curly": "error",
|
|
229
|
+
"default-case": "error",
|
|
230
|
+
"default-case-last": "error",
|
|
231
|
+
"default-param-last": "error",
|
|
232
|
+
"eqeqeq": "error",
|
|
233
|
+
"func-name-matching": "error",
|
|
234
|
+
"func-names": "error",
|
|
235
|
+
"func-style": [
|
|
236
|
+
"error",
|
|
237
|
+
"declaration",
|
|
238
|
+
{
|
|
239
|
+
allowArrowFunctions: false
|
|
240
|
+
}
|
|
241
|
+
],
|
|
242
|
+
"grouped-accessor-pairs": [
|
|
243
|
+
"error",
|
|
244
|
+
"getBeforeSet"
|
|
245
|
+
],
|
|
246
|
+
"guard-for-in": "error",
|
|
247
|
+
"no-alert": "error",
|
|
248
|
+
"no-array-constructor": "error",
|
|
249
|
+
"no-bitwise": "error",
|
|
250
|
+
"no-caller": "error",
|
|
251
|
+
"no-console": [
|
|
252
|
+
"error",
|
|
253
|
+
{
|
|
254
|
+
allow: [
|
|
255
|
+
"warn",
|
|
256
|
+
"error"
|
|
257
|
+
]
|
|
258
|
+
}
|
|
259
|
+
],
|
|
260
|
+
"no-constructor-return": "error",
|
|
261
|
+
"no-div-regex": "error",
|
|
262
|
+
"no-else-return": [
|
|
263
|
+
"error",
|
|
264
|
+
{
|
|
265
|
+
allowElseIf: false
|
|
266
|
+
}
|
|
267
|
+
],
|
|
268
|
+
"no-empty-function": "error",
|
|
269
|
+
"no-extend-native": "error",
|
|
270
|
+
"no-extra-bind": "error",
|
|
271
|
+
"no-extra-label": "error",
|
|
272
|
+
"no-implicit-coercion": [
|
|
273
|
+
"error",
|
|
274
|
+
{
|
|
275
|
+
allow: [
|
|
276
|
+
"!!"
|
|
277
|
+
]
|
|
278
|
+
}
|
|
279
|
+
],
|
|
280
|
+
"no-implied-eval": "error",
|
|
281
|
+
"no-inner-declarations": "error",
|
|
282
|
+
"no-iterator": "error",
|
|
283
|
+
"no-label-var": "error",
|
|
284
|
+
"no-labels": "error",
|
|
285
|
+
"no-lone-blocks": "error",
|
|
286
|
+
"no-lonely-if": "error",
|
|
287
|
+
"no-loop-func": "error",
|
|
288
|
+
"no-magic-numbers": [
|
|
289
|
+
"error",
|
|
290
|
+
{
|
|
291
|
+
detectObjects: true,
|
|
292
|
+
enforceConst: true,
|
|
293
|
+
ignore: [
|
|
294
|
+
-1,
|
|
295
|
+
0,
|
|
296
|
+
1
|
|
297
|
+
]
|
|
298
|
+
}
|
|
299
|
+
],
|
|
300
|
+
"no-multi-assign": "error",
|
|
301
|
+
"no-multi-str": "error",
|
|
302
|
+
"no-negated-condition": "error",
|
|
303
|
+
"no-nested-ternary": "error",
|
|
304
|
+
"no-new-func": "error",
|
|
305
|
+
"no-new-wrappers": "error",
|
|
306
|
+
"no-object-constructor": "error",
|
|
307
|
+
"no-octal-escape": "error",
|
|
308
|
+
"no-promise-executor-return": "error",
|
|
309
|
+
"no-proto": "error",
|
|
310
|
+
"no-restricted-syntax": [
|
|
311
|
+
"error",
|
|
312
|
+
...import_eslint_no_restricted_syntax.noRestrictedSyntaxRuleEntries
|
|
313
|
+
],
|
|
314
|
+
"no-return-assign": "error",
|
|
315
|
+
"no-script-url": "error",
|
|
316
|
+
"no-self-compare": "error",
|
|
317
|
+
"no-sequences": "error",
|
|
318
|
+
"no-shadow": "error",
|
|
319
|
+
"no-template-curly-in-string": "error",
|
|
320
|
+
"no-throw-literal": "error",
|
|
321
|
+
"no-unmodified-loop-condition": "error",
|
|
322
|
+
"no-unneeded-ternary": "error",
|
|
323
|
+
"no-unreachable-loop": "error",
|
|
324
|
+
"no-unused-expressions": "error",
|
|
325
|
+
"no-useless-assignment": "error",
|
|
326
|
+
"no-useless-call": "error",
|
|
327
|
+
"no-useless-computed-key": "error",
|
|
328
|
+
"no-useless-concat": "error",
|
|
329
|
+
"no-useless-constructor": "error",
|
|
330
|
+
"no-useless-rename": "error",
|
|
331
|
+
"no-useless-return": "error",
|
|
332
|
+
"no-var": "error",
|
|
333
|
+
"no-void": "error",
|
|
334
|
+
"object-shorthand": "error",
|
|
335
|
+
"operator-assignment": "error",
|
|
336
|
+
"prefer-arrow-callback": "error",
|
|
337
|
+
"prefer-const": "error",
|
|
338
|
+
"prefer-exponentiation-operator": "error",
|
|
339
|
+
"prefer-named-capture-group": "error",
|
|
340
|
+
"prefer-numeric-literals": "error",
|
|
341
|
+
"prefer-object-has-own": "error",
|
|
342
|
+
"prefer-object-spread": "error",
|
|
343
|
+
"prefer-promise-reject-errors": "error",
|
|
344
|
+
"prefer-regex-literals": "error",
|
|
345
|
+
"prefer-rest-params": "error",
|
|
346
|
+
"prefer-spread": "error",
|
|
347
|
+
"prefer-template": "error",
|
|
348
|
+
"radix": "error",
|
|
349
|
+
"require-atomic-updates": "error",
|
|
350
|
+
"require-await": "error",
|
|
351
|
+
"symbol-description": "error",
|
|
352
|
+
"unicode-bom": "error",
|
|
353
|
+
"vars-on-top": "error",
|
|
354
|
+
"yoda": "error"
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
files: context.testFiles,
|
|
359
|
+
rules: {
|
|
360
|
+
"no-magic-numbers": "off"
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
]);
|
|
364
|
+
}
|
|
365
|
+
function getGlobalIgnoreConfigs() {
|
|
366
|
+
return (0, import_config.defineConfig)(
|
|
367
|
+
...getGitIgnoreConfigs(),
|
|
368
|
+
/*
|
|
369
|
+
* On top of `.gitignore`, not instead of it: git excludes Claude Code's worktree folder through
|
|
370
|
+
* `.git/info/exclude`, which `includeIgnoreFile` above does not read. See `lint-ignores.ts`.
|
|
371
|
+
*/
|
|
372
|
+
(0, import_config.globalIgnores)([import_lint_ignores.CLAUDE_WORKTREES_IGNORE_GLOB], "obsidian-dev-utils/claude-worktrees")
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
function getTypeScriptEslintConfigs(params) {
|
|
376
|
+
const { context } = params;
|
|
377
|
+
return (0, import_config.defineConfig)(
|
|
378
|
+
...getEslintCoreConfigs(context),
|
|
379
|
+
...getTseslintConfigs(context),
|
|
380
|
+
...getStylisticConfigs(context),
|
|
381
|
+
...getImportXConfigs(context),
|
|
382
|
+
...getPerfectionistConfigs(context),
|
|
383
|
+
...getUnicornConfigs(context),
|
|
384
|
+
...getEslintImportResolverTypescriptConfigs(),
|
|
385
|
+
...getEslintCommentsConfigs(context),
|
|
386
|
+
...getInHousePluginConfigs({ context, inHousePlugin: params.inHousePlugin ?? import_in_house_plugin.inHouseEslintPlugin }),
|
|
387
|
+
...getNodeCompatConfigs({ context, minimumNodeVersion: params.minimumNodeVersion })
|
|
388
|
+
);
|
|
389
|
+
}
|
|
390
|
+
function getEslintCommentsConfigs(context) {
|
|
391
|
+
return (0, import_config.defineConfig)([
|
|
392
|
+
{
|
|
393
|
+
// eslint-disable-next-line import-x/no-named-as-default-member -- The default export name `recommended` is too confusing.
|
|
394
|
+
extends: [import_configs.default.recommended],
|
|
395
|
+
files: context.allFiles(),
|
|
396
|
+
rules: {
|
|
397
|
+
"@eslint-community/eslint-comments/require-description": "error"
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
]);
|
|
401
|
+
}
|
|
402
|
+
function getEslintImportResolverTypescriptConfigs() {
|
|
403
|
+
return (0, import_config.defineConfig)([
|
|
404
|
+
{
|
|
405
|
+
settings: {
|
|
406
|
+
"import-x/resolver-next": [
|
|
407
|
+
(0, import_eslint_import_resolver_typescript.createTypeScriptImportResolver)({
|
|
408
|
+
alwaysTryTypes: true
|
|
409
|
+
})
|
|
410
|
+
]
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
]);
|
|
414
|
+
}
|
|
415
|
+
function getGitIgnoreConfigs() {
|
|
416
|
+
const gitignorePath = (0, import_path.join)((0, import_root.getRootFolder)() ?? "", ".gitignore");
|
|
417
|
+
return (0, import_node_fs.existsSync)(gitignorePath) ? [(0, import_config_helpers.includeIgnoreFile)(gitignorePath)] : [];
|
|
418
|
+
}
|
|
419
|
+
function getImportXConfigs(context) {
|
|
420
|
+
return (0, import_config.defineConfig)([
|
|
421
|
+
{
|
|
422
|
+
extends: [
|
|
423
|
+
import_eslint_plugin_import_x.flatConfigs.recommended,
|
|
424
|
+
import_eslint_plugin_import_x.flatConfigs.typescript,
|
|
425
|
+
import_eslint_plugin_import_x.flatConfigs.errors,
|
|
426
|
+
import_eslint_plugin_import_x.flatConfigs.warnings
|
|
427
|
+
],
|
|
428
|
+
files: context.allFiles(),
|
|
429
|
+
rules: {
|
|
430
|
+
"import-x/consistent-type-specifier-style": "error",
|
|
431
|
+
"import-x/extensions": ["error", "ignorePackages"],
|
|
432
|
+
"import-x/first": "error",
|
|
433
|
+
"import-x/imports-first": "error",
|
|
434
|
+
"import-x/newline-after-import": "error",
|
|
435
|
+
"import-x/no-absolute-path": "error",
|
|
436
|
+
"import-x/no-amd": "error",
|
|
437
|
+
"import-x/no-anonymous-default-export": "error",
|
|
438
|
+
"import-x/no-commonjs": "error",
|
|
439
|
+
"import-x/no-cycle": "error",
|
|
440
|
+
"import-x/no-default-export": "error",
|
|
441
|
+
"import-x/no-deprecated": "error",
|
|
442
|
+
"import-x/no-duplicates": "error",
|
|
443
|
+
"import-x/no-dynamic-require": "error",
|
|
444
|
+
"import-x/no-empty-named-blocks": "error",
|
|
445
|
+
"import-x/no-extraneous-dependencies": "error",
|
|
446
|
+
"import-x/no-import-module-exports": "error",
|
|
447
|
+
"import-x/no-mutable-exports": "error",
|
|
448
|
+
"import-x/no-named-default": "error",
|
|
449
|
+
"import-x/no-namespace": "error",
|
|
450
|
+
"import-x/no-nodejs-modules": "error",
|
|
451
|
+
"import-x/no-relative-packages": "error",
|
|
452
|
+
"import-x/no-restricted-paths": "error",
|
|
453
|
+
"import-x/no-self-import": "error",
|
|
454
|
+
"import-x/no-unassigned-import": [
|
|
455
|
+
"error",
|
|
456
|
+
{
|
|
457
|
+
allow: [
|
|
458
|
+
"**/*.css",
|
|
459
|
+
"**/*.sass",
|
|
460
|
+
"**/*.scss"
|
|
461
|
+
]
|
|
462
|
+
}
|
|
463
|
+
],
|
|
464
|
+
"import-x/no-unused-modules": "off",
|
|
465
|
+
"import-x/no-useless-path-segments": "error",
|
|
466
|
+
"import-x/no-webpack-loader-syntax": "error"
|
|
467
|
+
}
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
files: context.scriptFiles,
|
|
471
|
+
rules: {
|
|
472
|
+
"import-x/no-nodejs-modules": "off"
|
|
473
|
+
}
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
// A test runs under the test runner in Node and is never bundled into anything that ships.
|
|
477
|
+
files: context.testFiles,
|
|
478
|
+
rules: {
|
|
479
|
+
"import-x/no-nodejs-modules": "off"
|
|
480
|
+
}
|
|
481
|
+
},
|
|
482
|
+
{
|
|
483
|
+
files: context.rootConfigFiles,
|
|
484
|
+
rules: {
|
|
485
|
+
"import-x/no-default-export": "off"
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
]);
|
|
489
|
+
}
|
|
490
|
+
function getInHousePluginConfigs(params) {
|
|
491
|
+
return (0, import_config.defineConfig)([
|
|
492
|
+
{
|
|
493
|
+
files: params.context.allFiles(),
|
|
494
|
+
plugins: {
|
|
495
|
+
[import_in_house_plugin.IN_HOUSE_ESLINT_PLUGIN_NAME]: params.inHousePlugin
|
|
496
|
+
},
|
|
497
|
+
rules: {
|
|
498
|
+
"obsidian-dev-utils/no-async-callback-to-unsafe-return": "error",
|
|
499
|
+
/*
|
|
500
|
+
* Measured over 32 plugins built on this config before it was turned on (2026-09-24): 29 had no finding,
|
|
501
|
+
* the other three had 8 between them, every one a genuinely dead link.
|
|
502
|
+
*/
|
|
503
|
+
"obsidian-dev-utils/no-unresolved-jsdoc-link": "error",
|
|
504
|
+
"obsidian-dev-utils/no-unused-params-members": "error",
|
|
505
|
+
"obsidian-dev-utils/no-used-underscore-variables": "error",
|
|
506
|
+
"obsidian-dev-utils/params-options-name-match": "error",
|
|
507
|
+
"obsidian-dev-utils/prefer-noop-async": "error",
|
|
508
|
+
"obsidian-dev-utils/readonly-params-options-result-members": "error",
|
|
509
|
+
"obsidian-dev-utils/require-method-template": "error",
|
|
510
|
+
"obsidian-dev-utils/require-super-call": "off"
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
]);
|
|
514
|
+
}
|
|
515
|
+
function getNodeCompatConfigs(params) {
|
|
516
|
+
const { context, minimumNodeVersion } = params;
|
|
517
|
+
const versionOptions = minimumNodeVersion === void 0 ? {} : { version: minimumNodeVersion };
|
|
518
|
+
return (0, import_config.defineConfig)([
|
|
519
|
+
{
|
|
520
|
+
files: context.sourceFiles,
|
|
521
|
+
ignores: [
|
|
522
|
+
...context.testFiles,
|
|
523
|
+
// Dev-only tooling (build, lint, version) runs via `jiti` in the developer's Node environment and never ships, so the shipped source's Node floor does not apply to it.
|
|
524
|
+
...context.scriptFiles
|
|
525
|
+
],
|
|
526
|
+
plugins: {
|
|
527
|
+
n: import_eslint_plugin_n.default
|
|
528
|
+
},
|
|
529
|
+
rules: {
|
|
530
|
+
"n/no-unsupported-features/es-builtins": [
|
|
531
|
+
"error",
|
|
532
|
+
versionOptions
|
|
533
|
+
],
|
|
534
|
+
"n/no-unsupported-features/node-builtins": [
|
|
535
|
+
"error",
|
|
536
|
+
{
|
|
537
|
+
// `Blob` and `File` are DOM web globals present in every supported browser engine, but the rule also knows them as Node's experimental builtins and cannot tell which is meant. Ignore them globally; genuinely newer APIs (e.g. `AbortSignal.any`) stay flagged.
|
|
538
|
+
ignores: [
|
|
539
|
+
"Blob",
|
|
540
|
+
"File"
|
|
541
|
+
],
|
|
542
|
+
...versionOptions
|
|
543
|
+
}
|
|
544
|
+
]
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
]);
|
|
548
|
+
}
|
|
549
|
+
function getPerfectionistConfigs(context) {
|
|
550
|
+
return (0, import_config.defineConfig)([{
|
|
551
|
+
extends: [import_eslint_plugin_perfectionist.configs["recommended-alphabetical"]],
|
|
552
|
+
files: context.allFiles()
|
|
553
|
+
}]);
|
|
554
|
+
}
|
|
555
|
+
function getStylisticConfigs(context) {
|
|
556
|
+
return (0, import_config.defineConfig)([
|
|
557
|
+
{
|
|
558
|
+
extends: [
|
|
559
|
+
import_eslint_plugin.default.configs.recommended,
|
|
560
|
+
import_eslint_plugin.default.configs.customize({
|
|
561
|
+
arrowParens: true,
|
|
562
|
+
braceStyle: "1tbs",
|
|
563
|
+
commaDangle: "never",
|
|
564
|
+
semi: true
|
|
565
|
+
})
|
|
566
|
+
],
|
|
567
|
+
files: context.allFiles(),
|
|
568
|
+
rules: {
|
|
569
|
+
"@stylistic/generator-star-spacing": "off",
|
|
570
|
+
"@stylistic/indent": "off",
|
|
571
|
+
"@stylistic/indent-binary-ops": "off",
|
|
572
|
+
"@stylistic/jsx-one-expression-per-line": "off",
|
|
573
|
+
"@stylistic/no-extra-semi": "error",
|
|
574
|
+
"@stylistic/object-curly-newline": [
|
|
575
|
+
"error",
|
|
576
|
+
{
|
|
577
|
+
ExportDeclaration: {
|
|
578
|
+
minProperties: 2,
|
|
579
|
+
multiline: true
|
|
580
|
+
},
|
|
581
|
+
ImportDeclaration: {
|
|
582
|
+
minProperties: 2,
|
|
583
|
+
multiline: true
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
],
|
|
587
|
+
"@stylistic/operator-linebreak": [
|
|
588
|
+
"error",
|
|
589
|
+
"before",
|
|
590
|
+
{
|
|
591
|
+
overrides: {
|
|
592
|
+
"=": "after"
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
],
|
|
596
|
+
"@stylistic/quotes": [
|
|
597
|
+
"error",
|
|
598
|
+
"single",
|
|
599
|
+
{
|
|
600
|
+
allowTemplateLiterals: "never"
|
|
601
|
+
}
|
|
602
|
+
]
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
]);
|
|
606
|
+
}
|
|
607
|
+
function getTseslintConfigs(context) {
|
|
608
|
+
return (0, import_config.defineConfig)([
|
|
609
|
+
{
|
|
610
|
+
extends: [
|
|
611
|
+
// eslint-disable-next-line import-x/no-named-as-default-member -- The default export name `_default` is too confusing.
|
|
612
|
+
...import_typescript_eslint.default.configs.strictTypeChecked,
|
|
613
|
+
// eslint-disable-next-line import-x/no-named-as-default-member -- The default export name `_default` is too confusing.
|
|
614
|
+
...import_typescript_eslint.default.configs.stylisticTypeChecked
|
|
615
|
+
],
|
|
616
|
+
files: context.allFiles(),
|
|
617
|
+
languageOptions: {
|
|
618
|
+
parserOptions: {
|
|
619
|
+
ecmaFeatures: {
|
|
620
|
+
jsx: true
|
|
621
|
+
},
|
|
622
|
+
projectService: true,
|
|
623
|
+
// eslint-disable-next-line unicorn/name-replacements -- `tsconfigRootDir` is a `typescript-eslint` parser option.
|
|
624
|
+
tsconfigRootDir: (0, import_root.getRootFolder)() ?? ""
|
|
625
|
+
}
|
|
626
|
+
},
|
|
627
|
+
rules: {
|
|
628
|
+
"@typescript-eslint/explicit-function-return-type": "error",
|
|
629
|
+
"@typescript-eslint/explicit-member-accessibility": "error",
|
|
630
|
+
// The rule's own `property` default, spelled as a bare severity so it stays the rule's default rather than a copy of it.
|
|
631
|
+
// Do NOT pass `'method'` for tidiness: the method form keeps parameters bivariant, drops `readonly` (the rule's own fixer
|
|
632
|
+
// message says so), and makes `@typescript-eslint/unbound-method` fire on every forwarded bag member, which is what the
|
|
633
|
+
// `this: void` boilerplate used to pay for. Do NOT delete the line either - the rule is in no preset, so that turns it off.
|
|
634
|
+
"@typescript-eslint/method-signature-style": "error",
|
|
635
|
+
"@typescript-eslint/no-floating-promises": ["error", {
|
|
636
|
+
checkThenables: true
|
|
637
|
+
}],
|
|
638
|
+
"@typescript-eslint/no-invalid-void-type": ["error", {
|
|
639
|
+
allowAsThisParameter: true
|
|
640
|
+
}],
|
|
641
|
+
"@typescript-eslint/no-this-alias": ["error", {
|
|
642
|
+
allowedNames: [
|
|
643
|
+
"that"
|
|
644
|
+
]
|
|
645
|
+
}],
|
|
646
|
+
"@typescript-eslint/no-unused-vars": [
|
|
647
|
+
"error",
|
|
648
|
+
{
|
|
649
|
+
// eslint-disable-next-line unicorn/name-replacements -- `args` is an ESLint rule option name.
|
|
650
|
+
args: "all",
|
|
651
|
+
// eslint-disable-next-line unicorn/name-replacements -- `argsIgnorePattern` is a `typescript-eslint` rule option name.
|
|
652
|
+
argsIgnorePattern: "^_",
|
|
653
|
+
caughtErrors: "all",
|
|
654
|
+
caughtErrorsIgnorePattern: "^_",
|
|
655
|
+
destructuredArrayIgnorePattern: "^_",
|
|
656
|
+
ignoreRestSiblings: true,
|
|
657
|
+
// eslint-disable-next-line unicorn/name-replacements -- `varsIgnorePattern` is a `typescript-eslint` rule option name.
|
|
658
|
+
varsIgnorePattern: "^_"
|
|
659
|
+
}
|
|
660
|
+
],
|
|
661
|
+
"@typescript-eslint/prefer-readonly": "error"
|
|
662
|
+
}
|
|
663
|
+
},
|
|
664
|
+
{
|
|
665
|
+
files: context.testFiles,
|
|
666
|
+
rules: {
|
|
667
|
+
"@typescript-eslint/dot-notation": ["error", {
|
|
668
|
+
allowPrivateClassPropertyAccess: true,
|
|
669
|
+
allowProtectedClassPropertyAccess: true
|
|
670
|
+
}],
|
|
671
|
+
"@typescript-eslint/unbound-method": "off"
|
|
672
|
+
}
|
|
673
|
+
},
|
|
674
|
+
{
|
|
675
|
+
settings: {
|
|
676
|
+
react: {
|
|
677
|
+
version: "detect"
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
]);
|
|
682
|
+
}
|
|
683
|
+
function getUnicornConfigs(context) {
|
|
684
|
+
return (0, import_config.defineConfig)([
|
|
685
|
+
{
|
|
686
|
+
extends: [import_eslint_plugin_unicorn.default.configs.recommended],
|
|
687
|
+
files: context.allFiles(),
|
|
688
|
+
rules: {
|
|
689
|
+
/*
|
|
690
|
+
* These entries are not abbreviations to be expanded — they are established vocabulary here.
|
|
691
|
+
*
|
|
692
|
+
* Brand: `dev`, `lib`, `util`/`utils` spell the product's own name. Left on, the rule rewrites
|
|
693
|
+
* `RepoPaths` to `ObsidianDevelopmentUtilitiesRepoPaths` and `getLibDebugger` to
|
|
694
|
+
* `getLibraryDebugger`, renaming exported API after the package it belongs to.
|
|
695
|
+
*
|
|
696
|
+
* Convention: `params` is the parameter-bag convention, enforced by
|
|
697
|
+
* `obsidian-dev-utils/params-options-name-match`, which requires bag types to be named
|
|
698
|
+
* `<Owner>Params` / `<Owner>Options`. Expanding it to `Parameters` would put the two rules in direct
|
|
699
|
+
* contradiction and break 300+ exported type names.
|
|
700
|
+
*
|
|
701
|
+
* Reserved words: a bare `args`, `fn`, `str`, `mod` or `evt` expands to an identifier that is already
|
|
702
|
+
* taken, so the rule suggests `$arguments`, `$function`, and so on. Spell those `$arguments` /
|
|
703
|
+
* `$function` instead — a `$` prefix reads better than a trailing underscore. This is deliberately NOT
|
|
704
|
+
* configured as a custom replacement: unicorn substitutes at the word level inside compound names, so
|
|
705
|
+
* redirecting the whole entry turns `asyncFn` into `async$function`. Compounds want the plain expansion
|
|
706
|
+
* (`asyncFunction`); only the bare, genuinely-colliding identifiers take the `$` form.
|
|
707
|
+
*
|
|
708
|
+
* Domain words: `doc`/`docs`, `env`, `dist` and `src` are the clearer spelling in this codebase.
|
|
709
|
+
* Expanding `doc` also picks the wrong word — the `api-doc-*` modules generate API *documentation*, not
|
|
710
|
+
* documents. `src` additionally corrupts code: the fixer renames the `Src` member of the exported
|
|
711
|
+
* `ObsidianPluginRepoPaths` / `RepoPaths` enums while leaving every `.Src` reference
|
|
712
|
+
* dangling, because `checkProperties` exempts property accesses but not the declarations they point at.
|
|
713
|
+
*
|
|
714
|
+
* Disabling the replacement entries protects these permanently; an `allowList` would instead need every
|
|
715
|
+
* affected identifier enumerated by hand and re-enumerated for every new one.
|
|
716
|
+
*
|
|
717
|
+
* NOTE: this rule's autofix is NOT reference-aware for declarations that participate in a contract —
|
|
718
|
+
* enum members, interface members, and TypeScript parameter properties (`constructor(private readonly
|
|
719
|
+
* el: HTMLElement)`) are renamed while `this.el` and `Enum.Member` references are left dangling. Apply
|
|
720
|
+
* its reports by hand; never run `--fix` over it.
|
|
721
|
+
*/
|
|
722
|
+
/*
|
|
723
|
+
* A good rule, but its default prefixes force ungrammatical names: `memberPageExists` would become
|
|
724
|
+
* `isMemberPageExists` rather than `doesMemberPageExist`. These entries EXTEND the defaults (`is`,
|
|
725
|
+
* `has`, `can`, `should`, ...) rather than replacing them, so a boolean with no boolean-reading prefix
|
|
726
|
+
* at all is still rejected -- the rule just stops insisting the prefix come from a shorter list.
|
|
727
|
+
*
|
|
728
|
+
* The list is bidirectional: adding a prefix also asserts that everything named with it IS a boolean.
|
|
729
|
+
* `check` earns its place on both counts, since the handful of non-boolean `check*` names it surfaced
|
|
730
|
+
* were genuinely mis-named (void functions that throw, a probe returning an HTTP status). `test` was
|
|
731
|
+
* measured and rejected: it would validate five `test*` link predicates that read better as `is*`
|
|
732
|
+
* anyway, at the cost of renaming SCREAMING_CASE test fixtures and the `testCoverage`/`testWatch`
|
|
733
|
+
* runners that deliberately mirror the `test:coverage`/`test:watch` npm scripts.
|
|
734
|
+
*/
|
|
735
|
+
"unicorn/consistent-boolean-name": [
|
|
736
|
+
"error",
|
|
737
|
+
{
|
|
738
|
+
prefixes: {
|
|
739
|
+
allows: true,
|
|
740
|
+
check: true,
|
|
741
|
+
contains: true,
|
|
742
|
+
does: true,
|
|
743
|
+
includes: true,
|
|
744
|
+
must: true,
|
|
745
|
+
needs: true,
|
|
746
|
+
supports: true
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
],
|
|
750
|
+
/*
|
|
751
|
+
* Unsatisfiable alongside `perfectionist/sort-classes`, which is configured here as a plain
|
|
752
|
+
* alphabetical sort. This rule wants a category order (all fields, then the constructor, then all
|
|
753
|
+
* methods), so the extremely common `private _x` field paired with a `public get x()` accessor is
|
|
754
|
+
* rejected by whichever rule loses: alphabetically the accessor precedes the field, by category the
|
|
755
|
+
* field precedes the accessor. Unlike `prefer-global-this` the clash produces no
|
|
756
|
+
* `ESLintCircularFixesWarning`, only because this rule ships no fixer -- both rules are `error`, so no
|
|
757
|
+
* arrangement of members satisfies them both. The alphabetical sort is the one already rolled out
|
|
758
|
+
* across the plugins consuming this config, so it keeps precedence. Re-enabling this rule would mean
|
|
759
|
+
* giving `perfectionist/sort-classes` a matching `groups` option and reordering every class.
|
|
760
|
+
*/
|
|
761
|
+
"unicorn/consistent-class-member-order": "off",
|
|
762
|
+
/*
|
|
763
|
+
* Every report is `new Error().stack`, which captures a stack trace and never surfaces its message.
|
|
764
|
+
* The rule cannot tell that from an error that is actually thrown at a user.
|
|
765
|
+
*
|
|
766
|
+
* No bare `new AggregateError(errors)` is left for it to catch: every site now builds its aggregate
|
|
767
|
+
* through `createAggregateError`, which gives it a message that names the failure. An empty one is
|
|
768
|
+
* lossy in a way that only shows up outside this library — `errorToString` walks `errors` and prints
|
|
769
|
+
* the whole tree, while everything reading `message` sees an empty sentence. The helper lives in its
|
|
770
|
+
* own leaf `aggregate-error.ts` rather than in `error.ts` precisely so that `disposable.ts` can reach
|
|
771
|
+
* it, which it could not while the only copy sat in a module importing it back.
|
|
772
|
+
*/
|
|
773
|
+
"unicorn/error-message": "off",
|
|
774
|
+
/*
|
|
775
|
+
* The default style for `node:path` is a default import, but this codebase imports its members by name
|
|
776
|
+
* throughout, consistently with every other `node:` module it uses. Configure the rule to enforce the
|
|
777
|
+
* style actually in use rather than annotate 17 sites that are not going to change.
|
|
778
|
+
*/
|
|
779
|
+
"unicorn/import-style": [
|
|
780
|
+
"error",
|
|
781
|
+
{
|
|
782
|
+
styles: {
|
|
783
|
+
// Keyed by the UNPREFIXED module name: the rule's own table uses `path`, so a `node:path` key never matches.
|
|
784
|
+
path: {
|
|
785
|
+
named: true
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
],
|
|
790
|
+
/*
|
|
791
|
+
* The rule counts constructor calls and counts through array and object literals, so its default of 3
|
|
792
|
+
* reports ordinary composition: `Promise.reject(new Error('boom'))` inside an assertion, a test fixture
|
|
793
|
+
* built as `createTypeInfo({ methods: [createMemberInfo({ ... })] })`, `this.addChild(new C(this.app))`
|
|
794
|
+
* inside a params bag. Raising the limit by one clears every report here while still catching the
|
|
795
|
+
* genuinely unreadable nesting the rule is for.
|
|
796
|
+
*/
|
|
797
|
+
"unicorn/max-nested-calls": [
|
|
798
|
+
"error",
|
|
799
|
+
{
|
|
800
|
+
max: 4
|
|
801
|
+
}
|
|
802
|
+
],
|
|
803
|
+
"unicorn/name-replacements": [
|
|
804
|
+
"error",
|
|
805
|
+
{
|
|
806
|
+
/*
|
|
807
|
+
* Property and member names are checked too, so an abbreviation cannot survive by living on an
|
|
808
|
+
* object rather than in a variable.
|
|
809
|
+
*
|
|
810
|
+
* The rule is purely syntactic: it cannot tell a member we declare from one belonging to a
|
|
811
|
+
* dependency, and it offers no autofix for properties (measured: 681 hits, 0 with a fixer). Sites
|
|
812
|
+
* naming a foreign member -- `DomElementInfo.attr`, `EvalInObsidianParams.fn`, and the like -- are
|
|
813
|
+
* therefore impossible to satisfy and carry an inline disable, so everything still reported is ours
|
|
814
|
+
* to rename.
|
|
815
|
+
*
|
|
816
|
+
* When renaming the rest, note that `tsc` alone is NOT a sufficient gate: object-literal keys in
|
|
817
|
+
* loosely typed positions (`expect.arrayContaining([{ batchedArguments: ... }])`) are not contextually
|
|
818
|
+
* typed, so a rename leaves them behind and breaks the suite where the type checker sees nothing.
|
|
819
|
+
* Rename in small batches with the full test run in the loop.
|
|
820
|
+
*
|
|
821
|
+
* The disabled replacements below are established vocabulary rather than abbreviations to be
|
|
822
|
+
* expanded. `el` is exempt because Obsidian names every element member that way -- `containerEl`,
|
|
823
|
+
* `contentEl`, `inputEl`, `selectEl` -- so expanding ours to `*Element` would leave our components
|
|
824
|
+
* reading inconsistently beside the Obsidian ones they sit next to. Disabling the replacement also
|
|
825
|
+
* covers compound names, which is 72 sites that would otherwise each need an inline disable.
|
|
826
|
+
*
|
|
827
|
+
* `ref` is exempt for the same reason: `AsyncEventRef` is the async counterpart of Obsidian's
|
|
828
|
+
* `EventRef`, handed to the same `offref` / `registerEvent` shapes, so the two names have to match
|
|
829
|
+
* to read as a pair.
|
|
830
|
+
*/
|
|
831
|
+
checkProperties: true,
|
|
832
|
+
replacements: {
|
|
833
|
+
/*
|
|
834
|
+
* `attr` / `attrs` are Obsidian's own: `createEl('a', { attr: { ... } })` takes them by those
|
|
835
|
+
* names on `DomElementInfo`, so ours have to match to be passed through. `props` is the
|
|
836
|
+
* universal component vocabulary, exempt for the same reason `params` is.
|
|
837
|
+
*/
|
|
838
|
+
attr: false,
|
|
839
|
+
attrs: false,
|
|
840
|
+
dev: false,
|
|
841
|
+
/*
|
|
842
|
+
* Every `dir` here is a filesystem directory, never a direction, so the rule is narrowed to the
|
|
843
|
+
* one expansion rather than left offering a choice it cannot make.
|
|
844
|
+
*/
|
|
845
|
+
// eslint-disable-next-line unicorn/name-replacements -- This is the rule's own replacement key, which has to be spelled the way the rule reads it.
|
|
846
|
+
dir: {
|
|
847
|
+
direction: false,
|
|
848
|
+
directory: true
|
|
849
|
+
},
|
|
850
|
+
dist: false,
|
|
851
|
+
doc: false,
|
|
852
|
+
docs: false,
|
|
853
|
+
el: false,
|
|
854
|
+
env: false,
|
|
855
|
+
lib: false,
|
|
856
|
+
params: false,
|
|
857
|
+
props: false,
|
|
858
|
+
ref: false,
|
|
859
|
+
refs: false,
|
|
860
|
+
src: false,
|
|
861
|
+
util: false,
|
|
862
|
+
utils: false
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
],
|
|
866
|
+
/*
|
|
867
|
+
* The next six rules all suggest an API newer than this project's `lib` (`ES2022`), so following any of
|
|
868
|
+
* them fails to compile. The Obsidian plugin layer takes the floor from the oldest Obsidian installer that
|
|
869
|
+
* can still run current Obsidian, which records `ecmaScriptVersion: "ES2022"`. Each is off at the config
|
|
870
|
+
* level rather than annotated per site, because none can ever be satisfied while that floor holds. Revisit
|
|
871
|
+
* them together if the floor moves.
|
|
872
|
+
*
|
|
873
|
+
* `Array#toReversed` and `Array#toSorted` are ES2023.
|
|
874
|
+
*/
|
|
875
|
+
"unicorn/no-array-reverse": "off",
|
|
876
|
+
"unicorn/no-array-sort": "off",
|
|
877
|
+
/*
|
|
878
|
+
* `continue` inside a nested loop is ordinary, readable control flow here. The rule's remedy is to
|
|
879
|
+
* extract every such loop into its own function, which spreads one coherent traversal across two
|
|
880
|
+
* declarations without making anything clearer.
|
|
881
|
+
*/
|
|
882
|
+
"unicorn/no-break-in-nested-loop": "off",
|
|
883
|
+
/*
|
|
884
|
+
* The rule cannot see through a hoisted function declaration, so it treats a binding that a nested
|
|
885
|
+
* function already read as unused before the exit. In `runWithTimeout` that is `let isCompleted`, which
|
|
886
|
+
* `run()` and `innerTimeout()` both touch while the `Promise.race` above the exit is still running --
|
|
887
|
+
* moving the declaration past the exit, as the rule asks, would leave those reads in the temporal dead
|
|
888
|
+
* zone. Its own fixer declines all 15 sites for the same reason it cannot prove them safe, so following
|
|
889
|
+
* the rule is entirely manual. What is left after that is placement style: the remaining reports are
|
|
890
|
+
* named constants and derived paths deliberately grouped at the top of a function, and pushing each one
|
|
891
|
+
* below the first guard splits a cohesive block to no benefit. The three sites where deferring skipped
|
|
892
|
+
* real work (a second `computeNeededExposure` walk, a `toJson` serialization, an `ensureLfEndings` pass)
|
|
893
|
+
* were applied by hand instead.
|
|
894
|
+
*/
|
|
895
|
+
"unicorn/no-declarations-before-early-exit": "off",
|
|
896
|
+
/*
|
|
897
|
+
* Assigning onto the global object is how this library installs and restores test doubles, and how a
|
|
898
|
+
* few Obsidian-runtime globals are reached at all. The rule cannot separate that from an accidental
|
|
899
|
+
* global write, and it has no fixer.
|
|
900
|
+
*/
|
|
901
|
+
"unicorn/no-global-object-property-assignment": "off",
|
|
902
|
+
// `null` is load-bearing here: an optional collaborator is modelled as a required `null | X` field rather than an optional `X`, so `null` and `undefined` are not interchangeable.
|
|
903
|
+
/*
|
|
904
|
+
* The rule's list of standard `Symbol` properties predates explicit resource management, so it reports
|
|
905
|
+
* `Symbol.dispose` and `Symbol.asyncDispose` as non-standard. Both are part of the language that this
|
|
906
|
+
* library is built on -- 114 files here use `using` declarations, and the disposable types are a
|
|
907
|
+
* public part of its surface -- so all 59 reports are the rule being out of date rather than a finding.
|
|
908
|
+
*/
|
|
909
|
+
"unicorn/no-nonstandard-builtin-properties": "off",
|
|
910
|
+
"unicorn/no-null": "off",
|
|
911
|
+
/*
|
|
912
|
+
* TypeScript's explicit `this` parameter (`function get(this: Holder) { return this.value; }`) makes
|
|
913
|
+
* `this` outside a class both legal and type-checked, but the rule is syntactic and flags it identically
|
|
914
|
+
* to a genuinely unbound `this`. It has no options (`schema: []`) and no fixer, so there is no way to
|
|
915
|
+
* separate the idiom from the bug it targets. Most hits here were typed `this` parameters and tests that
|
|
916
|
+
* deliberately assert `this` binding.
|
|
917
|
+
*/
|
|
918
|
+
"unicorn/no-this-outside-of-class": "off",
|
|
919
|
+
// Same call as its object counterpart above: the destructuring depth flagged here is deliberate and reads well.
|
|
920
|
+
"unicorn/no-unreadable-array-destructuring": "off",
|
|
921
|
+
/*
|
|
922
|
+
* The reports are all `for (const file of await readdirPosix(...))`, which reads exactly as intended.
|
|
923
|
+
* Hoisting the awaited call into a variable named after the loop's own iterable adds a line and a name
|
|
924
|
+
* without adding information.
|
|
925
|
+
*/
|
|
926
|
+
"unicorn/no-unreadable-for-of-expression": "off",
|
|
927
|
+
/*
|
|
928
|
+
* The nested destructuring this flags is deliberate here and reads well: pulling a member out of a
|
|
929
|
+
* params bag in one step states where the value comes from, which a second intermediate binding only
|
|
930
|
+
* obscures. The rule takes no options, so there is no way to keep the depth limit it is really after
|
|
931
|
+
* while allowing the shape in use.
|
|
932
|
+
*/
|
|
933
|
+
"unicorn/no-unreadable-object-destructuring": "off",
|
|
934
|
+
/*
|
|
935
|
+
* `checkArguments` strips `undefined` arguments, which shifts the remaining positional arguments into
|
|
936
|
+
* the wrong slots; `checkArrowFunctionBody` removes `return undefined;` from arrow bodies whose other
|
|
937
|
+
* branches do return a value, which violates the `noImplicitReturns` setting this project compiles with.
|
|
938
|
+
* The rule's remaining cases (a bare `undefined` initializer, `return undefined;` in a void function)
|
|
939
|
+
* are still worth having.
|
|
940
|
+
*/
|
|
941
|
+
"unicorn/no-useless-undefined": [
|
|
942
|
+
"error",
|
|
943
|
+
{
|
|
944
|
+
checkArguments: false,
|
|
945
|
+
checkArrowFunctionBody: false
|
|
946
|
+
}
|
|
947
|
+
],
|
|
948
|
+
// `Array.fromAsync` is ES2024. See the ES2022 floor note above.
|
|
949
|
+
"unicorn/prefer-array-from-async": "off",
|
|
950
|
+
/*
|
|
951
|
+
* Every hit here is a promise deliberately NOT awaited, and `await` would change what the code does.
|
|
952
|
+
* `result.catch(throwDelayed)` in `async-events.ts` is the fire-and-forget error path the module is
|
|
953
|
+
* built on; the rest hold an unresolved promise and assert the callback has not fired yet, so awaiting
|
|
954
|
+
* would hang the test or invert what it proves. The rule cannot tell a forgotten `await` from an
|
|
955
|
+
* intentional one, and this codebase schedules fire-and-forget work as a core pattern.
|
|
956
|
+
*/
|
|
957
|
+
"unicorn/prefer-await": "off",
|
|
958
|
+
/*
|
|
959
|
+
* All three reports read HTML out (`const html = el.innerHTML`), never write it, and for a read
|
|
960
|
+
* `getHTML()` returns the same string. What it adds is shadow-root serialization options that nothing
|
|
961
|
+
* here asks for, in exchange for a much newer platform floor than `innerHTML` -- a bad trade for a
|
|
962
|
+
* library that has to run on whatever Chromium the installed Obsidian ships. The rule's other half,
|
|
963
|
+
* rewriting writes to the sanitizing `setHTML()`, would be worth having; it just never fires here.
|
|
964
|
+
*/
|
|
965
|
+
"unicorn/prefer-dom-node-html-methods": "off",
|
|
966
|
+
/*
|
|
967
|
+
* Iterator helpers (`Iterator#some` and friends) are ES2025, so this belongs with `no-array-reverse` and
|
|
968
|
+
* `no-array-sort` above: the same ES2022 floor rules it out, and the same note applies -- revisit them
|
|
969
|
+
* together if that floor moves.
|
|
970
|
+
*/
|
|
971
|
+
"unicorn/prefer-iterator-helpers": "off",
|
|
972
|
+
// `Iterator#toArray` is ES2025. See the ES2022 floor note above.
|
|
973
|
+
"unicorn/prefer-iterator-to-array": "off",
|
|
974
|
+
/*
|
|
975
|
+
* The suggested replacement is `Math.trunc(Number(x))`, which is longer than `parseInt(x, 10)` and no
|
|
976
|
+
* clearer, and it is not the same function: `parseInt` stops at the first character that cannot be part
|
|
977
|
+
* of the number, so `'12abc'` parses to 12 where `Number` yields `NaN`. Two of the reports read user
|
|
978
|
+
* input through that difference -- the page-jump box in the Dataview helper, and
|
|
979
|
+
* `NumberComponent.valueFromString`, whose lenient parse is part of a published component's behavior.
|
|
980
|
+
* The rest parse machine-generated strings, where the two agree but the shorter spelling still wins.
|
|
981
|
+
*/
|
|
982
|
+
"unicorn/prefer-number-coercion": "off",
|
|
983
|
+
// `Promise.withResolvers` is ES2024. See the ES2022 floor note above.
|
|
984
|
+
"unicorn/prefer-promise-with-resolvers": "off",
|
|
985
|
+
// `Set#union` and friends are ES2025. See the ES2022 floor note above.
|
|
986
|
+
"unicorn/prefer-set-methods": "off",
|
|
987
|
+
/*
|
|
988
|
+
* The rule ranks operands by syntactic shape, not cost, so every report here swaps one property read
|
|
989
|
+
* ahead of another and buys nothing. Its own message concedes it cannot check the part that matters --
|
|
990
|
+
* "after verifying short-circuit behavior" -- and one report sits directly under a comment recording
|
|
991
|
+
* that the operands change inside a `rename` event handler, which is where order stops being free.
|
|
992
|
+
* The current orders also carry intent: a null guard before the use it guards, and the condition being
|
|
993
|
+
* reported before the state it contradicts.
|
|
994
|
+
*/
|
|
995
|
+
"unicorn/prefer-simple-condition-first": "off",
|
|
996
|
+
/*
|
|
997
|
+
* `URL.canParse` requires Node 18.17, well above the Node 16.16.0 floor that shipped source targets
|
|
998
|
+
* (see the Obsidian plugin layer's `minimumNodeVersion`). The rule can therefore never be satisfied there, so it is off at the
|
|
999
|
+
* config level rather than annotated at each call site.
|
|
1000
|
+
*/
|
|
1001
|
+
"unicorn/prefer-url-can-parse": "off",
|
|
1002
|
+
/*
|
|
1003
|
+
* Every array reported here holds strings, where the default sort is already well defined and correct.
|
|
1004
|
+
* Adding the comparator the rule asks for would mean choosing between code-unit and locale ordering,
|
|
1005
|
+
* so following it would CHANGE the sort rather than document it. The rule earns its place on numeric
|
|
1006
|
+
* arrays; it does not have any here.
|
|
1007
|
+
*/
|
|
1008
|
+
"unicorn/require-array-sort-compare": "off",
|
|
1009
|
+
// The codebase already spells encodings the way the Encoding Standard does (`utf-8`), which is also what `TextDecoder` reports. Keep the rule enforcing consistency, just in the direction already in use.
|
|
1010
|
+
"unicorn/text-encoding-identifier-case": [
|
|
1011
|
+
"error",
|
|
1012
|
+
{
|
|
1013
|
+
withDash: true
|
|
1014
|
+
}
|
|
1015
|
+
]
|
|
1016
|
+
}
|
|
1017
|
+
},
|
|
1018
|
+
{
|
|
1019
|
+
// Build/lint/version scripts are CLI entry points, where exiting with a status code is the interface.
|
|
1020
|
+
files: context.scriptFiles,
|
|
1021
|
+
rules: {
|
|
1022
|
+
"unicorn/no-process-exit": "off"
|
|
1023
|
+
}
|
|
1024
|
+
},
|
|
1025
|
+
{
|
|
1026
|
+
/*
|
|
1027
|
+
* A module-level fixture assigned from `beforeEach` is the standard test shape:
|
|
1028
|
+
*
|
|
1029
|
+
* let app: App;
|
|
1030
|
+
* beforeEach(() => { app = App.createConfigured__(); });
|
|
1031
|
+
*
|
|
1032
|
+
* The rule is right about production code -- module state reassigned from inside a function is worth
|
|
1033
|
+
* flagging, and the fix is to hold it in a `const` object instead. In tests that would replace every
|
|
1034
|
+
* `app` with `STATE.app` and make each file read worse for no gain, since the fixture is reset per test
|
|
1035
|
+
* by design. Scoped off here rather than disabled outright, so production code keeps the check.
|
|
1036
|
+
*/
|
|
1037
|
+
files: context.testFiles,
|
|
1038
|
+
rules: {
|
|
1039
|
+
/*
|
|
1040
|
+
* Two shapes here cannot follow the advice. A helper defined inside an `evalInObsidian` callback
|
|
1041
|
+
* cannot be hoisted at all: the callback is serialized with `toString()` and runs inside Obsidian, so
|
|
1042
|
+
* anything left behind in the module scope is simply not there. And a per-suite factory
|
|
1043
|
+
* (`createComponent`, `createMockPlugin`) is deliberately local, keeping each suite's fixture next to
|
|
1044
|
+
* the assertions that read it. Production code keeps the check.
|
|
1045
|
+
*/
|
|
1046
|
+
"unicorn/consistent-function-scoping": "off",
|
|
1047
|
+
/*
|
|
1048
|
+
* A test binding is named after the thing it captures, not after what it does: `createElementSpy`
|
|
1049
|
+
* holds the spy on `createElement`, and `createProgramOptions` holds the options `createProgram` was
|
|
1050
|
+
* called with. The verb belongs to the name being referenced, so the rule reads it as a function name
|
|
1051
|
+
* that is not a function. Left on for production code, where the complaint is the right one.
|
|
1052
|
+
*/
|
|
1053
|
+
"unicorn/no-non-function-verb-prefix": "off",
|
|
1054
|
+
"unicorn/no-top-level-assignment-in-function": "off"
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
]);
|
|
1058
|
+
}
|
|
1059
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
1060
|
+
0 && (module.exports = {
|
|
1061
|
+
EslintConfigContext,
|
|
1062
|
+
createDefaultEslintConfigContext,
|
|
1063
|
+
defineEslintConfigs,
|
|
1064
|
+
getEslintCoreConfigs,
|
|
1065
|
+
getGlobalIgnoreConfigs,
|
|
1066
|
+
getTypeScriptEslintConfigs
|
|
1067
|
+
});
|
|
1068
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2xpbnRlcnMvZXNsaW50LWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBnZW5lcmljIGhhbGYgb2YgdGhlIHNoYXJlZCBFU0xpbnQgY29uZmlndXJhdGlvbiwgZm9yIGFueSBUeXBlU2NyaXB0IHByb2plY3QuXG4gKlxuICogSXQgaW50ZWdyYXRlcyBFU0xpbnQncyBvd24gcmVjb21tZW5kZWQgcnVsZXMsIGB0eXBlc2NyaXB0LWVzbGludGAsIGBAc3R5bGlzdGljL2VzbGludC1wbHVnaW5gLFxuICogYGVzbGludC1wbHVnaW4taW1wb3J0LXhgIHdpdGggaXRzIFR5cGVTY3JpcHQgcmVzb2x2ZXIsIGBlc2xpbnQtcGx1Z2luLXBlcmZlY3Rpb25pc3RgLCBgZXNsaW50LXBsdWdpbi11bmljb3JuYCxcbiAqIGBlc2xpbnQtcGx1Z2luLW5gIGFuZCB0aGUgZ2VuZXJpYyBpbi1ob3VzZSBydWxlcy4gQSBwcm9qZWN0LXR5cGUgbGF5ZXIgKHRoZSBPYnNpZGlhbiBwbHVnaW4gb25lIGxpdmVzIGluXG4gKiBgQG1uYW91bW92L29ic2lkaWFuLWRldi10b29sa2l0YCkgYnVpbGRzIG9uIHtAbGluayBnZXRUeXBlU2NyaXB0RXNsaW50Q29uZmlnc30gYW5kIGFkZHMgb25seSB3aGF0IGlzIHNwZWNpZmljIHRvIGl0LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBEZWNsYXJhdGl2ZSBFU0xpbnQgcnVsZS9wbHVnaW4gY29uZmlndXJhdGlvbjsgY29ycmVjdG5lc3MgaXMgdmVyaWZpZWQgYnkgcnVubmluZyBFU0xpbnQsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEVTTGludCxcbiAgTGludGVyXG59IGZyb20gJ2VzbGludCc7XG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLW1hZ2ljLW51bWJlcnMgLS0gV2UgZGlzYWJsZWQgbWFnaWMgbnVtYmVycyBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgYWxsIG92ZXIgdGhlIGNvbmZpZ3MuICovXG5pbXBvcnQgY29tbWVudHNDb25maWdzIGZyb20gJ0Blc2xpbnQtY29tbXVuaXR5L2VzbGludC1wbHVnaW4tZXNsaW50LWNvbW1lbnRzL2NvbmZpZ3MnO1xuaW1wb3J0IHsgaW5jbHVkZUlnbm9yZUZpbGUgfSBmcm9tICdAZXNsaW50L2NvbmZpZy1oZWxwZXJzJztcbmltcG9ydCBlc2xpbnQgZnJvbSAnQGVzbGludC9qcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLXJlbmFtZS1kZWZhdWx0IC0tIFRoZSBkZWZhdWx0IGV4cG9ydCBuYW1lIGBwbHVnaW5gIGlzIHRvbyBjb25mdXNpbmcuXG5pbXBvcnQgc3R5bGlzdGljIGZyb20gJ0BzdHlsaXN0aWMvZXNsaW50LXBsdWdpbic7XG5pbXBvcnQgeyBjcmVhdGVUeXBlU2NyaXB0SW1wb3J0UmVzb2x2ZXIgfSBmcm9tICdlc2xpbnQtaW1wb3J0LXJlc29sdmVyLXR5cGVzY3JpcHQnO1xuaW1wb3J0IHsgZmxhdENvbmZpZ3MgYXMgZXNsaW50UGx1Z2luSW1wb3J0WEZsYXRDb25maWdzIH0gZnJvbSAnZXNsaW50LXBsdWdpbi1pbXBvcnQteCc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0LXgvbm8tcmVuYW1lLWRlZmF1bHQgLS0gVGhlIGRlZmF1bHQgZXhwb3J0IG5hbWUgYF9kZWZhdWx0YCBpcyB0b28gY29uZnVzaW5nLlxuaW1wb3J0IG5vZGVQbHVnaW4gZnJvbSAnZXNsaW50LXBsdWdpbi1uJztcbmltcG9ydCB7IGNvbmZpZ3MgYXMgcGVyZmVjdGlvbmlzdENvbmZpZ3MgfSBmcm9tICdlc2xpbnQtcGx1Z2luLXBlcmZlY3Rpb25pc3QnO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLXJlbmFtZS1kZWZhdWx0IC0tIFRoZSBkZWZhdWx0IGV4cG9ydCBuYW1lIGBpbmRleGAgaXMgdG9vIGNvbmZ1c2luZy5cbmltcG9ydCB1bmljb3JuIGZyb20gJ2VzbGludC1wbHVnaW4tdW5pY29ybic7XG5pbXBvcnQge1xuICBkZWZpbmVDb25maWcsXG4gIGdsb2JhbElnbm9yZXNcbn0gZnJvbSAnZXNsaW50L2NvbmZpZyc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0LXgvbm8tcmVuYW1lLWRlZmF1bHQgLS0gVGhlIGRlZmF1bHQgZXhwb3J0IG5hbWUgYF9kZWZhdWx0YCBpcyB0b28gY29uZnVzaW5nLlxuaW1wb3J0IHRzZXNsaW50IGZyb20gJ3R5cGVzY3JpcHQtZXNsaW50JztcblxuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi4vcmVwby1wYXRocy50cyc7XG5pbXBvcnQgeyBnZXRSb290Rm9sZGVyIH0gZnJvbSAnLi4vcm9vdC50cyc7XG5pbXBvcnQgeyBub1Jlc3RyaWN0ZWRTeW50YXhSdWxlRW50cmllcyB9IGZyb20gJy4vZXNsaW50LW5vLXJlc3RyaWN0ZWQtc3ludGF4LnRzJztcbmltcG9ydCB7XG4gIElOX0hPVVNFX0VTTElOVF9QTFVHSU5fTkFNRSxcbiAgaW5Ib3VzZUVzbGludFBsdWdpblxufSBmcm9tICcuL2VzbGludC1ydWxlcy9pbi1ob3VzZS1wbHVnaW4udHMnO1xuaW1wb3J0IHsgQ0xBVURFX1dPUktUUkVFU19JR05PUkVfR0xPQiB9IGZyb20gJy4vbGludC1pZ25vcmVzLnRzJztcblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3IgZGVmaW5pbmcgRVNMaW50IGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZmluZUVzbGludENvbmZpZ3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCBidWlsZHMgY3VzdG9tIEVTTGludCBjb25maWd1cmF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgRVNMaW50IGNvbmZpZ3VyYXRpb24gY29udGV4dC5cbiAgICogQHJldHVybnMgVGhlIGN1c3RvbSBFU0xpbnQgY29uZmlndXJhdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21Db25maWdzPzogKGNvbnRleHQ6IEVzbGludENvbmZpZ0NvbnRleHQpID0+IExpbnRlci5Db25maWdbXTtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGVkaXRzIHRoZSBFU0xpbnQgY29uZmlndXJhdGlvbiBjb250ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSBFU0xpbnQgY29uZmlndXJhdGlvbiBjb250ZXh0LlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdENvbnRleHQ/OiAoY29udGV4dDogRXNsaW50Q29uZmlnQ29udGV4dCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIG9sZGVzdCBOb2RlIHZlcnNpb24gc2hpcHBlZCBzb3VyY2UgaGFzIHRvIHJ1biBvbiwgYXMgYSBzZW12ZXIgcmFuZ2U6IGEgbGlicmFyeSB0aGF0IGFsc28gcnVucyBpbnNpZGUgYW5cbiAgICogb2xkZXIgcnVudGltZSB0aGFuIGl0cyBvd24gdG9vbGluZyAoYW4gT2JzaWRpYW4gcmVuZGVyZXIsIHNheSkgbmFtZXMgdGhhdCBydW50aW1lJ3MgTm9kZSBoZXJlLiBXaGVuIG9taXR0ZWQsXG4gICAqIGBlc2xpbnQtcGx1Z2luLW5gIHJlYWRzIHRoZSBgZW5naW5lc2AgZmllbGQgb2YgdGhlIHByb2plY3QncyBgcGFja2FnZS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1Ob2RlVmVyc2lvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldFR5cGVTY3JpcHRFc2xpbnRDb25maWdzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRUeXBlU2NyaXB0RXNsaW50Q29uZmlnc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgRVNMaW50IGNvbmZpZ3VyYXRpb24gY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IEVzbGludENvbmZpZ0NvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gcmVnaXN0ZXJlZCB1bmRlciB0aGUgaW4taG91c2UgbmFtZXNwYWNlLiBBIHByb2plY3QtdHlwZSBsYXllciB0aGF0IGFkZHMgaW4taG91c2UgcnVsZXMgb2YgaXRzIG93blxuICAgKiBwYXNzZXMgT05FIHBsdWdpbiBjYXJyeWluZyB0aGUgZ2VuZXJpYyBydWxlcyBhbmQgaXRzIG93biwgYmVjYXVzZSBFU0xpbnQgcmVmdXNlcyB0d28gcGx1Z2lucyB1bmRlciBvbmUgbmFtZXNwYWNlLlxuICAgKiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luIGNhcnJ5aW5nIHRoZSBnZW5lcmljIHJ1bGVzIGFsb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5Ib3VzZVBsdWdpbj86IEVTTGludC5QbHVnaW47XG5cbiAgLyoqXG4gICAqIFRoZSBvbGRlc3QgTm9kZSB2ZXJzaW9uIHNoaXBwZWQgc291cmNlIGhhcyB0byBydW4gb24sIGFzIGEgc2VtdmVyIHJhbmdlLiBXaGVuIG9taXR0ZWQsIGBlc2xpbnQtcGx1Z2luLW5gIHJlYWRzXG4gICAqIHRoZSBgZW5naW5lc2AgZmllbGQgb2YgdGhlIHByb2plY3QncyBgcGFja2FnZS5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IG1pbmltdW1Ob2RlVmVyc2lvbj86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldEluSG91c2VQbHVnaW5Db25maWdzUGFyYW1zIHtcbiAgcmVhZG9ubHkgY29udGV4dDogRXNsaW50Q29uZmlnQ29udGV4dDtcbiAgcmVhZG9ubHkgaW5Ib3VzZVBsdWdpbjogRVNMaW50LlBsdWdpbjtcbn1cblxuaW50ZXJmYWNlIEdldE5vZGVDb21wYXRDb25maWdzUGFyYW1zIHtcbiAgcmVhZG9ubHkgY29udGV4dDogRXNsaW50Q29uZmlnQ29udGV4dDtcbiAgcmVhZG9ubHkgbWluaW11bU5vZGVWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGNvbnRleHQgZm9yIGRlZmluaW5nIEVTTGludCBjb25maWd1cmF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEVzbGludENvbmZpZ0NvbnRleHQge1xuICAvKipcbiAgICogVGhlIHJvb3QgY29uZmlndXJhdGlvbiBmaWxlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb290Q29uZmlnRmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBzY3JpcHQgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2NyaXB0RmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc291cmNlRmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBmb2xkZXJzIGhvbGRpbmcgdGhlIHByb2plY3QncyBzb3VyY2VzLCBieSBkZWZhdWx0IGBzcmNgIGFsb25lLiBBIHdvcmtzcGFjZSB3aG9zZSBwYWNrYWdlcyBlYWNoIGhhdmUgdGhlaXIgb3duXG4gICAqIGBzcmNgIGFkZHMgdGhlbSBoZXJlLCBzbyB0aGUgcnVsZXMga2V5ZWQgb24gYSBmaWxlJ3MgbmFtZSBpbnNpZGUgYSBzb3VyY2UgZm9sZGVyIHJlYWNoIHRob3NlIHBhY2thZ2VzIHRvby5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2VGb2xkZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVzdCBmaWxlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0ZXN0RmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBhbGwgZmlsZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBhbGwgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgYWxsRmlsZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4udGhpcy50ZXN0RmlsZXMsIC4uLnRoaXMuc2NyaXB0RmlsZXMsIC4uLnRoaXMucm9vdENvbmZpZ0ZpbGVzLCAuLi50aGlzLnNvdXJjZUZpbGVzXTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGNvbnRleHQgb2YgYSBwcm9qZWN0IGxhaWQgb3V0IHRoZSBjb252ZW50aW9uYWwgd2F5OiBzb3VyY2VzIHVuZGVyIGBzcmNgLCBzY3JpcHRzIHVuZGVyIGBzY3JpcHRzYCwgdGVzdHNcbiAqIGJlc2lkZSB0aGUgc291cmNlcyBvciB1bmRlciBgX190ZXN0c19fYCwgYW5kIHRoZSBjb21taXRsaW50LCBFU0xpbnQgYW5kIFZpdGVzdCBjb25maWd1cmF0aW9ucyBhdCB0aGUgcm9vdC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRFc2xpbnRDb25maWdDb250ZXh0KCk6IEVzbGludENvbmZpZ0NvbnRleHQge1xuICBjb25zdCBjb250ZXh0ID0gbmV3IEVzbGludENvbmZpZ0NvbnRleHQoKTtcbiAgY29udGV4dC5zb3VyY2VGb2xkZXJzLnB1c2goUmVwb1BhdGhzLlNyYyk7XG4gIGNvbnRleHQucm9vdENvbmZpZ0ZpbGVzLnB1c2goXG4gICAgUmVwb1BhdGhzLkNvbW1pdGxpbnRDb25maWdUcyxcbiAgICBSZXBvUGF0aHMuRXNsaW50Q29uZmlnTXRzLFxuICAgIFJlcG9QYXRocy5WaXRlc3RDb25maWdUc1xuICApO1xuICBjb250ZXh0LnNjcmlwdEZpbGVzLnB1c2goXG4gICAgam9pbihSZXBvUGF0aHMuU2NyaXB0cywgUmVwb1BhdGhzLkFueVBhdGgsIFJlcG9QYXRocy5BbnlUcylcbiAgKTtcbiAgY29udGV4dC5zb3VyY2VGaWxlcy5wdXNoKFxuICAgIGpvaW4oUmVwb1BhdGhzLlNyYywgUmVwb1BhdGhzLkFueVBhdGgsIFJlcG9QYXRocy5BbnlUcyksXG4gICAgam9pbihSZXBvUGF0aHMuU3JjLCBSZXBvUGF0aHMuQW55UGF0aCwgUmVwb1BhdGhzLkFueVRzeClcbiAgKTtcbiAgY29udGV4dC50ZXN0RmlsZXMucHVzaChcbiAgICBqb2luKFJlcG9QYXRocy5UZXN0cywgUmVwb1BhdGhzLkFueVBhdGgsIFJlcG9QYXRocy5BbnlUcyksXG4gICAgam9pbihSZXBvUGF0aHMuTW9ja3MsIFJlcG9QYXRocy5BbnlQYXRoLCBSZXBvUGF0aHMuQW55VHMpLFxuICAgIGpvaW4oUmVwb1BhdGhzLlNyYywgUmVwb1BhdGhzLkFueVBhdGgsIFJlcG9QYXRocy5BbnlUZXN0VHMpLFxuICAgIC8qXG4gICAgICogQSBidWlsZC1zY3JpcHQgdGVzdCBpcyBhIFRFU1QsIGFuZCB0aGlzIGNvbnZlbnRpb24gcHV0cyBpdCBpbiBhIGAqLnRlc3QudHNgIHVuZGVyIGBzY3JpcHRzL2AgLS0gYmVzaWRlIHRoZVxuICAgICAqIHNjcmlwdCBpdCBjb3ZlcnMgcmF0aGVyIHRoYW4gdW5kZXIgYHNyYy9gLiBXaXRob3V0IHRoaXMgZ2xvYiBpdCBtYXRjaGVkIGBzY3JpcHRGaWxlc2AgYWxvbmUsIHNvIGV2ZXJ5IHJlbGF4YXRpb25cbiAgICAgKiB0aGF0IGtleXMgb24gYGNvbnRleHQudGVzdEZpbGVzYCBtaXNzZWQgaXQ6IGBuby1tYWdpYy1udW1iZXJzYCBmaXJlZCBvbiBhIHN1aXRlIHdob3NlIHdob2xlIHN1YmplY3QgaXMgcmVjb3JkZWRcbiAgICAgKiBudW1iZXJzLCBhbmQgYHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nYCBvbiB0aGUgcGVyLXN1aXRlIGZpeHR1cmUgZmFjdG9yaWVzIHRoZSBibG9jayBhdCB0aGUgYm90dG9tXG4gICAgICogb2YgYGdldFVuaWNvcm5Db25maWdzYCBzYXlzIHRlc3RzIGV4aXN0IHRvIGFsbG93LlxuICAgICAqXG4gICAgICogVGhlIGZpbGUgbm93IG1hdGNoZXMgQk9USCBsaXN0cywgYW5kIHRoYXQgaXMgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhbiBvdmVybGFwIHRvIHJlc29sdmU6IGV2ZXJ5dGhpbmcgc2NvcGVkIHRvXG4gICAgICogYGNvbnRleHQuc2NyaXB0RmlsZXNgIG9ubHkgdHVybnMgcnVsZXMgT0ZGIChgaW1wb3J0LXgvbm8tbm9kZWpzLW1vZHVsZXNgLCBgdW5pY29ybi9uby1wcm9jZXNzLWV4aXRgKSwgYm90aCBvZlxuICAgICAqIHdoaWNoIGEgc2NyaXB0IHRlc3Qgd2FudHMgYXMgbXVjaCBhcyB0aGUgc2NyaXB0IGRvZXMsIHNvIHRoZSB0d28gc2V0cyBjb21wb3NlIGluc3RlYWQgb2YgY29tcGV0aW5nLiBLZWVwIGl0IHRoYXRcbiAgICAgKiB3YXkgLS0gYSBydWxlIHR1cm5lZCBPTiBmb3IgYHNjcmlwdEZpbGVzYCB3b3VsZCBsYW5kIG9uIHRoZXNlIGZpbGVzIHRvbywgYW5kIGZsYXQtY29uZmlnIG9yZGVyLCBub3QgaW50ZW50LFxuICAgICAqIHdvdWxkIGRlY2lkZSB3aGljaCBzaWRlIHdvbi5cbiAgICAgKi9cbiAgICBqb2luKFJlcG9QYXRocy5TY3JpcHRzLCBSZXBvUGF0aHMuQW55UGF0aCwgUmVwb1BhdGhzLkFueVRlc3RUcylcbiAgKTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBFU0xpbnQgY29uZmlndXJhdGlvbnMgb2YgYSBnZW5lcmljIFR5cGVTY3JpcHQgcHJvamVjdC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBkZWZpbmluZyBFU0xpbnQgY29uZmlndXJhdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgRVNMaW50IGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRXNsaW50Q29uZmlncyhvcHRpb25zOiBEZWZpbmVFc2xpbnRDb25maWdzT3B0aW9ucyA9IHt9KTogTGludGVyLkNvbmZpZ1tdIHtcbiAgY29uc3QgY29udGV4dCA9IGNyZWF0ZURlZmF1bHRFc2xpbnRDb25maWdDb250ZXh0KCk7XG4gIG9wdGlvbnMuZWRpdENvbnRleHQ/Lihjb250ZXh0KTtcbiAgY29uc3QgY3VzdG9tQ29uZmlncyA9IG9wdGlvbnMuY3VzdG9tQ29uZmlncz8uKGNvbnRleHQpID8/IFtdO1xuXG4gIHJldHVybiBkZWZpbmVDb25maWcoXG4gICAgLi4uZ2V0R2xvYmFsSWdub3JlQ29uZmlncygpLFxuICAgIC4uLmdldFR5cGVTY3JpcHRFc2xpbnRDb25maWdzKHtcbiAgICAgIGNvbnRleHQsXG4gICAgICAuLi4ob3B0aW9ucy5taW5pbXVtTm9kZVZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiB7IG1pbmltdW1Ob2RlVmVyc2lvbjogb3B0aW9ucy5taW5pbXVtTm9kZVZlcnNpb24gfSlcbiAgICB9KSxcbiAgICAuLi5jdXN0b21Db25maWdzXG4gICk7XG59XG5cbi8qKlxuICogVGhlIGNvbmZpZ3VyYXRpb25zIG9mIEVTTGludCdzIG93biBydWxlcy4gQSBwcm9qZWN0LXR5cGUgbGF5ZXIgcmVhZHMgaXQgdG8gbGVhcm4gd2hpY2ggY29yZSBydWxlcyB0aGlzXG4gKiBjb25maWd1cmF0aW9uIHNldHMgaXRzZWxmLlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIEVTTGludCBjb25maWd1cmF0aW9uIGNvbnRleHQuXG4gKiBAcmV0dXJucyBUaGUgY29uZmlndXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFc2xpbnRDb3JlQ29uZmlncyhjb250ZXh0OiBFc2xpbnRDb25maWdDb250ZXh0KTogTGludGVyLkNvbmZpZ1tdIHtcbiAgcmV0dXJuIGRlZmluZUNvbmZpZyhbXG4gICAge1xuICAgICAgZXh0ZW5kczogW2VzbGludC5jb25maWdzLnJlY29tbWVuZGVkXSxcbiAgICAgIGZpbGVzOiBjb250ZXh0LmFsbEZpbGVzKCksXG4gICAgICBydWxlczoge1xuICAgICAgICAnYWNjZXNzb3ItcGFpcnMnOiAnZXJyb3InLFxuICAgICAgICAnYXJyYXktY2FsbGJhY2stcmV0dXJuJzogJ2Vycm9yJyxcbiAgICAgICAgJ2NhbWVsY2FzZSc6ICdlcnJvcicsXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRoZSBydWxlIHJlcG9ydHMgcGVyIGNvbW1lbnQgVE9LRU4sIHNvIGV2ZXJ5IGNvbnRpbnVhdGlvbiBsaW5lIG9mIGEgd3JhcHBlZCBgLy9gIGNvbW1lbnQgaXMgaXRzIG93biB0b2tlblxuICAgICAgICAgKiB0aGF0IHdvdWxkIGhhdmUgdG8gc3RhcnQgd2l0aCBhIGNhcGl0YWwgXHUyMDE0IHdoaWNoIGlzIGhvdyBwcm9zZSBlbmRzIHVwIHdpdGggY2FwaXRhbHMgbWlkLXNlbnRlbmNlLlxuICAgICAgICAgKiBgaWdub3JlQ29uc2VjdXRpdmVDb21tZW50c2AgZXhlbXB0cyBhIGxpbmUgY29tbWVudCB0aGF0IGRpcmVjdGx5IGZvbGxvd3MgYW5vdGhlciBvbmUsIHdoaWNoIGlzIGV4YWN0bHkgdGhlXG4gICAgICAgICAqIHNoYXBlIG9mIGEgd3JhcHBlZCBibG9jaywgd2hpbGUgc3RpbGwgaG9sZGluZyBpdHMgRklSU1QgbGluZSB0byBhIGNhcGl0YWwuIEJsb2NrIGNvbW1lbnRzIG5lZWQgbm8gc3VjaFxuICAgICAgICAgKiBvcHRpb246IGEgYmxvY2sgY29tbWVudCBpcyBhIHNpbmdsZSB0b2tlbiBob3dldmVyIG1hbnkgbGluZXMgaXQgc3BhbnMuXG4gICAgICAgICAqIGBpZ25vcmVQYXR0ZXJuYCBjb3ZlcnMgdGhlIGhhbGYgdGhhdCBsZWF2ZXMgYmVoaW5kOiBhIGNvbW1lbnQgd2hvc2UgRklSU1Qgd29yZCBpcyBhIGNhbWVsQ2FzZSBpZGVudGlmaWVyIGlzXG4gICAgICAgICAqIGV4ZW1wdCwgc28gYSBjb21tZW50IHRoYXQgb3BlbnMgYnkgbmFtaW5nIGEgc3ltYm9sIGtlZXBzIHRoZSBuYW1lIGEgcmVhZGVyIGNhbiBncmVwIGluc3RlYWQgb2YgYSBQYXNjYWxDYXNlXG4gICAgICAgICAqIG9uZSB0aGF0IGV4aXN0cyBub3doZXJlLiBUaGUgcnVsZSBhbmNob3JzIHRoZSBwYXR0ZXJuIGF0IHRoZSBzdGFydCBvZiB0aGUgY29tbWVudCBhbmQgYFthLXpBLVowLTldYCBtYXRjaGVzXG4gICAgICAgICAqIG5vIHdoaXRlc3BhY2UsIHNvIGl0IGNhbiBvbmx5IGV2ZXIgbWF0Y2ggdGhhdCBmaXJzdCB3b3JkIFx1MjAxNCBvcmRpbmFyeSBsb3dlcmNhc2UgcHJvc2Ugc3RheXMgcmVwb3J0ZWQuIEJvdGhcbiAgICAgICAgICogb3B0aW9uIGJhZ3MgbmVlZCBpdCwgYW5kIGBibG9ja2Aga2VlcHMgaXRzIGB2OGAgZXhlbXB0aW9uIGJ5IGFsdGVybmF0aW9uIHJhdGhlciB0aGFuIGxvc2luZyBpdC5cbiAgICAgICAgICovXG4gICAgICAgICdjYXBpdGFsaXplZC1jb21tZW50cyc6IFtcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICdhbHdheXMnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJsb2NrOiB7IGlnbm9yZVBhdHRlcm46ICd2OHxbYS16XVthLXpBLVowLTldKltBLVpdJyB9LFxuICAgICAgICAgICAgbGluZTogeyBpZ25vcmVDb25zZWN1dGl2ZUNvbW1lbnRzOiB0cnVlLCBpZ25vcmVQYXR0ZXJuOiAnW2Etel1bYS16QS1aMC05XSpbQS1aXScgfVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgJ2NvbXBsZXhpdHknOiAnZXJyb3InLFxuICAgICAgICAnY29uc2lzdGVudC10aGlzJzogJ2Vycm9yJyxcbiAgICAgICAgJ2N1cmx5JzogJ2Vycm9yJyxcbiAgICAgICAgJ2RlZmF1bHQtY2FzZSc6ICdlcnJvcicsXG4gICAgICAgICdkZWZhdWx0LWNhc2UtbGFzdCc6ICdlcnJvcicsXG4gICAgICAgICdkZWZhdWx0LXBhcmFtLWxhc3QnOiAnZXJyb3InLFxuICAgICAgICAnZXFlcWVxJzogJ2Vycm9yJyxcbiAgICAgICAgJ2Z1bmMtbmFtZS1tYXRjaGluZyc6ICdlcnJvcicsXG4gICAgICAgICdmdW5jLW5hbWVzJzogJ2Vycm9yJyxcbiAgICAgICAgJ2Z1bmMtc3R5bGUnOiBbXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAnZGVjbGFyYXRpb24nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFsbG93QXJyb3dGdW5jdGlvbnM6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICAnZ3JvdXBlZC1hY2Nlc3Nvci1wYWlycyc6IFtcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICdnZXRCZWZvcmVTZXQnXG4gICAgICAgIF0sXG4gICAgICAgICdndWFyZC1mb3ItaW4nOiAnZXJyb3InLFxuICAgICAgICAnbm8tYWxlcnQnOiAnZXJyb3InLFxuICAgICAgICAnbm8tYXJyYXktY29uc3RydWN0b3InOiAnZXJyb3InLFxuICAgICAgICAnbm8tYml0d2lzZSc6ICdlcnJvcicsXG4gICAgICAgICduby1jYWxsZXInOiAnZXJyb3InLFxuICAgICAgICAnbm8tY29uc29sZSc6IFtcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFsbG93OiBbXG4gICAgICAgICAgICAgICd3YXJuJyxcbiAgICAgICAgICAgICAgJ2Vycm9yJ1xuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgJ25vLWNvbnN0cnVjdG9yLXJldHVybic6ICdlcnJvcicsXG4gICAgICAgICduby1kaXYtcmVnZXgnOiAnZXJyb3InLFxuICAgICAgICAnbm8tZWxzZS1yZXR1cm4nOiBbXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbGxvd0Vsc2VJZjogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgICduby1lbXB0eS1mdW5jdGlvbic6ICdlcnJvcicsXG4gICAgICAgICduby1leHRlbmQtbmF0aXZlJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLWV4dHJhLWJpbmQnOiAnZXJyb3InLFxuICAgICAgICAnbm8tZXh0cmEtbGFiZWwnOiAnZXJyb3InLFxuICAgICAgICAnbm8taW1wbGljaXQtY29lcmNpb24nOiBbXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbGxvdzogW1xuICAgICAgICAgICAgICAnISEnXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICAnbm8taW1wbGllZC1ldmFsJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLWlubmVyLWRlY2xhcmF0aW9ucyc6ICdlcnJvcicsXG4gICAgICAgICduby1pdGVyYXRvcic6ICdlcnJvcicsXG4gICAgICAgICduby1sYWJlbC12YXInOiAnZXJyb3InLFxuICAgICAgICAnbm8tbGFiZWxzJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLWxvbmUtYmxvY2tzJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLWxvbmVseS1pZic6ICdlcnJvcicsXG4gICAgICAgICduby1sb29wLWZ1bmMnOiAnZXJyb3InLFxuICAgICAgICAnbm8tbWFnaWMtbnVtYmVycyc6IFtcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRldGVjdE9iamVjdHM6IHRydWUsXG4gICAgICAgICAgICBlbmZvcmNlQ29uc3Q6IHRydWUsXG4gICAgICAgICAgICBpZ25vcmU6IFtcbiAgICAgICAgICAgICAgLTEsXG4gICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgIDFcbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgICduby1tdWx0aS1hc3NpZ24nOiAnZXJyb3InLFxuICAgICAgICAnbm8tbXVsdGktc3RyJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLW5lZ2F0ZWQtY29uZGl0aW9uJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLW5lc3RlZC10ZXJuYXJ5JzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLW5ldy1mdW5jJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLW5ldy13cmFwcGVycyc6ICdlcnJvcicsXG4gICAgICAgICduby1vYmplY3QtY29uc3RydWN0b3InOiAnZXJyb3InLFxuICAgICAgICAnbm8tb2N0YWwtZXNjYXBlJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLXByb21pc2UtZXhlY3V0b3ItcmV0dXJuJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLXByb3RvJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLXJlc3RyaWN0ZWQtc3ludGF4JzogW1xuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgLi4ubm9SZXN0cmljdGVkU3ludGF4UnVsZUVudHJpZXNcbiAgICAgICAgXSxcbiAgICAgICAgJ25vLXJldHVybi1hc3NpZ24nOiAnZXJyb3InLFxuICAgICAgICAnbm8tc2NyaXB0LXVybCc6ICdlcnJvcicsXG4gICAgICAgICduby1zZWxmLWNvbXBhcmUnOiAnZXJyb3InLFxuICAgICAgICAnbm8tc2VxdWVuY2VzJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLXNoYWRvdyc6ICdlcnJvcicsXG4gICAgICAgICduby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcnOiAnZXJyb3InLFxuICAgICAgICAnbm8tdGhyb3ctbGl0ZXJhbCc6ICdlcnJvcicsXG4gICAgICAgICduby11bm1vZGlmaWVkLWxvb3AtY29uZGl0aW9uJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLXVubmVlZGVkLXRlcm5hcnknOiAnZXJyb3InLFxuICAgICAgICAnbm8tdW5yZWFjaGFibGUtbG9vcCc6ICdlcnJvcicsXG4gICAgICAgICduby11bnVzZWQtZXhwcmVzc2lvbnMnOiAnZXJyb3InLFxuICAgICAgICAnbm8tdXNlbGVzcy1hc3NpZ25tZW50JzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLXVzZWxlc3MtY2FsbCc6ICdlcnJvcicsXG4gICAgICAgICduby11c2VsZXNzLWNvbXB1dGVkLWtleSc6ICdlcnJvcicsXG4gICAgICAgICduby11c2VsZXNzLWNvbmNhdCc6ICdlcnJvcicsXG4gICAgICAgICduby11c2VsZXNzLWNvbnN0cnVjdG9yJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLXVzZWxlc3MtcmVuYW1lJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLXVzZWxlc3MtcmV0dXJuJzogJ2Vycm9yJyxcbiAgICAgICAgJ25vLXZhcic6ICdlcnJvcicsXG4gICAgICAgICduby12b2lkJzogJ2Vycm9yJyxcbiAgICAgICAgJ29iamVjdC1zaG9ydGhhbmQnOiAnZXJyb3InLFxuICAgICAgICAnb3BlcmF0b3ItYXNzaWdubWVudCc6ICdlcnJvcicsXG4gICAgICAgICdwcmVmZXItYXJyb3ctY2FsbGJhY2snOiAnZXJyb3InLFxuICAgICAgICAncHJlZmVyLWNvbnN0JzogJ2Vycm9yJyxcbiAgICAgICAgJ3ByZWZlci1leHBvbmVudGlhdGlvbi1vcGVyYXRvcic6ICdlcnJvcicsXG4gICAgICAgICdwcmVmZXItbmFtZWQtY2FwdHVyZS1ncm91cCc6ICdlcnJvcicsXG4gICAgICAgICdwcmVmZXItbnVtZXJpYy1saXRlcmFscyc6ICdlcnJvcicsXG4gICAgICAgICdwcmVmZXItb2JqZWN0LWhhcy1vd24nOiAnZXJyb3InLFxuICAgICAgICAncHJlZmVyLW9iamVjdC1zcHJlYWQnOiAnZXJyb3InLFxuICAgICAgICAncHJlZmVyLXByb21pc2UtcmVqZWN0LWVycm9ycyc6ICdlcnJvcicsXG4gICAgICAgICdwcmVmZXItcmVnZXgtbGl0ZXJhbHMnOiAnZXJyb3InLFxuICAgICAgICAncHJlZmVyLXJlc3QtcGFyYW1zJzogJ2Vycm9yJyxcbiAgICAgICAgJ3ByZWZlci1zcHJlYWQnOiAnZXJyb3InLFxuICAgICAgICAncHJlZmVyLXRlbXBsYXRlJzogJ2Vycm9yJyxcbiAgICAgICAgJ3JhZGl4JzogJ2Vycm9yJyxcbiAgICAgICAgJ3JlcXVpcmUtYXRvbWljLXVwZGF0ZXMnOiAnZXJyb3InLFxuICAgICAgICAncmVxdWlyZS1hd2FpdCc6ICdlcnJvcicsXG4gICAgICAgICdzeW1ib2wtZGVzY3JpcHRpb24nOiAnZXJyb3InLFxuICAgICAgICAndW5pY29kZS1ib20nOiAnZXJyb3InLFxuICAgICAgICAndmFycy1vbi10b3AnOiAnZXJyb3InLFxuICAgICAgICAneW9kYSc6ICdlcnJvcidcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGZpbGVzOiBjb250ZXh0LnRlc3RGaWxlcyxcbiAgICAgIHJ1bGVzOiB7XG4gICAgICAgICduby1tYWdpYy1udW1iZXJzJzogJ29mZidcbiAgICAgIH1cbiAgICB9XG4gIF0pO1xufVxuXG4vKipcbiAqIFRoZSBnbG9iYWwgaWdub3JlczogZXZlcnl0aGluZyBgLmdpdGlnbm9yZWAgbmFtZXMsIHBsdXMgQ2xhdWRlIENvZGUncyB3b3JrdHJlZSBmb2xkZXIuXG4gKlxuICogQHJldHVybnMgVGhlIGNvbmZpZ3VyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsSWdub3JlQ29uZmlncygpOiBMaW50ZXIuQ29uZmlnW10ge1xuICByZXR1cm4gZGVmaW5lQ29uZmlnKFxuICAgIC4uLmdldEdpdElnbm9yZUNvbmZpZ3MoKSxcbiAgICAvKlxuICAgICAqIE9uIHRvcCBvZiBgLmdpdGlnbm9yZWAsIG5vdCBpbnN0ZWFkIG9mIGl0OiBnaXQgZXhjbHVkZXMgQ2xhdWRlIENvZGUncyB3b3JrdHJlZSBmb2xkZXIgdGhyb3VnaFxuICAgICAqIGAuZ2l0L2luZm8vZXhjbHVkZWAsIHdoaWNoIGBpbmNsdWRlSWdub3JlRmlsZWAgYWJvdmUgZG9lcyBub3QgcmVhZC4gU2VlIGBsaW50LWlnbm9yZXMudHNgLlxuICAgICAqL1xuICAgIGdsb2JhbElnbm9yZXMoW0NMQVVERV9XT1JLVFJFRVNfSUdOT1JFX0dMT0JdLCAnb2JzaWRpYW4tZGV2LXV0aWxzL2NsYXVkZS13b3JrdHJlZXMnKVxuICApO1xufVxuXG4vKipcbiAqIFRoZSBnZW5lcmljIGxheWVycyBvZiB0aGUgc2hhcmVkIGNvbmZpZ3VyYXRpb24sIHdpdGhvdXQgdGhlIGdsb2JhbCBpZ25vcmVzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBjb25maWd1cmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVTY3JpcHRFc2xpbnRDb25maWdzKHBhcmFtczogR2V0VHlwZVNjcmlwdEVzbGludENvbmZpZ3NQYXJhbXMpOiBMaW50ZXIuQ29uZmlnW10ge1xuICBjb25zdCB7IGNvbnRleHQgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGRlZmluZUNvbmZpZyhcbiAgICAuLi5nZXRFc2xpbnRDb3JlQ29uZmlncyhjb250ZXh0KSxcbiAgICAuLi5nZXRUc2VzbGludENvbmZpZ3MoY29udGV4dCksXG4gICAgLi4uZ2V0U3R5bGlzdGljQ29uZmlncyhjb250ZXh0KSxcbiAgICAuLi5nZXRJbXBvcnRYQ29uZmlncyhjb250ZXh0KSxcbiAgICAuLi5nZXRQZXJmZWN0aW9uaXN0Q29uZmlncyhjb250ZXh0KSxcbiAgICAuLi5nZXRVbmljb3JuQ29uZmlncyhjb250ZXh0KSxcbiAgICAuLi5nZXRFc2xpbnRJbXBvcnRSZXNvbHZlclR5cGVzY3JpcHRDb25maWdzKCksXG4gICAgLi4uZ2V0RXNsaW50Q29tbWVudHNDb25maWdzKGNvbnRleHQpLFxuICAgIC4uLmdldEluSG91c2VQbHVnaW5Db25maWdzKHsgY29udGV4dCwgaW5Ib3VzZVBsdWdpbjogcGFyYW1zLmluSG91c2VQbHVnaW4gPz8gaW5Ib3VzZUVzbGludFBsdWdpbiB9KSxcbiAgICAuLi5nZXROb2RlQ29tcGF0Q29uZmlncyh7IGNvbnRleHQsIG1pbmltdW1Ob2RlVmVyc2lvbjogcGFyYW1zLm1pbmltdW1Ob2RlVmVyc2lvbiB9KVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRFc2xpbnRDb21tZW50c0NvbmZpZ3MoY29udGV4dDogRXNsaW50Q29uZmlnQ29udGV4dCk6IExpbnRlci5Db25maWdbXSB7XG4gIHJldHVybiBkZWZpbmVDb25maWcoW1xuICAgIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQteC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlciAtLSBUaGUgZGVmYXVsdCBleHBvcnQgbmFtZSBgcmVjb21tZW5kZWRgIGlzIHRvbyBjb25mdXNpbmcuXG4gICAgICBleHRlbmRzOiBbY29tbWVudHNDb25maWdzLnJlY29tbWVuZGVkXSxcbiAgICAgIGZpbGVzOiBjb250ZXh0LmFsbEZpbGVzKCksXG4gICAgICBydWxlczoge1xuICAgICAgICAnQGVzbGludC1jb21tdW5pdHkvZXNsaW50LWNvbW1lbnRzL3JlcXVpcmUtZGVzY3JpcHRpb24nOiAnZXJyb3InXG4gICAgICB9XG4gICAgfVxuICBdKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXNsaW50SW1wb3J0UmVzb2x2ZXJUeXBlc2NyaXB0Q29uZmlncygpOiBMaW50ZXIuQ29uZmlnW10ge1xuICByZXR1cm4gZGVmaW5lQ29uZmlnKFtcbiAgICB7XG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICAnaW1wb3J0LXgvcmVzb2x2ZXItbmV4dCc6IFtcbiAgICAgICAgICBjcmVhdGVUeXBlU2NyaXB0SW1wb3J0UmVzb2x2ZXIoe1xuICAgICAgICAgICAgYWx3YXlzVHJ5VHlwZXM6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfVxuICBdKTtcbn1cblxuZnVuY3Rpb24gZ2V0R2l0SWdub3JlQ29uZmlncygpOiBMaW50ZXIuQ29uZmlnW10ge1xuICBjb25zdCBnaXRpZ25vcmVQYXRoID0gam9pbihnZXRSb290Rm9sZGVyKCkgPz8gJycsICcuZ2l0aWdub3JlJyk7XG4gIHJldHVybiBleGlzdHNTeW5jKGdpdGlnbm9yZVBhdGgpID8gW2luY2x1ZGVJZ25vcmVGaWxlKGdpdGlnbm9yZVBhdGgpXSA6IFtdO1xufVxuXG5mdW5jdGlvbiBnZXRJbXBvcnRYQ29uZmlncyhjb250ZXh0OiBFc2xpbnRDb25maWdDb250ZXh0KTogTGludGVyLkNvbmZpZ1tdIHtcbiAgcmV0dXJuIGRlZmluZUNvbmZpZyhbXG4gICAge1xuICAgICAgZXh0ZW5kczogW1xuICAgICAgICBlc2xpbnRQbHVnaW5JbXBvcnRYRmxhdENvbmZpZ3MucmVjb21tZW5kZWQsXG4gICAgICAgIGVzbGludFBsdWdpbkltcG9ydFhGbGF0Q29uZmlncy50eXBlc2NyaXB0LFxuICAgICAgICBlc2xpbnRQbHVnaW5JbXBvcnRYRmxhdENvbmZpZ3MuZXJyb3JzLFxuICAgICAgICBlc2xpbnRQbHVnaW5JbXBvcnRYRmxhdENvbmZpZ3Mud2FybmluZ3NcbiAgICAgIF0sXG4gICAgICBmaWxlczogY29udGV4dC5hbGxGaWxlcygpLFxuICAgICAgcnVsZXM6IHtcbiAgICAgICAgJ2ltcG9ydC14L2NvbnNpc3RlbnQtdHlwZS1zcGVjaWZpZXItc3R5bGUnOiAnZXJyb3InLFxuICAgICAgICAnaW1wb3J0LXgvZXh0ZW5zaW9ucyc6IFsnZXJyb3InLCAnaWdub3JlUGFja2FnZXMnXSxcbiAgICAgICAgJ2ltcG9ydC14L2ZpcnN0JzogJ2Vycm9yJyxcbiAgICAgICAgJ2ltcG9ydC14L2ltcG9ydHMtZmlyc3QnOiAnZXJyb3InLFxuICAgICAgICAnaW1wb3J0LXgvbmV3bGluZS1hZnRlci1pbXBvcnQnOiAnZXJyb3InLFxuICAgICAgICAnaW1wb3J0LXgvbm8tYWJzb2x1dGUtcGF0aCc6ICdlcnJvcicsXG4gICAgICAgICdpbXBvcnQteC9uby1hbWQnOiAnZXJyb3InLFxuICAgICAgICAnaW1wb3J0LXgvbm8tYW5vbnltb3VzLWRlZmF1bHQtZXhwb3J0JzogJ2Vycm9yJyxcbiAgICAgICAgJ2ltcG9ydC14L25vLWNvbW1vbmpzJzogJ2Vycm9yJyxcbiAgICAgICAgJ2ltcG9ydC14L25vLWN5Y2xlJzogJ2Vycm9yJyxcbiAgICAgICAgJ2ltcG9ydC14L25vLWRlZmF1bHQtZXhwb3J0JzogJ2Vycm9yJyxcbiAgICAgICAgJ2ltcG9ydC14L25vLWRlcHJlY2F0ZWQnOiAnZXJyb3InLFxuICAgICAgICAnaW1wb3J0LXgvbm8tZHVwbGljYXRlcyc6ICdlcnJvcicsXG4gICAgICAgICdpbXBvcnQteC9uby1keW5hbWljLXJlcXVpcmUnOiAnZXJyb3InLFxuICAgICAgICAnaW1wb3J0LXgvbm8tZW1wdHktbmFtZWQtYmxvY2tzJzogJ2Vycm9yJyxcbiAgICAgICAgJ2ltcG9ydC14L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzJzogJ2Vycm9yJyxcbiAgICAgICAgJ2ltcG9ydC14L25vLWltcG9ydC1tb2R1bGUtZXhwb3J0cyc6ICdlcnJvcicsXG4gICAgICAgICdpbXBvcnQteC9uby1tdXRhYmxlLWV4cG9ydHMnOiAnZXJyb3InLFxuICAgICAgICAnaW1wb3J0LXgvbm8tbmFtZWQtZGVmYXVsdCc6ICdlcnJvcicsXG4gICAgICAgICdpbXBvcnQteC9uby1uYW1lc3BhY2UnOiAnZXJyb3InLFxuICAgICAgICAnaW1wb3J0LXgvbm8tbm9kZWpzLW1vZHVsZXMnOiAnZXJyb3InLFxuICAgICAgICAnaW1wb3J0LXgvbm8tcmVsYXRpdmUtcGFja2FnZXMnOiAnZXJyb3InLFxuICAgICAgICAnaW1wb3J0LXgvbm8tcmVzdHJpY3RlZC1wYXRocyc6ICdlcnJvcicsXG4gICAgICAgICdpbXBvcnQteC9uby1zZWxmLWltcG9ydCc6ICdlcnJvcicsXG4gICAgICAgICdpbXBvcnQteC9uby11bmFzc2lnbmVkLWltcG9ydCc6IFtcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFsbG93OiBbXG4gICAgICAgICAgICAgICcqKi8qLmNzcycsXG4gICAgICAgICAgICAgICcqKi8qLnNhc3MnLFxuICAgICAgICAgICAgICAnKiovKi5zY3NzJ1xuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgJ2ltcG9ydC14L25vLXVudXNlZC1tb2R1bGVzJzogJ29mZicsXG4gICAgICAgICdpbXBvcnQteC9uby11c2VsZXNzLXBhdGgtc2VnbWVudHMnOiAnZXJyb3InLFxuICAgICAgICAnaW1wb3J0LXgvbm8td2VicGFjay1sb2FkZXItc3ludGF4JzogJ2Vycm9yJ1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgZmlsZXM6IGNvbnRleHQuc2NyaXB0RmlsZXMsXG4gICAgICBydWxlczoge1xuICAgICAgICAnaW1wb3J0LXgvbm8tbm9kZWpzLW1vZHVsZXMnOiAnb2ZmJ1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgLy8gQSB0ZXN0IHJ1bnMgdW5kZXIgdGhlIHRlc3QgcnVubmVyIGluIE5vZGUgYW5kIGlzIG5ldmVyIGJ1bmRsZWQgaW50byBhbnl0aGluZyB0aGF0IHNoaXBzLlxuICAgICAgZmlsZXM6IGNvbnRleHQudGVzdEZpbGVzLFxuICAgICAgcnVsZXM6IHtcbiAgICAgICAgJ2ltcG9ydC14L25vLW5vZGVqcy1tb2R1bGVzJzogJ29mZidcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGZpbGVzOiBjb250ZXh0LnJvb3RDb25maWdGaWxlcyxcbiAgICAgIHJ1bGVzOiB7XG4gICAgICAgICdpbXBvcnQteC9uby1kZWZhdWx0LWV4cG9ydCc6ICdvZmYnXG4gICAgICB9XG4gICAgfVxuICBdKTtcbn1cblxuZnVuY3Rpb24gZ2V0SW5Ib3VzZVBsdWdpbkNvbmZpZ3MocGFyYW1zOiBHZXRJbkhvdXNlUGx1Z2luQ29uZmlnc1BhcmFtcyk6IExpbnRlci5Db25maWdbXSB7XG4gIHJldHVybiBkZWZpbmVDb25maWcoW1xuICAgIHtcbiAgICAgIGZpbGVzOiBwYXJhbXMuY29udGV4dC5hbGxGaWxlcygpLFxuICAgICAgcGx1Z2luczoge1xuICAgICAgICBbSU5fSE9VU0VfRVNMSU5UX1BMVUdJTl9OQU1FXTogcGFyYW1zLmluSG91c2VQbHVnaW5cbiAgICAgIH0sXG4gICAgICBydWxlczoge1xuICAgICAgICAnb2JzaWRpYW4tZGV2LXV0aWxzL25vLWFzeW5jLWNhbGxiYWNrLXRvLXVuc2FmZS1yZXR1cm4nOiAnZXJyb3InLFxuICAgICAgICAvKlxuICAgICAgICAgKiBNZWFzdXJlZCBvdmVyIDMyIHBsdWdpbnMgYnVpbHQgb24gdGhpcyBjb25maWcgYmVmb3JlIGl0IHdhcyB0dXJuZWQgb24gKDIwMjYtMDktMjQpOiAyOSBoYWQgbm8gZmluZGluZyxcbiAgICAgICAgICogdGhlIG90aGVyIHRocmVlIGhhZCA4IGJldHdlZW4gdGhlbSwgZXZlcnkgb25lIGEgZ2VudWluZWx5IGRlYWQgbGluay5cbiAgICAgICAgICovXG4gICAgICAgICdvYnNpZGlhbi1kZXYtdXRpbHMvbm8tdW5yZXNvbHZlZC1qc2RvYy1saW5rJzogJ2Vycm9yJyxcbiAgICAgICAgJ29ic2lkaWFuLWRldi11dGlscy9uby11bnVzZWQtcGFyYW1zLW1lbWJlcnMnOiAnZXJyb3InLFxuICAgICAgICAnb2JzaWRpYW4tZGV2LXV0aWxzL25vLXVzZWQtdW5kZXJzY29yZS12YXJpYWJsZXMnOiAnZXJyb3InLFxuICAgICAgICAnb2JzaWRpYW4tZGV2LXV0aWxzL3BhcmFtcy1vcHRpb25zLW5hbWUtbWF0Y2gnOiAnZXJyb3InLFxuICAgICAgICAnb2JzaWRpYW4tZGV2LXV0aWxzL3ByZWZlci1ub29wLWFzeW5jJzogJ2Vycm9yJyxcbiAgICAgICAgJ29ic2lkaWFuLWRldi11dGlscy9yZWFkb25seS1wYXJhbXMtb3B0aW9ucy1yZXN1bHQtbWVtYmVycyc6ICdlcnJvcicsXG4gICAgICAgICdvYnNpZGlhbi1kZXYtdXRpbHMvcmVxdWlyZS1tZXRob2QtdGVtcGxhdGUnOiAnZXJyb3InLFxuICAgICAgICAnb2JzaWRpYW4tZGV2LXV0aWxzL3JlcXVpcmUtc3VwZXItY2FsbCc6ICdvZmYnXG4gICAgICB9XG4gICAgfVxuICBdKTtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZUNvbXBhdENvbmZpZ3MocGFyYW1zOiBHZXROb2RlQ29tcGF0Q29uZmlnc1BhcmFtcyk6IExpbnRlci5Db25maWdbXSB7XG4gIGNvbnN0IHsgY29udGV4dCwgbWluaW11bU5vZGVWZXJzaW9uIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHZlcnNpb25PcHRpb25zID0gbWluaW11bU5vZGVWZXJzaW9uID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdmVyc2lvbjogbWluaW11bU5vZGVWZXJzaW9uIH07XG5cbiAgcmV0dXJuIGRlZmluZUNvbmZpZyhbXG4gICAge1xuICAgICAgZmlsZXM6IGNvbnRleHQuc291cmNlRmlsZXMsXG4gICAgICBpZ25vcmVzOiBbXG4gICAgICAgIC4uLmNvbnRleHQudGVzdEZpbGVzLFxuICAgICAgICAvLyBEZXYtb25seSB0b29saW5nIChidWlsZCwgbGludCwgdmVyc2lvbikgcnVucyB2aWEgYGppdGlgIGluIHRoZSBkZXZlbG9wZXIncyBOb2RlIGVudmlyb25tZW50IGFuZCBuZXZlciBzaGlwcywgc28gdGhlIHNoaXBwZWQgc291cmNlJ3MgTm9kZSBmbG9vciBkb2VzIG5vdCBhcHBseSB0byBpdC5cbiAgICAgICAgLi4uY29udGV4dC5zY3JpcHRGaWxlc1xuICAgICAgXSxcbiAgICAgIHBsdWdpbnM6IHtcbiAgICAgICAgbjogbm9kZVBsdWdpblxuICAgICAgfSxcbiAgICAgIHJ1bGVzOiB7XG4gICAgICAgICduL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL2VzLWJ1aWx0aW5zJzogW1xuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgdmVyc2lvbk9wdGlvbnNcbiAgICAgICAgXSxcbiAgICAgICAgJ24vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyc6IFtcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIGBCbG9iYCBhbmQgYEZpbGVgIGFyZSBET00gd2ViIGdsb2JhbHMgcHJlc2VudCBpbiBldmVyeSBzdXBwb3J0ZWQgYnJvd3NlciBlbmdpbmUsIGJ1dCB0aGUgcnVsZSBhbHNvIGtub3dzIHRoZW0gYXMgTm9kZSdzIGV4cGVyaW1lbnRhbCBidWlsdGlucyBhbmQgY2Fubm90IHRlbGwgd2hpY2ggaXMgbWVhbnQuIElnbm9yZSB0aGVtIGdsb2JhbGx5OyBnZW51aW5lbHkgbmV3ZXIgQVBJcyAoZS5nLiBgQWJvcnRTaWduYWwuYW55YCkgc3RheSBmbGFnZ2VkLlxuICAgICAgICAgICAgaWdub3JlczogW1xuICAgICAgICAgICAgICAnQmxvYicsXG4gICAgICAgICAgICAgICdGaWxlJ1xuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC4uLnZlcnNpb25PcHRpb25zXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgfVxuICBdKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGVyZmVjdGlvbmlzdENvbmZpZ3MoY29udGV4dDogRXNsaW50Q29uZmlnQ29udGV4dCk6IExpbnRlci5Db25maWdbXSB7XG4gIHJldHVybiBkZWZpbmVDb25maWcoW3tcbiAgICBleHRlbmRzOiBbcGVyZmVjdGlvbmlzdENvbmZpZ3NbJ3JlY29tbWVuZGVkLWFscGhhYmV0aWNhbCddXSxcbiAgICBmaWxlczogY29udGV4dC5hbGxGaWxlcygpXG4gIH1dKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3R5bGlzdGljQ29uZmlncyhjb250ZXh0OiBFc2xpbnRDb25maWdDb250ZXh0KTogTGludGVyLkNvbmZpZ1tdIHtcbiAgcmV0dXJuIGRlZmluZUNvbmZpZyhbXG4gICAge1xuICAgICAgZXh0ZW5kczogW1xuICAgICAgICBzdHlsaXN0aWMuY29uZmlncy5yZWNvbW1lbmRlZCxcbiAgICAgICAgc3R5bGlzdGljLmNvbmZpZ3MuY3VzdG9taXplKHtcbiAgICAgICAgICBhcnJvd1BhcmVuczogdHJ1ZSxcbiAgICAgICAgICBicmFjZVN0eWxlOiAnMXRicycsXG4gICAgICAgICAgY29tbWFEYW5nbGU6ICduZXZlcicsXG4gICAgICAgICAgc2VtaTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgXSxcbiAgICAgIGZpbGVzOiBjb250ZXh0LmFsbEZpbGVzKCksXG4gICAgICBydWxlczoge1xuICAgICAgICAnQHN0eWxpc3RpYy9nZW5lcmF0b3Itc3Rhci1zcGFjaW5nJzogJ29mZicsXG4gICAgICAgICdAc3R5bGlzdGljL2luZGVudCc6ICdvZmYnLFxuICAgICAgICAnQHN0eWxpc3RpYy9pbmRlbnQtYmluYXJ5LW9wcyc6ICdvZmYnLFxuICAgICAgICAnQHN0eWxpc3RpYy9qc3gtb25lLWV4cHJlc3Npb24tcGVyLWxpbmUnOiAnb2ZmJyxcbiAgICAgICAgJ0BzdHlsaXN0aWMvbm8tZXh0cmEtc2VtaSc6ICdlcnJvcicsXG4gICAgICAgICdAc3R5bGlzdGljL29iamVjdC1jdXJseS1uZXdsaW5lJzogW1xuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgRXhwb3J0RGVjbGFyYXRpb246IHtcbiAgICAgICAgICAgICAgbWluUHJvcGVydGllczogMixcbiAgICAgICAgICAgICAgbXVsdGlsaW5lOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgSW1wb3J0RGVjbGFyYXRpb246IHtcbiAgICAgICAgICAgICAgbWluUHJvcGVydGllczogMixcbiAgICAgICAgICAgICAgbXVsdGlsaW5lOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICAnQHN0eWxpc3RpYy9vcGVyYXRvci1saW5lYnJlYWsnOiBbXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAnYmVmb3JlJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgICAgICAgJz0nOiAnYWZ0ZXInXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICAnQHN0eWxpc3RpYy9xdW90ZXMnOiBbXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAnc2luZ2xlJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbGxvd1RlbXBsYXRlTGl0ZXJhbHM6ICduZXZlcidcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9XG4gIF0pO1xufVxuXG5mdW5jdGlvbiBnZXRUc2VzbGludENvbmZpZ3MoY29udGV4dDogRXNsaW50Q29uZmlnQ29udGV4dCk6IExpbnRlci5Db25maWdbXSB7XG4gIHJldHVybiBkZWZpbmVDb25maWcoW1xuICAgIHtcbiAgICAgIGV4dGVuZHM6IFtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIFRoZSBkZWZhdWx0IGV4cG9ydCBuYW1lIGBfZGVmYXVsdGAgaXMgdG9vIGNvbmZ1c2luZy5cbiAgICAgICAgLi4udHNlc2xpbnQuY29uZmlncy5zdHJpY3RUeXBlQ2hlY2tlZCxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyIC0tIFRoZSBkZWZhdWx0IGV4cG9ydCBuYW1lIGBfZGVmYXVsdGAgaXMgdG9vIGNvbmZ1c2luZy5cbiAgICAgICAgLi4udHNlc2xpbnQuY29uZmlncy5zdHlsaXN0aWNUeXBlQ2hlY2tlZFxuICAgICAgXSxcbiAgICAgIGZpbGVzOiBjb250ZXh0LmFsbEZpbGVzKCksXG4gICAgICBsYW5ndWFnZU9wdGlvbnM6IHtcbiAgICAgICAgcGFyc2VyT3B0aW9uczoge1xuICAgICAgICAgIGVjbWFGZWF0dXJlczoge1xuICAgICAgICAgICAganN4OiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcm9qZWN0U2VydmljZTogdHJ1ZSxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgdHNjb25maWdSb290RGlyYCBpcyBhIGB0eXBlc2NyaXB0LWVzbGludGAgcGFyc2VyIG9wdGlvbi5cbiAgICAgICAgICB0c2NvbmZpZ1Jvb3REaXI6IGdldFJvb3RGb2xkZXIoKSA/PyAnJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcnVsZXM6IHtcbiAgICAgICAgJ0B0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZSc6ICdlcnJvcicsXG4gICAgICAgICdAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbWVtYmVyLWFjY2Vzc2liaWxpdHknOiAnZXJyb3InLFxuICAgICAgICAvLyBUaGUgcnVsZSdzIG93biBgcHJvcGVydHlgIGRlZmF1bHQsIHNwZWxsZWQgYXMgYSBiYXJlIHNldmVyaXR5IHNvIGl0IHN0YXlzIHRoZSBydWxlJ3MgZGVmYXVsdCByYXRoZXIgdGhhbiBhIGNvcHkgb2YgaXQuXG4gICAgICAgIC8vIERvIE5PVCBwYXNzIGAnbWV0aG9kJ2AgZm9yIHRpZGluZXNzOiB0aGUgbWV0aG9kIGZvcm0ga2VlcHMgcGFyYW1ldGVycyBiaXZhcmlhbnQsIGRyb3BzIGByZWFkb25seWAgKHRoZSBydWxlJ3Mgb3duIGZpeGVyXG4gICAgICAgIC8vIG1lc3NhZ2Ugc2F5cyBzbyksIGFuZCBtYWtlcyBgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kYCBmaXJlIG9uIGV2ZXJ5IGZvcndhcmRlZCBiYWcgbWVtYmVyLCB3aGljaCBpcyB3aGF0IHRoZVxuICAgICAgICAvLyBgdGhpczogdm9pZGAgYm9pbGVycGxhdGUgdXNlZCB0byBwYXkgZm9yLiBEbyBOT1QgZGVsZXRlIHRoZSBsaW5lIGVpdGhlciAtIHRoZSBydWxlIGlzIGluIG5vIHByZXNldCwgc28gdGhhdCB0dXJucyBpdCBvZmYuXG4gICAgICAgICdAdHlwZXNjcmlwdC1lc2xpbnQvbWV0aG9kLXNpZ25hdHVyZS1zdHlsZSc6ICdlcnJvcicsXG4gICAgICAgICdAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXMnOiBbJ2Vycm9yJywge1xuICAgICAgICAgIGNoZWNrVGhlbmFibGVzOiB0cnVlXG4gICAgICAgIH1dLFxuICAgICAgICAnQHR5cGVzY3JpcHQtZXNsaW50L25vLWludmFsaWQtdm9pZC10eXBlJzogWydlcnJvcicsIHtcbiAgICAgICAgICBhbGxvd0FzVGhpc1BhcmFtZXRlcjogdHJ1ZVxuICAgICAgICB9XSxcbiAgICAgICAgJ0B0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzJzogWydlcnJvcicsIHtcbiAgICAgICAgICBhbGxvd2VkTmFtZXM6IFtcbiAgICAgICAgICAgICd0aGF0J1xuICAgICAgICAgIF1cbiAgICAgICAgfV0sXG4gICAgICAgICdAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMnOiBbXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgYXJnc2AgaXMgYW4gRVNMaW50IHJ1bGUgb3B0aW9uIG5hbWUuXG4gICAgICAgICAgICBhcmdzOiAnYWxsJyxcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBhcmdzSWdub3JlUGF0dGVybmAgaXMgYSBgdHlwZXNjcmlwdC1lc2xpbnRgIHJ1bGUgb3B0aW9uIG5hbWUuXG4gICAgICAgICAgICBhcmdzSWdub3JlUGF0dGVybjogJ15fJyxcbiAgICAgICAgICAgIGNhdWdodEVycm9yczogJ2FsbCcsXG4gICAgICAgICAgICBjYXVnaHRFcnJvcnNJZ25vcmVQYXR0ZXJuOiAnXl8nLFxuICAgICAgICAgICAgZGVzdHJ1Y3R1cmVkQXJyYXlJZ25vcmVQYXR0ZXJuOiAnXl8nLFxuICAgICAgICAgICAgaWdub3JlUmVzdFNpYmxpbmdzOiB0cnVlLFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYHZhcnNJZ25vcmVQYXR0ZXJuYCBpcyBhIGB0eXBlc2NyaXB0LWVzbGludGAgcnVsZSBvcHRpb24gbmFtZS5cbiAgICAgICAgICAgIHZhcnNJZ25vcmVQYXR0ZXJuOiAnXl8nXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICAnQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1yZWFkb25seSc6ICdlcnJvcidcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGZpbGVzOiBjb250ZXh0LnRlc3RGaWxlcyxcbiAgICAgIHJ1bGVzOiB7XG4gICAgICAgICdAdHlwZXNjcmlwdC1lc2xpbnQvZG90LW5vdGF0aW9uJzogWydlcnJvcicsIHtcbiAgICAgICAgICBhbGxvd1ByaXZhdGVDbGFzc1Byb3BlcnR5QWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGFsbG93UHJvdGVjdGVkQ2xhc3NQcm9wZXJ0eUFjY2VzczogdHJ1ZVxuICAgICAgICB9XSxcbiAgICAgICAgJ0B0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZCc6ICdvZmYnXG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICByZWFjdDoge1xuICAgICAgICAgIHZlcnNpb246ICdkZXRlY3QnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIF0pO1xufVxuXG5mdW5jdGlvbiBnZXRVbmljb3JuQ29uZmlncyhjb250ZXh0OiBFc2xpbnRDb25maWdDb250ZXh0KTogTGludGVyLkNvbmZpZ1tdIHtcbiAgcmV0dXJuIGRlZmluZUNvbmZpZyhbXG4gICAge1xuICAgICAgZXh0ZW5kczogW3VuaWNvcm4uY29uZmlncy5yZWNvbW1lbmRlZF0sXG4gICAgICBmaWxlczogY29udGV4dC5hbGxGaWxlcygpLFxuICAgICAgcnVsZXM6IHtcbiAgICAgICAgLypcbiAgICAgICAgICogVGhlc2UgZW50cmllcyBhcmUgbm90IGFiYnJldmlhdGlvbnMgdG8gYmUgZXhwYW5kZWQgXHUyMDE0IHRoZXkgYXJlIGVzdGFibGlzaGVkIHZvY2FidWxhcnkgaGVyZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQnJhbmQ6IGBkZXZgLCBgbGliYCwgYHV0aWxgL2B1dGlsc2Agc3BlbGwgdGhlIHByb2R1Y3QncyBvd24gbmFtZS4gTGVmdCBvbiwgdGhlIHJ1bGUgcmV3cml0ZXNcbiAgICAgICAgICogYFJlcG9QYXRoc2AgdG8gYE9ic2lkaWFuRGV2ZWxvcG1lbnRVdGlsaXRpZXNSZXBvUGF0aHNgIGFuZCBgZ2V0TGliRGVidWdnZXJgIHRvXG4gICAgICAgICAqIGBnZXRMaWJyYXJ5RGVidWdnZXJgLCByZW5hbWluZyBleHBvcnRlZCBBUEkgYWZ0ZXIgdGhlIHBhY2thZ2UgaXQgYmVsb25ncyB0by5cbiAgICAgICAgICpcbiAgICAgICAgICogQ29udmVudGlvbjogYHBhcmFtc2AgaXMgdGhlIHBhcmFtZXRlci1iYWcgY29udmVudGlvbiwgZW5mb3JjZWQgYnlcbiAgICAgICAgICogYG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoYCwgd2hpY2ggcmVxdWlyZXMgYmFnIHR5cGVzIHRvIGJlIG5hbWVkXG4gICAgICAgICAqIGA8T3duZXI+UGFyYW1zYCAvIGA8T3duZXI+T3B0aW9uc2AuIEV4cGFuZGluZyBpdCB0byBgUGFyYW1ldGVyc2Agd291bGQgcHV0IHRoZSB0d28gcnVsZXMgaW4gZGlyZWN0XG4gICAgICAgICAqIGNvbnRyYWRpY3Rpb24gYW5kIGJyZWFrIDMwMCsgZXhwb3J0ZWQgdHlwZSBuYW1lcy5cbiAgICAgICAgICpcbiAgICAgICAgICogUmVzZXJ2ZWQgd29yZHM6IGEgYmFyZSBgYXJnc2AsIGBmbmAsIGBzdHJgLCBgbW9kYCBvciBgZXZ0YCBleHBhbmRzIHRvIGFuIGlkZW50aWZpZXIgdGhhdCBpcyBhbHJlYWR5XG4gICAgICAgICAqIHRha2VuLCBzbyB0aGUgcnVsZSBzdWdnZXN0cyBgJGFyZ3VtZW50c2AsIGAkZnVuY3Rpb25gLCBhbmQgc28gb24uIFNwZWxsIHRob3NlIGAkYXJndW1lbnRzYCAvXG4gICAgICAgICAqIGAkZnVuY3Rpb25gIGluc3RlYWQgXHUyMDE0IGEgYCRgIHByZWZpeCByZWFkcyBiZXR0ZXIgdGhhbiBhIHRyYWlsaW5nIHVuZGVyc2NvcmUuIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IE5PVFxuICAgICAgICAgKiBjb25maWd1cmVkIGFzIGEgY3VzdG9tIHJlcGxhY2VtZW50OiB1bmljb3JuIHN1YnN0aXR1dGVzIGF0IHRoZSB3b3JkIGxldmVsIGluc2lkZSBjb21wb3VuZCBuYW1lcywgc29cbiAgICAgICAgICogcmVkaXJlY3RpbmcgdGhlIHdob2xlIGVudHJ5IHR1cm5zIGBhc3luY0ZuYCBpbnRvIGBhc3luYyRmdW5jdGlvbmAuIENvbXBvdW5kcyB3YW50IHRoZSBwbGFpbiBleHBhbnNpb25cbiAgICAgICAgICogKGBhc3luY0Z1bmN0aW9uYCk7IG9ubHkgdGhlIGJhcmUsIGdlbnVpbmVseS1jb2xsaWRpbmcgaWRlbnRpZmllcnMgdGFrZSB0aGUgYCRgIGZvcm0uXG4gICAgICAgICAqXG4gICAgICAgICAqIERvbWFpbiB3b3JkczogYGRvY2AvYGRvY3NgLCBgZW52YCwgYGRpc3RgIGFuZCBgc3JjYCBhcmUgdGhlIGNsZWFyZXIgc3BlbGxpbmcgaW4gdGhpcyBjb2RlYmFzZS5cbiAgICAgICAgICogRXhwYW5kaW5nIGBkb2NgIGFsc28gcGlja3MgdGhlIHdyb25nIHdvcmQgXHUyMDE0IHRoZSBgYXBpLWRvYy0qYCBtb2R1bGVzIGdlbmVyYXRlIEFQSSAqZG9jdW1lbnRhdGlvbiosIG5vdFxuICAgICAgICAgKiBkb2N1bWVudHMuIGBzcmNgIGFkZGl0aW9uYWxseSBjb3JydXB0cyBjb2RlOiB0aGUgZml4ZXIgcmVuYW1lcyB0aGUgYFNyY2AgbWVtYmVyIG9mIHRoZSBleHBvcnRlZFxuICAgICAgICAgKiBgT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHNgIC8gYFJlcG9QYXRoc2AgZW51bXMgd2hpbGUgbGVhdmluZyBldmVyeSBgLlNyY2AgcmVmZXJlbmNlXG4gICAgICAgICAqIGRhbmdsaW5nLCBiZWNhdXNlIGBjaGVja1Byb3BlcnRpZXNgIGV4ZW1wdHMgcHJvcGVydHkgYWNjZXNzZXMgYnV0IG5vdCB0aGUgZGVjbGFyYXRpb25zIHRoZXkgcG9pbnQgYXQuXG4gICAgICAgICAqXG4gICAgICAgICAqIERpc2FibGluZyB0aGUgcmVwbGFjZW1lbnQgZW50cmllcyBwcm90ZWN0cyB0aGVzZSBwZXJtYW5lbnRseTsgYW4gYGFsbG93TGlzdGAgd291bGQgaW5zdGVhZCBuZWVkIGV2ZXJ5XG4gICAgICAgICAqIGFmZmVjdGVkIGlkZW50aWZpZXIgZW51bWVyYXRlZCBieSBoYW5kIGFuZCByZS1lbnVtZXJhdGVkIGZvciBldmVyeSBuZXcgb25lLlxuICAgICAgICAgKlxuICAgICAgICAgKiBOT1RFOiB0aGlzIHJ1bGUncyBhdXRvZml4IGlzIE5PVCByZWZlcmVuY2UtYXdhcmUgZm9yIGRlY2xhcmF0aW9ucyB0aGF0IHBhcnRpY2lwYXRlIGluIGEgY29udHJhY3QgXHUyMDE0XG4gICAgICAgICAqIGVudW0gbWVtYmVycywgaW50ZXJmYWNlIG1lbWJlcnMsIGFuZCBUeXBlU2NyaXB0IHBhcmFtZXRlciBwcm9wZXJ0aWVzIChgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seVxuICAgICAgICAgKiBlbDogSFRNTEVsZW1lbnQpYCkgYXJlIHJlbmFtZWQgd2hpbGUgYHRoaXMuZWxgIGFuZCBgRW51bS5NZW1iZXJgIHJlZmVyZW5jZXMgYXJlIGxlZnQgZGFuZ2xpbmcuIEFwcGx5XG4gICAgICAgICAqIGl0cyByZXBvcnRzIGJ5IGhhbmQ7IG5ldmVyIHJ1biBgLS1maXhgIG92ZXIgaXQuXG4gICAgICAgICAqL1xuICAgICAgICAvKlxuICAgICAgICAgKiBBIGdvb2QgcnVsZSwgYnV0IGl0cyBkZWZhdWx0IHByZWZpeGVzIGZvcmNlIHVuZ3JhbW1hdGljYWwgbmFtZXM6IGBtZW1iZXJQYWdlRXhpc3RzYCB3b3VsZCBiZWNvbWVcbiAgICAgICAgICogYGlzTWVtYmVyUGFnZUV4aXN0c2AgcmF0aGVyIHRoYW4gYGRvZXNNZW1iZXJQYWdlRXhpc3RgLiBUaGVzZSBlbnRyaWVzIEVYVEVORCB0aGUgZGVmYXVsdHMgKGBpc2AsXG4gICAgICAgICAqIGBoYXNgLCBgY2FuYCwgYHNob3VsZGAsIC4uLikgcmF0aGVyIHRoYW4gcmVwbGFjaW5nIHRoZW0sIHNvIGEgYm9vbGVhbiB3aXRoIG5vIGJvb2xlYW4tcmVhZGluZyBwcmVmaXhcbiAgICAgICAgICogYXQgYWxsIGlzIHN0aWxsIHJlamVjdGVkIC0tIHRoZSBydWxlIGp1c3Qgc3RvcHMgaW5zaXN0aW5nIHRoZSBwcmVmaXggY29tZSBmcm9tIGEgc2hvcnRlciBsaXN0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgbGlzdCBpcyBiaWRpcmVjdGlvbmFsOiBhZGRpbmcgYSBwcmVmaXggYWxzbyBhc3NlcnRzIHRoYXQgZXZlcnl0aGluZyBuYW1lZCB3aXRoIGl0IElTIGEgYm9vbGVhbi5cbiAgICAgICAgICogYGNoZWNrYCBlYXJucyBpdHMgcGxhY2Ugb24gYm90aCBjb3VudHMsIHNpbmNlIHRoZSBoYW5kZnVsIG9mIG5vbi1ib29sZWFuIGBjaGVjaypgIG5hbWVzIGl0IHN1cmZhY2VkXG4gICAgICAgICAqIHdlcmUgZ2VudWluZWx5IG1pcy1uYW1lZCAodm9pZCBmdW5jdGlvbnMgdGhhdCB0aHJvdywgYSBwcm9iZSByZXR1cm5pbmcgYW4gSFRUUCBzdGF0dXMpLiBgdGVzdGAgd2FzXG4gICAgICAgICAqIG1lYXN1cmVkIGFuZCByZWplY3RlZDogaXQgd291bGQgdmFsaWRhdGUgZml2ZSBgdGVzdCpgIGxpbmsgcHJlZGljYXRlcyB0aGF0IHJlYWQgYmV0dGVyIGFzIGBpcypgXG4gICAgICAgICAqIGFueXdheSwgYXQgdGhlIGNvc3Qgb2YgcmVuYW1pbmcgU0NSRUFNSU5HX0NBU0UgdGVzdCBmaXh0dXJlcyBhbmQgdGhlIGB0ZXN0Q292ZXJhZ2VgL2B0ZXN0V2F0Y2hgXG4gICAgICAgICAqIHJ1bm5lcnMgdGhhdCBkZWxpYmVyYXRlbHkgbWlycm9yIHRoZSBgdGVzdDpjb3ZlcmFnZWAvYHRlc3Q6d2F0Y2hgIG5wbSBzY3JpcHRzLlxuICAgICAgICAgKi9cbiAgICAgICAgJ3VuaWNvcm4vY29uc2lzdGVudC1ib29sZWFuLW5hbWUnOiBbXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmVmaXhlczoge1xuICAgICAgICAgICAgICBhbGxvd3M6IHRydWUsXG4gICAgICAgICAgICAgIGNoZWNrOiB0cnVlLFxuICAgICAgICAgICAgICBjb250YWluczogdHJ1ZSxcbiAgICAgICAgICAgICAgZG9lczogdHJ1ZSxcbiAgICAgICAgICAgICAgaW5jbHVkZXM6IHRydWUsXG4gICAgICAgICAgICAgIG11c3Q6IHRydWUsXG4gICAgICAgICAgICAgIG5lZWRzOiB0cnVlLFxuICAgICAgICAgICAgICBzdXBwb3J0czogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgLypcbiAgICAgICAgICogVW5zYXRpc2ZpYWJsZSBhbG9uZ3NpZGUgYHBlcmZlY3Rpb25pc3Qvc29ydC1jbGFzc2VzYCwgd2hpY2ggaXMgY29uZmlndXJlZCBoZXJlIGFzIGEgcGxhaW5cbiAgICAgICAgICogYWxwaGFiZXRpY2FsIHNvcnQuIFRoaXMgcnVsZSB3YW50cyBhIGNhdGVnb3J5IG9yZGVyIChhbGwgZmllbGRzLCB0aGVuIHRoZSBjb25zdHJ1Y3RvciwgdGhlbiBhbGxcbiAgICAgICAgICogbWV0aG9kcyksIHNvIHRoZSBleHRyZW1lbHkgY29tbW9uIGBwcml2YXRlIF94YCBmaWVsZCBwYWlyZWQgd2l0aCBhIGBwdWJsaWMgZ2V0IHgoKWAgYWNjZXNzb3IgaXNcbiAgICAgICAgICogcmVqZWN0ZWQgYnkgd2hpY2hldmVyIHJ1bGUgbG9zZXM6IGFscGhhYmV0aWNhbGx5IHRoZSBhY2Nlc3NvciBwcmVjZWRlcyB0aGUgZmllbGQsIGJ5IGNhdGVnb3J5IHRoZVxuICAgICAgICAgKiBmaWVsZCBwcmVjZWRlcyB0aGUgYWNjZXNzb3IuIFVubGlrZSBgcHJlZmVyLWdsb2JhbC10aGlzYCB0aGUgY2xhc2ggcHJvZHVjZXMgbm9cbiAgICAgICAgICogYEVTTGludENpcmN1bGFyRml4ZXNXYXJuaW5nYCwgb25seSBiZWNhdXNlIHRoaXMgcnVsZSBzaGlwcyBubyBmaXhlciAtLSBib3RoIHJ1bGVzIGFyZSBgZXJyb3JgLCBzbyBub1xuICAgICAgICAgKiBhcnJhbmdlbWVudCBvZiBtZW1iZXJzIHNhdGlzZmllcyB0aGVtIGJvdGguIFRoZSBhbHBoYWJldGljYWwgc29ydCBpcyB0aGUgb25lIGFscmVhZHkgcm9sbGVkIG91dFxuICAgICAgICAgKiBhY3Jvc3MgdGhlIHBsdWdpbnMgY29uc3VtaW5nIHRoaXMgY29uZmlnLCBzbyBpdCBrZWVwcyBwcmVjZWRlbmNlLiBSZS1lbmFibGluZyB0aGlzIHJ1bGUgd291bGQgbWVhblxuICAgICAgICAgKiBnaXZpbmcgYHBlcmZlY3Rpb25pc3Qvc29ydC1jbGFzc2VzYCBhIG1hdGNoaW5nIGBncm91cHNgIG9wdGlvbiBhbmQgcmVvcmRlcmluZyBldmVyeSBjbGFzcy5cbiAgICAgICAgICovXG4gICAgICAgICd1bmljb3JuL2NvbnNpc3RlbnQtY2xhc3MtbWVtYmVyLW9yZGVyJzogJ29mZicsXG4gICAgICAgIC8qXG4gICAgICAgICAqIEV2ZXJ5IHJlcG9ydCBpcyBgbmV3IEVycm9yKCkuc3RhY2tgLCB3aGljaCBjYXB0dXJlcyBhIHN0YWNrIHRyYWNlIGFuZCBuZXZlciBzdXJmYWNlcyBpdHMgbWVzc2FnZS5cbiAgICAgICAgICogVGhlIHJ1bGUgY2Fubm90IHRlbGwgdGhhdCBmcm9tIGFuIGVycm9yIHRoYXQgaXMgYWN0dWFsbHkgdGhyb3duIGF0IGEgdXNlci5cbiAgICAgICAgICpcbiAgICAgICAgICogTm8gYmFyZSBgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycylgIGlzIGxlZnQgZm9yIGl0IHRvIGNhdGNoOiBldmVyeSBzaXRlIG5vdyBidWlsZHMgaXRzIGFnZ3JlZ2F0ZVxuICAgICAgICAgKiB0aHJvdWdoIGBjcmVhdGVBZ2dyZWdhdGVFcnJvcmAsIHdoaWNoIGdpdmVzIGl0IGEgbWVzc2FnZSB0aGF0IG5hbWVzIHRoZSBmYWlsdXJlLiBBbiBlbXB0eSBvbmUgaXNcbiAgICAgICAgICogbG9zc3kgaW4gYSB3YXkgdGhhdCBvbmx5IHNob3dzIHVwIG91dHNpZGUgdGhpcyBsaWJyYXJ5IFx1MjAxNCBgZXJyb3JUb1N0cmluZ2Agd2Fsa3MgYGVycm9yc2AgYW5kIHByaW50c1xuICAgICAgICAgKiB0aGUgd2hvbGUgdHJlZSwgd2hpbGUgZXZlcnl0aGluZyByZWFkaW5nIGBtZXNzYWdlYCBzZWVzIGFuIGVtcHR5IHNlbnRlbmNlLiBUaGUgaGVscGVyIGxpdmVzIGluIGl0c1xuICAgICAgICAgKiBvd24gbGVhZiBgYWdncmVnYXRlLWVycm9yLnRzYCByYXRoZXIgdGhhbiBpbiBgZXJyb3IudHNgIHByZWNpc2VseSBzbyB0aGF0IGBkaXNwb3NhYmxlLnRzYCBjYW4gcmVhY2hcbiAgICAgICAgICogaXQsIHdoaWNoIGl0IGNvdWxkIG5vdCB3aGlsZSB0aGUgb25seSBjb3B5IHNhdCBpbiBhIG1vZHVsZSBpbXBvcnRpbmcgaXQgYmFjay5cbiAgICAgICAgICovXG4gICAgICAgICd1bmljb3JuL2Vycm9yLW1lc3NhZ2UnOiAnb2ZmJyxcbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIGRlZmF1bHQgc3R5bGUgZm9yIGBub2RlOnBhdGhgIGlzIGEgZGVmYXVsdCBpbXBvcnQsIGJ1dCB0aGlzIGNvZGViYXNlIGltcG9ydHMgaXRzIG1lbWJlcnMgYnkgbmFtZVxuICAgICAgICAgKiB0aHJvdWdob3V0LCBjb25zaXN0ZW50bHkgd2l0aCBldmVyeSBvdGhlciBgbm9kZTpgIG1vZHVsZSBpdCB1c2VzLiBDb25maWd1cmUgdGhlIHJ1bGUgdG8gZW5mb3JjZSB0aGVcbiAgICAgICAgICogc3R5bGUgYWN0dWFsbHkgaW4gdXNlIHJhdGhlciB0aGFuIGFubm90YXRlIDE3IHNpdGVzIHRoYXQgYXJlIG5vdCBnb2luZyB0byBjaGFuZ2UuXG4gICAgICAgICAqL1xuICAgICAgICAndW5pY29ybi9pbXBvcnQtc3R5bGUnOiBbXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICAgICAgLy8gS2V5ZWQgYnkgdGhlIFVOUFJFRklYRUQgbW9kdWxlIG5hbWU6IHRoZSBydWxlJ3Mgb3duIHRhYmxlIHVzZXMgYHBhdGhgLCBzbyBhIGBub2RlOnBhdGhgIGtleSBuZXZlciBtYXRjaGVzLlxuICAgICAgICAgICAgICBwYXRoOiB7XG4gICAgICAgICAgICAgICAgbmFtZWQ6IHRydWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIHJ1bGUgY291bnRzIGNvbnN0cnVjdG9yIGNhbGxzIGFuZCBjb3VudHMgdGhyb3VnaCBhcnJheSBhbmQgb2JqZWN0IGxpdGVyYWxzLCBzbyBpdHMgZGVmYXVsdCBvZiAzXG4gICAgICAgICAqIHJlcG9ydHMgb3JkaW5hcnkgY29tcG9zaXRpb246IGBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2Jvb20nKSlgIGluc2lkZSBhbiBhc3NlcnRpb24sIGEgdGVzdCBmaXh0dXJlXG4gICAgICAgICAqIGJ1aWx0IGFzIGBjcmVhdGVUeXBlSW5mbyh7IG1ldGhvZHM6IFtjcmVhdGVNZW1iZXJJbmZvKHsgLi4uIH0pXSB9KWAsIGB0aGlzLmFkZENoaWxkKG5ldyBDKHRoaXMuYXBwKSlgXG4gICAgICAgICAqIGluc2lkZSBhIHBhcmFtcyBiYWcuIFJhaXNpbmcgdGhlIGxpbWl0IGJ5IG9uZSBjbGVhcnMgZXZlcnkgcmVwb3J0IGhlcmUgd2hpbGUgc3RpbGwgY2F0Y2hpbmcgdGhlXG4gICAgICAgICAqIGdlbnVpbmVseSB1bnJlYWRhYmxlIG5lc3RpbmcgdGhlIHJ1bGUgaXMgZm9yLlxuICAgICAgICAgKi9cbiAgICAgICAgJ3VuaWNvcm4vbWF4LW5lc3RlZC1jYWxscyc6IFtcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1heDogNFxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgJ3VuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMnOiBbXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICogUHJvcGVydHkgYW5kIG1lbWJlciBuYW1lcyBhcmUgY2hlY2tlZCB0b28sIHNvIGFuIGFiYnJldmlhdGlvbiBjYW5ub3Qgc3Vydml2ZSBieSBsaXZpbmcgb24gYW5cbiAgICAgICAgICAgICAqIG9iamVjdCByYXRoZXIgdGhhbiBpbiBhIHZhcmlhYmxlLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIFRoZSBydWxlIGlzIHB1cmVseSBzeW50YWN0aWM6IGl0IGNhbm5vdCB0ZWxsIGEgbWVtYmVyIHdlIGRlY2xhcmUgZnJvbSBvbmUgYmVsb25naW5nIHRvIGFcbiAgICAgICAgICAgICAqIGRlcGVuZGVuY3ksIGFuZCBpdCBvZmZlcnMgbm8gYXV0b2ZpeCBmb3IgcHJvcGVydGllcyAobWVhc3VyZWQ6IDY4MSBoaXRzLCAwIHdpdGggYSBmaXhlcikuIFNpdGVzXG4gICAgICAgICAgICAgKiBuYW1pbmcgYSBmb3JlaWduIG1lbWJlciAtLSBgRG9tRWxlbWVudEluZm8uYXR0cmAsIGBFdmFsSW5PYnNpZGlhblBhcmFtcy5mbmAsIGFuZCB0aGUgbGlrZSAtLSBhcmVcbiAgICAgICAgICAgICAqIHRoZXJlZm9yZSBpbXBvc3NpYmxlIHRvIHNhdGlzZnkgYW5kIGNhcnJ5IGFuIGlubGluZSBkaXNhYmxlLCBzbyBldmVyeXRoaW5nIHN0aWxsIHJlcG9ydGVkIGlzIG91cnNcbiAgICAgICAgICAgICAqIHRvIHJlbmFtZS5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBXaGVuIHJlbmFtaW5nIHRoZSByZXN0LCBub3RlIHRoYXQgYHRzY2AgYWxvbmUgaXMgTk9UIGEgc3VmZmljaWVudCBnYXRlOiBvYmplY3QtbGl0ZXJhbCBrZXlzIGluXG4gICAgICAgICAgICAgKiBsb29zZWx5IHR5cGVkIHBvc2l0aW9ucyAoYGV4cGVjdC5hcnJheUNvbnRhaW5pbmcoW3sgYmF0Y2hlZEFyZ3VtZW50czogLi4uIH1dKWApIGFyZSBub3QgY29udGV4dHVhbGx5XG4gICAgICAgICAgICAgKiB0eXBlZCwgc28gYSByZW5hbWUgbGVhdmVzIHRoZW0gYmVoaW5kIGFuZCBicmVha3MgdGhlIHN1aXRlIHdoZXJlIHRoZSB0eXBlIGNoZWNrZXIgc2VlcyBub3RoaW5nLlxuICAgICAgICAgICAgICogUmVuYW1lIGluIHNtYWxsIGJhdGNoZXMgd2l0aCB0aGUgZnVsbCB0ZXN0IHJ1biBpbiB0aGUgbG9vcC5cbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBUaGUgZGlzYWJsZWQgcmVwbGFjZW1lbnRzIGJlbG93IGFyZSBlc3RhYmxpc2hlZCB2b2NhYnVsYXJ5IHJhdGhlciB0aGFuIGFiYnJldmlhdGlvbnMgdG8gYmVcbiAgICAgICAgICAgICAqIGV4cGFuZGVkLiBgZWxgIGlzIGV4ZW1wdCBiZWNhdXNlIE9ic2lkaWFuIG5hbWVzIGV2ZXJ5IGVsZW1lbnQgbWVtYmVyIHRoYXQgd2F5IC0tIGBjb250YWluZXJFbGAsXG4gICAgICAgICAgICAgKiBgY29udGVudEVsYCwgYGlucHV0RWxgLCBgc2VsZWN0RWxgIC0tIHNvIGV4cGFuZGluZyBvdXJzIHRvIGAqRWxlbWVudGAgd291bGQgbGVhdmUgb3VyIGNvbXBvbmVudHNcbiAgICAgICAgICAgICAqIHJlYWRpbmcgaW5jb25zaXN0ZW50bHkgYmVzaWRlIHRoZSBPYnNpZGlhbiBvbmVzIHRoZXkgc2l0IG5leHQgdG8uIERpc2FibGluZyB0aGUgcmVwbGFjZW1lbnQgYWxzb1xuICAgICAgICAgICAgICogY292ZXJzIGNvbXBvdW5kIG5hbWVzLCB3aGljaCBpcyA3MiBzaXRlcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBlYWNoIG5lZWQgYW4gaW5saW5lIGRpc2FibGUuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogYHJlZmAgaXMgZXhlbXB0IGZvciB0aGUgc2FtZSByZWFzb246IGBBc3luY0V2ZW50UmVmYCBpcyB0aGUgYXN5bmMgY291bnRlcnBhcnQgb2YgT2JzaWRpYW4nc1xuICAgICAgICAgICAgICogYEV2ZW50UmVmYCwgaGFuZGVkIHRvIHRoZSBzYW1lIGBvZmZyZWZgIC8gYHJlZ2lzdGVyRXZlbnRgIHNoYXBlcywgc28gdGhlIHR3byBuYW1lcyBoYXZlIHRvIG1hdGNoXG4gICAgICAgICAgICAgKiB0byByZWFkIGFzIGEgcGFpci5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY2hlY2tQcm9wZXJ0aWVzOiB0cnVlLFxuICAgICAgICAgICAgcmVwbGFjZW1lbnRzOiB7XG4gICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAqIGBhdHRyYCAvIGBhdHRyc2AgYXJlIE9ic2lkaWFuJ3Mgb3duOiBgY3JlYXRlRWwoJ2EnLCB7IGF0dHI6IHsgLi4uIH0gfSlgIHRha2VzIHRoZW0gYnkgdGhvc2VcbiAgICAgICAgICAgICAgICogbmFtZXMgb24gYERvbUVsZW1lbnRJbmZvYCwgc28gb3VycyBoYXZlIHRvIG1hdGNoIHRvIGJlIHBhc3NlZCB0aHJvdWdoLiBgcHJvcHNgIGlzIHRoZVxuICAgICAgICAgICAgICAgKiB1bml2ZXJzYWwgY29tcG9uZW50IHZvY2FidWxhcnksIGV4ZW1wdCBmb3IgdGhlIHNhbWUgcmVhc29uIGBwYXJhbXNgIGlzLlxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgYXR0cjogZmFsc2UsXG4gICAgICAgICAgICAgIGF0dHJzOiBmYWxzZSxcbiAgICAgICAgICAgICAgZGV2OiBmYWxzZSxcbiAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICogRXZlcnkgYGRpcmAgaGVyZSBpcyBhIGZpbGVzeXN0ZW0gZGlyZWN0b3J5LCBuZXZlciBhIGRpcmVjdGlvbiwgc28gdGhlIHJ1bGUgaXMgbmFycm93ZWQgdG8gdGhlXG4gICAgICAgICAgICAgICAqIG9uZSBleHBhbnNpb24gcmF0aGVyIHRoYW4gbGVmdCBvZmZlcmluZyBhIGNob2ljZSBpdCBjYW5ub3QgbWFrZS5cbiAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIFRoaXMgaXMgdGhlIHJ1bGUncyBvd24gcmVwbGFjZW1lbnQga2V5LCB3aGljaCBoYXMgdG8gYmUgc3BlbGxlZCB0aGUgd2F5IHRoZSBydWxlIHJlYWRzIGl0LlxuICAgICAgICAgICAgICBkaXI6IHtcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIGRpcmVjdG9yeTogdHJ1ZVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkaXN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgZG9jOiBmYWxzZSxcbiAgICAgICAgICAgICAgZG9jczogZmFsc2UsXG4gICAgICAgICAgICAgIGVsOiBmYWxzZSxcbiAgICAgICAgICAgICAgZW52OiBmYWxzZSxcbiAgICAgICAgICAgICAgbGliOiBmYWxzZSxcbiAgICAgICAgICAgICAgcGFyYW1zOiBmYWxzZSxcbiAgICAgICAgICAgICAgcHJvcHM6IGZhbHNlLFxuICAgICAgICAgICAgICByZWY6IGZhbHNlLFxuICAgICAgICAgICAgICByZWZzOiBmYWxzZSxcbiAgICAgICAgICAgICAgc3JjOiBmYWxzZSxcbiAgICAgICAgICAgICAgdXRpbDogZmFsc2UsXG4gICAgICAgICAgICAgIHV0aWxzOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIG5leHQgc2l4IHJ1bGVzIGFsbCBzdWdnZXN0IGFuIEFQSSBuZXdlciB0aGFuIHRoaXMgcHJvamVjdCdzIGBsaWJgIChgRVMyMDIyYCksIHNvIGZvbGxvd2luZyBhbnkgb2ZcbiAgICAgICAgICogdGhlbSBmYWlscyB0byBjb21waWxlLiBUaGUgT2JzaWRpYW4gcGx1Z2luIGxheWVyIHRha2VzIHRoZSBmbG9vciBmcm9tIHRoZSBvbGRlc3QgT2JzaWRpYW4gaW5zdGFsbGVyIHRoYXRcbiAgICAgICAgICogY2FuIHN0aWxsIHJ1biBjdXJyZW50IE9ic2lkaWFuLCB3aGljaCByZWNvcmRzIGBlY21hU2NyaXB0VmVyc2lvbjogXCJFUzIwMjJcImAuIEVhY2ggaXMgb2ZmIGF0IHRoZSBjb25maWdcbiAgICAgICAgICogbGV2ZWwgcmF0aGVyIHRoYW4gYW5ub3RhdGVkIHBlciBzaXRlLCBiZWNhdXNlIG5vbmUgY2FuIGV2ZXIgYmUgc2F0aXNmaWVkIHdoaWxlIHRoYXQgZmxvb3IgaG9sZHMuIFJldmlzaXRcbiAgICAgICAgICogdGhlbSB0b2dldGhlciBpZiB0aGUgZmxvb3IgbW92ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIGBBcnJheSN0b1JldmVyc2VkYCBhbmQgYEFycmF5I3RvU29ydGVkYCBhcmUgRVMyMDIzLlxuICAgICAgICAgKi9cbiAgICAgICAgJ3VuaWNvcm4vbm8tYXJyYXktcmV2ZXJzZSc6ICdvZmYnLFxuICAgICAgICAndW5pY29ybi9uby1hcnJheS1zb3J0JzogJ29mZicsXG4gICAgICAgIC8qXG4gICAgICAgICAqIGBjb250aW51ZWAgaW5zaWRlIGEgbmVzdGVkIGxvb3AgaXMgb3JkaW5hcnksIHJlYWRhYmxlIGNvbnRyb2wgZmxvdyBoZXJlLiBUaGUgcnVsZSdzIHJlbWVkeSBpcyB0b1xuICAgICAgICAgKiBleHRyYWN0IGV2ZXJ5IHN1Y2ggbG9vcCBpbnRvIGl0cyBvd24gZnVuY3Rpb24sIHdoaWNoIHNwcmVhZHMgb25lIGNvaGVyZW50IHRyYXZlcnNhbCBhY3Jvc3MgdHdvXG4gICAgICAgICAqIGRlY2xhcmF0aW9ucyB3aXRob3V0IG1ha2luZyBhbnl0aGluZyBjbGVhcmVyLlxuICAgICAgICAgKi9cbiAgICAgICAgJ3VuaWNvcm4vbm8tYnJlYWstaW4tbmVzdGVkLWxvb3AnOiAnb2ZmJyxcbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIHJ1bGUgY2Fubm90IHNlZSB0aHJvdWdoIGEgaG9pc3RlZCBmdW5jdGlvbiBkZWNsYXJhdGlvbiwgc28gaXQgdHJlYXRzIGEgYmluZGluZyB0aGF0IGEgbmVzdGVkXG4gICAgICAgICAqIGZ1bmN0aW9uIGFscmVhZHkgcmVhZCBhcyB1bnVzZWQgYmVmb3JlIHRoZSBleGl0LiBJbiBgcnVuV2l0aFRpbWVvdXRgIHRoYXQgaXMgYGxldCBpc0NvbXBsZXRlZGAsIHdoaWNoXG4gICAgICAgICAqIGBydW4oKWAgYW5kIGBpbm5lclRpbWVvdXQoKWAgYm90aCB0b3VjaCB3aGlsZSB0aGUgYFByb21pc2UucmFjZWAgYWJvdmUgdGhlIGV4aXQgaXMgc3RpbGwgcnVubmluZyAtLVxuICAgICAgICAgKiBtb3ZpbmcgdGhlIGRlY2xhcmF0aW9uIHBhc3QgdGhlIGV4aXQsIGFzIHRoZSBydWxlIGFza3MsIHdvdWxkIGxlYXZlIHRob3NlIHJlYWRzIGluIHRoZSB0ZW1wb3JhbCBkZWFkXG4gICAgICAgICAqIHpvbmUuIEl0cyBvd24gZml4ZXIgZGVjbGluZXMgYWxsIDE1IHNpdGVzIGZvciB0aGUgc2FtZSByZWFzb24gaXQgY2Fubm90IHByb3ZlIHRoZW0gc2FmZSwgc28gZm9sbG93aW5nXG4gICAgICAgICAqIHRoZSBydWxlIGlzIGVudGlyZWx5IG1hbnVhbC4gV2hhdCBpcyBsZWZ0IGFmdGVyIHRoYXQgaXMgcGxhY2VtZW50IHN0eWxlOiB0aGUgcmVtYWluaW5nIHJlcG9ydHMgYXJlXG4gICAgICAgICAqIG5hbWVkIGNvbnN0YW50cyBhbmQgZGVyaXZlZCBwYXRocyBkZWxpYmVyYXRlbHkgZ3JvdXBlZCBhdCB0aGUgdG9wIG9mIGEgZnVuY3Rpb24sIGFuZCBwdXNoaW5nIGVhY2ggb25lXG4gICAgICAgICAqIGJlbG93IHRoZSBmaXJzdCBndWFyZCBzcGxpdHMgYSBjb2hlc2l2ZSBibG9jayB0byBubyBiZW5lZml0LiBUaGUgdGhyZWUgc2l0ZXMgd2hlcmUgZGVmZXJyaW5nIHNraXBwZWRcbiAgICAgICAgICogcmVhbCB3b3JrIChhIHNlY29uZCBgY29tcHV0ZU5lZWRlZEV4cG9zdXJlYCB3YWxrLCBhIGB0b0pzb25gIHNlcmlhbGl6YXRpb24sIGFuIGBlbnN1cmVMZkVuZGluZ3NgIHBhc3MpXG4gICAgICAgICAqIHdlcmUgYXBwbGllZCBieSBoYW5kIGluc3RlYWQuXG4gICAgICAgICAqL1xuICAgICAgICAndW5pY29ybi9uby1kZWNsYXJhdGlvbnMtYmVmb3JlLWVhcmx5LWV4aXQnOiAnb2ZmJyxcbiAgICAgICAgLypcbiAgICAgICAgICogQXNzaWduaW5nIG9udG8gdGhlIGdsb2JhbCBvYmplY3QgaXMgaG93IHRoaXMgbGlicmFyeSBpbnN0YWxscyBhbmQgcmVzdG9yZXMgdGVzdCBkb3VibGVzLCBhbmQgaG93IGFcbiAgICAgICAgICogZmV3IE9ic2lkaWFuLXJ1bnRpbWUgZ2xvYmFscyBhcmUgcmVhY2hlZCBhdCBhbGwuIFRoZSBydWxlIGNhbm5vdCBzZXBhcmF0ZSB0aGF0IGZyb20gYW4gYWNjaWRlbnRhbFxuICAgICAgICAgKiBnbG9iYWwgd3JpdGUsIGFuZCBpdCBoYXMgbm8gZml4ZXIuXG4gICAgICAgICAqL1xuICAgICAgICAndW5pY29ybi9uby1nbG9iYWwtb2JqZWN0LXByb3BlcnR5LWFzc2lnbm1lbnQnOiAnb2ZmJyxcbiAgICAgICAgLy8gYG51bGxgIGlzIGxvYWQtYmVhcmluZyBoZXJlOiBhbiBvcHRpb25hbCBjb2xsYWJvcmF0b3IgaXMgbW9kZWxsZWQgYXMgYSByZXF1aXJlZCBgbnVsbCB8IFhgIGZpZWxkIHJhdGhlciB0aGFuIGFuIG9wdGlvbmFsIGBYYCwgc28gYG51bGxgIGFuZCBgdW5kZWZpbmVkYCBhcmUgbm90IGludGVyY2hhbmdlYWJsZS5cbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIHJ1bGUncyBsaXN0IG9mIHN0YW5kYXJkIGBTeW1ib2xgIHByb3BlcnRpZXMgcHJlZGF0ZXMgZXhwbGljaXQgcmVzb3VyY2UgbWFuYWdlbWVudCwgc28gaXQgcmVwb3J0c1xuICAgICAgICAgKiBgU3ltYm9sLmRpc3Bvc2VgIGFuZCBgU3ltYm9sLmFzeW5jRGlzcG9zZWAgYXMgbm9uLXN0YW5kYXJkLiBCb3RoIGFyZSBwYXJ0IG9mIHRoZSBsYW5ndWFnZSB0aGF0IHRoaXNcbiAgICAgICAgICogbGlicmFyeSBpcyBidWlsdCBvbiAtLSAxMTQgZmlsZXMgaGVyZSB1c2UgYHVzaW5nYCBkZWNsYXJhdGlvbnMsIGFuZCB0aGUgZGlzcG9zYWJsZSB0eXBlcyBhcmUgYVxuICAgICAgICAgKiBwdWJsaWMgcGFydCBvZiBpdHMgc3VyZmFjZSAtLSBzbyBhbGwgNTkgcmVwb3J0cyBhcmUgdGhlIHJ1bGUgYmVpbmcgb3V0IG9mIGRhdGUgcmF0aGVyIHRoYW4gYSBmaW5kaW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgJ3VuaWNvcm4vbm8tbm9uc3RhbmRhcmQtYnVpbHRpbi1wcm9wZXJ0aWVzJzogJ29mZicsXG4gICAgICAgICd1bmljb3JuL25vLW51bGwnOiAnb2ZmJyxcbiAgICAgICAgLypcbiAgICAgICAgICogVHlwZVNjcmlwdCdzIGV4cGxpY2l0IGB0aGlzYCBwYXJhbWV0ZXIgKGBmdW5jdGlvbiBnZXQodGhpczogSG9sZGVyKSB7IHJldHVybiB0aGlzLnZhbHVlOyB9YCkgbWFrZXNcbiAgICAgICAgICogYHRoaXNgIG91dHNpZGUgYSBjbGFzcyBib3RoIGxlZ2FsIGFuZCB0eXBlLWNoZWNrZWQsIGJ1dCB0aGUgcnVsZSBpcyBzeW50YWN0aWMgYW5kIGZsYWdzIGl0IGlkZW50aWNhbGx5XG4gICAgICAgICAqIHRvIGEgZ2VudWluZWx5IHVuYm91bmQgYHRoaXNgLiBJdCBoYXMgbm8gb3B0aW9ucyAoYHNjaGVtYTogW11gKSBhbmQgbm8gZml4ZXIsIHNvIHRoZXJlIGlzIG5vIHdheSB0b1xuICAgICAgICAgKiBzZXBhcmF0ZSB0aGUgaWRpb20gZnJvbSB0aGUgYnVnIGl0IHRhcmdldHMuIE1vc3QgaGl0cyBoZXJlIHdlcmUgdHlwZWQgYHRoaXNgIHBhcmFtZXRlcnMgYW5kIHRlc3RzIHRoYXRcbiAgICAgICAgICogZGVsaWJlcmF0ZWx5IGFzc2VydCBgdGhpc2AgYmluZGluZy5cbiAgICAgICAgICovXG4gICAgICAgICd1bmljb3JuL25vLXRoaXMtb3V0c2lkZS1vZi1jbGFzcyc6ICdvZmYnLFxuICAgICAgICAvLyBTYW1lIGNhbGwgYXMgaXRzIG9iamVjdCBjb3VudGVycGFydCBhYm92ZTogdGhlIGRlc3RydWN0dXJpbmcgZGVwdGggZmxhZ2dlZCBoZXJlIGlzIGRlbGliZXJhdGUgYW5kIHJlYWRzIHdlbGwuXG4gICAgICAgICd1bmljb3JuL25vLXVucmVhZGFibGUtYXJyYXktZGVzdHJ1Y3R1cmluZyc6ICdvZmYnLFxuICAgICAgICAvKlxuICAgICAgICAgKiBUaGUgcmVwb3J0cyBhcmUgYWxsIGBmb3IgKGNvbnN0IGZpbGUgb2YgYXdhaXQgcmVhZGRpclBvc2l4KC4uLikpYCwgd2hpY2ggcmVhZHMgZXhhY3RseSBhcyBpbnRlbmRlZC5cbiAgICAgICAgICogSG9pc3RpbmcgdGhlIGF3YWl0ZWQgY2FsbCBpbnRvIGEgdmFyaWFibGUgbmFtZWQgYWZ0ZXIgdGhlIGxvb3AncyBvd24gaXRlcmFibGUgYWRkcyBhIGxpbmUgYW5kIGEgbmFtZVxuICAgICAgICAgKiB3aXRob3V0IGFkZGluZyBpbmZvcm1hdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgICd1bmljb3JuL25vLXVucmVhZGFibGUtZm9yLW9mLWV4cHJlc3Npb24nOiAnb2ZmJyxcbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIG5lc3RlZCBkZXN0cnVjdHVyaW5nIHRoaXMgZmxhZ3MgaXMgZGVsaWJlcmF0ZSBoZXJlIGFuZCByZWFkcyB3ZWxsOiBwdWxsaW5nIGEgbWVtYmVyIG91dCBvZiBhXG4gICAgICAgICAqIHBhcmFtcyBiYWcgaW4gb25lIHN0ZXAgc3RhdGVzIHdoZXJlIHRoZSB2YWx1ZSBjb21lcyBmcm9tLCB3aGljaCBhIHNlY29uZCBpbnRlcm1lZGlhdGUgYmluZGluZyBvbmx5XG4gICAgICAgICAqIG9ic2N1cmVzLiBUaGUgcnVsZSB0YWtlcyBubyBvcHRpb25zLCBzbyB0aGVyZSBpcyBubyB3YXkgdG8ga2VlcCB0aGUgZGVwdGggbGltaXQgaXQgaXMgcmVhbGx5IGFmdGVyXG4gICAgICAgICAqIHdoaWxlIGFsbG93aW5nIHRoZSBzaGFwZSBpbiB1c2UuXG4gICAgICAgICAqL1xuICAgICAgICAndW5pY29ybi9uby11bnJlYWRhYmxlLW9iamVjdC1kZXN0cnVjdHVyaW5nJzogJ29mZicsXG4gICAgICAgIC8qXG4gICAgICAgICAqIGBjaGVja0FyZ3VtZW50c2Agc3RyaXBzIGB1bmRlZmluZWRgIGFyZ3VtZW50cywgd2hpY2ggc2hpZnRzIHRoZSByZW1haW5pbmcgcG9zaXRpb25hbCBhcmd1bWVudHMgaW50b1xuICAgICAgICAgKiB0aGUgd3Jvbmcgc2xvdHM7IGBjaGVja0Fycm93RnVuY3Rpb25Cb2R5YCByZW1vdmVzIGByZXR1cm4gdW5kZWZpbmVkO2AgZnJvbSBhcnJvdyBib2RpZXMgd2hvc2Ugb3RoZXJcbiAgICAgICAgICogYnJhbmNoZXMgZG8gcmV0dXJuIGEgdmFsdWUsIHdoaWNoIHZpb2xhdGVzIHRoZSBgbm9JbXBsaWNpdFJldHVybnNgIHNldHRpbmcgdGhpcyBwcm9qZWN0IGNvbXBpbGVzIHdpdGguXG4gICAgICAgICAqIFRoZSBydWxlJ3MgcmVtYWluaW5nIGNhc2VzIChhIGJhcmUgYHVuZGVmaW5lZGAgaW5pdGlhbGl6ZXIsIGByZXR1cm4gdW5kZWZpbmVkO2AgaW4gYSB2b2lkIGZ1bmN0aW9uKVxuICAgICAgICAgKiBhcmUgc3RpbGwgd29ydGggaGF2aW5nLlxuICAgICAgICAgKi9cbiAgICAgICAgJ3VuaWNvcm4vbm8tdXNlbGVzcy11bmRlZmluZWQnOiBbXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjaGVja0FyZ3VtZW50czogZmFsc2UsXG4gICAgICAgICAgICBjaGVja0Fycm93RnVuY3Rpb25Cb2R5OiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgLy8gYEFycmF5LmZyb21Bc3luY2AgaXMgRVMyMDI0LiBTZWUgdGhlIEVTMjAyMiBmbG9vciBub3RlIGFib3ZlLlxuICAgICAgICAndW5pY29ybi9wcmVmZXItYXJyYXktZnJvbS1hc3luYyc6ICdvZmYnLFxuICAgICAgICAvKlxuICAgICAgICAgKiBFdmVyeSBoaXQgaGVyZSBpcyBhIHByb21pc2UgZGVsaWJlcmF0ZWx5IE5PVCBhd2FpdGVkLCBhbmQgYGF3YWl0YCB3b3VsZCBjaGFuZ2Ugd2hhdCB0aGUgY29kZSBkb2VzLlxuICAgICAgICAgKiBgcmVzdWx0LmNhdGNoKHRocm93RGVsYXllZClgIGluIGBhc3luYy1ldmVudHMudHNgIGlzIHRoZSBmaXJlLWFuZC1mb3JnZXQgZXJyb3IgcGF0aCB0aGUgbW9kdWxlIGlzXG4gICAgICAgICAqIGJ1aWx0IG9uOyB0aGUgcmVzdCBob2xkIGFuIHVucmVzb2x2ZWQgcHJvbWlzZSBhbmQgYXNzZXJ0IHRoZSBjYWxsYmFjayBoYXMgbm90IGZpcmVkIHlldCwgc28gYXdhaXRpbmdcbiAgICAgICAgICogd291bGQgaGFuZyB0aGUgdGVzdCBvciBpbnZlcnQgd2hhdCBpdCBwcm92ZXMuIFRoZSBydWxlIGNhbm5vdCB0ZWxsIGEgZm9yZ290dGVuIGBhd2FpdGAgZnJvbSBhblxuICAgICAgICAgKiBpbnRlbnRpb25hbCBvbmUsIGFuZCB0aGlzIGNvZGViYXNlIHNjaGVkdWxlcyBmaXJlLWFuZC1mb3JnZXQgd29yayBhcyBhIGNvcmUgcGF0dGVybi5cbiAgICAgICAgICovXG4gICAgICAgICd1bmljb3JuL3ByZWZlci1hd2FpdCc6ICdvZmYnLFxuICAgICAgICAvKlxuICAgICAgICAgKiBBbGwgdGhyZWUgcmVwb3J0cyByZWFkIEhUTUwgb3V0IChgY29uc3QgaHRtbCA9IGVsLmlubmVySFRNTGApLCBuZXZlciB3cml0ZSBpdCwgYW5kIGZvciBhIHJlYWRcbiAgICAgICAgICogYGdldEhUTUwoKWAgcmV0dXJucyB0aGUgc2FtZSBzdHJpbmcuIFdoYXQgaXQgYWRkcyBpcyBzaGFkb3ctcm9vdCBzZXJpYWxpemF0aW9uIG9wdGlvbnMgdGhhdCBub3RoaW5nXG4gICAgICAgICAqIGhlcmUgYXNrcyBmb3IsIGluIGV4Y2hhbmdlIGZvciBhIG11Y2ggbmV3ZXIgcGxhdGZvcm0gZmxvb3IgdGhhbiBgaW5uZXJIVE1MYCAtLSBhIGJhZCB0cmFkZSBmb3IgYVxuICAgICAgICAgKiBsaWJyYXJ5IHRoYXQgaGFzIHRvIHJ1biBvbiB3aGF0ZXZlciBDaHJvbWl1bSB0aGUgaW5zdGFsbGVkIE9ic2lkaWFuIHNoaXBzLiBUaGUgcnVsZSdzIG90aGVyIGhhbGYsXG4gICAgICAgICAqIHJld3JpdGluZyB3cml0ZXMgdG8gdGhlIHNhbml0aXppbmcgYHNldEhUTUwoKWAsIHdvdWxkIGJlIHdvcnRoIGhhdmluZzsgaXQganVzdCBuZXZlciBmaXJlcyBoZXJlLlxuICAgICAgICAgKi9cbiAgICAgICAgJ3VuaWNvcm4vcHJlZmVyLWRvbS1ub2RlLWh0bWwtbWV0aG9kcyc6ICdvZmYnLFxuICAgICAgICAvKlxuICAgICAgICAgKiBJdGVyYXRvciBoZWxwZXJzIChgSXRlcmF0b3Ijc29tZWAgYW5kIGZyaWVuZHMpIGFyZSBFUzIwMjUsIHNvIHRoaXMgYmVsb25ncyB3aXRoIGBuby1hcnJheS1yZXZlcnNlYCBhbmRcbiAgICAgICAgICogYG5vLWFycmF5LXNvcnRgIGFib3ZlOiB0aGUgc2FtZSBFUzIwMjIgZmxvb3IgcnVsZXMgaXQgb3V0LCBhbmQgdGhlIHNhbWUgbm90ZSBhcHBsaWVzIC0tIHJldmlzaXQgdGhlbVxuICAgICAgICAgKiB0b2dldGhlciBpZiB0aGF0IGZsb29yIG1vdmVzLlxuICAgICAgICAgKi9cbiAgICAgICAgJ3VuaWNvcm4vcHJlZmVyLWl0ZXJhdG9yLWhlbHBlcnMnOiAnb2ZmJyxcbiAgICAgICAgLy8gYEl0ZXJhdG9yI3RvQXJyYXlgIGlzIEVTMjAyNS4gU2VlIHRoZSBFUzIwMjIgZmxvb3Igbm90ZSBhYm92ZS5cbiAgICAgICAgJ3VuaWNvcm4vcHJlZmVyLWl0ZXJhdG9yLXRvLWFycmF5JzogJ29mZicsXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRoZSBzdWdnZXN0ZWQgcmVwbGFjZW1lbnQgaXMgYE1hdGgudHJ1bmMoTnVtYmVyKHgpKWAsIHdoaWNoIGlzIGxvbmdlciB0aGFuIGBwYXJzZUludCh4LCAxMClgIGFuZCBub1xuICAgICAgICAgKiBjbGVhcmVyLCBhbmQgaXQgaXMgbm90IHRoZSBzYW1lIGZ1bmN0aW9uOiBgcGFyc2VJbnRgIHN0b3BzIGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgdGhhdCBjYW5ub3QgYmUgcGFydFxuICAgICAgICAgKiBvZiB0aGUgbnVtYmVyLCBzbyBgJzEyYWJjJ2AgcGFyc2VzIHRvIDEyIHdoZXJlIGBOdW1iZXJgIHlpZWxkcyBgTmFOYC4gVHdvIG9mIHRoZSByZXBvcnRzIHJlYWQgdXNlclxuICAgICAgICAgKiBpbnB1dCB0aHJvdWdoIHRoYXQgZGlmZmVyZW5jZSAtLSB0aGUgcGFnZS1qdW1wIGJveCBpbiB0aGUgRGF0YXZpZXcgaGVscGVyLCBhbmRcbiAgICAgICAgICogYE51bWJlckNvbXBvbmVudC52YWx1ZUZyb21TdHJpbmdgLCB3aG9zZSBsZW5pZW50IHBhcnNlIGlzIHBhcnQgb2YgYSBwdWJsaXNoZWQgY29tcG9uZW50J3MgYmVoYXZpb3IuXG4gICAgICAgICAqIFRoZSByZXN0IHBhcnNlIG1hY2hpbmUtZ2VuZXJhdGVkIHN0cmluZ3MsIHdoZXJlIHRoZSB0d28gYWdyZWUgYnV0IHRoZSBzaG9ydGVyIHNwZWxsaW5nIHN0aWxsIHdpbnMuXG4gICAgICAgICAqL1xuICAgICAgICAndW5pY29ybi9wcmVmZXItbnVtYmVyLWNvZXJjaW9uJzogJ29mZicsXG4gICAgICAgIC8vIGBQcm9taXNlLndpdGhSZXNvbHZlcnNgIGlzIEVTMjAyNC4gU2VlIHRoZSBFUzIwMjIgZmxvb3Igbm90ZSBhYm92ZS5cbiAgICAgICAgJ3VuaWNvcm4vcHJlZmVyLXByb21pc2Utd2l0aC1yZXNvbHZlcnMnOiAnb2ZmJyxcbiAgICAgICAgLy8gYFNldCN1bmlvbmAgYW5kIGZyaWVuZHMgYXJlIEVTMjAyNS4gU2VlIHRoZSBFUzIwMjIgZmxvb3Igbm90ZSBhYm92ZS5cbiAgICAgICAgJ3VuaWNvcm4vcHJlZmVyLXNldC1tZXRob2RzJzogJ29mZicsXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRoZSBydWxlIHJhbmtzIG9wZXJhbmRzIGJ5IHN5bnRhY3RpYyBzaGFwZSwgbm90IGNvc3QsIHNvIGV2ZXJ5IHJlcG9ydCBoZXJlIHN3YXBzIG9uZSBwcm9wZXJ0eSByZWFkXG4gICAgICAgICAqIGFoZWFkIG9mIGFub3RoZXIgYW5kIGJ1eXMgbm90aGluZy4gSXRzIG93biBtZXNzYWdlIGNvbmNlZGVzIGl0IGNhbm5vdCBjaGVjayB0aGUgcGFydCB0aGF0IG1hdHRlcnMgLS1cbiAgICAgICAgICogXCJhZnRlciB2ZXJpZnlpbmcgc2hvcnQtY2lyY3VpdCBiZWhhdmlvclwiIC0tIGFuZCBvbmUgcmVwb3J0IHNpdHMgZGlyZWN0bHkgdW5kZXIgYSBjb21tZW50IHJlY29yZGluZ1xuICAgICAgICAgKiB0aGF0IHRoZSBvcGVyYW5kcyBjaGFuZ2UgaW5zaWRlIGEgYHJlbmFtZWAgZXZlbnQgaGFuZGxlciwgd2hpY2ggaXMgd2hlcmUgb3JkZXIgc3RvcHMgYmVpbmcgZnJlZS5cbiAgICAgICAgICogVGhlIGN1cnJlbnQgb3JkZXJzIGFsc28gY2FycnkgaW50ZW50OiBhIG51bGwgZ3VhcmQgYmVmb3JlIHRoZSB1c2UgaXQgZ3VhcmRzLCBhbmQgdGhlIGNvbmRpdGlvbiBiZWluZ1xuICAgICAgICAgKiByZXBvcnRlZCBiZWZvcmUgdGhlIHN0YXRlIGl0IGNvbnRyYWRpY3RzLlxuICAgICAgICAgKi9cbiAgICAgICAgJ3VuaWNvcm4vcHJlZmVyLXNpbXBsZS1jb25kaXRpb24tZmlyc3QnOiAnb2ZmJyxcbiAgICAgICAgLypcbiAgICAgICAgICogYFVSTC5jYW5QYXJzZWAgcmVxdWlyZXMgTm9kZSAxOC4xNywgd2VsbCBhYm92ZSB0aGUgTm9kZSAxNi4xNi4wIGZsb29yIHRoYXQgc2hpcHBlZCBzb3VyY2UgdGFyZ2V0c1xuICAgICAgICAgKiAoc2VlIHRoZSBPYnNpZGlhbiBwbHVnaW4gbGF5ZXIncyBgbWluaW11bU5vZGVWZXJzaW9uYCkuIFRoZSBydWxlIGNhbiB0aGVyZWZvcmUgbmV2ZXIgYmUgc2F0aXNmaWVkIHRoZXJlLCBzbyBpdCBpcyBvZmYgYXQgdGhlXG4gICAgICAgICAqIGNvbmZpZyBsZXZlbCByYXRoZXIgdGhhbiBhbm5vdGF0ZWQgYXQgZWFjaCBjYWxsIHNpdGUuXG4gICAgICAgICAqL1xuICAgICAgICAndW5pY29ybi9wcmVmZXItdXJsLWNhbi1wYXJzZSc6ICdvZmYnLFxuICAgICAgICAvKlxuICAgICAgICAgKiBFdmVyeSBhcnJheSByZXBvcnRlZCBoZXJlIGhvbGRzIHN0cmluZ3MsIHdoZXJlIHRoZSBkZWZhdWx0IHNvcnQgaXMgYWxyZWFkeSB3ZWxsIGRlZmluZWQgYW5kIGNvcnJlY3QuXG4gICAgICAgICAqIEFkZGluZyB0aGUgY29tcGFyYXRvciB0aGUgcnVsZSBhc2tzIGZvciB3b3VsZCBtZWFuIGNob29zaW5nIGJldHdlZW4gY29kZS11bml0IGFuZCBsb2NhbGUgb3JkZXJpbmcsXG4gICAgICAgICAqIHNvIGZvbGxvd2luZyBpdCB3b3VsZCBDSEFOR0UgdGhlIHNvcnQgcmF0aGVyIHRoYW4gZG9jdW1lbnQgaXQuIFRoZSBydWxlIGVhcm5zIGl0cyBwbGFjZSBvbiBudW1lcmljXG4gICAgICAgICAqIGFycmF5czsgaXQgZG9lcyBub3QgaGF2ZSBhbnkgaGVyZS5cbiAgICAgICAgICovXG4gICAgICAgICd1bmljb3JuL3JlcXVpcmUtYXJyYXktc29ydC1jb21wYXJlJzogJ29mZicsXG4gICAgICAgIC8vIFRoZSBjb2RlYmFzZSBhbHJlYWR5IHNwZWxscyBlbmNvZGluZ3MgdGhlIHdheSB0aGUgRW5jb2RpbmcgU3RhbmRhcmQgZG9lcyAoYHV0Zi04YCksIHdoaWNoIGlzIGFsc28gd2hhdCBgVGV4dERlY29kZXJgIHJlcG9ydHMuIEtlZXAgdGhlIHJ1bGUgZW5mb3JjaW5nIGNvbnNpc3RlbmN5LCBqdXN0IGluIHRoZSBkaXJlY3Rpb24gYWxyZWFkeSBpbiB1c2UuXG4gICAgICAgICd1bmljb3JuL3RleHQtZW5jb2RpbmctaWRlbnRpZmllci1jYXNlJzogW1xuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAge1xuICAgICAgICAgICAgd2l0aERhc2g6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEJ1aWxkL2xpbnQvdmVyc2lvbiBzY3JpcHRzIGFyZSBDTEkgZW50cnkgcG9pbnRzLCB3aGVyZSBleGl0aW5nIHdpdGggYSBzdGF0dXMgY29kZSBpcyB0aGUgaW50ZXJmYWNlLlxuICAgICAgZmlsZXM6IGNvbnRleHQuc2NyaXB0RmlsZXMsXG4gICAgICBydWxlczoge1xuICAgICAgICAndW5pY29ybi9uby1wcm9jZXNzLWV4aXQnOiAnb2ZmJ1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgLypcbiAgICAgICAqIEEgbW9kdWxlLWxldmVsIGZpeHR1cmUgYXNzaWduZWQgZnJvbSBgYmVmb3JlRWFjaGAgaXMgdGhlIHN0YW5kYXJkIHRlc3Qgc2hhcGU6XG4gICAgICAgKlxuICAgICAgICogICBsZXQgYXBwOiBBcHA7XG4gICAgICAgKiAgIGJlZm9yZUVhY2goKCkgPT4geyBhcHAgPSBBcHAuY3JlYXRlQ29uZmlndXJlZF9fKCk7IH0pO1xuICAgICAgICpcbiAgICAgICAqIFRoZSBydWxlIGlzIHJpZ2h0IGFib3V0IHByb2R1Y3Rpb24gY29kZSAtLSBtb2R1bGUgc3RhdGUgcmVhc3NpZ25lZCBmcm9tIGluc2lkZSBhIGZ1bmN0aW9uIGlzIHdvcnRoXG4gICAgICAgKiBmbGFnZ2luZywgYW5kIHRoZSBmaXggaXMgdG8gaG9sZCBpdCBpbiBhIGBjb25zdGAgb2JqZWN0IGluc3RlYWQuIEluIHRlc3RzIHRoYXQgd291bGQgcmVwbGFjZSBldmVyeVxuICAgICAgICogYGFwcGAgd2l0aCBgU1RBVEUuYXBwYCBhbmQgbWFrZSBlYWNoIGZpbGUgcmVhZCB3b3JzZSBmb3Igbm8gZ2Fpbiwgc2luY2UgdGhlIGZpeHR1cmUgaXMgcmVzZXQgcGVyIHRlc3RcbiAgICAgICAqIGJ5IGRlc2lnbi4gU2NvcGVkIG9mZiBoZXJlIHJhdGhlciB0aGFuIGRpc2FibGVkIG91dHJpZ2h0LCBzbyBwcm9kdWN0aW9uIGNvZGUga2VlcHMgdGhlIGNoZWNrLlxuICAgICAgICovXG4gICAgICBmaWxlczogY29udGV4dC50ZXN0RmlsZXMsXG4gICAgICBydWxlczoge1xuICAgICAgICAvKlxuICAgICAgICAgKiBUd28gc2hhcGVzIGhlcmUgY2Fubm90IGZvbGxvdyB0aGUgYWR2aWNlLiBBIGhlbHBlciBkZWZpbmVkIGluc2lkZSBhbiBgZXZhbEluT2JzaWRpYW5gIGNhbGxiYWNrXG4gICAgICAgICAqIGNhbm5vdCBiZSBob2lzdGVkIGF0IGFsbDogdGhlIGNhbGxiYWNrIGlzIHNlcmlhbGl6ZWQgd2l0aCBgdG9TdHJpbmcoKWAgYW5kIHJ1bnMgaW5zaWRlIE9ic2lkaWFuLCBzb1xuICAgICAgICAgKiBhbnl0aGluZyBsZWZ0IGJlaGluZCBpbiB0aGUgbW9kdWxlIHNjb3BlIGlzIHNpbXBseSBub3QgdGhlcmUuIEFuZCBhIHBlci1zdWl0ZSBmYWN0b3J5XG4gICAgICAgICAqIChgY3JlYXRlQ29tcG9uZW50YCwgYGNyZWF0ZU1vY2tQbHVnaW5gKSBpcyBkZWxpYmVyYXRlbHkgbG9jYWwsIGtlZXBpbmcgZWFjaCBzdWl0ZSdzIGZpeHR1cmUgbmV4dCB0b1xuICAgICAgICAgKiB0aGUgYXNzZXJ0aW9ucyB0aGF0IHJlYWQgaXQuIFByb2R1Y3Rpb24gY29kZSBrZWVwcyB0aGUgY2hlY2suXG4gICAgICAgICAqL1xuICAgICAgICAndW5pY29ybi9jb25zaXN0ZW50LWZ1bmN0aW9uLXNjb3BpbmcnOiAnb2ZmJyxcbiAgICAgICAgLypcbiAgICAgICAgICogQSB0ZXN0IGJpbmRpbmcgaXMgbmFtZWQgYWZ0ZXIgdGhlIHRoaW5nIGl0IGNhcHR1cmVzLCBub3QgYWZ0ZXIgd2hhdCBpdCBkb2VzOiBgY3JlYXRlRWxlbWVudFNweWBcbiAgICAgICAgICogaG9sZHMgdGhlIHNweSBvbiBgY3JlYXRlRWxlbWVudGAsIGFuZCBgY3JlYXRlUHJvZ3JhbU9wdGlvbnNgIGhvbGRzIHRoZSBvcHRpb25zIGBjcmVhdGVQcm9ncmFtYCB3YXNcbiAgICAgICAgICogY2FsbGVkIHdpdGguIFRoZSB2ZXJiIGJlbG9uZ3MgdG8gdGhlIG5hbWUgYmVpbmcgcmVmZXJlbmNlZCwgc28gdGhlIHJ1bGUgcmVhZHMgaXQgYXMgYSBmdW5jdGlvbiBuYW1lXG4gICAgICAgICAqIHRoYXQgaXMgbm90IGEgZnVuY3Rpb24uIExlZnQgb24gZm9yIHByb2R1Y3Rpb24gY29kZSwgd2hlcmUgdGhlIGNvbXBsYWludCBpcyB0aGUgcmlnaHQgb25lLlxuICAgICAgICAgKi9cbiAgICAgICAgJ3VuaWNvcm4vbm8tbm9uLWZ1bmN0aW9uLXZlcmItcHJlZml4JzogJ29mZicsXG4gICAgICAgICd1bmljb3JuL25vLXRvcC1sZXZlbC1hc3NpZ25tZW50LWluLWZ1bmN0aW9uJzogJ29mZidcbiAgICAgIH1cbiAgICB9XG4gIF0pO1xufVxuXG4vKiBlc2xpbnQtZW5hYmxlIG5vLW1hZ2ljLW51bWJlcnMgLS0gV2UgZGlzYWJsZWQgbWFnaWMgbnVtYmVycyBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgYWxsIG92ZXIgdGhlIGNvbmZpZ3MuICovXG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQkEscUJBQTRCO0FBQzVCLDRCQUFrQztBQUNsQyxnQkFBbUI7QUFDbkIsa0JBQXFCO0FBRXJCLDJCQUFzQjtBQUN0QiwrQ0FBK0M7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QSxNQUVFLE9BQU8sUUFBUTtBQUFBLE1BQ2YsT0FBTztBQUFBLFFBQ0wsMkJBQTJCO0FBQUEsTUFDN0I7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVlFLE9BQU8sUUFBUTtBQUFBLE1BQ2YsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFRTCx1Q0FBdUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQU92Qyx1Q0FBdUM7QUFBQSxRQUN2QywrQ0FBK0M7QUFBQSxNQUNqRDtBQUFBLElBQ0Y7QUFBQSxFQUNGLENBQUM7QUFDSDsiLAogICJuYW1lcyI6IFsiZXNsaW50IiwgImNvbW1lbnRzQ29uZmlncyIsICJlc2xpbnRQbHVnaW5JbXBvcnRYRmxhdENvbmZpZ3MiLCAibm9kZVBsdWdpbiIsICJwZXJmZWN0aW9uaXN0Q29uZmlncyIsICJzdHlsaXN0aWMiLCAidHNlc2xpbnQiLCAidW5pY29ybiJdCn0K
|