@tscircuit/eval 0.0.545 → 0.0.547
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/blob-url.js +1 -1
- package/dist/eval/index.d.ts +13 -1
- package/dist/eval/index.js +19 -5
- package/dist/lib/index.d.ts +13 -1
- package/dist/lib/index.js +19 -5
- package/dist/webworker/entrypoint.js +3 -3
- package/dist/worker.d.ts +5 -0
- package/package.json +1 -1
package/dist/eval/index.js
CHANGED
|
@@ -992,7 +992,7 @@ ${cyclePath.join(
|
|
|
992
992
|
const platformConfig = ctx.circuit.platform;
|
|
993
993
|
staticUrl = `${platformConfig?.projectBaseUrl ?? ""}/${fsPath.startsWith("./") ? fsPath.slice(2) : fsPath}`;
|
|
994
994
|
} else if (fileContent.startsWith("blob:")) {
|
|
995
|
-
staticUrl = fileContent
|
|
995
|
+
staticUrl = `${fileContent}#ext=${fsPath.split(".").pop()}`;
|
|
996
996
|
} else {
|
|
997
997
|
const blob = new Blob([fileContent], {
|
|
998
998
|
type: fsPath.endsWith(".kicad_mod") ? "text/plain" : "application/octet-stream"
|
|
@@ -1062,7 +1062,13 @@ ${cyclePath.join(
|
|
|
1062
1062
|
async function importSnippet(importName, ctx, depth = 0) {
|
|
1063
1063
|
const { preSuppliedImports } = ctx;
|
|
1064
1064
|
const fullSnippetName = importName.replace("@tsci/", "").replace(".", "/");
|
|
1065
|
-
const
|
|
1065
|
+
const fetchOptions = {};
|
|
1066
|
+
if (ctx.sessionToken) {
|
|
1067
|
+
fetchOptions.headers = {
|
|
1068
|
+
Authorization: `Bearer ${ctx.sessionToken}`
|
|
1069
|
+
};
|
|
1070
|
+
}
|
|
1071
|
+
const { cjs, error } = await globalThis.fetch(`${ctx.cjsRegistryUrl}/${fullSnippetName}`, fetchOptions).then(async (res) => ({ cjs: await res.text(), error: null })).catch((e) => ({ error: e, cjs: null }));
|
|
1066
1072
|
if (error) {
|
|
1067
1073
|
console.error("Error fetching import", importName, error);
|
|
1068
1074
|
return;
|
|
@@ -1748,6 +1754,9 @@ var CircuitRunner = class {
|
|
|
1748
1754
|
value
|
|
1749
1755
|
);
|
|
1750
1756
|
}
|
|
1757
|
+
async setSessionToken(token) {
|
|
1758
|
+
this._circuitRunnerConfiguration.sessionToken = token;
|
|
1759
|
+
}
|
|
1751
1760
|
async enableDebug(namespace) {
|
|
1752
1761
|
this._debugNamespace = namespace;
|
|
1753
1762
|
if (this._executionContext) {
|
|
@@ -1776,7 +1785,11 @@ export default () => (
|
|
|
1776
1785
|
);
|
|
1777
1786
|
}
|
|
1778
1787
|
const filesystem = typeof filesystemOrCodeString === "string" ? { "user-code.tsx": filesystemOrCodeString } : filesystemOrCodeString;
|
|
1779
|
-
const
|
|
1788
|
+
const runnerConfig = {};
|
|
1789
|
+
if (opts?.sessionToken) {
|
|
1790
|
+
runnerConfig.sessionToken = opts.sessionToken;
|
|
1791
|
+
}
|
|
1792
|
+
const circuitRunner = new CircuitRunner(runnerConfig);
|
|
1780
1793
|
await circuitRunner.executeWithFsMap({
|
|
1781
1794
|
fsMap: filesystem,
|
|
1782
1795
|
...opts
|
|
@@ -1813,7 +1826,8 @@ var runTscircuitModule = async (module, opts = {}) => {
|
|
|
1813
1826
|
`
|
|
1814
1827
|
},
|
|
1815
1828
|
{
|
|
1816
|
-
mainComponentProps: opts.props
|
|
1829
|
+
mainComponentProps: opts.props,
|
|
1830
|
+
sessionToken: opts.sessionToken
|
|
1817
1831
|
}
|
|
1818
1832
|
);
|
|
1819
1833
|
return circuitJson;
|
|
@@ -1825,4 +1839,4 @@ export {
|
|
|
1825
1839
|
runTscircuitCode,
|
|
1826
1840
|
runTscircuitModule
|
|
1827
1841
|
};
|
|
1828
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbGliL2V2YWwvZXhlY3V0aW9uLWNvbnRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1qbGMtcGFja2FnZS1mcm9tLWZvb3RwcmludGVyLXN0cmluZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2psYy1wYXJ0cy1lbmdpbmUudHMiLCAiLi4vLi4vbGliL2dldFBsYXRmb3JtQ29uZmlnLnRzIiwgIi4uLy4uL2xpYi91dGlscy9keW5hbWljYWxseS1sb2FkLWRlcGVuZGVuY3ktd2l0aC1jZG4tYmFja3VwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvbm9ybWFsaXplRnNNYXAudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci90c2NvbmZpZ1BhdGhzLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcmVzb2x2ZUZpbGVQYXRoLnRzIiwgIi4uLy4uL2xpYi91dGlscy9zdHJpcC1jb21tZW50cy50cyIsICIuLi8uLi9saWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlLnRzIiwgIi4uLy4uL2xpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlLnRzIiwgIi4uLy4uL2xpYi9ldmFsL2V2YWwtY29tcGlsZWQtanMudHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LWxvY2FsLWZpbGUudHMiLCAiLi4vLi4vbGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9ucy50cyIsICIuLi8uLi9saWIvdHJhbnNwaWxlL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2UudHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LXNuaXBwZXQudHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LW5vZGUtbW9kdWxlLnRzIiwgIi4uLy4uL2xpYi9ldmFsL2V4dHJhY3RCYXNlUGFja2FnZU5hbWUudHMiLCAiLi4vLi4vbGliL2V2YWwvaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uLnRzIiwgIi4uLy4uL2xpYi9ldmFsL2dldE5vZGVNb2R1bGVEaXJlY3RvcnkudHMiLCAiLi4vLi4vbGliL2V2YWwvZ2V0UGFja2FnZUpzb25FbnRyeXBvaW50LnRzIiwgIi4uLy4uL2xpYi9ldmFsL2lzVHlwZVNjcmlwdEVudHJ5cG9pbnQudHMiLCAiLi4vLi4vbGliL2V2YWwvaXNEaXN0RGlyRW1wdHkudHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LW5wbS1wYWNrYWdlLWZyb20tY2RuLnRzIiwgIi4uLy4uL2xpYi9ldmFsL2ltcG9ydC1ldmFsLXBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9DaXJjdWl0UnVubmVyLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkLnRzIiwgIi4uLy4uL2xpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvci50cyIsICIuLi8uLi9saWIvc2hhcmVkL29iai1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0Q29kZS50cyIsICIuLi8uLi9saWIvcnVubmVyL3J1blRzY2lyY3VpdE1vZHVsZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCB0eXBlIHsgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9IGZyb20gXCJsaWIvc2hhcmVkL3R5cGVzXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdENvcmUgZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0ICogYXMgUmVhY3RKc3hSdW50aW1lIGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiXG5pbXBvcnQgKiBhcyB0c2NpcmN1aXRNYXRoVXRpbHMgZnJvbSBcIkB0c2NpcmN1aXQvbWF0aC11dGlsc1wiXG5pbXBvcnQgdHlwZSB7IFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0UGxhdGZvcm1Db25maWcgfSBmcm9tIFwibGliL2dldFBsYXRmb3JtQ29uZmlnXCJcbmltcG9ydCB0eXBlIHsgVHNDb25maWcgfSBmcm9tIFwibGliL3J1bm5lci90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCAqIGFzIHRzbGliIGZyb20gXCJ0c2xpYlwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpleGVjdXRpb24tY29udGV4dFwiKVxuXG5pbnRlcmZhY2UgU3RvcmVkTG9nZ2VyIHtcbiAgaW5mbzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxuICBnZXRMb2dzOiAoKSA9PiBBcnJheTx7IG1zZzogc3RyaW5nIH0+XG4gIHN0cmluZ2lmeUxvZ3M6ICgpID0+IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZW50cnlwb2ludDogc3RyaW5nXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PlxuICBjaXJjdWl0OiBSb290Q2lyY3VpdFxuICBsb2dnZXI6IFN0b3JlZExvZ2dlclxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsXG4gIGltcG9ydFN0YWNrOiBzdHJpbmdbXVxuICBjdXJyZW50bHlJbXBvcnRpbmc6IFNldDxzdHJpbmc+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICB3ZWJXb3JrZXJDb25maWd1cmF0aW9uOiBXZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICBvcHRzOiB7XG4gICAgbmFtZT86IHN0cmluZ1xuICAgIHBsYXRmb3JtPzogUGxhdGZvcm1Db25maWdcbiAgICBwcm9qZWN0Q29uZmlnPzogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz5cbiAgICBkZWJ1Z05hbWVzcGFjZT86IHN0cmluZ1xuICB9ID0ge30sXG4pOiBFeGVjdXRpb25Db250ZXh0IHtcbiAgZ2xvYmFsVGhpcy5SZWFjdCA9IFJlYWN0XG5cbiAgY29uc3QgYmFzZVBsYXRmb3JtID0gb3B0cy5wbGF0Zm9ybSB8fCBnZXRQbGF0Zm9ybUNvbmZpZygpXG4gIGNvbnN0IHBsYXRmb3JtID0gb3B0cy5wcm9qZWN0Q29uZmlnXG4gICAgPyB7IC4uLmJhc2VQbGF0Zm9ybSwgLi4ub3B0cy5wcm9qZWN0Q29uZmlnIH1cbiAgICA6IGJhc2VQbGF0Zm9ybVxuXG4gIGlmIChwbGF0Zm9ybS5wYXJ0c0VuZ2luZURpc2FibGVkKSB7XG4gICAgcGxhdGZvcm0ucGFydHNFbmdpbmUgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNpcmN1aXQgPSBuZXcgUm9vdENpcmN1aXQoe1xuICAgIHBsYXRmb3JtLFxuICB9KVxuXG4gIGlmIChvcHRzLm5hbWUpIHtcbiAgICBjaXJjdWl0Lm5hbWUgPSBvcHRzLm5hbWVcbiAgfVxuXG4gIGlmIChvcHRzLmRlYnVnTmFtZXNwYWNlKSB7XG4gICAgY2lyY3VpdC5lbmFibGVEZWJ1ZyhvcHRzLmRlYnVnTmFtZXNwYWNlKVxuICB9XG5cbiAgY29uc3QgbG9nczogQXJyYXk8eyBtc2c6IHN0cmluZyB9PiA9IFtdXG5cbiAgcmV0dXJuIHtcbiAgICBmc01hcDoge30sXG4gICAgZW50cnlwb2ludDogXCJcIixcbiAgICBsb2dnZXI6IHtcbiAgICAgIGluZm86IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbG9ncy5wdXNoKHsgbXNnOiBtZXNzYWdlIH0pXG4gICAgICB9LFxuICAgICAgZ2V0TG9nczogKCkgPT4gbG9ncyxcbiAgICAgIHN0cmluZ2lmeUxvZ3M6ICgpID0+IGxvZ3MubWFwKChsb2cpID0+IGxvZy5tc2cpLmpvaW4oXCJcXG5cIiksXG4gICAgfSxcbiAgICBwcmVTdXBwbGllZEltcG9ydHM6IHtcbiAgICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IHRzY2lyY3VpdENvcmUsXG4gICAgICB0c2NpcmN1aXQ6IHRzY2lyY3VpdENvcmUsXG4gICAgICBcIkB0c2NpcmN1aXQvbWF0aC11dGlsc1wiOiB0c2NpcmN1aXRNYXRoVXRpbHMsXG4gICAgICByZWFjdDogUmVhY3QsXG4gICAgICBcInJlYWN0L2pzeC1ydW50aW1lXCI6IFJlYWN0SnN4UnVudGltZSxcbiAgICAgIGRlYnVnOiBEZWJ1ZyxcbiAgICAgIHRzbGliLFxuXG4gICAgICAvLyBUaGlzIGlzIHVzdWFsbHkgdXNlZCBhcyBhIHR5cGUgaW1wb3J0LCB3ZSBjYW4gcmVtb3ZlIHRoZSBzaGltIHdoZW4gd2VcbiAgICAgIC8vIGlnbm9yZSB0eXBlIGltcG9ydHMgaW4gZ2V0SW1wb3J0c0Zyb21Db2RlXG4gICAgICBcIkB0c2NpcmN1aXQvcHJvcHNcIjoge30sXG4gICAgfSxcbiAgICBjaXJjdWl0LFxuICAgIHRzQ29uZmlnOiBudWxsLFxuICAgIGltcG9ydFN0YWNrOiBbXSxcbiAgICBjdXJyZW50bHlJbXBvcnRpbmc6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgIC4uLndlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIH1cbn1cbiIsICIvKipcbiAqIFRyYW5zZm9ybXMgYSBLaUNhZCBmb290cHJpbnQgc3RyaW5nIGludG8gYSBnZW5lcmljIFwiZm9vdHByaW50ZXIgc3RyaW5nXCIuXG4gKiBGb3Igbm93LCB0aGlzIGlzIGEgc2ltcGxpZmllZCBjb252ZXJzaW9uIHRvIGEgc3RhbmRhcmQgcGFja2FnZSBuYW1lLlxuICogZS5nLiBcImtpY2FkOlJlc2lzdG9yX1NNRDpSXzA2MDNfMTYwOE1ldHJpY1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGb290cHJpbnRlclN0cmluZ0Zyb21LaWNhZCA9IChcbiAga2ljYWRGb290cHJpbnQ6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIC8vIGtpY2FkOlJlc2lzdG9yX1NNRDpSXzA2MDNfMTYwOE1ldHJpYyAtPiAwNjAzXG4gIGxldCBtYXRjaCA9IGtpY2FkRm9vdHByaW50Lm1hdGNoKC86W1JDXV8oXFxkezR9KV8vKVxuICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaFsxXVxuXG4gIC8vIGtpY2FkOlBhY2thZ2VfU086U09JQy04XzMuOXg0LjltbV9QMS4yN21tIC0+IFNPSUMtOFxuICAvLyBraWNhZDpQYWNrYWdlX1RPX1NPVF9TTUQ6U09ULTIzIC0+IFNPVC0yM1xuICBtYXRjaCA9IGtpY2FkRm9vdHByaW50Lm1hdGNoKFxuICAgIC86KFNPSUMtXFxkK3xTT1QtXFxkK3xTT0QtXFxkK3xTU09QLVxcZCt8VFNTT1AtXFxkK3xRRlAtXFxkK3xRRk4tXFxkKykvLFxuICApXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIiBpbnRvIGEgSkxDLWNvbXBhdGlibGUgcGFja2FnZSBuYW1lLlxuICogZS5nLiBcImNhcDA2MDNcIiAtPiBcIjA2MDNcIlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjUGFja2FnZUZyb21Gb290cHJpbnRlclN0cmluZyA9IChcbiAgZm9vdHByaW50ZXJTdHJpbmc6IHN0cmluZyxcbik6IHN0cmluZyA9PiB7XG4gIGlmIChmb290cHJpbnRlclN0cmluZy5pbmNsdWRlcyhcImNhcFwiKSkge1xuICAgIHJldHVybiBmb290cHJpbnRlclN0cmluZy5yZXBsYWNlKC9jYXAvZywgXCJcIilcbiAgfVxuICByZXR1cm4gZm9vdHByaW50ZXJTdHJpbmdcbn1cbiIsICJpbXBvcnQgeyBnZXRGb290cHJpbnRlclN0cmluZ0Zyb21LaWNhZCB9IGZyb20gXCIuL2dldC1mb290cHJpbnRlci1zdHJpbmctZnJvbS1raWNhZFwiXG5pbXBvcnQgeyBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nIH0gZnJvbSBcIi4vZ2V0LWpsYy1wYWNrYWdlLWZyb20tZm9vdHByaW50ZXItc3RyaW5nXCJcblxuLyoqXG4gKiBHZXQgYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUgZnJvbSBhIGZvb3RwcmludCBzdHJpbmcsIHdoaWNoIGNvdWxkIGJlXG4gKiBhIEtpQ2FkIGZvb3RwcmludCBvciBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEpsY3BjYlBhY2thZ2VOYW1lID0gKFxuICBmb290cHJpbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghZm9vdHByaW50KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgaWYgKGZvb3RwcmludC5zdGFydHNXaXRoKFwia2ljYWQ6XCIpKSB7XG4gICAgY29uc3QgZm9vdHByaW50ZXJTdHJpbmcgPSBnZXRGb290cHJpbnRlclN0cmluZ0Zyb21LaWNhZChmb290cHJpbnQpXG4gICAgaWYgKGZvb3RwcmludGVyU3RyaW5nKSB7XG4gICAgICByZXR1cm4gZ2V0SmxjUGFja2FnZUZyb21Gb290cHJpbnRlclN0cmluZyhmb290cHJpbnRlclN0cmluZylcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgdW4tbWF0Y2hlZCBLaUNhZCBzdHJpbmdzXG4gICAgcmV0dXJuIGZvb3RwcmludFxuICB9XG5cbiAgLy8gTm90IGEgS2lDYWQgc3RyaW5nLCBhc3N1bWUgaXQncyBhIGZvb3RwcmludGVyIHN0cmluZ1xuICByZXR1cm4gZ2V0SmxjUGFja2FnZUZyb21Gb290cHJpbnRlclN0cmluZyhmb290cHJpbnQpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQYXJ0c0VuZ2luZSwgU3VwcGxpZXJQYXJ0TnVtYmVycyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGdldEpsY3BjYlBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZm9vdHByaW50LXRyYW5zbGF0b3JzL2luZGV4XCJcblxuZXhwb3J0IGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKVxuXG5jb25zdCBnZXRKbGNQYXJ0c0NhY2hlZCA9IGFzeW5jIChuYW1lOiBhbnksIHBhcmFtczogYW55KSA9PiB7XG4gIGNvbnN0IHBhcmFtU3RyaW5nID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgLi4ucGFyYW1zLFxuICAgIGpzb246IFwidHJ1ZVwiLFxuICB9KS50b1N0cmluZygpXG4gIGlmIChjYWNoZS5oYXMocGFyYW1TdHJpbmcpKSB7XG4gICAgcmV0dXJuIGNhY2hlLmdldChwYXJhbVN0cmluZylcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgIGBodHRwczovL2psY3NlYXJjaC50c2NpcmN1aXQuY29tLyR7bmFtZX0vbGlzdD8ke3BhcmFtU3RyaW5nfWAsXG4gIClcbiAgY29uc3QgcmVzcG9uc2VKc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gIGNhY2hlLnNldChwYXJhbVN0cmluZywgcmVzcG9uc2VKc29uKVxuICByZXR1cm4gcmVzcG9uc2VKc29uXG59XG5cbmNvbnN0IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlID0gKHBhcnRzOiBhbnlbXSB8IHVuZGVmaW5lZCkgPT4ge1xuICBpZiAoIXBhcnRzKSByZXR1cm4gW11cbiAgcmV0dXJuIFsuLi5wYXJ0c10uc29ydChcbiAgICAoYSwgYikgPT4gTnVtYmVyKGIuaXNfYmFzaWMgPz8gZmFsc2UpIC0gTnVtYmVyKGEuaXNfYmFzaWMgPz8gZmFsc2UpLFxuICApXG59XG5cbmV4cG9ydCBjb25zdCBqbGNQYXJ0c0VuZ2luZTogUGFydHNFbmdpbmUgPSB7XG4gIGZpbmRQYXJ0OiBhc3luYyAoe1xuICAgIHNvdXJjZUNvbXBvbmVudCxcbiAgICBmb290cHJpbnRlclN0cmluZyxcbiAgfSk6IFByb21pc2U8U3VwcGxpZXJQYXJ0TnVtYmVycz4gPT4ge1xuICAgIGNvbnN0IGpsY3BjYlBhY2thZ2UgPSBnZXRKbGNwY2JQYWNrYWdlTmFtZShmb290cHJpbnRlclN0cmluZylcblxuICAgIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNpc3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHJlc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJyZXNpc3RvcnNcIiwge1xuICAgICAgICByZXNpc3RhbmNlOiBzb3VyY2VDb21wb25lbnQucmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocmVzaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2NhcGFjaXRvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNhcGFjaXRvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY2FwYWNpdG9yc1wiLCB7XG4gICAgICAgIGNhcGFjaXRhbmNlOiBzb3VyY2VDb21wb25lbnQuY2FwYWNpdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNhcGFjaXRvcnMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcGluX2hlYWRlclwiXG4gICAgKSB7XG4gICAgICBsZXQgcGl0Y2g6IG51bWJlciB8IHVuZGVmaW5lZFxuICAgICAgaWYgKGZvb3RwcmludGVyU3RyaW5nPy5pbmNsdWRlcyhcIl9wXCIpKSB7XG4gICAgICAgIHBpdGNoID0gTnVtYmVyKGZvb3RwcmludGVyU3RyaW5nLnNwbGl0KFwiX3BcIilbMV0pXG4gICAgICB9XG4gICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFxuICAgICAgICBcImhlYWRlcnNcIixcbiAgICAgICAgcGl0Y2hcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgICAgICAgICBudW1fcGluczogc291cmNlQ29tcG9uZW50LnBpbl9jb3VudCxcbiAgICAgICAgICAgICAgZ2VuZGVyOiBzb3VyY2VDb21wb25lbnQuZ2VuZGVyLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBudW1fcGluczogc291cmNlQ29tcG9uZW50LnBpbl9jb3VudCxcbiAgICAgICAgICAgICAgZ2VuZGVyOiBzb3VyY2VDb21wb25lbnQuZ2VuZGVyLFxuICAgICAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoaGVhZGVycylcbiAgICAgICAgICAubWFwKChoOiBhbnkpID0+IGBDJHtoLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9wb3RlbnRpb21ldGVyXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcG90ZW50aW9tZXRlcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG90ZW50aW9tZXRlcnNcIiwge1xuICAgICAgICByZXNpc3RhbmNlOiBzb3VyY2VDb21wb25lbnQubWF4X3Jlc2lzdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShwb3RlbnRpb21ldGVycylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9kaW9kZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGRpb2RlcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJkaW9kZXNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoZGlvZGVzKVxuICAgICAgICAgIC5tYXAoKGQ6IGFueSkgPT4gYEMke2QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2NoaXBcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBjaGlwcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjaGlwc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShjaGlwcylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV90cmFuc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgdHJhbnNpc3RvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwidHJhbnNpc3RvcnNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgICB0cmFuc2lzdG9yX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50cmFuc2lzdG9yX3R5cGUsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZSh0cmFuc2lzdG9ycylcbiAgICAgICAgICAubWFwKCh0OiBhbnkpID0+IGBDJHt0Lmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9wb3dlcl9zb3VyY2VcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3dlcl9zb3VyY2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInBvd2VyX3NvdXJjZXNcIiwge1xuICAgICAgICB2b2x0YWdlOiBzb3VyY2VDb21wb25lbnQudm9sdGFnZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvd2VyX3NvdXJjZXMpXG4gICAgICAgICAgLm1hcCgocDogYW55KSA9PiBgQyR7cC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfaW5kdWN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBpbmR1Y3RvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiaW5kdWN0b3JzXCIsIHtcbiAgICAgICAgaW5kdWN0YW5jZTogc291cmNlQ29tcG9uZW50LmluZHVjdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShpbmR1Y3RvcnMpXG4gICAgICAgICAgLm1hcCgoaTogYW55KSA9PiBgQyR7aS5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY3J5c3RhbFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNyeXN0YWxzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNyeXN0YWxzXCIsIHtcbiAgICAgICAgZnJlcXVlbmN5OiBzb3VyY2VDb21wb25lbnQuZnJlcXVlbmN5LFxuICAgICAgICBsb2FkX2NhcGFjaXRhbmNlOiBzb3VyY2VDb21wb25lbnQubG9hZF9jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNyeXN0YWxzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX21vc2ZldFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IG1vc2ZldHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwibW9zZmV0c1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIG1vc2ZldF9tb2RlOiBzb3VyY2VDb21wb25lbnQubW9zZmV0X21vZGUsXG4gICAgICAgIGNoYW5uZWxfdHlwZTogc291cmNlQ29tcG9uZW50LmNoYW5uZWxfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKG1vc2ZldHMpXG4gICAgICAgICAgLm1hcCgobTogYW55KSA9PiBgQyR7bS5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcmVzb25hdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzb25hdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJyZXNvbmF0b3JzXCIsIHtcbiAgICAgICAgZnJlcXVlbmN5OiBzb3VyY2VDb21wb25lbnQuZnJlcXVlbmN5LFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocmVzb25hdG9ycylcbiAgICAgICAgICAubWFwKChyOiBhbnkpID0+IGBDJHtyLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9zd2l0Y2hcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBzd2l0Y2hlcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJzd2l0Y2hlc1wiLCB7XG4gICAgICAgIHN3aXRjaF90eXBlOiBzb3VyY2VDb21wb25lbnQudHlwZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHN3aXRjaGVzKVxuICAgICAgICAgIC5tYXAoKHM6IGFueSkgPT4gYEMke3MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2xlZFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGxlZHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwibGVkc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShsZWRzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Z1c2VcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBmdXNlcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJmdXNlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShmdXNlcylcbiAgICAgICAgICAubWFwKChsOiBhbnkpID0+IGBDJHtsLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fVxuICB9LFxufVxuIiwgImltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcsIFNwaWNlRW5naW5lIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgamxjUGFydHNFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmVcIlxuaW1wb3J0IHsgcGFyc2VLaWNhZE1vZFRvQ2lyY3VpdEpzb24gfSBmcm9tIFwia2ljYWQtY29tcG9uZW50LWNvbnZlcnRlclwiXG5pbXBvcnQgeyBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cCB9IGZyb20gXCIuL3V0aWxzL2R5bmFtaWNhbGx5LWxvYWQtZGVwZW5kZW5jeS13aXRoLWNkbi1iYWNrdXBcIlxuY29uc3QgS0lDQURfRk9PVFBSSU5UX0NBQ0hFX1VSTCA9IFwiaHR0cHM6Ly9raWNhZC1tb2QtY2FjaGUudHNjaXJjdWl0LmNvbVwiXG5cbmxldCBuZ3NwaWNlRW5naW5lQ2FjaGU6IFNwaWNlRW5naW5lIHwgbnVsbCA9IG51bGxcblxuZXhwb3J0IGNvbnN0IGdldFBsYXRmb3JtQ29uZmlnID0gKCk6IFBsYXRmb3JtQ29uZmlnID0+ICh7XG4gIHBhcnRzRW5naW5lOiBqbGNQYXJ0c0VuZ2luZSxcbiAgc3BpY2VFbmdpbmVNYXA6IHtcbiAgICBuZ3NwaWNlOiB7XG4gICAgICBzaW11bGF0ZTogYXN5bmMgKHNwaWNlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKCFuZ3NwaWNlRW5naW5lQ2FjaGUpIHtcbiAgICAgICAgICBjb25zdCBjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUgPVxuICAgICAgICAgICAgYXdhaXQgZHluYW1pY2FsbHlMb2FkRGVwZW5kZW5jeVdpdGhDZG5CYWNrdXAoXG4gICAgICAgICAgICAgIFwiQHRzY2lyY3VpdC9uZ3NwaWNlLXNwaWNlLWVuZ2luZVwiLFxuICAgICAgICAgICAgKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ291bGQgbm90IGxvYWQgbmdzcGljZSBlbmdpbmUgZnJvbSBsb2NhbCBub2RlX21vZHVsZXMgb3IgQ0ROIGZhbGxiYWNrLlwiLFxuICAgICAgICAgICAgICAgIHsgY2F1c2U6IGVycm9yIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAoY3JlYXRlTmdzcGljZVNwaWNlRW5naW5lKSB7XG4gICAgICAgICAgICBuZ3NwaWNlRW5naW5lQ2FjaGUgPSBhd2FpdCBjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmdzcGljZUVuZ2luZUNhY2hlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJDb3VsZCBub3QgbG9hZCBuZ3NwaWNlIGVuZ2luZSBmcm9tIGxvY2FsIG5vZGVfbW9kdWxlcyBvciBDRE4gZmFsbGJhY2suXCIsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5nc3BpY2VFbmdpbmVDYWNoZS5zaW11bGF0ZShzcGljZSlcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgZm9vdHByaW50TGlicmFyeU1hcDoge1xuICAgIGtpY2FkOiBhc3luYyAoZm9vdHByaW50TmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBiYXNlVXJsID0gYCR7S0lDQURfRk9PVFBSSU5UX0NBQ0hFX1VSTH0vJHtmb290cHJpbnROYW1lfWBcbiAgICAgIGNvbnN0IGNpcmN1aXRKc29uVXJsID0gYCR7YmFzZVVybH0uY2lyY3VpdC5qc29uYFxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goY2lyY3VpdEpzb25VcmwpXG4gICAgICBjb25zdCByYXcgPSBhd2FpdCByZXMuanNvbigpXG4gICAgICAvLyBGaWx0ZXIgcGNiX3NpbGtzY3JlZW5fdGV4dCB0byBvbmx5IGtlZXAgZW50cmllcyB3aXRoIHRleHQgPT09IFwiUkVGKipcIlxuICAgICAgLy8gQXBwbHkgZmlsdGVyaW5nIG9ubHkgdG8gZWxlbWVudHMgY29taW5nIGZyb20gdGhlIGtpY2FkX21vZF9zZXJ2ZXIgcmVzcG9uc2VcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gQXJyYXkuaXNBcnJheShyYXcpXG4gICAgICAgID8gcmF3LmZpbHRlcigoZWwpID0+XG4gICAgICAgICAgICBlbD8udHlwZSA9PT0gXCJwY2Jfc2lsa3NjcmVlbl90ZXh0XCIgPyBlbD8udGV4dCA9PT0gXCJSRUYqKlwiIDogdHJ1ZSxcbiAgICAgICAgICApXG4gICAgICAgIDogcmF3XG4gICAgICBjb25zdCB3cmxVcmwgPSBgJHtiYXNlVXJsfS53cmxgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb290cHJpbnRDaXJjdWl0SnNvbjogZmlsdGVyZWQsXG4gICAgICAgIGNhZE1vZGVsOiB7IHdybFVybCwgbW9kZWxVbml0VG9NbVNjYWxlOiAyLjU0IH0sXG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgZm9vdHByaW50RmlsZVBhcnNlck1hcDoge1xuICAgIGtpY2FkX21vZDoge1xuICAgICAgbG9hZEZyb21Vcmw6IGFzeW5jICh1cmw6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBraWNhZENvbnRlbnQgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4oKHJlcykgPT4gcmVzLnRleHQoKSlcbiAgICAgICAgY29uc3Qga2ljYWRKc29uID0gYXdhaXQgcGFyc2VLaWNhZE1vZFRvQ2lyY3VpdEpzb24oa2ljYWRDb250ZW50KVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBBcnJheS5pc0FycmF5KGtpY2FkSnNvbilcbiAgICAgICAgICAgID8ga2ljYWRKc29uXG4gICAgICAgICAgICA6IFtraWNhZEpzb25dLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KVxuIiwgImV4cG9ydCBjb25zdCBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cCA9IGFzeW5jIChcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8YW55PiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gRmlyc3QsIHRyeSB0byBpbXBvcnQgdXNpbmcgTm9kZS5qcyByZXNvbHV0aW9uXG4gICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KHBhY2thZ2VOYW1lKVxuICAgIHJldHVybiBtb2R1bGUuZGVmYXVsdFxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coYEZhaWxlZCB0byBsb2FkICR7cGFja2FnZU5hbWV9IGxvY2FsbHksIHRyeWluZyBDRE4gZmFsbGJhY2suLi5gKVxuICAgIC8vIEZhbGxiYWNrIHRvIEpzRGVsaXZyIENETiBmb3IgYnJvd3NlciBlbnZpcm9ubWVudHNcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtLyR7cGFja2FnZU5hbWV9Lytlc21gLFxuICAgICAgKVxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggJHtwYWNrYWdlTmFtZX0gZnJvbSBDRE46ICR7cmVzLnN0YXR1c1RleHR9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgY29uc3QgY29kZSA9IGF3YWl0IHJlcy50ZXh0KClcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY29kZV0sIHsgdHlwZTogXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgfSlcbiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgZGVmYXVsdDogbG9hZGVkTW9kdWxlIH0gPSBhd2FpdCBpbXBvcnQodXJsKVxuICAgICAgICByZXR1cm4gbG9hZGVkTW9kdWxlXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjZG5FcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgQ0ROIGZhbGxiYWNrIGZvciAke3BhY2thZ2VOYW1lfSBhbHNvIGZhaWxlZDpgLCBjZG5FcnJvcilcbiAgICAgIHRocm93IGNkbkVycm9yXG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZpbGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgbGV0IG5vcm1GaWxlUGF0aCA9IGZpbGVQYXRoXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGgudHJpbSgpXG4gIGlmIChub3JtRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDIpXG4gIH1cbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC5zbGljZSgxKVxuICB9XG4gIHJldHVybiBub3JtRmlsZVBhdGhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZzTWFwKGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRGc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgW2ZzUGF0aCwgZmlsZUNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGZzTWFwKSkge1xuICAgIG5vcm1hbGl6ZWRGc01hcFtub3JtYWxpemVGaWxlUGF0aChmc1BhdGgpXSA9IGZpbGVDb250ZW50XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWRGc01hcFxufVxuIiwgIi8qKlxuICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgYSBwYXRoLCBzaW1pbGFyIHRvIE5vZGUuanMgcGF0aC5kaXJuYW1lXG4gKiBXb3JrcyBvbiBib3RoIFVuaXggYW5kIFdpbmRvd3MgcGF0aHNcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGV4dHJhY3QgdGhlIGRpcmVjdG9yeSBmcm9tXG4gKiBAcmV0dXJucyBUaGUgZGlyZWN0b3J5IHBhcnQgb2YgdGhlIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcm5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gXCIuXCJcblxuICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIHRvIGZvcndhcmQgc2xhc2hlc1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcblxuICAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlc1xuICBjb25zdCBjbGVhblBhdGggPSBub3JtYWxpemVkUGF0aC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG5cbiAgLy8gSWYgdGhlcmUgYXJlIG5vIHNsYXNoZXMsIHJldHVybiBcIi5cIlxuICBpZiAoY2xlYW5QYXRoLmluZGV4T2YoXCIvXCIpID09PSAtMSkgcmV0dXJuIFwiLlwiXG5cbiAgLy8gUmV0dXJuIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGxhc3Qgc2xhc2hcbiAgcmV0dXJuIGNsZWFuUGF0aC5zdWJzdHJpbmcoMCwgY2xlYW5QYXRoLmxhc3RJbmRleE9mKFwiL1wiKSkgfHwgXCIvXCJcbn1cbiIsICJpbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcIi4vZGlybmFtZVwiXG5cbi8qKlxuICogUmVzb2x2ZSBhbiBpbXBvcnRQYXRoIHJlbGF0aXZlIHRvIGEgY3dkLCBzdXBwb3J0aW5nIC4uLywgLi8gYW5kIGFic29sdXRlIHBhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSGFuZGxlIHBhcmVudCBkaXJlY3RvcnkgbmF2aWdhdGlvblxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyID0gZGlybmFtZShjd2QpXG4gICAgcmV0dXJuIHJlc29sdmVSZWxhdGl2ZVBhdGgoaW1wb3J0UGF0aC5zbGljZSgzKSwgcGFyZW50RGlyKVxuICB9XG4gIC8vIEhhbmRsZSBjdXJyZW50IGRpcmVjdG9yeVxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDIpLCBjd2QpXG4gIH1cbiAgLy8gSGFuZGxlIGFic29sdXRlIHBhdGhcbiAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICByZXR1cm4gaW1wb3J0UGF0aC5zbGljZSgxKVxuICB9XG4gIC8vIEhhbmRsZSByZWxhdGl2ZSBwYXRoXG4gIHJldHVybiBgJHtjd2R9LyR7aW1wb3J0UGF0aH1gXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5cbmV4cG9ydCB0eXBlIFRzQ29uZmlnID0ge1xuICBjb21waWxlck9wdGlvbnM/OiB7XG4gICAgYmFzZVVybD86IHN0cmluZ1xuICAgIHBhdGhzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxuICB9XG4gIGV4dGVuZHM/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICBmaWxlcz86IHN0cmluZ1tdXG4gIHJlZmVyZW5jZXM/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgaW5jbHVkZT86IHN0cmluZ1tdXG4gIGV4Y2x1ZGU/OiBzdHJpbmdbXVxuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc0NvbmZpZyhcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuKTogVHNDb25maWcgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocykpIHJldHVybiBudWxsXG4gIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IGZzTWFwT3JBbGxGaWxlUGF0aHNbXCJ0c2NvbmZpZy5qc29uXCJdXG4gIGlmICghdHNjb25maWdDb250ZW50KSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSB0c2NvbmZpZ0NvbnRlbnQucmVwbGFjZShcbiAgICAgIC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qL2csXG4gICAgICBcIlwiLFxuICAgICkgLy8gcmVtb3ZlIGNvbW1lbnRzXG5cbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHNhbml0aXplZENvbnRlbnQpIGFzIFRzQ29uZmlnXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSB0c2NvbmZpZy5qc29uOiAke2UubWVzc2FnZX1gKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgdHNjb25maWdEaXI/OiBzdHJpbmdcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qge1xuICAgIGltcG9ydFBhdGgsXG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgdHNDb25maWcsXG4gICAgdHNjb25maWdEaXIsXG4gIH0gPSBvcHRzXG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIG51bGxcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmwgfHwgXCIuXCJcblxuICBjb25zdCB0cnlSZXNvbHZlQ2FuZGlkYXRlID0gKGNhbmRpZGF0ZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENhbmRpZGF0ZSA9IG5vcm1hbGl6ZUZpbGVQYXRoKGNhbmRpZGF0ZSlcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkQ2FuZGlkYXRlKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZENhbmRpZGF0ZSkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IHdpdGhFeHQgPSBgJHtub3JtYWxpemVkQ2FuZGlkYXRlfS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyh3aXRoRXh0KSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldCh3aXRoRXh0KSFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhwYXRocykpIHtcbiAgICAvLyBTdXBwb3J0IHBhdHRlcm5zIGxpa2UgXCJAc3JjLypcIiBvciBcInV0aWxzLypcIiBhbmQgYWxzbyBleGFjdCBtYXRjaGVzIHdpdGhvdXQgXCIqXCJcbiAgICBjb25zdCBoYXNXaWxkY2FyZCA9IGFsaWFzLmluY2x1ZGVzKFwiKlwiKVxuICAgIGlmIChoYXNXaWxkY2FyZCkge1xuICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IGFsaWFzLnNwbGl0KFwiKlwiKVxuICAgICAgaWYgKFxuICAgICAgICAhaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgfHxcbiAgICAgICAgIWltcG9ydFBhdGguZW5kc1dpdGgoc3VmZml4IHx8IFwiXCIpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXJNYXRjaCA9IGltcG9ydFBhdGguc2xpY2UoXG4gICAgICAgIHByZWZpeC5sZW5ndGgsXG4gICAgICAgIGltcG9ydFBhdGgubGVuZ3RoIC0gKHN1ZmZpeCA/IHN1ZmZpeC5sZW5ndGggOiAwKSxcbiAgICAgIClcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSB0YXJnZXQucmVwbGFjZShcIipcIiwgc3Rhck1hdGNoKVxuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXJlcGxhY2VkLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHtyZXBsYWNlZH1gXG4gICAgICAgICAgICA6IHJlcGxhY2VkXG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdHJ5UmVzb2x2ZUNhbmRpZGF0ZShjYW5kaWRhdGUpXG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbXBvcnRQYXRoICE9PSBhbGlhcykgY29udGludWVcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgICBiYXNlVXJsICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi4vXCIpICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHt0YXJnZXR9YFxuICAgICAgICAgICAgOiB0YXJnZXRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSlcblxuICBpZiAocmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tQmFzZVVybFxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aEJhc2VVcmwob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgdHNjb25maWdEaXI/OiBzdHJpbmdcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qge1xuICAgIGltcG9ydFBhdGgsXG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgdHNDb25maWcsXG4gICAgdHNjb25maWdEaXIsXG4gIH0gPSBvcHRzXG4gIGNvbnN0IGJhc2VVcmwgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsXG4gIGlmICghYmFzZVVybCkgcmV0dXJuIG51bGxcblxuICAvLyBSZXNvbHZlIGJhc2VVcmwgcmVsYXRpdmUgdG8gdHNjb25maWcgbG9jYXRpb25cbiAgY29uc3QgYmFzZURpciA9IHRzY29uZmlnRGlyIHx8IFwiLlwiXG4gIGxldCBmaWxlUGF0aFRvUmVzb2x2ZSA9IGAke2Jhc2VEaXJ9LyR7YmFzZVVybH0vJHtpbXBvcnRQYXRofWBcbiAgLy8gQ2xlYW4gdXAgbXVsdGlwbGUgc2xhc2hlcyBhbmQgbGVhZGluZyBkb3RzXG4gIGZpbGVQYXRoVG9SZXNvbHZlID0gZmlsZVBhdGhUb1Jlc29sdmUucmVwbGFjZSgvXFwvKy9nLCBcIi9cIikgLy8gUmVwbGFjZSBtdWx0aXBsZSBzbGFzaGVzIHdpdGggc2luZ2xlIHNsYXNoXG4gIGZpbGVQYXRoVG9SZXNvbHZlID0gZmlsZVBhdGhUb1Jlc29sdmUucmVwbGFjZSgvXFwvXFwuXFwvL2csIFwiL1wiKSAvLyBSZXBsYWNlIC8uLyB3aXRoIC9cbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVQYXRoID0gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGhUb1Jlc29sdmUpXG5cbiAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZEZpbGVQYXRoKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRGaWxlUGF0aCkhXG4gIH1cblxuICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgY29uc3Qgd2l0aEV4dCA9IGAke25vcm1hbGl6ZWRGaWxlUGF0aH0uJHtleHR9YFxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHdpdGhFeHQpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldCh3aXRoRXh0KSFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4oXG4gIGltcG9ydFBhdGg6IHN0cmluZyxcbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXRocyA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LnBhdGhzXG4gIGlmICghcGF0aHMpIHJldHVybiBmYWxzZVxuXG4gIGZvciAoY29uc3QgW2FsaWFzXSBvZiBPYmplY3QuZW50cmllcyhwYXRocykpIHtcbiAgICBjb25zdCBoYXNXaWxkY2FyZCA9IGFsaWFzLmluY2x1ZGVzKFwiKlwiKVxuICAgIGlmIChoYXNXaWxkY2FyZCkge1xuICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IGFsaWFzLnNwbGl0KFwiKlwiKVxuICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChwcmVmaXgpICYmIGltcG9ydFBhdGguZW5kc1dpdGgoc3VmZml4IHx8IFwiXCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbXBvcnRQYXRoID09PSBhbGlhcykgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB7IHJlc29sdmVSZWxhdGl2ZVBhdGggfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGhcIlxuaW1wb3J0IHtcbiAgcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzLFxuICB0eXBlIFRzQ29uZmlnLFxuICByZXNvbHZlV2l0aEJhc2VVcmwsXG59IGZyb20gXCIuL3RzY29uZmlnUGF0aHNcIlxuXG5jb25zdCBGSUxFX0VYVEVOU0lPTlMgPSBbXG4gIFwidHN4XCIsXG4gIFwidHNcIixcbiAgXCJqc29uXCIsXG4gIFwianNcIixcbiAgXCJqc3hcIixcbiAgXCJvYmpcIixcbiAgXCJnbHRmXCIsXG4gIFwiZ2xiXCIsXG4gIFwic3RsXCIsXG4gIFwic3RlcFwiLFxuICBcInN0cFwiLFxuXVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGw7IHRzY29uZmlnRGlyPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0c0NvbmZpZyA9IG9wdHMudHNDb25maWcgPz8gbnVsbFxuICBjb25zdCBpc1JlbGF0aXZlSW1wb3J0ID1cbiAgICB1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpIHx8IHVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpXG4gIGNvbnN0IGhhc0Jhc2VVcmwgPSAhIXRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmxcblxuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uIHByb3Blcmx5XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9XG4gICAgY3dkICYmIChpc1JlbGF0aXZlSW1wb3J0IHx8ICFoYXNCYXNlVXJsKVxuICAgICAgPyByZXNvbHZlUmVsYXRpdmVQYXRoKHVua25vd25GaWxlUGF0aCwgY3dkKVxuICAgICAgOiB1bmtub3duRmlsZVBhdGhcblxuICBjb25zdCBmaWxlUGF0aHMgPSBuZXcgU2V0KFxuICAgIEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocylcbiAgICAgID8gZnNNYXBPckFsbEZpbGVQYXRoc1xuICAgICAgOiBPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKSxcbiAgKVxuXG4gIGlmIChmaWxlUGF0aHMuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXRoXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGhNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLnNldChub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aCksIGZpbGVQYXRoKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHJlc29sdmVkUGF0aClcblxuICAvLyBXaGVuIGJhc2VVcmwgaXMgc2V0LCBub24tcmVsYXRpdmUgaW1wb3J0cyBzaG91bGQgZ28gdGhyb3VnaCBiYXNlVXJsIHJlc29sdXRpb25cbiAgaWYgKGlzUmVsYXRpdmVJbXBvcnQgfHwgIWhhc0Jhc2VVcmwpIHtcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFJlc29sdmVkUGF0aCkhXG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIGZvciBmaWxlIHdpdGggYSBzZXQgb2YgZGlmZmVyZW50IGV4dGVuc2lvbnNcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBGSUxFX0VYVEVOU0lPTlMpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkUmVzb2x2ZWRQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUcnkgcmVzb2x2aW5nIHVzaW5nIHRzY29uZmlnIFwicGF0aHNcIiBtYXBwaW5nIHdoZW4gdGhlIGltcG9ydCBpcyBub24tcmVsYXRpdmVcbiAgaWYgKCFpc1JlbGF0aXZlSW1wb3J0KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoRnJvbVBhdGhzID0gcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzKHtcbiAgICAgIGltcG9ydFBhdGg6IHVua25vd25GaWxlUGF0aCxcbiAgICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICAgIGV4dGVuc2lvbnM6IEZJTEVfRVhURU5TSU9OUyxcbiAgICAgIHRzQ29uZmlnLFxuICAgICAgdHNjb25maWdEaXI6IG9wdHMudHNjb25maWdEaXIsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbVBhdGhzKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbVBhdGhzXG5cbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgICBpbXBvcnRQYXRoOiB1bmtub3duRmlsZVBhdGgsXG4gICAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgICBleHRlbnNpb25zOiBGSUxFX0VYVEVOU0lPTlMsXG4gICAgICB0c0NvbmZpZyxcbiAgICAgIHRzY29uZmlnRGlyOiBvcHRzLnRzY29uZmlnRGlyLFxuICAgIH0pXG4gICAgaWYgKHJlc29sdmVkUGF0aEZyb21CYXNlVXJsKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmxcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGl0J3MgYW4gYWJzb2x1dGUgaW1wb3J0IChvbmx5IGlmIG5vIGJhc2VVcmwgaXMgY29uZmlndXJlZCBpbiB0c2NvbmZpZylcbiAgLy8gV2hlbiBiYXNlVXJsIGlzIHNldCwgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB2aWEgYmFzZVVybCBvciBmYWlsLCBub3QgZmFsbCBiYWNrIHRvIGFic29sdXRlIHBhdGhzXG4gIGlmICghaXNSZWxhdGl2ZUltcG9ydCAmJiAhaGFzQmFzZVVybCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aCh1bmtub3duRmlsZVBhdGgpXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGgpIVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBGSUxFX0VYVEVOU0lPTlMpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkVW5rbm93bkZpbGVQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyA9IChcbiAgdW5rbm93bkZpbGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbiAgY3dkPzogc3RyaW5nLFxuICBvcHRzOiB7IHRzQ29uZmlnPzogVHNDb25maWcgfCBudWxsOyB0c2NvbmZpZ0Rpcj86IHN0cmluZyB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aChcbiAgICB1bmtub3duRmlsZVBhdGgsXG4gICAgZnNNYXBPckFsbEZpbGVQYXRocyxcbiAgICBjd2QsXG4gICAgb3B0cyxcbiAgKVxuICBpZiAoIXJlc29sdmVkRmlsZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmlsZSBub3QgZm91bmQgXCIke3Vua25vd25GaWxlUGF0aH1cIiwgYXZhaWxhYmxlIHBhdGhzOlxcblxcbiR7T2JqZWN0LmtleXMoZnNNYXBPckFsbEZpbGVQYXRocykuam9pbihcIiwgXCIpfWAsXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNvbHZlZEZpbGVQYXRoXG59XG4iLCAiZXhwb3J0IGNvbnN0IHN0cmlwQ29tbWVudHMgPSAoY29kZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgbGV0IG91dCA9IFwiXCJcbiAgbGV0IGkgPSAwXG5cbiAgbGV0IGluU2luZ2xlID0gZmFsc2VcbiAgbGV0IGluRG91YmxlID0gZmFsc2VcbiAgbGV0IGluVGVtcGxhdGUgPSBmYWxzZVxuXG4gIHdoaWxlIChpIDwgY29kZS5sZW5ndGgpIHtcbiAgICBjb25zdCBjaCA9IGNvZGVbaV1cbiAgICBjb25zdCBuZXh0ID0gY29kZVtpICsgMV1cblxuICAgIC8vIEhhbmRsZSBzdHJpbmcvdGVtcGxhdGUgbGl0ZXJhbCBzdGF0ZXMgKHNvIHdlIGRvbid0IHRyZWF0IGNvbW1lbnQgbWFya2VycyBpbnNpZGUgc3RyaW5ncyBhcyBjb21tZW50cylcbiAgICBpZiAoIWluRG91YmxlICYmICFpblRlbXBsYXRlICYmIGNoID09PSBcIidcIiAmJiBjb2RlW2kgLSAxXSAhPT0gXCJcXFxcXCIpIHtcbiAgICAgIGluU2luZ2xlID0gIWluU2luZ2xlXG4gICAgICBvdXQgKz0gY2hcbiAgICAgIGkrK1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKCFpblNpbmdsZSAmJiAhaW5UZW1wbGF0ZSAmJiBjaCA9PT0gJ1wiJyAmJiBjb2RlW2kgLSAxXSAhPT0gXCJcXFxcXCIpIHtcbiAgICAgIGluRG91YmxlID0gIWluRG91YmxlXG4gICAgICBvdXQgKz0gY2hcbiAgICAgIGkrK1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKCFpblNpbmdsZSAmJiAhaW5Eb3VibGUgJiYgY2ggPT09IFwiYFwiICYmIGNvZGVbaSAtIDFdICE9PSBcIlxcXFxcIikge1xuICAgICAgaW5UZW1wbGF0ZSA9ICFpblRlbXBsYXRlXG4gICAgICBvdXQgKz0gY2hcbiAgICAgIGkrK1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSdyZSBub3QgaW5zaWRlIGEgc3RyaW5nL3RlbXBsYXRlLCByZW1vdmUgY29tbWVudHNcbiAgICBpZiAoIWluU2luZ2xlICYmICFpbkRvdWJsZSAmJiAhaW5UZW1wbGF0ZSkge1xuICAgICAgLy8gTGluZSBjb21tZW50IC8vXG4gICAgICBpZiAoY2ggPT09IFwiL1wiICYmIG5leHQgPT09IFwiL1wiKSB7XG4gICAgICAgIC8vIFJlcGxhY2Ugd2l0aCBzcGFjZXMgdG8ga2VlcCBjb2x1bW4gYWxpZ25tZW50OyBwcmVzZXJ2ZSBuZXdsaW5lXG4gICAgICAgIG91dCArPSBcIiAgXCJcbiAgICAgICAgaSArPSAyXG4gICAgICAgIHdoaWxlIChpIDwgY29kZS5sZW5ndGggJiYgY29kZVtpXSAhPT0gXCJcXG5cIikge1xuICAgICAgICAgIG91dCArPSBcIiBcIlxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIEJsb2NrIGNvbW1lbnQgLyogLi4uICovXG4gICAgICBpZiAoY2ggPT09IFwiL1wiICYmIG5leHQgPT09IFwiKlwiKSB7XG4gICAgICAgIG91dCArPSBcIiAgXCJcbiAgICAgICAgaSArPSAyXG4gICAgICAgIHdoaWxlIChpIDwgY29kZS5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoY29kZVtpXSA9PT0gXCJcXG5cIikgb3V0ICs9IFwiXFxuXCJcbiAgICAgICAgICBlbHNlIG91dCArPSBcIiBcIlxuICAgICAgICAgIGlmIChjb2RlW2ldID09PSBcIipcIiAmJiBjb2RlW2kgKyAxXSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgIG91dCArPSBcIiBcIiAvLyBmb3IgJy8nXG4gICAgICAgICAgICBpICs9IDJcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgb3V0ICs9IGNoXG4gICAgaSsrXG4gIH1cblxuICByZXR1cm4gb3V0XG59XG4iLCAiaW1wb3J0IHsgc3RyaXBDb21tZW50cyB9IGZyb20gXCIuL3N0cmlwLWNvbW1lbnRzXCJcblxuZXhwb3J0IGNvbnN0IGdldEltcG9ydHNGcm9tQ29kZSA9IChjb2RlOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IHN0cmlwcGVkQ29kZSA9IHN0cmlwQ29tbWVudHMoY29kZSlcbiAgLy8gTWF0Y2ggYmFzaWMgaW1wb3J0IHBhdHRlcm5zIGluY2x1ZGluZyBjb21iaW5lZCBkZWZhdWx0IGFuZCBuYW1lc3BhY2UgaW1wb3J0c1xuICBjb25zdCBpbXBvcnRSZWdleCA9XG4gICAgL15cXHMqaW1wb3J0XFxzKyg/Oig/OltcXHdcXHNdKyxcXHMqKT8oPzpcXCpcXHMrYXNcXHMrW1xcd1xcc10rfFxce1tcXHNcXHcsXStcXH18XFx3KylcXHMrZnJvbVxccyopP1snXCJdKC4rPylbJ1wiXS9nbVxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKHN0cmlwcGVkQ29kZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgZnVsbE1hdGNoID0gbWF0Y2hbMF1cbiAgICBpZiAoL15cXHMqaW1wb3J0XFxzK3R5cGVcXGIvLnRlc3QoZnVsbE1hdGNoKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKVxuICB9XG5cbiAgLy8gTWF0Y2ggcmUtZXhwb3J0c1xuICBjb25zdCByZUV4cG9ydFJlZ2V4ID1cbiAgICAvXlxccypleHBvcnRcXHMrKD86dHlwZVxccyspPyg/OlxcKlxccythc1xccytbXFx3JF0rfFxcKnxcXHtbXn1dK1xcfSlcXHMrZnJvbVxccypbJ1wiXSguKz8pWydcIl0vZ21cbiAgbGV0IHJlRXhwb3J0TWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgd2hpbGUgKChyZUV4cG9ydE1hdGNoID0gcmVFeHBvcnRSZWdleC5leGVjKHN0cmlwcGVkQ29kZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgZnVsbE1hdGNoID0gcmVFeHBvcnRNYXRjaFswXVxuICAgIGlmICgvXlxccypleHBvcnRcXHMrdHlwZVxcYi8udGVzdChmdWxsTWF0Y2gpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpbXBvcnRzLnB1c2gocmVFeHBvcnRNYXRjaFsxXSlcbiAgfVxuXG4gIHJldHVybiBpbXBvcnRzXG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG50eXBlIEV4cG9ydFZhbHVlID0gc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cblxuaW50ZXJmYWNlIFBhY2thZ2VKc29uIHtcbiAgbWFpbj86IHN0cmluZ1xuICBtb2R1bGU/OiBzdHJpbmdcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIEV4cG9ydFZhbHVlPlxufVxuXG5pbnRlcmZhY2UgTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgYmFzZVBhdGg6IHN0cmluZ1xuICBtb2R1bGVQYXRoOiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgZnNNYXAsXG4gICAgZXh0ZW5zaW9uczogW1wiLmpzXCIsIFwiLmpzeFwiLCBcIi50c1wiLCBcIi50c3hcIiwgXCIuanNvblwiXSxcbiAgICBiYXNlUGF0aCxcbiAgICBtb2R1bGVQYXRoLFxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGg6IHN0cmluZywgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQpIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9wYWNrYWdlLmpzb25gXG4gIGlmICghY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIGFzIFBhY2thZ2VKc29uXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKFxuICBwYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjdHguZnNNYXBbcGF0aF0pIHJldHVybiBwYXRoXG5cbiAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCBwYXRoV2l0aEV4dCA9IHBhdGgucmVwbGFjZSgvXFwuanMkfFxcLmpzeCQvLCBcIlwiKSArIGV4dFxuICAgIGlmIChjdHguZnNNYXBbcGF0aFdpdGhFeHRdKSByZXR1cm4gcGF0aFdpdGhFeHRcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlRXhwb3J0UGF0aChcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIGV4cG9ydFBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZnVsbEV4cG9ydFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZXhwb3J0UGF0aC5yZXBsYWNlKC9eXFwuXFwvLywgXCJcIil9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxFeHBvcnRQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25kaXRpb25hbEV4cG9ydChleHBvcnRWYWx1ZTogRXhwb3J0VmFsdWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBleHBvcnRWYWx1ZVxuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGV4cG9ydHMgLSB0cnkgY29tbW9uIGNvbmRpdGlvbnMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZVxuICBjb25zdCBjb25kaXRpb25zID0gW1wiaW1wb3J0XCIsIFwiZGVmYXVsdFwiLCBcInJlcXVpcmVcIiwgXCJub2RlXCIsIFwiYnJvd3NlclwiXVxuICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgaWYgKGV4cG9ydFZhbHVlW2NvbmRpdGlvbl0pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gZXhwb3J0VmFsdWVbY29uZGl0aW9uXVxuICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb25WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gY29uZGl0aW9uVmFsdWVcbiAgICAgIH1cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGhhbmRsZSBuZXN0ZWQgY29uZGl0aW9uc1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoY29uZGl0aW9uVmFsdWUpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXBhY2thZ2VKc29uLmV4cG9ydHMpIHJldHVybiBudWxsXG5cbiAgLy8gSGFuZGxlIGRlZmF1bHQgZXhwb3J0IGNvbmRpdGlvbiAod2hlbiBubyBzdWJwYXRoKVxuICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0c1tcIi5cIl1cbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgZGVmYXVsdEV4cG9ydCkge1xuICAgIGNvbnN0IGV4cG9ydFBhdGggPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoZGVmYXVsdEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHN1YnBhdGggZXhwb3J0c1xuICBjb25zdCBzdWJwYXRoRXhwb3J0ID0gcmVtYWluaW5nUGF0aFxuICAgID8gcGFja2FnZUpzb24uZXhwb3J0c1tgLi8ke3JlbWFpbmluZ1BhdGh9YF1cbiAgICA6IG51bGxcbiAgaWYgKHN1YnBhdGhFeHBvcnQpIHtcbiAgICBjb25zdCBleHBvcnRQYXRoID0gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KHN1YnBhdGhFeHBvcnQpXG4gICAgaWYgKGV4cG9ydFBhdGgpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBleHBvcnRQYXRoLCBjdHgpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSB0b3AtbGV2ZWwgY29uZGl0aW9uYWwgZXhwb3J0cyAobGVnYWN5IGZvcm1hdClcbiAgY29uc3QgaW1wb3J0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0cy5pbXBvcnRcbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgaW1wb3J0RXhwb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBleHBvcnRQYXRoID0gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KGltcG9ydEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlbnRyeVBvaW50ID0gcGFja2FnZUpzb24ubW9kdWxlIHx8IHBhY2thZ2VKc29uLm1haW4gfHwgXCJpbmRleC5qc1wiXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2VudHJ5UG9pbnR9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXJlbWFpbmluZ1BhdGgpIHtcbiAgICAvLyBUcnkgaW5kZXggZmlsZXMgaW4gdGhlIG1vZHVsZSByb290XG4gICAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vaW5kZXgke2V4dH1gXG4gICAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke3JlbWFpbmluZ1BhdGh9YFxuICBjb25zdCBkaXJlY3RNYXRjaCA9IHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsUGF0aCwgY3R4KVxuICBpZiAoZGlyZWN0TWF0Y2gpIHJldHVybiBkaXJlY3RNYXRjaFxuXG4gIC8vIFRyeSBpbmRleCBmaWxlc1xuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke2Z1bGxQYXRofS9pbmRleCR7ZXh0fWBcbiAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChcbiAgc2VhcmNoUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtb2R1bGVQYXJ0cyA9IGN0eC5tb2R1bGVQYXRoLnNwbGl0KFwiL1wiKVxuICBjb25zdCBzY29wZSA9IG1vZHVsZVBhcnRzWzBdLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgPyBtb2R1bGVQYXJ0cy5zbGljZSgwLCAyKS5qb2luKFwiL1wiKVxuICAgIDogbW9kdWxlUGFydHNbMF1cbiAgY29uc3QgcmVtYWluaW5nUGF0aCA9IG1vZHVsZVBhcnRzLnNsaWNlKHNjb3BlLmluY2x1ZGVzKFwiL1wiKSA/IDIgOiAxKS5qb2luKFwiL1wiKVxuICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBgJHtzZWFyY2hQYXRoID09PSBcIi5cIiA/IFwiXCIgOiBgJHtzZWFyY2hQYXRofS9gfW5vZGVfbW9kdWxlcy8ke3Njb3BlfWBcblxuICAvLyBUcnkgdG8gZmluZCBwYWNrYWdlLmpzb25cbiAgY29uc3QgcGFja2FnZUpzb24gPSBmaW5kUGFja2FnZUpzb24obm9kZU1vZHVsZXNQYXRoLCBjdHgpXG4gIGlmIChwYWNrYWdlSnNvbikge1xuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBleHBvcnRzIGZpZWxkXG4gICAgY29uc3QgZXhwb3J0c1Jlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUV4cG9ydHMoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHJlbWFpbmluZ1BhdGgsXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGlmIChleHBvcnRzUmVzb2x1dGlvbikgcmV0dXJuIGV4cG9ydHNSZXNvbHV0aW9uXG5cbiAgICAvLyBUcnkgcmVzb2x2aW5nIHRocm91Z2ggbWFpbi9tb2R1bGUgZmllbGRzXG4gICAgY29uc3QgZW50cnlQb2ludFJlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGVudHJ5UG9pbnRSZXNvbHV0aW9uKSByZXR1cm4gZW50cnlQb2ludFJlc29sdXRpb25cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgcmVtYWluaW5nIHBhdGhcbiAgY29uc3QgcmVtYWluaW5nUGF0aFJlc29sdXRpb24gPSByZXNvbHZlUmVtYWluaW5nUGF0aChcbiAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgcmVtYWluaW5nUGF0aCxcbiAgICBjdHgsXG4gIClcbiAgaWYgKHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uKSByZXR1cm4gcmVtYWluaW5nUGF0aFJlc29sdXRpb25cblxuICAvLyBJZiBub3QgZm91bmQgYW5kIHdlIGhhdmUgYSBwYXJlbnQgZGlyZWN0b3J5LCB0cnkgdGhlcmVcbiAgY29uc3QgcGFyZW50UGF0aCA9IGRpcm5hbWUoc2VhcmNoUGF0aClcbiAgaWYgKHBhcmVudFBhdGggJiYgcGFyZW50UGF0aCAhPT0gc2VhcmNoUGF0aCkge1xuICAgIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChwYXJlbnRQYXRoLCBjdHgpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgY3R4ID0gY3JlYXRlQ29udGV4dChtb2R1bGVQYXRoLCBmc01hcCwgYmFzZVBhdGgpXG4gIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChjdHguYmFzZVBhdGgsIGN0eClcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbENvbXBpbGVkSnMoXG4gIGNvbXBpbGVkQ29kZTogc3RyaW5nLFxuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN3ZD86IHN0cmluZyxcbikge1xuICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9yZXF1aXJlID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGxldCByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKG5hbWUsIHByZVN1cHBsaWVkSW1wb3J0cywgY3dkKVxuXG4gICAgaWYgKCFyZXNvbHZlZEZpbGVQYXRoICYmICFuYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmICFuYW1lLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QgfHwgXCJcIilcbiAgICB9XG5cbiAgICBjb25zdCBoYXNSZXNvbHZlZEZpbGVQYXRoID1cbiAgICAgIHJlc29sdmVkRmlsZVBhdGggJiYgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGhdXG5cbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSAmJiAhaGFzUmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgXCIke25hbWV9XCIgbm90IGZvdW5kICR7Y3dkID8gYGluIFwiJHtjd2R9XCJgIDogXCJcIn1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbbmFtZV0gfHwgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGghXVxuICAgIHJldHVybiBuZXcgUHJveHkobW9kLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgIGlmIChwcm9wID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19lc01vZHVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfX2VzTW9kdWxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCBcIiR7U3RyaW5nKHByb3ApfVwiIGlzIG5vdCBleHBvcnRlZCBieSBcIiR7bmFtZX1cImAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wIGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSBgXG4gIHZhciBleHBvcnRzID0ge307XG4gIHZhciByZXF1aXJlID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9yZXF1aXJlO1xuICB2YXIgbW9kdWxlID0geyBleHBvcnRzIH07XG4gIHZhciBjaXJjdWl0ID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9jaXJjdWl0O1xuICAke2NvbXBpbGVkQ29kZX07XG4gIHJldHVybiBtb2R1bGU7YC50cmltKClcbiAgcmV0dXJuIEZ1bmN0aW9uKGZ1bmN0aW9uQm9keSkuY2FsbChnbG9iYWxUaGlzKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNTdGF0aWNBc3NldFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9uc1wiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCJsaWIvdHJhbnNwaWxlL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuaW1wb3J0IHsgS2ljYWRUb0NpcmN1aXRKc29uQ29udmVydGVyIH0gZnJvbSBcImtpY2FkLXRvLWNpcmN1aXQtanNvblwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWxvY2FsLWZpbGVcIilcblxuZXhwb3J0IGNvbnN0IGltcG9ydExvY2FsRmlsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBkZWJ1ZyhcImltcG9ydExvY2FsRmlsZSBjYWxsZWQgd2l0aDpcIiwge1xuICAgIGltcG9ydE5hbWUsXG4gIH0pXG5cbiAgY29uc3QgeyBmc01hcCwgcHJlU3VwcGxpZWRJbXBvcnRzLCBpbXBvcnRTdGFjaywgY3VycmVudGx5SW1wb3J0aW5nIH0gPSBjdHhcblxuICBjb25zdCBmc1BhdGggPSByZXNvbHZlRmlsZVBhdGhPclRocm93KGltcG9ydE5hbWUsIGZzTWFwLCB1bmRlZmluZWQsIHtcbiAgICB0c0NvbmZpZzogY3R4LnRzQ29uZmlnLFxuICB9KVxuICBkZWJ1ZyhcImZzUGF0aDpcIiwgZnNQYXRoKVxuICBpZiAoY3VycmVudGx5SW1wb3J0aW5nLmhhcyhmc1BhdGgpKSB7XG4gICAgY29uc3QgY3ljbGVTdGFydEluZGV4ID0gaW1wb3J0U3RhY2suaW5kZXhPZihmc1BhdGgpXG4gICAgY29uc3QgY3ljbGVQYXRoID1cbiAgICAgIGN5Y2xlU3RhcnRJbmRleCA+PSAwXG4gICAgICAgID8gaW1wb3J0U3RhY2suc2xpY2UoY3ljbGVTdGFydEluZGV4KS5jb25jYXQoZnNQYXRoKVxuICAgICAgICA6IFsuLi5pbXBvcnRTdGFjaywgZnNQYXRoXVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIHdoaWxlIGltcG9ydGluZyBcIiR7ZnNQYXRofVwiLiBUaGUgZm9sbG93aW5nIGltcG9ydCBjaGFpbiBmb3JtcyBhIGN5Y2xlOlxcblxcbiR7Y3ljbGVQYXRoLmpvaW4oXG4gICAgICAgIFwiIC0+IFwiLFxuICAgICAgKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmICghY3R4LmZzTWFwW2ZzUGF0aF0pIHtcbiAgICBkZWJ1ZyhcImZzUGF0aCBub3QgZm91bmQgaW4gZnNNYXA6XCIsIGZzUGF0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgXCIke2ZzUGF0aH1cIiBub3QgZm91bmRgKVxuICB9XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gZnNNYXBbZnNQYXRoXVxuICBkZWJ1ZyhcImZpbGVDb250ZW50OlwiLCBmaWxlQ29udGVudD8uc2xpY2UoMCwgMTAwKSlcbiAgY3VycmVudGx5SW1wb3J0aW5nLmFkZChmc1BhdGgpXG4gIGltcG9ydFN0YWNrLnB1c2goZnNQYXRoKVxuICB0cnkge1xuICAgIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IGpzb25EYXRhLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmtpY2FkX3BjYlwiKSkge1xuICAgICAgY29uc3QgY29udmVydGVyID0gbmV3IEtpY2FkVG9DaXJjdWl0SnNvbkNvbnZlcnRlcigpXG4gICAgICBjb252ZXJ0ZXIuYWRkRmlsZShmc1BhdGgsIGZpbGVDb250ZW50KVxuICAgICAgY29udmVydGVyLnJ1blVudGlsRmluaXNoZWQoKVxuICAgICAgY29uc3QgY2lyY3VpdEpzb24gPSBjb252ZXJ0ZXIuZ2V0T3V0cHV0KClcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgICBjaXJjdWl0SnNvbjogY2lyY3VpdEpzb24sXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1N0YXRpY0Fzc2V0UGF0aChmc1BhdGgpKSB7XG4gICAgICBsZXQgc3RhdGljVXJsOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGVDb250ZW50ID09PSBcIl9fU1RBVElDX0FTU0VUX19cIikge1xuICAgICAgICAvLyBQbGFjZWhvbGRlcjogdXNlIHByb2plY3RCYXNlVXJsIGZvciBzdGF0aWMgZmlsZSBpbXBvcnRzXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtQ29uZmlnID0gY3R4LmNpcmN1aXQucGxhdGZvcm1cbiAgICAgICAgc3RhdGljVXJsID0gYCR7cGxhdGZvcm1Db25maWc/LnByb2plY3RCYXNlVXJsID8/IFwiXCJ9LyR7XG4gICAgICAgICAgZnNQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSA/IGZzUGF0aC5zbGljZSgyKSA6IGZzUGF0aFxuICAgICAgICB9YFxuICAgICAgfSBlbHNlIGlmIChmaWxlQ29udGVudC5zdGFydHNXaXRoKFwiYmxvYjpcIikpIHtcbiAgICAgICAgLy8gQnJvd3NlciBwcm92aWRlZCBhIGJsb2IgVVJMIGRpcmVjdGx5LCB1c2UgaXQgYXMtaXNcbiAgICAgICAgc3RhdGljVXJsID0gZmlsZUNvbnRlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFjdHVhbCBmaWxlIGNvbnRlbnQ6IGNyZWF0ZSBhIGJsb2IgVVJMXG4gICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbZmlsZUNvbnRlbnRdLCB7XG4gICAgICAgICAgdHlwZTogZnNQYXRoLmVuZHNXaXRoKFwiLmtpY2FkX21vZFwiKVxuICAgICAgICAgICAgPyBcInRleHQvcGxhaW5cIlxuICAgICAgICAgICAgOiBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLFxuICAgICAgICB9KVxuICAgICAgICBzdGF0aWNVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpXG4gICAgICB9XG5cbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgICBkZWZhdWx0OiBzdGF0aWNVcmwsXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIudHN4XCIpIHx8IGZzUGF0aC5lbmRzV2l0aChcIi50c1wiKSkge1xuICAgICAgY29uc3QgaW1wb3J0TmFtZXMgPSBnZXRJbXBvcnRzRnJvbUNvZGUoZmlsZUNvbnRlbnQpXG5cbiAgICAgIGZvciAoY29uc3QgaW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgICAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgICAgICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKGltcG9ydE5hbWUsIGN0eCwgZGVwdGggKyAxLCB7XG4gICAgICAgICAgICBjd2Q6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkQ29kZSA9IHRyYW5zZm9ybVdpdGhTdWNyYXNlKGZpbGVDb250ZW50LCBmc1BhdGgpXG4gICAgICAgIGRlYnVnKFwiZXZhbENvbXBpbGVkSnMgY2FsbGVkIHdpdGg6XCIsIHtcbiAgICAgICAgICBjb2RlOiB0cmFuc2Zvcm1lZENvZGUuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgICBkaXJuYW1lOiBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGltcG9ydFJ1blJlc3VsdCA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgICAgIHRyYW5zZm9ybWVkQ29kZSxcbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICAgICAgZGlybmFtZShmc1BhdGgpLFxuICAgICAgICApXG4gICAgICAgIGRlYnVnKFwiaW1wb3J0UnVuUmVzdWx0OlwiLCB7XG4gICAgICAgICAgZnNQYXRoLFxuICAgICAgICAgIGltcG9ydFJ1blJlc3VsdCxcbiAgICAgICAgfSlcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSBpbXBvcnRSdW5SZXN1bHQuZXhwb3J0c1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEV2YWwgY29tcGlsZWQganMgZXJyb3IgZm9yIFwiJHtpbXBvcnROYW1lfVwiOiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmpzXCIpIHx8IGZzUGF0aC5lbmRzV2l0aChcIi5tanNcIikpIHtcbiAgICAgIC8vIEZvciAuanMvLm1qcyBmaWxlcywgZXNwZWNpYWxseSBmcm9tIG5vZGVfbW9kdWxlcywgd2UgbmVlZCB0byBleHRyYWN0IGFuZCByZXNvbHZlIGltcG9ydHMgZmlyc3RcbiAgICAgIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGZpbGVDb250ZW50KVxuXG4gICAgICBmb3IgKGNvbnN0IGltcG9ydE5hbWUgb2YgaW1wb3J0TmFtZXMpIHtcbiAgICAgICAgaWYgKCFwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICAgICAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChpbXBvcnROYW1lLCBjdHgsIGRlcHRoICsgMSwge1xuICAgICAgICAgICAgY3dkOiBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIHRyYW5zZm9ybSBhbmQgZXZhbHVhdGVcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICAgIHRyYW5zZm9ybVdpdGhTdWNyYXNlKGZpbGVDb250ZW50LCBmc1BhdGgpLFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHMsXG4gICAgICAgIGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICkuZXhwb3J0c1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbnN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbiBcIiR7ZnNQYXRoLnNwbGl0KFwiLlwiKS5wb3AoKX1cIiBmb3IgXCIke2ZzUGF0aH1cImAsXG4gICAgICApXG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGltcG9ydFN0YWNrLnBvcCgpXG4gICAgY3VycmVudGx5SW1wb3J0aW5nLmRlbGV0ZShmc1BhdGgpXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgU1RBVElDX0FTU0VUX0VYVEVOU0lPTlMgPSBbXG4gIFwiLmdsYlwiLFxuICBcIi5raWNhZF9tb2RcIixcbiAgXCIuZ2x0ZlwiLFxuICBcIi5vYmpcIixcbiAgXCIuc3RsXCIsXG4gIFwiLnN0ZXBcIixcbiAgXCIuc3RwXCIsXG5dXG5cbmV4cG9ydCBjb25zdCBpc1N0YXRpY0Fzc2V0UGF0aCA9IChwYXRoOiBzdHJpbmcpID0+XG4gIFNUQVRJQ19BU1NFVF9FWFRFTlNJT05TLnNvbWUoKGV4dCkgPT4gcGF0aC5lbmRzV2l0aChleHQpKVxuIiwgImltcG9ydCB7IHRyYW5zZm9ybSwgdHlwZSBUcmFuc2Zvcm0gYXMgU3VjcmFzZVRyYW5zZm9ybSB9IGZyb20gXCJzdWNyYXNlXCJcblxuY29uc3QgVFNfRVhURU5TSU9OUyA9IG5ldyBTZXQoW1wiLnRzXCIsIFwiLnRzeFwiLCBcIi5tdHNcIiwgXCIuY3RzXCJdKVxuY29uc3QgSlNYX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFtcIi50c3hcIiwgXCIuanN4XCIsIFwiLnRzXCJdKVxuY29uc3QgVFlQRV9TVEFSX0VYUE9SVF9SRUdFWCA9XG4gIC9eXFxzKmV4cG9ydFxccyt0eXBlXFxzK1xcKlxccysoPzphc1xccytbXFx3JF0rXFxzKyk/ZnJvbVxccytbJ1wiXVteJ1wiXStbJ1wiXVxccyo7P1xccyokL2dpbVxuXG5jb25zdCBzdHJpcFR5cGVTdGFyRXhwb3J0cyA9IChjb2RlOiBzdHJpbmcpID0+XG4gIGNvZGUucmVwbGFjZShUWVBFX1NUQVJfRVhQT1JUX1JFR0VYLCBcIlwiKVxuXG5jb25zdCBzdHJpcFF1ZXJ5QW5kSGFzaCA9IChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHF1ZXJ5SW5kZXggPSBmaWxlUGF0aC5pbmRleE9mKFwiP1wiKVxuICBjb25zdCBoYXNoSW5kZXggPSBmaWxlUGF0aC5pbmRleE9mKFwiI1wiKVxuXG4gIGxldCBlbmRJbmRleCA9IGZpbGVQYXRoLmxlbmd0aFxuXG4gIGlmIChxdWVyeUluZGV4ICE9PSAtMSAmJiBoYXNoSW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBNYXRoLm1pbihxdWVyeUluZGV4LCBoYXNoSW5kZXgpXG4gIH0gZWxzZSBpZiAocXVlcnlJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IHF1ZXJ5SW5kZXhcbiAgfSBlbHNlIGlmIChoYXNoSW5kZXggIT09IC0xKSB7XG4gICAgZW5kSW5kZXggPSBoYXNoSW5kZXhcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aC5zbGljZSgwLCBlbmRJbmRleClcbn1cblxuY29uc3QgZ2V0RXh0ZW5zaW9uID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBzdHJpcFF1ZXJ5QW5kSGFzaChmaWxlUGF0aClcbiAgY29uc3QgbGFzdERvdEluZGV4ID0gbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCIuXCIpXG5cbiAgaWYgKGxhc3REb3RJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSBNYXRoLm1heChcbiAgICBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIi9cIiksXG4gICAgbm9ybWFsaXplZFBhdGgubGFzdEluZGV4T2YoXCJcXFxcXCIpLFxuICApXG5cbiAgaWYgKGxhc3RTbGFzaEluZGV4ID4gbGFzdERvdEluZGV4KSB7XG4gICAgcmV0dXJuIFwiXCJcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkUGF0aC5zbGljZShsYXN0RG90SW5kZXgpLnRvTG93ZXJDYXNlKClcbn1cblxuY29uc3QgZ2V0VHJhbnNmb3Jtc0ZvckZpbGVQYXRoID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKGZpbGVQYXRoKVxuXG4gIGNvbnN0IHRyYW5zZm9ybXM6IFN1Y3Jhc2VUcmFuc2Zvcm1bXSA9IFtcImltcG9ydHNcIl1cblxuICBpZiAoVFNfRVhURU5TSU9OUy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgIHRyYW5zZm9ybXMudW5zaGlmdChcInR5cGVzY3JpcHRcIilcbiAgfVxuXG4gIGlmIChKU1hfRVhURU5TSU9OUy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgIHRyYW5zZm9ybXMucHVzaChcImpzeFwiKVxuICB9XG5cbiAgcmV0dXJuIHRyYW5zZm9ybXNcbn1cblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybVdpdGhTdWNyYXNlID0gKGNvZGU6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCB0cmFuc2Zvcm1zID0gZ2V0VHJhbnNmb3Jtc0ZvckZpbGVQYXRoKGZpbGVQYXRoKVxuICBjb25zdCBzYW5pdGl6ZWRDb2RlID0gc3RyaXBUeXBlU3RhckV4cG9ydHMoY29kZSlcbiAgY29uc3QgeyBjb2RlOiB0cmFuc2Zvcm1lZENvZGUgfSA9IHRyYW5zZm9ybShzYW5pdGl6ZWRDb2RlLCB7XG4gICAgZmlsZVBhdGgsXG4gICAgcHJvZHVjdGlvbjogdHJ1ZSxcbiAgICB0cmFuc2Zvcm1zLFxuICB9KVxuXG4gIHJldHVybiB0cmFuc2Zvcm1lZENvZGVcbn1cbiIsICJpbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0U25pcHBldChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikge1xuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cyB9ID0gY3R4XG4gIGNvbnN0IGZ1bGxTbmlwcGV0TmFtZSA9IGltcG9ydE5hbWUucmVwbGFjZShcIkB0c2NpL1wiLCBcIlwiKS5yZXBsYWNlKFwiLlwiLCBcIi9cIilcblxuICBjb25zdCB7IGNqcywgZXJyb3IgfSA9IGF3YWl0IGdsb2JhbFRoaXNcbiAgICAuZmV0Y2goYCR7Y3R4LmNqc1JlZ2lzdHJ5VXJsfS8ke2Z1bGxTbmlwcGV0TmFtZX1gKVxuICAgIC50aGVuKGFzeW5jIChyZXMpID0+ICh7IGNqczogYXdhaXQgcmVzLnRleHQoKSwgZXJyb3I6IG51bGwgfSkpXG4gICAgLmNhdGNoKChlKSA9PiAoeyBlcnJvcjogZSwgY2pzOiBudWxsIH0pKVxuXG4gIGlmIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBpbXBvcnRcIiwgaW1wb3J0TmFtZSwgZXJyb3IpXG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgY2pzISxcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICApLmV4cG9ydHNcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbXBvcnRpbmcgc25pcHBldFwiLCBlKVxuICB9XG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24gfSBmcm9tIFwiLi9pc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb25cIlxuaW1wb3J0IHsgZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeSB9IGZyb20gXCIuL2dldE5vZGVNb2R1bGVEaXJlY3RvcnlcIlxuaW1wb3J0IHsgZ2V0UGFja2FnZUpzb25FbnRyeXBvaW50IH0gZnJvbSBcIi4vZ2V0UGFja2FnZUpzb25FbnRyeXBvaW50XCJcbmltcG9ydCB7IGlzVHlwZVNjcmlwdEVudHJ5cG9pbnQgfSBmcm9tIFwiLi9pc1R5cGVTY3JpcHRFbnRyeXBvaW50XCJcbmltcG9ydCB7IGlzRGlzdERpckVtcHR5IH0gZnJvbSBcIi4vaXNEaXN0RGlyRW1wdHlcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ub2RlLW1vZHVsZVwiKVxuXG5leHBvcnQgY29uc3QgaW1wb3J0Tm9kZU1vZHVsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBjb25zdCB7IHByZVN1cHBsaWVkSW1wb3J0cywgZnNNYXAgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIE9ubHkgcnVuIHZhbGlkYXRpb24gaWYgcGFja2FnZS5qc29uIGV4aXN0cyAoY2FuJ3QgdmFsaWRhdGUgd2l0aG91dCBpdClcbiAgY29uc3QgaGFzUGFja2FnZUpzb24gPSAhIWZzTWFwW1wicGFja2FnZS5qc29uXCJdXG5cbiAgaWYgKGhhc1BhY2thZ2VKc29uKSB7XG4gICAgLy8gU3RlcCAxOiBDaGVjayBpZiB0aGUgcGFja2FnZSBpcyBkZWNsYXJlZCBpbiBwYWNrYWdlLmpzb25cbiAgICBpZiAoIWlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbihpbXBvcnROYW1lLCBmc01hcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vZGUgbW9kdWxlIGltcG9ydGVkIGJ1dCBub3QgaW4gcGFja2FnZS5qc29uIFwiJHtpbXBvcnROYW1lfVwiXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkTm9kZU1vZHVsZVBhdGggPSByZXNvbHZlTm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHguZnNNYXAsIFwiXCIpXG5cbiAgLy8gT25seSBydW4gU3RlcHMgMi00IGlmIHBhY2thZ2UgZXhpc3RzIGluIG5vZGVfbW9kdWxlcyAoYWZ0ZXIgcmVzb2x2ZXIgYXR0ZW1wdHMpXG4gIGlmIChoYXNQYWNrYWdlSnNvbiAmJiByZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgLy8gU3RlcCAyOiBDaGVjayBpZiBub2RlX21vZHVsZXMgZGlyZWN0b3J5IGV4aXN0cyBmb3IgdGhlIHBhY2thZ2VcbiAgICBjb25zdCBub2RlTW9kdWxlRGlyID0gZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeShpbXBvcnROYW1lLCBmc01hcClcbiAgICBpZiAoIW5vZGVNb2R1bGVEaXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBubyBmaWxlcyBpbiB0aGUgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBTdGVwIDM6IENoZWNrIGlmIG1haW4gZW50cnlwb2ludCBpcyBhIFR5cGVTY3JpcHQgZmlsZVxuICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQoaW1wb3J0TmFtZSwgZnNNYXApXG4gICAgaWYgKGlzVHlwZVNjcmlwdEVudHJ5cG9pbnQoZW50cnlwb2ludCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBhIHR5cGVzY3JpcHQgZW50cnlwb2ludCB0aGF0IGlzIHVuc3VwcG9ydGVkXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFN0ZXAgNDogQ2hlY2sgaWYgZGlzdCBkaXJlY3RvcnkgaXMgZW1wdHkgd2hlbiBtYWluIHBvaW50cyB0byBkaXN0XG4gICAgaWYgKGVudHJ5cG9pbnQgJiYgZW50cnlwb2ludC5zdGFydHNXaXRoKFwiZGlzdC9cIikpIHtcbiAgICAgIGlmIChpc0Rpc3REaXJFbXB0eShpbXBvcnROYW1lLCBmc01hcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgbm8gZmlsZXMgaW4gZGlzdCwgZGlkIHlvdSBmb3JnZXQgdG8gdHJhbnNwaWxlP1xcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gY3R4LmNpcmN1aXQ/LnBsYXRmb3JtXG4gICAgaWYgKHBsYXRmb3JtPy5ub2RlTW9kdWxlc1Jlc29sdmVyKSB7XG4gICAgICBkZWJ1ZyhgQXR0ZW1wdGluZyB0byByZXNvbHZlIFwiJHtpbXBvcnROYW1lfVwiIHVzaW5nIG5vZGVNb2R1bGVzUmVzb2x2ZXJgKVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmaWxlQ29udGVudCA9IGF3YWl0IHBsYXRmb3JtLm5vZGVNb2R1bGVzUmVzb2x2ZXIoaW1wb3J0TmFtZSlcblxuICAgICAgICBpZiAoZmlsZUNvbnRlbnQpIHtcbiAgICAgICAgICBkZWJ1ZyhgU3VjY2Vzc2Z1bGx5IHJlc29sdmVkIFwiJHtpbXBvcnROYW1lfVwiIHZpYSBub2RlTW9kdWxlc1Jlc29sdmVyYClcblxuICAgICAgICAgIC8vIEFkZCB0aGUgcmVzb2x2ZWQgY29udGVudCB0byBmc01hcCB3aXRoIGEgc3ludGhldGljIHBhdGhcbiAgICAgICAgICAvLyBBZGQgLnRzIGV4dGVuc2lvbiB0byBlbnN1cmUgaXQncyB0cmVhdGVkIGFzIGEgbW9kdWxlIGZpbGVcbiAgICAgICAgICBjb25zdCBzeW50aGV0aWNQYXRoID0gYG5vZGVfbW9kdWxlcy8ke2ltcG9ydE5hbWV9LnRzYFxuICAgICAgICAgIGN0eC5mc01hcFtzeW50aGV0aWNQYXRoXSA9IGZpbGVDb250ZW50XG5cbiAgICAgICAgICAvLyBJbXBvcnQgdGhlIGZpbGUgdXNpbmcgdGhlIG5vcm1hbCBmbG93XG4gICAgICAgICAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHN5bnRoZXRpY1BhdGgsIGN0eCwgZGVwdGgpXG5cbiAgICAgICAgICAvLyBNYXAgdGhlIGltcG9ydCBuYW1lIHRvIHRoZSByZXNvbHZlZCBtb2R1bGVcbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwcmVTdXBwbGllZEltcG9ydHNbc3ludGhldGljUGF0aF1cblxuICAgICAgICAgIC8vIEFsc28gbWFwIHdpdGhvdXQgbm9kZV9tb2R1bGVzIHByZWZpeFxuICAgICAgICAgIGNvbnN0IHVucHJlZml4ZWRQYXRoID0gc3ludGhldGljUGF0aC5yZXBsYWNlKC9ebm9kZV9tb2R1bGVzXFwvLywgXCJcIilcbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZFBhdGhdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3N5bnRoZXRpY1BhdGhdXG5cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGRlYnVnKGBub2RlTW9kdWxlc1Jlc29sdmVyIHJldHVybmVkIG51bGwgZm9yIFwiJHtpbXBvcnROYW1lfVwiYClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGRlYnVnKGBub2RlTW9kdWxlc1Jlc29sdmVyIGZhaWxlZCBmb3IgXCIke2ltcG9ydE5hbWV9XCI6YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBub3QgZm91bmRgKVxuICB9XG5cbiAgLy8gVXNlIGltcG9ydExvY2FsRmlsZSB0byBoYW5kbGUgdGhlIG5vZGUgbW9kdWxlXG4gIGF3YWl0IGltcG9ydExvY2FsRmlsZShyZXNvbHZlZE5vZGVNb2R1bGVQYXRoLCBjdHgsIGRlcHRoKVxuXG4gIC8vIE1hcCB0aGUgb3JpZ2luYWwgaW1wb3J0IG5hbWUgdG8gdGhlIHJlc29sdmVkIG1vZHVsZSdzIGV4cG9ydHNcbiAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgLy8gTWFwIHdpdGhvdXQgbm9kZV9tb2R1bGVzIHByZWZpeCBmb3IgZGlyZWN0IGltcG9ydHNcbiAgY29uc3QgdW5wcmVmaXhlZFBhdGggPSByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICBwcmVTdXBwbGllZEltcG9ydHNbdW5wcmVmaXhlZFBhdGhdID1cbiAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBIYW5kbGUgaW5kZXggZmlsZXMgc3BlY2lhbGx5XG4gIGlmIChcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LnRzeFwiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHNcIikgfHxcbiAgICByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLmVuZHNXaXRoKFwiL2luZGV4LmpzXCIpXG4gICkge1xuICAgIGNvbnN0IGRpclBhdGggPSByZXNvbHZlZE5vZGVNb2R1bGVQYXRoLnJlcGxhY2UoL1xcL2luZGV4XFwuKHRzeD98anMpJC8sIFwiXCIpXG4gICAgY29uc3QgdW5wcmVmaXhlZERpclBhdGggPSBkaXJQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkRGlyUGF0aF0gPVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkTm9kZU1vZHVsZVBhdGhdXG5cbiAgICAvLyBIYW5kbGUgc2NvcGVkIHBhY2thZ2VzXG4gICAgaWYgKHVucHJlZml4ZWREaXJQYXRoLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICBjb25zdCBzY29wZVBhcnRzID0gdW5wcmVmaXhlZERpclBhdGguc3BsaXQoXCIvXCIpXG4gICAgICBpZiAoc2NvcGVQYXJ0cy5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBzY29wZWROYW1lID0gYCR7c2NvcGVQYXJ0c1swXX0vJHtzY29wZVBhcnRzWzFdfWBcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW3Njb3BlZE5hbWVdID1cbiAgICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEV4dHJhY3QgdGhlIGJhc2UgcGFja2FnZSBuYW1lIGZyb20gYW4gaW1wb3J0IG5hbWVcbiAqIEhhbmRsZXMgc2NvcGVkIHBhY2thZ2VzIGFuZCBzdWJwYXRoc1xuICpcbiAqIEV4YW1wbGVzOlxuICogLSBcIkBzY29wZS9wYWNrYWdlL3N1YnBhdGhcIiAtPiBcIkBzY29wZS9wYWNrYWdlXCJcbiAqIC0gXCJsb2Rhc2gvZ2V0XCIgLT4gXCJsb2Rhc2hcIlxuICogLSBcInJlYWN0XCIgLT4gXCJyZWFjdFwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0QmFzZVBhY2thZ2VOYW1lKGltcG9ydE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBiYXNlUGFja2FnZU5hbWUgPSBpbXBvcnROYW1lXG4gIGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgLy8gU2NvcGVkIHBhY2thZ2U6IEBzY29wZS9wYWNrYWdlIG9yIEBzY29wZS9wYWNrYWdlL3N1YnBhdGhcbiAgICBjb25zdCBwYXJ0cyA9IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpXG4gICAgYmFzZVBhY2thZ2VOYW1lID0gcGFydHMubGVuZ3RoID49IDIgPyBgJHtwYXJ0c1swXX0vJHtwYXJ0c1sxXX1gIDogaW1wb3J0TmFtZVxuICB9IGVsc2Uge1xuICAgIC8vIFJlZ3VsYXIgcGFja2FnZTogcGFja2FnZSBvciBwYWNrYWdlL3N1YnBhdGhcbiAgICBiYXNlUGFja2FnZU5hbWUgPSBpbXBvcnROYW1lLnNwbGl0KFwiL1wiKVswXVxuICB9XG4gIHJldHVybiBiYXNlUGFja2FnZU5hbWVcbn1cbiIsICJpbXBvcnQgeyBleHRyYWN0QmFzZVBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZXh0cmFjdEJhc2VQYWNrYWdlTmFtZVwiXG5cbi8qKlxuICogQ2hlY2sgaWYgYSBwYWNrYWdlIGlzIGRlY2xhcmVkIGluIHBhY2thZ2UuanNvbiAoZGVwZW5kZW5jaWVzLCBkZXZEZXBlbmRlbmNpZXMsIG9yIHBlZXJEZXBlbmRlbmNpZXMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24oXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uQ29udGVudCA9IGZzTWFwW1wicGFja2FnZS5qc29uXCJdXG4gIGlmICghcGFja2FnZUpzb25Db250ZW50KSB7XG4gICAgLy8gTm8gcGFja2FnZS5qc29uIG1lYW5zIHdlIGNhbid0IHZhbGlkYXRlIC0gYWxsb3cgdGhlIGltcG9ydFxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvbkNvbnRlbnQpXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzIHx8IHt9XG4gICAgY29uc3QgZGV2RGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzIHx8IHt9XG4gICAgY29uc3QgcGVlckRlcGVuZGVuY2llcyA9IHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMgfHwge31cblxuICAgIC8vIEV4dHJhY3QgdGhlIGJhc2UgcGFja2FnZSBuYW1lIChoYW5kbGUgc2NvcGVkIHBhY2thZ2VzIGFuZCBzdWJwYXRocylcbiAgICBjb25zdCBiYXNlUGFja2FnZU5hbWUgPSBleHRyYWN0QmFzZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIGJhc2VQYWNrYWdlTmFtZSBpbiBkZXBlbmRlbmNpZXMgfHxcbiAgICAgIGJhc2VQYWNrYWdlTmFtZSBpbiBkZXZEZXBlbmRlbmNpZXMgfHxcbiAgICAgIGJhc2VQYWNrYWdlTmFtZSBpbiBwZWVyRGVwZW5kZW5jaWVzXG4gICAgKVxuICB9IGNhdGNoIHtcbiAgICAvLyBJZiB3ZSBjYW4ndCBwYXJzZSBwYWNrYWdlLmpzb24sIGFsbG93IHRoZSBpbXBvcnRcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG59XG4iLCAiaW1wb3J0IHsgZXh0cmFjdEJhc2VQYWNrYWdlTmFtZSB9IGZyb20gXCIuL2V4dHJhY3RCYXNlUGFja2FnZU5hbWVcIlxuXG4vKipcbiAqIENoZWNrIGlmIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnkgZXhpc3RzIGZvciB0aGUgcGFja2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeShcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgYmFzZVBhY2thZ2VOYW1lID0gZXh0cmFjdEJhc2VQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSlcbiAgY29uc3Qgbm9kZU1vZHVsZVBhdGggPSBgbm9kZV9tb2R1bGVzLyR7YmFzZVBhY2thZ2VOYW1lfWBcblxuICAvLyBDaGVjayBpZiBhbnkgZmlsZXMgZXhpc3QgdW5kZXIgdGhpcyBwYXRoIGluIGZzTWFwXG4gIGNvbnN0IGhhc0ZpbGVzID0gT2JqZWN0LmtleXMoZnNNYXApLnNvbWUoXG4gICAgKHBhdGgpID0+IHBhdGguc3RhcnRzV2l0aChub2RlTW9kdWxlUGF0aCArIFwiL1wiKSB8fCBwYXRoID09PSBub2RlTW9kdWxlUGF0aCxcbiAgKVxuXG4gIHJldHVybiBoYXNGaWxlcyA/IG5vZGVNb2R1bGVQYXRoIDogbnVsbFxufVxuIiwgImltcG9ydCB7IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9leHRyYWN0QmFzZVBhY2thZ2VOYW1lXCJcblxuLyoqXG4gKiBHZXQgdGhlIGVudHJ5cG9pbnQgZnJvbSBwYWNrYWdlLmpzb24gKHRoZSBcIm1haW5cIiBvciBcIm1vZHVsZVwiIGZpZWxkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZUpzb25FbnRyeXBvaW50KFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBiYXNlUGFja2FnZU5hbWUgPSBleHRyYWN0QmFzZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKVxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBgbm9kZV9tb2R1bGVzLyR7YmFzZVBhY2thZ2VOYW1lfS9wYWNrYWdlLmpzb25gXG5cbiAgY29uc3QgcGFja2FnZUpzb25Db250ZW50ID0gZnNNYXBbcGFja2FnZUpzb25QYXRoXVxuICBpZiAoIXBhY2thZ2VKc29uQ29udGVudCkgcmV0dXJuIG51bGxcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvbkNvbnRlbnQpXG4gICAgLy8gVHJ5IG1haW4sIG1vZHVsZSwgb3IgZXhwb3J0cyBmaWVsZCAoaW4gb3JkZXIgb2YgcHJlZmVyZW5jZSlcbiAgICByZXR1cm4gcGFja2FnZUpzb24ubWFpbiB8fCBwYWNrYWdlSnNvbi5tb2R1bGUgfHwgbnVsbFxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG4iLCAiLyoqXG4gKiBDaGVjayBpZiB0aGUgZW50cnlwb2ludCBpcyBhIFR5cGVTY3JpcHQgZmlsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlU2NyaXB0RW50cnlwb2ludChlbnRyeXBvaW50OiBzdHJpbmcgfCBudWxsKTogYm9vbGVhbiB7XG4gIGlmICghZW50cnlwb2ludCkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiBlbnRyeXBvaW50LmVuZHNXaXRoKFwiLnRzXCIpIHx8IGVudHJ5cG9pbnQuZW5kc1dpdGgoXCIudHN4XCIpXG59XG4iLCAiaW1wb3J0IHsgZXh0cmFjdEJhc2VQYWNrYWdlTmFtZSB9IGZyb20gXCIuL2V4dHJhY3RCYXNlUGFja2FnZU5hbWVcIlxuXG4vKipcbiAqIENoZWNrIGlmIGRpc3QgZGlyZWN0b3J5IGV4aXN0cyBhbmQgaGFzIGZpbGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc3REaXJFbXB0eShcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZVBhY2thZ2VOYW1lID0gZXh0cmFjdEJhc2VQYWNrYWdlTmFtZShwYWNrYWdlTmFtZSlcbiAgY29uc3QgZGlzdFBhdGggPSBgbm9kZV9tb2R1bGVzLyR7YmFzZVBhY2thZ2VOYW1lfS9kaXN0YFxuXG4gIC8vIENoZWNrIGlmIGFueSBmaWxlcyBleGlzdCB1bmRlciBkaXN0L1xuICBjb25zdCBoYXNGaWxlcyA9IE9iamVjdC5rZXlzKGZzTWFwKS5zb21lKChwYXRoKSA9PlxuICAgIHBhdGguc3RhcnRzV2l0aChkaXN0UGF0aCArIFwiL1wiKSxcbiAgKVxuXG4gIHJldHVybiAhaGFzRmlsZXNcbn1cbiIsICJpbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGdldEltcG9ydHNGcm9tQ29kZSB9IGZyb20gXCJsaWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlXCJcbmltcG9ydCB7IGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcIi4vaW1wb3J0LWV2YWwtcGF0aFwiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCJsaWIvdHJhbnNwaWxlL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ucG0tcGFja2FnZVwiKVxuXG5mdW5jdGlvbiBleHRyYWN0UGFja2FnZVBhdGhGcm9tSlNEZWxpdnIodXJsOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJlZml4ID0gXCJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL1wiXG4gIGlmICh1cmwuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgcmV0dXJuIHVybC5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCkucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gIH1cbiAgcmV0dXJuIHVybFxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0TnBtUGFja2FnZUZyb21DZG4oXG4gIHsgaW1wb3J0TmFtZSwgZGVwdGggPSAwIH06IHsgaW1wb3J0TmFtZTogc3RyaW5nOyBkZXB0aD86IG51bWJlciB9LFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4pIHtcbiAgZGVidWcoYGltcG9ydGluZyBucG0gcGFja2FnZSBmcm9tIENETjogJHtpbXBvcnROYW1lfWApXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSByZXR1cm5cblxuICBjb25zdCBucG1DZG5VcmwgPSBgaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS8ke2ltcG9ydE5hbWV9Lytlc21gXG5cbiAgbGV0IGZpbmFsVXJsOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgY29uc3QgeyBjb250ZW50LCBlcnJvciB9ID0gYXdhaXQgZ2xvYmFsVGhpc1xuICAgIC5mZXRjaChucG1DZG5VcmwpXG4gICAgLnRoZW4oYXN5bmMgKHJlcykgPT4ge1xuICAgICAgZmluYWxVcmwgPSByZXMudXJsXG4gICAgICBpZiAoIXJlcy5vaylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgZmV0Y2ggXCIke2ltcG9ydE5hbWV9XCIgZnJvbSBqc2RlbGl2cjogJHtyZXMuc3RhdHVzVGV4dH1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICAgIClcbiAgICAgIHJldHVybiB7IGNvbnRlbnQ6IGF3YWl0IHJlcy50ZXh0KCksIGVycm9yOiBudWxsIH1cbiAgICB9KVxuICAgIC5jYXRjaCgoZSkgPT4gKHsgZXJyb3I6IGUsIGNvbnRlbnQ6IG51bGwgfSkpXG5cbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIG5wbSBpbXBvcnRcIiwgaW1wb3J0TmFtZSwgZXJyb3IpXG4gICAgdGhyb3cgZXJyb3JcbiAgfVxuXG4gIGNvbnN0IGZpbmFsSW1wb3J0TmFtZSA9IGV4dHJhY3RQYWNrYWdlUGF0aEZyb21KU0RlbGl2cihmaW5hbFVybCEpXG4gIGNvbnN0IGN3ZCA9IGRpcm5hbWUoZmluYWxJbXBvcnROYW1lKVxuXG4gIGNvbnN0IGltcG9ydE5hbWVzID0gZ2V0SW1wb3J0c0Zyb21Db2RlKGNvbnRlbnQhKVxuICBmb3IgKGNvbnN0IHN1YkltcG9ydE5hbWUgb2YgaW1wb3J0TmFtZXMpIHtcbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tzdWJJbXBvcnROYW1lXSkge1xuICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoc3ViSW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgY3dkLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCB0cmFuc2Zvcm1lZENvZGUgPSB0cmFuc2Zvcm1XaXRoU3VjcmFzZShcbiAgICBjb250ZW50ISxcbiAgICBmaW5hbEltcG9ydE5hbWUgfHwgaW1wb3J0TmFtZSxcbiAgKVxuICB0cnkge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgIHRyYW5zZm9ybWVkQ29kZSxcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgIGN3ZCxcbiAgICApLmV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBleHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZpbmFsSW1wb3J0TmFtZV0gPSBleHBvcnRzXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZpbmFsVXJsIV0gPSBleHBvcnRzXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFdmFsIG5wbSBwYWNrYWdlIGVycm9yIGZvciBcIiR7aW1wb3J0TmFtZX1cIjogJHtlLm1lc3NhZ2V9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgIClcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCIuL2V4ZWN1dGlvbi1jb250ZXh0XCJcbmltcG9ydCB7IGltcG9ydExvY2FsRmlsZSB9IGZyb20gXCIuL2ltcG9ydC1sb2NhbC1maWxlXCJcbmltcG9ydCB7IGltcG9ydFNuaXBwZXQgfSBmcm9tIFwiLi9pbXBvcnQtc25pcHBldFwiXG5pbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuaW1wb3J0IHsgaW1wb3J0Tm9kZU1vZHVsZSB9IGZyb20gXCIuL2ltcG9ydC1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROcG1QYWNrYWdlRnJvbUNkbiB9IGZyb20gXCIuL2ltcG9ydC1ucG0tcGFja2FnZS1mcm9tLWNkblwiXG5pbXBvcnQge1xuICBnZXRUc0NvbmZpZyxcbiAgbWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4sXG59IGZyb20gXCJsaWIvcnVubmVyL3RzY29uZmlnUGF0aHNcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBpc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb24gfSBmcm9tIFwiLi9pc1BhY2thZ2VEZWNsYXJlZEluUGFja2FnZUpzb25cIlxuaW1wb3J0IHsgZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeSB9IGZyb20gXCIuL2dldE5vZGVNb2R1bGVEaXJlY3RvcnlcIlxuaW1wb3J0IHsgZ2V0UGFja2FnZUpzb25FbnRyeXBvaW50IH0gZnJvbSBcIi4vZ2V0UGFja2FnZUpzb25FbnRyeXBvaW50XCJcbmltcG9ydCB7IGlzVHlwZVNjcmlwdEVudHJ5cG9pbnQgfSBmcm9tIFwiLi9pc1R5cGVTY3JpcHRFbnRyeXBvaW50XCJcbmltcG9ydCB7IGlzRGlzdERpckVtcHR5IH0gZnJvbSBcIi4vaXNEaXN0RGlyRW1wdHlcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOmltcG9ydC1ldmFsLXBhdGhcIilcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEV2YWxQYXRoKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuICBvcHRzOiB7XG4gICAgY3dkPzogc3RyaW5nXG4gIH0gPSB7fSxcbikge1xuICBkZWJ1ZyhcImltcG9ydEV2YWxQYXRoIGNhbGxlZCB3aXRoOlwiLCB7XG4gICAgaW1wb3J0TmFtZSxcbiAgICBkZXB0aCxcbiAgICBvcHRzLFxuICB9KVxuICBjdHgubG9nZ2VyLmluZm8oXG4gICAgYGltcG9ydEV2YWxQYXRoKFwiJHtpbXBvcnROYW1lfVwiLCB7Y3dkOiBcIiR7b3B0cy5jd2R9XCIsIGRlcHRoOiAke2RlcHRofX0pYCxcbiAgKVxuXG4gIGRlYnVnKGAke1wiICBcIi5yZXBlYXQoZGVwdGgpfVx1MjdBMVx1RkUwRmAsIGltcG9ydE5hbWUpXG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcbiAgY29uc3QgZGlzYWJsZUNkbkxvYWRpbmcgPVxuICAgIGN0eC5kaXNhYmxlQ2RuTG9hZGluZyB8fCAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fRElTQUJMRV9DRE5fTE9BRElOR19fXG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIGluIHByZVN1cHBsaWVkSW1wb3J0c1sxXWApXG4gICAgcmV0dXJuXG4gIH1cbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi4vXCIpICYmIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lLnNsaWNlKDIpXSkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIGluIHByZVN1cHBsaWVkSW1wb3J0c1syXWApXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBIYW5kbGUgc3VicGF0aCBpbXBvcnRzIGZyb20gcHJlU3VwcGxpZWRJbXBvcnRzIChlLmcuLCBcInJlYWN0L2pzeC1ydW50aW1lXCIpXG4gIC8vIElmIHRoZSBiYXNlIHBhY2thZ2UgaXMgaW4gcHJlU3VwcGxpZWRJbXBvcnRzLCB0cnkgdG8gaW1wb3J0IGZyb20gdGhlIGFjdHVhbCBwYWNrYWdlXG4gIGlmIChcbiAgICBpbXBvcnROYW1lLmluY2x1ZGVzKFwiL1wiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIilcbiAgKSB7XG4gICAgY29uc3QgYmFzZVBrZyA9IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpWzBdXG4gICAgY29uc3QgaXNTY29wZWQgPSBiYXNlUGtnLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgY29uc3QgcGtnTmFtZSA9IGlzU2NvcGVkXG4gICAgICA/IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpLnNsaWNlKDAsIDIpLmpvaW4oXCIvXCIpXG4gICAgICA6IGJhc2VQa2dcbiAgICBjb25zdCBzdWJwYXRoID0gaXNTY29wZWRcbiAgICAgID8gaW1wb3J0TmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMikuam9pbihcIi9cIilcbiAgICAgIDogaW1wb3J0TmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMSkuam9pbihcIi9cIilcblxuICAgIGlmIChwcmVTdXBwbGllZEltcG9ydHNbcGtnTmFtZV0pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRyeSB0byBpbXBvcnQgdGhlIHN1YnBhdGggZnJvbSB0aGUgYWN0dWFsIHBhY2thZ2VcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBpbXBvcnQoYCR7cGtnTmFtZX0vJHtzdWJwYXRofWApXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHJlc29sdmVkXG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIHJlc29sdmVkIGZyb20gcHJlU3VwcGxpZWRJbXBvcnRzIGJhc2UgcGFja2FnZSBcIiR7cGtnTmFtZX1cImAsXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBJZiB0aGUgZHluYW1pYyBpbXBvcnQgZmFpbHMsIGNvbnRpbnVlIHdpdGggbm9ybWFsIHJlc29sdXRpb25cbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBGYWlsZWQgdG8gcmVzb2x2ZSBcIiR7aW1wb3J0TmFtZX1cIiBmcm9tIHByZVN1cHBsaWVkSW1wb3J0cyBwYWNrYWdlIFwiJHtwa2dOYW1lfVwiLCBmYWxsaW5nIGJhY2sgdG8gbm9ybWFsIHJlc29sdXRpb25gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGRlcHRoID4gMzApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWF4IGRlcHRoIGZvciBpbXBvcnRzIHJlYWNoZWQgKDMwKSBJbXBvcnQgUGF0aDogJHtjdHguaW1wb3J0U3RhY2suam9pbihcIiAtPiBcIil9YCxcbiAgICApXG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL25wbS9cIikpIHtcbiAgICBjb25zdCBwa2dOYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKC9eXFwvbnBtXFwvLywgXCJcIikucmVwbGFjZSgvXFwvXFwrZXNtJC8sIFwiXCIpXG4gICAgaWYgKGRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgZmluZCBtb2R1bGUgXCIke3BrZ05hbWV9XCIuIFRoZSBwYWNrYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGxvY2FsIGVudmlyb25tZW50LlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnROcG1QYWNrYWdlRnJvbUNkbihcIiR7cGtnTmFtZX1cIilgKVxuICAgIGF3YWl0IGltcG9ydE5wbVBhY2thZ2VGcm9tQ2RuKHsgaW1wb3J0TmFtZTogcGtnTmFtZSwgZGVwdGggfSwgY3R4KVxuICAgIGNvbnN0IHBrZyA9IHByZVN1cHBsaWVkSW1wb3J0c1twa2dOYW1lXVxuICAgIGlmIChwa2cpIHtcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHBrZ1xuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIERldGVybWluZSB3aGVyZSB0c2NvbmZpZy5qc29uIGlzIGxvY2F0ZWRcbiAgbGV0IHRzY29uZmlnRGlyID0gXCIuXCJcbiAgbGV0IHRzQ29uZmlnVG9Vc2UgPSBjdHgudHNDb25maWdcbiAgaWYgKGN0eC50c0NvbmZpZyAmJiBvcHRzLmN3ZCkge1xuICAgIC8vIElmIGN3ZCBpcyBpbiBub2RlX21vZHVsZXMsIGZpbmQgdGhlIHBhY2thZ2Ugcm9vdFxuICAgIC8vIGUuZy4sIFwibm9kZV9tb2R1bGVzL2Fkb20tbGlicmFyeS9saWIvZ2VuZXJhdGVkXCIgLT4gXCJub2RlX21vZHVsZXMvYWRvbS1saWJyYXJ5XCJcbiAgICBjb25zdCBub2RlTW9kdWxlc01hdGNoID0gb3B0cy5jd2QubWF0Y2goL14obm9kZV9tb2R1bGVzXFwvW15cXC9dKykvKVxuICAgIGlmIChub2RlTW9kdWxlc01hdGNoKSB7XG4gICAgICB0c2NvbmZpZ0RpciA9IG5vZGVNb2R1bGVzTWF0Y2hbMV1cbiAgICAgIHRzQ29uZmlnVG9Vc2UgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGggPSByZXNvbHZlRmlsZVBhdGgoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QsXG4gICAgeyB0c0NvbmZpZzogdHNDb25maWdUb1VzZSwgdHNjb25maWdEaXIgfSxcbiAgKVxuICBpZiAocmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydExvY2FsRmlsZShcIiR7cmVzb2x2ZWRMb2NhbEltcG9ydFBhdGh9XCIpYClcbiAgICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUocmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgsIGN0eCwgZGVwdGgpXG4gICAgLy8gTWFwIHRoZSBvcmlnaW5hbCBpbXBvcnQgbmFtZSAod2hpY2ggbWlnaHQgYmUgYSB0c2NvbmZpZyBwYXRoIGFsaWFzKSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlXG4gICAgaWYgKGltcG9ydE5hbWUgIT09IHJlc29sdmVkTG9jYWxJbXBvcnRQYXRoKSB7XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPVxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGhdXG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhpcyBtYXRjaGVzIGEgdHNjb25maWcgcGF0aCBwYXR0ZXJuIGJ1dCBmYWlsZWQgdG8gcmVzb2x2ZVxuICAvLyBJZiBzbywgdGhyb3cgYW4gZXJyb3IgaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgdG8gbnBtXG4gIGNvbnN0IHRzQ29uZmlnID0gY3R4LnRzQ29uZmlnID8/IGdldFRzQ29uZmlnKGN0eC5mc01hcClcbiAgaWYgKCFjdHgudHNDb25maWcgJiYgdHNDb25maWcpIHtcbiAgICBjdHgudHNDb25maWcgPSB0c0NvbmZpZ1xuICB9XG4gIGlmIChtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybihpbXBvcnROYW1lLCB0c0NvbmZpZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiIG1hdGNoZXMgYSB0c2NvbmZpZyBwYXRoIGFsaWFzIGJ1dCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdG8gYW4gZXhpc3RpbmcgZmlsZSR7b3B0cy5jd2QgPyBgIGZyb20gZGlyZWN0b3J5IFwiJHtvcHRzLmN3ZH1cImAgOiBcIlwifVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICApXG4gIH1cblxuICAvLyBUcnkgdG8gcmVzb2x2ZSBmcm9tIG5vZGVfbW9kdWxlc1xuICBjb25zdCByZXNvbHZlZE5vZGVNb2R1bGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gICAgaW1wb3J0TmFtZSxcbiAgICBjdHguZnNNYXAsXG4gICAgb3B0cy5jd2QgfHwgXCJcIixcbiAgKVxuICBpZiAocmVzb2x2ZWROb2RlTW9kdWxlUGF0aCkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aD1cIiR7cmVzb2x2ZWROb2RlTW9kdWxlUGF0aH1cImApXG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnROb2RlTW9kdWxlKFwiJHtpbXBvcnROYW1lfVwiKWApXG4gICAgcmV0dXJuIGltcG9ydE5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIC8vIElmIG5vdCBmb3VuZCBpbiBmc01hcCBidXQgbWlnaHQgYmUgYSBub2RlIG1vZHVsZSwgdHJ5IGltcG9ydE5vZGVNb2R1bGVcbiAgLy8gd2hpY2ggd2lsbCBhdHRlbXB0IHRvIHVzZSBub2RlTW9kdWxlc1Jlc29sdmVyIGlmIGNvbmZpZ3VyZWRcbiAgaWYgKFxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi9cIikgJiZcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQHRzY2kvXCIpXG4gICkge1xuICAgIGNvbnN0IHBsYXRmb3JtID0gY3R4LmNpcmN1aXQ/LnBsYXRmb3JtXG4gICAgaWYgKHBsYXRmb3JtPy5ub2RlTW9kdWxlc1Jlc29sdmVyKSB7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oXG4gICAgICAgIGBpbXBvcnROb2RlTW9kdWxlKFwiJHtpbXBvcnROYW1lfVwiKSB2aWEgbm9kZU1vZHVsZXNSZXNvbHZlcmAsXG4gICAgICApXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBpbXBvcnROb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eCwgZGVwdGgpXG4gICAgICAgIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBub2RlTW9kdWxlc1Jlc29sdmVyIGZhaWxlZCBmb3IgXCIke2ltcG9ydE5hbWV9XCIsIGZhbGxpbmcgYmFjayB0byBucG0gQ0ROYCxcbiAgICAgICAgKVxuICAgICAgICBpZiAoZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiLiBUaGUgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBlbnZpcm9ubWVudCBhbmQgYXV0b21hdGljIG5wbSByZXNvbHV0aW9uIGlzIGRpc2FibGVkLlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiQHRzY2kvXCIpKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBpbXBvcnRTbmlwcGV0KFwiJHtpbXBvcnROYW1lfVwiKWApXG4gICAgcmV0dXJuIGltcG9ydFNuaXBwZXQoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgfVxuXG4gIGlmICghaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSAmJiAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIC8vIFN0ZXAgMTogQ2hlY2sgaWYgcGFja2FnZSBpcyBkZWNsYXJlZCBpbiBwYWNrYWdlLmpzb25cbiAgICBpZiAoIWlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbihpbXBvcnROYW1lLCBjdHguZnNNYXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBOb2RlIG1vZHVsZSBpbXBvcnRlZCBidXQgbm90IGluIHBhY2thZ2UuanNvbiBcIiR7aW1wb3J0TmFtZX1cIlxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBTdGVwIDI6IENoZWNrIGlmIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnkgZXhpc3RzIChvbmx5IGlmIG5vdCBmb3VuZCBsb2NhbGx5IHlldClcbiAgICAvLyBPbmx5IHZhbGlkYXRlIGlmIENETiBsb2FkaW5nIGlzIGRpc2FibGVkIChpLmUuLCBubyBmYWxsYmFjayB0byBqc0RlbGl2ciBhdmFpbGFibGUpXG4gICAgY29uc3Qgbm9kZU1vZHVsZURpciA9IGdldE5vZGVNb2R1bGVEaXJlY3RvcnkoaW1wb3J0TmFtZSwgY3R4LmZzTWFwKVxuICAgIGlmICghbm9kZU1vZHVsZURpciAmJiBkaXNhYmxlQ2RuTG9hZGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIG5vIGZpbGVzIGluIHRoZSBub2RlX21vZHVsZXMgZGlyZWN0b3J5XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogQ2hlY2sgaWYgbWFpbiBlbnRyeXBvaW50IGlzIGEgVHlwZVNjcmlwdCBmaWxlIChvbmx5IGlmIGRpciBleGlzdHMpXG4gICAgaWYgKG5vZGVNb2R1bGVEaXIpIHtcbiAgICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQoaW1wb3J0TmFtZSwgY3R4LmZzTWFwKVxuICAgICAgaWYgKGlzVHlwZVNjcmlwdEVudHJ5cG9pbnQoZW50cnlwb2ludCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgYSB0eXBlc2NyaXB0IGVudHJ5cG9pbnQgdGhhdCBpcyB1bnN1cHBvcnRlZFxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICAvLyBTdGVwIDQ6IENoZWNrIGlmIGRpc3QgZGlyZWN0b3J5IGlzIGVtcHR5IHdoZW4gbWFpbiBwb2ludHMgdG8gZGlzdFxuICAgICAgaWYgKGVudHJ5cG9pbnQ/LnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkge1xuICAgICAgICBpZiAoaXNEaXN0RGlyRW1wdHkoaW1wb3J0TmFtZSwgY3R4LmZzTWFwKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgbm8gZmlsZXMgaW4gZGlzdCwgZGlkIHlvdSBmb3JnZXQgdG8gdHJhbnNwaWxlP1xcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIi4gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQuXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5wbVBhY2thZ2VGcm9tQ2RuKFwiJHtpbXBvcnROYW1lfVwiKWApXG4gICAgcmV0dXJuIGltcG9ydE5wbVBhY2thZ2VGcm9tQ2RuKHsgaW1wb3J0TmFtZSwgZGVwdGggfSwgY3R4KVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBVbnJlc29sdmVkIGltcG9ydCBcIiR7aW1wb3J0TmFtZX1cIiAke29wdHMuY3dkID8gYGZyb20gZGlyZWN0b3J5IFwiJHtvcHRzLmN3ZH1cImAgOiBcIlwifVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgKVxufVxuIiwgImltcG9ydCB0eXBlIHsgQW55Q2lyY3VpdEVsZW1lbnQgfSBmcm9tIFwiY2lyY3VpdC1qc29uXCJcbmltcG9ydCB0eXBlIHtcbiAgQ2lyY3VpdFJ1bm5lckFwaSxcbiAgQ2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG59IGZyb20gXCJsaWIvc2hhcmVkL3R5cGVzXCJcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tIFwiQHRzY2lyY3VpdC9wcm9wc1wiXG5pbXBvcnQgeyBjcmVhdGVFeGVjdXRpb25Db250ZXh0LCBpbXBvcnRFdmFsUGF0aCB9IGZyb20gXCJsaWIvZXZhbFwiXG5pbXBvcnQgeyBub3JtYWxpemVGc01hcCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB7IGdldFRzQ29uZmlnIH0gZnJvbSBcIi4vdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgdHlwZSB7IFJvb3RDaXJjdWl0IH0gZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHsgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkIH0gZnJvbSBcIi4vc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkXCJcbmltcG9ydCB7IGVuaGFuY2VSb290Q2lyY3VpdEhhc05vQ2hpbGRyZW5FcnJvciB9IGZyb20gXCJsaWIvdXRpbHMvZW5oYW5jZS1yb290LWNpcmN1aXQtZXJyb3JcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5pbXBvcnQgeyBzZXRWYWx1ZUF0UGF0aCB9IGZyb20gXCJsaWIvc2hhcmVkL29iai1wYXRoXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpDaXJjdWl0UnVubmVyXCIpXG5cbmV4cG9ydCBjbGFzcyBDaXJjdWl0UnVubmVyIGltcGxlbWVudHMgQ2lyY3VpdFJ1bm5lckFwaSB7XG4gIF9leGVjdXRpb25Db250ZXh0OiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVFeGVjdXRpb25Db250ZXh0PiB8IG51bGwgPSBudWxsXG4gIF9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbjogQ2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24gPSB7XG4gICAgc25pcHBldHNBcGlCYXNlVXJsOiBcImh0dHBzOi8vcmVnaXN0cnktYXBpLnRzY2lyY3VpdC5jb21cIixcbiAgICBjanNSZWdpc3RyeVVybDogXCJodHRwczovL2Nqcy50c2NpcmN1aXQuY29tXCIsXG4gICAgdmVyYm9zZTogZmFsc2UsXG4gIH1cbiAgX2V2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCAoKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKVtdPiA9IHt9XG4gIF9kZWJ1Z05hbWVzcGFjZTogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbjogUGFydGlhbDxDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbj4gPSB7fSkge1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb24pXG4gIH1cblxuICBhc3luYyB2ZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFwiMC4wLjBcIlxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZVdpdGhGc01hcChvZ09wdHM6IHtcbiAgICBlbnRyeXBvaW50Pzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudFBhdGg/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50TmFtZT86IHN0cmluZ1xuICAgIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgbmFtZT86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9wdHMgPSB7IC4uLm9nT3B0cyB9XG5cbiAgICBpZiAodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgRGVidWcuZW5hYmxlKFwidHNjaTpldmFsOipcIilcbiAgICB9XG5cbiAgICBkZWJ1ZyhcImV4ZWN1dGVXaXRoRnNNYXAgY2FsbGVkIHdpdGg6XCIsIHtcbiAgICAgIGVudHJ5cG9pbnQ6IG9wdHMuZW50cnlwb2ludCxcbiAgICAgIGZzTWFwS2V5czogT2JqZWN0LmtleXMob3B0cy5mc01hcCksXG4gICAgICBuYW1lOiBvcHRzLm5hbWUsXG4gICAgfSlcblxuICAgIHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZChvcHRzKVxuXG4gICAgZGVidWcoXCJlbnRyeXBvaW50IGFmdGVyIHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZDpcIiwge1xuICAgICAgZW50cnlwb2ludDogb3B0cy5lbnRyeXBvaW50LFxuICAgIH0pXG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICBuYW1lOiBvcHRzLm5hbWUsXG4gICAgICAgIHBsYXRmb3JtOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgICAgcHJvamVjdENvbmZpZzogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgICAgZGVidWdOYW1lc3BhY2U6IHRoaXMuX2RlYnVnTmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICApXG4gICAgdGhpcy5fYmluZEV2ZW50TGlzdGVuZXJzKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdClcblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZW50cnlwb2ludCA9IG9wdHMuZW50cnlwb2ludCFcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwID0gbm9ybWFsaXplRnNNYXAob3B0cy5mc01hcClcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LnRzQ29uZmlnID0gZ2V0VHNDb25maWcodGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcClcbiAgICBpZiAoIXRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXBbb3B0cy5lbnRyeXBvaW50IV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50cnlwb2ludCBcIiR7b3B0cy5lbnRyeXBvaW50fVwiIG5vdCBmb3VuZGApXG4gICAgfVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcblxuICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBvcHRzLmVudHJ5cG9pbnQhLnN0YXJ0c1dpdGgoXCIuL1wiKVxuICAgICAgPyBvcHRzLmVudHJ5cG9pbnRcbiAgICAgIDogYC4vJHtvcHRzLmVudHJ5cG9pbnR9YFxuXG4gICAgZGVidWcoXCJmaW5hbCBlbnRyeXBvaW50OlwiLCBlbnRyeXBvaW50KVxuICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKGVudHJ5cG9pbnQhLCB0aGlzLl9leGVjdXRpb25Db250ZXh0KVxuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZShjb2RlOiBzdHJpbmcsIG9wdHM6IHsgbmFtZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIFwiW0NpcmN1aXRSdW5uZXJdIGV4ZWN1dGUgY2FsbGVkIHdpdGggY29kZSBsZW5ndGg6XCIsXG4gICAgICAgIGNvZGUubGVuZ3RoLFxuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIHBsYXRmb3JtOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSxcbiAgICAgICAgcHJvamVjdENvbmZpZzogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgICAgZGVidWdOYW1lc3BhY2U6IHRoaXMuX2RlYnVnTmFtZXNwYWNlLFxuICAgICAgfSxcbiAgICApXG4gICAgdGhpcy5fYmluZEV2ZW50TGlzdGVuZXJzKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdClcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwW1wiZW50cnlwb2ludC50c3hcIl0gPSBjb2RlXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC50c0NvbmZpZyA9IGdldFRzQ29uZmlnKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXApXG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuXG4gICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoXCIuL2VudHJ5cG9pbnQudHN4XCIsIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpXG4gIH1cblxuICBhc3luYyBleGVjdXRlQ29tcG9uZW50KGNvbXBvbmVudDogYW55LCBvcHRzOiB7IG5hbWU/OiBzdHJpbmcgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnZlcmJvc2UpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW0NpcmN1aXRSdW5uZXJdIGV4ZWN1dGVDb21wb25lbnQgY2FsbGVkXCIpXG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuICAgIDsoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fdHNjaXJjdWl0X2NpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXRcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LnRzQ29uZmlnID0gbnVsbFxuXG4gICAgY29uc3QgZWxlbWVudCA9IHR5cGVvZiBjb21wb25lbnQgPT09IFwiZnVuY3Rpb25cIiA/IGNvbXBvbmVudCgpIDogY29tcG9uZW50XG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LmFkZChlbGVtZW50IGFzIGFueSlcbiAgfVxuXG4gIG9uKGV2ZW50OiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0gPz89IFtdXG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdLnB1c2goY2FsbGJhY2spXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dD8uY2lyY3VpdC5vbihldmVudCBhcyBhbnksIGNhbGxiYWNrKVxuICB9XG5cbiAgYXN5bmMgcmVuZGVyVW50aWxTZXR0bGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5fZXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2lyY3VpdCBoYXMgYmVlbiBjcmVhdGVkXCIpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQucmVuZGVyVW50aWxTZXR0bGVkKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yKFxuICAgICAgICBlcnJvcixcbiAgICAgICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5lbnRyeXBvaW50LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENpcmN1aXRKc29uKCk6IFByb21pc2U8QW55Q2lyY3VpdEVsZW1lbnRbXT4ge1xuICAgIGlmICghdGhpcy5fZXhlY3V0aW9uQ29udGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY2lyY3VpdCBoYXMgYmVlbiBjcmVhdGVkXCIpXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0LmdldENpcmN1aXRKc29uKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yKFxuICAgICAgICBlcnJvcixcbiAgICAgICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5lbnRyeXBvaW50LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQ/LmNpcmN1aXQpIHtcbiAgICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0pIHtcbiAgICAgICAgICBjb25zdCBjaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0IGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiA8ZXhwbGFuYXRpb24+XG4gICAgICAgICAgICByZW1vdmVMaXN0ZW5lcj86IChldmVudDogc3RyaW5nLCBsaXN0ZW5lcjogRnVuY3Rpb24pID0+IHZvaWRcbiAgICAgICAgICB9XG4gICAgICAgICAgY2lyY3VpdC5yZW1vdmVMaXN0ZW5lcj8uKGV2ZW50LCBsaXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF1cbiAgICB9XG4gIH1cblxuICBhc3luYyBraWxsKCkge1xuICAgIC8vIENsZWFudXAgcmVzb3VyY2VzXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IG51bGxcbiAgfVxuXG4gIGFzeW5jIHNldFNuaXBwZXRzQXBpQmFzZVVybChiYXNlVXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5zbmlwcGV0c0FwaUJhc2VVcmwgPSBiYXNlVXJsXG4gIH1cblxuICBhc3luYyBzZXREaXNhYmxlQ2RuTG9hZGluZyhkaXNhYmxlOiBib29sZWFuKSB7XG4gICAgOyh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiBhcyBhbnkpLmRpc2FibGVDZG5Mb2FkaW5nID0gZGlzYWJsZVxuICB9XG5cbiAgYXN5bmMgc2V0UGxhdGZvcm1Db25maWcocGxhdGZvcm06IFBsYXRmb3JtQ29uZmlnKSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0gPSBwbGF0Zm9ybVxuICB9XG5cbiAgYXN5bmMgc2V0UGxhdGZvcm1Db25maWdQcm9wZXJ0eShwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSkge1xuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0gPSB7fVxuICAgIH1cbiAgICBzZXRWYWx1ZUF0UGF0aCh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSwgcHJvcGVydHksIHZhbHVlKVxuICB9XG5cbiAgYXN5bmMgc2V0UHJvamVjdENvbmZpZyhwcm9qZWN0OiBQYXJ0aWFsPFBsYXRmb3JtQ29uZmlnPikge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcgPSBwcm9qZWN0XG4gIH1cblxuICBhc3luYyBzZXRQcm9qZWN0Q29uZmlnUHJvcGVydHkocHJvcGVydHk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZykge1xuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyA9IHt9XG4gICAgfVxuICAgIHNldFZhbHVlQXRQYXRoKFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyxcbiAgICAgIHByb3BlcnR5LFxuICAgICAgdmFsdWUsXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgZW5hYmxlRGVidWcobmFtZXNwYWNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZWJ1Z05hbWVzcGFjZSA9IG5hbWVzcGFjZVxuICAgIGlmICh0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICBjb25zdCBjaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0IGFzIGFueVxuICAgICAgY2lyY3VpdC5lbmFibGVEZWJ1Zz8uKG5hbWVzcGFjZSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9iaW5kRXZlbnRMaXN0ZW5lcnMoY2lyY3VpdDogUm9vdENpcmN1aXQpIHtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMuX2V2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICBjaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgbGlzdGVuZXIgYXMgYW55KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwiLi9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IERlYnVnIGZyb20gXCJkZWJ1Z1wiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6c2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkXCIpXG5cbmV4cG9ydCBjb25zdCBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgPSAob3B0czoge1xuICBlbnRyeXBvaW50Pzogc3RyaW5nXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIG1haW5Db21wb25lbnRQYXRoPzogc3RyaW5nXG4gIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gIG5hbWU/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxufSkgPT4ge1xuICBpZiAoIW9wdHMuZW50cnlwb2ludCAmJiAhb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIGlmIChcImluZGV4LnRzeFwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBcImluZGV4LnRzeFwiXG4gICAgfSBlbHNlIGlmIChcImluZGV4LnRzXCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHNcIlxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5maWx0ZXIoKGspID0+IGsuZW5kc1dpdGgoXCIudHN4XCIpKS5sZW5ndGggPT09IDFcbiAgICApIHtcbiAgICAgIG9wdHMubWFpbkNvbXBvbmVudFBhdGggPSBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKVswXVxuICAgIH0gZWxzZSBpZiAoXCJ0c2NpcmN1aXQuY29uZmlnLmpzb25cIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBjb25zdCBjb25maWdDb250ZW50ID0gb3B0cy5mc01hcFtcInRzY2lyY3VpdC5jb25maWcuanNvblwiXVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShjb25maWdDb250ZW50KVxuICAgICAgICBpZiAoY29uZmlnLm1haW5FbnRyeXBvaW50KSB7XG4gICAgICAgICAgb3B0cy5lbnRyeXBvaW50ID0gY29uZmlnLm1haW5FbnRyeXBvaW50XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIHBhcnNlIHRzY2lyY3VpdC5jb25maWcuanNvbjpcIiwgZSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkVpdGhlciBlbnRyeXBvaW50IG9yIG1haW5Db21wb25lbnRQYXRoIG11c3QgYmUgcHJvdmlkZWQgKG5vIGluZGV4IGZpbGUsIGNvdWxkIG5vdCBpbmZlciBlbnRyeXBvaW50KVwiLFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGlmICghb3B0cy5lbnRyeXBvaW50ICYmIG9wdHMubWFpbkNvbXBvbmVudFBhdGgpIHtcbiAgICBvcHRzLmVudHJ5cG9pbnQgPSBcImVudHJ5cG9pbnQudHN4XCJcbiAgICBjb25zdCBtYWluQ29tcG9uZW50Q29kZSA9XG4gICAgICBvcHRzLmZzTWFwW3Jlc29sdmVGaWxlUGF0aE9yVGhyb3cob3B0cy5tYWluQ29tcG9uZW50UGF0aCwgb3B0cy5mc01hcCldXG4gICAgaWYgKCFtYWluQ29tcG9uZW50Q29kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTWFpbiBjb21wb25lbnQgcGF0aCBcIiR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIiBub3QgZm91bmQgaW4gZnNNYXAuIEF2YWlsYWJsZSBwYXRoczogJHtPYmplY3Qua2V5cyhvcHRzLmZzTWFwKS5qb2luKFwiLCBcIil9YCxcbiAgICAgIClcbiAgICB9XG4gICAgb3B0cy5mc01hcFtvcHRzLmVudHJ5cG9pbnRdID0gYFxuICAgICBpbXBvcnQgKiBhcyBVc2VyQ29tcG9uZW50cyBmcm9tIFwiLi8ke29wdHMubWFpbkNvbXBvbmVudFBhdGh9XCI7XG4gICAgICAgICAgXG4gICAgICAke1xuICAgICAgICBvcHRzLm1haW5Db21wb25lbnROYW1lXG4gICAgICAgICAgPyBgXG4gICAgICAgIGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gVXNlckNvbXBvbmVudHNbXCIke29wdHMubWFpbkNvbXBvbmVudE5hbWV9XCJdXG4gICAgICAgIGBcbiAgICAgICAgICA6IGBjb25zdCBDb21wb25lbnRUb1JlbmRlciA9IFVzZXJDb21wb25lbnRzLmRlZmF1bHQgfHwgXG4gICAgICAgICAgT2JqZWN0LmVudHJpZXMoVXNlckNvbXBvbmVudHMpXG4gICAgICAgICAgLmZpbHRlcigoW25hbWVdKSA9PiAhbmFtZS5zdGFydHNXaXRoKFwidXNlXCIpKVxuICAgICAgICAgIC5tYXAoKFtfLCBjb21wb25lbnRdKSA9PiBjb21wb25lbnQpWzBdIHx8ICgoKSA9PiBudWxsKTtgXG4gICAgICB9XG5cbiAgICAgICAgICAgJHtcbiAgICAgICAgICAgICBkZWJ1Zy5lbmFibGVkXG4gICAgICAgICAgICAgICA/IGBcbiAgICAgY29uc29sZS5sb2coeyBVc2VyQ29tcG9uZW50cyB9KVxuICAgICBjb25zb2xlLmxvZyhcIkNvbXBvbmVudFRvUmVuZGVyIFwiICsgQ29tcG9uZW50VG9SZW5kZXIudG9TdHJpbmcoKSwgIHsgQ29tcG9uZW50VG9SZW5kZXIgfSlcbiAgICAgYFxuICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgIH1cblxuICAgICAgY2lyY3VpdC5hZGQoICAgICAgIFxuICAgICAgICAgIDxDb21wb25lbnRUb1JlbmRlciAke29wdHMubWFpbkNvbXBvbmVudFByb3BzID8gYHsuLi4ke0pTT04uc3RyaW5naWZ5KG9wdHMubWFpbkNvbXBvbmVudFByb3BzLCBudWxsLCAyKX19YCA6IFwiXCJ9IC8+IFxuICAgICAgKTtcbmBcbiAgfVxuXG4gIGlmICghb3B0cy5uYW1lICYmIG9wdHMubWFpbkNvbXBvbmVudE5hbWUpIHtcbiAgICBvcHRzLm5hbWUgPSBvcHRzLm1haW5Db21wb25lbnROYW1lXG4gIH1cbn1cbiIsICJleHBvcnQgY29uc3QgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yID0gKFxuICBlcnJvcjogdW5rbm93bixcbiAgZW50cnlwb2ludD86IHN0cmluZyxcbikgPT4ge1xuICBpZiAoXG4gICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgIGVudHJ5cG9pbnQgJiZcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiUm9vdENpcmN1aXQgaGFzIG5vIGNoaWxkcmVuXCIpICYmXG4gICAgIWVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ1wiZW50cnlwb2ludFwiOicpXG4gICkge1xuICAgIGNvbnN0IGVudHJ5cG9pbnRNZXNzYWdlID0gZW50cnlwb2ludC5zdGFydHNXaXRoKFwiLi9cIilcbiAgICAgID8gZW50cnlwb2ludC5zbGljZSgyKVxuICAgICAgOiBlbnRyeXBvaW50XG4gICAgZXJyb3IubWVzc2FnZSA9IGAke2Vycm9yLm1lc3NhZ2V9LiBcImVudHJ5cG9pbnRcIjogXCIke2VudHJ5cG9pbnRNZXNzYWdlfVwiIGlzIHNldCBpbiB0aGUgcnVubmVyIGNvbmZpZ3VyYXRpb24sIGVudHJ5cG9pbnRzIG11c3QgY29udGFpbiBcImNpcmN1aXQuYWRkKC4uLilcIiwgeW91IG1pZ2h0IGJlIGxvb2tpbmcgdG8gdXNlIG1haW5Db21wb25lbnRQYXRoIGluc3RlYWQgaWYgeW91ciBmaWxlIGV4cG9ydHMgYSBjb21wb25lbnQuYFxuICB9XG5cbiAgcmV0dXJuIGVycm9yXG59XG4iLCAiLyoqXG4gKiBHZXQgYWxsIHBhdGhzIG9mIGFuIG9iamVjdFxuICpcbiAqIGdldE9iamVjdFBhdGhzKHsgYTogeyBiOiAyLCBjOiB7IGQ6IDMgfSB9LCBlOiA1IH0pXG4gKlxuICogLy8gT3V0cHV0OiBbJ2EuYicsICdhLmMuZCcsICdlJ11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9iamVjdFBhdGhzKFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHByZWZpeCA9IFwiXCIsXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV1cbiAgICBjb25zdCBwYXRoID0gcHJlZml4ID8gYCR7cHJlZml4fS4ke2tleX1gIDoga2V5XG5cbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgY29uc3Qgc3ViUGF0aHMgPSBnZXRPYmplY3RQYXRocyh2YWx1ZSwgcGF0aClcbiAgICAgIHBhdGhzLnB1c2goLi4uc3ViUGF0aHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdGhzLnB1c2gocGF0aClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGF0aHNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlQXRQYXRoKG9iajogUmVjb3JkPHN0cmluZywgYW55PiwgcGF0aDogc3RyaW5nKTogYW55IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoXCIuXCIpXG4gIGxldCBjdXJyZW50ID0gb2JqXG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXldXG4gIH1cbiAgcmV0dXJuIGN1cnJlbnRcbn1cbi8qKlxuICogU2V0IGEgdmFsdWUgYXQgYSBwYXRoIGluIGFuIG9iamVjdFxuICpcbiAqIHNldFZhbHVlQXRQYXRoKHsgYTogeyBiOiAyIH0gfSwgXCJhLmMuZFwiLCA1KVxuICpcbiAqIC8vIE91dHB1dDogeyBhOiB7IGI6IDIsIGM6IHsgZDogNSB9IH0gfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWVBdFBhdGgoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcGF0aDogc3RyaW5nLFxuICB2YWx1ZTogYW55LFxuKSB7XG4gIGNvbnN0IGtleXMgPSBwYXRoLnNwbGl0KFwiLlwiKVxuICBsZXQgY3VycmVudCA9IG9ialxuICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBrZXlzW2ldXG5cbiAgICAvLyBJZiB3ZSdyZSBhdCB0aGUgbGFzdCBrZXksIHNldCB0aGUgdmFsdWUuXG4gICAgaWYgKGkgPT09IGtleXMubGVuZ3RoIC0gMSkge1xuICAgICAgY3VycmVudFtrZXldID0gdmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCBhbiBvYmplY3QgKGF2b2lkIG92ZXJ3cml0aW5nIGFycmF5cyksIGNyZWF0ZSBhIG5ldyBvYmplY3RcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpIHx8XG4gICAgICAgIHR5cGVvZiBjdXJyZW50W2tleV0gIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgY3VycmVudFtrZXldID09PSBudWxsIHx8XG4gICAgICAgIEFycmF5LmlzQXJyYXkoY3VycmVudFtrZXldKVxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnRba2V5XSA9IHt9XG4gICAgICB9XG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgQ2lyY3VpdFJ1bm5lciB9IGZyb20gXCIuL0NpcmN1aXRSdW5uZXJcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVHNjaXJjdWl0Q29kZShcbiAgZmlsZXN5c3RlbU9yQ29kZVN0cmluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZyxcbiAgb3B0cz86IE9taXQ8UGFyYW1ldGVyczxDaXJjdWl0UnVubmVyW1wiZXhlY3V0ZVdpdGhGc01hcFwiXT5bMF0sIFwiZnNNYXBcIj4sXG4pIHtcbiAgaWYgKFxuICAgIHR5cGVvZiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nID09PSBcInN0cmluZ1wiICYmXG4gICAgIWZpbGVzeXN0ZW1PckNvZGVTdHJpbmcuaW5jbHVkZXMoXCJleHBvcnRcIilcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSBcImV4cG9ydFwiIGtleXdvcmQgd2Fzbid0IGZvdW5kIGluIHlvdXIgcHJvdmlkZWQgY29kZS4gWW91IG5lZWQgdG8gZXhwb3J0IGEgY29tcG9uZW50IGluIHlvdXIgY29kZSwgZS5nLlxcblxcbmV4cG9ydCBkZWZhdWx0ICgpID0+IChcXG4gIDxyZXNpc3RvciBuYW1lPVwiUjFcIiByZXNpc3RhbmNlPVwiMWtcIiAvPlxcbilgLFxuICAgIClcbiAgfVxuICBjb25zdCBmaWxlc3lzdGVtID1cbiAgICB0eXBlb2YgZmlsZXN5c3RlbU9yQ29kZVN0cmluZyA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyB7IFwidXNlci1jb2RlLnRzeFwiOiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nIH1cbiAgICAgIDogZmlsZXN5c3RlbU9yQ29kZVN0cmluZ1xuXG4gIGNvbnN0IGNpcmN1aXRSdW5uZXIgPSBuZXcgQ2lyY3VpdFJ1bm5lcigpXG5cbiAgYXdhaXQgY2lyY3VpdFJ1bm5lci5leGVjdXRlV2l0aEZzTWFwKHtcbiAgICBmc01hcDogZmlsZXN5c3RlbSxcbiAgICAuLi5vcHRzLFxuICB9KVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIucmVuZGVyVW50aWxTZXR0bGVkKClcblxuICByZXR1cm4gYXdhaXQgY2lyY3VpdFJ1bm5lci5nZXRDaXJjdWl0SnNvbigpXG59XG4iLCAiaW1wb3J0IHsgcnVuVHNjaXJjdWl0Q29kZSB9IGZyb20gXCIuL3J1blRzY2lyY3VpdENvZGVcIlxuXG5leHBvcnQgY29uc3QgcnVuVHNjaXJjdWl0TW9kdWxlID0gYXN5bmMgKFxuICBtb2R1bGU6IHN0cmluZyxcbiAgb3B0czogeyBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT47IGV4cG9ydE5hbWU/OiBzdHJpbmcgfSA9IHt9LFxuKSA9PiB7XG4gIGlmICghbW9kdWxlLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgbW9kdWxlID0gYEB0c2NpLyR7bW9kdWxlLnJlcGxhY2UoL1xcLy8sIFwiLlwiKX1gXG4gIH1cbiAgY29uc3QgY2lyY3VpdEpzb24gPSBhd2FpdCBydW5Uc2NpcmN1aXRDb2RlKFxuICAgIHtcbiAgICAgIC8vIFRPRE8gaGFuZGxlIGV4cG9ydHMgdGhhdCBhcmUgbm90IHRoZSBkZWZhdWx0IGV4cG9ydCBieSBzY2FubmluZ1xuICAgICAgLy8gb3RoZXJFeHBvcnRzIGZvciBjb21wb25lbnRzXG4gICAgICBcInVzZXItY29kZS50c3hcIjogYFxuICAgIGltcG9ydCBNb2R1bGUsICogYXMgb3RoZXJFeHBvcnRzIGZyb20gXCIke21vZHVsZX1cIjtcblxuICAgIGxldCBleHBvcnROYW1lID0gXCIke29wdHMuZXhwb3J0TmFtZSA/PyBcIlwifVwiXG5cbiAgICBpZiAoKCFNb2R1bGUgfHwgdHlwZW9mIE1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSAmJiAhQm9vbGVhbihleHBvcnROYW1lKSkge1xuICAgICAgZXhwb3J0TmFtZSA9IE9iamVjdC5rZXlzKG90aGVyRXhwb3J0cykuZmlsdGVyKGtleSA9PiBrZXlbMF0gPT09IGtleVswXS50b1VwcGVyQ2FzZSgpICYmIHR5cGVvZiBvdGhlckV4cG9ydHNba2V5XSA9PT0gXCJmdW5jdGlvblwiKVswXVxuICAgIH1cblxuICAgIGNvbnN0IGRlZmF1bHRFeHBvcnQgPSBleHBvcnROYW1lID8gb3RoZXJFeHBvcnRzW2V4cG9ydE5hbWVdIDogTW9kdWxlXG5cbiAgICBpZiAoIWRlZmF1bHRFeHBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcXGBObyBleHBvcnQgZm91bmQgZm9yIG1vZHVsZSBcIlxcJHttb2R1bGV9XCIgKHRyaWVkIFwiXFwke2V4cG9ydE5hbWUgPz8gXCJkZWZhdWx0XCJ9XCIpXFxgKVxuICAgIH1cblxuICAgIGV4cG9ydCBkZWZhdWx0IGRlZmF1bHRFeHBvcnQ7XG4gICAgYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG1haW5Db21wb25lbnRQcm9wczogb3B0cy5wcm9wcyxcbiAgICB9LFxuICApXG4gIHJldHVybiBjaXJjdWl0SnNvblxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsbUJBQW1CO0FBRTVCLFlBQVksbUJBQW1CO0FBQy9CLFlBQVksV0FBVztBQUN2QixZQUFZLHFCQUFxQjtBQUNqQyxZQUFZLHdCQUF3Qjs7O0FDQTdCLElBQU0sZ0NBQWdDLENBQzNDLG1CQUN1QjtBQUV2QixNQUFJLFFBQVEsZUFBZSxNQUFNLGdCQUFnQjtBQUNqRCxNQUFJLE1BQU8sUUFB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LGdCQUFnQixDQUFDO0FBQUEsSUFDcEQ7QUFDQTtBQUFBLE1BQ0UsS0FBSyw0QkFBNEI7QUFBQSxNQUNqQztBQUFBLE1BQ0E7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBRUEsTUFBTSxZQUFZLFdBQW1CO0FBQ25DLFNBQUssa0JBQWtCO0FBQ3ZCLFFBQUksS0FBSyxtQkFBbUI7QUFDMUIsWUFBTSxVQUFVLEtBQUssa0JBQWtCO0FBQ3ZDLGNBQVEsY0FBYyxTQUFTO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBQUEsRUFFUSxvQkFBb0IsU0FBc0I7QUFDaEQsZUFBVyxTQUFTLEtBQUssaUJBQWlCO0FBQ3hDLGlCQUFXLFlBQVksS0FBSyxnQkFBZ0IsS0FBSyxHQUFHO0FBQ2xELGdCQUFRLEdBQUcsT0FBYyxRQUFlO0FBQUEsTUFDMUM7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGOzs7QUloUEEsZUFBc0IsaUJBQ3BCLHdCQUNBLE1BQ0E7QUFDQSxNQUNFLE9BQU8sMkJBQTJCLFlBQ2xDLENBQUMsdUJBQXVCLFNBQVMsUUFBUSxHQUN6QztBQUNBLFVBQU0sSUFBSTtBQUFBLE1BQ1I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsUUFBTSxhQUNKLE9BQU8sMkJBQTJCLFdBQzlCLEVBQUUsaUJBQWlCLHVCQUF1QixJQUMxQztBQUVOLFFBQU0sZ0JBQWdCLElBQUksY0FBYztBQUV4QyxRQUFNLGNBQWMsaUJBQWlCO0FBQUEsSUFDbkMsT0FBTztBQUFBLElBQ1AsR0FBRztBQUFBLEVBQ0wsQ0FBQztBQUVELFFBQU0sY0FBYyxtQkFBbUI7QUFFdkMsU0FBTyxNQUFNLGNBQWMsZUFBZTtBQUM1Qzs7O0FDM0JPLElBQU0scUJBQXFCLE9BQ2hDLFFBQ0EsT0FBNkQsQ0FBQyxNQUMzRDtBQUNILE1BQUksQ0FBQyxPQUFPLFdBQVcsR0FBRyxHQUFHO0FBQzNCLGFBQVMsU0FBUyxPQUFPLFFBQVEsTUFBTSxHQUFHLENBQUM7QUFBQSxFQUM3QztBQUNBLFFBQU0sY0FBYyxNQUFNO0FBQUEsSUFDeEI7QUFBQTtBQUFBO0FBQUEsTUFHRSxpQkFBaUI7QUFBQSw2Q0FDc0IsTUFBTTtBQUFBO0FBQUEsd0JBRTNCLEtBQUssY0FBYyxFQUFFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQWN6QztBQUFBLElBQ0E7QUFBQSxNQUNFLG9CQUFvQixLQUFLO0FBQUEsSUFDM0I7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJpbXBvcnROYW1lIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgInVucHJlZml4ZWRQYXRoIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIiwgImRlYnVnIiwgIkRlYnVnIl0KfQo=
|
|
1842
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbGliL2V2YWwvZXhlY3V0aW9uLWNvbnRleHQudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL0B0c2NpcmN1aXQvcGFydHMtZW5naW5lL2xpYi9mb290cHJpbnQtdHJhbnNsYXRvcnMvZ2V0LWZvb3RwcmludGVyLXN0cmluZy1mcm9tLWtpY2FkLnRzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9AdHNjaXJjdWl0L3BhcnRzLWVuZ2luZS9saWIvZm9vdHByaW50LXRyYW5zbGF0b3JzL2dldC1qbGMtcGFja2FnZS1mcm9tLWZvb3RwcmludGVyLXN0cmluZy50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2Zvb3RwcmludC10cmFuc2xhdG9ycy9pbmRleC50cyIsICIuLi8uLi9ub2RlX21vZHVsZXMvQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmUvbGliL2psYy1wYXJ0cy1lbmdpbmUudHMiLCAiLi4vLi4vbGliL2dldFBsYXRmb3JtQ29uZmlnLnRzIiwgIi4uLy4uL2xpYi91dGlscy9keW5hbWljYWxseS1sb2FkLWRlcGVuZGVuY3ktd2l0aC1jZG4tYmFja3VwLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvbm9ybWFsaXplRnNNYXAudHMiLCAiLi4vLi4vbGliL3V0aWxzL2Rpcm5hbWUudHMiLCAiLi4vLi4vbGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci90c2NvbmZpZ1BhdGhzLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcmVzb2x2ZUZpbGVQYXRoLnRzIiwgIi4uLy4uL2xpYi91dGlscy9zdHJpcC1jb21tZW50cy50cyIsICIuLi8uLi9saWIvdXRpbHMvZ2V0LWltcG9ydHMtZnJvbS1jb2RlLnRzIiwgIi4uLy4uL2xpYi91dGlscy9yZXNvbHZlLW5vZGUtbW9kdWxlLnRzIiwgIi4uLy4uL2xpYi9ldmFsL2V2YWwtY29tcGlsZWQtanMudHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LWxvY2FsLWZpbGUudHMiLCAiLi4vLi4vbGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9ucy50cyIsICIuLi8uLi9saWIvdHJhbnNwaWxlL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2UudHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LXNuaXBwZXQudHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LW5vZGUtbW9kdWxlLnRzIiwgIi4uLy4uL2xpYi9ldmFsL2V4dHJhY3RCYXNlUGFja2FnZU5hbWUudHMiLCAiLi4vLi4vbGliL2V2YWwvaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uLnRzIiwgIi4uLy4uL2xpYi9ldmFsL2dldE5vZGVNb2R1bGVEaXJlY3RvcnkudHMiLCAiLi4vLi4vbGliL2V2YWwvZ2V0UGFja2FnZUpzb25FbnRyeXBvaW50LnRzIiwgIi4uLy4uL2xpYi9ldmFsL2lzVHlwZVNjcmlwdEVudHJ5cG9pbnQudHMiLCAiLi4vLi4vbGliL2V2YWwvaXNEaXN0RGlyRW1wdHkudHMiLCAiLi4vLi4vbGliL2V2YWwvaW1wb3J0LW5wbS1wYWNrYWdlLWZyb20tY2RuLnRzIiwgIi4uLy4uL2xpYi9ldmFsL2ltcG9ydC1ldmFsLXBhdGgudHMiLCAiLi4vLi4vbGliL3J1bm5lci9DaXJjdWl0UnVubmVyLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkLnRzIiwgIi4uLy4uL2xpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvci50cyIsICIuLi8uLi9saWIvc2hhcmVkL29iai1wYXRoLnRzIiwgIi4uLy4uL2xpYi9ydW5uZXIvcnVuVHNjaXJjdWl0Q29kZS50cyIsICIuLi8uLi9saWIvcnVubmVyL3J1blRzY2lyY3VpdE1vZHVsZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCB0eXBlIHsgV2ViV29ya2VyQ29uZmlndXJhdGlvbiB9IGZyb20gXCJsaWIvc2hhcmVkL3R5cGVzXCJcbmltcG9ydCAqIGFzIHRzY2lyY3VpdENvcmUgZnJvbSBcIkB0c2NpcmN1aXQvY29yZVwiXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0ICogYXMgUmVhY3RKc3hSdW50aW1lIGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiXG5pbXBvcnQgKiBhcyB0c2NpcmN1aXRNYXRoVXRpbHMgZnJvbSBcIkB0c2NpcmN1aXQvbWF0aC11dGlsc1wiXG5pbXBvcnQgdHlwZSB7IFBsYXRmb3JtQ29uZmlnIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgZ2V0UGxhdGZvcm1Db25maWcgfSBmcm9tIFwibGliL2dldFBsYXRmb3JtQ29uZmlnXCJcbmltcG9ydCB0eXBlIHsgVHNDb25maWcgfSBmcm9tIFwibGliL3J1bm5lci90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCAqIGFzIHRzbGliIGZyb20gXCJ0c2xpYlwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpleGVjdXRpb24tY29udGV4dFwiKVxuXG5pbnRlcmZhY2UgU3RvcmVkTG9nZ2VyIHtcbiAgaW5mbzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZFxuICBnZXRMb2dzOiAoKSA9PiBBcnJheTx7IG1zZzogc3RyaW5nIH0+XG4gIHN0cmluZ2lmeUxvZ3M6ICgpID0+IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvbnRleHQgZXh0ZW5kcyBXZWJXb3JrZXJDb25maWd1cmF0aW9uIHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZW50cnlwb2ludDogc3RyaW5nXG4gIHByZVN1cHBsaWVkSW1wb3J0czogUmVjb3JkPHN0cmluZywgYW55PlxuICBjaXJjdWl0OiBSb290Q2lyY3VpdFxuICBsb2dnZXI6IFN0b3JlZExvZ2dlclxuICB0c0NvbmZpZzogVHNDb25maWcgfCBudWxsXG4gIGltcG9ydFN0YWNrOiBzdHJpbmdbXVxuICBjdXJyZW50bHlJbXBvcnRpbmc6IFNldDxzdHJpbmc+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICB3ZWJXb3JrZXJDb25maWd1cmF0aW9uOiBXZWJXb3JrZXJDb25maWd1cmF0aW9uLFxuICBvcHRzOiB7XG4gICAgbmFtZT86IHN0cmluZ1xuICAgIHBsYXRmb3JtPzogUGxhdGZvcm1Db25maWdcbiAgICBwcm9qZWN0Q29uZmlnPzogUGFydGlhbDxQbGF0Zm9ybUNvbmZpZz5cbiAgICBkZWJ1Z05hbWVzcGFjZT86IHN0cmluZ1xuICB9ID0ge30sXG4pOiBFeGVjdXRpb25Db250ZXh0IHtcbiAgZ2xvYmFsVGhpcy5SZWFjdCA9IFJlYWN0XG5cbiAgY29uc3QgYmFzZVBsYXRmb3JtID0gb3B0cy5wbGF0Zm9ybSB8fCBnZXRQbGF0Zm9ybUNvbmZpZygpXG4gIGNvbnN0IHBsYXRmb3JtID0gb3B0cy5wcm9qZWN0Q29uZmlnXG4gICAgPyB7IC4uLmJhc2VQbGF0Zm9ybSwgLi4ub3B0cy5wcm9qZWN0Q29uZmlnIH1cbiAgICA6IGJhc2VQbGF0Zm9ybVxuXG4gIGlmIChwbGF0Zm9ybS5wYXJ0c0VuZ2luZURpc2FibGVkKSB7XG4gICAgcGxhdGZvcm0ucGFydHNFbmdpbmUgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNpcmN1aXQgPSBuZXcgUm9vdENpcmN1aXQoe1xuICAgIHBsYXRmb3JtLFxuICB9KVxuXG4gIGlmIChvcHRzLm5hbWUpIHtcbiAgICBjaXJjdWl0Lm5hbWUgPSBvcHRzLm5hbWVcbiAgfVxuXG4gIGlmIChvcHRzLmRlYnVnTmFtZXNwYWNlKSB7XG4gICAgY2lyY3VpdC5lbmFibGVEZWJ1ZyhvcHRzLmRlYnVnTmFtZXNwYWNlKVxuICB9XG5cbiAgY29uc3QgbG9nczogQXJyYXk8eyBtc2c6IHN0cmluZyB9PiA9IFtdXG5cbiAgcmV0dXJuIHtcbiAgICBmc01hcDoge30sXG4gICAgZW50cnlwb2ludDogXCJcIixcbiAgICBsb2dnZXI6IHtcbiAgICAgIGluZm86IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgbG9ncy5wdXNoKHsgbXNnOiBtZXNzYWdlIH0pXG4gICAgICB9LFxuICAgICAgZ2V0TG9nczogKCkgPT4gbG9ncyxcbiAgICAgIHN0cmluZ2lmeUxvZ3M6ICgpID0+IGxvZ3MubWFwKChsb2cpID0+IGxvZy5tc2cpLmpvaW4oXCJcXG5cIiksXG4gICAgfSxcbiAgICBwcmVTdXBwbGllZEltcG9ydHM6IHtcbiAgICAgIFwiQHRzY2lyY3VpdC9jb3JlXCI6IHRzY2lyY3VpdENvcmUsXG4gICAgICB0c2NpcmN1aXQ6IHRzY2lyY3VpdENvcmUsXG4gICAgICBcIkB0c2NpcmN1aXQvbWF0aC11dGlsc1wiOiB0c2NpcmN1aXRNYXRoVXRpbHMsXG4gICAgICByZWFjdDogUmVhY3QsXG4gICAgICBcInJlYWN0L2pzeC1ydW50aW1lXCI6IFJlYWN0SnN4UnVudGltZSxcbiAgICAgIGRlYnVnOiBEZWJ1ZyxcbiAgICAgIHRzbGliLFxuXG4gICAgICAvLyBUaGlzIGlzIHVzdWFsbHkgdXNlZCBhcyBhIHR5cGUgaW1wb3J0LCB3ZSBjYW4gcmVtb3ZlIHRoZSBzaGltIHdoZW4gd2VcbiAgICAgIC8vIGlnbm9yZSB0eXBlIGltcG9ydHMgaW4gZ2V0SW1wb3J0c0Zyb21Db2RlXG4gICAgICBcIkB0c2NpcmN1aXQvcHJvcHNcIjoge30sXG4gICAgfSxcbiAgICBjaXJjdWl0LFxuICAgIHRzQ29uZmlnOiBudWxsLFxuICAgIGltcG9ydFN0YWNrOiBbXSxcbiAgICBjdXJyZW50bHlJbXBvcnRpbmc6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgIC4uLndlYldvcmtlckNvbmZpZ3VyYXRpb24sXG4gIH1cbn1cbiIsICIvKipcbiAqIFRyYW5zZm9ybXMgYSBLaUNhZCBmb290cHJpbnQgc3RyaW5nIGludG8gYSBnZW5lcmljIFwiZm9vdHByaW50ZXIgc3RyaW5nXCIuXG4gKiBGb3Igbm93LCB0aGlzIGlzIGEgc2ltcGxpZmllZCBjb252ZXJzaW9uIHRvIGEgc3RhbmRhcmQgcGFja2FnZSBuYW1lLlxuICogZS5nLiBcImtpY2FkOlJlc2lzdG9yX1NNRDpSXzA2MDNfMTYwOE1ldHJpY1wiIC0+IFwiMDYwM1wiXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRGb290cHJpbnRlclN0cmluZ0Zyb21LaWNhZCA9IChcbiAga2ljYWRGb290cHJpbnQ6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIC8vIGtpY2FkOlJlc2lzdG9yX1NNRDpSXzA2MDNfMTYwOE1ldHJpYyAtPiAwNjAzXG4gIGxldCBtYXRjaCA9IGtpY2FkRm9vdHByaW50Lm1hdGNoKC86W1JDXV8oXFxkezR9KV8vKVxuICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaFsxXVxuXG4gIC8vIGtpY2FkOlBhY2thZ2VfU086U09JQy04XzMuOXg0LjltbV9QMS4yN21tIC0+IFNPSUMtOFxuICAvLyBraWNhZDpQYWNrYWdlX1RPX1NPVF9TTUQ6U09ULTIzIC0+IFNPVC0yM1xuICBtYXRjaCA9IGtpY2FkRm9vdHByaW50Lm1hdGNoKFxuICAgIC86KFNPSUMtXFxkK3xTT1QtXFxkK3xTT0QtXFxkK3xTU09QLVxcZCt8VFNTT1AtXFxkK3xRRlAtXFxkK3xRRk4tXFxkKykvLFxuICApXG4gIGlmIChtYXRjaCkgcmV0dXJuIG1hdGNoWzFdXG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuIiwgIi8qKlxuICogVHJhbnNmb3JtcyBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIiBpbnRvIGEgSkxDLWNvbXBhdGlibGUgcGFja2FnZSBuYW1lLlxuICogZS5nLiBcImNhcDA2MDNcIiAtPiBcIjA2MDNcIlxuICovXG5leHBvcnQgY29uc3QgZ2V0SmxjUGFja2FnZUZyb21Gb290cHJpbnRlclN0cmluZyA9IChcbiAgZm9vdHByaW50ZXJTdHJpbmc6IHN0cmluZyxcbik6IHN0cmluZyA9PiB7XG4gIGlmIChmb290cHJpbnRlclN0cmluZy5pbmNsdWRlcyhcImNhcFwiKSkge1xuICAgIHJldHVybiBmb290cHJpbnRlclN0cmluZy5yZXBsYWNlKC9jYXAvZywgXCJcIilcbiAgfVxuICByZXR1cm4gZm9vdHByaW50ZXJTdHJpbmdcbn1cbiIsICJpbXBvcnQgeyBnZXRGb290cHJpbnRlclN0cmluZ0Zyb21LaWNhZCB9IGZyb20gXCIuL2dldC1mb290cHJpbnRlci1zdHJpbmctZnJvbS1raWNhZFwiXG5pbXBvcnQgeyBnZXRKbGNQYWNrYWdlRnJvbUZvb3RwcmludGVyU3RyaW5nIH0gZnJvbSBcIi4vZ2V0LWpsYy1wYWNrYWdlLWZyb20tZm9vdHByaW50ZXItc3RyaW5nXCJcblxuLyoqXG4gKiBHZXQgYSBKTEMtY29tcGF0aWJsZSBwYWNrYWdlIG5hbWUgZnJvbSBhIGZvb3RwcmludCBzdHJpbmcsIHdoaWNoIGNvdWxkIGJlXG4gKiBhIEtpQ2FkIGZvb3RwcmludCBvciBhIGdlbmVyaWMgXCJmb290cHJpbnRlciBzdHJpbmdcIi5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEpsY3BjYlBhY2thZ2VOYW1lID0gKFxuICBmb290cHJpbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghZm9vdHByaW50KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgaWYgKGZvb3RwcmludC5zdGFydHNXaXRoKFwia2ljYWQ6XCIpKSB7XG4gICAgY29uc3QgZm9vdHByaW50ZXJTdHJpbmcgPSBnZXRGb290cHJpbnRlclN0cmluZ0Zyb21LaWNhZChmb290cHJpbnQpXG4gICAgaWYgKGZvb3RwcmludGVyU3RyaW5nKSB7XG4gICAgICByZXR1cm4gZ2V0SmxjUGFja2FnZUZyb21Gb290cHJpbnRlclN0cmluZyhmb290cHJpbnRlclN0cmluZylcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayBmb3IgdW4tbWF0Y2hlZCBLaUNhZCBzdHJpbmdzXG4gICAgcmV0dXJuIGZvb3RwcmludFxuICB9XG5cbiAgLy8gTm90IGEgS2lDYWQgc3RyaW5nLCBhc3N1bWUgaXQncyBhIGZvb3RwcmludGVyIHN0cmluZ1xuICByZXR1cm4gZ2V0SmxjUGFja2FnZUZyb21Gb290cHJpbnRlclN0cmluZyhmb290cHJpbnQpXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBQYXJ0c0VuZ2luZSwgU3VwcGxpZXJQYXJ0TnVtYmVycyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGdldEpsY3BjYlBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZm9vdHByaW50LXRyYW5zbGF0b3JzL2luZGV4XCJcblxuZXhwb3J0IGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKVxuXG5jb25zdCBnZXRKbGNQYXJ0c0NhY2hlZCA9IGFzeW5jIChuYW1lOiBhbnksIHBhcmFtczogYW55KSA9PiB7XG4gIGNvbnN0IHBhcmFtU3RyaW5nID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgLi4ucGFyYW1zLFxuICAgIGpzb246IFwidHJ1ZVwiLFxuICB9KS50b1N0cmluZygpXG4gIGlmIChjYWNoZS5oYXMocGFyYW1TdHJpbmcpKSB7XG4gICAgcmV0dXJuIGNhY2hlLmdldChwYXJhbVN0cmluZylcbiAgfVxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgIGBodHRwczovL2psY3NlYXJjaC50c2NpcmN1aXQuY29tLyR7bmFtZX0vbGlzdD8ke3BhcmFtU3RyaW5nfWAsXG4gIClcbiAgY29uc3QgcmVzcG9uc2VKc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gIGNhY2hlLnNldChwYXJhbVN0cmluZywgcmVzcG9uc2VKc29uKVxuICByZXR1cm4gcmVzcG9uc2VKc29uXG59XG5cbmNvbnN0IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlID0gKHBhcnRzOiBhbnlbXSB8IHVuZGVmaW5lZCkgPT4ge1xuICBpZiAoIXBhcnRzKSByZXR1cm4gW11cbiAgcmV0dXJuIFsuLi5wYXJ0c10uc29ydChcbiAgICAoYSwgYikgPT4gTnVtYmVyKGIuaXNfYmFzaWMgPz8gZmFsc2UpIC0gTnVtYmVyKGEuaXNfYmFzaWMgPz8gZmFsc2UpLFxuICApXG59XG5cbmV4cG9ydCBjb25zdCBqbGNQYXJ0c0VuZ2luZTogUGFydHNFbmdpbmUgPSB7XG4gIGZpbmRQYXJ0OiBhc3luYyAoe1xuICAgIHNvdXJjZUNvbXBvbmVudCxcbiAgICBmb290cHJpbnRlclN0cmluZyxcbiAgfSk6IFByb21pc2U8U3VwcGxpZXJQYXJ0TnVtYmVycz4gPT4ge1xuICAgIGNvbnN0IGpsY3BjYlBhY2thZ2UgPSBnZXRKbGNwY2JQYWNrYWdlTmFtZShmb290cHJpbnRlclN0cmluZylcblxuICAgIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9yZXNpc3RvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHJlc2lzdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJyZXNpc3RvcnNcIiwge1xuICAgICAgICByZXNpc3RhbmNlOiBzb3VyY2VDb21wb25lbnQucmVzaXN0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocmVzaXN0b3JzKVxuICAgICAgICAgIC5tYXAoKHI6IGFueSkgPT4gYEMke3IubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2NhcGFjaXRvclwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNhcGFjaXRvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiY2FwYWNpdG9yc1wiLCB7XG4gICAgICAgIGNhcGFjaXRhbmNlOiBzb3VyY2VDb21wb25lbnQuY2FwYWNpdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNhcGFjaXRvcnMpXG4gICAgICAgICAgLm1hcCgoYzogYW55KSA9PiBgQyR7Yy5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcGluX2hlYWRlclwiXG4gICAgKSB7XG4gICAgICBsZXQgcGl0Y2g6IG51bWJlciB8IHVuZGVmaW5lZFxuICAgICAgaWYgKGZvb3RwcmludGVyU3RyaW5nPy5pbmNsdWRlcyhcIl9wXCIpKSB7XG4gICAgICAgIHBpdGNoID0gTnVtYmVyKGZvb3RwcmludGVyU3RyaW5nLnNwbGl0KFwiX3BcIilbMV0pXG4gICAgICB9XG4gICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFxuICAgICAgICBcImhlYWRlcnNcIixcbiAgICAgICAgcGl0Y2hcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgcGl0Y2g6IHBpdGNoLFxuICAgICAgICAgICAgICBudW1fcGluczogc291cmNlQ29tcG9uZW50LnBpbl9jb3VudCxcbiAgICAgICAgICAgICAgZ2VuZGVyOiBzb3VyY2VDb21wb25lbnQuZ2VuZGVyLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBudW1fcGluczogc291cmNlQ29tcG9uZW50LnBpbl9jb3VudCxcbiAgICAgICAgICAgICAgZ2VuZGVyOiBzb3VyY2VDb21wb25lbnQuZ2VuZGVyLFxuICAgICAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoaGVhZGVycylcbiAgICAgICAgICAubWFwKChoOiBhbnkpID0+IGBDJHtoLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9wb3RlbnRpb21ldGVyXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcG90ZW50aW9tZXRlcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwicG90ZW50aW9tZXRlcnNcIiwge1xuICAgICAgICByZXNpc3RhbmNlOiBzb3VyY2VDb21wb25lbnQubWF4X3Jlc2lzdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShwb3RlbnRpb21ldGVycylcbiAgICAgICAgICAubWFwKChwOiBhbnkpID0+IGBDJHtwLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9kaW9kZVwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGRpb2RlcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJkaW9kZXNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UoZGlvZGVzKVxuICAgICAgICAgIC5tYXAoKGQ6IGFueSkgPT4gYEMke2QubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2NoaXBcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBjaGlwcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJjaGlwc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShjaGlwcylcbiAgICAgICAgICAubWFwKChjOiBhbnkpID0+IGBDJHtjLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV90cmFuc2lzdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgdHJhbnNpc3RvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwidHJhbnNpc3RvcnNcIiwge1xuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgICB0cmFuc2lzdG9yX3R5cGU6IHNvdXJjZUNvbXBvbmVudC50cmFuc2lzdG9yX3R5cGUsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZSh0cmFuc2lzdG9ycylcbiAgICAgICAgICAubWFwKCh0OiBhbnkpID0+IGBDJHt0Lmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9wb3dlcl9zb3VyY2VcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBwb3dlcl9zb3VyY2VzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcInBvd2VyX3NvdXJjZXNcIiwge1xuICAgICAgICB2b2x0YWdlOiBzb3VyY2VDb21wb25lbnQudm9sdGFnZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHBvd2VyX3NvdXJjZXMpXG4gICAgICAgICAgLm1hcCgocDogYW55KSA9PiBgQyR7cC5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfaW5kdWN0b3JcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBpbmR1Y3RvcnMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwiaW5kdWN0b3JzXCIsIHtcbiAgICAgICAgaW5kdWN0YW5jZTogc291cmNlQ29tcG9uZW50LmluZHVjdGFuY2UsXG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShpbmR1Y3RvcnMpXG4gICAgICAgICAgLm1hcCgoaTogYW55KSA9PiBgQyR7aS5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfY3J5c3RhbFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGNyeXN0YWxzIH0gPSBhd2FpdCBnZXRKbGNQYXJ0c0NhY2hlZChcImNyeXN0YWxzXCIsIHtcbiAgICAgICAgZnJlcXVlbmN5OiBzb3VyY2VDb21wb25lbnQuZnJlcXVlbmN5LFxuICAgICAgICBsb2FkX2NhcGFjaXRhbmNlOiBzb3VyY2VDb21wb25lbnQubG9hZF9jYXBhY2l0YW5jZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKGNyeXN0YWxzKVxuICAgICAgICAgIC5tYXAoKGM6IGFueSkgPT4gYEMke2MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX21vc2ZldFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IG1vc2ZldHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwibW9zZmV0c1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICAgIG1vc2ZldF9tb2RlOiBzb3VyY2VDb21wb25lbnQubW9zZmV0X21vZGUsXG4gICAgICAgIGNoYW5uZWxfdHlwZTogc291cmNlQ29tcG9uZW50LmNoYW5uZWxfdHlwZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKG1vc2ZldHMpXG4gICAgICAgICAgLm1hcCgobTogYW55KSA9PiBgQyR7bS5sY3NjfWApXG4gICAgICAgICAgLnNsaWNlKDAsIDMpLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBzb3VyY2VDb21wb25lbnQudHlwZSA9PT0gXCJzb3VyY2VfY29tcG9uZW50XCIgJiZcbiAgICAgIHNvdXJjZUNvbXBvbmVudC5mdHlwZSA9PT0gXCJzaW1wbGVfcmVzb25hdG9yXCJcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcmVzb25hdG9ycyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJyZXNvbmF0b3JzXCIsIHtcbiAgICAgICAgZnJlcXVlbmN5OiBzb3VyY2VDb21wb25lbnQuZnJlcXVlbmN5LFxuICAgICAgICBwYWNrYWdlOiBqbGNwY2JQYWNrYWdlLFxuICAgICAgfSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGpsY3BjYjogd2l0aEJhc2ljUGFydFByZWZlcmVuY2UocmVzb25hdG9ycylcbiAgICAgICAgICAubWFwKChyOiBhbnkpID0+IGBDJHtyLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHNvdXJjZUNvbXBvbmVudC50eXBlID09PSBcInNvdXJjZV9jb21wb25lbnRcIiAmJlxuICAgICAgc291cmNlQ29tcG9uZW50LmZ0eXBlID09PSBcInNpbXBsZV9zd2l0Y2hcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBzd2l0Y2hlcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJzd2l0Y2hlc1wiLCB7XG4gICAgICAgIHN3aXRjaF90eXBlOiBzb3VyY2VDb21wb25lbnQudHlwZSxcbiAgICAgICAgcGFja2FnZTogamxjcGNiUGFja2FnZSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4ge1xuICAgICAgICBqbGNwY2I6IHdpdGhCYXNpY1BhcnRQcmVmZXJlbmNlKHN3aXRjaGVzKVxuICAgICAgICAgIC5tYXAoKHM6IGFueSkgPT4gYEMke3MubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2xlZFwiXG4gICAgKSB7XG4gICAgICBjb25zdCB7IGxlZHMgfSA9IGF3YWl0IGdldEpsY1BhcnRzQ2FjaGVkKFwibGVkc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShsZWRzKVxuICAgICAgICAgIC5tYXAoKGw6IGFueSkgPT4gYEMke2wubGNzY31gKVxuICAgICAgICAgIC5zbGljZSgwLCAzKSxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgc291cmNlQ29tcG9uZW50LnR5cGUgPT09IFwic291cmNlX2NvbXBvbmVudFwiICYmXG4gICAgICBzb3VyY2VDb21wb25lbnQuZnR5cGUgPT09IFwic2ltcGxlX2Z1c2VcIlxuICAgICkge1xuICAgICAgY29uc3QgeyBmdXNlcyB9ID0gYXdhaXQgZ2V0SmxjUGFydHNDYWNoZWQoXCJmdXNlc1wiLCB7XG4gICAgICAgIHBhY2thZ2U6IGpsY3BjYlBhY2thZ2UsXG4gICAgICB9KVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgamxjcGNiOiB3aXRoQmFzaWNQYXJ0UHJlZmVyZW5jZShmdXNlcylcbiAgICAgICAgICAubWFwKChsOiBhbnkpID0+IGBDJHtsLmxjc2N9YClcbiAgICAgICAgICAuc2xpY2UoMCwgMyksXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fVxuICB9LFxufVxuIiwgImltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcsIFNwaWNlRW5naW5lIH0gZnJvbSBcIkB0c2NpcmN1aXQvcHJvcHNcIlxuaW1wb3J0IHsgamxjUGFydHNFbmdpbmUgfSBmcm9tIFwiQHRzY2lyY3VpdC9wYXJ0cy1lbmdpbmVcIlxuaW1wb3J0IHsgcGFyc2VLaWNhZE1vZFRvQ2lyY3VpdEpzb24gfSBmcm9tIFwia2ljYWQtY29tcG9uZW50LWNvbnZlcnRlclwiXG5pbXBvcnQgeyBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cCB9IGZyb20gXCIuL3V0aWxzL2R5bmFtaWNhbGx5LWxvYWQtZGVwZW5kZW5jeS13aXRoLWNkbi1iYWNrdXBcIlxuY29uc3QgS0lDQURfRk9PVFBSSU5UX0NBQ0hFX1VSTCA9IFwiaHR0cHM6Ly9raWNhZC1tb2QtY2FjaGUudHNjaXJjdWl0LmNvbVwiXG5cbmxldCBuZ3NwaWNlRW5naW5lQ2FjaGU6IFNwaWNlRW5naW5lIHwgbnVsbCA9IG51bGxcblxuZXhwb3J0IGNvbnN0IGdldFBsYXRmb3JtQ29uZmlnID0gKCk6IFBsYXRmb3JtQ29uZmlnID0+ICh7XG4gIHBhcnRzRW5naW5lOiBqbGNQYXJ0c0VuZ2luZSxcbiAgc3BpY2VFbmdpbmVNYXA6IHtcbiAgICBuZ3NwaWNlOiB7XG4gICAgICBzaW11bGF0ZTogYXN5bmMgKHNwaWNlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKCFuZ3NwaWNlRW5naW5lQ2FjaGUpIHtcbiAgICAgICAgICBjb25zdCBjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUgPVxuICAgICAgICAgICAgYXdhaXQgZHluYW1pY2FsbHlMb2FkRGVwZW5kZW5jeVdpdGhDZG5CYWNrdXAoXG4gICAgICAgICAgICAgIFwiQHRzY2lyY3VpdC9uZ3NwaWNlLXNwaWNlLWVuZ2luZVwiLFxuICAgICAgICAgICAgKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ291bGQgbm90IGxvYWQgbmdzcGljZSBlbmdpbmUgZnJvbSBsb2NhbCBub2RlX21vZHVsZXMgb3IgQ0ROIGZhbGxiYWNrLlwiLFxuICAgICAgICAgICAgICAgIHsgY2F1c2U6IGVycm9yIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAoY3JlYXRlTmdzcGljZVNwaWNlRW5naW5lKSB7XG4gICAgICAgICAgICBuZ3NwaWNlRW5naW5lQ2FjaGUgPSBhd2FpdCBjcmVhdGVOZ3NwaWNlU3BpY2VFbmdpbmUoKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbmdzcGljZUVuZ2luZUNhY2hlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgXCJDb3VsZCBub3QgbG9hZCBuZ3NwaWNlIGVuZ2luZSBmcm9tIGxvY2FsIG5vZGVfbW9kdWxlcyBvciBDRE4gZmFsbGJhY2suXCIsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5nc3BpY2VFbmdpbmVDYWNoZS5zaW11bGF0ZShzcGljZSlcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgZm9vdHByaW50TGlicmFyeU1hcDoge1xuICAgIGtpY2FkOiBhc3luYyAoZm9vdHByaW50TmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBiYXNlVXJsID0gYCR7S0lDQURfRk9PVFBSSU5UX0NBQ0hFX1VSTH0vJHtmb290cHJpbnROYW1lfWBcbiAgICAgIGNvbnN0IGNpcmN1aXRKc29uVXJsID0gYCR7YmFzZVVybH0uY2lyY3VpdC5qc29uYFxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goY2lyY3VpdEpzb25VcmwpXG4gICAgICBjb25zdCByYXcgPSBhd2FpdCByZXMuanNvbigpXG4gICAgICAvLyBGaWx0ZXIgcGNiX3NpbGtzY3JlZW5fdGV4dCB0byBvbmx5IGtlZXAgZW50cmllcyB3aXRoIHRleHQgPT09IFwiUkVGKipcIlxuICAgICAgLy8gQXBwbHkgZmlsdGVyaW5nIG9ubHkgdG8gZWxlbWVudHMgY29taW5nIGZyb20gdGhlIGtpY2FkX21vZF9zZXJ2ZXIgcmVzcG9uc2VcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gQXJyYXkuaXNBcnJheShyYXcpXG4gICAgICAgID8gcmF3LmZpbHRlcigoZWwpID0+XG4gICAgICAgICAgICBlbD8udHlwZSA9PT0gXCJwY2Jfc2lsa3NjcmVlbl90ZXh0XCIgPyBlbD8udGV4dCA9PT0gXCJSRUYqKlwiIDogdHJ1ZSxcbiAgICAgICAgICApXG4gICAgICAgIDogcmF3XG4gICAgICBjb25zdCB3cmxVcmwgPSBgJHtiYXNlVXJsfS53cmxgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb290cHJpbnRDaXJjdWl0SnNvbjogZmlsdGVyZWQsXG4gICAgICAgIGNhZE1vZGVsOiB7IHdybFVybCwgbW9kZWxVbml0VG9NbVNjYWxlOiAyLjU0IH0sXG4gICAgICB9XG4gICAgfSxcbiAgfSxcbiAgZm9vdHByaW50RmlsZVBhcnNlck1hcDoge1xuICAgIGtpY2FkX21vZDoge1xuICAgICAgbG9hZEZyb21Vcmw6IGFzeW5jICh1cmw6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBraWNhZENvbnRlbnQgPSBhd2FpdCBmZXRjaCh1cmwpLnRoZW4oKHJlcykgPT4gcmVzLnRleHQoKSlcbiAgICAgICAgY29uc3Qga2ljYWRKc29uID0gYXdhaXQgcGFyc2VLaWNhZE1vZFRvQ2lyY3VpdEpzb24oa2ljYWRDb250ZW50KVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZvb3RwcmludENpcmN1aXRKc29uOiBBcnJheS5pc0FycmF5KGtpY2FkSnNvbilcbiAgICAgICAgICAgID8ga2ljYWRKc29uXG4gICAgICAgICAgICA6IFtraWNhZEpzb25dLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KVxuIiwgImV4cG9ydCBjb25zdCBkeW5hbWljYWxseUxvYWREZXBlbmRlbmN5V2l0aENkbkJhY2t1cCA9IGFzeW5jIChcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbik6IFByb21pc2U8YW55PiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gRmlyc3QsIHRyeSB0byBpbXBvcnQgdXNpbmcgTm9kZS5qcyByZXNvbHV0aW9uXG4gICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KHBhY2thZ2VOYW1lKVxuICAgIHJldHVybiBtb2R1bGUuZGVmYXVsdFxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coYEZhaWxlZCB0byBsb2FkICR7cGFja2FnZU5hbWV9IGxvY2FsbHksIHRyeWluZyBDRE4gZmFsbGJhY2suLi5gKVxuICAgIC8vIEZhbGxiYWNrIHRvIEpzRGVsaXZyIENETiBmb3IgYnJvd3NlciBlbnZpcm9ubWVudHNcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgIGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtLyR7cGFja2FnZU5hbWV9Lytlc21gLFxuICAgICAgKVxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggJHtwYWNrYWdlTmFtZX0gZnJvbSBDRE46ICR7cmVzLnN0YXR1c1RleHR9YCxcbiAgICAgICAgKVxuICAgICAgfVxuICAgICAgY29uc3QgY29kZSA9IGF3YWl0IHJlcy50ZXh0KClcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbY29kZV0sIHsgdHlwZTogXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgfSlcbiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgZGVmYXVsdDogbG9hZGVkTW9kdWxlIH0gPSBhd2FpdCBpbXBvcnQodXJsKVxuICAgICAgICByZXR1cm4gbG9hZGVkTW9kdWxlXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjZG5FcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgQ0ROIGZhbGxiYWNrIGZvciAke3BhY2thZ2VOYW1lfSBhbHNvIGZhaWxlZDpgLCBjZG5FcnJvcilcbiAgICAgIHRocm93IGNkbkVycm9yXG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZpbGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgbGV0IG5vcm1GaWxlUGF0aCA9IGZpbGVQYXRoXG4gIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuICBub3JtRmlsZVBhdGggPSBub3JtRmlsZVBhdGgudHJpbSgpXG4gIGlmIChub3JtRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpKSB7XG4gICAgbm9ybUZpbGVQYXRoID0gbm9ybUZpbGVQYXRoLnNsaWNlKDIpXG4gIH1cbiAgaWYgKG5vcm1GaWxlUGF0aC5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgIG5vcm1GaWxlUGF0aCA9IG5vcm1GaWxlUGF0aC5zbGljZSgxKVxuICB9XG4gIHJldHVybiBub3JtRmlsZVBhdGhcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZzTWFwKGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRGc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG4gIGZvciAoY29uc3QgW2ZzUGF0aCwgZmlsZUNvbnRlbnRdIG9mIE9iamVjdC5lbnRyaWVzKGZzTWFwKSkge1xuICAgIG5vcm1hbGl6ZWRGc01hcFtub3JtYWxpemVGaWxlUGF0aChmc1BhdGgpXSA9IGZpbGVDb250ZW50XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZWRGc01hcFxufVxuIiwgIi8qKlxuICogUmV0dXJucyB0aGUgZGlyZWN0b3J5IG5hbWUgb2YgYSBwYXRoLCBzaW1pbGFyIHRvIE5vZGUuanMgcGF0aC5kaXJuYW1lXG4gKiBXb3JrcyBvbiBib3RoIFVuaXggYW5kIFdpbmRvd3MgcGF0aHNcbiAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGV4dHJhY3QgdGhlIGRpcmVjdG9yeSBmcm9tXG4gKiBAcmV0dXJucyBUaGUgZGlyZWN0b3J5IHBhcnQgb2YgdGhlIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcm5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4gXCIuXCJcblxuICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIHRvIGZvcndhcmQgc2xhc2hlc1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcblxuICAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlc1xuICBjb25zdCBjbGVhblBhdGggPSBub3JtYWxpemVkUGF0aC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG5cbiAgLy8gSWYgdGhlcmUgYXJlIG5vIHNsYXNoZXMsIHJldHVybiBcIi5cIlxuICBpZiAoY2xlYW5QYXRoLmluZGV4T2YoXCIvXCIpID09PSAtMSkgcmV0dXJuIFwiLlwiXG5cbiAgLy8gUmV0dXJuIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGxhc3Qgc2xhc2hcbiAgcmV0dXJuIGNsZWFuUGF0aC5zdWJzdHJpbmcoMCwgY2xlYW5QYXRoLmxhc3RJbmRleE9mKFwiL1wiKSkgfHwgXCIvXCJcbn1cbiIsICJpbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcIi4vZGlybmFtZVwiXG5cbi8qKlxuICogUmVzb2x2ZSBhbiBpbXBvcnRQYXRoIHJlbGF0aXZlIHRvIGEgY3dkLCBzdXBwb3J0aW5nIC4uLywgLi8gYW5kIGFic29sdXRlIHBhdGhzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoOiBzdHJpbmcsIGN3ZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSGFuZGxlIHBhcmVudCBkaXJlY3RvcnkgbmF2aWdhdGlvblxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpKSB7XG4gICAgY29uc3QgcGFyZW50RGlyID0gZGlybmFtZShjd2QpXG4gICAgcmV0dXJuIHJlc29sdmVSZWxhdGl2ZVBhdGgoaW1wb3J0UGF0aC5zbGljZSgzKSwgcGFyZW50RGlyKVxuICB9XG4gIC8vIEhhbmRsZSBjdXJyZW50IGRpcmVjdG9yeVxuICBpZiAoaW1wb3J0UGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlUGF0aChpbXBvcnRQYXRoLnNsaWNlKDIpLCBjd2QpXG4gIH1cbiAgLy8gSGFuZGxlIGFic29sdXRlIHBhdGhcbiAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICByZXR1cm4gaW1wb3J0UGF0aC5zbGljZSgxKVxuICB9XG4gIC8vIEhhbmRsZSByZWxhdGl2ZSBwYXRoXG4gIHJldHVybiBgJHtjd2R9LyR7aW1wb3J0UGF0aH1gXG59XG4iLCAiaW1wb3J0IHsgbm9ybWFsaXplRmlsZVBhdGggfSBmcm9tIFwiLi9ub3JtYWxpemVGc01hcFwiXG5cbmV4cG9ydCB0eXBlIFRzQ29uZmlnID0ge1xuICBjb21waWxlck9wdGlvbnM/OiB7XG4gICAgYmFzZVVybD86IHN0cmluZ1xuICAgIHBhdGhzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+XG4gICAgW2tleTogc3RyaW5nXTogdW5rbm93blxuICB9XG4gIGV4dGVuZHM/OiBzdHJpbmcgfCBzdHJpbmdbXVxuICBmaWxlcz86IHN0cmluZ1tdXG4gIHJlZmVyZW5jZXM/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgaW5jbHVkZT86IHN0cmluZ1tdXG4gIGV4Y2x1ZGU/OiBzdHJpbmdbXVxuICBba2V5OiBzdHJpbmddOiB1bmtub3duXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUc0NvbmZpZyhcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuKTogVHNDb25maWcgfCBudWxsIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocykpIHJldHVybiBudWxsXG4gIGNvbnN0IHRzY29uZmlnQ29udGVudCA9IGZzTWFwT3JBbGxGaWxlUGF0aHNbXCJ0c2NvbmZpZy5qc29uXCJdXG4gIGlmICghdHNjb25maWdDb250ZW50KSByZXR1cm4gbnVsbFxuICB0cnkge1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSB0c2NvbmZpZ0NvbnRlbnQucmVwbGFjZShcbiAgICAgIC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qL2csXG4gICAgICBcIlwiLFxuICAgICkgLy8gcmVtb3ZlIGNvbW1lbnRzXG5cbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHNhbml0aXplZENvbnRlbnQpIGFzIFRzQ29uZmlnXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSB0c2NvbmZpZy5qc29uOiAke2UubWVzc2FnZX1gKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgdHNjb25maWdEaXI/OiBzdHJpbmdcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qge1xuICAgIGltcG9ydFBhdGgsXG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgdHNDb25maWcsXG4gICAgdHNjb25maWdEaXIsXG4gIH0gPSBvcHRzXG4gIGNvbnN0IHBhdGhzID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8ucGF0aHNcbiAgaWYgKCFwYXRocykgcmV0dXJuIG51bGxcbiAgY29uc3QgYmFzZVVybCA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmwgfHwgXCIuXCJcblxuICBjb25zdCB0cnlSZXNvbHZlQ2FuZGlkYXRlID0gKGNhbmRpZGF0ZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZENhbmRpZGF0ZSA9IG5vcm1hbGl6ZUZpbGVQYXRoKGNhbmRpZGF0ZSlcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkQ2FuZGlkYXRlKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZENhbmRpZGF0ZSkhXG4gICAgfVxuICAgIGZvciAoY29uc3QgZXh0IG9mIGV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IHdpdGhFeHQgPSBgJHtub3JtYWxpemVkQ2FuZGlkYXRlfS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyh3aXRoRXh0KSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldCh3aXRoRXh0KSFcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZvciAoY29uc3QgW2FsaWFzLCB0YXJnZXRzXSBvZiBPYmplY3QuZW50cmllcyhwYXRocykpIHtcbiAgICAvLyBTdXBwb3J0IHBhdHRlcm5zIGxpa2UgXCJAc3JjLypcIiBvciBcInV0aWxzLypcIiBhbmQgYWxzbyBleGFjdCBtYXRjaGVzIHdpdGhvdXQgXCIqXCJcbiAgICBjb25zdCBoYXNXaWxkY2FyZCA9IGFsaWFzLmluY2x1ZGVzKFwiKlwiKVxuICAgIGlmIChoYXNXaWxkY2FyZCkge1xuICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IGFsaWFzLnNwbGl0KFwiKlwiKVxuICAgICAgaWYgKFxuICAgICAgICAhaW1wb3J0UGF0aC5zdGFydHNXaXRoKHByZWZpeCkgfHxcbiAgICAgICAgIWltcG9ydFBhdGguZW5kc1dpdGgoc3VmZml4IHx8IFwiXCIpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXJNYXRjaCA9IGltcG9ydFBhdGguc2xpY2UoXG4gICAgICAgIHByZWZpeC5sZW5ndGgsXG4gICAgICAgIGltcG9ydFBhdGgubGVuZ3RoIC0gKHN1ZmZpeCA/IHN1ZmZpeC5sZW5ndGggOiAwKSxcbiAgICAgIClcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgcmVwbGFjZWQgPSB0YXJnZXQucmVwbGFjZShcIipcIiwgc3Rhck1hdGNoKVxuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPVxuICAgICAgICAgIGJhc2VVcmwgJiYgIXJlcGxhY2VkLnN0YXJ0c1dpdGgoXCIuL1wiKSAmJiAhcmVwbGFjZWQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHtyZXBsYWNlZH1gXG4gICAgICAgICAgICA6IHJlcGxhY2VkXG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gdHJ5UmVzb2x2ZUNhbmRpZGF0ZShjYW5kaWRhdGUpXG4gICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbXBvcnRQYXRoICE9PSBhbGlhcykgY29udGludWVcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID1cbiAgICAgICAgICBiYXNlVXJsICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi4vXCIpICYmICF0YXJnZXQuc3RhcnRzV2l0aChcIi9cIilcbiAgICAgICAgICAgID8gYCR7YmFzZVVybH0vJHt0YXJnZXR9YFxuICAgICAgICAgICAgOiB0YXJnZXRcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0cnlSZXNvbHZlQ2FuZGlkYXRlKGNhbmRpZGF0ZSlcbiAgICAgICAgaWYgKHJlc29sdmVkKSByZXR1cm4gcmVzb2x2ZWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgaW1wb3J0UGF0aCxcbiAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgZXh0ZW5zaW9ucyxcbiAgICB0c0NvbmZpZyxcbiAgICB0c2NvbmZpZ0RpcixcbiAgfSlcblxuICBpZiAocmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmwpIHJldHVybiByZXNvbHZlZFBhdGhGcm9tQmFzZVVybFxuXG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV2l0aEJhc2VVcmwob3B0czoge1xuICBpbXBvcnRQYXRoOiBzdHJpbmdcbiAgbm9ybWFsaXplZEZpbGVQYXRoTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+XG4gIGV4dGVuc2lvbnM6IHN0cmluZ1tdXG4gIHRzQ29uZmlnOiBUc0NvbmZpZyB8IG51bGxcbiAgdHNjb25maWdEaXI/OiBzdHJpbmdcbn0pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qge1xuICAgIGltcG9ydFBhdGgsXG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLFxuICAgIGV4dGVuc2lvbnMsXG4gICAgdHNDb25maWcsXG4gICAgdHNjb25maWdEaXIsXG4gIH0gPSBvcHRzXG4gIGNvbnN0IGJhc2VVcmwgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsXG4gIGlmICghYmFzZVVybCkgcmV0dXJuIG51bGxcblxuICAvLyBSZXNvbHZlIGJhc2VVcmwgcmVsYXRpdmUgdG8gdHNjb25maWcgbG9jYXRpb25cbiAgY29uc3QgYmFzZURpciA9IHRzY29uZmlnRGlyIHx8IFwiLlwiXG4gIGxldCBmaWxlUGF0aFRvUmVzb2x2ZSA9IGAke2Jhc2VEaXJ9LyR7YmFzZVVybH0vJHtpbXBvcnRQYXRofWBcbiAgLy8gQ2xlYW4gdXAgbXVsdGlwbGUgc2xhc2hlcyBhbmQgbGVhZGluZyBkb3RzXG4gIGZpbGVQYXRoVG9SZXNvbHZlID0gZmlsZVBhdGhUb1Jlc29sdmUucmVwbGFjZSgvXFwvKy9nLCBcIi9cIikgLy8gUmVwbGFjZSBtdWx0aXBsZSBzbGFzaGVzIHdpdGggc2luZ2xlIHNsYXNoXG4gIGZpbGVQYXRoVG9SZXNvbHZlID0gZmlsZVBhdGhUb1Jlc29sdmUucmVwbGFjZSgvXFwvXFwuXFwvL2csIFwiL1wiKSAvLyBSZXBsYWNlIC8uLyB3aXRoIC9cbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVQYXRoID0gbm9ybWFsaXplRmlsZVBhdGgoZmlsZVBhdGhUb1Jlc29sdmUpXG5cbiAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZEZpbGVQYXRoKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRGaWxlUGF0aCkhXG4gIH1cblxuICBmb3IgKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgY29uc3Qgd2l0aEV4dCA9IGAke25vcm1hbGl6ZWRGaWxlUGF0aH0uJHtleHR9YFxuICAgIGlmIChub3JtYWxpemVkRmlsZVBhdGhNYXAuaGFzKHdpdGhFeHQpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldCh3aXRoRXh0KSFcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc1RzY29uZmlnUGF0aFBhdHRlcm4oXG4gIGltcG9ydFBhdGg6IHN0cmluZyxcbiAgdHNDb25maWc6IFRzQ29uZmlnIHwgbnVsbCxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXRocyA9IHRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LnBhdGhzXG4gIGlmICghcGF0aHMpIHJldHVybiBmYWxzZVxuXG4gIGZvciAoY29uc3QgW2FsaWFzXSBvZiBPYmplY3QuZW50cmllcyhwYXRocykpIHtcbiAgICBjb25zdCBoYXNXaWxkY2FyZCA9IGFsaWFzLmluY2x1ZGVzKFwiKlwiKVxuICAgIGlmIChoYXNXaWxkY2FyZCkge1xuICAgICAgY29uc3QgW3ByZWZpeCwgc3VmZml4XSA9IGFsaWFzLnNwbGl0KFwiKlwiKVxuICAgICAgaWYgKGltcG9ydFBhdGguc3RhcnRzV2l0aChwcmVmaXgpICYmIGltcG9ydFBhdGguZW5kc1dpdGgoc3VmZml4IHx8IFwiXCIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpbXBvcnRQYXRoID09PSBhbGlhcykgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cbiIsICJpbXBvcnQgeyBub3JtYWxpemVGaWxlUGF0aCB9IGZyb20gXCIuL25vcm1hbGl6ZUZzTWFwXCJcbmltcG9ydCB7IHJlc29sdmVSZWxhdGl2ZVBhdGggfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmVSZWxhdGl2ZVBhdGhcIlxuaW1wb3J0IHtcbiAgcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzLFxuICB0eXBlIFRzQ29uZmlnLFxuICByZXNvbHZlV2l0aEJhc2VVcmwsXG59IGZyb20gXCIuL3RzY29uZmlnUGF0aHNcIlxuXG5jb25zdCBGSUxFX0VYVEVOU0lPTlMgPSBbXG4gIFwidHN4XCIsXG4gIFwidHNcIixcbiAgXCJqc29uXCIsXG4gIFwianNcIixcbiAgXCJqc3hcIixcbiAgXCJvYmpcIixcbiAgXCJnbHRmXCIsXG4gIFwiZ2xiXCIsXG4gIFwic3RsXCIsXG4gIFwic3RlcFwiLFxuICBcInN0cFwiLFxuXVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoID0gKFxuICB1bmtub3duRmlsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXBPckFsbEZpbGVQYXRoczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZ1tdLFxuICBjd2Q/OiBzdHJpbmcsXG4gIG9wdHM6IHsgdHNDb25maWc/OiBUc0NvbmZpZyB8IG51bGw7IHRzY29uZmlnRGlyPzogc3RyaW5nIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0c0NvbmZpZyA9IG9wdHMudHNDb25maWcgPz8gbnVsbFxuICBjb25zdCBpc1JlbGF0aXZlSW1wb3J0ID1cbiAgICB1bmtub3duRmlsZVBhdGguc3RhcnRzV2l0aChcIi4vXCIpIHx8IHVua25vd25GaWxlUGF0aC5zdGFydHNXaXRoKFwiLi4vXCIpXG4gIGNvbnN0IGhhc0Jhc2VVcmwgPSAhIXRzQ29uZmlnPy5jb21waWxlck9wdGlvbnM/LmJhc2VVcmxcblxuICAvLyBIYW5kbGUgcGFyZW50IGRpcmVjdG9yeSBuYXZpZ2F0aW9uIHByb3Blcmx5XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9XG4gICAgY3dkICYmIChpc1JlbGF0aXZlSW1wb3J0IHx8ICFoYXNCYXNlVXJsKVxuICAgICAgPyByZXNvbHZlUmVsYXRpdmVQYXRoKHVua25vd25GaWxlUGF0aCwgY3dkKVxuICAgICAgOiB1bmtub3duRmlsZVBhdGhcblxuICBjb25zdCBmaWxlUGF0aHMgPSBuZXcgU2V0KFxuICAgIEFycmF5LmlzQXJyYXkoZnNNYXBPckFsbEZpbGVQYXRocylcbiAgICAgID8gZnNNYXBPckFsbEZpbGVQYXRoc1xuICAgICAgOiBPYmplY3Qua2V5cyhmc01hcE9yQWxsRmlsZVBhdGhzKSxcbiAgKVxuXG4gIGlmIChmaWxlUGF0aHMuaGFzKHJlc29sdmVkUGF0aCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWRQYXRoXG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGhNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgZmlsZVBhdGhzKSB7XG4gICAgbm9ybWFsaXplZEZpbGVQYXRoTWFwLnNldChub3JtYWxpemVGaWxlUGF0aChmaWxlUGF0aCksIGZpbGVQYXRoKVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUZpbGVQYXRoKHJlc29sdmVkUGF0aClcblxuICAvLyBXaGVuIGJhc2VVcmwgaXMgc2V0LCBub24tcmVsYXRpdmUgaW1wb3J0cyBzaG91bGQgZ28gdGhyb3VnaCBiYXNlVXJsIHJlc29sdXRpb25cbiAgaWYgKGlzUmVsYXRpdmVJbXBvcnQgfHwgIWhhc0Jhc2VVcmwpIHtcbiAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhub3JtYWxpemVkUmVzb2x2ZWRQYXRoKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5nZXQobm9ybWFsaXplZFJlc29sdmVkUGF0aCkhXG4gICAgfVxuXG4gICAgLy8gU2VhcmNoIGZvciBmaWxlIHdpdGggYSBzZXQgb2YgZGlmZmVyZW50IGV4dGVuc2lvbnNcbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBGSUxFX0VYVEVOU0lPTlMpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkUmVzb2x2ZWRQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBUcnkgcmVzb2x2aW5nIHVzaW5nIHRzY29uZmlnIFwicGF0aHNcIiBtYXBwaW5nIHdoZW4gdGhlIGltcG9ydCBpcyBub24tcmVsYXRpdmVcbiAgaWYgKCFpc1JlbGF0aXZlSW1wb3J0KSB7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoRnJvbVBhdGhzID0gcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzKHtcbiAgICAgIGltcG9ydFBhdGg6IHVua25vd25GaWxlUGF0aCxcbiAgICAgIG5vcm1hbGl6ZWRGaWxlUGF0aE1hcCxcbiAgICAgIGV4dGVuc2lvbnM6IEZJTEVfRVhURU5TSU9OUyxcbiAgICAgIHRzQ29uZmlnLFxuICAgICAgdHNjb25maWdEaXI6IG9wdHMudHNjb25maWdEaXIsXG4gICAgfSlcbiAgICBpZiAocmVzb2x2ZWRQYXRoRnJvbVBhdGhzKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbVBhdGhzXG5cbiAgICBjb25zdCByZXNvbHZlZFBhdGhGcm9tQmFzZVVybCA9IHJlc29sdmVXaXRoQmFzZVVybCh7XG4gICAgICBpbXBvcnRQYXRoOiB1bmtub3duRmlsZVBhdGgsXG4gICAgICBub3JtYWxpemVkRmlsZVBhdGhNYXAsXG4gICAgICBleHRlbnNpb25zOiBGSUxFX0VYVEVOU0lPTlMsXG4gICAgICB0c0NvbmZpZyxcbiAgICAgIHRzY29uZmlnRGlyOiBvcHRzLnRzY29uZmlnRGlyLFxuICAgIH0pXG4gICAgaWYgKHJlc29sdmVkUGF0aEZyb21CYXNlVXJsKSByZXR1cm4gcmVzb2x2ZWRQYXRoRnJvbUJhc2VVcmxcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGl0J3MgYW4gYWJzb2x1dGUgaW1wb3J0IChvbmx5IGlmIG5vIGJhc2VVcmwgaXMgY29uZmlndXJlZCBpbiB0c2NvbmZpZylcbiAgLy8gV2hlbiBiYXNlVXJsIGlzIHNldCwgaW1wb3J0cyBzaG91bGQgcmVzb2x2ZSB2aWEgYmFzZVVybCBvciBmYWlsLCBub3QgZmFsbCBiYWNrIHRvIGFic29sdXRlIHBhdGhzXG4gIGlmICghaXNSZWxhdGl2ZUltcG9ydCAmJiAhaGFzQmFzZVVybCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGggPSBub3JtYWxpemVGaWxlUGF0aCh1bmtub3duRmlsZVBhdGgpXG4gICAgaWYgKG5vcm1hbGl6ZWRGaWxlUGF0aE1hcC5oYXMobm9ybWFsaXplZFVua25vd25GaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmlsZVBhdGhNYXAuZ2V0KG5vcm1hbGl6ZWRVbmtub3duRmlsZVBhdGgpIVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGV4dCBvZiBGSUxFX0VYVEVOU0lPTlMpIHtcbiAgICAgIGNvbnN0IHBvc3NpYmxlRmlsZVBhdGggPSBgJHtub3JtYWxpemVkVW5rbm93bkZpbGVQYXRofS4ke2V4dH1gXG4gICAgICBpZiAobm9ybWFsaXplZEZpbGVQYXRoTWFwLmhhcyhwb3NzaWJsZUZpbGVQYXRoKSkge1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZpbGVQYXRoTWFwLmdldChwb3NzaWJsZUZpbGVQYXRoKSFcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyA9IChcbiAgdW5rbm93bkZpbGVQYXRoOiBzdHJpbmcsXG4gIGZzTWFwT3JBbGxGaWxlUGF0aHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdbXSxcbiAgY3dkPzogc3RyaW5nLFxuICBvcHRzOiB7IHRzQ29uZmlnPzogVHNDb25maWcgfCBudWxsOyB0c2NvbmZpZ0Rpcj86IHN0cmluZyB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgcmVzb2x2ZWRGaWxlUGF0aCA9IHJlc29sdmVGaWxlUGF0aChcbiAgICB1bmtub3duRmlsZVBhdGgsXG4gICAgZnNNYXBPckFsbEZpbGVQYXRocyxcbiAgICBjd2QsXG4gICAgb3B0cyxcbiAgKVxuICBpZiAoIXJlc29sdmVkRmlsZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmlsZSBub3QgZm91bmQgXCIke3Vua25vd25GaWxlUGF0aH1cIiwgYXZhaWxhYmxlIHBhdGhzOlxcblxcbiR7T2JqZWN0LmtleXMoZnNNYXBPckFsbEZpbGVQYXRocykuam9pbihcIiwgXCIpfWAsXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNvbHZlZEZpbGVQYXRoXG59XG4iLCAiZXhwb3J0IGNvbnN0IHN0cmlwQ29tbWVudHMgPSAoY29kZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgbGV0IG91dCA9IFwiXCJcbiAgbGV0IGkgPSAwXG5cbiAgbGV0IGluU2luZ2xlID0gZmFsc2VcbiAgbGV0IGluRG91YmxlID0gZmFsc2VcbiAgbGV0IGluVGVtcGxhdGUgPSBmYWxzZVxuXG4gIHdoaWxlIChpIDwgY29kZS5sZW5ndGgpIHtcbiAgICBjb25zdCBjaCA9IGNvZGVbaV1cbiAgICBjb25zdCBuZXh0ID0gY29kZVtpICsgMV1cblxuICAgIC8vIEhhbmRsZSBzdHJpbmcvdGVtcGxhdGUgbGl0ZXJhbCBzdGF0ZXMgKHNvIHdlIGRvbid0IHRyZWF0IGNvbW1lbnQgbWFya2VycyBpbnNpZGUgc3RyaW5ncyBhcyBjb21tZW50cylcbiAgICBpZiAoIWluRG91YmxlICYmICFpblRlbXBsYXRlICYmIGNoID09PSBcIidcIiAmJiBjb2RlW2kgLSAxXSAhPT0gXCJcXFxcXCIpIHtcbiAgICAgIGluU2luZ2xlID0gIWluU2luZ2xlXG4gICAgICBvdXQgKz0gY2hcbiAgICAgIGkrK1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKCFpblNpbmdsZSAmJiAhaW5UZW1wbGF0ZSAmJiBjaCA9PT0gJ1wiJyAmJiBjb2RlW2kgLSAxXSAhPT0gXCJcXFxcXCIpIHtcbiAgICAgIGluRG91YmxlID0gIWluRG91YmxlXG4gICAgICBvdXQgKz0gY2hcbiAgICAgIGkrK1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKCFpblNpbmdsZSAmJiAhaW5Eb3VibGUgJiYgY2ggPT09IFwiYFwiICYmIGNvZGVbaSAtIDFdICE9PSBcIlxcXFxcIikge1xuICAgICAgaW5UZW1wbGF0ZSA9ICFpblRlbXBsYXRlXG4gICAgICBvdXQgKz0gY2hcbiAgICAgIGkrK1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSdyZSBub3QgaW5zaWRlIGEgc3RyaW5nL3RlbXBsYXRlLCByZW1vdmUgY29tbWVudHNcbiAgICBpZiAoIWluU2luZ2xlICYmICFpbkRvdWJsZSAmJiAhaW5UZW1wbGF0ZSkge1xuICAgICAgLy8gTGluZSBjb21tZW50IC8vXG4gICAgICBpZiAoY2ggPT09IFwiL1wiICYmIG5leHQgPT09IFwiL1wiKSB7XG4gICAgICAgIC8vIFJlcGxhY2Ugd2l0aCBzcGFjZXMgdG8ga2VlcCBjb2x1bW4gYWxpZ25tZW50OyBwcmVzZXJ2ZSBuZXdsaW5lXG4gICAgICAgIG91dCArPSBcIiAgXCJcbiAgICAgICAgaSArPSAyXG4gICAgICAgIHdoaWxlIChpIDwgY29kZS5sZW5ndGggJiYgY29kZVtpXSAhPT0gXCJcXG5cIikge1xuICAgICAgICAgIG91dCArPSBcIiBcIlxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIEJsb2NrIGNvbW1lbnQgLyogLi4uICovXG4gICAgICBpZiAoY2ggPT09IFwiL1wiICYmIG5leHQgPT09IFwiKlwiKSB7XG4gICAgICAgIG91dCArPSBcIiAgXCJcbiAgICAgICAgaSArPSAyXG4gICAgICAgIHdoaWxlIChpIDwgY29kZS5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoY29kZVtpXSA9PT0gXCJcXG5cIikgb3V0ICs9IFwiXFxuXCJcbiAgICAgICAgICBlbHNlIG91dCArPSBcIiBcIlxuICAgICAgICAgIGlmIChjb2RlW2ldID09PSBcIipcIiAmJiBjb2RlW2kgKyAxXSA9PT0gXCIvXCIpIHtcbiAgICAgICAgICAgIG91dCArPSBcIiBcIiAvLyBmb3IgJy8nXG4gICAgICAgICAgICBpICs9IDJcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGkrK1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgb3V0ICs9IGNoXG4gICAgaSsrXG4gIH1cblxuICByZXR1cm4gb3V0XG59XG4iLCAiaW1wb3J0IHsgc3RyaXBDb21tZW50cyB9IGZyb20gXCIuL3N0cmlwLWNvbW1lbnRzXCJcblxuZXhwb3J0IGNvbnN0IGdldEltcG9ydHNGcm9tQ29kZSA9IChjb2RlOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IHN0cmlwcGVkQ29kZSA9IHN0cmlwQ29tbWVudHMoY29kZSlcbiAgLy8gTWF0Y2ggYmFzaWMgaW1wb3J0IHBhdHRlcm5zIGluY2x1ZGluZyBjb21iaW5lZCBkZWZhdWx0IGFuZCBuYW1lc3BhY2UgaW1wb3J0c1xuICBjb25zdCBpbXBvcnRSZWdleCA9XG4gICAgL15cXHMqaW1wb3J0XFxzKyg/Oig/OltcXHdcXHNdKyxcXHMqKT8oPzpcXCpcXHMrYXNcXHMrW1xcd1xcc10rfFxce1tcXHNcXHcsXStcXH18XFx3KylcXHMrZnJvbVxccyopP1snXCJdKC4rPylbJ1wiXS9nbVxuICBjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdXG4gIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICgobWF0Y2ggPSBpbXBvcnRSZWdleC5leGVjKHN0cmlwcGVkQ29kZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgZnVsbE1hdGNoID0gbWF0Y2hbMF1cbiAgICBpZiAoL15cXHMqaW1wb3J0XFxzK3R5cGVcXGIvLnRlc3QoZnVsbE1hdGNoKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaW1wb3J0cy5wdXNoKG1hdGNoWzFdKVxuICB9XG5cbiAgLy8gTWF0Y2ggcmUtZXhwb3J0c1xuICBjb25zdCByZUV4cG9ydFJlZ2V4ID1cbiAgICAvXlxccypleHBvcnRcXHMrKD86dHlwZVxccyspPyg/OlxcKlxccythc1xccytbXFx3JF0rfFxcKnxcXHtbXn1dK1xcfSlcXHMrZnJvbVxccypbJ1wiXSguKz8pWydcIl0vZ21cbiAgbGV0IHJlRXhwb3J0TWF0Y2g6IFJlZ0V4cEV4ZWNBcnJheSB8IG51bGxcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IDxleHBsYW5hdGlvbj5cbiAgd2hpbGUgKChyZUV4cG9ydE1hdGNoID0gcmVFeHBvcnRSZWdleC5leGVjKHN0cmlwcGVkQ29kZSkpICE9PSBudWxsKSB7XG4gICAgY29uc3QgZnVsbE1hdGNoID0gcmVFeHBvcnRNYXRjaFswXVxuICAgIGlmICgvXlxccypleHBvcnRcXHMrdHlwZVxcYi8udGVzdChmdWxsTWF0Y2gpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpbXBvcnRzLnB1c2gocmVFeHBvcnRNYXRjaFsxXSlcbiAgfVxuXG4gIHJldHVybiBpbXBvcnRzXG59XG4iLCAiaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCIuL2Rpcm5hbWVcIlxuXG50eXBlIEV4cG9ydFZhbHVlID0gc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj5cblxuaW50ZXJmYWNlIFBhY2thZ2VKc29uIHtcbiAgbWFpbj86IHN0cmluZ1xuICBtb2R1bGU/OiBzdHJpbmdcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIEV4cG9ydFZhbHVlPlxufVxuXG5pbnRlcmZhY2UgTm9kZVJlc29sdXRpb25Db250ZXh0IHtcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgZXh0ZW5zaW9uczogc3RyaW5nW11cbiAgYmFzZVBhdGg6IHN0cmluZ1xuICBtb2R1bGVQYXRoOiBzdHJpbmdcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ29udGV4dChcbiAgbW9kdWxlUGF0aDogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgYmFzZVBhdGg6IHN0cmluZyxcbik6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCB7XG4gIHJldHVybiB7XG4gICAgZnNNYXAsXG4gICAgZXh0ZW5zaW9uczogW1wiLmpzXCIsIFwiLmpzeFwiLCBcIi50c1wiLCBcIi50c3hcIiwgXCIuanNvblwiXSxcbiAgICBiYXNlUGF0aCxcbiAgICBtb2R1bGVQYXRoLFxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRQYWNrYWdlSnNvbihub2RlTW9kdWxlc1BhdGg6IHN0cmluZywgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQpIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS9wYWNrYWdlLmpzb25gXG4gIGlmICghY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIHJldHVybiBudWxsXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY3R4LmZzTWFwW3BhY2thZ2VKc29uUGF0aF0pIGFzIFBhY2thZ2VKc29uXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKFxuICBwYXRoOiBzdHJpbmcsXG4gIGN0eDogTm9kZVJlc29sdXRpb25Db250ZXh0LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmIChjdHguZnNNYXBbcGF0aF0pIHJldHVybiBwYXRoXG5cbiAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICBjb25zdCBwYXRoV2l0aEV4dCA9IHBhdGgucmVwbGFjZSgvXFwuanMkfFxcLmpzeCQvLCBcIlwiKSArIGV4dFxuICAgIGlmIChjdHguZnNNYXBbcGF0aFdpdGhFeHRdKSByZXR1cm4gcGF0aFdpdGhFeHRcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlRXhwb3J0UGF0aChcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIGV4cG9ydFBhdGg6IHN0cmluZyxcbiAgY3R4OiBOb2RlUmVzb2x1dGlvbkNvbnRleHQsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZnVsbEV4cG9ydFBhdGggPSBgJHtub2RlTW9kdWxlc1BhdGh9LyR7ZXhwb3J0UGF0aC5yZXBsYWNlKC9eXFwuXFwvLywgXCJcIil9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxFeHBvcnRQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVDb25kaXRpb25hbEV4cG9ydChleHBvcnRWYWx1ZTogRXhwb3J0VmFsdWUpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBleHBvcnRWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBleHBvcnRWYWx1ZVxuICB9XG5cbiAgLy8gSGFuZGxlIGNvbmRpdGlvbmFsIGV4cG9ydHMgLSB0cnkgY29tbW9uIGNvbmRpdGlvbnMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZVxuICBjb25zdCBjb25kaXRpb25zID0gW1wiaW1wb3J0XCIsIFwiZGVmYXVsdFwiLCBcInJlcXVpcmVcIiwgXCJub2RlXCIsIFwiYnJvd3NlclwiXVxuICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgaWYgKGV4cG9ydFZhbHVlW2NvbmRpdGlvbl0pIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlID0gZXhwb3J0VmFsdWVbY29uZGl0aW9uXVxuICAgICAgaWYgKHR5cGVvZiBjb25kaXRpb25WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gY29uZGl0aW9uVmFsdWVcbiAgICAgIH1cbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGhhbmRsZSBuZXN0ZWQgY29uZGl0aW9uc1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoY29uZGl0aW9uVmFsdWUpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlRXhwb3J0cyhcbiAgbm9kZU1vZHVsZXNQYXRoOiBzdHJpbmcsXG4gIHBhY2thZ2VKc29uOiBQYWNrYWdlSnNvbixcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXBhY2thZ2VKc29uLmV4cG9ydHMpIHJldHVybiBudWxsXG5cbiAgLy8gSGFuZGxlIGRlZmF1bHQgZXhwb3J0IGNvbmRpdGlvbiAod2hlbiBubyBzdWJwYXRoKVxuICBjb25zdCBkZWZhdWx0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0c1tcIi5cIl1cbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgZGVmYXVsdEV4cG9ydCkge1xuICAgIGNvbnN0IGV4cG9ydFBhdGggPSByZXNvbHZlQ29uZGl0aW9uYWxFeHBvcnQoZGVmYXVsdEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIHN1YnBhdGggZXhwb3J0c1xuICBjb25zdCBzdWJwYXRoRXhwb3J0ID0gcmVtYWluaW5nUGF0aFxuICAgID8gcGFja2FnZUpzb24uZXhwb3J0c1tgLi8ke3JlbWFpbmluZ1BhdGh9YF1cbiAgICA6IG51bGxcbiAgaWYgKHN1YnBhdGhFeHBvcnQpIHtcbiAgICBjb25zdCBleHBvcnRQYXRoID0gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KHN1YnBhdGhFeHBvcnQpXG4gICAgaWYgKGV4cG9ydFBhdGgpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUV4cG9ydFBhdGgobm9kZU1vZHVsZXNQYXRoLCBleHBvcnRQYXRoLCBjdHgpXG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZFxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSB0b3AtbGV2ZWwgY29uZGl0aW9uYWwgZXhwb3J0cyAobGVnYWN5IGZvcm1hdClcbiAgY29uc3QgaW1wb3J0RXhwb3J0ID0gcGFja2FnZUpzb24uZXhwb3J0cy5pbXBvcnRcbiAgaWYgKHJlbWFpbmluZ1BhdGggPT09IFwiXCIgJiYgaW1wb3J0RXhwb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBleHBvcnRQYXRoID0gcmVzb2x2ZUNvbmRpdGlvbmFsRXhwb3J0KGltcG9ydEV4cG9ydClcbiAgICBpZiAoZXhwb3J0UGF0aCkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlRXhwb3J0UGF0aChub2RlTW9kdWxlc1BhdGgsIGV4cG9ydFBhdGgsIGN0eClcbiAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuIHJlc29sdmVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VFbnRyeVBvaW50KFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcGFja2FnZUpzb246IFBhY2thZ2VKc29uLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBlbnRyeVBvaW50ID0gcGFja2FnZUpzb24ubW9kdWxlIHx8IHBhY2thZ2VKc29uLm1haW4gfHwgXCJpbmRleC5qc1wiXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke2VudHJ5UG9pbnR9YFxuICByZXR1cm4gdHJ5UmVzb2x2ZVdpdGhFeHRlbnNpb25zKGZ1bGxQYXRoLCBjdHgpXG59XG5cbmZ1bmN0aW9uIHJlc29sdmVSZW1haW5pbmdQYXRoKFxuICBub2RlTW9kdWxlc1BhdGg6IHN0cmluZyxcbiAgcmVtYWluaW5nUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBpZiAoIXJlbWFpbmluZ1BhdGgpIHtcbiAgICAvLyBUcnkgaW5kZXggZmlsZXMgaW4gdGhlIG1vZHVsZSByb290XG4gICAgZm9yIChjb25zdCBleHQgb2YgY3R4LmV4dGVuc2lvbnMpIHtcbiAgICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke25vZGVNb2R1bGVzUGF0aH0vaW5kZXgke2V4dH1gXG4gICAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGZ1bGxQYXRoID0gYCR7bm9kZU1vZHVsZXNQYXRofS8ke3JlbWFpbmluZ1BhdGh9YFxuICBjb25zdCBkaXJlY3RNYXRjaCA9IHRyeVJlc29sdmVXaXRoRXh0ZW5zaW9ucyhmdWxsUGF0aCwgY3R4KVxuICBpZiAoZGlyZWN0TWF0Y2gpIHJldHVybiBkaXJlY3RNYXRjaFxuXG4gIC8vIFRyeSBpbmRleCBmaWxlc1xuICBmb3IgKGNvbnN0IGV4dCBvZiBjdHguZXh0ZW5zaW9ucykge1xuICAgIGNvbnN0IGluZGV4UGF0aCA9IGAke2Z1bGxQYXRofS9pbmRleCR7ZXh0fWBcbiAgICBpZiAoY3R4LmZzTWFwW2luZGV4UGF0aF0pIHJldHVybiBpbmRleFBhdGhcbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChcbiAgc2VhcmNoUGF0aDogc3RyaW5nLFxuICBjdHg6IE5vZGVSZXNvbHV0aW9uQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtb2R1bGVQYXJ0cyA9IGN0eC5tb2R1bGVQYXRoLnNwbGl0KFwiL1wiKVxuICBjb25zdCBzY29wZSA9IG1vZHVsZVBhcnRzWzBdLnN0YXJ0c1dpdGgoXCJAXCIpXG4gICAgPyBtb2R1bGVQYXJ0cy5zbGljZSgwLCAyKS5qb2luKFwiL1wiKVxuICAgIDogbW9kdWxlUGFydHNbMF1cbiAgY29uc3QgcmVtYWluaW5nUGF0aCA9IG1vZHVsZVBhcnRzLnNsaWNlKHNjb3BlLmluY2x1ZGVzKFwiL1wiKSA/IDIgOiAxKS5qb2luKFwiL1wiKVxuICBjb25zdCBub2RlTW9kdWxlc1BhdGggPSBgJHtzZWFyY2hQYXRoID09PSBcIi5cIiA/IFwiXCIgOiBgJHtzZWFyY2hQYXRofS9gfW5vZGVfbW9kdWxlcy8ke3Njb3BlfWBcblxuICAvLyBUcnkgdG8gZmluZCBwYWNrYWdlLmpzb25cbiAgY29uc3QgcGFja2FnZUpzb24gPSBmaW5kUGFja2FnZUpzb24obm9kZU1vZHVsZXNQYXRoLCBjdHgpXG4gIGlmIChwYWNrYWdlSnNvbikge1xuICAgIC8vIFRyeSByZXNvbHZpbmcgdGhyb3VnaCBleHBvcnRzIGZpZWxkXG4gICAgY29uc3QgZXhwb3J0c1Jlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUV4cG9ydHMoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIHJlbWFpbmluZ1BhdGgsXG4gICAgICBjdHgsXG4gICAgKVxuICAgIGlmIChleHBvcnRzUmVzb2x1dGlvbikgcmV0dXJuIGV4cG9ydHNSZXNvbHV0aW9uXG5cbiAgICAvLyBUcnkgcmVzb2x2aW5nIHRocm91Z2ggbWFpbi9tb2R1bGUgZmllbGRzXG4gICAgY29uc3QgZW50cnlQb2ludFJlc29sdXRpb24gPSByZXNvbHZlUGFja2FnZUVudHJ5UG9pbnQoXG4gICAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgICBwYWNrYWdlSnNvbixcbiAgICAgIGN0eCxcbiAgICApXG4gICAgaWYgKGVudHJ5UG9pbnRSZXNvbHV0aW9uKSByZXR1cm4gZW50cnlQb2ludFJlc29sdXRpb25cbiAgfVxuXG4gIC8vIFRyeSByZXNvbHZpbmcgcmVtYWluaW5nIHBhdGhcbiAgY29uc3QgcmVtYWluaW5nUGF0aFJlc29sdXRpb24gPSByZXNvbHZlUmVtYWluaW5nUGF0aChcbiAgICBub2RlTW9kdWxlc1BhdGgsXG4gICAgcmVtYWluaW5nUGF0aCxcbiAgICBjdHgsXG4gIClcbiAgaWYgKHJlbWFpbmluZ1BhdGhSZXNvbHV0aW9uKSByZXR1cm4gcmVtYWluaW5nUGF0aFJlc29sdXRpb25cblxuICAvLyBJZiBub3QgZm91bmQgYW5kIHdlIGhhdmUgYSBwYXJlbnQgZGlyZWN0b3J5LCB0cnkgdGhlcmVcbiAgY29uc3QgcGFyZW50UGF0aCA9IGRpcm5hbWUoc2VhcmNoUGF0aClcbiAgaWYgKHBhcmVudFBhdGggJiYgcGFyZW50UGF0aCAhPT0gc2VhcmNoUGF0aCkge1xuICAgIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChwYXJlbnRQYXRoLCBjdHgpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU5vZGVNb2R1bGUoXG4gIG1vZHVsZVBhdGg6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgY3R4ID0gY3JlYXRlQ29udGV4dChtb2R1bGVQYXRoLCBmc01hcCwgYmFzZVBhdGgpXG4gIHJldHVybiByZXNvbHZlTm9kZU1vZHVsZUluUGF0aChjdHguYmFzZVBhdGgsIGN0eClcbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlRmlsZVBhdGggfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgcmVzb2x2ZU5vZGVNb2R1bGUgfSBmcm9tIFwibGliL3V0aWxzL3Jlc29sdmUtbm9kZS1tb2R1bGVcIlxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbENvbXBpbGVkSnMoXG4gIGNvbXBpbGVkQ29kZTogc3RyaW5nLFxuICBwcmVTdXBwbGllZEltcG9ydHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN3ZD86IHN0cmluZyxcbikge1xuICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9yZXF1aXJlID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIGxldCByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZUZpbGVQYXRoKG5hbWUsIHByZVN1cHBsaWVkSW1wb3J0cywgY3dkKVxuXG4gICAgaWYgKCFyZXNvbHZlZEZpbGVQYXRoICYmICFuYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmICFuYW1lLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICByZXNvbHZlZEZpbGVQYXRoID0gcmVzb2x2ZU5vZGVNb2R1bGUobmFtZSwgcHJlU3VwcGxpZWRJbXBvcnRzLCBjd2QgfHwgXCJcIilcbiAgICB9XG5cbiAgICBjb25zdCBoYXNSZXNvbHZlZEZpbGVQYXRoID1cbiAgICAgIHJlc29sdmVkRmlsZVBhdGggJiYgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGhdXG5cbiAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tuYW1lXSAmJiAhaGFzUmVzb2x2ZWRGaWxlUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnQgXCIke25hbWV9XCIgbm90IGZvdW5kICR7Y3dkID8gYGluIFwiJHtjd2R9XCJgIDogXCJcIn1gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZCA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbbmFtZV0gfHwgcHJlU3VwcGxpZWRJbXBvcnRzW3Jlc29sdmVkRmlsZVBhdGghXVxuICAgIHJldHVybiBuZXcgUHJveHkobW9kLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICghKHByb3AgaW4gdGFyZ2V0KSkge1xuICAgICAgICAgIGlmIChwcm9wID09PSBcImRlZmF1bHRcIikge1xuICAgICAgICAgICAgaWYgKHRhcmdldC5kZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5kZWZhdWx0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuX19lc01vZHVsZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvcCA9PT0gXCJfX2VzTW9kdWxlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENvbXBvbmVudCBcIiR7U3RyaW5nKHByb3ApfVwiIGlzIG5vdCBleHBvcnRlZCBieSBcIiR7bmFtZX1cImAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wIGFzIGtleW9mIHR5cGVvZiB0YXJnZXRdXG4gICAgICB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBmdW5jdGlvbkJvZHkgPSBgXG4gIHZhciBleHBvcnRzID0ge307XG4gIHZhciByZXF1aXJlID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9yZXF1aXJlO1xuICB2YXIgbW9kdWxlID0geyBleHBvcnRzIH07XG4gIHZhciBjaXJjdWl0ID0gZ2xvYmFsVGhpcy5fX3RzY2lyY3VpdF9jaXJjdWl0O1xuICAke2NvbXBpbGVkQ29kZX07XG4gIHJldHVybiBtb2R1bGU7YC50cmltKClcbiAgcmV0dXJuIEZ1bmN0aW9uKGZ1bmN0aW9uQm9keSkuY2FsbChnbG9iYWxUaGlzKVxufVxuIiwgImltcG9ydCB7IHJlc29sdmVGaWxlUGF0aE9yVGhyb3cgfSBmcm9tIFwibGliL3J1bm5lci9yZXNvbHZlRmlsZVBhdGhcIlxuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJsaWIvdXRpbHMvZGlybmFtZVwiXG5pbXBvcnQgeyBnZXRJbXBvcnRzRnJvbUNvZGUgfSBmcm9tIFwibGliL3V0aWxzL2dldC1pbXBvcnRzLWZyb20tY29kZVwiXG5pbXBvcnQgeyBldmFsQ29tcGlsZWRKcyB9IGZyb20gXCIuL2V2YWwtY29tcGlsZWQtanNcIlxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgaXNTdGF0aWNBc3NldFBhdGggfSBmcm9tIFwibGliL3NoYXJlZC9zdGF0aWMtYXNzZXQtZXh0ZW5zaW9uc1wiXG5pbXBvcnQgeyB0cmFuc2Zvcm1XaXRoU3VjcmFzZSB9IGZyb20gXCJsaWIvdHJhbnNwaWxlL3RyYW5zZm9ybS13aXRoLXN1Y3Jhc2VcIlxuaW1wb3J0IHsgS2ljYWRUb0NpcmN1aXRKc29uQ29udmVydGVyIH0gZnJvbSBcImtpY2FkLXRvLWNpcmN1aXQtanNvblwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWxvY2FsLWZpbGVcIilcblxuZXhwb3J0IGNvbnN0IGltcG9ydExvY2FsRmlsZSA9IGFzeW5jIChcbiAgaW1wb3J0TmFtZTogc3RyaW5nLFxuICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gIGRlcHRoID0gMCxcbikgPT4ge1xuICBkZWJ1ZyhcImltcG9ydExvY2FsRmlsZSBjYWxsZWQgd2l0aDpcIiwge1xuICAgIGltcG9ydE5hbWUsXG4gIH0pXG5cbiAgY29uc3QgeyBmc01hcCwgcHJlU3VwcGxpZWRJbXBvcnRzLCBpbXBvcnRTdGFjaywgY3VycmVudGx5SW1wb3J0aW5nIH0gPSBjdHhcblxuICBjb25zdCBmc1BhdGggPSByZXNvbHZlRmlsZVBhdGhPclRocm93KGltcG9ydE5hbWUsIGZzTWFwLCB1bmRlZmluZWQsIHtcbiAgICB0c0NvbmZpZzogY3R4LnRzQ29uZmlnLFxuICB9KVxuICBkZWJ1ZyhcImZzUGF0aDpcIiwgZnNQYXRoKVxuICBpZiAoY3VycmVudGx5SW1wb3J0aW5nLmhhcyhmc1BhdGgpKSB7XG4gICAgY29uc3QgY3ljbGVTdGFydEluZGV4ID0gaW1wb3J0U3RhY2suaW5kZXhPZihmc1BhdGgpXG4gICAgY29uc3QgY3ljbGVQYXRoID1cbiAgICAgIGN5Y2xlU3RhcnRJbmRleCA+PSAwXG4gICAgICAgID8gaW1wb3J0U3RhY2suc2xpY2UoY3ljbGVTdGFydEluZGV4KS5jb25jYXQoZnNQYXRoKVxuICAgICAgICA6IFsuLi5pbXBvcnRTdGFjaywgZnNQYXRoXVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkIHdoaWxlIGltcG9ydGluZyBcIiR7ZnNQYXRofVwiLiBUaGUgZm9sbG93aW5nIGltcG9ydCBjaGFpbiBmb3JtcyBhIGN5Y2xlOlxcblxcbiR7Y3ljbGVQYXRoLmpvaW4oXG4gICAgICAgIFwiIC0+IFwiLFxuICAgICAgKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmICghY3R4LmZzTWFwW2ZzUGF0aF0pIHtcbiAgICBkZWJ1ZyhcImZzUGF0aCBub3QgZm91bmQgaW4gZnNNYXA6XCIsIGZzUGF0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGUgXCIke2ZzUGF0aH1cIiBub3QgZm91bmRgKVxuICB9XG4gIGNvbnN0IGZpbGVDb250ZW50ID0gZnNNYXBbZnNQYXRoXVxuICBkZWJ1ZyhcImZpbGVDb250ZW50OlwiLCBmaWxlQ29udGVudD8uc2xpY2UoMCwgMTAwKSlcbiAgY3VycmVudGx5SW1wb3J0aW5nLmFkZChmc1BhdGgpXG4gIGltcG9ydFN0YWNrLnB1c2goZnNQYXRoKVxuICB0cnkge1xuICAgIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKGZpbGVDb250ZW50KVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IGpzb25EYXRhLFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnNQYXRoLmVuZHNXaXRoKFwiLmtpY2FkX3BjYlwiKSkge1xuICAgICAgY29uc3QgY29udmVydGVyID0gbmV3IEtpY2FkVG9DaXJjdWl0SnNvbkNvbnZlcnRlcigpXG4gICAgICBjb252ZXJ0ZXIuYWRkRmlsZShmc1BhdGgsIGZpbGVDb250ZW50KVxuICAgICAgY29udmVydGVyLnJ1blVudGlsRmluaXNoZWQoKVxuICAgICAgY29uc3QgY2lyY3VpdEpzb24gPSBjb252ZXJ0ZXIuZ2V0T3V0cHV0KClcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tmc1BhdGhdID0ge1xuICAgICAgICBfX2VzTW9kdWxlOiB0cnVlLFxuICAgICAgICBjaXJjdWl0SnNvbjogY2lyY3VpdEpzb24sXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1N0YXRpY0Fzc2V0UGF0aChmc1BhdGgpKSB7XG4gICAgICBsZXQgc3RhdGljVXJsOiBzdHJpbmdcblxuICAgICAgaWYgKGZpbGVDb250ZW50ID09PSBcIl9fU1RBVElDX0FTU0VUX19cIikge1xuICAgICAgICAvLyBQbGFjZWhvbGRlcjogdXNlIHByb2plY3RCYXNlVXJsIGZvciBzdGF0aWMgZmlsZSBpbXBvcnRzXG4gICAgICAgIGNvbnN0IHBsYXRmb3JtQ29uZmlnID0gY3R4LmNpcmN1aXQucGxhdGZvcm1cbiAgICAgICAgc3RhdGljVXJsID0gYCR7cGxhdGZvcm1Db25maWc/LnByb2plY3RCYXNlVXJsID8/IFwiXCJ9LyR7XG4gICAgICAgICAgZnNQYXRoLnN0YXJ0c1dpdGgoXCIuL1wiKSA/IGZzUGF0aC5zbGljZSgyKSA6IGZzUGF0aFxuICAgICAgICB9YFxuICAgICAgfSBlbHNlIGlmIChmaWxlQ29udGVudC5zdGFydHNXaXRoKFwiYmxvYjpcIikpIHtcbiAgICAgICAgLy8gQnJvd3NlciBwcm92aWRlZCBhIGJsb2IgVVJMIGRpcmVjdGx5LCB1c2UgaXQgYXMtaXNcbiAgICAgICAgc3RhdGljVXJsID0gYCR7ZmlsZUNvbnRlbnR9I2V4dD0ke2ZzUGF0aC5zcGxpdChcIi5cIikucG9wKCl9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQWN0dWFsIGZpbGUgY29udGVudDogY3JlYXRlIGEgYmxvYiBVUkxcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtmaWxlQ29udGVudF0sIHtcbiAgICAgICAgICB0eXBlOiBmc1BhdGguZW5kc1dpdGgoXCIua2ljYWRfbW9kXCIpXG4gICAgICAgICAgICA/IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICA6IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsXG4gICAgICAgIH0pXG4gICAgICAgIHN0YXRpY1VybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcbiAgICAgIH1cblxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSB7XG4gICAgICAgIF9fZXNNb2R1bGU6IHRydWUsXG4gICAgICAgIGRlZmF1bHQ6IHN0YXRpY1VybCxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzUGF0aC5lbmRzV2l0aChcIi50c3hcIikgfHwgZnNQYXRoLmVuZHNXaXRoKFwiLnRzXCIpKSB7XG4gICAgICBjb25zdCBpbXBvcnROYW1lcyA9IGdldEltcG9ydHNGcm9tQ29kZShmaWxlQ29udGVudClcblxuICAgICAgZm9yIChjb25zdCBpbXBvcnROYW1lIG9mIGltcG9ydE5hbWVzKSB7XG4gICAgICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgICAgICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aCArIDEsIHtcbiAgICAgICAgICAgIGN3ZDogZGlybmFtZShmc1BhdGgpLFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRDb2RlID0gdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aClcbiAgICAgICAgZGVidWcoXCJldmFsQ29tcGlsZWRKcyBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgICAgIGNvZGU6IHRyYW5zZm9ybWVkQ29kZS5zbGljZSgwLCAxMDApLFxuICAgICAgICAgIGRpcm5hbWU6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgaW1wb3J0UnVuUmVzdWx0ID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgICBkaXJuYW1lKGZzUGF0aCksXG4gICAgICAgIClcbiAgICAgICAgZGVidWcoXCJpbXBvcnRSdW5SZXN1bHQ6XCIsIHtcbiAgICAgICAgICBmc1BhdGgsXG4gICAgICAgICAgaW1wb3J0UnVuUmVzdWx0LFxuICAgICAgICB9KVxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbZnNQYXRoXSA9IGltcG9ydFJ1blJlc3VsdC5leHBvcnRzXG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXZhbCBjb21waWxlZCBqcyBlcnJvciBmb3IgXCIke2ltcG9ydE5hbWV9XCI6ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmc1BhdGguZW5kc1dpdGgoXCIuanNcIikgfHwgZnNQYXRoLmVuZHNXaXRoKFwiLm1qc1wiKSkge1xuICAgICAgLy8gRm9yIC5qcy8ubWpzIGZpbGVzLCBlc3BlY2lhbGx5IGZyb20gbm9kZV9tb2R1bGVzLCB3ZSBuZWVkIHRvIGV4dHJhY3QgYW5kIHJlc29sdmUgaW1wb3J0cyBmaXJzdFxuICAgICAgY29uc3QgaW1wb3J0TmFtZXMgPSBnZXRJbXBvcnRzRnJvbUNvZGUoZmlsZUNvbnRlbnQpXG5cbiAgICAgIGZvciAoY29uc3QgaW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgICAgICBpZiAoIXByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgICAgICAgIGF3YWl0IGltcG9ydEV2YWxQYXRoKGltcG9ydE5hbWUsIGN0eCwgZGVwdGggKyAxLCB7XG4gICAgICAgICAgICBjd2Q6IGRpcm5hbWUoZnNQYXRoKSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZW4gdHJhbnNmb3JtIGFuZCBldmFsdWF0ZVxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ZzUGF0aF0gPSBldmFsQ29tcGlsZWRKcyhcbiAgICAgICAgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UoZmlsZUNvbnRlbnQsIGZzUGF0aCksXG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0cyxcbiAgICAgICAgZGlybmFtZShmc1BhdGgpLFxuICAgICAgKS5leHBvcnRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uIFwiJHtmc1BhdGguc3BsaXQoXCIuXCIpLnBvcCgpfVwiIGZvciBcIiR7ZnNQYXRofVwiYCxcbiAgICAgIClcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgaW1wb3J0U3RhY2sucG9wKClcbiAgICBjdXJyZW50bHlJbXBvcnRpbmcuZGVsZXRlKGZzUGF0aClcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBTVEFUSUNfQVNTRVRfRVhURU5TSU9OUyA9IFtcbiAgXCIuZ2xiXCIsXG4gIFwiLmtpY2FkX21vZFwiLFxuICBcIi5nbHRmXCIsXG4gIFwiLm9ialwiLFxuICBcIi5zdGxcIixcbiAgXCIuc3RlcFwiLFxuICBcIi5zdHBcIixcbl1cblxuZXhwb3J0IGNvbnN0IGlzU3RhdGljQXNzZXRQYXRoID0gKHBhdGg6IHN0cmluZykgPT5cbiAgU1RBVElDX0FTU0VUX0VYVEVOU0lPTlMuc29tZSgoZXh0KSA9PiBwYXRoLmVuZHNXaXRoKGV4dCkpXG4iLCAiaW1wb3J0IHsgdHJhbnNmb3JtLCB0eXBlIFRyYW5zZm9ybSBhcyBTdWNyYXNlVHJhbnNmb3JtIH0gZnJvbSBcInN1Y3Jhc2VcIlxuXG5jb25zdCBUU19FWFRFTlNJT05TID0gbmV3IFNldChbXCIudHNcIiwgXCIudHN4XCIsIFwiLm10c1wiLCBcIi5jdHNcIl0pXG5jb25zdCBKU1hfRVhURU5TSU9OUyA9IG5ldyBTZXQoW1wiLnRzeFwiLCBcIi5qc3hcIiwgXCIudHNcIl0pXG5jb25zdCBUWVBFX1NUQVJfRVhQT1JUX1JFR0VYID1cbiAgL15cXHMqZXhwb3J0XFxzK3R5cGVcXHMrXFwqXFxzKyg/OmFzXFxzK1tcXHckXStcXHMrKT9mcm9tXFxzK1snXCJdW14nXCJdK1snXCJdXFxzKjs/XFxzKiQvZ2ltXG5cbmNvbnN0IHN0cmlwVHlwZVN0YXJFeHBvcnRzID0gKGNvZGU6IHN0cmluZykgPT5cbiAgY29kZS5yZXBsYWNlKFRZUEVfU1RBUl9FWFBPUlRfUkVHRVgsIFwiXCIpXG5cbmNvbnN0IHN0cmlwUXVlcnlBbmRIYXNoID0gKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcXVlcnlJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCI/XCIpXG4gIGNvbnN0IGhhc2hJbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoXCIjXCIpXG5cbiAgbGV0IGVuZEluZGV4ID0gZmlsZVBhdGgubGVuZ3RoXG5cbiAgaWYgKHF1ZXJ5SW5kZXggIT09IC0xICYmIGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IE1hdGgubWluKHF1ZXJ5SW5kZXgsIGhhc2hJbmRleClcbiAgfSBlbHNlIGlmIChxdWVyeUluZGV4ICE9PSAtMSkge1xuICAgIGVuZEluZGV4ID0gcXVlcnlJbmRleFxuICB9IGVsc2UgaWYgKGhhc2hJbmRleCAhPT0gLTEpIHtcbiAgICBlbmRJbmRleCA9IGhhc2hJbmRleFxuICB9XG5cbiAgcmV0dXJuIGZpbGVQYXRoLnNsaWNlKDAsIGVuZEluZGV4KVxufVxuXG5jb25zdCBnZXRFeHRlbnNpb24gPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHN0cmlwUXVlcnlBbmRIYXNoKGZpbGVQYXRoKVxuICBjb25zdCBsYXN0RG90SW5kZXggPSBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIi5cIilcblxuICBpZiAobGFzdERvdEluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiBcIlwiXG4gIH1cblxuICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IE1hdGgubWF4KFxuICAgIG5vcm1hbGl6ZWRQYXRoLmxhc3RJbmRleE9mKFwiL1wiKSxcbiAgICBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZihcIlxcXFxcIiksXG4gIClcblxuICBpZiAobGFzdFNsYXNoSW5kZXggPiBsYXN0RG90SW5kZXgpIHtcbiAgICByZXR1cm4gXCJcIlxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnNsaWNlKGxhc3REb3RJbmRleCkudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGggPSAoZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICBjb25zdCBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oZmlsZVBhdGgpXG5cbiAgY29uc3QgdHJhbnNmb3JtczogU3VjcmFzZVRyYW5zZm9ybVtdID0gW1wiaW1wb3J0c1wiXVxuXG4gIGlmIChUU19FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy51bnNoaWZ0KFwidHlwZXNjcmlwdFwiKVxuICB9XG5cbiAgaWYgKEpTWF9FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG4gICAgdHJhbnNmb3Jtcy5wdXNoKFwianN4XCIpXG4gIH1cblxuICByZXR1cm4gdHJhbnNmb3Jtc1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtV2l0aFN1Y3Jhc2UgPSAoY29kZTogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybXMgPSBnZXRUcmFuc2Zvcm1zRm9yRmlsZVBhdGgoZmlsZVBhdGgpXG4gIGNvbnN0IHNhbml0aXplZENvZGUgPSBzdHJpcFR5cGVTdGFyRXhwb3J0cyhjb2RlKVxuICBjb25zdCB7IGNvZGU6IHRyYW5zZm9ybWVkQ29kZSB9ID0gdHJhbnNmb3JtKHNhbml0aXplZENvZGUsIHtcbiAgICBmaWxlUGF0aCxcbiAgICBwcm9kdWN0aW9uOiB0cnVlLFxuICAgIHRyYW5zZm9ybXMsXG4gIH0pXG5cbiAgcmV0dXJuIHRyYW5zZm9ybWVkQ29kZVxufVxuIiwgImltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnRTbmlwcGV0KFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzIH0gPSBjdHhcbiAgY29uc3QgZnVsbFNuaXBwZXROYW1lID0gaW1wb3J0TmFtZS5yZXBsYWNlKFwiQHRzY2kvXCIsIFwiXCIpLnJlcGxhY2UoXCIuXCIsIFwiL1wiKVxuXG4gIGNvbnN0IGZldGNoT3B0aW9uczogUmVxdWVzdEluaXQgPSB7fVxuICBpZiAoY3R4LnNlc3Npb25Ub2tlbikge1xuICAgIGZldGNoT3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2N0eC5zZXNzaW9uVG9rZW59YCxcbiAgICB9XG4gIH1cblxuICBjb25zdCB7IGNqcywgZXJyb3IgfSA9IGF3YWl0IGdsb2JhbFRoaXNcbiAgICAuZmV0Y2goYCR7Y3R4LmNqc1JlZ2lzdHJ5VXJsfS8ke2Z1bGxTbmlwcGV0TmFtZX1gLCBmZXRjaE9wdGlvbnMpXG4gICAgLnRoZW4oYXN5bmMgKHJlcykgPT4gKHsgY2pzOiBhd2FpdCByZXMudGV4dCgpLCBlcnJvcjogbnVsbCB9KSlcbiAgICAuY2F0Y2goKGUpID0+ICh7IGVycm9yOiBlLCBjanM6IG51bGwgfSkpXG5cbiAgaWYgKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIGltcG9ydFwiLCBpbXBvcnROYW1lLCBlcnJvcilcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gZXZhbENvbXBpbGVkSnMoXG4gICAgICBjanMhLFxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICkuZXhwb3J0c1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGltcG9ydGluZyBzbmlwcGV0XCIsIGUpXG4gIH1cbn1cbiIsICJpbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBpbXBvcnRMb2NhbEZpbGUgfSBmcm9tIFwiLi9pbXBvcnQtbG9jYWwtZmlsZVwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbiB9IGZyb20gXCIuL2lzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvblwiXG5pbXBvcnQgeyBnZXROb2RlTW9kdWxlRGlyZWN0b3J5IH0gZnJvbSBcIi4vZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeVwiXG5pbXBvcnQgeyBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQgfSBmcm9tIFwiLi9nZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnRcIlxuaW1wb3J0IHsgaXNUeXBlU2NyaXB0RW50cnlwb2ludCB9IGZyb20gXCIuL2lzVHlwZVNjcmlwdEVudHJ5cG9pbnRcIlxuaW1wb3J0IHsgaXNEaXN0RGlyRW1wdHkgfSBmcm9tIFwiLi9pc0Rpc3REaXJFbXB0eVwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LW5vZGUtbW9kdWxlXCIpXG5cbmV4cG9ydCBjb25zdCBpbXBvcnROb2RlTW9kdWxlID0gYXN5bmMgKFxuICBpbXBvcnROYW1lOiBzdHJpbmcsXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbiAgZGVwdGggPSAwLFxuKSA9PiB7XG4gIGNvbnN0IHsgcHJlU3VwcGxpZWRJbXBvcnRzLCBmc01hcCB9ID0gY3R4XG5cbiAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy8gT25seSBydW4gdmFsaWRhdGlvbiBpZiBwYWNrYWdlLmpzb24gZXhpc3RzIChjYW4ndCB2YWxpZGF0ZSB3aXRob3V0IGl0KVxuICBjb25zdCBoYXNQYWNrYWdlSnNvbiA9ICEhZnNNYXBbXCJwYWNrYWdlLmpzb25cIl1cblxuICBpZiAoaGFzUGFja2FnZUpzb24pIHtcbiAgICAvLyBTdGVwIDE6IENoZWNrIGlmIHRoZSBwYWNrYWdlIGlzIGRlY2xhcmVkIGluIHBhY2thZ2UuanNvblxuICAgIGlmICghaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uKGltcG9ydE5hbWUsIGZzTWFwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgaW1wb3J0ZWQgYnV0IG5vdCBpbiBwYWNrYWdlLmpzb24gXCIke2ltcG9ydE5hbWV9XCJcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aCA9IHJlc29sdmVOb2RlTW9kdWxlKGltcG9ydE5hbWUsIGN0eC5mc01hcCwgXCJcIilcblxuICAvLyBPbmx5IHJ1biBTdGVwcyAyLTQgaWYgcGFja2FnZSBleGlzdHMgaW4gbm9kZV9tb2R1bGVzIChhZnRlciByZXNvbHZlciBhdHRlbXB0cylcbiAgaWYgKGhhc1BhY2thZ2VKc29uICYmIHJlc29sdmVkTm9kZU1vZHVsZVBhdGgpIHtcbiAgICAvLyBTdGVwIDI6IENoZWNrIGlmIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnkgZXhpc3RzIGZvciB0aGUgcGFja2FnZVxuICAgIGNvbnN0IG5vZGVNb2R1bGVEaXIgPSBnZXROb2RlTW9kdWxlRGlyZWN0b3J5KGltcG9ydE5hbWUsIGZzTWFwKVxuICAgIGlmICghbm9kZU1vZHVsZURpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIG5vIGZpbGVzIGluIHRoZSBub2RlX21vZHVsZXMgZGlyZWN0b3J5XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMzogQ2hlY2sgaWYgbWFpbiBlbnRyeXBvaW50IGlzIGEgVHlwZVNjcmlwdCBmaWxlXG4gICAgY29uc3QgZW50cnlwb2ludCA9IGdldFBhY2thZ2VKc29uRW50cnlwb2ludChpbXBvcnROYW1lLCBmc01hcClcbiAgICBpZiAoaXNUeXBlU2NyaXB0RW50cnlwb2ludChlbnRyeXBvaW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTm9kZSBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIgaGFzIGEgdHlwZXNjcmlwdCBlbnRyeXBvaW50IHRoYXQgaXMgdW5zdXBwb3J0ZWRcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gU3RlcCA0OiBDaGVjayBpZiBkaXN0IGRpcmVjdG9yeSBpcyBlbXB0eSB3aGVuIG1haW4gcG9pbnRzIHRvIGRpc3RcbiAgICBpZiAoZW50cnlwb2ludCAmJiBlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCJkaXN0L1wiKSkge1xuICAgICAgaWYgKGlzRGlzdERpckVtcHR5KGltcG9ydE5hbWUsIGZzTWFwKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBubyBmaWxlcyBpbiBkaXN0LCBkaWQgeW91IGZvcmdldCB0byB0cmFuc3BpbGU/XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBjdHguY2lyY3VpdD8ucGxhdGZvcm1cbiAgICBpZiAocGxhdGZvcm0/Lm5vZGVNb2R1bGVzUmVzb2x2ZXIpIHtcbiAgICAgIGRlYnVnKGBBdHRlbXB0aW5nIHRvIHJlc29sdmUgXCIke2ltcG9ydE5hbWV9XCIgdXNpbmcgbm9kZU1vZHVsZXNSZXNvbHZlcmApXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgcGxhdGZvcm0ubm9kZU1vZHVsZXNSZXNvbHZlcihpbXBvcnROYW1lKVxuXG4gICAgICAgIGlmIChmaWxlQ29udGVudCkge1xuICAgICAgICAgIGRlYnVnKGBTdWNjZXNzZnVsbHkgcmVzb2x2ZWQgXCIke2ltcG9ydE5hbWV9XCIgdmlhIG5vZGVNb2R1bGVzUmVzb2x2ZXJgKVxuXG4gICAgICAgICAgLy8gQWRkIHRoZSByZXNvbHZlZCBjb250ZW50IHRvIGZzTWFwIHdpdGggYSBzeW50aGV0aWMgcGF0aFxuICAgICAgICAgIC8vIEFkZCAudHMgZXh0ZW5zaW9uIHRvIGVuc3VyZSBpdCdzIHRyZWF0ZWQgYXMgYSBtb2R1bGUgZmlsZVxuICAgICAgICAgIGNvbnN0IHN5bnRoZXRpY1BhdGggPSBgbm9kZV9tb2R1bGVzLyR7aW1wb3J0TmFtZX0udHNgXG4gICAgICAgICAgY3R4LmZzTWFwW3N5bnRoZXRpY1BhdGhdID0gZmlsZUNvbnRlbnRcblxuICAgICAgICAgIC8vIEltcG9ydCB0aGUgZmlsZSB1c2luZyB0aGUgbm9ybWFsIGZsb3dcbiAgICAgICAgICBhd2FpdCBpbXBvcnRMb2NhbEZpbGUoc3ludGhldGljUGF0aCwgY3R4LCBkZXB0aClcblxuICAgICAgICAgIC8vIE1hcCB0aGUgaW1wb3J0IG5hbWUgdG8gdGhlIHJlc29sdmVkIG1vZHVsZVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IHByZVN1cHBsaWVkSW1wb3J0c1tzeW50aGV0aWNQYXRoXVxuXG4gICAgICAgICAgLy8gQWxzbyBtYXAgd2l0aG91dCBub2RlX21vZHVsZXMgcHJlZml4XG4gICAgICAgICAgY29uc3QgdW5wcmVmaXhlZFBhdGggPSBzeW50aGV0aWNQYXRoLnJlcGxhY2UoL15ub2RlX21vZHVsZXNcXC8vLCBcIlwiKVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkUGF0aF0gPSBwcmVTdXBwbGllZEltcG9ydHNbc3ludGhldGljUGF0aF1cblxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZGVidWcoYG5vZGVNb2R1bGVzUmVzb2x2ZXIgcmV0dXJuZWQgbnVsbCBmb3IgXCIke2ltcG9ydE5hbWV9XCJgKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZGVidWcoYG5vZGVNb2R1bGVzUmVzb2x2ZXIgZmFpbGVkIGZvciBcIiR7aW1wb3J0TmFtZX1cIjpgLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIG5vdCBmb3VuZGApXG4gIH1cblxuICAvLyBVc2UgaW1wb3J0TG9jYWxGaWxlIHRvIGhhbmRsZSB0aGUgbm9kZSBtb2R1bGVcbiAgYXdhaXQgaW1wb3J0TG9jYWxGaWxlKHJlc29sdmVkTm9kZU1vZHVsZVBhdGgsIGN0eCwgZGVwdGgpXG5cbiAgLy8gTWFwIHRoZSBvcmlnaW5hbCBpbXBvcnQgbmFtZSB0byB0aGUgcmVzb2x2ZWQgbW9kdWxlJ3MgZXhwb3J0c1xuICBwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0gPSBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAvLyBNYXAgd2l0aG91dCBub2RlX21vZHVsZXMgcHJlZml4IGZvciBkaXJlY3QgaW1wb3J0c1xuICBjb25zdCB1bnByZWZpeGVkUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gIHByZVN1cHBsaWVkSW1wb3J0c1t1bnByZWZpeGVkUGF0aF0gPVxuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuXG4gIC8vIEhhbmRsZSBpbmRleCBmaWxlcyBzcGVjaWFsbHlcbiAgaWYgKFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXgudHN4XCIpIHx8XG4gICAgcmVzb2x2ZWROb2RlTW9kdWxlUGF0aC5lbmRzV2l0aChcIi9pbmRleC50c1wiKSB8fFxuICAgIHJlc29sdmVkTm9kZU1vZHVsZVBhdGguZW5kc1dpdGgoXCIvaW5kZXguanNcIilcbiAgKSB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHJlc29sdmVkTm9kZU1vZHVsZVBhdGgucmVwbGFjZSgvXFwvaW5kZXhcXC4odHN4P3xqcykkLywgXCJcIilcbiAgICBjb25zdCB1bnByZWZpeGVkRGlyUGF0aCA9IGRpclBhdGgucmVwbGFjZSgvXm5vZGVfbW9kdWxlc1xcLy8sIFwiXCIpXG4gICAgcHJlU3VwcGxpZWRJbXBvcnRzW3VucHJlZml4ZWREaXJQYXRoXSA9XG4gICAgICBwcmVTdXBwbGllZEltcG9ydHNbcmVzb2x2ZWROb2RlTW9kdWxlUGF0aF1cblxuICAgIC8vIEhhbmRsZSBzY29wZWQgcGFja2FnZXNcbiAgICBpZiAodW5wcmVmaXhlZERpclBhdGguc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgIGNvbnN0IHNjb3BlUGFydHMgPSB1bnByZWZpeGVkRGlyUGF0aC5zcGxpdChcIi9cIilcbiAgICAgIGlmIChzY29wZVBhcnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlZE5hbWUgPSBgJHtzY29wZVBhcnRzWzBdfS8ke3Njb3BlUGFydHNbMV19YFxuICAgICAgICBwcmVTdXBwbGllZEltcG9ydHNbc2NvcGVkTmFtZV0gPVxuICAgICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZE5vZGVNb2R1bGVQYXRoXVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogRXh0cmFjdCB0aGUgYmFzZSBwYWNrYWdlIG5hbWUgZnJvbSBhbiBpbXBvcnQgbmFtZVxuICogSGFuZGxlcyBzY29wZWQgcGFja2FnZXMgYW5kIHN1YnBhdGhzXG4gKlxuICogRXhhbXBsZXM6XG4gKiAtIFwiQHNjb3BlL3BhY2thZ2Uvc3VicGF0aFwiIC0+IFwiQHNjb3BlL3BhY2thZ2VcIlxuICogLSBcImxvZGFzaC9nZXRcIiAtPiBcImxvZGFzaFwiXG4gKiAtIFwicmVhY3RcIiAtPiBcInJlYWN0XCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RCYXNlUGFja2FnZU5hbWUoaW1wb3J0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGJhc2VQYWNrYWdlTmFtZSA9IGltcG9ydE5hbWVcbiAgaWYgKGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAvLyBTY29wZWQgcGFja2FnZTogQHNjb3BlL3BhY2thZ2Ugb3IgQHNjb3BlL3BhY2thZ2Uvc3VicGF0aFxuICAgIGNvbnN0IHBhcnRzID0gaW1wb3J0TmFtZS5zcGxpdChcIi9cIilcbiAgICBiYXNlUGFja2FnZU5hbWUgPSBwYXJ0cy5sZW5ndGggPj0gMiA/IGAke3BhcnRzWzBdfS8ke3BhcnRzWzFdfWAgOiBpbXBvcnROYW1lXG4gIH0gZWxzZSB7XG4gICAgLy8gUmVndWxhciBwYWNrYWdlOiBwYWNrYWdlIG9yIHBhY2thZ2Uvc3VicGF0aFxuICAgIGJhc2VQYWNrYWdlTmFtZSA9IGltcG9ydE5hbWUuc3BsaXQoXCIvXCIpWzBdXG4gIH1cbiAgcmV0dXJuIGJhc2VQYWNrYWdlTmFtZVxufVxuIiwgImltcG9ydCB7IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUgfSBmcm9tIFwiLi9leHRyYWN0QmFzZVBhY2thZ2VOYW1lXCJcblxuLyoqXG4gKiBDaGVjayBpZiBhIHBhY2thZ2UgaXMgZGVjbGFyZWQgaW4gcGFja2FnZS5qc29uIChkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgb3IgcGVlckRlcGVuZGVuY2llcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbihcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgcGFja2FnZUpzb25Db250ZW50ID0gZnNNYXBbXCJwYWNrYWdlLmpzb25cIl1cbiAgaWYgKCFwYWNrYWdlSnNvbkNvbnRlbnQpIHtcbiAgICAvLyBObyBwYWNrYWdlLmpzb24gbWVhbnMgd2UgY2FuJ3QgdmFsaWRhdGUgLSBhbGxvdyB0aGUgaW1wb3J0XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudClcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMgfHwge31cbiAgICBjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMgfHwge31cbiAgICBjb25zdCBwZWVyRGVwZW5kZW5jaWVzID0gcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcyB8fCB7fVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgYmFzZSBwYWNrYWdlIG5hbWUgKGhhbmRsZSBzY29wZWQgcGFja2FnZXMgYW5kIHN1YnBhdGhzKVxuICAgIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG5cbiAgICByZXR1cm4gKFxuICAgICAgYmFzZVBhY2thZ2VOYW1lIGluIGRlcGVuZGVuY2llcyB8fFxuICAgICAgYmFzZVBhY2thZ2VOYW1lIGluIGRldkRlcGVuZGVuY2llcyB8fFxuICAgICAgYmFzZVBhY2thZ2VOYW1lIGluIHBlZXJEZXBlbmRlbmNpZXNcbiAgICApXG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHdlIGNhbid0IHBhcnNlIHBhY2thZ2UuanNvbiwgYWxsb3cgdGhlIGltcG9ydFxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBleHRyYWN0QmFzZVBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZXh0cmFjdEJhc2VQYWNrYWdlTmFtZVwiXG5cbi8qKlxuICogQ2hlY2sgaWYgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBleGlzdHMgZm9yIHRoZSBwYWNrYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROb2RlTW9kdWxlRGlyZWN0b3J5KFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBiYXNlUGFja2FnZU5hbWUgPSBleHRyYWN0QmFzZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKVxuICBjb25zdCBub2RlTW9kdWxlUGF0aCA9IGBub2RlX21vZHVsZXMvJHtiYXNlUGFja2FnZU5hbWV9YFxuXG4gIC8vIENoZWNrIGlmIGFueSBmaWxlcyBleGlzdCB1bmRlciB0aGlzIHBhdGggaW4gZnNNYXBcbiAgY29uc3QgaGFzRmlsZXMgPSBPYmplY3Qua2V5cyhmc01hcCkuc29tZShcbiAgICAocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKG5vZGVNb2R1bGVQYXRoICsgXCIvXCIpIHx8IHBhdGggPT09IG5vZGVNb2R1bGVQYXRoLFxuICApXG5cbiAgcmV0dXJuIGhhc0ZpbGVzID8gbm9kZU1vZHVsZVBhdGggOiBudWxsXG59XG4iLCAiaW1wb3J0IHsgZXh0cmFjdEJhc2VQYWNrYWdlTmFtZSB9IGZyb20gXCIuL2V4dHJhY3RCYXNlUGFja2FnZU5hbWVcIlxuXG4vKipcbiAqIEdldCB0aGUgZW50cnlwb2ludCBmcm9tIHBhY2thZ2UuanNvbiAodGhlIFwibWFpblwiIG9yIFwibW9kdWxlXCIgZmllbGQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIGZzTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJhc2VQYWNrYWdlTmFtZSA9IGV4dHJhY3RCYXNlUGFja2FnZU5hbWUocGFja2FnZU5hbWUpXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGBub2RlX21vZHVsZXMvJHtiYXNlUGFja2FnZU5hbWV9L3BhY2thZ2UuanNvbmBcblxuICBjb25zdCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBmc01hcFtwYWNrYWdlSnNvblBhdGhdXG4gIGlmICghcGFja2FnZUpzb25Db250ZW50KSByZXR1cm4gbnVsbFxuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uQ29udGVudClcbiAgICAvLyBUcnkgbWFpbiwgbW9kdWxlLCBvciBleHBvcnRzIGZpZWxkIChpbiBvcmRlciBvZiBwcmVmZXJlbmNlKVxuICAgIHJldHVybiBwYWNrYWdlSnNvbi5tYWluIHx8IHBhY2thZ2VKc29uLm1vZHVsZSB8fCBudWxsXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbiIsICIvKipcbiAqIENoZWNrIGlmIHRoZSBlbnRyeXBvaW50IGlzIGEgVHlwZVNjcmlwdCBmaWxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVTY3JpcHRFbnRyeXBvaW50KGVudHJ5cG9pbnQ6IHN0cmluZyB8IG51bGwpOiBib29sZWFuIHtcbiAgaWYgKCFlbnRyeXBvaW50KSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGVudHJ5cG9pbnQuZW5kc1dpdGgoXCIudHNcIikgfHwgZW50cnlwb2ludC5lbmRzV2l0aChcIi50c3hcIilcbn1cbiIsICJpbXBvcnQgeyBleHRyYWN0QmFzZVBhY2thZ2VOYW1lIH0gZnJvbSBcIi4vZXh0cmFjdEJhc2VQYWNrYWdlTmFtZVwiXG5cbi8qKlxuICogQ2hlY2sgaWYgZGlzdCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBoYXMgZmlsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGlzdERpckVtcHR5KFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICBmc01hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlUGFja2FnZU5hbWUgPSBleHRyYWN0QmFzZVBhY2thZ2VOYW1lKHBhY2thZ2VOYW1lKVxuICBjb25zdCBkaXN0UGF0aCA9IGBub2RlX21vZHVsZXMvJHtiYXNlUGFja2FnZU5hbWV9L2Rpc3RgXG5cbiAgLy8gQ2hlY2sgaWYgYW55IGZpbGVzIGV4aXN0IHVuZGVyIGRpc3QvXG4gIGNvbnN0IGhhc0ZpbGVzID0gT2JqZWN0LmtleXMoZnNNYXApLnNvbWUoKHBhdGgpID0+XG4gICAgcGF0aC5zdGFydHNXaXRoKGRpc3RQYXRoICsgXCIvXCIpLFxuICApXG5cbiAgcmV0dXJuICFoYXNGaWxlc1xufVxuIiwgImltcG9ydCB7IGV2YWxDb21waWxlZEpzIH0gZnJvbSBcIi4vZXZhbC1jb21waWxlZC1qc1wiXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiLi9leGVjdXRpb24tY29udGV4dFwiXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSBcImxpYi91dGlscy9kaXJuYW1lXCJcbmltcG9ydCBEZWJ1ZyBmcm9tIFwiZGVidWdcIlxuaW1wb3J0IHsgZ2V0SW1wb3J0c0Zyb21Db2RlIH0gZnJvbSBcImxpYi91dGlscy9nZXQtaW1wb3J0cy1mcm9tLWNvZGVcIlxuaW1wb3J0IHsgaW1wb3J0RXZhbFBhdGggfSBmcm9tIFwiLi9pbXBvcnQtZXZhbC1wYXRoXCJcbmltcG9ydCB7IHRyYW5zZm9ybVdpdGhTdWNyYXNlIH0gZnJvbSBcImxpYi90cmFuc3BpbGUvdHJhbnNmb3JtLXdpdGgtc3VjcmFzZVwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LW5wbS1wYWNrYWdlXCIpXG5cbmZ1bmN0aW9uIGV4dHJhY3RQYWNrYWdlUGF0aEZyb21KU0RlbGl2cih1cmw6IHN0cmluZykge1xuICBjb25zdCBwcmVmaXggPSBcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vXCJcbiAgaWYgKHVybC5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICByZXR1cm4gdXJsLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKS5yZXBsYWNlKC9cXC9cXCtlc20kLywgXCJcIilcbiAgfVxuICByZXR1cm4gdXJsXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnROcG1QYWNrYWdlRnJvbUNkbihcbiAgeyBpbXBvcnROYW1lLCBkZXB0aCA9IDAgfTogeyBpbXBvcnROYW1lOiBzdHJpbmc7IGRlcHRoPzogbnVtYmVyIH0sXG4gIGN0eDogRXhlY3V0aW9uQ29udGV4dCxcbikge1xuICBkZWJ1ZyhgaW1wb3J0aW5nIG5wbSBwYWNrYWdlIGZyb20gQ0ROOiAke2ltcG9ydE5hbWV9YClcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuXG4gIGlmIChwcmVTdXBwbGllZEltcG9ydHNbaW1wb3J0TmFtZV0pIHJldHVyblxuXG4gIGNvbnN0IG5wbUNkblVybCA9IGBodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtLyR7aW1wb3J0TmFtZX0vK2VzbWBcblxuICBsZXQgZmluYWxVcmw6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBjb25zdCB7IGNvbnRlbnQsIGVycm9yIH0gPSBhd2FpdCBnbG9iYWxUaGlzXG4gICAgLmZldGNoKG5wbUNkblVybClcbiAgICAudGhlbihhc3luYyAocmVzKSA9PiB7XG4gICAgICBmaW5hbFVybCA9IHJlcy51cmxcbiAgICAgIGlmICghcmVzLm9rKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmZXRjaCBcIiR7aW1wb3J0TmFtZX1cIiBmcm9tIGpzZGVsaXZyOiAke3Jlcy5zdGF0dXNUZXh0fVxcblxcbiR7Y3R4LmxvZ2dlci5zdHJpbmdpZnlMb2dzKCl9YCxcbiAgICAgICAgKVxuICAgICAgcmV0dXJuIHsgY29udGVudDogYXdhaXQgcmVzLnRleHQoKSwgZXJyb3I6IG51bGwgfVxuICAgIH0pXG4gICAgLmNhdGNoKChlKSA9PiAoeyBlcnJvcjogZSwgY29udGVudDogbnVsbCB9KSlcblxuICBpZiAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgbnBtIGltcG9ydFwiLCBpbXBvcnROYW1lLCBlcnJvcilcbiAgICB0aHJvdyBlcnJvclxuICB9XG5cbiAgY29uc3QgZmluYWxJbXBvcnROYW1lID0gZXh0cmFjdFBhY2thZ2VQYXRoRnJvbUpTRGVsaXZyKGZpbmFsVXJsISlcbiAgY29uc3QgY3dkID0gZGlybmFtZShmaW5hbEltcG9ydE5hbWUpXG5cbiAgY29uc3QgaW1wb3J0TmFtZXMgPSBnZXRJbXBvcnRzRnJvbUNvZGUoY29udGVudCEpXG4gIGZvciAoY29uc3Qgc3ViSW1wb3J0TmFtZSBvZiBpbXBvcnROYW1lcykge1xuICAgIGlmICghcHJlU3VwcGxpZWRJbXBvcnRzW3N1YkltcG9ydE5hbWVdKSB7XG4gICAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChzdWJJbXBvcnROYW1lLCBjdHgsIGRlcHRoICsgMSwge1xuICAgICAgICBjd2QsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybWVkQ29kZSA9IHRyYW5zZm9ybVdpdGhTdWNyYXNlKFxuICAgIGNvbnRlbnQhLFxuICAgIGZpbmFsSW1wb3J0TmFtZSB8fCBpbXBvcnROYW1lLFxuICApXG4gIHRyeSB7XG4gICAgY29uc3QgZXhwb3J0cyA9IGV2YWxDb21waWxlZEpzKFxuICAgICAgdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzLFxuICAgICAgY3dkLFxuICAgICkuZXhwb3J0c1xuICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxJbXBvcnROYW1lXSA9IGV4cG9ydHNcbiAgICBwcmVTdXBwbGllZEltcG9ydHNbZmluYWxVcmwhXSA9IGV4cG9ydHNcbiAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEV2YWwgbnBtIHBhY2thZ2UgZXJyb3IgZm9yIFwiJHtpbXBvcnROYW1lfVwiOiAke2UubWVzc2FnZX1cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgKVxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIi4vZXhlY3V0aW9uLWNvbnRleHRcIlxuaW1wb3J0IHsgaW1wb3J0TG9jYWxGaWxlIH0gZnJvbSBcIi4vaW1wb3J0LWxvY2FsLWZpbGVcIlxuaW1wb3J0IHsgaW1wb3J0U25pcHBldCB9IGZyb20gXCIuL2ltcG9ydC1zbmlwcGV0XCJcbmltcG9ydCB7IHJlc29sdmVGaWxlUGF0aCB9IGZyb20gXCJsaWIvcnVubmVyL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgeyByZXNvbHZlTm9kZU1vZHVsZSB9IGZyb20gXCJsaWIvdXRpbHMvcmVzb2x2ZS1ub2RlLW1vZHVsZVwiXG5pbXBvcnQgeyBpbXBvcnROb2RlTW9kdWxlIH0gZnJvbSBcIi4vaW1wb3J0LW5vZGUtbW9kdWxlXCJcbmltcG9ydCB7IGltcG9ydE5wbVBhY2thZ2VGcm9tQ2RuIH0gZnJvbSBcIi4vaW1wb3J0LW5wbS1wYWNrYWdlLWZyb20tY2RuXCJcbmltcG9ydCB7XG4gIGdldFRzQ29uZmlnLFxuICBtYXRjaGVzVHNjb25maWdQYXRoUGF0dGVybixcbn0gZnJvbSBcImxpYi9ydW5uZXIvdHNjb25maWdQYXRoc1wiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IGlzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvbiB9IGZyb20gXCIuL2lzUGFja2FnZURlY2xhcmVkSW5QYWNrYWdlSnNvblwiXG5pbXBvcnQgeyBnZXROb2RlTW9kdWxlRGlyZWN0b3J5IH0gZnJvbSBcIi4vZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeVwiXG5pbXBvcnQgeyBnZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnQgfSBmcm9tIFwiLi9nZXRQYWNrYWdlSnNvbkVudHJ5cG9pbnRcIlxuaW1wb3J0IHsgaXNUeXBlU2NyaXB0RW50cnlwb2ludCB9IGZyb20gXCIuL2lzVHlwZVNjcmlwdEVudHJ5cG9pbnRcIlxuaW1wb3J0IHsgaXNEaXN0RGlyRW1wdHkgfSBmcm9tIFwiLi9pc0Rpc3REaXJFbXB0eVwiXG5cbmNvbnN0IGRlYnVnID0gRGVidWcoXCJ0c2NpOmV2YWw6aW1wb3J0LWV2YWwtcGF0aFwiKVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RXZhbFBhdGgoXG4gIGltcG9ydE5hbWU6IHN0cmluZyxcbiAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICBkZXB0aCA9IDAsXG4gIG9wdHM6IHtcbiAgICBjd2Q/OiBzdHJpbmdcbiAgfSA9IHt9LFxuKSB7XG4gIGRlYnVnKFwiaW1wb3J0RXZhbFBhdGggY2FsbGVkIHdpdGg6XCIsIHtcbiAgICBpbXBvcnROYW1lLFxuICAgIGRlcHRoLFxuICAgIG9wdHMsXG4gIH0pXG4gIGN0eC5sb2dnZXIuaW5mbyhcbiAgICBgaW1wb3J0RXZhbFBhdGgoXCIke2ltcG9ydE5hbWV9XCIsIHtjd2Q6IFwiJHtvcHRzLmN3ZH1cIiwgZGVwdGg6ICR7ZGVwdGh9fSlgLFxuICApXG5cbiAgZGVidWcoYCR7XCIgIFwiLnJlcGVhdChkZXB0aCl9XHUyN0ExXHVGRTBGYCwgaW1wb3J0TmFtZSlcbiAgY29uc3QgeyBwcmVTdXBwbGllZEltcG9ydHMgfSA9IGN0eFxuICBjb25zdCBkaXNhYmxlQ2RuTG9hZGluZyA9XG4gICAgY3R4LmRpc2FibGVDZG5Mb2FkaW5nIHx8IChnbG9iYWxUaGlzIGFzIGFueSkuX19ESVNBQkxFX0NETl9MT0FESU5HX19cblxuICBpZiAocHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzFdYClcbiAgICByZXR1cm5cbiAgfVxuICBpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLi9cIikgJiYgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWUuc2xpY2UoMildKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgaW4gcHJlU3VwcGxpZWRJbXBvcnRzWzJdYClcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIEhhbmRsZSBzdWJwYXRoIGltcG9ydHMgZnJvbSBwcmVTdXBwbGllZEltcG9ydHMgKGUuZy4sIFwicmVhY3QvanN4LXJ1bnRpbWVcIilcbiAgLy8gSWYgdGhlIGJhc2UgcGFja2FnZSBpcyBpbiBwcmVTdXBwbGllZEltcG9ydHMsIHRyeSB0byBpbXBvcnQgZnJvbSB0aGUgYWN0dWFsIHBhY2thZ2VcbiAgaWYgKFxuICAgIGltcG9ydE5hbWUuaW5jbHVkZXMoXCIvXCIpICYmXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiZcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL1wiKVxuICApIHtcbiAgICBjb25zdCBiYXNlUGtnID0gaW1wb3J0TmFtZS5zcGxpdChcIi9cIilbMF1cbiAgICBjb25zdCBpc1Njb3BlZCA9IGJhc2VQa2cuc3RhcnRzV2l0aChcIkBcIilcbiAgICBjb25zdCBwa2dOYW1lID0gaXNTY29wZWRcbiAgICAgID8gaW1wb3J0TmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMCwgMikuam9pbihcIi9cIilcbiAgICAgIDogYmFzZVBrZ1xuICAgIGNvbnN0IHN1YnBhdGggPSBpc1Njb3BlZFxuICAgICAgPyBpbXBvcnROYW1lLnNwbGl0KFwiL1wiKS5zbGljZSgyKS5qb2luKFwiL1wiKVxuICAgICAgOiBpbXBvcnROYW1lLnNwbGl0KFwiL1wiKS5zbGljZSgxKS5qb2luKFwiL1wiKVxuXG4gICAgaWYgKHByZVN1cHBsaWVkSW1wb3J0c1twa2dOYW1lXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVHJ5IHRvIGltcG9ydCB0aGUgc3VicGF0aCBmcm9tIHRoZSBhY3R1YWwgcGFja2FnZVxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGltcG9ydChgJHtwa2dOYW1lfS8ke3N1YnBhdGh9YClcbiAgICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcmVzb2x2ZWRcbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgcmVzb2x2ZWQgZnJvbSBwcmVTdXBwbGllZEltcG9ydHMgYmFzZSBwYWNrYWdlIFwiJHtwa2dOYW1lfVwiYCxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIHRoZSBkeW5hbWljIGltcG9ydCBmYWlscywgY29udGludWUgd2l0aCBub3JtYWwgcmVzb2x1dGlvblxuICAgICAgICBjdHgubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYEZhaWxlZCB0byByZXNvbHZlIFwiJHtpbXBvcnROYW1lfVwiIGZyb20gcHJlU3VwcGxpZWRJbXBvcnRzIHBhY2thZ2UgXCIke3BrZ05hbWV9XCIsIGZhbGxpbmcgYmFjayB0byBub3JtYWwgcmVzb2x1dGlvbmAsXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZGVwdGggPiAzMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNYXggZGVwdGggZm9yIGltcG9ydHMgcmVhY2hlZCAoMzApIEltcG9ydCBQYXRoOiAke2N0eC5pbXBvcnRTdGFjay5qb2luKFwiIC0+IFwiKX1gLFxuICAgIClcbiAgfVxuXG4gIGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvbnBtL1wiKSkge1xuICAgIGNvbnN0IHBrZ05hbWUgPSBpbXBvcnROYW1lLnJlcGxhY2UoL15cXC9ucG1cXC8vLCBcIlwiKS5yZXBsYWNlKC9cXC9cXCtlc20kLywgXCJcIilcbiAgICBpZiAoZGlzYWJsZUNkbkxvYWRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7cGtnTmFtZX1cIi4gVGhlIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQuXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5wbVBhY2thZ2VGcm9tQ2RuKFwiJHtwa2dOYW1lfVwiKWApXG4gICAgYXdhaXQgaW1wb3J0TnBtUGFja2FnZUZyb21DZG4oeyBpbXBvcnROYW1lOiBwa2dOYW1lLCBkZXB0aCB9LCBjdHgpXG4gICAgY29uc3QgcGtnID0gcHJlU3VwcGxpZWRJbXBvcnRzW3BrZ05hbWVdXG4gICAgaWYgKHBrZykge1xuICAgICAgcHJlU3VwcGxpZWRJbXBvcnRzW2ltcG9ydE5hbWVdID0gcGtnXG4gICAgfVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gRGV0ZXJtaW5lIHdoZXJlIHRzY29uZmlnLmpzb24gaXMgbG9jYXRlZFxuICBsZXQgdHNjb25maWdEaXIgPSBcIi5cIlxuICBsZXQgdHNDb25maWdUb1VzZSA9IGN0eC50c0NvbmZpZ1xuICBpZiAoY3R4LnRzQ29uZmlnICYmIG9wdHMuY3dkKSB7XG4gICAgLy8gSWYgY3dkIGlzIGluIG5vZGVfbW9kdWxlcywgZmluZCB0aGUgcGFja2FnZSByb290XG4gICAgLy8gZS5nLiwgXCJub2RlX21vZHVsZXMvYWRvbS1saWJyYXJ5L2xpYi9nZW5lcmF0ZWRcIiAtPiBcIm5vZGVfbW9kdWxlcy9hZG9tLWxpYnJhcnlcIlxuICAgIGNvbnN0IG5vZGVNb2R1bGVzTWF0Y2ggPSBvcHRzLmN3ZC5tYXRjaCgvXihub2RlX21vZHVsZXNcXC9bXlxcL10rKS8pXG4gICAgaWYgKG5vZGVNb2R1bGVzTWF0Y2gpIHtcbiAgICAgIHRzY29uZmlnRGlyID0gbm9kZU1vZHVsZXNNYXRjaFsxXVxuICAgICAgdHNDb25maWdUb1VzZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXNvbHZlZExvY2FsSW1wb3J0UGF0aCA9IHJlc29sdmVGaWxlUGF0aChcbiAgICBpbXBvcnROYW1lLFxuICAgIGN0eC5mc01hcCxcbiAgICBvcHRzLmN3ZCxcbiAgICB7IHRzQ29uZmlnOiB0c0NvbmZpZ1RvVXNlLCB0c2NvbmZpZ0RpciB9LFxuICApXG4gIGlmIChyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCkge1xuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TG9jYWxGaWxlKFwiJHtyZXNvbHZlZExvY2FsSW1wb3J0UGF0aH1cIilgKVxuICAgIGF3YWl0IGltcG9ydExvY2FsRmlsZShyZXNvbHZlZExvY2FsSW1wb3J0UGF0aCwgY3R4LCBkZXB0aClcbiAgICAvLyBNYXAgdGhlIG9yaWdpbmFsIGltcG9ydCBuYW1lICh3aGljaCBtaWdodCBiZSBhIHRzY29uZmlnIHBhdGggYWxpYXMpIHRvIHRoZSByZXNvbHZlZCBtb2R1bGVcbiAgICBpZiAoaW1wb3J0TmFtZSAhPT0gcmVzb2x2ZWRMb2NhbEltcG9ydFBhdGgpIHtcbiAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tpbXBvcnROYW1lXSA9XG4gICAgICAgIHByZVN1cHBsaWVkSW1wb3J0c1tyZXNvbHZlZExvY2FsSW1wb3J0UGF0aF1cbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGlzIG1hdGNoZXMgYSB0c2NvbmZpZyBwYXRoIHBhdHRlcm4gYnV0IGZhaWxlZCB0byByZXNvbHZlXG4gIC8vIElmIHNvLCB0aHJvdyBhbiBlcnJvciBpbnN0ZWFkIG9mIGZhbGxpbmcgYmFjayB0byBucG1cbiAgY29uc3QgdHNDb25maWcgPSBjdHgudHNDb25maWcgPz8gZ2V0VHNDb25maWcoY3R4LmZzTWFwKVxuICBpZiAoIWN0eC50c0NvbmZpZyAmJiB0c0NvbmZpZykge1xuICAgIGN0eC50c0NvbmZpZyA9IHRzQ29uZmlnXG4gIH1cbiAgaWYgKG1hdGNoZXNUc2NvbmZpZ1BhdGhQYXR0ZXJuKGltcG9ydE5hbWUsIHRzQ29uZmlnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbXBvcnQgXCIke2ltcG9ydE5hbWV9XCIgbWF0Y2hlcyBhIHRzY29uZmlnIHBhdGggYWxpYXMgYnV0IGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBhbiBleGlzdGluZyBmaWxlJHtvcHRzLmN3ZCA/IGAgZnJvbSBkaXJlY3RvcnkgXCIke29wdHMuY3dkfVwiYCA6IFwiXCJ9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgIClcbiAgfVxuXG4gIC8vIFRyeSB0byByZXNvbHZlIGZyb20gbm9kZV9tb2R1bGVzXG4gIGNvbnN0IHJlc29sdmVkTm9kZU1vZHVsZVBhdGggPSByZXNvbHZlTm9kZU1vZHVsZShcbiAgICBpbXBvcnROYW1lLFxuICAgIGN0eC5mc01hcCxcbiAgICBvcHRzLmN3ZCB8fCBcIlwiLFxuICApXG4gIGlmIChyZXNvbHZlZE5vZGVNb2R1bGVQYXRoKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKGByZXNvbHZlZE5vZGVNb2R1bGVQYXRoPVwiJHtyZXNvbHZlZE5vZGVNb2R1bGVQYXRofVwiYClcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydE5vZGVNb2R1bGUoXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0Tm9kZU1vZHVsZShpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICB9XG5cbiAgLy8gSWYgbm90IGZvdW5kIGluIGZzTWFwIGJ1dCBtaWdodCBiZSBhIG5vZGUgbW9kdWxlLCB0cnkgaW1wb3J0Tm9kZU1vZHVsZVxuICAvLyB3aGljaCB3aWxsIGF0dGVtcHQgdG8gdXNlIG5vZGVNb2R1bGVzUmVzb2x2ZXIgaWYgY29uZmlndXJlZFxuICBpZiAoXG4gICAgIWltcG9ydE5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiZcbiAgICAhaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiL1wiKSAmJlxuICAgICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIilcbiAgKSB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBjdHguY2lyY3VpdD8ucGxhdGZvcm1cbiAgICBpZiAocGxhdGZvcm0/Lm5vZGVNb2R1bGVzUmVzb2x2ZXIpIHtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbyhcbiAgICAgICAgYGltcG9ydE5vZGVNb2R1bGUoXCIke2ltcG9ydE5hbWV9XCIpIHZpYSBub2RlTW9kdWxlc1Jlc29sdmVyYCxcbiAgICAgIClcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGltcG9ydE5vZGVNb2R1bGUoaW1wb3J0TmFtZSwgY3R4LCBkZXB0aClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjdHgubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYG5vZGVNb2R1bGVzUmVzb2x2ZXIgZmFpbGVkIGZvciBcIiR7aW1wb3J0TmFtZX1cIiwgZmFsbGluZyBiYWNrIHRvIG5wbSBDRE5gLFxuICAgICAgICApXG4gICAgICAgIGlmIChkaXNhYmxlQ2RuTG9hZGluZykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgZmluZCBtb2R1bGUgXCIke2ltcG9ydE5hbWV9XCIuIFRoZSBwYWNrYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGxvY2FsIGVudmlyb25tZW50IGFuZCBhdXRvbWF0aWMgbnBtIHJlc29sdXRpb24gaXMgZGlzYWJsZWQuXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCJAdHNjaS9cIikpIHtcbiAgICBjdHgubG9nZ2VyLmluZm8oYGltcG9ydFNuaXBwZXQoXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0U25pcHBldChpbXBvcnROYW1lLCBjdHgsIGRlcHRoKVxuICB9XG5cbiAgaWYgKCFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuXCIpICYmICFpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgLy8gU3RlcCAxOiBDaGVjayBpZiBwYWNrYWdlIGlzIGRlY2xhcmVkIGluIHBhY2thZ2UuanNvblxuICAgIGlmICghaXNQYWNrYWdlRGVjbGFyZWRJblBhY2thZ2VKc29uKGltcG9ydE5hbWUsIGN0eC5mc01hcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5vZGUgbW9kdWxlIGltcG9ydGVkIGJ1dCBub3QgaW4gcGFja2FnZS5qc29uIFwiJHtpbXBvcnROYW1lfVwiXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMjogQ2hlY2sgaWYgbm9kZV9tb2R1bGVzIGRpcmVjdG9yeSBleGlzdHMgKG9ubHkgaWYgbm90IGZvdW5kIGxvY2FsbHkgeWV0KVxuICAgIC8vIE9ubHkgdmFsaWRhdGUgaWYgQ0ROIGxvYWRpbmcgaXMgZGlzYWJsZWQgKGkuZS4sIG5vIGZhbGxiYWNrIHRvIGpzRGVsaXZyIGF2YWlsYWJsZSlcbiAgICBjb25zdCBub2RlTW9kdWxlRGlyID0gZ2V0Tm9kZU1vZHVsZURpcmVjdG9yeShpbXBvcnROYW1lLCBjdHguZnNNYXApXG4gICAgaWYgKCFub2RlTW9kdWxlRGlyICYmIGRpc2FibGVDZG5Mb2FkaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBOb2RlIG1vZHVsZSBcIiR7aW1wb3J0TmFtZX1cIiBoYXMgbm8gZmlsZXMgaW4gdGhlIG5vZGVfbW9kdWxlcyBkaXJlY3RvcnlcXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gU3RlcCAzOiBDaGVjayBpZiBtYWluIGVudHJ5cG9pbnQgaXMgYSBUeXBlU2NyaXB0IGZpbGUgKG9ubHkgaWYgZGlyIGV4aXN0cylcbiAgICBpZiAobm9kZU1vZHVsZURpcikge1xuICAgICAgY29uc3QgZW50cnlwb2ludCA9IGdldFBhY2thZ2VKc29uRW50cnlwb2ludChpbXBvcnROYW1lLCBjdHguZnNNYXApXG4gICAgICBpZiAoaXNUeXBlU2NyaXB0RW50cnlwb2ludChlbnRyeXBvaW50KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBhIHR5cGVzY3JpcHQgZW50cnlwb2ludCB0aGF0IGlzIHVuc3VwcG9ydGVkXFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIC8vIFN0ZXAgNDogQ2hlY2sgaWYgZGlzdCBkaXJlY3RvcnkgaXMgZW1wdHkgd2hlbiBtYWluIHBvaW50cyB0byBkaXN0XG4gICAgICBpZiAoZW50cnlwb2ludD8uc3RhcnRzV2l0aChcImRpc3QvXCIpKSB7XG4gICAgICAgIGlmIChpc0Rpc3REaXJFbXB0eShpbXBvcnROYW1lLCBjdHguZnNNYXApKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYE5vZGUgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiIGhhcyBubyBmaWxlcyBpbiBkaXN0LCBkaWQgeW91IGZvcmdldCB0byB0cmFuc3BpbGU/XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkaXNhYmxlQ2RuTG9hZGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlIFwiJHtpbXBvcnROYW1lfVwiLiBUaGUgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBlbnZpcm9ubWVudC5cXG5cXG4ke2N0eC5sb2dnZXIuc3RyaW5naWZ5TG9ncygpfWAsXG4gICAgICApXG4gICAgfVxuICAgIGN0eC5sb2dnZXIuaW5mbyhgaW1wb3J0TnBtUGFja2FnZUZyb21DZG4oXCIke2ltcG9ydE5hbWV9XCIpYClcbiAgICByZXR1cm4gaW1wb3J0TnBtUGFja2FnZUZyb21DZG4oeyBpbXBvcnROYW1lLCBkZXB0aCB9LCBjdHgpXG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYFVucmVzb2x2ZWQgaW1wb3J0IFwiJHtpbXBvcnROYW1lfVwiICR7b3B0cy5jd2QgPyBgZnJvbSBkaXJlY3RvcnkgXCIke29wdHMuY3dkfVwiYCA6IFwiXCJ9XFxuXFxuJHtjdHgubG9nZ2VyLnN0cmluZ2lmeUxvZ3MoKX1gLFxuICApXG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBbnlDaXJjdWl0RWxlbWVudCB9IGZyb20gXCJjaXJjdWl0LWpzb25cIlxuaW1wb3J0IHR5cGUge1xuICBDaXJjdWl0UnVubmVyQXBpLFxuICBDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbn0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gXCJAdHNjaXJjdWl0L3Byb3BzXCJcbmltcG9ydCB7IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQsIGltcG9ydEV2YWxQYXRoIH0gZnJvbSBcImxpYi9ldmFsXCJcbmltcG9ydCB7IG5vcm1hbGl6ZUZzTWFwIH0gZnJvbSBcIi4vbm9ybWFsaXplRnNNYXBcIlxuaW1wb3J0IHsgZ2V0VHNDb25maWcgfSBmcm9tIFwiLi90c2NvbmZpZ1BhdGhzXCJcbmltcG9ydCB0eXBlIHsgUm9vdENpcmN1aXQgfSBmcm9tIFwiQHRzY2lyY3VpdC9jb3JlXCJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWQgfSBmcm9tIFwiLi9zZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIlxuaW1wb3J0IHsgZW5oYW5jZVJvb3RDaXJjdWl0SGFzTm9DaGlsZHJlbkVycm9yIH0gZnJvbSBcImxpYi91dGlscy9lbmhhbmNlLXJvb3QtY2lyY3VpdC1lcnJvclwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcbmltcG9ydCB7IHNldFZhbHVlQXRQYXRoIH0gZnJvbSBcImxpYi9zaGFyZWQvb2JqLXBhdGhcIlxuXG5jb25zdCBkZWJ1ZyA9IERlYnVnKFwidHNjaTpldmFsOkNpcmN1aXRSdW5uZXJcIilcblxuZXhwb3J0IGNsYXNzIENpcmN1aXRSdW5uZXIgaW1wbGVtZW50cyBDaXJjdWl0UnVubmVyQXBpIHtcbiAgX2V4ZWN1dGlvbkNvbnRleHQ6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQ+IHwgbnVsbCA9IG51bGxcbiAgX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uOiBDaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiA9IHtcbiAgICBzbmlwcGV0c0FwaUJhc2VVcmw6IFwiaHR0cHM6Ly9yZWdpc3RyeS1hcGkudHNjaXJjdWl0LmNvbVwiLFxuICAgIGNqc1JlZ2lzdHJ5VXJsOiBcImh0dHBzOi8vY2pzLnRzY2lyY3VpdC5jb21cIixcbiAgICB2ZXJib3NlOiBmYWxzZSxcbiAgfVxuICBfZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsICgoLi4uYXJnczogYW55W10pID0+IHZvaWQpW10+ID0ge31cbiAgX2RlYnVnTmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWRcblxuICBjb25zdHJ1Y3Rvcihjb25maWd1cmF0aW9uOiBQYXJ0aWFsPENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uPiA9IHt9KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbiwgY29uZmlndXJhdGlvbilcbiAgfVxuXG4gIGFzeW5jIHZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gXCIwLjAuMFwiXG4gIH1cblxuICBhc3luYyBleGVjdXRlV2l0aEZzTWFwKG9nT3B0czoge1xuICAgIGVudHJ5cG9pbnQ/OiBzdHJpbmdcbiAgICBtYWluQ29tcG9uZW50UGF0aD86IHN0cmluZ1xuICAgIG1haW5Db21wb25lbnROYW1lPzogc3RyaW5nXG4gICAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICBuYW1lPzogc3RyaW5nXG4gICAgbWFpbkNvbXBvbmVudFByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3B0cyA9IHsgLi4ub2dPcHRzIH1cblxuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBEZWJ1Zy5lbmFibGUoXCJ0c2NpOmV2YWw6KlwiKVxuICAgIH1cblxuICAgIGRlYnVnKFwiZXhlY3V0ZVdpdGhGc01hcCBjYWxsZWQgd2l0aDpcIiwge1xuICAgICAgZW50cnlwb2ludDogb3B0cy5lbnRyeXBvaW50LFxuICAgICAgZnNNYXBLZXlzOiBPYmplY3Qua2V5cyhvcHRzLmZzTWFwKSxcbiAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICB9KVxuXG4gICAgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkKG9wdHMpXG5cbiAgICBkZWJ1ZyhcImVudHJ5cG9pbnQgYWZ0ZXIgc2V0dXBEZWZhdWx0RW50cnlwb2ludElmTmVlZGVkOlwiLCB7XG4gICAgICBlbnRyeXBvaW50OiBvcHRzLmVudHJ5cG9pbnQsXG4gICAgfSlcblxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQgPSBjcmVhdGVFeGVjdXRpb25Db250ZXh0KFxuICAgICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IG9wdHMubmFtZSxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5lbnRyeXBvaW50ID0gb3B0cy5lbnRyeXBvaW50IVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXAgPSBub3JtYWxpemVGc01hcChvcHRzLmZzTWFwKVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBnZXRUc0NvbmZpZyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmZzTWFwKVxuICAgIGlmICghdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcFtvcHRzLmVudHJ5cG9pbnQhXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRyeXBvaW50IFwiJHtvcHRzLmVudHJ5cG9pbnR9XCIgbm90IGZvdW5kYClcbiAgICB9XG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuXG4gICAgY29uc3QgZW50cnlwb2ludCA9IG9wdHMuZW50cnlwb2ludCEuc3RhcnRzV2l0aChcIi4vXCIpXG4gICAgICA/IG9wdHMuZW50cnlwb2ludFxuICAgICAgOiBgLi8ke29wdHMuZW50cnlwb2ludH1gXG5cbiAgICBkZWJ1ZyhcImZpbmFsIGVudHJ5cG9pbnQ6XCIsIGVudHJ5cG9pbnQpXG4gICAgYXdhaXQgaW1wb3J0RXZhbFBhdGgoZW50cnlwb2ludCEsIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpXG4gIH1cblxuICBhc3luYyBleGVjdXRlKGNvZGU6IHN0cmluZywgb3B0czogeyBuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi52ZXJib3NlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZSBjYWxsZWQgd2l0aCBjb2RlIGxlbmd0aDpcIixcbiAgICAgICAgY29kZS5sZW5ndGgsXG4gICAgICApXG4gICAgfVxuXG4gICAgdGhpcy5fZXhlY3V0aW9uQ29udGV4dCA9IGNyZWF0ZUV4ZWN1dGlvbkNvbnRleHQoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbixcbiAgICAgIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgcGxhdGZvcm06IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLFxuICAgICAgICBwcm9qZWN0Q29uZmlnOiB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgICBkZWJ1Z05hbWVzcGFjZTogdGhpcy5fZGVidWdOYW1lc3BhY2UsXG4gICAgICB9LFxuICAgIClcbiAgICB0aGlzLl9iaW5kRXZlbnRMaXN0ZW5lcnModGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0KVxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuZnNNYXBbXCJlbnRyeXBvaW50LnRzeFwiXSA9IGNvZGVcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LnRzQ29uZmlnID0gZ2V0VHNDb25maWcodGhpcy5fZXhlY3V0aW9uQ29udGV4dC5mc01hcClcbiAgICA7KGdsb2JhbFRoaXMgYXMgYW55KS5fX3RzY2lyY3VpdF9jaXJjdWl0ID0gdGhpcy5fZXhlY3V0aW9uQ29udGV4dC5jaXJjdWl0XG5cbiAgICBhd2FpdCBpbXBvcnRFdmFsUGF0aChcIi4vZW50cnlwb2ludC50c3hcIiwgdGhpcy5fZXhlY3V0aW9uQ29udGV4dClcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVDb21wb25lbnQoY29tcG9uZW50OiBhbnksIG9wdHM6IHsgbmFtZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBpZiAodGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24udmVyYm9zZSkge1xuICAgICAgY29uc29sZS5sb2coXCJbQ2lyY3VpdFJ1bm5lcl0gZXhlY3V0ZUNvbXBvbmVudCBjYWxsZWRcIilcbiAgICB9XG5cbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gY3JlYXRlRXhlY3V0aW9uQ29udGV4dChcbiAgICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLFxuICAgICAge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBwbGF0Zm9ybTogdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucGxhdGZvcm0sXG4gICAgICAgIHByb2plY3RDb25maWc6IHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnByb2plY3RDb25maWcsXG4gICAgICAgIGRlYnVnTmFtZXNwYWNlOiB0aGlzLl9kZWJ1Z05hbWVzcGFjZSxcbiAgICAgIH0sXG4gICAgKVxuICAgIHRoaXMuX2JpbmRFdmVudExpc3RlbmVycyh0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQpXG4gICAgOyhnbG9iYWxUaGlzIGFzIGFueSkuX190c2NpcmN1aXRfY2lyY3VpdCA9IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdFxuICAgIHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQudHNDb25maWcgPSBudWxsXG5cbiAgICBjb25zdCBlbGVtZW50ID0gdHlwZW9mIGNvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiID8gY29tcG9uZW50KCkgOiBjb21wb25lbnRcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuYWRkKGVsZW1lbnQgYXMgYW55KVxuICB9XG5cbiAgb24oZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSA/Pz0gW11cbiAgICB0aGlzLl9ldmVudExpc3RlbmVyc1tldmVudF0ucHVzaChjYWxsYmFjaylcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0Py5jaXJjdWl0Lm9uKGV2ZW50IGFzIGFueSwgY2FsbGJhY2spXG4gIH1cblxuICBhc3luYyByZW5kZXJVbnRpbFNldHRsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQuY2lyY3VpdC5yZW5kZXJVbnRpbFNldHRsZWQoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0Q2lyY3VpdEpzb24oKTogUHJvbWlzZTxBbnlDaXJjdWl0RWxlbWVudFtdPiB7XG4gICAgaWYgKCF0aGlzLl9leGVjdXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjaXJjdWl0IGhhcyBiZWVuIGNyZWF0ZWRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQuZ2V0Q2lyY3VpdEpzb24oKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IoXG4gICAgICAgIGVycm9yLFxuICAgICAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0LmVudHJ5cG9pbnQsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgY2xlYXJFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fZXhlY3V0aW9uQ29udGV4dD8uY2lyY3VpdCkge1xuICAgICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XSkge1xuICAgICAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IDxleHBsYW5hdGlvbj5cbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyPzogKGV2ZW50OiBzdHJpbmcsIGxpc3RlbmVyOiBGdW5jdGlvbikgPT4gdm9pZFxuICAgICAgICAgIH1cbiAgICAgICAgICBjaXJjdWl0LnJlbW92ZUxpc3RlbmVyPy4oZXZlbnQsIGxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBldmVudCBpbiB0aGlzLl9ldmVudExpc3RlbmVycykge1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50TGlzdGVuZXJzW2V2ZW50XVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGtpbGwoKSB7XG4gICAgLy8gQ2xlYW51cCByZXNvdXJjZXNcbiAgICB0aGlzLl9leGVjdXRpb25Db250ZXh0ID0gbnVsbFxuICB9XG5cbiAgYXN5bmMgc2V0U25pcHBldHNBcGlCYXNlVXJsKGJhc2VVcmw6IHN0cmluZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnNuaXBwZXRzQXBpQmFzZVVybCA9IGJhc2VVcmxcbiAgfVxuXG4gIGFzeW5jIHNldERpc2FibGVDZG5Mb2FkaW5nKGRpc2FibGU6IGJvb2xlYW4pIHtcbiAgICA7KHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uIGFzIGFueSkuZGlzYWJsZUNkbkxvYWRpbmcgPSBkaXNhYmxlXG4gIH1cblxuICBhc3luYyBzZXRQbGF0Zm9ybUNvbmZpZyhwbGF0Zm9ybTogUGxhdGZvcm1Db25maWcpIHtcbiAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSA9IHBsYXRmb3JtXG4gIH1cblxuICBhc3luYyBzZXRQbGF0Zm9ybUNvbmZpZ1Byb3BlcnR5KHByb3BlcnR5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtKSB7XG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wbGF0Zm9ybSA9IHt9XG4gICAgfVxuICAgIHNldFZhbHVlQXRQYXRoKHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnBsYXRmb3JtLCBwcm9wZXJ0eSwgdmFsdWUpXG4gIH1cblxuICBhc3luYyBzZXRQcm9qZWN0Q29uZmlnKHByb2plY3Q6IFBhcnRpYWw8UGxhdGZvcm1Db25maWc+KSB7XG4gICAgdGhpcy5fY2lyY3VpdFJ1bm5lckNvbmZpZ3VyYXRpb24ucHJvamVjdENvbmZpZyA9IHByb2plY3RcbiAgfVxuXG4gIGFzeW5jIHNldFByb2plY3RDb25maWdQcm9wZXJ0eShwcm9wZXJ0eTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgaWYgKCF0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnKSB7XG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnID0ge31cbiAgICB9XG4gICAgc2V0VmFsdWVBdFBhdGgoXG4gICAgICB0aGlzLl9jaXJjdWl0UnVubmVyQ29uZmlndXJhdGlvbi5wcm9qZWN0Q29uZmlnLFxuICAgICAgcHJvcGVydHksXG4gICAgICB2YWx1ZSxcbiAgICApXG4gIH1cblxuICBhc3luYyBzZXRTZXNzaW9uVG9rZW4odG9rZW46IHN0cmluZykge1xuICAgIHRoaXMuX2NpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uLnNlc3Npb25Ub2tlbiA9IHRva2VuXG4gIH1cblxuICBhc3luYyBlbmFibGVEZWJ1ZyhuYW1lc3BhY2U6IHN0cmluZykge1xuICAgIHRoaXMuX2RlYnVnTmFtZXNwYWNlID0gbmFtZXNwYWNlXG4gICAgaWYgKHRoaXMuX2V4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICAgIGNvbnN0IGNpcmN1aXQgPSB0aGlzLl9leGVjdXRpb25Db250ZXh0LmNpcmN1aXQgYXMgYW55XG4gICAgICBjaXJjdWl0LmVuYWJsZURlYnVnPy4obmFtZXNwYWNlKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2JpbmRFdmVudExpc3RlbmVycyhjaXJjdWl0OiBSb290Q2lyY3VpdCkge1xuICAgIGZvciAoY29uc3QgZXZlbnQgaW4gdGhpcy5fZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIGZvciAoY29uc3QgbGlzdGVuZXIgb2YgdGhpcy5fZXZlbnRMaXN0ZW5lcnNbZXZlbnRdKSB7XG4gICAgICAgIGNpcmN1aXQub24oZXZlbnQgYXMgYW55LCBsaXN0ZW5lciBhcyBhbnkpXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyB9IGZyb20gXCIuL3Jlc29sdmVGaWxlUGF0aFwiXG5pbXBvcnQgRGVidWcgZnJvbSBcImRlYnVnXCJcblxuY29uc3QgZGVidWcgPSBEZWJ1ZyhcInRzY2k6ZXZhbDpzZXR1cERlZmF1bHRFbnRyeXBvaW50SWZOZWVkZWRcIilcblxuZXhwb3J0IGNvbnN0IHNldHVwRGVmYXVsdEVudHJ5cG9pbnRJZk5lZWRlZCA9IChvcHRzOiB7XG4gIGVudHJ5cG9pbnQ/OiBzdHJpbmdcbiAgZnNNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgbWFpbkNvbXBvbmVudFBhdGg/OiBzdHJpbmdcbiAgbWFpbkNvbXBvbmVudE5hbWU/OiBzdHJpbmdcbiAgbmFtZT86IHN0cmluZ1xuICBtYWluQ29tcG9uZW50UHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG59KSA9PiB7XG4gIGlmICghb3B0cy5lbnRyeXBvaW50ICYmICFvcHRzLm1haW5Db21wb25lbnRQYXRoKSB7XG4gICAgaWYgKFwiaW5kZXgudHN4XCIgaW4gb3B0cy5mc01hcCkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IFwiaW5kZXgudHN4XCJcbiAgICB9IGVsc2UgaWYgKFwiaW5kZXgudHNcIiBpbiBvcHRzLmZzTWFwKSB7XG4gICAgICBvcHRzLm1haW5Db21wb25lbnRQYXRoID0gXCJpbmRleC50c1wiXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIE9iamVjdC5rZXlzKG9wdHMuZnNNYXApLmZpbHRlcigoaykgPT4gay5lbmRzV2l0aChcIi50c3hcIikpLmxlbmd0aCA9PT0gMVxuICAgICkge1xuICAgICAgb3B0cy5tYWluQ29tcG9uZW50UGF0aCA9IE9iamVjdC5rZXlzKG9wdHMuZnNNYXApWzBdXG4gICAgfSBlbHNlIGlmIChcInRzY2lyY3VpdC5jb25maWcuanNvblwiIGluIG9wdHMuZnNNYXApIHtcbiAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBvcHRzLmZzTWFwW1widHNjaXJjdWl0LmNvbmZpZy5qc29uXCJdXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKGNvbmZpZ0NvbnRlbnQpXG4gICAgICAgIGlmIChjb25maWcubWFpbkVudHJ5cG9pbnQpIHtcbiAgICAgICAgICBvcHRzLmVudHJ5cG9pbnQgPSBjb25maWcubWFpbkVudHJ5cG9pbnRcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gcGFyc2UgdHNjaXJjdWl0LmNvbmZpZy5qc29uOlwiLCBlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiRWl0aGVyIGVudHJ5cG9pbnQgb3IgbWFpbkNvbXBvbmVudFBhdGggbXVzdCBiZSBwcm92aWRlZCAobm8gaW5kZXggZmlsZSwgY291bGQgbm90IGluZmVyIGVudHJ5cG9pbnQpXCIsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcHRzLmVudHJ5cG9pbnQgJiYgb3B0cy5tYWluQ29tcG9uZW50UGF0aCkge1xuICAgIG9wdHMuZW50cnlwb2ludCA9IFwiZW50cnlwb2ludC50c3hcIlxuICAgIGNvbnN0IG1haW5Db21wb25lbnRDb2RlID1cbiAgICAgIG9wdHMuZnNNYXBbcmVzb2x2ZUZpbGVQYXRoT3JUaHJvdyhvcHRzLm1haW5Db21wb25lbnRQYXRoLCBvcHRzLmZzTWFwKV1cbiAgICBpZiAoIW1haW5Db21wb25lbnRDb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNYWluIGNvbXBvbmVudCBwYXRoIFwiJHtvcHRzLm1haW5Db21wb25lbnRQYXRofVwiIG5vdCBmb3VuZCBpbiBmc01hcC4gQXZhaWxhYmxlIHBhdGhzOiAke09iamVjdC5rZXlzKG9wdHMuZnNNYXApLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgKVxuICAgIH1cbiAgICBvcHRzLmZzTWFwW29wdHMuZW50cnlwb2ludF0gPSBgXG4gICAgIGltcG9ydCAqIGFzIFVzZXJDb21wb25lbnRzIGZyb20gXCIuLyR7b3B0cy5tYWluQ29tcG9uZW50UGF0aH1cIjtcbiAgICAgICAgICBcbiAgICAgICR7XG4gICAgICAgIG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgICAgICAgICA/IGBcbiAgICAgICAgY29uc3QgQ29tcG9uZW50VG9SZW5kZXIgPSBVc2VyQ29tcG9uZW50c1tcIiR7b3B0cy5tYWluQ29tcG9uZW50TmFtZX1cIl1cbiAgICAgICAgYFxuICAgICAgICAgIDogYGNvbnN0IENvbXBvbmVudFRvUmVuZGVyID0gVXNlckNvbXBvbmVudHMuZGVmYXVsdCB8fCBcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhVc2VyQ29tcG9uZW50cylcbiAgICAgICAgICAuZmlsdGVyKChbbmFtZV0pID0+ICFuYW1lLnN0YXJ0c1dpdGgoXCJ1c2VcIikpXG4gICAgICAgICAgLm1hcCgoW18sIGNvbXBvbmVudF0pID0+IGNvbXBvbmVudClbMF0gfHwgKCgpID0+IG51bGwpO2BcbiAgICAgIH1cblxuICAgICAgICAgICAke1xuICAgICAgICAgICAgIGRlYnVnLmVuYWJsZWRcbiAgICAgICAgICAgICAgID8gYFxuICAgICBjb25zb2xlLmxvZyh7IFVzZXJDb21wb25lbnRzIH0pXG4gICAgIGNvbnNvbGUubG9nKFwiQ29tcG9uZW50VG9SZW5kZXIgXCIgKyBDb21wb25lbnRUb1JlbmRlci50b1N0cmluZygpLCAgeyBDb21wb25lbnRUb1JlbmRlciB9KVxuICAgICBgXG4gICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgfVxuXG4gICAgICBjaXJjdWl0LmFkZCggICAgICAgXG4gICAgICAgICAgPENvbXBvbmVudFRvUmVuZGVyICR7b3B0cy5tYWluQ29tcG9uZW50UHJvcHMgPyBgey4uLiR7SlNPTi5zdHJpbmdpZnkob3B0cy5tYWluQ29tcG9uZW50UHJvcHMsIG51bGwsIDIpfX1gIDogXCJcIn0gLz4gXG4gICAgICApO1xuYFxuICB9XG5cbiAgaWYgKCFvcHRzLm5hbWUgJiYgb3B0cy5tYWluQ29tcG9uZW50TmFtZSkge1xuICAgIG9wdHMubmFtZSA9IG9wdHMubWFpbkNvbXBvbmVudE5hbWVcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBlbmhhbmNlUm9vdENpcmN1aXRIYXNOb0NoaWxkcmVuRXJyb3IgPSAoXG4gIGVycm9yOiB1bmtub3duLFxuICBlbnRyeXBvaW50Pzogc3RyaW5nLFxuKSA9PiB7XG4gIGlmIChcbiAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgZW50cnlwb2ludCAmJlxuICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJSb290Q2lyY3VpdCBoYXMgbm8gY2hpbGRyZW5cIikgJiZcbiAgICAhZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnXCJlbnRyeXBvaW50XCI6JylcbiAgKSB7XG4gICAgY29uc3QgZW50cnlwb2ludE1lc3NhZ2UgPSBlbnRyeXBvaW50LnN0YXJ0c1dpdGgoXCIuL1wiKVxuICAgICAgPyBlbnRyeXBvaW50LnNsaWNlKDIpXG4gICAgICA6IGVudHJ5cG9pbnRcbiAgICBlcnJvci5tZXNzYWdlID0gYCR7ZXJyb3IubWVzc2FnZX0uIFwiZW50cnlwb2ludFwiOiBcIiR7ZW50cnlwb2ludE1lc3NhZ2V9XCIgaXMgc2V0IGluIHRoZSBydW5uZXIgY29uZmlndXJhdGlvbiwgZW50cnlwb2ludHMgbXVzdCBjb250YWluIFwiY2lyY3VpdC5hZGQoLi4uKVwiLCB5b3UgbWlnaHQgYmUgbG9va2luZyB0byB1c2UgbWFpbkNvbXBvbmVudFBhdGggaW5zdGVhZCBpZiB5b3VyIGZpbGUgZXhwb3J0cyBhIGNvbXBvbmVudC5gXG4gIH1cblxuICByZXR1cm4gZXJyb3Jcbn1cbiIsICIvKipcbiAqIEdldCBhbGwgcGF0aHMgb2YgYW4gb2JqZWN0XG4gKlxuICogZ2V0T2JqZWN0UGF0aHMoeyBhOiB7IGI6IDIsIGM6IHsgZDogMyB9IH0sIGU6IDUgfSlcbiAqXG4gKiAvLyBPdXRwdXQ6IFsnYS5iJywgJ2EuYy5kJywgJ2UnXVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T2JqZWN0UGF0aHMoXG4gIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcHJlZml4ID0gXCJcIixcbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW11cblxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XVxuICAgIGNvbnN0IHBhdGggPSBwcmVmaXggPyBgJHtwcmVmaXh9LiR7a2V5fWAgOiBrZXlcblxuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBzdWJQYXRocyA9IGdldE9iamVjdFBhdGhzKHZhbHVlLCBwYXRoKVxuICAgICAgcGF0aHMucHVzaCguLi5zdWJQYXRocylcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aHMucHVzaChwYXRoKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXRoc1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVBdFBhdGgob2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBwYXRoOiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChcIi5cIilcbiAgbGV0IGN1cnJlbnQgPSBvYmpcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV1cbiAgfVxuICByZXR1cm4gY3VycmVudFxufVxuLyoqXG4gKiBTZXQgYSB2YWx1ZSBhdCBhIHBhdGggaW4gYW4gb2JqZWN0XG4gKlxuICogc2V0VmFsdWVBdFBhdGgoeyBhOiB7IGI6IDIgfSB9LCBcImEuYy5kXCIsIDUpXG4gKlxuICogLy8gT3V0cHV0OiB7IGE6IHsgYjogMiwgYzogeyBkOiA1IH0gfSB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYWx1ZUF0UGF0aChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlOiBhbnksXG4pIHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoXCIuXCIpXG4gIGxldCBjdXJyZW50ID0gb2JqXG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleXNbaV1cblxuICAgIC8vIElmIHdlJ3JlIGF0IHRoZSBsYXN0IGtleSwgc2V0IHRoZSB2YWx1ZS5cbiAgICBpZiAoaSA9PT0ga2V5cy5sZW5ndGggLSAxKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSB2YWx1ZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgbm90IGFuIG9iamVjdCAoYXZvaWQgb3ZlcndyaXRpbmcgYXJyYXlzKSwgY3JlYXRlIGEgbmV3IG9iamVjdFxuICAgICAgaWYgKFxuICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1cnJlbnQsIGtleSkgfHxcbiAgICAgICAgdHlwZW9mIGN1cnJlbnRba2V5XSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICBjdXJyZW50W2tleV0gPT09IG51bGwgfHxcbiAgICAgICAgQXJyYXkuaXNBcnJheShjdXJyZW50W2tleV0pXG4gICAgICApIHtcbiAgICAgICAgY3VycmVudFtrZXldID0ge31cbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDaXJjdWl0UnVubmVyIH0gZnJvbSBcIi4vQ2lyY3VpdFJ1bm5lclwiXG5pbXBvcnQgdHlwZSB7IENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uIH0gZnJvbSBcImxpYi9zaGFyZWQvdHlwZXNcIlxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuVHNjaXJjdWl0Q29kZShcbiAgZmlsZXN5c3RlbU9yQ29kZVN0cmluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHN0cmluZyxcbiAgb3B0cz86IE9taXQ8UGFyYW1ldGVyczxDaXJjdWl0UnVubmVyW1wiZXhlY3V0ZVdpdGhGc01hcFwiXT5bMF0sIFwiZnNNYXBcIj4gJiB7XG4gICAgLyoqIFNlc3Npb24gdG9rZW4gZm9yIGF1dGhlbnRpY2F0aW5nIHdpdGggdGhlIHRzY2lyY3VpdCBucG0gcmVnaXN0cnkgKi9cbiAgICBzZXNzaW9uVG9rZW4/OiBzdHJpbmdcbiAgfSxcbikge1xuICBpZiAoXG4gICAgdHlwZW9mIGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgPT09IFwic3RyaW5nXCIgJiZcbiAgICAhZmlsZXN5c3RlbU9yQ29kZVN0cmluZy5pbmNsdWRlcyhcImV4cG9ydFwiKVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIFwiZXhwb3J0XCIga2V5d29yZCB3YXNuJ3QgZm91bmQgaW4geW91ciBwcm92aWRlZCBjb2RlLiBZb3UgbmVlZCB0byBleHBvcnQgYSBjb21wb25lbnQgaW4geW91ciBjb2RlLCBlLmcuXFxuXFxuZXhwb3J0IGRlZmF1bHQgKCkgPT4gKFxcbiAgPHJlc2lzdG9yIG5hbWU9XCJSMVwiIHJlc2lzdGFuY2U9XCIxa1wiIC8+XFxuKWAsXG4gICAgKVxuICB9XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPVxuICAgIHR5cGVvZiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nID09PSBcInN0cmluZ1wiXG4gICAgICA/IHsgXCJ1c2VyLWNvZGUudHN4XCI6IGZpbGVzeXN0ZW1PckNvZGVTdHJpbmcgfVxuICAgICAgOiBmaWxlc3lzdGVtT3JDb2RlU3RyaW5nXG5cbiAgY29uc3QgcnVubmVyQ29uZmlnOiBQYXJ0aWFsPENpcmN1aXRSdW5uZXJDb25maWd1cmF0aW9uPiA9IHt9XG4gIGlmIChvcHRzPy5zZXNzaW9uVG9rZW4pIHtcbiAgICBydW5uZXJDb25maWcuc2Vzc2lvblRva2VuID0gb3B0cy5zZXNzaW9uVG9rZW5cbiAgfVxuXG4gIGNvbnN0IGNpcmN1aXRSdW5uZXIgPSBuZXcgQ2lyY3VpdFJ1bm5lcihydW5uZXJDb25maWcpXG5cbiAgYXdhaXQgY2lyY3VpdFJ1bm5lci5leGVjdXRlV2l0aEZzTWFwKHtcbiAgICBmc01hcDogZmlsZXN5c3RlbSxcbiAgICAuLi5vcHRzLFxuICB9KVxuXG4gIGF3YWl0IGNpcmN1aXRSdW5uZXIucmVuZGVyVW50aWxTZXR0bGVkKClcblxuICByZXR1cm4gYXdhaXQgY2lyY3VpdFJ1bm5lci5nZXRDaXJjdWl0SnNvbigpXG59XG4iLCAiaW1wb3J0IHsgcnVuVHNjaXJjdWl0Q29kZSB9IGZyb20gXCIuL3J1blRzY2lyY3VpdENvZGVcIlxuXG5leHBvcnQgY29uc3QgcnVuVHNjaXJjdWl0TW9kdWxlID0gYXN5bmMgKFxuICBtb2R1bGU6IHN0cmluZyxcbiAgb3B0czoge1xuICAgIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxuICAgIGV4cG9ydE5hbWU/OiBzdHJpbmdcbiAgICAvKiogU2Vzc2lvbiB0b2tlbiBmb3IgYXV0aGVudGljYXRpbmcgd2l0aCB0aGUgdHNjaXJjdWl0IG5wbSByZWdpc3RyeSAqL1xuICAgIHNlc3Npb25Ub2tlbj86IHN0cmluZ1xuICB9ID0ge30sXG4pID0+IHtcbiAgaWYgKCFtb2R1bGUuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICBtb2R1bGUgPSBgQHRzY2kvJHttb2R1bGUucmVwbGFjZSgvXFwvLywgXCIuXCIpfWBcbiAgfVxuICBjb25zdCBjaXJjdWl0SnNvbiA9IGF3YWl0IHJ1blRzY2lyY3VpdENvZGUoXG4gICAge1xuICAgICAgLy8gVE9ETyBoYW5kbGUgZXhwb3J0cyB0aGF0IGFyZSBub3QgdGhlIGRlZmF1bHQgZXhwb3J0IGJ5IHNjYW5uaW5nXG4gICAgICAvLyBvdGhlckV4cG9ydHMgZm9yIGNvbXBvbmVudHNcbiAgICAgIFwidXNlci1jb2RlLnRzeFwiOiBgXG4gICAgaW1wb3J0IE1vZHVsZSwgKiBhcyBvdGhlckV4cG9ydHMgZnJvbSBcIiR7bW9kdWxlfVwiO1xuXG4gICAgbGV0IGV4cG9ydE5hbWUgPSBcIiR7b3B0cy5leHBvcnROYW1lID8/IFwiXCJ9XCJcblxuICAgIGlmICgoIU1vZHVsZSB8fCB0eXBlb2YgTW9kdWxlICE9PSBcImZ1bmN0aW9uXCIpICYmICFCb29sZWFuKGV4cG9ydE5hbWUpKSB7XG4gICAgICBleHBvcnROYW1lID0gT2JqZWN0LmtleXMob3RoZXJFeHBvcnRzKS5maWx0ZXIoa2V5ID0+IGtleVswXSA9PT0ga2V5WzBdLnRvVXBwZXJDYXNlKCkgJiYgdHlwZW9mIG90aGVyRXhwb3J0c1trZXldID09PSBcImZ1bmN0aW9uXCIpWzBdXG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdEV4cG9ydCA9IGV4cG9ydE5hbWUgPyBvdGhlckV4cG9ydHNbZXhwb3J0TmFtZV0gOiBNb2R1bGVcblxuICAgIGlmICghZGVmYXVsdEV4cG9ydCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxcYE5vIGV4cG9ydCBmb3VuZCBmb3IgbW9kdWxlIFwiXFwke21vZHVsZX1cIiAodHJpZWQgXCJcXCR7ZXhwb3J0TmFtZSA/PyBcImRlZmF1bHRcIn1cIilcXGApXG4gICAgfVxuXG4gICAgZXhwb3J0IGRlZmF1bHQgZGVmYXVsdEV4cG9ydDtcbiAgICBgLFxuICAgIH0sXG4gICAge1xuICAgICAgbWFpbkNvbXBvbmVudFByb3BzOiBvcHRzLnByb3BzLFxuICAgICAgc2Vzc2lvblRva2VuOiBvcHRzLnNlc3Npb25Ub2tlbixcbiAgICB9LFxuICApXG4gIHJldHVybiBjaXJjdWl0SnNvblxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFBLFNBQVMsbUJBQW1CO0FBRTVCLFlBQVksbUJBQW1CO0FBQy9CLFlBQVksV0FBVztBQUN2QixZQUFZLHFCQUFxQjtBQUNqQyxZQUFZLHdCQUF3Qjs7O0FDQTdCLElBQU0sZ0NBQWdDLENBQzNDLG1CQUN1QjtBQUV2QixNQUFJLFFBQVEsZUFBZSxNQUFNLGdCQUFnQjtBQUNqRCxNQUFJLE1BQU8sUUFBTyxNQUFNLENBQUM7QUFJekIsVUFBUSxlQUFlO0FBQUEsSUFDckI7QUFBQSxFQUNGO0FBQ0EsTUFBSSxNQUFPLFFBQU8sTUFBTSxD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RztBQUFBLEVBQ0wsQ0FBQztBQUVELFFBQU0sY0FBYyxtQkFBbUI7QUFFdkMsU0FBTyxNQUFNLGNBQWMsZUFBZTtBQUM1Qzs7O0FDcENPLElBQU0scUJBQXFCLE9BQ2hDLFFBQ0EsT0FLSSxDQUFDLE1BQ0Y7QUFDSCxNQUFJLENBQUMsT0FBTyxXQUFXLEdBQUcsR0FBRztBQUMzQixhQUFTLFNBQVMsT0FBTyxRQUFRLE1BQU0sR0FBRyxDQUFDO0FBQUEsRUFDN0M7QUFDQSxRQUFNLGNBQWMsTUFBTTtBQUFBLElBQ3hCO0FBQUE7QUFBQTtBQUFBLE1BR0UsaUJBQWlCO0FBQUEsNkNBQ3NCLE1BQU07QUFBQTtBQUFBLHdCQUUzQixLQUFLLGNBQWMsRUFBRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFjekM7QUFBQSxJQUNBO0FBQUEsTUFDRSxvQkFBb0IsS0FBSztBQUFBLE1BQ3pCLGNBQWMsS0FBSztBQUFBLElBQ3JCO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiRGVidWciLCAiZGVidWciLCAiRGVidWciLCAiaW1wb3J0TmFtZSIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJ1bnByZWZpeGVkUGF0aCIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyIsICJkZWJ1ZyIsICJEZWJ1ZyJdCn0K
|