@dollhousemcp/mcp-server 2.0.28 → 2.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/services/BuildInfoService.d.ts +9 -1
- package/dist/services/BuildInfoService.d.ts.map +1 -1
- package/dist/services/BuildInfoService.js +37 -3
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -1
- package/dist/tools/portfolio/submitToPortfolioTool.js +4 -3
- package/dist/utils/permissionHookInstallers.d.ts +27 -0
- package/dist/utils/permissionHookInstallers.d.ts.map +1 -0
- package/dist/utils/permissionHookInstallers.js +465 -0
- package/dist/utils/permissionHookShared.d.ts +126 -0
- package/dist/utils/permissionHookShared.d.ts.map +1 -0
- package/dist/utils/permissionHookShared.js +388 -0
- package/dist/utils/permissionHookStatus.d.ts +10 -0
- package/dist/utils/permissionHookStatus.d.ts.map +1 -0
- package/dist/utils/permissionHookStatus.js +256 -0
- package/dist/utils/permissionHooks.d.ts +3 -73
- package/dist/utils/permissionHooks.d.ts.map +1 -1
- package/dist/utils/permissionHooks.js +4 -780
- package/dist/web/public/permissions.js +10 -0
- package/dist/web/public/setup.js +36 -0
- package/dist/web/routes/healthRoutes.d.ts +3 -0
- package/dist/web/routes/healthRoutes.d.ts.map +1 -1
- package/dist/web/routes/healthRoutes.js +22 -2
- package/dist/web/routes/permissionRoutes.d.ts +1 -0
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +28 -7
- package/dist/web/routes/setupRoutes.d.ts +5 -1
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +28 -14
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +12 -1
- package/package.json +3 -1
- package/scripts/permission-hook-config.sh +67 -0
- package/scripts/pretooluse-dollhouse.sh +42 -13
- package/scripts/pretooluse-vscode.sh +23 -10
- package/scripts/pretooluse-windsurf.sh +6 -6
- package/server.json +2 -2
package/dist/web/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
|
package/dist/web/server.js
CHANGED
|
@@ -21,6 +21,7 @@ import { createLogRoutes } from './routes/logRoutes.js';
|
|
|
21
21
|
import { createMetricsRoutes } from './routes/metricsRoutes.js';
|
|
22
22
|
import { createHealthRoutes } from './routes/healthRoutes.js';
|
|
23
23
|
import { createSetupRoutes, repairNvmLauncherOnStartup } from './routes/setupRoutes.js';
|
|
24
|
+
import { repairPermissionHooksOnStartup } from '../utils/permissionHooks.js';
|
|
24
25
|
import { createTotpRoutes } from './routes/totpRoutes.js';
|
|
25
26
|
import { createTokenRoutes } from './routes/tokenRoutes.js';
|
|
26
27
|
import { logger } from '../utils/logger.js';
|
|
@@ -222,6 +223,16 @@ export async function startWebServer(options) {
|
|
|
222
223
|
// patches any pre-existing configs that still use bare `npx`. No-ops when
|
|
223
224
|
// NVM is absent or on Windows. Never delays server startup.
|
|
224
225
|
repairNvmLauncherOnStartup().catch(err => logger.warn(`[Setup] NVM startup repair threw unexpectedly: ${err instanceof Error ? err.message : String(err)}`));
|
|
226
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
227
|
+
repairPermissionHooksOnStartup()
|
|
228
|
+
.then((summary) => {
|
|
229
|
+
if (summary.needsRepairCount > 0) {
|
|
230
|
+
logger.warn(`[Setup] Permission hook startup repair completed with ${summary.needsRepairCount} issue(s) ` +
|
|
231
|
+
`across ${summary.hostResults.length} host(s)`);
|
|
232
|
+
}
|
|
233
|
+
})
|
|
234
|
+
.catch(err => logger.warn(`[Setup] Permission hook startup repair threw unexpectedly: ${err instanceof Error ? err.message : String(err)}`));
|
|
235
|
+
}
|
|
225
236
|
// API routes — use MCP-AQL gateway when handler is available (Issue #796)
|
|
226
237
|
if (options.mcpAqlHandler) {
|
|
227
238
|
app.use('/api', createGatewayApiRoutes(options.mcpAqlHandler, options.portfolioDir));
|
|
@@ -536,4 +547,4 @@ export async function openPortfolioBrowser(options) {
|
|
|
536
547
|
...(browserResult.error ? { warning: `Browser could not be opened automatically: ${browserResult.error}. Open ${url} manually.` } : {}),
|
|
537
548
|
};
|
|
538
549
|
}
|
|
539
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQTRCLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUt2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUs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QyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RixHQUFHLEdBQUcsR0FBRyxPQUFPLEtBQUssT0FBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQzFELENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFFLE1BQU0sRUFBRSxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3RCxHQUFHLEdBQUcsR0FBRyxPQUFPLGVBQWUsRUFBRSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQztJQUVyQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsTUFBTSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRS9DLE9BQU87UUFDTCxHQUFHO1FBQ0gsY0FBYztRQUNkLGFBQWEsRUFBRSxhQUFhLENBQUMsT0FBTztRQUNwQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsOENBQThDLGFBQWEsQ0FBQyxLQUFLLFVBQVUsR0FBRyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3hJLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEb2xsaG91c2VNQ1AgV2ViIFVJIFNlcnZlclxuICpcbiAqIExpZ2h0d2VpZ2h0IEV4cHJlc3Mgc2VydmVyIGZvciBicm93c2luZyBwb3J0Zm9saW8gZWxlbWVudHMgaW4gYSBicm93c2VyLlxuICogQm91bmQgdG8gMTI3LjAuMC4xIG9ubHkgKGxvY2FsaG9zdCkuIFJlYWQtb25seSBmb3IgVjEuXG4gKlxuICogQ2FuIGJlIHN0YXJ0ZWQgc3RhbmRhbG9uZSAoYC0td2ViYCBmbGFnKSBvciBmcm9tIHdpdGhpbiB0aGUgTUNQIHNlcnZlclxuICogcHJvY2VzcyB2aWEgYG9wZW5Qb3J0Zm9saW9Ccm93c2VyKClgLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyLXYyLXJlZmFjdG9yL2lzc3Vlcy83MDRcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyLXYyLXJlZmFjdG9yL2lzc3Vlcy83NzRcbiAqL1xuXG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGpvaW4sIGRpcm5hbWUsIGV4dG5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IGV4ZWNGaWxlIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHBsYXRmb3JtIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUgYXMgcmVhZEZpbGVGcyB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgY3JlYXRlQXBpUm91dGVzLCBjcmVhdGVHYXRld2F5QXBpUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nUm91dGVzLCB0eXBlIExvZ1JvdXRlc1Jlc3VsdCB9IGZyb20gJy4vcm91dGVzL2xvZ1JvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVNZXRyaWNzUm91dGVzLCB0eXBlIE1ldHJpY3NSb3V0ZXNSZXN1bHQgfSBmcm9tICcuL3JvdXRlcy9tZXRyaWNzUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUhlYWx0aFJvdXRlcyB9IGZyb20gJy4vcm91dGVzL2hlYWx0aFJvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTZXR1cFJvdXRlcywgcmVwYWlyTnZtTGF1bmNoZXJPblN0YXJ0dXAgfSBmcm9tICcuL3JvdXRlcy9zZXR1cFJvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVUb3RwUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMvdG90cFJvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVUb2tlblJvdXRlcyB9IGZyb20gJy4vcm91dGVzL3Rva2VuUm91dGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9jb25maWcvZW52LmpzJztcbmltcG9ydCB0eXBlIHsgTUNQQVFMSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL21jcC1hcWwvTUNQQVFMSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUxvZ1NpbmsgfSBmcm9tICcuLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlNZXRyaWNzU2luayB9IGZyb20gJy4uL21ldHJpY3Mvc2lua3MvTWVtb3J5TWV0cmljc1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBDb25zb2xlVG9rZW5TdG9yZSB9IGZyb20gJy4vY29uc29sZS9jb25zb2xlVG9rZW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlQXV0aE1pZGRsZXdhcmUgfSBmcm9tICcuL21pZGRsZXdhcmUvYXV0aE1pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgUEFDS0FHRV9WRVJTSU9OIH0gZnJvbSAnLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIFB1YmxpYyBwYXRoIHByZWZpeGVzIHRoYXQgbmV2ZXIgcmVxdWlyZSBhdXRoZW50aWNhdGlvbiAoIzE3ODApLlxuICogVGhlc2UgZW5kcG9pbnRzIHJldHVybiBzYWZlIG1ldGFkYXRhIG9yIGFjdCBhcyBoZWFsdGggcHJvYmVzIOKAlCByZXF1aXJpbmdcbiAqIHRva2VucyBvbiB0aGVtIHdvdWxkIGJyZWFrIG1vbml0b3JpbmcgYW5kIGNsaWVudCBkZXRlY3Rpb24gd2l0aG91dCBhZGRpbmdcbiAqIHJlYWwgc2VjdXJpdHkgdmFsdWUuXG4gKi9cbmNvbnN0IFBVQkxJQ19QQVRIX1BSRUZJWEVTID0gW1xuICAnL2FwaS9oZWFsdGgnLFxuICAnL2FwaS9zZXR1cC92ZXJzaW9uJyxcbiAgJy9hcGkvc2V0dXAvbWNwYicsXG4gICcvYXBpL3NldHVwL2RldGVjdCcsXG4gICcvYXBpL3NldHVwL2xpY2Vuc2UnLFxuXTtcblxuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBjdXJyZW50IGNvbnNvbGUgdG9rZW4uICovXG5jb25zdCBUT0tFTl9NRVRBX1BMQUNFSE9MREVSID0gJ3t7Q09OU09MRV9UT0tFTn19Jztcbi8qKiBQbGFjZWhvbGRlciBpbiBpbmRleC5odG1sIHRoYXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgcnVubmluZyBzZXJ2ZXIgdmVyc2lvbi4gKi9cbmNvbnN0IFZFUlNJT05fTUVUQV9QTEFDRUhPTERFUiA9ICd7e0RPTExIT1VTRV9WRVJTSU9OfX0nO1xuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdGFibGUgRG9sbGhvdXNlIHNlc3Npb24gSUQuICovXG5jb25zdCBTRVNTSU9OX0lEX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfU0VTU0lPTl9JRH19Jztcbi8qKiBQbGFjZWhvbGRlciBpbiBpbmRleC5odG1sIHRoYXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgcnVudGltZSBzZXNzaW9uIElELiAqL1xuY29uc3QgUlVOVElNRV9TRVNTSU9OX0lEX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfUlVOVElNRV9TRVNTSU9OX0lEfX0nO1xuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBhc3NldCBjYWNoZS1idXN0aW5nIHZlcnNpb24uICovXG5jb25zdCBBU1NFVF9WRVJTSU9OX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfQVNTRVRfVkVSU0lPTn19JztcblxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuLyoqXG4gKiBEZWZhdWx0IHBvcnQgZm9yIHN0YW5kYWxvbmUgYHN0YXJ0V2ViU2VydmVyYCBjYWxscy4gUmVhZHMgZnJvbSB0aGVcbiAqIGBET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVGAgZW52IHZhciBzbyB0aGVyZSBpcyBhIHNpbmdsZSBzb3VyY2Ugb2ZcbiAqIHRydXRoIChzZWUgYHNyYy9jb25maWcvZW52LnRzYCkuIENhbGxlcnMgcGFzc2luZyBhbiBleHBsaWNpdCBgcG9ydGAgaW5cbiAqIGBXZWJTZXJ2ZXJPcHRpb25zYCBvdmVycmlkZSB0aGlzIGRlZmF1bHQuXG4gKi9cbmNvbnN0IERFRkFVTFRfUE9SVCA9IGVudi5ET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVDtcbmNvbnN0IENPTlNPTEVfSE9TVCA9ICdkb2xsaG91c2UubG9jYWxob3N0JztcbmNvbnN0IEFMTE9XRURfUEFHRV9FWFRFTlNJT05TID0gbmV3IFNldChbJy5odG1sJywgJy5odG0nXSk7XG4vKiogTWF4IEpTT04gYm9keSBmb3Igc2V0dXAgcm91dGVzIChpbnN0YWxsL29wZW4tY29uZmlnKS4gSW5nZXN0IHJvdXRlcyB1c2UgdGhlaXIgb3duIDFtYiBsaW1pdC4gKi9cbmNvbnN0IFNFVFVQX0JPRFlfTElNSVQgPSAnMWtiJztcblxuLyoqIFRyYWNrIHdoZXRoZXIgdGhlIHdlYiBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nIGluLXByb2Nlc3MuICovXG5sZXQgc2VydmVyUnVubmluZyA9IGZhbHNlO1xubGV0IHNlcnZlclBvcnQgPSBERUZBVUxUX1BPUlQ7XG4vKiogQWN0aXZlIEhUVFAgc2VydmVyIGluc3RhbmNlIOKAlCB0cmFja2VkIHNvIF9yZXNldFNlcnZlclN0YXRlIGNhbiBjbG9zZSBpdC4gKi9cbmxldCBhY3RpdmVIdHRwU2VydmVyOiBpbXBvcnQoJ25vZGU6aHR0cCcpLlNlcnZlciB8IG51bGwgPSBudWxsO1xuLyoqIENhY2hlZCB0b2tlbiBzdG9yZSBmb3Igb3BlblBvcnRmb2xpb0Jyb3dzZXIg4oCUIHByZXZlbnRzIGR1cGxpY2F0ZSBpbnN0YW5jZXMgb24gdGhlIHNhbWUgZmlsZS4gKi9cbmxldCBjYWNoZWRUb2tlblN0b3JlOiBDb25zb2xlVG9rZW5TdG9yZSB8IG51bGwgPSBudWxsO1xuXG4vKiogQ2hlY2sgd2hldGhlciB0aGUgd2ViIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkIGluIHRoaXMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dlYlNlcnZlclJ1bm5pbmcoKTogYm9vbGVhbiB7XG4gIHJldHVybiBzZXJ2ZXJSdW5uaW5nO1xufVxuXG4vKipcbiAqIFJlc2V0IG1vZHVsZS1sZXZlbCBzZXJ2ZXIgc3RhdGUuIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHkg4oCUXG4gKiBhbGxvd3MgdGVzdHMgdG8gZXhlcmNpc2Ugc3RhcnRXZWJTZXJ2ZXIvYmluZEFuZExpc3RlbiB3aXRob3V0XG4gKiBpbnRlcmZlcmVuY2UgZnJvbSBwcmlvciBydW5zIGluIHRoZSBzYW1lIHByb2Nlc3MuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFNlcnZlclN0YXRlKCk6IHZvaWQge1xuICBpZiAoYWN0aXZlSHR0cFNlcnZlcikge1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIuY2xvc2UoKTtcbiAgICBhY3RpdmVIdHRwU2VydmVyID0gbnVsbDtcbiAgfVxuICBzZXJ2ZXJSdW5uaW5nID0gZmFsc2U7XG4gIHNlcnZlclBvcnQgPSBERUZBVUxUX1BPUlQ7XG4gIGNhY2hlZFRva2VuU3RvcmUgPSBudWxsO1xufVxuXG4vKipcbiAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIHRoZSBIVFRQIHNlcnZlciAoIzE4NTYpLlxuICogQ2xvc2VzIHRoZSBhY3RpdmUgc2VydmVyIGFuZCByZXNldHMgbW9kdWxlIHN0YXRlIHNvIHRoZSBwb3J0IGlzIGZyZWVkXG4gKiBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBsaW5nZXJpbmcgdW50aWwgcHJvY2VzcyBleGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2h1dGRvd25XZWJTZXJ2ZXIoKTogdm9pZCB7XG4gIGlmIChhY3RpdmVIdHRwU2VydmVyKSB7XG4gICAgYWN0aXZlSHR0cFNlcnZlci5jbG9zZSgpO1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIgPSBudWxsO1xuICAgIHNlcnZlclJ1bm5pbmcgPSBmYWxzZTtcbiAgICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBIVFRQIHNlcnZlciBjbG9zZWQgb24gcG9ydCAke3NlcnZlclBvcnR9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyB0aGUgd2ViIHNlcnZlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZXJ2ZXJPcHRpb25zIHtcbiAgLyoqIFBvcnQgdG8gYmluZCB0byAoZGVmYXVsdHMgdG8gYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYCwgc2VlIGBzcmMvY29uZmlnL2Vudi50c2ApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBQYXRoIHRvIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5IChlLmcuLCB+Ly5kb2xsaG91c2UvcG9ydGZvbGlvKSAqL1xuICBwb3J0Zm9saW9EaXI6IHN0cmluZztcbiAgLyoqIE9wZW4gdGhlIGJyb3dzZXIgYXV0b21hdGljYWxseSBhZnRlciBzdGFydGluZyAoZGVmYXVsdDogZmFsc2UpICovXG4gIG9wZW5Ccm93c2VyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE1DUEFRTEhhbmRsZXIgZm9yIHJvdXRpbmcgdGhyb3VnaCB0aGUgTUNQLUFRTCBwaXBlbGluZS5cbiAgICogV2hlbiBwcm92aWRlZCwgQVBJIHJvdXRlcyB1c2UgdGhlIGdhdGV3YXkgKHZhbGlkYXRlZCwgY2FjaGVkLCBnYXRla2VlcGVyLWNoZWNrZWQpLlxuICAgKiBXaGVuIGFic2VudCwgZmFsbHMgYmFjayB0byBkaXJlY3QgZmlsZXN5c3RlbSBhY2Nlc3MgKGxlZ2FjeSBiZWhhdmlvcikuXG4gICAqIElzc3VlICM3OTY6IFdlYiBNQ1AtQVFMIEdhdGV3YXkuXG4gICAqL1xuICBtY3BBcWxIYW5kbGVyPzogTUNQQVFMSGFuZGxlcjtcbiAgLyoqIE1lbW9yeUxvZ1NpbmsgZm9yIGxvZyByb3V0ZXMgKG9wdGlvbmFsIOKAlCBsb2dzIHRhYiBkaXNhYmxlZCBpZiBub3QgcHJvdmlkZWQpICovXG4gIG1lbW9yeVNpbms/OiBNZW1vcnlMb2dTaW5rO1xuICAvKiogTWVtb3J5TWV0cmljc1NpbmsgZm9yIG1ldHJpY3Mgcm91dGVzIChvcHRpb25hbCDigJQgbWV0cmljcyB0YWIgZGlzYWJsZWQgaWYgbm90IHByb3ZpZGVkKSAqL1xuICBtZXRyaWNzU2luaz86IE1lbW9yeU1ldHJpY3NTaW5rO1xuICAvKiogQWRkaXRpb25hbCByb3V0ZXJzIHRvIG1vdW50IGJlZm9yZSB0aGUgU1BBIGZhbGxiYWNrIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhZGRpdGlvbmFsUm91dGVycz86IGltcG9ydCgnZXhwcmVzcycpLlJvdXRlcltdO1xuICAvKipcbiAgICogQ29uc29sZSB0b2tlbiBzdG9yZSAoIzE3ODApLiBXaGVuIHByb3ZpZGVkLCB0aGUgc2VydmVyIHdpbGw6XG4gICAqICAgMS4gTW91bnQgQmVhcmVyIHRva2VuIGF1dGggbWlkZGxld2FyZSBiZWZvcmUgcHJvdGVjdGVkIHJvdXRlcnMuXG4gICAqICAgMi4gSW5qZWN0IHRoZSBwcmltYXJ5IHRva2VuIGludG8gaW5kZXguaHRtbCBzbyB0aGUgYnJvd3NlciBjbGllbnRcbiAgICogICAgICBjYW4gYXR0YWNoIGl0IHRvIGZldGNoIGNhbGxzIGFuZCBFdmVudFNvdXJjZSBVUkxzLlxuICAgKiAgIDMuIEFwcGVuZCB0aGUgdG9rZW4gZmlsZSBsb2NhdGlvbiB0byB0aGUgc3RhcnR1cCBiYW5uZXIuXG4gICAqIEF1dGggZW5mb3JjZW1lbnQgaXMgc3RpbGwgZ2F0ZWQgb24gRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQg4oCUIHRoZVxuICAgKiBtaWRkbGV3YXJlIGlzIGEgcGFzcy10aHJvdWdoIHdoZW4gdGhlIGZsYWcgaXMgZmFsc2UgKHRoZSBQaGFzZSAxIGRlZmF1bHQpLlxuICAgKi9cbiAgdG9rZW5TdG9yZT86IENvbnNvbGVUb2tlblN0b3JlO1xuICAvKiogU3RhYmxlIERvbGxob3VzZSBzZXNzaW9uIGlkZW50aXR5IHNob3duIGluIHRoZSB3ZWIgY29uc29sZSBVSS4gKi9cbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICAvKiogUnVudGltZS11bmlxdWUgc2Vzc2lvbiBpZGVudGl0eSBmb3IgZGlhZ25vc3RpY3MuICovXG4gIHJ1bnRpbWVTZXNzaW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGF0dGVtcHRpbmcgdG8gYmluZCB0aGUgSFRUUCBzZXJ2ZXIgdG8gYSBwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBlcnJvcj86ICdFQUREUklOVVNFJyB8ICdPVEhFUic7XG4gIGRldGFpbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgdGhlIHdlYiBzZXJ2ZXIsIGluY2x1ZGluZyBob29rcyBmb3IgREkgd2lyaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlclJlc3VsdCB7XG4gIC8qKiBFeHByZXNzIGFwcCBpbnN0YW5jZSDigJQgZm9yIG1vdW50aW5nIGFkZGl0aW9uYWwgcm91dGVzIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhcHA/OiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzO1xuICAvKiogTG9nIGJyb2FkY2FzdCBmdW5jdGlvbiDigJQgY2FsbCB3aXRoIGVhY2ggZW50cnkgdG8gcHVzaCB0byBTU0UgY2xpZW50cyAqL1xuICBsb2dCcm9hZGNhc3Q/OiAoZW50cnk6IGltcG9ydCgnLi4vbG9nZ2luZy90eXBlcy5qcycpLlVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZDtcbiAgLyoqIE1ldHJpY3Mgc25hcHNob3QgZnVuY3Rpb24g4oCUIGNhbGwgd2l0aCBlYWNoIHNuYXBzaG90IHRvIHB1c2ggdG8gU1NFIGNsaWVudHMgKi9cbiAgbWV0cmljc09uU25hcHNob3Q/OiAoc25hcHNob3Q6IGltcG9ydCgnLi4vbWV0cmljcy90eXBlcy5qcycpLk1ldHJpY1NuYXBzaG90KSA9PiB2b2lkO1xuICAvKiogUmVzdWx0IG9mIHRoZSBwb3J0IGJpbmRpbmcgYXR0ZW1wdCAqL1xuICBiaW5kUmVzdWx0PzogQmluZFJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYXR0ZW1wdGluZyB0byBvcGVuIHRoZSBicm93c2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyb3dzZXJPcGVuUmVzdWx0IHtcbiAgLyoqIFRoZSBVUkwgdGhlIHNlcnZlciBpcyBydW5uaW5nIG9uICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IHJ1bm5pbmcgKHRydWUpIG9yIGp1c3Qgc3RhcnRlZCAoZmFsc2UpICovXG4gIGFscmVhZHlSdW5uaW5nOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgYnJvd3NlciB3YXMgc3VjY2Vzc2Z1bGx5IG9wZW5lZCAqL1xuICBicm93c2VyT3BlbmVkOiBib29sZWFuO1xuICAvKiogV2FybmluZyBtZXNzYWdlIGlmIHRoZSBicm93c2VyIGNvdWxkIG5vdCBiZSBvcGVuZWQgKi9cbiAgd2FybmluZz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcGVuIGEgVVJMIGluIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IGJyb3dzZXIuXG4gKlxuICogUGxhdGZvcm0tYXdhcmU6XG4gKiAtIG1hY09TOiBgb3BlbmBcbiAqIC0gTGludXg6IGB4ZGctb3BlbmBcbiAqIC0gV2luZG93czogYHN0YXJ0YFxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIG9wZW5cbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBicm93c2VyIG9wZW5lZCwgZmFsc2Ugd2l0aCBlcnJvciBtZXNzYWdlIGlmIG5vdFxuICovXG5mdW5jdGlvbiBvcGVuSW5Ccm93c2VyKHVybDogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gICAgY29uc3QgY21kID0gcGxhdCA9PT0gJ2RhcndpbicgPyAnb3BlbidcbiAgICAgIDogcGxhdCA9PT0gJ3dpbjMyJyA/ICdzdGFydCdcbiAgICAgIDogJ3hkZy1vcGVuJztcblxuICAgIC8vIFNlY3VyaXR5OiB1c2UgZXhlY0ZpbGUgd2l0aCBVUkwgYXMgYXJndW1lbnQgYXJyYXksIG5vdCBzdHJpbmcgaW50ZXJwb2xhdGlvblxuICAgIGNvbnN0IHVybFN0ciA9IFN0cmluZyh1cmwpO1xuICAgIC8vIEFjY2VwdCBsb2NhbGhvc3QsIDEyNy4wLjAuMSwgYW5kICoubG9jYWxob3N0IHN1YmRvbWFpbnMgKFJGQyA2NzYxKVxuICAgIGlmICghL15odHRwcz86XFwvXFwvKGxvY2FsaG9zdHwxMjdcXC4wXFwuMFxcLjF8W1xcdy1dK1xcLmxvY2FsaG9zdClbOi9dLy50ZXN0KHVybFN0cikpIHtcbiAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVUkwgbXVzdCBiZSBhIGxvY2FsaG9zdCBIVFRQIFVSTCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4ZWNGaWxlKGNtZCwgW3VybFN0cl0sIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gQ291bGQgbm90IGF1dG8tb3BlbiBicm93c2VyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTdGFydCB0aGUgcG9ydGZvbGlvIHdlYiBzZXJ2ZXIuXG4gKlxuICogQmluZHMgdG8gMTI3LjAuMC4xIG9ubHkgKGxvY2FsaG9zdCkuIFNlcnZlcyB0aGUgcG9ydGZvbGlvIGJyb3dzZXJcbiAqIGZyb250ZW5kIGFuZCBBUEkgcm91dGVzIGZvciByZWFkaW5nIGVsZW1lbnRzLlxuICpcbiAqIElkZW1wb3RlbnQ6IGlmIHRoZSBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nLCBvcHRpb25hbGx5IG9wZW5zIHRoZVxuICogYnJvd3NlciB3aXRob3V0IHN0YXJ0aW5nIGEgc2Vjb25kIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gU2VydmVyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEhvb2tzIGZvciBESSB3aXJpbmcgKGxvZyBicm9hZGNhc3QsIG1ldHJpY3Mgb25TbmFwc2hvdClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0V2ViU2VydmVyKG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMpOiBQcm9taXNlPFdlYlNlcnZlclJlc3VsdD4ge1xuICBjb25zdCBwb3J0ID0gb3B0aW9ucy5wb3J0IHx8IERFRkFVTFRfUE9SVDtcbiAgY29uc3QgcmVzdWx0OiBXZWJTZXJ2ZXJSZXN1bHQgPSB7fTtcblxuICBpZiAoc2VydmVyUnVubmluZykge1xuICAgIGlmIChvcHRpb25zLm9wZW5Ccm93c2VyKSB7XG4gICAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7c2VydmVyUG9ydH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgcmVzdWx0LmFwcCA9IGFwcDtcbiAgYXBwLmRpc2FibGUoJ3gtcG93ZXJlZC1ieScpO1xuXG4gIC8vIFNlY3VyaXR5IGhlYWRlcnNcbiAgYXBwLnVzZSgoX3JlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJyk7XG4gICAgcmVzLnNldEhlYWRlcignWC1GcmFtZS1PcHRpb25zJywgJ0RFTlknKTtcbiAgICByZXMuc2V0SGVhZGVyKCdYLVhTUy1Qcm90ZWN0aW9uJywgJzE7IG1vZGU9YmxvY2snKTtcbiAgICByZXMuc2V0SGVhZGVyKCdSZWZlcnJlci1Qb2xpY3knLCAnbm8tcmVmZXJyZXInKTtcbiAgICByZXMuc2V0SGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YCk7XG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBbXG4gICAgICBcImRlZmF1bHQtc3JjICdzZWxmJ1wiLFxuICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJyBjZG4uanNkZWxpdnIubmV0IGNkbmpzLmNsb3VkZmxhcmUuY29tXCIsXG4gICAgICBcInN0eWxlLXNyYyAnc2VsZicgJ3Vuc2FmZS1pbmxpbmUnIGNkbmpzLmNsb3VkZmxhcmUuY29tIGNkbi5qc2RlbGl2ci5uZXRcIixcbiAgICAgIFwiaW1nLXNyYyAnc2VsZicgZGF0YTpcIixcbiAgICAgIFwiY29ubmVjdC1zcmMgJ3NlbGYnIHJhdy5naXRodWJ1c2VyY29udGVudC5jb21cIixcbiAgICAgIFwiZm9udC1zcmMgJ3NlbGYnXCIsXG4gICAgXS5qb2luKCc7ICcpKTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIENvbnNvbGUgdG9rZW4gYXV0aGVudGljYXRpb24gbWlkZGxld2FyZSAoIzE3ODApLiBNb3VudGVkIGJlZm9yZSBhbnkgL2FwaVxuICAvLyByb3V0ZXMgc28gZXZlcnkgcHJvdGVjdGVkIGVuZHBvaW50IGdvZXMgdGhyb3VnaCBpdC4gV2hlbiB0aGUgZmVhdHVyZSBmbGFnXG4gIC8vIERPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVEIGlzIGZhbHNlIChQaGFzZSAxIGRlZmF1bHQpIHRoaXMgaXMgYSBwYXNzLXRocm91Z2guXG4gIC8vIFB1YmxpYyBlbmRwb2ludHMgaW4gUFVCTElDX1BBVEhfUFJFRklYRVMgYWx3YXlzIGJ5cGFzcyBhdXRoIHJlZ2FyZGxlc3Mgb2YgZmxhZy5cbiAgaWYgKG9wdGlvbnMudG9rZW5TdG9yZSkge1xuICAgIGNvbnN0IGF1dGhNaWRkbGV3YXJlID0gY3JlYXRlQXV0aE1pZGRsZXdhcmUoe1xuICAgICAgc3RvcmU6IG9wdGlvbnMudG9rZW5TdG9yZSxcbiAgICAgIGVuYWJsZWQ6IGVudi5ET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCxcbiAgICAgIHB1YmxpY1BhdGhQcmVmaXhlczogUFVCTElDX1BBVEhfUFJFRklYRVMsXG4gICAgICBsYWJlbDogJ2FwaScsXG4gICAgfSk7XG4gICAgYXBwLnVzZSgnL2FwaScsIGF1dGhNaWRkbGV3YXJlKTtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBbV2ViVUldIENvbnNvbGUgYXV0aCBtaWRkbGV3YXJlIG1vdW50ZWQgJHtlbnYuRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQgPyAnRU5GT1JDSU5HJyA6ICdwYXNzLXRocm91Z2ggKGZsYWcgb2ZmKSd9YCxcbiAgICApO1xuXG4gICAgLy8gVE9UUCBlbnJvbGxtZW50IHJvdXRlcyAoIzE3OTQpLiBNb3VudGVkIEFGVEVSIHRoZSAvYXBpIGF1dGggbWlkZGxld2FyZVxuICAgIC8vIGJlY2F1c2UgdGhlIHJvdXRlciBhZGRzIGl0cyBvd24gYWx3YXlzLW9uIGF1dGggZ3VhcmQg4oCUIHRoZSBnbG9iYWwgYXV0aFxuICAgIC8vIG1pZGRsZXdhcmUgYXQgL2FwaSBpcyBhIHBhc3MtdGhyb3VnaCBkdXJpbmcgUGhhc2UgMSByb2xsb3V0LCBidXQgdGhlXG4gICAgLy8gVE9UUCByb3V0ZXIgZW5mb3JjZXMgcmVnYXJkbGVzcyBvZiBET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCBzbyBhblxuICAgIC8vIGF0dGFja2VyIHdpdGggbG9jYWwgcG9ydCBhY2Nlc3MgY2Fubm90IHByZS1lbnJvbGwgYSBzZWNvbmQgZmFjdG9yIGFuZFxuICAgIC8vIGxvY2sgdGhlIGxlZ2l0aW1hdGUgdXNlciBvdXQuXG4gICAgYXBwLnVzZSgnL2FwaS9jb25zb2xlL3RvdHAnLCBjcmVhdGVUb3RwUm91dGVzKHsgc3RvcmU6IG9wdGlvbnMudG9rZW5TdG9yZSB9KSk7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gVE9UUCByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL2NvbnNvbGUvdG90cCAoYWx3YXlzLW9uIGF1dGgpJyk7XG5cbiAgICAvLyBUb2tlbiBtYW5hZ2VtZW50IHJvdXRlcyAoIzE3OTUpLiBNb3VudGVkIGFsb25nc2lkZSB0aGUgVE9UUCByb3V0ZXIgd2l0aFxuICAgIC8vIHRoZSBzYW1lIGFsd2F5cy1vbiBhdXRoIHBhdHRlcm4uIEN1cnJlbnRseSBob3N0cyB0aGUgcm90YXRpb24gZW5kcG9pbnQ7XG4gICAgLy8gZnV0dXJlIHRva2VuIG1hbmFnZW1lbnQgb3BlcmF0aW9ucyAobGlzdCwgcmV2b2tlKSBnbyBoZXJlIHRvby5cbiAgICBhcHAudXNlKCcvYXBpL2NvbnNvbGUvdG9rZW4nLCBjcmVhdGVUb2tlblJvdXRlcyh7IHN0b3JlOiBvcHRpb25zLnRva2VuU3RvcmUgfSkpO1xuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIFRva2VuIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvY29uc29sZS90b2tlbiAoYWx3YXlzLW9uIGF1dGgpJyk7XG4gIH1cblxuICAvLyBTZXR1cCByb3V0ZXM6IGF1dG8taW5zdGFsbCBEb2xsaG91c2VNQ1AgdG8gTUNQIGNsaWVudHMgKG1vdW50IEJFRk9SRSBBUEkgcm91dGVzKVxuICAvLyBCb2R5IGxpbWl0IHNjb3BlZCB0byBzZXR1cCByb3V0ZXMgb25seSDigJQgaW5nZXN0IHJvdXRlcyBuZWVkIDFtYiBmb3IgZm9sbG93ZXIgbG9nIGZvcndhcmRpbmdcbiAgY29uc3Qgc2V0dXBKc29uUGFyc2VyID0gZXhwcmVzcy5qc29uKHsgbGltaXQ6IFNFVFVQX0JPRFlfTElNSVQsIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgY29uc3QgeyBpbnN0YWxsSGFuZGxlciwgb3BlbkNvbmZpZ0hhbmRsZXIsIHZlcnNpb25IYW5kbGVyLCBtY3BiUmVkaXJlY3RIYW5kbGVyLCBkZXRlY3RIYW5kbGVyLCBnZXRMaWNlbnNlSGFuZGxlciwgc2V0TGljZW5zZUhhbmRsZXIsIHZlcmlmeUxpY2Vuc2VIYW5kbGVyLCByZXNlbmRWZXJpZmljYXRpb25IYW5kbGVyIH0gPSBjcmVhdGVTZXR1cFJvdXRlcygpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9pbnN0YWxsJywgc2V0dXBKc29uUGFyc2VyLCBpbnN0YWxsSGFuZGxlcik7XG4gIGFwcC5wb3N0KCcvYXBpL3NldHVwL29wZW4tY29uZmlnJywgc2V0dXBKc29uUGFyc2VyLCBvcGVuQ29uZmlnSGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvdmVyc2lvbicsIHZlcnNpb25IYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC9tY3BiJywgbWNwYlJlZGlyZWN0SGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvZGV0ZWN0JywgZGV0ZWN0SGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvbGljZW5zZScsIGdldExpY2Vuc2VIYW5kbGVyKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvbGljZW5zZScsIHNldHVwSnNvblBhcnNlciwgc2V0TGljZW5zZUhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9saWNlbnNlL3ZlcmlmeScsIHNldHVwSnNvblBhcnNlciwgdmVyaWZ5TGljZW5zZUhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9saWNlbnNlL3Jlc2VuZCcsIHNldHVwSnNvblBhcnNlciwgcmVzZW5kVmVyaWZpY2F0aW9uSGFuZGxlcik7XG4gIGxvZ2dlci5pbmZvKCdbV2ViVUldIFNldHVwIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvc2V0dXAnKTtcblxuICAvLyBGaXJlLWFuZC1mb3JnZXQgTlZNIGxhdW5jaGVyIHJlcGFpcjogcmVjcmVhdGVzIHRoZSB3cmFwcGVyIGlmIGRlbGV0ZWQgYW5kXG4gIC8vIHBhdGNoZXMgYW55IHByZS1leGlzdGluZyBjb25maWdzIHRoYXQgc3RpbGwgdXNlIGJhcmUgYG5weGAuIE5vLW9wcyB3aGVuXG4gIC8vIE5WTSBpcyBhYnNlbnQgb3Igb24gV2luZG93cy4gTmV2ZXIgZGVsYXlzIHNlcnZlciBzdGFydHVwLlxuICByZXBhaXJOdm1MYXVuY2hlck9uU3RhcnR1cCgpLmNhdGNoKGVyciA9PlxuICAgIGxvZ2dlci53YXJuKGBbU2V0dXBdIE5WTSBzdGFydHVwIHJlcGFpciB0aHJldyB1bmV4cGVjdGVkbHk6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApXG4gICk7XG5cbiAgLy8gQVBJIHJvdXRlcyDigJQgdXNlIE1DUC1BUUwgZ2F0ZXdheSB3aGVuIGhhbmRsZXIgaXMgYXZhaWxhYmxlIChJc3N1ZSAjNzk2KVxuICBpZiAob3B0aW9ucy5tY3BBcWxIYW5kbGVyKSB7XG4gICAgYXBwLnVzZSgnL2FwaScsIGNyZWF0ZUdhdGV3YXlBcGlSb3V0ZXMob3B0aW9ucy5tY3BBcWxIYW5kbGVyLCBvcHRpb25zLnBvcnRmb2xpb0RpcikpO1xuXG4gICAgLy8gUGVybWlzc2lvbiBldmFsdWF0aW9uIHJvdXRlcyAoUE9TVCAvZXZhbHVhdGVfcGVybWlzc2lvbiwgR0VUIC9wZXJtaXNzaW9ucy9zdGF0dXMpXG4gICAgY29uc3QgeyByZWdpc3RlclBlcm1pc3Npb25Sb3V0ZXMgfSA9IGF3YWl0IGltcG9ydCgnLi9yb3V0ZXMvcGVybWlzc2lvblJvdXRlcy5qcycpO1xuICAgIGNvbnN0IHBlcm1Sb3V0ZXIgPSAoYXdhaXQgaW1wb3J0KCdleHByZXNzJykpLlJvdXRlcigpO1xuICAgIHJlZ2lzdGVyUGVybWlzc2lvblJvdXRlcyhwZXJtUm91dGVyLCBvcHRpb25zLm1jcEFxbEhhbmRsZXIpO1xuICAgIGFwcC51c2UoJy9hcGknLCBwZXJtUm91dGVyKTtcblxuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIEFQSSByb3V0ZXMgdXNpbmcgTUNQLUFRTCBHYXRld2F5ICsgcGVybWlzc2lvbiByb3V0ZXMnKTtcbiAgfSBlbHNlIHtcbiAgICBhcHAudXNlKCcvYXBpJywgY3JlYXRlQXBpUm91dGVzKG9wdGlvbnMucG9ydGZvbGlvRGlyKSk7XG4gICAgbG9nZ2VyLndhcm4oJ1tXZWJVSV0gQVBJIHJvdXRlcyB1c2luZyBkaXJlY3QgZmlsZXN5c3RlbSBhY2Nlc3MgKG5vIE1DUC1BUUwgaGFuZGxlciBhdmFpbGFibGUpJyk7XG4gIH1cblxuICAvLyBDb25zb2xlIHJvdXRlczogbG9ncywgbWV0cmljcywgaGVhbHRoIOKAlCBleHRyYWN0ZWQgdG8ga2VlcCBjb2duaXRpdmVcbiAgLy8gY29tcGxleGl0eSBvZiBzdGFydFdlYlNlcnZlciBtYW5hZ2VhYmxlLlxuICBtb3VudENvbnNvbGVSb3V0ZXMoYXBwLCBvcHRpb25zLCByZXN1bHQpO1xuXG4gIC8vIFNlcnZlIH4vLmRvbGxob3VzZS9wYWdlcy8gYXQgL3BhZ2VzLyDigJQgZGFzaGJvYXJkcywgZ2VuZXJhdGVkIGNvbnRlbnQsIHN0YWNrIHZpZXdzXG4gIGNvbnN0IHBhZ2VzRGlyID0gam9pbihkaXJuYW1lKG9wdGlvbnMucG9ydGZvbGlvRGlyKSwgJ3BhZ2VzJyk7XG4gIG1rZGlyKHBhZ2VzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KS5jYXRjaChlcnIgPT4ge1xuICAgIGxvZ2dlci53YXJuKGBbV2ViVUldIENvdWxkIG5vdCBjcmVhdGUgcGFnZXMgZGlyZWN0b3J5OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH0pO1xuICBhcHAudXNlKCcvcGFnZXMnLCBleHByZXNzLnN0YXRpYyhwYWdlc0RpcikpO1xuXG4gIC8qKlxuICAgKiBHRVQgL2FwaS9wYWdlc1xuICAgKiBMaXN0cyBhdmFpbGFibGUgSFRNTCBwYWdlcyBpbiB+Ly5kb2xsaG91c2UvcGFnZXMvLlxuICAgKiBSZXR1cm5zIHBhZ2UgbmFtZXMgYW5kIHRoZWlyIFVSTHMgZm9yIHRoZSBtYW5hZ2VtZW50IGNvbnNvbGUuXG4gICAqL1xuICBhcHAuZ2V0KCcvYXBpL3BhZ2VzJywgYXN5bmMgKF9yZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlYWRkaXIocGFnZXNEaXIpO1xuICAgICAgY29uc3QgcGFnZXMgPSBmaWxlc1xuICAgICAgICAuZmlsdGVyKGYgPT4gIWYuc3RhcnRzV2l0aCgnLicpICYmIEFMTE9XRURfUEFHRV9FWFRFTlNJT05TLmhhcyhleHRuYW1lKGYpKSlcbiAgICAgICAgLm1hcChmID0+ICh7IG5hbWU6IGYsIHVybDogYC9wYWdlcy8ke2Z9YCB9KSk7XG4gICAgICByZXMuanNvbih7IHBhZ2VzLCBkaXJlY3Rvcnk6IHBhZ2VzRGlyIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmVzLmpzb24oeyBwYWdlczogW10sIGRpcmVjdG9yeTogcGFnZXNEaXIgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBBZGRpdGlvbmFsIHJvdXRlcnMgKGUuZy4sIHVuaWZpZWQgY29uc29sZSBpbmdlc3Qgcm91dGVzKSDigJQgbXVzdCBtb3VudCBiZWZvcmUgU1BBIGZhbGxiYWNrXG4gIG9wdGlvbnMuYWRkaXRpb25hbFJvdXRlcnM/LmZvckVhY2gocm91dGVyID0+IGFwcC51c2Uocm91dGVyKSk7XG5cbiAgLy8gU3RhdGljIGZyb250ZW5kIGZpbGVzXG4gIGNvbnN0IHB1YmxpY0RpciA9IGpvaW4oX19kaXJuYW1lLCAncHVibGljJyk7XG4gIC8vIFNlcnZlIHN0YXRpYyBhc3NldHMgYnV0IHNraXAgaW5kZXguaHRtbCDigJQgdGhlIFNQQSBmYWxsYmFjayBiZWxvd1xuICAvLyBoYW5kbGVzIGl0IHdpdGggdG9rZW4gaW5qZWN0aW9uIChyZXBsYWNlcyB7e0NPTlNPTEVfVE9LRU59fSBpbiB0aGVcbiAgLy8gbWV0YSB0YWcpLiBXaXRob3V0IHRoaXMsIGV4cHJlc3Muc3RhdGljIHNlcnZlcyB0aGUgcmF3IHRlbXBsYXRlXG4gIC8vIGFuZCB0aGUgYnJvd3NlciBuZXZlciBnZXRzIHRoZSBhdXRoIHRva2VuICgjMTc4MCkuXG4gIGNvbnN0IGlzRGVidWcgPSBCb29sZWFuKHByb2Nlc3MuZW52LkRPTExIT1VTRV9ERUJVRyB8fCBwcm9jZXNzLmVudi5FTkFCTEVfREVCVUcpO1xuICBhcHAudXNlKGV4cHJlc3Muc3RhdGljKHB1YmxpY0Rpciwge1xuICAgIGluZGV4OiBmYWxzZSxcbiAgICAvLyBJbiBkZWJ1ZyBtb2RlLCBkaXNhYmxlIGNhY2hpbmcgb24gYWxsIHN0YXRpYyBhc3NldHMgKEpTLCBDU1MpIHNvXG4gICAgLy8gVUkgY2hhbmdlcyBhcmUgcGlja2VkIHVwIG9uIG5vcm1hbCByZWxvYWQgd2l0aG91dCBDbWQrU2hpZnQrUi5cbiAgICAuLi4oaXNEZWJ1Z1xuICAgICAgPyB7IGV0YWc6IGZhbHNlLCBsYXN0TW9kaWZpZWQ6IGZhbHNlLCBtYXhBZ2U6IDAgfVxuICAgICAgOiB7IG1heEFnZTogJzF5JywgaW1tdXRhYmxlOiB0cnVlIH0pLFxuICB9KSk7XG5cbiAgLy8gU1BBIGZhbGxiYWNrIHdpdGggY29uc29sZSB0b2tlbiBpbmplY3Rpb24gKCMxNzgwKS5cbiAgLy8gUmVhZHMgaW5kZXguaHRtbCBvbiBmaXJzdCByZXF1ZXN0LCBzdWJzdGl0dXRlcyB0aGUge3tDT05TT0xFX1RPS0VOfX0gcGxhY2Vob2xkZXJcbiAgLy8gd2l0aCB0aGUgY3VycmVudCB0b2tlbiB2YWx1ZSwgYW5kIGNhY2hlcyB0aGUgcmVuZGVyZWQgc3RyaW5nLiBUaGUgY2FjaGUgaXNcbiAgLy8gYXV0by1pbnZhbGlkYXRlZCB3aGVuIHRoZSBwcmltYXJ5IHRva2VuIGNoYW5nZXMgKHJvdGF0aW9uKSwgc28gYSBwYWdlIHJlbG9hZFxuICAvLyBhZnRlciByb3RhdGlvbiBwaWNrcyB1cCB0aGUgbmV3IHRva2VuIHdpdGhvdXQgYSBzZXJ2ZXIgcmVzdGFydC5cbiAgbGV0IGNhY2hlZEluZGV4SHRtbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBjYWNoZWRUb2tlblZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgaW5kZXhIdG1sUGF0aCA9IGpvaW4ocHVibGljRGlyLCAnaW5kZXguaHRtbCcpO1xuXG4gIGNvbnN0IHJlbmRlckluZGV4SHRtbCA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIGNvbnN0IHRva2VuVmFsdWUgPSBvcHRpb25zLnRva2VuU3RvcmU/LmdldFByaW1hcnlUb2tlblZhbHVlKCkgPz8gJyc7XG4gICAgLy8gQXV0by1pbnZhbGlkYXRlIGNhY2hlIHdoZW4gdGhlIHRva2VuIGNoYW5nZXMgKHJvdGF0aW9uKS5cbiAgICAvLyBJbiBkZWJ1ZyBtb2RlLCBhbHdheXMgcmUtcmVhZCBmcm9tIGRpc2sgc28gVUkgY2hhbmdlcyBhcmUgcGlja2VkIHVwIG9uIHJlbG9hZC5cbiAgICBpZiAoIWlzRGVidWcgJiYgY2FjaGVkSW5kZXhIdG1sICE9PSBudWxsICYmIGNhY2hlZFRva2VuVmFsdWUgPT09IHRva2VuVmFsdWUpIHtcbiAgICAgIHJldHVybiBjYWNoZWRJbmRleEh0bWw7XG4gICAgfVxuICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgcmVhZEZpbGVGcyhpbmRleEh0bWxQYXRoLCAndXRmOCcpO1xuICAgIC8vIERlZmVuc2l2ZSBIVE1MIGF0dHJpYnV0ZSBlc2NhcGUuIFRva2VucyBhcmUgc3RyaWN0IDY0LWNoYXIgbG93ZXJjYXNlIGhleFxuICAgIC8vIHRvZGF5IHNvIG5vIGVzY2FwaW5nIGlzIGFjdHVhbGx5IG5lZWRlZCwgYnV0IGlmIHRoZSB0b2tlbiBmb3JtYXQgZXZlclxuICAgIC8vIGNoYW5nZXMgdGhpcyBwcmV2ZW50cyBhbiBIVE1MLWluamVjdGlvbiByZWdyZXNzaW9uIGZyb20gbGFuZGluZyBzaWxlbnRseS5cbiAgICBjb25zdCBlc2NhcGVkVG9rZW4gPSB0b2tlblZhbHVlXG4gICAgICAucmVwbGFjZUFsbCgnJicsICcmYW1wOycpXG4gICAgICAucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JylcbiAgICAgIC5yZXBsYWNlQWxsKFwiJ1wiLCAnJiMzOTsnKVxuICAgICAgLnJlcGxhY2VBbGwoJzwnLCAnJmx0OycpXG4gICAgICAucmVwbGFjZUFsbCgnPicsICcmZ3Q7Jyk7XG4gICAgY29uc3QgZXNjYXBlZFNlc3Npb25JZCA9IChvcHRpb25zLnNlc3Npb25JZCA/PyAnJylcbiAgICAgIC5yZXBsYWNlQWxsKCcmJywgJyZhbXA7JylcbiAgICAgIC5yZXBsYWNlQWxsKCdcIicsICcmcXVvdDsnKVxuICAgICAgLnJlcGxhY2VBbGwoXCInXCIsICcmIzM5OycpXG4gICAgICAucmVwbGFjZUFsbCgnPCcsICcmbHQ7JylcbiAgICAgIC5yZXBsYWNlQWxsKCc+JywgJyZndDsnKTtcbiAgICBjb25zdCBlc2NhcGVkUnVudGltZVNlc3Npb25JZCA9IChvcHRpb25zLnJ1bnRpbWVTZXNzaW9uSWQgPz8gJycpXG4gICAgICAucmVwbGFjZUFsbCgnJicsICcmYW1wOycpXG4gICAgICAucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JylcbiAgICAgIC5yZXBsYWNlQWxsKFwiJ1wiLCAnJiMzOTsnKVxuICAgICAgLnJlcGxhY2VBbGwoJzwnLCAnJmx0OycpXG4gICAgICAucmVwbGFjZUFsbCgnPicsICcmZ3Q7Jyk7XG4gICAgY2FjaGVkSW5kZXhIdG1sID0gdGVtcGxhdGVcbiAgICAgIC5yZXBsYWNlQWxsKFRPS0VOX01FVEFfUExBQ0VIT0xERVIsIGVzY2FwZWRUb2tlbilcbiAgICAgIC5yZXBsYWNlQWxsKFZFUlNJT05fTUVUQV9QTEFDRUhPTERFUiwgUEFDS0FHRV9WRVJTSU9OKVxuICAgICAgLnJlcGxhY2VBbGwoU0VTU0lPTl9JRF9NRVRBX1BMQUNFSE9MREVSLCBlc2NhcGVkU2Vzc2lvbklkKVxuICAgICAgLnJlcGxhY2VBbGwoUlVOVElNRV9TRVNTSU9OX0lEX01FVEFfUExBQ0VIT0xERVIsIGVzY2FwZWRSdW50aW1lU2Vzc2lvbklkKVxuICAgICAgLnJlcGxhY2VBbGwoQVNTRVRfVkVSU0lPTl9NRVRBX1BMQUNFSE9MREVSLCBQQUNLQUdFX1ZFUlNJT04pO1xuICAgIGNhY2hlZFRva2VuVmFsdWUgPSB0b2tlblZhbHVlO1xuICAgIHJldHVybiBjYWNoZWRJbmRleEh0bWw7XG4gIH07XG5cbiAgYXBwLmdldCgnL3sqcGF0aH0nLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHJlcS5wYXRoLm5vcm1hbGl6ZSgnTkZDJyk7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoJy9hcGkvJykpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGBBUEkgcm91dGUgbm90IGZvdW5kOiAke25vcm1hbGl6ZWRQYXRofWAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKCcvcGFnZXMvJykpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGBQYWdlIG5vdCBmb3VuZDogJHtub3JtYWxpemVkUGF0aH1gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlckluZGV4SHRtbCgpO1xuICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcpO1xuICAgICAgLy8gVGhlIHNoZWxsIHNob3VsZCBhbHdheXMgcmV2YWxpZGF0ZSBzbyBhIGZvcmNlZCByZWxvYWQgY2FuIHBpY2sgdXBcbiAgICAgIC8vIGEgbmV3IGxlYWRlci92ZXJzaW9uIGltbWVkaWF0ZWx5LiBBc3NldCBmaWxlcyB0aGVtc2VsdmVzIGNhcnJ5IGFcbiAgICAgIC8vIHZlcnNpb24gcXVlcnkgYW5kIGNhbiBiZSBjYWNoZWQgYWdncmVzc2l2ZWx5LlxuICAgICAgcmVzLnNldEhlYWRlcignQ2FjaGUtQ29udHJvbCcsICduby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZScpO1xuICAgICAgcmVzLnNlbmQoaHRtbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtXZWJVSV0gRmFpbGVkIHRvIHJlbmRlciBpbmRleC5odG1sOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCgnRmFpbGVkIHRvIGxvYWQgY29uc29sZScpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gR2xvYmFsIGVycm9yIGhhbmRsZXIg4oCUIGNhdGNoIEV4cHJlc3MgZXJyb3JzIGFuZCByb3V0ZSB0byBsb2dnZXIgaW5zdGVhZCBvZiB0ZXJtaW5hbC5cbiAgLy8gV2l0aG91dCB0aGlzLCBFeHByZXNzIGR1bXBzIHN0YWNrIHRyYWNlcyB0byBzdGRlcnIgKHZpc2libGUgaW4gLS13ZWIgdGVybWluYWwpLlxuICAvLyBBbGwgZXJyb3JzIHN0aWxsIGFwcGVhciBpbiB0aGUgbWFuYWdlbWVudCBjb25zb2xlJ3MgTG9ncyB0YWIgdmlhIE1lbW9yeUxvZ1NpbmsuXG4gIGFwcC51c2UoKGVycjogRXJyb3IsIF9yZXE6IGltcG9ydCgnZXhwcmVzcycpLlJlcXVlc3QsIHJlczogaW1wb3J0KCdleHByZXNzJykuUmVzcG9uc2UsIF9uZXh0OiBpbXBvcnQoJ2V4cHJlc3MnKS5OZXh0RnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyIGFzIGFueSkuc3RhdHVzIHx8IChlcnIgYXMgYW55KS5zdGF0dXNDb2RlIHx8IDUwMDtcbiAgICBsb2dnZXIud2FybihgW1dlYlVJXSAke2Vyci5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgcmVzLnN0YXR1cyhzdGF0dXMpLmpzb24oeyBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBCaW5kIHRvIGxvY2FsaG9zdCBvbmx5IOKAlCBoYW5kbGUgcG9ydCBjb25mbGljdHMgZ3JhY2VmdWxseS5cbiAgLy8gRXh0cmFjdGVkIHRvIGEgaGVscGVyIHRvIGtlZXAgc3RhcnRXZWJTZXJ2ZXIncyBjb2duaXRpdmUgY29tcGxleGl0eSBtYW5hZ2VhYmxlLlxuICByZXN1bHQuYmluZFJlc3VsdCA9IGF3YWl0IGJpbmRBbmRMaXN0ZW4oYXBwLCBwb3J0LCBvcHRpb25zKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE1vdW50IHRoZSBsb2dzLCBtZXRyaWNzLCBhbmQgaGVhbHRoIHJvdXRlcy4gVGhlc2UgYXJlIG9ubHkgbW91bnRlZCB3aGVuIHRoZVxuICogY29ycmVzcG9uZGluZyBzaW5rcyBhcmUgcHJvdmlkZWQgKG1lbW9yeSBsb2cgc2luayBmb3IgbG9ncytoZWFsdGgsIG1ldHJpY3NcbiAqIHNpbmsgZm9yIHRoZSBtZXRyaWNzIHRhYikuIEV4dHJhY3RlZCBmcm9tIHN0YXJ0V2ViU2VydmVyIHRvIGNhcCB0aGUgbWFpblxuICogZnVuY3Rpb24ncyBjb2duaXRpdmUgY29tcGxleGl0eS5cbiAqL1xuZnVuY3Rpb24gbW91bnRDb25zb2xlUm91dGVzKFxuICBhcHA6IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3MsXG4gIG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMsXG4gIHJlc3VsdDogV2ViU2VydmVyUmVzdWx0LFxuKTogdm9pZCB7XG4gIGxldCBsb2dSb3V0ZXM6IExvZ1JvdXRlc1Jlc3VsdCB8IHVuZGVmaW5lZDtcbiAgbGV0IG1ldHJpY3NSb3V0ZXM6IE1ldHJpY3NSb3V0ZXNSZXN1bHQgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKG9wdGlvbnMubWVtb3J5U2luaykge1xuICAgIGxvZ1JvdXRlcyA9IGNyZWF0ZUxvZ1JvdXRlcyhvcHRpb25zLm1lbW9yeVNpbmspO1xuICAgIGFwcC51c2UoJy9hcGknLCBsb2dSb3V0ZXMucm91dGVyKTtcbiAgICByZXN1bHQubG9nQnJvYWRjYXN0ID0gbG9nUm91dGVzLmJyb2FkY2FzdDtcbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBMb2cgdmlld2VyIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvbG9ncycpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMubWV0cmljc1NpbmspIHtcbiAgICBtZXRyaWNzUm91dGVzID0gY3JlYXRlTWV0cmljc1JvdXRlcyhvcHRpb25zLm1ldHJpY3NTaW5rKTtcbiAgICBhcHAudXNlKCcvYXBpJywgbWV0cmljc1JvdXRlcy5yb3V0ZXIpO1xuICAgIHJlc3VsdC5tZXRyaWNzT25TbmFwc2hvdCA9IG1ldHJpY3NSb3V0ZXMub25TbmFwc2hvdDtcbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBNZXRyaWNzIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvbWV0cmljcycpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMubWVtb3J5U2luaykge1xuICAgIGNvbnN0IGhlYWx0aFJvdXRlciA9IGNyZWF0ZUhlYWx0aFJvdXRlcyh7XG4gICAgICBtZW1vcnlTaW5rOiBvcHRpb25zLm1lbW9yeVNpbmssXG4gICAgICBtZXRyaWNzU2luazogb3B0aW9ucy5tZXRyaWNzU2luayxcbiAgICAgIGxvZ0NsaWVudENvdW50OiBsb2dSb3V0ZXMgPyBsb2dSb3V0ZXMuY2xpZW50Q291bnQgOiAoKSA9PiAwLFxuICAgICAgbWV0cmljc0NsaWVudENvdW50OiBtZXRyaWNzUm91dGVzID8gbWV0cmljc1JvdXRlcy5jbGllbnRDb3VudCA6ICgpID0+IDAsXG4gICAgfSk7XG4gICAgYXBwLnVzZSgnL2FwaScsIGhlYWx0aFJvdXRlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmludCB0aGUgc3RhcnR1cCBiYW5uZXIgdG8gc3RkZXJyLlxuICpcbiAqIE5PVEU6IFVzZSBzdGRlcnIgZm9yIHRlcm1pbmFsIG91dHB1dCwgbm90IHN0ZG91dC4gSW4gTUNQIHN0ZGlvIG1vZGUsIHN0ZG91dFxuICogaXMgcmVzZXJ2ZWQgZm9yIEpTT04tUlBDIG1lc3NhZ2VzIOKAlCBhbnkgbm9uLUpTT04gb3V0cHV0IGNvcnJ1cHRzIHRoZSBwcm90b2NvbC5cbiAqIHN0ZGVyciBpcyBzYWZlIGZvciBodW1hbi1yZWFkYWJsZSBtZXNzYWdlcyBpbiBib3RoIE1DUCBhbmQgc3RhbmRhbG9uZSBtb2Rlcy5cbiAqL1xuZnVuY3Rpb24gcHJpbnRTdGFydHVwQmFubmVyKHBvcnQ6IG51bWJlciwgdG9rZW5TdG9yZTogQ29uc29sZVRva2VuU3RvcmUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgdXJsID0gYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fWA7XG4gIGNvbnN0IGZhbGxiYWNrVXJsID0gYGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIGxvZ2dlci5pbmZvKGBbV2ViVUldIE1hbmFnZW1lbnQgY29uc29sZSBydW5uaW5nIGF0ICR7dXJsfWApO1xuICBjb25zb2xlLmVycm9yKGBcXG4gIERvbGxob3VzZU1DUCBNYW5hZ2VtZW50IENvbnNvbGVcXG4gICR7dXJsfVxcbiAgJHtmYWxsYmFja1VybH0gKGZhbGxiYWNrKVxcbmApO1xuICBpZiAodG9rZW5TdG9yZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCAgU2Vzc2lvbiB0b2tlbjogJHt0b2tlblN0b3JlLmdldEZpbGVQYXRoKCl9XFxuYCk7XG4gIH1cbiAgY29uc29sZS5lcnJvcihgICBUeXBlIFwicVwiIG9yIFwicXVpdFwiIHRvIGV4aXQuXFxuYCk7XG59XG5cbi8vIFN0YWxlIHByb2Nlc3MgcmVjb3Zlcnkg4oCUIGV4dHJhY3RlZCB0byBTdGFsZVByb2Nlc3NSZWNvdmVyeS50cyBmb3IgaW5kZXBlbmRlbnQgdGVzdGluZyAoIzE4NTApLlxuaW1wb3J0IHsgcmVjb3ZlclN0YWxlUG9ydCB9IGZyb20gJy4vY29uc29sZS9TdGFsZVByb2Nlc3NSZWNvdmVyeS5qcyc7XG5leHBvcnQgeyBmaW5kUGlkT25Qb3J0LCBraWxsU3RhbGVQcm9jZXNzLCByZWNvdmVyU3RhbGVQb3J0IH0gZnJvbSAnLi9jb25zb2xlL1N0YWxlUHJvY2Vzc1JlY292ZXJ5LmpzJztcblxuLyoqXG4gKiBBdHRlbXB0IGEgc2luZ2xlIHBvcnQgYmluZC4gUmV0dXJucyBhIEJpbmRSZXN1bHQgd2l0aG91dCBhbnkgcmVjb3ZlcnkgbG9naWMuXG4gKi9cbmZ1bmN0aW9uIGF0dGVtcHRCaW5kKFxuICBhcHA6IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3MsXG4gIHBvcnQ6IG51bWJlcixcbiAgb3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyxcbik6IFByb21pc2U8QmluZFJlc3VsdD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8QmluZFJlc3VsdD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBodHRwU2VydmVyID0gYXBwLmxpc3Rlbihwb3J0LCAnMTI3LjAuMC4xJywgKCkgPT4ge1xuICAgICAgc2VydmVyUnVubmluZyA9IHRydWU7XG4gICAgICBzZXJ2ZXJQb3J0ID0gcG9ydDtcbiAgICAgIGFjdGl2ZUh0dHBTZXJ2ZXIgPSBodHRwU2VydmVyO1xuICAgICAgcHJpbnRTdGFydHVwQmFubmVyKHBvcnQsIG9wdGlvbnMudG9rZW5TdG9yZSk7XG4gICAgICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgICAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIGh0dHBTZXJ2ZXIub24oJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnRUFERFJJTlVTRScsIGRldGFpbDogYFBvcnQgJHtwb3J0fSBhbHJlYWR5IGluIHVzZWAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtXZWJVSV0gRmFpbGVkIHRvIGJpbmQgcG9ydCAke3BvcnR9OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnT1RIRVInLCBkZXRhaWw6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCaW5kIHRoZSBFeHByZXNzIGFwcCB0byAxMjcuMC4wLjE6cG9ydC4gT24gRUFERFJJTlVTRSwgYXR0ZW1wdCB0byBmaW5kXG4gKiBhbmQga2lsbCB0aGUgc3RhbGUgRG9sbGhvdXNlTUNQIHByb2Nlc3MgaG9sZGluZyB0aGUgcG9ydCwgdGhlbiByZXRyeSBvbmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBiaW5kQW5kTGlzdGVuKFxuICBhcHA6IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3MsXG4gIHBvcnQ6IG51bWJlcixcbiAgb3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyxcbik6IFByb21pc2U8QmluZFJlc3VsdD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBhdHRlbXB0QmluZChhcHAsIHBvcnQsIG9wdGlvbnMpO1xuICBpZiAocmVzdWx0LnN1Y2Nlc3MgfHwgcmVzdWx0LmVycm9yICE9PSAnRUFERFJJTlVTRScpIHJldHVybiByZXN1bHQ7XG5cbiAgLy8gUG9ydCBvY2N1cGllZCDigJQgYXR0ZW1wdCBzdGFsZSBwcm9jZXNzIHJlY292ZXJ5IGFuZCByZXRyeVxuICBpZiAoYXdhaXQgcmVjb3ZlclN0YWxlUG9ydChwb3J0KSkge1xuICAgIGNvbnN0IHJldHJ5UmVzdWx0ID0gYXdhaXQgYXR0ZW1wdEJpbmQoYXBwLCBwb3J0LCBvcHRpb25zKTtcbiAgICBpZiAocmV0cnlSZXN1bHQuc3VjY2VzcykgcmV0dXJuIHJldHJ5UmVzdWx0O1xuICB9XG5cbiAgLy8gU3RpbGwgY2FuJ3QgYmluZCDigJQgZmFsbCB0aHJvdWdoIHdpdGggd2FybmluZ1xuICBsb2dnZXIud2FybihgW1dlYlVJXSBQb3J0ICR7cG9ydH0gYWxyZWFkeSBpbiB1c2Ug4oCUIGFub3RoZXIgcHJvY2VzcyBob2xkcyB0aGlzIHBvcnRgKTtcbiAgY29uc29sZS5lcnJvcihgXFxuICBEb2xsaG91c2VNQ1AgTWFuYWdlbWVudCBDb25zb2xlIChleGlzdGluZyBpbnN0YW5jZSlcXG4gIGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fVxcbmApO1xuICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgIG9wZW5JbkJyb3dzZXIoYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fWApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogT3BlbiB0aGUgcG9ydGZvbGlvIGJyb3dzZXIgZnJvbSB3aXRoaW4gdGhlIE1DUCBzZXJ2ZXIgcHJvY2Vzcy5cbiAqXG4gKiBTdGFydHMgdGhlIHdlYiBzZXJ2ZXIgaWYgbm90IGFscmVhZHkgcnVubmluZywgdGhlbiBvcGVucyB0aGUgc3lzdGVtXG4gKiBicm93c2VyIHRvIHRoZSBwb3J0Zm9saW8gVUkuIFJldHVybnMgYSByZXN1bHQgb2JqZWN0IGluZGljYXRpbmdcbiAqIHdoZXRoZXIgdGhlIHNlcnZlciBzdGFydGVkIGFuZCB0aGUgYnJvd3NlciBvcGVuZWQgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIENhbGxlZCBieSB0aGUgYG9wZW5fcG9ydGZvbGlvX2Jyb3dzZXJgIE1DUC1BUUwgb3BlcmF0aW9uIChJc3N1ZSAjNzc0KS5cbiAqXG4gKiBAcGFyYW0gcG9ydGZvbGlvRGlyIC0gUGF0aCB0byB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeSAoZS5nLiwgfi8uZG9sbGhvdXNlL3BvcnRmb2xpbylcbiAqIEBwYXJhbSBwb3J0IC0gUG9ydCB0byBiaW5kIHRvIChkZWZhdWx0cyB0byBgRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlRgKVxuICogQHJldHVybnMgUmVzdWx0IHdpdGggVVJMLCBzZXJ2ZXIgc3RhdHVzLCBhbmQgYnJvd3NlciBvcGVuIHN0YXR1c1xuICovXG4vKipcbiAqIE9wdGlvbnMgZm9yIG9wZW5pbmcgdGhlIHBvcnRmb2xpbyBicm93c2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5Ccm93c2VyT3B0aW9ucyB7XG4gIHBvcnRmb2xpb0Rpcjogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICBtY3BBcWxIYW5kbGVyPzogTUNQQVFMSGFuZGxlcjtcbiAgdGFiPzogc3RyaW5nO1xuICB1cmxQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBtZW1vcnlTaW5rPzogTWVtb3J5TG9nU2luaztcbiAgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaztcbn1cblxuLyoqXG4gKiBTZWxmLXByb3Zpc2lvbiBzaW5rcywgdG9rZW4gc3RvcmUsIGFuZCBpbmdlc3Qgcm91dGVzLCB0aGVuIHN0YXJ0IHRoZSB3ZWJcbiAqIHNlcnZlci4gRXh0cmFjdGVkIGZyb20gb3BlblBvcnRmb2xpb0Jyb3dzZXIgdG8ga2VlcCBjb2duaXRpdmUgY29tcGxleGl0eVxuICogbWFuYWdlYWJsZSAoU29uYXJDbG91ZCBTMzc3NikuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0RmFsbGJhY2tTZXJ2ZXIob3B0aW9uczogT3BlbkJyb3dzZXJPcHRpb25zLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IG1lbW9yeVNpbmsgPSBvcHRpb25zLm1lbW9yeVNpbms7XG4gIGxldCBtZXRyaWNzU2luayA9IG9wdGlvbnMubWV0cmljc1Npbms7XG5cbiAgaWYgKCFtZW1vcnlTaW5rKSB7XG4gICAgY29uc3QgeyBNZW1vcnlMb2dTaW5rOiBMb2dTaW5rIH0gPSBhd2FpdCBpbXBvcnQoJy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcycpO1xuICAgIG1lbW9yeVNpbmsgPSBuZXcgTG9nU2luayh7IGFwcENhcGFjaXR5OiAxMDAwMCwgc2VjdXJpdHlDYXBhY2l0eTogNTAwMCwgcGVyZkNhcGFjaXR5OiAyMDAwLCB0ZWxlbWV0cnlDYXBhY2l0eTogMTAwMCB9KTtcbiAgfVxuICBpZiAoIW1ldHJpY3NTaW5rKSB7XG4gICAgY29uc3QgeyBNZW1vcnlNZXRyaWNzU2luazogTWV0cmljc1NpbmsgfSA9IGF3YWl0IGltcG9ydCgnLi4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcycpO1xuICAgIG1ldHJpY3NTaW5rID0gbmV3IE1ldHJpY3NTaW5rKDI0MCk7XG4gIH1cblxuICAvLyBSZXVzZSBjYWNoZWQgdG9rZW4gc3RvcmUg4oCUIHR3byBpbnN0YW5jZXMgb24gdGhlIHNhbWUgZmlsZSBjYW4gcmFjZSBvbiB3cml0ZXMuXG4gIGlmICghY2FjaGVkVG9rZW5TdG9yZSkge1xuICAgIGNvbnN0IHsgQ29uc29sZVRva2VuU3RvcmU6IFRva2VuU3RvcmUgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlL2NvbnNvbGVUb2tlbi5qcycpO1xuICAgIGNvbnN0IHsgcGlja1JhbmRvbVRva2VuTmFtZSB9ID0gYXdhaXQgaW1wb3J0KCcuL2NvbnNvbGUvU2Vzc2lvbk5hbWVzLmpzJyk7XG4gICAgY2FjaGVkVG9rZW5TdG9yZSA9IG5ldyBUb2tlblN0b3JlKGVudi5ET0xMSE9VU0VfQ09OU09MRV9UT0tFTl9GSUxFKTtcbiAgICB0cnkgeyBhd2FpdCBjYWNoZWRUb2tlblN0b3JlLmVuc3VyZUluaXRpYWxpemVkKHBpY2tSYW5kb21Ub2tlbk5hbWUoKSk7IH1cbiAgICBjYXRjaCAoZXJyKSB7IGxvZ2dlci53YXJuKCdbV2ViVUldIEZhaWxlZCB0byBpbml0IHRva2VuIHN0b3JlIGZvciBicm93c2VyIG9wZW4nLCBlcnIpOyB9XG4gIH1cblxuICAvLyBsb2dCcm9hZGNhc3QgaXMgZGVmZXJyZWQg4oCUIHdpcmVkIGFmdGVyIHN0YXJ0V2ViU2VydmVyIHJldHVybnMgdGhlIHJlYWwgYnJvYWRjYXN0IGZuLlxuICBsZXQgbGl2ZUJyb2FkY2FzdDogKChlbnRyeTogaW1wb3J0KCcuLi9sb2dnaW5nL3R5cGVzLmpzJykuVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgeyBjcmVhdGVJbmdlc3RSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlL0luZ2VzdFJvdXRlcy5qcycpO1xuICBjb25zdCBpbmdlc3RSZXN1bHQgPSBjcmVhdGVJbmdlc3RSb3V0ZXMoe1xuICAgIGxvZ0Jyb2FkY2FzdDogKGVudHJ5KSA9PiBsaXZlQnJvYWRjYXN0Py4oZW50cnkpLFxuICAgIHN0b3JlTWV0cmljc1NuYXBzaG90OiAoc25hcHNob3QpID0+IG1ldHJpY3NTaW5rPy5vblNuYXBzaG90KHNuYXBzaG90KSxcbiAgfSk7XG4gIGluZ2VzdFJlc3VsdC5yZWdpc3RlckNvbnNvbGVTZXNzaW9uKCk7XG5cbiAgY29uc3Qgd2ViUmVzdWx0ID0gYXdhaXQgc3RhcnRXZWJTZXJ2ZXIoe1xuICAgIHBvcnRmb2xpb0Rpcjogb3B0aW9ucy5wb3J0Zm9saW9EaXIsXG4gICAgcG9ydCxcbiAgICBvcGVuQnJvd3NlcjogZmFsc2UsXG4gICAgbWNwQXFsSGFuZGxlcjogb3B0aW9ucy5tY3BBcWxIYW5kbGVyLFxuICAgIG1lbW9yeVNpbmssXG4gICAgbWV0cmljc1NpbmssXG4gICAgdG9rZW5TdG9yZTogY2FjaGVkVG9rZW5TdG9yZSxcbiAgICBhZGRpdGlvbmFsUm91dGVyczogW2luZ2VzdFJlc3VsdC5yb3V0ZXJdLFxuICB9KTtcblxuICBsaXZlQnJvYWRjYXN0ID0gd2ViUmVzdWx0LmxvZ0Jyb2FkY2FzdDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5Qb3J0Zm9saW9Ccm93c2VyKG9wdGlvbnM6IE9wZW5Ccm93c2VyT3B0aW9ucyk6IFByb21pc2U8QnJvd3Nlck9wZW5SZXN1bHQ+IHtcbiAgY29uc3QgdGFyZ2V0UG9ydCA9IG9wdGlvbnMucG9ydCB8fCBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IGJhc2VVcmwgPSBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3RhcmdldFBvcnR9YDtcblxuICAvLyBCdWlsZCBVUkwgd2l0aCBvcHRpb25hbCB0YWIgaGFzaCBhbmQgcXVlcnkgcGFyYW1ldGVyc1xuICBsZXQgdXJsID0gYmFzZVVybDtcbiAgaWYgKG9wdGlvbnMudGFiKSB7XG4gICAgY29uc3QgcXMgPSBvcHRpb25zLnVybFBhcmFtcyA/IG5ldyBVUkxTZWFyY2hQYXJhbXMob3B0aW9ucy51cmxQYXJhbXMpLnRvU3RyaW5nKCkgOiAnJztcbiAgICB1cmwgPSBgJHtiYXNlVXJsfS8jJHtvcHRpb25zLnRhYn0ke3FzID8gJz8nICsgcXMgOiAnJ31gO1xuICB9IGVsc2UgaWYgKG9wdGlvbnMudXJsUGFyYW1zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMudXJsUGFyYW1zKS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKG9wdGlvbnMudXJsUGFyYW1zKS50b1N0cmluZygpO1xuICAgIHVybCA9IGAke2Jhc2VVcmx9LyNwb3J0Zm9saW8/JHtxc31gO1xuICB9XG5cbiAgY29uc3QgYWxyZWFkeVJ1bm5pbmcgPSBzZXJ2ZXJSdW5uaW5nO1xuXG4gIGlmICghc2VydmVyUnVubmluZykge1xuICAgIGF3YWl0IHN0YXJ0RmFsbGJhY2tTZXJ2ZXIob3B0aW9ucywgdGFyZ2V0UG9ydCk7XG4gIH1cblxuICBjb25zdCBicm93c2VyUmVzdWx0ID0gYXdhaXQgb3BlbkluQnJvd3Nlcih1cmwpO1xuXG4gIHJldHVybiB7XG4gICAgdXJsLFxuICAgIGFscmVhZHlSdW5uaW5nLFxuICAgIGJyb3dzZXJPcGVuZWQ6IGJyb3dzZXJSZXN1bHQuc3VjY2VzcyxcbiAgICAuLi4oYnJvd3NlclJlc3VsdC5lcnJvciA/IHsgd2FybmluZzogYEJyb3dzZXIgY291bGQgbm90IGJlIG9wZW5lZCBhdXRvbWF0aWNhbGx5OiAke2Jyb3dzZXJSZXN1bHQuZXJyb3J9LiBPcGVuICR7dXJsfSBtYW51YWxseS5gIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
|
|
550
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQTRCLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUt2QyxPQUFPLEVBQUUs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R0FBRyxHQUFHLE9BQU8sZUFBZSxFQUFFLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDO0lBRXJDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQixNQUFNLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFL0MsT0FBTztRQUNMLEdBQUc7UUFDSCxjQUFjO1FBQ2QsYUFBYSxFQUFFLGFBQWEsQ0FBQyxPQUFPO1FBQ3BDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSw4Q0FBOEMsYUFBYSxDQUFDLEtBQUssVUFBVSxHQUFHLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDeEksQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERvbGxob3VzZU1DUCBXZWIgVUkgU2VydmVyXG4gKlxuICogTGlnaHR3ZWlnaHQgRXhwcmVzcyBzZXJ2ZXIgZm9yIGJyb3dzaW5nIHBvcnRmb2xpbyBlbGVtZW50cyBpbiBhIGJyb3dzZXIuXG4gKiBCb3VuZCB0byAxMjcuMC4wLjEgb25seSAobG9jYWxob3N0KS4gUmVhZC1vbmx5IGZvciBWMS5cbiAqXG4gKiBDYW4gYmUgc3RhcnRlZCBzdGFuZGFsb25lIChgLS13ZWJgIGZsYWcpIG9yIGZyb20gd2l0aGluIHRoZSBNQ1Agc2VydmVyXG4gKiBwcm9jZXNzIHZpYSBgb3BlblBvcnRmb2xpb0Jyb3dzZXIoKWAuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXItdjItcmVmYWN0b3IvaXNzdWVzLzcwNFxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXItdjItcmVmYWN0b3IvaXNzdWVzLzc3NFxuICovXG5cbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgam9pbiwgZGlybmFtZSwgZXh0bmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgZXhlY0ZpbGUgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcGxhdGZvcm0gfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCByZWFkRmlsZSBhcyByZWFkRmlsZUZzIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVBcGlSb3V0ZXMsIGNyZWF0ZUdhdGV3YXlBcGlSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dSb3V0ZXMsIHR5cGUgTG9nUm91dGVzUmVzdWx0IH0gZnJvbSAnLi9yb3V0ZXMvbG9nUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZU1ldHJpY3NSb3V0ZXMsIHR5cGUgTWV0cmljc1JvdXRlc1Jlc3VsdCB9IGZyb20gJy4vcm91dGVzL21ldHJpY3NSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlSGVhbHRoUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMvaGVhbHRoUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNldHVwUm91dGVzLCByZXBhaXJOdm1MYXVuY2hlck9uU3RhcnR1cCB9IGZyb20gJy4vcm91dGVzL3NldHVwUm91dGVzLmpzJztcbmltcG9ydCB7IHJlcGFpclBlcm1pc3Npb25Ib29rc09uU3RhcnR1cCB9IGZyb20gJy4uL3V0aWxzL3Blcm1pc3Npb25Ib29rcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVUb3RwUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMvdG90cFJvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVUb2tlblJvdXRlcyB9IGZyb20gJy4vcm91dGVzL3Rva2VuUm91dGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9jb25maWcvZW52LmpzJztcbmltcG9ydCB0eXBlIHsgTUNQQVFMSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL21jcC1hcWwvTUNQQVFMSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUxvZ1NpbmsgfSBmcm9tICcuLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlNZXRyaWNzU2luayB9IGZyb20gJy4uL21ldHJpY3Mvc2lua3MvTWVtb3J5TWV0cmljc1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBDb25zb2xlVG9rZW5TdG9yZSB9IGZyb20gJy4vY29uc29sZS9jb25zb2xlVG9rZW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlQXV0aE1pZGRsZXdhcmUgfSBmcm9tICcuL21pZGRsZXdhcmUvYXV0aE1pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgUEFDS0FHRV9WRVJTSU9OIH0gZnJvbSAnLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIFB1YmxpYyBwYXRoIHByZWZpeGVzIHRoYXQgbmV2ZXIgcmVxdWlyZSBhdXRoZW50aWNhdGlvbiAoIzE3ODApLlxuICogVGhlc2UgZW5kcG9pbnRzIHJldHVybiBzYWZlIG1ldGFkYXRhIG9yIGFjdCBhcyBoZWFsdGggcHJvYmVzIOKAlCByZXF1aXJpbmdcbiAqIHRva2VucyBvbiB0aGVtIHdvdWxkIGJyZWFrIG1vbml0b3JpbmcgYW5kIGNsaWVudCBkZXRlY3Rpb24gd2l0aG91dCBhZGRpbmdcbiAqIHJlYWwgc2VjdXJpdHkgdmFsdWUuXG4gKi9cbmNvbnN0IFBVQkxJQ19QQVRIX1BSRUZJWEVTID0gW1xuICAnL2FwaS9oZWFsdGgnLFxuICAnL2FwaS9zZXR1cC92ZXJzaW9uJyxcbiAgJy9hcGkvc2V0dXAvbWNwYicsXG4gICcvYXBpL3NldHVwL2RldGVjdCcsXG4gICcvYXBpL3NldHVwL2xpY2Vuc2UnLFxuXTtcblxuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBjdXJyZW50IGNvbnNvbGUgdG9rZW4uICovXG5jb25zdCBUT0tFTl9NRVRBX1BMQUNFSE9MREVSID0gJ3t7Q09OU09MRV9UT0tFTn19Jztcbi8qKiBQbGFjZWhvbGRlciBpbiBpbmRleC5odG1sIHRoYXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgcnVubmluZyBzZXJ2ZXIgdmVyc2lvbi4gKi9cbmNvbnN0IFZFUlNJT05fTUVUQV9QTEFDRUhPTERFUiA9ICd7e0RPTExIT1VTRV9WRVJTSU9OfX0nO1xuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdGFibGUgRG9sbGhvdXNlIHNlc3Npb24gSUQuICovXG5jb25zdCBTRVNTSU9OX0lEX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfU0VTU0lPTl9JRH19Jztcbi8qKiBQbGFjZWhvbGRlciBpbiBpbmRleC5odG1sIHRoYXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgcnVudGltZSBzZXNzaW9uIElELiAqL1xuY29uc3QgUlVOVElNRV9TRVNTSU9OX0lEX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfUlVOVElNRV9TRVNTSU9OX0lEfX0nO1xuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBhc3NldCBjYWNoZS1idXN0aW5nIHZlcnNpb24uICovXG5jb25zdCBBU1NFVF9WRVJTSU9OX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfQVNTRVRfVkVSU0lPTn19JztcblxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuLyoqXG4gKiBEZWZhdWx0IHBvcnQgZm9yIHN0YW5kYWxvbmUgYHN0YXJ0V2ViU2VydmVyYCBjYWxscy4gUmVhZHMgZnJvbSB0aGVcbiAqIGBET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVGAgZW52IHZhciBzbyB0aGVyZSBpcyBhIHNpbmdsZSBzb3VyY2Ugb2ZcbiAqIHRydXRoIChzZWUgYHNyYy9jb25maWcvZW52LnRzYCkuIENhbGxlcnMgcGFzc2luZyBhbiBleHBsaWNpdCBgcG9ydGAgaW5cbiAqIGBXZWJTZXJ2ZXJPcHRpb25zYCBvdmVycmlkZSB0aGlzIGRlZmF1bHQuXG4gKi9cbmNvbnN0IERFRkFVTFRfUE9SVCA9IGVudi5ET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVDtcbmNvbnN0IENPTlNPTEVfSE9TVCA9ICdkb2xsaG91c2UubG9jYWxob3N0JztcbmNvbnN0IEFMTE9XRURfUEFHRV9FWFRFTlNJT05TID0gbmV3IFNldChbJy5odG1sJywgJy5odG0nXSk7XG4vKiogTWF4IEpTT04gYm9keSBmb3Igc2V0dXAgcm91dGVzIChpbnN0YWxsL29wZW4tY29uZmlnKS4gSW5nZXN0IHJvdXRlcyB1c2UgdGhlaXIgb3duIDFtYiBsaW1pdC4gKi9cbmNvbnN0IFNFVFVQX0JPRFlfTElNSVQgPSAnMWtiJztcblxuLyoqIFRyYWNrIHdoZXRoZXIgdGhlIHdlYiBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nIGluLXByb2Nlc3MuICovXG5sZXQgc2VydmVyUnVubmluZyA9IGZhbHNlO1xubGV0IHNlcnZlclBvcnQgPSBERUZBVUxUX1BPUlQ7XG4vKiogQWN0aXZlIEhUVFAgc2VydmVyIGluc3RhbmNlIOKAlCB0cmFja2VkIHNvIF9yZXNldFNlcnZlclN0YXRlIGNhbiBjbG9zZSBpdC4gKi9cbmxldCBhY3RpdmVIdHRwU2VydmVyOiBpbXBvcnQoJ25vZGU6aHR0cCcpLlNlcnZlciB8IG51bGwgPSBudWxsO1xuLyoqIENhY2hlZCB0b2tlbiBzdG9yZSBmb3Igb3BlblBvcnRmb2xpb0Jyb3dzZXIg4oCUIHByZXZlbnRzIGR1cGxpY2F0ZSBpbnN0YW5jZXMgb24gdGhlIHNhbWUgZmlsZS4gKi9cbmxldCBjYWNoZWRUb2tlblN0b3JlOiBDb25zb2xlVG9rZW5TdG9yZSB8IG51bGwgPSBudWxsO1xuXG4vKiogQ2hlY2sgd2hldGhlciB0aGUgd2ViIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkIGluIHRoaXMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dlYlNlcnZlclJ1bm5pbmcoKTogYm9vbGVhbiB7XG4gIHJldHVybiBzZXJ2ZXJSdW5uaW5nO1xufVxuXG4vKipcbiAqIFJlc2V0IG1vZHVsZS1sZXZlbCBzZXJ2ZXIgc3RhdGUuIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHkg4oCUXG4gKiBhbGxvd3MgdGVzdHMgdG8gZXhlcmNpc2Ugc3RhcnRXZWJTZXJ2ZXIvYmluZEFuZExpc3RlbiB3aXRob3V0XG4gKiBpbnRlcmZlcmVuY2UgZnJvbSBwcmlvciBydW5zIGluIHRoZSBzYW1lIHByb2Nlc3MuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFNlcnZlclN0YXRlKCk6IHZvaWQge1xuICBpZiAoYWN0aXZlSHR0cFNlcnZlcikge1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIuY2xvc2UoKTtcbiAgICBhY3RpdmVIdHRwU2VydmVyID0gbnVsbDtcbiAgfVxuICBzZXJ2ZXJSdW5uaW5nID0gZmFsc2U7XG4gIHNlcnZlclBvcnQgPSBERUZBVUxUX1BPUlQ7XG4gIGNhY2hlZFRva2VuU3RvcmUgPSBudWxsO1xufVxuXG4vKipcbiAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIHRoZSBIVFRQIHNlcnZlciAoIzE4NTYpLlxuICogQ2xvc2VzIHRoZSBhY3RpdmUgc2VydmVyIGFuZCByZXNldHMgbW9kdWxlIHN0YXRlIHNvIHRoZSBwb3J0IGlzIGZyZWVkXG4gKiBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBsaW5nZXJpbmcgdW50aWwgcHJvY2VzcyBleGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2h1dGRvd25XZWJTZXJ2ZXIoKTogdm9pZCB7XG4gIGlmIChhY3RpdmVIdHRwU2VydmVyKSB7XG4gICAgYWN0aXZlSHR0cFNlcnZlci5jbG9zZSgpO1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIgPSBudWxsO1xuICAgIHNlcnZlclJ1bm5pbmcgPSBmYWxzZTtcbiAgICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBIVFRQIHNlcnZlciBjbG9zZWQgb24gcG9ydCAke3NlcnZlclBvcnR9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyB0aGUgd2ViIHNlcnZlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZXJ2ZXJPcHRpb25zIHtcbiAgLyoqIFBvcnQgdG8gYmluZCB0byAoZGVmYXVsdHMgdG8gYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYCwgc2VlIGBzcmMvY29uZmlnL2Vudi50c2ApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBQYXRoIHRvIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5IChlLmcuLCB+Ly5kb2xsaG91c2UvcG9ydGZvbGlvKSAqL1xuICBwb3J0Zm9saW9EaXI6IHN0cmluZztcbiAgLyoqIE9wZW4gdGhlIGJyb3dzZXIgYXV0b21hdGljYWxseSBhZnRlciBzdGFydGluZyAoZGVmYXVsdDogZmFsc2UpICovXG4gIG9wZW5Ccm93c2VyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE1DUEFRTEhhbmRsZXIgZm9yIHJvdXRpbmcgdGhyb3VnaCB0aGUgTUNQLUFRTCBwaXBlbGluZS5cbiAgICogV2hlbiBwcm92aWRlZCwgQVBJIHJvdXRlcyB1c2UgdGhlIGdhdGV3YXkgKHZhbGlkYXRlZCwgY2FjaGVkLCBnYXRla2VlcGVyLWNoZWNrZWQpLlxuICAgKiBXaGVuIGFic2VudCwgZmFsbHMgYmFjayB0byBkaXJlY3QgZmlsZXN5c3RlbSBhY2Nlc3MgKGxlZ2FjeSBiZWhhdmlvcikuXG4gICAqIElzc3VlICM3OTY6IFdlYiBNQ1AtQVFMIEdhdGV3YXkuXG4gICAqL1xuICBtY3BBcWxIYW5kbGVyPzogTUNQQVFMSGFuZGxlcjtcbiAgLyoqIE1lbW9yeUxvZ1NpbmsgZm9yIGxvZyByb3V0ZXMgKG9wdGlvbmFsIOKAlCBsb2dzIHRhYiBkaXNhYmxlZCBpZiBub3QgcHJvdmlkZWQpICovXG4gIG1lbW9yeVNpbms/OiBNZW1vcnlMb2dTaW5rO1xuICAvKiogTWVtb3J5TWV0cmljc1NpbmsgZm9yIG1ldHJpY3Mgcm91dGVzIChvcHRpb25hbCDigJQgbWV0cmljcyB0YWIgZGlzYWJsZWQgaWYgbm90IHByb3ZpZGVkKSAqL1xuICBtZXRyaWNzU2luaz86IE1lbW9yeU1ldHJpY3NTaW5rO1xuICAvKiogQWRkaXRpb25hbCByb3V0ZXJzIHRvIG1vdW50IGJlZm9yZSB0aGUgU1BBIGZhbGxiYWNrIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhZGRpdGlvbmFsUm91dGVycz86IGltcG9ydCgnZXhwcmVzcycpLlJvdXRlcltdO1xuICAvKipcbiAgICogQ29uc29sZSB0b2tlbiBzdG9yZSAoIzE3ODApLiBXaGVuIHByb3ZpZGVkLCB0aGUgc2VydmVyIHdpbGw6XG4gICAqICAgMS4gTW91bnQgQmVhcmVyIHRva2VuIGF1dGggbWlkZGxld2FyZSBiZWZvcmUgcHJvdGVjdGVkIHJvdXRlcnMuXG4gICAqICAgMi4gSW5qZWN0IHRoZSBwcmltYXJ5IHRva2VuIGludG8gaW5kZXguaHRtbCBzbyB0aGUgYnJvd3NlciBjbGllbnRcbiAgICogICAgICBjYW4gYXR0YWNoIGl0IHRvIGZldGNoIGNhbGxzIGFuZCBFdmVudFNvdXJjZSBVUkxzLlxuICAgKiAgIDMuIEFwcGVuZCB0aGUgdG9rZW4gZmlsZSBsb2NhdGlvbiB0byB0aGUgc3RhcnR1cCBiYW5uZXIuXG4gICAqIEF1dGggZW5mb3JjZW1lbnQgaXMgc3RpbGwgZ2F0ZWQgb24gRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQg4oCUIHRoZVxuICAgKiBtaWRkbGV3YXJlIGlzIGEgcGFzcy10aHJvdWdoIHdoZW4gdGhlIGZsYWcgaXMgZmFsc2UgKHRoZSBQaGFzZSAxIGRlZmF1bHQpLlxuICAgKi9cbiAgdG9rZW5TdG9yZT86IENvbnNvbGVUb2tlblN0b3JlO1xuICAvKiogU3RhYmxlIERvbGxob3VzZSBzZXNzaW9uIGlkZW50aXR5IHNob3duIGluIHRoZSB3ZWIgY29uc29sZSBVSS4gKi9cbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICAvKiogUnVudGltZS11bmlxdWUgc2Vzc2lvbiBpZGVudGl0eSBmb3IgZGlhZ25vc3RpY3MuICovXG4gIHJ1bnRpbWVTZXNzaW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGF0dGVtcHRpbmcgdG8gYmluZCB0aGUgSFRUUCBzZXJ2ZXIgdG8gYSBwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBlcnJvcj86ICdFQUREUklOVVNFJyB8ICdPVEhFUic7XG4gIGRldGFpbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgdGhlIHdlYiBzZXJ2ZXIsIGluY2x1ZGluZyBob29rcyBmb3IgREkgd2lyaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlclJlc3VsdCB7XG4gIC8qKiBFeHByZXNzIGFwcCBpbnN0YW5jZSDigJQgZm9yIG1vdW50aW5nIGFkZGl0aW9uYWwgcm91dGVzIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhcHA/OiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzO1xuICAvKiogTG9nIGJyb2FkY2FzdCBmdW5jdGlvbiDigJQgY2FsbCB3aXRoIGVhY2ggZW50cnkgdG8gcHVzaCB0byBTU0UgY2xpZW50cyAqL1xuICBsb2dCcm9hZGNhc3Q/OiAoZW50cnk6IGltcG9ydCgnLi4vbG9nZ2luZy90eXBlcy5qcycpLlVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZDtcbiAgLyoqIE1ldHJpY3Mgc25hcHNob3QgZnVuY3Rpb24g4oCUIGNhbGwgd2l0aCBlYWNoIHNuYXBzaG90IHRvIHB1c2ggdG8gU1NFIGNsaWVudHMgKi9cbiAgbWV0cmljc09uU25hcHNob3Q/OiAoc25hcHNob3Q6IGltcG9ydCgnLi4vbWV0cmljcy90eXBlcy5qcycpLk1ldHJpY1NuYXBzaG90KSA9PiB2b2lkO1xuICAvKiogUmVzdWx0IG9mIHRoZSBwb3J0IGJpbmRpbmcgYXR0ZW1wdCAqL1xuICBiaW5kUmVzdWx0PzogQmluZFJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYXR0ZW1wdGluZyB0byBvcGVuIHRoZSBicm93c2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyb3dzZXJPcGVuUmVzdWx0IHtcbiAgLyoqIFRoZSBVUkwgdGhlIHNlcnZlciBpcyBydW5uaW5nIG9uICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IHJ1bm5pbmcgKHRydWUpIG9yIGp1c3Qgc3RhcnRlZCAoZmFsc2UpICovXG4gIGFscmVhZHlSdW5uaW5nOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgYnJvd3NlciB3YXMgc3VjY2Vzc2Z1bGx5IG9wZW5lZCAqL1xuICBicm93c2VyT3BlbmVkOiBib29sZWFuO1xuICAvKiogV2FybmluZyBtZXNzYWdlIGlmIHRoZSBicm93c2VyIGNvdWxkIG5vdCBiZSBvcGVuZWQgKi9cbiAgd2FybmluZz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcGVuIGEgVVJMIGluIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IGJyb3dzZXIuXG4gKlxuICogUGxhdGZvcm0tYXdhcmU6XG4gKiAtIG1hY09TOiBgb3BlbmBcbiAqIC0gTGludXg6IGB4ZGctb3BlbmBcbiAqIC0gV2luZG93czogYHN0YXJ0YFxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIG9wZW5cbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBicm93c2VyIG9wZW5lZCwgZmFsc2Ugd2l0aCBlcnJvciBtZXNzYWdlIGlmIG5vdFxuICovXG5mdW5jdGlvbiBvcGVuSW5Ccm93c2VyKHVybDogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gICAgY29uc3QgY21kID0gcGxhdCA9PT0gJ2RhcndpbicgPyAnb3BlbidcbiAgICAgIDogcGxhdCA9PT0gJ3dpbjMyJyA/ICdzdGFydCdcbiAgICAgIDogJ3hkZy1vcGVuJztcblxuICAgIC8vIFNlY3VyaXR5OiB1c2UgZXhlY0ZpbGUgd2l0aCBVUkwgYXMgYXJndW1lbnQgYXJyYXksIG5vdCBzdHJpbmcgaW50ZXJwb2xhdGlvblxuICAgIGNvbnN0IHVybFN0ciA9IFN0cmluZyh1cmwpO1xuICAgIC8vIEFjY2VwdCBsb2NhbGhvc3QsIDEyNy4wLjAuMSwgYW5kICoubG9jYWxob3N0IHN1YmRvbWFpbnMgKFJGQyA2NzYxKVxuICAgIGlmICghL15odHRwcz86XFwvXFwvKGxvY2FsaG9zdHwxMjdcXC4wXFwuMFxcLjF8W1xcdy1dK1xcLmxvY2FsaG9zdClbOi9dLy50ZXN0KHVybFN0cikpIHtcbiAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVUkwgbXVzdCBiZSBhIGxvY2FsaG9zdCBIVFRQIFVSTCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4ZWNGaWxlKGNtZCwgW3VybFN0cl0sIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gQ291bGQgbm90IGF1dG8tb3BlbiBicm93c2VyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTdGFydCB0aGUgcG9ydGZvbGlvIHdlYiBzZXJ2ZXIuXG4gKlxuICogQmluZHMgdG8gMTI3LjAuMC4xIG9ubHkgKGxvY2FsaG9zdCkuIFNlcnZlcyB0aGUgcG9ydGZvbGlvIGJyb3dzZXJcbiAqIGZyb250ZW5kIGFuZCBBUEkgcm91dGVzIGZvciByZWFkaW5nIGVsZW1lbnRzLlxuICpcbiAqIElkZW1wb3RlbnQ6IGlmIHRoZSBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nLCBvcHRpb25hbGx5IG9wZW5zIHRoZVxuICogYnJvd3NlciB3aXRob3V0IHN0YXJ0aW5nIGEgc2Vjb25kIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gU2VydmVyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEhvb2tzIGZvciBESSB3aXJpbmcgKGxvZyBicm9hZGNhc3QsIG1ldHJpY3Mgb25TbmFwc2hvdClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0V2ViU2VydmVyKG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMpOiBQcm9taXNlPFdlYlNlcnZlclJlc3VsdD4ge1xuICBjb25zdCBwb3J0ID0gb3B0aW9ucy5wb3J0IHx8IERFRkFVTFRfUE9SVDtcbiAgY29uc3QgcmVzdWx0OiBXZWJTZXJ2ZXJSZXN1bHQgPSB7fTtcblxuICBpZiAoc2VydmVyUnVubmluZykge1xuICAgIGlmIChvcHRpb25zLm9wZW5Ccm93c2VyKSB7XG4gICAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7c2VydmVyUG9ydH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgcmVzdWx0LmFwcCA9IGFwcDtcbiAgYXBwLmRpc2FibGUoJ3gtcG93ZXJlZC1ieScpO1xuXG4gIC8vIFNlY3VyaXR5IGhlYWRlcnNcbiAgYXBwLnVzZSgoX3JlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJyk7XG4gICAgcmVzLnNldEhlYWRlcignWC1GcmFtZS1PcHRpb25zJywgJ0RFTlknKTtcbiAgICByZXMuc2V0SGVhZGVyKCdYLVhTUy1Qcm90ZWN0aW9uJywgJzE7IG1vZGU9YmxvY2snKTtcbiAgICByZXMuc2V0SGVhZGVyKCdSZWZlcnJlci1Qb2xpY3knLCAnbm8tcmVmZXJyZXInKTtcbiAgICByZXMuc2V0SGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YCk7XG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBbXG4gICAgICBcImRlZmF1bHQtc3JjICdzZWxmJ1wiLFxuICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJyBjZG4uanNkZWxpdnIubmV0IGNkbmpzLmNsb3VkZmxhcmUuY29tXCIsXG4gICAgICBcInN0eWxlLXNyYyAnc2VsZicgJ3Vuc2FmZS1pbmxpbmUnIGNkbmpzLmNsb3VkZmxhcmUuY29tIGNkbi5qc2RlbGl2ci5uZXRcIixcbiAgICAgIFwiaW1nLXNyYyAnc2VsZicgZGF0YTpcIixcbiAgICAgIFwiY29ubmVjdC1zcmMgJ3NlbGYnIHJhdy5naXRodWJ1c2VyY29udGVudC5jb21cIixcbiAgICAgIFwiZm9udC1zcmMgJ3NlbGYnXCIsXG4gICAgXS5qb2luKCc7ICcpKTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIENvbnNvbGUgdG9rZW4gYXV0aGVudGljYXRpb24gbWlkZGxld2FyZSAoIzE3ODApLiBNb3VudGVkIGJlZm9yZSBhbnkgL2FwaVxuICAvLyByb3V0ZXMgc28gZXZlcnkgcHJvdGVjdGVkIGVuZHBvaW50IGdvZXMgdGhyb3VnaCBpdC4gV2hlbiB0aGUgZmVhdHVyZSBmbGFnXG4gIC8vIERPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVEIGlzIGZhbHNlIChQaGFzZSAxIGRlZmF1bHQpIHRoaXMgaXMgYSBwYXNzLXRocm91Z2guXG4gIC8vIFB1YmxpYyBlbmRwb2ludHMgaW4gUFVCTElDX1BBVEhfUFJFRklYRVMgYWx3YXlzIGJ5cGFzcyBhdXRoIHJlZ2FyZGxlc3Mgb2YgZmxhZy5cbiAgaWYgKG9wdGlvbnMudG9rZW5TdG9yZSkge1xuICAgIGNvbnN0IGF1dGhNaWRkbGV3YXJlID0gY3JlYXRlQXV0aE1pZGRsZXdhcmUoe1xuICAgICAgc3RvcmU6IG9wdGlvbnMudG9rZW5TdG9yZSxcbiAgICAgIGVuYWJsZWQ6IGVudi5ET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCxcbiAgICAgIHB1YmxpY1BhdGhQcmVmaXhlczogUFVCTElDX1BBVEhfUFJFRklYRVMsXG4gICAgICBsYWJlbDogJ2FwaScsXG4gICAgfSk7XG4gICAgYXBwLnVzZSgnL2FwaScsIGF1dGhNaWRkbGV3YXJlKTtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBbV2ViVUldIENvbnNvbGUgYXV0aCBtaWRkbGV3YXJlIG1vdW50ZWQgJHtlbnYuRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQgPyAnRU5GT1JDSU5HJyA6ICdwYXNzLXRocm91Z2ggKGZsYWcgb2ZmKSd9YCxcbiAgICApO1xuXG4gICAgLy8gVE9UUCBlbnJvbGxtZW50IHJvdXRlcyAoIzE3OTQpLiBNb3VudGVkIEFGVEVSIHRoZSAvYXBpIGF1dGggbWlkZGxld2FyZVxuICAgIC8vIGJlY2F1c2UgdGhlIHJvdXRlciBhZGRzIGl0cyBvd24gYWx3YXlzLW9uIGF1dGggZ3VhcmQg4oCUIHRoZSBnbG9iYWwgYXV0aFxuICAgIC8vIG1pZGRsZXdhcmUgYXQgL2FwaSBpcyBhIHBhc3MtdGhyb3VnaCBkdXJpbmcgUGhhc2UgMSByb2xsb3V0LCBidXQgdGhlXG4gICAgLy8gVE9UUCByb3V0ZXIgZW5mb3JjZXMgcmVnYXJkbGVzcyBvZiBET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCBzbyBhblxuICAgIC8vIGF0dGFja2VyIHdpdGggbG9jYWwgcG9ydCBhY2Nlc3MgY2Fubm90IHByZS1lbnJvbGwgYSBzZWNvbmQgZmFjdG9yIGFuZFxuICAgIC8vIGxvY2sgdGhlIGxlZ2l0aW1hdGUgdXNlciBvdXQuXG4gICAgYXBwLnVzZSgnL2FwaS9jb25zb2xlL3RvdHAnLCBjcmVhdGVUb3RwUm91dGVzKHsgc3RvcmU6IG9wdGlvbnMudG9rZW5TdG9yZSB9KSk7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gVE9UUCByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL2NvbnNvbGUvdG90cCAoYWx3YXlzLW9uIGF1dGgpJyk7XG5cbiAgICAvLyBUb2tlbiBtYW5hZ2VtZW50IHJvdXRlcyAoIzE3OTUpLiBNb3VudGVkIGFsb25nc2lkZSB0aGUgVE9UUCByb3V0ZXIgd2l0aFxuICAgIC8vIHRoZSBzYW1lIGFsd2F5cy1vbiBhdXRoIHBhdHRlcm4uIEN1cnJlbnRseSBob3N0cyB0aGUgcm90YXRpb24gZW5kcG9pbnQ7XG4gICAgLy8gZnV0dXJlIHRva2VuIG1hbmFnZW1lbnQgb3BlcmF0aW9ucyAobGlzdCwgcmV2b2tlKSBnbyBoZXJlIHRvby5cbiAgICBhcHAudXNlKCcvYXBpL2NvbnNvbGUvdG9rZW4nLCBjcmVhdGVUb2tlblJvdXRlcyh7IHN0b3JlOiBvcHRpb25zLnRva2VuU3RvcmUgfSkpO1xuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIFRva2VuIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvY29uc29sZS90b2tlbiAoYWx3YXlzLW9uIGF1dGgpJyk7XG4gIH1cblxuICAvLyBTZXR1cCByb3V0ZXM6IGF1dG8taW5zdGFsbCBEb2xsaG91c2VNQ1AgdG8gTUNQIGNsaWVudHMgKG1vdW50IEJFRk9SRSBBUEkgcm91dGVzKVxuICAvLyBCb2R5IGxpbWl0IHNjb3BlZCB0byBzZXR1cCByb3V0ZXMgb25seSDigJQgaW5nZXN0IHJvdXRlcyBuZWVkIDFtYiBmb3IgZm9sbG93ZXIgbG9nIGZvcndhcmRpbmdcbiAgY29uc3Qgc2V0dXBKc29uUGFyc2VyID0gZXhwcmVzcy5qc29uKHsgbGltaXQ6IFNFVFVQX0JPRFlfTElNSVQsIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgY29uc3QgeyBpbnN0YWxsSGFuZGxlciwgb3BlbkNvbmZpZ0hhbmRsZXIsIHZlcnNpb25IYW5kbGVyLCBtY3BiUmVkaXJlY3RIYW5kbGVyLCBkZXRlY3RIYW5kbGVyLCBnZXRMaWNlbnNlSGFuZGxlciwgc2V0TGljZW5zZUhhbmRsZXIsIHZlcmlmeUxpY2Vuc2VIYW5kbGVyLCByZXNlbmRWZXJpZmljYXRpb25IYW5kbGVyIH0gPSBjcmVhdGVTZXR1cFJvdXRlcygpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9pbnN0YWxsJywgc2V0dXBKc29uUGFyc2VyLCBpbnN0YWxsSGFuZGxlcik7XG4gIGFwcC5wb3N0KCcvYXBpL3NldHVwL29wZW4tY29uZmlnJywgc2V0dXBKc29uUGFyc2VyLCBvcGVuQ29uZmlnSGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvdmVyc2lvbicsIHZlcnNpb25IYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC9tY3BiJywgbWNwYlJlZGlyZWN0SGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvZGV0ZWN0JywgZGV0ZWN0SGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvbGljZW5zZScsIGdldExpY2Vuc2VIYW5kbGVyKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvbGljZW5zZScsIHNldHVwSnNvblBhcnNlciwgc2V0TGljZW5zZUhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9saWNlbnNlL3ZlcmlmeScsIHNldHVwSnNvblBhcnNlciwgdmVyaWZ5TGljZW5zZUhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9saWNlbnNlL3Jlc2VuZCcsIHNldHVwSnNvblBhcnNlciwgcmVzZW5kVmVyaWZpY2F0aW9uSGFuZGxlcik7XG4gIGxvZ2dlci5pbmZvKCdbV2ViVUldIFNldHVwIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvc2V0dXAnKTtcblxuICAvLyBGaXJlLWFuZC1mb3JnZXQgTlZNIGxhdW5jaGVyIHJlcGFpcjogcmVjcmVhdGVzIHRoZSB3cmFwcGVyIGlmIGRlbGV0ZWQgYW5kXG4gIC8vIHBhdGNoZXMgYW55IHByZS1leGlzdGluZyBjb25maWdzIHRoYXQgc3RpbGwgdXNlIGJhcmUgYG5weGAuIE5vLW9wcyB3aGVuXG4gIC8vIE5WTSBpcyBhYnNlbnQgb3Igb24gV2luZG93cy4gTmV2ZXIgZGVsYXlzIHNlcnZlciBzdGFydHVwLlxuICByZXBhaXJOdm1MYXVuY2hlck9uU3RhcnR1cCgpLmNhdGNoKGVyciA9PlxuICAgIGxvZ2dlci53YXJuKGBbU2V0dXBdIE5WTSBzdGFydHVwIHJlcGFpciB0aHJldyB1bmV4cGVjdGVkbHk6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApXG4gICk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Rlc3QnKSB7XG4gICAgcmVwYWlyUGVybWlzc2lvbkhvb2tzT25TdGFydHVwKClcbiAgICAgIC50aGVuKChzdW1tYXJ5KSA9PiB7XG4gICAgICAgIGlmIChzdW1tYXJ5Lm5lZWRzUmVwYWlyQ291bnQgPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgW1NldHVwXSBQZXJtaXNzaW9uIGhvb2sgc3RhcnR1cCByZXBhaXIgY29tcGxldGVkIHdpdGggJHtzdW1tYXJ5Lm5lZWRzUmVwYWlyQ291bnR9IGlzc3VlKHMpIGAgK1xuICAgICAgICAgICAgYGFjcm9zcyAke3N1bW1hcnkuaG9zdFJlc3VsdHMubGVuZ3RofSBob3N0KHMpYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVyciA9PlxuICAgICAgICBsb2dnZXIud2FybihgW1NldHVwXSBQZXJtaXNzaW9uIGhvb2sgc3RhcnR1cCByZXBhaXIgdGhyZXcgdW5leHBlY3RlZGx5OiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gKVxuICAgICAgKTtcbiAgfVxuXG4gIC8vIEFQSSByb3V0ZXMg4oCUIHVzZSBNQ1AtQVFMIGdhdGV3YXkgd2hlbiBoYW5kbGVyIGlzIGF2YWlsYWJsZSAoSXNzdWUgIzc5NilcbiAgaWYgKG9wdGlvbnMubWNwQXFsSGFuZGxlcikge1xuICAgIGFwcC51c2UoJy9hcGknLCBjcmVhdGVHYXRld2F5QXBpUm91dGVzKG9wdGlvbnMubWNwQXFsSGFuZGxlciwgb3B0aW9ucy5wb3J0Zm9saW9EaXIpKTtcblxuICAgIC8vIFBlcm1pc3Npb24gZXZhbHVhdGlvbiByb3V0ZXMgKFBPU1QgL2V2YWx1YXRlX3Blcm1pc3Npb24sIEdFVCAvcGVybWlzc2lvbnMvc3RhdHVzKVxuICAgIGNvbnN0IHsgcmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoJy4vcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMuanMnKTtcbiAgICBjb25zdCBwZXJtUm91dGVyID0gKGF3YWl0IGltcG9ydCgnZXhwcmVzcycpKS5Sb3V0ZXIoKTtcbiAgICByZWdpc3RlclBlcm1pc3Npb25Sb3V0ZXMocGVybVJvdXRlciwgb3B0aW9ucy5tY3BBcWxIYW5kbGVyKTtcbiAgICBhcHAudXNlKCcvYXBpJywgcGVybVJvdXRlcik7XG5cbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBBUEkgcm91dGVzIHVzaW5nIE1DUC1BUUwgR2F0ZXdheSArIHBlcm1pc3Npb24gcm91dGVzJyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwLnVzZSgnL2FwaScsIGNyZWF0ZUFwaVJvdXRlcyhvcHRpb25zLnBvcnRmb2xpb0RpcikpO1xuICAgIGxvZ2dlci53YXJuKCdbV2ViVUldIEFQSSByb3V0ZXMgdXNpbmcgZGlyZWN0IGZpbGVzeXN0ZW0gYWNjZXNzIChubyBNQ1AtQVFMIGhhbmRsZXIgYXZhaWxhYmxlKScpO1xuICB9XG5cbiAgLy8gQ29uc29sZSByb3V0ZXM6IGxvZ3MsIG1ldHJpY3MsIGhlYWx0aCDigJQgZXh0cmFjdGVkIHRvIGtlZXAgY29nbml0aXZlXG4gIC8vIGNvbXBsZXhpdHkgb2Ygc3RhcnRXZWJTZXJ2ZXIgbWFuYWdlYWJsZS5cbiAgbW91bnRDb25zb2xlUm91dGVzKGFwcCwgb3B0aW9ucywgcmVzdWx0KTtcblxuICAvLyBTZXJ2ZSB+Ly5kb2xsaG91c2UvcGFnZXMvIGF0IC9wYWdlcy8g4oCUIGRhc2hib2FyZHMsIGdlbmVyYXRlZCBjb250ZW50LCBzdGFjayB2aWV3c1xuICBjb25zdCBwYWdlc0RpciA9IGpvaW4oZGlybmFtZShvcHRpb25zLnBvcnRmb2xpb0RpciksICdwYWdlcycpO1xuICBta2RpcihwYWdlc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSkuY2F0Y2goZXJyID0+IHtcbiAgICBsb2dnZXIud2FybihgW1dlYlVJXSBDb3VsZCBub3QgY3JlYXRlIHBhZ2VzIGRpcmVjdG9yeTogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9KTtcbiAgYXBwLnVzZSgnL3BhZ2VzJywgZXhwcmVzcy5zdGF0aWMocGFnZXNEaXIpKTtcblxuICAvKipcbiAgICogR0VUIC9hcGkvcGFnZXNcbiAgICogTGlzdHMgYXZhaWxhYmxlIEhUTUwgcGFnZXMgaW4gfi8uZG9sbGhvdXNlL3BhZ2VzLy5cbiAgICogUmV0dXJucyBwYWdlIG5hbWVzIGFuZCB0aGVpciBVUkxzIGZvciB0aGUgbWFuYWdlbWVudCBjb25zb2xlLlxuICAgKi9cbiAgYXBwLmdldCgnL2FwaS9wYWdlcycsIGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKHBhZ2VzRGlyKTtcbiAgICAgIGNvbnN0IHBhZ2VzID0gZmlsZXNcbiAgICAgICAgLmZpbHRlcihmID0+ICFmLnN0YXJ0c1dpdGgoJy4nKSAmJiBBTExPV0VEX1BBR0VfRVhURU5TSU9OUy5oYXMoZXh0bmFtZShmKSkpXG4gICAgICAgIC5tYXAoZiA9PiAoeyBuYW1lOiBmLCB1cmw6IGAvcGFnZXMvJHtmfWAgfSkpO1xuICAgICAgcmVzLmpzb24oeyBwYWdlcywgZGlyZWN0b3J5OiBwYWdlc0RpciB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJlcy5qc29uKHsgcGFnZXM6IFtdLCBkaXJlY3Rvcnk6IHBhZ2VzRGlyIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWRkaXRpb25hbCByb3V0ZXJzIChlLmcuLCB1bmlmaWVkIGNvbnNvbGUgaW5nZXN0IHJvdXRlcykg4oCUIG11c3QgbW91bnQgYmVmb3JlIFNQQSBmYWxsYmFja1xuICBvcHRpb25zLmFkZGl0aW9uYWxSb3V0ZXJzPy5mb3JFYWNoKHJvdXRlciA9PiBhcHAudXNlKHJvdXRlcikpO1xuXG4gIC8vIFN0YXRpYyBmcm9udGVuZCBmaWxlc1xuICBjb25zdCBwdWJsaWNEaXIgPSBqb2luKF9fZGlybmFtZSwgJ3B1YmxpYycpO1xuICAvLyBTZXJ2ZSBzdGF0aWMgYXNzZXRzIGJ1dCBza2lwIGluZGV4Lmh0bWwg4oCUIHRoZSBTUEEgZmFsbGJhY2sgYmVsb3dcbiAgLy8gaGFuZGxlcyBpdCB3aXRoIHRva2VuIGluamVjdGlvbiAocmVwbGFjZXMge3tDT05TT0xFX1RPS0VOfX0gaW4gdGhlXG4gIC8vIG1ldGEgdGFnKS4gV2l0aG91dCB0aGlzLCBleHByZXNzLnN0YXRpYyBzZXJ2ZXMgdGhlIHJhdyB0ZW1wbGF0ZVxuICAvLyBhbmQgdGhlIGJyb3dzZXIgbmV2ZXIgZ2V0cyB0aGUgYXV0aCB0b2tlbiAoIzE3ODApLlxuICBjb25zdCBpc0RlYnVnID0gQm9vbGVhbihwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcgfHwgcHJvY2Vzcy5lbnYuRU5BQkxFX0RFQlVHKTtcbiAgYXBwLnVzZShleHByZXNzLnN0YXRpYyhwdWJsaWNEaXIsIHtcbiAgICBpbmRleDogZmFsc2UsXG4gICAgLy8gSW4gZGVidWcgbW9kZSwgZGlzYWJsZSBjYWNoaW5nIG9uIGFsbCBzdGF0aWMgYXNzZXRzIChKUywgQ1NTKSBzb1xuICAgIC8vIFVJIGNoYW5nZXMgYXJlIHBpY2tlZCB1cCBvbiBub3JtYWwgcmVsb2FkIHdpdGhvdXQgQ21kK1NoaWZ0K1IuXG4gICAgLi4uKGlzRGVidWdcbiAgICAgID8geyBldGFnOiBmYWxzZSwgbGFzdE1vZGlmaWVkOiBmYWxzZSwgbWF4QWdlOiAwIH1cbiAgICAgIDogeyBtYXhBZ2U6ICcxeScsIGltbXV0YWJsZTogdHJ1ZSB9KSxcbiAgfSkpO1xuXG4gIC8vIFNQQSBmYWxsYmFjayB3aXRoIGNvbnNvbGUgdG9rZW4gaW5qZWN0aW9uICgjMTc4MCkuXG4gIC8vIFJlYWRzIGluZGV4Lmh0bWwgb24gZmlyc3QgcmVxdWVzdCwgc3Vic3RpdHV0ZXMgdGhlIHt7Q09OU09MRV9UT0tFTn19IHBsYWNlaG9sZGVyXG4gIC8vIHdpdGggdGhlIGN1cnJlbnQgdG9rZW4gdmFsdWUsIGFuZCBjYWNoZXMgdGhlIHJlbmRlcmVkIHN0cmluZy4gVGhlIGNhY2hlIGlzXG4gIC8vIGF1dG8taW52YWxpZGF0ZWQgd2hlbiB0aGUgcHJpbWFyeSB0b2tlbiBjaGFuZ2VzIChyb3RhdGlvbiksIHNvIGEgcGFnZSByZWxvYWRcbiAgLy8gYWZ0ZXIgcm90YXRpb24gcGlja3MgdXAgdGhlIG5ldyB0b2tlbiB3aXRob3V0IGEgc2VydmVyIHJlc3RhcnQuXG4gIGxldCBjYWNoZWRJbmRleEh0bWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgY2FjaGVkVG9rZW5WYWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IGluZGV4SHRtbFBhdGggPSBqb2luKHB1YmxpY0RpciwgJ2luZGV4Lmh0bWwnKTtcblxuICBjb25zdCByZW5kZXJJbmRleEh0bWwgPSBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICBjb25zdCB0b2tlblZhbHVlID0gb3B0aW9ucy50b2tlblN0b3JlPy5nZXRQcmltYXJ5VG9rZW5WYWx1ZSgpID8/ICcnO1xuICAgIC8vIEF1dG8taW52YWxpZGF0ZSBjYWNoZSB3aGVuIHRoZSB0b2tlbiBjaGFuZ2VzIChyb3RhdGlvbikuXG4gICAgLy8gSW4gZGVidWcgbW9kZSwgYWx3YXlzIHJlLXJlYWQgZnJvbSBkaXNrIHNvIFVJIGNoYW5nZXMgYXJlIHBpY2tlZCB1cCBvbiByZWxvYWQuXG4gICAgaWYgKCFpc0RlYnVnICYmIGNhY2hlZEluZGV4SHRtbCAhPT0gbnVsbCAmJiBjYWNoZWRUb2tlblZhbHVlID09PSB0b2tlblZhbHVlKSB7XG4gICAgICByZXR1cm4gY2FjaGVkSW5kZXhIdG1sO1xuICAgIH1cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHJlYWRGaWxlRnMoaW5kZXhIdG1sUGF0aCwgJ3V0ZjgnKTtcbiAgICAvLyBEZWZlbnNpdmUgSFRNTCBhdHRyaWJ1dGUgZXNjYXBlLiBUb2tlbnMgYXJlIHN0cmljdCA2NC1jaGFyIGxvd2VyY2FzZSBoZXhcbiAgICAvLyB0b2RheSBzbyBubyBlc2NhcGluZyBpcyBhY3R1YWxseSBuZWVkZWQsIGJ1dCBpZiB0aGUgdG9rZW4gZm9ybWF0IGV2ZXJcbiAgICAvLyBjaGFuZ2VzIHRoaXMgcHJldmVudHMgYW4gSFRNTC1pbmplY3Rpb24gcmVncmVzc2lvbiBmcm9tIGxhbmRpbmcgc2lsZW50bHkuXG4gICAgY29uc3QgZXNjYXBlZFRva2VuID0gdG9rZW5WYWx1ZVxuICAgICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJ1wiJywgJyZxdW90OycpXG4gICAgICAucmVwbGFjZUFsbChcIidcIiwgJyYjMzk7JylcbiAgICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpO1xuICAgIGNvbnN0IGVzY2FwZWRTZXNzaW9uSWQgPSAob3B0aW9ucy5zZXNzaW9uSWQgPz8gJycpXG4gICAgICAucmVwbGFjZUFsbCgnJicsICcmYW1wOycpXG4gICAgICAucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JylcbiAgICAgIC5yZXBsYWNlQWxsKFwiJ1wiLCAnJiMzOTsnKVxuICAgICAgLnJlcGxhY2VBbGwoJzwnLCAnJmx0OycpXG4gICAgICAucmVwbGFjZUFsbCgnPicsICcmZ3Q7Jyk7XG4gICAgY29uc3QgZXNjYXBlZFJ1bnRpbWVTZXNzaW9uSWQgPSAob3B0aW9ucy5ydW50aW1lU2Vzc2lvbklkID8/ICcnKVxuICAgICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJ1wiJywgJyZxdW90OycpXG4gICAgICAucmVwbGFjZUFsbChcIidcIiwgJyYjMzk7JylcbiAgICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxuICAgICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpO1xuICAgIGNhY2hlZEluZGV4SHRtbCA9IHRlbXBsYXRlXG4gICAgICAucmVwbGFjZUFsbChUT0tFTl9NRVRBX1BMQUNFSE9MREVSLCBlc2NhcGVkVG9rZW4pXG4gICAgICAucmVwbGFjZUFsbChWRVJTSU9OX01FVEFfUExBQ0VIT0xERVIsIFBBQ0tBR0VfVkVSU0lPTilcbiAgICAgIC5yZXBsYWNlQWxsKFNFU1NJT05fSURfTUVUQV9QTEFDRUhPTERFUiwgZXNjYXBlZFNlc3Npb25JZClcbiAgICAgIC5yZXBsYWNlQWxsKFJVTlRJTUVfU0VTU0lPTl9JRF9NRVRBX1BMQUNFSE9MREVSLCBlc2NhcGVkUnVudGltZVNlc3Npb25JZClcbiAgICAgIC5yZXBsYWNlQWxsKEFTU0VUX1ZFUlNJT05fTUVUQV9QTEFDRUhPTERFUiwgUEFDS0FHRV9WRVJTSU9OKTtcbiAgICBjYWNoZWRUb2tlblZhbHVlID0gdG9rZW5WYWx1ZTtcbiAgICByZXR1cm4gY2FjaGVkSW5kZXhIdG1sO1xuICB9O1xuXG4gIGFwcC5nZXQoJy97KnBhdGh9JywgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSByZXEucGF0aC5ub3JtYWxpemUoJ05GQycpO1xuICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKCcvYXBpLycpKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgQVBJIHJvdXRlIG5vdCBmb3VuZDogJHtub3JtYWxpemVkUGF0aH1gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCgnL3BhZ2VzLycpKSB7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBgUGFnZSBub3QgZm91bmQ6ICR7bm9ybWFsaXplZFBhdGh9YCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJJbmRleEh0bWwoKTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnKTtcbiAgICAgIC8vIFRoZSBzaGVsbCBzaG91bGQgYWx3YXlzIHJldmFsaWRhdGUgc28gYSBmb3JjZWQgcmVsb2FkIGNhbiBwaWNrIHVwXG4gICAgICAvLyBhIG5ldyBsZWFkZXIvdmVyc2lvbiBpbW1lZGlhdGVseS4gQXNzZXQgZmlsZXMgdGhlbXNlbHZlcyBjYXJyeSBhXG4gICAgICAvLyB2ZXJzaW9uIHF1ZXJ5IGFuZCBjYW4gYmUgY2FjaGVkIGFnZ3Jlc3NpdmVseS5cbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0NhY2hlLUNvbnRyb2wnLCAnbm8tY2FjaGUsIG5vLXN0b3JlLCBtdXN0LXJldmFsaWRhdGUnKTtcbiAgICAgIHJlcy5zZW5kKGh0bWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUldIEZhaWxlZCB0byByZW5kZXIgaW5kZXguaHRtbDogJHsoZXJyIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoJ0ZhaWxlZCB0byBsb2FkIGNvbnNvbGUnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEdsb2JhbCBlcnJvciBoYW5kbGVyIOKAlCBjYXRjaCBFeHByZXNzIGVycm9ycyBhbmQgcm91dGUgdG8gbG9nZ2VyIGluc3RlYWQgb2YgdGVybWluYWwuXG4gIC8vIFdpdGhvdXQgdGhpcywgRXhwcmVzcyBkdW1wcyBzdGFjayB0cmFjZXMgdG8gc3RkZXJyICh2aXNpYmxlIGluIC0td2ViIHRlcm1pbmFsKS5cbiAgLy8gQWxsIGVycm9ycyBzdGlsbCBhcHBlYXIgaW4gdGhlIG1hbmFnZW1lbnQgY29uc29sZSdzIExvZ3MgdGFiIHZpYSBNZW1vcnlMb2dTaW5rLlxuICBhcHAudXNlKChlcnI6IEVycm9yLCBfcmVxOiBpbXBvcnQoJ2V4cHJlc3MnKS5SZXF1ZXN0LCByZXM6IGltcG9ydCgnZXhwcmVzcycpLlJlc3BvbnNlLCBfbmV4dDogaW1wb3J0KCdleHByZXNzJykuTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgY29uc3Qgc3RhdHVzID0gKGVyciBhcyBhbnkpLnN0YXR1cyB8fCAoZXJyIGFzIGFueSkuc3RhdHVzQ29kZSB8fCA1MDA7XG4gICAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gJHtlcnIubmFtZX06ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgIHJlcy5zdGF0dXMoc3RhdHVzKS5qc29uKHsgZXJyb3I6IGVyci5tZXNzYWdlIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQmluZCB0byBsb2NhbGhvc3Qgb25seSDigJQgaGFuZGxlIHBvcnQgY29uZmxpY3RzIGdyYWNlZnVsbHkuXG4gIC8vIEV4dHJhY3RlZCB0byBhIGhlbHBlciB0byBrZWVwIHN0YXJ0V2ViU2VydmVyJ3MgY29nbml0aXZlIGNvbXBsZXhpdHkgbWFuYWdlYWJsZS5cbiAgcmVzdWx0LmJpbmRSZXN1bHQgPSBhd2FpdCBiaW5kQW5kTGlzdGVuKGFwcCwgcG9ydCwgb3B0aW9ucyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBNb3VudCB0aGUgbG9ncywgbWV0cmljcywgYW5kIGhlYWx0aCByb3V0ZXMuIFRoZXNlIGFyZSBvbmx5IG1vdW50ZWQgd2hlbiB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgc2lua3MgYXJlIHByb3ZpZGVkIChtZW1vcnkgbG9nIHNpbmsgZm9yIGxvZ3MraGVhbHRoLCBtZXRyaWNzXG4gKiBzaW5rIGZvciB0aGUgbWV0cmljcyB0YWIpLiBFeHRyYWN0ZWQgZnJvbSBzdGFydFdlYlNlcnZlciB0byBjYXAgdGhlIG1haW5cbiAqIGZ1bmN0aW9uJ3MgY29nbml0aXZlIGNvbXBsZXhpdHkuXG4gKi9cbmZ1bmN0aW9uIG1vdW50Q29uc29sZVJvdXRlcyhcbiAgYXBwOiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzLFxuICBvcHRpb25zOiBXZWJTZXJ2ZXJPcHRpb25zLFxuICByZXN1bHQ6IFdlYlNlcnZlclJlc3VsdCxcbik6IHZvaWQge1xuICBsZXQgbG9nUm91dGVzOiBMb2dSb3V0ZXNSZXN1bHQgfCB1bmRlZmluZWQ7XG4gIGxldCBtZXRyaWNzUm91dGVzOiBNZXRyaWNzUm91dGVzUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zLm1lbW9yeVNpbmspIHtcbiAgICBsb2dSb3V0ZXMgPSBjcmVhdGVMb2dSb3V0ZXMob3B0aW9ucy5tZW1vcnlTaW5rKTtcbiAgICBhcHAudXNlKCcvYXBpJywgbG9nUm91dGVzLnJvdXRlcik7XG4gICAgcmVzdWx0LmxvZ0Jyb2FkY2FzdCA9IGxvZ1JvdXRlcy5icm9hZGNhc3Q7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gTG9nIHZpZXdlciByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL2xvZ3MnKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm1ldHJpY3NTaW5rKSB7XG4gICAgbWV0cmljc1JvdXRlcyA9IGNyZWF0ZU1ldHJpY3NSb3V0ZXMob3B0aW9ucy5tZXRyaWNzU2luayk7XG4gICAgYXBwLnVzZSgnL2FwaScsIG1ldHJpY3NSb3V0ZXMucm91dGVyKTtcbiAgICByZXN1bHQubWV0cmljc09uU25hcHNob3QgPSBtZXRyaWNzUm91dGVzLm9uU25hcHNob3Q7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gTWV0cmljcyByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL21ldHJpY3MnKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm1lbW9yeVNpbmspIHtcbiAgICBjb25zdCBoZWFsdGhSb3V0ZXIgPSBjcmVhdGVIZWFsdGhSb3V0ZXMoe1xuICAgICAgbWVtb3J5U2luazogb3B0aW9ucy5tZW1vcnlTaW5rLFxuICAgICAgbWV0cmljc1Npbms6IG9wdGlvbnMubWV0cmljc1NpbmssXG4gICAgICBsb2dDbGllbnRDb3VudDogbG9nUm91dGVzID8gbG9nUm91dGVzLmNsaWVudENvdW50IDogKCkgPT4gMCxcbiAgICAgIG1ldHJpY3NDbGllbnRDb3VudDogbWV0cmljc1JvdXRlcyA/IG1ldHJpY3NSb3V0ZXMuY2xpZW50Q291bnQgOiAoKSA9PiAwLFxuICAgIH0pO1xuICAgIGFwcC51c2UoJy9hcGknLCBoZWFsdGhSb3V0ZXIpO1xuICB9XG59XG5cbi8qKlxuICogUHJpbnQgdGhlIHN0YXJ0dXAgYmFubmVyIHRvIHN0ZGVyci5cbiAqXG4gKiBOT1RFOiBVc2Ugc3RkZXJyIGZvciB0ZXJtaW5hbCBvdXRwdXQsIG5vdCBzdGRvdXQuIEluIE1DUCBzdGRpbyBtb2RlLCBzdGRvdXRcbiAqIGlzIHJlc2VydmVkIGZvciBKU09OLVJQQyBtZXNzYWdlcyDigJQgYW55IG5vbi1KU09OIG91dHB1dCBjb3JydXB0cyB0aGUgcHJvdG9jb2wuXG4gKiBzdGRlcnIgaXMgc2FmZSBmb3IgaHVtYW4tcmVhZGFibGUgbWVzc2FnZXMgaW4gYm90aCBNQ1AgYW5kIHN0YW5kYWxvbmUgbW9kZXMuXG4gKi9cbmZ1bmN0aW9uIHByaW50U3RhcnR1cEJhbm5lcihwb3J0OiBudW1iZXIsIHRva2VuU3RvcmU6IENvbnNvbGVUb2tlblN0b3JlIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGNvbnN0IHVybCA9IGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gO1xuICBjb25zdCBmYWxsYmFja1VybCA9IGBodHRwOi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBNYW5hZ2VtZW50IGNvbnNvbGUgcnVubmluZyBhdCAke3VybH1gKTtcbiAgY29uc29sZS5lcnJvcihgXFxuICBEb2xsaG91c2VNQ1AgTWFuYWdlbWVudCBDb25zb2xlXFxuICAke3VybH1cXG4gICR7ZmFsbGJhY2tVcmx9IChmYWxsYmFjaylcXG5gKTtcbiAgaWYgKHRva2VuU3RvcmUpIHtcbiAgICBjb25zb2xlLmVycm9yKGAgIFNlc3Npb24gdG9rZW46ICR7dG9rZW5TdG9yZS5nZXRGaWxlUGF0aCgpfVxcbmApO1xuICB9XG4gIGNvbnNvbGUuZXJyb3IoYCAgVHlwZSBcInFcIiBvciBcInF1aXRcIiB0byBleGl0LlxcbmApO1xufVxuXG4vLyBTdGFsZSBwcm9jZXNzIHJlY292ZXJ5IOKAlCBleHRyYWN0ZWQgdG8gU3RhbGVQcm9jZXNzUmVjb3ZlcnkudHMgZm9yIGluZGVwZW5kZW50IHRlc3RpbmcgKCMxODUwKS5cbmltcG9ydCB7IHJlY292ZXJTdGFsZVBvcnQgfSBmcm9tICcuL2NvbnNvbGUvU3RhbGVQcm9jZXNzUmVjb3ZlcnkuanMnO1xuZXhwb3J0IHsgZmluZFBpZE9uUG9ydCwga2lsbFN0YWxlUHJvY2VzcywgcmVjb3ZlclN0YWxlUG9ydCB9IGZyb20gJy4vY29uc29sZS9TdGFsZVByb2Nlc3NSZWNvdmVyeS5qcyc7XG5cbi8qKlxuICogQXR0ZW1wdCBhIHNpbmdsZSBwb3J0IGJpbmQuIFJldHVybnMgYSBCaW5kUmVzdWx0IHdpdGhvdXQgYW55IHJlY292ZXJ5IGxvZ2ljLlxuICovXG5mdW5jdGlvbiBhdHRlbXB0QmluZChcbiAgYXBwOiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzLFxuICBwb3J0OiBudW1iZXIsXG4gIG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMsXG4pOiBQcm9taXNlPEJpbmRSZXN1bHQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPEJpbmRSZXN1bHQ+KChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgaHR0cFNlcnZlciA9IGFwcC5saXN0ZW4ocG9ydCwgJzEyNy4wLjAuMScsICgpID0+IHtcbiAgICAgIHNlcnZlclJ1bm5pbmcgPSB0cnVlO1xuICAgICAgc2VydmVyUG9ydCA9IHBvcnQ7XG4gICAgICBhY3RpdmVIdHRwU2VydmVyID0gaHR0cFNlcnZlcjtcbiAgICAgIHByaW50U3RhcnR1cEJhbm5lcihwb3J0LCBvcHRpb25zLnRva2VuU3RvcmUpO1xuICAgICAgaWYgKG9wdGlvbnMub3BlbkJyb3dzZXIpIHtcbiAgICAgICAgb3BlbkluQnJvd3NlcihgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICBodHRwU2VydmVyLm9uKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VBRERSSU5VU0UnLCBkZXRhaWw6IGBQb3J0ICR7cG9ydH0gYWxyZWFkeSBpbiB1c2VgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUldIEZhaWxlZCB0byBiaW5kIHBvcnQgJHtwb3J0fTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgcmVzb2x2ZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ09USEVSJywgZGV0YWlsOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogQmluZCB0aGUgRXhwcmVzcyBhcHAgdG8gMTI3LjAuMC4xOnBvcnQuIE9uIEVBRERSSU5VU0UsIGF0dGVtcHQgdG8gZmluZFxuICogYW5kIGtpbGwgdGhlIHN0YWxlIERvbGxob3VzZU1DUCBwcm9jZXNzIGhvbGRpbmcgdGhlIHBvcnQsIHRoZW4gcmV0cnkgb25jZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYmluZEFuZExpc3RlbihcbiAgYXBwOiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzLFxuICBwb3J0OiBudW1iZXIsXG4gIG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMsXG4pOiBQcm9taXNlPEJpbmRSZXN1bHQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXR0ZW1wdEJpbmQoYXBwLCBwb3J0LCBvcHRpb25zKTtcbiAgaWYgKHJlc3VsdC5zdWNjZXNzIHx8IHJlc3VsdC5lcnJvciAhPT0gJ0VBRERSSU5VU0UnKSByZXR1cm4gcmVzdWx0O1xuXG4gIC8vIFBvcnQgb2NjdXBpZWQg4oCUIGF0dGVtcHQgc3RhbGUgcHJvY2VzcyByZWNvdmVyeSBhbmQgcmV0cnlcbiAgaWYgKGF3YWl0IHJlY292ZXJTdGFsZVBvcnQocG9ydCkpIHtcbiAgICBjb25zdCByZXRyeVJlc3VsdCA9IGF3YWl0IGF0dGVtcHRCaW5kKGFwcCwgcG9ydCwgb3B0aW9ucyk7XG4gICAgaWYgKHJldHJ5UmVzdWx0LnN1Y2Nlc3MpIHJldHVybiByZXRyeVJlc3VsdDtcbiAgfVxuXG4gIC8vIFN0aWxsIGNhbid0IGJpbmQg4oCUIGZhbGwgdGhyb3VnaCB3aXRoIHdhcm5pbmdcbiAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gUG9ydCAke3BvcnR9IGFscmVhZHkgaW4gdXNlIOKAlCBhbm90aGVyIHByb2Nlc3MgaG9sZHMgdGhpcyBwb3J0YCk7XG4gIGNvbnNvbGUuZXJyb3IoYFxcbiAgRG9sbGhvdXNlTUNQIE1hbmFnZW1lbnQgQ29uc29sZSAoZXhpc3RpbmcgaW5zdGFuY2UpXFxuICBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1cXG5gKTtcbiAgaWYgKG9wdGlvbnMub3BlbkJyb3dzZXIpIHtcbiAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE9wZW4gdGhlIHBvcnRmb2xpbyBicm93c2VyIGZyb20gd2l0aGluIHRoZSBNQ1Agc2VydmVyIHByb2Nlc3MuXG4gKlxuICogU3RhcnRzIHRoZSB3ZWIgc2VydmVyIGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcsIHRoZW4gb3BlbnMgdGhlIHN5c3RlbVxuICogYnJvd3NlciB0byB0aGUgcG9ydGZvbGlvIFVJLiBSZXR1cm5zIGEgcmVzdWx0IG9iamVjdCBpbmRpY2F0aW5nXG4gKiB3aGV0aGVyIHRoZSBzZXJ2ZXIgc3RhcnRlZCBhbmQgdGhlIGJyb3dzZXIgb3BlbmVkIHN1Y2Nlc3NmdWxseS5cbiAqXG4gKiBDYWxsZWQgYnkgdGhlIGBvcGVuX3BvcnRmb2xpb19icm93c2VyYCBNQ1AtQVFMIG9wZXJhdGlvbiAoSXNzdWUgIzc3NCkuXG4gKlxuICogQHBhcmFtIHBvcnRmb2xpb0RpciAtIFBhdGggdG8gdGhlIHBvcnRmb2xpbyBkaXJlY3RvcnkgKGUuZy4sIH4vLmRvbGxob3VzZS9wb3J0Zm9saW8pXG4gKiBAcGFyYW0gcG9ydCAtIFBvcnQgdG8gYmluZCB0byAoZGVmYXVsdHMgdG8gYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYClcbiAqIEByZXR1cm5zIFJlc3VsdCB3aXRoIFVSTCwgc2VydmVyIHN0YXR1cywgYW5kIGJyb3dzZXIgb3BlbiBzdGF0dXNcbiAqL1xuLyoqXG4gKiBPcHRpb25zIGZvciBvcGVuaW5nIHRoZSBwb3J0Zm9saW8gYnJvd3Nlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuQnJvd3Nlck9wdGlvbnMge1xuICBwb3J0Zm9saW9EaXI6IHN0cmluZztcbiAgcG9ydD86IG51bWJlcjtcbiAgbWNwQXFsSGFuZGxlcj86IE1DUEFRTEhhbmRsZXI7XG4gIHRhYj86IHN0cmluZztcbiAgdXJsUGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgbWVtb3J5U2luaz86IE1lbW9yeUxvZ1Npbms7XG4gIG1ldHJpY3NTaW5rPzogTWVtb3J5TWV0cmljc1Npbms7XG59XG5cbi8qKlxuICogU2VsZi1wcm92aXNpb24gc2lua3MsIHRva2VuIHN0b3JlLCBhbmQgaW5nZXN0IHJvdXRlcywgdGhlbiBzdGFydCB0aGUgd2ViXG4gKiBzZXJ2ZXIuIEV4dHJhY3RlZCBmcm9tIG9wZW5Qb3J0Zm9saW9Ccm93c2VyIHRvIGtlZXAgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAqIG1hbmFnZWFibGUgKFNvbmFyQ2xvdWQgUzM3NzYpLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEZhbGxiYWNrU2VydmVyKG9wdGlvbnM6IE9wZW5Ccm93c2VyT3B0aW9ucywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBtZW1vcnlTaW5rID0gb3B0aW9ucy5tZW1vcnlTaW5rO1xuICBsZXQgbWV0cmljc1NpbmsgPSBvcHRpb25zLm1ldHJpY3NTaW5rO1xuXG4gIGlmICghbWVtb3J5U2luaykge1xuICAgIGNvbnN0IHsgTWVtb3J5TG9nU2luazogTG9nU2luayB9ID0gYXdhaXQgaW1wb3J0KCcuLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnKTtcbiAgICBtZW1vcnlTaW5rID0gbmV3IExvZ1NpbmsoeyBhcHBDYXBhY2l0eTogMTAwMDAsIHNlY3VyaXR5Q2FwYWNpdHk6IDUwMDAsIHBlcmZDYXBhY2l0eTogMjAwMCwgdGVsZW1ldHJ5Q2FwYWNpdHk6IDEwMDAgfSk7XG4gIH1cbiAgaWYgKCFtZXRyaWNzU2luaykge1xuICAgIGNvbnN0IHsgTWVtb3J5TWV0cmljc1Npbms6IE1ldHJpY3NTaW5rIH0gPSBhd2FpdCBpbXBvcnQoJy4uL21ldHJpY3Mvc2lua3MvTWVtb3J5TWV0cmljc1NpbmsuanMnKTtcbiAgICBtZXRyaWNzU2luayA9IG5ldyBNZXRyaWNzU2luaygyNDApO1xuICB9XG5cbiAgLy8gUmV1c2UgY2FjaGVkIHRva2VuIHN0b3JlIOKAlCB0d28gaW5zdGFuY2VzIG9uIHRoZSBzYW1lIGZpbGUgY2FuIHJhY2Ugb24gd3JpdGVzLlxuICBpZiAoIWNhY2hlZFRva2VuU3RvcmUpIHtcbiAgICBjb25zdCB7IENvbnNvbGVUb2tlblN0b3JlOiBUb2tlblN0b3JlIH0gPSBhd2FpdCBpbXBvcnQoJy4vY29uc29sZS9jb25zb2xlVG9rZW4uanMnKTtcbiAgICBjb25zdCB7IHBpY2tSYW5kb21Ub2tlbk5hbWUgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlL1Nlc3Npb25OYW1lcy5qcycpO1xuICAgIGNhY2hlZFRva2VuU3RvcmUgPSBuZXcgVG9rZW5TdG9yZShlbnYuRE9MTEhPVVNFX0NPTlNPTEVfVE9LRU5fRklMRSk7XG4gICAgdHJ5IHsgYXdhaXQgY2FjaGVkVG9rZW5TdG9yZS5lbnN1cmVJbml0aWFsaXplZChwaWNrUmFuZG9tVG9rZW5OYW1lKCkpOyB9XG4gICAgY2F0Y2ggKGVycikgeyBsb2dnZXIud2FybignW1dlYlVJXSBGYWlsZWQgdG8gaW5pdCB0b2tlbiBzdG9yZSBmb3IgYnJvd3NlciBvcGVuJywgZXJyKTsgfVxuICB9XG5cbiAgLy8gbG9nQnJvYWRjYXN0IGlzIGRlZmVycmVkIOKAlCB3aXJlZCBhZnRlciBzdGFydFdlYlNlcnZlciByZXR1cm5zIHRoZSByZWFsIGJyb2FkY2FzdCBmbi5cbiAgbGV0IGxpdmVCcm9hZGNhc3Q6ICgoZW50cnk6IGltcG9ydCgnLi4vbG9nZ2luZy90eXBlcy5qcycpLlVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgY3JlYXRlSW5nZXN0Um91dGVzIH0gPSBhd2FpdCBpbXBvcnQoJy4vY29uc29sZS9Jbmdlc3RSb3V0ZXMuanMnKTtcbiAgY29uc3QgaW5nZXN0UmVzdWx0ID0gY3JlYXRlSW5nZXN0Um91dGVzKHtcbiAgICBsb2dCcm9hZGNhc3Q6IChlbnRyeSkgPT4gbGl2ZUJyb2FkY2FzdD8uKGVudHJ5KSxcbiAgICBzdG9yZU1ldHJpY3NTbmFwc2hvdDogKHNuYXBzaG90KSA9PiBtZXRyaWNzU2luaz8ub25TbmFwc2hvdChzbmFwc2hvdCksXG4gIH0pO1xuICBpbmdlc3RSZXN1bHQucmVnaXN0ZXJDb25zb2xlU2Vzc2lvbigpO1xuXG4gIGNvbnN0IHdlYlJlc3VsdCA9IGF3YWl0IHN0YXJ0V2ViU2VydmVyKHtcbiAgICBwb3J0Zm9saW9EaXI6IG9wdGlvbnMucG9ydGZvbGlvRGlyLFxuICAgIHBvcnQsXG4gICAgb3BlbkJyb3dzZXI6IGZhbHNlLFxuICAgIG1jcEFxbEhhbmRsZXI6IG9wdGlvbnMubWNwQXFsSGFuZGxlcixcbiAgICBtZW1vcnlTaW5rLFxuICAgIG1ldHJpY3NTaW5rLFxuICAgIHRva2VuU3RvcmU6IGNhY2hlZFRva2VuU3RvcmUsXG4gICAgYWRkaXRpb25hbFJvdXRlcnM6IFtpbmdlc3RSZXN1bHQucm91dGVyXSxcbiAgfSk7XG5cbiAgbGl2ZUJyb2FkY2FzdCA9IHdlYlJlc3VsdC5sb2dCcm9hZGNhc3Q7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuUG9ydGZvbGlvQnJvd3NlcihvcHRpb25zOiBPcGVuQnJvd3Nlck9wdGlvbnMpOiBQcm9taXNlPEJyb3dzZXJPcGVuUmVzdWx0PiB7XG4gIGNvbnN0IHRhcmdldFBvcnQgPSBvcHRpb25zLnBvcnQgfHwgREVGQVVMVF9QT1JUO1xuICBjb25zdCBiYXNlVXJsID0gYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHt0YXJnZXRQb3J0fWA7XG5cbiAgLy8gQnVpbGQgVVJMIHdpdGggb3B0aW9uYWwgdGFiIGhhc2ggYW5kIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgbGV0IHVybCA9IGJhc2VVcmw7XG4gIGlmIChvcHRpb25zLnRhYikge1xuICAgIGNvbnN0IHFzID0gb3B0aW9ucy51cmxQYXJhbXMgPyBuZXcgVVJMU2VhcmNoUGFyYW1zKG9wdGlvbnMudXJsUGFyYW1zKS50b1N0cmluZygpIDogJyc7XG4gICAgdXJsID0gYCR7YmFzZVVybH0vIyR7b3B0aW9ucy50YWJ9JHtxcyA/ICc/JyArIHFzIDogJyd9YDtcbiAgfSBlbHNlIGlmIChvcHRpb25zLnVybFBhcmFtcyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLnVybFBhcmFtcykubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHFzID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhvcHRpb25zLnVybFBhcmFtcykudG9TdHJpbmcoKTtcbiAgICB1cmwgPSBgJHtiYXNlVXJsfS8jcG9ydGZvbGlvPyR7cXN9YDtcbiAgfVxuXG4gIGNvbnN0IGFscmVhZHlSdW5uaW5nID0gc2VydmVyUnVubmluZztcblxuICBpZiAoIXNlcnZlclJ1bm5pbmcpIHtcbiAgICBhd2FpdCBzdGFydEZhbGxiYWNrU2VydmVyKG9wdGlvbnMsIHRhcmdldFBvcnQpO1xuICB9XG5cbiAgY29uc3QgYnJvd3NlclJlc3VsdCA9IGF3YWl0IG9wZW5JbkJyb3dzZXIodXJsKTtcblxuICByZXR1cm4ge1xuICAgIHVybCxcbiAgICBhbHJlYWR5UnVubmluZyxcbiAgICBicm93c2VyT3BlbmVkOiBicm93c2VyUmVzdWx0LnN1Y2Nlc3MsXG4gICAgLi4uKGJyb3dzZXJSZXN1bHQuZXJyb3IgPyB7IHdhcm5pbmc6IGBCcm93c2VyIGNvdWxkIG5vdCBiZSBvcGVuZWQgYXV0b21hdGljYWxseTogJHticm93c2VyUmVzdWx0LmVycm9yfS4gT3BlbiAke3VybH0gbWFudWFsbHkuYCB9IDoge30pLFxuICB9O1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dollhousemcp/mcp-server",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.30",
|
|
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",
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"test:all": "npm test && npm run test:performance && npm run test:integration",
|
|
45
45
|
"test:all:coverage": "npm run test:coverage && npm run test:integration:coverage",
|
|
46
46
|
"lint": "eslint --max-warnings=0 --ext .ts src tests scripts",
|
|
47
|
+
"lint:shell": "shellcheck -x scripts/pretooluse-dollhouse.sh scripts/pretooluse-codex.sh scripts/pretooluse-cursor.sh scripts/pretooluse-gemini.sh scripts/pretooluse-vscode.sh scripts/pretooluse-windsurf.sh scripts/permission-port-discovery.sh scripts/permission-hook-config.sh",
|
|
47
48
|
"lint:fix": "eslint --ext .ts src tests scripts --fix",
|
|
48
49
|
"security:critical": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs tests/security/tests --testNamePattern=\"(Command Injection|Path Traversal|YAML)\" --maxWorkers=4",
|
|
49
50
|
"security:rapid": "npm run security:critical -- --testTimeout=30000",
|
|
@@ -144,6 +145,7 @@
|
|
|
144
145
|
"dist/seed-elements/**",
|
|
145
146
|
"scripts/pretooluse-dollhouse.sh",
|
|
146
147
|
"scripts/permission-port-discovery.sh",
|
|
148
|
+
"scripts/permission-hook-config.sh",
|
|
147
149
|
"scripts/pretooluse-vscode.sh",
|
|
148
150
|
"scripts/pretooluse-cursor.sh",
|
|
149
151
|
"scripts/pretooluse-windsurf.sh",
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# permission-hook-config.sh — shared runtime configuration helpers for
|
|
3
|
+
# Dollhouse permission hook wrappers.
|
|
4
|
+
|
|
5
|
+
PERMISSION_HOOK_DEFAULT_AUTHORITY_CACHE_TTL_SECONDS=2
|
|
6
|
+
PERMISSION_HOOK_MIN_AUTHORITY_CACHE_TTL_SECONDS=0
|
|
7
|
+
PERMISSION_HOOK_MAX_AUTHORITY_CACHE_TTL_SECONDS=30
|
|
8
|
+
|
|
9
|
+
PERMISSION_HOOK_DEFAULT_MAX_RETRIES=2
|
|
10
|
+
PERMISSION_HOOK_MIN_MAX_RETRIES=0
|
|
11
|
+
PERMISSION_HOOK_MAX_MAX_RETRIES=5
|
|
12
|
+
|
|
13
|
+
PERMISSION_HOOK_DEFAULT_INITIAL_TIMEOUT=5
|
|
14
|
+
PERMISSION_HOOK_MIN_INITIAL_TIMEOUT=1
|
|
15
|
+
PERMISSION_HOOK_MAX_INITIAL_TIMEOUT=30
|
|
16
|
+
|
|
17
|
+
permission_hook_resolve_bounded_int() {
|
|
18
|
+
local raw_value="$1"
|
|
19
|
+
local fallback_value="$2"
|
|
20
|
+
local minimum_value="$3"
|
|
21
|
+
local maximum_value="$4"
|
|
22
|
+
|
|
23
|
+
if [[ ! "$raw_value" =~ ^[0-9]+$ ]]; then
|
|
24
|
+
echo "$fallback_value"
|
|
25
|
+
return 0
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
if (( raw_value < minimum_value )); then
|
|
29
|
+
echo "$minimum_value"
|
|
30
|
+
return 0
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
if (( raw_value > maximum_value )); then
|
|
34
|
+
echo "$maximum_value"
|
|
35
|
+
return 0
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
echo "$raw_value"
|
|
39
|
+
return 0
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
permission_hook_load_runtime_config() {
|
|
43
|
+
AUTHORITY_CACHE_TTL_SECONDS="$(
|
|
44
|
+
permission_hook_resolve_bounded_int \
|
|
45
|
+
"${DOLLHOUSE_HOOK_AUTHORITY_CACHE_TTL_SECONDS:-$PERMISSION_HOOK_DEFAULT_AUTHORITY_CACHE_TTL_SECONDS}" \
|
|
46
|
+
"$PERMISSION_HOOK_DEFAULT_AUTHORITY_CACHE_TTL_SECONDS" \
|
|
47
|
+
"$PERMISSION_HOOK_MIN_AUTHORITY_CACHE_TTL_SECONDS" \
|
|
48
|
+
"$PERMISSION_HOOK_MAX_AUTHORITY_CACHE_TTL_SECONDS"
|
|
49
|
+
)"
|
|
50
|
+
MAX_RETRIES="$(
|
|
51
|
+
permission_hook_resolve_bounded_int \
|
|
52
|
+
"${DOLLHOUSE_HOOK_MAX_RETRIES:-$PERMISSION_HOOK_DEFAULT_MAX_RETRIES}" \
|
|
53
|
+
"$PERMISSION_HOOK_DEFAULT_MAX_RETRIES" \
|
|
54
|
+
"$PERMISSION_HOOK_MIN_MAX_RETRIES" \
|
|
55
|
+
"$PERMISSION_HOOK_MAX_MAX_RETRIES"
|
|
56
|
+
)"
|
|
57
|
+
INITIAL_TIMEOUT="$(
|
|
58
|
+
permission_hook_resolve_bounded_int \
|
|
59
|
+
"${DOLLHOUSE_HOOK_INITIAL_TIMEOUT:-$PERMISSION_HOOK_DEFAULT_INITIAL_TIMEOUT}" \
|
|
60
|
+
"$PERMISSION_HOOK_DEFAULT_INITIAL_TIMEOUT" \
|
|
61
|
+
"$PERMISSION_HOOK_MIN_INITIAL_TIMEOUT" \
|
|
62
|
+
"$PERMISSION_HOOK_MAX_INITIAL_TIMEOUT"
|
|
63
|
+
)"
|
|
64
|
+
|
|
65
|
+
export AUTHORITY_CACHE_TTL_SECONDS MAX_RETRIES INITIAL_TIMEOUT
|
|
66
|
+
return 0
|
|
67
|
+
}
|
|
@@ -17,16 +17,14 @@
|
|
|
17
17
|
# Set DOLLHOUSE_HOOK_PLATFORM to override the platform sent to the server.
|
|
18
18
|
|
|
19
19
|
RUN_DIR="$HOME/.dollhouse/run"
|
|
20
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
21
|
+
# shellcheck disable=SC1091 # Resolved at runtime via SCRIPT_DIR.
|
|
22
|
+
source "$SCRIPT_DIR/permission-hook-config.sh"
|
|
23
|
+
# shellcheck disable=SC2034 # Consumed by permission-port-discovery.sh after sourcing.
|
|
20
24
|
PORT_FILE="$RUN_DIR/permission-server.port"
|
|
21
25
|
AUTHORITY_FILE="$RUN_DIR/permission-authority.json"
|
|
22
|
-
AUTHORITY_CACHE_TTL_SECONDS=2
|
|
23
|
-
MAX_RETRIES="${DOLLHOUSE_HOOK_MAX_RETRIES:-2}"
|
|
24
|
-
INITIAL_TIMEOUT="${DOLLHOUSE_HOOK_INITIAL_TIMEOUT:-5}"
|
|
25
26
|
HOOK_PLATFORM="${DOLLHOUSE_HOOK_PLATFORM:-claude_code}"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
[[ "$MAX_RETRIES" =~ ^[0-9]+$ ]] || MAX_RETRIES=2
|
|
29
|
-
[[ "$INITIAL_TIMEOUT" =~ ^[0-9]+$ ]] || INITIAL_TIMEOUT=5
|
|
27
|
+
permission_hook_load_runtime_config
|
|
30
28
|
|
|
31
29
|
# Debug logging helper — writes to stderr so it doesn't pollute stdout
|
|
32
30
|
debug() {
|
|
@@ -36,6 +34,35 @@ debug() {
|
|
|
36
34
|
return 0
|
|
37
35
|
}
|
|
38
36
|
|
|
37
|
+
emit_allow_response() {
|
|
38
|
+
case "$HOOK_PLATFORM" in
|
|
39
|
+
claude_code|vscode)
|
|
40
|
+
printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
41
|
+
;;
|
|
42
|
+
codex)
|
|
43
|
+
printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","permissionDecisionReason":""}}'
|
|
44
|
+
;;
|
|
45
|
+
cursor)
|
|
46
|
+
printf '%s\n' '{"permission":"allow"}'
|
|
47
|
+
;;
|
|
48
|
+
gemini)
|
|
49
|
+
printf '%s\n' '{"decision":"allow"}'
|
|
50
|
+
;;
|
|
51
|
+
*)
|
|
52
|
+
printf '%s\n' '{}'
|
|
53
|
+
;;
|
|
54
|
+
esac
|
|
55
|
+
|
|
56
|
+
return 0
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
fail_open() {
|
|
60
|
+
local message="$1"
|
|
61
|
+
debug "$message"
|
|
62
|
+
emit_allow_response
|
|
63
|
+
return 0
|
|
64
|
+
}
|
|
65
|
+
|
|
39
66
|
authority_host_for_platform() {
|
|
40
67
|
case "$HOOK_PLATFORM" in
|
|
41
68
|
claude_code) echo "claude-code" ;;
|
|
@@ -156,11 +183,12 @@ normalize_response() {
|
|
|
156
183
|
return 0
|
|
157
184
|
}
|
|
158
185
|
|
|
186
|
+
# shellcheck disable=SC1091 # Resolved at runtime via SCRIPT_DIR.
|
|
159
187
|
source "$SCRIPT_DIR/permission-port-discovery.sh"
|
|
160
188
|
|
|
161
189
|
# Discover the port from the shared file or the newest live PID-keyed file
|
|
162
190
|
if ! PORT=$(resolve_permission_port); then
|
|
163
|
-
|
|
191
|
+
fail_open "No usable permission server port file found — fail open"
|
|
164
192
|
exit 0
|
|
165
193
|
fi
|
|
166
194
|
|
|
@@ -176,7 +204,7 @@ TOOL_INPUT=$(echo "$INPUT" | jq -c '.tool_input // .toolInput // .input // {}' 2
|
|
|
176
204
|
|
|
177
205
|
# If we can't parse the input, fail open
|
|
178
206
|
if [[ -z "$TOOL_NAME" ]]; then
|
|
179
|
-
|
|
207
|
+
fail_open "Could not parse tool_name from input — fail open"
|
|
180
208
|
exit 0
|
|
181
209
|
fi
|
|
182
210
|
|
|
@@ -188,7 +216,7 @@ AUTHORITY_MODE=$(resolve_authority_mode "$AUTHORITY_HOST")
|
|
|
188
216
|
debug "Authority mode for ${AUTHORITY_HOST:-unknown}: $AUTHORITY_MODE"
|
|
189
217
|
|
|
190
218
|
if [[ "$AUTHORITY_MODE" == "off" ]]; then
|
|
191
|
-
|
|
219
|
+
fail_open "Authority mode is off — hook no-op"
|
|
192
220
|
exit 0
|
|
193
221
|
fi
|
|
194
222
|
|
|
@@ -222,14 +250,15 @@ while [[ $ATTEMPT -le $MAX_RETRIES ]]; do
|
|
|
222
250
|
if [[ $CURL_EXIT -eq 0 ]] && [[ -n "$RESPONSE" ]]; then
|
|
223
251
|
debug "Response (attempt $((ATTEMPT+1))): $RESPONSE"
|
|
224
252
|
if ! echo "$RESPONSE" | jq -e . >/dev/null 2>&1; then
|
|
225
|
-
|
|
253
|
+
fail_open "Non-JSON response for platform $HOOK_PLATFORM — fail open"
|
|
226
254
|
exit 0
|
|
227
255
|
fi
|
|
228
256
|
NORMALIZED_RESPONSE=$(normalize_response "$RESPONSE")
|
|
229
257
|
if [[ -n "$NORMALIZED_RESPONSE" ]]; then
|
|
230
258
|
echo "$NORMALIZED_RESPONSE"
|
|
231
259
|
else
|
|
232
|
-
|
|
260
|
+
fail_open "Malformed response for platform $HOOK_PLATFORM — fail open"
|
|
261
|
+
exit 0
|
|
233
262
|
fi
|
|
234
263
|
exit 0
|
|
235
264
|
fi
|
|
@@ -244,5 +273,5 @@ while [[ $ATTEMPT -le $MAX_RETRIES ]]; do
|
|
|
244
273
|
done
|
|
245
274
|
|
|
246
275
|
# All retries exhausted — fail open
|
|
247
|
-
|
|
276
|
+
fail_open "All $((MAX_RETRIES + 1)) attempts failed — fail open"
|
|
248
277
|
exit 0
|
|
@@ -6,14 +6,13 @@
|
|
|
6
6
|
# most relevant built-in tool names into Dollhouse's existing permission model.
|
|
7
7
|
|
|
8
8
|
RUN_DIR="$HOME/.dollhouse/run"
|
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
10
|
+
# shellcheck disable=SC1091 # Resolved at runtime via SCRIPT_DIR.
|
|
11
|
+
source "$SCRIPT_DIR/permission-hook-config.sh"
|
|
12
|
+
# shellcheck disable=SC2034 # Consumed by permission-port-discovery.sh after sourcing.
|
|
9
13
|
PORT_FILE="$RUN_DIR/permission-server.port"
|
|
10
|
-
MAX_RETRIES="${DOLLHOUSE_HOOK_MAX_RETRIES:-2}"
|
|
11
|
-
INITIAL_TIMEOUT="${DOLLHOUSE_HOOK_INITIAL_TIMEOUT:-5}"
|
|
12
14
|
HOOK_PLATFORM="vscode"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
[[ "$MAX_RETRIES" =~ ^[0-9]+$ ]] || MAX_RETRIES=2
|
|
16
|
-
[[ "$INITIAL_TIMEOUT" =~ ^[0-9]+$ ]] || INITIAL_TIMEOUT=5
|
|
15
|
+
permission_hook_load_runtime_config
|
|
17
16
|
|
|
18
17
|
debug() {
|
|
19
18
|
if [[ "${DOLLHOUSE_HOOK_DEBUG:-0}" == "1" ]]; then
|
|
@@ -22,10 +21,23 @@ debug() {
|
|
|
22
21
|
return 0
|
|
23
22
|
}
|
|
24
23
|
|
|
24
|
+
emit_allow_response() {
|
|
25
|
+
printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
26
|
+
return 0
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
fail_open() {
|
|
30
|
+
local message="$1"
|
|
31
|
+
debug "$message"
|
|
32
|
+
emit_allow_response
|
|
33
|
+
return 0
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# shellcheck disable=SC1091 # Resolved at runtime via SCRIPT_DIR.
|
|
25
37
|
source "$SCRIPT_DIR/permission-port-discovery.sh"
|
|
26
38
|
|
|
27
39
|
if ! PORT=$(resolve_permission_port); then
|
|
28
|
-
|
|
40
|
+
fail_open "No usable permission server port file found — fail open"
|
|
29
41
|
exit 0
|
|
30
42
|
fi
|
|
31
43
|
|
|
@@ -84,7 +96,7 @@ case "$RAW_TOOL_NAME" in
|
|
|
84
96
|
esac
|
|
85
97
|
|
|
86
98
|
if [[ -z "$TOOL_NAME" ]]; then
|
|
87
|
-
|
|
99
|
+
fail_open "Could not parse VS Code tool name — fail open"
|
|
88
100
|
exit 0
|
|
89
101
|
fi
|
|
90
102
|
|
|
@@ -147,7 +159,8 @@ while [[ $ATTEMPT -le $MAX_RETRIES ]]; do
|
|
|
147
159
|
if [[ -n "$HOOK_RESPONSE" ]]; then
|
|
148
160
|
echo "$HOOK_RESPONSE"
|
|
149
161
|
else
|
|
150
|
-
|
|
162
|
+
fail_open "Permission evaluation returned an unrecognized response — fail open"
|
|
163
|
+
exit 0
|
|
151
164
|
fi
|
|
152
165
|
exit 0
|
|
153
166
|
fi
|
|
@@ -159,5 +172,5 @@ while [[ $ATTEMPT -le $MAX_RETRIES ]]; do
|
|
|
159
172
|
fi
|
|
160
173
|
done
|
|
161
174
|
|
|
162
|
-
|
|
175
|
+
fail_open "Permission evaluation failed — fail open"
|
|
163
176
|
exit 0
|