@mnaoumov/typescript-dev-toolkit 3.7.4 → 3.9.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/dist/lib/cjs/docs-site/api-doc-documented-files.cjs +3 -3
- package/dist/lib/cjs/docs-site/api-doc-documented-files.d.cts +3 -2
- package/dist/lib/cjs/docs-site/api-doc-page-generation.cjs +11 -4
- package/dist/lib/cjs/docs-site/api-doc-settings.cjs +1 -1
- package/dist/lib/cjs/docs-site/api-doc-settings.d.cts +73 -1
- package/dist/lib/cjs/docs-site/api-doc-source-processing.cjs +57 -4
- package/dist/lib/cjs/docs-site/api-doc-source-processing.d.cts +43 -3
- package/dist/lib/cjs/docs-site/api-doc-text-utils.cjs +18 -5
- package/dist/lib/cjs/docs-site/api-doc-text-utils.d.cts +5 -4
- package/dist/lib/cjs/docs-site/api-docs.cjs +9 -3
- package/dist/lib/cjs/docs-site/api-docs.d.cts +2 -1
- package/dist/lib/cjs/docs-site/docs-links.cjs +7 -2
- package/dist/lib/cjs/docs-site/docs-site-config.cjs +11 -1
- package/dist/lib/cjs/docs-site/docs-site-config.d.cts +38 -1
- package/dist/lib/esm/docs-site/api-doc-documented-files.d.mts +3 -2
- package/dist/lib/esm/docs-site/api-doc-documented-files.mjs +3 -3
- package/dist/lib/esm/docs-site/api-doc-page-generation.mjs +11 -4
- package/dist/lib/esm/docs-site/api-doc-settings.d.mts +73 -1
- package/dist/lib/esm/docs-site/api-doc-settings.mjs +1 -1
- package/dist/lib/esm/docs-site/api-doc-source-processing.d.mts +43 -3
- package/dist/lib/esm/docs-site/api-doc-source-processing.mjs +65 -5
- package/dist/lib/esm/docs-site/api-doc-text-utils.d.mts +5 -4
- package/dist/lib/esm/docs-site/api-doc-text-utils.mjs +18 -5
- package/dist/lib/esm/docs-site/api-docs.d.mts +2 -1
- package/dist/lib/esm/docs-site/api-docs.mjs +11 -3
- package/dist/lib/esm/docs-site/docs-links.mjs +7 -2
- package/dist/lib/esm/docs-site/docs-site-config.d.mts +38 -1
- package/dist/lib/esm/docs-site/docs-site-config.mjs +11 -1
- package/package.json +1 -1
|
@@ -288,7 +288,10 @@ async function generateOverviewPage(name, info, allTypes) {
|
|
|
288
288
|
const remarksBlock = renderMdxProse(info.remarks, allTypes, info.namespace);
|
|
289
289
|
lines.push(remarksBlock.split("\n").map((line) => line.length > 0 ? `> ${line}` : ">").join("\n"), "");
|
|
290
290
|
}
|
|
291
|
-
|
|
291
|
+
const importStatement = getImportStatement(info);
|
|
292
|
+
if (importStatement !== void 0) {
|
|
293
|
+
lines.push(`<ImportStatement text="${escapeJsxAttribute(importStatement)}" />`, "");
|
|
294
|
+
}
|
|
292
295
|
for (const example of info.examples) {
|
|
293
296
|
lines.push("**Example:**", "", renderExampleMdx(example, allTypes, info.namespace), "");
|
|
294
297
|
}
|
|
@@ -508,9 +511,13 @@ function sidebarTreeToEntries(node, label) {
|
|
|
508
511
|
return { collapsed: true, items, label };
|
|
509
512
|
}
|
|
510
513
|
function getApiIndexIntro(namespaces) {
|
|
511
|
-
const { packageName } = getApiDocSettings();
|
|
514
|
+
const { packageName, publicApiEntry } = getApiDocSettings();
|
|
515
|
+
const intro = `The complete API reference for \`${packageName}\`, generated from its TSDoc. `;
|
|
516
|
+
if (publicApiEntry !== void 0) {
|
|
517
|
+
return `${intro}Every export is imported from the package root, \`${packageName}\`; the modules below group them by source module.`;
|
|
518
|
+
}
|
|
512
519
|
const [exampleNamespace = "module"] = namespaces;
|
|
513
|
-
return
|
|
520
|
+
return `${intro}Each module below maps to an import subpath (e.g. the \`${exampleNamespace}\` module is \`${packageName}/${exampleNamespace}\`).`;
|
|
514
521
|
}
|
|
515
522
|
function getComponentImports(componentNames) {
|
|
516
523
|
return componentNames.map((componentName) => `import ${componentName} from "${API_COMPONENTS_IMPORT_PREFIX}/${componentName}.astro";`);
|
|
@@ -546,4 +553,4 @@ export {
|
|
|
546
553
|
renderVariablePage,
|
|
547
554
|
sidebarTreeToEntries
|
|
548
555
|
};
|
|
549
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1wYWdlLWdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1EWCBwYWdlICsgc2lkZWJhciBlbWlzc2lvbjogcmVuZGVycyBtb2R1bGUgaW5kZXggcGFnZXMsIHBlci10eXBlIG92ZXJ2aWV3IHBhZ2VzLCBwZXItbWVtYmVyIHBhZ2VzLFxuICogYmFja2xpbmtzLCBhbmQgdGhlIFN0YXJsaWdodCBzaWRlYmFyIEpTT04uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgUGFnZUNvbnRlbnQsXG4gIFBhZ2VGcm9udE1hdHRlcixcbiAgU2lkZWJhckVudHJ5LFxuICBTaWRlYmFyTGluayxcbiAgU2lkZWJhclRyZWVOb2RlLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBsaW5rQmFzZVR5cGUsXG4gIG1hcmtkb3duVG9IdG1sLFxuICBtZW1iZXJIcmVmLFxuICByZW5kZXJFeGFtcGxlTWR4LFxuICByZW5kZXJNZHhQcm9zZSxcbiAgcmVuZGVyVHlwZVdpdGhMaW5rcyxcbiAgcmVzb2x2ZUxpbmtzLFxuICB0b1R5cGVGaWxlU2VnbWVudCxcbiAgdG9UeXBlUm91dGVTZWdtZW50LFxuICB0eXBlTGlua1xufSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuaW1wb3J0IHsgZ2V0QXBpRG9jU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1kb2Mtc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlRGlyZWN0b3J5LFxuICBlc2NhcGVKc1N0cmluZyxcbiAgZXNjYXBlSnN4QXR0cmlidXRlLFxuICBlc2NhcGVNYXJrZG93bixcbiAgZXNjYXBlTWR4QW5nbGVCcmFja2V0cyxcbiAgZXNjYXBlTWR4QnJhY2VzLFxuICBlc2NhcGVNZHhQcm9zZSxcbiAgZXNjYXBlWWFtbCxcbiAgZ2V0RGlzcGxheU5hbWUsXG4gIGdldEltcG9ydFN0YXRlbWVudCxcbiAgZ2V0TmFtZXNwYWNlRGlyZWN0b3J5LFxuICBtZW1iZXJSb3V0ZVNlZ21lbnQsXG4gIG1lbWJlclNsdWcsXG4gIG92ZXJsb2FkUm91dGVTZWdtZW50LFxuICBvdmVybG9hZFNsdWcsXG4gIHN0cmlwTWFya2Rvd24sXG4gIHRydW5jYXRlU2lnbmF0dXJlXG59IGZyb20gJy4vYXBpLWRvYy10ZXh0LXV0aWxzLnRzJztcbmltcG9ydCB7IEFQSV9DT01QT05FTlRTX0lNUE9SVF9QUkVGSVggfSBmcm9tICcuL2RvY3Mtc2l0ZS1hc3NldHMudHMnO1xuXG5jb25zdCBKU09OX0lOREVOVCA9IDI7XG5cbi8qKlxuICogQXBwZW5kIGJhY2tsaW5rcyB0byBvdmVydmlldyBwYWdlcyBhbmQgd3JpdGUgYWxsIGZpbGVzLiBLZXllZCBieSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqXG4gKiBAcGFyYW0gcGFnZUNvbnRlbnRzIC0gRXZlcnkgb3ZlcnZpZXcgcGFnZSdzIGNvbnRlbnQgYW5kIHBhdGgsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGVuZEJhY2tsaW5rc0FuZFdyaXRlKFxuICBwYWdlQ29udGVudHM6IE1hcDxzdHJpbmcsIFBhZ2VDb250ZW50PixcbiAgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQocGFnZUNvbnRlbnRzLCBhbGxUeXBlcyk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB7IGNvbnRlbnQsIGZpbGVQYXRoIH1dIG9mIHBhZ2VDb250ZW50cykge1xuICAgIGNvbnN0IHR5cGVCYWNrbGlua3MgPSBiYWNrbGlua3MuZ2V0KGtleSkgPz8gW107XG4gICAgY29uc3QgbGluZXMgPSBbY29udGVudF07XG4gICAgaWYgKHR5cGVCYWNrbGlua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydGVkQmFja2xpbmtzID0gWy4uLnR5cGVCYWNrbGlua3NdLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gICAgICBsaW5lcy5wdXNoKCcnLCAnLS0tJywgJycsICcqKkxpbmtzIHRvIHRoaXMgcGFnZToqKicsICcnKTtcbiAgICAgIGZvciAoY29uc3QgYmxLZXkgb2Ygc29ydGVkQmFja2xpbmtzKSB7XG4gICAgICAgIGNvbnN0IGJsSW5mbyA9IGVuc3VyZU5vbk51bGxhYmxlKGFsbFR5cGVzLmdldChibEtleSkpO1xuICAgICAgICBjb25zdCBibE5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGJsSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICBsaW5lcy5wdXNoKGAtIFske2JsSW5mby5uYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtibE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudChibEluZm8ubmFtZXNwYWNlLCBibEluZm8ubmFtZSl9LylgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCBiYWNrbGlua3MgYnkgc2Nhbm5pbmcgZ2VuZXJhdGVkIHBhZ2UgY29udGVudCBmb3IgaW50ZXJuYWwgQVBJIGxpbmtzLiBLZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKlxuICogQHBhcmFtIHBhZ2VDb250ZW50cyAtIEV2ZXJ5IG92ZXJ2aWV3IHBhZ2UncyBjb250ZW50IGFuZCBwYXRoLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcmV0dXJucyBFYWNoIHJlZmVyZW5jZWQgdHlwZSdzIHF1YWxpZmllZCBpZCBtYXBwZWQgdG8gdGhlIGlkcyBvZiB0aGUgcGFnZXMgbGlua2luZyB0byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQoXG4gIHBhZ2VDb250ZW50czogTWFwPHN0cmluZywgUGFnZUNvbnRlbnQ+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+XG4pOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICBjb25zdCBiYWNrbGlua3MgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIC8vIEVtaXR0ZWQgVVJMcyBsb3dlcmNhc2UgdGhlIHR5cGUgc2VnbWVudCAoc2VlIHRvUm91dGVTZWdtZW50KSwgc28gbWFwIGVhY2ggbG93ZXJjYXNlZCByb3V0ZVxuICAvLyBpZGVudGl0eSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBxdWFsaWZpZWQgdHlwZSBrZXkuXG4gIGNvbnN0IHJvdXRlS2V5VG9UeXBlS2V5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbdHlwZUtleSwgaW5mb10gb2YgYWxsVHlwZXMpIHtcbiAgICByb3V0ZUtleVRvVHlwZUtleS5zZXQoYCR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0jJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9YCwgdHlwZUtleSk7XG4gIH1cbiAgY29uc3QgZXNjYXBlZEJhc2UgPSBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbiAgY29uc3QgbGlua1BhdHRlcm4gPSBuZXcgUmVnRXhwKGAke2VzY2FwZWRCYXNlfS9hcGkvKD88cGF0aD4oPzpbYS16QS1aMC05X0AtXSsvKSspYCwgJ2cnKTtcbiAgZm9yIChjb25zdCBbc291cmNlS2V5LCB7IGNvbnRlbnQgfV0gb2YgcGFnZUNvbnRlbnRzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBjb250ZW50Lm1hdGNoQWxsKGxpbmtQYXR0ZXJuKSkge1xuICAgICAgLy8gVGhlIHBhdHRlcm4gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHNlZ21lbnQuXG4gICAgICBjb25zdCBzZWdtZW50cyA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdwYXRoJykuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBjb25zdCB0eXBlTmFtZSA9IGVuc3VyZU5vbk51bGxhYmxlKHNlZ21lbnRzLmF0KC0xKSk7XG4gICAgICBjb25zdCBuYW1lc3BhY2UgPSBzZWdtZW50cy5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgY29uc3Qgcm91dGVLZXkgPSBgJHtuYW1lc3BhY2V9IyR7dHlwZU5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc29sdmVkS2V5ID0gcm91dGVLZXlUb1R5cGVLZXkuZ2V0KHJvdXRlS2V5KTtcbiAgICAgIGlmIChyZXNvbHZlZEtleSAhPT0gdW5kZWZpbmVkICYmIHJlc29sdmVkS2V5ICE9PSBzb3VyY2VLZXkpIHtcbiAgICAgICAgcmVmZXJlbmNlZC5hZGQocmVzb2x2ZWRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWQpIHtcbiAgICAgIGlmICghYmFja2xpbmtzLmhhcyhyZWZlcmVuY2UpKSB7XG4gICAgICAgIGJhY2tsaW5rcy5zZXQocmVmZXJlbmNlLCBbXSk7XG4gICAgICB9XG4gICAgICBiYWNrbGlua3MuZ2V0KHJlZmVyZW5jZSk/LnB1c2goc291cmNlS2V5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbmFtZXNwYWNlIHRyZWUgdGhlIHNpZGViYXIgaXMgZ2VuZXJhdGVkIGZyb20uXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEByZXR1cm5zIFRoZSByb290IG9mIHRoZSB0cmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaWRlYmFyVHJlZSh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogU2lkZWJhclRyZWVOb2RlIHtcbiAgY29uc3Qgcm9vdDogU2lkZWJhclRyZWVOb2RlID0geyBjaGlsZHJlbjogbmV3IE1hcCgpLCB0eXBlczogW10gfTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGNvbnN0IHBhcnRzID0gaW5mby5uYW1lc3BhY2Uuc3BsaXQoJy8nKTtcbiAgICBsZXQgbm9kZSA9IHJvb3Q7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkcmVuLmdldChwYXJ0KTtcbiAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgY2hpbGQgPSB7IGNoaWxkcmVuOiBuZXcgTWFwKCksIHR5cGVzOiBbXSB9O1xuICAgICAgICBub2RlLmNoaWxkcmVuLnNldChwYXJ0LCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuICAgIG5vZGUudHlwZXMucHVzaChpbmZvKTtcbiAgfVxuICByZXR1cm4gcm9vdDtcbn1cblxuLyoqXG4gKiBUaGUgcmF3IGNvZGUgc2lnbmF0dXJlIHNob3duIG9uIGEgdHlwZS1vdmVydmlldyBwYWdlJ3MgT0cgY2FyZCwgZm9yIHRoZSBraW5kcyB0aGF0IHJlbmRlciBhIHNpbmdsZVxuICogc2lnbmF0dXJlIGxpbmUgKGZ1bmN0aW9uIC8gdHlwZSBhbGlhcyAvIHZhcmlhYmxlKS4gQ2xhc3NlcywgaW50ZXJmYWNlcyBhbmQgZW51bXMgcmVuZGVyIG1lbWJlclxuICogdGFibGVzIGluc3RlYWQsIHNvIHRoZXkgZ2V0IG5vIHNpZ25hdHVyZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBzaWduYXR1cmUsIG9yIGB1bmRlZmluZWRgIGZvciBhIGtpbmQgdGhhdCByZW5kZXJzIG1lbWJlciB0YWJsZXMgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPdmVydmlld1NpZ25hdHVyZShuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0ICRmdW5jdGlvbiA9IGluZm8ubWV0aG9kc1swXTtcbiAgICByZXR1cm4gJGZ1bmN0aW9uID8gYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoaW5mby5raW5kID09PSAndHlwZScpIHtcbiAgICByZXR1cm4gYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7aW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJ31gO1xuICB9XG4gIHJldHVybiBpbmZvLmtpbmQgPT09ICd2YXJpYWJsZScgPyBgJHtpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0J30gJHtuYW1lfTogJHtpbmZvLnZhcmlhYmxlVHlwZSA/PyAndW5rbm93bid9YCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcml0ZXMgb25lIHBhZ2UgcGVyIG93biBwcm9wZXJ0eSBhbmQgcGVyIG93biBtZXRob2Qgb3ZlcmxvYWQga2V5IG9mIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNZW1iZXJQYWdlcyhuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVEaXJlY3RvcnkgPSB0b1R5cGVGaWxlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IHR5cGVSb3V0ZURpcmVjdG9yeSA9IHRvVHlwZVJvdXRlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IGNvbXBvbmVudEltcG9ydHMgPSBnZXRDb21wb25lbnRJbXBvcnRzKFsnTWVtYmVyRGV0YWlsJ10pO1xuXG4gIC8vIFByb3BlcnR5IHBhZ2VzIChza2lwIGluaGVyaXRlZCDigJQgdGhleSBsaXZlIG9uIHRoZSBwYXJlbnQgdHlwZSlcbiAgY29uc3QgcHJvcGVydGllcyA9IGluZm8ucHJvcGVydGllcy5maWx0ZXIoKHApID0+ICFwLmluaGVyaXRlZEZyb20pO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCB0eXBlRmlsZURpcmVjdG9yeSwgYCR7bWVtYmVyU2x1Zyhwcm9wZXJ0eS5uYW1lKX0ubWR4YCk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIGNvbnN0IHByb3BlcnR5VGl0bGUgPSBgJHtuYW1lfS4ke3Byb3BlcnR5Lm5hbWV9YDtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogcHJvcGVydHkuZGVzY3JpcHRpb24sXG4gICAgICBzaWRlYmFyTGFiZWw6IHByb3BlcnR5VGl0bGUsXG4gICAgICBzaWduYXR1cmU6IGAke3Byb3BlcnR5LnNpZ25hdHVyZX06ICR7cHJvcGVydHkudHlwZX1gLFxuICAgICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZURpcmVjdG9yeX0vJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCxcbiAgICAgIHRpdGxlOiBwcm9wZXJ0eVRpdGxlXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7cHJvcGVydHkubmFtZX1gLFxuICAgICAgJydcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGljQXR0cmlidXRlID0gcHJvcGVydHkuaXNTdGF0aWMgPyAnIGlzU3RhdGljPXt0cnVlfScgOiAnJztcbiAgICBjb25zdCB0eXBlQXR0cmlidXRlID0gYCB0eXBlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwcm9wZXJ0eS50eXBlLCBhbGxUeXBlcywgbmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9XCJgO1xuICAgIGNvbnN0IGRlc2NBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5kZXNjcmlwdGlvbiA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MocHJvcGVydHkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gcHJvcGVydHkucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhwcm9wZXJ0eS5yZW1hcmtzLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gICAgY29uc3Qgc2luY2VBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5zaW5jZSA/IGAgc2luY2U9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShwcm9wZXJ0eS5zaW5jZSl9XCJgIDogJyc7XG4gICAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eS5leGFtcGxlcyl9fWAgOiAnJztcblxuICAgIGxpbmVzLnB1c2goYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0ke3R5cGVBdHRyaWJ1dGV9JHtkZXNjQXR0cmlidXRlfSR7cmVtYXJrc0F0dHJpYnV0ZX0ke3NpbmNlQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCwgJycpO1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvLyBNZXRob2QgcGFnZXMg4oCUIGVhY2ggb3ZlcmxvYWQga2V5IGdldHMgaXRzIG93biBwYWdlIChza2lwIGluaGVyaXRlZClcbiAgY29uc3QgbWV0aG9kcyA9IGluZm8ubWV0aG9kcy5maWx0ZXIoKG0pID0+ICFtLmluaGVyaXRlZEZyb20pO1xuICBjb25zdCBvdmVybG9hZEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBNZW1iZXJJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBrZXkgPSBtZXRob2Qub3ZlcmxvYWRLZXk7XG4gICAgaWYgKCFvdmVybG9hZEdyb3Vwcy5oYXMoa2V5KSkge1xuICAgICAgb3ZlcmxvYWRHcm91cHMuc2V0KGtleSwgW10pO1xuICAgIH1cbiAgICBvdmVybG9hZEdyb3Vwcy5nZXQoa2V5KT8ucHVzaChtZXRob2QpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbb3ZlcmxvYWRLZXksIG92ZXJsb2Fkc10gb2Ygb3ZlcmxvYWRHcm91cHMpIHtcbiAgICBjb25zdCBmaWxlU2x1ZyA9IG92ZXJsb2FkU2x1ZyhvdmVybG9hZEtleSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVEaXJlY3RvcnksIGAke2ZpbGVTbHVnfS5tZHhgKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBgJHtuYW1lfS4ke292ZXJsb2FkS2V5fSBtZXRob2RgO1xuICAgIC8vIEEgZ3JvdXAgaXMgY3JlYXRlZCBieSBpdHMgZmlyc3Qgb3ZlcmxvYWQuXG4gICAgY29uc3QgZmlyc3RPdmVybG9hZCA9IGVuc3VyZU5vbk51bGxhYmxlKG92ZXJsb2Fkc1swXSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogZmlyc3RPdmVybG9hZC5kZXNjcmlwdGlvbixcbiAgICAgIHNpZGViYXJMYWJlbDogYCR7bmFtZX0uJHtvdmVybG9hZEtleX1gLFxuICAgICAgc2lnbmF0dXJlOiBgJHtmaXJzdE92ZXJsb2FkLnNpZ25hdHVyZX06ICR7Zmlyc3RPdmVybG9hZC5yZXR1cm5UeXBlfWAsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9LyR7dHlwZVJvdXRlRGlyZWN0b3J5fS8ke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gLFxuICAgICAgdGl0bGU6IGRpc3BsYXlOYW1lXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7b3ZlcmxvYWRLZXl9YCxcbiAgICAgICcnXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWQgb2Ygb3ZlcmxvYWRzKSB7XG4gICAgICByZW5kZXJNZXRob2RPdmVybG9hZE1keChsaW5lcywgb3ZlcmxvYWQsIG5hbWUsIGluZm8ubmFtZXNwYWNlLCBhbGxUeXBlcyk7XG4gICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGluZXMucHVzaCgnLS0tJywgJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGVhY2ggbW9kdWxlJ3MgaW5kZXggcGFnZSBhbmQgdGhlIHJvb3QgQVBJIGluZGV4LlxuICpcbiAqIEBwYXJhbSB0eXBlcyAtIFRoZSBkb2N1bWVudGVkIHR5cGVzLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbW9kdWxlT3ZlcnZpZXdzIC0gRWFjaCBuYW1lc3BhY2UncyBgQGZpbGVgIG92ZXJ2aWV3LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOYW1lc3BhY2VJbmRleFBhZ2VzKFxuICB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBtb2R1bGVPdmVydmlld3M6IE1hcDxzdHJpbmcsIHN0cmluZz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBuYW1lc3BhY2VzID0gbmV3IE1hcDxzdHJpbmcsIFR5cGVJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgWywgaW5mb10gb2YgdHlwZXMpIHtcbiAgICBpZiAoIW5hbWVzcGFjZXMuaGFzKGluZm8ubmFtZXNwYWNlKSkge1xuICAgICAgbmFtZXNwYWNlcy5zZXQoaW5mby5uYW1lc3BhY2UsIFtdKTtcbiAgICB9XG4gICAgbmFtZXNwYWNlcy5nZXQoaW5mby5uYW1lc3BhY2UpPy5wdXNoKGluZm8pO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBuc1R5cGVzXSBvZiBuYW1lc3BhY2VzKSB7XG4gICAgY29uc3QgbnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkobmFtZXNwYWNlKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCAnaW5kZXgubWR4Jyk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIC8vIFRoZSBtb2R1bGUncyBgQGZpbGVgIHRleHQgZG91YmxlcyBhcyBpdHMgZGVzY3JpcHRpb24uXG4gICAgLy8gV2l0aG91dCBpdCB0aGUgbW9kdWxlIGNhcmQgd2FzIHRpdGxlLW9ubHkgd2hpbGUgZXZlcnkgbWVtYmVyIGNhcmQgdW5kZXIgaXQgY2FycmllZCBvbmUuXG4gICAgY29uc3Qgb3ZlcnZpZXcgPSBtb2R1bGVPdmVydmlld3MuZ2V0KG5hbWVzcGFjZSk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgICAgZGVzY3JpcHRpb246IG92ZXJ2aWV3LFxuICAgICAgc2lkZWJhckxhYmVsOiBuYW1lc3BhY2UsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9YCxcbiAgICAgIHRpdGxlOiBuYW1lc3BhY2VcbiAgICB9KTtcblxuICAgIC8vIE1vZHVsZSBAZmlsZSBvdmVydmlldyB0ZXh0XG4gICAgaWYgKG92ZXJ2aWV3KSB7XG4gICAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKG92ZXJ2aWV3LCBhbGxUeXBlcywgbmFtZXNwYWNlKSwgJycpO1xuICAgIH1cblxuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnQ2xhc3NlcycsICdDbGFzcycsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdjbGFzcycpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0ludGVyZmFjZXMnLCAnSW50ZXJmYWNlJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ2ludGVyZmFjZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0Z1bmN0aW9ucycsICdGdW5jdGlvbicsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdmdW5jdGlvbicpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1R5cGVzJywgJ1R5cGUnLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAndHlwZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0VudW1zJywgJ0VudW0nLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAnZW51bScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1ZhcmlhYmxlcycsICdWYXJpYWJsZScsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICd2YXJpYWJsZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG5cbiAgLy8gUm9vdCBBUEkgaW5kZXggcGFnZSBsaXN0aW5nIGV2ZXJ5IG1vZHVsZS5cbiAgY29uc3Qgc29ydGVkTmFtZXNwYWNlcyA9IFsuLi5uYW1lc3BhY2VzLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgY29uc3QgYXBpSW5kZXhJbnRybyA9IGdldEFwaUluZGV4SW50cm8oc29ydGVkTmFtZXNwYWNlcyk7XG4gIGNvbnN0IHJvb3RMaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgZGVzY3JpcHRpb246IGFwaUluZGV4SW50cm8sXG4gICAgc2lkZWJhckxhYmVsOiAnT3ZlcnZpZXcnLFxuICAgIHNsdWc6ICdhcGknLFxuICAgIHRpdGxlOiAnQVBJIHJlZmVyZW5jZSdcbiAgfSk7XG4gIHJvb3RMaW5lcy5wdXNoKGFwaUluZGV4SW50cm8sICcnLCAnIyMgTW9kdWxlcycsICcnKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2Ygc29ydGVkTmFtZXNwYWNlcykge1xuICAgIHJvb3RMaW5lcy5wdXNoKGAtIFske25hbWVzcGFjZX1dKCR7Z2V0QXBpRG9jU2V0dGluZ3MoKS5iYXNlUGF0aH0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KG5hbWVzcGFjZSl9LylgKTtcbiAgfVxuICByb290TGluZXMucHVzaCgnJyk7XG4gIGNvbnN0IHJvb3RGaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksICdpbmRleC5tZHgnKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KHJvb3RGaWxlUGF0aCk7XG4gIGF3YWl0IHdyaXRlRmlsZShyb290RmlsZVBhdGgsIHJvb3RMaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHJldHVybnMgVGhlIHBhZ2UncyBjb250ZW50LCBiZWZvcmUgYmFja2xpbmtzLCBhbmQgdGhlIHBhdGggaXQgaXMgd3JpdHRlbiB0by5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3ZlcnZpZXdQYWdlKG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBQcm9taXNlPFBhZ2VDb250ZW50PiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVTbHVnID0gdG9UeXBlRmlsZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIG5hbWUpO1xuICBjb25zdCB0eXBlUm91dGVTbHVnID0gdG9UeXBlUm91dGVTZWdtZW50KGluZm8ubmFtZXNwYWNlLCBuYW1lKTtcbiAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVTbHVnLCAnaW5kZXgubWR4Jyk7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aCk7XG5cbiAgLy8gRnJvbnRtYXR0ZXJcbiAgY29uc3QgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZShuYW1lLCBpbmZvKTtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgIGRlc2NyaXB0aW9uOiBpbmZvLmRlc2NyaXB0aW9uLFxuICAgIHNpZGViYXJMYWJlbDogZGlzcGxheU5hbWUsXG4gICAgc2lnbmF0dXJlOiBjb21wdXRlT3ZlcnZpZXdTaWduYXR1cmUobmFtZSwgaW5mbyksXG4gICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZVNsdWd9YCxcbiAgICB0aXRsZTogZGlzcGxheU5hbWVcbiAgfSk7XG5cbiAgLy8gQ29tcG9uZW50IGltcG9ydHMg4oCUIGNvbXB1dGUgcmVsYXRpdmUgcGF0aCBmcm9tIGdlbmVyYXRlZCBwYWdlIHRvIGNvbXBvbmVudHNcbiAgbGluZXMucHVzaCguLi5nZXRDb21wb25lbnRJbXBvcnRzKFsnQ29uc3RydWN0b3JCbG9jaycsICdJbXBvcnRTdGF0ZW1lbnQnLCAnTWV0aG9kVGFibGUnLCAnUHJvcGVydHlUYWJsZScsICdUeXBlU2lnbmF0dXJlJ10pLCAnJyk7XG5cbiAgLy8gRGVzY3JpcHRpb25cbiAgaWYgKGluZm8uZGVzY3JpcHRpb24pIHtcbiAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKGluZm8uZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIFJlbWFya3NcbiAgaWYgKGluZm8ucmVtYXJrcykge1xuICAgIGNvbnN0IHJlbWFya3NCbG9jayA9IHJlbmRlck1keFByb3NlKGluZm8ucmVtYXJrcywgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKHJlbWFya3NCbG9jay5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiAobGluZS5sZW5ndGggPiAwID8gYD4gJHtsaW5lfWAgOiAnPicpKS5qb2luKCdcXG4nKSwgJycpO1xuICB9XG5cbiAgLy8gSW1wb3J0IHN0YXRlbWVudFxuICBsaW5lcy5wdXNoKGA8SW1wb3J0U3RhdGVtZW50IHRleHQ9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShnZXRJbXBvcnRTdGF0ZW1lbnQoaW5mbykpfVwiIC8+YCwgJycpO1xuXG4gIC8vIEV4YW1wbGVzXG4gIGZvciAoY29uc3QgZXhhbXBsZSBvZiBpbmZvLmV4YW1wbGVzKSB7XG4gICAgbGluZXMucHVzaCgnKipFeGFtcGxlOioqJywgJycsIHJlbmRlckV4YW1wbGVNZHgoZXhhbXBsZSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSwgJycpO1xuICB9XG5cbiAgLy8gRnVuY3Rpb25zIHJlbmRlciBsaWtlIG1ldGhvZCBkZXRhaWwgcGFnZXMg4oCUIHNpZ25hdHVyZSwgcGFyYW1zLCByZXR1cm5zXG4gIGlmIChpbmZvLmtpbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZW5kZXJGdW5jdGlvblBhZ2UobGluZXMsIGluZm8sIGFsbFR5cGVzKTtcbiAgICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbiAgfVxuXG4gIC8vIFZhcmlhYmxlcyByZW5kZXIgd2l0aCBkZWNsYXJhdGlvbiBrZXl3b3JkIGFuZCB0eXBlXG4gIGlmIChpbmZvLmtpbmQgPT09ICd2YXJpYWJsZScpIHtcbiAgICByZW5kZXJWYXJpYWJsZVBhZ2UobGluZXMsIG5hbWUsIGluZm8sIGFsbFR5cGVzKTtcbiAgICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbiAgfVxuXG4gIC8vIEVudW1zIHJlbmRlciB0aGVpciBtZW1iZXJzIGxpc3RcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2VudW0nKSB7XG4gICAgcmVuZGVyRW51bVBhZ2UobGluZXMsIGluZm8sIGFsbFR5cGVzKTtcbiAgICByZXR1cm4geyBjb250ZW50OiBsaW5lcy5qb2luKCdcXG4nKSwgZmlsZVBhdGggfTtcbiAgfVxuXG4gIC8vIFR5cGUgYWxpYXNlcyByZW5kZXIgdGhlaXIgcmlnaHQtaGFuZC1zaWRlIHNpZ25hdHVyZVxuICBpZiAoaW5mby5raW5kID09PSAndHlwZScpIHtcbiAgICByZW5kZXJUeXBlQWxpYXNQYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBDbGFzc2VzIC8gaW50ZXJmYWNlczogc2lnbmF0dXJlICsgZXh0ZW5kcy9pbXBsZW1lbnRzICsgY29uc3RydWN0b3IgKyBtZW1iZXIgdGFibGVzXG4gIGNvbnN0IHR5cGVQYXJhbXNBdHRyaWJ1dGUgPSBpbmZvLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCA+IDAgPyBgIHR5cGVQYXJhbXM9eyR7SlNPTi5zdHJpbmdpZnkoaW5mby50eXBlUGFyYW1ldGVycyl9fWAgOiAnJztcbiAgY29uc3QgZXh0ZW5kc0F0dHJpYnV0ZSA9IGluZm8uYmFzZVR5cGVzLmxlbmd0aCA+IDAgPyBgIGV4dGVuZHM9eyR7SlNPTi5zdHJpbmdpZnkoaW5mby5iYXNlVHlwZXMpfX1gIDogJyc7XG4gIGNvbnN0IGltcGxlbWVudHNBdHRyaWJ1dGUgPSBpbmZvLmltcGxlbWVudHNUeXBlcy5sZW5ndGggPiAwID8gYCBpbXBsZW1lbnRzPXske0pTT04uc3RyaW5naWZ5KGluZm8uaW1wbGVtZW50c1R5cGVzKX19YCA6ICcnO1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwiJHtpbmZvLmtpbmR9XCIgbmFtZT1cIiR7bmFtZX1cIiR7dHlwZVBhcmFtc0F0dHJpYnV0ZX0ke2V4dGVuZHNBdHRyaWJ1dGV9JHtpbXBsZW1lbnRzQXR0cmlidXRlfSAvPmAsICcnKTtcblxuICBpZiAoaW5mby5iYXNlVHlwZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbmtlZFR5cGVzID0gaW5mby5iYXNlVHlwZXMubWFwKCh0KSA9PiBsaW5rQmFzZVR5cGUodCwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSk7XG4gICAgbGluZXMucHVzaChgKipFeHRlbmRzOioqICR7bGlua2VkVHlwZXMuam9pbignLCAnKX1gLCAnJyk7XG4gIH1cblxuICBpZiAoaW5mby5pbXBsZW1lbnRzVHlwZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxpbmtlZFR5cGVzID0gaW5mby5pbXBsZW1lbnRzVHlwZXMubWFwKCh0KSA9PiBsaW5rQmFzZVR5cGUodCwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSk7XG4gICAgbGluZXMucHVzaChgKipJbXBsZW1lbnRzOioqICR7bGlua2VkVHlwZXMuam9pbignLCAnKX1gLCAnJyk7XG4gIH1cblxuICByZW5kZXJDb25zdHJ1Y3Rvck1keChsaW5lcywgbmFtZSwgaW5mbywgYWxsVHlwZXMpO1xuICByZW5kZXJQcm9wZXJ0eVRhYmxlTWR4KGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gIHJlbmRlck1ldGhvZFRhYmxlTWR4KGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG5cbiAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBTdGFybGlnaHQgc2lkZWJhciBvZiB0aGUgQVBJIHJlZmVyZW5jZS5cbiAqXG4gKiBAcGFyYW0gdHlwZXMgLSBUaGUgZG9jdW1lbnRlZCB0eXBlcywga2V5ZWQgYnkgcXVhbGlmaWVkIGlkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTaWRlYmFySnNvbih0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJvb3QgPSBidWlsZFNpZGViYXJUcmVlKHR5cGVzKTtcblxuICBjb25zdCBncm91cHM6IFNpZGViYXJFbnRyeVtdID0gW107XG4gIGNvbnN0IHRvcExldmVscyA9IFsuLi5yb290LmNoaWxkcmVuXS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgZm9yIChjb25zdCBbdG9wTGV2ZWwsIGNoaWxkXSBvZiB0b3BMZXZlbHMpIHtcbiAgICBncm91cHMucHVzaChzaWRlYmFyVHJlZVRvRW50cmllcyhjaGlsZCwgdG9wTGV2ZWwpKTtcbiAgfVxuXG4gIGNvbnN0IHdyYXBwZWRTaWRlYmFyOiBTaWRlYmFyRW50cnlbXSA9IFt7XG4gICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICBpdGVtczogZ3JvdXBzLFxuICAgIGxhYmVsOiAnQVBJIHJlZmVyZW5jZSdcbiAgfV07XG5cbiAgYXdhaXQgd3JpdGVGaWxlKGdldEFwaURvY1NldHRpbmdzKCkuc2lkZWJhckZpbGUsIEpTT04uc3RyaW5naWZ5KHdyYXBwZWRTaWRlYmFyLCBudWxsLCBKU09OX0lOREVOVCksICd1dGYtOCcpO1xuICBjb25zb2xlLndhcm4oYEdlbmVyYXRlZCBzaWRlYmFyIHdpdGggJHtTdHJpbmcoZ3JvdXBzLmxlbmd0aCl9IHRvcC1sZXZlbCBtb2R1bGUgZ3JvdXBzYCk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIGNsYXNzJ3MgY29uc3RydWN0b3IgYmxvY2suXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJDb25zdHJ1Y3Rvck1keChsaW5lczogc3RyaW5nW10sIG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgY29uc3RydWN0b3IgPSBpbmZvLmNvbnN0cnVjdG9ySW5mbztcbiAgaWYgKCFjb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBjdG9yU2lnID0gYG5ldyAke25hbWV9JHtjb25zdHJ1Y3Rvci5zaWduYXR1cmV9YDtcbiAgY29uc3QgY3RvckRlc2MgPSBjb25zdHJ1Y3Rvci5kZXNjcmlwdGlvblxuICAgID8gYCBkZXNjcmlwdGlvbj1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhjb25zdHJ1Y3Rvci5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpfVwiYFxuICAgIDogJyc7XG4gIGxpbmVzLnB1c2goYDxDb25zdHJ1Y3RvckJsb2NrIHNpZ25hdHVyZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKGN0b3JTaWcpfVwiJHtjdG9yRGVzY30gLz5gLCAnJyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBlbnVtJ3MgbWVtYmVycy5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbnVtUGFnZShsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGxpbmVzLnB1c2goYDxUeXBlU2lnbmF0dXJlIGtpbmQ9XCJlbnVtXCIgbmFtZT1cIiR7aW5mby5uYW1lfVwiIC8+YCwgJycpO1xuXG4gIGlmIChpbmZvLmVudW1NZW1iZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxpbmVzLnB1c2goJyoqTWVtYmVyczoqKicsICcnLCAnfCBNZW1iZXIgfCBWYWx1ZSB8IERlc2NyaXB0aW9uIHwnLCAnfCA6LS0gfCA6LS0gfCA6LS0gfCcpO1xuICBmb3IgKGNvbnN0IG1lbWJlciBvZiBpbmZvLmVudW1NZW1iZXJzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBtZW1iZXIudmFsdWUgPyBgXFxgJHtlc2NhcGVNYXJrZG93bihtZW1iZXIudmFsdWUpfVxcYGAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGB8IFxcYCR7bWVtYmVyLm5hbWV9XFxgIHwgJHt2YWx1ZX0gfCAke2VzY2FwZU1hcmtkb3duKHJlc29sdmVMaW5rcyhtZW1iZXIuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpfSB8YCk7XG4gIH1cbiAgbGluZXMucHVzaCgnJyk7XG59XG5cbi8qKlxuICogUmVuZGVyIHRoZSBTdGFybGlnaHQgZnJvbnRtYXR0ZXIgYmxvY2sgKHRocm91Z2ggdGhlIGNsb3NpbmcgYC0tLWAgYW5kIGl0cyBibGFuayBsaW5lKSBzaGFyZWQgYnkgZXZlcnlcbiAqIGdlbmVyYXRlZCBwYWdlIGtpbmQ6IG1vZHVsZSBpbmRleCwgdHlwZSBvdmVydmlldywgcHJvcGVydHksIGFuZCBtZXRob2QuXG4gKlxuICogRXZlcnkgcGFnZSBraW5kIGdvZXMgdGhyb3VnaCBoZXJlIHNvIG5vIGZpZWxkIGNhbiBiZSBlbWl0dGVkIG9uIHNvbWUga2luZHMgYW5kIHNpbGVudGx5IGRyb3BwZWQgb25cbiAqIG90aGVycy4gYGRlc2NyaXB0aW9uYCBpbiBwYXJ0aWN1bGFyIGlzIG5vdCBqdXN0IFNFTyBtZXRhZGF0YSDigJQgaXQgaXMgdGhlIGxpbmUgdGhlIE9HIGNhcmQgcmVuZGVycyB1bmRlclxuICogdGhlIHRpdGxlLCBzbyBhIHBhZ2Uga2luZCB0aGF0IHNraXBwZWQgaXQgcHJvZHVjZWQgYSB0aXRsZS1vbmx5IGNhcmQgbmV4dCB0byBmdWxseSBwb3B1bGF0ZWQgb25lcy5cbiAqXG4gKiBAcGFyYW0gZnJvbnRNYXR0ZXIgLSBUaGUgcGFnZSdzIGZyb250bWF0dGVyIGZpZWxkcy5cbiAqIEByZXR1cm5zIFRoZSBmcm9udG1hdHRlciBsaW5lcywgdGhyb3VnaCB0aGUgY2xvc2luZyBgLS0tYCBhbmQgaXRzIGJsYW5rIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJGcm9udE1hdHRlcihmcm9udE1hdHRlcjogUGFnZUZyb250TWF0dGVyKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgICctLS0nLFxuICAgIGB0aXRsZTogXCIke2VzY2FwZVlhbWwoZnJvbnRNYXR0ZXIudGl0bGUpfVwiYCxcbiAgICBgc2x1ZzogXCIke2Zyb250TWF0dGVyLnNsdWd9XCJgLFxuICAgIC4uLihmcm9udE1hdHRlci5kZXNjcmlwdGlvbiA/IFtgZGVzY3JpcHRpb246IFwiJHtlc2NhcGVZYW1sKHN0cmlwTWFya2Rvd24oZnJvbnRNYXR0ZXIuZGVzY3JpcHRpb24pKX1cImBdIDogW10pLFxuICAgIC4uLihmcm9udE1hdHRlci5zaWduYXR1cmUgPyBbYHNpZ25hdHVyZTogXCIke2VzY2FwZVlhbWwodHJ1bmNhdGVTaWduYXR1cmUoZnJvbnRNYXR0ZXIuc2lnbmF0dXJlKSl9XCJgXSA6IFtdKSxcbiAgICAnZWRpdFVybDogZmFsc2UnLFxuICAgICdzaWRlYmFyOicsXG4gICAgYCAgbGFiZWw6IFwiJHtlc2NhcGVZYW1sKGZyb250TWF0dGVyLnNpZGViYXJMYWJlbCl9XCJgLFxuICAgICctLS0nLFxuICAgICcnXG4gIF07XG59XG5cbi8qKlxuICogUmVuZGVycyBhIGZ1bmN0aW9uJ3Mgc2lnbmF0dXJlLCBwYXJhbWV0ZXJzLCByZXR1cm4gdmFsdWUgYW5kIGV4YW1wbGVzLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckZ1bmN0aW9uUGFnZShsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0ICRmdW5jdGlvbiA9IGluZm8ubWV0aG9kc1swXTtcbiAgaWYgKCEkZnVuY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsaW5lcy5wdXNoKCcqKlNpZ25hdHVyZToqKicsICcnLCAnYGBgdHMnLCBgZnVuY3Rpb24gJHskZnVuY3Rpb24uc2lnbmF0dXJlfTogJHskZnVuY3Rpb24ucmV0dXJuVHlwZX1gLCAnYGBgJywgJycpO1xuXG4gIGlmICgkZnVuY3Rpb24ucGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgbGluZXMucHVzaCgnKipQYXJhbWV0ZXJzOioqJywgJycsICd8IFBhcmFtZXRlciB8IFR5cGUgfCBEZXNjcmlwdGlvbiB8JywgJ3wgOi0tIHwgOi0tIHwgOi0tIHwnKTtcbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiAkZnVuY3Rpb24ucGFyYW1ldGVycykge1xuICAgICAgbGluZXMucHVzaChcbiAgICAgICAgYHwgXFxgJHtwYXJhbWV0ZXIubmFtZX1cXGAgfCAke2VzY2FwZU1hcmtkb3duKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcyhwYXJhbWV0ZXIudHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9IHwgJHtlc2NhcGVNYXJrZG93bihyZXNvbHZlTGlua3MocGFyYW1ldGVyLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKX0gfGBcbiAgICAgICk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG5cbiAgY29uc3QgcmV0dXJuRGVzYyA9ICRmdW5jdGlvbi5yZXR1cm5EZXNjcmlwdGlvbiA/IGAg4oCUICR7ZXNjYXBlTWR4UHJvc2UocmVzb2x2ZUxpbmtzKCRmdW5jdGlvbi5yZXR1cm5EZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSl9YCA6ICcnO1xuICBsaW5lcy5wdXNoKGAqKlJldHVybnM6KiogJHtlc2NhcGVNZHhCcmFjZXMoZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKCRmdW5jdGlvbi5yZXR1cm5UeXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX0ke3JldHVybkRlc2N9YCwgJycpO1xuXG4gIGZvciAoY29uc3QgZXhhbXBsZSBvZiAkZnVuY3Rpb24uZXhhbXBsZXMpIHtcbiAgICBsaW5lcy5wdXNoKCcqKkV4YW1wbGU6KionLCAnJywgcmVuZGVyRXhhbXBsZU1keChleGFtcGxlLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpLCAnJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZW5kZXJzIG9uZSBtZXRob2Qgb3ZlcmxvYWQuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIG92ZXJsb2FkIC0gVGhlIG92ZXJsb2FkLlxuICogQHBhcmFtIHR5cGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHR5cGUgdGhlIG1ldGhvZCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUgdGhlIG1ldGhvZCBiZWxvbmdzIHRvLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyTWV0aG9kT3ZlcmxvYWRNZHgobGluZXM6IHN0cmluZ1tdLCBvdmVybG9hZDogTWVtYmVySW5mbywgdHlwZU5hbWU6IHN0cmluZywgbmFtZXNwYWNlOiBzdHJpbmcsIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3Qgc2lnID0gYCR7b3ZlcmxvYWQuc2lnbmF0dXJlfTogJHtvdmVybG9hZC5yZXR1cm5UeXBlfWA7XG4gIGNvbnN0IHN0YXRpY0F0dHJpYnV0ZSA9IG92ZXJsb2FkLmlzU3RhdGljID8gJyBpc1N0YXRpYz17dHJ1ZX0nIDogJyc7XG4gIGNvbnN0IGRlc2NBdHRyaWJ1dGUgPSBvdmVybG9hZC5kZXNjcmlwdGlvbiA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3Mob3ZlcmxvYWQuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBuYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gIGNvbnN0IHJlbWFya3NBdHRyaWJ1dGUgPSBvdmVybG9hZC5yZW1hcmtzID8gYCByZW1hcmtzPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG92ZXJsb2FkLnJlbWFya3MsIGFsbFR5cGVzLCBuYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gIGNvbnN0IHNpbmNlQXR0cmlidXRlID0gb3ZlcmxvYWQuc2luY2UgPyBgIHNpbmNlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUob3ZlcmxvYWQuc2luY2UpfVwiYCA6ICcnO1xuICBjb25zdCByZXR1cm5UeXBlQXR0cmlidXRlID0gYCByZXR1cm5UeXBlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhvdmVybG9hZC5yZXR1cm5UeXBlLCBhbGxUeXBlcywgdHlwZU5hbWUsIG5hbWVzcGFjZSkpKX1cImA7XG4gIGNvbnN0IHJldHVybkRlc2NBdHRyaWJ1dGUgPSBvdmVybG9hZC5yZXR1cm5EZXNjcmlwdGlvblxuICAgID8gYCByZXR1cm5EZXNjcmlwdGlvbj1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhvdmVybG9hZC5yZXR1cm5EZXNjcmlwdGlvbiwgYWxsVHlwZXMsIG5hbWVzcGFjZSkpKX1cImBcbiAgICA6ICcnO1xuICBjb25zdCBleGFtcGxlc0F0dHJpYnV0ZSA9IG92ZXJsb2FkLmV4YW1wbGVzLmxlbmd0aCA+IDAgPyBgIGV4YW1wbGVzPXske0pTT04uc3RyaW5naWZ5KG92ZXJsb2FkLmV4YW1wbGVzKX19YCA6ICcnO1xuXG4gIGNvbnN0IHBhcmFtcyA9IG92ZXJsb2FkLnBhcmFtZXRlcnMubWFwKChwKSA9PiAoe1xuICAgIGRlc2NyaXB0aW9uOiBtYXJrZG93blRvSHRtbChwLmRlc2NyaXB0aW9uIHx8IChwLm5hbWUuZW5kc1dpdGgoJz8nKSA/ICcqKE9wdGlvbmFsKSonIDogJycpKSxcbiAgICBuYW1lOiBwLm5hbWUsXG4gICAgdHlwZTogbWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwLnR5cGUsIGFsbFR5cGVzLCB0eXBlTmFtZSwgbmFtZXNwYWNlKSlcbiAgfSkpO1xuICBjb25zdCBwYXJhbXNBdHRyaWJ1dGUgPSBwYXJhbXMubGVuZ3RoID4gMCA/IGAgcGFyYW1ldGVycz17JHtKU09OLnN0cmluZ2lmeShwYXJhbXMpfX1gIDogJyc7XG5cbiAgbGluZXMucHVzaChcbiAgICBgPE1lbWJlckRldGFpbCR7c3RhdGljQXR0cmlidXRlfSBzaWduYXR1cmU9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShzaWcpfVwiJHtkZXNjQXR0cmlidXRlfSR7cmVtYXJrc0F0dHJpYnV0ZX0ke3NpbmNlQXR0cmlidXRlfSR7cmV0dXJuVHlwZUF0dHJpYnV0ZX0ke3JldHVybkRlc2NBdHRyaWJ1dGV9JHtwYXJhbXNBdHRyaWJ1dGV9JHtleGFtcGxlc0F0dHJpYnV0ZX0gLz5gLFxuICAgICcnXG4gICk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBtZXRob2QgdGFibGUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyTWV0aG9kVGFibGVNZHgobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBtZXRob2RzID0gWy4uLmluZm8ubWV0aG9kc10uc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLmlzU3RhdGljICE9PSBiLmlzU3RhdGljKSB7XG4gICAgICByZXR1cm4gYS5pc1N0YXRpYyA/IDEgOiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gIH0pO1xuICBpZiAobWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGluZXMucHVzaCgnPE1ldGhvZFRhYmxlIHJvd3M9e1snKTtcbiAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgIGNvbnN0IGRlc2MgPSBlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MobWV0aG9kLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSk7XG4gICAgY29uc3Qgc3RhdGljUHJlZml4ID0gbWV0aG9kLmlzU3RhdGljID8gJ3N0YXRpYyAnIDogJyc7XG4gICAgY29uc3Qgc2hvcnRQYXJhbXMgPSBtZXRob2QucGFyYW1ldGVycy5tYXAoKHAsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4gaW5kZXggPT09IDAgJiYgRVZFTlRfTUVUSE9EUy5oYXMobWV0aG9kLm5hbWUpICYmIChwLnR5cGUuc3RhcnRzV2l0aCgnXCInKSB8fCBwLnR5cGUuc3RhcnRzV2l0aCgnXFwnJykpID8gcC50eXBlLnJlcGxhY2VBbGwoJ1wiJywgJ1xcJycpIDogcC5uYW1lO1xuICAgIH0pLmpvaW4oJywgJyk7XG4gICAgY29uc3Qgc2hvcnRTaWcgPSBgJHtzdGF0aWNQcmVmaXh9JHttZXRob2QubmFtZX0oJHtzaG9ydFBhcmFtc30pYDtcbiAgICBjb25zdCBzaWcgPSBlc2NhcGVKc1N0cmluZyhzaG9ydFNpZyk7XG4gICAgY29uc3Qgc2x1ZyA9IG92ZXJsb2FkUm91dGVTZWdtZW50KG1ldGhvZC5vdmVybG9hZEtleSk7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MobWV0aG9kLnJldHVyblR5cGUsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSk7XG4gICAgY29uc3QgaW5oZXJpdGVkQXR0cmlidXRlID0gbWV0aG9kLmluaGVyaXRlZEZyb21cbiAgICAgID8gYCwgaW5oZXJpdGVkRnJvbTogXCIke2VzY2FwZUpzU3RyaW5nKG1hcmtkb3duVG9IdG1sKHR5cGVMaW5rKG1ldGhvZC5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGhyZWYgPSBtZW1iZXJIcmVmKHNsdWcsIG1ldGhvZC5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpO1xuICAgIGxpbmVzLnB1c2goXG4gICAgICBgICB7IHNpZ25hdHVyZTogXCIke3NpZ31cIiwgaHJlZjogXCIke2VzY2FwZUpzU3RyaW5nKGhyZWYpfVwiLCByZXR1cm5zOiBcIiR7ZXNjYXBlSnNTdHJpbmcocmV0dXJuVHlwZSl9XCIsIGRlc2NyaXB0aW9uOiBcIiR7ZGVzY31cIiR7aW5oZXJpdGVkQXR0cmlidXRlfSB9LGBcbiAgICApO1xuICB9XG4gIGxpbmVzLnB1c2goJ119IC8+JywgJycpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB0eXBlJ3MgcHJvcGVydHkgdGFibGUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyUHJvcGVydHlUYWJsZU1keChsaW5lczogc3RyaW5nW10sIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBpbmZvLnByb3BlcnRpZXM7XG4gIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsaW5lcy5wdXNoKCc8UHJvcGVydHlUYWJsZSByb3dzPXtbJyk7XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xuICAgIGNvbnN0IGRlc2MgPSBlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MocHJvcGVydHkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKTtcbiAgICBjb25zdCB0eXBlID0gbWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwcm9wZXJ0eS50eXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGNvbnN0IGluaGVyaXRlZEF0dHJpYnV0ZSA9IHByb3BlcnR5LmluaGVyaXRlZEZyb21cbiAgICAgID8gYCwgaW5oZXJpdGVkRnJvbTogXCIke2VzY2FwZUpzU3RyaW5nKG1hcmtkb3duVG9IdG1sKHR5cGVMaW5rKHByb3BlcnR5LmluaGVyaXRlZEZyb20sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgaHJlZiA9IG1lbWJlckhyZWYobWVtYmVyUm91dGVTZWdtZW50KHByb3BlcnR5Lm5hbWUpLCBwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpO1xuICAgIGxpbmVzLnB1c2goXG4gICAgICBgICB7IG5hbWU6IFwiJHtlc2NhcGVKc1N0cmluZyhwcm9wZXJ0eS5uYW1lKX1cIiwgaHJlZjogXCIke2VzY2FwZUpzU3RyaW5nKGhyZWYpfVwiLCB0eXBlOiBcIiR7ZXNjYXBlSnNTdHJpbmcodHlwZSl9XCIsIGRlc2NyaXB0aW9uOiBcIiR7ZGVzY31cIiR7aW5oZXJpdGVkQXR0cmlidXRlfSB9LGBcbiAgICApO1xuICB9XG4gIGxpbmVzLnB1c2goJ119IC8+JywgJycpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB0eXBlIGFsaWFzJ3Mgc2lnbmF0dXJlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclR5cGVBbGlhc1BhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCB0eXBlUGFyYW1zQXR0cmlidXRlID0gaW5mby50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwID8gYCB0eXBlUGFyYW1zPXske0pTT04uc3RyaW5naWZ5KGluZm8udHlwZVBhcmFtZXRlcnMpfX1gIDogJyc7XG4gIGxpbmVzLnB1c2goYDxUeXBlU2lnbmF0dXJlIGtpbmQ9XCJ0eXBlXCIgbmFtZT1cIiR7aW5mby5uYW1lfVwiJHt0eXBlUGFyYW1zQXR0cmlidXRlfSAvPmAsICcnKTtcblxuICBjb25zdCByaHMgPSBpbmZvLnR5cGVBbGlhc1RleHQgPz8gJ3Vua25vd24nO1xuICBsaW5lcy5wdXNoKFxuICAgICcqKlNpZ25hdHVyZToqKicsXG4gICAgJycsXG4gICAgJ2BgYHRzJyxcbiAgICBgdHlwZSAke2dldERpc3BsYXlOYW1lKGluZm8ubmFtZSwgaW5mbyl9ID0gJHtyaHN9YCxcbiAgICAnYGBgJyxcbiAgICAnJyxcbiAgICBgKipUeXBlOioqICR7ZXNjYXBlTWR4QnJhY2VzKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcyhyaHMsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfWAsXG4gICAgJydcbiAgKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdmFyaWFibGUncyBkZWNsYXJhdGlvbiBhbmQgdHlwZS5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclZhcmlhYmxlUGFnZShsaW5lczogc3RyaW5nW10sIG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3Qga2V5d29yZCA9IGluZm8udmFyaWFibGVLZXl3b3JkID8/ICdsZXQnO1xuICBjb25zdCB2YXJpYWJsZVR5cGUgPSBpbmZvLnZhcmlhYmxlVHlwZSA/PyAndW5rbm93bic7XG4gIGxpbmVzLnB1c2goXG4gICAgJyoqU2lnbmF0dXJlOioqJyxcbiAgICAnJyxcbiAgICAnYGBgdHMnLFxuICAgIGAke2tleXdvcmR9ICR7bmFtZX06ICR7dmFyaWFibGVUeXBlfWAsXG4gICAgJ2BgYCcsXG4gICAgJycsXG4gICAgYCoqVHlwZToqKiAke2VzY2FwZU1keEJyYWNlcyhlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3ModmFyaWFibGVUeXBlLCBhbGxUeXBlcywgbmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9YCxcbiAgICAnJ1xuICApO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbmFtZXNwYWNlIHRyZWUgbm9kZSBpbnRvIGEgc2lkZWJhciBncm91cC5cbiAqXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBub2RlLlxuICogQHBhcmFtIGxhYmVsIC0gVGhlIGdyb3VwJ3MgbGFiZWwuXG4gKiBAcmV0dXJucyBUaGUgc2lkZWJhciBncm91cC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZGViYXJUcmVlVG9FbnRyaWVzKG5vZGU6IFNpZGViYXJUcmVlTm9kZSwgbGFiZWw6IHN0cmluZyk6IFNpZGViYXJFbnRyeSB7XG4gIGNvbnN0IGl0ZW1zOiAoU2lkZWJhckVudHJ5IHwgU2lkZWJhckxpbmspW10gPSBbXTtcblxuICAvLyBDaGlsZCBkaXJlY3RvcnkgZ3JvdXBzIGZpcnN0IChiZWZvcmUgdGhpcyBtb2R1bGUncyBvd24gcGFnZXMpXG4gIGNvbnN0IHNvcnRlZENoaWxkcmVuID0gWy4uLm5vZGUuY2hpbGRyZW5dLnNvcnQoKFthXSwgW2JdKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBmb3IgKGNvbnN0IFtjaGlsZE5hbWUsIGNoaWxkXSBvZiBzb3J0ZWRDaGlsZHJlbikge1xuICAgIGl0ZW1zLnB1c2goc2lkZWJhclRyZWVUb0VudHJpZXMoY2hpbGQsIGNoaWxkTmFtZSkpO1xuICB9XG5cbiAgLy8gVGhpcyBtb2R1bGUncyBvd24gb3ZlcnZpZXcgcGFnZSArIHR5cGUvZnVuY3Rpb24gcGFnZXMgKGluZGl2aWR1YWwgbWVtYmVycyBhcmUgbm90IGxpc3RlZCkuXG4gIC8vIFNpZGViYXIgYGxpbmtgIGZpZWxkcyBtdXN0IE5PVCBlbWJlZCBCQVNFX1BBVEg6IFN0YXJsaWdodCBwcmVwZW5kcyB0aGUgY29uZmlnIGBiYXNlYCB0byBldmVyeVxuICAvLyBzaWRlYmFyIGxpbmsgaXRzZWxmLCBzbyBpbmNsdWRpbmcgaXQgaGVyZSB3b3VsZCBkb3VibGUgdGhlIGJhc2UgKGUuZy4gYC9iYXNlL2Jhc2UvYXBpLy4uLmAg4oaSIDQwNCkuXG4gIC8vIFRoaXMgZGlmZmVycyBmcm9tIGluLWNvbnRlbnQgbGlua3MsIHdoaWNoIGFyZSByYXcgYW5jaG9ycyB0aGF0IFN0YXJsaWdodCBkb2VzIG5vdCBiYXNlLXByZXBlbmQuXG4gIGlmIChub2RlLnR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB7IG5hbWVzcGFjZSB9ID0gZW5zdXJlTm9uTnVsbGFibGUobm9kZS50eXBlc1swXSk7XG4gICAgaXRlbXMucHVzaCh7IGxhYmVsOiAnT3ZlcnZpZXcnLCBsaW5rOiBgL2FwaS8ke25hbWVzcGFjZX0vYCB9KTtcbiAgICBjb25zdCBzb3J0ZWRUeXBlcyA9IFsuLi5ub2RlLnR5cGVzXS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgICBmb3IgKGNvbnN0IHQgb2Ygc29ydGVkVHlwZXMpIHtcbiAgICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogdC5uYW1lLCBsaW5rOiBgL2FwaS8ke3QubmFtZXNwYWNlfS8ke3RvVHlwZVJvdXRlU2VnbWVudCh0Lm5hbWVzcGFjZSwgdC5uYW1lKX0vYCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBjb2xsYXBzZWQ6IHRydWUsIGl0ZW1zLCBsYWJlbCB9O1xufVxuXG4vLyBTZXJ2ZXMgYm90aCBhcyB0aGUgcm9vdCBBUEkgcGFnZSdzIHByb3NlIGFuZCAoc3RyaXBwZWQpIGFzIGl0cyBgZGVzY3JpcHRpb25gIGZyb250bWF0dGVyLlxuLy8gU2hhcmluZyBvbmUgZnVuY3Rpb24ga2VlcHMgdGhlIHBhZ2UgYW5kIGl0cyBPRyBjYXJkIGZyb20gZHJpZnRpbmcgYXBhcnQuXG5mdW5jdGlvbiBnZXRBcGlJbmRleEludHJvKG5hbWVzcGFjZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgeyBwYWNrYWdlTmFtZSB9ID0gZ2V0QXBpRG9jU2V0dGluZ3MoKTtcbiAgY29uc3QgW2V4YW1wbGVOYW1lc3BhY2UgPSAnbW9kdWxlJ10gPSBuYW1lc3BhY2VzO1xuICByZXR1cm4gYFRoZSBjb21wbGV0ZSBBUEkgcmVmZXJlbmNlIGZvciBcXGAke3BhY2thZ2VOYW1lfVxcYCwgZ2VuZXJhdGVkIGZyb20gaXRzIFRTRG9jLiBgXG4gICAgKyBgRWFjaCBtb2R1bGUgYmVsb3cgbWFwcyB0byBhbiBpbXBvcnQgc3VicGF0aCAoZS5nLiB0aGUgXFxgJHtleGFtcGxlTmFtZXNwYWNlfVxcYCBtb2R1bGUgaXMgXFxgJHtwYWNrYWdlTmFtZX0vJHtleGFtcGxlTmFtZXNwYWNlfVxcYCkuYDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50SW1wb3J0cyhjb21wb25lbnROYW1lczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBjb21wb25lbnROYW1lcy5tYXAoKGNvbXBvbmVudE5hbWUpID0+IGBpbXBvcnQgJHtjb21wb25lbnROYW1lfSBmcm9tIFwiJHtBUElfQ09NUE9ORU5UU19JTVBPUlRfUFJFRklYfS8ke2NvbXBvbmVudE5hbWV9LmFzdHJvXCI7YCk7XG59XG5cbmZ1bmN0aW9uIHJlbmRlck5hbWVzcGFjZVRhYmxlKFxuICBsaW5lczogc3RyaW5nW10sXG4gIGhlYWRpbmc6IHN0cmluZyxcbiAgY29sdW1uTGFiZWw6IHN0cmluZyxcbiAgZW50cmllczogVHlwZUluZm9bXSxcbiAgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPixcbiAgbmFtZXNwYWNlOiBzdHJpbmdcbik6IHZvaWQge1xuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc29ydGVkID0gWy4uLmVudHJpZXNdLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuICBsaW5lcy5wdXNoKGAjIyAke2hlYWRpbmd9YCwgJycsIGB8ICR7Y29sdW1uTGFiZWx9IHwgRGVzY3JpcHRpb24gfGAsICd8IDotLSB8IDotLSB8Jyk7XG4gIGZvciAoY29uc3QgZW50cnkgb2Ygc29ydGVkKSB7XG4gICAgbGluZXMucHVzaChgfCBbJHtlbnRyeS5uYW1lfV0oLi8ke3RvVHlwZVJvdXRlU2VnbWVudChlbnRyeS5uYW1lc3BhY2UsIGVudHJ5Lm5hbWUpfS8pIHwgJHtlc2NhcGVNYXJrZG93bihyZXNvbHZlTGlua3MoZW50cnkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBuYW1lc3BhY2UpKX0gfGApO1xuICB9XG4gIGxpbmVzLnB1c2goJycpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9BLFNBQVMsOEJBQThCO0FBQ3ZDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsWUFBWTtBQVlyQixTQUFTLHFCQUFxQjtBQUM5QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFD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
|
|
556
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvYXBpLWRvYy1wYWdlLWdlbmVyYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIE1EWCBwYWdlICsgc2lkZWJhciBlbWlzc2lvbjogcmVuZGVycyBtb2R1bGUgaW5kZXggcGFnZXMsIHBlci10eXBlIG92ZXJ2aWV3IHBhZ2VzLCBwZXItbWVtYmVyIHBhZ2VzLFxuICogYmFja2xpbmtzLCBhbmQgdGhlIFN0YXJsaWdodCBzaWRlYmFyIEpTT04uXG4gKi9cblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgTWVtYmVySW5mbyxcbiAgUGFnZUNvbnRlbnQsXG4gIFBhZ2VGcm9udE1hdHRlcixcbiAgU2lkZWJhckVudHJ5LFxuICBTaWRlYmFyTGluayxcbiAgU2lkZWJhclRyZWVOb2RlLFxuICBUeXBlSW5mb1xufSBmcm9tICcuL2FwaS1kb2MtdHlwZXMudHMnO1xuXG5pbXBvcnQgeyBFVkVOVF9NRVRIT0RTIH0gZnJvbSAnLi9hcGktZG9jLWNvbnN0YW50cy50cyc7XG5pbXBvcnQge1xuICBsaW5rQmFzZVR5cGUsXG4gIG1hcmtkb3duVG9IdG1sLFxuICBtZW1iZXJIcmVmLFxuICByZW5kZXJFeGFtcGxlTWR4LFxuICByZW5kZXJNZHhQcm9zZSxcbiAgcmVuZGVyVHlwZVdpdGhMaW5rcyxcbiAgcmVzb2x2ZUxpbmtzLFxuICB0b1R5cGVGaWxlU2VnbWVudCxcbiAgdG9UeXBlUm91dGVTZWdtZW50LFxuICB0eXBlTGlua1xufSBmcm9tICcuL2FwaS1kb2MtbGluay1yZW5kZXJpbmcudHMnO1xuaW1wb3J0IHsgZ2V0QXBpRG9jU2V0dGluZ3MgfSBmcm9tICcuL2FwaS1kb2Mtc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZW5zdXJlRGlyZWN0b3J5LFxuICBlc2NhcGVKc1N0cmluZyxcbiAgZXNjYXBlSnN4QXR0cmlidXRlLFxuICBlc2NhcGVNYXJrZG93bixcbiAgZXNjYXBlTWR4QW5nbGVCcmFja2V0cyxcbiAgZXNjYXBlTWR4QnJhY2VzLFxuICBlc2NhcGVNZHhQcm9zZSxcbiAgZXNjYXBlWWFtbCxcbiAgZ2V0RGlzcGxheU5hbWUsXG4gIGdldEltcG9ydFN0YXRlbWVudCxcbiAgZ2V0TmFtZXNwYWNlRGlyZWN0b3J5LFxuICBtZW1iZXJSb3V0ZVNlZ21lbnQsXG4gIG1lbWJlclNsdWcsXG4gIG92ZXJsb2FkUm91dGVTZWdtZW50LFxuICBvdmVybG9hZFNsdWcsXG4gIHN0cmlwTWFya2Rvd24sXG4gIHRydW5jYXRlU2lnbmF0dXJlXG59IGZyb20gJy4vYXBpLWRvYy10ZXh0LXV0aWxzLnRzJztcbmltcG9ydCB7IEFQSV9DT01QT05FTlRTX0lNUE9SVF9QUkVGSVggfSBmcm9tICcuL2RvY3Mtc2l0ZS1hc3NldHMudHMnO1xuXG5jb25zdCBKU09OX0lOREVOVCA9IDI7XG5cbi8qKlxuICogQXBwZW5kIGJhY2tsaW5rcyB0byBvdmVydmlldyBwYWdlcyBhbmQgd3JpdGUgYWxsIGZpbGVzLiBLZXllZCBieSBxdWFsaWZpZWQgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqXG4gKiBAcGFyYW0gcGFnZUNvbnRlbnRzIC0gRXZlcnkgb3ZlcnZpZXcgcGFnZSdzIGNvbnRlbnQgYW5kIHBhdGgsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFwcGVuZEJhY2tsaW5rc0FuZFdyaXRlKFxuICBwYWdlQ29udGVudHM6IE1hcDxzdHJpbmcsIFBhZ2VDb250ZW50PixcbiAgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGJhY2tsaW5rcyA9IGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQocGFnZUNvbnRlbnRzLCBhbGxUeXBlcyk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB7IGNvbnRlbnQsIGZpbGVQYXRoIH1dIG9mIHBhZ2VDb250ZW50cykge1xuICAgIGNvbnN0IHR5cGVCYWNrbGlua3MgPSBiYWNrbGlua3MuZ2V0KGtleSkgPz8gW107XG4gICAgY29uc3QgbGluZXMgPSBbY29udGVudF07XG4gICAgaWYgKHR5cGVCYWNrbGlua3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc29ydGVkQmFja2xpbmtzID0gWy4uLnR5cGVCYWNrbGlua3NdLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gICAgICBsaW5lcy5wdXNoKCcnLCAnLS0tJywgJycsICcqKkxpbmtzIHRvIHRoaXMgcGFnZToqKicsICcnKTtcbiAgICAgIGZvciAoY29uc3QgYmxLZXkgb2Ygc29ydGVkQmFja2xpbmtzKSB7XG4gICAgICAgIGNvbnN0IGJsSW5mbyA9IGVuc3VyZU5vbk51bGxhYmxlKGFsbFR5cGVzLmdldChibEtleSkpO1xuICAgICAgICBjb25zdCBibE5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGJsSW5mby5uYW1lc3BhY2UpO1xuICAgICAgICBsaW5lcy5wdXNoKGAtIFske2JsSW5mby5uYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtibE5zRGlyZWN0b3J5fS8ke3RvVHlwZVJvdXRlU2VnbWVudChibEluZm8ubmFtZXNwYWNlLCBibEluZm8ubmFtZSl9LylgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZCBiYWNrbGlua3MgYnkgc2Nhbm5pbmcgZ2VuZXJhdGVkIHBhZ2UgY29udGVudCBmb3IgaW50ZXJuYWwgQVBJIGxpbmtzLiBLZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKlxuICogQHBhcmFtIHBhZ2VDb250ZW50cyAtIEV2ZXJ5IG92ZXJ2aWV3IHBhZ2UncyBjb250ZW50IGFuZCBwYXRoLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcmV0dXJucyBFYWNoIHJlZmVyZW5jZWQgdHlwZSdzIHF1YWxpZmllZCBpZCBtYXBwZWQgdG8gdGhlIGlkcyBvZiB0aGUgcGFnZXMgbGlua2luZyB0byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQmFja2xpbmtzRnJvbUNvbnRlbnQoXG4gIHBhZ2VDb250ZW50czogTWFwPHN0cmluZywgUGFnZUNvbnRlbnQ+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+XG4pOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICBjb25zdCBiYWNrbGlua3MgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIC8vIEVtaXR0ZWQgVVJMcyBsb3dlcmNhc2UgdGhlIHR5cGUgc2VnbWVudCAoc2VlIHRvUm91dGVTZWdtZW50KSwgc28gbWFwIGVhY2ggbG93ZXJjYXNlZCByb3V0ZVxuICAvLyBpZGVudGl0eSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBxdWFsaWZpZWQgdHlwZSBrZXkuXG4gIGNvbnN0IHJvdXRlS2V5VG9UeXBlS2V5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBbdHlwZUtleSwgaW5mb10gb2YgYWxsVHlwZXMpIHtcbiAgICByb3V0ZUtleVRvVHlwZUtleS5zZXQoYCR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKX0jJHt0b1R5cGVSb3V0ZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIGluZm8ubmFtZSl9YCwgdHlwZUtleSk7XG4gIH1cbiAgY29uc3QgZXNjYXBlZEJhc2UgPSBnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRoLnJlcGxhY2VBbGwoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBTdHJpbmcucmF3YFxcJCZgKTtcbiAgY29uc3QgbGlua1BhdHRlcm4gPSBuZXcgUmVnRXhwKGAke2VzY2FwZWRCYXNlfS9hcGkvKD88cGF0aD4oPzpbYS16QS1aMC05X0AtXSsvKSspYCwgJ2cnKTtcbiAgZm9yIChjb25zdCBbc291cmNlS2V5LCB7IGNvbnRlbnQgfV0gb2YgcGFnZUNvbnRlbnRzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBjb250ZW50Lm1hdGNoQWxsKGxpbmtQYXR0ZXJuKSkge1xuICAgICAgLy8gVGhlIHBhdHRlcm4gcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHNlZ21lbnQuXG4gICAgICBjb25zdCBzZWdtZW50cyA9IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICdwYXRoJykuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBjb25zdCB0eXBlTmFtZSA9IGVuc3VyZU5vbk51bGxhYmxlKHNlZ21lbnRzLmF0KC0xKSk7XG4gICAgICBjb25zdCBuYW1lc3BhY2UgPSBzZWdtZW50cy5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgY29uc3Qgcm91dGVLZXkgPSBgJHtuYW1lc3BhY2V9IyR7dHlwZU5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc29sdmVkS2V5ID0gcm91dGVLZXlUb1R5cGVLZXkuZ2V0KHJvdXRlS2V5KTtcbiAgICAgIGlmIChyZXNvbHZlZEtleSAhPT0gdW5kZWZpbmVkICYmIHJlc29sdmVkS2V5ICE9PSBzb3VyY2VLZXkpIHtcbiAgICAgICAgcmVmZXJlbmNlZC5hZGQocmVzb2x2ZWRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWQpIHtcbiAgICAgIGlmICghYmFja2xpbmtzLmhhcyhyZWZlcmVuY2UpKSB7XG4gICAgICAgIGJhY2tsaW5rcy5zZXQocmVmZXJlbmNlLCBbXSk7XG4gICAgICB9XG4gICAgICBiYWNrbGlua3MuZ2V0KHJlZmVyZW5jZSk/LnB1c2goc291cmNlS2V5KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgbmFtZXNwYWNlIHRyZWUgdGhlIHNpZGViYXIgaXMgZ2VuZXJhdGVkIGZyb20uXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqIEByZXR1cm5zIFRoZSByb290IG9mIHRoZSB0cmVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTaWRlYmFyVHJlZSh0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogU2lkZWJhclRyZWVOb2RlIHtcbiAgY29uc3Qgcm9vdDogU2lkZWJhclRyZWVOb2RlID0geyBjaGlsZHJlbjogbmV3IE1hcCgpLCB0eXBlczogW10gfTtcbiAgZm9yIChjb25zdCBbLCBpbmZvXSBvZiB0eXBlcykge1xuICAgIGNvbnN0IHBhcnRzID0gaW5mby5uYW1lc3BhY2Uuc3BsaXQoJy8nKTtcbiAgICBsZXQgbm9kZSA9IHJvb3Q7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBsZXQgY2hpbGQgPSBub2RlLmNoaWxkcmVuLmdldChwYXJ0KTtcbiAgICAgIGlmICghY2hpbGQpIHtcbiAgICAgICAgY2hpbGQgPSB7IGNoaWxkcmVuOiBuZXcgTWFwKCksIHR5cGVzOiBbXSB9O1xuICAgICAgICBub2RlLmNoaWxkcmVuLnNldChwYXJ0LCBjaGlsZCk7XG4gICAgICB9XG4gICAgICBub2RlID0gY2hpbGQ7XG4gICAgfVxuICAgIG5vZGUudHlwZXMucHVzaChpbmZvKTtcbiAgfVxuICByZXR1cm4gcm9vdDtcbn1cblxuLyoqXG4gKiBUaGUgcmF3IGNvZGUgc2lnbmF0dXJlIHNob3duIG9uIGEgdHlwZS1vdmVydmlldyBwYWdlJ3MgT0cgY2FyZCwgZm9yIHRoZSBraW5kcyB0aGF0IHJlbmRlciBhIHNpbmdsZVxuICogc2lnbmF0dXJlIGxpbmUgKGZ1bmN0aW9uIC8gdHlwZSBhbGlhcyAvIHZhcmlhYmxlKS4gQ2xhc3NlcywgaW50ZXJmYWNlcyBhbmQgZW51bXMgcmVuZGVyIG1lbWJlclxuICogdGFibGVzIGluc3RlYWQsIHNvIHRoZXkgZ2V0IG5vIHNpZ25hdHVyZSBibG9jay5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSB0eXBlJ3MgbmFtZS5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBzaWduYXR1cmUsIG9yIGB1bmRlZmluZWRgIGZvciBhIGtpbmQgdGhhdCByZW5kZXJzIG1lbWJlciB0YWJsZXMgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPdmVydmlld1NpZ25hdHVyZShuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGluZm8ua2luZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnN0ICRmdW5jdGlvbiA9IGluZm8ubWV0aG9kc1swXTtcbiAgICByZXR1cm4gJGZ1bmN0aW9uID8gYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAoaW5mby5raW5kID09PSAndHlwZScpIHtcbiAgICByZXR1cm4gYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7aW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJ31gO1xuICB9XG4gIHJldHVybiBpbmZvLmtpbmQgPT09ICd2YXJpYWJsZScgPyBgJHtpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0J30gJHtuYW1lfTogJHtpbmZvLnZhcmlhYmxlVHlwZSA/PyAndW5rbm93bid9YCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcml0ZXMgb25lIHBhZ2UgcGVyIG93biBwcm9wZXJ0eSBhbmQgcGVyIG93biBtZXRob2Qgb3ZlcmxvYWQga2V5IG9mIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVNZW1iZXJQYWdlcyhuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVEaXJlY3RvcnkgPSB0b1R5cGVGaWxlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IHR5cGVSb3V0ZURpcmVjdG9yeSA9IHRvVHlwZVJvdXRlU2VnbWVudChpbmZvLm5hbWVzcGFjZSwgbmFtZSk7XG4gIGNvbnN0IGNvbXBvbmVudEltcG9ydHMgPSBnZXRDb21wb25lbnRJbXBvcnRzKFsnTWVtYmVyRGV0YWlsJ10pO1xuXG4gIC8vIFByb3BlcnR5IHBhZ2VzIChza2lwIGluaGVyaXRlZCDigJQgdGhleSBsaXZlIG9uIHRoZSBwYXJlbnQgdHlwZSlcbiAgY29uc3QgcHJvcGVydGllcyA9IGluZm8ucHJvcGVydGllcy5maWx0ZXIoKHApID0+ICFwLmluaGVyaXRlZEZyb20pO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCB0eXBlRmlsZURpcmVjdG9yeSwgYCR7bWVtYmVyU2x1Zyhwcm9wZXJ0eS5uYW1lKX0ubWR4YCk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIGNvbnN0IHByb3BlcnR5VGl0bGUgPSBgJHtuYW1lfS4ke3Byb3BlcnR5Lm5hbWV9YDtcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogcHJvcGVydHkuZGVzY3JpcHRpb24sXG4gICAgICBzaWRlYmFyTGFiZWw6IHByb3BlcnR5VGl0bGUsXG4gICAgICBzaWduYXR1cmU6IGAke3Byb3BlcnR5LnNpZ25hdHVyZX06ICR7cHJvcGVydHkudHlwZX1gLFxuICAgICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZURpcmVjdG9yeX0vJHttZW1iZXJSb3V0ZVNlZ21lbnQocHJvcGVydHkubmFtZSl9YCxcbiAgICAgIHRpdGxlOiBwcm9wZXJ0eVRpdGxlXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7cHJvcGVydHkubmFtZX1gLFxuICAgICAgJydcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGljQXR0cmlidXRlID0gcHJvcGVydHkuaXNTdGF0aWMgPyAnIGlzU3RhdGljPXt0cnVlfScgOiAnJztcbiAgICBjb25zdCB0eXBlQXR0cmlidXRlID0gYCB0eXBlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVuZGVyVHlwZVdpdGhMaW5rcyhwcm9wZXJ0eS50eXBlLCBhbGxUeXBlcywgbmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9XCJgO1xuICAgIGNvbnN0IGRlc2NBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5kZXNjcmlwdGlvbiA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MocHJvcGVydHkuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImAgOiAnJztcbiAgICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gcHJvcGVydHkucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhwcm9wZXJ0eS5yZW1hcmtzLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgIDogJyc7XG4gICAgY29uc3Qgc2luY2VBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5zaW5jZSA/IGAgc2luY2U9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShwcm9wZXJ0eS5zaW5jZSl9XCJgIDogJyc7XG4gICAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShwcm9wZXJ0eS5leGFtcGxlcyl9fWAgOiAnJztcblxuICAgIGxpbmVzLnB1c2goYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0ke3R5cGVBdHRyaWJ1dGV9JHtkZXNjQXR0cmlidXRlfSR7cmVtYXJrc0F0dHJpYnV0ZX0ke3NpbmNlQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCwgJycpO1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCBsaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG4gIH1cblxuICAvLyBNZXRob2QgcGFnZXMg4oCUIGVhY2ggb3ZlcmxvYWQga2V5IGdldHMgaXRzIG93biBwYWdlIChza2lwIGluaGVyaXRlZClcbiAgY29uc3QgbWV0aG9kcyA9IGluZm8ubWV0aG9kcy5maWx0ZXIoKG0pID0+ICFtLmluaGVyaXRlZEZyb20pO1xuICBjb25zdCBvdmVybG9hZEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBNZW1iZXJJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBrZXkgPSBtZXRob2Qub3ZlcmxvYWRLZXk7XG4gICAgaWYgKCFvdmVybG9hZEdyb3Vwcy5oYXMoa2V5KSkge1xuICAgICAgb3ZlcmxvYWRHcm91cHMuc2V0KGtleSwgW10pO1xuICAgIH1cbiAgICBvdmVybG9hZEdyb3Vwcy5nZXQoa2V5KT8ucHVzaChtZXRob2QpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbb3ZlcmxvYWRLZXksIG92ZXJsb2Fkc10gb2Ygb3ZlcmxvYWRHcm91cHMpIHtcbiAgICBjb25zdCBmaWxlU2x1ZyA9IG92ZXJsb2FkU2x1ZyhvdmVybG9hZEtleSk7XG4gICAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVEaXJlY3RvcnksIGAke2ZpbGVTbHVnfS5tZHhgKTtcbiAgICBhd2FpdCBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSBgJHtuYW1lfS4ke292ZXJsb2FkS2V5fSBtZXRob2RgO1xuICAgIC8vIEEgZ3JvdXAgaXMgY3JlYXRlZCBieSBpdHMgZmlyc3Qgb3ZlcmxvYWQuXG4gICAgY29uc3QgZmlyc3RPdmVybG9hZCA9IGVuc3VyZU5vbk51bGxhYmxlKG92ZXJsb2Fkc1swXSk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgICBkZXNjcmlwdGlvbjogZmlyc3RPdmVybG9hZC5kZXNjcmlwdGlvbixcbiAgICAgIHNpZGViYXJMYWJlbDogYCR7bmFtZX0uJHtvdmVybG9hZEtleX1gLFxuICAgICAgc2lnbmF0dXJlOiBgJHtmaXJzdE92ZXJsb2FkLnNpZ25hdHVyZX06ICR7Zmlyc3RPdmVybG9hZC5yZXR1cm5UeXBlfWAsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9LyR7dHlwZVJvdXRlRGlyZWN0b3J5fS8ke292ZXJsb2FkUm91dGVTZWdtZW50KG92ZXJsb2FkS2V5KX1gLFxuICAgICAgdGl0bGU6IGRpc3BsYXlOYW1lXG4gICAgfSk7XG4gICAgbGluZXMucHVzaChcbiAgICAgIC4uLmNvbXBvbmVudEltcG9ydHMsXG4gICAgICAnJyxcbiAgICAgIC8vIEJyZWFkY3J1bWJcbiAgICAgIGBbJHtuYW1lfV0oJHtnZXRBcGlEb2NTZXR0aW5ncygpLmJhc2VQYXRofS9hcGkvJHtuc0RpcmVjdG9yeX0vJHt0eXBlUm91dGVEaXJlY3Rvcnl9Lykg4oC6ICR7b3ZlcmxvYWRLZXl9YCxcbiAgICAgICcnXG4gICAgKTtcblxuICAgIGZvciAoY29uc3Qgb3ZlcmxvYWQgb2Ygb3ZlcmxvYWRzKSB7XG4gICAgICByZW5kZXJNZXRob2RPdmVybG9hZE1keChsaW5lcywgb3ZlcmxvYWQsIG5hbWUsIGluZm8ubmFtZXNwYWNlLCBhbGxUeXBlcyk7XG4gICAgICBpZiAob3ZlcmxvYWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbGluZXMucHVzaCgnLS0tJywgJycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGVhY2ggbW9kdWxlJ3MgaW5kZXggcGFnZSBhbmQgdGhlIHJvb3QgQVBJIGluZGV4LlxuICpcbiAqIEBwYXJhbSB0eXBlcyAtIFRoZSBkb2N1bWVudGVkIHR5cGVzLCBrZXllZCBieSBxdWFsaWZpZWQgaWQuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKiBAcGFyYW0gbW9kdWxlT3ZlcnZpZXdzIC0gRWFjaCBuYW1lc3BhY2UncyBgQGZpbGVgIG92ZXJ2aWV3LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOYW1lc3BhY2VJbmRleFBhZ2VzKFxuICB0eXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+LFxuICBtb2R1bGVPdmVydmlld3M6IE1hcDxzdHJpbmcsIHN0cmluZz5cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBuYW1lc3BhY2VzID0gbmV3IE1hcDxzdHJpbmcsIFR5cGVJbmZvW10+KCk7XG4gIGZvciAoY29uc3QgWywgaW5mb10gb2YgdHlwZXMpIHtcbiAgICBpZiAoIW5hbWVzcGFjZXMuaGFzKGluZm8ubmFtZXNwYWNlKSkge1xuICAgICAgbmFtZXNwYWNlcy5zZXQoaW5mby5uYW1lc3BhY2UsIFtdKTtcbiAgICB9XG4gICAgbmFtZXNwYWNlcy5nZXQoaW5mby5uYW1lc3BhY2UpPy5wdXNoKGluZm8pO1xuICB9XG5cbiAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBuc1R5cGVzXSBvZiBuYW1lc3BhY2VzKSB7XG4gICAgY29uc3QgbnNEaXJlY3RvcnkgPSBnZXROYW1lc3BhY2VEaXJlY3RvcnkobmFtZXNwYWNlKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksIG5zRGlyZWN0b3J5LCAnaW5kZXgubWR4Jyk7XG4gICAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoKTtcblxuICAgIC8vIFRoZSBtb2R1bGUncyBgQGZpbGVgIHRleHQgZG91YmxlcyBhcyBpdHMgZGVzY3JpcHRpb24uXG4gICAgLy8gV2l0aG91dCBpdCB0aGUgbW9kdWxlIGNhcmQgd2FzIHRpdGxlLW9ubHkgd2hpbGUgZXZlcnkgbWVtYmVyIGNhcmQgdW5kZXIgaXQgY2FycmllZCBvbmUuXG4gICAgY29uc3Qgb3ZlcnZpZXcgPSBtb2R1bGVPdmVydmlld3MuZ2V0KG5hbWVzcGFjZSk7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgICAgZGVzY3JpcHRpb246IG92ZXJ2aWV3LFxuICAgICAgc2lkZWJhckxhYmVsOiBuYW1lc3BhY2UsXG4gICAgICBzbHVnOiBgYXBpLyR7bnNEaXJlY3Rvcnl9YCxcbiAgICAgIHRpdGxlOiBuYW1lc3BhY2VcbiAgICB9KTtcblxuICAgIC8vIE1vZHVsZSBAZmlsZSBvdmVydmlldyB0ZXh0XG4gICAgaWYgKG92ZXJ2aWV3KSB7XG4gICAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKG92ZXJ2aWV3LCBhbGxUeXBlcywgbmFtZXNwYWNlKSwgJycpO1xuICAgIH1cblxuICAgIHJlbmRlck5hbWVzcGFjZVRhYmxlKGxpbmVzLCAnQ2xhc3NlcycsICdDbGFzcycsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdjbGFzcycpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0ludGVyZmFjZXMnLCAnSW50ZXJmYWNlJywgbnNUeXBlcy5maWx0ZXIoKHQpID0+IHQua2luZCA9PT0gJ2ludGVyZmFjZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0Z1bmN0aW9ucycsICdGdW5jdGlvbicsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICdmdW5jdGlvbicpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1R5cGVzJywgJ1R5cGUnLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAndHlwZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ0VudW1zJywgJ0VudW0nLCBuc1R5cGVzLmZpbHRlcigodCkgPT4gdC5raW5kID09PSAnZW51bScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcbiAgICByZW5kZXJOYW1lc3BhY2VUYWJsZShsaW5lcywgJ1ZhcmlhYmxlcycsICdWYXJpYWJsZScsIG5zVHlwZXMuZmlsdGVyKCh0KSA9PiB0LmtpbmQgPT09ICd2YXJpYWJsZScpLCBhbGxUeXBlcywgbmFtZXNwYWNlKTtcblxuICAgIGF3YWl0IHdyaXRlRmlsZShmaWxlUGF0aCwgbGluZXMuam9pbignXFxuJyksICd1dGYtOCcpO1xuICB9XG5cbiAgLy8gUm9vdCBBUEkgaW5kZXggcGFnZSBsaXN0aW5nIGV2ZXJ5IG1vZHVsZS5cbiAgY29uc3Qgc29ydGVkTmFtZXNwYWNlcyA9IFsuLi5uYW1lc3BhY2VzLmtleXMoKV0uc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgY29uc3QgYXBpSW5kZXhJbnRybyA9IGdldEFwaUluZGV4SW50cm8oc29ydGVkTmFtZXNwYWNlcyk7XG4gIGNvbnN0IHJvb3RMaW5lczogc3RyaW5nW10gPSByZW5kZXJGcm9udE1hdHRlcih7XG4gICAgZGVzY3JpcHRpb246IGFwaUluZGV4SW50cm8sXG4gICAgc2lkZWJhckxhYmVsOiAnT3ZlcnZpZXcnLFxuICAgIHNsdWc6ICdhcGknLFxuICAgIHRpdGxlOiAnQVBJIHJlZmVyZW5jZSdcbiAgfSk7XG4gIHJvb3RMaW5lcy5wdXNoKGFwaUluZGV4SW50cm8sICcnLCAnIyMgTW9kdWxlcycsICcnKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2Ygc29ydGVkTmFtZXNwYWNlcykge1xuICAgIHJvb3RMaW5lcy5wdXNoKGAtIFske25hbWVzcGFjZX1dKCR7Z2V0QXBpRG9jU2V0dGluZ3MoKS5iYXNlUGF0aH0vYXBpLyR7Z2V0TmFtZXNwYWNlRGlyZWN0b3J5KG5hbWVzcGFjZSl9LylgKTtcbiAgfVxuICByb290TGluZXMucHVzaCgnJyk7XG4gIGNvbnN0IHJvb3RGaWxlUGF0aCA9IGpvaW4oZ2V0QXBpRG9jU2V0dGluZ3MoKS5vdXRwdXREaXJlY3RvcnksICdpbmRleC5tZHgnKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KHJvb3RGaWxlUGF0aCk7XG4gIGF3YWl0IHdyaXRlRmlsZShyb290RmlsZVBhdGgsIHJvb3RMaW5lcy5qb2luKCdcXG4nKSwgJ3V0Zi04Jyk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHR5cGUncyBvdmVydmlldyBwYWdlLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICogQHJldHVybnMgVGhlIHBhZ2UncyBjb250ZW50LCBiZWZvcmUgYmFja2xpbmtzLCBhbmQgdGhlIHBhdGggaXQgaXMgd3JpdHRlbiB0by5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlT3ZlcnZpZXdQYWdlKG5hbWU6IHN0cmluZywgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiBQcm9taXNlPFBhZ2VDb250ZW50PiB7XG4gIGNvbnN0IG5zRGlyZWN0b3J5ID0gZ2V0TmFtZXNwYWNlRGlyZWN0b3J5KGluZm8ubmFtZXNwYWNlKTtcbiAgY29uc3QgdHlwZUZpbGVTbHVnID0gdG9UeXBlRmlsZVNlZ21lbnQoaW5mby5uYW1lc3BhY2UsIG5hbWUpO1xuICBjb25zdCB0eXBlUm91dGVTbHVnID0gdG9UeXBlUm91dGVTZWdtZW50KGluZm8ubmFtZXNwYWNlLCBuYW1lKTtcbiAgY29uc3QgZmlsZVBhdGggPSBqb2luKGdldEFwaURvY1NldHRpbmdzKCkub3V0cHV0RGlyZWN0b3J5LCBuc0RpcmVjdG9yeSwgdHlwZUZpbGVTbHVnLCAnaW5kZXgubWR4Jyk7XG4gIGF3YWl0IGVuc3VyZURpcmVjdG9yeShmaWxlUGF0aCk7XG5cbiAgLy8gRnJvbnRtYXR0ZXJcbiAgY29uc3QgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZShuYW1lLCBpbmZvKTtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gcmVuZGVyRnJvbnRNYXR0ZXIoe1xuICAgIGRlc2NyaXB0aW9uOiBpbmZvLmRlc2NyaXB0aW9uLFxuICAgIHNpZGViYXJMYWJlbDogZGlzcGxheU5hbWUsXG4gICAgc2lnbmF0dXJlOiBjb21wdXRlT3ZlcnZpZXdTaWduYXR1cmUobmFtZSwgaW5mbyksXG4gICAgc2x1ZzogYGFwaS8ke25zRGlyZWN0b3J5fS8ke3R5cGVSb3V0ZVNsdWd9YCxcbiAgICB0aXRsZTogZGlzcGxheU5hbWVcbiAgfSk7XG5cbiAgLy8gQ29tcG9uZW50IGltcG9ydHMg4oCUIGNvbXB1dGUgcmVsYXRpdmUgcGF0aCBmcm9tIGdlbmVyYXRlZCBwYWdlIHRvIGNvbXBvbmVudHNcbiAgbGluZXMucHVzaCguLi5nZXRDb21wb25lbnRJbXBvcnRzKFsnQ29uc3RydWN0b3JCbG9jaycsICdJbXBvcnRTdGF0ZW1lbnQnLCAnTWV0aG9kVGFibGUnLCAnUHJvcGVydHlUYWJsZScsICdUeXBlU2lnbmF0dXJlJ10pLCAnJyk7XG5cbiAgLy8gRGVzY3JpcHRpb25cbiAgaWYgKGluZm8uZGVzY3JpcHRpb24pIHtcbiAgICBsaW5lcy5wdXNoKHJlbmRlck1keFByb3NlKGluZm8uZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIFJlbWFya3NcbiAgaWYgKGluZm8ucmVtYXJrcykge1xuICAgIGNvbnN0IHJlbWFya3NCbG9jayA9IHJlbmRlck1keFByb3NlKGluZm8ucmVtYXJrcywgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKHJlbWFya3NCbG9jay5zcGxpdCgnXFxuJykubWFwKChsaW5lKSA9PiAobGluZS5sZW5ndGggPiAwID8gYD4gJHtsaW5lfWAgOiAnPicpKS5qb2luKCdcXG4nKSwgJycpO1xuICB9XG5cbiAgLy8gSW1wb3J0IHN0YXRlbWVudFxuICBjb25zdCBpbXBvcnRTdGF0ZW1lbnQgPSBnZXRJbXBvcnRTdGF0ZW1lbnQoaW5mbyk7XG4gIGlmIChpbXBvcnRTdGF0ZW1lbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGxpbmVzLnB1c2goYDxJbXBvcnRTdGF0ZW1lbnQgdGV4dD1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKGltcG9ydFN0YXRlbWVudCl9XCIgLz5gLCAnJyk7XG4gIH1cblxuICAvLyBFeGFtcGxlc1xuICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgaW5mby5leGFtcGxlcykge1xuICAgIGxpbmVzLnB1c2goJyoqRXhhbXBsZToqKicsICcnLCByZW5kZXJFeGFtcGxlTWR4KGV4YW1wbGUsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSksICcnKTtcbiAgfVxuXG4gIC8vIEZ1bmN0aW9ucyByZW5kZXIgbGlrZSBtZXRob2QgZGV0YWlsIHBhZ2VzIOKAlCBzaWduYXR1cmUsIHBhcmFtcywgcmV0dXJuc1xuICBpZiAoaW5mby5raW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVuZGVyRnVuY3Rpb25QYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBWYXJpYWJsZXMgcmVuZGVyIHdpdGggZGVjbGFyYXRpb24ga2V5d29yZCBhbmQgdHlwZVxuICBpZiAoaW5mby5raW5kID09PSAndmFyaWFibGUnKSB7XG4gICAgcmVuZGVyVmFyaWFibGVQYWdlKGxpbmVzLCBuYW1lLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBFbnVtcyByZW5kZXIgdGhlaXIgbWVtYmVycyBsaXN0XG4gIGlmIChpbmZvLmtpbmQgPT09ICdlbnVtJykge1xuICAgIHJlbmRlckVudW1QYWdlKGxpbmVzLCBpbmZvLCBhbGxUeXBlcyk7XG4gICAgcmV0dXJuIHsgY29udGVudDogbGluZXMuam9pbignXFxuJyksIGZpbGVQYXRoIH07XG4gIH1cblxuICAvLyBUeXBlIGFsaWFzZXMgcmVuZGVyIHRoZWlyIHJpZ2h0LWhhbmQtc2lkZSBzaWduYXR1cmVcbiAgaWYgKGluZm8ua2luZCA9PT0gJ3R5cGUnKSB7XG4gICAgcmVuZGVyVHlwZUFsaWFzUGFnZShsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICAgIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xuICB9XG5cbiAgLy8gQ2xhc3NlcyAvIGludGVyZmFjZXM6IHNpZ25hdHVyZSArIGV4dGVuZHMvaW1wbGVtZW50cyArIGNvbnN0cnVjdG9yICsgbWVtYmVyIHRhYmxlc1xuICBjb25zdCB0eXBlUGFyYW1zQXR0cmlidXRlID0gaW5mby50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwID8gYCB0eXBlUGFyYW1zPXske0pTT04uc3RyaW5naWZ5KGluZm8udHlwZVBhcmFtZXRlcnMpfX1gIDogJyc7XG4gIGNvbnN0IGV4dGVuZHNBdHRyaWJ1dGUgPSBpbmZvLmJhc2VUeXBlcy5sZW5ndGggPiAwID8gYCBleHRlbmRzPXske0pTT04uc3RyaW5naWZ5KGluZm8uYmFzZVR5cGVzKX19YCA6ICcnO1xuICBjb25zdCBpbXBsZW1lbnRzQXR0cmlidXRlID0gaW5mby5pbXBsZW1lbnRzVHlwZXMubGVuZ3RoID4gMCA/IGAgaW1wbGVtZW50cz17JHtKU09OLnN0cmluZ2lmeShpbmZvLmltcGxlbWVudHNUeXBlcyl9fWAgOiAnJztcbiAgbGluZXMucHVzaChgPFR5cGVTaWduYXR1cmUga2luZD1cIiR7aW5mby5raW5kfVwiIG5hbWU9XCIke25hbWV9XCIke3R5cGVQYXJhbXNBdHRyaWJ1dGV9JHtleHRlbmRzQXR0cmlidXRlfSR7aW1wbGVtZW50c0F0dHJpYnV0ZX0gLz5gLCAnJyk7XG5cbiAgaWYgKGluZm8uYmFzZVR5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5rZWRUeXBlcyA9IGluZm8uYmFzZVR5cGVzLm1hcCgodCkgPT4gbGlua0Jhc2VUeXBlKHQsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGxpbmVzLnB1c2goYCoqRXh0ZW5kczoqKiAke2xpbmtlZFR5cGVzLmpvaW4oJywgJyl9YCwgJycpO1xuICB9XG5cbiAgaWYgKGluZm8uaW1wbGVtZW50c1R5cGVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsaW5rZWRUeXBlcyA9IGluZm8uaW1wbGVtZW50c1R5cGVzLm1hcCgodCkgPT4gbGlua0Jhc2VUeXBlKHQsIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGxpbmVzLnB1c2goYCoqSW1wbGVtZW50czoqKiAke2xpbmtlZFR5cGVzLmpvaW4oJywgJyl9YCwgJycpO1xuICB9XG5cbiAgcmVuZGVyQ29uc3RydWN0b3JNZHgobGluZXMsIG5hbWUsIGluZm8sIGFsbFR5cGVzKTtcbiAgcmVuZGVyUHJvcGVydHlUYWJsZU1keChsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuICByZW5kZXJNZXRob2RUYWJsZU1keChsaW5lcywgaW5mbywgYWxsVHlwZXMpO1xuXG4gIHJldHVybiB7IGNvbnRlbnQ6IGxpbmVzLmpvaW4oJ1xcbicpLCBmaWxlUGF0aCB9O1xufVxuXG4vKipcbiAqIFdyaXRlcyB0aGUgU3RhcmxpZ2h0IHNpZGViYXIgb2YgdGhlIEFQSSByZWZlcmVuY2UuXG4gKlxuICogQHBhcmFtIHR5cGVzIC0gVGhlIGRvY3VtZW50ZWQgdHlwZXMsIGtleWVkIGJ5IHF1YWxpZmllZCBpZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlU2lkZWJhckpzb24odHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByb290ID0gYnVpbGRTaWRlYmFyVHJlZSh0eXBlcyk7XG5cbiAgY29uc3QgZ3JvdXBzOiBTaWRlYmFyRW50cnlbXSA9IFtdO1xuICBjb25zdCB0b3BMZXZlbHMgPSBbLi4ucm9vdC5jaGlsZHJlbl0uc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGZvciAoY29uc3QgW3RvcExldmVsLCBjaGlsZF0gb2YgdG9wTGV2ZWxzKSB7XG4gICAgZ3JvdXBzLnB1c2goc2lkZWJhclRyZWVUb0VudHJpZXMoY2hpbGQsIHRvcExldmVsKSk7XG4gIH1cblxuICBjb25zdCB3cmFwcGVkU2lkZWJhcjogU2lkZWJhckVudHJ5W10gPSBbe1xuICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgaXRlbXM6IGdyb3VwcyxcbiAgICBsYWJlbDogJ0FQSSByZWZlcmVuY2UnXG4gIH1dO1xuXG4gIGF3YWl0IHdyaXRlRmlsZShnZXRBcGlEb2NTZXR0aW5ncygpLnNpZGViYXJGaWxlLCBKU09OLnN0cmluZ2lmeSh3cmFwcGVkU2lkZWJhciwgbnVsbCwgSlNPTl9JTkRFTlQpLCAndXRmLTgnKTtcbiAgY29uc29sZS53YXJuKGBHZW5lcmF0ZWQgc2lkZWJhciB3aXRoICR7U3RyaW5nKGdyb3Vwcy5sZW5ndGgpfSB0b3AtbGV2ZWwgbW9kdWxlIGdyb3Vwc2ApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBjbGFzcydzIGNvbnN0cnVjdG9yIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBuYW1lIC0gVGhlIHR5cGUncyBuYW1lLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29uc3RydWN0b3JNZHgobGluZXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGNvbnN0cnVjdG9yID0gaW5mby5jb25zdHJ1Y3RvckluZm87XG4gIGlmICghY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY3RvclNpZyA9IGBuZXcgJHtuYW1lfSR7Y29uc3RydWN0b3Iuc2lnbmF0dXJlfWA7XG4gIGNvbnN0IGN0b3JEZXNjID0gY29uc3RydWN0b3IuZGVzY3JpcHRpb25cbiAgICA/IGAgZGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3MoY29uc3RydWN0b3IuZGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpKX1cImBcbiAgICA6ICcnO1xuICBsaW5lcy5wdXNoKGA8Q29uc3RydWN0b3JCbG9jayBzaWduYXR1cmU9XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShjdG9yU2lnKX1cIiR7Y3RvckRlc2N9IC8+YCwgJycpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYW4gZW51bSdzIG1lbWJlcnMuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIGluZm8gLSBUaGUgZG9jdW1lbnRlZCB0eXBlLlxuICogQHBhcmFtIGFsbFR5cGVzIC0gRXZlcnkgZG9jdW1lbnRlZCB0eXBlLCBrZXllZCBieSBgJHtuYW1lc3BhY2V9IyR7bmFtZX1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRW51bVBhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwiZW51bVwiIG5hbWU9XCIke2luZm8ubmFtZX1cIiAvPmAsICcnKTtcblxuICBpZiAoaW5mby5lbnVtTWVtYmVycy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsaW5lcy5wdXNoKCcqKk1lbWJlcnM6KionLCAnJywgJ3wgTWVtYmVyIHwgVmFsdWUgfCBEZXNjcmlwdGlvbiB8JywgJ3wgOi0tIHwgOi0tIHwgOi0tIHwnKTtcbiAgZm9yIChjb25zdCBtZW1iZXIgb2YgaW5mby5lbnVtTWVtYmVycykge1xuICAgIGNvbnN0IHZhbHVlID0gbWVtYmVyLnZhbHVlID8gYFxcYCR7ZXNjYXBlTWFya2Rvd24obWVtYmVyLnZhbHVlKX1cXGBgIDogJyc7XG4gICAgbGluZXMucHVzaChgfCBcXGAke21lbWJlci5uYW1lfVxcYCB8ICR7dmFsdWV9IHwgJHtlc2NhcGVNYXJrZG93bihyZXNvbHZlTGlua3MobWVtYmVyLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKX0gfGApO1xuICB9XG4gIGxpbmVzLnB1c2goJycpO1xufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgU3RhcmxpZ2h0IGZyb250bWF0dGVyIGJsb2NrICh0aHJvdWdoIHRoZSBjbG9zaW5nIGAtLS1gIGFuZCBpdHMgYmxhbmsgbGluZSkgc2hhcmVkIGJ5IGV2ZXJ5XG4gKiBnZW5lcmF0ZWQgcGFnZSBraW5kOiBtb2R1bGUgaW5kZXgsIHR5cGUgb3ZlcnZpZXcsIHByb3BlcnR5LCBhbmQgbWV0aG9kLlxuICpcbiAqIEV2ZXJ5IHBhZ2Uga2luZCBnb2VzIHRocm91Z2ggaGVyZSBzbyBubyBmaWVsZCBjYW4gYmUgZW1pdHRlZCBvbiBzb21lIGtpbmRzIGFuZCBzaWxlbnRseSBkcm9wcGVkIG9uXG4gKiBvdGhlcnMuIGBkZXNjcmlwdGlvbmAgaW4gcGFydGljdWxhciBpcyBub3QganVzdCBTRU8gbWV0YWRhdGEg4oCUIGl0IGlzIHRoZSBsaW5lIHRoZSBPRyBjYXJkIHJlbmRlcnMgdW5kZXJcbiAqIHRoZSB0aXRsZSwgc28gYSBwYWdlIGtpbmQgdGhhdCBza2lwcGVkIGl0IHByb2R1Y2VkIGEgdGl0bGUtb25seSBjYXJkIG5leHQgdG8gZnVsbHkgcG9wdWxhdGVkIG9uZXMuXG4gKlxuICogQHBhcmFtIGZyb250TWF0dGVyIC0gVGhlIHBhZ2UncyBmcm9udG1hdHRlciBmaWVsZHMuXG4gKiBAcmV0dXJucyBUaGUgZnJvbnRtYXR0ZXIgbGluZXMsIHRocm91Z2ggdGhlIGNsb3NpbmcgYC0tLWAgYW5kIGl0cyBibGFuayBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyRnJvbnRNYXR0ZXIoZnJvbnRNYXR0ZXI6IFBhZ2VGcm9udE1hdHRlcik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAnLS0tJyxcbiAgICBgdGl0bGU6IFwiJHtlc2NhcGVZYW1sKGZyb250TWF0dGVyLnRpdGxlKX1cImAsXG4gICAgYHNsdWc6IFwiJHtmcm9udE1hdHRlci5zbHVnfVwiYCxcbiAgICAuLi4oZnJvbnRNYXR0ZXIuZGVzY3JpcHRpb24gPyBbYGRlc2NyaXB0aW9uOiBcIiR7ZXNjYXBlWWFtbChzdHJpcE1hcmtkb3duKGZyb250TWF0dGVyLmRlc2NyaXB0aW9uKSl9XCJgXSA6IFtdKSxcbiAgICAuLi4oZnJvbnRNYXR0ZXIuc2lnbmF0dXJlID8gW2BzaWduYXR1cmU6IFwiJHtlc2NhcGVZYW1sKHRydW5jYXRlU2lnbmF0dXJlKGZyb250TWF0dGVyLnNpZ25hdHVyZSkpfVwiYF0gOiBbXSksXG4gICAgJ2VkaXRVcmw6IGZhbHNlJyxcbiAgICAnc2lkZWJhcjonLFxuICAgIGAgIGxhYmVsOiBcIiR7ZXNjYXBlWWFtbChmcm9udE1hdHRlci5zaWRlYmFyTGFiZWwpfVwiYCxcbiAgICAnLS0tJyxcbiAgICAnJ1xuICBdO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBmdW5jdGlvbidzIHNpZ25hdHVyZSwgcGFyYW1ldGVycywgcmV0dXJuIHZhbHVlIGFuZCBleGFtcGxlcy5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJGdW5jdGlvblBhZ2UobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCAkZnVuY3Rpb24gPSBpbmZvLm1ldGhvZHNbMF07XG4gIGlmICghJGZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGluZXMucHVzaCgnKipTaWduYXR1cmU6KionLCAnJywgJ2BgYHRzJywgYGZ1bmN0aW9uICR7JGZ1bmN0aW9uLnNpZ25hdHVyZX06ICR7JGZ1bmN0aW9uLnJldHVyblR5cGV9YCwgJ2BgYCcsICcnKTtcblxuICBpZiAoJGZ1bmN0aW9uLnBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgIGxpbmVzLnB1c2goJyoqUGFyYW1ldGVyczoqKicsICcnLCAnfCBQYXJhbWV0ZXIgfCBUeXBlIHwgRGVzY3JpcHRpb24gfCcsICd8IDotLSB8IDotLSB8IDotLSB8Jyk7XG4gICAgZm9yIChjb25zdCBwYXJhbWV0ZXIgb2YgJGZ1bmN0aW9uLnBhcmFtZXRlcnMpIHtcbiAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgIGB8IFxcYCR7cGFyYW1ldGVyLm5hbWV9XFxgIHwgJHtlc2NhcGVNYXJrZG93bihlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3MocGFyYW1ldGVyLnR5cGUsIGFsbFR5cGVzLCBpbmZvLm5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfSB8ICR7ZXNjYXBlTWFya2Rvd24ocmVzb2x2ZUxpbmtzKHBhcmFtZXRlci5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSl9IHxgXG4gICAgICApO1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKCcnKTtcbiAgfVxuXG4gIGNvbnN0IHJldHVybkRlc2MgPSAkZnVuY3Rpb24ucmV0dXJuRGVzY3JpcHRpb24gPyBgIOKAlCAke2VzY2FwZU1keFByb3NlKHJlc29sdmVMaW5rcygkZnVuY3Rpb24ucmV0dXJuRGVzY3JpcHRpb24sIGFsbFR5cGVzLCBpbmZvLm5hbWVzcGFjZSkpfWAgOiAnJztcbiAgbGluZXMucHVzaChgKipSZXR1cm5zOioqICR7ZXNjYXBlTWR4QnJhY2VzKGVzY2FwZU1keEFuZ2xlQnJhY2tldHMocmVuZGVyVHlwZVdpdGhMaW5rcygkZnVuY3Rpb24ucmV0dXJuVHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKSl9JHtyZXR1cm5EZXNjfWAsICcnKTtcblxuICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgJGZ1bmN0aW9uLmV4YW1wbGVzKSB7XG4gICAgbGluZXMucHVzaCgnKipFeGFtcGxlOioqJywgJycsIHJlbmRlckV4YW1wbGVNZHgoZXhhbXBsZSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSwgJycpO1xuICB9XG59XG5cbi8qKlxuICogUmVuZGVycyBvbmUgbWV0aG9kIG92ZXJsb2FkLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBvdmVybG9hZCAtIFRoZSBvdmVybG9hZC5cbiAqIEBwYXJhbSB0eXBlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG9mIHRoZSB0eXBlIHRoZSBtZXRob2QgYmVsb25ncyB0by5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1ldGhvZE92ZXJsb2FkTWR4KGxpbmVzOiBzdHJpbmdbXSwgb3ZlcmxvYWQ6IE1lbWJlckluZm8sIHR5cGVOYW1lOiBzdHJpbmcsIG5hbWVzcGFjZTogc3RyaW5nLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IHNpZyA9IGAke292ZXJsb2FkLnNpZ25hdHVyZX06ICR7b3ZlcmxvYWQucmV0dXJuVHlwZX1gO1xuICBjb25zdCBzdGF0aWNBdHRyaWJ1dGUgPSBvdmVybG9hZC5pc1N0YXRpYyA/ICcgaXNTdGF0aWM9e3RydWV9JyA6ICcnO1xuICBjb25zdCBkZXNjQXR0cmlidXRlID0gb3ZlcmxvYWQuZGVzY3JpcHRpb24gPyBgIGRlc2NyaXB0aW9uPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG92ZXJsb2FkLmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgbmFtZXNwYWNlKSkpfVwiYCA6ICcnO1xuICBjb25zdCByZW1hcmtzQXR0cmlidXRlID0gb3ZlcmxvYWQucmVtYXJrcyA/IGAgcmVtYXJrcz1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlc29sdmVMaW5rcyhvdmVybG9hZC5yZW1hcmtzLCBhbGxUeXBlcywgbmFtZXNwYWNlKSkpfVwiYCA6ICcnO1xuICBjb25zdCBzaW5jZUF0dHJpYnV0ZSA9IG92ZXJsb2FkLnNpbmNlID8gYCBzaW5jZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG92ZXJsb2FkLnNpbmNlKX1cImAgOiAnJztcbiAgY29uc3QgcmV0dXJuVHlwZUF0dHJpYnV0ZSA9IGAgcmV0dXJuVHlwZT1cIiR7ZXNjYXBlSnN4QXR0cmlidXRlKG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3Mob3ZlcmxvYWQucmV0dXJuVHlwZSwgYWxsVHlwZXMsIHR5cGVOYW1lLCBuYW1lc3BhY2UpKSl9XCJgO1xuICBjb25zdCByZXR1cm5EZXNjQXR0cmlidXRlID0gb3ZlcmxvYWQucmV0dXJuRGVzY3JpcHRpb25cbiAgICA/IGAgcmV0dXJuRGVzY3JpcHRpb249XCIke2VzY2FwZUpzeEF0dHJpYnV0ZShtYXJrZG93blRvSHRtbChyZXNvbHZlTGlua3Mob3ZlcmxvYWQucmV0dXJuRGVzY3JpcHRpb24sIGFsbFR5cGVzLCBuYW1lc3BhY2UpKSl9XCJgXG4gICAgOiAnJztcbiAgY29uc3QgZXhhbXBsZXNBdHRyaWJ1dGUgPSBvdmVybG9hZC5leGFtcGxlcy5sZW5ndGggPiAwID8gYCBleGFtcGxlcz17JHtKU09OLnN0cmluZ2lmeShvdmVybG9hZC5leGFtcGxlcyl9fWAgOiAnJztcblxuICBjb25zdCBwYXJhbXMgPSBvdmVybG9hZC5wYXJhbWV0ZXJzLm1hcCgocCkgPT4gKHtcbiAgICBkZXNjcmlwdGlvbjogbWFya2Rvd25Ub0h0bWwocC5kZXNjcmlwdGlvbiB8fCAocC5uYW1lLmVuZHNXaXRoKCc/JykgPyAnKihPcHRpb25hbCkqJyA6ICcnKSksXG4gICAgbmFtZTogcC5uYW1lLFxuICAgIHR5cGU6IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MocC50eXBlLCBhbGxUeXBlcywgdHlwZU5hbWUsIG5hbWVzcGFjZSkpXG4gIH0pKTtcbiAgY29uc3QgcGFyYW1zQXR0cmlidXRlID0gcGFyYW1zLmxlbmd0aCA+IDAgPyBgIHBhcmFtZXRlcnM9eyR7SlNPTi5zdHJpbmdpZnkocGFyYW1zKX19YCA6ICcnO1xuXG4gIGxpbmVzLnB1c2goXG4gICAgYDxNZW1iZXJEZXRhaWwke3N0YXRpY0F0dHJpYnV0ZX0gc2lnbmF0dXJlPVwiJHtlc2NhcGVKc3hBdHRyaWJ1dGUoc2lnKX1cIiR7ZGVzY0F0dHJpYnV0ZX0ke3JlbWFya3NBdHRyaWJ1dGV9JHtzaW5jZUF0dHJpYnV0ZX0ke3JldHVyblR5cGVBdHRyaWJ1dGV9JHtyZXR1cm5EZXNjQXR0cmlidXRlfSR7cGFyYW1zQXR0cmlidXRlfSR7ZXhhbXBsZXNBdHRyaWJ1dGV9IC8+YCxcbiAgICAnJ1xuICApO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSB0eXBlJ3MgbWV0aG9kIHRhYmxlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlck1ldGhvZFRhYmxlTWR4KGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgbWV0aG9kcyA9IFsuLi5pbmZvLm1ldGhvZHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5pc1N0YXRpYyAhPT0gYi5pc1N0YXRpYykge1xuICAgICAgcmV0dXJuIGEuaXNTdGF0aWMgPyAxIDogLTE7XG4gICAgfVxuICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICB9KTtcbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxpbmVzLnB1c2goJzxNZXRob2RUYWJsZSByb3dzPXtbJyk7XG4gIGZvciAoY29uc3QgbWV0aG9kIG9mIG1ldGhvZHMpIHtcbiAgICBjb25zdCBkZXNjID0gZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKG1ldGhvZC5kZXNjcmlwdGlvbiwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpO1xuICAgIGNvbnN0IHN0YXRpY1ByZWZpeCA9IG1ldGhvZC5pc1N0YXRpYyA/ICdzdGF0aWMgJyA6ICcnO1xuICAgIGNvbnN0IHNob3J0UGFyYW1zID0gbWV0aG9kLnBhcmFtZXRlcnMubWFwKChwLCBpbmRleCkgPT4ge1xuICAgICAgcmV0dXJuIGluZGV4ID09PSAwICYmIEVWRU5UX01FVEhPRFMuaGFzKG1ldGhvZC5uYW1lKSAmJiAocC50eXBlLnN0YXJ0c1dpdGgoJ1wiJykgfHwgcC50eXBlLnN0YXJ0c1dpdGgoJ1xcJycpKSA/IHAudHlwZS5yZXBsYWNlQWxsKCdcIicsICdcXCcnKSA6IHAubmFtZTtcbiAgICB9KS5qb2luKCcsICcpO1xuICAgIGNvbnN0IHNob3J0U2lnID0gYCR7c3RhdGljUHJlZml4fSR7bWV0aG9kLm5hbWV9KCR7c2hvcnRQYXJhbXN9KWA7XG4gICAgY29uc3Qgc2lnID0gZXNjYXBlSnNTdHJpbmcoc2hvcnRTaWcpO1xuICAgIGNvbnN0IHNsdWcgPSBvdmVybG9hZFJvdXRlU2VnbWVudChtZXRob2Qub3ZlcmxvYWRLZXkpO1xuICAgIGNvbnN0IHJldHVyblR5cGUgPSBtYXJrZG93blRvSHRtbChyZW5kZXJUeXBlV2l0aExpbmtzKG1ldGhvZC5yZXR1cm5UeXBlLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpO1xuICAgIGNvbnN0IGluaGVyaXRlZEF0dHJpYnV0ZSA9IG1ldGhvZC5pbmhlcml0ZWRGcm9tXG4gICAgICA/IGAsIGluaGVyaXRlZEZyb206IFwiJHtlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbCh0eXBlTGluayhtZXRob2QuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKSkpfVwiYFxuICAgICAgOiAnJztcbiAgICBjb25zdCBocmVmID0gbWVtYmVySHJlZihzbHVnLCBtZXRob2QuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYCAgeyBzaWduYXR1cmU6IFwiJHtzaWd9XCIsIGhyZWY6IFwiJHtlc2NhcGVKc1N0cmluZyhocmVmKX1cIiwgcmV0dXJuczogXCIke2VzY2FwZUpzU3RyaW5nKHJldHVyblR5cGUpfVwiLCBkZXNjcmlwdGlvbjogXCIke2Rlc2N9XCIke2luaGVyaXRlZEF0dHJpYnV0ZX0gfSxgXG4gICAgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCddfSAvPicsICcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSdzIHByb3BlcnR5IHRhYmxlLlxuICpcbiAqIEBwYXJhbSBsaW5lcyAtIFRoZSBwYWdlIGxpbmVzIHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSBpbmZvIC0gVGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAqIEBwYXJhbSBhbGxUeXBlcyAtIEV2ZXJ5IGRvY3VtZW50ZWQgdHlwZSwga2V5ZWQgYnkgYCR7bmFtZXNwYWNlfSMke25hbWV9YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclByb3BlcnR5VGFibGVNZHgobGluZXM6IHN0cmluZ1tdLCBpbmZvOiBUeXBlSW5mbywgYWxsVHlwZXM6IE1hcDxzdHJpbmcsIFR5cGVJbmZvPik6IHZvaWQge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gaW5mby5wcm9wZXJ0aWVzO1xuICBpZiAocHJvcGVydGllcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGluZXMucHVzaCgnPFByb3BlcnR5VGFibGUgcm93cz17WycpO1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBkZXNjID0gZXNjYXBlSnNTdHJpbmcobWFya2Rvd25Ub0h0bWwocmVzb2x2ZUxpbmtzKHByb3BlcnR5LmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSk7XG4gICAgY29uc3QgdHlwZSA9IG1hcmtkb3duVG9IdG1sKHJlbmRlclR5cGVXaXRoTGlua3MocHJvcGVydHkudHlwZSwgYWxsVHlwZXMsIGluZm8ubmFtZSwgaW5mby5uYW1lc3BhY2UpKTtcbiAgICBjb25zdCBpbmhlcml0ZWRBdHRyaWJ1dGUgPSBwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tXG4gICAgICA/IGAsIGluaGVyaXRlZEZyb206IFwiJHtlc2NhcGVKc1N0cmluZyhtYXJrZG93blRvSHRtbCh0eXBlTGluayhwcm9wZXJ0eS5pbmhlcml0ZWRGcm9tLCBhbGxUeXBlcywgaW5mby5uYW1lc3BhY2UpKSl9XCJgXG4gICAgICA6ICcnO1xuICAgIGNvbnN0IGhyZWYgPSBtZW1iZXJIcmVmKG1lbWJlclJvdXRlU2VnbWVudChwcm9wZXJ0eS5uYW1lKSwgcHJvcGVydHkuaW5oZXJpdGVkRnJvbSwgYWxsVHlwZXMsIGluZm8ubmFtZXNwYWNlKTtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYCAgeyBuYW1lOiBcIiR7ZXNjYXBlSnNTdHJpbmcocHJvcGVydHkubmFtZSl9XCIsIGhyZWY6IFwiJHtlc2NhcGVKc1N0cmluZyhocmVmKX1cIiwgdHlwZTogXCIke2VzY2FwZUpzU3RyaW5nKHR5cGUpfVwiLCBkZXNjcmlwdGlvbjogXCIke2Rlc2N9XCIke2luaGVyaXRlZEF0dHJpYnV0ZX0gfSxgXG4gICAgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCddfSAvPicsICcnKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgdHlwZSBhbGlhcydzIHNpZ25hdHVyZS5cbiAqXG4gKiBAcGFyYW0gbGluZXMgLSBUaGUgcGFnZSBsaW5lcyB0byBhcHBlbmQgdG8uXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJUeXBlQWxpYXNQYWdlKGxpbmVzOiBzdHJpbmdbXSwgaW5mbzogVHlwZUluZm8sIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4pOiB2b2lkIHtcbiAgY29uc3QgdHlwZVBhcmFtc0F0dHJpYnV0ZSA9IGluZm8udHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCA/IGAgdHlwZVBhcmFtcz17JHtKU09OLnN0cmluZ2lmeShpbmZvLnR5cGVQYXJhbWV0ZXJzKX19YCA6ICcnO1xuICBsaW5lcy5wdXNoKGA8VHlwZVNpZ25hdHVyZSBraW5kPVwidHlwZVwiIG5hbWU9XCIke2luZm8ubmFtZX1cIiR7dHlwZVBhcmFtc0F0dHJpYnV0ZX0gLz5gLCAnJyk7XG5cbiAgY29uc3QgcmhzID0gaW5mby50eXBlQWxpYXNUZXh0ID8/ICd1bmtub3duJztcbiAgbGluZXMucHVzaChcbiAgICAnKipTaWduYXR1cmU6KionLFxuICAgICcnLFxuICAgICdgYGB0cycsXG4gICAgYHR5cGUgJHtnZXREaXNwbGF5TmFtZShpbmZvLm5hbWUsIGluZm8pfSA9ICR7cmhzfWAsXG4gICAgJ2BgYCcsXG4gICAgJycsXG4gICAgYCoqVHlwZToqKiAke2VzY2FwZU1keEJyYWNlcyhlc2NhcGVNZHhBbmdsZUJyYWNrZXRzKHJlbmRlclR5cGVXaXRoTGlua3MocmhzLCBhbGxUeXBlcywgaW5mby5uYW1lLCBpbmZvLm5hbWVzcGFjZSkpKX1gLFxuICAgICcnXG4gICk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHZhcmlhYmxlJ3MgZGVjbGFyYXRpb24gYW5kIHR5cGUuXG4gKlxuICogQHBhcmFtIGxpbmVzIC0gVGhlIHBhZ2UgbGluZXMgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgdHlwZSdzIG5hbWUuXG4gKiBAcGFyYW0gaW5mbyAtIFRoZSBkb2N1bWVudGVkIHR5cGUuXG4gKiBAcGFyYW0gYWxsVHlwZXMgLSBFdmVyeSBkb2N1bWVudGVkIHR5cGUsIGtleWVkIGJ5IGAke25hbWVzcGFjZX0jJHtuYW1lfWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJWYXJpYWJsZVBhZ2UobGluZXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGluZm86IFR5cGVJbmZvLCBhbGxUeXBlczogTWFwPHN0cmluZywgVHlwZUluZm8+KTogdm9pZCB7XG4gIGNvbnN0IGtleXdvcmQgPSBpbmZvLnZhcmlhYmxlS2V5d29yZCA/PyAnbGV0JztcbiAgY29uc3QgdmFyaWFibGVUeXBlID0gaW5mby52YXJpYWJsZVR5cGUgPz8gJ3Vua25vd24nO1xuICBsaW5lcy5wdXNoKFxuICAgICcqKlNpZ25hdHVyZToqKicsXG4gICAgJycsXG4gICAgJ2BgYHRzJyxcbiAgICBgJHtrZXl3b3JkfSAke25hbWV9OiAke3ZhcmlhYmxlVHlwZX1gLFxuICAgICdgYGAnLFxuICAgICcnLFxuICAgIGAqKlR5cGU6KiogJHtlc2NhcGVNZHhCcmFjZXMoZXNjYXBlTWR4QW5nbGVCcmFja2V0cyhyZW5kZXJUeXBlV2l0aExpbmtzKHZhcmlhYmxlVHlwZSwgYWxsVHlwZXMsIG5hbWUsIGluZm8ubmFtZXNwYWNlKSkpfWAsXG4gICAgJydcbiAgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIG5hbWVzcGFjZSB0cmVlIG5vZGUgaW50byBhIHNpZGViYXIgZ3JvdXAuXG4gKlxuICogQHBhcmFtIG5vZGUgLSBUaGUgbm9kZS5cbiAqIEBwYXJhbSBsYWJlbCAtIFRoZSBncm91cCdzIGxhYmVsLlxuICogQHJldHVybnMgVGhlIHNpZGViYXIgZ3JvdXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWRlYmFyVHJlZVRvRW50cmllcyhub2RlOiBTaWRlYmFyVHJlZU5vZGUsIGxhYmVsOiBzdHJpbmcpOiBTaWRlYmFyRW50cnkge1xuICBjb25zdCBpdGVtczogKFNpZGViYXJFbnRyeSB8IFNpZGViYXJMaW5rKVtdID0gW107XG5cbiAgLy8gQ2hpbGQgZGlyZWN0b3J5IGdyb3VwcyBmaXJzdCAoYmVmb3JlIHRoaXMgbW9kdWxlJ3Mgb3duIHBhZ2VzKVxuICBjb25zdCBzb3J0ZWRDaGlsZHJlbiA9IFsuLi5ub2RlLmNoaWxkcmVuXS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcbiAgZm9yIChjb25zdCBbY2hpbGROYW1lLCBjaGlsZF0gb2Ygc29ydGVkQ2hpbGRyZW4pIHtcbiAgICBpdGVtcy5wdXNoKHNpZGViYXJUcmVlVG9FbnRyaWVzKGNoaWxkLCBjaGlsZE5hbWUpKTtcbiAgfVxuXG4gIC8vIFRoaXMgbW9kdWxlJ3Mgb3duIG92ZXJ2aWV3IHBhZ2UgKyB0eXBlL2Z1bmN0aW9uIHBhZ2VzIChpbmRpdmlkdWFsIG1lbWJlcnMgYXJlIG5vdCBsaXN0ZWQpLlxuICAvLyBTaWRlYmFyIGBsaW5rYCBmaWVsZHMgbXVzdCBOT1QgZW1iZWQgQkFTRV9QQVRIOiBTdGFybGlnaHQgcHJlcGVuZHMgdGhlIGNvbmZpZyBgYmFzZWAgdG8gZXZlcnlcbiAgLy8gc2lkZWJhciBsaW5rIGl0c2VsZiwgc28gaW5jbHVkaW5nIGl0IGhlcmUgd291bGQgZG91YmxlIHRoZSBiYXNlIChlLmcuIGAvYmFzZS9iYXNlL2FwaS8uLi5gIOKGkiA0MDQpLlxuICAvLyBUaGlzIGRpZmZlcnMgZnJvbSBpbi1jb250ZW50IGxpbmtzLCB3aGljaCBhcmUgcmF3IGFuY2hvcnMgdGhhdCBTdGFybGlnaHQgZG9lcyBub3QgYmFzZS1wcmVwZW5kLlxuICBpZiAobm9kZS50eXBlcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IGVuc3VyZU5vbk51bGxhYmxlKG5vZGUudHlwZXNbMF0pO1xuICAgIGl0ZW1zLnB1c2goeyBsYWJlbDogJ092ZXJ2aWV3JywgbGluazogYC9hcGkvJHtuYW1lc3BhY2V9L2AgfSk7XG4gICAgY29uc3Qgc29ydGVkVHlwZXMgPSBbLi4ubm9kZS50eXBlc10uc29ydCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5uYW1lKSk7XG4gICAgZm9yIChjb25zdCB0IG9mIHNvcnRlZFR5cGVzKSB7XG4gICAgICBpdGVtcy5wdXNoKHsgbGFiZWw6IHQubmFtZSwgbGluazogYC9hcGkvJHt0Lm5hbWVzcGFjZX0vJHt0b1R5cGVSb3V0ZVNlZ21lbnQodC5uYW1lc3BhY2UsIHQubmFtZSl9L2AgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgY29sbGFwc2VkOiB0cnVlLCBpdGVtcywgbGFiZWwgfTtcbn1cblxuLy8gU2VydmVzIGJvdGggYXMgdGhlIHJvb3QgQVBJIHBhZ2UncyBwcm9zZSBhbmQgKHN0cmlwcGVkKSBhcyBpdHMgYGRlc2NyaXB0aW9uYCBmcm9udG1hdHRlci5cbi8vIFNoYXJpbmcgb25lIGZ1bmN0aW9uIGtlZXBzIHRoZSBwYWdlIGFuZCBpdHMgT0cgY2FyZCBmcm9tIGRyaWZ0aW5nIGFwYXJ0LlxuZnVuY3Rpb24gZ2V0QXBpSW5kZXhJbnRybyhuYW1lc3BhY2VzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHsgcGFja2FnZU5hbWUsIHB1YmxpY0FwaUVudHJ5IH0gPSBnZXRBcGlEb2NTZXR0aW5ncygpO1xuICBjb25zdCBpbnRybyA9IGBUaGUgY29tcGxldGUgQVBJIHJlZmVyZW5jZSBmb3IgXFxgJHtwYWNrYWdlTmFtZX1cXGAsIGdlbmVyYXRlZCBmcm9tIGl0cyBUU0RvYy4gYDtcbiAgaWYgKHB1YmxpY0FwaUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYCR7aW50cm99RXZlcnkgZXhwb3J0IGlzIGltcG9ydGVkIGZyb20gdGhlIHBhY2thZ2Ugcm9vdCwgXFxgJHtwYWNrYWdlTmFtZX1cXGA7IHRoZSBtb2R1bGVzIGJlbG93IGdyb3VwIHRoZW0gYnkgc291cmNlIG1vZHVsZS5gO1xuICB9XG4gIGNvbnN0IFtleGFtcGxlTmFtZXNwYWNlID0gJ21vZHVsZSddID0gbmFtZXNwYWNlcztcbiAgcmV0dXJuIGAke2ludHJvfUVhY2ggbW9kdWxlIGJlbG93IG1hcHMgdG8gYW4gaW1wb3J0IHN1YnBhdGggKGUuZy4gdGhlIFxcYCR7ZXhhbXBsZU5hbWVzcGFjZX1cXGAgbW9kdWxlIGlzIFxcYCR7cGFja2FnZU5hbWV9LyR7ZXhhbXBsZU5hbWVzcGFjZX1cXGApLmA7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudEltcG9ydHMoY29tcG9uZW50TmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gY29tcG9uZW50TmFtZXMubWFwKChjb21wb25lbnROYW1lKSA9PiBgaW1wb3J0ICR7Y29tcG9uZW50TmFtZX0gZnJvbSBcIiR7QVBJX0NPTVBPTkVOVFNfSU1QT1JUX1BSRUZJWH0vJHtjb21wb25lbnROYW1lfS5hc3Ryb1wiO2ApO1xufVxuXG5mdW5jdGlvbiByZW5kZXJOYW1lc3BhY2VUYWJsZShcbiAgbGluZXM6IHN0cmluZ1tdLFxuICBoZWFkaW5nOiBzdHJpbmcsXG4gIGNvbHVtbkxhYmVsOiBzdHJpbmcsXG4gIGVudHJpZXM6IFR5cGVJbmZvW10sXG4gIGFsbFR5cGVzOiBNYXA8c3RyaW5nLCBUeXBlSW5mbz4sXG4gIG5hbWVzcGFjZTogc3RyaW5nXG4pOiB2b2lkIHtcbiAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNvcnRlZCA9IFsuLi5lbnRyaWVzXS5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgbGluZXMucHVzaChgIyMgJHtoZWFkaW5nfWAsICcnLCBgfCAke2NvbHVtbkxhYmVsfSB8IERlc2NyaXB0aW9uIHxgLCAnfCA6LS0gfCA6LS0gfCcpO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIHNvcnRlZCkge1xuICAgIGxpbmVzLnB1c2goYHwgWyR7ZW50cnkubmFtZX1dKC4vJHt0b1R5cGVSb3V0ZVNlZ21lbnQoZW50cnkubmFtZXNwYWNlLCBlbnRyeS5uYW1lKX0vKSB8ICR7ZXNjYXBlTWFya2Rvd24ocmVzb2x2ZUxpbmtzKGVudHJ5LmRlc2NyaXB0aW9uLCBhbGxUeXBlcywgbmFtZXNwYWNlKSl9IHxgKTtcbiAgfVxuICBsaW5lcy5wdXNoKCcnKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPQSxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLFlBQVk7QUFZckIsU0FBUyxxQkFBcUI7QUFDOUI7QUFBQSxF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
|
|
@@ -14,18 +14,42 @@ export interface ApiDocSettings {
|
|
|
14
14
|
* the generator emits starts with it.
|
|
15
15
|
*/
|
|
16
16
|
readonly basePath: string;
|
|
17
|
+
/**
|
|
18
|
+
* Folder names whose subtree is not documented, in addition to `@types`, `styles` and `test-helpers`. Applies
|
|
19
|
+
* to this site's source walk only: a link into another package's site assumes that site's generator skipped the
|
|
20
|
+
* default folders alone.
|
|
21
|
+
*/
|
|
22
|
+
readonly excludedDirectories?: readonly string[] | undefined;
|
|
17
23
|
/**
|
|
18
24
|
* Type names mapped to the URL their references link to, for types neither this package nor a {@link packageSites}
|
|
19
25
|
* package declares, e.g. an ecosystem's own API reference. Consulted before the generic TypeScript, JavaScript and
|
|
20
26
|
* Web API links, so an entry here wins over them.
|
|
21
27
|
*/
|
|
22
28
|
readonly externalTypeLinks: ReadonlyMap<string, string>;
|
|
29
|
+
/**
|
|
30
|
+
* Names that are never linked as types, in addition to the built-in generic parameter names and every type
|
|
31
|
+
* parameter a documented type declares: type parameters the scan does not find.
|
|
32
|
+
*/
|
|
33
|
+
readonly genericTypeParameters?: readonly string[] | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Builds each export's import statement, for a package whose exports are not imported from
|
|
36
|
+
* `<packageName>/<namespace>`, e.g. one publishing barrel entry points. Returning `undefined` shows no statement.
|
|
37
|
+
* Unset, every statement is the {@link ImportStatementContext.defaultImportStatement}.
|
|
38
|
+
*/
|
|
39
|
+
readonly importStatement?: ImportStatementProvider | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Builds the case-preserved route segment of a member's page, overriding the generator's slug where it returns a
|
|
42
|
+
* string. The file is written under the segment lowercased. The generator's own slug already keeps a name's
|
|
43
|
+
* trailing underscores, so `create__` and `create` never share a page.
|
|
44
|
+
*/
|
|
45
|
+
readonly memberRouteSegment?: MemberRouteSegmentProvider | undefined;
|
|
23
46
|
/**
|
|
24
47
|
* The folder the generated API pages are written to, normally `<docs>/src/content/docs/api`.
|
|
25
48
|
*/
|
|
26
49
|
readonly outputDirectory: string;
|
|
27
50
|
/**
|
|
28
|
-
* The documented package's name, e.g. `@mnaoumov/typescript-lib`. Import statements are built from it
|
|
51
|
+
* The documented package's name, e.g. `@mnaoumov/typescript-lib`. Import statements are built from it, unless
|
|
52
|
+
* {@link importStatement} builds them.
|
|
29
53
|
*/
|
|
30
54
|
readonly packageName: string;
|
|
31
55
|
/**
|
|
@@ -33,11 +57,59 @@ export interface ApiDocSettings {
|
|
|
33
57
|
* declaration resolves into one of these packages links to its page on that site.
|
|
34
58
|
*/
|
|
35
59
|
readonly packageSites: ReadonlyMap<string, string>;
|
|
60
|
+
/**
|
|
61
|
+
* The absolute path of the package's one public entry point, for a package that publishes its API from a barrel
|
|
62
|
+
* rather than one import subpath per module. Set, the reference documents only the exports that barrel re-exports,
|
|
63
|
+
* found by following its `export ... from` statements rather than by walking the source folder, and every import
|
|
64
|
+
* statement imports from the package root. A namespace still groups the reference by source module.
|
|
65
|
+
*/
|
|
66
|
+
readonly publicApiEntry?: string | undefined;
|
|
36
67
|
/**
|
|
37
68
|
* The JSON file the generated Starlight sidebar is written to.
|
|
38
69
|
*/
|
|
39
70
|
readonly sidebarFile: string;
|
|
40
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* What {@link ApiDocSettings.importStatement} is told about the export whose import statement it builds.
|
|
74
|
+
*/
|
|
75
|
+
export interface ImportStatementContext {
|
|
76
|
+
/**
|
|
77
|
+
* The statement the generator writes when no hook is set, e.g.
|
|
78
|
+
* `import type { Alpha } from '@mnaoumov/typescript-lib/alpha';`.
|
|
79
|
+
*/
|
|
80
|
+
readonly defaultImportStatement: string;
|
|
81
|
+
/**
|
|
82
|
+
* Whether the export is a type only (an interface, a type alias or an enum), imported with `import type`.
|
|
83
|
+
*/
|
|
84
|
+
readonly isTypeOnly: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* The export's kind, e.g. `class`, `function`, `interface`.
|
|
87
|
+
*/
|
|
88
|
+
readonly kind: string;
|
|
89
|
+
/**
|
|
90
|
+
* The export's name.
|
|
91
|
+
*/
|
|
92
|
+
readonly name: string;
|
|
93
|
+
/**
|
|
94
|
+
* The export's namespace: its source path relative to the source folder, without its extension.
|
|
95
|
+
*/
|
|
96
|
+
readonly namespace: string;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Builds the import statement of a documented export.
|
|
100
|
+
*
|
|
101
|
+
* @param context - The export.
|
|
102
|
+
* @returns The statement, or `undefined` to show none.
|
|
103
|
+
*/
|
|
104
|
+
export type ImportStatementProvider = (context: ImportStatementContext) => string | undefined;
|
|
105
|
+
/**
|
|
106
|
+
* Builds the case-preserved route segment of a member's page.
|
|
107
|
+
*
|
|
108
|
+
* @param name - A property's name, or a method's overload key: its name, or `on('changed')` for an event method
|
|
109
|
+
* keyed by its first argument.
|
|
110
|
+
* @returns The segment, or `undefined` for the generator's own.
|
|
111
|
+
*/
|
|
112
|
+
export type MemberRouteSegmentProvider = (name: string) => string | undefined;
|
|
41
113
|
/**
|
|
42
114
|
* Sets the settings every later page and link reads.
|
|
43
115
|
*
|
|
@@ -19,4 +19,4 @@ export {
|
|
|
19
19
|
configureApiDocs,
|
|
20
20
|
getApiDocSettings
|
|
21
21
|
};
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2RvY3Mtc2l0ZS9hcGktZG9jLXNldHRpbmdzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHBlci1zaXRlIHNldHRpbmdzIG9mIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3I6IHdoZXJlIGl0IHdyaXRlcywgd2hpY2ggcGFja2FnZSBpdCBkb2N1bWVudHMsIHRoZSBiYXNlXG4gKiBwYXRoIGl0cyBsaW5rcyBjYXJyeSwgYW5kIHRoZSBleHRlcm5hbCBsaW5rcyBhIHNpdGUgYWRkcyB0byB0aGUgZ2VuZXJpYyBvbmVzLlxuICovXG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgcmVhZHMgd2hpbGUgaXQgcmVuZGVycyBwYWdlcyBhbmQgbGlua3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpRG9jU2V0dGluZ3Mge1xuICAvKipcbiAgICogVGhlIHNpdGUncyBiYXNlIHBhdGgsIHdpdGggYSBsZWFkaW5nIHNsYXNoIGFuZCBubyB0cmFpbGluZyBvbmUsIGUuZy4gYC90eXBlc2NyaXB0LWxpYmAuIEV2ZXJ5IGluLWNvbnRlbnQgbGlua1xuICAgKiB0aGUgZ2VuZXJhdG9yIGVtaXRzIHN0YXJ0cyB3aXRoIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogRm9sZGVyIG5hbWVzIHdob3NlIHN1YnRyZWUgaXMgbm90IGRvY3VtZW50ZWQsIGluIGFkZGl0aW9uIHRvIGBAdHlwZXNgLCBgc3R5bGVzYCBhbmQgYHRlc3QtaGVscGVyc2AuIEFwcGxpZXNcbiAgICogdG8gdGhpcyBzaXRlJ3Mgc291cmNlIHdhbGsgb25seTogYSBsaW5rIGludG8gYW5vdGhlciBwYWNrYWdlJ3Mgc2l0ZSBhc3N1bWVzIHRoYXQgc2l0ZSdzIGdlbmVyYXRvciBza2lwcGVkIHRoZVxuICAgKiBkZWZhdWx0IGZvbGRlcnMgYWxvbmUuXG4gICAqL1xuICByZWFkb25seSBleGNsdWRlZERpcmVjdG9yaWVzPzogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFR5cGUgbmFtZXMgbWFwcGVkIHRvIHRoZSBVUkwgdGhlaXIgcmVmZXJlbmNlcyBsaW5rIHRvLCBmb3IgdHlwZXMgbmVpdGhlciB0aGlzIHBhY2thZ2Ugbm9yIGEge0BsaW5rIHBhY2thZ2VTaXRlc31cbiAgICogcGFja2FnZSBkZWNsYXJlcywgZS5nLiBhbiBlY29zeXN0ZW0ncyBvd24gQVBJIHJlZmVyZW5jZS4gQ29uc3VsdGVkIGJlZm9yZSB0aGUgZ2VuZXJpYyBUeXBlU2NyaXB0LCBKYXZhU2NyaXB0IGFuZFxuICAgKiBXZWIgQVBJIGxpbmtzLCBzbyBhbiBlbnRyeSBoZXJlIHdpbnMgb3ZlciB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZXJuYWxUeXBlTGlua3M6IFJlYWRvbmx5TWFwPHN0cmluZywgc3RyaW5nPjtcblxuICAvKipcbiAgICogTmFtZXMgdGhhdCBhcmUgbmV2ZXIgbGlua2VkIGFzIHR5cGVzLCBpbiBhZGRpdGlvbiB0byB0aGUgYnVpbHQtaW4gZ2VuZXJpYyBwYXJhbWV0ZXIgbmFtZXMgYW5kIGV2ZXJ5IHR5cGVcbiAgICogcGFyYW1ldGVyIGEgZG9jdW1lbnRlZCB0eXBlIGRlY2xhcmVzOiB0eXBlIHBhcmFtZXRlcnMgdGhlIHNjYW4gZG9lcyBub3QgZmluZC5cbiAgICovXG4gIHJlYWRvbmx5IGdlbmVyaWNUeXBlUGFyYW1ldGVycz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgZWFjaCBleHBvcnQncyBpbXBvcnQgc3RhdGVtZW50LCBmb3IgYSBwYWNrYWdlIHdob3NlIGV4cG9ydHMgYXJlIG5vdCBpbXBvcnRlZCBmcm9tXG4gICAqIGA8cGFja2FnZU5hbWU+LzxuYW1lc3BhY2U+YCwgZS5nLiBvbmUgcHVibGlzaGluZyBiYXJyZWwgZW50cnkgcG9pbnRzLiBSZXR1cm5pbmcgYHVuZGVmaW5lZGAgc2hvd3Mgbm8gc3RhdGVtZW50LlxuICAgKiBVbnNldCwgZXZlcnkgc3RhdGVtZW50IGlzIHRoZSB7QGxpbmsgSW1wb3J0U3RhdGVtZW50Q29udGV4dC5kZWZhdWx0SW1wb3J0U3RhdGVtZW50fS5cbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydFN0YXRlbWVudD86IEltcG9ydFN0YXRlbWVudFByb3ZpZGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGNhc2UtcHJlc2VydmVkIHJvdXRlIHNlZ21lbnQgb2YgYSBtZW1iZXIncyBwYWdlLCBvdmVycmlkaW5nIHRoZSBnZW5lcmF0b3IncyBzbHVnIHdoZXJlIGl0IHJldHVybnMgYVxuICAgKiBzdHJpbmcuIFRoZSBmaWxlIGlzIHdyaXR0ZW4gdW5kZXIgdGhlIHNlZ21lbnQgbG93ZXJjYXNlZC4gVGhlIGdlbmVyYXRvcidzIG93biBzbHVnIGFscmVhZHkga2VlcHMgYSBuYW1lJ3NcbiAgICogdHJhaWxpbmcgdW5kZXJzY29yZXMsIHNvIGBjcmVhdGVfX2AgYW5kIGBjcmVhdGVgIG5ldmVyIHNoYXJlIGEgcGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IG1lbWJlclJvdXRlU2VnbWVudD86IE1lbWJlclJvdXRlU2VnbWVudFByb3ZpZGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9sZGVyIHRoZSBnZW5lcmF0ZWQgQVBJIHBhZ2VzIGFyZSB3cml0dGVuIHRvLCBub3JtYWxseSBgPGRvY3M+L3NyYy9jb250ZW50L2RvY3MvYXBpYC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dERpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZG9jdW1lbnRlZCBwYWNrYWdlJ3MgbmFtZSwgZS5nLiBgQG1uYW91bW92L3R5cGVzY3JpcHQtbGliYC4gSW1wb3J0IHN0YXRlbWVudHMgYXJlIGJ1aWx0IGZyb20gaXQsIHVubGVzc1xuICAgKiB7QGxpbmsgaW1wb3J0U3RhdGVtZW50fSBidWlsZHMgdGhlbS5cbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhY2thZ2UgbmFtZXMgbWFwcGVkIHRvIHRoZSByb290IFVSTCBvZiB0aGVpciBkb2N1bWVudGF0aW9uIHNpdGUsIHdpdGggYSB0cmFpbGluZyBzbGFzaC4gQSB0eXBlIHdob3NlXG4gICAqIGRlY2xhcmF0aW9uIHJlc29sdmVzIGludG8gb25lIG9mIHRoZXNlIHBhY2thZ2VzIGxpbmtzIHRvIGl0cyBwYWdlIG9uIHRoYXQgc2l0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhY2thZ2VTaXRlczogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcGFja2FnZSdzIG9uZSBwdWJsaWMgZW50cnkgcG9pbnQsIGZvciBhIHBhY2thZ2UgdGhhdCBwdWJsaXNoZXMgaXRzIEFQSSBmcm9tIGEgYmFycmVsXG4gICAqIHJhdGhlciB0aGFuIG9uZSBpbXBvcnQgc3VicGF0aCBwZXIgbW9kdWxlLiBTZXQsIHRoZSByZWZlcmVuY2UgZG9jdW1lbnRzIG9ubHkgdGhlIGV4cG9ydHMgdGhhdCBiYXJyZWwgcmUtZXhwb3J0cyxcbiAgICogZm91bmQgYnkgZm9sbG93aW5nIGl0cyBgZXhwb3J0IC4uLiBmcm9tYCBzdGF0ZW1lbnRzIHJhdGhlciB0aGFuIGJ5IHdhbGtpbmcgdGhlIHNvdXJjZSBmb2xkZXIsIGFuZCBldmVyeSBpbXBvcnRcbiAgICogc3RhdGVtZW50IGltcG9ydHMgZnJvbSB0aGUgcGFja2FnZSByb290LiBBIG5hbWVzcGFjZSBzdGlsbCBncm91cHMgdGhlIHJlZmVyZW5jZSBieSBzb3VyY2UgbW9kdWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHVibGljQXBpRW50cnk/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBKU09OIGZpbGUgdGhlIGdlbmVyYXRlZCBTdGFybGlnaHQgc2lkZWJhciBpcyB3cml0dGVuIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgc2lkZWJhckZpbGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IHtAbGluayBBcGlEb2NTZXR0aW5ncy5pbXBvcnRTdGF0ZW1lbnR9IGlzIHRvbGQgYWJvdXQgdGhlIGV4cG9ydCB3aG9zZSBpbXBvcnQgc3RhdGVtZW50IGl0IGJ1aWxkcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbXBvcnRTdGF0ZW1lbnRDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSBzdGF0ZW1lbnQgdGhlIGdlbmVyYXRvciB3cml0ZXMgd2hlbiBubyBob29rIGlzIHNldCwgZS5nLlxuICAgKiBgaW1wb3J0IHR5cGUgeyBBbHBoYSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hbHBoYSc7YC5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRJbXBvcnRTdGF0ZW1lbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZXhwb3J0IGlzIGEgdHlwZSBvbmx5IChhbiBpbnRlcmZhY2UsIGEgdHlwZSBhbGlhcyBvciBhbiBlbnVtKSwgaW1wb3J0ZWQgd2l0aCBgaW1wb3J0IHR5cGVgLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNUeXBlT25seTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGV4cG9ydCdzIGtpbmQsIGUuZy4gYGNsYXNzYCwgYGZ1bmN0aW9uYCwgYGludGVyZmFjZWAuXG4gICAqL1xuICByZWFkb25seSBraW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBleHBvcnQncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZXhwb3J0J3MgbmFtZXNwYWNlOiBpdHMgc291cmNlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSBmb2xkZXIsIHdpdGhvdXQgaXRzIGV4dGVuc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzcGFjZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgaW1wb3J0IHN0YXRlbWVudCBvZiBhIGRvY3VtZW50ZWQgZXhwb3J0LlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGV4cG9ydC5cbiAqIEByZXR1cm5zIFRoZSBzdGF0ZW1lbnQsIG9yIGB1bmRlZmluZWRgIHRvIHNob3cgbm9uZS5cbiAqL1xuZXhwb3J0IHR5cGUgSW1wb3J0U3RhdGVtZW50UHJvdmlkZXIgPSAoY29udGV4dDogSW1wb3J0U3RhdGVtZW50Q29udGV4dCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY2FzZS1wcmVzZXJ2ZWQgcm91dGUgc2VnbWVudCBvZiBhIG1lbWJlcidzIHBhZ2UuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBBIHByb3BlcnR5J3MgbmFtZSwgb3IgYSBtZXRob2QncyBvdmVybG9hZCBrZXk6IGl0cyBuYW1lLCBvciBgb24oJ2NoYW5nZWQnKWAgZm9yIGFuIGV2ZW50IG1ldGhvZFxuICoga2V5ZWQgYnkgaXRzIGZpcnN0IGFyZ3VtZW50LlxuICogQHJldHVybnMgVGhlIHNlZ21lbnQsIG9yIGB1bmRlZmluZWRgIGZvciB0aGUgZ2VuZXJhdG9yJ3Mgb3duLlxuICovXG5leHBvcnQgdHlwZSBNZW1iZXJSb3V0ZVNlZ21lbnRQcm92aWRlciA9IChuYW1lOiBzdHJpbmcpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuaW50ZXJmYWNlIE1vZHVsZVN0YXRlIHtcbiAgc2V0dGluZ3M6IEFwaURvY1NldHRpbmdzIHwgdW5kZWZpbmVkO1xufVxuXG5jb25zdCBtb2R1bGVTdGF0ZTogTW9kdWxlU3RhdGUgPSB7XG4gIHNldHRpbmdzOiB1bmRlZmluZWRcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgc2V0dGluZ3MgZXZlcnkgbGF0ZXIgcGFnZSBhbmQgbGluayByZWFkcy5cbiAqXG4gKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVBcGlEb2NzKHNldHRpbmdzOiBBcGlEb2NTZXR0aW5ncyk6IHZvaWQge1xuICBtb2R1bGVTdGF0ZS5zZXR0aW5ncyA9IHNldHRpbmdzO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHNldHRpbmdzIHNldCBieSB7QGxpbmsgY29uZmlndXJlQXBpRG9jc30uXG4gKlxuICogQHJldHVybnMgVGhlIHNldHRpbmdzLlxuICogQHRocm93cyBJZiB7QGxpbmsgY29uZmlndXJlQXBpRG9jc30gaGFzIG5vdCBiZWVuIGNhbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFwaURvY1NldHRpbmdzKCk6IEFwaURvY1NldHRpbmdzIHtcbiAgaWYgKG1vZHVsZVN0YXRlLnNldHRpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBBUEkgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgaXMgbm90IGNvbmZpZ3VyZWQ6IGNhbGwgY29uZmlndXJlQXBpRG9jcygpIGZpcnN0LicpO1xuICB9XG5cbiAgcmV0dXJuIG1vZHVsZVN0YXRlLnNldHRpbmdzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFzSUEsTUFBTSxjQUEyQjtBQUFBLEVBQy9CLFVBQVU7QUFDWjtBQU9PLFNBQVMsaUJBQWlCLFVBQWdDO0FBQy9ELGNBQVksV0FBVztBQUN6QjtBQVFPLFNBQVMsb0JBQW9DO0FBQ2xELE1BQUksWUFBWSxhQUFhLFFBQVc7QUFDdEMsVUFBTSxJQUFJLE1BQU0sbUZBQW1GO0FBQUEsRUFDckc7QUFFQSxTQUFPLFlBQVk7QUFDckI7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -7,6 +7,23 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import type { SourceFile } from 'ts-morph';
|
|
9
9
|
import type { TypeInfo } from './api-doc-types.mjs';
|
|
10
|
+
/**
|
|
11
|
+
* A package's public API barrel, read by {@link readPublicApiBarrel}.
|
|
12
|
+
*/
|
|
13
|
+
export interface PublicApiBarrel {
|
|
14
|
+
/**
|
|
15
|
+
* The modules the barrel re-exports from, in barrel order: the entry files of the API reference.
|
|
16
|
+
*/
|
|
17
|
+
readonly files: readonly string[];
|
|
18
|
+
/**
|
|
19
|
+
* The qualified ids (`<namespace>#<name>`) of the exports the barrel forwards by name.
|
|
20
|
+
*/
|
|
21
|
+
readonly publicKeys: ReadonlySet<string>;
|
|
22
|
+
/**
|
|
23
|
+
* The namespaces of the modules the barrel re-exports whole (`export * from`).
|
|
24
|
+
*/
|
|
25
|
+
readonly wholeNamespaces: ReadonlySet<string>;
|
|
26
|
+
}
|
|
10
27
|
/**
|
|
11
28
|
* Collect top-level exported functions.
|
|
12
29
|
*
|
|
@@ -52,12 +69,21 @@ export declare function computeNamespace(srcDirectory: string, filePath: string)
|
|
|
52
69
|
*
|
|
53
70
|
* Excludes: `*.test.ts` (incl. `*.browser.test.ts` / `*.integration.test.ts`), `*.d.ts`,
|
|
54
71
|
* `index.ts`, `__merged.ts`, `setup.ts`, `*-setup.ts`, and any subtree under a `@types`,
|
|
55
|
-
* `styles`, or `test-helpers` directory
|
|
72
|
+
* `styles`, or `test-helpers` directory, or one of `excludedDirectories`.
|
|
56
73
|
*
|
|
57
74
|
* @param directory - The folder to search.
|
|
75
|
+
* @param excludedDirectories - Directory names excluded in addition to the defaults.
|
|
58
76
|
* @returns The entry files' paths.
|
|
59
77
|
*/
|
|
60
|
-
export declare function findEntryFiles(directory: string): string[];
|
|
78
|
+
export declare function findEntryFiles(directory: string, excludedDirectories?: readonly string[]): string[];
|
|
79
|
+
/**
|
|
80
|
+
* Drops every documented type the public API barrel does not re-export. Run it after `resolveInheritedMembers`, so
|
|
81
|
+
* a public class still inherits the members of an internal base class.
|
|
82
|
+
*
|
|
83
|
+
* @param types - The documented types, keyed by qualified id.
|
|
84
|
+
* @param barrel - The barrel, read by {@link readPublicApiBarrel}.
|
|
85
|
+
*/
|
|
86
|
+
export declare function keepPublicApi(types: Map<string, TypeInfo>, barrel: PublicApiBarrel): void;
|
|
61
87
|
/**
|
|
62
88
|
* Collects a source file's exported type aliases, enums, interfaces and classes.
|
|
63
89
|
*
|
|
@@ -66,9 +92,23 @@ export declare function findEntryFiles(directory: string): string[];
|
|
|
66
92
|
* @param namespace - The type's namespace.
|
|
67
93
|
*/
|
|
68
94
|
export declare function processSourceFile(src: SourceFile, types: Map<string, TypeInfo>, namespace: string): void;
|
|
95
|
+
/**
|
|
96
|
+
* Reads a package's public API barrel: the modules it re-exports from and the names it forwards.
|
|
97
|
+
*
|
|
98
|
+
* It is parsed on its own rather than through the ts-morph project, because the cache check needs the entry files
|
|
99
|
+
* before that project exists, and a cache hit must not pay for loading it.
|
|
100
|
+
*
|
|
101
|
+
* @param entryFile - The barrel, e.g. `<root>/src/index.ts`.
|
|
102
|
+
* @param sourceDirectory - The folder namespaces are relative to.
|
|
103
|
+
* @returns The barrel.
|
|
104
|
+
* @throws If the barrel re-exports a module that does not exist or belongs to another package, renames an export,
|
|
105
|
+
* or re-exports a module as a namespace: none of these can be documented under the name a consumer imports.
|
|
106
|
+
*/
|
|
107
|
+
export declare function readPublicApiBarrel(entryFile: string, sourceDirectory: string): PublicApiBarrel;
|
|
69
108
|
/**
|
|
70
109
|
* Register all type parameter names so renderTypeWithLinks won't hyperlink them.
|
|
71
|
-
* Skip names that are also known types — those should still be linkable.
|
|
110
|
+
* Skip names that are also known types — those should still be linkable. The site's `genericTypeParameters`
|
|
111
|
+
* are registered as given.
|
|
72
112
|
*
|
|
73
113
|
* @param types - The documented types, keyed by qualified id.
|
|
74
114
|
*/
|