obsidian-dev-utils 78.1.0 → 79.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/dev/main.js +4 -10
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +3 -7
- package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +2 -4
- package/dist/lib/cjs/script-utils/build.cjs +2 -2
- package/dist/lib/cjs/script-utils/build.d.cts +5 -3
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.d.cts +3 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.d.cts +2 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +20 -1
- package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +5 -1
- package/dist/lib/cjs/script-utils/nano-staged-config.cjs +29 -1
- package/dist/lib/cjs/script-utils/nano-staged-config.d.cts +15 -0
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +2 -1
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +2 -0
- package/dist/lib/cjs/script-utils/version.cjs +30 -22
- package/dist/lib/cjs/script-utils/version.d.cts +37 -24
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +4 -8
- package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +6 -5
- package/dist/lib/esm/script-utils/build.d.mts +5 -3
- package/dist/lib/esm/script-utils/build.mjs +2 -2
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.d.mts +3 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.d.mts +2 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.d.mts +1 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +5 -1
- package/dist/lib/esm/script-utils/linters/over-exposure.mjs +22 -1
- package/dist/lib/esm/script-utils/nano-staged-config.d.mts +15 -0
- package/dist/lib/esm/script-utils/nano-staged-config.mjs +18 -1
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +2 -0
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +2 -1
- package/dist/lib/esm/script-utils/version.d.mts +37 -24
- package/dist/lib/esm/script-utils/version.mjs +30 -22
- package/dist/templates/scripts/commitlint-config.ts +3 -0
- package/dist/templates/scripts/eslint-config.ts +10 -0
- package/dist/{scripts → templates/scripts}/linters/over-exposure/find-overexposed-fix.ts +5 -1
- package/dist/{scripts → templates/scripts}/linters/over-exposure/find-overexposed.ts +5 -1
- package/dist/templates/scripts/markdownlint-cli2-config.ts +3 -0
- package/dist/templates/scripts/nano-staged-config.ts +3 -0
- package/dist/templates/scripts/vitest-config.ts +89 -0
- package/package.json +3 -1
- /package/dist/{.markdownlint-cli2.mjs → templates/.markdownlint-cli2.mjs} +0 -0
- /package/dist/{.nano-staged.mjs → templates/.nano-staged.mjs} +0 -0
- /package/dist/{commitlint.config.ts → templates/commitlint.config.ts} +0 -0
- /package/dist/{dprint.json → templates/dprint.json} +0 -0
- /package/dist/{eslint.config.mts → templates/eslint.config.mts} +0 -0
- /package/dist/{scripts → templates/scripts}/build/build-clean.ts +0 -0
- /package/dist/{scripts → templates/scripts}/build/build-compile-svelte.ts +0 -0
- /package/dist/{scripts → templates/scripts}/build/build-compile-typescript.ts +0 -0
- /package/dist/{scripts → templates/scripts}/build/build-compile.ts +0 -0
- /package/dist/{scripts → templates/scripts}/build/build-static.ts +0 -0
- /package/dist/{scripts → templates/scripts}/bundlers/esbuild/build.ts +0 -0
- /package/dist/{scripts → templates/scripts}/bundlers/esbuild/dev.ts +0 -0
- /package/dist/{scripts → templates/scripts}/formatters/dprint/format-check.ts +0 -0
- /package/dist/{scripts → templates/scripts}/formatters/dprint/format.ts +0 -0
- /package/dist/{scripts → templates/scripts}/linters/cspell/spellcheck.ts +0 -0
- /package/dist/{scripts → templates/scripts}/linters/eslint/lint-fix.ts +0 -0
- /package/dist/{scripts → templates/scripts}/linters/eslint/lint.ts +0 -0
- /package/dist/{scripts → templates/scripts}/linters/markdownlint/lint-md-fix.ts +0 -0
- /package/dist/{scripts → templates/scripts}/linters/markdownlint/lint-md.ts +0 -0
- /package/dist/{scripts → templates/scripts}/test-runners/vitest/test-coverage.ts +0 -0
- /package/dist/{scripts → templates/scripts}/test-runners/vitest/test-watch.ts +0 -0
- /package/dist/{scripts → templates/scripts}/test-runners/vitest/test.ts +0 -0
- /package/dist/{scripts → templates/scripts}/version/version.ts +0 -0
- /package/dist/{vitest.config.ts → templates/vitest.config.ts} +0 -0
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
createLanguageService,
|
|
28
28
|
getDecorators,
|
|
29
29
|
getDefaultLibFilePath,
|
|
30
|
+
getLeadingCommentRanges,
|
|
30
31
|
getModifiers,
|
|
31
32
|
isClassDeclaration,
|
|
32
33
|
isClassLike,
|
|
@@ -36,6 +37,7 @@ import {
|
|
|
36
37
|
isIdentifier,
|
|
37
38
|
isInterfaceDeclaration,
|
|
38
39
|
isMethodDeclaration,
|
|
40
|
+
isPrivateIdentifier,
|
|
39
41
|
isPropertyDeclaration,
|
|
40
42
|
isSetAccessorDeclaration,
|
|
41
43
|
isSourceFile,
|
|
@@ -62,6 +64,8 @@ const LIFECYCLE_ALLOWLIST = /* @__PURE__ */ new Set([
|
|
|
62
64
|
"onunload",
|
|
63
65
|
"onunloadImpl"
|
|
64
66
|
]);
|
|
67
|
+
const JSDOC_SECOND_ASTERISK_OFFSET = 2;
|
|
68
|
+
const JSDOC_FOURTH_CHARACTER_OFFSET = 3;
|
|
65
69
|
const MEMBER_EXPOSURE_ORDER = ["private", "protected", "public"];
|
|
66
70
|
const SCOPE_DESCRIPTION = {
|
|
67
71
|
"file-local": "within its own file",
|
|
@@ -139,6 +143,9 @@ function analyzeExport(node, context) {
|
|
|
139
143
|
if (!declaration) {
|
|
140
144
|
return;
|
|
141
145
|
}
|
|
146
|
+
if (hasTsDocComment(declaration)) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
142
149
|
const declFilePath = toCanonical(sourceFile.fileName);
|
|
143
150
|
const nameNodes = getExportedNameNodes(declaration);
|
|
144
151
|
const candidates = [];
|
|
@@ -176,10 +183,16 @@ function analyzeMember(node, context) {
|
|
|
176
183
|
}
|
|
177
184
|
const nameNode = member.name;
|
|
178
185
|
const declaringClass = node.parent;
|
|
186
|
+
if (isPrivateIdentifier(nameNode)) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
179
189
|
const modifierKinds = getModifierKinds(member);
|
|
180
190
|
if (modifierKinds.has(SyntaxKind.StaticKeyword) || modifierKinds.has(SyntaxKind.OverrideKeyword) || LIFECYCLE_ALLOWLIST.has(nameNode.getText())) {
|
|
181
191
|
return;
|
|
182
192
|
}
|
|
193
|
+
if (hasTsDocComment(member)) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
183
196
|
const currentExposure = getCurrentMemberExposure(modifierKinds);
|
|
184
197
|
if (currentExposure === "private") {
|
|
185
198
|
return;
|
|
@@ -456,6 +469,14 @@ function getModifierKinds(node) {
|
|
|
456
469
|
}
|
|
457
470
|
return kinds;
|
|
458
471
|
}
|
|
472
|
+
function hasTsDocComment(node) {
|
|
473
|
+
const sourceFile = node.getSourceFile();
|
|
474
|
+
const fullText = sourceFile.getFullText();
|
|
475
|
+
const commentRanges = getLeadingCommentRanges(fullText, node.getFullStart()) ?? [];
|
|
476
|
+
return commentRanges.some(
|
|
477
|
+
(range) => range.kind === SyntaxKind.MultiLineCommentTrivia && fullText.charAt(range.pos + JSDOC_SECOND_ASTERISK_OFFSET) === "*" && fullText.charAt(range.pos + JSDOC_FOURTH_CHARACTER_OFFSET) !== "/"
|
|
478
|
+
);
|
|
479
|
+
}
|
|
459
480
|
function isDeclarationItself(reference, nameNode) {
|
|
460
481
|
return toCanonical(reference.fileName) === toCanonical(nameNode.getSourceFile().fileName) && reference.start === nameNode.getStart();
|
|
461
482
|
}
|
|
@@ -541,4 +562,4 @@ export {
|
|
|
541
562
|
findOverExposure,
|
|
542
563
|
formatOverExposureFindings
|
|
543
564
|
};
|
|
544
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi5cbiAqXG4gKiBBIG1lbWJlciByZWZlcmVuY2VkIG9ubHkgZnJvbSB0ZXN0IGZpbGVzIGlzIHJlcG9ydGVkIHdpdGgge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5fVxuICogc2V0LCBzdXJmYWNpbmcgbWVtYmVycyB3aWRlbmVkIHB1cmVseSBmb3IgdGVzdGFiaWxpdHkgXHUyMDE0IHRoZSBjYW5vbmljYWwgY2FzZSBmb3IgZXh0cmFjdGluZyBsb2dpY1xuICogaW50byBhbiBpbmRlcGVuZGVudGx5IHRlc3RhYmxlIGNvbXBvbmVudCBpbnN0ZWFkLlxuICpcbiAqIEJleW9uZCByZXBvcnRpbmcsIHBhc3NpbmcgYHNob3VsZEZpeGAgdG8ge0BsaW5rIGZpbmRPdmVyRXhwb3N1cmV9IC8ge0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9XG4gKiByZXdyaXRlcyB0aGUgc291cmNlIGluIHBsYWNlOiBkcm9wcGluZyB0aGUgYGV4cG9ydGAga2V5d29yZCwgb3IgcmVwbGFjaW5nL2luc2VydGluZyBhIGBwcml2YXRlYFxuICogb3IgYHByb3RlY3RlZGAgbW9kaWZpZXIuIEVhY2ggZmluZGluZyB0aGVuIGNhcnJpZXMge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcud2FzRml4ZWR9IC9cbiAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBDaGFuZ2VzIHRoYXQgY2Fubm90IGJlIHNhZmVseSBhdXRvbWF0ZWQgXHUyMDE0IHRob3NlIGZvcmNlZFxuICogb25seSBieSB0ZXN0IHJlZmVyZW5jZXMsIGRlY29yYXRlZCBtZW1iZXJzLCBvciBhbiBgZXhwb3J0YCBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgXHUyMDE0XG4gKiBhcmUgcmVwb3J0ZWQgYXMgc2tpcHBlZCBhbmQgbGVmdCB1bnRvdWNoZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGFzc0RlY2xhcmF0aW9uLFxuICBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBFbnVtRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBJU2NyaXB0U25hcHNob3QsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIFR5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBUeXBlQ2hlY2tlcixcbiAgVmFyaWFibGVTdGF0ZW1lbnRcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7XG4gIGNhbkhhdmVNb2RpZmllcnMsXG4gIGNyZWF0ZURvY3VtZW50UmVnaXN0cnksXG4gIGNyZWF0ZUxhbmd1YWdlU2VydmljZSxcbiAgZ2V0RGVjb3JhdG9ycyxcbiAgZ2V0RGVmYXVsdExpYkZpbGVQYXRoLFxuICBnZXRNb2RpZmllcnMsXG4gIGlzQ2xhc3NEZWNsYXJhdGlvbixcbiAgaXNDbGFzc0xpa2UsXG4gIGlzRW51bURlY2xhcmF0aW9uLFxuICBpc0Z1bmN0aW9uRGVjbGFyYXRpb24sXG4gIGlzR2V0QWNjZXNzb3JEZWNsYXJhdGlvbixcbiAgaXNJZGVudGlmaWVyLFxuICBpc0ludGVyZmFjZURlY2xhcmF0aW9uLFxuICBpc01ldGhvZERlY2xhcmF0aW9uLFxuICBpc1Byb3BlcnR5RGVjbGFyYXRpb24sXG4gIGlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbixcbiAgaXNTb3VyY2VGaWxlLFxuICBpc1R5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBpc1ZhcmlhYmxlU3RhdGVtZW50LFxuICBTY3JpcHRTbmFwc2hvdCxcbiAgU3ludGF4S2luZCxcbiAgc3lzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJy4uLy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7XG4gIHBhcnNlVHNDb25maWcsXG4gIHRvQ2Fub25pY2FsXG59IGZyb20gJy4uL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqIFRoZSBsYW5ndWFnZSBzZXJ2aWNlIHRvIHF1ZXJ5IGZvciByZWZlcmVuY2VzIGFuZCB0eXBlcy4gKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGJlZm9yZSB0aGF0IGZpbGUgaXMgcHJvY2Vzc2VkLiBUaGVcbiAgICogd2hvbGUtcHJvZ3JhbSByZWZlcmVuY2UgYW5hbHlzaXMgaXMgc2xvdywgc28gdGhpcyBsZXRzIGNhbGxlcnMgcmVwb3J0IGxpdmUgcHJvZ3Jlc3MgaW5zdGVhZCBvZlxuICAgKiBhcHBlYXJpbmcgdG8gaGFuZy5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBlYWNoIGZpeGFibGUgZmluZGluZyBpcyB0aWdodGVuZWQgaW4gcGxhY2UgdmlhIHtAbGluayB3cml0ZUZpbGV9ICh3aGljaCBtdXN0IHRoZW5cbiAgICogYmUgcHJvdmlkZWQpLCBhbmQgdGhlIHJldHVybmVkIGZpbmRpbmdzIGNhcnJ5IHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gICAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBXaGVuIGBmYWxzZWAgb3Igb21pdHRlZCwgdGhlIGFuYWx5c2lzIG9ubHkgcmVwb3J0cy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZpeD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHByb2plY3QncyBgc3JjYCBmb2xkZXIuIE9ubHkgZGVjbGFyYXRpb25zIGluIG5vbi10ZXN0IGZpbGVzXG4gICAqIHVuZGVyIHRoaXMgZm9sZGVyIGFyZSBhbmFseXplZDsgZGVjbGFyYXRpb25zIGVsc2V3aGVyZSAodGVzdCBmaWxlcywgZGVwZW5kZW5jaWVzKSBhcmUgaWdub3JlZFxuICAgKiBidXQgc3RpbGwgY291bnRlZCBhcyByZWZlcmVuY2Ugc2l0ZXMuXG4gICAqL1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSB0aWdodGVuZWQgY29udGVudHMgb2YgYSBjaGFuZ2VkIGZpbGUgYmFjayB0byBkaXNrLiBSZXF1aXJlZCB3aGVuIHtAbGluayBzaG91bGRGaXh9XG4gICAqIGlzIGB0cnVlYDsgaWdub3JlZCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byB3cml0ZSAob3JpZ2luYWwgY2FzaW5nLCBhcyBzdG9yZWQgaW4gdGhlIHByb2dyYW0pLlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBmdWxsIG5ldyBmaWxlIGNvbnRlbnRzLlxuICAgKi9cbiAgd3JpdGVGaWxlPyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMge1xuICAvKiogVGhlIGNvbXBpbGVyIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuXG4gIC8qKiBUaGUgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvZ3JhbS4gKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogVGhlIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCB0byByZWFkIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGZpbGVTeXN0ZW06IE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW07XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC4gKi9cbiAgcmVhZG9ubHkgdHNDb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY3VycmVudGx5IGhhcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VycmVudEV4cG9zdXJlID0gJ2V4cG9ydCcgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGZvciBsaXZlIHByb2dyZXNzIHJlcG9ydGluZy4gRm9yd2FyZGVkXG4gICAqIHRvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLiAqL1xuICByZWFkb25seSBwcm9qZWN0Rm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBmaXhhYmxlIGZpbmRpbmdzIGFyZSB0aWdodGVuZWQgaW4gcGxhY2Ugb24gZGlzayAodGhlIGBleHBvcnRgIGtleXdvcmQgaXMgZHJvcHBlZCxcbiAgICogb3IgYSBgcHJpdmF0ZWAgLyBgcHJvdGVjdGVkYCBtb2RpZmllciBpcyBpbnNlcnRlZC9yZXBsYWNlZCkuIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGVcbiAgICogcHJvamVjdCBpcyBvbmx5IGFuYWx5emVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVuIHNldCwgZmlsZSBwYXRocyBpbiB0aGUgcmVwb3J0IGFyZSByZW5kZXJlZCByZWxhdGl2ZSB0byB0aGlzIGZvbGRlciAodHlwaWNhbGx5IHRoZSBjdXJyZW50XG4gICAqIHdvcmtpbmcgZGlyZWN0b3J5KSBpbnN0ZWFkIG9mIGFzIGFic29sdXRlIHBhdGhzLiBQYXRocyBvdXRzaWRlIHRoZSBmb2xkZXIgc3RheSBhYnNvbHV0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VGb2xkZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBmaWxlLXN5c3RlbSBvcGVyYXRpb25zIHRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QgbmVlZHMuIEluamVjdGluZyB0aGlzIChyYXRoZXIgdGhhblxuICogYWx3YXlzIHVzaW5nIGB0eXBlc2NyaXB0YCdzIGBzeXNgKSBsZXRzIHRlc3RzIGRyaXZlIHRoZSBhbmFseXplciBhZ2FpbnN0IGluLW1lbW9yeSBzb3VyY2VzIHdpdGggbm9cbiAqIHJlYWwgZmlsZS1zeXN0ZW0gYWNjZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW0ge1xuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqL1xuICBkaXJlY3RvcnlFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBmaWxlIGV4aXN0cy5cbiAgICovXG4gIGZpbGVFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICBnZXRDdXJyZW50RGlyZWN0b3J5KHRoaXM6IHZvaWQpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBpbW1lZGlhdGUgc3ViZGlyZWN0b3J5IG5hbWVzLlxuICAgKi9cbiAgZ2V0RGlyZWN0b3JpZXModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm9vdCBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBleHRlbnNpb25zIC0gRXh0ZW5zaW9ucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZXhjbHVkZSAtIFBhdHRlcm5zIHRvIGV4Y2x1ZGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gUGF0dGVybnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIGRlcHRoIC0gTWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVhZERpcmVjdG9yeSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGV4dGVuc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSwgZXhjbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdLCBpbmNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGRlcHRoPzogbnVtYmVyKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyBUaGUgZmlsZSBjb250ZW50cywgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICByZWFkRmlsZSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICAvKiogMS1iYXNlZCBjb2x1bW4gb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGV4cG9zdXJlIGxldmVsLiAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKiogQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBkZWNsYXJpbmcgdGhlIHN5bWJvbC4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIGhhcyBubyByZWZlcmVuY2VzIGF0IGFsbCAoYmVzaWRlcyBpdHNlbGYpLiAqL1xuICByZWFkb25seSBoYXNOb1JlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIHRoZSBkZWNsYXJhdGlvbiB3b3VsZCBxdWFsaWZ5IGZvciBhIHRpZ2h0ZXIgZXhwb3N1cmUgaWYgbm90IGZvciByZWZlcmVuY2VzIGNvbWluZ1xuICAgKiBleGNsdXNpdmVseSBmcm9tIHRlc3QgZmlsZXMgXHUyMDE0IGkuZS4gaXQgaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNGb3JjZWRCeVRlc3RPbmx5OiBib29sZWFuO1xuXG4gIC8qKiBgdHJ1ZWAgZm9yIGEgY2xhc3MgbWVtYmVyLCBgZmFsc2VgIGZvciBhIHRvcC1sZXZlbCBleHBvcnQuICovXG4gIHJlYWRvbmx5IGlzTWVtYmVyOiBib29sZWFuO1xuXG4gIC8qKiAxLWJhc2VkIGxpbmUgb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKiBUaGUgZGVjbGFyZWQgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbiBhIGZpeCBydW4sIHdoeSB0aGlzIGZpbmRpbmcgd2FzIGxlZnQgdW50b3VjaGVkIGluc3RlYWQgb2YgdGlnaHRlbmVkOyBgbnVsbGAgd2hlbiBpdCB3YXNcbiAgICogZml4ZWQgb3Igd2hlbiB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRlZCAoYHNob3VsZEZpeGAgb2ZmKS5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBSZWFzb246IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uO1xuXG4gIC8qKiBUaGUgZXhwb3N1cmUgdGhlIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHRpZ2h0ZW5lZCB0by4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlO1xuXG4gIC8qKiBgdHJ1ZWAgd2hlbiBhIGZpeCBydW4gdGlnaHRlbmVkIHRoaXMgZGVjbGFyYXRpb24gaW4gcGxhY2UuIEFsd2F5cyBgZmFsc2VgIGluIGEgcmVwb3J0IHJ1bi4gKi9cbiAgcmVhZG9ubHkgd2FzRml4ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvZ3Jlc3MgcmVwb3J0ZWQgd2hpbGUgYW5hbHl6aW5nIGEgcHJvamVjdCwgb25lIGV2ZW50IHBlciBhbmFseXplZCBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVyRXhwb3N1cmVQcm9ncmVzcyB7XG4gIC8qKiBOdW1iZXIgb2Ygc291cmNlIGZpbGVzIGZ1bGx5IGFuYWx5emVkIGJlZm9yZSB0aGUgY3VycmVudCBvbmUgKDAtYmFzZWQpLiAqL1xuICByZWFkb25seSBhbmFseXplZEZpbGVDb3VudDogbnVtYmVyO1xuXG4gIC8qKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZSBhYm91dCB0byBiZSBhbmFseXplZC4gKi9cbiAgcmVhZG9ubHkgY3VycmVudEZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRvdGFsIG51bWJlciBvZiBzb3VyY2UgZmlsZXMgdGhhdCB3aWxsIGJlIGFuYWx5emVkLiAqL1xuICByZWFkb25seSB0b3RhbEZpbGVDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoeSBhIGZpeCBydW4gbGVmdCBhIGZpbmRpbmcgdW50b3VjaGVkOlxuICpcbiAqIC0gYGRlY29yYXRlZGAgXHUyMDE0IHRoZSBtZW1iZXIgY2FycmllcyBhIGRlY29yYXRvciwgc28gdGhlIG1vZGlmaWVyIGluc2VydGlvbiBwb2ludCBpcyBhbWJpZ3VvdXMuXG4gKiAtIGBzaGFyZWQtZXhwb3J0YCBcdTIwMTQgdGhlIGBleHBvcnRgIGtleXdvcmQgaXMgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIGRlY2xhcmF0b3IuXG4gKiAtIGB0ZXN0LW9ubHlgIFx1MjAxNCB0aGUgZGVjbGFyYXRpb24gaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RzLCBzbyB0aWdodGVuaW5nIHdvdWxkIGJyZWFrIHRoZSB0ZXN0LlxuICovXG5leHBvcnQgdHlwZSBPdmVyRXhwb3N1cmVTa2lwUmVhc29uID0gJ2RlY29yYXRlZCcgfCAnc2hhcmVkLWV4cG9ydCcgfCAndGVzdC1vbmx5JztcblxuLyoqXG4gKiBUaGUgKHRpZ2h0ZXIpIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkRXhwb3N1cmUgPSAnZmlsZS1sb2NhbCcgfCAncHJpdmF0ZScgfCAncHJvdGVjdGVkJztcblxuLyoqXG4gKiBMaWZlY3ljbGUgYW5kIGZyYW1ld29yayBtZW1iZXJzIGludm9rZWQgYnkgT2JzaWRpYW4gb3IgYSBiYXNlIGNsYXNzIHZpYSByZWdpc3RyYXRpb24gcmF0aGVyIHRoYW5cbiAqIGJ5IHJlZmVyZW5jZXMgdGhlIGxhbmd1YWdlIHNlcnZpY2UgY2FuIHNlZS4gVGlnaHRlbmluZyB0aGVzZSB3b3VsZCBicmVhayB0aGUgZnJhbWV3b3JrIGNvbnRyYWN0LFxuICogc28gdGhleSBhcmUgbmV2ZXIgcmVwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfQUxMT1dMSVNUOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ2Rpc3BsYXknLFxuICAnaGlkZScsXG4gICdvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLFxuICAnb25MYXlvdXRSZWFkeScsXG4gICdvbmxvYWQnLFxuICAnb25sb2FkSW1wbCcsXG4gICdvbkxvYWRTZXR0aW5ncycsXG4gICdvblNhdmVTZXR0aW5ncycsXG4gICdvbnVubG9hZCcsXG4gICdvbnVubG9hZEltcGwnXG5dKTtcblxuaW50ZXJmYWNlIEFuYWx5c2lzQ29udGV4dCB7XG4gIHJlYWRvbmx5IGNoZWNrZXI6IFR5cGVDaGVja2VyO1xuICByZWFkb25seSBlZGl0czogKG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdClbXTtcbiAgcmVhZG9ubHkgZmluZGluZ3M6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXTtcbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG59XG5cbmludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGVkaXRzOiByZWFkb25seSAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xufVxuXG50eXBlIENsYXNzTWVtYmVyRGVjbGFyYXRpb24gPSBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcblxudHlwZSBFeHBvcnRhYmxlRGVjbGFyYXRpb24gPSBDbGFzc0RlY2xhcmF0aW9uIHwgRW51bURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBWYXJpYWJsZVN0YXRlbWVudDtcblxuaW50ZXJmYWNlIEV4cG9ydEZpbmRpbmdDYW5kaWRhdGUge1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xuICByZWFkb25seSBpc1BsYWluRmlsZUxvY2FsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmluZGluZ0ZsYWdzIHtcbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG59XG5cbnR5cGUgTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIEEgc2luZ2xlIGluLXBsYWNlIHRleHQgcmVwbGFjZW1lbnQgdGhhdCB0aWdodGVucyBhIGRlY2xhcmF0aW9uJ3MgZXhwb3N1cmUuIEEgemVyby1sZW5ndGggZWRpdCBpc1xuICogYW4gaW5zZXJ0aW9uIChlLmcuIGFkZGluZyBhbiBleHBsaWNpdCBgcHJpdmF0ZWAgbW9kaWZpZXIgdG8gYW4gaW1wbGljaXRseS1gcHVibGljYCBtZW1iZXIpLlxuICovXG5pbnRlcmZhY2UgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsZW5ndGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmV3VGV4dDogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUmVmZXJlbmNlTG9jYXRpb24ge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU291cmNlRmlsZVRleHQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbmNvbnN0IE1FTUJFUl9FWFBPU1VSRV9PUkRFUjogcmVhZG9ubHkgTWVtYmVyRXhwb3N1cmVbXSA9IFsncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJ107XG5jb25zdCBTQ09QRV9ERVNDUklQVElPTjogUmVjb3JkPFN1Z2dlc3RlZEV4cG9zdXJlLCBzdHJpbmc+ID0ge1xuICAnZmlsZS1sb2NhbCc6ICd3aXRoaW4gaXRzIG93biBmaWxlJyxcbiAgJ3ByaXZhdGUnOiAnaW5zaWRlIGl0cyBvd24gY2xhc3MnLFxuICAncHJvdGVjdGVkJzogJ2luc2lkZSBpdHMgY2xhc3MgKyBzdWJjbGFzc2VzJ1xufTtcbmNvbnN0IFNLSVBfUkVBU09OX0RFU0NSSVBUSU9OOiBSZWNvcmQ8T3ZlckV4cG9zdXJlU2tpcFJlYXNvbiwgc3RyaW5nPiA9IHtcbiAgJ2RlY29yYXRlZCc6ICdkZWNvcmF0ZWQgbWVtYmVyJyxcbiAgJ3NoYXJlZC1leHBvcnQnOiAnZXhwb3J0IHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZycsXG4gICd0ZXN0LW9ubHknOiAnZXhwb3NlZCBvbmx5IGZvciB0ZXN0cydcbn07XG5jb25zdCBWSVNJQklMSVRZX01PRElGSUVSX0tJTkRTOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiA9IG5ldyBTZXQ8U3ludGF4S2luZD4oW1N5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQsIFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCwgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXSk7XG5jb25zdCBXSElURVNQQUNFX1BBVFRFUk4gPSAvXFxzLztcblxuLyoqXG4gKiBBbmFseXplcyBhIHByb2plY3QgKGFscmVhZHkgbG9hZGVkIGludG8gYSBsYW5ndWFnZSBzZXJ2aWNlKSBmb3Igb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgYW5kIFx1MjAxNFxuICogd2hlbiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGaXh9IGlzIHNldCBcdTIwMTQgdGlnaHRlbnMgZXZlcnkgZml4YWJsZSBmaW5kaW5nIGluIHBsYWNlXG4gKiB2aWEge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMud3JpdGVGaWxlfS4gRmluZGluZ3MgdGhhdCBjYW5ub3QgYmUgc2FmZWx5IGF1dG9tYXRlZCAoZXhwb3NlZFxuICogb25seSBmb3IgdGVzdHMsIGRlY29yYXRlZCwgb3Igc2hhcmluZyBhbiBgZXhwb3J0YCBrZXl3b3JkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nKSBjYXJyeSBhXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSBhbmQgYXJlIGxlZnQgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMsIGluIGRpc2NvdmVyeSBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuYWx5emVPdmVyRXhwb3N1cmUocGFyYW1zOiBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zKTogT3ZlckV4cG9zdXJlRmluZGluZ1tdIHtcbiAgY29uc3QgcmVzdWx0ID0gcnVuT3ZlckV4cG9zdXJlQW5hbHlzaXMocGFyYW1zKTtcbiAgaWYgKCFwYXJhbXMuc2hvdWxkRml4KSB7XG4gICAgcmV0dXJuIFsuLi5yZXN1bHQuZmluZGluZ3NdO1xuICB9XG5cbiAgY29uc3QgeyB3cml0ZUZpbGUgfSA9IHBhcmFtcztcbiAgYXNzZXJ0Tm9uTnVsbGFibGUod3JpdGVGaWxlLCAnd3JpdGVGaWxlIGlzIHJlcXVpcmVkIHdoZW4gc2hvdWxkRml4IGlzIHRydWUuJyk7XG4gIHJldHVybiBhcHBseU92ZXJFeHBvc3VyZUZpeGVzKHJlc3VsdCwgcGFyYW1zLmxhbmd1YWdlU2VydmljZS5nZXRQcm9ncmFtKCksIHdyaXRlRmlsZSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEge0BsaW5rIExhbmd1YWdlU2VydmljZUhvc3R9IGJhY2tlZCBieSBhbiBleHBsaWNpdCBmaWxlIGxpc3QgYW5kIGZpbGUgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGxhbmd1YWdlLXNlcnZpY2UgaG9zdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QocGFyYW1zOiBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zKTogTGFuZ3VhZ2VTZXJ2aWNlSG9zdCB7XG4gIGNvbnN0IHsgY29tcGlsZXJPcHRpb25zLCBmaWxlTmFtZXMsIGZpbGVTeXN0ZW0gfSA9IHBhcmFtcztcbiAgcmV0dXJuIHtcbiAgICBkaXJlY3RvcnlFeGlzdHM6IChkaXJlY3RvcnkpID0+IGZpbGVTeXN0ZW0uZGlyZWN0b3J5RXhpc3RzKGRpcmVjdG9yeSksXG4gICAgZmlsZUV4aXN0czogKGZpbGUpID0+IGZpbGVTeXN0ZW0uZmlsZUV4aXN0cyhmaWxlKSxcbiAgICBnZXRDb21waWxhdGlvblNldHRpbmdzOiAoKSA9PiBjb21waWxlck9wdGlvbnMsXG4gICAgZ2V0Q3VycmVudERpcmVjdG9yeTogKCkgPT4gZmlsZVN5c3RlbS5nZXRDdXJyZW50RGlyZWN0b3J5KCksXG4gICAgZ2V0RGVmYXVsdExpYkZpbGVOYW1lOiAobGliT3B0aW9ucykgPT4gZ2V0RGVmYXVsdExpYkZpbGVQYXRoKGxpYk9wdGlvbnMpLFxuICAgIGdldERpcmVjdG9yaWVzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmdldERpcmVjdG9yaWVzKGRpcmVjdG9yeSksXG4gICAgZ2V0U2NyaXB0RmlsZU5hbWVzOiAoKSA9PiBbLi4uZmlsZU5hbWVzXSxcbiAgICBnZXRTY3JpcHRTbmFwc2hvdDogKGZpbGVOYW1lKTogSVNjcmlwdFNuYXBzaG90IHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGVOYW1lKTtcbiAgICAgIHJldHVybiB0ZXh0ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTY3JpcHRTbmFwc2hvdC5mcm9tU3RyaW5nKHRleHQpO1xuICAgIH0sXG4gICAgZ2V0U2NyaXB0VmVyc2lvbjogKCkgPT4gJzAnLFxuICAgIHJlYWREaXJlY3Rvcnk6IChwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCkgPT4gZmlsZVN5c3RlbS5yZWFkRGlyZWN0b3J5KHBhdGgsIGV4dGVuc2lvbnMsIGV4Y2x1ZGUsIGluY2x1ZGUsIGRlcHRoKSxcbiAgICByZWFkRmlsZTogKGZpbGUpID0+IGZpbGVTeXN0ZW0ucmVhZEZpbGUoZmlsZSlcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBsYW5ndWFnZSBzZXJ2aWNlIG92ZXIgZXZlcnkgZmlsZSBpbiBhIHByb2plY3QncyBgdHNjb25maWcuanNvbmAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtc30uXG4gKiBAcmV0dXJucyBBIGxhbmd1YWdlIHNlcnZpY2UgcmVhZHkgZm9yIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UocGFyYW1zOiBDcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlUGFyYW1zKTogTGFuZ3VhZ2VTZXJ2aWNlIHtcbiAgY29uc3QgeyBmaWxlTmFtZXMsIG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcocGFyYW1zLnRzQ29uZmlnUGF0aCk7XG4gIHJldHVybiBjcmVhdGVMYW5ndWFnZVNlcnZpY2UoY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdCh7IGNvbXBpbGVyT3B0aW9uczogb3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtOiBzeXMgfSksIGNyZWF0ZURvY3VtZW50UmVnaXN0cnkoKSk7XG59XG5cbi8qKlxuICogRmluZHMgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBpbiBhIHByb2plY3Qgb24gZGlzay4gV2hlblxuICoge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXMuc2hvdWxkRml4fSBpcyBzZXQsIGVhY2ggZml4YWJsZSBmaW5kaW5nIGlzIGFsc28gdGlnaHRlbmVkIGluIHBsYWNlXG4gKiAocmV3cml0aW5nIHRoZSBhZmZlY3RlZCBzb3VyY2UgZmlsZXMgdmlhIGB0eXBlc2NyaXB0YCdzIGBzeXMud3JpdGVGaWxlYCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgRmluZE92ZXJFeHBvc3VyZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPdmVyRXhwb3N1cmUocGFyYW1zOiBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zKTogT3ZlckV4cG9zdXJlRmluZGluZ1tdIHtcbiAgY29uc3QgcHJvamVjdEZvbGRlciA9IHRvQ2Fub25pY2FsKHBhcmFtcy5wcm9qZWN0Rm9sZGVyKTtcbiAgY29uc3QgbGFuZ3VhZ2VTZXJ2aWNlID0gY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZSh7IHRzQ29uZmlnUGF0aDogYCR7cHJvamVjdEZvbGRlcn0vdHNjb25maWcuanNvbmAgfSk7XG4gIHJldHVybiBhbmFseXplT3ZlckV4cG9zdXJlKHtcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgc2hvdWxkRml4OiBwYXJhbXMuc2hvdWxkRml4LFxuICAgIHNyY0ZvbGRlcjogYCR7cHJvamVjdEZvbGRlcn0vc3JjYCxcbiAgICB3cml0ZUZpbGU6IChwYXRoLCBjb250ZW50KSA9PiB7XG4gICAgICBzeXMud3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xuICAgIH0sXG4gICAgLi4ucGFyYW1zLm9uUHJvZ3Jlc3MgPyB7IG9uUHJvZ3Jlc3M6IHBhcmFtcy5vblByb2dyZXNzIH0gOiB7fVxuICB9KTtcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG92ZXItZXhwb3N1cmUgZmluZGluZ3MgYXMgYSBodW1hbi1yZWFkYWJsZSByZXBvcnQsIHVzaW5nIHRoZSBncm91cGVkIGxheW91dCBvZiBFU0xpbnQnc1xuICogYHN0eWxpc2hgIGZvcm1hdHRlci4gRmluZGluZ3MgYXJlIGdyb3VwZWQgYnkgZmlsZSBhbmQgc29ydGVkIGJ5IGxpbmU6IGVhY2ggZmlsZSBpcyByZW5kZXJlZCBhcyBhXG4gKiBgcGF0aGAgaGVhZGVyIGxpbmUsIGZvbGxvd2VkIGJ5IG9uZSBpbmRlbnRlZCBgICBsaW5lOmNvbHVtbiAgY2hhbmdlIC0tIHJlYXNvbmAgcm93IHBlciBmaW5kaW5nICh0aGVcbiAqIGBsaW5lOmNvbHVtbmAgaXMgcmlnaHQtcGFkZGVkIHNvIHRoZSByb3dzIGFsaWduIHdpdGhpbiBhIGZpbGUpLiBUZXJtaW5hbHMgc3VjaCBhcyBWUyBDb2RlIHJlbmRlclxuICogZWFjaCBpbmRlbnRlZCBgbGluZTpjb2x1bW5gIGFzIGEgY2xpY2thYmxlIGxpbmsgXHUyMDE0IHJlc29sdmVkIGFnYWluc3QgdGhlIGZpbGUgaGVhZGVyIGFib3ZlIGl0IFx1MjAxNCB0aGF0XG4gKiBqdW1wcyBzdHJhaWdodCB0byB0aGUgZGVjbGFyYXRpb24uIEZpbGUgZ3JvdXBzIGFyZSBzZXBhcmF0ZWQgYnkgYSBibGFuayBsaW5lLiBJbiBhIGZpeCBydW4gKGZpbmRpbmdzXG4gKiBjYXJyeWluZyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy53YXNGaXhlZH0gLyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSkgZWFjaCBjaGFuZ2VcbiAqIHJvdyBpcyBzdWZmaXhlZCB3aXRoIGBbZml4ZWRdYCBvciBgW3NraXBwZWQ6IFx1MjAyNl1gLCBhbmQgdGhlIHRyYWlsaW5nIHN1bW1hcnkgYXBwZW5kcyB0aGUgZml4ZWQvc2tpcHBlZFxuICogY291bnRzLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byBmb3JtYXQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zfS5cbiAqIEByZXR1cm5zIFRoZSByZXBvcnQgdGV4dC4gRW1wdHktZmluZGluZyBpbnB1dCB5aWVsZHMgYSBzaW5nbGUgXCJubyBmaW5kaW5nc1wiIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5ncyhmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdLCBvcHRpb25zPzogRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnTm8gb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBmb3VuZC5cXG4nO1xuICB9XG5cbiAgY29uc3QgYmFzZUZvbGRlciA9IG9wdGlvbnM/LmJhc2VGb2xkZXIgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRvQ2Fub25pY2FsKG9wdGlvbnMuYmFzZUZvbGRlcik7XG4gIGNvbnN0IGxpbmVzID0gZm9ybWF0RmluZGluZ0Jsb2NrcyhmaW5kaW5ncywgYmFzZUZvbGRlcik7XG4gIGxpbmVzLnB1c2goZm9ybWF0U3VtbWFyeShmaW5kaW5ncykpO1xuICByZXR1cm4gYCR7bGluZXMuam9pbignXFxuJyl9XFxuYDtcbn1cblxuZnVuY3Rpb24gYW5hbHl6ZUV4cG9ydChub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBpZiAobm9kZS5wYXJlbnQgIT09IHNvdXJjZUZpbGUgfHwgIWdldE1vZGlmaWVyS2luZHMobm9kZSkuaGFzKFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsYXJhdGlvbiA9IGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGUpO1xuICBpZiAoIWRlY2xhcmF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVjbEZpbGVQYXRoID0gdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gIGNvbnN0IG5hbWVOb2RlcyA9IGdldEV4cG9ydGVkTmFtZU5vZGVzKGRlY2xhcmF0aW9uKTtcbiAgY29uc3QgY2FuZGlkYXRlczogRXhwb3J0RmluZGluZ0NhbmRpZGF0ZVtdID0gW107XG4gIGZvciAoY29uc3QgbmFtZU5vZGUgb2YgbmFtZU5vZGVzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlcyA9IGNvbGxlY3RSZWZlcmVuY2VzKGNvbnRleHQubGFuZ3VhZ2VTZXJ2aWNlLmZpbmRSZWZlcmVuY2VzKHNvdXJjZUZpbGUuZmlsZU5hbWUsIG5hbWVOb2RlLmdldFN0YXJ0KCkpKVxuICAgICAgLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2UsIG5hbWVOb2RlKSk7XG4gICAgY29uc3Qgb3RoZXJGaWxlUmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+IHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkgIT09IGRlY2xGaWxlUGF0aCk7XG5cbiAgICBpZiAob3RoZXJGaWxlUmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgIGZpbmRpbmc6IGJ1aWxkRmluZGluZyhkZWNsYXJhdGlvbiwgbmFtZU5vZGUsICdleHBvcnQnLCAnZmlsZS1sb2NhbCcsIHsgaGFzTm9SZWZlcmVuY2VzOiByZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCwgaXNGb3JjZWRCeVRlc3RPbmx5OiBmYWxzZSB9KSxcbiAgICAgICAgaXNQbGFpbkZpbGVMb2NhbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IG90aGVyRmlsZVJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcbiAgICBpZiAobm9uVGVzdFJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICBmaW5kaW5nOiBidWlsZEZpbmRpbmcoZGVjbGFyYXRpb24sIG5hbWVOb2RlLCAnZXhwb3J0JywgJ2ZpbGUtbG9jYWwnLCB7IGhhc05vUmVmZXJlbmNlczogZmFsc2UsIGlzRm9yY2VkQnlUZXN0T25seTogdHJ1ZSB9KSxcbiAgICAgICAgaXNQbGFpbkZpbGVMb2NhbDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhbkRyb3BFeHBvcnQgPSBjYW5kaWRhdGVzLmxlbmd0aCA9PT0gbmFtZU5vZGVzLmxlbmd0aCAmJiBjYW5kaWRhdGVzLmV2ZXJ5KChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pc1BsYWluRmlsZUxvY2FsKTtcbiAgY29uc3QgZXhwb3J0RWRpdCA9IGNhbkRyb3BFeHBvcnQgPyBjb21wdXRlRXhwb3J0UmVtb3ZhbEVkaXQoZGVjbGFyYXRpb24pIDogbnVsbDtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIHJlY29yZChjb250ZXh0LCBjYW5kaWRhdGUuZmluZGluZywgZXhwb3J0RWRpdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYW5hbHl6ZU1lbWJlcihub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3QgbWVtYmVyID0gYXNDbGFzc01lbWJlcihub2RlKTtcbiAgaWYgKCFtZW1iZXIgfHwgIWlzQ2xhc3NMaWtlKG5vZGUucGFyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBuYW1lTm9kZSA9IG1lbWJlci5uYW1lO1xuICBjb25zdCBkZWNsYXJpbmdDbGFzcyA9IG5vZGUucGFyZW50O1xuXG4gIGNvbnN0IG1vZGlmaWVyS2luZHMgPSBnZXRNb2RpZmllcktpbmRzKG1lbWJlcik7XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpIHx8IG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuT3ZlcnJpZGVLZXl3b3JkKSB8fCBMSUZFQ1lDTEVfQUxMT1dMSVNULmhhcyhuYW1lTm9kZS5nZXRUZXh0KCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY3VycmVudEV4cG9zdXJlID0gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHMpO1xuICBpZiAoY3VycmVudEV4cG9zdXJlID09PSAncHJpdmF0ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gbWVtYmVyLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IGNvbGxlY3RSZWZlcmVuY2VzKGNvbnRleHQubGFuZ3VhZ2VTZXJ2aWNlLmZpbmRSZWZlcmVuY2VzKHNvdXJjZUZpbGUuZmlsZU5hbWUsIG5hbWVOb2RlLmdldFN0YXJ0KCkpKVxuICAgIC5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlLCBuYW1lTm9kZSkpO1xuICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcblxuICBjb25zdCBuZWVkZWRGb3JTcmMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUobm9uVGVzdFJlZmVyZW5jZXMsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KTtcbiAgY29uc3QgbmVlZGVkV2l0aFRlc3RzID0gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKHJlZmVyZW5jZXMsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KTtcblxuICBpZiAobmVlZGVkRm9yU3JjID09PSAncHVibGljJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKSA+PSByYW5rRXhwb3N1cmUoY3VycmVudEV4cG9zdXJlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZpbmRpbmcgPSBidWlsZEZpbmRpbmcobWVtYmVyLCBuYW1lTm9kZSwgY3VycmVudEV4cG9zdXJlLCBuZWVkZWRGb3JTcmMsIHtcbiAgICBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLFxuICAgIGlzRm9yY2VkQnlUZXN0T25seTogcmFua0V4cG9zdXJlKG5lZWRlZFdpdGhUZXN0cykgPiByYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKVxuICB9KTtcbiAgcmVjb3JkKGNvbnRleHQsIGZpbmRpbmcsIGNvbXB1dGVNZW1iZXJFeHBvc3VyZUVkaXQobWVtYmVyLCBuZWVkZWRGb3JTcmMpKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlFZGl0cyh0ZXh0OiBzdHJpbmcsIGVkaXRzOiByZWFkb25seSBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1bmlxdWVFZGl0cyA9IGVkaXRzXG4gICAgLmZpbHRlcigoZWRpdCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7U3RyaW5nKGVkaXQuc3RhcnQpfToke1N0cmluZyhlZGl0Lmxlbmd0aCl9OiR7ZWRpdC5uZXdUZXh0fWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAuc29ydCgoYSwgYikgPT4gYi5zdGFydCAtIGEuc3RhcnQpO1xuXG4gIGxldCByZXN1bHQgPSB0ZXh0O1xuICBmb3IgKGNvbnN0IGVkaXQgb2YgdW5pcXVlRWRpdHMpIHtcbiAgICByZXN1bHQgPSBgJHtyZXN1bHQuc2xpY2UoMCwgZWRpdC5zdGFydCl9JHtlZGl0Lm5ld1RleHR9JHtyZXN1bHQuc2xpY2UoZWRpdC5zdGFydCArIGVkaXQubGVuZ3RoKX1gO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXMoXG4gIHJlc3VsdDogQW5hbHlzaXNSZXN1bHQsXG4gIHByb2dyYW06IFByb2dyYW0gfCB1bmRlZmluZWQsXG4gIHdyaXRlRmlsZTogKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKSA9PiB2b2lkXG4pOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCBlZGl0c0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdPigpO1xuICBjb25zdCBmaW5kaW5ncyA9IHJlc3VsdC5maW5kaW5ncy5tYXAoKGZpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZWRpdCA9IHJlc3VsdC5lZGl0c1tpbmRleF0gPz8gbnVsbDtcbiAgICBjb25zdCBza2lwUmVhc29uID0gZGV0ZXJtaW5lU2tpcFJlYXNvbihmaW5kaW5nLCBlZGl0KTtcbiAgICBpZiAoc2tpcFJlYXNvbiAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgLi4uZmluZGluZywgc2tpcFJlYXNvbiwgd2FzRml4ZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGFzc2VydE5vbk51bGxhYmxlKGVkaXQsICdBIGZpeGFibGUgZmluZGluZyBtdXN0IGNhcnJ5IGEgdGV4dCBlZGl0LicpO1xuICAgIGNvbnN0IGZpbGVFZGl0cyA9IGVkaXRzQnlGaWxlLmdldChlZGl0LmZpbGVOYW1lKSA/PyBbXTtcbiAgICBmaWxlRWRpdHMucHVzaChlZGl0KTtcbiAgICBlZGl0c0J5RmlsZS5zZXQoZWRpdC5maWxlTmFtZSwgZmlsZUVkaXRzKTtcbiAgICByZXR1cm4geyAuLi5maW5kaW5nLCBza2lwUmVhc29uOiBudWxsLCB3YXNGaXhlZDogdHJ1ZSB9O1xuICB9KTtcblxuICBpZiAoZWRpdHNCeUZpbGUuc2l6ZSA+IDApIHtcbiAgICBhc3NlcnROb25OdWxsYWJsZShwcm9ncmFtLCAnQSBwcm9ncmFtIGlzIGV4cGVjdGVkIHdoZW4gdGhlcmUgYXJlIGVkaXRzIHRvIGFwcGx5LicpO1xuICAgIGNvbnN0IHNvdXJjZVRleHRCeUZpbGUgPSBuZXcgTWFwPHN0cmluZywgU291cmNlRmlsZVRleHQ+KCk7XG4gICAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKSkge1xuICAgICAgc291cmNlVGV4dEJ5RmlsZS5zZXQodG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksIHsgZmlsZU5hbWU6IHNvdXJjZUZpbGUuZmlsZU5hbWUsIHRleHQ6IHNvdXJjZUZpbGUudGV4dCB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbY2Fub25pY2FsRmlsZU5hbWUsIGZpbGVFZGl0c10gb2YgZWRpdHNCeUZpbGUpIHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZVRleHRCeUZpbGUuZ2V0KGNhbm9uaWNhbEZpbGVOYW1lKTtcbiAgICAgIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZSwgYFNvdXJjZSBmaWxlIG5vdCBmb3VuZCBpbiBwcm9ncmFtOiAke2Nhbm9uaWNhbEZpbGVOYW1lfWApO1xuICAgICAgd3JpdGVGaWxlKHNvdXJjZS5maWxlTmFtZSwgYXBwbHlFZGl0cyhzb3VyY2UudGV4dCwgZmlsZUVkaXRzKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbmRpbmdzO1xufVxuXG5mdW5jdGlvbiBhc0NsYXNzTWVtYmVyKG5vZGU6IE5vZGUpOiBDbGFzc01lbWJlckRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzTWV0aG9kRGVjbGFyYXRpb24obm9kZSkgfHwgaXNQcm9wZXJ0eURlY2xhcmF0aW9uKG5vZGUpIHx8IGlzR2V0QWNjZXNzb3JEZWNsYXJhdGlvbihub2RlKSB8fCBpc1NldEFjY2Vzc29yRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc0V4cG9ydGFibGVEZWNsYXJhdGlvbihub2RlOiBOb2RlKTogRXhwb3J0YWJsZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKFxuICAgIGlzRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzSW50ZXJmYWNlRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc1R5cGVBbGlhc0RlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNFbnVtRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc1ZhcmlhYmxlU3RhdGVtZW50KG5vZGUpXG4gICkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRmluZGluZyhcbiAgbm9kZTogTm9kZSxcbiAgbmFtZU5vZGU6IE5vZGUsXG4gIGN1cnJlbnRFeHBvc3VyZTogQ3VycmVudEV4cG9zdXJlLFxuICBzdWdnZXN0ZWRFeHBvc3VyZTogU3VnZ2VzdGVkRXhwb3N1cmUsXG4gIGZsYWdzOiBGaW5kaW5nRmxhZ3Ncbik6IE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IHsgY2hhcmFjdGVyLCBsaW5lIH0gPSBzb3VyY2VGaWxlLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKG5hbWVOb2RlLmdldFN0YXJ0KCkpO1xuICByZXR1cm4ge1xuICAgIGNvbHVtbjogY2hhcmFjdGVyICsgMSxcbiAgICBjdXJyZW50RXhwb3N1cmUsXG4gICAgZmlsZVBhdGg6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgIGhhc05vUmVmZXJlbmNlczogZmxhZ3MuaGFzTm9SZWZlcmVuY2VzLFxuICAgIGlzRm9yY2VkQnlUZXN0T25seTogZmxhZ3MuaXNGb3JjZWRCeVRlc3RPbmx5LFxuICAgIGlzTWVtYmVyOiBjdXJyZW50RXhwb3N1cmUgIT09ICdleHBvcnQnLFxuICAgIGxpbmU6IGxpbmUgKyAxLFxuICAgIG5hbWU6IG5hbWVOb2RlLmdldFRleHQoKSxcbiAgICBza2lwUmVhc29uOiBudWxsLFxuICAgIHN1Z2dlc3RlZEV4cG9zdXJlLFxuICAgIHdhc0ZpeGVkOiBmYWxzZVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0UmVmZXJlbmNlcyhyZWZlcmVuY2VkU3ltYm9sczogUmVmZXJlbmNlZFN5bWJvbFtdIHwgdW5kZWZpbmVkKTogUmVmZXJlbmNlTG9jYXRpb25bXSB7XG4gIGNvbnN0IHJlZmVyZW5jZXM6IFJlZmVyZW5jZUxvY2F0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2VkU3ltYm9sIG9mIHJlZmVyZW5jZWRTeW1ib2xzID8/IFtdKSB7XG4gICAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlZFN5bWJvbC5yZWZlcmVuY2VzKSB7XG4gICAgICByZWZlcmVuY2VzLnB1c2goeyBmaWxlTmFtZTogcmVmZXJlbmNlLmZpbGVOYW1lLCBzdGFydDogcmVmZXJlbmNlLnRleHRTcGFuLnN0YXJ0IH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cG9ydFJlbW92YWxFZGl0KGRlY2xhcmF0aW9uOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24pOiBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IGdldE1vZGlmaWVycyhkZWNsYXJhdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG1vZGlmaWVycywgJ01vZGlmaWVycyBleHBlY3RlZCBvbiBhbiBleHBvcnRlZCBkZWNsYXJhdGlvbi4nKTtcbiAgY29uc3QgZXhwb3J0TW9kaWZpZXIgPSBtb2RpZmllcnMuZmluZCgobW9kaWZpZXIpID0+IG1vZGlmaWVyLmtpbmQgPT09IFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCk7XG4gIGFzc2VydE5vbk51bGxhYmxlKGV4cG9ydE1vZGlmaWVyLCAnRXhwb3J0IG1vZGlmaWVyIGV4cGVjdGVkIG9uIGFuIGV4cG9ydGVkIGRlY2xhcmF0aW9uLicpO1xuICBjb25zdCB7IHRleHQgfSA9IHNvdXJjZUZpbGU7XG4gIGxldCBlbmQgPSBleHBvcnRNb2RpZmllci5nZXRFbmQoKTtcbiAgd2hpbGUgKGVuZCA8IHRleHQubGVuZ3RoICYmIFdISVRFU1BBQ0VfUEFUVEVSTi50ZXN0KHRleHQuY2hhckF0KGVuZCkpKSB7XG4gICAgZW5kKys7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBmaWxlTmFtZTogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgbGVuZ3RoOiBlbmQgLSBleHBvcnRNb2RpZmllci5nZXRTdGFydCgpLFxuICAgIG5ld1RleHQ6ICcnLFxuICAgIHN0YXJ0OiBleHBvcnRNb2RpZmllci5nZXRTdGFydCgpXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVNZW1iZXJFeHBvc3VyZUVkaXQobWVtYmVyOiBDbGFzc01lbWJlckRlY2xhcmF0aW9uLCBzdWdnZXN0ZWRFeHBvc3VyZTogJ3ByaXZhdGUnIHwgJ3Byb3RlY3RlZCcpOiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICBpZiAoKGdldERlY29yYXRvcnMobWVtYmVyKSA/PyBbXSkubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IG1lbWJlci5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IGZpbGVOYW1lID0gdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IGdldE1vZGlmaWVycyhtZW1iZXIpID8/IFtdO1xuICBjb25zdCB2aXNpYmlsaXR5TW9kaWZpZXIgPSBtb2RpZmllcnMuZmluZCgobW9kaWZpZXIpID0+IFZJU0lCSUxJVFlfTU9ESUZJRVJfS0lORFMuaGFzKG1vZGlmaWVyLmtpbmQpKTtcbiAgaWYgKHZpc2liaWxpdHlNb2RpZmllcikge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlTmFtZSxcbiAgICAgIGxlbmd0aDogdmlzaWJpbGl0eU1vZGlmaWVyLmdldEVuZCgpIC0gdmlzaWJpbGl0eU1vZGlmaWVyLmdldFN0YXJ0KCksXG4gICAgICBuZXdUZXh0OiBzdWdnZXN0ZWRFeHBvc3VyZSxcbiAgICAgIHN0YXJ0OiB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0U3RhcnQoKVxuICAgIH07XG4gIH1cblxuICBjb25zdCBmaXJzdE1vZGlmaWVyID0gbW9kaWZpZXJzWzBdO1xuICBjb25zdCBpbnNlcnRTdGFydCA9IGZpcnN0TW9kaWZpZXIgPyBmaXJzdE1vZGlmaWVyLmdldFN0YXJ0KCkgOiBtZW1iZXIuZ2V0U3RhcnQoKTtcbiAgcmV0dXJuIHtcbiAgICBmaWxlTmFtZSxcbiAgICBsZW5ndGg6IDAsXG4gICAgbmV3VGV4dDogYCR7c3VnZ2VzdGVkRXhwb3N1cmV9IGAsXG4gICAgc3RhcnQ6IGluc2VydFN0YXJ0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVOZWVkZWRFeHBvc3VyZShcbiAgcmVmZXJlbmNlczogcmVhZG9ubHkgUmVmZXJlbmNlTG9jYXRpb25bXSxcbiAgZGVjbGFyaW5nQ2xhc3M6IENsYXNzTGlrZURlY2xhcmF0aW9uLFxuICBjb250ZXh0OiBBbmFseXNpc0NvbnRleHRcbik6IE1lbWJlckV4cG9zdXJlIHtcbiAgaWYgKHJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdwcml2YXRlJztcbiAgfVxuXG4gIGxldCBuZWVkZWQ6IE1lbWJlckV4cG9zdXJlID0gJ3ByaXZhdGUnO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlQ2xhc3MgPSBnZXRDbGFzc0F0UG9zaXRpb24oY29udGV4dC5wcm9ncmFtLCByZWZlcmVuY2UuZmlsZU5hbWUsIHJlZmVyZW5jZS5zdGFydCk7XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzID09PSBkZWNsYXJpbmdDbGFzcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChyZWZlcmVuY2VDbGFzcyAmJiBpc0Rlcml2ZWRGcm9tKHJlZmVyZW5jZUNsYXNzLCBkZWNsYXJpbmdDbGFzcywgY29udGV4dC5jaGVja2VyKSkge1xuICAgICAgbmVlZGVkID0gJ3Byb3RlY3RlZCc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuICdwdWJsaWMnO1xuICB9XG4gIHJldHVybiBuZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRml4U3RhdHVzKGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcpOiBzdHJpbmcge1xuICBpZiAoZmluZGluZy53YXNGaXhlZCkge1xuICAgIHJldHVybiAnIFtmaXhlZF0nO1xuICB9XG4gIGlmIChmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gYCBbc2tpcHBlZDogJHtTS0lQX1JFQVNPTl9ERVNDUklQVElPTltmaW5kaW5nLnNraXBSZWFzb25dfV1gO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVSZWFzb24oZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBgcmVmZXJlbmNlZCBvbmx5ICR7U0NPUEVfREVTQ1JJUFRJT05bZmluZGluZy5zdWdnZXN0ZWRFeHBvc3VyZV19YDtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5KSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9IChleHBvc2VkIG9ubHkgZm9yIHRlc3RzKWA7XG4gIH1cbiAgaWYgKGZpbmRpbmcuaGFzTm9SZWZlcmVuY2VzKSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9IChubyByZWZlcmVuY2VzIGF0IGFsbClgO1xuICB9XG4gIHJldHVybiBiYXNlO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVTa2lwUmVhc29uKGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcsIGVkaXQ6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdCk6IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uIHtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5KSB7XG4gICAgcmV0dXJuICd0ZXN0LW9ubHknO1xuICB9XG4gIGlmICghZWRpdCkge1xuICAgIHJldHVybiBmaW5kaW5nLmlzTWVtYmVyID8gJ2RlY29yYXRlZCcgOiAnc2hhcmVkLWV4cG9ydCc7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmROb2RlQXRQb3NpdGlvbihub2RlOiBOb2RlLCBwb3NpdGlvbjogbnVtYmVyKTogTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChwb3NpdGlvbiA8IG5vZGUuZ2V0U3RhcnQoKSB8fCBwb3NpdGlvbiA+PSBub2RlLmdldEVuZCgpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgcmVzdWx0OiBOb2RlID0gbm9kZTtcbiAgbm9kZS5mb3JFYWNoQ2hpbGQoKGNoaWxkKSA9PiB7XG4gICAgY29uc3QgZm91bmQgPSBmaW5kTm9kZUF0UG9zaXRpb24oY2hpbGQsIHBvc2l0aW9uKTtcbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIHJlc3VsdCA9IGZvdW5kO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbmRpbmdCbG9ja3MoZmluZGluZ3M6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSwgYmFzZUZvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICBjb25zdCBieUZpbGUgPSBuZXcgTWFwPHN0cmluZywgT3ZlckV4cG9zdXJlRmluZGluZ1tdPigpO1xuICBmb3IgKGNvbnN0IGZpbmRpbmcgb2YgZmluZGluZ3MpIHtcbiAgICBjb25zdCBsaXN0ID0gYnlGaWxlLmdldChmaW5kaW5nLmZpbGVQYXRoKSA/PyBbXTtcbiAgICBsaXN0LnB1c2goZmluZGluZyk7XG4gICAgYnlGaWxlLnNldChmaW5kaW5nLmZpbGVQYXRoLCBsaXN0KTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgbGlzdF0gb2YgYnlGaWxlKSB7XG4gICAgY29uc3Qgc29ydGVkID0gWy4uLmxpc3RdLnNvcnQoKGEsIGIpID0+IGEubGluZSAtIGIubGluZSk7XG4gICAgY29uc3QgbG9jYXRpb25XaWR0aCA9IE1hdGgubWF4KC4uLnNvcnRlZC5tYXAoKGZpbmRpbmcpID0+IGAke1N0cmluZyhmaW5kaW5nLmxpbmUpfToke1N0cmluZyhmaW5kaW5nLmNvbHVtbil9YC5sZW5ndGgpKTtcbiAgICBsaW5lcy5wdXNoKHRvRGlzcGxheVBhdGgoZmlsZVBhdGgsIGJhc2VGb2xkZXIpKTtcbiAgICBmb3IgKGNvbnN0IGZpbmRpbmcgb2Ygc29ydGVkKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGAke1N0cmluZyhmaW5kaW5nLmxpbmUpfToke1N0cmluZyhmaW5kaW5nLmNvbHVtbil9YC5wYWRFbmQobG9jYXRpb25XaWR0aCk7XG4gICAgICBjb25zdCBjaGFuZ2UgPSBgJHtmaW5kaW5nLmN1cnJlbnRFeHBvc3VyZX0gJHtmaW5kaW5nLm5hbWV9IC0+ICR7ZmluZGluZy5zdWdnZXN0ZWRFeHBvc3VyZX1gO1xuICAgICAgbGluZXMucHVzaChgICAke2xvY2F0aW9ufSAgJHtjaGFuZ2V9IC0tICR7ZGVzY3JpYmVSZWFzb24oZmluZGluZyl9JHtkZXNjcmliZUZpeFN0YXR1cyhmaW5kaW5nKX1gKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRTdW1tYXJ5KGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBzdW1tYXJ5ID0gYCR7U3RyaW5nKGZpbmRpbmdzLmxlbmd0aCl9IGZpbmRpbmcocykuYDtcbiAgY29uc3QgZml4ZWRDb3VudCA9IGZpbmRpbmdzLmZpbHRlcigoZmluZGluZykgPT4gZmluZGluZy53YXNGaXhlZCkubGVuZ3RoO1xuICBjb25zdCBza2lwcGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcuc2tpcFJlYXNvbiAhPT0gbnVsbCkubGVuZ3RoO1xuICBpZiAoZml4ZWRDb3VudCA9PT0gMCAmJiBza2lwcGVkQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gc3VtbWFyeTtcbiAgfVxuICByZXR1cm4gYCR7c3VtbWFyeX0gJHtTdHJpbmcoZml4ZWRDb3VudCl9IGZpeGVkLCAke1N0cmluZyhza2lwcGVkQ291bnQpfSBza2lwcGVkLmA7XG59XG5cbmZ1bmN0aW9uIGdldENsYXNzQXRQb3NpdGlvbihwcm9ncmFtOiBQcm9ncmFtLCBmaWxlTmFtZTogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogQ2xhc3NMaWtlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKGZpbGVOYW1lKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoc291cmNlRmlsZSwgYFNvdXJjZSBmaWxlIG5vdCBmb3VuZCBpbiBwcm9ncmFtOiAke2ZpbGVOYW1lfWApO1xuICBjb25zdCBub2RlID0gZmluZE5vZGVBdFBvc2l0aW9uKHNvdXJjZUZpbGUsIHBvc2l0aW9uKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobm9kZSwgYE5vIG5vZGUgZm91bmQgYXQgcG9zaXRpb24gJHtTdHJpbmcocG9zaXRpb24pfSBpbiAke2ZpbGVOYW1lfWApO1xuICByZXR1cm4gZ2V0RW5jbG9zaW5nQ2xhc3Mobm9kZSk7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRNZW1iZXJFeHBvc3VyZShtb2RpZmllcktpbmRzOiBSZWFkb25seVNldDxTeW50YXhLaW5kPik6IE1lbWJlckV4cG9zdXJlIHtcbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpKSB7XG4gICAgcmV0dXJuICdwcml2YXRlJztcbiAgfVxuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkKSkge1xuICAgIHJldHVybiAncHJvdGVjdGVkJztcbiAgfVxuICByZXR1cm4gJ3B1YmxpYyc7XG59XG5cbmZ1bmN0aW9uIGdldEVuY2xvc2luZ0NsYXNzKG5vZGU6IE5vZGUpOiBDbGFzc0xpa2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50OiBOb2RlID0gbm9kZTtcbiAgd2hpbGUgKCFpc1NvdXJjZUZpbGUoY3VycmVudCkpIHtcbiAgICBpZiAoaXNDbGFzc0xpa2UoY3VycmVudCkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhwb3J0ZWROYW1lTm9kZXMoZGVjbGFyYXRpb246IEV4cG9ydGFibGVEZWNsYXJhdGlvbik6IE5vZGVbXSB7XG4gIGlmIChpc1ZhcmlhYmxlU3RhdGVtZW50KGRlY2xhcmF0aW9uKSkge1xuICAgIHJldHVybiBkZWNsYXJhdGlvbi5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLm1hcCgodmFyaWFibGVEZWNsYXJhdGlvbikgPT4gdmFyaWFibGVEZWNsYXJhdGlvbi5uYW1lKS5maWx0ZXIoaXNJZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gZGVjbGFyYXRpb24ubmFtZSA/IFtkZWNsYXJhdGlvbi5uYW1lXSA6IFtdO1xufVxuXG5mdW5jdGlvbiBnZXRNb2RpZmllcktpbmRzKG5vZGU6IE5vZGUpOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiB7XG4gIGNvbnN0IGtpbmRzID0gbmV3IFNldDxTeW50YXhLaW5kPigpO1xuICBpZiAoY2FuSGF2ZU1vZGlmaWVycyhub2RlKSkge1xuICAgIGZvciAoY29uc3QgbW9kaWZpZXIgb2YgZ2V0TW9kaWZpZXJzKG5vZGUpID8/IFtdKSB7XG4gICAgICBraW5kcy5hZGQobW9kaWZpZXIua2luZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBraW5kcztcbn1cblxuZnVuY3Rpb24gaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2U6IFJlZmVyZW5jZUxvY2F0aW9uLCBuYW1lTm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSA9PT0gdG9DYW5vbmljYWwobmFtZU5vZGUuZ2V0U291cmNlRmlsZSgpLmZpbGVOYW1lKSAmJiByZWZlcmVuY2Uuc3RhcnQgPT09IG5hbWVOb2RlLmdldFN0YXJ0KCk7XG59XG5cbmZ1bmN0aW9uIGlzRGVyaXZlZEZyb20oZGVyaXZlZDogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGJhc2U6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjaGVja2VyOiBUeXBlQ2hlY2tlcik6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlU3ltYm9sID0gYmFzZS5uYW1lID8gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKGJhc2UubmFtZSkgOiB1bmRlZmluZWQ7XG4gIGlmICghYmFzZVN5bWJvbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgY2xhdXNlIG9mIGRlcml2ZWQuaGVyaXRhZ2VDbGF1c2VzID8/IFtdKSB7XG4gICAgaWYgKGNsYXVzZS50b2tlbiAhPT0gU3ludGF4S2luZC5FeHRlbmRzS2V5d29yZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHlwZUV4cHJlc3Npb24gb2YgY2xhdXNlLnR5cGVzKSB7XG4gICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHR5cGVFeHByZXNzaW9uLmV4cHJlc3Npb24pLmdldFN5bWJvbCgpO1xuICAgICAgaWYgKHN5bWJvbCA9PT0gYmFzZVN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sPy5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKGlzQ2xhc3NMaWtlKGRlY2xhcmF0aW9uKSAmJiBpc0Rlcml2ZWRGcm9tKGRlY2xhcmF0aW9uLCBiYXNlLCBjaGVja2VyKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNPd25Tb3VyY2VGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIHNyY0ZvbGRlcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3NyY0ZvbGRlcn0vYCkgJiYgZmlsZVBhdGguZW5kc1dpdGgoJy50cycpICYmICFmaWxlUGF0aC5lbmRzV2l0aCgnLmQudHMnKTtcbn1cblxuZnVuY3Rpb24gaXNUZXN0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaWxlUGF0aC5pbmNsdWRlcygnLnRlc3QuJykgfHwgZmlsZVBhdGguaW5jbHVkZXMoJy5pbnRlZ3JhdGlvbi4nKTtcbn1cblxuZnVuY3Rpb24gcmFua0V4cG9zdXJlKGV4cG9zdXJlOiBNZW1iZXJFeHBvc3VyZSk6IG51bWJlciB7XG4gIHJldHVybiBNRU1CRVJfRVhQT1NVUkVfT1JERVIuaW5kZXhPZihleHBvc3VyZSk7XG59XG5cbmZ1bmN0aW9uIHJlY29yZChjb250ZXh0OiBBbmFseXNpc0NvbnRleHQsIGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcsIGVkaXQ6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdCk6IHZvaWQge1xuICBjb250ZXh0LmZpbmRpbmdzLnB1c2goZmluZGluZyk7XG4gIGNvbnRleHQuZWRpdHMucHVzaChlZGl0KTtcbn1cblxuZnVuY3Rpb24gcnVuT3ZlckV4cG9zdXJlQW5hbHlzaXMocGFyYW1zOiBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zKTogQW5hbHlzaXNSZXN1bHQge1xuICBjb25zdCB7IGxhbmd1YWdlU2VydmljZSwgb25Qcm9ncmVzcywgc3JjRm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHByb2dyYW0gPSBsYW5ndWFnZVNlcnZpY2UuZ2V0UHJvZ3JhbSgpO1xuICBpZiAoIXByb2dyYW0pIHtcbiAgICByZXR1cm4geyBlZGl0czogW10sIGZpbmRpbmdzOiBbXSB9O1xuICB9XG5cbiAgY29uc3QgY29udGV4dDogQW5hbHlzaXNDb250ZXh0ID0ge1xuICAgIGNoZWNrZXI6IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKSxcbiAgICBlZGl0czogW10sXG4gICAgZmluZGluZ3M6IFtdLFxuICAgIGxhbmd1YWdlU2VydmljZSxcbiAgICBwcm9ncmFtXG4gIH07XG5cbiAgY29uc3Qgc291cmNlRmlsZXNUb0FuYWx5emUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkuZmlsdGVyKChzb3VyY2VGaWxlKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICByZXR1cm4gaXNPd25Tb3VyY2VGaWxlKGZpbGVQYXRoLCBzcmNGb2xkZXIpICYmICFpc1Rlc3RGaWxlKGZpbGVQYXRoKTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbYW5hbHl6ZWRGaWxlQ291bnQsIHNvdXJjZUZpbGVdIG9mIHNvdXJjZUZpbGVzVG9BbmFseXplLmVudHJpZXMoKSkge1xuICAgIG9uUHJvZ3Jlc3M/Lih7XG4gICAgICBhbmFseXplZEZpbGVDb3VudCxcbiAgICAgIGN1cnJlbnRGaWxlUGF0aDogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgICB0b3RhbEZpbGVDb3VudDogc291cmNlRmlsZXNUb0FuYWx5emUubGVuZ3RoXG4gICAgfSk7XG4gICAgdmlzaXQoc291cmNlRmlsZSk7XG4gIH1cbiAgcmV0dXJuIHsgZWRpdHM6IGNvbnRleHQuZWRpdHMsIGZpbmRpbmdzOiBjb250ZXh0LmZpbmRpbmdzIH07XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIGFuYWx5emVNZW1iZXIobm9kZSwgY29udGV4dCk7XG4gICAgYW5hbHl6ZUV4cG9ydChub2RlLCBjb250ZXh0KTtcbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9EaXNwbGF5UGF0aChmaWxlUGF0aDogc3RyaW5nLCBiYXNlRm9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoYmFzZUZvbGRlciAhPT0gdW5kZWZpbmVkICYmIGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7YmFzZUZvbGRlcn0vYCkpIHtcbiAgICByZXR1cm4gZmlsZVBhdGguc2xpY2UoYmFzZUZvbGRlci5sZW5ndGggKyAxKTtcbiAgfVxuICByZXR1cm4gZmlsZVBhdGg7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVEQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7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
|
|
565
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi4gRUNNQVNjcmlwdCBoYXJkLXByaXZhdGUgbWVtYmVycyAoYCNuYW1lYCkgYXJlIGFsc28gZXhjbHVkZWQgXHUyMDE0XG4gKiB0aGV5IGFyZSBhbHJlYWR5IG1heGltYWxseSBwcml2YXRlIGFuZCBjYW5ub3QgY2FycnkgYSB2aXNpYmlsaXR5IG1vZGlmaWVyLiBBIGRlY2xhcmF0aW9uIGNhcnJ5aW5nXG4gKiBhIFRTRG9jIChgLyoqIFx1MjAyNiAqXFwvYCkgZG9jdW1lbnRhdGlvbiBjb21tZW50IGlzIGxpa2V3aXNlIGV4Y2x1ZGVkIFx1MjAxNCB3aGV0aGVyIGEgdG9wLWxldmVsIGBleHBvcnRgIG9yXG4gKiBhIGNsYXNzIG1lbWJlciwgZG9jdW1lbnRpbmcgaXQgaXMgYSBkZWxpYmVyYXRlIHNpZ25hbCB0aGF0IGl0IGlzIHBhcnQgb2YgdGhlIGludGVuZGVkIHB1YmxpYyBBUEksXG4gKiByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IGN1cnJlbnRseSBoYXBwZW5zIHRvIGJlIHJlZmVyZW5jZWQuXG4gKlxuICogQSBtZW1iZXIgcmVmZXJlbmNlZCBvbmx5IGZyb20gdGVzdCBmaWxlcyBpcyByZXBvcnRlZCB3aXRoIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seX1cbiAqIHNldCwgc3VyZmFjaW5nIG1lbWJlcnMgd2lkZW5lZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0aGUgY2Fub25pY2FsIGNhc2UgZm9yIGV4dHJhY3RpbmcgbG9naWNcbiAqIGludG8gYW4gaW5kZXBlbmRlbnRseSB0ZXN0YWJsZSBjb21wb25lbnQgaW5zdGVhZC5cbiAqXG4gKiBCZXlvbmQgcmVwb3J0aW5nLCBwYXNzaW5nIGBzaG91bGRGaXhgIHRvIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfSAvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfVxuICogcmV3cml0ZXMgdGhlIHNvdXJjZSBpbiBwbGFjZTogZHJvcHBpbmcgdGhlIGBleHBvcnRgIGtleXdvcmQsIG9yIHJlcGxhY2luZy9pbnNlcnRpbmcgYSBgcHJpdmF0ZWBcbiAqIG9yIGBwcm90ZWN0ZWRgIG1vZGlmaWVyLiBFYWNoIGZpbmRpbmcgdGhlbiBjYXJyaWVzIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gQ2hhbmdlcyB0aGF0IGNhbm5vdCBiZSBzYWZlbHkgYXV0b21hdGVkIFx1MjAxNCB0aG9zZSBmb3JjZWRcbiAqIG9ubHkgYnkgdGVzdCByZWZlcmVuY2VzLCBkZWNvcmF0ZWQgbWVtYmVycywgb3IgYW4gYGV4cG9ydGAgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIFx1MjAxNFxuICogYXJlIHJlcG9ydGVkIGFzIHNraXBwZWQgYW5kIGxlZnQgdW50b3VjaGVkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ2xhc3NEZWNsYXJhdGlvbixcbiAgQ2xhc3NMaWtlRGVjbGFyYXRpb24sXG4gIENvbXBpbGVyT3B0aW9ucyxcbiAgRW51bURlY2xhcmF0aW9uLFxuICBGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgSVNjcmlwdFNuYXBzaG90LFxuICBMYW5ndWFnZVNlcnZpY2UsXG4gIExhbmd1YWdlU2VydmljZUhvc3QsXG4gIE1ldGhvZERlY2xhcmF0aW9uLFxuICBOb2RlLFxuICBQcm9ncmFtLFxuICBQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICBSZWZlcmVuY2VkU3ltYm9sLFxuICBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgVHlwZUNoZWNrZXIsXG4gIFZhcmlhYmxlU3RhdGVtZW50XG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICBjYW5IYXZlTW9kaWZpZXJzLFxuICBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5LFxuICBjcmVhdGVMYW5ndWFnZVNlcnZpY2UsXG4gIGdldERlY29yYXRvcnMsXG4gIGdldERlZmF1bHRMaWJGaWxlUGF0aCxcbiAgZ2V0TGVhZGluZ0NvbW1lbnRSYW5nZXMsXG4gIGdldE1vZGlmaWVycyxcbiAgaXNDbGFzc0RlY2xhcmF0aW9uLFxuICBpc0NsYXNzTGlrZSxcbiAgaXNFbnVtRGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc0lkZW50aWZpZXIsXG4gIGlzSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gIGlzTWV0aG9kRGVjbGFyYXRpb24sXG4gIGlzUHJpdmF0ZUlkZW50aWZpZXIsXG4gIGlzUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc1NvdXJjZUZpbGUsXG4gIGlzVHlwZUFsaWFzRGVjbGFyYXRpb24sXG4gIGlzVmFyaWFibGVTdGF0ZW1lbnQsXG4gIFNjcmlwdFNuYXBzaG90LFxuICBTeW50YXhLaW5kLFxuICBzeXNcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VUc0NvbmZpZyxcbiAgdG9DYW5vbmljYWxcbn0gZnJvbSAnLi4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKiogVGhlIGxhbmd1YWdlIHNlcnZpY2UgdG8gcXVlcnkgZm9yIHJlZmVyZW5jZXMgYW5kIHR5cGVzLiAqL1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBvbmNlIHBlciBhbmFseXplZCBzb3VyY2UgZmlsZSwgYmVmb3JlIHRoYXQgZmlsZSBpcyBwcm9jZXNzZWQuIFRoZVxuICAgKiB3aG9sZS1wcm9ncmFtIHJlZmVyZW5jZSBhbmFseXNpcyBpcyBzbG93LCBzbyB0aGlzIGxldHMgY2FsbGVycyByZXBvcnQgbGl2ZSBwcm9ncmVzcyBpbnN0ZWFkIG9mXG4gICAqIGFwcGVhcmluZyB0byBoYW5nLlxuICAgKi9cbiAgb25Qcm9ncmVzcz8odGhpczogdm9pZCwgcHJvZ3Jlc3M6IE92ZXJFeHBvc3VyZVByb2dyZXNzKTogdm9pZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGVhY2ggZml4YWJsZSBmaW5kaW5nIGlzIHRpZ2h0ZW5lZCBpbiBwbGFjZSB2aWEge0BsaW5rIHdyaXRlRmlsZX0gKHdoaWNoIG11c3QgdGhlblxuICAgKiBiZSBwcm92aWRlZCksIGFuZCB0aGUgcmV0dXJuZWQgZmluZGluZ3MgY2Fycnkge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcud2FzRml4ZWR9IC9cbiAgICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0uIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgcHJvamVjdCdzIGBzcmNgIGZvbGRlci4gT25seSBkZWNsYXJhdGlvbnMgaW4gbm9uLXRlc3QgZmlsZXNcbiAgICogdW5kZXIgdGhpcyBmb2xkZXIgYXJlIGFuYWx5emVkOyBkZWNsYXJhdGlvbnMgZWxzZXdoZXJlICh0ZXN0IGZpbGVzLCBkZXBlbmRlbmNpZXMpIGFyZSBpZ25vcmVkXG4gICAqIGJ1dCBzdGlsbCBjb3VudGVkIGFzIHJlZmVyZW5jZSBzaXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIHRpZ2h0ZW5lZCBjb250ZW50cyBvZiBhIGNoYW5nZWQgZmlsZSBiYWNrIHRvIGRpc2suIFJlcXVpcmVkIHdoZW4ge0BsaW5rIHNob3VsZEZpeH1cbiAgICogaXMgYHRydWVgOyBpZ25vcmVkIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHdyaXRlIChvcmlnaW5hbCBjYXNpbmcsIGFzIHN0b3JlZCBpbiB0aGUgcHJvZ3JhbSkuXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGZ1bGwgbmV3IGZpbGUgY29udGVudHMuXG4gICAqL1xuICB3cml0ZUZpbGU/KHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyB7XG4gIC8qKiBUaGUgY29tcGlsZXIgb3B0aW9ucy4gKi9cbiAgcmVhZG9ubHkgY29tcGlsZXJPcHRpb25zOiBDb21waWxlck9wdGlvbnM7XG5cbiAgLyoqIFRoZSBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBwcm9ncmFtLiAqL1xuICByZWFkb25seSBmaWxlTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBUaGUgZmlsZS1zeXN0ZW0gb3BlcmF0aW9ucyB1c2VkIHRvIHJlYWQgc291cmNlcy4gKi9cbiAgcmVhZG9ubHkgZmlsZVN5c3RlbTogT3ZlckV4cG9zdXJlRmlsZVN5c3RlbTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLiAqL1xuICByZWFkb25seSB0c0NvbmZpZ1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZXhwb3N1cmUgbGV2ZWwgYSBkZWNsYXJhdGlvbiBjdXJyZW50bHkgaGFzLlxuICovXG5leHBvcnQgdHlwZSBDdXJyZW50RXhwb3N1cmUgPSAnZXhwb3J0JyB8ICdwcm90ZWN0ZWQnIHwgJ3B1YmxpYyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpbmRPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBvbmNlIHBlciBhbmFseXplZCBzb3VyY2UgZmlsZSwgZm9yIGxpdmUgcHJvZ3Jlc3MgcmVwb3J0aW5nLiBGb3J3YXJkZWRcbiAgICogdG8ge0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICAgKi9cbiAgb25Qcm9ncmVzcz8odGhpczogdm9pZCwgcHJvZ3Jlc3M6IE92ZXJFeHBvc3VyZVByb2dyZXNzKTogdm9pZDtcblxuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290ICh0aGUgZm9sZGVyIGNvbnRhaW5pbmcgYHRzY29uZmlnLmpzb25gIGFuZCBgc3JjYCkuICovXG4gIHJlYWRvbmx5IHByb2plY3RGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGZpeGFibGUgZmluZGluZ3MgYXJlIHRpZ2h0ZW5lZCBpbiBwbGFjZSBvbiBkaXNrICh0aGUgYGV4cG9ydGAga2V5d29yZCBpcyBkcm9wcGVkLFxuICAgKiBvciBhIGBwcml2YXRlYCAvIGBwcm90ZWN0ZWRgIG1vZGlmaWVyIGlzIGluc2VydGVkL3JlcGxhY2VkKS4gV2hlbiBgZmFsc2VgIG9yIG9taXR0ZWQsIHRoZVxuICAgKiBwcm9qZWN0IGlzIG9ubHkgYW5hbHl6ZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGaXg/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBmaWxlIHBhdGhzIGluIHRoZSByZXBvcnQgYXJlIHJlbmRlcmVkIHJlbGF0aXZlIHRvIHRoaXMgZm9sZGVyICh0eXBpY2FsbHkgdGhlIGN1cnJlbnRcbiAgICogd29ya2luZyBkaXJlY3RvcnkpIGluc3RlYWQgb2YgYXMgYWJzb2x1dGUgcGF0aHMuIFBhdGhzIG91dHNpZGUgdGhlIGZvbGRlciBzdGF5IGFic29sdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUZvbGRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdGhlIGxhbmd1YWdlLXNlcnZpY2UgaG9zdCBuZWVkcy4gSW5qZWN0aW5nIHRoaXMgKHJhdGhlciB0aGFuXG4gKiBhbHdheXMgdXNpbmcgYHR5cGVzY3JpcHRgJ3MgYHN5c2ApIGxldHMgdGVzdHMgZHJpdmUgdGhlIGFuYWx5emVyIGFnYWluc3QgaW4tbWVtb3J5IHNvdXJjZXMgd2l0aCBub1xuICogcmVhbCBmaWxlLXN5c3RlbSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmlsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIERpcmVjdG9yeSBwYXRoLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZGlyZWN0b3J5IGV4aXN0cy5cbiAgICovXG4gIGRpcmVjdG9yeUV4aXN0cyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZpbGUgZXhpc3RzLlxuICAgKi9cbiAgZmlsZUV4aXN0cyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIGdldEN1cnJlbnREaXJlY3RvcnkodGhpczogdm9pZCk6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgVGhlIGltbWVkaWF0ZSBzdWJkaXJlY3RvcnkgbmFtZXMuXG4gICAqL1xuICBnZXREaXJlY3Rvcmllcyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBSb290IGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIGV4dGVuc2lvbnMgLSBFeHRlbnNpb25zIHRvIGluY2x1ZGUuXG4gICAqIEBwYXJhbSBleGNsdWRlIC0gUGF0dGVybnMgdG8gZXhjbHVkZS5cbiAgICogQHBhcmFtIGluY2x1ZGUgLSBQYXR0ZXJucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZGVwdGggLSBNYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGZpbGUgcGF0aHMuXG4gICAqL1xuICByZWFkRGlyZWN0b3J5KHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGluY2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSwgZGVwdGg/OiBudW1iZXIpOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBmaWxlIGNvbnRlbnRzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudC5cbiAgICovXG4gIHJlYWRGaWxlKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmluZGluZyB7XG4gIC8qKiAxLWJhc2VkIGNvbHVtbiBvZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lLiAqL1xuICByZWFkb25seSBjb2x1bW46IG51bWJlcjtcblxuICAvKiogVGhlIGN1cnJlbnQgZXhwb3N1cmUgbGV2ZWwuICovXG4gIHJlYWRvbmx5IGN1cnJlbnRFeHBvc3VyZTogQ3VycmVudEV4cG9zdXJlO1xuXG4gIC8qKiBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIGRlY2xhcmluZyB0aGUgc3ltYm9sLiAqL1xuICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gIC8qKiBgdHJ1ZWAgd2hlbiB0aGUgZGVjbGFyYXRpb24gaGFzIG5vIHJlZmVyZW5jZXMgYXQgYWxsIChiZXNpZGVzIGl0c2VsZikuICovXG4gIHJlYWRvbmx5IGhhc05vUmVmZXJlbmNlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIHdvdWxkIHF1YWxpZnkgZm9yIGEgdGlnaHRlciBleHBvc3VyZSBpZiBub3QgZm9yIHJlZmVyZW5jZXMgY29taW5nXG4gICAqIGV4Y2x1c2l2ZWx5IGZyb20gdGVzdCBmaWxlcyBcdTIwMTQgaS5lLiBpdCBpcyBleHBvc2VkIHB1cmVseSBmb3IgdGVzdGFiaWxpdHkuXG4gICAqL1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG5cbiAgLyoqIGB0cnVlYCBmb3IgYSBjbGFzcyBtZW1iZXIsIGBmYWxzZWAgZm9yIGEgdG9wLWxldmVsIGV4cG9ydC4gKi9cbiAgcmVhZG9ubHkgaXNNZW1iZXI6IGJvb2xlYW47XG5cbiAgLyoqIDEtYmFzZWQgbGluZSBvZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lLiAqL1xuICByZWFkb25seSBsaW5lOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBkZWNsYXJlZCBuYW1lLiAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluIGEgZml4IHJ1biwgd2h5IHRoaXMgZmluZGluZyB3YXMgbGVmdCB1bnRvdWNoZWQgaW5zdGVhZCBvZiB0aWdodGVuZWQ7IGBudWxsYCB3aGVuIGl0IHdhc1xuICAgKiBmaXhlZCBvciB3aGVuIHRoZSBhbmFseXNpcyBvbmx5IHJlcG9ydGVkIChgc2hvdWxkRml4YCBvZmYpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFJlYXNvbjogbnVsbCB8IE92ZXJFeHBvc3VyZVNraXBSZWFzb247XG5cbiAgLyoqIFRoZSBleHBvc3VyZSB0aGUgZGVjbGFyYXRpb24gY291bGQgYmUgdGlnaHRlbmVkIHRvLiAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRFeHBvc3VyZTogU3VnZ2VzdGVkRXhwb3N1cmU7XG5cbiAgLyoqIGB0cnVlYCB3aGVuIGEgZml4IHJ1biB0aWdodGVuZWQgdGhpcyBkZWNsYXJhdGlvbiBpbiBwbGFjZS4gQWx3YXlzIGBmYWxzZWAgaW4gYSByZXBvcnQgcnVuLiAqL1xuICByZWFkb25seSB3YXNGaXhlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9ncmVzcyByZXBvcnRlZCB3aGlsZSBhbmFseXppbmcgYSBwcm9qZWN0LCBvbmUgZXZlbnQgcGVyIGFuYWx5emVkIHNvdXJjZSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZVByb2dyZXNzIHtcbiAgLyoqIE51bWJlciBvZiBzb3VyY2UgZmlsZXMgZnVsbHkgYW5hbHl6ZWQgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSAoMC1iYXNlZCkuICovXG4gIHJlYWRvbmx5IGFuYWx5emVkRmlsZUNvdW50OiBudW1iZXI7XG5cbiAgLyoqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlIGFib3V0IHRvIGJlIGFuYWx5emVkLiAqL1xuICByZWFkb25seSBjdXJyZW50RmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogVG90YWwgbnVtYmVyIG9mIHNvdXJjZSBmaWxlcyB0aGF0IHdpbGwgYmUgYW5hbHl6ZWQuICovXG4gIHJlYWRvbmx5IHRvdGFsRmlsZUNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogV2h5IGEgZml4IHJ1biBsZWZ0IGEgZmluZGluZyB1bnRvdWNoZWQ6XG4gKlxuICogLSBgZGVjb3JhdGVkYCBcdTIwMTQgdGhlIG1lbWJlciBjYXJyaWVzIGEgZGVjb3JhdG9yLCBzbyB0aGUgbW9kaWZpZXIgaW5zZXJ0aW9uIHBvaW50IGlzIGFtYmlndW91cy5cbiAqIC0gYHNoYXJlZC1leHBvcnRgIFx1MjAxNCB0aGUgYGV4cG9ydGAga2V5d29yZCBpcyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgZGVjbGFyYXRvci5cbiAqIC0gYHRlc3Qtb25seWAgXHUyMDE0IHRoZSBkZWNsYXJhdGlvbiBpcyBleHBvc2VkIHB1cmVseSBmb3IgdGVzdHMsIHNvIHRpZ2h0ZW5pbmcgd291bGQgYnJlYWsgdGhlIHRlc3QuXG4gKi9cbmV4cG9ydCB0eXBlIE92ZXJFeHBvc3VyZVNraXBSZWFzb24gPSAnZGVjb3JhdGVkJyB8ICdzaGFyZWQtZXhwb3J0JyB8ICd0ZXN0LW9ubHknO1xuXG4vKipcbiAqIFRoZSAodGlnaHRlcikgZXhwb3N1cmUgbGV2ZWwgYSBkZWNsYXJhdGlvbiBjb3VsZCBiZSByZWR1Y2VkIHRvLlxuICovXG5leHBvcnQgdHlwZSBTdWdnZXN0ZWRFeHBvc3VyZSA9ICdmaWxlLWxvY2FsJyB8ICdwcml2YXRlJyB8ICdwcm90ZWN0ZWQnO1xuXG4vKipcbiAqIExpZmVjeWNsZSBhbmQgZnJhbWV3b3JrIG1lbWJlcnMgaW52b2tlZCBieSBPYnNpZGlhbiBvciBhIGJhc2UgY2xhc3MgdmlhIHJlZ2lzdHJhdGlvbiByYXRoZXIgdGhhblxuICogYnkgcmVmZXJlbmNlcyB0aGUgbGFuZ3VhZ2Ugc2VydmljZSBjYW4gc2VlLiBUaWdodGVuaW5nIHRoZXNlIHdvdWxkIGJyZWFrIHRoZSBmcmFtZXdvcmsgY29udHJhY3QsXG4gKiBzbyB0aGV5IGFyZSBuZXZlciByZXBvcnRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IExJRkVDWUNMRV9BTExPV0xJU1Q6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnZGlzcGxheScsXG4gICdoaWRlJyxcbiAgJ29uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZScsXG4gICdvbkxheW91dFJlYWR5JyxcbiAgJ29ubG9hZCcsXG4gICdvbmxvYWRJbXBsJyxcbiAgJ29uTG9hZFNldHRpbmdzJyxcbiAgJ29uU2F2ZVNldHRpbmdzJyxcbiAgJ29udW5sb2FkJyxcbiAgJ29udW5sb2FkSW1wbCdcbl0pO1xuXG5pbnRlcmZhY2UgQW5hbHlzaXNDb250ZXh0IHtcbiAgcmVhZG9ubHkgY2hlY2tlcjogVHlwZUNoZWNrZXI7XG4gIHJlYWRvbmx5IGVkaXRzOiAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbn1cblxuaW50ZXJmYWNlIEFuYWx5c2lzUmVzdWx0IHtcbiAgcmVhZG9ubHkgZWRpdHM6IHJlYWRvbmx5IChudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQpW107XG4gIHJlYWRvbmx5IGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW107XG59XG5cbnR5cGUgQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiA9IEdldEFjY2Vzc29yRGVjbGFyYXRpb24gfCBNZXRob2REZWNsYXJhdGlvbiB8IFByb3BlcnR5RGVjbGFyYXRpb24gfCBTZXRBY2Nlc3NvckRlY2xhcmF0aW9uO1xuXG50eXBlIEV4cG9ydGFibGVEZWNsYXJhdGlvbiA9IENsYXNzRGVjbGFyYXRpb24gfCBFbnVtRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBUeXBlQWxpYXNEZWNsYXJhdGlvbiB8IFZhcmlhYmxlU3RhdGVtZW50O1xuXG5pbnRlcmZhY2UgRXhwb3J0RmluZGluZ0NhbmRpZGF0ZSB7XG4gIHJlYWRvbmx5IGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmc7XG4gIHJlYWRvbmx5IGlzUGxhaW5GaWxlTG9jYWw6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBGaW5kaW5nRmxhZ3Mge1xuICByZWFkb25seSBoYXNOb1JlZmVyZW5jZXM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzRm9yY2VkQnlUZXN0T25seTogYm9vbGVhbjtcbn1cblxudHlwZSBNZW1iZXJFeHBvc3VyZSA9ICdwcml2YXRlJyB8ICdwcm90ZWN0ZWQnIHwgJ3B1YmxpYyc7XG5cbi8qKlxuICogQSBzaW5nbGUgaW4tcGxhY2UgdGV4dCByZXBsYWNlbWVudCB0aGF0IHRpZ2h0ZW5zIGEgZGVjbGFyYXRpb24ncyBleHBvc3VyZS4gQSB6ZXJvLWxlbmd0aCBlZGl0IGlzXG4gKiBhbiBpbnNlcnRpb24gKGUuZy4gYWRkaW5nIGFuIGV4cGxpY2l0IGBwcml2YXRlYCBtb2RpZmllciB0byBhbiBpbXBsaWNpdGx5LWBwdWJsaWNgIG1lbWJlcikuXG4gKi9cbmludGVyZmFjZSBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxlbmd0aDogbnVtYmVyO1xuICByZWFkb25seSBuZXdUZXh0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXJ0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBSZWZlcmVuY2VMb2NhdGlvbiB7XG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXJ0OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBTb3VyY2VGaWxlVGV4dCB7XG4gIHJlYWRvbmx5IGZpbGVOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuLy8gQSBKU0RvYy9UU0RvYyBjb21tZW50IG9wZW5zIHdpdGggYC8qKmA6IHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0IDIgaXMgdGhlIHNlY29uZCBgKmAsIGFuZCB0byBleGNsdWRlIHRoZSBlbXB0eSBgLyoqL2AgY29tbWVudCB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCAzIG11c3Qgbm90IGJlIHRoZSBjbG9zaW5nIGAvYC5cbmNvbnN0IEpTRE9DX1NFQ09ORF9BU1RFUklTS19PRkZTRVQgPSAyO1xuY29uc3QgSlNET0NfRk9VUlRIX0NIQVJBQ1RFUl9PRkZTRVQgPSAzO1xuY29uc3QgTUVNQkVSX0VYUE9TVVJFX09SREVSOiByZWFkb25seSBNZW1iZXJFeHBvc3VyZVtdID0gWydwcml2YXRlJywgJ3Byb3RlY3RlZCcsICdwdWJsaWMnXTtcbmNvbnN0IFNDT1BFX0RFU0NSSVBUSU9OOiBSZWNvcmQ8U3VnZ2VzdGVkRXhwb3N1cmUsIHN0cmluZz4gPSB7XG4gICdmaWxlLWxvY2FsJzogJ3dpdGhpbiBpdHMgb3duIGZpbGUnLFxuICAncHJpdmF0ZSc6ICdpbnNpZGUgaXRzIG93biBjbGFzcycsXG4gICdwcm90ZWN0ZWQnOiAnaW5zaWRlIGl0cyBjbGFzcyArIHN1YmNsYXNzZXMnXG59O1xuY29uc3QgU0tJUF9SRUFTT05fREVTQ1JJUFRJT046IFJlY29yZDxPdmVyRXhwb3N1cmVTa2lwUmVhc29uLCBzdHJpbmc+ID0ge1xuICAnZGVjb3JhdGVkJzogJ2RlY29yYXRlZCBtZW1iZXInLFxuICAnc2hhcmVkLWV4cG9ydCc6ICdleHBvcnQgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nJyxcbiAgJ3Rlc3Qtb25seSc6ICdleHBvc2VkIG9ubHkgZm9yIHRlc3RzJ1xufTtcbmNvbnN0IFZJU0lCSUxJVFlfTU9ESUZJRVJfS0lORFM6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+ID0gbmV3IFNldDxTeW50YXhLaW5kPihbU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCwgU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkLCBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmRdKTtcbmNvbnN0IFdISVRFU1BBQ0VfUEFUVEVSTiA9IC9cXHMvO1xuXG4vKipcbiAqIEFuYWx5emVzIGEgcHJvamVjdCAoYWxyZWFkeSBsb2FkZWQgaW50byBhIGxhbmd1YWdlIHNlcnZpY2UpIGZvciBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zLCBhbmQgXHUyMDE0XG4gKiB3aGVuIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZpeH0gaXMgc2V0IFx1MjAxNCB0aWdodGVucyBldmVyeSBmaXhhYmxlIGZpbmRpbmcgaW4gcGxhY2VcbiAqIHZpYSB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy53cml0ZUZpbGV9LiBGaW5kaW5ncyB0aGF0IGNhbm5vdCBiZSBzYWZlbHkgYXV0b21hdGVkIChleHBvc2VkXG4gKiBvbmx5IGZvciB0ZXN0cywgZGVjb3JhdGVkLCBvciBzaGFyaW5nIGFuIGBleHBvcnRgIGtleXdvcmQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcpIGNhcnJ5IGFcbiAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259IGFuZCBhcmUgbGVmdCB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgaW4gZGlzY292ZXJ5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5hbHl6ZU92ZXJFeHBvc3VyZShwYXJhbXM6IEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCByZXN1bHQgPSBydW5PdmVyRXhwb3N1cmVBbmFseXNpcyhwYXJhbXMpO1xuICBpZiAoIXBhcmFtcy5zaG91bGRGaXgpIHtcbiAgICByZXR1cm4gWy4uLnJlc3VsdC5maW5kaW5nc107XG4gIH1cblxuICBjb25zdCB7IHdyaXRlRmlsZSB9ID0gcGFyYW1zO1xuICBhc3NlcnROb25OdWxsYWJsZSh3cml0ZUZpbGUsICd3cml0ZUZpbGUgaXMgcmVxdWlyZWQgd2hlbiBzaG91bGRGaXggaXMgdHJ1ZS4nKTtcbiAgcmV0dXJuIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXMocmVzdWx0LCBwYXJhbXMubGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKSwgd3JpdGVGaWxlKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB7QGxpbmsgTGFuZ3VhZ2VTZXJ2aWNlSG9zdH0gYmFja2VkIGJ5IGFuIGV4cGxpY2l0IGZpbGUgbGlzdCBhbmQgZmlsZSBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgbGFuZ3VhZ2Utc2VydmljZSBob3N0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdChwYXJhbXM6IENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMpOiBMYW5ndWFnZVNlcnZpY2VIb3N0IHtcbiAgY29uc3QgeyBjb21waWxlck9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbSB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIGRpcmVjdG9yeUV4aXN0czogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5kaXJlY3RvcnlFeGlzdHMoZGlyZWN0b3J5KSxcbiAgICBmaWxlRXhpc3RzOiAoZmlsZSkgPT4gZmlsZVN5c3RlbS5maWxlRXhpc3RzKGZpbGUpLFxuICAgIGdldENvbXBpbGF0aW9uU2V0dGluZ3M6ICgpID0+IGNvbXBpbGVyT3B0aW9ucyxcbiAgICBnZXRDdXJyZW50RGlyZWN0b3J5OiAoKSA9PiBmaWxlU3lzdGVtLmdldEN1cnJlbnREaXJlY3RvcnkoKSxcbiAgICBnZXREZWZhdWx0TGliRmlsZU5hbWU6IChsaWJPcHRpb25zKSA9PiBnZXREZWZhdWx0TGliRmlsZVBhdGgobGliT3B0aW9ucyksXG4gICAgZ2V0RGlyZWN0b3JpZXM6IChkaXJlY3RvcnkpID0+IGZpbGVTeXN0ZW0uZ2V0RGlyZWN0b3JpZXMoZGlyZWN0b3J5KSxcbiAgICBnZXRTY3JpcHRGaWxlTmFtZXM6ICgpID0+IFsuLi5maWxlTmFtZXNdLFxuICAgIGdldFNjcmlwdFNuYXBzaG90OiAoZmlsZU5hbWUpOiBJU2NyaXB0U25hcHNob3QgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IGZpbGVTeXN0ZW0ucmVhZEZpbGUoZmlsZU5hbWUpO1xuICAgICAgcmV0dXJuIHRleHQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFNjcmlwdFNuYXBzaG90LmZyb21TdHJpbmcodGV4dCk7XG4gICAgfSxcbiAgICBnZXRTY3JpcHRWZXJzaW9uOiAoKSA9PiAnMCcsXG4gICAgcmVhZERpcmVjdG9yeTogKHBhdGgsIGV4dGVuc2lvbnMsIGV4Y2x1ZGUsIGluY2x1ZGUsIGRlcHRoKSA9PiBmaWxlU3lzdGVtLnJlYWREaXJlY3RvcnkocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpLFxuICAgIHJlYWRGaWxlOiAoZmlsZSkgPT4gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlKVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGxhbmd1YWdlIHNlcnZpY2Ugb3ZlciBldmVyeSBmaWxlIGluIGEgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEgbGFuZ3VhZ2Ugc2VydmljZSByZWFkeSBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZShwYXJhbXM6IENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMpOiBMYW5ndWFnZVNlcnZpY2Uge1xuICBjb25zdCB7IGZpbGVOYW1lcywgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhwYXJhbXMudHNDb25maWdQYXRoKTtcbiAgcmV0dXJuIGNyZWF0ZUxhbmd1YWdlU2VydmljZShjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHsgY29tcGlsZXJPcHRpb25zOiBvcHRpb25zLCBmaWxlTmFtZXMsIGZpbGVTeXN0ZW06IHN5cyB9KSwgY3JlYXRlRG9jdW1lbnRSZWdpc3RyeSgpKTtcbn1cblxuLyoqXG4gKiBGaW5kcyBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zIGluIGEgcHJvamVjdCBvbiBkaXNrLiBXaGVuXG4gKiB7QGxpbmsgRmluZE92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGaXh9IGlzIHNldCwgZWFjaCBmaXhhYmxlIGZpbmRpbmcgaXMgYWxzbyB0aWdodGVuZWQgaW4gcGxhY2VcbiAqIChyZXdyaXRpbmcgdGhlIGFmZmVjdGVkIHNvdXJjZSBmaWxlcyB2aWEgYHR5cGVzY3JpcHRgJ3MgYHN5cy53cml0ZUZpbGVgKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE92ZXJFeHBvc3VyZShwYXJhbXM6IEZpbmRPdmVyRXhwb3N1cmVQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCBwcm9qZWN0Rm9sZGVyID0gdG9DYW5vbmljYWwocGFyYW1zLnByb2plY3RGb2xkZXIpO1xuICBjb25zdCBsYW5ndWFnZVNlcnZpY2UgPSBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlKHsgdHNDb25maWdQYXRoOiBgJHtwcm9qZWN0Rm9sZGVyfS90c2NvbmZpZy5qc29uYCB9KTtcbiAgcmV0dXJuIGFuYWx5emVPdmVyRXhwb3N1cmUoe1xuICAgIGxhbmd1YWdlU2VydmljZSxcbiAgICBzaG91bGRGaXg6IHBhcmFtcy5zaG91bGRGaXgsXG4gICAgc3JjRm9sZGVyOiBgJHtwcm9qZWN0Rm9sZGVyfS9zcmNgLFxuICAgIHdyaXRlRmlsZTogKHBhdGgsIGNvbnRlbnQpID0+IHtcbiAgICAgIHN5cy53cml0ZUZpbGUocGF0aCwgY29udGVudCk7XG4gICAgfSxcbiAgICAuLi5wYXJhbXMub25Qcm9ncmVzcyA/IHsgb25Qcm9ncmVzczogcGFyYW1zLm9uUHJvZ3Jlc3MgfSA6IHt9XG4gIH0pO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgb3Zlci1leHBvc3VyZSBmaW5kaW5ncyBhcyBhIGh1bWFuLXJlYWRhYmxlIHJlcG9ydCwgdXNpbmcgdGhlIGdyb3VwZWQgbGF5b3V0IG9mIEVTTGludCdzXG4gKiBgc3R5bGlzaGAgZm9ybWF0dGVyLiBGaW5kaW5ncyBhcmUgZ3JvdXBlZCBieSBmaWxlIGFuZCBzb3J0ZWQgYnkgbGluZTogZWFjaCBmaWxlIGlzIHJlbmRlcmVkIGFzIGFcbiAqIGBwYXRoYCBoZWFkZXIgbGluZSwgZm9sbG93ZWQgYnkgb25lIGluZGVudGVkIGAgIGxpbmU6Y29sdW1uICBjaGFuZ2UgLS0gcmVhc29uYCByb3cgcGVyIGZpbmRpbmcgKHRoZVxuICogYGxpbmU6Y29sdW1uYCBpcyByaWdodC1wYWRkZWQgc28gdGhlIHJvd3MgYWxpZ24gd2l0aGluIGEgZmlsZSkuIFRlcm1pbmFscyBzdWNoIGFzIFZTIENvZGUgcmVuZGVyXG4gKiBlYWNoIGluZGVudGVkIGBsaW5lOmNvbHVtbmAgYXMgYSBjbGlja2FibGUgbGluayBcdTIwMTQgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgZmlsZSBoZWFkZXIgYWJvdmUgaXQgXHUyMDE0IHRoYXRcbiAqIGp1bXBzIHN0cmFpZ2h0IHRvIHRoZSBkZWNsYXJhdGlvbi4gRmlsZSBncm91cHMgYXJlIHNlcGFyYXRlZCBieSBhIGJsYW5rIGxpbmUuIEluIGEgZml4IHJ1biAoZmluZGluZ3NcbiAqIGNhcnJ5aW5nIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259KSBlYWNoIGNoYW5nZVxuICogcm93IGlzIHN1ZmZpeGVkIHdpdGggYFtmaXhlZF1gIG9yIGBbc2tpcHBlZDogXHUyMDI2XWAsIGFuZCB0aGUgdHJhaWxpbmcgc3VtbWFyeSBhcHBlbmRzIHRoZSBmaXhlZC9za2lwcGVkXG4gKiBjb3VudHMuXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnN9LlxuICogQHJldHVybnMgVGhlIHJlcG9ydCB0ZXh0LiBFbXB0eS1maW5kaW5nIGlucHV0IHlpZWxkcyBhIHNpbmdsZSBcIm5vIGZpbmRpbmdzXCIgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIG9wdGlvbnM/OiBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnMpOiBzdHJpbmcge1xuICBpZiAoZmluZGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdObyBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zIGZvdW5kLlxcbic7XG4gIH1cblxuICBjb25zdCBiYXNlRm9sZGVyID0gb3B0aW9ucz8uYmFzZUZvbGRlciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdG9DYW5vbmljYWwob3B0aW9ucy5iYXNlRm9sZGVyKTtcbiAgY29uc3QgbGluZXMgPSBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzLCBiYXNlRm9sZGVyKTtcbiAgbGluZXMucHVzaChmb3JtYXRTdW1tYXJ5KGZpbmRpbmdzKSk7XG4gIHJldHVybiBgJHtsaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xufVxuXG5mdW5jdGlvbiBhbmFseXplRXhwb3J0KG5vZGU6IE5vZGUsIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGlmIChub2RlLnBhcmVudCAhPT0gc291cmNlRmlsZSB8fCAhZ2V0TW9kaWZpZXJLaW5kcyhub2RlKS5oYXMoU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gYXNFeHBvcnRhYmxlRGVjbGFyYXRpb24obm9kZSk7XG4gIGlmICghZGVjbGFyYXRpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaGFzVHNEb2NDb21tZW50KGRlY2xhcmF0aW9uKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xGaWxlUGF0aCA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICBjb25zdCBuYW1lTm9kZXMgPSBnZXRFeHBvcnRlZE5hbWVOb2RlcyhkZWNsYXJhdGlvbik7XG4gIGNvbnN0IGNhbmRpZGF0ZXM6IEV4cG9ydEZpbmRpbmdDYW5kaWRhdGVbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWVOb2RlIG9mIG5hbWVOb2Rlcykge1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBjb2xsZWN0UmVmZXJlbmNlcyhjb250ZXh0Lmxhbmd1YWdlU2VydmljZS5maW5kUmVmZXJlbmNlcyhzb3VyY2VGaWxlLmZpbGVOYW1lLCBuYW1lTm9kZS5nZXRTdGFydCgpKSlcbiAgICAgIC5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlLCBuYW1lTm9kZSkpO1xuICAgIGNvbnN0IG90aGVyRmlsZVJlZmVyZW5jZXMgPSByZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiB0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpICE9PSBkZWNsRmlsZVBhdGgpO1xuXG4gICAgaWYgKG90aGVyRmlsZVJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICBmaW5kaW5nOiBidWlsZEZpbmRpbmcoZGVjbGFyYXRpb24sIG5hbWVOb2RlLCAnZXhwb3J0JywgJ2ZpbGUtbG9jYWwnLCB7IGhhc05vUmVmZXJlbmNlczogcmVmZXJlbmNlcy5sZW5ndGggPT09IDAsIGlzRm9yY2VkQnlUZXN0T25seTogZmFsc2UgfSksXG4gICAgICAgIGlzUGxhaW5GaWxlTG9jYWw6IHRydWVcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uVGVzdFJlZmVyZW5jZXMgPSBvdGhlckZpbGVSZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNUZXN0RmlsZSh0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpKSk7XG4gICAgaWYgKG5vblRlc3RSZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZmluZGluZzogYnVpbGRGaW5kaW5nKGRlY2xhcmF0aW9uLCBuYW1lTm9kZSwgJ2V4cG9ydCcsICdmaWxlLWxvY2FsJywgeyBoYXNOb1JlZmVyZW5jZXM6IGZhbHNlLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IHRydWUgfSksXG4gICAgICAgIGlzUGxhaW5GaWxlTG9jYWw6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjYW5Ecm9wRXhwb3J0ID0gY2FuZGlkYXRlcy5sZW5ndGggPT09IG5hbWVOb2Rlcy5sZW5ndGggJiYgY2FuZGlkYXRlcy5ldmVyeSgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaXNQbGFpbkZpbGVMb2NhbCk7XG4gIGNvbnN0IGV4cG9ydEVkaXQgPSBjYW5Ecm9wRXhwb3J0ID8gY29tcHV0ZUV4cG9ydFJlbW92YWxFZGl0KGRlY2xhcmF0aW9uKSA6IG51bGw7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICByZWNvcmQoY29udGV4dCwgY2FuZGlkYXRlLmZpbmRpbmcsIGV4cG9ydEVkaXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFuYWx5emVNZW1iZXIobm9kZTogTm9kZSwgY29udGV4dDogQW5hbHlzaXNDb250ZXh0KTogdm9pZCB7XG4gIGNvbnN0IG1lbWJlciA9IGFzQ2xhc3NNZW1iZXIobm9kZSk7XG4gIGlmICghbWVtYmVyIHx8ICFpc0NsYXNzTGlrZShub2RlLnBhcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbmFtZU5vZGUgPSBtZW1iZXIubmFtZTtcbiAgY29uc3QgZGVjbGFyaW5nQ2xhc3MgPSBub2RlLnBhcmVudDtcblxuICBpZiAoaXNQcml2YXRlSWRlbnRpZmllcihuYW1lTm9kZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RpZmllcktpbmRzID0gZ2V0TW9kaWZpZXJLaW5kcyhtZW1iZXIpO1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKSB8fCBtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLk92ZXJyaWRlS2V5d29yZCkgfHwgTElGRUNZQ0xFX0FMTE9XTElTVC5oYXMobmFtZU5vZGUuZ2V0VGV4dCgpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChoYXNUc0RvY0NvbW1lbnQobWVtYmVyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRFeHBvc3VyZSA9IGdldEN1cnJlbnRNZW1iZXJFeHBvc3VyZShtb2RpZmllcktpbmRzKTtcbiAgaWYgKGN1cnJlbnRFeHBvc3VyZSA9PT0gJ3ByaXZhdGUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IG1lbWJlci5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IHJlZmVyZW5jZXMgPSBjb2xsZWN0UmVmZXJlbmNlcyhjb250ZXh0Lmxhbmd1YWdlU2VydmljZS5maW5kUmVmZXJlbmNlcyhzb3VyY2VGaWxlLmZpbGVOYW1lLCBuYW1lTm9kZS5nZXRTdGFydCgpKSlcbiAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgY29uc3Qgbm9uVGVzdFJlZmVyZW5jZXMgPSByZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNUZXN0RmlsZSh0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpKSk7XG5cbiAgY29uc3QgbmVlZGVkRm9yU3JjID0gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKG5vblRlc3RSZWZlcmVuY2VzLCBkZWNsYXJpbmdDbGFzcywgY29udGV4dCk7XG4gIGNvbnN0IG5lZWRlZFdpdGhUZXN0cyA9IGNvbXB1dGVOZWVkZWRFeHBvc3VyZShyZWZlcmVuY2VzLCBkZWNsYXJpbmdDbGFzcywgY29udGV4dCk7XG5cbiAgaWYgKG5lZWRlZEZvclNyYyA9PT0gJ3B1YmxpYycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmFua0V4cG9zdXJlKG5lZWRlZEZvclNyYykgPj0gcmFua0V4cG9zdXJlKGN1cnJlbnRFeHBvc3VyZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBmaW5kaW5nID0gYnVpbGRGaW5kaW5nKG1lbWJlciwgbmFtZU5vZGUsIGN1cnJlbnRFeHBvc3VyZSwgbmVlZGVkRm9yU3JjLCB7XG4gICAgaGFzTm9SZWZlcmVuY2VzOiByZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCxcbiAgICBpc0ZvcmNlZEJ5VGVzdE9ubHk6IHJhbmtFeHBvc3VyZShuZWVkZWRXaXRoVGVzdHMpID4gcmFua0V4cG9zdXJlKG5lZWRlZEZvclNyYylcbiAgfSk7XG4gIHJlY29yZChjb250ZXh0LCBmaW5kaW5nLCBjb21wdXRlTWVtYmVyRXhwb3N1cmVFZGl0KG1lbWJlciwgbmVlZGVkRm9yU3JjKSk7XG59XG5cbmZ1bmN0aW9uIGFwcGx5RWRpdHModGV4dDogc3RyaW5nLCBlZGl0czogcmVhZG9ubHkgT3ZlckV4cG9zdXJlVGV4dEVkaXRbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgdW5pcXVlRWRpdHMgPSBlZGl0c1xuICAgIC5maWx0ZXIoKGVkaXQpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGAke1N0cmluZyhlZGl0LnN0YXJ0KX06JHtTdHJpbmcoZWRpdC5sZW5ndGgpfToke2VkaXQubmV3VGV4dH1gO1xuICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pXG4gICAgLnNvcnQoKGEsIGIpID0+IGIuc3RhcnQgLSBhLnN0YXJ0KTtcblxuICBsZXQgcmVzdWx0ID0gdGV4dDtcbiAgZm9yIChjb25zdCBlZGl0IG9mIHVuaXF1ZUVkaXRzKSB7XG4gICAgcmVzdWx0ID0gYCR7cmVzdWx0LnNsaWNlKDAsIGVkaXQuc3RhcnQpfSR7ZWRpdC5uZXdUZXh0fSR7cmVzdWx0LnNsaWNlKGVkaXQuc3RhcnQgKyBlZGl0Lmxlbmd0aCl9YDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBhcHBseU92ZXJFeHBvc3VyZUZpeGVzKFxuICByZXN1bHQ6IEFuYWx5c2lzUmVzdWx0LFxuICBwcm9ncmFtOiBQcm9ncmFtIHwgdW5kZWZpbmVkLFxuICB3cml0ZUZpbGU6ICh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZykgPT4gdm9pZFxuKTogT3ZlckV4cG9zdXJlRmluZGluZ1tdIHtcbiAgY29uc3QgZWRpdHNCeUZpbGUgPSBuZXcgTWFwPHN0cmluZywgT3ZlckV4cG9zdXJlVGV4dEVkaXRbXT4oKTtcbiAgY29uc3QgZmluZGluZ3MgPSByZXN1bHQuZmluZGluZ3MubWFwKChmaW5kaW5nLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGVkaXQgPSByZXN1bHQuZWRpdHNbaW5kZXhdID8/IG51bGw7XG4gICAgY29uc3Qgc2tpcFJlYXNvbiA9IGRldGVybWluZVNraXBSZWFzb24oZmluZGluZywgZWRpdCk7XG4gICAgaWYgKHNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IC4uLmZpbmRpbmcsIHNraXBSZWFzb24sIHdhc0ZpeGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBhc3NlcnROb25OdWxsYWJsZShlZGl0LCAnQSBmaXhhYmxlIGZpbmRpbmcgbXVzdCBjYXJyeSBhIHRleHQgZWRpdC4nKTtcbiAgICBjb25zdCBmaWxlRWRpdHMgPSBlZGl0c0J5RmlsZS5nZXQoZWRpdC5maWxlTmFtZSkgPz8gW107XG4gICAgZmlsZUVkaXRzLnB1c2goZWRpdCk7XG4gICAgZWRpdHNCeUZpbGUuc2V0KGVkaXQuZmlsZU5hbWUsIGZpbGVFZGl0cyk7XG4gICAgcmV0dXJuIHsgLi4uZmluZGluZywgc2tpcFJlYXNvbjogbnVsbCwgd2FzRml4ZWQ6IHRydWUgfTtcbiAgfSk7XG5cbiAgaWYgKGVkaXRzQnlGaWxlLnNpemUgPiAwKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUocHJvZ3JhbSwgJ0EgcHJvZ3JhbSBpcyBleHBlY3RlZCB3aGVuIHRoZXJlIGFyZSBlZGl0cyB0byBhcHBseS4nKTtcbiAgICBjb25zdCBzb3VyY2VUZXh0QnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZUZpbGVUZXh0PigpO1xuICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICAgIHNvdXJjZVRleHRCeUZpbGUuc2V0KHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLCB7IGZpbGVOYW1lOiBzb3VyY2VGaWxlLmZpbGVOYW1lLCB0ZXh0OiBzb3VyY2VGaWxlLnRleHQgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2Nhbm9uaWNhbEZpbGVOYW1lLCBmaWxlRWRpdHNdIG9mIGVkaXRzQnlGaWxlKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VUZXh0QnlGaWxlLmdldChjYW5vbmljYWxGaWxlTmFtZSk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2UsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtjYW5vbmljYWxGaWxlTmFtZX1gKTtcbiAgICAgIHdyaXRlRmlsZShzb3VyY2UuZmlsZU5hbWUsIGFwcGx5RWRpdHMoc291cmNlLnRleHQsIGZpbGVFZGl0cykpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaW5kaW5ncztcbn1cblxuZnVuY3Rpb24gYXNDbGFzc01lbWJlcihub2RlOiBOb2RlKTogQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc01ldGhvZERlY2xhcmF0aW9uKG5vZGUpIHx8IGlzUHJvcGVydHlEZWNsYXJhdGlvbihub2RlKSB8fCBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24obm9kZSkgfHwgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXNFeHBvcnRhYmxlRGVjbGFyYXRpb24obm9kZTogTm9kZSk6IEV4cG9ydGFibGVEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChcbiAgICBpc0Z1bmN0aW9uRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0NsYXNzRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0ludGVyZmFjZURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzRW51bURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKVxuICApIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBidWlsZEZpbmRpbmcoXG4gIG5vZGU6IE5vZGUsXG4gIG5hbWVOb2RlOiBOb2RlLFxuICBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZSxcbiAgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlLFxuICBmbGFnczogRmluZGluZ0ZsYWdzXG4pOiBPdmVyRXhwb3N1cmVGaW5kaW5nIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCB7IGNoYXJhY3RlciwgbGluZSB9ID0gc291cmNlRmlsZS5nZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihuYW1lTm9kZS5nZXRTdGFydCgpKTtcbiAgcmV0dXJuIHtcbiAgICBjb2x1bW46IGNoYXJhY3RlciArIDEsXG4gICAgY3VycmVudEV4cG9zdXJlLFxuICAgIGZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBoYXNOb1JlZmVyZW5jZXM6IGZsYWdzLmhhc05vUmVmZXJlbmNlcyxcbiAgICBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZsYWdzLmlzRm9yY2VkQnlUZXN0T25seSxcbiAgICBpc01lbWJlcjogY3VycmVudEV4cG9zdXJlICE9PSAnZXhwb3J0JyxcbiAgICBsaW5lOiBsaW5lICsgMSxcbiAgICBuYW1lOiBuYW1lTm9kZS5nZXRUZXh0KCksXG4gICAgc2tpcFJlYXNvbjogbnVsbCxcbiAgICBzdWdnZXN0ZWRFeHBvc3VyZSxcbiAgICB3YXNGaXhlZDogZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFJlZmVyZW5jZXMocmVmZXJlbmNlZFN5bWJvbHM6IFJlZmVyZW5jZWRTeW1ib2xbXSB8IHVuZGVmaW5lZCk6IFJlZmVyZW5jZUxvY2F0aW9uW10ge1xuICBjb25zdCByZWZlcmVuY2VzOiBSZWZlcmVuY2VMb2NhdGlvbltdID0gW107XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlZFN5bWJvbCBvZiByZWZlcmVuY2VkU3ltYm9scyA/PyBbXSkge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWRTeW1ib2wucmVmZXJlbmNlcykge1xuICAgICAgcmVmZXJlbmNlcy5wdXNoKHsgZmlsZU5hbWU6IHJlZmVyZW5jZS5maWxlTmFtZSwgc3RhcnQ6IHJlZmVyZW5jZS50ZXh0U3Bhbi5zdGFydCB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZmVyZW5jZXM7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVFeHBvcnRSZW1vdmFsRWRpdChkZWNsYXJhdGlvbjogRXhwb3J0YWJsZURlY2xhcmF0aW9uKTogT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gZGVjbGFyYXRpb24uZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBtb2RpZmllcnMgPSBnZXRNb2RpZmllcnMoZGVjbGFyYXRpb24pO1xuICBhc3NlcnROb25OdWxsYWJsZShtb2RpZmllcnMsICdNb2RpZmllcnMgZXhwZWN0ZWQgb24gYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24uJyk7XG4gIGNvbnN0IGV4cG9ydE1vZGlmaWVyID0gbW9kaWZpZXJzLmZpbmQoKG1vZGlmaWVyKSA9PiBtb2RpZmllci5raW5kID09PSBTeW50YXhLaW5kLkV4cG9ydEtleXdvcmQpO1xuICBhc3NlcnROb25OdWxsYWJsZShleHBvcnRNb2RpZmllciwgJ0V4cG9ydCBtb2RpZmllciBleHBlY3RlZCBvbiBhbiBleHBvcnRlZCBkZWNsYXJhdGlvbi4nKTtcbiAgY29uc3QgeyB0ZXh0IH0gPSBzb3VyY2VGaWxlO1xuICBsZXQgZW5kID0gZXhwb3J0TW9kaWZpZXIuZ2V0RW5kKCk7XG4gIHdoaWxlIChlbmQgPCB0ZXh0Lmxlbmd0aCAmJiBXSElURVNQQUNFX1BBVFRFUk4udGVzdCh0ZXh0LmNoYXJBdChlbmQpKSkge1xuICAgIGVuZCsrO1xuICB9XG4gIHJldHVybiB7XG4gICAgZmlsZU5hbWU6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgIGxlbmd0aDogZW5kIC0gZXhwb3J0TW9kaWZpZXIuZ2V0U3RhcnQoKSxcbiAgICBuZXdUZXh0OiAnJyxcbiAgICBzdGFydDogZXhwb3J0TW9kaWZpZXIuZ2V0U3RhcnQoKVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlTWVtYmVyRXhwb3N1cmVFZGl0KG1lbWJlcjogQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiwgc3VnZ2VzdGVkRXhwb3N1cmU6ICdwcml2YXRlJyB8ICdwcm90ZWN0ZWQnKTogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgaWYgKChnZXREZWNvcmF0b3JzKG1lbWJlcikgPz8gW10pLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBtZW1iZXIuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBmaWxlTmFtZSA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICBjb25zdCBtb2RpZmllcnMgPSBnZXRNb2RpZmllcnMobWVtYmVyKSA/PyBbXTtcbiAgY29uc3QgdmlzaWJpbGl0eU1vZGlmaWVyID0gbW9kaWZpZXJzLmZpbmQoKG1vZGlmaWVyKSA9PiBWSVNJQklMSVRZX01PRElGSUVSX0tJTkRTLmhhcyhtb2RpZmllci5raW5kKSk7XG4gIGlmICh2aXNpYmlsaXR5TW9kaWZpZXIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsZU5hbWUsXG4gICAgICBsZW5ndGg6IHZpc2liaWxpdHlNb2RpZmllci5nZXRFbmQoKSAtIHZpc2liaWxpdHlNb2RpZmllci5nZXRTdGFydCgpLFxuICAgICAgbmV3VGV4dDogc3VnZ2VzdGVkRXhwb3N1cmUsXG4gICAgICBzdGFydDogdmlzaWJpbGl0eU1vZGlmaWVyLmdldFN0YXJ0KClcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZmlyc3RNb2RpZmllciA9IG1vZGlmaWVyc1swXTtcbiAgY29uc3QgaW5zZXJ0U3RhcnQgPSBmaXJzdE1vZGlmaWVyID8gZmlyc3RNb2RpZmllci5nZXRTdGFydCgpIDogbWVtYmVyLmdldFN0YXJ0KCk7XG4gIHJldHVybiB7XG4gICAgZmlsZU5hbWUsXG4gICAgbGVuZ3RoOiAwLFxuICAgIG5ld1RleHQ6IGAke3N1Z2dlc3RlZEV4cG9zdXJlfSBgLFxuICAgIHN0YXJ0OiBpbnNlcnRTdGFydFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wdXRlTmVlZGVkRXhwb3N1cmUoXG4gIHJlZmVyZW5jZXM6IHJlYWRvbmx5IFJlZmVyZW5jZUxvY2F0aW9uW10sXG4gIGRlY2xhcmluZ0NsYXNzOiBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgY29udGV4dDogQW5hbHlzaXNDb250ZXh0XG4pOiBNZW1iZXJFeHBvc3VyZSB7XG4gIGlmIChyZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAncHJpdmF0ZSc7XG4gIH1cblxuICBsZXQgbmVlZGVkOiBNZW1iZXJFeHBvc3VyZSA9ICdwcml2YXRlJztcbiAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlcykge1xuICAgIGNvbnN0IHJlZmVyZW5jZUNsYXNzID0gZ2V0Q2xhc3NBdFBvc2l0aW9uKGNvbnRleHQucHJvZ3JhbSwgcmVmZXJlbmNlLmZpbGVOYW1lLCByZWZlcmVuY2Uuc3RhcnQpO1xuICAgIGlmIChyZWZlcmVuY2VDbGFzcyA9PT0gZGVjbGFyaW5nQ2xhc3MpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAocmVmZXJlbmNlQ2xhc3MgJiYgaXNEZXJpdmVkRnJvbShyZWZlcmVuY2VDbGFzcywgZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQuY2hlY2tlcikpIHtcbiAgICAgIG5lZWRlZCA9ICdwcm90ZWN0ZWQnO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHJldHVybiAncHVibGljJztcbiAgfVxuICByZXR1cm4gbmVlZGVkO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZUZpeFN0YXR1cyhmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmcud2FzRml4ZWQpIHtcbiAgICByZXR1cm4gJyBbZml4ZWRdJztcbiAgfVxuICBpZiAoZmluZGluZy5za2lwUmVhc29uICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIGAgW3NraXBwZWQ6ICR7U0tJUF9SRUFTT05fREVTQ1JJUFRJT05bZmluZGluZy5za2lwUmVhc29uXX1dYDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlUmVhc29uKGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gYHJlZmVyZW5jZWQgb25seSAke1NDT1BFX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmVdfWA7XG4gIGlmIChmaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seSkge1xuICAgIHJldHVybiBgJHtiYXNlfSAoZXhwb3NlZCBvbmx5IGZvciB0ZXN0cylgO1xuICB9XG4gIGlmIChmaW5kaW5nLmhhc05vUmVmZXJlbmNlcykge1xuICAgIHJldHVybiBgJHtiYXNlfSAobm8gcmVmZXJlbmNlcyBhdCBhbGwpYDtcbiAgfVxuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lU2tpcFJlYXNvbihmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nLCBlZGl0OiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQpOiBudWxsIHwgT3ZlckV4cG9zdXJlU2tpcFJlYXNvbiB7XG4gIGlmIChmaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seSkge1xuICAgIHJldHVybiAndGVzdC1vbmx5JztcbiAgfVxuICBpZiAoIWVkaXQpIHtcbiAgICByZXR1cm4gZmluZGluZy5pc01lbWJlciA/ICdkZWNvcmF0ZWQnIDogJ3NoYXJlZC1leHBvcnQnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUF0UG9zaXRpb24obm9kZTogTm9kZSwgcG9zaXRpb246IG51bWJlcik6IE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zaXRpb24gPCBub2RlLmdldFN0YXJ0KCkgfHwgcG9zaXRpb24gPj0gbm9kZS5nZXRFbmQoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHJlc3VsdDogTm9kZSA9IG5vZGU7XG4gIG5vZGUuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gZmluZE5vZGVBdFBvc2l0aW9uKGNoaWxkLCBwb3NpdGlvbik7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXN1bHQgPSBmb3VuZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIE92ZXJFeHBvc3VyZUZpbmRpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBmaW5kaW5nIG9mIGZpbmRpbmdzKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5RmlsZS5nZXQoZmluZGluZy5maWxlUGF0aCkgPz8gW107XG4gICAgbGlzdC5wdXNoKGZpbmRpbmcpO1xuICAgIGJ5RmlsZS5zZXQoZmluZGluZy5maWxlUGF0aCwgbGlzdCk7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGxpc3RdIG9mIGJ5RmlsZSkge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5saXN0XS5zb3J0KChhLCBiKSA9PiBhLmxpbmUgLSBiLmxpbmUpO1xuICAgIGNvbnN0IGxvY2F0aW9uV2lkdGggPSBNYXRoLm1heCguLi5zb3J0ZWQubWFwKChmaW5kaW5nKSA9PiBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAubGVuZ3RoKSk7XG4gICAgbGluZXMucHVzaCh0b0Rpc3BsYXlQYXRoKGZpbGVQYXRoLCBiYXNlRm9sZGVyKSk7XG4gICAgZm9yIChjb25zdCBmaW5kaW5nIG9mIHNvcnRlZCkge1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAucGFkRW5kKGxvY2F0aW9uV2lkdGgpO1xuICAgICAgY29uc3QgY2hhbmdlID0gYCR7ZmluZGluZy5jdXJyZW50RXhwb3N1cmV9ICR7ZmluZGluZy5uYW1lfSAtPiAke2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmV9YDtcbiAgICAgIGxpbmVzLnB1c2goYCAgJHtsb2NhdGlvbn0gICR7Y2hhbmdlfSAtLSAke2Rlc2NyaWJlUmVhc29uKGZpbmRpbmcpfSR7ZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZyl9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG4gIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0U3VtbWFyeShmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3VtbWFyeSA9IGAke1N0cmluZyhmaW5kaW5ncy5sZW5ndGgpfSBmaW5kaW5nKHMpLmA7XG4gIGNvbnN0IGZpeGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcud2FzRml4ZWQpLmxlbmd0aDtcbiAgY29uc3Qgc2tpcHBlZENvdW50ID0gZmluZGluZ3MuZmlsdGVyKChmaW5kaW5nKSA9PiBmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpLmxlbmd0aDtcbiAgaWYgKGZpeGVkQ291bnQgPT09IDAgJiYgc2tpcHBlZENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbiAgcmV0dXJuIGAke3N1bW1hcnl9ICR7U3RyaW5nKGZpeGVkQ291bnQpfSBmaXhlZCwgJHtTdHJpbmcoc2tpcHBlZENvdW50KX0gc2tpcHBlZC5gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0F0UG9zaXRpb24ocHJvZ3JhbTogUHJvZ3JhbSwgZmlsZU5hbWU6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtmaWxlTmFtZX1gKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmROb2RlQXRQb3NpdGlvbihzb3VyY2VGaWxlLCBwb3NpdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5vZGUsIGBObyBub2RlIGZvdW5kIGF0IHBvc2l0aW9uICR7U3RyaW5nKHBvc2l0aW9uKX0gaW4gJHtmaWxlTmFtZX1gKTtcbiAgcmV0dXJuIGdldEVuY2xvc2luZ0NsYXNzKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50TWVtYmVyRXhwb3N1cmUobW9kaWZpZXJLaW5kczogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4pOiBNZW1iZXJFeHBvc3VyZSB7XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSkge1xuICAgIHJldHVybiAncHJpdmF0ZSc7XG4gIH1cbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3Byb3RlY3RlZCc7XG4gIH1cbiAgcmV0dXJuICdwdWJsaWMnO1xufVxuXG5mdW5jdGlvbiBnZXRFbmNsb3NpbmdDbGFzcyhub2RlOiBOb2RlKTogQ2xhc3NMaWtlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudDogTm9kZSA9IG5vZGU7XG4gIHdoaWxlICghaXNTb3VyY2VGaWxlKGN1cnJlbnQpKSB7XG4gICAgaWYgKGlzQ2xhc3NMaWtlKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldEV4cG9ydGVkTmFtZU5vZGVzKGRlY2xhcmF0aW9uOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24pOiBOb2RlW10ge1xuICBpZiAoaXNWYXJpYWJsZVN0YXRlbWVudChkZWNsYXJhdGlvbikpIHtcbiAgICByZXR1cm4gZGVjbGFyYXRpb24uZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5tYXAoKHZhcmlhYmxlRGVjbGFyYXRpb24pID0+IHZhcmlhYmxlRGVjbGFyYXRpb24ubmFtZSkuZmlsdGVyKGlzSWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGRlY2xhcmF0aW9uLm5hbWUgPyBbZGVjbGFyYXRpb24ubmFtZV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gZ2V0TW9kaWZpZXJLaW5kcyhub2RlOiBOb2RlKTogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4ge1xuICBjb25zdCBraW5kcyA9IG5ldyBTZXQ8U3ludGF4S2luZD4oKTtcbiAgaWYgKGNhbkhhdmVNb2RpZmllcnMobm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IG1vZGlmaWVyIG9mIGdldE1vZGlmaWVycyhub2RlKSA/PyBbXSkge1xuICAgICAga2luZHMuYWRkKG1vZGlmaWVyLmtpbmQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2luZHM7XG59XG5cbmZ1bmN0aW9uIGhhc1RzRG9jQ29tbWVudChub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZnVsbFRleHQgPSBzb3VyY2VGaWxlLmdldEZ1bGxUZXh0KCk7XG4gIGNvbnN0IGNvbW1lbnRSYW5nZXMgPSBnZXRMZWFkaW5nQ29tbWVudFJhbmdlcyhmdWxsVGV4dCwgbm9kZS5nZXRGdWxsU3RhcnQoKSkgPz8gW107XG4gIHJldHVybiBjb21tZW50UmFuZ2VzLnNvbWUoKHJhbmdlKSA9PlxuICAgIHJhbmdlLmtpbmQgPT09IFN5bnRheEtpbmQuTXVsdGlMaW5lQ29tbWVudFRyaXZpYVxuICAgICYmIGZ1bGxUZXh0LmNoYXJBdChyYW5nZS5wb3MgKyBKU0RPQ19TRUNPTkRfQVNURVJJU0tfT0ZGU0VUKSA9PT0gJyonXG4gICAgJiYgZnVsbFRleHQuY2hhckF0KHJhbmdlLnBvcyArIEpTRE9DX0ZPVVJUSF9DSEFSQUNURVJfT0ZGU0VUKSAhPT0gJy8nXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlOiBSZWZlcmVuY2VMb2NhdGlvbiwgbmFtZU5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkgPT09IHRvQ2Fub25pY2FsKG5hbWVOb2RlLmdldFNvdXJjZUZpbGUoKS5maWxlTmFtZSkgJiYgcmVmZXJlbmNlLnN0YXJ0ID09PSBuYW1lTm9kZS5nZXRTdGFydCgpO1xufVxuXG5mdW5jdGlvbiBpc0Rlcml2ZWRGcm9tKGRlcml2ZWQ6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBiYXNlOiBDbGFzc0xpa2VEZWNsYXJhdGlvbiwgY2hlY2tlcjogVHlwZUNoZWNrZXIpOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZVN5bWJvbCA9IGJhc2UubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihiYXNlLm5hbWUpIDogdW5kZWZpbmVkO1xuICBpZiAoIWJhc2VTeW1ib2wpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IGNsYXVzZSBvZiBkZXJpdmVkLmhlcml0YWdlQ2xhdXNlcyA/PyBbXSkge1xuICAgIGlmIChjbGF1c2UudG9rZW4gIT09IFN5bnRheEtpbmQuRXh0ZW5kc0tleXdvcmQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHR5cGVFeHByZXNzaW9uIG9mIGNsYXVzZS50eXBlcykge1xuICAgICAgY29uc3Qgc3ltYm9sID0gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbih0eXBlRXhwcmVzc2lvbi5leHByZXNzaW9uKS5nZXRTeW1ib2woKTtcbiAgICAgIGlmIChzeW1ib2wgPT09IGJhc2VTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHN5bWJvbD8uZGVjbGFyYXRpb25zID8/IFtdKSB7XG4gICAgICAgIGlmIChpc0NsYXNzTGlrZShkZWNsYXJhdGlvbikgJiYgaXNEZXJpdmVkRnJvbShkZWNsYXJhdGlvbiwgYmFzZSwgY2hlY2tlcikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzT3duU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBzcmNGb2xkZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtzcmNGb2xkZXJ9L2ApICYmIGZpbGVQYXRoLmVuZHNXaXRoKCcudHMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy5kLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzVGVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguaW5jbHVkZXMoJy50ZXN0LicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuaW50ZWdyYXRpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmtFeHBvc3VyZShleHBvc3VyZTogTWVtYmVyRXhwb3N1cmUpOiBudW1iZXIge1xuICByZXR1cm4gTUVNQkVSX0VYUE9TVVJFX09SREVSLmluZGV4T2YoZXhwb3N1cmUpO1xufVxuXG5mdW5jdGlvbiByZWNvcmQoY29udGV4dDogQW5hbHlzaXNDb250ZXh0LCBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nLCBlZGl0OiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQpOiB2b2lkIHtcbiAgY29udGV4dC5maW5kaW5ncy5wdXNoKGZpbmRpbmcpO1xuICBjb250ZXh0LmVkaXRzLnB1c2goZWRpdCk7XG59XG5cbmZ1bmN0aW9uIHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IEFuYWx5c2lzUmVzdWx0IHtcbiAgY29uc3QgeyBsYW5ndWFnZVNlcnZpY2UsIG9uUHJvZ3Jlc3MsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICBjb25zdCBwcm9ncmFtID0gbGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKTtcbiAgaWYgKCFwcm9ncmFtKSB7XG4gICAgcmV0dXJuIHsgZWRpdHM6IFtdLCBmaW5kaW5nczogW10gfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCA9IHtcbiAgICBjaGVja2VyOiBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCksXG4gICAgZWRpdHM6IFtdLFxuICAgIGZpbmRpbmdzOiBbXSxcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJvZ3JhbVxuICB9O1xuXG4gIGNvbnN0IHNvdXJjZUZpbGVzVG9BbmFseXplID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpLmZpbHRlcigoc291cmNlRmlsZSkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgcmV0dXJuIGlzT3duU291cmNlRmlsZShmaWxlUGF0aCwgc3JjRm9sZGVyKSAmJiAhaXNUZXN0RmlsZShmaWxlUGF0aCk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgW2FuYWx5emVkRmlsZUNvdW50LCBzb3VyY2VGaWxlXSBvZiBzb3VyY2VGaWxlc1RvQW5hbHl6ZS5lbnRyaWVzKCkpIHtcbiAgICBvblByb2dyZXNzPy4oe1xuICAgICAgYW5hbHl6ZWRGaWxlQ291bnQsXG4gICAgICBjdXJyZW50RmlsZVBhdGg6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgICAgdG90YWxGaWxlQ291bnQ6IHNvdXJjZUZpbGVzVG9BbmFseXplLmxlbmd0aFxuICAgIH0pO1xuICAgIHZpc2l0KHNvdXJjZUZpbGUpO1xuICB9XG4gIHJldHVybiB7IGVkaXRzOiBjb250ZXh0LmVkaXRzLCBmaW5kaW5nczogY29udGV4dC5maW5kaW5ncyB9O1xuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBhbmFseXplTWVtYmVyKG5vZGUsIGNvbnRleHQpO1xuICAgIGFuYWx5emVFeHBvcnQobm9kZSwgY29udGV4dCk7XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvRGlzcGxheVBhdGgoZmlsZVBhdGg6IHN0cmluZywgYmFzZUZvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgaWYgKGJhc2VGb2xkZXIgIT09IHVuZGVmaW5lZCAmJiBmaWxlUGF0aC5zdGFydHNXaXRoKGAke2Jhc2VGb2xkZXJ9L2ApKSB7XG4gICAgcmV0dXJuIGZpbGVQYXRoLnNsaWNlKGJhc2VGb2xkZXIubGVuZ3RoICsgMSk7XG4gIH1cbiAgcmV0dXJuIGZpbGVQYXRoO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyREE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUE4TkEsTUFBTSxzQkFBMkMsb0JBQUksSUFBWTtBQUFBLEVBQ3RFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsQ0FBQztBQXFERCxNQUFNLCtCQUErQjtBQUNyQyxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLHdCQUFtRCxDQUFDLFdBQVcsYUFBYSxRQUFRO0FBQzFGLE1BQU0sb0JBQXVEO0FBQUEsRUFDM0QsY0FBYztBQUFBLEVBQ2QsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUNmO0FBQ0EsTUFBTSwwQkFB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
|
|
@@ -13,3 +13,18 @@
|
|
|
13
13
|
* Commands use `npm run ... --` so nano-staged file paths are forwarded as CLI arguments.
|
|
14
14
|
*/
|
|
15
15
|
export declare const obsidianDevUtilsConfig: Record<string, string[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Resolves the nano-staged configuration to use, honoring a per-developer opt-out.
|
|
18
|
+
*
|
|
19
|
+
* Loads a gitignored `.env` if present (via Node's own `process.loadEnvFile`, so it behaves the same
|
|
20
|
+
* on every platform and shell), then — when `NANO_STAGED` is set to an off value (`0`, `false`, `off`,
|
|
21
|
+
* or `no`) — prints a notice and exits the process successfully so the pre-commit checks are skipped.
|
|
22
|
+
* This mirrors husky's own `HUSKY=0` switch, but scoped to the nano-staged step (so the commit-msg
|
|
23
|
+
* hook still runs). Otherwise it returns {@link obsidianDevUtilsConfig}.
|
|
24
|
+
*
|
|
25
|
+
* This is a function rather than module-level code so importing the package barrel never triggers the
|
|
26
|
+
* `.env` read or the process exit; call it from the thin `scripts/nano-staged-config.ts` entry.
|
|
27
|
+
*
|
|
28
|
+
* @returns The nano-staged task configuration. Does not return when the opt-out is active.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getNanoStagedConfig(): Record<string, string[]>;
|
|
@@ -21,6 +21,8 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
21
21
|
globalThis.process = browserProcess;
|
|
22
22
|
})();
|
|
23
23
|
|
|
24
|
+
import { existsSync } from "node:fs";
|
|
25
|
+
import process from "node:process";
|
|
24
26
|
const obsidianDevUtilsConfig = {
|
|
25
27
|
/*
|
|
26
28
|
* Lint everything except the `static/` consumer templates: ESLint globally ignores them, and they
|
|
@@ -41,7 +43,22 @@ const obsidianDevUtilsConfig = {
|
|
|
41
43
|
"npm run lint:md:fix --"
|
|
42
44
|
]
|
|
43
45
|
};
|
|
46
|
+
const NANO_STAGED_OFF_VALUES = /* @__PURE__ */ new Set(["0", "false", "no", "off"]);
|
|
47
|
+
function getNanoStagedConfig() {
|
|
48
|
+
if (existsSync(".env")) {
|
|
49
|
+
process.loadEnvFile(".env");
|
|
50
|
+
}
|
|
51
|
+
if (isNanoStagedDisabled(process.env["NANO_STAGED"])) {
|
|
52
|
+
process.stdout.write("nano-staged: skipped (NANO_STAGED is off).\n");
|
|
53
|
+
process.exit(0);
|
|
54
|
+
}
|
|
55
|
+
return obsidianDevUtilsConfig;
|
|
56
|
+
}
|
|
57
|
+
function isNanoStagedDisabled(value) {
|
|
58
|
+
return NANO_STAGED_OFF_VALUES.has((value ?? "").trim().toLowerCase());
|
|
59
|
+
}
|
|
44
60
|
export {
|
|
61
|
+
getNanoStagedConfig,
|
|
45
62
|
obsidianDevUtilsConfig
|
|
46
63
|
};
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9uYW5vLXN0YWdlZC1jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaGFyZWQgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiBmb3IgcHJlLWNvbW1pdCBob29rcy5cbiAqL1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG4vKipcbiAqIE5hbm8tc3RhZ2VkIGNvbmZpZ3VyYXRpb24gdGhhdCBydW5zIGZpbGUtYmFzZWQgbGludCwgZm9ybWF0LCBhbmQgc3BlbGxjaGVjayBvbiBzdGFnZWQgZmlsZXMuXG4gKlxuICogT25seSBpbmNsdWRlcyB0b29scyB0aGF0IGNhbiBvcGVyYXRlIG9uIGluZGl2aWR1YWwgZmlsZXMuIFdob2xlLXByb2plY3QgY2hlY2tzXG4gKiAoVHlwZVNjcmlwdCBjb21waWxhdGlvbiwgdW5pdCB0ZXN0cykgYXJlIGxlZnQgdG8gQ0kuXG4gKlxuICogQ29tbWFuZHMgdXNlIGBucG0gcnVuIC4uLiAtLWAgc28gbmFuby1zdGFnZWQgZmlsZSBwYXRocyBhcmUgZm9yd2FyZGVkIGFzIENMSSBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBjb25zdCBvYnNpZGlhbkRldlV0aWxzQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7XG4gIC8qXG4gICAqIExpbnQgZXZlcnl0aGluZyBleGNlcHQgdGhlIGBzdGF0aWMvYCBjb25zdW1lciB0ZW1wbGF0ZXM6IEVTTGludCBnbG9iYWxseSBpZ25vcmVzIHRoZW0sIGFuZCB0aGV5XG4gICAqIHNoaXAgdGhlaXIgb3duIGNvbnN1bWVyLWZhY2luZyBgZXNsaW50LmNvbmZpZ2AgdGhhdCBjYW5ub3QgcmVzb2x2ZSBpbi1yZXBvLCBzbyBsaW50aW5nIG9uZSBieVxuICAgKiBleHBsaWNpdCBwYXRoIGNyYXNoZXMgY29uZmlnIGxvYWRpbmcuIFRoZSBgIShzdGF0aWMpYCBuZWdhdGlvbiBkcm9wcyBhbnkgcGF0aCB0aGF0IGJlZ2lucyB3aXRoXG4gICAqIGBzdGF0aWNgLiBGb3JtYXR0aW5nIGFuZCBzcGVsbGNoZWNraW5nIHN0aWxsIGNvdmVyIGBzdGF0aWMvYCB2aWEgdGhlIGVudHJpZXMgYWJvdmUgYW5kIGJlbG93LlxuICAgKi9cbiAgJyEoc3RhdGljKSoue3RzLHRzeCxtdHN9JzogW1xuICAgICducG0gcnVuIGxpbnQ6Zml4IC0tJ1xuICBdLFxuICAnKic6IFtcbiAgICAnbnBtIHJ1biBzcGVsbGNoZWNrIC0tJ1xuICBdLFxuICAnKi57dHMsdHN4LG10c30nOiBbXG4gICAgJ25wbSBydW4gZm9ybWF0IC0tJ1xuICBdLFxuICAnKi5tZCc6IFtcbiAgICAnbnBtIHJ1biBsaW50Om1kOmZpeCAtLSdcbiAgXVxufTtcblxuY29uc3QgTkFOT19TVEFHRURfT0ZGX1ZBTFVFUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoWycwJywgJ2ZhbHNlJywgJ25vJywgJ29mZiddKTtcblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgbmFuby1zdGFnZWQgY29uZmlndXJhdGlvbiB0byB1c2UsIGhvbm9yaW5nIGEgcGVyLWRldmVsb3BlciBvcHQtb3V0LlxuICpcbiAqIExvYWRzIGEgZ2l0aWdub3JlZCBgLmVudmAgaWYgcHJlc2VudCAodmlhIE5vZGUncyBvd24gYHByb2Nlc3MubG9hZEVudkZpbGVgLCBzbyBpdCBiZWhhdmVzIHRoZSBzYW1lXG4gKiBvbiBldmVyeSBwbGF0Zm9ybSBhbmQgc2hlbGwpLCB0aGVuIFx1MjAxNCB3aGVuIGBOQU5PX1NUQUdFRGAgaXMgc2V0IHRvIGFuIG9mZiB2YWx1ZSAoYDBgLCBgZmFsc2VgLCBgb2ZmYCxcbiAqIG9yIGBub2ApIFx1MjAxNCBwcmludHMgYSBub3RpY2UgYW5kIGV4aXRzIHRoZSBwcm9jZXNzIHN1Y2Nlc3NmdWxseSBzbyB0aGUgcHJlLWNvbW1pdCBjaGVja3MgYXJlIHNraXBwZWQuXG4gKiBUaGlzIG1pcnJvcnMgaHVza3kncyBvd24gYEhVU0tZPTBgIHN3aXRjaCwgYnV0IHNjb3BlZCB0byB0aGUgbmFuby1zdGFnZWQgc3RlcCAoc28gdGhlIGNvbW1pdC1tc2dcbiAqIGhvb2sgc3RpbGwgcnVucykuIE90aGVyd2lzZSBpdCByZXR1cm5zIHtAbGluayBvYnNpZGlhbkRldlV0aWxzQ29uZmlnfS5cbiAqXG4gKiBUaGlzIGlzIGEgZnVuY3Rpb24gcmF0aGVyIHRoYW4gbW9kdWxlLWxldmVsIGNvZGUgc28gaW1wb3J0aW5nIHRoZSBwYWNrYWdlIGJhcnJlbCBuZXZlciB0cmlnZ2VycyB0aGVcbiAqIGAuZW52YCByZWFkIG9yIHRoZSBwcm9jZXNzIGV4aXQ7IGNhbGwgaXQgZnJvbSB0aGUgdGhpbiBgc2NyaXB0cy9uYW5vLXN0YWdlZC1jb25maWcudHNgIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBuYW5vLXN0YWdlZCB0YXNrIGNvbmZpZ3VyYXRpb24uIERvZXMgbm90IHJldHVybiB3aGVuIHRoZSBvcHQtb3V0IGlzIGFjdGl2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbm9TdGFnZWRDb25maWcoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHtcbiAgaWYgKGV4aXN0c1N5bmMoJy5lbnYnKSkge1xuICAgIHByb2Nlc3MubG9hZEVudkZpbGUoJy5lbnYnKTtcbiAgfVxuXG4gIGlmIChpc05hbm9TdGFnZWREaXNhYmxlZChwcm9jZXNzLmVudlsnTkFOT19TVEFHRUQnXSkpIHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSgnbmFuby1zdGFnZWQ6IHNraXBwZWQgKE5BTk9fU1RBR0VEIGlzIG9mZikuXFxuJyk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgcmV0dXJuIG9ic2lkaWFuRGV2VXRpbHNDb25maWc7XG59XG5cbmZ1bmN0aW9uIGlzTmFub1N0YWdlZERpc2FibGVkKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIE5BTk9fU1RBR0VEX09GRl9WQUxVRVMuaGFzKCh2YWx1ZSA/PyAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQSxTQUFTLGtCQUFrQjtBQUMzQixPQUFPLGFBQWE7QUFVYixNQUFNLHlCQUFtRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTzlELDJCQUEyQjtBQUFBLElBQ3pCO0FBQUEsRUFDRjtBQUFBLEVBQ0EsS0FBSztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQUEsRUFDQSxrQkFBa0I7QUFBQSxJQUNoQjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLFFBQVE7QUFBQSxJQUNOO0FBQUEsRUFDRjtBQUNGO0FBRUEsTUFBTSx5QkFBOEMsb0JBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxNQUFNLEtBQUssQ0FBQztBQWdCaEYsU0FBUyxzQkFBZ0Q7QUFDOUQsTUFBSSxXQUFXLE1BQU0sR0FBRztBQUN0QixZQUFRLFlBQVksTUFBTTtBQUFBLEVBQzVCO0FBRUEsTUFBSSxxQkFBcUIsUUFBUSxJQUFJLGFBQWEsQ0FBQyxHQUFHO0FBQ3BELFlBQVEsT0FBTyxNQUFNLDhDQUE4QztBQUNuRSxZQUFRLEtBQUssQ0FBQztBQUFBLEVBQ2hCO0FBRUEsU0FBTztBQUNUO0FBRUEsU0FBUyxxQkFBcUIsT0FBb0M7QUFDaEUsU0FBTyx1QkFBdUIsS0FBSyxTQUFTLElBQUksS0FBSyxFQUFFLFlBQVksQ0FBQztBQUN0RTsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -40,6 +40,8 @@ export declare enum ObsidianDevUtilsRepoPaths {
|
|
|
40
40
|
Dist = "dist",
|
|
41
41
|
/** A path to the `lib` folder within the {@link Dist} folder. */
|
|
42
42
|
DistLib = "dist/lib",
|
|
43
|
+
/** A path to the `templates` folder within the {@link Dist} folder, holding the consumer-facing templates. */
|
|
44
|
+
DistTemplates = "dist/templates",
|
|
43
45
|
/** Transpiled TypeScript declaration file extension. */
|
|
44
46
|
DjsExtension = ".d.js",
|
|
45
47
|
/** ESM TypeScript declaration file extension. */
|
|
@@ -37,6 +37,7 @@ var ObsidianDevUtilsRepoPaths = /* @__PURE__ */ ((ObsidianDevUtilsRepoPaths2) =>
|
|
|
37
37
|
ObsidianDevUtilsRepoPaths2["DctsExtension"] = ".d.cts";
|
|
38
38
|
ObsidianDevUtilsRepoPaths2["Dist"] = "dist";
|
|
39
39
|
ObsidianDevUtilsRepoPaths2["DistLib"] = "dist/lib";
|
|
40
|
+
ObsidianDevUtilsRepoPaths2["DistTemplates"] = "dist/templates";
|
|
40
41
|
ObsidianDevUtilsRepoPaths2["DjsExtension"] = ".d.js";
|
|
41
42
|
ObsidianDevUtilsRepoPaths2["DmtsExtension"] = ".d.mts";
|
|
42
43
|
ObsidianDevUtilsRepoPaths2["DprintJson"] = "dprint.json";
|
|
@@ -75,4 +76,4 @@ var ObsidianDevUtilsRepoPaths = /* @__PURE__ */ ((ObsidianDevUtilsRepoPaths2) =>
|
|
|
75
76
|
export {
|
|
76
77
|
ObsidianDevUtilsRepoPaths
|
|
77
78
|
};
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9vYnNpZGlhbi1kZXYtdXRpbHMtcmVwby1wYXRocy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGRlZmluZXMgYW4gZW51bWVyYXRpb24gb2YgY29tbW9uIGZpbGUgcGF0aHMgYW5kIHBhdHRlcm5zIHVzZWQgaW4gdGhlIE9ic2lkaWFuIGRldmVsb3BtZW50IHV0aWxpdGllcyByZXBvc2l0b3J5LlxuICogVGhlc2UgcGF0aHMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgYnVpbGQgcHJvY2VzcyBhbmQgb3RoZXIgdXRpbGl0aWVzLCBlbnN1cmluZyBjb25zaXN0ZW5jeSBhbmQgcmVkdWNpbmcgdGhlIGxpa2VsaWhvb2RcbiAqIG9mIGVycm9ycyBkdWUgdG8gaGFyZGNvZGVkIHN0cmluZ3MuXG4gKi9cblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBjb21tb24gZmlsZSBwYXRocyBhbmQgcGF0dGVybnMgdXNlZCBpbiB0aGUgT2JzaWRpYW4gZGV2ZWxvcG1lbnQgdXRpbGl0aWVzIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBlbnVtIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMge1xuICAvKiogQW55IGZpbGUgb3IgZm9sZGVyLiAqL1xuICBBbnkgPSAnKicsXG5cbiAgLyoqIENvbW1vbkpTIGZpbGUuICovXG4gIEFueUNqcyA9ICcqLmNqcycsXG5cbiAgLyoqIENvbW1vbkpTIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZS4gKi9cbiAgQW55RGN0cyA9ICcqLmQuY3RzJyxcblxuICAvKiogRVNNIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZS4gKi9cbiAgQW55RG10cyA9ICcqLmQubXRzJyxcblxuICAvKiogVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlLiAqL1xuICBBbnlEdHMgPSAnKi5kLnRzJyxcblxuICAvKiogRVNNIEphdmFTY3JpcHQgZmlsZS4gKi9cbiAgQW55TWpzID0gJyoubWpzJyxcblxuICAvKiogQW55IHBhdGggcmVjdXJzaXZlbHkuICovXG4gIEFueVBhdGggPSAnKionLFxuXG4gIC8qKiBBbnkgVHlwZVNjcmlwdCBmaWxlLiAqL1xuICBBbnlUcyA9ICcqLnRzJyxcblxuICAvKiogQ29tbW9uSlMgZm9sZGVyLiAqL1xuICBDanMgPSAnY2pzJyxcblxuICAvKiogQ29tbW9uSlMgZmlsZSBleHRlbnNpb24uICovXG4gIENqc0V4dGVuc2lvbiA9ICcuY2pzJyxcblxuICAvKiogQ3VycmVudCBmb2xkZXIuICovXG4gIEN1cnJlbnRGb2xkZXIgPSAnLicsXG5cbiAgLyoqIERhdGF2aWV3IHR5cGVzLiAqL1xuICBEYXRhdmlld1R5cGVzID0gJ3NyYy9vYnNpZGlhbi9AdHlwZXMvZGF0YXZpZXcvKionLFxuXG4gIC8qKiBDb21tb25KUyBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgZXh0ZW5zaW9uLiAqL1xuICBEY3RzRXh0ZW5zaW9uID0gJy5kLmN0cycsXG5cbiAgLyoqIERpc3RyaWJ1dGlvbiBmb2xkZXIuICovXG4gIERpc3QgPSAnZGlzdCcsXG5cbiAgLyoqIEEgcGF0aCB0byB0aGUgYGxpYmAgZm9sZGVyIHdpdGhpbiB0aGUge0BsaW5rIERpc3R9IGZvbGRlci4gKi9cbiAgRGlzdExpYiA9ICdkaXN0L2xpYicsXG5cbiAgLyoqIEEgcGF0aCB0byB0aGUgYHRlbXBsYXRlc2AgZm9sZGVyIHdpdGhpbiB0aGUge0BsaW5rIERpc3R9IGZvbGRlciwgaG9sZGluZyB0aGUgY29uc3VtZXItZmFjaW5nIHRlbXBsYXRlcy4gKi9cbiAgRGlzdFRlbXBsYXRlcyA9ICdkaXN0L3RlbXBsYXRlcycsXG5cbiAgLyoqIFRyYW5zcGlsZWQgVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlIGV4dGVuc2lvbi4gKi9cbiAgRGpzRXh0ZW5zaW9uID0gJy5kLmpzJyxcblxuICAvKiogRVNNIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZSBleHRlbnNpb24uICovXG4gIERtdHNFeHRlbnNpb24gPSAnLmQubXRzJyxcblxuICAvKiogRHByaW50IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgRHByaW50SnNvbiA9ICdkcHJpbnQuanNvbicsXG5cbiAgLyoqIFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZmlsZSBleHRlbnNpb24uICovXG4gIER0c0V4dGVuc2lvbiA9ICcuZC50cycsXG5cbiAgLyoqIEVTTSBUeXBlU2NyaXB0IEVTTGludCBjb25maWd1cmF0aW9uIGZpbGUuICovXG4gIEVzbGludENvbmZpZ010cyA9ICdlc2xpbnQuY29uZmlnLm10cycsXG5cbiAgLyoqIEVTTSBKYXZhU2NyaXB0IGZvbGRlci4gKi9cbiAgRXNtID0gJ2VzbScsXG5cbiAgLyoqIENvbW1vbkpTIEphdmFTY3JpcHQgaW5kZXggZmlsZS4gKi9cbiAgSW5kZXhDanMgPSAnaW5kZXguY2pzJyxcblxuICAvKiogQ29tbW9uSlMgVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBmaWxlIGluZGV4IGZpbGUuICovXG4gIEluZGV4RGN0cyA9ICdpbmRleC5kLmN0cycsXG5cbiAgLyoqIEVTTSBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUgaW5kZXggZmlsZS4gKi9cbiAgSW5kZXhEbXRzID0gJ2luZGV4LmQubXRzJyxcblxuICAvKiogRVNNIEphdmFTY3JpcHQgaW5kZXggZmlsZS4gKi9cbiAgSW5kZXhNanMgPSAnaW5kZXgubWpzJyxcblxuICAvKiogVHlwZVNjcmlwdCBpbmRleCBmaWxlLiAqL1xuICBJbmRleFRzID0gJ2luZGV4LnRzJyxcblxuICAvKiogSmF2YVNjcmlwdCBmaWxlIGV4dGVuc2lvbi4gKi9cbiAgSnNFeHRlbnNpb24gPSAnLmpzJyxcblxuICAvKiogTGlicmFyeSBDb21tb25KUyBmaWxlLiAqL1xuICBMaWJyYXJ5Q2pzID0gJ2xpYnJhcnkuY2pzJyxcblxuICAvKiogTGlicmFyeSBFU00gSmF2YVNjcmlwdCBmaWxlLiAqL1xuICBMaWJyYXJ5TWpzID0gJ2xpYnJhcnkubWpzJyxcblxuICAvKiogRVNNIE1hcmtkb3dubGludCBDTEkyIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgTWFya2Rvd25saW50Q2xpMkNvbmZpZ01qcyA9ICcubWFya2Rvd25saW50LWNsaTIubWpzJyxcblxuICAvKiogRVNNIFR5cGVTY3JpcHQgTWFya2Rvd25saW50IENMSTIgY29uZmlndXJhdGlvbiBmaWxlLiAqL1xuICBNYXJrZG93bmxpbnRDbGkyQ29uZmlnTXRzID0gJy5tYXJrZG93bmxpbnQtY2xpMi5tdHMnLFxuXG4gIC8qKiBNYXJrZG93bmxpbnQgQ0xJMiBjb25maWd1cmF0aW9uIHNjaGVtYSBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGZpbGUuICovXG4gIE1hcmtkb3dubGludFR5cGVzTWFya2Rvd25saW50Q2xpMkNvbmZpZ1NjaGVtYUR0cyA9ICdzcmMvc2NyaXB0LXV0aWxzL2xpbnRlcnMvbWFya2Rvd25saW50LXR5cGVzL0B0eXBlcy9tYXJrZG93bmxpbnQtY2xpMi1jb25maWctc2NoZW1hLmQudHMnLFxuXG4gIC8qKiBFU00gSmF2YVNjcmlwdCBmaWxlIGV4dGVuc2lvbi4gKi9cbiAgTWpzRXh0ZW5zaW9uID0gJy5tanMnLFxuXG4gIC8qKiBOb2RlIG1vZHVsZXMgZm9sZGVyLiAqL1xuICBOb2RlTW9kdWxlcyA9ICdub2RlX21vZHVsZXMnLFxuXG4gIC8qKiBQYWNrYWdlIEpTT04gZmlsZS4gKi9cbiAgUGFja2FnZUpzb24gPSAncGFja2FnZS5qc29uJyxcblxuICAvKiogUm9vdCBmb2xkZXIuICovXG4gIFJvb3RGb2xkZXIgPSAnLycsXG5cbiAgLyoqIFNjcmlwdHMgZm9sZGVyLiAqL1xuICBTY3JpcHRzID0gJ3NjcmlwdHMnLFxuXG4gIC8qKiBTY3JpcHRVdGlscyBmb2xkZXIuICovXG4gIFNjcmlwdFV0aWxzID0gJ3NjcmlwdC11dGlscycsXG5cbiAgLyoqIFNvdXJjZSBmb2xkZXIuICovXG4gIFNyYyA9ICdzcmMnLFxuXG4gIC8qKiBTdGF0aWMgZm9sZGVyLiAqL1xuICBTdGF0aWMgPSAnc3RhdGljJyxcblxuICAvKiogU3R5bGVzIGZvbGRlci4gKi9cbiAgU3R5bGVzID0gJ3N0eWxlcycsXG5cbiAgLyoqIFN0eWxlcyBDU1MgZmlsZS4gKi9cbiAgU3R5bGVzQ3NzID0gJ3N0eWxlcy5jc3MnLFxuXG4gIC8qKiBUZXN0IGhlbHBlcnMgZm9sZGVyLiAqL1xuICBUZXN0SGVscGVycyA9ICd0ZXN0LWhlbHBlcnMnLFxuXG4gIC8qKiBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gZmlsZS4gKi9cbiAgVHNDb25maWdKc29uID0gJ3RzY29uZmlnLmpzb24nLFxuXG4gIC8qKiBUeXBlU2NyaXB0IGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IHZhbGlkYXRlcyB0aGUgZ2VuZXJhdGVkIENvbW1vbkpTIGRlY2xhcmF0aW9ucy4gKi9cbiAgVHNDb25maWdWYWxpZGF0ZURlY2xhcmF0aW9uc0Nqc0pzb24gPSAndHNjb25maWcudmFsaWRhdGUtZGVjbGFyYXRpb25zLWNqcy5qc29uJyxcblxuICAvKiogVHlwZVNjcmlwdCBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCB2YWxpZGF0ZXMgdGhlIGdlbmVyYXRlZCBFU00gZGVjbGFyYXRpb25zLiAqL1xuICBUc0NvbmZpZ1ZhbGlkYXRlRGVjbGFyYXRpb25zSnNvbiA9ICd0c2NvbmZpZy52YWxpZGF0ZS1kZWNsYXJhdGlvbnMuanNvbicsXG5cbiAgLyoqIFR5cGVTY3JpcHQgZmlsZSBleHRlbnNpb24uICovXG4gIFRzRXh0ZW5zaW9uID0gJy50cycsXG5cbiAgLyoqIFR5cGVzIGZvbGRlci4gKi9cbiAgVHlwZXMgPSAnQHR5cGVzJ1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXTyxJQUFLLDRCQUFMLGtCQUFLQSwrQkFBTDtBQUVMLEVBQUFBLDJCQUFBLFNBQU07QUFHTixFQUFBQSwyQkFBQSxZQUFTO0FBR1QsRUFBQUEsMkJBQUEsYUFBVTtBQUdWLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxZQUFTO0FBR1QsRUFBQUEsMkJBQUEsWUFBUztBQUdULEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxXQUFRO0FBR1IsRUFBQUEsMkJBQUEsU0FBTTtBQUdOLEVBQUFBLDJCQUFBLGtCQUFlO0FBR2YsRUFBQUEsMkJBQUEsbUJBQWdCO0FBR2hCLEVBQUFBLDJCQUFBLG1CQUFnQjtBQUdoQixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFHaEIsRUFBQUEsMkJBQUEsVUFBTztBQUdQLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFHaEIsRUFBQUEsMkJBQUEsa0JBQWU7QUFHZixFQUFBQSwyQkFBQSxtQkFBZ0I7QUFHaEIsRUFBQUEsMkJBQUEsZ0JBQWE7QUFHYixFQUFBQSwyQkFBQSxrQkFBZTtBQUdmLEVBQUFBLDJCQUFBLHFCQUFrQjtBQUdsQixFQUFBQSwyQkFBQSxTQUFNO0FBR04sRUFBQUEsMkJBQUEsY0FBVztBQUdYLEVBQUFBLDJCQUFBLGVBQVk7QUFHWixFQUFBQSwyQkFBQSxlQUFZO0FBR1osRUFBQUEsMkJBQUEsY0FBVztBQUdYLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLGdCQUFhO0FBR2IsRUFBQUEsMkJBQUEsZ0JBQWE7QUFHYixFQUFBQSwyQkFBQSwrQkFBNEI7QUFHNUIsRUFBQUEsMkJBQUEsK0JBQTRCO0FBRzVCLEVBQUFBLDJCQUFBLHNEQUFtRDtBQUduRCxFQUFBQSwyQkFBQSxrQkFBZTtBQUdmLEVBQUFBLDJCQUFBLGlCQUFjO0FBR2QsRUFBQUEsMkJBQUEsaUJBQWM7QUFHZCxFQUFBQSwyQkFBQSxnQkFBYTtBQUdiLEVBQUFBLDJCQUFBLGFBQVU7QUFHVixFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLFNBQU07QUFHTixFQUFBQSwyQkFBQSxZQUFTO0FBR1QsRUFBQUEsMkJBQUEsWUFBUztBQUdULEVBQUFBLDJCQUFBLGVBQVk7QUFHWixFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLGtCQUFlO0FBR2YsRUFBQUEsMkJBQUEseUNBQXNDO0FBR3RDLEVBQUFBLDJCQUFBLHNDQUFtQztBQUduQyxFQUFBQSwyQkFBQSxpQkFBYztBQUdkLEVBQUFBLDJCQUFBLFdBQVE7QUFsSkUsU0FBQUE7QUFBQSxHQUFBOyIsCiAgIm5hbWVzIjogWyJPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzIl0KfQo=
|
|
@@ -12,9 +12,10 @@
|
|
|
12
12
|
*/
|
|
13
13
|
export interface AddUpdatedFilesToGitOptions {
|
|
14
14
|
/**
|
|
15
|
-
* Whether to
|
|
15
|
+
* Whether to run the pre-commit hook when creating the release commit. When `false`, `--no-verify`
|
|
16
|
+
* is passed to the release commit to skip the hook. Defaults to `true`.
|
|
16
17
|
*/
|
|
17
|
-
readonly
|
|
18
|
+
readonly shouldVerifyCommit?: boolean;
|
|
18
19
|
}
|
|
19
20
|
/**
|
|
20
21
|
* The result of parsing the command-line arguments for a version update.
|
|
@@ -34,21 +35,16 @@ export interface ParsedVersionArgs {
|
|
|
34
35
|
*/
|
|
35
36
|
export interface UpdateChangelogOptions {
|
|
36
37
|
/**
|
|
37
|
-
* Whether to
|
|
38
|
-
* is still generated from commit messages, but it is not opened in the editor for
|
|
39
|
-
* Defaults to `
|
|
38
|
+
* Whether to open the generated changelog in the editor for an interactive review. When `false`,
|
|
39
|
+
* the changelog is still generated from commit messages, but it is not opened in the editor for
|
|
40
|
+
* manual review. Defaults to `true`.
|
|
40
41
|
*/
|
|
41
|
-
readonly
|
|
42
|
+
readonly shouldEditChangelog?: boolean;
|
|
42
43
|
}
|
|
43
44
|
/**
|
|
44
45
|
* Options for {@link updateVersion}.
|
|
45
46
|
*/
|
|
46
47
|
export interface UpdateVersionOptions {
|
|
47
|
-
/**
|
|
48
|
-
* Whether to perform a dry run. When `true`, all local steps are executed (version bump, changelog,
|
|
49
|
-
* commit, tag), but the changes are not pushed and no GitHub release is published. Defaults to `false`.
|
|
50
|
-
*/
|
|
51
|
-
readonly isDryRun?: boolean;
|
|
52
48
|
/**
|
|
53
49
|
* A callback function to prepare the GitHub release.
|
|
54
50
|
*
|
|
@@ -57,18 +53,34 @@ export interface UpdateVersionOptions {
|
|
|
57
53
|
*/
|
|
58
54
|
prepareGitHubRelease?(this: void, newVersion: string): Promise<void>;
|
|
59
55
|
/**
|
|
60
|
-
* Whether to
|
|
56
|
+
* Whether to run the build step. The build is a publishing prerequisite, not a verification check,
|
|
57
|
+
* so it is governed by this flag independently of {@link shouldRunChecks} — it runs even when the
|
|
58
|
+
* checks are skipped, so a fast release still ships fresh artifacts. Set to `false` only when the
|
|
59
|
+
* build output is known to already match the current code; otherwise the release would publish
|
|
60
|
+
* stale artifacts. Defaults to `true`.
|
|
61
|
+
*/
|
|
62
|
+
readonly shouldBuild?: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Whether to open the generated changelog in the editor for an interactive review. Defaults to `true`.
|
|
65
|
+
*/
|
|
66
|
+
readonly shouldEditChangelog?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Whether to publish the release. When `false`, all local steps are executed (version bump,
|
|
69
|
+
* changelog, commit, tag), but the changes are not pushed and no GitHub release is published.
|
|
70
|
+
* Defaults to `true`.
|
|
61
71
|
*/
|
|
62
|
-
readonly
|
|
72
|
+
readonly shouldRelease?: boolean;
|
|
63
73
|
/**
|
|
64
|
-
* Whether to
|
|
74
|
+
* Whether to run the preflight verification checks (clean-repo check, format, spellcheck, lint,
|
|
75
|
+
* over-exposure analysis, and tests). The build step is not one of these checks — it is governed
|
|
76
|
+
* separately by {@link shouldBuild}. Defaults to `true`.
|
|
65
77
|
*/
|
|
66
|
-
readonly
|
|
78
|
+
readonly shouldRunChecks?: boolean;
|
|
67
79
|
/**
|
|
68
|
-
* Whether to
|
|
69
|
-
* Defaults to `
|
|
80
|
+
* Whether to run the pre-commit hook when creating the release commit. When `false`, `--no-verify`
|
|
81
|
+
* is passed to the release commit to skip the hook. Defaults to `true`.
|
|
70
82
|
*/
|
|
71
|
-
readonly
|
|
83
|
+
readonly shouldVerifyCommit?: boolean;
|
|
72
84
|
}
|
|
73
85
|
/**
|
|
74
86
|
* Enum representing different types of version updates.
|
|
@@ -123,7 +135,7 @@ export declare function addGitTag(newVersion: string): Promise<void>;
|
|
|
123
135
|
* add the missing word to `cspell.json`) and press Enter to retry. The retry re-stages all files, so the
|
|
124
136
|
* fix is picked up without restarting the whole release lifecycle. In a non-interactive environment (no
|
|
125
137
|
* TTY, such as CI), the error is re-thrown instead of prompting, so the script fails fast rather than
|
|
126
|
-
* hanging. Pass `
|
|
138
|
+
* hanging. Pass `shouldVerifyCommit: false` to skip the pre-commit hook entirely in such cases.
|
|
127
139
|
*
|
|
128
140
|
* @param newVersion - The new version number used as the commit message.
|
|
129
141
|
* @param options - The {@link AddUpdatedFilesToGitOptions} controlling the commit behavior.
|
|
@@ -196,11 +208,12 @@ export declare function gitPush(): Promise<void>;
|
|
|
196
208
|
* Parses the command-line arguments for a version update into a version update type and
|
|
197
209
|
* {@link UpdateVersionOptions}.
|
|
198
210
|
*
|
|
199
|
-
* Recognized flags:
|
|
200
|
-
* - `--
|
|
201
|
-
* - `--
|
|
202
|
-
* - `--
|
|
203
|
-
* - `--
|
|
211
|
+
* Each behavior is enabled by default; the corresponding `--no-*` flag turns it off. Recognized flags:
|
|
212
|
+
* - `--no-build` — skip the build step (only safe when the build output already matches the current code).
|
|
213
|
+
* - `--no-changelog-editing` — generate the changelog without opening it for manual review.
|
|
214
|
+
* - `--no-checks` — skip the clean-repo check, format, spellcheck, lint, over-exposure analysis, and tests (the build still runs).
|
|
215
|
+
* - `--no-commit-verification` — pass `--no-verify` to the release commit, skipping the pre-commit hook.
|
|
216
|
+
* - `--no-release` — run all local steps but skip the push and the GitHub release.
|
|
204
217
|
*
|
|
205
218
|
* @param args - The command-line arguments to parse (typically `process.argv.slice(2)`).
|
|
206
219
|
* @returns The {@link ParsedVersionArgs} containing the version update type and the options.
|