@dollhousemcp/mcp-server 2.0.12-rc.5 → 2.0.12-rc.7
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/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/index.js +10 -3
- package/dist/web/console/StaleProcessRecovery.d.ts +1 -1
- package/dist/web/console/StaleProcessRecovery.d.ts.map +1 -1
- package/dist/web/console/StaleProcessRecovery.js +45 -45
- package/dist/web/public/setup.js +39 -6
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export declare const PACKAGE_VERSION = "2.0.12-rc.
|
|
6
|
-
export declare const BUILD_TIMESTAMP = "2026-04-
|
|
5
|
+
export declare const PACKAGE_VERSION = "2.0.12-rc.7";
|
|
6
|
+
export declare const BUILD_TIMESTAMP = "2026-04-09T04:44:43.775Z";
|
|
7
7
|
export declare const BUILD_TYPE: 'npm' | 'git';
|
|
8
8
|
export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
|
|
9
9
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export const PACKAGE_VERSION = '2.0.12-rc.
|
|
6
|
-
export const BUILD_TIMESTAMP = '2026-04-
|
|
5
|
+
export const PACKAGE_VERSION = '2.0.12-rc.7';
|
|
6
|
+
export const BUILD_TIMESTAMP = '2026-04-09T04:44:43.775Z';
|
|
7
7
|
export const BUILD_TYPE = 'npm';
|
|
8
8
|
export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDO0FBQzdDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcyLjAuMTItcmMuNyc7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjYtMDQtMDlUMDQ6NDQ6NDMuNzc1Wic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
|
package/dist/index.js
CHANGED
|
@@ -691,15 +691,22 @@ if ((isDirectExecution || isNpxExecution || isCliExecution) && (!isTest || isTes
|
|
|
691
691
|
// Pre-flight: kill any stale DollhouseMCP process squatting on our port
|
|
692
692
|
// BEFORE any container/server setup. This is the definitive fix for #1850 —
|
|
693
693
|
// clear the port first, then start cleanly.
|
|
694
|
+
// Race condition note: a new process could grab the port between kill and
|
|
695
|
+
// our bind, but recoverStalePort's TOCTOU mitigation (500ms lock file
|
|
696
|
+
// re-read) and bindAndListen's own recovery handle that edge case.
|
|
697
|
+
const targetPort = cliPort || env.DOLLHOUSE_WEB_CONSOLE_PORT;
|
|
694
698
|
try {
|
|
695
|
-
const targetPort = cliPort || env.DOLLHOUSE_WEB_CONSOLE_PORT;
|
|
696
699
|
const { recoverStalePort } = await import('./web/console/StaleProcessRecovery.js');
|
|
697
700
|
const recovered = await recoverStalePort(targetPort);
|
|
698
701
|
if (recovered) {
|
|
699
702
|
console.error(` Cleared stale process from port ${targetPort}\n`);
|
|
700
703
|
}
|
|
701
704
|
}
|
|
702
|
-
catch {
|
|
705
|
+
catch (err) {
|
|
706
|
+
// Non-fatal — bindAndListen will handle EADDRINUSE as a fallback.
|
|
707
|
+
// Log so operators can diagnose recovery failures.
|
|
708
|
+
console.error(`[DollhouseMCP] Pre-flight port recovery failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
709
|
+
}
|
|
703
710
|
let mcpAqlHandler;
|
|
704
711
|
let memorySink;
|
|
705
712
|
let metricsSink;
|
|
@@ -806,4 +813,4 @@ if ((isDirectExecution || isNpxExecution || isCliExecution) && (!isTest || isTes
|
|
|
806
813
|
});
|
|
807
814
|
}
|
|
808
815
|
}
|
|
809
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLGtFQUFrRTtBQUNsRSw4REFBOEQ7QUFDOUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBR3pCLGlEQUFpRDtBQUNqRCxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDeEMsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRTtRQUMzQyxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENB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Q0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG4vLyBMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIC5lbnYgZmlsZXMgQkVGT1JFIGFueXRoaW5nIGVsc2Vcbi8vIFRoaXMgZW5zdXJlcyAuZW52LmxvY2FsIGFuZCAuZW52IGFyZSBsb2FkZWQgZm9yIGFsbCBtb2R1bGVzXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuL2NvbmZpZy9lbnYuanMnO1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmVhbHBhdGhTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBTZXJ2ZXIgfSBmcm9tIFwiQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay9zZXJ2ZXIvaW5kZXguanNcIjtcbmltcG9ydCB7IFN0ZGlvU2VydmVyVHJhbnNwb3J0IH0gZnJvbSBcIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvc2VydmVyL3N0ZGlvLmpzXCI7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIgfSBmcm9tIFwiLi91dGlscy9FcnJvckhhbmRsZXIuanNcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL3V0aWxzL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHsgRG9sbGhvdXNlQ29udGFpbmVyIH0gZnJvbSBcIi4vZGkvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gXCIuL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25hbFRlbGVtZXRyeSwgU3RhcnR1cFRpbWVyIH0gZnJvbSBcIi4vdGVsZW1ldHJ5L2luZGV4LmpzXCI7XG5pbXBvcnQgeyBQQUNLQUdFX1ZFUlNJT04gfSBmcm9tIFwiLi9nZW5lcmF0ZWQvdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmRpY2F0b3JDb25maWcgfSBmcm9tIFwiLi9jb25maWcvaW5kaWNhdG9yLWNvbmZpZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJVG9vbEhhbmRsZXIgfSBmcm9tIFwiLi9zZXJ2ZXIvaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgVG9vbFJlZ2lzdHJ5IH0gZnJvbSBcIi4vaGFuZGxlcnMvVG9vbFJlZ2lzdHJ5LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBlcnNvbmFIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvUGVyc29uYUhhbmRsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgRWxlbWVudENSVURIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvRWxlbWVudENSVURIYW5kbGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvQ29sbGVjdGlvbkhhbmRsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9ydGZvbGlvSGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL1BvcnRmb2xpb0hhbmRsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgR2l0SHViQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVycy9HaXRIdWJBdXRoSGFuZGxlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBEaXNwbGF5Q29uZmlnSGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL0Rpc3BsYXlDb25maWdIYW5kbGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IElkZW50aXR5SGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL0lkZW50aXR5SGFuZGxlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25maWdIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvQ29uZmlnSGFuZGxlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTeW5jSGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL1N5bmNIYW5kbGVyVjIuanNcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZWRJbmRleEhhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVycy9FbmhhbmNlZEluZGV4SGFuZGxlci5qc1wiO1xuaW1wb3J0IHsgQ29uZmlnTWFuYWdlciB9IGZyb20gXCIuL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanNcIjtcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gXCIuL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qc1wiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgdHlwZSB7IEVuc2VtYmxlRWxlbWVudCB9IGZyb20gXCIuL2VsZW1lbnRzL2Vuc2VtYmxlcy90eXBlcy5qc1wiO1xuXG4vLyBEZWZlbnNpdmUgZXJyb3IgaGFuZGxpbmcgZm9yIG5weC9DTEkgZXhlY3V0aW9uXG5wcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnJvcikgPT4ge1xuICBsb2dnZXIuZXJyb3IoJ1VuaGFuZGxlZCBleGNlcHRpb24gZGV0ZWN0ZWQnLCB7XG4gICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkXG4gIH0pO1xuICBjb25zb2xlLmVycm9yKCdbRG9sbGhvdXNlTUNQXSBTZXJ2ZXIgc3RhcnR1cCBmYWlsZWQnKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG5cbnByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChyZWFzb24sIHByb21pc2UpID0+IHtcbiAgbG9nZ2VyLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gZGV0ZWN0ZWQnLCB7XG4gICAgcmVhc29uOiByZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbi5tZXNzYWdlIDogU3RyaW5nKHJlYXNvbiksXG4gICAgc3RhY2s6IHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgIHByb21pc2VcbiAgfSk7XG4gIGNvbnNvbGUuZXJyb3IoJ1tEb2xsaG91c2VNQ1BdIFNlcnZlciBzdGFydHVwIGZhaWxlZCcpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcblxuLy8gT25seSBsb2cgZXhlY3V0aW9uIGVudmlyb25tZW50IGluIGRlYnVnIG1vZGVcbmlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcpIHtcbiAgY29uc29sZS5lcnJvcignW0RvbGxob3VzZU1DUF0gRGVidWcgbW9kZSBlbmFibGVkJyk7XG59XG5cbmV4cG9ydCBjbGFzcyBEb2xsaG91c2VNQ1BTZXJ2ZXIgaW1wbGVtZW50cyBJVG9vbEhhbmRsZXIge1xuICBwcml2YXRlIHNlcnZlcjogU2VydmVyO1xuICBwdWJsaWMgcGVyc29uYXNEaXI6IHN0cmluZyB8IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFVzZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbml0aWFsaXphdGlvblByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb250YWluZXI6IERvbGxob3VzZUNvbnRhaW5lcjtcbiAgcHJpdmF0ZSB0b29sUmVnaXN0cnk/OiBUb29sUmVnaXN0cnk7XG4gIHByaXZhdGUgZW5oYW5jZWRJbmRleEhhbmRsZXI/OiBFbmhhbmNlZEluZGV4SGFuZGxlcjtcbiAgcHJpdmF0ZSBwZXJzb25hSGFuZGxlcj86IFBlcnNvbmFIYW5kbGVyO1xuICBwcml2YXRlIGVsZW1lbnRDUlVESGFuZGxlcj86IEVsZW1lbnRDUlVESGFuZGxlcjtcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uSGFuZGxlcj86IENvbGxlY3Rpb25IYW5kbGVyO1xuICBwcml2YXRlIHBvcnRmb2xpb0hhbmRsZXI/OiBQb3J0Zm9saW9IYW5kbGVyO1xuICBwcml2YXRlIGdpdGh1YkF1dGhIYW5kbGVyPzogR2l0SHViQXV0aEhhbmRsZXI7XG4gIHByaXZhdGUgZGlzcGxheUNvbmZpZ0hhbmRsZXI/OiBEaXNwbGF5Q29uZmlnSGFuZGxlcjtcbiAgcHJpdmF0ZSBpZGVudGl0eUhhbmRsZXI/OiBJZGVudGl0eUhhbmRsZXI7XG4gIHByaXZhdGUgY29uZmlnSGFuZGxlcj86IENvbmZpZ0hhbmRsZXI7XG4gIHByaXZhdGUgc3luY0hhbmRsZXI/OiBTeW5jSGFuZGxlcjtcbiAgcHJpdmF0ZSByZXNvdXJjZUhhbmRsZXI/OiBpbXBvcnQoJy4vaGFuZGxlcnMvUmVzb3VyY2VIYW5kbGVyLmpzJykuUmVzb3VyY2VIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgRG9sbGhvdXNlTUNQU2VydmVyIGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXIgRG9sbGhvdXNlQ29udGFpbmVyIGluc3RhbmNlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAgICogICAgICAgICAgICAgICAgICBVc2UgYG5ldyBEb2xsaG91c2VDb250YWluZXIoKWAgZm9yIHByb2R1Y3Rpb24gb3JcbiAgICogICAgICAgICAgICAgICAgICBgY3JlYXRlSW50ZWdyYXRpb25Db250YWluZXIoKS5jb250YWluZXJgIGZvciB0ZXN0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lcjogRG9sbGhvdXNlQ29udGFpbmVyKSB7XG4gICAgLy8gQnVpbGQgY2FwYWJpbGl0aWVzIG9iamVjdCBjb25kaXRpb25hbGx5IGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAgICAvLyBSZXNvdXJjZXMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQgKGFkdmVydGlzZV9yZXNvdXJjZXM6IGZhbHNlKVxuICAgIGNvbnN0IGNhcGFiaWxpdGllczogYW55ID0ge1xuICAgICAgdG9vbHM6IHt9LFxuICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiByZXNvdXJjZXMgc2hvdWxkIGJlIGFkdmVydGlzZWRcbiAgICAvLyBUaGlzIGlzIGEgZnV0dXJlLXByb29mIGltcGxlbWVudGF0aW9uIC0gcmVzb3VyY2VzIGFyZSBvcHQtaW5cbiAgICB0cnkge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBDb25maWdNYW5hZ2VyIHRvIGNoZWNrIHJlc291cmNlIHNldHRpbmdzXG4gICAgICAvLyBOb3RlOiBDb25maWcgbWF5IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZCB5ZXQsIHNvIHdlIGNoZWNrIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIElmIGNvbmZpZyBpcyBub3QgaW5pdGlhbGl6ZWQsIGRlZmF1bHRzIChhZHZlcnRpc2VfcmVzb3VyY2VzOiBmYWxzZSkgYXBwbHlcbiAgICAgIGNvbnN0IGZpbGVMb2NrTWFuYWdlciA9IG5ldyBGaWxlTG9ja01hbmFnZXIoKTtcbiAgICAgIGNvbnN0IGZpbGVPcGVyYXRpb25zID0gbmV3IEZpbGVPcGVyYXRpb25zU2VydmljZShmaWxlTG9ja01hbmFnZXIpO1xuICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IG5ldyBDb25maWdNYW5hZ2VyKGZpbGVPcGVyYXRpb25zLCBvcyk7XG4gICAgICBjb25zdCByZXNvdXJjZXNDb25maWcgPSBjb25maWdNYW5hZ2VyLmdldFNldHRpbmc8YW55PignZWxlbWVudHMuZW5oYW5jZWRfaW5kZXgucmVzb3VyY2VzJyk7XG5cbiAgICAgIGlmIChyZXNvdXJjZXNDb25maWc/LmFkdmVydGlzZV9yZXNvdXJjZXMgPT09IHRydWUpIHtcbiAgICAgICAgY2FwYWJpbGl0aWVzLnJlc291cmNlcyA9IHt9O1xuICAgICAgICBsb2dnZXIuaW5mbygnW0RvbGxob3VzZU1DUF0gTUNQIFJlc291cmNlcyBjYXBhYmlsaXR5IGFkdmVydGlzZWQgKGVuYWJsZWQgdmlhIGNvbmZpZyknKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbRG9sbGhvdXNlTUNQXSBNQ1AgUmVzb3VyY2VzIGNhcGFiaWxpdHkgTk9UIGFkdmVydGlzZWQgKGRpc2FibGVkIGJ5IGRlZmF1bHQpJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIENvbmZpZyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gdXNlIHNhZmUgZGVmYXVsdCAobm8gcmVzb3VyY2VzKVxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbRG9sbGhvdXNlTUNQXSBDb25maWcgbm90IGluaXRpYWxpemVkIHlldCwgcmVzb3VyY2VzIGNhcGFiaWxpdHkgZGlzYWJsZWQgYnkgZGVmYXVsdDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2ZXIgPSBuZXcgU2VydmVyKFxuICAgICAge1xuICAgICAgICBuYW1lOiBcImRvbGxob3VzZW1jcFwiLFxuICAgICAgICB2ZXJzaW9uOiBQQUNLQUdFX1ZFUlNJT04sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjYXBhYmlsaXRpZXMsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMucGVyc29uYXNEaXIgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudFVzZXIgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUiB8fCBudWxsO1xuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICB9XG4gIFxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVQb3J0Zm9saW8oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jb250YWluZXIucHJlcGFyZVBvcnRmb2xpbygpO1xuICAgIHRoaXMucGVyc29uYXNEaXIgPSB0aGlzLmNvbnRhaW5lci5nZXRQZXJzb25hc0RpcigpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ29tcGxldGUgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgcG9ydGZvbGlvIGlzIHJlYWR5XG4gICAqIEZJWCAjNjEwOiBUaGlzIHdhcyBwcmV2aW91c2x5IGluIGEgLnRoZW4oKSBjYWxsYmFjayBpbiB0aGUgY29uc3RydWN0b3JcbiAgICogTm93IGNhbGxlZCBzeW5jaHJvbm91c2x5IGZyb20gcnVuKCkgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb21wbGV0ZUluaXRpYWxpemF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENyZWF0ZSBoYW5kbGVycyB3aXRoIHNlcnZlciBpbnN0YW5jZSAtIGFsbCBzdGF0ZSBtYW5hZ2VkIGJ5IHNlcnZpY2VzXG4gICAgY29uc3QgaGFuZGxlcnMgPSBhd2FpdCB0aGlzLmNvbnRhaW5lci5jcmVhdGVIYW5kbGVycyh0aGlzLnNlcnZlcik7XG5cbiAgICB0aGlzLnBlcnNvbmFIYW5kbGVyID0gaGFuZGxlcnMucGVyc29uYUhhbmRsZXI7XG4gICAgdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIgPSBoYW5kbGVycy5lbGVtZW50Q3J1ZEhhbmRsZXI7XG4gICAgdGhpcy5jb2xsZWN0aW9uSGFuZGxlciA9IGhhbmRsZXJzLmNvbGxlY3Rpb25IYW5kbGVyO1xuICAgIHRoaXMucG9ydGZvbGlvSGFuZGxlciA9IGhhbmRsZXJzLnBvcnRmb2xpb0hhbmRsZXI7XG4gICAgdGhpcy5naXRodWJBdXRoSGFuZGxlciA9IGhhbmRsZXJzLmdpdGh1YkF1dGhIYW5kbGVyO1xuICAgIHRoaXMuZGlzcGxheUNvbmZpZ0hhbmRsZXIgPSBoYW5kbGVycy5kaXNwbGF5Q29uZmlnSGFuZGxlcjtcbiAgICB0aGlzLmlkZW50aXR5SGFuZGxlciA9IGhhbmRsZXJzLmlkZW50aXR5SGFuZGxlcjtcbiAgICB0aGlzLmNvbmZpZ0hhbmRsZXIgPSBoYW5kbGVycy5jb25maWdIYW5kbGVyO1xuICAgIHRoaXMuc3luY0hhbmRsZXIgPSBoYW5kbGVycy5zeW5jSGFuZGxlcjtcbiAgICB0aGlzLnRvb2xSZWdpc3RyeSA9IGhhbmRsZXJzLnRvb2xSZWdpc3RyeTtcbiAgICB0aGlzLmVuaGFuY2VkSW5kZXhIYW5kbGVyID0gaGFuZGxlcnMuZW5oYW5jZWRJbmRleEhhbmRsZXI7XG5cbiAgICAvLyBJbml0aWFsaXplIGFuZCByZWdpc3RlciByZXNvdXJjZSBoYW5kbGVyc1xuICAgIC8vIFJlc291cmNlcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgcmVxdWlyZSBleHBsaWNpdCBjb25maWd1cmF0aW9uXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVzb3VyY2VIYW5kbGVycygpO1xuXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIE1DUCBSZXNvdXJjZXMgaGFuZGxlcnMgaWYgZW5hYmxlZCBpbiBjb25maWd1cmF0aW9uXG4gICAqIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSBvdGhlciBoYW5kbGVycyBiZWNhdXNlIGl0IHJlcXVpcmVzIGR5bmFtaWMgaW1wb3J0XG4gICAqIGFuZCBjb25kaXRpb25hbCByZWdpc3RyYXRpb24gYmFzZWQgb24gY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplUmVzb3VyY2VIYW5kbGVycygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBSZXNvdXJjZUhhbmRsZXIgfSA9IGF3YWl0IGltcG9ydCgnLi9oYW5kbGVycy9SZXNvdXJjZUhhbmRsZXIuanMnKTtcbiAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSB0aGlzLmNvbnRhaW5lci5yZXNvbHZlPENvbmZpZ01hbmFnZXI+KCdDb25maWdNYW5hZ2VyJyk7XG5cbiAgICAgIHRoaXMucmVzb3VyY2VIYW5kbGVyID0gbmV3IFJlc291cmNlSGFuZGxlcihjb25maWdNYW5hZ2VyKTtcbiAgICAgIGF3YWl0IHRoaXMucmVzb3VyY2VIYW5kbGVyLmluaXRpYWxpemUodGhpcy5zZXJ2ZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBSZXNvdXJjZXMgYXJlIG9wdGlvbmFsIC0gZG9uJ3QgZmFpbCBzZXJ2ZXIgc3RhcnR1cCBpZiB0aGV5IGNhbid0IGJlIGluaXRpYWxpemVkXG4gICAgICBsb2dnZXIud2FybignW0RvbGxob3VzZU1DUF0gRmFpbGVkIHRvIGluaXRpYWxpemUgcmVzb3VyY2UgaGFuZGxlcnMsIGNvbnRpbnVpbmcgd2l0aG91dCByZXNvdXJjZXMnKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgUmVzb3VyY2UgaW5pdGlhbGl6YXRpb24gZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRW5zdXJlIHNlcnZlciBpcyBpbml0aWFsaXplZCBiZWZvcmUgYW55IG9wZXJhdGlvblxuICAgKiBGSVggIzYxMDogQWRkZWQgZm9yIHRlc3QgY29tcGF0aWJpbGl0eSAtIHRlc3RzIGRvbid0IGNhbGwgcnVuKClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlSW5pdGlhbGl6ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBpbml0aWFsaXphdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3YWl0IGZvciBpdFxuICAgIGlmICh0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIFN0YXJ0IGluaXRpYWxpemF0aW9uXG4gICAgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUG9ydGZvbGlvKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVJbml0aWFsaXphdGlvbigpO1xuICAgICAgICBsb2dnZXIuaW5mbyhcIlBvcnRmb2xpbyBhbmQgcGVyc29uYXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5IChsYXp5KVwiKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmVuc3VyZUluaXRpYWxpemVkJywgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICB9XG4gIFxuICAvLyBUb29sIGhhbmRsZXIgbWV0aG9kcyAtIG5vdyBwdWJsaWMgZm9yIGFjY2VzcyBmcm9tIHRvb2wgbW9kdWxlc1xuICBcbiAgYXN5bmMgbGlzdFBlcnNvbmFzKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEubGlzdFBlcnNvbmFzKCk7XG4gIH1cblxuICAvLyBVc2UgYWN0aXZhdGVFbGVtZW50KG5hbWUsICdwZXJzb25hJyksIGRlYWN0aXZhdGVFbGVtZW50KG5hbWUsICdwZXJzb25hJyksXG4gIC8vIGdldEFjdGl2ZUVsZW1lbnRzKCdwZXJzb25hJyksIGFuZCBnZXRFbGVtZW50RGV0YWlscyhuYW1lLCAncGVyc29uYScpIGluc3RlYWQuXG4gIC8vIFRoZXNlIHdlcmUgcmVtb3ZlZCB0byBub3JtYWxpemUgcGVyc29uYSBoYW5kbGluZyB0aHJvdWdoIHRoZSBnZW5lcmljIGVsZW1lbnQgQVBJLlxuXG4gIGFzeW5jIHJlbG9hZFBlcnNvbmFzKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEucmVsb2FkUGVyc29uYXMoKTtcbiAgfVxuXG4gIC8vID09PT09IEVsZW1lbnQgTWV0aG9kcyAoR2VuZXJpYyBmb3IgYWxsIGVsZW1lbnQgdHlwZXMpID09PT09XG4gIFxuICBhc3luYyBsaXN0RWxlbWVudHModHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSBFbGVtZW50VHlwZS5QRVJTT05BKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RQZXJzb25hcygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5saXN0RWxlbWVudHMobm9ybWFsaXplZFR5cGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0RvbGxob3VzZU1DUFNlcnZlci5saXN0RWxlbWVudHMnLCBlcnJvciwgeyB0eXBlIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBsaXN0ICR7dHlwZX06ICR7RXJyb3JIYW5kbGVyLmdldFVzZXJNZXNzYWdlKGVycm9yKX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyODEgLSBSb3V0ZSBhbGwgZWxlbWVudCB0eXBlcyB0aHJvdWdoIGVsZW1lbnRDUlVESGFuZGxlclxuICAgICAgLy8gUGVyc29uYUhhbmRsZXIuYWN0aXZhdGVQZXJzb25hIGlzIGRlcHJlY2F0ZWQ7IFBlcnNvbmFBY3RpdmF0aW9uU3RyYXRlZ3kgaGFuZGxlcyBwZXJzb25hc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLmFjdGl2YXRlRWxlbWVudChuYW1lLCBub3JtYWxpemVkVHlwZSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmFjdGl2YXRlRWxlbWVudCcsIGVycm9yLCB7IHR5cGUsIG5hbWUgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOiAke0Vycm9ySGFuZGxlci5nZXRVc2VyTWVzc2FnZShlcnJvcil9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGdldEFjdGl2ZUVsZW1lbnRzKHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyODEgLSBSb3V0ZSBhbGwgZWxlbWVudCB0eXBlcyB0aHJvdWdoIGVsZW1lbnRDUlVESGFuZGxlclxuICAgICAgLy8gUGVyc29uYUhhbmRsZXIuZ2V0QWN0aXZlUGVyc29uYSBpcyBkZXByZWNhdGVkOyBQZXJzb25hQWN0aXZhdGlvblN0cmF0ZWd5IGhhbmRsZXMgcGVyc29uYXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5nZXRBY3RpdmVFbGVtZW50cyhub3JtYWxpemVkVHlwZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmdldEFjdGl2ZUVsZW1lbnRzJywgZXJyb3IsIHsgdHlwZSB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSAke3R5cGV9OiAke0Vycm9ySGFuZGxlci5nZXRVc2VyTWVzc2FnZShlcnJvcil9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGRlYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI4MSAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyXG4gICAgICAvLyBQZXJzb25hSGFuZGxlci5kZWFjdGl2YXRlUGVyc29uYSBpcyBkZXByZWNhdGVkOyBQZXJzb25hQWN0aXZhdGlvblN0cmF0ZWd5IGhhbmRsZXMgcGVyc29uYXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5kZWFjdGl2YXRlRWxlbWVudChuYW1lLCBub3JtYWxpemVkVHlwZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmRlYWN0aXZhdGVFbGVtZW50JywgZXJyb3IsIHsgdHlwZSwgbmFtZSB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZGVhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzogJHtFcnJvckhhbmRsZXIuZ2V0VXNlck1lc3NhZ2UoZXJyb3IpfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBnZXRFbGVtZW50RGV0YWlscyhuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIC8vIEZJWDogSXNzdWUgIzI3NiAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgLy8gUGVyc29uYUhhbmRsZXIuZ2V0UGVyc29uYURldGFpbHMgaXMgZGVwcmVjYXRlZDsgUGVyc29uYUFjdGl2YXRpb25TdHJhdGVneSBoYW5kbGVzIHBlcnNvbmFzXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5nZXRFbGVtZW50RGV0YWlscyhuYW1lLCBub3JtYWxpemVkVHlwZSk7XG4gIH1cbiAgXG4gIGFzeW5jIHJlbG9hZEVsZW1lbnRzKHR5cGU6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLnJlbG9hZEVsZW1lbnRzKHR5cGUpO1xuICB9XG5cbiAgLy8gRWxlbWVudC1zcGVjaWZpYyBtZXRob2RzXG4gIGFzeW5jIHJlbmRlclRlbXBsYXRlKG5hbWU6IHN0cmluZywgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEucmVuZGVyVGVtcGxhdGUobmFtZSwgdmFyaWFibGVzKTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudChuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5leGVjdXRlQWdlbnQobmFtZSwgcGFyYW1ldGVycyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZWxlbWVudCBpbiB0aGUgcG9ydGZvbGlvLlxuICAgKiBAcGFyYW0gYXJncy5lbGVtZW50cyAtIEZvciBlbnNlbWJsZXM6IGFycmF5IG9mIGVsZW1lbnQgcmVmZXJlbmNlcyAoSXNzdWUgIzI3OClcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nOyBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGVsZW1lbnRzPzogRW5zZW1ibGVFbGVtZW50W119KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIC8vIEZJWDogSXNzdWUgIzIwIC0gUmVtb3ZlIHBlcnNvbmEgc3BlY2lhbCBjYXNlLCByb3V0ZSBhbGwgZWxlbWVudCBjcmVhdGlvbiB0aHJvdWdoIEVsZW1lbnRDUlVESGFuZGxlclxuICAgIC8vIFRoaXMgZW5zdXJlcyBjb25zaXN0ZW50IGR1cGxpY2F0ZSBjaGVja2luZyBhbmQgZXJyb3IgaGFuZGxpbmcgZm9yIGFsbCBlbGVtZW50IHR5cGVzXG4gICAgLy8gRklYOiBJc3N1ZSAjMjc4IC0gU3VwcG9ydCBlbGVtZW50cyBwYXJhbWV0ZXIgZm9yIGVuc2VtYmxlc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKGFyZ3MudHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5jcmVhdGVFbGVtZW50KHsuLi5hcmdzLCB0eXBlOiBub3JtYWxpemVkVHlwZX0pO1xuICB9XG5cbiAgYXN5bmMgZWRpdEVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj59KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIC8vIEZJWDogSXNzdWUgIzI3NiAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgLy8gUGVyc29uYUhhbmRsZXIuZWRpdFBlcnNvbmEgaXMgZGVwcmVjYXRlZDsgZWxlbWVudENSVURIYW5kbGVyIGhhbmRsZXMgcGVyc29uYXMgdmlhIFBlcnNvbmFBY3RpdmF0aW9uU3RyYXRlZ3lcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5ub3JtYWxpemVFbGVtZW50VHlwZShhcmdzLnR5cGUpO1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEuZWRpdEVsZW1lbnQoey4uLmFyZ3MsIHR5cGU6IG5vcm1hbGl6ZWRUeXBlfSk7XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBzdHJpY3Q/OiBib29sZWFufSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICAvLyBGSVg6IElzc3VlICMyNzYgLSBSb3V0ZSBhbGwgZWxlbWVudCB0eXBlcyB0aHJvdWdoIGVsZW1lbnRDUlVESGFuZGxlciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgIC8vIFBlcnNvbmFIYW5kbGVyLnZhbGlkYXRlUGVyc29uYSBpcyBkZXByZWNhdGVkOyBlbGVtZW50Q1JVREhhbmRsZXIgaGFuZGxlcyBwZXJzb25hc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKGFyZ3MudHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS52YWxpZGF0ZUVsZW1lbnQoey4uLmFyZ3MsIHR5cGU6IG5vcm1hbGl6ZWRUeXBlfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZGVsZXRlRGF0YT86IGJvb2xlYW59KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIC8vIEZJWDogSXNzdWUgIzI3NiAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgLy8gUGVyc29uYUhhbmRsZXIuZGVsZXRlUGVyc29uYSBpcyBkZXByZWNhdGVkOyBlbGVtZW50Q1JVREhhbmRsZXIgaGFuZGxlcyBwZXJzb25hcyB2aWEgZGVkaWNhdGVkIGRlbGV0ZSBwYXRoXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUoYXJncy50eXBlKTtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLmRlbGV0ZUVsZW1lbnQoey4uLmFyZ3MsIHR5cGU6IG5vcm1hbGl6ZWRUeXBlfSk7XG4gIH1cblxuICBhc3luYyBicm93c2VDb2xsZWN0aW9uKHNlY3Rpb24/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLmJyb3dzZUNvbGxlY3Rpb24oc2VjdGlvbiwgdHlwZSk7XG4gIH1cblxuICBhc3luYyBzZWFyY2hDb2xsZWN0aW9uKHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLnNlYXJjaENvbGxlY3Rpb24ocXVlcnkpO1xuICB9XG5cbiAgYXN5bmMgc2VhcmNoQ29sbGVjdGlvbkVuaGFuY2VkKHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5zZWFyY2hDb2xsZWN0aW9uRW5oYW5jZWQocXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q29sbGVjdGlvbkNvbnRlbnQocGF0aDogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5nZXRDb2xsZWN0aW9uQ29udGVudChwYXRoKTtcbiAgfVxuXG4gIGFzeW5jIGluc3RhbGxDb250ZW50KGlucHV0UGF0aDogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5pbnN0YWxsQ29udGVudChpbnB1dFBhdGgpO1xuICB9XG5cbiAgYXN5bmMgc3VibWl0Q29udGVudChjb250ZW50SWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5zdWJtaXRDb250ZW50KGNvbnRlbnRJZGVudGlmaWVyKTtcbiAgfVxuXG4gIGFzeW5jIGdldENvbGxlY3Rpb25DYWNoZUhlYWx0aCgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLmdldENvbGxlY3Rpb25DYWNoZUhlYWx0aCgpO1xuICB9XG5cbiAgLy8gVXNlciBpZGVudGl0eSBtYW5hZ2VtZW50IC0gZGVsZWdhdGVkIHRvIElkZW50aXR5SGFuZGxlclxuICBhc3luYyBzZXRVc2VySWRlbnRpdHkodXNlcm5hbWU6IHN0cmluZywgZW1haWw/OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlIYW5kbGVyIS5zZXRVc2VySWRlbnRpdHkodXNlcm5hbWUsIGVtYWlsKTtcbiAgfVxuXG4gIGFzeW5jIGdldFVzZXJJZGVudGl0eSgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlIYW5kbGVyIS5nZXRVc2VySWRlbnRpdHkoKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyVXNlcklkZW50aXR5KCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eUhhbmRsZXIhLmNsZWFyVXNlcklkZW50aXR5KCk7XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eUhhbmRsZXIhLmdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTtcbiAgfVxuXG4gIC8vIEdpdEh1YiBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50XG4gIGFzeW5jIHNldHVwR2l0SHViQXV0aCgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2l0aHViQXV0aEhhbmRsZXIhLnNldHVwR2l0SHViQXV0aCgpO1xuICB9XG4gIFxuICBhc3luYyBjaGVja0dpdEh1YkF1dGgoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmdpdGh1YkF1dGhIYW5kbGVyIS5jaGVja0dpdEh1YkF1dGgoKTtcbiAgfVxuICBcbiAgYXN5bmMgZ2V0T0F1dGhIZWxwZXJTdGF0dXModmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmdpdGh1YkF1dGhIYW5kbGVyIS5nZXRPQXV0aEhlbHBlclN0YXR1cyh2ZXJib3NlKTtcbiAgfVxuICBcblxuICBcbiAgYXN5bmMgY2xlYXJHaXRIdWJBdXRoKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5naXRodWJBdXRoSGFuZGxlciEuY2xlYXJHaXRIdWJBdXRoKCk7XG4gIH1cblxuICAvLyBPQXV0aCBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnRcbiAgYXN5bmMgY29uZmlndXJlT0F1dGgoY2xpZW50X2lkPzogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmdpdGh1YkF1dGhIYW5kbGVyIS5jb25maWd1cmVPQXV0aChjbGllbnRfaWQpO1xuICB9XG5cblxuXG5cblxuXG5cblxuXG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBpbmRpY2F0b3Igc2V0dGluZ3MgKGRlbGVnYXRlZCB0byBEaXNwbGF5Q29uZmlnSGFuZGxlcilcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUluZGljYXRvcihjb25maWc6IFBhcnRpYWw8SW5kaWNhdG9yQ29uZmlnPikge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5Q29uZmlnSGFuZGxlciEuY29uZmlndXJlSW5kaWNhdG9yKGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgaW5kaWNhdG9yIGNvbmZpZ3VyYXRpb24gKGRlbGVnYXRlZCB0byBEaXNwbGF5Q29uZmlnSGFuZGxlcilcbiAgICovXG4gIGFzeW5jIGdldEluZGljYXRvckNvbmZpZygpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheUNvbmZpZ0hhbmRsZXIhLmdldEluZGljYXRvckNvbmZpZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gc2V0dGluZ3MgKGRlbGVnYXRlZCB0byBDb2xsZWN0aW9uSGFuZGxlcilcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUNvbGxlY3Rpb25TdWJtaXNzaW9uKGF1dG9TdWJtaXQ6IGJvb2xlYW4pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLmNvbmZpZ3VyZUNvbGxlY3Rpb25TdWJtaXNzaW9uKGF1dG9TdWJtaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gY29uZmlndXJhdGlvbiAoZGVsZWdhdGVkIHRvIENvbGxlY3Rpb25IYW5kbGVyKVxuICAgKi9cbiAgYXN5bmMgZ2V0Q29sbGVjdGlvblN1Ym1pc3Npb25Db25maWcoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5nZXRDb2xsZWN0aW9uU3VibWlzc2lvbkNvbmZpZygpO1xuICB9XG5cblxuICAvKipcbiAgICogRXhwb3J0IGEgc2luZ2xlIHBlcnNvbmFcbiAgICovXG4gIGFzeW5jIGV4cG9ydFBlcnNvbmEocGVyc29uYU5hbWU6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEuZXhwb3J0UGVyc29uYShwZXJzb25hTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGFsbCBwZXJzb25hc1xuICAgKi9cbiAgYXN5bmMgZXhwb3J0QWxsUGVyc29uYXMoaW5jbHVkZURlZmF1bHRzID0gdHJ1ZSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEuZXhwb3J0QWxsUGVyc29uYXMoaW5jbHVkZURlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYSBwZXJzb25hXG4gICAqL1xuICBhc3luYyBpbXBvcnRQZXJzb25hKHNvdXJjZTogc3RyaW5nLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEuaW1wb3J0UGVyc29uYShzb3VyY2UsIG92ZXJ3cml0ZSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBQb3J0Zm9saW8gbWFuYWdlbWVudCBtZXRob2RzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDaGVjayBwb3J0Zm9saW8gc3RhdHVzIGluY2x1ZGluZyByZXBvc2l0b3J5IGV4aXN0ZW5jZSBhbmQgc3luYyBpbmZvcm1hdGlvblxuICAgKi9cbiAgYXN5bmMgcG9ydGZvbGlvU3RhdHVzKHVzZXJuYW1lPzogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb0hhbmRsZXIhLnBvcnRmb2xpb1N0YXR1cyh1c2VybmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhIG5ldyBHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcnlcbiAgICovXG4gIGFzeW5jIGluaXRQb3J0Zm9saW8ob3B0aW9uczoge3JlcG9zaXRvcnlOYW1lPzogc3RyaW5nOyBwcml2YXRlPzogYm9vbGVhbjsgZGVzY3JpcHRpb24/OiBzdHJpbmd9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb0hhbmRsZXIhLmluaXRQb3J0Zm9saW8ob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIHBvcnRmb2xpbyBzZXR0aW5nc1xuICAgKi9cbiAgYXN5bmMgcG9ydGZvbGlvQ29uZmlnKG9wdGlvbnM6IHthdXRvU3luYz86IGJvb2xlYW47IGRlZmF1bHRWaXNpYmlsaXR5Pzogc3RyaW5nOyBhdXRvU3VibWl0PzogYm9vbGVhbjsgcmVwb3NpdG9yeU5hbWU/OiBzdHJpbmd9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb0hhbmRsZXIhLnBvcnRmb2xpb0NvbmZpZyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIHBvcnRmb2xpbyB3aXRoIEdpdEh1YlxuICAgKi9cbiAgYXN5bmMgc3luY1BvcnRmb2xpbyhvcHRpb25zOiB7XG4gICAgZGlyZWN0aW9uOiBzdHJpbmc7XG4gICAgbW9kZT86IHN0cmluZztcbiAgICBmb3JjZTogYm9vbGVhbjtcbiAgICBkcnlSdW46IGJvb2xlYW47XG4gICAgY29uZmlybURlbGV0aW9ucz86IGJvb2xlYW47XG4gIH0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGZvbGlvSGFuZGxlciEuc3luY1BvcnRmb2xpbyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY29uZmlndXJhdGlvbiBvcGVyYXRpb25zIC0gZGVsZWdhdGVzIHRvIENvbmZpZ0hhbmRsZXJcbiAgKi9cbiAgYXN5bmMgaGFuZGxlQ29uZmlnT3BlcmF0aW9uKG9wdGlvbnM6IGFueSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWdIYW5kbGVyIS5oYW5kbGVDb25maWdPcGVyYXRpb24ob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN5bmMgb3BlcmF0aW9ucyAtIGRlbGVnYXRlcyB0byBTeW5jSGFuZGxlclxuICAgKi9cbiAgYXN5bmMgaGFuZGxlU3luY09wZXJhdGlvbihvcHRpb25zOiBhbnkpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuc3luY0hhbmRsZXIhLmhhbmRsZVN5bmNPcGVyYXRpb24ob3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY29udGFpbmVyLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggbG9jYWwgcG9ydGZvbGlvIHVzaW5nIHRoZSBtZXRhZGF0YSBpbmRleCBzeXN0ZW1cbiAgICogVGhpcyBwcm92aWRlcyBmYXN0LCBjb21wcmVoZW5zaXZlIHNlYXJjaCBhY3Jvc3MgYWxsIGVsZW1lbnQgdHlwZXNcbiAgICovXG4gIGFzeW5jIHNlYXJjaFBvcnRmb2xpbyhvcHRpb25zOiB7XG4gICAgcXVlcnk6IHN0cmluZzsgXG4gICAgZWxlbWVudFR5cGU/OiBzdHJpbmc7IFxuICAgIGZ1enp5TWF0Y2g/OiBib29sZWFuOyBcbiAgICBtYXhSZXN1bHRzPzogbnVtYmVyOyBcbiAgICBpbmNsdWRlS2V5d29yZHM/OiBib29sZWFuOyBcbiAgICBpbmNsdWRlVGFncz86IGJvb2xlYW47IFxuICAgIGluY2x1ZGVUcmlnZ2Vycz86IGJvb2xlYW47IFxuICAgIGluY2x1ZGVEZXNjcmlwdGlvbnM/OiBib29sZWFuO1xuICB9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb0hhbmRsZXIhLnNlYXJjaFBvcnRmb2xpbyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggYWNyb3NzIGFsbCBzb3VyY2VzIChsb2NhbCwgR2l0SHViLCBjb2xsZWN0aW9uKSB1c2luZyBVbmlmaWVkSW5kZXhNYW5hZ2VyXG4gICAqIFRoaXMgcHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBzZWFyY2ggd2l0aCBkdXBsaWNhdGUgZGV0ZWN0aW9uIGFuZCB2ZXJzaW9uIGNvbXBhcmlzb25cbiAgICovXG4gIGFzeW5jIHNlYXJjaEFsbChvcHRpb25zOiB7XG4gICAgcXVlcnk6IHN0cmluZztcbiAgICBzb3VyY2VzPzogc3RyaW5nW107XG4gICAgZWxlbWVudFR5cGU/OiBzdHJpbmc7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBwYWdlU2l6ZT86IG51bWJlcjtcbiAgICBzb3J0Qnk/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGZvbGlvSGFuZGxlciEuc2VhcmNoQWxsKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgc2VtYW50aWNhbGx5IHNpbWlsYXIgZWxlbWVudHMgdXNpbmcgRW5oYW5jZWQgSW5kZXhcbiAgICovXG4gIGFzeW5jIGZpbmRTaW1pbGFyRWxlbWVudHMob3B0aW9uczoge1xuICAgIGVsZW1lbnROYW1lOiBzdHJpbmc7XG4gICAgZWxlbWVudFR5cGU/OiBzdHJpbmc7XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgfSkge1xuICAgIHJldHVybiB0aGlzLmVuaGFuY2VkSW5kZXhIYW5kbGVyIS5maW5kU2ltaWxhckVsZW1lbnRzKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmVsYXRpb25zaGlwcyBmb3IgYSBzcGVjaWZpYyBlbGVtZW50XG4gICAqL1xuICBhc3luYyBnZXRFbGVtZW50UmVsYXRpb25zaGlwcyhvcHRpb25zOiB7XG4gICAgZWxlbWVudE5hbWU6IHN0cmluZztcbiAgICBlbGVtZW50VHlwZT86IHN0cmluZztcbiAgICByZWxhdGlvbnNoaXBUeXBlcz86IHN0cmluZ1tdO1xuICB9KSB7XG4gICAgcmV0dXJuIHRoaXMuZW5oYW5jZWRJbmRleEhhbmRsZXIhLmdldEVsZW1lbnRSZWxhdGlvbnNoaXBzKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBmb3IgZWxlbWVudHMgYnkgYWN0aW9uIHZlcmJcbiAgICovXG4gIGFzeW5jIHNlYXJjaEJ5VmVyYihvcHRpb25zOiB7XG4gICAgdmVyYjogc3RyaW5nO1xuICAgIGxpbWl0OiBudW1iZXI7XG4gIH0pIHtcbiAgICByZXR1cm4gdGhpcy5lbmhhbmNlZEluZGV4SGFuZGxlciEuc2VhcmNoQnlWZXJiKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdGF0aXN0aWNzIGFib3V0IEVuaGFuY2VkIEluZGV4IHJlbGF0aW9uc2hpcHNcbiAgICovXG4gIGFzeW5jIGdldFJlbGF0aW9uc2hpcFN0YXRzKCkge1xuICAgIHJldHVybiB0aGlzLmVuaGFuY2VkSW5kZXhIYW5kbGVyIS5nZXRSZWxhdGlvbnNoaXBTdGF0cygpO1xuICB9XG5cbiAgYXN5bmMgcnVuKCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIkRvbGxob3VzZU1DUFNlcnZlci5ydW4oKSBzdGFydGVkXCIpO1xuICAgIGxvZ2dlci5pbmZvKFwiU3RhcnRpbmcgRG9sbGhvdXNlTUNQIHNlcnZlci4uLlwiKTtcblxuICAgIGNvbnN0IHRpbWVyID0gdGhpcy5jb250YWluZXIucmVzb2x2ZTxTdGFydHVwVGltZXI+KCdTdGFydHVwVGltZXInKTtcblxuICAgIC8vIElzc3VlICM3MDY6IENyaXRpY2FsIHBhdGggb25seSDigJQgZ2V0IHRvIGNvbm5lY3QoKSBhcyBmYXN0IGFzIHBvc3NpYmxlXG4gICAgLy8gTm9uLWNyaXRpY2FsIHdvcmsgKG1lbW9yeSBhdXRvLWxvYWQsIGFjdGl2YXRpb24gcmVzdG9yZSwgZXRjLikgaXNcbiAgICAvLyBkZWZlcnJlZCB0byBjb21wbGV0ZURlZmVycmVkU2V0dXAoKSB3aGljaCBydW5zIHBvc3QtY29ubmVjdC5cbiAgICB0cnkge1xuICAgICAgdGltZXIuc3RhcnRQaGFzZSgncG9ydGZvbGlvX3ByZXBhcmUnLCB0cnVlKTtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVBvcnRmb2xpbygpO1xuICAgICAgdGltZXIuZW5kUGhhc2UoJ3BvcnRmb2xpb19wcmVwYXJlJyk7XG5cbiAgICAgIHRpbWVyLnN0YXJ0UGhhc2UoJ2hhbmRsZXJfY3JlYXRpb24nLCB0cnVlKTtcbiAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVJbml0aWFsaXphdGlvbigpO1xuICAgICAgdGltZXIuZW5kUGhhc2UoJ2hhbmRsZXJfY3JlYXRpb24nKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBvcGVyYXRpb25hbCB0ZWxlbWV0cnkgKGFzeW5jLCBub24tYmxvY2tpbmcsIG5ldmVyIHRocm93cylcbiAgICAgIGNvbnN0IG9wZXJhdGlvbmFsVGVsZW1ldHJ5ID0gdGhpcy5jb250YWluZXIucmVzb2x2ZTxPcGVyYXRpb25hbFRlbGVtZXRyeT4oJ09wZXJhdGlvbmFsVGVsZW1ldHJ5Jyk7XG4gICAgICBvcGVyYXRpb25hbFRlbGVtZXRyeS5pbml0aWFsaXplKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBUZWxlbWV0cnkgZXJyb3JzIGFyZSBsb2dnZWQgaW50ZXJuYWxseSwgc2FmZSB0byBpZ25vcmUgaGVyZVxuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKFwiUG9ydGZvbGlvIGFuZCBwZXJzb25hcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHlcIik7XG5cbiAgICAgIGlmICghZW52LkRPTExIT1VTRV9HQVRFS0VFUEVSX0VOQUJMRUQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCLimqDvuI8gIEdhdGVrZWVwZXIgaXMgRElTQUJMRUQgKERPTExIT1VTRV9HQVRFS0VFUEVSX0VOQUJMRUQ9ZmFsc2UpLiBBbGwgcGVybWlzc2lvbiBjaGVja3MgYXJlIGJ5cGFzc2VkLlwiKTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oXCJEb2xsaG91c2VNQ1Agc2VydmVyIHJlYWR5IC0gd2FpdGluZyBmb3IgTUNQIGNvbm5lY3Rpb24gb24gc3RkaW9cIik7XG4gICAgICBsb2dnZXIuZGVidWcoXCJEb2xsaG91c2VNQ1BTZXJ2ZXIucnVuKCkgY29tcGxldGVkIGluaXRpYWxpemF0aW9uXCIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0RvbGxob3VzZU1DUFNlcnZlci5ydW4uaW5pdGlhbGl6YXRpb24nLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgdG8gcHJldmVudCBzZXJ2ZXIgZnJvbSBzdGFydGluZyB3aXRoIGluY29tcGxldGUgaW5pdGlhbGl6YXRpb25cbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgU3RkaW9TZXJ2ZXJUcmFuc3BvcnQoKTtcblxuICAgIC8vIFNldCB1cCBncmFjZWZ1bCBzaHV0ZG93biBoYW5kbGVyc1xuICAgIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhcIlNodXR0aW5nIGRvd24gRG9sbGhvdXNlTUNQIHNlcnZlci4uLlwiKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb250YWluZXIuZGlzcG9zZSgpO1xuICAgICAgICBsb2dnZXIuaW5mbyhcIkNsZWFudXAgY29tcGxldGVkXCIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgZHVyaW5nIGNsZWFudXBcIiwgeyBlcnJvciB9KTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH07XG5cbiAgICAvLyBSZWdpc3RlciBzaHV0ZG93biBoYW5kbGVyc1xuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIGNsZWFudXApO1xuICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBjbGVhbnVwKTtcbiAgICBwcm9jZXNzLm9uKCdTSUdIVVAnLCBjbGVhbnVwKTtcblxuICAgIC8vIENvbm5lY3QgQVNBUCDigJQgdG9vbHMgYXJlIHJlZ2lzdGVyZWQsIHNlcnZlciBjYW4gYWNjZXB0IHJlcXVlc3RzXG4gICAgdGltZXIuc3RhcnRQaGFzZSgnbWNwX2Nvbm5lY3QnLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLnNlcnZlci5jb25uZWN0KHRyYW5zcG9ydCk7XG4gICAgdGltZXIuZW5kUGhhc2UoJ21jcF9jb25uZWN0Jyk7XG4gICAgdGltZXIubWFya0Nvbm5lY3QoKTtcblxuICAgIC8vIE1hcmsgdGhhdCBNQ1AgaXMgbm93IGNvbm5lY3RlZCAtIG5vIG1vcmUgY29uc29sZSBvdXRwdXQgYWxsb3dlZFxuICAgIGxvZ2dlci5zZXRNQ1BDb25uZWN0ZWQoKTtcblxuICAgIC8vIElzc3VlICM3MDYgUGhhc2UgMzogRW1pdCBSRUFEWSBzZW50aW5lbCBmb3IgYnJpZGdlIGNsaWVudHNcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnRE9MTEhPVVNFTUNQX1JFQURZXFxuJyk7XG5cbiAgICBsb2dnZXIuaW5mbyhcIkRvbGxob3VzZU1DUCBzZXJ2ZXIgcnVubmluZyBvbiBzdGRpb1wiKTtcblxuICAgIC8vIElzc3VlICM3MDYgUGhhc2UgMjogRGVmZXJyZWQgc2V0dXAg4oCUIHJ1bnMgcG9zdC1jb25uZWN0LCBub24tYmxvY2tpbmdcbiAgICAvLyBQYXR0ZXJuIGVuY3J5cHRpb24sIGJhY2tncm91bmQgdmFsaWRhdG9yLCBtZW1vcnkgYXV0by1sb2FkLCBhY3RpdmF0aW9uXG4gICAgLy8gcmVzdG9yZSwgbG9nIGhvb2tzLCBkYW5nZXIgem9uZSBpbml0IGFsbCBtb3ZlIGhlcmUuXG4gICAgY29uc3QgZGVmZXJyZWRQcm9taXNlID0gdGhpcy5jb250YWluZXIuY29tcGxldGVEZWZlcnJlZFNldHVwKCk7XG4gICAgZGVmZXJyZWRQcm9taXNlLmNhdGNoKGVyciA9PiBsb2dnZXIud2FybignW1N0YXJ0dXBdIERlZmVycmVkIHNldHVwIGVycm9yOicsIGVycikpO1xuXG4gICAgLy8gSXNzdWUgIzcwNiBQaGFzZSA0OiBXaXJlIGRlZmVycmVkIHByb21pc2UgaW50byBTZXJ2ZXJTZXR1cCBmb3IgcmVxdWVzdCBidWZmZXJpbmdcbiAgICBjb25zdCBzZXJ2ZXJTZXR1cCA9IHRoaXMuY29udGFpbmVyLnJlc29sdmU8aW1wb3J0KCcuL3NlcnZlci9TZXJ2ZXJTZXR1cC5qcycpLlNlcnZlclNldHVwPignU2VydmVyU2V0dXAnKTtcbiAgICBzZXJ2ZXJTZXR1cC5zZXREZWZlcnJlZFNldHVwUHJvbWlzZShkZWZlcnJlZFByb21pc2UpO1xuXG4gICAgLy8gTG9nIHN0YXJ0dXAgdGltaW5nIGFmdGVyIGRlZmVycmVkIHNldHVwIGNvbXBsZXRlc1xuICAgIGRlZmVycmVkUHJvbWlzZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcG9ydCA9IHRpbWVyLmdldFJlcG9ydCgpO1xuICAgICAgbG9nZ2VyLmluZm8oYFtTdGFydHVwXSBGdWxsIHJlcG9ydDogY29ubmVjdCBhdCAke3JlcG9ydC5jb25uZWN0QXRNc31tcywgYCArXG4gICAgICAgIGBjcml0aWNhbCAke3JlcG9ydC5jcml0aWNhbFBhdGhNc31tcywgZGVmZXJyZWQgJHtyZXBvcnQuZGVmZXJyZWRNc31tcywgYCArXG4gICAgICAgIGB0b3RhbCAke3JlcG9ydC50b3RhbE1zfW1zYCk7XG4gICAgfSkuY2F0Y2goKCkgPT4geyAvKiBhbHJlYWR5IGxvZ2dlZCAqLyB9KTtcblxuICB9XG59XG5cbi8vIEV4cG9ydCBpcyBhbHJlYWR5IGF0IGNsYXNzIGRlY2xhcmF0aW9uXG5cbi8vIE9ubHkgc3RhcnQgdGhlIHNlcnZlciBpZiB0aGlzIGZpbGUgaXMgYmVpbmcgcnVuIGRpcmVjdGx5IChub3QgaW1wb3J0ZWQgYnkgdGVzdHMpXG4vLyBIYW5kbGUgZGlmZmVyZW50IGV4ZWN1dGlvbiBtZXRob2RzIChkaXJlY3QsIG5weCwgQ0xJKVxuLy9cbi8vIEJ1ZyBmaXg6IG5weCBjcmVhdGVzIHN5bWxpbmtzIGluIC5iaW4vIChlLmcuIC5iaW4vbWNwLXNlcnZlciDihpIgZGlzdC9pbmRleC5qcykuXG4vLyBOb2RlLmpzIGtlZXBzIHRoZSBzeW1saW5rIHBhdGggaW4gcHJvY2Vzcy5hcmd2WzFdLCBzbyB3aXRob3V0IHJlc29sdmluZyBpdCxcbi8vIGlzRGlyZWN0RXhlY3V0aW9uIG1pc3NlZCB0aGUgZGlzdC9pbmRleC5qcyBzdWZmaXggYW5kIHRoZSBzZXJ2ZXIgbmV2ZXIgc3RhcnRlZC5cbmNvbnN0IHJhd1NjcmlwdFBhdGggPSBwcm9jZXNzLmFyZ3Y/LlsxXSA/PyAnJztcbmxldCBzY3JpcHRQYXRoID0gcmF3U2NyaXB0UGF0aCA/IHBhdGgubm9ybWFsaXplKHJhd1NjcmlwdFBhdGgpIDogJyc7XG50cnkge1xuICBzY3JpcHRQYXRoID0gcmVhbHBhdGhTeW5jKHNjcmlwdFBhdGgpO1xufSBjYXRjaCB7XG4gIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcpIHtcbiAgICBjb25zb2xlLmVycm9yKGBbREVCVUddIFN5bWxpbmsgcmVzb2x1dGlvbiBmYWlsZWQgZm9yICR7cmF3U2NyaXB0UGF0aH0g4oCUIHVzaW5nIG9yaWdpbmFsIHBhdGhgKTtcbiAgfVxufVxuY29uc3QgaXNEaXJlY3RFeGVjdXRpb24gPVxuICBzY3JpcHRQYXRoLmVuZHNXaXRoKGAke3BhdGguc2VwfWRpc3Qke3BhdGguc2VwfWluZGV4LmpzYCkgfHxcbiAgc2NyaXB0UGF0aC5lbmRzV2l0aChgJHtwYXRoLnNlcH1zcmMke3BhdGguc2VwfWluZGV4LnRzYCk7XG4vLyBNb2Rlcm4gbnBtICh2NyspIHJ1bnMgbnB4IGFzIFwibnBtIGV4ZWNcIiDigJQgbnBtX2V4ZWNwYXRoIG1heSBwb2ludCB0b1xuLy8gbnBtLWNsaS5qcyBpbnN0ZWFkIG9mIG5weC1jbGkuanMuIERldGVjdCBib3RoIGxlZ2FjeSBhbmQgbW9kZXJuIG5weC5cbmNvbnN0IGlzTnB4RXhlY3V0aW9uID1cbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5pbmNsdWRlcygnbnB4JykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2NvbW1hbmQgPT09ICdleGVjJztcbi8vIE1hdGNoIGFsbCByZWdpc3RlcmVkIGJpbiBlbnRyeSBuYW1lcyBmcm9tIHBhY2thZ2UuanNvbiBcImJpblwiIGZpZWxkXG5jb25zdCBiaW5OYW1lID0gcGF0aC5iYXNlbmFtZShyYXdTY3JpcHRQYXRoKTtcbmNvbnN0IGlzQ2xpRXhlY3V0aW9uID0gYmluTmFtZSA9PT0gJ2RvbGxob3VzZW1jcCcgfHwgYmluTmFtZSA9PT0gJ21jcC1zZXJ2ZXInO1xuY29uc3QgaXNUZXN0ID0gcHJvY2Vzcy5lbnYuSkVTVF9XT1JLRVJfSUQ7IC8vIFRoaXMgaXMgc2V0IHdoZW4gSmVzdCBydW5zIHRlc3RzXG5jb25zdCBpc1Rlc3RNb2RlID0gcHJvY2Vzcy5lbnYuVEVTVF9NT0RFID09PSAndHJ1ZSc7IC8vIENoZWNrIGZvciBURVNUX01PREUgZW52aXJvbm1lbnQgdmFyaWFibGVcbmNvbnN0IGRvbGxob3VzZURlYnVnRmxhZyA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9ERUJVRz8udG9Mb3dlckNhc2UoKTtcbmNvbnN0IGlzRGVidWdTdGFydHVwTG9nZ2luZyA9IGRvbGxob3VzZURlYnVnRmxhZyA9PT0gJ3RydWUnIHx8IGRvbGxob3VzZURlYnVnRmxhZyA9PT0gJzEnO1xuXG4vLyBQcm9ncmVzc2l2ZSBzdGFydHVwIHdpdGggcmV0cmllcyBmb3IgbnB4L0NMSSBleGVjdXRpb25cbmNvbnN0IFNUQVJUVVBfREVMQVlTID0gWzEwLCA1MCwgMTAwLCAyMDBdOyAvLyBQcm9ncmVzc2l2ZSBkZWxheXMgaW4gbXNcblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRTZXJ2ZXJXaXRoUmV0cnkocmV0cmllc0xlZnQgPSBTVEFSVFVQX0RFTEFZUy5sZW5ndGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGlzRGVidWdTdGFydHVwTG9nZ2luZykge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJERUJVRzogc3RhcnRTZXJ2ZXJXaXRoUmV0cnkgY2FsbGVkLlwiKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBEb2xsaG91c2VDb250YWluZXIoKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBuZXcgRG9sbGhvdXNlTUNQU2VydmVyKGNvbnRhaW5lcik7XG4gICAgYXdhaXQgc2VydmVyLnJ1bigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChyZXRyaWVzTGVmdCA+IDAgJiYgKGlzTnB4RXhlY3V0aW9uIHx8IGlzQ2xpRXhlY3V0aW9uKSkge1xuICAgICAgLy8gVHJ5IGFnYWluIHdpdGggYSBsb25nZXIgZGVsYXlcbiAgICAgIGNvbnN0IGRlbGF5SW5kZXggPSBTVEFSVFVQX0RFTEFZUy5sZW5ndGggLSByZXRyaWVzTGVmdDtcbiAgICAgIGNvbnN0IGRlbGF5ID0gU1RBUlRVUF9ERUxBWVNbZGVsYXlJbmRleF07XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgIHJldHVybiBzdGFydFNlcnZlcldpdGhSZXRyeShyZXRyaWVzTGVmdCAtIDEpO1xuICAgIH1cbiAgICAvLyBGaW5hbCBmYWlsdXJlIC0gbWluaW1hbCBlcnJvciBtZXNzYWdlIGZvciBzZWN1cml0eVxuICAgIC8vIE5vdGU6IFVzaW5nIGNvbnNvbGUuZXJyb3IgaGVyZSBpcyBpbnRlbnRpb25hbCBhcyBpdCdzIHRoZSBmaW5hbCBlcnJvciBiZWZvcmUgZXhpdFxuICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBTZXJ2ZXIgc3RhcnR1cCBmYWlsZWRcIixcbiAgICAgIHByb2Nlc3MuZW52LkRPTExIT1VTRV9ERUJVRyA/IGVycm9yIDogKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlIHx8ICd1bmtub3duIGVycm9yJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgY29uc29sZSBwb3J0IGZyb20gY29uZmlnIGZpbGUsIHdpdGggcmFuZ2UgdmFsaWRhdGlvbi5cbiAqIFVzZWQgYnkgc3RhbmRhbG9uZSAtLXdlYiBtb2RlIHdoZW4gbm8gQ0xJIC0tcG9ydCBmbGFnIGlzIHByb3ZpZGVkLlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGNvbmZpZyBmaWxlIGlzIG1pc3Npbmcgb3IgdGhlIHBvcnQgaXMgaW52YWxpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBvcnRGcm9tQ29uZmlnKCk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyByZWFkRmlsZSB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOmZzL3Byb21pc2VzJyk7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkRmlsZShjb25maWdQYXRoLCAndXRmOCcpO1xuICAgIGlmIChyYXcubGVuZ3RoID4gNjQgKiAxMDI0KSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tQb3J0Q29uZmlnXSBDb25maWcgZmlsZSBleGNlZWRzIDY0S0Ig4oCUIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCB7IENvbmZpZ01hbmFnZXIsIHZhbGlkYXRlUG9ydCB9ID0gYXdhaXQgaW1wb3J0KCcuL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzJyk7XG4gICAgY29uc3QgY29uZmlnUG9ydCA9IHZhbGlkYXRlUG9ydChDb25maWdNYW5hZ2VyLnJlYWRQb3J0RnJvbVlhbWwocmF3KSk7XG4gICAgaWYgKGNvbmZpZ1BvcnQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW1BvcnRDb25maWddIFJlc29sdmVkIHBvcnQgJHtjb25maWdQb3J0fSBmcm9tIGNvbmZpZyBmaWxlYCk7XG4gICAgICByZXR1cm4gY29uZmlnUG9ydDtcbiAgICB9XG4gICAgbG9nZ2VyLmRlYnVnKCdbUG9ydENvbmZpZ10gTm8gdmFsaWQgcG9ydCBpbiBjb25maWcgZmlsZSDigJQgdXNpbmcgZW52L2RlZmF1bHQnKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICBsb2dnZXIuZGVidWcoJ1tQb3J0Q29uZmlnXSBDb25maWcgZmlsZSBub3QgZm91bmQg4oCUIHVzaW5nIGVudi9kZWZhdWx0Jyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5pZiAoKGlzRGlyZWN0RXhlY3V0aW9uIHx8IGlzTnB4RXhlY3V0aW9uIHx8IGlzQ2xpRXhlY3V0aW9uKSAmJiAoIWlzVGVzdCB8fCBpc1Rlc3RNb2RlKSkge1xuICAvLyBJc3N1ZSAjNzA0OiAtLXdlYiBmbGFnIHN0YXJ0cyB0aGUgcG9ydGZvbGlvIHdlYiBVSSBpbnN0ZWFkIG9mIE1DUCBzZXJ2ZXJcbiAgY29uc3QgaXNXZWJNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXdlYicpO1xuICBpZiAoaXNXZWJNb2RlKSB7XG4gICAgLy8gSXNzdWUgIzc5NjogQm9vdHN0cmFwIERJIGNvbnRhaW5lciBmb3Igd2ViLW9ubHkgbW9kZSBzbyBBUEkgcm91dGVzXG4gICAgLy8gZ28gdGhyb3VnaCBNQ1BBUUxIYW5kbGVyICh2YWxpZGF0ZWQsIGNhY2hlZCwgZ2F0ZWtlZXBlci1jaGVja2VkKVxuICAgIC8vXG4gICAgLy8gU3VwcHJlc3MgdGVybWluYWwgb3V0cHV0IGluIC0td2ViIG1vZGUgdW5sZXNzIERPTExIT1VTRV9ERUJVRyBpcyBzZXQuXG4gICAgLy8gQWxsIGxvZ3MgYXJlIHN0aWxsIGNhcHR1cmVkIGluIE1lbW9yeUxvZ1NpbmsgYW5kIHZpc2libGUgaW4gdGhlIExvZ3MgdGFiIOKAlFxuICAgIC8vIHRoZSB0ZXJtaW5hbCBvbmx5IG5lZWRzIHRoZSBjb25zb2xlIFVSTCBiYW5uZXIsIG5vdCBhIHdhbGwgb2Ygc3RhcnR1cCBub2lzZS5cbiAgICBpZiAoIXByb2Nlc3MuZW52LkRPTExIT1VTRV9ERUJVRyAmJiAhcHJvY2Vzcy5lbnYuRU5BQkxFX0RFQlVHKSB7XG4gICAgICBsb2dnZXIuc2V0TWluTGV2ZWwoJ2Vycm9yJyk7XG4gICAgfVxuXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHBvcnRmb2xpb0RpciA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ3BvcnRmb2xpbycpO1xuICAgICAgLy8gQ0xJIGZsYWcgcGFyc2VkIGVhcmx5OyBjb25maWcgZmlsZSByZXNvbHZlZCBhZnRlciBjb250YWluZXIgYm9vdHN0cmFwICgjMTg0MClcbiAgICAgIGNvbnN0IHBvcnRBcmcgPSBwcm9jZXNzLmFyZ3YuZmluZChhID0+IGEuc3RhcnRzV2l0aCgnLS1wb3J0PScpKTtcbiAgICAgIGNvbnN0IGNsaVBvcnQgPSBwb3J0QXJnID8gTnVtYmVyLnBhcnNlSW50KHBvcnRBcmcuc3BsaXQoJz0nKVsxXSwgMTApIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgbm9Ccm93c2VyID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLW5vLW9wZW4nKTtcblxuICAgICAgLy8gUHJlLWZsaWdodDoga2lsbCBhbnkgc3RhbGUgRG9sbGhvdXNlTUNQIHByb2Nlc3Mgc3F1YXR0aW5nIG9uIG91ciBwb3J0XG4gICAgICAvLyBCRUZPUkUgYW55IGNvbnRhaW5lci9zZXJ2ZXIgc2V0dXAuIFRoaXMgaXMgdGhlIGRlZmluaXRpdmUgZml4IGZvciAjMTg1MCDigJRcbiAgICAgIC8vIGNsZWFyIHRoZSBwb3J0IGZpcnN0LCB0aGVuIHN0YXJ0IGNsZWFubHkuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0YXJnZXRQb3J0ID0gY2xpUG9ydCB8fCBlbnYuRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlQ7XG4gICAgICAgIGNvbnN0IHsgcmVjb3ZlclN0YWxlUG9ydCB9ID0gYXdhaXQgaW1wb3J0KCcuL3dlYi9jb25zb2xlL1N0YWxlUHJvY2Vzc1JlY292ZXJ5LmpzJyk7XG4gICAgICAgIGNvbnN0IHJlY292ZXJlZCA9IGF3YWl0IHJlY292ZXJTdGFsZVBvcnQodGFyZ2V0UG9ydCk7XG4gICAgICAgIGlmIChyZWNvdmVyZWQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGAgIENsZWFyZWQgc3RhbGUgcHJvY2VzcyBmcm9tIHBvcnQgJHt0YXJnZXRQb3J0fVxcbmApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHsgLyogcmVjb3ZlcnkgZmFpbHVyZSBpcyBub24tZmF0YWwg4oCUIGJpbmRBbmRMaXN0ZW4gd2lsbCBoYW5kbGUgRUFERFJJTlVTRSAqLyB9XG5cbiAgICAgIGxldCBtY3BBcWxIYW5kbGVyO1xuICAgICAgbGV0IG1lbW9yeVNpbms6IGltcG9ydCgnLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnKS5NZW1vcnlMb2dTaW5rIHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IG1ldHJpY3NTaW5rOiBpbXBvcnQoJy4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcycpLk1lbW9yeU1ldHJpY3NTaW5rIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gbmV3IERvbGxob3VzZUNvbnRhaW5lcigpO1xuICAgICAgICBhd2FpdCBjb250YWluZXIucHJlcGFyZVBvcnRmb2xpbygpO1xuICAgICAgICBjb25zdCBidW5kbGUgPSBhd2FpdCBjb250YWluZXIuYm9vdHN0cmFwSGFuZGxlcnMoKTtcbiAgICAgICAgLy8gRG8gTk9UIGNhbGwgY29tcGxldGVEZWZlcnJlZFNldHVwKCkgaW4gLS13ZWIgbW9kZSAoIzE4NTApLlxuICAgICAgICAvLyBJdCBydW5zIFVuaWZpZWRDb25zb2xlIGxlYWRlciBlbGVjdGlvbiB3aGljaCBzdGFydHMgYSBjb21wZXRpbmdcbiAgICAgICAgLy8gd2ViIHNlcnZlciwgc2V0cyBzZXJ2ZXJSdW5uaW5nPXRydWUsIGFuZCBjYXVzZXMgdGhlIGFjdHVhbFxuICAgICAgICAvLyBzdGFydFdlYlNlcnZlciBjYWxsIGJlbG93IHRvIGVhcmx5LXJldHVybiB3aXRob3V0IGJpbmRpbmcuXG4gICAgICAgIC8vIFN0YW5kYWxvbmUgLS13ZWIgbW9kZSBJUyB0aGUgc2VydmVyIOKAlCBubyBsZWFkZXIvZm9sbG93ZXIgbmVlZGVkLlxuICAgICAgICAvLyBSdW4gdGhlIHBvcnQgZmlsZSBzd2VlcCBkaXJlY3RseSBpbnN0ZWFkLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgc3dlZXBTdGFsZVBvcnRGaWxlcyB9ID0gYXdhaXQgaW1wb3J0KCcuL3dlYi9wb3J0RGlzY292ZXJ5LmpzJyk7XG4gICAgICAgICAgYXdhaXQgc3dlZXBTdGFsZVBvcnRGaWxlcygpO1xuICAgICAgICB9IGNhdGNoIHsgLyogbm9uLWZhdGFsICovIH1cbiAgICAgICAgbWNwQXFsSGFuZGxlciA9IGJ1bmRsZS5tY3BBcWxIYW5kbGVyO1xuICAgICAgICAvLyBFeHRyYWN0IHNpbmtzIGZyb20gY29udGFpbmVyIOKAlCBkZWZlcnJlZCBzZXR1cCBtYXkgaGF2ZSBhbHJlYWR5IHdpcmVkIHRoZW1cbiAgICAgICAgdHJ5IHsgbWVtb3J5U2luayA9IGNvbnRhaW5lci5yZXNvbHZlPGltcG9ydCgnLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnKS5NZW1vcnlMb2dTaW5rPignTWVtb3J5TG9nU2luaycpOyB9IGNhdGNoIHsgLyogbm90IHJlZ2lzdGVyZWQgKi8gfVxuICAgICAgICB0cnkgeyBtZXRyaWNzU2luayA9IGNvbnRhaW5lci5yZXNvbHZlPGltcG9ydCgnLi9tZXRyaWNzL3NpbmtzL01lbW9yeU1ldHJpY3NTaW5rLmpzJykuTWVtb3J5TWV0cmljc1Npbms+KCdNZW1vcnlNZXRyaWNzU2luaycpOyB9IGNhdGNoIHsgLyogbm90IHJlZ2lzdGVyZWQgKi8gfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBDb250YWluZXIgYm9vdHN0cmFwIGZhaWxlZCDigJQgd2ViIHJvdXRlcyB3aWxsIHVzZSBkaXJlY3QgZmlsZXN5c3RlbSBhY2Nlc3MuXCIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW0RvbGxob3VzZU1DUF0gUmVhc29uOlwiLCAoZXJyIGFzIEVycm9yKS5tZXNzYWdlIHx8IGVycik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBUaGlzIG1heSBpbmRpY2F0ZSBhIGNvcnJ1cHQgcG9ydGZvbGlvIG9yIG1pc3NpbmcgZGVwZW5kZW5jaWVzLlwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIHNpbmtzIGV4aXN0IGV2ZW4gaWYgY29udGFpbmVyIGJvb3RzdHJhcCBmYWlsZWQg4oCUXG4gICAgICAvLyBzdGFuZGFsb25lIC0td2ViIG1vZGUgc3RpbGwgbmVlZHMgd29ya2luZyBsb2dzIGFuZCBtZXRyaWNzIHRhYnNcbiAgICAgIGlmICghbWVtb3J5U2luaykge1xuICAgICAgICBjb25zdCB7IE1lbW9yeUxvZ1NpbmsgfSA9IGF3YWl0IGltcG9ydCgnLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnKTtcbiAgICAgICAgbWVtb3J5U2luayA9IG5ldyBNZW1vcnlMb2dTaW5rKHtcbiAgICAgICAgICBhcHBDYXBhY2l0eTogMTAwMDAsXG4gICAgICAgICAgc2VjdXJpdHlDYXBhY2l0eTogNTAwMCxcbiAgICAgICAgICBwZXJmQ2FwYWNpdHk6IDIwMDAsXG4gICAgICAgICAgdGVsZW1ldHJ5Q2FwYWNpdHk6IDEwMDAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFtZXRyaWNzU2luaykge1xuICAgICAgICBjb25zdCB7IE1lbW9yeU1ldHJpY3NTaW5rIH0gPSBhd2FpdCBpbXBvcnQoJy4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcycpO1xuICAgICAgICBtZXRyaWNzU2luayA9IG5ldyBNZW1vcnlNZXRyaWNzU2luaygyNDApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgaW5nZXN0IHJvdXRlcyBzbyAtLXdlYiBtb2RlIGhhcyBhIHNlc3Npb24gcmVnaXN0cnkgKCMxODA1KS5cbiAgICAgIC8vIFdpdGhvdXQgdGhpcywgdGhlIHNlc3Npb24gaW5kaWNhdG9yIGlzIGFsd2F5cyBlbXB0eSBpbiBzdGFuZGFsb25lIG1vZGUuXG4gICAgICBjb25zdCB7IGNyZWF0ZUluZ2VzdFJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KCcuL3dlYi9jb25zb2xlL0luZ2VzdFJvdXRlcy5qcycpO1xuICAgICAgY29uc3QgaW5nZXN0UmVzdWx0ID0gY3JlYXRlSW5nZXN0Um91dGVzKHtcbiAgICAgICAgbG9nQnJvYWRjYXN0OiAoZW50cnkpID0+IHsgLyogd2lyZWQgYWZ0ZXIgc2VydmVyIHN0YXJ0cyAqLyB9LFxuICAgICAgfSk7XG4gICAgICBpbmdlc3RSZXN1bHQucmVnaXN0ZXJDb25zb2xlU2Vzc2lvbigpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIGNvbnNvbGUgdG9rZW4gc3RvcmUgc28gQXV0aCB0YWIgcm91dGVzIG1vdW50ICgjMTgyNSkuXG4gICAgICAvLyBNaXJyb3JzIFVuaWZpZWRDb25zb2xlLnRzOnN0YXJ0QXNMZWFkZXIoKSDigJQgd2l0aG91dCB0aGlzLFxuICAgICAgLy8gL2FwaS9jb25zb2xlL3RvdHAgYW5kIC9hcGkvY29uc29sZS90b2tlbiByZXR1cm4gNDA0LlxuICAgICAgY29uc3QgeyBDb25zb2xlVG9rZW5TdG9yZSB9ID0gYXdhaXQgaW1wb3J0KCcuL3dlYi9jb25zb2xlL2NvbnNvbGVUb2tlbi5qcycpO1xuICAgICAgY29uc3QgeyBwaWNrUmFuZG9tUHVwcGV0TmFtZSB9ID0gYXdhaXQgaW1wb3J0KCcuL3dlYi9jb25zb2xlL1Nlc3Npb25OYW1lcy5qcycpO1xuICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IG5ldyBDb25zb2xlVG9rZW5TdG9yZShlbnYuRE9MTEhPVVNFX0NPTlNPTEVfVE9LRU5fRklMRSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0b2tlblN0b3JlLmVuc3VyZUluaXRpYWxpemVkKHBpY2tSYW5kb21QdXBwZXROYW1lKCkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tEb2xsaG91c2VNQ1BdIEZhaWxlZCB0byBpbml0aWFsaXplIGNvbnNvbGUgdG9rZW4gc3RvcmUg4oCUIEF1dGggdGFiIHdpbGwgYmUgbm9uLWZ1bmN0aW9uYWwnLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHBvcnQ6IENMSSBmbGFnIOKGkiBjb25maWcgZmlsZSDihpIgZW52IHZhciDihpIgZGVmYXVsdCAoIzE4NDApXG4gICAgICBjb25zdCByZXNvbHZlZFBvcnQgPSBjbGlQb3J0IHx8IGF3YWl0IHJlc29sdmVQb3J0RnJvbUNvbmZpZygpO1xuXG4gICAgICBjb25zdCB7IHN0YXJ0V2ViU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoJy4vd2ViL3NlcnZlci5qcycpO1xuICAgICAgYXdhaXQgc3RhcnRXZWJTZXJ2ZXIoeyBwb3J0Zm9saW9EaXIsIHBvcnQ6IHJlc29sdmVkUG9ydCwgb3BlbkJyb3dzZXI6ICFub0Jyb3dzZXIsIG1jcEFxbEhhbmRsZXIsIG1lbW9yeVNpbmssIG1ldHJpY3NTaW5rLCBhZGRpdGlvbmFsUm91dGVyczogW2luZ2VzdFJlc3VsdC5yb3V0ZXJdLCB0b2tlblN0b3JlIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHF1aXQgY29tbWFuZHMgb24gc3RkaW4gKHN0YW5kYWxvbmUgLS13ZWIgbW9kZSBvbmx5KS5cbiAgICAgIC8vIEluIE1DUCBzdGRpbyBtb2RlLCBzdGRpbiBpcyBjb25zdW1lZCBieSB0aGUgSlNPTi1SUEMgdHJhbnNwb3J0LlxuICAgICAgaWYgKHByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygndXRmLTgnKTtcbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgICAgICAgbGV0IHF1aXREZWJvdW5jZTogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBjbWQgPSBkYXRhLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChjbWQgPT09ICdxJyB8fCBjbWQgPT09ICdxdWl0JyB8fCBjbWQgPT09ICdleGl0Jykge1xuICAgICAgICAgICAgLy8gRGVib3VuY2UgcmFwaWQgaW5wdXRzIChlLmcuLCBhY2NpZGVudGFsIGRvdWJsZS10YXApXG4gICAgICAgICAgICBpZiAocXVpdERlYm91bmNlKSByZXR1cm47XG4gICAgICAgICAgICBxdWl0RGVib3VuY2UgPSBzZXRUaW1lb3V0KCgpID0+IHsgcXVpdERlYm91bmNlID0gbnVsbDsgfSwgMjAwKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1xcbiAgU2h1dHRpbmcgZG93biBEb2xsaG91c2VNQ1AuLi5cXG4nKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pKCkuY2F0Y2goZXJyID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBXZWIgVUkgZmFpbGVkIHRvIHN0YXJ0OlwiLCBlcnIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmIChpc0RlYnVnU3RhcnR1cExvZ2dpbmcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJERUJVRzogU2VydmVyIHN0YXJ0dXAgY29uZGl0aW9uIG1ldC4gQ2FsbGluZyBzdGFydFNlcnZlcldpdGhSZXRyeS5cIik7XG4gICAgfVxuICAgIHN0YXJ0U2VydmVyV2l0aFJldHJ5KCkuY2F0Y2goKCkgPT4ge1xuICAgICAgLy8gTm90ZTogVXNpbmcgY29uc29sZS5lcnJvciBoZXJlIGlzIGludGVudGlvbmFsIGFzIGl0J3MgdGhlIGZpbmFsIGVycm9yIGJlZm9yZSBleGl0XG4gICAgICBjb25zb2xlLmVycm9yKFwiW0RvbGxob3VzZU1DUF0gU2VydmVyIHN0YXJ0dXAgZmFpbGVkXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
816
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLGtFQUFrRTtBQUNsRSw4REFBOEQ7QUFDOUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBR3pCLGlEQUFpRDtBQUNqRCxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDeEMsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRTtRQUMzQyxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENB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QUFDO1lBQzFCLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0VBQW9FLENBQUMsQ0FBQztRQUN0RixDQUFDO1FBQ0Qsb0JBQW9CLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2hDLG9GQUFvRjtZQUNwRixPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDdEQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG4vLyBMb2FkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIC5lbnYgZmlsZXMgQkVGT1JFIGFueXRoaW5nIGVsc2Vcbi8vIFRoaXMgZW5zdXJlcyAuZW52LmxvY2FsIGFuZCAuZW52IGFyZSBsb2FkZWQgZm9yIGFsbCBtb2R1bGVzXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuL2NvbmZpZy9lbnYuanMnO1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmVhbHBhdGhTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBTZXJ2ZXIgfSBmcm9tIFwiQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay9zZXJ2ZXIvaW5kZXguanNcIjtcbmltcG9ydCB7IFN0ZGlvU2VydmVyVHJhbnNwb3J0IH0gZnJvbSBcIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvc2VydmVyL3N0ZGlvLmpzXCI7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIgfSBmcm9tIFwiLi91dGlscy9FcnJvckhhbmRsZXIuanNcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCIuL3V0aWxzL2xvZ2dlci5qc1wiO1xuaW1wb3J0IHsgRG9sbGhvdXNlQ29udGFpbmVyIH0gZnJvbSBcIi4vZGkvQ29udGFpbmVyLmpzXCI7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gXCIuL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25hbFRlbGVtZXRyeSwgU3RhcnR1cFRpbWVyIH0gZnJvbSBcIi4vdGVsZW1ldHJ5L2luZGV4LmpzXCI7XG5pbXBvcnQgeyBQQUNLQUdFX1ZFUlNJT04gfSBmcm9tIFwiLi9nZW5lcmF0ZWQvdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmRpY2F0b3JDb25maWcgfSBmcm9tIFwiLi9jb25maWcvaW5kaWNhdG9yLWNvbmZpZy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBJVG9vbEhhbmRsZXIgfSBmcm9tIFwiLi9zZXJ2ZXIvaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHsgVG9vbFJlZ2lzdHJ5IH0gZnJvbSBcIi4vaGFuZGxlcnMvVG9vbFJlZ2lzdHJ5LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFBlcnNvbmFIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvUGVyc29uYUhhbmRsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgRWxlbWVudENSVURIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvRWxlbWVudENSVURIYW5kbGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvQ29sbGVjdGlvbkhhbmRsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgUG9ydGZvbGlvSGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL1BvcnRmb2xpb0hhbmRsZXIuanNcIjtcbmltcG9ydCB0eXBlIHsgR2l0SHViQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVycy9HaXRIdWJBdXRoSGFuZGxlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBEaXNwbGF5Q29uZmlnSGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL0Rpc3BsYXlDb25maWdIYW5kbGVyLmpzXCI7XG5pbXBvcnQgdHlwZSB7IElkZW50aXR5SGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL0lkZW50aXR5SGFuZGxlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb25maWdIYW5kbGVyIH0gZnJvbSBcIi4vaGFuZGxlcnMvQ29uZmlnSGFuZGxlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBTeW5jSGFuZGxlciB9IGZyb20gXCIuL2hhbmRsZXJzL1N5bmNIYW5kbGVyVjIuanNcIjtcbmltcG9ydCB0eXBlIHsgRW5oYW5jZWRJbmRleEhhbmRsZXIgfSBmcm9tIFwiLi9oYW5kbGVycy9FbmhhbmNlZEluZGV4SGFuZGxlci5qc1wiO1xuaW1wb3J0IHsgQ29uZmlnTWFuYWdlciB9IGZyb20gXCIuL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzXCI7XG5pbXBvcnQgeyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanNcIjtcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gXCIuL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qc1wiO1xuaW1wb3J0ICogYXMgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgdHlwZSB7IEVuc2VtYmxlRWxlbWVudCB9IGZyb20gXCIuL2VsZW1lbnRzL2Vuc2VtYmxlcy90eXBlcy5qc1wiO1xuXG4vLyBEZWZlbnNpdmUgZXJyb3IgaGFuZGxpbmcgZm9yIG5weC9DTEkgZXhlY3V0aW9uXG5wcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnJvcikgPT4ge1xuICBsb2dnZXIuZXJyb3IoJ1VuaGFuZGxlZCBleGNlcHRpb24gZGV0ZWN0ZWQnLCB7XG4gICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkXG4gIH0pO1xuICBjb25zb2xlLmVycm9yKCdbRG9sbGhvdXNlTUNQXSBTZXJ2ZXIgc3RhcnR1cCBmYWlsZWQnKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG5cbnByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChyZWFzb24sIHByb21pc2UpID0+IHtcbiAgbG9nZ2VyLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gZGV0ZWN0ZWQnLCB7XG4gICAgcmVhc29uOiByZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbi5tZXNzYWdlIDogU3RyaW5nKHJlYXNvbiksXG4gICAgc3RhY2s6IHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgIHByb21pc2VcbiAgfSk7XG4gIGNvbnNvbGUuZXJyb3IoJ1tEb2xsaG91c2VNQ1BdIFNlcnZlciBzdGFydHVwIGZhaWxlZCcpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcblxuLy8gT25seSBsb2cgZXhlY3V0aW9uIGVudmlyb25tZW50IGluIGRlYnVnIG1vZGVcbmlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcpIHtcbiAgY29uc29sZS5lcnJvcignW0RvbGxob3VzZU1DUF0gRGVidWcgbW9kZSBlbmFibGVkJyk7XG59XG5cbmV4cG9ydCBjbGFzcyBEb2xsaG91c2VNQ1BTZXJ2ZXIgaW1wbGVtZW50cyBJVG9vbEhhbmRsZXIge1xuICBwcml2YXRlIHNlcnZlcjogU2VydmVyO1xuICBwdWJsaWMgcGVyc29uYXNEaXI6IHN0cmluZyB8IG51bGw7XG4gIHByaXZhdGUgY3VycmVudFVzZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbml0aWFsaXphdGlvblByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb250YWluZXI6IERvbGxob3VzZUNvbnRhaW5lcjtcbiAgcHJpdmF0ZSB0b29sUmVnaXN0cnk/OiBUb29sUmVnaXN0cnk7XG4gIHByaXZhdGUgZW5oYW5jZWRJbmRleEhhbmRsZXI/OiBFbmhhbmNlZEluZGV4SGFuZGxlcjtcbiAgcHJpdmF0ZSBwZXJzb25hSGFuZGxlcj86IFBlcnNvbmFIYW5kbGVyO1xuICBwcml2YXRlIGVsZW1lbnRDUlVESGFuZGxlcj86IEVsZW1lbnRDUlVESGFuZGxlcjtcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uSGFuZGxlcj86IENvbGxlY3Rpb25IYW5kbGVyO1xuICBwcml2YXRlIHBvcnRmb2xpb0hhbmRsZXI/OiBQb3J0Zm9saW9IYW5kbGVyO1xuICBwcml2YXRlIGdpdGh1YkF1dGhIYW5kbGVyPzogR2l0SHViQXV0aEhhbmRsZXI7XG4gIHByaXZhdGUgZGlzcGxheUNvbmZpZ0hhbmRsZXI/OiBEaXNwbGF5Q29uZmlnSGFuZGxlcjtcbiAgcHJpdmF0ZSBpZGVudGl0eUhhbmRsZXI/OiBJZGVudGl0eUhhbmRsZXI7XG4gIHByaXZhdGUgY29uZmlnSGFuZGxlcj86IENvbmZpZ0hhbmRsZXI7XG4gIHByaXZhdGUgc3luY0hhbmRsZXI/OiBTeW5jSGFuZGxlcjtcbiAgcHJpdmF0ZSByZXNvdXJjZUhhbmRsZXI/OiBpbXBvcnQoJy4vaGFuZGxlcnMvUmVzb3VyY2VIYW5kbGVyLmpzJykuUmVzb3VyY2VIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgRG9sbGhvdXNlTUNQU2VydmVyIGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXIgRG9sbGhvdXNlQ29udGFpbmVyIGluc3RhbmNlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAgICogICAgICAgICAgICAgICAgICBVc2UgYG5ldyBEb2xsaG91c2VDb250YWluZXIoKWAgZm9yIHByb2R1Y3Rpb24gb3JcbiAgICogICAgICAgICAgICAgICAgICBgY3JlYXRlSW50ZWdyYXRpb25Db250YWluZXIoKS5jb250YWluZXJgIGZvciB0ZXN0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lcjogRG9sbGhvdXNlQ29udGFpbmVyKSB7XG4gICAgLy8gQnVpbGQgY2FwYWJpbGl0aWVzIG9iamVjdCBjb25kaXRpb25hbGx5IGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAgICAvLyBSZXNvdXJjZXMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQgKGFkdmVydGlzZV9yZXNvdXJjZXM6IGZhbHNlKVxuICAgIGNvbnN0IGNhcGFiaWxpdGllczogYW55ID0ge1xuICAgICAgdG9vbHM6IHt9LFxuICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiByZXNvdXJjZXMgc2hvdWxkIGJlIGFkdmVydGlzZWRcbiAgICAvLyBUaGlzIGlzIGEgZnV0dXJlLXByb29mIGltcGxlbWVudGF0aW9uIC0gcmVzb3VyY2VzIGFyZSBvcHQtaW5cbiAgICB0cnkge1xuICAgICAgLy8gSW5pdGlhbGl6ZSBDb25maWdNYW5hZ2VyIHRvIGNoZWNrIHJlc291cmNlIHNldHRpbmdzXG4gICAgICAvLyBOb3RlOiBDb25maWcgbWF5IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZCB5ZXQsIHNvIHdlIGNoZWNrIHN5bmNocm9ub3VzbHlcbiAgICAgIC8vIElmIGNvbmZpZyBpcyBub3QgaW5pdGlhbGl6ZWQsIGRlZmF1bHRzIChhZHZlcnRpc2VfcmVzb3VyY2VzOiBmYWxzZSkgYXBwbHlcbiAgICAgIGNvbnN0IGZpbGVMb2NrTWFuYWdlciA9IG5ldyBGaWxlTG9ja01hbmFnZXIoKTtcbiAgICAgIGNvbnN0IGZpbGVPcGVyYXRpb25zID0gbmV3IEZpbGVPcGVyYXRpb25zU2VydmljZShmaWxlTG9ja01hbmFnZXIpO1xuICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IG5ldyBDb25maWdNYW5hZ2VyKGZpbGVPcGVyYXRpb25zLCBvcyk7XG4gICAgICBjb25zdCByZXNvdXJjZXNDb25maWcgPSBjb25maWdNYW5hZ2VyLmdldFNldHRpbmc8YW55PignZWxlbWVudHMuZW5oYW5jZWRfaW5kZXgucmVzb3VyY2VzJyk7XG5cbiAgICAgIGlmIChyZXNvdXJjZXNDb25maWc/LmFkdmVydGlzZV9yZXNvdXJjZXMgPT09IHRydWUpIHtcbiAgICAgICAgY2FwYWJpbGl0aWVzLnJlc291cmNlcyA9IHt9O1xuICAgICAgICBsb2dnZXIuaW5mbygnW0RvbGxob3VzZU1DUF0gTUNQIFJlc291cmNlcyBjYXBhYmlsaXR5IGFkdmVydGlzZWQgKGVuYWJsZWQgdmlhIGNvbmZpZyknKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbRG9sbGhvdXNlTUNQXSBNQ1AgUmVzb3VyY2VzIGNhcGFiaWxpdHkgTk9UIGFkdmVydGlzZWQgKGRpc2FibGVkIGJ5IGRlZmF1bHQpJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIENvbmZpZyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gdXNlIHNhZmUgZGVmYXVsdCAobm8gcmVzb3VyY2VzKVxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbRG9sbGhvdXNlTUNQXSBDb25maWcgbm90IGluaXRpYWxpemVkIHlldCwgcmVzb3VyY2VzIGNhcGFiaWxpdHkgZGlzYWJsZWQgYnkgZGVmYXVsdDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2ZXIgPSBuZXcgU2VydmVyKFxuICAgICAge1xuICAgICAgICBuYW1lOiBcImRvbGxob3VzZW1jcFwiLFxuICAgICAgICB2ZXJzaW9uOiBQQUNLQUdFX1ZFUlNJT04sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjYXBhYmlsaXRpZXMsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMucGVyc29uYXNEaXIgPSBudWxsO1xuICAgIHRoaXMuY3VycmVudFVzZXIgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUiB8fCBudWxsO1xuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICB9XG4gIFxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVQb3J0Zm9saW8oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jb250YWluZXIucHJlcGFyZVBvcnRmb2xpbygpO1xuICAgIHRoaXMucGVyc29uYXNEaXIgPSB0aGlzLmNvbnRhaW5lci5nZXRQZXJzb25hc0RpcigpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ29tcGxldGUgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgcG9ydGZvbGlvIGlzIHJlYWR5XG4gICAqIEZJWCAjNjEwOiBUaGlzIHdhcyBwcmV2aW91c2x5IGluIGEgLnRoZW4oKSBjYWxsYmFjayBpbiB0aGUgY29uc3RydWN0b3JcbiAgICogTm93IGNhbGxlZCBzeW5jaHJvbm91c2x5IGZyb20gcnVuKCkgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb21wbGV0ZUluaXRpYWxpemF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENyZWF0ZSBoYW5kbGVycyB3aXRoIHNlcnZlciBpbnN0YW5jZSAtIGFsbCBzdGF0ZSBtYW5hZ2VkIGJ5IHNlcnZpY2VzXG4gICAgY29uc3QgaGFuZGxlcnMgPSBhd2FpdCB0aGlzLmNvbnRhaW5lci5jcmVhdGVIYW5kbGVycyh0aGlzLnNlcnZlcik7XG5cbiAgICB0aGlzLnBlcnNvbmFIYW5kbGVyID0gaGFuZGxlcnMucGVyc29uYUhhbmRsZXI7XG4gICAgdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIgPSBoYW5kbGVycy5lbGVtZW50Q3J1ZEhhbmRsZXI7XG4gICAgdGhpcy5jb2xsZWN0aW9uSGFuZGxlciA9IGhhbmRsZXJzLmNvbGxlY3Rpb25IYW5kbGVyO1xuICAgIHRoaXMucG9ydGZvbGlvSGFuZGxlciA9IGhhbmRsZXJzLnBvcnRmb2xpb0hhbmRsZXI7XG4gICAgdGhpcy5naXRodWJBdXRoSGFuZGxlciA9IGhhbmRsZXJzLmdpdGh1YkF1dGhIYW5kbGVyO1xuICAgIHRoaXMuZGlzcGxheUNvbmZpZ0hhbmRsZXIgPSBoYW5kbGVycy5kaXNwbGF5Q29uZmlnSGFuZGxlcjtcbiAgICB0aGlzLmlkZW50aXR5SGFuZGxlciA9IGhhbmRsZXJzLmlkZW50aXR5SGFuZGxlcjtcbiAgICB0aGlzLmNvbmZpZ0hhbmRsZXIgPSBoYW5kbGVycy5jb25maWdIYW5kbGVyO1xuICAgIHRoaXMuc3luY0hhbmRsZXIgPSBoYW5kbGVycy5zeW5jSGFuZGxlcjtcbiAgICB0aGlzLnRvb2xSZWdpc3RyeSA9IGhhbmRsZXJzLnRvb2xSZWdpc3RyeTtcbiAgICB0aGlzLmVuaGFuY2VkSW5kZXhIYW5kbGVyID0gaGFuZGxlcnMuZW5oYW5jZWRJbmRleEhhbmRsZXI7XG5cbiAgICAvLyBJbml0aWFsaXplIGFuZCByZWdpc3RlciByZXNvdXJjZSBoYW5kbGVyc1xuICAgIC8vIFJlc291cmNlcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgcmVxdWlyZSBleHBsaWNpdCBjb25maWd1cmF0aW9uXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUmVzb3VyY2VIYW5kbGVycygpO1xuXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIE1DUCBSZXNvdXJjZXMgaGFuZGxlcnMgaWYgZW5hYmxlZCBpbiBjb25maWd1cmF0aW9uXG4gICAqIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSBvdGhlciBoYW5kbGVycyBiZWNhdXNlIGl0IHJlcXVpcmVzIGR5bmFtaWMgaW1wb3J0XG4gICAqIGFuZCBjb25kaXRpb25hbCByZWdpc3RyYXRpb24gYmFzZWQgb24gY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplUmVzb3VyY2VIYW5kbGVycygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBSZXNvdXJjZUhhbmRsZXIgfSA9IGF3YWl0IGltcG9ydCgnLi9oYW5kbGVycy9SZXNvdXJjZUhhbmRsZXIuanMnKTtcbiAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSB0aGlzLmNvbnRhaW5lci5yZXNvbHZlPENvbmZpZ01hbmFnZXI+KCdDb25maWdNYW5hZ2VyJyk7XG5cbiAgICAgIHRoaXMucmVzb3VyY2VIYW5kbGVyID0gbmV3IFJlc291cmNlSGFuZGxlcihjb25maWdNYW5hZ2VyKTtcbiAgICAgIGF3YWl0IHRoaXMucmVzb3VyY2VIYW5kbGVyLmluaXRpYWxpemUodGhpcy5zZXJ2ZXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBSZXNvdXJjZXMgYXJlIG9wdGlvbmFsIC0gZG9uJ3QgZmFpbCBzZXJ2ZXIgc3RhcnR1cCBpZiB0aGV5IGNhbid0IGJlIGluaXRpYWxpemVkXG4gICAgICBsb2dnZXIud2FybignW0RvbGxob3VzZU1DUF0gRmFpbGVkIHRvIGluaXRpYWxpemUgcmVzb3VyY2UgaGFuZGxlcnMsIGNvbnRpbnVpbmcgd2l0aG91dCByZXNvdXJjZXMnKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgUmVzb3VyY2UgaW5pdGlhbGl6YXRpb24gZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRW5zdXJlIHNlcnZlciBpcyBpbml0aWFsaXplZCBiZWZvcmUgYW55IG9wZXJhdGlvblxuICAgKiBGSVggIzYxMDogQWRkZWQgZm9yIHRlc3QgY29tcGF0aWJpbGl0eSAtIHRlc3RzIGRvbid0IGNhbGwgcnVuKClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlSW5pdGlhbGl6ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBJZiBpbml0aWFsaXphdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCB3YWl0IGZvciBpdFxuICAgIGlmICh0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIFN0YXJ0IGluaXRpYWxpemF0aW9uXG4gICAgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUG9ydGZvbGlvKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVJbml0aWFsaXphdGlvbigpO1xuICAgICAgICBsb2dnZXIuaW5mbyhcIlBvcnRmb2xpbyBhbmQgcGVyc29uYXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5IChsYXp5KVwiKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmVuc3VyZUluaXRpYWxpemVkJywgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICB9XG4gIFxuICAvLyBUb29sIGhhbmRsZXIgbWV0aG9kcyAtIG5vdyBwdWJsaWMgZm9yIGFjY2VzcyBmcm9tIHRvb2wgbW9kdWxlc1xuICBcbiAgYXN5bmMgbGlzdFBlcnNvbmFzKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEubGlzdFBlcnNvbmFzKCk7XG4gIH1cblxuICAvLyBVc2UgYWN0aXZhdGVFbGVtZW50KG5hbWUsICdwZXJzb25hJyksIGRlYWN0aXZhdGVFbGVtZW50KG5hbWUsICdwZXJzb25hJyksXG4gIC8vIGdldEFjdGl2ZUVsZW1lbnRzKCdwZXJzb25hJyksIGFuZCBnZXRFbGVtZW50RGV0YWlscyhuYW1lLCAncGVyc29uYScpIGluc3RlYWQuXG4gIC8vIFRoZXNlIHdlcmUgcmVtb3ZlZCB0byBub3JtYWxpemUgcGVyc29uYSBoYW5kbGluZyB0aHJvdWdoIHRoZSBnZW5lcmljIGVsZW1lbnQgQVBJLlxuXG4gIGFzeW5jIHJlbG9hZFBlcnNvbmFzKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEucmVsb2FkUGVyc29uYXMoKTtcbiAgfVxuXG4gIC8vID09PT09IEVsZW1lbnQgTWV0aG9kcyAoR2VuZXJpYyBmb3IgYWxsIGVsZW1lbnQgdHlwZXMpID09PT09XG4gIFxuICBhc3luYyBsaXN0RWxlbWVudHModHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRUeXBlID09PSBFbGVtZW50VHlwZS5QRVJTT05BKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RQZXJzb25hcygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5saXN0RWxlbWVudHMobm9ybWFsaXplZFR5cGUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0RvbGxob3VzZU1DUFNlcnZlci5saXN0RWxlbWVudHMnLCBlcnJvciwgeyB0eXBlIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBsaXN0ICR7dHlwZX06ICR7RXJyb3JIYW5kbGVyLmdldFVzZXJNZXNzYWdlKGVycm9yKX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjb250ZXh0PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyODEgLSBSb3V0ZSBhbGwgZWxlbWVudCB0eXBlcyB0aHJvdWdoIGVsZW1lbnRDUlVESGFuZGxlclxuICAgICAgLy8gUGVyc29uYUhhbmRsZXIuYWN0aXZhdGVQZXJzb25hIGlzIGRlcHJlY2F0ZWQ7IFBlcnNvbmFBY3RpdmF0aW9uU3RyYXRlZ3kgaGFuZGxlcyBwZXJzb25hc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLmFjdGl2YXRlRWxlbWVudChuYW1lLCBub3JtYWxpemVkVHlwZSwgY29udGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmFjdGl2YXRlRWxlbWVudCcsIGVycm9yLCB7IHR5cGUsIG5hbWUgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOiAke0Vycm9ySGFuZGxlci5nZXRVc2VyTWVzc2FnZShlcnJvcil9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGdldEFjdGl2ZUVsZW1lbnRzKHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBGSVg6IElzc3VlICMyODEgLSBSb3V0ZSBhbGwgZWxlbWVudCB0eXBlcyB0aHJvdWdoIGVsZW1lbnRDUlVESGFuZGxlclxuICAgICAgLy8gUGVyc29uYUhhbmRsZXIuZ2V0QWN0aXZlUGVyc29uYSBpcyBkZXByZWNhdGVkOyBQZXJzb25hQWN0aXZhdGlvblN0cmF0ZWd5IGhhbmRsZXMgcGVyc29uYXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5nZXRBY3RpdmVFbGVtZW50cyhub3JtYWxpemVkVHlwZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmdldEFjdGl2ZUVsZW1lbnRzJywgZXJyb3IsIHsgdHlwZSB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSAke3R5cGV9OiAke0Vycm9ySGFuZGxlci5nZXRVc2VyTWVzc2FnZShlcnJvcil9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGRlYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZJWDogSXNzdWUgIzI4MSAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyXG4gICAgICAvLyBQZXJzb25hSGFuZGxlci5kZWFjdGl2YXRlUGVyc29uYSBpcyBkZXByZWNhdGVkOyBQZXJzb25hQWN0aXZhdGlvblN0cmF0ZWd5IGhhbmRsZXMgcGVyc29uYXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5kZWFjdGl2YXRlRWxlbWVudChuYW1lLCBub3JtYWxpemVkVHlwZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmRlYWN0aXZhdGVFbGVtZW50JywgZXJyb3IsIHsgdHlwZSwgbmFtZSB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZGVhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzogJHtFcnJvckhhbmRsZXIuZ2V0VXNlck1lc3NhZ2UoZXJyb3IpfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBnZXRFbGVtZW50RGV0YWlscyhuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIC8vIEZJWDogSXNzdWUgIzI3NiAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgLy8gUGVyc29uYUhhbmRsZXIuZ2V0UGVyc29uYURldGFpbHMgaXMgZGVwcmVjYXRlZDsgUGVyc29uYUFjdGl2YXRpb25TdHJhdGVneSBoYW5kbGVzIHBlcnNvbmFzXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5nZXRFbGVtZW50RGV0YWlscyhuYW1lLCBub3JtYWxpemVkVHlwZSk7XG4gIH1cbiAgXG4gIGFzeW5jIHJlbG9hZEVsZW1lbnRzKHR5cGU6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLnJlbG9hZEVsZW1lbnRzKHR5cGUpO1xuICB9XG5cbiAgLy8gRWxlbWVudC1zcGVjaWZpYyBtZXRob2RzXG4gIGFzeW5jIHJlbmRlclRlbXBsYXRlKG5hbWU6IHN0cmluZywgdmFyaWFibGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEucmVuZGVyVGVtcGxhdGUobmFtZSwgdmFyaWFibGVzKTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudChuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5leGVjdXRlQWdlbnQobmFtZSwgcGFyYW1ldGVycyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgZWxlbWVudCBpbiB0aGUgcG9ydGZvbGlvLlxuICAgKiBAcGFyYW0gYXJncy5lbGVtZW50cyAtIEZvciBlbnNlbWJsZXM6IGFycmF5IG9mIGVsZW1lbnQgcmVmZXJlbmNlcyAoSXNzdWUgIzI3OClcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nOyBjb250ZW50Pzogc3RyaW5nOyBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGVsZW1lbnRzPzogRW5zZW1ibGVFbGVtZW50W119KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIC8vIEZJWDogSXNzdWUgIzIwIC0gUmVtb3ZlIHBlcnNvbmEgc3BlY2lhbCBjYXNlLCByb3V0ZSBhbGwgZWxlbWVudCBjcmVhdGlvbiB0aHJvdWdoIEVsZW1lbnRDUlVESGFuZGxlclxuICAgIC8vIFRoaXMgZW5zdXJlcyBjb25zaXN0ZW50IGR1cGxpY2F0ZSBjaGVja2luZyBhbmQgZXJyb3IgaGFuZGxpbmcgZm9yIGFsbCBlbGVtZW50IHR5cGVzXG4gICAgLy8gRklYOiBJc3N1ZSAjMjc4IC0gU3VwcG9ydCBlbGVtZW50cyBwYXJhbWV0ZXIgZm9yIGVuc2VtYmxlc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKGFyZ3MudHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5jcmVhdGVFbGVtZW50KHsuLi5hcmdzLCB0eXBlOiBub3JtYWxpemVkVHlwZX0pO1xuICB9XG5cbiAgYXN5bmMgZWRpdEVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj59KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIC8vIEZJWDogSXNzdWUgIzI3NiAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgLy8gUGVyc29uYUhhbmRsZXIuZWRpdFBlcnNvbmEgaXMgZGVwcmVjYXRlZDsgZWxlbWVudENSVURIYW5kbGVyIGhhbmRsZXMgcGVyc29uYXMgdmlhIFBlcnNvbmFBY3RpdmF0aW9uU3RyYXRlZ3lcbiAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS5ub3JtYWxpemVFbGVtZW50VHlwZShhcmdzLnR5cGUpO1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEuZWRpdEVsZW1lbnQoey4uLmFyZ3MsIHR5cGU6IG5vcm1hbGl6ZWRUeXBlfSk7XG4gIH1cblxuICBhc3luYyB2YWxpZGF0ZUVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBzdHJpY3Q/OiBib29sZWFufSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICAvLyBGSVg6IElzc3VlICMyNzYgLSBSb3V0ZSBhbGwgZWxlbWVudCB0eXBlcyB0aHJvdWdoIGVsZW1lbnRDUlVESGFuZGxlciBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZ1xuICAgIC8vIFBlcnNvbmFIYW5kbGVyLnZhbGlkYXRlUGVyc29uYSBpcyBkZXByZWNhdGVkOyBlbGVtZW50Q1JVREhhbmRsZXIgaGFuZGxlcyBwZXJzb25hc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKGFyZ3MudHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudENSVURIYW5kbGVyIS52YWxpZGF0ZUVsZW1lbnQoey4uLmFyZ3MsIHR5cGU6IG5vcm1hbGl6ZWRUeXBlfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZGVsZXRlRGF0YT86IGJvb2xlYW59KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIC8vIEZJWDogSXNzdWUgIzI3NiAtIFJvdXRlIGFsbCBlbGVtZW50IHR5cGVzIHRocm91Z2ggZWxlbWVudENSVURIYW5kbGVyIGZvciBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nXG4gICAgLy8gUGVyc29uYUhhbmRsZXIuZGVsZXRlUGVyc29uYSBpcyBkZXByZWNhdGVkOyBlbGVtZW50Q1JVREhhbmRsZXIgaGFuZGxlcyBwZXJzb25hcyB2aWEgZGVkaWNhdGVkIGRlbGV0ZSBwYXRoXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLmVsZW1lbnRDUlVESGFuZGxlciEubm9ybWFsaXplRWxlbWVudFR5cGUoYXJncy50eXBlKTtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50Q1JVREhhbmRsZXIhLmRlbGV0ZUVsZW1lbnQoey4uLmFyZ3MsIHR5cGU6IG5vcm1hbGl6ZWRUeXBlfSk7XG4gIH1cblxuICBhc3luYyBicm93c2VDb2xsZWN0aW9uKHNlY3Rpb24/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLmJyb3dzZUNvbGxlY3Rpb24oc2VjdGlvbiwgdHlwZSk7XG4gIH1cblxuICBhc3luYyBzZWFyY2hDb2xsZWN0aW9uKHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLnNlYXJjaENvbGxlY3Rpb24ocXVlcnkpO1xuICB9XG5cbiAgYXN5bmMgc2VhcmNoQ29sbGVjdGlvbkVuaGFuY2VkKHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5zZWFyY2hDb2xsZWN0aW9uRW5oYW5jZWQocXVlcnksIG9wdGlvbnMpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q29sbGVjdGlvbkNvbnRlbnQocGF0aDogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5nZXRDb2xsZWN0aW9uQ29udGVudChwYXRoKTtcbiAgfVxuXG4gIGFzeW5jIGluc3RhbGxDb250ZW50KGlucHV0UGF0aDogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5pbnN0YWxsQ29udGVudChpbnB1dFBhdGgpO1xuICB9XG5cbiAgYXN5bmMgc3VibWl0Q29udGVudChjb250ZW50SWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5zdWJtaXRDb250ZW50KGNvbnRlbnRJZGVudGlmaWVyKTtcbiAgfVxuXG4gIGFzeW5jIGdldENvbGxlY3Rpb25DYWNoZUhlYWx0aCgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLmdldENvbGxlY3Rpb25DYWNoZUhlYWx0aCgpO1xuICB9XG5cbiAgLy8gVXNlciBpZGVudGl0eSBtYW5hZ2VtZW50IC0gZGVsZWdhdGVkIHRvIElkZW50aXR5SGFuZGxlclxuICBhc3luYyBzZXRVc2VySWRlbnRpdHkodXNlcm5hbWU6IHN0cmluZywgZW1haWw/OiBzdHJpbmcpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlIYW5kbGVyIS5zZXRVc2VySWRlbnRpdHkodXNlcm5hbWUsIGVtYWlsKTtcbiAgfVxuXG4gIGFzeW5jIGdldFVzZXJJZGVudGl0eSgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdHlIYW5kbGVyIS5nZXRVc2VySWRlbnRpdHkoKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyVXNlcklkZW50aXR5KCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eUhhbmRsZXIhLmNsZWFyVXNlcklkZW50aXR5KCk7XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0eUhhbmRsZXIhLmdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTtcbiAgfVxuXG4gIC8vIEdpdEh1YiBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50XG4gIGFzeW5jIHNldHVwR2l0SHViQXV0aCgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZ2l0aHViQXV0aEhhbmRsZXIhLnNldHVwR2l0SHViQXV0aCgpO1xuICB9XG4gIFxuICBhc3luYyBjaGVja0dpdEh1YkF1dGgoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmdpdGh1YkF1dGhIYW5kbGVyIS5jaGVja0dpdEh1YkF1dGgoKTtcbiAgfVxuICBcbiAgYXN5bmMgZ2V0T0F1dGhIZWxwZXJTdGF0dXModmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmdpdGh1YkF1dGhIYW5kbGVyIS5nZXRPQXV0aEhlbHBlclN0YXR1cyh2ZXJib3NlKTtcbiAgfVxuICBcblxuICBcbiAgYXN5bmMgY2xlYXJHaXRIdWJBdXRoKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5naXRodWJBdXRoSGFuZGxlciEuY2xlYXJHaXRIdWJBdXRoKCk7XG4gIH1cblxuICAvLyBPQXV0aCBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnRcbiAgYXN5bmMgY29uZmlndXJlT0F1dGgoY2xpZW50X2lkPzogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmdpdGh1YkF1dGhIYW5kbGVyIS5jb25maWd1cmVPQXV0aChjbGllbnRfaWQpO1xuICB9XG5cblxuXG5cblxuXG5cblxuXG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBpbmRpY2F0b3Igc2V0dGluZ3MgKGRlbGVnYXRlZCB0byBEaXNwbGF5Q29uZmlnSGFuZGxlcilcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUluZGljYXRvcihjb25maWc6IFBhcnRpYWw8SW5kaWNhdG9yQ29uZmlnPikge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5Q29uZmlnSGFuZGxlciEuY29uZmlndXJlSW5kaWNhdG9yKGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgaW5kaWNhdG9yIGNvbmZpZ3VyYXRpb24gKGRlbGVnYXRlZCB0byBEaXNwbGF5Q29uZmlnSGFuZGxlcilcbiAgICovXG4gIGFzeW5jIGdldEluZGljYXRvckNvbmZpZygpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGxheUNvbmZpZ0hhbmRsZXIhLmdldEluZGljYXRvckNvbmZpZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gc2V0dGluZ3MgKGRlbGVnYXRlZCB0byBDb2xsZWN0aW9uSGFuZGxlcilcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUNvbGxlY3Rpb25TdWJtaXNzaW9uKGF1dG9TdWJtaXQ6IGJvb2xlYW4pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIhLmNvbmZpZ3VyZUNvbGxlY3Rpb25TdWJtaXNzaW9uKGF1dG9TdWJtaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gY29uZmlndXJhdGlvbiAoZGVsZWdhdGVkIHRvIENvbGxlY3Rpb25IYW5kbGVyKVxuICAgKi9cbiAgYXN5bmMgZ2V0Q29sbGVjdGlvblN1Ym1pc3Npb25Db25maWcoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyIS5nZXRDb2xsZWN0aW9uU3VibWlzc2lvbkNvbmZpZygpO1xuICB9XG5cblxuICAvKipcbiAgICogRXhwb3J0IGEgc2luZ2xlIHBlcnNvbmFcbiAgICovXG4gIGFzeW5jIGV4cG9ydFBlcnNvbmEocGVyc29uYU5hbWU6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEuZXhwb3J0UGVyc29uYShwZXJzb25hTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGFsbCBwZXJzb25hc1xuICAgKi9cbiAgYXN5bmMgZXhwb3J0QWxsUGVyc29uYXMoaW5jbHVkZURlZmF1bHRzID0gdHJ1ZSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEuZXhwb3J0QWxsUGVyc29uYXMoaW5jbHVkZURlZmF1bHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYSBwZXJzb25hXG4gICAqL1xuICBhc3luYyBpbXBvcnRQZXJzb25hKHNvdXJjZTogc3RyaW5nLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzb25hSGFuZGxlciEuaW1wb3J0UGVyc29uYShzb3VyY2UsIG92ZXJ3cml0ZSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBQb3J0Zm9saW8gbWFuYWdlbWVudCBtZXRob2RzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDaGVjayBwb3J0Zm9saW8gc3RhdHVzIGluY2x1ZGluZyByZXBvc2l0b3J5IGV4aXN0ZW5jZSBhbmQgc3luYyBpbmZvcm1hdGlvblxuICAgKi9cbiAgYXN5bmMgcG9ydGZvbGlvU3RhdHVzKHVzZXJuYW1lPzogc3RyaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb0hhbmRsZXIhLnBvcnRmb2xpb1N0YXR1cyh1c2VybmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhIG5ldyBHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcnlcbiAgICovXG4gIGFzeW5jIGluaXRQb3J0Zm9saW8ob3B0aW9uczoge3JlcG9zaXRvcnlOYW1lPzogc3RyaW5nOyBwcml2YXRlPzogYm9vbGVhbjsgZGVzY3JpcHRpb24/OiBzdHJpbmd9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb0hhbmRsZXIhLmluaXRQb3J0Zm9saW8ob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIHBvcnRmb2xpbyBzZXR0aW5nc1xuICAgKi9cbiAgYXN5bmMgcG9ydGZvbGlvQ29uZmlnKG9wdGlvbnM6IHthdXRvU3luYz86IGJvb2xlYW47IGRlZmF1bHRWaXNpYmlsaXR5Pzogc3RyaW5nOyBhdXRvU3VibWl0PzogYm9vbGVhbjsgcmVwb3NpdG9yeU5hbWU/OiBzdHJpbmd9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb0hhbmRsZXIhLnBvcnRmb2xpb0NvbmZpZyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIHBvcnRmb2xpbyB3aXRoIEdpdEh1YlxuICAgKi9cbiAgYXN5bmMgc3luY1BvcnRmb2xpbyhvcHRpb25zOiB7XG4gICAgZGlyZWN0aW9uOiBzdHJpbmc7XG4gICAgbW9kZT86IHN0cmluZztcbiAgICBmb3JjZTogYm9vbGVhbjtcbiAgICBkcnlSdW46IGJvb2xlYW47XG4gICAgY29uZmlybURlbGV0aW9ucz86IGJvb2xlYW47XG4gIH0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGZvbGlvSGFuZGxlciEuc3luY1BvcnRmb2xpbyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY29uZmlndXJhdGlvbiBvcGVyYXRpb25zIC0gZGVsZWdhdGVzIHRvIENvbmZpZ0hhbmRsZXJcbiAgKi9cbiAgYXN5bmMgaGFuZGxlQ29uZmlnT3BlcmF0aW9uKG9wdGlvbnM6IGFueSkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5jb25maWdIYW5kbGVyIS5oYW5kbGVDb25maWdPcGVyYXRpb24ob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN5bmMgb3BlcmF0aW9ucyAtIGRlbGVnYXRlcyB0byBTeW5jSGFuZGxlclxuICAgKi9cbiAgYXN5bmMgaGFuZGxlU3luY09wZXJhdGlvbihvcHRpb25zOiBhbnkpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMuc3luY0hhbmRsZXIhLmhhbmRsZVN5bmNPcGVyYXRpb24ob3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY29udGFpbmVyLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggbG9jYWwgcG9ydGZvbGlvIHVzaW5nIHRoZSBtZXRhZGF0YSBpbmRleCBzeXN0ZW1cbiAgICogVGhpcyBwcm92aWRlcyBmYXN0LCBjb21wcmVoZW5zaXZlIHNlYXJjaCBhY3Jvc3MgYWxsIGVsZW1lbnQgdHlwZXNcbiAgICovXG4gIGFzeW5jIHNlYXJjaFBvcnRmb2xpbyhvcHRpb25zOiB7XG4gICAgcXVlcnk6IHN0cmluZzsgXG4gICAgZWxlbWVudFR5cGU/OiBzdHJpbmc7IFxuICAgIGZ1enp5TWF0Y2g/OiBib29sZWFuOyBcbiAgICBtYXhSZXN1bHRzPzogbnVtYmVyOyBcbiAgICBpbmNsdWRlS2V5d29yZHM/OiBib29sZWFuOyBcbiAgICBpbmNsdWRlVGFncz86IGJvb2xlYW47IFxuICAgIGluY2x1ZGVUcmlnZ2Vycz86IGJvb2xlYW47IFxuICAgIGluY2x1ZGVEZXNjcmlwdGlvbnM/OiBib29sZWFuO1xuICB9KSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIHJldHVybiB0aGlzLnBvcnRmb2xpb0hhbmRsZXIhLnNlYXJjaFBvcnRmb2xpbyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggYWNyb3NzIGFsbCBzb3VyY2VzIChsb2NhbCwgR2l0SHViLCBjb2xsZWN0aW9uKSB1c2luZyBVbmlmaWVkSW5kZXhNYW5hZ2VyXG4gICAqIFRoaXMgcHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBzZWFyY2ggd2l0aCBkdXBsaWNhdGUgZGV0ZWN0aW9uIGFuZCB2ZXJzaW9uIGNvbXBhcmlzb25cbiAgICovXG4gIGFzeW5jIHNlYXJjaEFsbChvcHRpb25zOiB7XG4gICAgcXVlcnk6IHN0cmluZztcbiAgICBzb3VyY2VzPzogc3RyaW5nW107XG4gICAgZWxlbWVudFR5cGU/OiBzdHJpbmc7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBwYWdlU2l6ZT86IG51bWJlcjtcbiAgICBzb3J0Qnk/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGZvbGlvSGFuZGxlciEuc2VhcmNoQWxsKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgc2VtYW50aWNhbGx5IHNpbWlsYXIgZWxlbWVudHMgdXNpbmcgRW5oYW5jZWQgSW5kZXhcbiAgICovXG4gIGFzeW5jIGZpbmRTaW1pbGFyRWxlbWVudHMob3B0aW9uczoge1xuICAgIGVsZW1lbnROYW1lOiBzdHJpbmc7XG4gICAgZWxlbWVudFR5cGU/OiBzdHJpbmc7XG4gICAgbGltaXQ6IG51bWJlcjtcbiAgICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgfSkge1xuICAgIHJldHVybiB0aGlzLmVuaGFuY2VkSW5kZXhIYW5kbGVyIS5maW5kU2ltaWxhckVsZW1lbnRzKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmVsYXRpb25zaGlwcyBmb3IgYSBzcGVjaWZpYyBlbGVtZW50XG4gICAqL1xuICBhc3luYyBnZXRFbGVtZW50UmVsYXRpb25zaGlwcyhvcHRpb25zOiB7XG4gICAgZWxlbWVudE5hbWU6IHN0cmluZztcbiAgICBlbGVtZW50VHlwZT86IHN0cmluZztcbiAgICByZWxhdGlvbnNoaXBUeXBlcz86IHN0cmluZ1tdO1xuICB9KSB7XG4gICAgcmV0dXJuIHRoaXMuZW5oYW5jZWRJbmRleEhhbmRsZXIhLmdldEVsZW1lbnRSZWxhdGlvbnNoaXBzKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBmb3IgZWxlbWVudHMgYnkgYWN0aW9uIHZlcmJcbiAgICovXG4gIGFzeW5jIHNlYXJjaEJ5VmVyYihvcHRpb25zOiB7XG4gICAgdmVyYjogc3RyaW5nO1xuICAgIGxpbWl0OiBudW1iZXI7XG4gIH0pIHtcbiAgICByZXR1cm4gdGhpcy5lbmhhbmNlZEluZGV4SGFuZGxlciEuc2VhcmNoQnlWZXJiKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdGF0aXN0aWNzIGFib3V0IEVuaGFuY2VkIEluZGV4IHJlbGF0aW9uc2hpcHNcbiAgICovXG4gIGFzeW5jIGdldFJlbGF0aW9uc2hpcFN0YXRzKCkge1xuICAgIHJldHVybiB0aGlzLmVuaGFuY2VkSW5kZXhIYW5kbGVyIS5nZXRSZWxhdGlvbnNoaXBTdGF0cygpO1xuICB9XG5cbiAgYXN5bmMgcnVuKCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIkRvbGxob3VzZU1DUFNlcnZlci5ydW4oKSBzdGFydGVkXCIpO1xuICAgIGxvZ2dlci5pbmZvKFwiU3RhcnRpbmcgRG9sbGhvdXNlTUNQIHNlcnZlci4uLlwiKTtcblxuICAgIGNvbnN0IHRpbWVyID0gdGhpcy5jb250YWluZXIucmVzb2x2ZTxTdGFydHVwVGltZXI+KCdTdGFydHVwVGltZXInKTtcblxuICAgIC8vIElzc3VlICM3MDY6IENyaXRpY2FsIHBhdGggb25seSDigJQgZ2V0IHRvIGNvbm5lY3QoKSBhcyBmYXN0IGFzIHBvc3NpYmxlXG4gICAgLy8gTm9uLWNyaXRpY2FsIHdvcmsgKG1lbW9yeSBhdXRvLWxvYWQsIGFjdGl2YXRpb24gcmVzdG9yZSwgZXRjLikgaXNcbiAgICAvLyBkZWZlcnJlZCB0byBjb21wbGV0ZURlZmVycmVkU2V0dXAoKSB3aGljaCBydW5zIHBvc3QtY29ubmVjdC5cbiAgICB0cnkge1xuICAgICAgdGltZXIuc3RhcnRQaGFzZSgncG9ydGZvbGlvX3ByZXBhcmUnLCB0cnVlKTtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVBvcnRmb2xpbygpO1xuICAgICAgdGltZXIuZW5kUGhhc2UoJ3BvcnRmb2xpb19wcmVwYXJlJyk7XG5cbiAgICAgIHRpbWVyLnN0YXJ0UGhhc2UoJ2hhbmRsZXJfY3JlYXRpb24nLCB0cnVlKTtcbiAgICAgIGF3YWl0IHRoaXMuY29tcGxldGVJbml0aWFsaXphdGlvbigpO1xuICAgICAgdGltZXIuZW5kUGhhc2UoJ2hhbmRsZXJfY3JlYXRpb24nKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBvcGVyYXRpb25hbCB0ZWxlbWV0cnkgKGFzeW5jLCBub24tYmxvY2tpbmcsIG5ldmVyIHRocm93cylcbiAgICAgIGNvbnN0IG9wZXJhdGlvbmFsVGVsZW1ldHJ5ID0gdGhpcy5jb250YWluZXIucmVzb2x2ZTxPcGVyYXRpb25hbFRlbGVtZXRyeT4oJ09wZXJhdGlvbmFsVGVsZW1ldHJ5Jyk7XG4gICAgICBvcGVyYXRpb25hbFRlbGVtZXRyeS5pbml0aWFsaXplKCkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAvLyBUZWxlbWV0cnkgZXJyb3JzIGFyZSBsb2dnZWQgaW50ZXJuYWxseSwgc2FmZSB0byBpZ25vcmUgaGVyZVxuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKFwiUG9ydGZvbGlvIGFuZCBwZXJzb25hcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHlcIik7XG5cbiAgICAgIGlmICghZW52LkRPTExIT1VTRV9HQVRFS0VFUEVSX0VOQUJMRUQpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCLimqDvuI8gIEdhdGVrZWVwZXIgaXMgRElTQUJMRUQgKERPTExIT1VTRV9HQVRFS0VFUEVSX0VOQUJMRUQ9ZmFsc2UpLiBBbGwgcGVybWlzc2lvbiBjaGVja3MgYXJlIGJ5cGFzc2VkLlwiKTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oXCJEb2xsaG91c2VNQ1Agc2VydmVyIHJlYWR5IC0gd2FpdGluZyBmb3IgTUNQIGNvbm5lY3Rpb24gb24gc3RkaW9cIik7XG4gICAgICBsb2dnZXIuZGVidWcoXCJEb2xsaG91c2VNQ1BTZXJ2ZXIucnVuKCkgY29tcGxldGVkIGluaXRpYWxpemF0aW9uXCIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0RvbGxob3VzZU1DUFNlcnZlci5ydW4uaW5pdGlhbGl6YXRpb24nLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgdG8gcHJldmVudCBzZXJ2ZXIgZnJvbSBzdGFydGluZyB3aXRoIGluY29tcGxldGUgaW5pdGlhbGl6YXRpb25cbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgU3RkaW9TZXJ2ZXJUcmFuc3BvcnQoKTtcblxuICAgIC8vIFNldCB1cCBncmFjZWZ1bCBzaHV0ZG93biBoYW5kbGVyc1xuICAgIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhcIlNodXR0aW5nIGRvd24gRG9sbGhvdXNlTUNQIHNlcnZlci4uLlwiKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb250YWluZXIuZGlzcG9zZSgpO1xuICAgICAgICBsb2dnZXIuaW5mbyhcIkNsZWFudXAgY29tcGxldGVkXCIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgZHVyaW5nIGNsZWFudXBcIiwgeyBlcnJvciB9KTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH07XG5cbiAgICAvLyBSZWdpc3RlciBzaHV0ZG93biBoYW5kbGVyc1xuICAgIHByb2Nlc3Mub24oJ1NJR0lOVCcsIGNsZWFudXApO1xuICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBjbGVhbnVwKTtcbiAgICBwcm9jZXNzLm9uKCdTSUdIVVAnLCBjbGVhbnVwKTtcblxuICAgIC8vIENvbm5lY3QgQVNBUCDigJQgdG9vbHMgYXJlIHJlZ2lzdGVyZWQsIHNlcnZlciBjYW4gYWNjZXB0IHJlcXVlc3RzXG4gICAgdGltZXIuc3RhcnRQaGFzZSgnbWNwX2Nvbm5lY3QnLCB0cnVlKTtcbiAgICBhd2FpdCB0aGlzLnNlcnZlci5jb25uZWN0KHRyYW5zcG9ydCk7XG4gICAgdGltZXIuZW5kUGhhc2UoJ21jcF9jb25uZWN0Jyk7XG4gICAgdGltZXIubWFya0Nvbm5lY3QoKTtcblxuICAgIC8vIE1hcmsgdGhhdCBNQ1AgaXMgbm93IGNvbm5lY3RlZCAtIG5vIG1vcmUgY29uc29sZSBvdXRwdXQgYWxsb3dlZFxuICAgIGxvZ2dlci5zZXRNQ1BDb25uZWN0ZWQoKTtcblxuICAgIC8vIElzc3VlICM3MDYgUGhhc2UgMzogRW1pdCBSRUFEWSBzZW50aW5lbCBmb3IgYnJpZGdlIGNsaWVudHNcbiAgICBwcm9jZXNzLnN0ZGVyci53cml0ZSgnRE9MTEhPVVNFTUNQX1JFQURZXFxuJyk7XG5cbiAgICBsb2dnZXIuaW5mbyhcIkRvbGxob3VzZU1DUCBzZXJ2ZXIgcnVubmluZyBvbiBzdGRpb1wiKTtcblxuICAgIC8vIElzc3VlICM3MDYgUGhhc2UgMjogRGVmZXJyZWQgc2V0dXAg4oCUIHJ1bnMgcG9zdC1jb25uZWN0LCBub24tYmxvY2tpbmdcbiAgICAvLyBQYXR0ZXJuIGVuY3J5cHRpb24sIGJhY2tncm91bmQgdmFsaWRhdG9yLCBtZW1vcnkgYXV0by1sb2FkLCBhY3RpdmF0aW9uXG4gICAgLy8gcmVzdG9yZSwgbG9nIGhvb2tzLCBkYW5nZXIgem9uZSBpbml0IGFsbCBtb3ZlIGhlcmUuXG4gICAgY29uc3QgZGVmZXJyZWRQcm9taXNlID0gdGhpcy5jb250YWluZXIuY29tcGxldGVEZWZlcnJlZFNldHVwKCk7XG4gICAgZGVmZXJyZWRQcm9taXNlLmNhdGNoKGVyciA9PiBsb2dnZXIud2FybignW1N0YXJ0dXBdIERlZmVycmVkIHNldHVwIGVycm9yOicsIGVycikpO1xuXG4gICAgLy8gSXNzdWUgIzcwNiBQaGFzZSA0OiBXaXJlIGRlZmVycmVkIHByb21pc2UgaW50byBTZXJ2ZXJTZXR1cCBmb3IgcmVxdWVzdCBidWZmZXJpbmdcbiAgICBjb25zdCBzZXJ2ZXJTZXR1cCA9IHRoaXMuY29udGFpbmVyLnJlc29sdmU8aW1wb3J0KCcuL3NlcnZlci9TZXJ2ZXJTZXR1cC5qcycpLlNlcnZlclNldHVwPignU2VydmVyU2V0dXAnKTtcbiAgICBzZXJ2ZXJTZXR1cC5zZXREZWZlcnJlZFNldHVwUHJvbWlzZShkZWZlcnJlZFByb21pc2UpO1xuXG4gICAgLy8gTG9nIHN0YXJ0dXAgdGltaW5nIGFmdGVyIGRlZmVycmVkIHNldHVwIGNvbXBsZXRlc1xuICAgIGRlZmVycmVkUHJvbWlzZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcG9ydCA9IHRpbWVyLmdldFJlcG9ydCgpO1xuICAgICAgbG9nZ2VyLmluZm8oYFtTdGFydHVwXSBGdWxsIHJlcG9ydDogY29ubmVjdCBhdCAke3JlcG9ydC5jb25uZWN0QXRNc31tcywgYCArXG4gICAgICAgIGBjcml0aWNhbCAke3JlcG9ydC5jcml0aWNhbFBhdGhNc31tcywgZGVmZXJyZWQgJHtyZXBvcnQuZGVmZXJyZWRNc31tcywgYCArXG4gICAgICAgIGB0b3RhbCAke3JlcG9ydC50b3RhbE1zfW1zYCk7XG4gICAgfSkuY2F0Y2goKCkgPT4geyAvKiBhbHJlYWR5IGxvZ2dlZCAqLyB9KTtcblxuICB9XG59XG5cbi8vIEV4cG9ydCBpcyBhbHJlYWR5IGF0IGNsYXNzIGRlY2xhcmF0aW9uXG5cbi8vIE9ubHkgc3RhcnQgdGhlIHNlcnZlciBpZiB0aGlzIGZpbGUgaXMgYmVpbmcgcnVuIGRpcmVjdGx5IChub3QgaW1wb3J0ZWQgYnkgdGVzdHMpXG4vLyBIYW5kbGUgZGlmZmVyZW50IGV4ZWN1dGlvbiBtZXRob2RzIChkaXJlY3QsIG5weCwgQ0xJKVxuLy9cbi8vIEJ1ZyBmaXg6IG5weCBjcmVhdGVzIHN5bWxpbmtzIGluIC5iaW4vIChlLmcuIC5iaW4vbWNwLXNlcnZlciDihpIgZGlzdC9pbmRleC5qcykuXG4vLyBOb2RlLmpzIGtlZXBzIHRoZSBzeW1saW5rIHBhdGggaW4gcHJvY2Vzcy5hcmd2WzFdLCBzbyB3aXRob3V0IHJlc29sdmluZyBpdCxcbi8vIGlzRGlyZWN0RXhlY3V0aW9uIG1pc3NlZCB0aGUgZGlzdC9pbmRleC5qcyBzdWZmaXggYW5kIHRoZSBzZXJ2ZXIgbmV2ZXIgc3RhcnRlZC5cbmNvbnN0IHJhd1NjcmlwdFBhdGggPSBwcm9jZXNzLmFyZ3Y/LlsxXSA/PyAnJztcbmxldCBzY3JpcHRQYXRoID0gcmF3U2NyaXB0UGF0aCA/IHBhdGgubm9ybWFsaXplKHJhd1NjcmlwdFBhdGgpIDogJyc7XG50cnkge1xuICBzY3JpcHRQYXRoID0gcmVhbHBhdGhTeW5jKHNjcmlwdFBhdGgpO1xufSBjYXRjaCB7XG4gIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcpIHtcbiAgICBjb25zb2xlLmVycm9yKGBbREVCVUddIFN5bWxpbmsgcmVzb2x1dGlvbiBmYWlsZWQgZm9yICR7cmF3U2NyaXB0UGF0aH0g4oCUIHVzaW5nIG9yaWdpbmFsIHBhdGhgKTtcbiAgfVxufVxuY29uc3QgaXNEaXJlY3RFeGVjdXRpb24gPVxuICBzY3JpcHRQYXRoLmVuZHNXaXRoKGAke3BhdGguc2VwfWRpc3Qke3BhdGguc2VwfWluZGV4LmpzYCkgfHxcbiAgc2NyaXB0UGF0aC5lbmRzV2l0aChgJHtwYXRoLnNlcH1zcmMke3BhdGguc2VwfWluZGV4LnRzYCk7XG4vLyBNb2Rlcm4gbnBtICh2NyspIHJ1bnMgbnB4IGFzIFwibnBtIGV4ZWNcIiDigJQgbnBtX2V4ZWNwYXRoIG1heSBwb2ludCB0b1xuLy8gbnBtLWNsaS5qcyBpbnN0ZWFkIG9mIG5weC1jbGkuanMuIERldGVjdCBib3RoIGxlZ2FjeSBhbmQgbW9kZXJuIG5weC5cbmNvbnN0IGlzTnB4RXhlY3V0aW9uID1cbiAgcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5pbmNsdWRlcygnbnB4JykgfHxcbiAgcHJvY2Vzcy5lbnYubnBtX2NvbW1hbmQgPT09ICdleGVjJztcbi8vIE1hdGNoIGFsbCByZWdpc3RlcmVkIGJpbiBlbnRyeSBuYW1lcyBmcm9tIHBhY2thZ2UuanNvbiBcImJpblwiIGZpZWxkXG5jb25zdCBiaW5OYW1lID0gcGF0aC5iYXNlbmFtZShyYXdTY3JpcHRQYXRoKTtcbmNvbnN0IGlzQ2xpRXhlY3V0aW9uID0gYmluTmFtZSA9PT0gJ2RvbGxob3VzZW1jcCcgfHwgYmluTmFtZSA9PT0gJ21jcC1zZXJ2ZXInO1xuY29uc3QgaXNUZXN0ID0gcHJvY2Vzcy5lbnYuSkVTVF9XT1JLRVJfSUQ7IC8vIFRoaXMgaXMgc2V0IHdoZW4gSmVzdCBydW5zIHRlc3RzXG5jb25zdCBpc1Rlc3RNb2RlID0gcHJvY2Vzcy5lbnYuVEVTVF9NT0RFID09PSAndHJ1ZSc7IC8vIENoZWNrIGZvciBURVNUX01PREUgZW52aXJvbm1lbnQgdmFyaWFibGVcbmNvbnN0IGRvbGxob3VzZURlYnVnRmxhZyA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9ERUJVRz8udG9Mb3dlckNhc2UoKTtcbmNvbnN0IGlzRGVidWdTdGFydHVwTG9nZ2luZyA9IGRvbGxob3VzZURlYnVnRmxhZyA9PT0gJ3RydWUnIHx8IGRvbGxob3VzZURlYnVnRmxhZyA9PT0gJzEnO1xuXG4vLyBQcm9ncmVzc2l2ZSBzdGFydHVwIHdpdGggcmV0cmllcyBmb3IgbnB4L0NMSSBleGVjdXRpb25cbmNvbnN0IFNUQVJUVVBfREVMQVlTID0gWzEwLCA1MCwgMTAwLCAyMDBdOyAvLyBQcm9ncmVzc2l2ZSBkZWxheXMgaW4gbXNcblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRTZXJ2ZXJXaXRoUmV0cnkocmV0cmllc0xlZnQgPSBTVEFSVFVQX0RFTEFZUy5sZW5ndGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGlzRGVidWdTdGFydHVwTG9nZ2luZykge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJERUJVRzogc3RhcnRTZXJ2ZXJXaXRoUmV0cnkgY2FsbGVkLlwiKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IG5ldyBEb2xsaG91c2VDb250YWluZXIoKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBuZXcgRG9sbGhvdXNlTUNQU2VydmVyKGNvbnRhaW5lcik7XG4gICAgYXdhaXQgc2VydmVyLnJ1bigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChyZXRyaWVzTGVmdCA+IDAgJiYgKGlzTnB4RXhlY3V0aW9uIHx8IGlzQ2xpRXhlY3V0aW9uKSkge1xuICAgICAgLy8gVHJ5IGFnYWluIHdpdGggYSBsb25nZXIgZGVsYXlcbiAgICAgIGNvbnN0IGRlbGF5SW5kZXggPSBTVEFSVFVQX0RFTEFZUy5sZW5ndGggLSByZXRyaWVzTGVmdDtcbiAgICAgIGNvbnN0IGRlbGF5ID0gU1RBUlRVUF9ERUxBWVNbZGVsYXlJbmRleF07XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgIHJldHVybiBzdGFydFNlcnZlcldpdGhSZXRyeShyZXRyaWVzTGVmdCAtIDEpO1xuICAgIH1cbiAgICAvLyBGaW5hbCBmYWlsdXJlIC0gbWluaW1hbCBlcnJvciBtZXNzYWdlIGZvciBzZWN1cml0eVxuICAgIC8vIE5vdGU6IFVzaW5nIGNvbnNvbGUuZXJyb3IgaGVyZSBpcyBpbnRlbnRpb25hbCBhcyBpdCdzIHRoZSBmaW5hbCBlcnJvciBiZWZvcmUgZXhpdFxuICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBTZXJ2ZXIgc3RhcnR1cCBmYWlsZWRcIixcbiAgICAgIHByb2Nlc3MuZW52LkRPTExIT1VTRV9ERUJVRyA/IGVycm9yIDogKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlIHx8ICd1bmtub3duIGVycm9yJyk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgY29uc29sZSBwb3J0IGZyb20gY29uZmlnIGZpbGUsIHdpdGggcmFuZ2UgdmFsaWRhdGlvbi5cbiAqIFVzZWQgYnkgc3RhbmRhbG9uZSAtLXdlYiBtb2RlIHdoZW4gbm8gQ0xJIC0tcG9ydCBmbGFnIGlzIHByb3ZpZGVkLlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGNvbmZpZyBmaWxlIGlzIG1pc3Npbmcgb3IgdGhlIHBvcnQgaXMgaW52YWxpZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBvcnRGcm9tQ29uZmlnKCk6IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyByZWFkRmlsZSB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOmZzL3Byb21pc2VzJyk7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ2NvbmZpZy55bWwnKTtcbiAgICBjb25zdCByYXcgPSBhd2FpdCByZWFkRmlsZShjb25maWdQYXRoLCAndXRmOCcpO1xuICAgIGlmIChyYXcubGVuZ3RoID4gNjQgKiAxMDI0KSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tQb3J0Q29uZmlnXSBDb25maWcgZmlsZSBleGNlZWRzIDY0S0Ig4oCUIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCB7IENvbmZpZ01hbmFnZXIsIHZhbGlkYXRlUG9ydCB9ID0gYXdhaXQgaW1wb3J0KCcuL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzJyk7XG4gICAgY29uc3QgY29uZmlnUG9ydCA9IHZhbGlkYXRlUG9ydChDb25maWdNYW5hZ2VyLnJlYWRQb3J0RnJvbVlhbWwocmF3KSk7XG4gICAgaWYgKGNvbmZpZ1BvcnQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW1BvcnRDb25maWddIFJlc29sdmVkIHBvcnQgJHtjb25maWdQb3J0fSBmcm9tIGNvbmZpZyBmaWxlYCk7XG4gICAgICByZXR1cm4gY29uZmlnUG9ydDtcbiAgICB9XG4gICAgbG9nZ2VyLmRlYnVnKCdbUG9ydENvbmZpZ10gTm8gdmFsaWQgcG9ydCBpbiBjb25maWcgZmlsZSDigJQgdXNpbmcgZW52L2RlZmF1bHQnKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGNhdGNoIHtcbiAgICBsb2dnZXIuZGVidWcoJ1tQb3J0Q29uZmlnXSBDb25maWcgZmlsZSBub3QgZm91bmQg4oCUIHVzaW5nIGVudi9kZWZhdWx0Jyk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5pZiAoKGlzRGlyZWN0RXhlY3V0aW9uIHx8IGlzTnB4RXhlY3V0aW9uIHx8IGlzQ2xpRXhlY3V0aW9uKSAmJiAoIWlzVGVzdCB8fCBpc1Rlc3RNb2RlKSkge1xuICAvLyBJc3N1ZSAjNzA0OiAtLXdlYiBmbGFnIHN0YXJ0cyB0aGUgcG9ydGZvbGlvIHdlYiBVSSBpbnN0ZWFkIG9mIE1DUCBzZXJ2ZXJcbiAgY29uc3QgaXNXZWJNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXdlYicpO1xuICBpZiAoaXNXZWJNb2RlKSB7XG4gICAgLy8gSXNzdWUgIzc5NjogQm9vdHN0cmFwIERJIGNvbnRhaW5lciBmb3Igd2ViLW9ubHkgbW9kZSBzbyBBUEkgcm91dGVzXG4gICAgLy8gZ28gdGhyb3VnaCBNQ1BBUUxIYW5kbGVyICh2YWxpZGF0ZWQsIGNhY2hlZCwgZ2F0ZWtlZXBlci1jaGVja2VkKVxuICAgIC8vXG4gICAgLy8gU3VwcHJlc3MgdGVybWluYWwgb3V0cHV0IGluIC0td2ViIG1vZGUgdW5sZXNzIERPTExIT1VTRV9ERUJVRyBpcyBzZXQuXG4gICAgLy8gQWxsIGxvZ3MgYXJlIHN0aWxsIGNhcHR1cmVkIGluIE1lbW9yeUxvZ1NpbmsgYW5kIHZpc2libGUgaW4gdGhlIExvZ3MgdGFiIOKAlFxuICAgIC8vIHRoZSB0ZXJtaW5hbCBvbmx5IG5lZWRzIHRoZSBjb25zb2xlIFVSTCBiYW5uZXIsIG5vdCBhIHdhbGwgb2Ygc3RhcnR1cCBub2lzZS5cbiAgICBpZiAoIXByb2Nlc3MuZW52LkRPTExIT1VTRV9ERUJVRyAmJiAhcHJvY2Vzcy5lbnYuRU5BQkxFX0RFQlVHKSB7XG4gICAgICBsb2dnZXIuc2V0TWluTGV2ZWwoJ2Vycm9yJyk7XG4gICAgfVxuXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHBvcnRmb2xpb0RpciA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ3BvcnRmb2xpbycpO1xuICAgICAgLy8gQ0xJIGZsYWcgcGFyc2VkIGVhcmx5OyBjb25maWcgZmlsZSByZXNvbHZlZCBhZnRlciBjb250YWluZXIgYm9vdHN0cmFwICgjMTg0MClcbiAgICAgIGNvbnN0IHBvcnRBcmcgPSBwcm9jZXNzLmFyZ3YuZmluZChhID0+IGEuc3RhcnRzV2l0aCgnLS1wb3J0PScpKTtcbiAgICAgIGNvbnN0IGNsaVBvcnQgPSBwb3J0QXJnID8gTnVtYmVyLnBhcnNlSW50KHBvcnRBcmcuc3BsaXQoJz0nKVsxXSwgMTApIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgbm9Ccm93c2VyID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLW5vLW9wZW4nKTtcblxuICAgICAgLy8gUHJlLWZsaWdodDoga2lsbCBhbnkgc3RhbGUgRG9sbGhvdXNlTUNQIHByb2Nlc3Mgc3F1YXR0aW5nIG9uIG91ciBwb3J0XG4gICAgICAvLyBCRUZPUkUgYW55IGNvbnRhaW5lci9zZXJ2ZXIgc2V0dXAuIFRoaXMgaXMgdGhlIGRlZmluaXRpdmUgZml4IGZvciAjMTg1MCDigJRcbiAgICAgIC8vIGNsZWFyIHRoZSBwb3J0IGZpcnN0LCB0aGVuIHN0YXJ0IGNsZWFubHkuXG4gICAgICAvLyBSYWNlIGNvbmRpdGlvbiBub3RlOiBhIG5ldyBwcm9jZXNzIGNvdWxkIGdyYWIgdGhlIHBvcnQgYmV0d2VlbiBraWxsIGFuZFxuICAgICAgLy8gb3VyIGJpbmQsIGJ1dCByZWNvdmVyU3RhbGVQb3J0J3MgVE9DVE9VIG1pdGlnYXRpb24gKDUwMG1zIGxvY2sgZmlsZVxuICAgICAgLy8gcmUtcmVhZCkgYW5kIGJpbmRBbmRMaXN0ZW4ncyBvd24gcmVjb3ZlcnkgaGFuZGxlIHRoYXQgZWRnZSBjYXNlLlxuICAgICAgY29uc3QgdGFyZ2V0UG9ydCA9IGNsaVBvcnQgfHwgZW52LkRPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyByZWNvdmVyU3RhbGVQb3J0IH0gPSBhd2FpdCBpbXBvcnQoJy4vd2ViL2NvbnNvbGUvU3RhbGVQcm9jZXNzUmVjb3ZlcnkuanMnKTtcbiAgICAgICAgY29uc3QgcmVjb3ZlcmVkID0gYXdhaXQgcmVjb3ZlclN0YWxlUG9ydCh0YXJnZXRQb3J0KTtcbiAgICAgICAgaWYgKHJlY292ZXJlZCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgQ2xlYXJlZCBzdGFsZSBwcm9jZXNzIGZyb20gcG9ydCAke3RhcmdldFBvcnR9XFxuYCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBOb24tZmF0YWwg4oCUIGJpbmRBbmRMaXN0ZW4gd2lsbCBoYW5kbGUgRUFERFJJTlVTRSBhcyBhIGZhbGxiYWNrLlxuICAgICAgICAvLyBMb2cgc28gb3BlcmF0b3JzIGNhbiBkaWFnbm9zZSByZWNvdmVyeSBmYWlsdXJlcy5cbiAgICAgICAgY29uc29sZS5lcnJvcihgW0RvbGxob3VzZU1DUF0gUHJlLWZsaWdodCBwb3J0IHJlY292ZXJ5IGZhaWxlZDogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycil9YCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBtY3BBcWxIYW5kbGVyO1xuICAgICAgbGV0IG1lbW9yeVNpbms6IGltcG9ydCgnLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnKS5NZW1vcnlMb2dTaW5rIHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IG1ldHJpY3NTaW5rOiBpbXBvcnQoJy4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcycpLk1lbW9yeU1ldHJpY3NTaW5rIHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gbmV3IERvbGxob3VzZUNvbnRhaW5lcigpO1xuICAgICAgICBhd2FpdCBjb250YWluZXIucHJlcGFyZVBvcnRmb2xpbygpO1xuICAgICAgICBjb25zdCBidW5kbGUgPSBhd2FpdCBjb250YWluZXIuYm9vdHN0cmFwSGFuZGxlcnMoKTtcbiAgICAgICAgLy8gRG8gTk9UIGNhbGwgY29tcGxldGVEZWZlcnJlZFNldHVwKCkgaW4gLS13ZWIgbW9kZSAoIzE4NTApLlxuICAgICAgICAvLyBJdCBydW5zIFVuaWZpZWRDb25zb2xlIGxlYWRlciBlbGVjdGlvbiB3aGljaCBzdGFydHMgYSBjb21wZXRpbmdcbiAgICAgICAgLy8gd2ViIHNlcnZlciwgc2V0cyBzZXJ2ZXJSdW5uaW5nPXRydWUsIGFuZCBjYXVzZXMgdGhlIGFjdHVhbFxuICAgICAgICAvLyBzdGFydFdlYlNlcnZlciBjYWxsIGJlbG93IHRvIGVhcmx5LXJldHVybiB3aXRob3V0IGJpbmRpbmcuXG4gICAgICAgIC8vIFN0YW5kYWxvbmUgLS13ZWIgbW9kZSBJUyB0aGUgc2VydmVyIOKAlCBubyBsZWFkZXIvZm9sbG93ZXIgbmVlZGVkLlxuICAgICAgICAvLyBSdW4gdGhlIHBvcnQgZmlsZSBzd2VlcCBkaXJlY3RseSBpbnN0ZWFkLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgc3dlZXBTdGFsZVBvcnRGaWxlcyB9ID0gYXdhaXQgaW1wb3J0KCcuL3dlYi9wb3J0RGlzY292ZXJ5LmpzJyk7XG4gICAgICAgICAgYXdhaXQgc3dlZXBTdGFsZVBvcnRGaWxlcygpO1xuICAgICAgICB9IGNhdGNoIHsgLyogbm9uLWZhdGFsICovIH1cbiAgICAgICAgbWNwQXFsSGFuZGxlciA9IGJ1bmRsZS5tY3BBcWxIYW5kbGVyO1xuICAgICAgICAvLyBFeHRyYWN0IHNpbmtzIGZyb20gY29udGFpbmVyIOKAlCBkZWZlcnJlZCBzZXR1cCBtYXkgaGF2ZSBhbHJlYWR5IHdpcmVkIHRoZW1cbiAgICAgICAgdHJ5IHsgbWVtb3J5U2luayA9IGNvbnRhaW5lci5yZXNvbHZlPGltcG9ydCgnLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnKS5NZW1vcnlMb2dTaW5rPignTWVtb3J5TG9nU2luaycpOyB9IGNhdGNoIHsgLyogbm90IHJlZ2lzdGVyZWQgKi8gfVxuICAgICAgICB0cnkgeyBtZXRyaWNzU2luayA9IGNvbnRhaW5lci5yZXNvbHZlPGltcG9ydCgnLi9tZXRyaWNzL3NpbmtzL01lbW9yeU1ldHJpY3NTaW5rLmpzJykuTWVtb3J5TWV0cmljc1Npbms+KCdNZW1vcnlNZXRyaWNzU2luaycpOyB9IGNhdGNoIHsgLyogbm90IHJlZ2lzdGVyZWQgKi8gfVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBDb250YWluZXIgYm9vdHN0cmFwIGZhaWxlZCDigJQgd2ViIHJvdXRlcyB3aWxsIHVzZSBkaXJlY3QgZmlsZXN5c3RlbSBhY2Nlc3MuXCIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiW0RvbGxob3VzZU1DUF0gUmVhc29uOlwiLCAoZXJyIGFzIEVycm9yKS5tZXNzYWdlIHx8IGVycik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBUaGlzIG1heSBpbmRpY2F0ZSBhIGNvcnJ1cHQgcG9ydGZvbGlvIG9yIG1pc3NpbmcgZGVwZW5kZW5jaWVzLlwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gRW5zdXJlIHNpbmtzIGV4aXN0IGV2ZW4gaWYgY29udGFpbmVyIGJvb3RzdHJhcCBmYWlsZWQg4oCUXG4gICAgICAvLyBzdGFuZGFsb25lIC0td2ViIG1vZGUgc3RpbGwgbmVlZHMgd29ya2luZyBsb2dzIGFuZCBtZXRyaWNzIHRhYnNcbiAgICAgIGlmICghbWVtb3J5U2luaykge1xuICAgICAgICBjb25zdCB7IE1lbW9yeUxvZ1NpbmsgfSA9IGF3YWl0IGltcG9ydCgnLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnKTtcbiAgICAgICAgbWVtb3J5U2luayA9IG5ldyBNZW1vcnlMb2dTaW5rKHtcbiAgICAgICAgICBhcHBDYXBhY2l0eTogMTAwMDAsXG4gICAgICAgICAgc2VjdXJpdHlDYXBhY2l0eTogNTAwMCxcbiAgICAgICAgICBwZXJmQ2FwYWNpdHk6IDIwMDAsXG4gICAgICAgICAgdGVsZW1ldHJ5Q2FwYWNpdHk6IDEwMDAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFtZXRyaWNzU2luaykge1xuICAgICAgICBjb25zdCB7IE1lbW9yeU1ldHJpY3NTaW5rIH0gPSBhd2FpdCBpbXBvcnQoJy4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcycpO1xuICAgICAgICBtZXRyaWNzU2luayA9IG5ldyBNZW1vcnlNZXRyaWNzU2luaygyNDApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgaW5nZXN0IHJvdXRlcyBzbyAtLXdlYiBtb2RlIGhhcyBhIHNlc3Npb24gcmVnaXN0cnkgKCMxODA1KS5cbiAgICAgIC8vIFdpdGhvdXQgdGhpcywgdGhlIHNlc3Npb24gaW5kaWNhdG9yIGlzIGFsd2F5cyBlbXB0eSBpbiBzdGFuZGFsb25lIG1vZGUuXG4gICAgICBjb25zdCB7IGNyZWF0ZUluZ2VzdFJvdXRlcyB9ID0gYXdhaXQgaW1wb3J0KCcuL3dlYi9jb25zb2xlL0luZ2VzdFJvdXRlcy5qcycpO1xuICAgICAgY29uc3QgaW5nZXN0UmVzdWx0ID0gY3JlYXRlSW5nZXN0Um91dGVzKHtcbiAgICAgICAgbG9nQnJvYWRjYXN0OiAoZW50cnkpID0+IHsgLyogd2lyZWQgYWZ0ZXIgc2VydmVyIHN0YXJ0cyAqLyB9LFxuICAgICAgfSk7XG4gICAgICBpbmdlc3RSZXN1bHQucmVnaXN0ZXJDb25zb2xlU2Vzc2lvbigpO1xuXG4gICAgICAvLyBJbml0aWFsaXplIGNvbnNvbGUgdG9rZW4gc3RvcmUgc28gQXV0aCB0YWIgcm91dGVzIG1vdW50ICgjMTgyNSkuXG4gICAgICAvLyBNaXJyb3JzIFVuaWZpZWRDb25zb2xlLnRzOnN0YXJ0QXNMZWFkZXIoKSDigJQgd2l0aG91dCB0aGlzLFxuICAgICAgLy8gL2FwaS9jb25zb2xlL3RvdHAgYW5kIC9hcGkvY29uc29sZS90b2tlbiByZXR1cm4gNDA0LlxuICAgICAgY29uc3QgeyBDb25zb2xlVG9rZW5TdG9yZSB9ID0gYXdhaXQgaW1wb3J0KCcuL3dlYi9jb25zb2xlL2NvbnNvbGVUb2tlbi5qcycpO1xuICAgICAgY29uc3QgeyBwaWNrUmFuZG9tUHVwcGV0TmFtZSB9ID0gYXdhaXQgaW1wb3J0KCcuL3dlYi9jb25zb2xlL1Nlc3Npb25OYW1lcy5qcycpO1xuICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IG5ldyBDb25zb2xlVG9rZW5TdG9yZShlbnYuRE9MTEhPVVNFX0NPTlNPTEVfVE9LRU5fRklMRSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0b2tlblN0b3JlLmVuc3VyZUluaXRpYWxpemVkKHBpY2tSYW5kb21QdXBwZXROYW1lKCkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tEb2xsaG91c2VNQ1BdIEZhaWxlZCB0byBpbml0aWFsaXplIGNvbnNvbGUgdG9rZW4gc3RvcmUg4oCUIEF1dGggdGFiIHdpbGwgYmUgbm9uLWZ1bmN0aW9uYWwnLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHBvcnQ6IENMSSBmbGFnIOKGkiBjb25maWcgZmlsZSDihpIgZW52IHZhciDihpIgZGVmYXVsdCAoIzE4NDApXG4gICAgICBjb25zdCByZXNvbHZlZFBvcnQgPSBjbGlQb3J0IHx8IGF3YWl0IHJlc29sdmVQb3J0RnJvbUNvbmZpZygpO1xuXG4gICAgICBjb25zdCB7IHN0YXJ0V2ViU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoJy4vd2ViL3NlcnZlci5qcycpO1xuICAgICAgYXdhaXQgc3RhcnRXZWJTZXJ2ZXIoeyBwb3J0Zm9saW9EaXIsIHBvcnQ6IHJlc29sdmVkUG9ydCwgb3BlbkJyb3dzZXI6ICFub0Jyb3dzZXIsIG1jcEFxbEhhbmRsZXIsIG1lbW9yeVNpbmssIG1ldHJpY3NTaW5rLCBhZGRpdGlvbmFsUm91dGVyczogW2luZ2VzdFJlc3VsdC5yb3V0ZXJdLCB0b2tlblN0b3JlIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHF1aXQgY29tbWFuZHMgb24gc3RkaW4gKHN0YW5kYWxvbmUgLS13ZWIgbW9kZSBvbmx5KS5cbiAgICAgIC8vIEluIE1DUCBzdGRpbyBtb2RlLCBzdGRpbiBpcyBjb25zdW1lZCBieSB0aGUgSlNPTi1SUEMgdHJhbnNwb3J0LlxuICAgICAgaWYgKHByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygndXRmLTgnKTtcbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcbiAgICAgICAgbGV0IHF1aXREZWJvdW5jZTogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgICAgICAgcHJvY2Vzcy5zdGRpbi5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBjbWQgPSBkYXRhLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGlmIChjbWQgPT09ICdxJyB8fCBjbWQgPT09ICdxdWl0JyB8fCBjbWQgPT09ICdleGl0Jykge1xuICAgICAgICAgICAgLy8gRGVib3VuY2UgcmFwaWQgaW5wdXRzIChlLmcuLCBhY2NpZGVudGFsIGRvdWJsZS10YXApXG4gICAgICAgICAgICBpZiAocXVpdERlYm91bmNlKSByZXR1cm47XG4gICAgICAgICAgICBxdWl0RGVib3VuY2UgPSBzZXRUaW1lb3V0KCgpID0+IHsgcXVpdERlYm91bmNlID0gbnVsbDsgfSwgMjAwKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1xcbiAgU2h1dHRpbmcgZG93biBEb2xsaG91c2VNQ1AuLi5cXG4nKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pKCkuY2F0Y2goZXJyID0+IHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBXZWIgVUkgZmFpbGVkIHRvIHN0YXJ0OlwiLCBlcnIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGlmIChpc0RlYnVnU3RhcnR1cExvZ2dpbmcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJERUJVRzogU2VydmVyIHN0YXJ0dXAgY29uZGl0aW9uIG1ldC4gQ2FsbGluZyBzdGFydFNlcnZlcldpdGhSZXRyeS5cIik7XG4gICAgfVxuICAgIHN0YXJ0U2VydmVyV2l0aFJldHJ5KCkuY2F0Y2goKCkgPT4ge1xuICAgICAgLy8gTm90ZTogVXNpbmcgY29uc29sZS5lcnJvciBoZXJlIGlzIGludGVudGlvbmFsIGFzIGl0J3MgdGhlIGZpbmFsIGVycm9yIGJlZm9yZSBleGl0XG4gICAgICBjb25zb2xlLmVycm9yKFwiW0RvbGxob3VzZU1DUF0gU2VydmVyIHN0YXJ0dXAgZmFpbGVkXCIpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -20,7 +20,7 @@ export declare function findPidOnPort(port: number): Promise<number | null>;
|
|
|
20
20
|
/**
|
|
21
21
|
* Kill a stale process holding a port. Sends SIGTERM, waits briefly,
|
|
22
22
|
* then SIGKILL if still alive. Only kills DollhouseMCP processes
|
|
23
|
-
* (verified
|
|
23
|
+
* (verified by checking the command line and user ownership).
|
|
24
24
|
*
|
|
25
25
|
* Timeout: 1s for ps verification. Kill wait: 300ms × 10 polls = 3s
|
|
26
26
|
* before escalating to SIGKILL. Total worst case: ~4s.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StaleProcessRecovery.d.ts","sourceRoot":"","sources":["../../../src/web/console/StaleProcessRecovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"StaleProcessRecovery.d.ts","sourceRoot":"","sources":["../../../src/web/console/StaleProcessRecovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA6BH;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBxE;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAuDlF;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BrE"}
|
|
@@ -10,6 +10,16 @@
|
|
|
10
10
|
*/
|
|
11
11
|
// Use lazy import for logger to avoid pulling in the full env.ts/config chain
|
|
12
12
|
// at module load time. This keeps the module independently testable.
|
|
13
|
+
/** Timeout for lsof/fuser/ps system calls (ms) */
|
|
14
|
+
const COMMAND_TIMEOUT_MS = 1000;
|
|
15
|
+
/** Polling interval when waiting for SIGTERM to take effect (ms) */
|
|
16
|
+
const SIGTERM_POLL_MS = 300;
|
|
17
|
+
/** Number of polls before escalating to SIGKILL */
|
|
18
|
+
const KILL_POLL_COUNT = 10;
|
|
19
|
+
/** Wait after SIGKILL before returning (ms) */
|
|
20
|
+
const SIGKILL_WAIT_MS = 500;
|
|
21
|
+
/** Wait between lock file reads for TOCTOU mitigation (ms) */
|
|
22
|
+
const LOCK_RECHECK_DELAY_MS = 500;
|
|
13
23
|
let _logger = null;
|
|
14
24
|
async function getLogger() {
|
|
15
25
|
if (!_logger) {
|
|
@@ -43,7 +53,7 @@ export async function findPidOnPort(port) {
|
|
|
43
53
|
{ bin: 'fuser', args: [`${port}/tcp`] },
|
|
44
54
|
]) {
|
|
45
55
|
try {
|
|
46
|
-
const { stdout, stderr } = await execFileAsync(cmd.bin, cmd.args, { timeout:
|
|
56
|
+
const { stdout, stderr } = await execFileAsync(cmd.bin, cmd.args, { timeout: COMMAND_TIMEOUT_MS });
|
|
47
57
|
// fuser outputs to stderr on some systems
|
|
48
58
|
const output = (stdout || stderr || '').trim();
|
|
49
59
|
const pids = output.split(/\s+/).map(Number).filter(n => !Number.isNaN(n) && n > 0);
|
|
@@ -58,23 +68,33 @@ export async function findPidOnPort(port) {
|
|
|
58
68
|
return null;
|
|
59
69
|
}
|
|
60
70
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
71
|
+
* Kill a stale process holding a port. Sends SIGTERM, waits briefly,
|
|
72
|
+
* then SIGKILL if still alive. Only kills DollhouseMCP processes
|
|
73
|
+
* (verified by checking the command line and user ownership).
|
|
74
|
+
*
|
|
75
|
+
* Timeout: 1s for ps verification. Kill wait: 300ms × 10 polls = 3s
|
|
76
|
+
* before escalating to SIGKILL. Total worst case: ~4s.
|
|
63
77
|
*/
|
|
64
|
-
async function
|
|
78
|
+
export async function killStaleProcess(pid, port) {
|
|
65
79
|
const { execFile: execFileCb } = await import('node:child_process');
|
|
66
80
|
const { promisify } = await import('node:util');
|
|
67
81
|
const execFileAsync = promisify(execFileCb);
|
|
82
|
+
// Security verification flow — three checks must pass before we kill:
|
|
83
|
+
// 1. Process must be owned by the current OS user (prevents cross-user kills)
|
|
84
|
+
// 2. Command line must match a DollhouseMCP binary path (prevents killing other services)
|
|
85
|
+
// 3. If both fail or ps can't run, we refuse — safe default is to not kill
|
|
68
86
|
try {
|
|
69
|
-
const { stdout } = await execFileAsync('ps', ['-p', String(pid), '-o', 'user=,command='], { timeout:
|
|
87
|
+
const { stdout } = await execFileAsync('ps', ['-p', String(pid), '-o', 'user=,command='], { timeout: COMMAND_TIMEOUT_MS });
|
|
70
88
|
// Check 1: User ownership — only kill our own processes
|
|
71
89
|
const currentUser = (await import('node:os')).userInfo().username;
|
|
72
90
|
if (!stdout.trim().startsWith(currentUser)) {
|
|
73
91
|
await logger.warn(`[WebUI] Port ${port} held by different user (pid ${pid}) — not killing`);
|
|
74
92
|
return false;
|
|
75
93
|
}
|
|
76
|
-
// Check 2: Binary identity — .bin/mcp-server, .bin/dollhousemcp,
|
|
77
|
-
// /bin/dollhousemcp (global), or dist/index.js (direct node).
|
|
94
|
+
// Check 2: Binary identity — must be .bin/mcp-server, .bin/dollhousemcp,
|
|
95
|
+
// /bin/dollhousemcp (global install), or dist/index.js (direct node execution).
|
|
96
|
+
// NOT just 'mcp-server' anywhere in the path — that would match Jest workers
|
|
97
|
+
// running from within the mcp-server project directory.
|
|
78
98
|
const cmdLine = stdout.trim();
|
|
79
99
|
const isDollhouseBin = /(?:^|\/)dollhousemcp(?:\s|$)/.test(cmdLine) ||
|
|
80
100
|
cmdLine.includes('.bin/dollhousemcp');
|
|
@@ -85,37 +105,19 @@ async function verifyDollhouseProcess(pid, port) {
|
|
|
85
105
|
return false;
|
|
86
106
|
}
|
|
87
107
|
await logger.debug(`[WebUI] Verified stale process ${pid} is DollhouseMCP`, { cmdLine });
|
|
88
|
-
return true;
|
|
89
108
|
}
|
|
90
109
|
catch (err) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
else if (code === 'ESRCH')
|
|
96
|
-
reason = 'process died during verification';
|
|
97
|
-
else
|
|
98
|
-
reason = err instanceof Error ? err.message : String(err);
|
|
99
|
-
await logger.debug(`[WebUI] Cannot verify process ${pid} — skipping kill (${reason})`);
|
|
110
|
+
// Check 3: If we can't verify, don't kill — safe default
|
|
111
|
+
await logger.debug(`[WebUI] Cannot verify process ${pid} — skipping kill`, {
|
|
112
|
+
error: err instanceof Error ? err.message : String(err),
|
|
113
|
+
});
|
|
100
114
|
return false;
|
|
101
115
|
}
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Kill a stale process holding a port. Sends SIGTERM, waits briefly,
|
|
105
|
-
* then SIGKILL if still alive. Only kills DollhouseMCP processes
|
|
106
|
-
* (verified via verifyDollhouseProcess).
|
|
107
|
-
*
|
|
108
|
-
* Timeout: 1s for ps verification. Kill wait: 300ms × 10 polls = 3s
|
|
109
|
-
* before escalating to SIGKILL. Total worst case: ~4s.
|
|
110
|
-
*/
|
|
111
|
-
export async function killStaleProcess(pid, port) {
|
|
112
|
-
if (!await verifyDollhouseProcess(pid, port))
|
|
113
|
-
return false;
|
|
114
116
|
try {
|
|
115
117
|
process.kill(pid, 'SIGTERM');
|
|
116
|
-
|
|
117
|
-
for (let i = 0; i <
|
|
118
|
-
await new Promise(r => setTimeout(r,
|
|
118
|
+
logger.warn(`[WebUI] Sent SIGTERM to stale process ${pid} on port ${port}`);
|
|
119
|
+
for (let i = 0; i < KILL_POLL_COUNT; i++) {
|
|
120
|
+
await new Promise(r => setTimeout(r, SIGTERM_POLL_MS));
|
|
119
121
|
try {
|
|
120
122
|
process.kill(pid, 0);
|
|
121
123
|
}
|
|
@@ -124,8 +126,8 @@ export async function killStaleProcess(pid, port) {
|
|
|
124
126
|
}
|
|
125
127
|
}
|
|
126
128
|
process.kill(pid, 'SIGKILL');
|
|
127
|
-
|
|
128
|
-
await new Promise(r => setTimeout(r,
|
|
129
|
+
logger.warn(`[WebUI] Sent SIGKILL to stale process ${pid} on port ${port}`);
|
|
130
|
+
await new Promise(r => setTimeout(r, SIGKILL_WAIT_MS));
|
|
129
131
|
return true;
|
|
130
132
|
}
|
|
131
133
|
catch {
|
|
@@ -143,12 +145,11 @@ export async function recoverStalePort(port) {
|
|
|
143
145
|
const stalePid = await findPidOnPort(port);
|
|
144
146
|
if (!stalePid)
|
|
145
147
|
return false;
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
// second read now matches the port holder, it's a fresh leader — don't kill.
|
|
148
|
+
// TOCTOU mitigation: a new process may have just bound the port but not yet
|
|
149
|
+
// written its lock file. Read the lock, pause, re-read. If the second read
|
|
150
|
+
// now matches the port holder, it's a fresh leader — don't kill.
|
|
150
151
|
const { readLeaderLock } = await import('./LeaderElection.js');
|
|
151
|
-
for (let
|
|
152
|
+
for (let check = 0; check < 2; check++) {
|
|
152
153
|
try {
|
|
153
154
|
const lock = await readLeaderLock();
|
|
154
155
|
if (lock?.pid === stalePid && lock?.port === port && lock.pid !== process.pid) {
|
|
@@ -157,18 +158,17 @@ export async function recoverStalePort(port) {
|
|
|
157
158
|
}
|
|
158
159
|
}
|
|
159
160
|
catch {
|
|
160
|
-
// Can't read lock file — continue to next
|
|
161
|
+
// Can't read lock file — continue to next check or kill
|
|
161
162
|
}
|
|
162
|
-
if (
|
|
163
|
-
|
|
164
|
-
await new Promise(r => setTimeout(r, 500));
|
|
163
|
+
if (check === 0) {
|
|
164
|
+
await new Promise(r => setTimeout(r, LOCK_RECHECK_DELAY_MS));
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
167
|
const killed = await killStaleProcess(stalePid, port);
|
|
168
168
|
if (killed) {
|
|
169
169
|
logger.info(`[WebUI] Stale process ${stalePid} removed from port ${port}`);
|
|
170
|
-
await new Promise(r => setTimeout(r,
|
|
170
|
+
await new Promise(r => setTimeout(r, SIGKILL_WAIT_MS)); // brief pause for port release
|
|
171
171
|
}
|
|
172
172
|
return killed;
|
|
173
173
|
}
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhbGVQcm9jZXNzUmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvU3RhbGVQcm9jZXNzUmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsOEVBQThFO0FBQzlFLHFFQUFxRTtBQUNyRSxJQUFJLE9BQU8sR0FBeUQsSUFBSSxDQUFDO0FBQ3pFLEtBQUssVUFBVSxTQUFTO0lBQ3RCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQztZQUFDLE9BQU8sR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFDRCxNQUFNLE1BQU0sR0FBRztJQUNiLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFlLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLE1BQU0sU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvSSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBZSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxNQUFNLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENB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Z0JBQ3BHLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCwwREFBMEQ7UUFDNUQsQ0FBQztRQUNELElBQUksT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xCLG1FQUFtRTtZQUNuRSxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdEQsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLFFBQVEsc0JBQXNCLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0UsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RhbGUgcHJvY2VzcyBkZXRlY3Rpb24gYW5kIHJlY292ZXJ5ICgjMTg1MCkuXG4gKlxuICogRmluZHMgYW5kIGtpbGxzIHpvbWJpZSBEb2xsaG91c2VNQ1AgcHJvY2Vzc2VzIHRoYXQgc3F1YXQgb24gdGhlIGNvbnNvbGVcbiAqIHBvcnQgYWZ0ZXIgdGhlaXIgc2Vzc2lvbiBoYXMgZW5kZWQuIFVzZWQgYnkgYmluZEFuZExpc3RlbiBpbiBzZXJ2ZXIudHNcbiAqIHdoZW4gRUFERFJJTlVTRSBvY2N1cnMuXG4gKlxuICogRXh0cmFjdGVkIHRvIGEgc3RhbmRhbG9uZSBtb2R1bGUgc28gaXQgY2FuIGJlIHRlc3RlZCB3aXRob3V0IGltcG9ydGluZ1xuICogdGhlIGZ1bGwgRXhwcmVzcyBzZXJ2ZXIgYW5kIGl0cyBkZXBlbmRlbmN5IGNoYWluLlxuICovXG5cbi8vIFVzZSBsYXp5IGltcG9ydCBmb3IgbG9nZ2VyIHRvIGF2b2lkIHB1bGxpbmcgaW4gdGhlIGZ1bGwgZW52LnRzL2NvbmZpZyBjaGFpblxuLy8gYXQgbW9kdWxlIGxvYWQgdGltZS4gVGhpcyBrZWVwcyB0aGUgbW9kdWxlIGluZGVwZW5kZW50bHkgdGVzdGFibGUuXG5sZXQgX2xvZ2dlcjogdHlwZW9mIGltcG9ydCgnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJykubG9nZ2VyIHwgbnVsbCA9IG51bGw7XG5hc3luYyBmdW5jdGlvbiBnZXRMb2dnZXIoKSB7XG4gIGlmICghX2xvZ2dlcikge1xuICAgIHRyeSB7IF9sb2dnZXIgPSAoYXdhaXQgaW1wb3J0KCcuLi8uLi91dGlscy9sb2dnZXIuanMnKSkubG9nZ2VyOyB9XG4gICAgY2F0Y2ggeyAvKiBmYWxsYmFjayBiZWxvdyAqLyB9XG4gIH1cbiAgcmV0dXJuIF9sb2dnZXI7XG59XG5jb25zdCBsb2dnZXIgPSB7XG4gIHdhcm46IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pID0+IHsgY29uc3QgbCA9IGF3YWl0IGdldExvZ2dlcigpOyBsID8gbC53YXJuKGFyZ3NbMF0gYXMgc3RyaW5nLCBhcmdzWzFdKSA6IGNvbnNvbGUuZXJyb3IoJ1tXQVJOXScsIC4uLmFyZ3MpOyB9LFxuICBpbmZvOiBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7IGNvbnN0IGwgPSBhd2FpdCBnZXRMb2dnZXIoKTsgbCA/IGwuaW5mbyhhcmdzWzBdIGFzIHN0cmluZywgYXJnc1sxXSkgOiBjb25zb2xlLmVycm9yKCdbSU5GT10nLCAuLi5hcmdzKTsgfSxcbiAgZGVidWc6IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pID0+IHsgY29uc3QgbCA9IGF3YWl0IGdldExvZ2dlcigpOyBsID8gbC5kZWJ1ZyhhcmdzWzBdIGFzIHN0cmluZywgYXJnc1sxXSkgOiB2b2lkIDA7IH0sXG59O1xuXG4vKipcbiAqIEZpbmQgdGhlIFBJRCBvZiB0aGUgcHJvY2VzcyBsaXN0ZW5pbmcgb24gYSBnaXZlbiBwb3J0LlxuICogVXNlcyBsc29mIG9uIG1hY09TL0xpbnV4LiBSZXR1cm5zIG51bGwgaWYgbm90IGZvdW5kIG9yIG9uIGVycm9yLlxuICpcbiAqIFRpbWVvdXQ6IDFzIOKAlCBsc29mIG9uIGxvY2FsaG9zdCBpcyB0eXBpY2FsbHkgPDEwMG1zLiBUaGUgMXMgY2VpbGluZ1xuICogaGFuZGxlcyBzbG93IE5GUy1tb3VudGVkIC9kZXYvZmQgb3Igb3ZlcmxvYWRlZCBDSSBydW5uZXJzIHdpdGhvdXRcbiAqIGRlbGF5aW5nIHN0YXJ0dXAgbm90aWNlYWJseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRQaWRPblBvcnQocG9ydDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gIGNvbnN0IHsgZXhlY0ZpbGU6IGV4ZWNGaWxlQ2IgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTpjaGlsZF9wcm9jZXNzJyk7XG4gIGNvbnN0IHsgcHJvbWlzaWZ5IH0gPSBhd2FpdCBpbXBvcnQoJ25vZGU6dXRpbCcpO1xuICBjb25zdCBleGVjRmlsZUFzeW5jID0gcHJvbWlzaWZ5KGV4ZWNGaWxlQ2IpO1xuXG4gIC8vIFRyeSBsc29mIGZpcnN0IChtYWNPUyArIG1vc3QgTGludXgpLCBmYWxsIGJhY2sgdG8gZnVzZXIgKG1pbmltYWwgTGludXgvRG9ja2VyKVxuICBmb3IgKGNvbnN0IGNtZCBvZiBbXG4gICAgeyBiaW46ICdsc29mJywgYXJnczogWyctdGknLCBgOiR7cG9ydH1gXSB9LFxuICAgIHsgYmluOiAnZnVzZXInLCBhcmdzOiBbYCR7cG9ydH0vdGNwYF0gfSxcbiAgXSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBhd2FpdCBleGVjRmlsZUFzeW5jKGNtZC5iaW4sIGNtZC5hcmdzLCB7IHRpbWVvdXQ6IDEwMDAgfSk7XG4gICAgICAvLyBmdXNlciBvdXRwdXRzIHRvIHN0ZGVyciBvbiBzb21lIHN5c3RlbXNcbiAgICAgIGNvbnN0IG91dHB1dCA9IChzdGRvdXQgfHwgc3RkZXJyIHx8ICcnKS50cmltKCk7XG4gICAgICBjb25zdCBwaWRzID0gb3V0cHV0LnNwbGl0KC9cXHMrLykubWFwKE51bWJlcikuZmlsdGVyKG4gPT4gIU51bWJlci5pc05hTihuKSAmJiBuID4gMCk7XG4gICAgICBjb25zdCBvdGhlclBpZCA9IHBpZHMuZmluZChwID0+IHAgIT09IHByb2Nlc3MucGlkKTtcbiAgICAgIGlmIChvdGhlclBpZCkgcmV0dXJuIG90aGVyUGlkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29udGludWU7IC8vIGNvbW1hbmQgbm90IGZvdW5kIG9yIG5vIHJlc3VsdHMg4oCUIHRyeSBuZXh0XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFZlcmlmeSB0aGF0IGEgcHJvY2VzcyBpcyBhIERvbGxob3VzZU1DUCBiaW5hcnkgb3duZWQgYnkgdGhlIGN1cnJlbnQgdXNlci5cbiAqIFJldHVybnMgdHJ1ZSBpZiBzYWZlIHRvIGtpbGwsIGZhbHNlIGlmIHdlIHNob3VsZCBsZWF2ZSBpdCBhbG9uZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5RG9sbGhvdXNlUHJvY2VzcyhwaWQ6IG51bWJlciwgcG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHsgZXhlY0ZpbGU6IGV4ZWNGaWxlQ2IgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTpjaGlsZF9wcm9jZXNzJyk7XG4gIGNvbnN0IHsgcHJvbWlzaWZ5IH0gPSBhd2FpdCBpbXBvcnQoJ25vZGU6dXRpbCcpO1xuICBjb25zdCBleGVjRmlsZUFzeW5jID0gcHJvbWlzaWZ5KGV4ZWNGaWxlQ2IpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWNGaWxlQXN5bmMoJ3BzJywgWyctcCcsIFN0cmluZyhwaWQpLCAnLW8nLCAndXNlcj0sY29tbWFuZD0nXSwgeyB0aW1lb3V0OiAxMDAwIH0pO1xuXG4gICAgLy8gQ2hlY2sgMTogVXNlciBvd25lcnNoaXAg4oCUIG9ubHkga2lsbCBvdXIgb3duIHByb2Nlc3Nlc1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gKGF3YWl0IGltcG9ydCgnbm9kZTpvcycpKS51c2VySW5mbygpLnVzZXJuYW1lO1xuICAgIGlmICghc3Rkb3V0LnRyaW0oKS5zdGFydHNXaXRoKGN1cnJlbnRVc2VyKSkge1xuICAgICAgYXdhaXQgbG9nZ2VyLndhcm4oYFtXZWJVSV0gUG9ydCAke3BvcnR9IGhlbGQgYnkgZGlmZmVyZW50IHVzZXIgKHBpZCAke3BpZH0pIOKAlCBub3Qga2lsbGluZ2ApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIDI6IEJpbmFyeSBpZGVudGl0eSDigJQgLmJpbi9tY3Atc2VydmVyLCAuYmluL2RvbGxob3VzZW1jcCxcbiAgICAvLyAvYmluL2RvbGxob3VzZW1jcCAoZ2xvYmFsKSwgb3IgZGlzdC9pbmRleC5qcyAoZGlyZWN0IG5vZGUpLlxuICAgIGNvbnN0IGNtZExpbmUgPSBzdGRvdXQudHJpbSgpO1xuICAgIGNvbnN0IGlzRG9sbGhvdXNlQmluID0gLyg/Ol58XFwvKWRvbGxob3VzZW1jcCg/Olxcc3wkKS8udGVzdChjbWRMaW5lKSB8fFxuICAgICAgY21kTGluZS5pbmNsdWRlcygnLmJpbi9kb2xsaG91c2VtY3AnKTtcbiAgICBjb25zdCBpc01jcFNlcnZlckJpbiA9IGNtZExpbmUuaW5jbHVkZXMoJy5iaW4vbWNwLXNlcnZlcicpIHx8XG4gICAgICBjbWRMaW5lLmluY2x1ZGVzKCdkaXN0L2luZGV4LmpzJyk7XG4gICAgaWYgKCFpc0RvbGxob3VzZUJpbiAmJiAhaXNNY3BTZXJ2ZXJCaW4pIHtcbiAgICAgIGF3YWl0IGxvZ2dlci53YXJuKGBbV2ViVUldIFBvcnQgJHtwb3J0fSBoZWxkIGJ5IG5vbi1Eb2xsaG91c2VNQ1AgcHJvY2VzcyAocGlkICR7cGlkfSkg4oCUIG5vdCBraWxsaW5nYCwgeyBjbWRMaW5lIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCBsb2dnZXIuZGVidWcoYFtXZWJVSV0gVmVyaWZpZWQgc3RhbGUgcHJvY2VzcyAke3BpZH0gaXMgRG9sbGhvdXNlTUNQYCwgeyBjbWRMaW5lIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGNvbnN0IGNvZGUgPSBlcnI/LmNvZGUgfHwgZXJyPy5zdGF0dXM7XG4gICAgbGV0IHJlYXNvbjogc3RyaW5nO1xuICAgIGlmIChjb2RlID09PSAnRU5PRU5UJykgcmVhc29uID0gJ3BzIGNvbW1hbmQgbm90IGZvdW5kJztcbiAgICBlbHNlIGlmIChjb2RlID09PSAnRVNSQ0gnKSByZWFzb24gPSAncHJvY2VzcyBkaWVkIGR1cmluZyB2ZXJpZmljYXRpb24nO1xuICAgIGVsc2UgcmVhc29uID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgIGF3YWl0IGxvZ2dlci5kZWJ1ZyhgW1dlYlVJXSBDYW5ub3QgdmVyaWZ5IHByb2Nlc3MgJHtwaWR9IOKAlCBza2lwcGluZyBraWxsICgke3JlYXNvbn0pYCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogS2lsbCBhIHN0YWxlIHByb2Nlc3MgaG9sZGluZyBhIHBvcnQuIFNlbmRzIFNJR1RFUk0sIHdhaXRzIGJyaWVmbHksXG4gKiB0aGVuIFNJR0tJTEwgaWYgc3RpbGwgYWxpdmUuIE9ubHkga2lsbHMgRG9sbGhvdXNlTUNQIHByb2Nlc3Nlc1xuICogKHZlcmlmaWVkIHZpYSB2ZXJpZnlEb2xsaG91c2VQcm9jZXNzKS5cbiAqXG4gKiBUaW1lb3V0OiAxcyBmb3IgcHMgdmVyaWZpY2F0aW9uLiBLaWxsIHdhaXQ6IDMwMG1zIMOXIDEwIHBvbGxzID0gM3NcbiAqIGJlZm9yZSBlc2NhbGF0aW5nIHRvIFNJR0tJTEwuIFRvdGFsIHdvcnN0IGNhc2U6IH40cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxTdGFsZVByb2Nlc3MocGlkOiBudW1iZXIsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoIWF3YWl0IHZlcmlmeURvbGxob3VzZVByb2Nlc3MocGlkLCBwb3J0KSkgcmV0dXJuIGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR1RFUk0nKTtcbiAgICBhd2FpdCBsb2dnZXIud2FybihgW1dlYlVJXSBTZW50IFNJR1RFUk0gdG8gc3RhbGUgcHJvY2VzcyAke3BpZH0gb24gcG9ydCAke3BvcnR9YCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgMzAwKSk7XG4gICAgICB0cnkgeyBwcm9jZXNzLmtpbGwocGlkLCAwKTsgfSBjYXRjaCB7IHJldHVybiB0cnVlOyB9XG4gICAgfVxuICAgIHByb2Nlc3Mua2lsbChwaWQsICdTSUdLSUxMJyk7XG4gICAgYXdhaXQgbG9nZ2VyLndhcm4oYFtXZWJVSV0gU2VudCBTSUdLSUxMIHRvIHN0YWxlIHByb2Nlc3MgJHtwaWR9IG9uIHBvcnQgJHtwb3J0fWApO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MDApKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHRydWU7IC8vIHByb2Nlc3MgYWxyZWFkeSBkZWFkXG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlY3QgYW5kIHJlY292ZXIgZnJvbSBhIHN0YWxlIHByb2Nlc3Mgc3F1YXR0aW5nIG9uIHRoZSBwb3J0LlxuICogQ29tcGFyZXMgdGhlIHBvcnQgaG9sZGVyJ3MgUElEIGFnYWluc3QgdGhlIGxlYWRlciBsb2NrIGZpbGUgdG8gZGV0ZXJtaW5lXG4gKiBpZiBpdCdzIGEgc3F1YXR0ZXIuIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3F1YXR0ZXIgd2FzIGtpbGxlZC5cbiAqXG4gKiBUaW1lb3V0czogbHNvZiAxcywgcHMgMXMsIFNJR1RFUk0gd2FpdCAzcyDigJQgbWF4IH41cyB0b3RhbC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlY292ZXJTdGFsZVBvcnQocG9ydDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHN0YWxlUGlkID0gYXdhaXQgZmluZFBpZE9uUG9ydChwb3J0KTtcbiAgaWYgKCFzdGFsZVBpZCkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIENoZWNrIHRoZSBsb2NrIGZpbGUgdG8gc2VlIGlmIHRoaXMgUElEIGlzIGEgbGVnaXRpbWF0ZSBsZWFkZXIuXG4gIC8vIFRPQ1RPVSBtaXRpZ2F0aW9uOiBhIG5ldyBwcm9jZXNzIG1heSBoYXZlIEpVU1QgYm91bmQgdGhlIHBvcnQgYnV0IG5vdCB5ZXRcbiAgLy8gd3JpdHRlbiBpdHMgbG9jayBmaWxlLiBXZSByZWFkIHRoZSBsb2NrLCBwYXVzZSA1MDBtcywgdGhlbiByZS1yZWFkLiBJZiB0aGVcbiAgLy8gc2Vjb25kIHJlYWQgbm93IG1hdGNoZXMgdGhlIHBvcnQgaG9sZGVyLCBpdCdzIGEgZnJlc2ggbGVhZGVyIOKAlCBkb24ndCBraWxsLlxuICBjb25zdCB7IHJlYWRMZWFkZXJMb2NrIH0gPSBhd2FpdCBpbXBvcnQoJy4vTGVhZGVyRWxlY3Rpb24uanMnKTtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPCAyOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9jayA9IGF3YWl0IHJlYWRMZWFkZXJMb2NrKCk7XG4gICAgICBpZiAobG9jaz8ucGlkID09PSBzdGFsZVBpZCAmJiBsb2NrPy5wb3J0ID09PSBwb3J0ICYmIGxvY2sucGlkICE9PSBwcm9jZXNzLnBpZCkge1xuICAgICAgICBhd2FpdCBsb2dnZXIud2FybihgW1dlYlVJXSBQb3J0ICR7cG9ydH0gaGVsZCBieSBsZWdpdGltYXRlIGxlYWRlciAocGlkICR7c3RhbGVQaWR9KSDigJQgbm90IGtpbGxpbmdgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQ2FuJ3QgcmVhZCBsb2NrIGZpbGUg4oCUIGNvbnRpbnVlIHRvIG5leHQgYXR0ZW1wdCBvciBraWxsXG4gICAgfVxuICAgIGlmIChhdHRlbXB0ID09PSAwKSB7XG4gICAgICAvLyBCcmllZiBwYXVzZSB0byBsZXQgYSBmcmVzaGx5LXN0YXJ0ZWQgcHJvY2VzcyB3cml0ZSBpdHMgbG9jayBmaWxlXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTAwKSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qga2lsbGVkID0gYXdhaXQga2lsbFN0YWxlUHJvY2VzcyhzdGFsZVBpZCwgcG9ydCk7XG4gIGlmIChraWxsZWQpIHtcbiAgICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBTdGFsZSBwcm9jZXNzICR7c3RhbGVQaWR9IHJlbW92ZWQgZnJvbSBwb3J0ICR7cG9ydH1gKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTAwKSk7XG4gIH1cbiAgcmV0dXJuIGtpbGxlZDtcbn1cbiJdfQ==
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhbGVQcm9jZXNzUmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvU3RhbGVQcm9jZXNzUmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsOEVBQThFO0FBQzlFLHFFQUFxRTtBQUNyRSxrREFBa0Q7QUFDbEQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUM7QUFDaEMsb0VBQW9FO0FBQ3BFLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztBQUM1QixtREFBbUQ7QUFDbkQsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLCtDQUErQztBQUMvQyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFDNUIsOERBQThEO0FBQzlELE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDO0FBRWxDLElBQUksT0FBTyxHQUF5RCxJQUFJLENBQUM7QUFDekUsS0FBSyxVQUFVLFNBQVM7SUFDdEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDO1lBQUMsT0FBTyxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUNELE1BQU0sTUFBTSxHQUFHO0lBQ2IsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLElBQWUsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsTUFBTSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFL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WUFDUCx3REFBd0Q7UUFDMUQsQ0FBQztRQUNELElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RELElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixRQUFRLHNCQUFzQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQywrQkFBK0I7SUFDekYsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWxlIHByb2Nlc3MgZGV0ZWN0aW9uIGFuZCByZWNvdmVyeSAoIzE4NTApLlxuICpcbiAqIEZpbmRzIGFuZCBraWxscyB6b21iaWUgRG9sbGhvdXNlTUNQIHByb2Nlc3NlcyB0aGF0IHNxdWF0IG9uIHRoZSBjb25zb2xlXG4gKiBwb3J0IGFmdGVyIHRoZWlyIHNlc3Npb24gaGFzIGVuZGVkLiBVc2VkIGJ5IGJpbmRBbmRMaXN0ZW4gaW4gc2VydmVyLnRzXG4gKiB3aGVuIEVBRERSSU5VU0Ugb2NjdXJzLlxuICpcbiAqIEV4dHJhY3RlZCB0byBhIHN0YW5kYWxvbmUgbW9kdWxlIHNvIGl0IGNhbiBiZSB0ZXN0ZWQgd2l0aG91dCBpbXBvcnRpbmdcbiAqIHRoZSBmdWxsIEV4cHJlc3Mgc2VydmVyIGFuZCBpdHMgZGVwZW5kZW5jeSBjaGFpbi5cbiAqL1xuXG4vLyBVc2UgbGF6eSBpbXBvcnQgZm9yIGxvZ2dlciB0byBhdm9pZCBwdWxsaW5nIGluIHRoZSBmdWxsIGVudi50cy9jb25maWcgY2hhaW5cbi8vIGF0IG1vZHVsZSBsb2FkIHRpbWUuIFRoaXMga2VlcHMgdGhlIG1vZHVsZSBpbmRlcGVuZGVudGx5IHRlc3RhYmxlLlxuLyoqIFRpbWVvdXQgZm9yIGxzb2YvZnVzZXIvcHMgc3lzdGVtIGNhbGxzIChtcykgKi9cbmNvbnN0IENPTU1BTkRfVElNRU9VVF9NUyA9IDEwMDA7XG4vKiogUG9sbGluZyBpbnRlcnZhbCB3aGVuIHdhaXRpbmcgZm9yIFNJR1RFUk0gdG8gdGFrZSBlZmZlY3QgKG1zKSAqL1xuY29uc3QgU0lHVEVSTV9QT0xMX01TID0gMzAwO1xuLyoqIE51bWJlciBvZiBwb2xscyBiZWZvcmUgZXNjYWxhdGluZyB0byBTSUdLSUxMICovXG5jb25zdCBLSUxMX1BPTExfQ09VTlQgPSAxMDtcbi8qKiBXYWl0IGFmdGVyIFNJR0tJTEwgYmVmb3JlIHJldHVybmluZyAobXMpICovXG5jb25zdCBTSUdLSUxMX1dBSVRfTVMgPSA1MDA7XG4vKiogV2FpdCBiZXR3ZWVuIGxvY2sgZmlsZSByZWFkcyBmb3IgVE9DVE9VIG1pdGlnYXRpb24gKG1zKSAqL1xuY29uc3QgTE9DS19SRUNIRUNLX0RFTEFZX01TID0gNTAwO1xuXG5sZXQgX2xvZ2dlcjogdHlwZW9mIGltcG9ydCgnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJykubG9nZ2VyIHwgbnVsbCA9IG51bGw7XG5hc3luYyBmdW5jdGlvbiBnZXRMb2dnZXIoKSB7XG4gIGlmICghX2xvZ2dlcikge1xuICAgIHRyeSB7IF9sb2dnZXIgPSAoYXdhaXQgaW1wb3J0KCcuLi8uLi91dGlscy9sb2dnZXIuanMnKSkubG9nZ2VyOyB9XG4gICAgY2F0Y2ggeyAvKiBmYWxsYmFjayBiZWxvdyAqLyB9XG4gIH1cbiAgcmV0dXJuIF9sb2dnZXI7XG59XG5jb25zdCBsb2dnZXIgPSB7XG4gIHdhcm46IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pID0+IHsgY29uc3QgbCA9IGF3YWl0IGdldExvZ2dlcigpOyBsID8gbC53YXJuKGFyZ3NbMF0gYXMgc3RyaW5nLCBhcmdzWzFdKSA6IGNvbnNvbGUuZXJyb3IoJ1tXQVJOXScsIC4uLmFyZ3MpOyB9LFxuICBpbmZvOiBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7IGNvbnN0IGwgPSBhd2FpdCBnZXRMb2dnZXIoKTsgbCA/IGwuaW5mbyhhcmdzWzBdIGFzIHN0cmluZywgYXJnc1sxXSkgOiBjb25zb2xlLmVycm9yKCdbSU5GT10nLCAuLi5hcmdzKTsgfSxcbiAgZGVidWc6IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pID0+IHsgY29uc3QgbCA9IGF3YWl0IGdldExvZ2dlcigpOyBsID8gbC5kZWJ1ZyhhcmdzWzBdIGFzIHN0cmluZywgYXJnc1sxXSkgOiB2b2lkIDA7IH0sXG59O1xuXG4vKipcbiAqIEZpbmQgdGhlIFBJRCBvZiB0aGUgcHJvY2VzcyBsaXN0ZW5pbmcgb24gYSBnaXZlbiBwb3J0LlxuICogVXNlcyBsc29mIG9uIG1hY09TL0xpbnV4LiBSZXR1cm5zIG51bGwgaWYgbm90IGZvdW5kIG9yIG9uIGVycm9yLlxuICpcbiAqIFRpbWVvdXQ6IDFzIOKAlCBsc29mIG9uIGxvY2FsaG9zdCBpcyB0eXBpY2FsbHkgPDEwMG1zLiBUaGUgMXMgY2VpbGluZ1xuICogaGFuZGxlcyBzbG93IE5GUy1tb3VudGVkIC9kZXYvZmQgb3Igb3ZlcmxvYWRlZCBDSSBydW5uZXJzIHdpdGhvdXRcbiAqIGRlbGF5aW5nIHN0YXJ0dXAgbm90aWNlYWJseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRQaWRPblBvcnQocG9ydDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gIGNvbnN0IHsgZXhlY0ZpbGU6IGV4ZWNGaWxlQ2IgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTpjaGlsZF9wcm9jZXNzJyk7XG4gIGNvbnN0IHsgcHJvbWlzaWZ5IH0gPSBhd2FpdCBpbXBvcnQoJ25vZGU6dXRpbCcpO1xuICBjb25zdCBleGVjRmlsZUFzeW5jID0gcHJvbWlzaWZ5KGV4ZWNGaWxlQ2IpO1xuXG4gIC8vIFRyeSBsc29mIGZpcnN0IChtYWNPUyArIG1vc3QgTGludXgpLCBmYWxsIGJhY2sgdG8gZnVzZXIgKG1pbmltYWwgTGludXgvRG9ja2VyKVxuICBmb3IgKGNvbnN0IGNtZCBvZiBbXG4gICAgeyBiaW46ICdsc29mJywgYXJnczogWyctdGknLCBgOiR7cG9ydH1gXSB9LFxuICAgIHsgYmluOiAnZnVzZXInLCBhcmdzOiBbYCR7cG9ydH0vdGNwYF0gfSxcbiAgXSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBhd2FpdCBleGVjRmlsZUFzeW5jKGNtZC5iaW4sIGNtZC5hcmdzLCB7IHRpbWVvdXQ6IENPTU1BTkRfVElNRU9VVF9NUyB9KTtcbiAgICAgIC8vIGZ1c2VyIG91dHB1dHMgdG8gc3RkZXJyIG9uIHNvbWUgc3lzdGVtc1xuICAgICAgY29uc3Qgb3V0cHV0ID0gKHN0ZG91dCB8fCBzdGRlcnIgfHwgJycpLnRyaW0oKTtcbiAgICAgIGNvbnN0IHBpZHMgPSBvdXRwdXQuc3BsaXQoL1xccysvKS5tYXAoTnVtYmVyKS5maWx0ZXIobiA9PiAhTnVtYmVyLmlzTmFOKG4pICYmIG4gPiAwKTtcbiAgICAgIGNvbnN0IG90aGVyUGlkID0gcGlkcy5maW5kKHAgPT4gcCAhPT0gcHJvY2Vzcy5waWQpO1xuICAgICAgaWYgKG90aGVyUGlkKSByZXR1cm4gb3RoZXJQaWQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb250aW51ZTsgLy8gY29tbWFuZCBub3QgZm91bmQgb3Igbm8gcmVzdWx0cyDigJQgdHJ5IG5leHRcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogS2lsbCBhIHN0YWxlIHByb2Nlc3MgaG9sZGluZyBhIHBvcnQuIFNlbmRzIFNJR1RFUk0sIHdhaXRzIGJyaWVmbHksXG4gKiB0aGVuIFNJR0tJTEwgaWYgc3RpbGwgYWxpdmUuIE9ubHkga2lsbHMgRG9sbGhvdXNlTUNQIHByb2Nlc3Nlc1xuICogKHZlcmlmaWVkIGJ5IGNoZWNraW5nIHRoZSBjb21tYW5kIGxpbmUgYW5kIHVzZXIgb3duZXJzaGlwKS5cbiAqXG4gKiBUaW1lb3V0OiAxcyBmb3IgcHMgdmVyaWZpY2F0aW9uLiBLaWxsIHdhaXQ6IDMwMG1zIMOXIDEwIHBvbGxzID0gM3NcbiAqIGJlZm9yZSBlc2NhbGF0aW5nIHRvIFNJR0tJTEwuIFRvdGFsIHdvcnN0IGNhc2U6IH40cy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxTdGFsZVByb2Nlc3MocGlkOiBudW1iZXIsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IGV4ZWNGaWxlOiBleGVjRmlsZUNiIH0gPSBhd2FpdCBpbXBvcnQoJ25vZGU6Y2hpbGRfcHJvY2VzcycpO1xuICBjb25zdCB7IHByb21pc2lmeSB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOnV0aWwnKTtcbiAgY29uc3QgZXhlY0ZpbGVBc3luYyA9IHByb21pc2lmeShleGVjRmlsZUNiKTtcblxuICAvLyBTZWN1cml0eSB2ZXJpZmljYXRpb24gZmxvdyDigJQgdGhyZWUgY2hlY2tzIG11c3QgcGFzcyBiZWZvcmUgd2Uga2lsbDpcbiAgLy8gMS4gUHJvY2VzcyBtdXN0IGJlIG93bmVkIGJ5IHRoZSBjdXJyZW50IE9TIHVzZXIgKHByZXZlbnRzIGNyb3NzLXVzZXIga2lsbHMpXG4gIC8vIDIuIENvbW1hbmQgbGluZSBtdXN0IG1hdGNoIGEgRG9sbGhvdXNlTUNQIGJpbmFyeSBwYXRoIChwcmV2ZW50cyBraWxsaW5nIG90aGVyIHNlcnZpY2VzKVxuICAvLyAzLiBJZiBib3RoIGZhaWwgb3IgcHMgY2FuJ3QgcnVuLCB3ZSByZWZ1c2Ug4oCUIHNhZmUgZGVmYXVsdCBpcyB0byBub3Qga2lsbFxuICB0cnkge1xuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBleGVjRmlsZUFzeW5jKCdwcycsIFsnLXAnLCBTdHJpbmcocGlkKSwgJy1vJywgJ3VzZXI9LGNvbW1hbmQ9J10sIHsgdGltZW91dDogQ09NTUFORF9USU1FT1VUX01TIH0pO1xuXG4gICAgLy8gQ2hlY2sgMTogVXNlciBvd25lcnNoaXAg4oCUIG9ubHkga2lsbCBvdXIgb3duIHByb2Nlc3Nlc1xuICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gKGF3YWl0IGltcG9ydCgnbm9kZTpvcycpKS51c2VySW5mbygpLnVzZXJuYW1lO1xuICAgIGlmICghc3Rkb3V0LnRyaW0oKS5zdGFydHNXaXRoKGN1cnJlbnRVc2VyKSkge1xuICAgICAgYXdhaXQgbG9nZ2VyLndhcm4oYFtXZWJVSV0gUG9ydCAke3BvcnR9IGhlbGQgYnkgZGlmZmVyZW50IHVzZXIgKHBpZCAke3BpZH0pIOKAlCBub3Qga2lsbGluZ2ApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIDI6IEJpbmFyeSBpZGVudGl0eSDigJQgbXVzdCBiZSAuYmluL21jcC1zZXJ2ZXIsIC5iaW4vZG9sbGhvdXNlbWNwLFxuICAgIC8vIC9iaW4vZG9sbGhvdXNlbWNwIChnbG9iYWwgaW5zdGFsbCksIG9yIGRpc3QvaW5kZXguanMgKGRpcmVjdCBub2RlIGV4ZWN1dGlvbikuXG4gICAgLy8gTk9UIGp1c3QgJ21jcC1zZXJ2ZXInIGFueXdoZXJlIGluIHRoZSBwYXRoIOKAlCB0aGF0IHdvdWxkIG1hdGNoIEplc3Qgd29ya2Vyc1xuICAgIC8vIHJ1bm5pbmcgZnJvbSB3aXRoaW4gdGhlIG1jcC1zZXJ2ZXIgcHJvamVjdCBkaXJlY3RvcnkuXG4gICAgY29uc3QgY21kTGluZSA9IHN0ZG91dC50cmltKCk7XG4gICAgY29uc3QgaXNEb2xsaG91c2VCaW4gPSAvKD86XnxcXC8pZG9sbGhvdXNlbWNwKD86XFxzfCQpLy50ZXN0KGNtZExpbmUpIHx8XG4gICAgICBjbWRMaW5lLmluY2x1ZGVzKCcuYmluL2RvbGxob3VzZW1jcCcpO1xuICAgIGNvbnN0IGlzTWNwU2VydmVyQmluID0gY21kTGluZS5pbmNsdWRlcygnLmJpbi9tY3Atc2VydmVyJykgfHxcbiAgICAgIGNtZExpbmUuaW5jbHVkZXMoJ2Rpc3QvaW5kZXguanMnKTtcbiAgICBpZiAoIWlzRG9sbGhvdXNlQmluICYmICFpc01jcFNlcnZlckJpbikge1xuICAgICAgYXdhaXQgbG9nZ2VyLndhcm4oYFtXZWJVSV0gUG9ydCAke3BvcnR9IGhlbGQgYnkgbm9uLURvbGxob3VzZU1DUCBwcm9jZXNzIChwaWQgJHtwaWR9KSDigJQgbm90IGtpbGxpbmdgLCB7IGNtZExpbmUgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGF3YWl0IGxvZ2dlci5kZWJ1ZyhgW1dlYlVJXSBWZXJpZmllZCBzdGFsZSBwcm9jZXNzICR7cGlkfSBpcyBEb2xsaG91c2VNQ1BgLCB7IGNtZExpbmUgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIENoZWNrIDM6IElmIHdlIGNhbid0IHZlcmlmeSwgZG9uJ3Qga2lsbCDigJQgc2FmZSBkZWZhdWx0XG4gICAgYXdhaXQgbG9nZ2VyLmRlYnVnKGBbV2ViVUldIENhbm5vdCB2ZXJpZnkgcHJvY2VzcyAke3BpZH0g4oCUIHNraXBwaW5nIGtpbGxgLCB7XG4gICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5raWxsKHBpZCwgJ1NJR1RFUk0nKTtcbiAgICBsb2dnZXIud2FybihgW1dlYlVJXSBTZW50IFNJR1RFUk0gdG8gc3RhbGUgcHJvY2VzcyAke3BpZH0gb24gcG9ydCAke3BvcnR9YCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBLSUxMX1BPTExfQ09VTlQ7IGkrKykge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIFNJR1RFUk1fUE9MTF9NUykpO1xuICAgICAgdHJ5IHsgcHJvY2Vzcy5raWxsKHBpZCwgMCk7IH0gY2F0Y2ggeyByZXR1cm4gdHJ1ZTsgfVxuICAgIH1cbiAgICBwcm9jZXNzLmtpbGwocGlkLCAnU0lHS0lMTCcpO1xuICAgIGxvZ2dlci53YXJuKGBbV2ViVUldIFNlbnQgU0lHS0lMTCB0byBzdGFsZSBwcm9jZXNzICR7cGlkfSBvbiBwb3J0ICR7cG9ydH1gKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgU0lHS0lMTF9XQUlUX01TKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0cnVlOyAvLyBwcm9jZXNzIGFscmVhZHkgZGVhZFxuICB9XG59XG5cbi8qKlxuICogRGV0ZWN0IGFuZCByZWNvdmVyIGZyb20gYSBzdGFsZSBwcm9jZXNzIHNxdWF0dGluZyBvbiB0aGUgcG9ydC5cbiAqIENvbXBhcmVzIHRoZSBwb3J0IGhvbGRlcidzIFBJRCBhZ2FpbnN0IHRoZSBsZWFkZXIgbG9jayBmaWxlIHRvIGRldGVybWluZVxuICogaWYgaXQncyBhIHNxdWF0dGVyLiBSZXR1cm5zIHRydWUgaWYgdGhlIHNxdWF0dGVyIHdhcyBraWxsZWQuXG4gKlxuICogVGltZW91dHM6IGxzb2YgMXMsIHBzIDFzLCBTSUdURVJNIHdhaXQgM3Mg4oCUIG1heCB+NXMgdG90YWwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvdmVyU3RhbGVQb3J0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBzdGFsZVBpZCA9IGF3YWl0IGZpbmRQaWRPblBvcnQocG9ydCk7XG4gIGlmICghc3RhbGVQaWQpIHJldHVybiBmYWxzZTtcblxuICAvLyBUT0NUT1UgbWl0aWdhdGlvbjogYSBuZXcgcHJvY2VzcyBtYXkgaGF2ZSBqdXN0IGJvdW5kIHRoZSBwb3J0IGJ1dCBub3QgeWV0XG4gIC8vIHdyaXR0ZW4gaXRzIGxvY2sgZmlsZS4gUmVhZCB0aGUgbG9jaywgcGF1c2UsIHJlLXJlYWQuIElmIHRoZSBzZWNvbmQgcmVhZFxuICAvLyBub3cgbWF0Y2hlcyB0aGUgcG9ydCBob2xkZXIsIGl0J3MgYSBmcmVzaCBsZWFkZXIg4oCUIGRvbid0IGtpbGwuXG4gIGNvbnN0IHsgcmVhZExlYWRlckxvY2sgfSA9IGF3YWl0IGltcG9ydCgnLi9MZWFkZXJFbGVjdGlvbi5qcycpO1xuICBmb3IgKGxldCBjaGVjayA9IDA7IGNoZWNrIDwgMjsgY2hlY2srKykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsb2NrID0gYXdhaXQgcmVhZExlYWRlckxvY2soKTtcbiAgICAgIGlmIChsb2NrPy5waWQgPT09IHN0YWxlUGlkICYmIGxvY2s/LnBvcnQgPT09IHBvcnQgJiYgbG9jay5waWQgIT09IHByb2Nlc3MucGlkKSB7XG4gICAgICAgIGF3YWl0IGxvZ2dlci53YXJuKGBbV2ViVUldIFBvcnQgJHtwb3J0fSBoZWxkIGJ5IGxlZ2l0aW1hdGUgbGVhZGVyIChwaWQgJHtzdGFsZVBpZH0pIOKAlCBub3Qga2lsbGluZ2ApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBDYW4ndCByZWFkIGxvY2sgZmlsZSDigJQgY29udGludWUgdG8gbmV4dCBjaGVjayBvciBraWxsXG4gICAgfVxuICAgIGlmIChjaGVjayA9PT0gMCkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIExPQ0tfUkVDSEVDS19ERUxBWV9NUykpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGtpbGxlZCA9IGF3YWl0IGtpbGxTdGFsZVByb2Nlc3Moc3RhbGVQaWQsIHBvcnQpO1xuICBpZiAoa2lsbGVkKSB7XG4gICAgbG9nZ2VyLmluZm8oYFtXZWJVSV0gU3RhbGUgcHJvY2VzcyAke3N0YWxlUGlkfSByZW1vdmVkIGZyb20gcG9ydCAke3BvcnR9YCk7XG4gICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIFNJR0tJTExfV0FJVF9NUykpOyAvLyBicmllZiBwYXVzZSBmb3IgcG9ydCByZWxlYXNlXG4gIH1cbiAgcmV0dXJuIGtpbGxlZDtcbn1cbiJdfQ==
|
package/dist/web/public/setup.js
CHANGED
|
@@ -65,9 +65,21 @@
|
|
|
65
65
|
return result;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
+
// ── Channel constants ────────────────────────────────────────────────
|
|
69
|
+
const CHANNELS = {
|
|
70
|
+
STABLE: 'latest',
|
|
71
|
+
RC: 'rc',
|
|
72
|
+
BETA: 'beta',
|
|
73
|
+
};
|
|
74
|
+
const VALID_CHANNELS = new Set(Object.values(CHANNELS));
|
|
75
|
+
const DEFAULT_CHANNEL = CHANNELS.STABLE;
|
|
76
|
+
|
|
77
|
+
/** Validate and normalize a channel value. Falls back to stable if invalid. */
|
|
78
|
+
const normalizeChannel = (ch) => VALID_CHANNELS.has(ch) ? ch : DEFAULT_CHANNEL;
|
|
79
|
+
|
|
68
80
|
// Start with a placeholder version, update once we fetch from server
|
|
69
81
|
let pinnedVersion = 'latest';
|
|
70
|
-
let currentChannel =
|
|
82
|
+
let currentChannel = DEFAULT_CHANNEL;
|
|
71
83
|
let configs = buildConfigs(pinnedVersion, currentChannel);
|
|
72
84
|
|
|
73
85
|
// ── Current method state ──────────────────────────────────────────────
|
|
@@ -160,11 +172,13 @@
|
|
|
160
172
|
if (!select) return;
|
|
161
173
|
|
|
162
174
|
select.addEventListener('change', () => {
|
|
163
|
-
currentChannel = select.value;
|
|
175
|
+
currentChannel = normalizeChannel(select.value);
|
|
164
176
|
if (hint) hint.textContent = CHANNEL_HINTS[currentChannel] || '';
|
|
165
177
|
configs = buildConfigs(pinnedVersion, currentChannel);
|
|
166
178
|
updateAllConfigs(currentMethod);
|
|
167
179
|
updateInstallButtonLabels();
|
|
180
|
+
// Re-evaluate detection: current config may no longer match the new channel
|
|
181
|
+
updateDetectionState();
|
|
168
182
|
});
|
|
169
183
|
};
|
|
170
184
|
|
|
@@ -331,12 +345,21 @@
|
|
|
331
345
|
if (isPinned) {
|
|
332
346
|
desc.textContent = `Installs DollhouseMCP v${pinnedVersion}. This version will not auto-update.`;
|
|
333
347
|
} else {
|
|
334
|
-
// Restore
|
|
348
|
+
// Restore text reflecting the selected channel.
|
|
349
|
+
// Use textContent for dynamic values to prevent DOM XSS (CodeQL: DOM text reinterpreted as HTML).
|
|
335
350
|
const panel = desc.closest('.setup-panel');
|
|
351
|
+
const safeChannel = normalizeChannel(currentChannel);
|
|
336
352
|
if (panel?.id === 'setup-panel-claude-desktop') {
|
|
337
|
-
desc.
|
|
353
|
+
desc.textContent = '';
|
|
354
|
+
desc.append(
|
|
355
|
+
`Pulls the ${safeChannel} version of DollhouseMCP on every startup. Uses `,
|
|
356
|
+
);
|
|
357
|
+
const code = document.createElement('code');
|
|
358
|
+
code.textContent = `npx @${safeChannel}`;
|
|
359
|
+
desc.append(code);
|
|
360
|
+
desc.append(' under the hood. Restart Claude Desktop after.');
|
|
338
361
|
} else if (panel?.id === 'setup-panel-claude-code') {
|
|
339
|
-
desc.textContent =
|
|
362
|
+
desc.textContent = `Adds DollhouseMCP to Claude Code, pulling the ${safeChannel} version on every startup.`;
|
|
340
363
|
}
|
|
341
364
|
}
|
|
342
365
|
});
|
|
@@ -344,6 +367,16 @@
|
|
|
344
367
|
|
|
345
368
|
// ── Install buttons ────────────────────────────────────────────────────
|
|
346
369
|
|
|
370
|
+
/** Format an install error for display. Detects channel-specific 404s. */
|
|
371
|
+
const formatInstallError = (err) => {
|
|
372
|
+
const msg = err.message || 'Installation failed';
|
|
373
|
+
const isChannelError = currentChannel !== DEFAULT_CHANNEL &&
|
|
374
|
+
(msg.includes('404') || msg.includes('Not Found') || msg.includes('not found'));
|
|
375
|
+
return isChannelError
|
|
376
|
+
? `No ${currentChannel} release is published yet. Switch to Stable or try again later.`
|
|
377
|
+
: `${msg}. Try the manual config below.`;
|
|
378
|
+
};
|
|
379
|
+
|
|
347
380
|
/** Handle Configure Now button click */
|
|
348
381
|
const handleInstallClick = async (btn) => {
|
|
349
382
|
const client = btn.dataset.installClient;
|
|
@@ -401,7 +434,7 @@
|
|
|
401
434
|
btn.disabled = false;
|
|
402
435
|
btn.classList.remove('is-loading');
|
|
403
436
|
if (status) {
|
|
404
|
-
status.textContent = err
|
|
437
|
+
status.textContent = formatInstallError(err);
|
|
405
438
|
status.classList.add('is-error');
|
|
406
439
|
}
|
|
407
440
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dollhousemcp/mcp-server",
|
|
3
|
-
"version": "2.0.12-rc.
|
|
3
|
+
"version": "2.0.12-rc.7",
|
|
4
4
|
"description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
package/server.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "io.github.DollhouseMCP/mcp-server",
|
|
4
4
|
"title": "DollhouseMCP",
|
|
5
5
|
"description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
|
|
6
|
-
"version": "2.0.12-rc.
|
|
6
|
+
"version": "2.0.12-rc.7",
|
|
7
7
|
"homepage": "https://dollhousemcp.com",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
{
|
|
30
30
|
"registryType": "npm",
|
|
31
31
|
"identifier": "@dollhousemcp/mcp-server",
|
|
32
|
-
"version": "2.0.12-rc.
|
|
32
|
+
"version": "2.0.12-rc.7",
|
|
33
33
|
"transport": {
|
|
34
34
|
"type": "stdio"
|
|
35
35
|
}
|