@dollhousemcp/mcp-server 2.0.24 → 2.0.26

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.
Files changed (62) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/auto-dollhouse/portDiscovery.d.ts.map +1 -1
  3. package/dist/auto-dollhouse/portDiscovery.js +7 -4
  4. package/dist/di/Container.d.ts.map +1 -1
  5. package/dist/di/Container.js +4 -2
  6. package/dist/generated/version.d.ts +2 -2
  7. package/dist/generated/version.js +3 -3
  8. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  9. package/dist/handlers/mcp-aql/MCPAQLHandler.js +18 -1
  10. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  11. package/dist/handlers/mcp-aql/OperationRouter.js +6 -1
  12. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  13. package/dist/handlers/mcp-aql/OperationSchema.js +16 -1
  14. package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
  15. package/dist/handlers/mcp-aql/SchemaDispatcher.js +2 -1
  16. package/dist/index.js +14 -2
  17. package/dist/server/tools/BuildInfoTools.d.ts +1 -0
  18. package/dist/server/tools/BuildInfoTools.d.ts.map +1 -1
  19. package/dist/server/tools/BuildInfoTools.js +2 -1
  20. package/dist/server/tools/MCPAQLTools.js +3 -1
  21. package/dist/services/ActivationStore.d.ts +8 -0
  22. package/dist/services/ActivationStore.d.ts.map +1 -1
  23. package/dist/services/ActivationStore.js +28 -29
  24. package/dist/services/BuildInfoService.d.ts +3 -0
  25. package/dist/services/BuildInfoService.d.ts.map +1 -1
  26. package/dist/services/BuildInfoService.js +18 -1
  27. package/dist/services/sessionIdentity.d.ts +24 -0
  28. package/dist/services/sessionIdentity.d.ts.map +1 -0
  29. package/dist/services/sessionIdentity.js +42 -0
  30. package/dist/utils/permissionAuthority.d.ts +38 -0
  31. package/dist/utils/permissionAuthority.d.ts.map +1 -0
  32. package/dist/utils/permissionAuthority.js +341 -0
  33. package/dist/utils/permissionHooks.d.ts.map +1 -1
  34. package/dist/utils/permissionHooks.js +10 -1
  35. package/dist/web/console/UnifiedConsole.d.ts +2 -0
  36. package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
  37. package/dist/web/console/UnifiedConsole.js +3 -1
  38. package/dist/web/portDiscovery.d.ts +7 -0
  39. package/dist/web/portDiscovery.d.ts.map +1 -1
  40. package/dist/web/portDiscovery.js +35 -4
  41. package/dist/web/public/app.js +28 -4
  42. package/dist/web/public/index.html +2 -0
  43. package/dist/web/public/permissions.css +456 -0
  44. package/dist/web/public/permissions.js +629 -12
  45. package/dist/web/public/sessions.css +119 -0
  46. package/dist/web/public/sessions.js +95 -9
  47. package/dist/web/public/setup.js +67 -7
  48. package/dist/web/public/styles.css +21 -2
  49. package/dist/web/routes/permissionRoutes.d.ts +4 -1
  50. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  51. package/dist/web/routes/permissionRoutes.js +118 -6
  52. package/dist/web/routes/setupRoutes.d.ts +18 -0
  53. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  54. package/dist/web/routes/setupRoutes.js +129 -49
  55. package/dist/web/server.d.ts +4 -0
  56. package/dist/web/server.d.ts.map +1 -1
  57. package/dist/web/server.js +19 -1
  58. package/package.json +4 -3
  59. package/scripts/pretooluse-dollhouse.sh +78 -12
  60. package/scripts/pretooluse-vscode.sh +6 -9
  61. package/scripts/pretooluse-windsurf.sh +6 -9
  62. package/server.json +2 -2
@@ -470,6 +470,8 @@ async function startAsLeader(options, election, consolePort = DEFAULT_CONSOLE_PO
470
470
  memorySink: options.memorySink,
471
471
  metricsSink: options.metricsSink,
472
472
  port: consolePort,
473
+ sessionId: options.stableSessionId,
474
+ runtimeSessionId: options.sessionId,
473
475
  additionalRouters: [ingestResult.router],
474
476
  tokenStore,
475
477
  ...(options.mcpAqlHandler ? { mcpAqlHandler: options.mcpAqlHandler } : {}),
@@ -585,4 +587,4 @@ async function startAsFollower(options, election, consolePort = DEFAULT_CONSOLE_
585
587
  },
586
588
  };
587
589
  }
588
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pZmllZENvbnNvbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvVW5pZmllZENvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQU9ILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLDJCQUEyQixFQUMzQixvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWix3QkFBd0IsRUFDeEIscUJBQXFCLEVBQ3JCLHdCQUF3QixHQUl6QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEdBQ2pCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUNMLGFBQWEsRUFDYix3QkFBd0IsR0FFekIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFMUM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUMsMEJBQTBCLENBQUM7QUFDNUQsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSxtQ0FBbUMsR0FBRyxhQUFhLENBQUM7QUFDMUQsTUFBTSwyQkFBMkIsR0FBRyxLQUFLLENBQUM7QUFF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RUFBRSxTQUFTO0tBQ2hELENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxJQUFJLEVBQUUsVUFBVTtRQUNoQixRQUFRO1FBQ1IsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2xCLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUIsTUFBTSxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDL0IsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVbmlmaWVkIHdlYiBjb25zb2xlIG9yY2hlc3RyYXRvci5cbiAqXG4gKiBUaWVzIHRvZ2V0aGVyIGxlYWRlciBlbGVjdGlvbiwgY29uc29sZSBzdGFydHVwLCBmb2xsb3dlciB3aXJpbmcsXG4gKiBhbmQgc2Vzc2lvbiBsaWZlY3ljbGUgbWFuYWdlbWVudC4gVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludFxuICogY2FsbGVkIGJ5IHRoZSBESSBjb250YWluZXIgZHVyaW5nIGRlZmVycmVkIHNldHVwLlxuICpcbiAqIEZsb3c6XG4gKiAxLiBSdW4gbGVhZGVyIGVsZWN0aW9uIChyZWFkIGxvY2sgZmlsZSwgY2xhaW0gb3IgZm9sbG93KVxuICogMi4gSWYgbGVhZGVyOiBzdGFydCB3ZWIgc2VydmVyIG9uIGZpeGVkIHBvcnQsIG1vdW50IGluZ2VzdCByb3V0ZXMsIHN0YXJ0IGhlYXJ0YmVhdFxuICogMy4gSWYgZm9sbG93ZXI6IHJlZ2lzdGVyIGZvcndhcmRpbmcgc2lua3Mgd2l0aCBMb2dNYW5hZ2VyLCBzdGFydCBzZXNzaW9uIGhlYXJ0YmVhdFxuICpcbiAqIEBzaW5jZSB2Mi4xLjAg4oCUIElzc3VlICMxNzAwXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBVbmlmaWVkTG9nRW50cnkgfSBmcm9tICcuLi8uLi9sb2dnaW5nL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWV0cmljU25hcHNob3QgfSBmcm9tICcuLi8uLi9tZXRyaWNzL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TG9nU2luayB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeU1ldHJpY3NTaW5rIH0gZnJvbSAnLi4vLi4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcyc7XG5pbXBvcnQgdHlwZSB7IFdlYlNlcnZlck9wdGlvbnMsIFdlYlNlcnZlclJlc3VsdCB9IGZyb20gJy4uL3NlcnZlci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBlbGVjdExlYWRlcixcbiAgaXNMZWFkZXJXZWJDb25zb2xlUmVhY2hhYmxlLFxuICBmb3JjZUNsYWltTGVhZGVyc2hpcCxcbiAgc3RhcnRIZWFydGJlYXQsXG4gIHJlZ2lzdGVyTGVhZGVyQ2xlYW51cCxcbiAgZGV0ZWN0TGVnYWN5TGVhZGVyLFxuICByZWFkTGVhZGVyTG9jayxcbiAgZGVsZXRlTGVhZGVyTG9jayxcbiAgY2xhaW1MZWFkZXJzaGlwLFxuICBjcmVhdGVMZWFkZXJJbmZvLFxuICBMT0NLX1ZFUlNJT04sXG4gIENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgTEVHQUNZX1NFUlZFUl9WRVJTSU9OLFxuICBldmFsdWF0ZUxlYWRlclByZWZlcmVuY2UsXG4gIHR5cGUgRWxlY3Rpb25SZXN1bHQsXG4gIHR5cGUgQ29uc29sZUxlYWRlckluZm8sXG4gIHR5cGUgTGVhZGVyUHJlZmVyZW5jZURlY2lzaW9uLFxufSBmcm9tICcuL0xlYWRlckVsZWN0aW9uLmpzJztcbmltcG9ydCB7IGNyZWF0ZUluZ2VzdFJvdXRlcyB9IGZyb20gJy4vSW5nZXN0Um91dGVzLmpzJztcbmltcG9ydCB7XG4gIExlYWRlckZvcndhcmRpbmdMb2dTaW5rLFxuICBTZXNzaW9uSGVhcnRiZWF0LFxufSBmcm9tICcuL0xlYWRlckZvcndhcmRpbmdTaW5rLmpzJztcbmltcG9ydCB7IFByb21vdGlvbk1hbmFnZXIgfSBmcm9tICcuL1Byb21vdGlvbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQ29uc29sZVRva2VuU3RvcmUgfSBmcm9tICcuL2NvbnNvbGVUb2tlbi5qcyc7XG5pbXBvcnQge1xuICBmaW5kUGlkT25Qb3J0LFxuICBraWxsU3RhbGVQcm9jZXNzRGV0YWlsZWQsXG4gIHR5cGUgS2lsbFN0YWxlUHJvY2Vzc091dGNvbWUsXG59IGZyb20gJy4vU3RhbGVQcm9jZXNzUmVjb3ZlcnkuanMnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vY29uZmlnL2Vudi5qcyc7XG5cbi8qKlxuICogRGVmYXVsdCBjb25zb2xlIHBvcnQgZnJvbSB0aGUgZW52IHZhci4gVXNlZCBhcyBmYWxsYmFjayB3aGVuIG5vIHBvcnRcbiAqIGlzIHByb3ZpZGVkIHZpYSBjb25maWcgZmlsZSBvciBvcHRpb25zLiBUaGUgcmVzb2x1dGlvbiBoaWVyYXJjaHkgaXM6XG4gKiAgIDEuIG9wdGlvbnMucG9ydCAoZnJvbSBjb25maWcgZmlsZSwgcmVzb2x2ZWQgYnkgdGhlIERJIGNvbnRhaW5lcilcbiAqICAgMi4gRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlQgZW52IHZhclxuICogICAzLiA0MTcxNSAoaGFyZGNvZGVkIGRlZmF1bHQgaW4gZW52LnRzKVxuICovXG5jb25zdCBERUZBVUxUX0NPTlNPTEVfUE9SVCA9IGVudi5ET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVDtcbmNvbnN0IExFR0FDWV9DT05TT0xFX0ZBTExCQUNLX1BPUlQgPSAzOTM5O1xuY29uc3QgU1lOVEhFVElDX1BPUlRfT1dORVJfU0VTU0lPTl9QUkVGSVggPSAncG9ydC1vd25lci0nO1xuY29uc3QgTEVBREVSX0RJU0NPVkVSWV9USU1FT1VUX01TID0gMl8wMDA7XG5cbmZ1bmN0aW9uIGN1cnJlbnRUaW1lc3RhbXAoKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyB0aGUgdW5pZmllZCBjb25zb2xlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaWZpZWRDb25zb2xlT3B0aW9ucyB7XG4gIC8qKiBUaGlzIHByb2Nlc3MncyB1bmlxdWUgc2Vzc2lvbiBJRCAqL1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgLyoqIFBvcnRmb2xpbyBiYXNlIGRpcmVjdG9yeSAoZm9yIHN0YXJ0V2ViU2VydmVyKSAqL1xuICBwb3J0Zm9saW9EaXI6IHN0cmluZztcbiAgLyoqIExvZyBtZW1vcnkgc2luayAoZm9yIGNvbnNvbGUgaGlzdG9yeSkgKi9cbiAgbWVtb3J5U2luazogTWVtb3J5TG9nU2luaztcbiAgLyoqIE1ldHJpY3MgbWVtb3J5IHNpbmsgKi9cbiAgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaztcbiAgLyoqIE1DUC1BUUwgaGFuZGxlciBmb3IgcGVybWlzc2lvbiByb3V0ZXMgKHR5cGVkIGFzIGFueSB0byBhdm9pZCBjaXJjdWxhciBpbXBvcnRzKSAqL1xuICBtY3BBcWxIYW5kbGVyPzogYW55O1xuICAvKiogQ2FsbGJhY2sgdG8gcmVnaXN0ZXIgYSBsb2cgc2luayB3aXRoIHRoZSBMb2dNYW5hZ2VyICovXG4gIHJlZ2lzdGVyTG9nU2luazogKHNpbms6IHsgd3JpdGUoZW50cnk6IFVuaWZpZWRMb2dFbnRyeSk6IHZvaWQ7IGZsdXNoKCk6IFByb21pc2U8dm9pZD47IGNsb3NlKCk6IFByb21pc2U8dm9pZD4gfSkgPT4gdm9pZDtcbiAgLyoqIENhbGxiYWNrIHRvIHdpcmUgU1NFIGJyb2FkY2FzdHMgYWZ0ZXIgd2ViIHNlcnZlciBzdGFydHMgKi9cbiAgd2lyZVNTRUJyb2FkY2FzdHM6ICh3ZWJSZXN1bHQ6IHsgbG9nQnJvYWRjYXN0PzogKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpID0+IHZvaWQ7IG1ldHJpY3NPblNuYXBzaG90PzogKHNuYXBzaG90OiBNZXRyaWNTbmFwc2hvdCkgPT4gdm9pZCB9LCBtZXRyaWNzU2luaz86IE1lbW9yeU1ldHJpY3NTaW5rKSA9PiB2b2lkO1xuICAvKiogQ29uc29sZSBwb3J0IG92ZXJyaWRlIGZyb20gY29uZmlnIGZpbGUuIEZhbGxzIGJhY2sgdG8gZW52IHZhciBpZiBub3QgcHJvdmlkZWQuICovXG4gIHBvcnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHN0YXJ0aW5nIHRoZSB1bmlmaWVkIGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pZmllZENvbnNvbGVSZXN1bHQge1xuICByb2xlOiAnbGVhZGVyJyB8ICdmb2xsb3dlcic7XG4gIGVsZWN0aW9uOiBFbGVjdGlvblJlc3VsdDtcbiAgLyoqIFBvcnQgdGhlIGNvbnNvbGUgaXMgcnVubmluZyBvbiAobGVhZGVyIG9ubHkpICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBDbGVhbnVwIGZ1bmN0aW9uIHRvIGNhbGwgb24gc2h1dGRvd24gKi9cbiAgY2xlYW51cDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBDaGVjayBmb3IgYSBydW5uaW5nIGxlZ2FjeSAocHJlLWF1dGhlbnRpY2F0aW9uKSBEb2xsaG91c2VNQ1AgY29uc29sZSBhbmRcbiAqIGxvZyBhIFdBUk4tbGV2ZWwgbWVzc2FnZSBpZiBvbmUgaXMgZm91bmQgKCMxNzk0KS5cbiAqXG4gKiBFeHRyYWN0ZWQgZnJvbSBgc3RhcnRVbmlmaWVkQ29uc29sZWAgc28gdGhlIHdpcmluZyBjYW4gYmUgaW50ZWdyYXRpb24tXG4gKiB0ZXN0ZWQgaW4gaXNvbGF0aW9uIHdpdGhvdXQgc3Bpbm5pbmcgdXAgYSBmdWxsIHdlYiBzZXJ2ZXIgYW5kIGxlYWRlclxuICogZWxlY3Rpb24uIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBmaXJlLWFuZC1mb3JnZXQ6IGRldGVjdGlvbiBmYWlsdXJlc1xuICogYXJlIGxvZ2dlZCBhdCBERUJVRyBhbmQgbmV2ZXIgcHJvcGFnYXRlLCBiZWNhdXNlIGEgZmFpbHVyZSBoZXJlIG11c3RcbiAqIG5vdCBibG9jayBsZWFkZXIgZWxlY3Rpb24gb2YgdGhlIGF1dGhlbnRpY2F0ZWQgY29uc29sZS5cbiAqXG4gKiBAcGFyYW0gY3VycmVudFBvcnQgLSBUaGUgcG9ydCB0aGUgYXV0aGVudGljYXRlZCBjb25zb2xlIGludGVuZHMgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgIGJpbmQgdG8uIFVzZWQgaW4gdGhlIHdhcm5pbmcgbWVzc2FnZSB0byBoZWxwIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgdXNlciB0ZWxsIHRoZSB0d28gY29uc29sZXMgYXBhcnQuXG4gKiBAcGFyYW0gZGV0ZWN0ICAgICAgLSBPcHRpb25hbCBpbmplY3Rpb24gcG9pbnQgZm9yIHRoZSBkZXRlY3Rpb25cbiAqICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLiBEZWZhdWx0cyB0byBgZGV0ZWN0TGVnYWN5TGVhZGVyYC4gVGVzdHNcbiAqICAgICAgICAgICAgICAgICAgICAgIHBhc3MgYSBzdHViLlxuICogQHBhcmFtIGxvZyAgICAgICAgIC0gT3B0aW9uYWwgaW5qZWN0aW9uIHBvaW50IGZvciB0aGUgbG9nZ2VyLiBEZWZhdWx0c1xuICogICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIG1vZHVsZSBsb2dnZXIuIFRlc3RzIHBhc3MgYSBzcHkuXG4gKiBAcmV0dXJucyBUaGUgbGVnYWN5IGxlYWRlciBpbmZvIGZyb20gYGRldGVjdCgpYCwgb3IgbnVsbCBpZiBkZXRlY3Rpb25cbiAqICAgICAgICAgIHRocmV3LiBFeHBvc2VkIHNvIHRlc3RzIGNhbiBhc3NlcnQgdGhlIGZ1bGwgcmVzdWx0IHNoYXBlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FybklmTGVnYWN5Q29uc29sZVByZXNlbnQoXG4gIGN1cnJlbnRQb3J0OiBudW1iZXIsXG4gIGRldGVjdDogdHlwZW9mIGRldGVjdExlZ2FjeUxlYWRlciA9IGRldGVjdExlZ2FjeUxlYWRlcixcbiAgbG9nOiB0eXBlb2YgbG9nZ2VyID0gbG9nZ2VyLFxuKTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGRldGVjdExlZ2FjeUxlYWRlcj4+IHwgbnVsbD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGxlZ2FjeSA9IGF3YWl0IGRldGVjdCgpO1xuICAgIGlmIChsZWdhY3kubGVnYWN5UnVubmluZykge1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgIGBbVW5pZmllZENvbnNvbGVdIExlZ2FjeSAocHJlLWF1dGhlbnRpY2F0aW9uKSBEb2xsaG91c2VNQ1AgY29uc29sZSBkZXRlY3RlZCBgICtcbiAgICAgICAgYChwaWQ9JHtsZWdhY3kucGlkfSwgcG9ydD0ke2xlZ2FjeS5wb3J0fSkuIEJvdGggY29uc29sZXMgd2lsbCBydW4gYCArXG4gICAgICAgIGBpbmRlcGVuZGVudGx5IG9uIGRpZmZlcmVudCBwb3J0cyB3aXRoIGRpZmZlcmVudCBzZWN1cml0eSBwb3N0dXJlLiBgICtcbiAgICAgICAgYFRoZSBhdXRoZW50aWNhdGVkIGNvbnNvbGUgKHRoaXMgcHJvY2VzcykgdXNlcyBwb3J0ICR7Y3VycmVudFBvcnR9OyBgICtcbiAgICAgICAgYHRoZSBsZWdhY3kgY29uc29sZSB1c2VzIHBvcnQgJHtsZWdhY3kucG9ydCA/PyBMRUdBQ1lfQ09OU09MRV9GQUxMQkFDS19QT1JUfS4gYCArXG4gICAgICAgIGBGb3IgY29uc2lzdGVudCBzZWN1cml0eSwgdXBkYXRlIHRoZSBsZWdhY3kgaW5zdGFsbGF0aW9uIHRvIGEgYCArXG4gICAgICAgIGB2ZXJzaW9uIHdpdGggdGhlIGF1dGhlbnRpY2F0ZWQgY29uc29sZS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZ2FjeTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQmVzdC1lZmZvcnQg4oCUIG5ldmVyIGJsb2NrIGVsZWN0aW9uIG9uIGEgZGV0ZWN0aW9uIGZhaWx1cmVcbiAgICBsb2cuZGVidWcoJ1tVbmlmaWVkQ29uc29sZV0gTGVnYWN5IGxlYWRlciBkZXRlY3Rpb24gZmFpbGVkJywge1xuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5pbnRlcmZhY2UgU2Vzc2lvbkFwaVJlY29yZCB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBwaWQ6IG51bWJlcjtcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBsYXN0SGVhcnRiZWF0Pzogc3RyaW5nO1xuICBzdGF0dXM/OiBzdHJpbmc7XG4gIGlzTGVhZGVyPzogYm9vbGVhbjtcbiAga2luZD86IHN0cmluZztcbiAgc2VydmVyVmVyc2lvbj86IHN0cmluZztcbiAgY29uc29sZVByb3RvY29sVmVyc2lvbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3J0TGVhZGVyRGlzY292ZXJ5IHtcbiAgbGVhZGVySW5mbzogQ29uc29sZUxlYWRlckluZm8gfCBudWxsO1xuICBvd25lclBpZDogbnVtYmVyIHwgbnVsbDtcbiAgc291cmNlOiAnYXBpJyB8ICdsb2NrJyB8ICdzeW50aGV0aWMnIHwgJ25vbmUnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRGYWlsdXJlUmVjb3ZlcnlSZXN1bHQgZXh0ZW5kcyBQb3J0TGVhZGVyRGlzY292ZXJ5IHtcbiAgbG9ja0NsZWFudXBBdHRlbXB0ZWQ6IGJvb2xlYW47XG4gIGxvY2tDbGVhbnVwUGVyZm9ybWVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvcnRPd25lclJlcGxhY2VtZW50RGVjaXNpb24ge1xuICBzaG91bGRFdmljdDogYm9vbGVhbjtcbiAgb3duZXJQaWQ6IG51bWJlciB8IG51bGw7XG4gIHByZWZlcmVuY2U6IExlYWRlclByZWZlcmVuY2VEZWNpc2lvbiB8IG51bGw7XG59XG5cbmludGVyZmFjZSBGb3JjZVRha2VvdmVyQXR0ZW1wdFJlc3VsdCB7XG4gIHdlYlJlc3VsdDogV2ViU2VydmVyUmVzdWx0O1xuICBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQ7XG4gIGZhbGxiYWNrOiBQb3J0TGVhZGVyRGlzY292ZXJ5O1xuICByZXBsYWNlbWVudDogUG9ydE93bmVyUmVwbGFjZW1lbnREZWNpc2lvbjtcbiAgZm9yY2VkS2lsbDogS2lsbFN0YWxlUHJvY2Vzc091dGNvbWUgfCBudWxsO1xuICB0YWtlb3ZlckF0dGVtcHRlZDogYm9vbGVhbjtcbiAgcmVib3VuZExvY2tDbGFpbWVkOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRm9sbG93ZXJBdXRob3JpdHlSZXNvbHV0aW9uIHtcbiAgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0O1xuICBkaXNjb3Zlcnk6IFBvcnRMZWFkZXJEaXNjb3ZlcnkgfCBudWxsO1xuICByZXBsYWNlbWVudDogUG9ydE93bmVyUmVwbGFjZW1lbnREZWNpc2lvbiB8IG51bGw7XG4gIGZvcmNlZENsYWltOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRm9sbG93ZXJBdXRob3JpdHlEZXBlbmRlbmNpZXMge1xuICBpc0xlYWRlcldlYkNvbnNvbGVSZWFjaGFibGVJbXBsPzogdHlwZW9mIGlzTGVhZGVyV2ViQ29uc29sZVJlYWNoYWJsZTtcbiAgZGlzY292ZXJMZWFkZXJTZXJ2aW5nUG9ydEltcGw/OiB0eXBlb2YgZGlzY292ZXJMZWFkZXJTZXJ2aW5nUG9ydDtcbiAgZm9yY2VDbGFpbUxlYWRlcnNoaXBJbXBsPzogdHlwZW9mIGZvcmNlQ2xhaW1MZWFkZXJzaGlwO1xuICBkZWxldGVMZWFkZXJMb2NrSW1wbD86IHR5cGVvZiBkZWxldGVMZWFkZXJMb2NrO1xufVxuXG5pbnRlcmZhY2UgRGlzY292ZXJ5RGVwZW5kZW5jaWVzIHtcbiAgZmV0Y2hJbXBsPzogdHlwZW9mIGZldGNoO1xuICBmaW5kUGlkT25Qb3J0SW1wbD86IHR5cGVvZiBmaW5kUGlkT25Qb3J0O1xuICByZWFkTGVhZGVyTG9ja0ltcGw/OiB0eXBlb2YgcmVhZExlYWRlckxvY2s7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGlzY292ZXJ5SGVhZGVycyhhdXRoVG9rZW46IHN0cmluZyB8IG51bGwpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIGF1dGhUb2tlbiA/IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F1dGhUb2tlbn1gIH0gOiB7fTtcbn1cblxuZnVuY3Rpb24gYnVpbGRMZWFkZXJJbmZvRnJvbVNlc3Npb24ocG9ydDogbnVtYmVyLCBvd25lclBpZDogbnVtYmVyLCBsZWFkZXJTZXNzaW9uOiBTZXNzaW9uQXBpUmVjb3JkKTogQ29uc29sZUxlYWRlckluZm8ge1xuICByZXR1cm4ge1xuICAgIHZlcnNpb246IExPQ0tfVkVSU0lPTixcbiAgICBwaWQ6IG93bmVyUGlkLFxuICAgIHBvcnQsXG4gICAgc2Vzc2lvbklkOiBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShsZWFkZXJTZXNzaW9uLnNlc3Npb25JZCkubm9ybWFsaXplZENvbnRlbnQsXG4gICAgc3RhcnRlZEF0OiBsZWFkZXJTZXNzaW9uLnN0YXJ0ZWRBdCA/PyBjdXJyZW50VGltZXN0YW1wKCksXG4gICAgaGVhcnRiZWF0OiBsZWFkZXJTZXNzaW9uLmxhc3RIZWFydGJlYXQgPz8gY3VycmVudFRpbWVzdGFtcCgpLFxuICAgIHNlcnZlclZlcnNpb246IGxlYWRlclNlc3Npb24uc2VydmVyVmVyc2lvbiA/PyBMRUdBQ1lfU0VSVkVSX1ZFUlNJT04sXG4gICAgY29uc29sZVByb3RvY29sVmVyc2lvbjogbGVhZGVyU2Vzc2lvbi5jb25zb2xlUHJvdG9jb2xWZXJzaW9uID8/IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTeW50aGV0aWNMZWFkZXJJbmZvKHBvcnQ6IG51bWJlciwgb3duZXJQaWQ6IG51bWJlcik6IENvbnNvbGVMZWFkZXJJbmZvIHtcbiAgY29uc3Qgbm93ID0gY3VycmVudFRpbWVzdGFtcCgpO1xuICByZXR1cm4ge1xuICAgIHZlcnNpb246IExPQ0tfVkVSU0lPTixcbiAgICBwaWQ6IG93bmVyUGlkLFxuICAgIHBvcnQsXG4gICAgc2Vzc2lvbklkOiBgJHtTWU5USEVUSUNfUE9SVF9PV05FUl9TRVNTSU9OX1BSRUZJWH0ke293bmVyUGlkfWAsXG4gICAgc3RhcnRlZEF0OiBub3csXG4gICAgaGVhcnRiZWF0OiBub3csXG4gICAgc2VydmVyVmVyc2lvbjogTEVHQUNZX1NFUlZFUl9WRVJTSU9OLFxuICAgIGNvbnNvbGVQcm90b2NvbFZlcnNpb246IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJMZWFkZXJWaWFTZXNzaW9uc0FwaShcbiAgcG9ydDogbnVtYmVyLFxuICBvd25lclBpZDogbnVtYmVyLFxuICBhdXRoVG9rZW46IHN0cmluZyB8IG51bGwsXG4gIGZldGNoSW1wbDogdHlwZW9mIGZldGNoLFxuKTogUHJvbWlzZTxDb25zb2xlTGVhZGVySW5mbyB8IG51bGw+IHtcbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCBMRUFERVJfRElTQ09WRVJZX1RJTUVPVVRfTVMpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEltcGwoYGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fS9hcGkvc2Vzc2lvbnNgLCB7XG4gICAgICBoZWFkZXJzOiBidWlsZERpc2NvdmVyeUhlYWRlcnMoYXV0aFRva2VuKSxcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyB7IHNlc3Npb25zPzogU2Vzc2lvbkFwaVJlY29yZFtdIH07XG4gICAgY29uc3Qgc2Vzc2lvbnMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQuc2Vzc2lvbnMpID8gcGF5bG9hZC5zZXNzaW9ucyA6IFtdO1xuICAgIGNvbnN0IGxlYWRlclNlc3Npb24gPSBzZXNzaW9ucy5maW5kKChzZXNzaW9uKSA9PlxuICAgICAgc2Vzc2lvbi5waWQgPT09IG93bmVyUGlkICYmXG4gICAgICBzZXNzaW9uLmlzTGVhZGVyID09PSB0cnVlICYmXG4gICAgICBzZXNzaW9uLmtpbmQgPT09ICdtY3AnICYmXG4gICAgICBzZXNzaW9uLnN0YXR1cyAhPT0gJ3N0b3BwZWQnXG4gICAgKTtcbiAgICByZXR1cm4gbGVhZGVyU2Vzc2lvbiA/IGJ1aWxkTGVhZGVySW5mb0Zyb21TZXNzaW9uKHBvcnQsIG93bmVyUGlkLCBsZWFkZXJTZXNzaW9uKSA6IG51bGw7XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlckxlYWRlclNlcnZpbmdQb3J0KFxuICBwb3J0OiBudW1iZXIsXG4gIGF1dGhUb2tlbjogc3RyaW5nIHwgbnVsbCxcbiAgZGVwczogRGlzY292ZXJ5RGVwZW5kZW5jaWVzID0ge30sXG4pOiBQcm9taXNlPFBvcnRMZWFkZXJEaXNjb3Zlcnk+IHtcbiAgY29uc3QgZmV0Y2hJbXBsID0gZGVwcy5mZXRjaEltcGwgPz8gZmV0Y2g7XG4gIGNvbnN0IGZpbmRQaWRPblBvcnRJbXBsID0gZGVwcy5maW5kUGlkT25Qb3J0SW1wbCA/PyBmaW5kUGlkT25Qb3J0O1xuICBjb25zdCByZWFkTGVhZGVyTG9ja0ltcGwgPSBkZXBzLnJlYWRMZWFkZXJMb2NrSW1wbCA/PyByZWFkTGVhZGVyTG9jaztcbiAgY29uc3Qgb3duZXJQaWQgPSBhd2FpdCBmaW5kUGlkT25Qb3J0SW1wbChwb3J0KTtcblxuICBpZiAob3duZXJQaWQgIT09IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbGVhZGVySW5mbyA9IGF3YWl0IGRpc2NvdmVyTGVhZGVyVmlhU2Vzc2lvbnNBcGkocG9ydCwgb3duZXJQaWQsIGF1dGhUb2tlbiwgZmV0Y2hJbXBsKTtcbiAgICAgIGlmIChsZWFkZXJJbmZvKSB7XG4gICAgICAgIHJldHVybiB7IG93bmVyUGlkLCBzb3VyY2U6ICdhcGknLCBsZWFkZXJJbmZvIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tVbmlmaWVkQ29uc29sZV0gRmFpbGVkIHRvIHF1ZXJ5IGFjdGl2ZSBsZWFkZXIgc2Vzc2lvbnMnLCB7XG4gICAgICAgIHBvcnQsXG4gICAgICAgIG93bmVyUGlkLFxuICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbG9jayA9IGF3YWl0IHJlYWRMZWFkZXJMb2NrSW1wbCgpO1xuICBpZiAobG9jaz8ucG9ydCA9PT0gcG9ydCAmJiAob3duZXJQaWQgPT09IG51bGwgfHwgbG9jay5waWQgPT09IG93bmVyUGlkKSkge1xuICAgIHJldHVybiB7XG4gICAgICBvd25lclBpZDogb3duZXJQaWQgPz8gbG9jay5waWQsXG4gICAgICBzb3VyY2U6ICdsb2NrJyxcbiAgICAgIGxlYWRlckluZm86IHtcbiAgICAgICAgLi4ubG9jayxcbiAgICAgICAgc2Vzc2lvbklkOiBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShsb2NrLnNlc3Npb25JZCkubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAob3duZXJQaWQgIT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3duZXJQaWQsXG4gICAgICBzb3VyY2U6ICdzeW50aGV0aWMnLFxuICAgICAgbGVhZGVySW5mbzogYnVpbGRTeW50aGV0aWNMZWFkZXJJbmZvKHBvcnQsIG93bmVyUGlkKSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgbGVhZGVySW5mbzogbnVsbCwgb3duZXJQaWQ6IG51bGwsIHNvdXJjZTogJ25vbmUnIH07XG59XG5cbmludGVyZmFjZSBCaW5kRmFpbHVyZVJlY292ZXJ5RGVwZW5kZW5jaWVzIGV4dGVuZHMgRGlzY292ZXJ5RGVwZW5kZW5jaWVzIHtcbiAgZGVsZXRlTGVhZGVyTG9ja0ltcGw/OiB0eXBlb2YgZGVsZXRlTGVhZGVyTG9jaztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlY292ZXJMZWFkZXJCaW5kRmFpbHVyZShcbiAgcHJvdmlzaW9uYWxMZWFkZXI6IENvbnNvbGVMZWFkZXJJbmZvLFxuICBwb3J0OiBudW1iZXIsXG4gIGF1dGhUb2tlbjogc3RyaW5nIHwgbnVsbCxcbiAgZGVwczogQmluZEZhaWx1cmVSZWNvdmVyeURlcGVuZGVuY2llcyA9IHt9LFxuKTogUHJvbWlzZTxCaW5kRmFpbHVyZVJlY292ZXJ5UmVzdWx0PiB7XG4gIGNvbnN0IHJlYWRMZWFkZXJMb2NrSW1wbCA9IGRlcHMucmVhZExlYWRlckxvY2tJbXBsID8/IHJlYWRMZWFkZXJMb2NrO1xuICBjb25zdCBkZWxldGVMZWFkZXJMb2NrSW1wbCA9IGRlcHMuZGVsZXRlTGVhZGVyTG9ja0ltcGwgPz8gZGVsZXRlTGVhZGVyTG9jaztcbiAgbG9nZ2VyLmluZm8oJ1tVbmlmaWVkQ29uc29sZV0gTGVhZGVyIGJpbmQgcmVjb3ZlcnkgaW5pdGlhdGVkJywge1xuICAgIHByb3Zpc2lvbmFsU2Vzc2lvbklkOiBwcm92aXNpb25hbExlYWRlci5zZXNzaW9uSWQsXG4gICAgcHJvdmlzaW9uYWxQaWQ6IHByb3Zpc2lvbmFsTGVhZGVyLnBpZCxcbiAgICBwb3J0LFxuICB9KTtcblxuICBsZXQgZmFsbGJhY2sgPSBhd2FpdCBkaXNjb3ZlckxlYWRlclNlcnZpbmdQb3J0KHBvcnQsIGF1dGhUb2tlbiwgZGVwcyk7XG4gIGxldCBsb2NrQ2xlYW51cEF0dGVtcHRlZCA9IGZhbHNlO1xuICBsZXQgbG9ja0NsZWFudXBQZXJmb3JtZWQgPSBmYWxzZTtcbiAgY29uc3QgY3VycmVudExvY2sgPSBhd2FpdCByZWFkTGVhZGVyTG9ja0ltcGwoKTtcbiAgY29uc3QgcHJvdmlzaW9uYWxMb2NrTWF0Y2hlcyA9IChcbiAgICBjdXJyZW50TG9jaz8ucGlkID09PSBwcm92aXNpb25hbExlYWRlci5waWQgJiZcbiAgICBjdXJyZW50TG9jay5wb3J0ID09PSBwcm92aXNpb25hbExlYWRlci5wb3J0ICYmXG4gICAgY3VycmVudExvY2suc2Vzc2lvbklkID09PSBwcm92aXNpb25hbExlYWRlci5zZXNzaW9uSWRcbiAgKTtcbiAgY29uc3QgZmFsbGJhY2tQb2ludHNUb1Byb3Zpc2lvbmFsTGVhZGVyID0gKFxuICAgIGZhbGxiYWNrLmxlYWRlckluZm8/LnBpZCA9PT0gcHJvdmlzaW9uYWxMZWFkZXIucGlkICYmXG4gICAgZmFsbGJhY2subGVhZGVySW5mby5wb3J0ID09PSBwcm92aXNpb25hbExlYWRlci5wb3J0ICYmXG4gICAgZmFsbGJhY2subGVhZGVySW5mby5zZXNzaW9uSWQgPT09IHByb3Zpc2lvbmFsTGVhZGVyLnNlc3Npb25JZFxuICApO1xuXG4gIGlmIChwcm92aXNpb25hbExvY2tNYXRjaGVzKSB7XG4gICAgbG9ja0NsZWFudXBBdHRlbXB0ZWQgPSB0cnVlO1xuICAgIGF3YWl0IGRlbGV0ZUxlYWRlckxvY2tJbXBsKCk7XG4gICAgbG9ja0NsZWFudXBQZXJmb3JtZWQgPSB0cnVlO1xuICAgIGxvZ2dlci5pbmZvKCdbVW5pZmllZENvbnNvbGVdIFJlbW92ZWQgcHJvdmlzaW9uYWwgbGVhZGVyIGxvY2sgYWZ0ZXIgYmluZCBmYWlsdXJlJywge1xuICAgICAgcHJvdmlzaW9uYWxTZXNzaW9uSWQ6IHByb3Zpc2lvbmFsTGVhZGVyLnNlc3Npb25JZCxcbiAgICAgIHByb3Zpc2lvbmFsUGlkOiBwcm92aXNpb25hbExlYWRlci5waWQsXG4gICAgICBwb3J0LFxuICAgIH0pO1xuICAgIGlmIChmYWxsYmFja1BvaW50c1RvUHJvdmlzaW9uYWxMZWFkZXIpIHtcbiAgICAgIGZhbGxiYWNrID0gYXdhaXQgZGlzY292ZXJMZWFkZXJTZXJ2aW5nUG9ydChwb3J0LCBhdXRoVG9rZW4sIGRlcHMpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5pbmZvKCdbVW5pZmllZENvbnNvbGVdIExlYWRlciBiaW5kIHJlY292ZXJ5IGNvbXBsZXRlZCcsIHtcbiAgICBwcm92aXNpb25hbFNlc3Npb25JZDogcHJvdmlzaW9uYWxMZWFkZXIuc2Vzc2lvbklkLFxuICAgIHByb3Zpc2lvbmFsUGlkOiBwcm92aXNpb25hbExlYWRlci5waWQsXG4gICAgcG9ydCxcbiAgICBkaXNjb3ZlcnlTb3VyY2U6IGZhbGxiYWNrLnNvdXJjZSxcbiAgICBvd25lclBpZDogZmFsbGJhY2sub3duZXJQaWQsXG4gICAgbG9ja0NsZWFudXBBdHRlbXB0ZWQsXG4gICAgbG9ja0NsZWFudXBQZXJmb3JtZWQsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4uZmFsbGJhY2ssXG4gICAgbG9ja0NsZWFudXBBdHRlbXB0ZWQsXG4gICAgbG9ja0NsZWFudXBQZXJmb3JtZWQsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZVBvcnRPd25lclJlcGxhY2VtZW50KFxuICBjYW5kaWRhdGVMZWFkZXI6IENvbnNvbGVMZWFkZXJJbmZvLFxuICBmYWxsYmFjazogUG9ydExlYWRlckRpc2NvdmVyeSxcbik6IFBvcnRPd25lclJlcGxhY2VtZW50RGVjaXNpb24ge1xuICBpZiAoIWZhbGxiYWNrLmxlYWRlckluZm8gfHwgZmFsbGJhY2sub3duZXJQaWQgPT09IG51bGwgfHwgZmFsbGJhY2sub3duZXJQaWQgPT09IGNhbmRpZGF0ZUxlYWRlci5waWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2hvdWxkRXZpY3Q6IGZhbHNlLFxuICAgICAgb3duZXJQaWQ6IGZhbGxiYWNrLm93bmVyUGlkLFxuICAgICAgcHJlZmVyZW5jZTogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcHJlZmVyZW5jZSA9IGV2YWx1YXRlTGVhZGVyUHJlZmVyZW5jZShjYW5kaWRhdGVMZWFkZXIsIGZhbGxiYWNrLmxlYWRlckluZm8pO1xuICByZXR1cm4ge1xuICAgIHNob3VsZEV2aWN0OiBwcmVmZXJlbmNlLnNob3VsZFJlcGxhY2UsXG4gICAgb3duZXJQaWQ6IGZhbGxiYWNrLm93bmVyUGlkLFxuICAgIHByZWZlcmVuY2UsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQmluZEZhaWx1cmVMb2dDb250ZXh0KFxuICBjb25zb2xlUG9ydDogbnVtYmVyLFxuICBwcm92aXNpb25hbExlYWRlcjogQ29uc29sZUxlYWRlckluZm8sXG4gIGJpbmRSZXN1bHQ6IFdlYlNlcnZlclJlc3VsdFsnYmluZFJlc3VsdCddLFxuICBmYWxsYmFjazogUG9ydExlYWRlckRpc2NvdmVyeSxcbiAgcmVwbGFjZW1lbnQ/OiBQb3J0T3duZXJSZXBsYWNlbWVudERlY2lzaW9uLFxuICBmb3JjZWRLaWxsPzogS2lsbFN0YWxlUHJvY2Vzc091dGNvbWUgfCBudWxsLFxuKSB7XG4gIHJldHVybiB7XG4gICAgcG9ydDogY29uc29sZVBvcnQsXG4gICAgYmluZEVycm9yOiBiaW5kUmVzdWx0Py5lcnJvcixcbiAgICBiaW5kRGV0YWlsOiBiaW5kUmVzdWx0Py5kZXRhaWwsXG4gICAgcHJvdmlzaW9uYWxMZWFkZXJQaWQ6IHByb3Zpc2lvbmFsTGVhZGVyLnBpZCxcbiAgICBwcm92aXNpb25hbExlYWRlclNlc3Npb25JZDogcHJvdmlzaW9uYWxMZWFkZXIuc2Vzc2lvbklkLFxuICAgIHByb3Zpc2lvbmFsTGVhZGVyVmVyc2lvbjogcHJvdmlzaW9uYWxMZWFkZXIuc2VydmVyVmVyc2lvbiA/PyBMRUdBQ1lfU0VSVkVSX1ZFUlNJT04sXG4gICAgcHJvdmlzaW9uYWxMZWFkZXJQcm90b2NvbFZlcnNpb246IHByb3Zpc2lvbmFsTGVhZGVyLmNvbnNvbGVQcm90b2NvbFZlcnNpb24gPz8gQ09OU09MRV9QUk9UT0NPTF9WRVJTSU9OLFxuICAgIGZhbGxiYWNrT3duZXJQaWQ6IGZhbGxiYWNrLm93bmVyUGlkLFxuICAgIGZhbGxiYWNrU291cmNlOiBmYWxsYmFjay5zb3VyY2UsXG4gICAgZmFsbGJhY2tMZWFkZXJQaWQ6IGZhbGxiYWNrLmxlYWRlckluZm8/LnBpZCxcbiAgICBmYWxsYmFja0xlYWRlclNlc3Npb25JZDogZmFsbGJhY2subGVhZGVySW5mbz8uc2Vzc2lvbklkLFxuICAgIGZhbGxiYWNrTGVhZGVyVmVyc2lvbjogZmFsbGJhY2subGVhZGVySW5mbz8uc2VydmVyVmVyc2lvbiA/PyBMRUdBQ1lfU0VSVkVSX1ZFUlNJT04sXG4gICAgZmFsbGJhY2tMZWFkZXJQcm90b2NvbFZlcnNpb246IGZhbGxiYWNrLmxlYWRlckluZm8/LmNvbnNvbGVQcm90b2NvbFZlcnNpb24gPz8gQ09OU09MRV9QUk9UT0NPTF9WRVJTSU9OLFxuICAgIHJlcGxhY2VtZW50U2hvdWxkRXZpY3Q6IHJlcGxhY2VtZW50Py5zaG91bGRFdmljdCA/PyBmYWxzZSxcbiAgICByZXBsYWNlbWVudFJlYXNvbjogcmVwbGFjZW1lbnQ/LnByZWZlcmVuY2U/LnJlYXNvbixcbiAgICBmb3JjZWRLaWxsUmVhc29uOiBmb3JjZWRLaWxsPy5yZWFzb24sXG4gICAgZm9yY2VkS2lsbFBpZDogZm9yY2VkS2lsbD8ucGlkLFxuICAgIGZvcmNlZEtpbGxEZXRhaWw6IGZvcmNlZEtpbGw/LmRldGFpbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRBdXRob3JpdHlSZXNvbHV0aW9uTG9nQ29udGV4dChcbiAgY29uc29sZVBvcnQ6IG51bWJlcixcbiAgZWxlY3RlZExlYWRlcjogQ29uc29sZUxlYWRlckluZm8sXG4gIGRpc2NvdmVyeTogUG9ydExlYWRlckRpc2NvdmVyeSB8IG51bGwsXG4gIHJlcGxhY2VtZW50OiBQb3J0T3duZXJSZXBsYWNlbWVudERlY2lzaW9uIHwgbnVsbCxcbikge1xuICByZXR1cm4ge1xuICAgIHBvcnQ6IGNvbnNvbGVQb3J0LFxuICAgIGVsZWN0ZWRMZWFkZXJQaWQ6IGVsZWN0ZWRMZWFkZXIucGlkLFxuICAgIGVsZWN0ZWRMZWFkZXJTZXNzaW9uSWQ6IGVsZWN0ZWRMZWFkZXIuc2Vzc2lvbklkLFxuICAgIGVsZWN0ZWRMZWFkZXJWZXJzaW9uOiBlbGVjdGVkTGVhZGVyLnNlcnZlclZlcnNpb24gPz8gTEVHQUNZX1NFUlZFUl9WRVJTSU9OLFxuICAgIGVsZWN0ZWRMZWFkZXJQcm90b2NvbFZlcnNpb246IGVsZWN0ZWRMZWFkZXIuY29uc29sZVByb3RvY29sVmVyc2lvbiA/PyBDT05TT0xFX1BST1RPQ09MX1ZFUlNJT04sXG4gICAgc2VydmluZ093bmVyUGlkOiBkaXNjb3Zlcnk/Lm93bmVyUGlkID8/IG51bGwsXG4gICAgc2VydmluZ1NvdXJjZTogZGlzY292ZXJ5Py5zb3VyY2UgPz8gJ25vbmUnLFxuICAgIHNlcnZpbmdMZWFkZXJQaWQ6IGRpc2NvdmVyeT8ubGVhZGVySW5mbz8ucGlkID8/IG51bGwsXG4gICAgc2VydmluZ0xlYWRlclNlc3Npb25JZDogZGlzY292ZXJ5Py5sZWFkZXJJbmZvPy5zZXNzaW9uSWQgPz8gbnVsbCxcbiAgICBzZXJ2aW5nTGVhZGVyVmVyc2lvbjogZGlzY292ZXJ5Py5sZWFkZXJJbmZvPy5zZXJ2ZXJWZXJzaW9uID8/IExFR0FDWV9TRVJWRVJfVkVSU0lPTixcbiAgICBzZXJ2aW5nTGVhZGVyUHJvdG9jb2xWZXJzaW9uOiBkaXNjb3Zlcnk/LmxlYWRlckluZm8/LmNvbnNvbGVQcm90b2NvbFZlcnNpb24gPz8gQ09OU09MRV9QUk9UT0NPTF9WRVJTSU9OLFxuICAgIHJlcGxhY2VtZW50U2hvdWxkRXZpY3Q6IHJlcGxhY2VtZW50Py5zaG91bGRFdmljdCA/PyBmYWxzZSxcbiAgICByZXBsYWNlbWVudFJlYXNvbjogcmVwbGFjZW1lbnQ/LnByZWZlcmVuY2U/LnJlYXNvbiA/PyBudWxsLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUZvbGxvd2VyQXV0aG9yaXR5KFxuICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgY29uc29sZVBvcnQ6IG51bWJlcixcbiAgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0LFxuICBkZXBzOiBGb2xsb3dlckF1dGhvcml0eURlcGVuZGVuY2llcyA9IHt9LFxuKTogUHJvbWlzZTxGb2xsb3dlckF1dGhvcml0eVJlc29sdXRpb24+IHtcbiAgY29uc3QgaXNMZWFkZXJXZWJDb25zb2xlUmVhY2hhYmxlSW1wbCA9IGRlcHMuaXNMZWFkZXJXZWJDb25zb2xlUmVhY2hhYmxlSW1wbCA/PyBpc0xlYWRlcldlYkNvbnNvbGVSZWFjaGFibGU7XG4gIGNvbnN0IGRpc2NvdmVyTGVhZGVyU2VydmluZ1BvcnRJbXBsID0gZGVwcy5kaXNjb3ZlckxlYWRlclNlcnZpbmdQb3J0SW1wbCA/PyBkaXNjb3ZlckxlYWRlclNlcnZpbmdQb3J0O1xuICBjb25zdCBmb3JjZUNsYWltTGVhZGVyc2hpcEltcGwgPSBkZXBzLmZvcmNlQ2xhaW1MZWFkZXJzaGlwSW1wbCA/PyBmb3JjZUNsYWltTGVhZGVyc2hpcDtcbiAgY29uc3QgZGVsZXRlTGVhZGVyTG9ja0ltcGwgPSBkZXBzLmRlbGV0ZUxlYWRlckxvY2tJbXBsID8/IGRlbGV0ZUxlYWRlckxvY2s7XG5cbiAgY29uc3QgcmVhY2hhYmxlID0gYXdhaXQgaXNMZWFkZXJXZWJDb25zb2xlUmVhY2hhYmxlSW1wbChlbGVjdGlvbi5sZWFkZXJJbmZvKTtcbiAgaWYgKCFyZWFjaGFibGUpIHtcbiAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBFbGVjdGVkIGxlYWRlciBpcyBub3Qgc2VydmluZyB0aGUgY29uc29sZSBwb3J0OyBmb3JjaW5nIHRha2VvdmVyJywge1xuICAgICAgcG9ydDogY29uc29sZVBvcnQsXG4gICAgICBlbGVjdGVkTGVhZGVyUGlkOiBlbGVjdGlvbi5sZWFkZXJJbmZvLnBpZCxcbiAgICAgIGVsZWN0ZWRMZWFkZXJTZXNzaW9uSWQ6IGVsZWN0aW9uLmxlYWRlckluZm8uc2Vzc2lvbklkLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBlbGVjdGlvbjogYXdhaXQgZm9yY2VDbGFpbUxlYWRlcnNoaXBJbXBsKHNlc3Npb25JZCwgY29uc29sZVBvcnQpLFxuICAgICAgZGlzY292ZXJ5OiBudWxsLFxuICAgICAgcmVwbGFjZW1lbnQ6IG51bGwsXG4gICAgICBmb3JjZWRDbGFpbTogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgY2FuZGlkYXRlTGVhZGVyID0gY3JlYXRlTGVhZGVySW5mbyhzZXNzaW9uSWQsIGNvbnNvbGVQb3J0KTtcbiAgY29uc3QgZGlzY292ZXJ5ID0gYXdhaXQgZGlzY292ZXJMZWFkZXJTZXJ2aW5nUG9ydEltcGwoY29uc29sZVBvcnQsIG51bGwpO1xuICBpZiAoIWRpc2NvdmVyeS5sZWFkZXJJbmZvIHx8IGRpc2NvdmVyeS5vd25lclBpZCA9PT0gbnVsbCkge1xuICAgIHJldHVybiB7XG4gICAgICBlbGVjdGlvbixcbiAgICAgIGRpc2NvdmVyeSxcbiAgICAgIHJlcGxhY2VtZW50OiBudWxsLFxuICAgICAgZm9yY2VkQ2xhaW06IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICBjb25zdCByZXBsYWNlbWVudCA9IGV2YWx1YXRlUG9ydE93bmVyUmVwbGFjZW1lbnQoY2FuZGlkYXRlTGVhZGVyLCBkaXNjb3ZlcnkpO1xuICBpZiAoZGlzY292ZXJ5Lm93bmVyUGlkICE9PSBlbGVjdGlvbi5sZWFkZXJJbmZvLnBpZCkge1xuICAgIGlmIChyZXBsYWNlbWVudC5zaG91bGRFdmljdCkge1xuICAgICAgYXdhaXQgZGVsZXRlTGVhZGVyTG9ja0ltcGwoKTtcbiAgICAgIGxvZ2dlci53YXJuKCdbVW5pZmllZENvbnNvbGVdIFNwbGl0LWJyYWluIGNvbnNvbGUgYXV0aG9yaXR5IGRldGVjdGVkOyBuZXdlciBzZXNzaW9uIHdpbGwgcmVwbGFjZSB0aGUgYWN0dWFsIHBvcnQgb3duZXInLCBidWlsZEF1dGhvcml0eVJlc29sdXRpb25Mb2dDb250ZXh0KFxuICAgICAgICBjb25zb2xlUG9ydCxcbiAgICAgICAgZWxlY3Rpb24ubGVhZGVySW5mbyxcbiAgICAgICAgZGlzY292ZXJ5LFxuICAgICAgICByZXBsYWNlbWVudCxcbiAgICAgICkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlY3Rpb246IHsgcm9sZTogJ2xlYWRlcicsIGxlYWRlckluZm86IGNhbmRpZGF0ZUxlYWRlciB9LFxuICAgICAgICBkaXNjb3ZlcnksXG4gICAgICAgIHJlcGxhY2VtZW50LFxuICAgICAgICBmb3JjZWRDbGFpbTogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKCdbVW5pZmllZENvbnNvbGVdIFNwbGl0LWJyYWluIGNvbnNvbGUgYXV0aG9yaXR5IGRldGVjdGVkOyBmb2xsb3dpbmcgdGhlIGFjdHVhbCBwb3J0IG93bmVyJywgYnVpbGRBdXRob3JpdHlSZXNvbHV0aW9uTG9nQ29udGV4dChcbiAgICAgIGNvbnNvbGVQb3J0LFxuICAgICAgZWxlY3Rpb24ubGVhZGVySW5mbyxcbiAgICAgIGRpc2NvdmVyeSxcbiAgICAgIHJlcGxhY2VtZW50LFxuICAgICkpO1xuICAgIHJldHVybiB7XG4gICAgICBlbGVjdGlvbjogeyByb2xlOiAnZm9sbG93ZXInLCBsZWFkZXJJbmZvOiBkaXNjb3ZlcnkubGVhZGVySW5mbyB9LFxuICAgICAgZGlzY292ZXJ5LFxuICAgICAgcmVwbGFjZW1lbnQsXG4gICAgICBmb3JjZWRDbGFpbTogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZWxlY3Rpb24sXG4gICAgZGlzY292ZXJ5LFxuICAgIHJlcGxhY2VtZW50LFxuICAgIGZvcmNlZENsYWltOiBmYWxzZSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXR0ZW1wdEZvcmNlVGFrZW92ZXIoXG4gIG9wdGlvbnM6IFVuaWZpZWRDb25zb2xlT3B0aW9ucyxcbiAgY3VycmVudEVsZWN0aW9uOiBFbGVjdGlvblJlc3VsdCxcbiAgY29uc29sZVBvcnQ6IG51bWJlcixcbiAgcHJpbWFyeVRva2VuOiBzdHJpbmcsXG4gIHNlcnZlck9wdHM6IFdlYlNlcnZlck9wdGlvbnMsXG4gIHN0YXJ0V2ViU2VydmVySW1wbDogKG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMpID0+IFByb21pc2U8V2ViU2VydmVyUmVzdWx0Pixcbik6IFByb21pc2U8Rm9yY2VUYWtlb3ZlckF0dGVtcHRSZXN1bHQ+IHtcbiAgY29uc3QgaW5pdGlhbEZhbGxiYWNrID0gYXdhaXQgcmVjb3ZlckxlYWRlckJpbmRGYWlsdXJlKGN1cnJlbnRFbGVjdGlvbi5sZWFkZXJJbmZvLCBjb25zb2xlUG9ydCwgcHJpbWFyeVRva2VuKTtcbiAgY29uc3QgaW5pdGlhbFJlcGxhY2VtZW50ID0gZXZhbHVhdGVQb3J0T3duZXJSZXBsYWNlbWVudChjdXJyZW50RWxlY3Rpb24ubGVhZGVySW5mbywgaW5pdGlhbEZhbGxiYWNrKTtcblxuICBpZiAoIWluaXRpYWxSZXBsYWNlbWVudC5zaG91bGRFdmljdCB8fCBpbml0aWFsUmVwbGFjZW1lbnQub3duZXJQaWQgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2ViUmVzdWx0OiB7IGJpbmRSZXN1bHQ6IHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnRUFERFJJTlVTRScsIGRldGFpbDogYFBvcnQgJHtjb25zb2xlUG9ydH0gYWxyZWFkeSBpbiB1c2VgIH0gfSxcbiAgICAgIGVsZWN0aW9uOiBjdXJyZW50RWxlY3Rpb24sXG4gICAgICBmYWxsYmFjazogaW5pdGlhbEZhbGxiYWNrLFxuICAgICAgcmVwbGFjZW1lbnQ6IGluaXRpYWxSZXBsYWNlbWVudCxcbiAgICAgIGZvcmNlZEtpbGw6IG51bGwsXG4gICAgICB0YWtlb3ZlckF0dGVtcHRlZDogZmFsc2UsXG4gICAgICByZWJvdW5kTG9ja0NsYWltZWQ6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBsYXRlc3RGYWxsYmFjayA9IGF3YWl0IGRpc2NvdmVyTGVhZGVyU2VydmluZ1BvcnQoY29uc29sZVBvcnQsIHByaW1hcnlUb2tlbik7XG4gIGNvbnN0IGxhdGVzdFJlcGxhY2VtZW50ID0gZXZhbHVhdGVQb3J0T3duZXJSZXBsYWNlbWVudChjdXJyZW50RWxlY3Rpb24ubGVhZGVySW5mbywgbGF0ZXN0RmFsbGJhY2spO1xuICBpZiAoIWxhdGVzdFJlcGxhY2VtZW50LnNob3VsZEV2aWN0IHx8IGxhdGVzdFJlcGxhY2VtZW50Lm93bmVyUGlkID09PSBudWxsKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1tVbmlmaWVkQ29uc29sZV0gRm9yY2VkIHRha2VvdmVyIHRhcmdldCBjaGFuZ2VkIGJlZm9yZSBldmljdGlvbjsgc2tpcHBpbmcgZm9yY2VkIGtpbGwnLCB7XG4gICAgICAuLi5idWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgICAgICAgY29uc29sZVBvcnQsXG4gICAgICAgIGN1cnJlbnRFbGVjdGlvbi5sZWFkZXJJbmZvLFxuICAgICAgICB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VBRERSSU5VU0UnLCBkZXRhaWw6IGBQb3J0ICR7Y29uc29sZVBvcnR9IGFscmVhZHkgaW4gdXNlYCB9LFxuICAgICAgICBsYXRlc3RGYWxsYmFjayxcbiAgICAgICAgbGF0ZXN0UmVwbGFjZW1lbnQsXG4gICAgICApLFxuICAgICAgcHJldmlvdXNPd25lclBpZDogaW5pdGlhbFJlcGxhY2VtZW50Lm93bmVyUGlkLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICB3ZWJSZXN1bHQ6IHsgYmluZFJlc3VsdDogeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdFQUREUklOVVNFJywgZGV0YWlsOiBgUG9ydCAke2NvbnNvbGVQb3J0fSBhbHJlYWR5IGluIHVzZWAgfSB9LFxuICAgICAgZWxlY3Rpb246IGN1cnJlbnRFbGVjdGlvbixcbiAgICAgIGZhbGxiYWNrOiBsYXRlc3RGYWxsYmFjayxcbiAgICAgIHJlcGxhY2VtZW50OiBsYXRlc3RSZXBsYWNlbWVudCxcbiAgICAgIGZvcmNlZEtpbGw6IG51bGwsXG4gICAgICB0YWtlb3ZlckF0dGVtcHRlZDogZmFsc2UsXG4gICAgICByZWJvdW5kTG9ja0NsYWltZWQ6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBBdHRlbXB0aW5nIGZvcmNlZCB0YWtlb3ZlciBmcm9tIG9sZGVyIG9yIGluY29tcGF0aWJsZSBhY3RpdmUgbGVhZGVyJywge1xuICAgIC4uLmJ1aWxkQmluZEZhaWx1cmVMb2dDb250ZXh0KFxuICAgICAgY29uc29sZVBvcnQsXG4gICAgICBjdXJyZW50RWxlY3Rpb24ubGVhZGVySW5mbyxcbiAgICAgIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnRUFERFJJTlVTRScsIGRldGFpbDogYFBvcnQgJHtjb25zb2xlUG9ydH0gYWxyZWFkeSBpbiB1c2VgIH0sXG4gICAgICBsYXRlc3RGYWxsYmFjayxcbiAgICAgIGxhdGVzdFJlcGxhY2VtZW50LFxuICAgICksXG4gIH0pO1xuXG4gIGNvbnN0IGZvcmNlZEtpbGwgPSBhd2FpdCBraWxsU3RhbGVQcm9jZXNzRGV0YWlsZWQobGF0ZXN0UmVwbGFjZW1lbnQub3duZXJQaWQsIGNvbnNvbGVQb3J0LCB7XG4gICAgYWxsb3dBY3RpdmVIb3N0UGFyZW50OiB0cnVlLFxuICB9KTtcbiAgaWYgKCFmb3JjZWRLaWxsLmtpbGxlZCkge1xuICAgIGxvZ2dlci53YXJuKCdbVW5pZmllZENvbnNvbGVdIEZvcmNlZCB0YWtlb3ZlciBza2lwcGVkIG9yIGZhaWxlZCBhZnRlciBpZGVudGlmeWluZyByZXBsYWNlYWJsZSBsZWFkZXInLCB7XG4gICAgICAuLi5idWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgICAgICAgY29uc29sZVBvcnQsXG4gICAgICAgIGN1cnJlbnRFbGVjdGlvbi5sZWFkZXJJbmZvLFxuICAgICAgICB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VBRERSSU5VU0UnLCBkZXRhaWw6IGBQb3J0ICR7Y29uc29sZVBvcnR9IGFscmVhZHkgaW4gdXNlYCB9LFxuICAgICAgICBsYXRlc3RGYWxsYmFjayxcbiAgICAgICAgbGF0ZXN0UmVwbGFjZW1lbnQsXG4gICAgICAgIGZvcmNlZEtpbGwsXG4gICAgICApLFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICB3ZWJSZXN1bHQ6IHsgYmluZFJlc3VsdDogeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdFQUREUklOVVNFJywgZGV0YWlsOiBgUG9ydCAke2NvbnNvbGVQb3J0fSBhbHJlYWR5IGluIHVzZWAgfSB9LFxuICAgICAgZWxlY3Rpb246IGN1cnJlbnRFbGVjdGlvbixcbiAgICAgIGZhbGxiYWNrOiBsYXRlc3RGYWxsYmFjayxcbiAgICAgIHJlcGxhY2VtZW50OiBsYXRlc3RSZXBsYWNlbWVudCxcbiAgICAgIGZvcmNlZEtpbGwsXG4gICAgICB0YWtlb3ZlckF0dGVtcHRlZDogdHJ1ZSxcbiAgICAgIHJlYm91bmRMb2NrQ2xhaW1lZDogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHJlYm91bmRXZWJSZXN1bHQgPSBhd2FpdCBzdGFydFdlYlNlcnZlckltcGwoc2VydmVyT3B0cyk7XG4gIGxldCByZWJvdW5kRWxlY3Rpb24gPSBjdXJyZW50RWxlY3Rpb247XG4gIGxldCByZWJvdW5kTG9ja0NsYWltZWQgPSBmYWxzZTtcblxuICBpZiAoIXJlYm91bmRXZWJSZXN1bHQuYmluZFJlc3VsdCB8fCByZWJvdW5kV2ViUmVzdWx0LmJpbmRSZXN1bHQuc3VjY2Vzcykge1xuICAgIGNvbnN0IHJlYm91bmRMZWFkZXJJbmZvID0gY3JlYXRlTGVhZGVySW5mbyhvcHRpb25zLnNlc3Npb25JZCwgY29uc29sZVBvcnQpO1xuICAgIHJlYm91bmRMb2NrQ2xhaW1lZCA9IGF3YWl0IGNsYWltTGVhZGVyc2hpcChyZWJvdW5kTGVhZGVySW5mbyk7XG4gICAgaWYgKCFyZWJvdW5kTG9ja0NsYWltZWQpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdbVW5pZmllZENvbnNvbGVdIFJlYm91bmQgbGVhZGVyIGJvdW5kIHBvcnQgYnV0IGNvdWxkIG5vdCBpbW1lZGlhdGVseSByZS1jbGFpbSBsb2NrJywge1xuICAgICAgICAuLi5idWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgICAgICAgICBjb25zb2xlUG9ydCxcbiAgICAgICAgICByZWJvdW5kTGVhZGVySW5mbyxcbiAgICAgICAgICByZWJvdW5kV2ViUmVzdWx0LmJpbmRSZXN1bHQsXG4gICAgICAgICAgbGF0ZXN0RmFsbGJhY2ssXG4gICAgICAgICAgbGF0ZXN0UmVwbGFjZW1lbnQsXG4gICAgICAgICAgZm9yY2VkS2lsbCxcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZWJvdW5kRWxlY3Rpb24gPSB7IHJvbGU6ICdsZWFkZXInLCBsZWFkZXJJbmZvOiByZWJvdW5kTGVhZGVySW5mbyB9O1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci53YXJuKCdbVW5pZmllZENvbnNvbGVdIEZvcmNlZCB0YWtlb3ZlciBraWxsZWQgb2xkIGxlYWRlciBidXQgYmluZCByZXRyeSBzdGlsbCBmYWlsZWQnLCB7XG4gICAgICAuLi5idWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgICAgICAgY29uc29sZVBvcnQsXG4gICAgICAgIGN1cnJlbnRFbGVjdGlvbi5sZWFkZXJJbmZvLFxuICAgICAgICByZWJvdW5kV2ViUmVzdWx0LmJpbmRSZXN1bHQsXG4gICAgICAgIGxhdGVzdEZhbGxiYWNrLFxuICAgICAgICBsYXRlc3RSZXBsYWNlbWVudCxcbiAgICAgICAgZm9yY2VkS2lsbCxcbiAgICAgICksXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdlYlJlc3VsdDogcmVib3VuZFdlYlJlc3VsdCxcbiAgICBlbGVjdGlvbjogcmVib3VuZEVsZWN0aW9uLFxuICAgIGZhbGxiYWNrOiBsYXRlc3RGYWxsYmFjayxcbiAgICByZXBsYWNlbWVudDogbGF0ZXN0UmVwbGFjZW1lbnQsXG4gICAgZm9yY2VkS2lsbCxcbiAgICB0YWtlb3ZlckF0dGVtcHRlZDogdHJ1ZSxcbiAgICByZWJvdW5kTG9ja0NsYWltZWQsXG4gIH07XG59XG5cbi8qKlxuICogU3RhcnQgdGhlIHVuaWZpZWQgd2ViIGNvbnNvbGUuXG4gKlxuICogUnVucyBsZWFkZXIgZWxlY3Rpb24sIHRoZW4gZWl0aGVyIHN0YXJ0cyB0aGUgZnVsbCBjb25zb2xlIChsZWFkZXIpXG4gKiBvciBzZXRzIHVwIGV2ZW50IGZvcndhcmRpbmcgKGZvbGxvd2VyKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0VW5pZmllZENvbnNvbGUob3B0aW9uczogVW5pZmllZENvbnNvbGVPcHRpb25zKTogUHJvbWlzZTxVbmlmaWVkQ29uc29sZVJlc3VsdD4ge1xuICAvLyBSZXNvbHZlIHBvcnQ6IG9wdGlvbnMgKGNvbmZpZyBmaWxlKSDihpIgZW52IHZhciDihpIgZGVmYXVsdFxuICBjb25zdCBjb25zb2xlUG9ydCA9IG9wdGlvbnMucG9ydCB8fCBERUZBVUxUX0NPTlNPTEVfUE9SVDtcbiAgbG9nZ2VyLmRlYnVnKGBbVW5pZmllZENvbnNvbGVdIFBvcnQgcmVzb2x2ZWQ6ICR7Y29uc29sZVBvcnR9YCArXG4gICAgKG9wdGlvbnMucG9ydCA/ICcgKGZyb20gY29uZmlnIGZpbGUpJyA6IGAgKGZyb20gZW52L2RlZmF1bHQpYCkpO1xuXG4gIC8vIExlZ2FjeS1sZWFkZXIgZGV0ZWN0aW9uICgjMTc5NCkg4oCUIHdhcm4gdGhlIHVzZXIgaWYgYSBwcmUtYXV0aFxuICAvLyBEb2xsaG91c2VNQ1AgY29uc29sZSBpcyBydW5uaW5nIGFsb25nc2lkZSB0aGlzIGF1dGhlbnRpY2F0ZWQgb25lLlxuICAvLyBUaGV5IHdpbGwgY29leGlzdCBmaW5lIGJlY2F1c2Ugb2YgcG9ydCArIGxvY2sgKyB0b2tlbiBmaWxlIGlzb2xhdGlvbixcbiAgLy8gYnV0IHRoZSB1c2VyIHNob3VsZCBrbm93IGJvdGggZXhpc3Qgc28gdGhlIGRpZmZlcmluZyBzZWN1cml0eSBwb3N0dXJlXG4gIC8vIGJldHdlZW4gdGhlbSBkb2Vzbid0IGxvb2sgbGlrZSBhIGJ1Zy5cbiAgYXdhaXQgd2FybklmTGVnYWN5Q29uc29sZVByZXNlbnQoY29uc29sZVBvcnQpO1xuXG4gIGxldCBlbGVjdGlvbiA9IGF3YWl0IGVsZWN0TGVhZGVyKG9wdGlvbnMuc2Vzc2lvbklkLCBjb25zb2xlUG9ydCk7XG5cbiAgaWYgKGVsZWN0aW9uLnJvbGUgPT09ICdmb2xsb3dlcicpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVGb2xsb3dlckF1dGhvcml0eShvcHRpb25zLnNlc3Npb25JZCwgY29uc29sZVBvcnQsIGVsZWN0aW9uKTtcbiAgICBlbGVjdGlvbiA9IHJlc29sdmVkLmVsZWN0aW9uO1xuICB9XG5cbiAgaWYgKGVsZWN0aW9uLnJvbGUgPT09ICdsZWFkZXInKSB7XG4gICAgcmV0dXJuIHN0YXJ0QXNMZWFkZXIob3B0aW9ucywgZWxlY3Rpb24sIGNvbnNvbGVQb3J0KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RhcnRBc0ZvbGxvd2VyKG9wdGlvbnMsIGVsZWN0aW9uLCBjb25zb2xlUG9ydCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGFydCBhcyB0aGUgY29uc29sZSBsZWFkZXIuXG4gKiBCaW5kcyB0aGUgcmVzb2x2ZWQgY29uc29sZSBwb3J0IChjb25maWcgZmlsZSDihpIgZW52IHZhciDihpIgZGVmYXVsdCksXG4gKiBtb3VudHMgYWxsIHJvdXRlcyBpbmNsdWRpbmcgaW5nZXN0aW9uLCBzdGFydHMgaGVhcnRiZWF0LlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEFzTGVhZGVyKFxuICBvcHRpb25zOiBVbmlmaWVkQ29uc29sZU9wdGlvbnMsXG4gIGVsZWN0aW9uOiBFbGVjdGlvblJlc3VsdCxcbiAgY29uc29sZVBvcnQ6IG51bWJlciA9IERFRkFVTFRfQ09OU09MRV9QT1JULFxuKTogUHJvbWlzZTxVbmlmaWVkQ29uc29sZVJlc3VsdD4ge1xuICBjb25zdCB7IHN0YXJ0V2ViU2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZlci5qcycpO1xuICBjb25zdCB7IHBpY2tSYW5kb21Ub2tlbk5hbWUgfSA9IGF3YWl0IGltcG9ydCgnLi9TZXNzaW9uTmFtZXMuanMnKTtcblxuICAvLyBJbml0aWFsaXplIHRoZSBjb25zb2xlIHRva2VuIHN0b3JlICgjMTc4MCkuIENyZWF0ZXMgdGhlIHRva2VuIGZpbGUgb25cbiAgLy8gZmlyc3QgcnVuLCByZWFkcyB0aGUgZXhpc3RpbmcgdG9rZW5zIG9uIHN1YnNlcXVlbnQgcnVucy4gVGhlIHRva2VuIGlzXG4gIC8vIHBlcnNpc3RlbnQgYWNyb3NzIHJlc3RhcnRzIOKAlCBvbmx5IHJvdGF0ZWQgb24gZXhwbGljaXQgcmVxdWVzdCAoUGhhc2UgMikuXG4gIC8vIEZlYXR1cmUgZmxhZyBET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCBjb250cm9scyBlbmZvcmNlbWVudDsgdGhlIGZpbGVcbiAgLy8gaXMgZ2VuZXJhdGVkIHJlZ2FyZGxlc3Mgc28gY29uc3VtZXJzIGNhbiBhdHRhY2ggdG9rZW5zIHByZWVtcHRpdmVseS5cbiAgY29uc3QgdG9rZW5TdG9yZSA9IG5ldyBDb25zb2xlVG9rZW5TdG9yZShlbnYuRE9MTEhPVVNFX0NPTlNPTEVfVE9LRU5fRklMRSk7XG4gIGNvbnN0IHByaW1hcnlUb2tlbiA9IGF3YWl0IHRva2VuU3RvcmUuZW5zdXJlSW5pdGlhbGl6ZWQocGlja1JhbmRvbVRva2VuTmFtZSgpKTtcbiAgbG9nZ2VyLmluZm8oJ1tVbmlmaWVkQ29uc29sZV0gQ29uc29sZSB0b2tlbiBzdG9yZSBpbml0aWFsaXplZCcsIHtcbiAgICB0b2tlbklkOiBwcmltYXJ5VG9rZW4uaWQsXG4gICAgdG9rZW5OYW1lOiBwcmltYXJ5VG9rZW4ubmFtZSxcbiAgICBmaWxlOiB0b2tlblN0b3JlLmdldEZpbGVQYXRoKCksXG4gICAgYXV0aEVuZm9yY2VkOiBlbnYuRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQsXG4gIH0pO1xuXG4gIC8vIFByZS1jcmVhdGUgYSBwbGFjZWhvbGRlciBicm9hZGNhc3QgdGhhdCB3ZSdsbCB3aXJlIHVwIGFmdGVyIHRoZSBzZXJ2ZXIgc3RhcnRzXG4gIGxldCBsaXZlQnJvYWRjYXN0OiAoKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICBsZXQgbGl2ZU1ldHJpY3NPblNuYXBzaG90OiAoKHNuYXBzaG90OiBNZXRyaWNTbmFwc2hvdCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cbiAgLy8gQ3JlYXRlIGluZ2VzdGlvbiByb3V0ZXMgd2l0aCBhIGRlZmVycmVkIGJyb2FkY2FzdCAod2lyZWQgYWZ0ZXIgc2VydmVyIHN0YXJ0cylcbiAgY29uc3QgaW5nZXN0UmVzdWx0ID0gY3JlYXRlSW5nZXN0Um91dGVzKHtcbiAgICBsb2dCcm9hZGNhc3Q6IChlbnRyeSkgPT4gbGl2ZUJyb2FkY2FzdD8uKGVudHJ5KSxcbiAgICBtZXRyaWNzT25TbmFwc2hvdDogKHNuYXBzaG90KSA9PiBsaXZlTWV0cmljc09uU25hcHNob3Q/LihzbmFwc2hvdCksXG4gICAgc3RvcmVNZXRyaWNzU25hcHNob3Q6IChzbmFwc2hvdCkgPT4gb3B0aW9ucy5tZXRyaWNzU2luaz8ub25TbmFwc2hvdChzbmFwc2hvdCksXG4gIH0pO1xuXG4gIC8vIFN0YXJ0IHRoZSB3ZWIgc2VydmVyIHdpdGggaW5nZXN0IHJvdXRlcyBtb3VudGVkIGJlZm9yZSB0aGUgU1BBIGZhbGxiYWNrLlxuICAvLyBJZiB0aGUgcG9ydCBpcyBvY2N1cGllZCBieSBhIHN0YWxlIHByb2Nlc3MsIHJldHJ5IHdpdGggZXhwb25lbnRpYWwgYmFja29mZi5cbiAgY29uc3Qgc2VydmVyT3B0cyA9IHtcbiAgICBwb3J0Zm9saW9EaXI6IG9wdGlvbnMucG9ydGZvbGlvRGlyLFxuICAgIG1lbW9yeVNpbms6IG9wdGlvbnMubWVtb3J5U2luayxcbiAgICBtZXRyaWNzU2luazogb3B0aW9ucy5tZXRyaWNzU2luayxcbiAgICBwb3J0OiBjb25zb2xlUG9ydCxcbiAgICBhZGRpdGlvbmFsUm91dGVyczogW2luZ2VzdFJlc3VsdC5yb3V0ZXJdLFxuICAgIHRva2VuU3RvcmUsXG4gICAgLi4uKG9wdGlvbnMubWNwQXFsSGFuZGxlciA/IHsgbWNwQXFsSGFuZGxlcjogb3B0aW9ucy5tY3BBcWxIYW5kbGVyIH0gOiB7fSksXG4gIH07XG4gIC8vIGJpbmRBbmRMaXN0ZW4gbm93IGhhbmRsZXMgRUFERFJJTlVTRSBieSBmaW5kaW5nIGFuZCBraWxsaW5nIHRoZSBzdGFsZVxuICAvLyBwcm9jZXNzIG9uIHRoZSBwb3J0LCB0aGVuIHJldHJ5aW5nLiBObyBleHRlcm5hbCByZXRyeSBsb29wIG5lZWRlZC5cbiAgbGV0IHdlYlJlc3VsdCA9IGF3YWl0IHN0YXJ0V2ViU2VydmVyKHNlcnZlck9wdHMpO1xuXG4gIGlmICh3ZWJSZXN1bHQuYmluZFJlc3VsdCAmJiAhd2ViUmVzdWx0LmJpbmRSZXN1bHQuc3VjY2Vzcykge1xuICAgIGNvbnN0IGZvcmNlVGFrZW92ZXIgPSBhd2FpdCBhdHRlbXB0Rm9yY2VUYWtlb3ZlcihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBlbGVjdGlvbixcbiAgICAgIGNvbnNvbGVQb3J0LFxuICAgICAgcHJpbWFyeVRva2VuLnRva2VuLFxuICAgICAgc2VydmVyT3B0cyxcbiAgICAgIHN0YXJ0V2ViU2VydmVyLFxuICAgICk7XG4gICAgd2ViUmVzdWx0ID0gZm9yY2VUYWtlb3Zlci53ZWJSZXN1bHQ7XG4gICAgZWxlY3Rpb24gPSBmb3JjZVRha2VvdmVyLmVsZWN0aW9uO1xuXG4gICAgaWYgKHdlYlJlc3VsdC5iaW5kUmVzdWx0ICYmICF3ZWJSZXN1bHQuYmluZFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBpZiAoZm9yY2VUYWtlb3Zlci5mYWxsYmFjay5sZWFkZXJJbmZvKSB7XG4gICAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgcm9sZSBhYm9ydGVkOiBiaW5kIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGZvbGxvd2VyJywge1xuICAgICAgICAuLi5idWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgICAgICAgICBjb25zb2xlUG9ydCxcbiAgICAgICAgICBlbGVjdGlvbi5sZWFkZXJJbmZvLFxuICAgICAgICAgIHdlYlJlc3VsdC5iaW5kUmVzdWx0LFxuICAgICAgICAgIGZvcmNlVGFrZW92ZXIuZmFsbGJhY2ssXG4gICAgICAgICAgZm9yY2VUYWtlb3Zlci5yZXBsYWNlbWVudCxcbiAgICAgICAgICBmb3JjZVRha2VvdmVyLmZvcmNlZEtpbGwsXG4gICAgICAgICksXG4gICAgICAgIHRha2VvdmVyQXR0ZW1wdGVkOiBmb3JjZVRha2VvdmVyLnRha2VvdmVyQXR0ZW1wdGVkLFxuICAgICAgICByZWJvdW5kTG9ja0NsYWltZWQ6IGZvcmNlVGFrZW92ZXIucmVib3VuZExvY2tDbGFpbWVkLFxuICAgICAgICBsb2NrQ2xlYW51cEF0dGVtcHRlZDogZm9yY2VUYWtlb3Zlci5mYWxsYmFjay5zb3VyY2UgIT09ICdub25lJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9sbG93ZXJFbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQgPSB7IHJvbGU6ICdmb2xsb3dlcicsIGxlYWRlckluZm86IGZvcmNlVGFrZW92ZXIuZmFsbGJhY2subGVhZGVySW5mbyB9O1xuICAgICAgcmV0dXJuIHN0YXJ0QXNGb2xsb3dlcihvcHRpb25zLCBmb2xsb3dlckVsZWN0aW9uLCBjb25zb2xlUG9ydCwgcHJpbWFyeVRva2VuLnRva2VuKTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmVycm9yKCdbVW5pZmllZENvbnNvbGVdIExlYWRlciBmYWlsZWQgdG8gYmluZCBhbmQgbm8gYWN0aXZlIGxlYWRlciBjb3VsZCBiZSBpZGVudGlmaWVkJywge1xuICAgICAgICAuLi5idWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgICAgICAgICBjb25zb2xlUG9ydCxcbiAgICAgICAgICBlbGVjdGlvbi5sZWFkZXJJbmZvLFxuICAgICAgICAgIHdlYlJlc3VsdC5iaW5kUmVzdWx0LFxuICAgICAgICAgIGZvcmNlVGFrZW92ZXIuZmFsbGJhY2ssXG4gICAgICAgICAgZm9yY2VUYWtlb3Zlci5yZXBsYWNlbWVudCxcbiAgICAgICAgICBmb3JjZVRha2VvdmVyLmZvcmNlZEtpbGwsXG4gICAgICAgICksXG4gICAgICAgIHRha2VvdmVyQXR0ZW1wdGVkOiBmb3JjZVRha2VvdmVyLnRha2VvdmVyQXR0ZW1wdGVkLFxuICAgICAgICByZWJvdW5kTG9ja0NsYWltZWQ6IGZvcmNlVGFrZW92ZXIucmVib3VuZExvY2tDbGFpbWVkLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExlYWRlciBmYWlsZWQgdG8gYmluZCBwb3J0ICR7Y29uc29sZVBvcnR9IGFuZCBubyBhY3RpdmUgbGVhZGVyIHdhcyBkaXNjb3ZlcmFibGVgKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWdpc3RlciB0aGUgbGVhZGVyIG9ubHkgYWZ0ZXIgdGhlIEhUVFAgbGlzdGVuZXIgaXMgYWN0dWFsbHkgc2VydmluZyB0aGUgcG9ydC5cbiAgaW5nZXN0UmVzdWx0LnJlZ2lzdGVyTGVhZGVyU2Vzc2lvbihvcHRpb25zLnNlc3Npb25JZCwgcHJvY2Vzcy5waWQpO1xuXG4gIC8vIFJlZ2lzdGVyIHRoZSB3ZWIgY29uc29sZSBpdHNlbGYgc28gdGhlIHNlc3Npb24gaW5kaWNhdG9yIGlzIG5ldmVyIGVtcHR5ICgjMTgwNSlcbiAgaW5nZXN0UmVzdWx0LnJlZ2lzdGVyQ29uc29sZVNlc3Npb24oKTtcblxuICAvLyBXaXJlIFNTRSBicm9hZGNhc3RzIGZvciB0aGlzIGxlYWRlcidzIG93biBldmVudHNcbiAgb3B0aW9ucy53aXJlU1NFQnJvYWRjYXN0cyh3ZWJSZXN1bHQsIG9wdGlvbnMubWV0cmljc1NpbmspO1xuXG4gIC8vIE5vdyB3aXJlIHRoZSBsaXZlIGJyb2FkY2FzdCBmdW5jdGlvbnMgaW50byB0aGUgaW5nZXN0IHJvdXRlc1xuICBpZiAod2ViUmVzdWx0LmxvZ0Jyb2FkY2FzdCkge1xuICAgIGNvbnN0IG9yaWdpbmFsQnJvYWRjYXN0ID0gd2ViUmVzdWx0LmxvZ0Jyb2FkY2FzdDtcbiAgICAvLyBTdGFtcCBsZWFkZXIncyBvd24gZW50cmllcyB3aXRoIHNlc3Npb24gSURcbiAgICBsaXZlQnJvYWRjYXN0ID0gKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHN0YW1wZWQ6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgLi4uZW50cnksXG4gICAgICAgIGRhdGE6IHsgLi4uZW50cnkuZGF0YSwgX3Nlc3Npb25JZDogb3B0aW9ucy5zZXNzaW9uSWQgfSxcbiAgICAgIH07XG4gICAgICBvcmlnaW5hbEJyb2FkY2FzdChzdGFtcGVkKTtcbiAgICB9O1xuICB9XG4gIGxpdmVNZXRyaWNzT25TbmFwc2hvdCA9IHdlYlJlc3VsdC5tZXRyaWNzT25TbmFwc2hvdDtcblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBJbmdlc3Rpb24gcm91dGVzIG1vdW50ZWQnKTtcblxuICAvLyBTdGFydCBoZWFydGJlYXQgYW5kIHJlZ2lzdGVyIGNsZWFudXBcbiAgY29uc3Qgc3RvcEhlYXJ0YmVhdCA9IHN0YXJ0SGVhcnRiZWF0KGVsZWN0aW9uLmxlYWRlckluZm8pO1xuICByZWdpc3RlckxlYWRlckNsZWFudXAoKTtcblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgc3RhcnRlZCcsIHtcbiAgICBzZXNzaW9uSWQ6IG9wdGlvbnMuc2Vzc2lvbklkLCBwb3J0OiBjb25zb2xlUG9ydCwgcGlkOiBwcm9jZXNzLnBpZCxcbiAgICByb2xlOiAnbGVhZGVyJywgaW5nZXN0Um91dGVzOiBbJy9hcGkvaW5nZXN0L2xvZ3MnLCAnL2FwaS9pbmdlc3QvbWV0cmljcycsICcvYXBpL2luZ2VzdC9zZXNzaW9uJywgJy9hcGkvc2Vzc2lvbnMnXSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICByb2xlOiAnbGVhZGVyJyxcbiAgICBlbGVjdGlvbixcbiAgICBwb3J0OiBjb25zb2xlUG9ydCxcbiAgICBjbGVhbnVwOiBhc3luYyAoKSA9PiB7XG4gICAgICBzdG9wSGVhcnRiZWF0KCk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhcyBhIGZvbGxvd2VyLlxuICogUmVnaXN0ZXJzIGZvcndhcmRpbmcgc2lua3Mgd2l0aCB0aGUgTG9nTWFuYWdlciwgc3RhcnRzIHNlc3Npb24gaGVhcnRiZWF0LlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEFzRm9sbG93ZXIoXG4gIG9wdGlvbnM6IFVuaWZpZWRDb25zb2xlT3B0aW9ucyxcbiAgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0LFxuICBjb25zb2xlUG9ydDogbnVtYmVyID0gREVGQVVMVF9DT05TT0xFX1BPUlQsXG4gIGluaXRpYWxBdXRoVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsLFxuKTogUHJvbWlzZTxVbmlmaWVkQ29uc29sZVJlc3VsdD4ge1xuICBjb25zdCBsZWFkZXJVcmwgPSBgaHR0cDovLzEyNy4wLjAuMToke2VsZWN0aW9uLmxlYWRlckluZm8ucG9ydH1gO1xuXG4gIC8vIFJlYWQgdGhlIGNvbnNvbGUgYXV0aCB0b2tlbiAoIzE3ODApIHdyaXR0ZW4gYnkgdGhlIGxlYWRlci4gTWF5IGJlIG51bGxcbiAgLy8gaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCB5ZXQg4oCUIHRoZSBzaW5rcyBoYW5kbGUgdGhhdCBncmFjZWZ1bGx5IGFuZFxuICAvLyBzaW1wbHkgb21pdCB0aGUgQmVhcmVyIGhlYWRlciwgd2hpY2ggaXMgZmluZSB3aGVuIGF1dGggaXMgbm90IGVuZm9yY2VkLlxuICBsZXQgYXV0aFRva2VuID0gaW5pdGlhbEF1dGhUb2tlbjtcbiAgaWYgKGF1dGhUb2tlbiA9PT0gbnVsbCkge1xuICAgIGNvbnN0IHsgZ2V0UHJpbWFyeVRva2VuRnJvbUZpbGUgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlVG9rZW4uanMnKTtcbiAgICBhdXRoVG9rZW4gPSBhd2FpdCBnZXRQcmltYXJ5VG9rZW5Gcm9tRmlsZShlbnYuRE9MTEhPVVNFX0NPTlNPTEVfVE9LRU5fRklMRSk7XG4gIH1cbiAgaWYgKGF1dGhUb2tlbikge1xuICAgIGxvZ2dlci5kZWJ1ZygnW1VuaWZpZWRDb25zb2xlXSBGb2xsb3dlciBsb2FkZWQgY29uc29sZSBhdXRoIHRva2VuJyk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdbVW5pZmllZENvbnNvbGVdIE5vIGNvbnNvbGUgYXV0aCB0b2tlbiBmaWxlIGZvdW5kOyBmb2xsb3dlciB3aWxsIFBPU1Qgd2l0aG91dCBCZWFyZXIgaGVhZGVyJyk7XG4gIH1cblxuICAvLyBQZXItaW5zdGFuY2UgcHJvbW90aW9uIG1hbmFnZXIg4oCUIHRyYWNrcyBpdHMgb3duIGF0dGVtcHQgY291bnRlciBzb1xuICAvLyBtdWx0aXBsZSBmb2xsb3dlcnMgZG9uJ3QgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlcidzIHByb21vdGlvbiBidWRnZXRzLlxuICBjb25zdCBwcm9tb3Rpb25NZ3IgPSBuZXcgUHJvbW90aW9uTWFuYWdlcihvcHRpb25zLCBjb25zb2xlUG9ydCwgc3RhcnRBc0xlYWRlciwgc3RhcnRBc0ZvbGxvd2VyKTtcblxuICAvLyBEZWNsYXJlIHNlc3Npb25IZWFydGJlYXQgYmVmb3JlIHRoZSBzaW5rIHNvIHRoZSBjbG9zdXJlIGNhbiBjYXB0dXJlIGl0LlxuICAvLyBCb3RoIGFyZSBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGNhbGxiYWNrIGNvdWxkIHBvc3NpYmx5IGZpcmUgKG5lZWRzIDUrIGZhaWxlZCBmbHVzaGVzKS5cbiAgbGV0IHNlc3Npb25IZWFydGJlYXQ6IFNlc3Npb25IZWFydGJlYXQ7XG5cbiAgLy8gUmVnaXN0ZXIgYSBmb3J3YXJkaW5nIGxvZyBzaW5rIHdpdGggbGVhZGVyLWRlYXRoIGNhbGxiYWNrICgjMTg1MCkuXG4gIGNvbnN0IGZvcndhcmRpbmdTaW5rID0gbmV3IExlYWRlckZvcndhcmRpbmdMb2dTaW5rKGxlYWRlclVybCwgb3B0aW9ucy5zZXNzaW9uSWQsIGF1dGhUb2tlbiwgKCkgPT4ge1xuICAgIHByb21vdGlvbk1nci5wcm9tb3RlKGZvcndhcmRpbmdTaW5rLCBzZXNzaW9uSGVhcnRiZWF0KVxuICAgICAgLmNhdGNoKGVyciA9PiBsb2dnZXIuZXJyb3IoJ1tVbmlmaWVkQ29uc29sZV0gUHJvbW90aW9uIGNyYXNoZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KSk7XG4gIH0pO1xuICBvcHRpb25zLnJlZ2lzdGVyTG9nU2luayhmb3J3YXJkaW5nU2luayk7XG5cbiAgLy8gU3RhcnQgc2Vzc2lvbiBoZWFydGJlYXQgdG8gdGhlIGxlYWRlclxuICBzZXNzaW9uSGVhcnRiZWF0ID0gbmV3IFNlc3Npb25IZWFydGJlYXQobGVhZGVyVXJsLCBvcHRpb25zLnNlc3Npb25JZCwgcHJvY2Vzcy5waWQsIGF1dGhUb2tlbik7XG4gIGF3YWl0IHNlc3Npb25IZWFydGJlYXQuc3RhcnQoKTtcblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBGb2xsb3dlciBzdGFydGVkJywge1xuICAgIHNlc3Npb25JZDogb3B0aW9ucy5zZXNzaW9uSWQsIHBpZDogcHJvY2Vzcy5waWQsIHJvbGU6ICdmb2xsb3dlcicsXG4gICAgbGVhZGVyU2Vzc2lvbjogZWxlY3Rpb24ubGVhZGVySW5mby5zZXNzaW9uSWQsIGxlYWRlclBpZDogZWxlY3Rpb24ubGVhZGVySW5mby5waWQsXG4gICAgbGVhZGVyUG9ydDogZWxlY3Rpb24ubGVhZGVySW5mby5wb3J0LCBsZWFkZXJVcmwsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcm9sZTogJ2ZvbGxvd2VyJyxcbiAgICBlbGVjdGlvbixcbiAgICBjbGVhbnVwOiBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXNzaW9uSGVhcnRiZWF0LnN0b3AoKTtcbiAgICAgIGF3YWl0IGZvcndhcmRpbmdTaW5rLmNsb3NlKCk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
590
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pZmllZENvbnNvbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL2NvbnNvbGUvVW5pZmllZENvbnNvbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQU9ILE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLDJCQUEyQixFQUMzQixvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLHFCQUFxQixFQUNyQixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWix3QkFBd0IsRUFDeEIscUJBQXFCLEVBQ3JCLHdCQUF3QixHQUl6QixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsZ0JBQWdCLEdBQ2pCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUNMLGFBQWEsRUFDYix3QkFBd0IsR0FFekIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFMUM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUMsMEJBQTBCLENBQUM7QUFDNUQsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSxtQ0FBbUMsR0FBRyxhQUFhLENBQUM7QUFDMUQsTUFBTSwyQkFBMkIsR0FBRyxLQUFLLENBQUM7QUFF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QVEsQ0FBQyxVQUFVLENBQUMsR0FBRztRQUNoRixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUztLQUNoRCxDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFVBQVU7UUFDaEIsUUFBUTtRQUNSLE9BQU8sRUFBRSxLQUFLLElBQUksRUFBRTtZQUNsQixNQUFNLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlCLE1BQU0sY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9CLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVW5pZmllZCB3ZWIgY29uc29sZSBvcmNoZXN0cmF0b3IuXG4gKlxuICogVGllcyB0b2dldGhlciBsZWFkZXIgZWxlY3Rpb24sIGNvbnNvbGUgc3RhcnR1cCwgZm9sbG93ZXIgd2lyaW5nLFxuICogYW5kIHNlc3Npb24gbGlmZWN5Y2xlIG1hbmFnZW1lbnQuIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnRcbiAqIGNhbGxlZCBieSB0aGUgREkgY29udGFpbmVyIGR1cmluZyBkZWZlcnJlZCBzZXR1cC5cbiAqXG4gKiBGbG93OlxuICogMS4gUnVuIGxlYWRlciBlbGVjdGlvbiAocmVhZCBsb2NrIGZpbGUsIGNsYWltIG9yIGZvbGxvdylcbiAqIDIuIElmIGxlYWRlcjogc3RhcnQgd2ViIHNlcnZlciBvbiBmaXhlZCBwb3J0LCBtb3VudCBpbmdlc3Qgcm91dGVzLCBzdGFydCBoZWFydGJlYXRcbiAqIDMuIElmIGZvbGxvd2VyOiByZWdpc3RlciBmb3J3YXJkaW5nIHNpbmtzIHdpdGggTG9nTWFuYWdlciwgc3RhcnQgc2Vzc2lvbiBoZWFydGJlYXRcbiAqXG4gKiBAc2luY2UgdjIuMS4wIOKAlCBJc3N1ZSAjMTcwMFxuICovXG5cbmltcG9ydCB0eXBlIHsgVW5pZmllZExvZ0VudHJ5IH0gZnJvbSAnLi4vLi4vbG9nZ2luZy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY1NuYXBzaG90IH0gZnJvbSAnLi4vLi4vbWV0cmljcy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUxvZ1NpbmsgfSBmcm9tICcuLi8uLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlNZXRyaWNzU2luayB9IGZyb20gJy4uLy4uL21ldHJpY3Mvc2lua3MvTWVtb3J5TWV0cmljc1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBXZWJTZXJ2ZXJPcHRpb25zLCBXZWJTZXJ2ZXJSZXN1bHQgfSBmcm9tICcuLi9zZXJ2ZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZWxlY3RMZWFkZXIsXG4gIGlzTGVhZGVyV2ViQ29uc29sZVJlYWNoYWJsZSxcbiAgZm9yY2VDbGFpbUxlYWRlcnNoaXAsXG4gIHN0YXJ0SGVhcnRiZWF0LFxuICByZWdpc3RlckxlYWRlckNsZWFudXAsXG4gIGRldGVjdExlZ2FjeUxlYWRlcixcbiAgcmVhZExlYWRlckxvY2ssXG4gIGRlbGV0ZUxlYWRlckxvY2ssXG4gIGNsYWltTGVhZGVyc2hpcCxcbiAgY3JlYXRlTGVhZGVySW5mbyxcbiAgTE9DS19WRVJTSU9OLFxuICBDT05TT0xFX1BST1RPQ09MX1ZFUlNJT04sXG4gIExFR0FDWV9TRVJWRVJfVkVSU0lPTixcbiAgZXZhbHVhdGVMZWFkZXJQcmVmZXJlbmNlLFxuICB0eXBlIEVsZWN0aW9uUmVzdWx0LFxuICB0eXBlIENvbnNvbGVMZWFkZXJJbmZvLFxuICB0eXBlIExlYWRlclByZWZlcmVuY2VEZWNpc2lvbixcbn0gZnJvbSAnLi9MZWFkZXJFbGVjdGlvbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVJbmdlc3RSb3V0ZXMgfSBmcm9tICcuL0luZ2VzdFJvdXRlcy5qcyc7XG5pbXBvcnQge1xuICBMZWFkZXJGb3J3YXJkaW5nTG9nU2luayxcbiAgU2Vzc2lvbkhlYXJ0YmVhdCxcbn0gZnJvbSAnLi9MZWFkZXJGb3J3YXJkaW5nU2luay5qcyc7XG5pbXBvcnQgeyBQcm9tb3Rpb25NYW5hZ2VyIH0gZnJvbSAnLi9Qcm9tb3Rpb25NYW5hZ2VyLmpzJztcbmltcG9ydCB7IENvbnNvbGVUb2tlblN0b3JlIH0gZnJvbSAnLi9jb25zb2xlVG9rZW4uanMnO1xuaW1wb3J0IHtcbiAgZmluZFBpZE9uUG9ydCxcbiAga2lsbFN0YWxlUHJvY2Vzc0RldGFpbGVkLFxuICB0eXBlIEtpbGxTdGFsZVByb2Nlc3NPdXRjb21lLFxufSBmcm9tICcuL1N0YWxlUHJvY2Vzc1JlY292ZXJ5LmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uLy4uL2NvbmZpZy9lbnYuanMnO1xuXG4vKipcbiAqIERlZmF1bHQgY29uc29sZSBwb3J0IGZyb20gdGhlIGVudiB2YXIuIFVzZWQgYXMgZmFsbGJhY2sgd2hlbiBubyBwb3J0XG4gKiBpcyBwcm92aWRlZCB2aWEgY29uZmlnIGZpbGUgb3Igb3B0aW9ucy4gVGhlIHJlc29sdXRpb24gaGllcmFyY2h5IGlzOlxuICogICAxLiBvcHRpb25zLnBvcnQgKGZyb20gY29uZmlnIGZpbGUsIHJlc29sdmVkIGJ5IHRoZSBESSBjb250YWluZXIpXG4gKiAgIDIuIERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUIGVudiB2YXJcbiAqICAgMy4gNDE3MTUgKGhhcmRjb2RlZCBkZWZhdWx0IGluIGVudi50cylcbiAqL1xuY29uc3QgREVGQVVMVF9DT05TT0xFX1BPUlQgPSBlbnYuRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlQ7XG5jb25zdCBMRUdBQ1lfQ09OU09MRV9GQUxMQkFDS19QT1JUID0gMzkzOTtcbmNvbnN0IFNZTlRIRVRJQ19QT1JUX09XTkVSX1NFU1NJT05fUFJFRklYID0gJ3BvcnQtb3duZXItJztcbmNvbnN0IExFQURFUl9ESVNDT1ZFUllfVElNRU9VVF9NUyA9IDJfMDAwO1xuXG5mdW5jdGlvbiBjdXJyZW50VGltZXN0YW1wKCk6IHN0cmluZyB7XG4gIHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgdGhlIHVuaWZpZWQgY29uc29sZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbmlmaWVkQ29uc29sZU9wdGlvbnMge1xuICAvKiogVGhpcyBwcm9jZXNzJ3MgdW5pcXVlIHNlc3Npb24gSUQgKi9cbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgRG9sbGhvdXNlIHNlc3Npb24gaWRlbnRpdHkgc2hvd24gdG8gaHVtYW5zIGFuZCB1c2VkIGZvciBwZXJzaXN0ZW5jZS4gKi9cbiAgc3RhYmxlU2Vzc2lvbklkOiBzdHJpbmc7XG4gIC8qKiBQb3J0Zm9saW8gYmFzZSBkaXJlY3RvcnkgKGZvciBzdGFydFdlYlNlcnZlcikgKi9cbiAgcG9ydGZvbGlvRGlyOiBzdHJpbmc7XG4gIC8qKiBMb2cgbWVtb3J5IHNpbmsgKGZvciBjb25zb2xlIGhpc3RvcnkpICovXG4gIG1lbW9yeVNpbms6IE1lbW9yeUxvZ1Npbms7XG4gIC8qKiBNZXRyaWNzIG1lbW9yeSBzaW5rICovXG4gIG1ldHJpY3NTaW5rPzogTWVtb3J5TWV0cmljc1Npbms7XG4gIC8qKiBNQ1AtQVFMIGhhbmRsZXIgZm9yIHBlcm1pc3Npb24gcm91dGVzICh0eXBlZCBhcyBhbnkgdG8gYXZvaWQgY2lyY3VsYXIgaW1wb3J0cykgKi9cbiAgbWNwQXFsSGFuZGxlcj86IGFueTtcbiAgLyoqIENhbGxiYWNrIHRvIHJlZ2lzdGVyIGEgbG9nIHNpbmsgd2l0aCB0aGUgTG9nTWFuYWdlciAqL1xuICByZWdpc3RlckxvZ1Npbms6IChzaW5rOiB7IHdyaXRlKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpOiB2b2lkOyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+OyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IH0pID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB0byB3aXJlIFNTRSBicm9hZGNhc3RzIGFmdGVyIHdlYiBzZXJ2ZXIgc3RhcnRzICovXG4gIHdpcmVTU0VCcm9hZGNhc3RzOiAod2ViUmVzdWx0OiB7IGxvZ0Jyb2FkY2FzdD86IChlbnRyeTogVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkOyBtZXRyaWNzT25TbmFwc2hvdD86IChzbmFwc2hvdDogTWV0cmljU25hcHNob3QpID0+IHZvaWQgfSwgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaykgPT4gdm9pZDtcbiAgLyoqIENvbnNvbGUgcG9ydCBvdmVycmlkZSBmcm9tIGNvbmZpZyBmaWxlLiBGYWxscyBiYWNrIHRvIGVudiB2YXIgaWYgbm90IHByb3ZpZGVkLiAqL1xuICBwb3J0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBzdGFydGluZyB0aGUgdW5pZmllZCBjb25zb2xlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaWZpZWRDb25zb2xlUmVzdWx0IHtcbiAgcm9sZTogJ2xlYWRlcicgfCAnZm9sbG93ZXInO1xuICBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQ7XG4gIC8qKiBQb3J0IHRoZSBjb25zb2xlIGlzIHJ1bm5pbmcgb24gKGxlYWRlciBvbmx5KSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogQ2xlYW51cCBmdW5jdGlvbiB0byBjYWxsIG9uIHNodXRkb3duICovXG4gIGNsZWFudXA6ICgpID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQ2hlY2sgZm9yIGEgcnVubmluZyBsZWdhY3kgKHByZS1hdXRoZW50aWNhdGlvbikgRG9sbGhvdXNlTUNQIGNvbnNvbGUgYW5kXG4gKiBsb2cgYSBXQVJOLWxldmVsIG1lc3NhZ2UgaWYgb25lIGlzIGZvdW5kICgjMTc5NCkuXG4gKlxuICogRXh0cmFjdGVkIGZyb20gYHN0YXJ0VW5pZmllZENvbnNvbGVgIHNvIHRoZSB3aXJpbmcgY2FuIGJlIGludGVncmF0aW9uLVxuICogdGVzdGVkIGluIGlzb2xhdGlvbiB3aXRob3V0IHNwaW5uaW5nIHVwIGEgZnVsbCB3ZWIgc2VydmVyIGFuZCBsZWFkZXJcbiAqIGVsZWN0aW9uLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgZmlyZS1hbmQtZm9yZ2V0OiBkZXRlY3Rpb24gZmFpbHVyZXNcbiAqIGFyZSBsb2dnZWQgYXQgREVCVUcgYW5kIG5ldmVyIHByb3BhZ2F0ZSwgYmVjYXVzZSBhIGZhaWx1cmUgaGVyZSBtdXN0XG4gKiBub3QgYmxvY2sgbGVhZGVyIGVsZWN0aW9uIG9mIHRoZSBhdXRoZW50aWNhdGVkIGNvbnNvbGUuXG4gKlxuICogQHBhcmFtIGN1cnJlbnRQb3J0IC0gVGhlIHBvcnQgdGhlIGF1dGhlbnRpY2F0ZWQgY29uc29sZSBpbnRlbmRzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICBiaW5kIHRvLiBVc2VkIGluIHRoZSB3YXJuaW5nIG1lc3NhZ2UgdG8gaGVscCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgIHVzZXIgdGVsbCB0aGUgdHdvIGNvbnNvbGVzIGFwYXJ0LlxuICogQHBhcmFtIGRldGVjdCAgICAgIC0gT3B0aW9uYWwgaW5qZWN0aW9uIHBvaW50IGZvciB0aGUgZGV0ZWN0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4gRGVmYXVsdHMgdG8gYGRldGVjdExlZ2FjeUxlYWRlcmAuIFRlc3RzXG4gKiAgICAgICAgICAgICAgICAgICAgICBwYXNzIGEgc3R1Yi5cbiAqIEBwYXJhbSBsb2cgICAgICAgICAtIE9wdGlvbmFsIGluamVjdGlvbiBwb2ludCBmb3IgdGhlIGxvZ2dlci4gRGVmYXVsdHNcbiAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBtb2R1bGUgbG9nZ2VyLiBUZXN0cyBwYXNzIGEgc3B5LlxuICogQHJldHVybnMgVGhlIGxlZ2FjeSBsZWFkZXIgaW5mbyBmcm9tIGBkZXRlY3QoKWAsIG9yIG51bGwgaWYgZGV0ZWN0aW9uXG4gKiAgICAgICAgICB0aHJldy4gRXhwb3NlZCBzbyB0ZXN0cyBjYW4gYXNzZXJ0IHRoZSBmdWxsIHJlc3VsdCBzaGFwZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhcm5JZkxlZ2FjeUNvbnNvbGVQcmVzZW50KFxuICBjdXJyZW50UG9ydDogbnVtYmVyLFxuICBkZXRlY3Q6IHR5cGVvZiBkZXRlY3RMZWdhY3lMZWFkZXIgPSBkZXRlY3RMZWdhY3lMZWFkZXIsXG4gIGxvZzogdHlwZW9mIGxvZ2dlciA9IGxvZ2dlcixcbik6IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBkZXRlY3RMZWdhY3lMZWFkZXI+PiB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBsZWdhY3kgPSBhd2FpdCBkZXRlY3QoKTtcbiAgICBpZiAobGVnYWN5LmxlZ2FjeVJ1bm5pbmcpIHtcbiAgICAgIGxvZy53YXJuKFxuICAgICAgICBgW1VuaWZpZWRDb25zb2xlXSBMZWdhY3kgKHByZS1hdXRoZW50aWNhdGlvbikgRG9sbGhvdXNlTUNQIGNvbnNvbGUgZGV0ZWN0ZWQgYCArXG4gICAgICAgIGAocGlkPSR7bGVnYWN5LnBpZH0sIHBvcnQ9JHtsZWdhY3kucG9ydH0pLiBCb3RoIGNvbnNvbGVzIHdpbGwgcnVuIGAgK1xuICAgICAgICBgaW5kZXBlbmRlbnRseSBvbiBkaWZmZXJlbnQgcG9ydHMgd2l0aCBkaWZmZXJlbnQgc2VjdXJpdHkgcG9zdHVyZS4gYCArXG4gICAgICAgIGBUaGUgYXV0aGVudGljYXRlZCBjb25zb2xlICh0aGlzIHByb2Nlc3MpIHVzZXMgcG9ydCAke2N1cnJlbnRQb3J0fTsgYCArXG4gICAgICAgIGB0aGUgbGVnYWN5IGNvbnNvbGUgdXNlcyBwb3J0ICR7bGVnYWN5LnBvcnQgPz8gTEVHQUNZX0NPTlNPTEVfRkFMTEJBQ0tfUE9SVH0uIGAgK1xuICAgICAgICBgRm9yIGNvbnNpc3RlbnQgc2VjdXJpdHksIHVwZGF0ZSB0aGUgbGVnYWN5IGluc3RhbGxhdGlvbiB0byBhIGAgK1xuICAgICAgICBgdmVyc2lvbiB3aXRoIHRoZSBhdXRoZW50aWNhdGVkIGNvbnNvbGUuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBsZWdhY3k7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIEJlc3QtZWZmb3J0IOKAlCBuZXZlciBibG9jayBlbGVjdGlvbiBvbiBhIGRldGVjdGlvbiBmYWlsdXJlXG4gICAgbG9nLmRlYnVnKCdbVW5pZmllZENvbnNvbGVdIExlZ2FjeSBsZWFkZXIgZGV0ZWN0aW9uIGZhaWxlZCcsIHtcbiAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFNlc3Npb25BcGlSZWNvcmQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgcGlkOiBudW1iZXI7XG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcbiAgbGFzdEhlYXJ0YmVhdD86IHN0cmluZztcbiAgc3RhdHVzPzogc3RyaW5nO1xuICBpc0xlYWRlcj86IGJvb2xlYW47XG4gIGtpbmQ/OiBzdHJpbmc7XG4gIHNlcnZlclZlcnNpb24/OiBzdHJpbmc7XG4gIGNvbnNvbGVQcm90b2NvbFZlcnNpb24/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9ydExlYWRlckRpc2NvdmVyeSB7XG4gIGxlYWRlckluZm86IENvbnNvbGVMZWFkZXJJbmZvIHwgbnVsbDtcbiAgb3duZXJQaWQ6IG51bWJlciB8IG51bGw7XG4gIHNvdXJjZTogJ2FwaScgfCAnbG9jaycgfCAnc3ludGhldGljJyB8ICdub25lJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCaW5kRmFpbHVyZVJlY292ZXJ5UmVzdWx0IGV4dGVuZHMgUG9ydExlYWRlckRpc2NvdmVyeSB7XG4gIGxvY2tDbGVhbnVwQXR0ZW1wdGVkOiBib29sZWFuO1xuICBsb2NrQ2xlYW51cFBlcmZvcm1lZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3J0T3duZXJSZXBsYWNlbWVudERlY2lzaW9uIHtcbiAgc2hvdWxkRXZpY3Q6IGJvb2xlYW47XG4gIG93bmVyUGlkOiBudW1iZXIgfCBudWxsO1xuICBwcmVmZXJlbmNlOiBMZWFkZXJQcmVmZXJlbmNlRGVjaXNpb24gfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgRm9yY2VUYWtlb3ZlckF0dGVtcHRSZXN1bHQge1xuICB3ZWJSZXN1bHQ6IFdlYlNlcnZlclJlc3VsdDtcbiAgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0O1xuICBmYWxsYmFjazogUG9ydExlYWRlckRpc2NvdmVyeTtcbiAgcmVwbGFjZW1lbnQ6IFBvcnRPd25lclJlcGxhY2VtZW50RGVjaXNpb247XG4gIGZvcmNlZEtpbGw6IEtpbGxTdGFsZVByb2Nlc3NPdXRjb21lIHwgbnVsbDtcbiAgdGFrZW92ZXJBdHRlbXB0ZWQ6IGJvb2xlYW47XG4gIHJlYm91bmRMb2NrQ2xhaW1lZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEZvbGxvd2VyQXV0aG9yaXR5UmVzb2x1dGlvbiB7XG4gIGVsZWN0aW9uOiBFbGVjdGlvblJlc3VsdDtcbiAgZGlzY292ZXJ5OiBQb3J0TGVhZGVyRGlzY292ZXJ5IHwgbnVsbDtcbiAgcmVwbGFjZW1lbnQ6IFBvcnRPd25lclJlcGxhY2VtZW50RGVjaXNpb24gfCBudWxsO1xuICBmb3JjZWRDbGFpbTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEZvbGxvd2VyQXV0aG9yaXR5RGVwZW5kZW5jaWVzIHtcbiAgaXNMZWFkZXJXZWJDb25zb2xlUmVhY2hhYmxlSW1wbD86IHR5cGVvZiBpc0xlYWRlcldlYkNvbnNvbGVSZWFjaGFibGU7XG4gIGRpc2NvdmVyTGVhZGVyU2VydmluZ1BvcnRJbXBsPzogdHlwZW9mIGRpc2NvdmVyTGVhZGVyU2VydmluZ1BvcnQ7XG4gIGZvcmNlQ2xhaW1MZWFkZXJzaGlwSW1wbD86IHR5cGVvZiBmb3JjZUNsYWltTGVhZGVyc2hpcDtcbiAgZGVsZXRlTGVhZGVyTG9ja0ltcGw/OiB0eXBlb2YgZGVsZXRlTGVhZGVyTG9jaztcbn1cblxuaW50ZXJmYWNlIERpc2NvdmVyeURlcGVuZGVuY2llcyB7XG4gIGZldGNoSW1wbD86IHR5cGVvZiBmZXRjaDtcbiAgZmluZFBpZE9uUG9ydEltcGw/OiB0eXBlb2YgZmluZFBpZE9uUG9ydDtcbiAgcmVhZExlYWRlckxvY2tJbXBsPzogdHlwZW9mIHJlYWRMZWFkZXJMb2NrO1xufVxuXG5mdW5jdGlvbiBidWlsZERpc2NvdmVyeUhlYWRlcnMoYXV0aFRva2VuOiBzdHJpbmcgfCBudWxsKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiBhdXRoVG9rZW4gPyB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthdXRoVG9rZW59YCB9IDoge307XG59XG5cbmZ1bmN0aW9uIGJ1aWxkTGVhZGVySW5mb0Zyb21TZXNzaW9uKHBvcnQ6IG51bWJlciwgb3duZXJQaWQ6IG51bWJlciwgbGVhZGVyU2Vzc2lvbjogU2Vzc2lvbkFwaVJlY29yZCk6IENvbnNvbGVMZWFkZXJJbmZvIHtcbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiBMT0NLX1ZFUlNJT04sXG4gICAgcGlkOiBvd25lclBpZCxcbiAgICBwb3J0LFxuICAgIHNlc3Npb25JZDogVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobGVhZGVyU2Vzc2lvbi5zZXNzaW9uSWQpLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgIHN0YXJ0ZWRBdDogbGVhZGVyU2Vzc2lvbi5zdGFydGVkQXQgPz8gY3VycmVudFRpbWVzdGFtcCgpLFxuICAgIGhlYXJ0YmVhdDogbGVhZGVyU2Vzc2lvbi5sYXN0SGVhcnRiZWF0ID8/IGN1cnJlbnRUaW1lc3RhbXAoKSxcbiAgICBzZXJ2ZXJWZXJzaW9uOiBsZWFkZXJTZXNzaW9uLnNlcnZlclZlcnNpb24gPz8gTEVHQUNZX1NFUlZFUl9WRVJTSU9OLFxuICAgIGNvbnNvbGVQcm90b2NvbFZlcnNpb246IGxlYWRlclNlc3Npb24uY29uc29sZVByb3RvY29sVmVyc2lvbiA/PyBDT05TT0xFX1BST1RPQ09MX1ZFUlNJT04sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3ludGhldGljTGVhZGVySW5mbyhwb3J0OiBudW1iZXIsIG93bmVyUGlkOiBudW1iZXIpOiBDb25zb2xlTGVhZGVySW5mbyB7XG4gIGNvbnN0IG5vdyA9IGN1cnJlbnRUaW1lc3RhbXAoKTtcbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiBMT0NLX1ZFUlNJT04sXG4gICAgcGlkOiBvd25lclBpZCxcbiAgICBwb3J0LFxuICAgIHNlc3Npb25JZDogYCR7U1lOVEhFVElDX1BPUlRfT1dORVJfU0VTU0lPTl9QUkVGSVh9JHtvd25lclBpZH1gLFxuICAgIHN0YXJ0ZWRBdDogbm93LFxuICAgIGhlYXJ0YmVhdDogbm93LFxuICAgIHNlcnZlclZlcnNpb246IExFR0FDWV9TRVJWRVJfVkVSU0lPTixcbiAgICBjb25zb2xlUHJvdG9jb2xWZXJzaW9uOiBDT05TT0xFX1BST1RPQ09MX1ZFUlNJT04sXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRpc2NvdmVyTGVhZGVyVmlhU2Vzc2lvbnNBcGkoXG4gIHBvcnQ6IG51bWJlcixcbiAgb3duZXJQaWQ6IG51bWJlcixcbiAgYXV0aFRva2VuOiBzdHJpbmcgfCBudWxsLFxuICBmZXRjaEltcGw6IHR5cGVvZiBmZXRjaCxcbik6IFByb21pc2U8Q29uc29sZUxlYWRlckluZm8gfCBudWxsPiB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgTEVBREVSX0RJU0NPVkVSWV9USU1FT1VUX01TKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hJbXBsKGBodHRwOi8vMTI3LjAuMC4xOiR7cG9ydH0vYXBpL3Nlc3Npb25zYCwge1xuICAgICAgaGVhZGVyczogYnVpbGREaXNjb3ZlcnlIZWFkZXJzKGF1dGhUb2tlbiksXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgeyBzZXNzaW9ucz86IFNlc3Npb25BcGlSZWNvcmRbXSB9O1xuICAgIGNvbnN0IHNlc3Npb25zID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLnNlc3Npb25zKSA/IHBheWxvYWQuc2Vzc2lvbnMgOiBbXTtcbiAgICBjb25zdCBsZWFkZXJTZXNzaW9uID0gc2Vzc2lvbnMuZmluZCgoc2Vzc2lvbikgPT5cbiAgICAgIHNlc3Npb24ucGlkID09PSBvd25lclBpZCAmJlxuICAgICAgc2Vzc2lvbi5pc0xlYWRlciA9PT0gdHJ1ZSAmJlxuICAgICAgc2Vzc2lvbi5raW5kID09PSAnbWNwJyAmJlxuICAgICAgc2Vzc2lvbi5zdGF0dXMgIT09ICdzdG9wcGVkJ1xuICAgICk7XG4gICAgcmV0dXJuIGxlYWRlclNlc3Npb24gPyBidWlsZExlYWRlckluZm9Gcm9tU2Vzc2lvbihwb3J0LCBvd25lclBpZCwgbGVhZGVyU2Vzc2lvbikgOiBudWxsO1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlzY292ZXJMZWFkZXJTZXJ2aW5nUG9ydChcbiAgcG9ydDogbnVtYmVyLFxuICBhdXRoVG9rZW46IHN0cmluZyB8IG51bGwsXG4gIGRlcHM6IERpc2NvdmVyeURlcGVuZGVuY2llcyA9IHt9LFxuKTogUHJvbWlzZTxQb3J0TGVhZGVyRGlzY292ZXJ5PiB7XG4gIGNvbnN0IGZldGNoSW1wbCA9IGRlcHMuZmV0Y2hJbXBsID8/IGZldGNoO1xuICBjb25zdCBmaW5kUGlkT25Qb3J0SW1wbCA9IGRlcHMuZmluZFBpZE9uUG9ydEltcGwgPz8gZmluZFBpZE9uUG9ydDtcbiAgY29uc3QgcmVhZExlYWRlckxvY2tJbXBsID0gZGVwcy5yZWFkTGVhZGVyTG9ja0ltcGwgPz8gcmVhZExlYWRlckxvY2s7XG4gIGNvbnN0IG93bmVyUGlkID0gYXdhaXQgZmluZFBpZE9uUG9ydEltcGwocG9ydCk7XG5cbiAgaWYgKG93bmVyUGlkICE9PSBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxlYWRlckluZm8gPSBhd2FpdCBkaXNjb3ZlckxlYWRlclZpYVNlc3Npb25zQXBpKHBvcnQsIG93bmVyUGlkLCBhdXRoVG9rZW4sIGZldGNoSW1wbCk7XG4gICAgICBpZiAobGVhZGVySW5mbykge1xuICAgICAgICByZXR1cm4geyBvd25lclBpZCwgc291cmNlOiAnYXBpJywgbGVhZGVySW5mbyB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdbVW5pZmllZENvbnNvbGVdIEZhaWxlZCB0byBxdWVyeSBhY3RpdmUgbGVhZGVyIHNlc3Npb25zJywge1xuICAgICAgICBwb3J0LFxuICAgICAgICBvd25lclBpZCxcbiAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvY2sgPSBhd2FpdCByZWFkTGVhZGVyTG9ja0ltcGwoKTtcbiAgaWYgKGxvY2s/LnBvcnQgPT09IHBvcnQgJiYgKG93bmVyUGlkID09PSBudWxsIHx8IGxvY2sucGlkID09PSBvd25lclBpZCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3duZXJQaWQ6IG93bmVyUGlkID8/IGxvY2sucGlkLFxuICAgICAgc291cmNlOiAnbG9jaycsXG4gICAgICBsZWFkZXJJbmZvOiB7XG4gICAgICAgIC4uLmxvY2ssXG4gICAgICAgIHNlc3Npb25JZDogVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobG9jay5zZXNzaW9uSWQpLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKG93bmVyUGlkICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG93bmVyUGlkLFxuICAgICAgc291cmNlOiAnc3ludGhldGljJyxcbiAgICAgIGxlYWRlckluZm86IGJ1aWxkU3ludGhldGljTGVhZGVySW5mbyhwb3J0LCBvd25lclBpZCksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGxlYWRlckluZm86IG51bGwsIG93bmVyUGlkOiBudWxsLCBzb3VyY2U6ICdub25lJyB9O1xufVxuXG5pbnRlcmZhY2UgQmluZEZhaWx1cmVSZWNvdmVyeURlcGVuZGVuY2llcyBleHRlbmRzIERpc2NvdmVyeURlcGVuZGVuY2llcyB7XG4gIGRlbGV0ZUxlYWRlckxvY2tJbXBsPzogdHlwZW9mIGRlbGV0ZUxlYWRlckxvY2s7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvdmVyTGVhZGVyQmluZEZhaWx1cmUoXG4gIHByb3Zpc2lvbmFsTGVhZGVyOiBDb25zb2xlTGVhZGVySW5mbyxcbiAgcG9ydDogbnVtYmVyLFxuICBhdXRoVG9rZW46IHN0cmluZyB8IG51bGwsXG4gIGRlcHM6IEJpbmRGYWlsdXJlUmVjb3ZlcnlEZXBlbmRlbmNpZXMgPSB7fSxcbik6IFByb21pc2U8QmluZEZhaWx1cmVSZWNvdmVyeVJlc3VsdD4ge1xuICBjb25zdCByZWFkTGVhZGVyTG9ja0ltcGwgPSBkZXBzLnJlYWRMZWFkZXJMb2NrSW1wbCA/PyByZWFkTGVhZGVyTG9jaztcbiAgY29uc3QgZGVsZXRlTGVhZGVyTG9ja0ltcGwgPSBkZXBzLmRlbGV0ZUxlYWRlckxvY2tJbXBsID8/IGRlbGV0ZUxlYWRlckxvY2s7XG4gIGxvZ2dlci5pbmZvKCdbVW5pZmllZENvbnNvbGVdIExlYWRlciBiaW5kIHJlY292ZXJ5IGluaXRpYXRlZCcsIHtcbiAgICBwcm92aXNpb25hbFNlc3Npb25JZDogcHJvdmlzaW9uYWxMZWFkZXIuc2Vzc2lvbklkLFxuICAgIHByb3Zpc2lvbmFsUGlkOiBwcm92aXNpb25hbExlYWRlci5waWQsXG4gICAgcG9ydCxcbiAgfSk7XG5cbiAgbGV0IGZhbGxiYWNrID0gYXdhaXQgZGlzY292ZXJMZWFkZXJTZXJ2aW5nUG9ydChwb3J0LCBhdXRoVG9rZW4sIGRlcHMpO1xuICBsZXQgbG9ja0NsZWFudXBBdHRlbXB0ZWQgPSBmYWxzZTtcbiAgbGV0IGxvY2tDbGVhbnVwUGVyZm9ybWVkID0gZmFsc2U7XG4gIGNvbnN0IGN1cnJlbnRMb2NrID0gYXdhaXQgcmVhZExlYWRlckxvY2tJbXBsKCk7XG4gIGNvbnN0IHByb3Zpc2lvbmFsTG9ja01hdGNoZXMgPSAoXG4gICAgY3VycmVudExvY2s/LnBpZCA9PT0gcHJvdmlzaW9uYWxMZWFkZXIucGlkICYmXG4gICAgY3VycmVudExvY2sucG9ydCA9PT0gcHJvdmlzaW9uYWxMZWFkZXIucG9ydCAmJlxuICAgIGN1cnJlbnRMb2NrLnNlc3Npb25JZCA9PT0gcHJvdmlzaW9uYWxMZWFkZXIuc2Vzc2lvbklkXG4gICk7XG4gIGNvbnN0IGZhbGxiYWNrUG9pbnRzVG9Qcm92aXNpb25hbExlYWRlciA9IChcbiAgICBmYWxsYmFjay5sZWFkZXJJbmZvPy5waWQgPT09IHByb3Zpc2lvbmFsTGVhZGVyLnBpZCAmJlxuICAgIGZhbGxiYWNrLmxlYWRlckluZm8ucG9ydCA9PT0gcHJvdmlzaW9uYWxMZWFkZXIucG9ydCAmJlxuICAgIGZhbGxiYWNrLmxlYWRlckluZm8uc2Vzc2lvbklkID09PSBwcm92aXNpb25hbExlYWRlci5zZXNzaW9uSWRcbiAgKTtcblxuICBpZiAocHJvdmlzaW9uYWxMb2NrTWF0Y2hlcykge1xuICAgIGxvY2tDbGVhbnVwQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICBhd2FpdCBkZWxldGVMZWFkZXJMb2NrSW1wbCgpO1xuICAgIGxvY2tDbGVhbnVwUGVyZm9ybWVkID0gdHJ1ZTtcbiAgICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBSZW1vdmVkIHByb3Zpc2lvbmFsIGxlYWRlciBsb2NrIGFmdGVyIGJpbmQgZmFpbHVyZScsIHtcbiAgICAgIHByb3Zpc2lvbmFsU2Vzc2lvbklkOiBwcm92aXNpb25hbExlYWRlci5zZXNzaW9uSWQsXG4gICAgICBwcm92aXNpb25hbFBpZDogcHJvdmlzaW9uYWxMZWFkZXIucGlkLFxuICAgICAgcG9ydCxcbiAgICB9KTtcbiAgICBpZiAoZmFsbGJhY2tQb2ludHNUb1Byb3Zpc2lvbmFsTGVhZGVyKSB7XG4gICAgICBmYWxsYmFjayA9IGF3YWl0IGRpc2NvdmVyTGVhZGVyU2VydmluZ1BvcnQocG9ydCwgYXV0aFRva2VuLCBkZXBzKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgYmluZCByZWNvdmVyeSBjb21wbGV0ZWQnLCB7XG4gICAgcHJvdmlzaW9uYWxTZXNzaW9uSWQ6IHByb3Zpc2lvbmFsTGVhZGVyLnNlc3Npb25JZCxcbiAgICBwcm92aXNpb25hbFBpZDogcHJvdmlzaW9uYWxMZWFkZXIucGlkLFxuICAgIHBvcnQsXG4gICAgZGlzY292ZXJ5U291cmNlOiBmYWxsYmFjay5zb3VyY2UsXG4gICAgb3duZXJQaWQ6IGZhbGxiYWNrLm93bmVyUGlkLFxuICAgIGxvY2tDbGVhbnVwQXR0ZW1wdGVkLFxuICAgIGxvY2tDbGVhbnVwUGVyZm9ybWVkLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLmZhbGxiYWNrLFxuICAgIGxvY2tDbGVhbnVwQXR0ZW1wdGVkLFxuICAgIGxvY2tDbGVhbnVwUGVyZm9ybWVkLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZhbHVhdGVQb3J0T3duZXJSZXBsYWNlbWVudChcbiAgY2FuZGlkYXRlTGVhZGVyOiBDb25zb2xlTGVhZGVySW5mbyxcbiAgZmFsbGJhY2s6IFBvcnRMZWFkZXJEaXNjb3ZlcnksXG4pOiBQb3J0T3duZXJSZXBsYWNlbWVudERlY2lzaW9uIHtcbiAgaWYgKCFmYWxsYmFjay5sZWFkZXJJbmZvIHx8IGZhbGxiYWNrLm93bmVyUGlkID09PSBudWxsIHx8IGZhbGxiYWNrLm93bmVyUGlkID09PSBjYW5kaWRhdGVMZWFkZXIucGlkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNob3VsZEV2aWN0OiBmYWxzZSxcbiAgICAgIG93bmVyUGlkOiBmYWxsYmFjay5vd25lclBpZCxcbiAgICAgIHByZWZlcmVuY2U6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHByZWZlcmVuY2UgPSBldmFsdWF0ZUxlYWRlclByZWZlcmVuY2UoY2FuZGlkYXRlTGVhZGVyLCBmYWxsYmFjay5sZWFkZXJJbmZvKTtcbiAgcmV0dXJuIHtcbiAgICBzaG91bGRFdmljdDogcHJlZmVyZW5jZS5zaG91bGRSZXBsYWNlLFxuICAgIG93bmVyUGlkOiBmYWxsYmFjay5vd25lclBpZCxcbiAgICBwcmVmZXJlbmNlLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgY29uc29sZVBvcnQ6IG51bWJlcixcbiAgcHJvdmlzaW9uYWxMZWFkZXI6IENvbnNvbGVMZWFkZXJJbmZvLFxuICBiaW5kUmVzdWx0OiBXZWJTZXJ2ZXJSZXN1bHRbJ2JpbmRSZXN1bHQnXSxcbiAgZmFsbGJhY2s6IFBvcnRMZWFkZXJEaXNjb3ZlcnksXG4gIHJlcGxhY2VtZW50PzogUG9ydE93bmVyUmVwbGFjZW1lbnREZWNpc2lvbixcbiAgZm9yY2VkS2lsbD86IEtpbGxTdGFsZVByb2Nlc3NPdXRjb21lIHwgbnVsbCxcbikge1xuICByZXR1cm4ge1xuICAgIHBvcnQ6IGNvbnNvbGVQb3J0LFxuICAgIGJpbmRFcnJvcjogYmluZFJlc3VsdD8uZXJyb3IsXG4gICAgYmluZERldGFpbDogYmluZFJlc3VsdD8uZGV0YWlsLFxuICAgIHByb3Zpc2lvbmFsTGVhZGVyUGlkOiBwcm92aXNpb25hbExlYWRlci5waWQsXG4gICAgcHJvdmlzaW9uYWxMZWFkZXJTZXNzaW9uSWQ6IHByb3Zpc2lvbmFsTGVhZGVyLnNlc3Npb25JZCxcbiAgICBwcm92aXNpb25hbExlYWRlclZlcnNpb246IHByb3Zpc2lvbmFsTGVhZGVyLnNlcnZlclZlcnNpb24gPz8gTEVHQUNZX1NFUlZFUl9WRVJTSU9OLFxuICAgIHByb3Zpc2lvbmFsTGVhZGVyUHJvdG9jb2xWZXJzaW9uOiBwcm92aXNpb25hbExlYWRlci5jb25zb2xlUHJvdG9jb2xWZXJzaW9uID8/IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgICBmYWxsYmFja093bmVyUGlkOiBmYWxsYmFjay5vd25lclBpZCxcbiAgICBmYWxsYmFja1NvdXJjZTogZmFsbGJhY2suc291cmNlLFxuICAgIGZhbGxiYWNrTGVhZGVyUGlkOiBmYWxsYmFjay5sZWFkZXJJbmZvPy5waWQsXG4gICAgZmFsbGJhY2tMZWFkZXJTZXNzaW9uSWQ6IGZhbGxiYWNrLmxlYWRlckluZm8/LnNlc3Npb25JZCxcbiAgICBmYWxsYmFja0xlYWRlclZlcnNpb246IGZhbGxiYWNrLmxlYWRlckluZm8/LnNlcnZlclZlcnNpb24gPz8gTEVHQUNZX1NFUlZFUl9WRVJTSU9OLFxuICAgIGZhbGxiYWNrTGVhZGVyUHJvdG9jb2xWZXJzaW9uOiBmYWxsYmFjay5sZWFkZXJJbmZvPy5jb25zb2xlUHJvdG9jb2xWZXJzaW9uID8/IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgICByZXBsYWNlbWVudFNob3VsZEV2aWN0OiByZXBsYWNlbWVudD8uc2hvdWxkRXZpY3QgPz8gZmFsc2UsXG4gICAgcmVwbGFjZW1lbnRSZWFzb246IHJlcGxhY2VtZW50Py5wcmVmZXJlbmNlPy5yZWFzb24sXG4gICAgZm9yY2VkS2lsbFJlYXNvbjogZm9yY2VkS2lsbD8ucmVhc29uLFxuICAgIGZvcmNlZEtpbGxQaWQ6IGZvcmNlZEtpbGw/LnBpZCxcbiAgICBmb3JjZWRLaWxsRGV0YWlsOiBmb3JjZWRLaWxsPy5kZXRhaWwsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQXV0aG9yaXR5UmVzb2x1dGlvbkxvZ0NvbnRleHQoXG4gIGNvbnNvbGVQb3J0OiBudW1iZXIsXG4gIGVsZWN0ZWRMZWFkZXI6IENvbnNvbGVMZWFkZXJJbmZvLFxuICBkaXNjb3Zlcnk6IFBvcnRMZWFkZXJEaXNjb3ZlcnkgfCBudWxsLFxuICByZXBsYWNlbWVudDogUG9ydE93bmVyUmVwbGFjZW1lbnREZWNpc2lvbiB8IG51bGwsXG4pIHtcbiAgcmV0dXJuIHtcbiAgICBwb3J0OiBjb25zb2xlUG9ydCxcbiAgICBlbGVjdGVkTGVhZGVyUGlkOiBlbGVjdGVkTGVhZGVyLnBpZCxcbiAgICBlbGVjdGVkTGVhZGVyU2Vzc2lvbklkOiBlbGVjdGVkTGVhZGVyLnNlc3Npb25JZCxcbiAgICBlbGVjdGVkTGVhZGVyVmVyc2lvbjogZWxlY3RlZExlYWRlci5zZXJ2ZXJWZXJzaW9uID8/IExFR0FDWV9TRVJWRVJfVkVSU0lPTixcbiAgICBlbGVjdGVkTGVhZGVyUHJvdG9jb2xWZXJzaW9uOiBlbGVjdGVkTGVhZGVyLmNvbnNvbGVQcm90b2NvbFZlcnNpb24gPz8gQ09OU09MRV9QUk9UT0NPTF9WRVJTSU9OLFxuICAgIHNlcnZpbmdPd25lclBpZDogZGlzY292ZXJ5Py5vd25lclBpZCA/PyBudWxsLFxuICAgIHNlcnZpbmdTb3VyY2U6IGRpc2NvdmVyeT8uc291cmNlID8/ICdub25lJyxcbiAgICBzZXJ2aW5nTGVhZGVyUGlkOiBkaXNjb3Zlcnk/LmxlYWRlckluZm8/LnBpZCA/PyBudWxsLFxuICAgIHNlcnZpbmdMZWFkZXJTZXNzaW9uSWQ6IGRpc2NvdmVyeT8ubGVhZGVySW5mbz8uc2Vzc2lvbklkID8/IG51bGwsXG4gICAgc2VydmluZ0xlYWRlclZlcnNpb246IGRpc2NvdmVyeT8ubGVhZGVySW5mbz8uc2VydmVyVmVyc2lvbiA/PyBMRUdBQ1lfU0VSVkVSX1ZFUlNJT04sXG4gICAgc2VydmluZ0xlYWRlclByb3RvY29sVmVyc2lvbjogZGlzY292ZXJ5Py5sZWFkZXJJbmZvPy5jb25zb2xlUHJvdG9jb2xWZXJzaW9uID8/IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgICByZXBsYWNlbWVudFNob3VsZEV2aWN0OiByZXBsYWNlbWVudD8uc2hvdWxkRXZpY3QgPz8gZmFsc2UsXG4gICAgcmVwbGFjZW1lbnRSZWFzb246IHJlcGxhY2VtZW50Py5wcmVmZXJlbmNlPy5yZWFzb24gPz8gbnVsbCxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVGb2xsb3dlckF1dGhvcml0eShcbiAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gIGNvbnNvbGVQb3J0OiBudW1iZXIsXG4gIGVsZWN0aW9uOiBFbGVjdGlvblJlc3VsdCxcbiAgZGVwczogRm9sbG93ZXJBdXRob3JpdHlEZXBlbmRlbmNpZXMgPSB7fSxcbik6IFByb21pc2U8Rm9sbG93ZXJBdXRob3JpdHlSZXNvbHV0aW9uPiB7XG4gIGNvbnN0IGlzTGVhZGVyV2ViQ29uc29sZVJlYWNoYWJsZUltcGwgPSBkZXBzLmlzTGVhZGVyV2ViQ29uc29sZVJlYWNoYWJsZUltcGwgPz8gaXNMZWFkZXJXZWJDb25zb2xlUmVhY2hhYmxlO1xuICBjb25zdCBkaXNjb3ZlckxlYWRlclNlcnZpbmdQb3J0SW1wbCA9IGRlcHMuZGlzY292ZXJMZWFkZXJTZXJ2aW5nUG9ydEltcGwgPz8gZGlzY292ZXJMZWFkZXJTZXJ2aW5nUG9ydDtcbiAgY29uc3QgZm9yY2VDbGFpbUxlYWRlcnNoaXBJbXBsID0gZGVwcy5mb3JjZUNsYWltTGVhZGVyc2hpcEltcGwgPz8gZm9yY2VDbGFpbUxlYWRlcnNoaXA7XG4gIGNvbnN0IGRlbGV0ZUxlYWRlckxvY2tJbXBsID0gZGVwcy5kZWxldGVMZWFkZXJMb2NrSW1wbCA/PyBkZWxldGVMZWFkZXJMb2NrO1xuXG4gIGNvbnN0IHJlYWNoYWJsZSA9IGF3YWl0IGlzTGVhZGVyV2ViQ29uc29sZVJlYWNoYWJsZUltcGwoZWxlY3Rpb24ubGVhZGVySW5mbyk7XG4gIGlmICghcmVhY2hhYmxlKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1tVbmlmaWVkQ29uc29sZV0gRWxlY3RlZCBsZWFkZXIgaXMgbm90IHNlcnZpbmcgdGhlIGNvbnNvbGUgcG9ydDsgZm9yY2luZyB0YWtlb3ZlcicsIHtcbiAgICAgIHBvcnQ6IGNvbnNvbGVQb3J0LFxuICAgICAgZWxlY3RlZExlYWRlclBpZDogZWxlY3Rpb24ubGVhZGVySW5mby5waWQsXG4gICAgICBlbGVjdGVkTGVhZGVyU2Vzc2lvbklkOiBlbGVjdGlvbi5sZWFkZXJJbmZvLnNlc3Npb25JZCxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlY3Rpb246IGF3YWl0IGZvcmNlQ2xhaW1MZWFkZXJzaGlwSW1wbChzZXNzaW9uSWQsIGNvbnNvbGVQb3J0KSxcbiAgICAgIGRpc2NvdmVyeTogbnVsbCxcbiAgICAgIHJlcGxhY2VtZW50OiBudWxsLFxuICAgICAgZm9yY2VkQ2xhaW06IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGNhbmRpZGF0ZUxlYWRlciA9IGNyZWF0ZUxlYWRlckluZm8oc2Vzc2lvbklkLCBjb25zb2xlUG9ydCk7XG4gIGNvbnN0IGRpc2NvdmVyeSA9IGF3YWl0IGRpc2NvdmVyTGVhZGVyU2VydmluZ1BvcnRJbXBsKGNvbnNvbGVQb3J0LCBudWxsKTtcbiAgaWYgKCFkaXNjb3ZlcnkubGVhZGVySW5mbyB8fCBkaXNjb3Zlcnkub3duZXJQaWQgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlY3Rpb24sXG4gICAgICBkaXNjb3ZlcnksXG4gICAgICByZXBsYWNlbWVudDogbnVsbCxcbiAgICAgIGZvcmNlZENsYWltOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcmVwbGFjZW1lbnQgPSBldmFsdWF0ZVBvcnRPd25lclJlcGxhY2VtZW50KGNhbmRpZGF0ZUxlYWRlciwgZGlzY292ZXJ5KTtcbiAgaWYgKGRpc2NvdmVyeS5vd25lclBpZCAhPT0gZWxlY3Rpb24ubGVhZGVySW5mby5waWQpIHtcbiAgICBpZiAocmVwbGFjZW1lbnQuc2hvdWxkRXZpY3QpIHtcbiAgICAgIGF3YWl0IGRlbGV0ZUxlYWRlckxvY2tJbXBsKCk7XG4gICAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBTcGxpdC1icmFpbiBjb25zb2xlIGF1dGhvcml0eSBkZXRlY3RlZDsgbmV3ZXIgc2Vzc2lvbiB3aWxsIHJlcGxhY2UgdGhlIGFjdHVhbCBwb3J0IG93bmVyJywgYnVpbGRBdXRob3JpdHlSZXNvbHV0aW9uTG9nQ29udGV4dChcbiAgICAgICAgY29uc29sZVBvcnQsXG4gICAgICAgIGVsZWN0aW9uLmxlYWRlckluZm8sXG4gICAgICAgIGRpc2NvdmVyeSxcbiAgICAgICAgcmVwbGFjZW1lbnQsXG4gICAgICApKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVsZWN0aW9uOiB7IHJvbGU6ICdsZWFkZXInLCBsZWFkZXJJbmZvOiBjYW5kaWRhdGVMZWFkZXIgfSxcbiAgICAgICAgZGlzY292ZXJ5LFxuICAgICAgICByZXBsYWNlbWVudCxcbiAgICAgICAgZm9yY2VkQ2xhaW06IGZhbHNlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBTcGxpdC1icmFpbiBjb25zb2xlIGF1dGhvcml0eSBkZXRlY3RlZDsgZm9sbG93aW5nIHRoZSBhY3R1YWwgcG9ydCBvd25lcicsIGJ1aWxkQXV0aG9yaXR5UmVzb2x1dGlvbkxvZ0NvbnRleHQoXG4gICAgICBjb25zb2xlUG9ydCxcbiAgICAgIGVsZWN0aW9uLmxlYWRlckluZm8sXG4gICAgICBkaXNjb3ZlcnksXG4gICAgICByZXBsYWNlbWVudCxcbiAgICApKTtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlY3Rpb246IHsgcm9sZTogJ2ZvbGxvd2VyJywgbGVhZGVySW5mbzogZGlzY292ZXJ5LmxlYWRlckluZm8gfSxcbiAgICAgIGRpc2NvdmVyeSxcbiAgICAgIHJlcGxhY2VtZW50LFxuICAgICAgZm9yY2VkQ2xhaW06IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGVsZWN0aW9uLFxuICAgIGRpc2NvdmVyeSxcbiAgICByZXBsYWNlbWVudCxcbiAgICBmb3JjZWRDbGFpbTogZmFsc2UsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGF0dGVtcHRGb3JjZVRha2VvdmVyKFxuICBvcHRpb25zOiBVbmlmaWVkQ29uc29sZU9wdGlvbnMsXG4gIGN1cnJlbnRFbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQsXG4gIGNvbnNvbGVQb3J0OiBudW1iZXIsXG4gIHByaW1hcnlUb2tlbjogc3RyaW5nLFxuICBzZXJ2ZXJPcHRzOiBXZWJTZXJ2ZXJPcHRpb25zLFxuICBzdGFydFdlYlNlcnZlckltcGw6IChvcHRpb25zOiBXZWJTZXJ2ZXJPcHRpb25zKSA9PiBQcm9taXNlPFdlYlNlcnZlclJlc3VsdD4sXG4pOiBQcm9taXNlPEZvcmNlVGFrZW92ZXJBdHRlbXB0UmVzdWx0PiB7XG4gIGNvbnN0IGluaXRpYWxGYWxsYmFjayA9IGF3YWl0IHJlY292ZXJMZWFkZXJCaW5kRmFpbHVyZShjdXJyZW50RWxlY3Rpb24ubGVhZGVySW5mbywgY29uc29sZVBvcnQsIHByaW1hcnlUb2tlbik7XG4gIGNvbnN0IGluaXRpYWxSZXBsYWNlbWVudCA9IGV2YWx1YXRlUG9ydE93bmVyUmVwbGFjZW1lbnQoY3VycmVudEVsZWN0aW9uLmxlYWRlckluZm8sIGluaXRpYWxGYWxsYmFjayk7XG5cbiAgaWYgKCFpbml0aWFsUmVwbGFjZW1lbnQuc2hvdWxkRXZpY3QgfHwgaW5pdGlhbFJlcGxhY2VtZW50Lm93bmVyUGlkID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdlYlJlc3VsdDogeyBiaW5kUmVzdWx0OiB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VBRERSSU5VU0UnLCBkZXRhaWw6IGBQb3J0ICR7Y29uc29sZVBvcnR9IGFscmVhZHkgaW4gdXNlYCB9IH0sXG4gICAgICBlbGVjdGlvbjogY3VycmVudEVsZWN0aW9uLFxuICAgICAgZmFsbGJhY2s6IGluaXRpYWxGYWxsYmFjayxcbiAgICAgIHJlcGxhY2VtZW50OiBpbml0aWFsUmVwbGFjZW1lbnQsXG4gICAgICBmb3JjZWRLaWxsOiBudWxsLFxuICAgICAgdGFrZW92ZXJBdHRlbXB0ZWQ6IGZhbHNlLFxuICAgICAgcmVib3VuZExvY2tDbGFpbWVkOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbGF0ZXN0RmFsbGJhY2sgPSBhd2FpdCBkaXNjb3ZlckxlYWRlclNlcnZpbmdQb3J0KGNvbnNvbGVQb3J0LCBwcmltYXJ5VG9rZW4pO1xuICBjb25zdCBsYXRlc3RSZXBsYWNlbWVudCA9IGV2YWx1YXRlUG9ydE93bmVyUmVwbGFjZW1lbnQoY3VycmVudEVsZWN0aW9uLmxlYWRlckluZm8sIGxhdGVzdEZhbGxiYWNrKTtcbiAgaWYgKCFsYXRlc3RSZXBsYWNlbWVudC5zaG91bGRFdmljdCB8fCBsYXRlc3RSZXBsYWNlbWVudC5vd25lclBpZCA9PT0gbnVsbCkge1xuICAgIGxvZ2dlci53YXJuKCdbVW5pZmllZENvbnNvbGVdIEZvcmNlZCB0YWtlb3ZlciB0YXJnZXQgY2hhbmdlZCBiZWZvcmUgZXZpY3Rpb247IHNraXBwaW5nIGZvcmNlZCBraWxsJywge1xuICAgICAgLi4uYnVpbGRCaW5kRmFpbHVyZUxvZ0NvbnRleHQoXG4gICAgICAgIGNvbnNvbGVQb3J0LFxuICAgICAgICBjdXJyZW50RWxlY3Rpb24ubGVhZGVySW5mbyxcbiAgICAgICAgeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdFQUREUklOVVNFJywgZGV0YWlsOiBgUG9ydCAke2NvbnNvbGVQb3J0fSBhbHJlYWR5IGluIHVzZWAgfSxcbiAgICAgICAgbGF0ZXN0RmFsbGJhY2ssXG4gICAgICAgIGxhdGVzdFJlcGxhY2VtZW50LFxuICAgICAgKSxcbiAgICAgIHByZXZpb3VzT3duZXJQaWQ6IGluaXRpYWxSZXBsYWNlbWVudC5vd25lclBpZCxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgd2ViUmVzdWx0OiB7IGJpbmRSZXN1bHQ6IHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnRUFERFJJTlVTRScsIGRldGFpbDogYFBvcnQgJHtjb25zb2xlUG9ydH0gYWxyZWFkeSBpbiB1c2VgIH0gfSxcbiAgICAgIGVsZWN0aW9uOiBjdXJyZW50RWxlY3Rpb24sXG4gICAgICBmYWxsYmFjazogbGF0ZXN0RmFsbGJhY2ssXG4gICAgICByZXBsYWNlbWVudDogbGF0ZXN0UmVwbGFjZW1lbnQsXG4gICAgICBmb3JjZWRLaWxsOiBudWxsLFxuICAgICAgdGFrZW92ZXJBdHRlbXB0ZWQ6IGZhbHNlLFxuICAgICAgcmVib3VuZExvY2tDbGFpbWVkOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgbG9nZ2VyLndhcm4oJ1tVbmlmaWVkQ29uc29sZV0gQXR0ZW1wdGluZyBmb3JjZWQgdGFrZW92ZXIgZnJvbSBvbGRlciBvciBpbmNvbXBhdGlibGUgYWN0aXZlIGxlYWRlcicsIHtcbiAgICAuLi5idWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgICAgIGNvbnNvbGVQb3J0LFxuICAgICAgY3VycmVudEVsZWN0aW9uLmxlYWRlckluZm8sXG4gICAgICB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VBRERSSU5VU0UnLCBkZXRhaWw6IGBQb3J0ICR7Y29uc29sZVBvcnR9IGFscmVhZHkgaW4gdXNlYCB9LFxuICAgICAgbGF0ZXN0RmFsbGJhY2ssXG4gICAgICBsYXRlc3RSZXBsYWNlbWVudCxcbiAgICApLFxuICB9KTtcblxuICBjb25zdCBmb3JjZWRLaWxsID0gYXdhaXQga2lsbFN0YWxlUHJvY2Vzc0RldGFpbGVkKGxhdGVzdFJlcGxhY2VtZW50Lm93bmVyUGlkLCBjb25zb2xlUG9ydCwge1xuICAgIGFsbG93QWN0aXZlSG9zdFBhcmVudDogdHJ1ZSxcbiAgfSk7XG4gIGlmICghZm9yY2VkS2lsbC5raWxsZWQpIHtcbiAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBGb3JjZWQgdGFrZW92ZXIgc2tpcHBlZCBvciBmYWlsZWQgYWZ0ZXIgaWRlbnRpZnlpbmcgcmVwbGFjZWFibGUgbGVhZGVyJywge1xuICAgICAgLi4uYnVpbGRCaW5kRmFpbHVyZUxvZ0NvbnRleHQoXG4gICAgICAgIGNvbnNvbGVQb3J0LFxuICAgICAgICBjdXJyZW50RWxlY3Rpb24ubGVhZGVySW5mbyxcbiAgICAgICAgeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdFQUREUklOVVNFJywgZGV0YWlsOiBgUG9ydCAke2NvbnNvbGVQb3J0fSBhbHJlYWR5IGluIHVzZWAgfSxcbiAgICAgICAgbGF0ZXN0RmFsbGJhY2ssXG4gICAgICAgIGxhdGVzdFJlcGxhY2VtZW50LFxuICAgICAgICBmb3JjZWRLaWxsLFxuICAgICAgKSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgd2ViUmVzdWx0OiB7IGJpbmRSZXN1bHQ6IHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnRUFERFJJTlVTRScsIGRldGFpbDogYFBvcnQgJHtjb25zb2xlUG9ydH0gYWxyZWFkeSBpbiB1c2VgIH0gfSxcbiAgICAgIGVsZWN0aW9uOiBjdXJyZW50RWxlY3Rpb24sXG4gICAgICBmYWxsYmFjazogbGF0ZXN0RmFsbGJhY2ssXG4gICAgICByZXBsYWNlbWVudDogbGF0ZXN0UmVwbGFjZW1lbnQsXG4gICAgICBmb3JjZWRLaWxsLFxuICAgICAgdGFrZW92ZXJBdHRlbXB0ZWQ6IHRydWUsXG4gICAgICByZWJvdW5kTG9ja0NsYWltZWQ6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICBjb25zdCByZWJvdW5kV2ViUmVzdWx0ID0gYXdhaXQgc3RhcnRXZWJTZXJ2ZXJJbXBsKHNlcnZlck9wdHMpO1xuICBsZXQgcmVib3VuZEVsZWN0aW9uID0gY3VycmVudEVsZWN0aW9uO1xuICBsZXQgcmVib3VuZExvY2tDbGFpbWVkID0gZmFsc2U7XG5cbiAgaWYgKCFyZWJvdW5kV2ViUmVzdWx0LmJpbmRSZXN1bHQgfHwgcmVib3VuZFdlYlJlc3VsdC5iaW5kUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICBjb25zdCByZWJvdW5kTGVhZGVySW5mbyA9IGNyZWF0ZUxlYWRlckluZm8ob3B0aW9ucy5zZXNzaW9uSWQsIGNvbnNvbGVQb3J0KTtcbiAgICByZWJvdW5kTG9ja0NsYWltZWQgPSBhd2FpdCBjbGFpbUxlYWRlcnNoaXAocmVib3VuZExlYWRlckluZm8pO1xuICAgIGlmICghcmVib3VuZExvY2tDbGFpbWVkKSB7XG4gICAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBSZWJvdW5kIGxlYWRlciBib3VuZCBwb3J0IGJ1dCBjb3VsZCBub3QgaW1tZWRpYXRlbHkgcmUtY2xhaW0gbG9jaycsIHtcbiAgICAgICAgLi4uYnVpbGRCaW5kRmFpbHVyZUxvZ0NvbnRleHQoXG4gICAgICAgICAgY29uc29sZVBvcnQsXG4gICAgICAgICAgcmVib3VuZExlYWRlckluZm8sXG4gICAgICAgICAgcmVib3VuZFdlYlJlc3VsdC5iaW5kUmVzdWx0LFxuICAgICAgICAgIGxhdGVzdEZhbGxiYWNrLFxuICAgICAgICAgIGxhdGVzdFJlcGxhY2VtZW50LFxuICAgICAgICAgIGZvcmNlZEtpbGwsXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVib3VuZEVsZWN0aW9uID0geyByb2xlOiAnbGVhZGVyJywgbGVhZGVySW5mbzogcmVib3VuZExlYWRlckluZm8gfTtcbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBGb3JjZWQgdGFrZW92ZXIga2lsbGVkIG9sZCBsZWFkZXIgYnV0IGJpbmQgcmV0cnkgc3RpbGwgZmFpbGVkJywge1xuICAgICAgLi4uYnVpbGRCaW5kRmFpbHVyZUxvZ0NvbnRleHQoXG4gICAgICAgIGNvbnNvbGVQb3J0LFxuICAgICAgICBjdXJyZW50RWxlY3Rpb24ubGVhZGVySW5mbyxcbiAgICAgICAgcmVib3VuZFdlYlJlc3VsdC5iaW5kUmVzdWx0LFxuICAgICAgICBsYXRlc3RGYWxsYmFjayxcbiAgICAgICAgbGF0ZXN0UmVwbGFjZW1lbnQsXG4gICAgICAgIGZvcmNlZEtpbGwsXG4gICAgICApLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3ZWJSZXN1bHQ6IHJlYm91bmRXZWJSZXN1bHQsXG4gICAgZWxlY3Rpb246IHJlYm91bmRFbGVjdGlvbixcbiAgICBmYWxsYmFjazogbGF0ZXN0RmFsbGJhY2ssXG4gICAgcmVwbGFjZW1lbnQ6IGxhdGVzdFJlcGxhY2VtZW50LFxuICAgIGZvcmNlZEtpbGwsXG4gICAgdGFrZW92ZXJBdHRlbXB0ZWQ6IHRydWUsXG4gICAgcmVib3VuZExvY2tDbGFpbWVkLFxuICB9O1xufVxuXG4vKipcbiAqIFN0YXJ0IHRoZSB1bmlmaWVkIHdlYiBjb25zb2xlLlxuICpcbiAqIFJ1bnMgbGVhZGVyIGVsZWN0aW9uLCB0aGVuIGVpdGhlciBzdGFydHMgdGhlIGZ1bGwgY29uc29sZSAobGVhZGVyKVxuICogb3Igc2V0cyB1cCBldmVudCBmb3J3YXJkaW5nIChmb2xsb3dlcikuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFVuaWZpZWRDb25zb2xlKG9wdGlvbnM6IFVuaWZpZWRDb25zb2xlT3B0aW9ucyk6IFByb21pc2U8VW5pZmllZENvbnNvbGVSZXN1bHQ+IHtcbiAgLy8gUmVzb2x2ZSBwb3J0OiBvcHRpb25zIChjb25maWcgZmlsZSkg4oaSIGVudiB2YXIg4oaSIGRlZmF1bHRcbiAgY29uc3QgY29uc29sZVBvcnQgPSBvcHRpb25zLnBvcnQgfHwgREVGQVVMVF9DT05TT0xFX1BPUlQ7XG4gIGxvZ2dlci5kZWJ1ZyhgW1VuaWZpZWRDb25zb2xlXSBQb3J0IHJlc29sdmVkOiAke2NvbnNvbGVQb3J0fWAgK1xuICAgIChvcHRpb25zLnBvcnQgPyAnIChmcm9tIGNvbmZpZyBmaWxlKScgOiBgIChmcm9tIGVudi9kZWZhdWx0KWApKTtcblxuICAvLyBMZWdhY3ktbGVhZGVyIGRldGVjdGlvbiAoIzE3OTQpIOKAlCB3YXJuIHRoZSB1c2VyIGlmIGEgcHJlLWF1dGhcbiAgLy8gRG9sbGhvdXNlTUNQIGNvbnNvbGUgaXMgcnVubmluZyBhbG9uZ3NpZGUgdGhpcyBhdXRoZW50aWNhdGVkIG9uZS5cbiAgLy8gVGhleSB3aWxsIGNvZXhpc3QgZmluZSBiZWNhdXNlIG9mIHBvcnQgKyBsb2NrICsgdG9rZW4gZmlsZSBpc29sYXRpb24sXG4gIC8vIGJ1dCB0aGUgdXNlciBzaG91bGQga25vdyBib3RoIGV4aXN0IHNvIHRoZSBkaWZmZXJpbmcgc2VjdXJpdHkgcG9zdHVyZVxuICAvLyBiZXR3ZWVuIHRoZW0gZG9lc24ndCBsb29rIGxpa2UgYSBidWcuXG4gIGF3YWl0IHdhcm5JZkxlZ2FjeUNvbnNvbGVQcmVzZW50KGNvbnNvbGVQb3J0KTtcblxuICBsZXQgZWxlY3Rpb24gPSBhd2FpdCBlbGVjdExlYWRlcihvcHRpb25zLnNlc3Npb25JZCwgY29uc29sZVBvcnQpO1xuXG4gIGlmIChlbGVjdGlvbi5yb2xlID09PSAnZm9sbG93ZXInKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlRm9sbG93ZXJBdXRob3JpdHkob3B0aW9ucy5zZXNzaW9uSWQsIGNvbnNvbGVQb3J0LCBlbGVjdGlvbik7XG4gICAgZWxlY3Rpb24gPSByZXNvbHZlZC5lbGVjdGlvbjtcbiAgfVxuXG4gIGlmIChlbGVjdGlvbi5yb2xlID09PSAnbGVhZGVyJykge1xuICAgIHJldHVybiBzdGFydEFzTGVhZGVyKG9wdGlvbnMsIGVsZWN0aW9uLCBjb25zb2xlUG9ydCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0YXJ0QXNGb2xsb3dlcihvcHRpb25zLCBlbGVjdGlvbiwgY29uc29sZVBvcnQpO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnQgYXMgdGhlIGNvbnNvbGUgbGVhZGVyLlxuICogQmluZHMgdGhlIHJlc29sdmVkIGNvbnNvbGUgcG9ydCAoY29uZmlnIGZpbGUg4oaSIGVudiB2YXIg4oaSIGRlZmF1bHQpLFxuICogbW91bnRzIGFsbCByb3V0ZXMgaW5jbHVkaW5nIGluZ2VzdGlvbiwgc3RhcnRzIGhlYXJ0YmVhdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhcnRBc0xlYWRlcihcbiAgb3B0aW9uczogVW5pZmllZENvbnNvbGVPcHRpb25zLFxuICBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQsXG4gIGNvbnNvbGVQb3J0OiBudW1iZXIgPSBERUZBVUxUX0NPTlNPTEVfUE9SVCxcbik6IFByb21pc2U8VW5pZmllZENvbnNvbGVSZXN1bHQ+IHtcbiAgY29uc3QgeyBzdGFydFdlYlNlcnZlciB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2ZXIuanMnKTtcbiAgY29uc3QgeyBwaWNrUmFuZG9tVG9rZW5OYW1lIH0gPSBhd2FpdCBpbXBvcnQoJy4vU2Vzc2lvbk5hbWVzLmpzJyk7XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgY29uc29sZSB0b2tlbiBzdG9yZSAoIzE3ODApLiBDcmVhdGVzIHRoZSB0b2tlbiBmaWxlIG9uXG4gIC8vIGZpcnN0IHJ1biwgcmVhZHMgdGhlIGV4aXN0aW5nIHRva2VucyBvbiBzdWJzZXF1ZW50IHJ1bnMuIFRoZSB0b2tlbiBpc1xuICAvLyBwZXJzaXN0ZW50IGFjcm9zcyByZXN0YXJ0cyDigJQgb25seSByb3RhdGVkIG9uIGV4cGxpY2l0IHJlcXVlc3QgKFBoYXNlIDIpLlxuICAvLyBGZWF0dXJlIGZsYWcgRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQgY29udHJvbHMgZW5mb3JjZW1lbnQ7IHRoZSBmaWxlXG4gIC8vIGlzIGdlbmVyYXRlZCByZWdhcmRsZXNzIHNvIGNvbnN1bWVycyBjYW4gYXR0YWNoIHRva2VucyBwcmVlbXB0aXZlbHkuXG4gIGNvbnN0IHRva2VuU3RvcmUgPSBuZXcgQ29uc29sZVRva2VuU3RvcmUoZW52LkRPTExIT1VTRV9DT05TT0xFX1RPS0VOX0ZJTEUpO1xuICBjb25zdCBwcmltYXJ5VG9rZW4gPSBhd2FpdCB0b2tlblN0b3JlLmVuc3VyZUluaXRpYWxpemVkKHBpY2tSYW5kb21Ub2tlbk5hbWUoKSk7XG4gIGxvZ2dlci5pbmZvKCdbVW5pZmllZENvbnNvbGVdIENvbnNvbGUgdG9rZW4gc3RvcmUgaW5pdGlhbGl6ZWQnLCB7XG4gICAgdG9rZW5JZDogcHJpbWFyeVRva2VuLmlkLFxuICAgIHRva2VuTmFtZTogcHJpbWFyeVRva2VuLm5hbWUsXG4gICAgZmlsZTogdG9rZW5TdG9yZS5nZXRGaWxlUGF0aCgpLFxuICAgIGF1dGhFbmZvcmNlZDogZW52LkRPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVELFxuICB9KTtcblxuICAvLyBQcmUtY3JlYXRlIGEgcGxhY2Vob2xkZXIgYnJvYWRjYXN0IHRoYXQgd2UnbGwgd2lyZSB1cCBhZnRlciB0aGUgc2VydmVyIHN0YXJ0c1xuICBsZXQgbGl2ZUJyb2FkY2FzdDogKChlbnRyeTogVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgbGV0IGxpdmVNZXRyaWNzT25TbmFwc2hvdDogKChzbmFwc2hvdDogTWV0cmljU25hcHNob3QpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gIC8vIENyZWF0ZSBpbmdlc3Rpb24gcm91dGVzIHdpdGggYSBkZWZlcnJlZCBicm9hZGNhc3QgKHdpcmVkIGFmdGVyIHNlcnZlciBzdGFydHMpXG4gIGNvbnN0IGluZ2VzdFJlc3VsdCA9IGNyZWF0ZUluZ2VzdFJvdXRlcyh7XG4gICAgbG9nQnJvYWRjYXN0OiAoZW50cnkpID0+IGxpdmVCcm9hZGNhc3Q/LihlbnRyeSksXG4gICAgbWV0cmljc09uU25hcHNob3Q6IChzbmFwc2hvdCkgPT4gbGl2ZU1ldHJpY3NPblNuYXBzaG90Py4oc25hcHNob3QpLFxuICAgIHN0b3JlTWV0cmljc1NuYXBzaG90OiAoc25hcHNob3QpID0+IG9wdGlvbnMubWV0cmljc1Npbms/Lm9uU25hcHNob3Qoc25hcHNob3QpLFxuICB9KTtcblxuICAvLyBTdGFydCB0aGUgd2ViIHNlcnZlciB3aXRoIGluZ2VzdCByb3V0ZXMgbW91bnRlZCBiZWZvcmUgdGhlIFNQQSBmYWxsYmFjay5cbiAgLy8gSWYgdGhlIHBvcnQgaXMgb2NjdXBpZWQgYnkgYSBzdGFsZSBwcm9jZXNzLCByZXRyeSB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gIGNvbnN0IHNlcnZlck9wdHMgPSB7XG4gICAgcG9ydGZvbGlvRGlyOiBvcHRpb25zLnBvcnRmb2xpb0RpcixcbiAgICBtZW1vcnlTaW5rOiBvcHRpb25zLm1lbW9yeVNpbmssXG4gICAgbWV0cmljc1Npbms6IG9wdGlvbnMubWV0cmljc1NpbmssXG4gICAgcG9ydDogY29uc29sZVBvcnQsXG4gICAgc2Vzc2lvbklkOiBvcHRpb25zLnN0YWJsZVNlc3Npb25JZCxcbiAgICBydW50aW1lU2Vzc2lvbklkOiBvcHRpb25zLnNlc3Npb25JZCxcbiAgICBhZGRpdGlvbmFsUm91dGVyczogW2luZ2VzdFJlc3VsdC5yb3V0ZXJdLFxuICAgIHRva2VuU3RvcmUsXG4gICAgLi4uKG9wdGlvbnMubWNwQXFsSGFuZGxlciA/IHsgbWNwQXFsSGFuZGxlcjogb3B0aW9ucy5tY3BBcWxIYW5kbGVyIH0gOiB7fSksXG4gIH07XG4gIC8vIGJpbmRBbmRMaXN0ZW4gbm93IGhhbmRsZXMgRUFERFJJTlVTRSBieSBmaW5kaW5nIGFuZCBraWxsaW5nIHRoZSBzdGFsZVxuICAvLyBwcm9jZXNzIG9uIHRoZSBwb3J0LCB0aGVuIHJldHJ5aW5nLiBObyBleHRlcm5hbCByZXRyeSBsb29wIG5lZWRlZC5cbiAgbGV0IHdlYlJlc3VsdCA9IGF3YWl0IHN0YXJ0V2ViU2VydmVyKHNlcnZlck9wdHMpO1xuXG4gIGlmICh3ZWJSZXN1bHQuYmluZFJlc3VsdCAmJiAhd2ViUmVzdWx0LmJpbmRSZXN1bHQuc3VjY2Vzcykge1xuICAgIGNvbnN0IGZvcmNlVGFrZW92ZXIgPSBhd2FpdCBhdHRlbXB0Rm9yY2VUYWtlb3ZlcihcbiAgICAgIG9wdGlvbnMsXG4gICAgICBlbGVjdGlvbixcbiAgICAgIGNvbnNvbGVQb3J0LFxuICAgICAgcHJpbWFyeVRva2VuLnRva2VuLFxuICAgICAgc2VydmVyT3B0cyxcbiAgICAgIHN0YXJ0V2ViU2VydmVyLFxuICAgICk7XG4gICAgd2ViUmVzdWx0ID0gZm9yY2VUYWtlb3Zlci53ZWJSZXN1bHQ7XG4gICAgZWxlY3Rpb24gPSBmb3JjZVRha2VvdmVyLmVsZWN0aW9uO1xuXG4gICAgaWYgKHdlYlJlc3VsdC5iaW5kUmVzdWx0ICYmICF3ZWJSZXN1bHQuYmluZFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBpZiAoZm9yY2VUYWtlb3Zlci5mYWxsYmFjay5sZWFkZXJJbmZvKSB7XG4gICAgICBsb2dnZXIud2FybignW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgcm9sZSBhYm9ydGVkOiBiaW5kIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGZvbGxvd2VyJywge1xuICAgICAgICAuLi5idWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgICAgICAgICBjb25zb2xlUG9ydCxcbiAgICAgICAgICBlbGVjdGlvbi5sZWFkZXJJbmZvLFxuICAgICAgICAgIHdlYlJlc3VsdC5iaW5kUmVzdWx0LFxuICAgICAgICAgIGZvcmNlVGFrZW92ZXIuZmFsbGJhY2ssXG4gICAgICAgICAgZm9yY2VUYWtlb3Zlci5yZXBsYWNlbWVudCxcbiAgICAgICAgICBmb3JjZVRha2VvdmVyLmZvcmNlZEtpbGwsXG4gICAgICAgICksXG4gICAgICAgIHRha2VvdmVyQXR0ZW1wdGVkOiBmb3JjZVRha2VvdmVyLnRha2VvdmVyQXR0ZW1wdGVkLFxuICAgICAgICByZWJvdW5kTG9ja0NsYWltZWQ6IGZvcmNlVGFrZW92ZXIucmVib3VuZExvY2tDbGFpbWVkLFxuICAgICAgICBsb2NrQ2xlYW51cEF0dGVtcHRlZDogZm9yY2VUYWtlb3Zlci5mYWxsYmFjay5zb3VyY2UgIT09ICdub25lJyxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZm9sbG93ZXJFbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQgPSB7IHJvbGU6ICdmb2xsb3dlcicsIGxlYWRlckluZm86IGZvcmNlVGFrZW92ZXIuZmFsbGJhY2subGVhZGVySW5mbyB9O1xuICAgICAgcmV0dXJuIHN0YXJ0QXNGb2xsb3dlcihvcHRpb25zLCBmb2xsb3dlckVsZWN0aW9uLCBjb25zb2xlUG9ydCwgcHJpbWFyeVRva2VuLnRva2VuKTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmVycm9yKCdbVW5pZmllZENvbnNvbGVdIExlYWRlciBmYWlsZWQgdG8gYmluZCBhbmQgbm8gYWN0aXZlIGxlYWRlciBjb3VsZCBiZSBpZGVudGlmaWVkJywge1xuICAgICAgICAuLi5idWlsZEJpbmRGYWlsdXJlTG9nQ29udGV4dChcbiAgICAgICAgICBjb25zb2xlUG9ydCxcbiAgICAgICAgICBlbGVjdGlvbi5sZWFkZXJJbmZvLFxuICAgICAgICAgIHdlYlJlc3VsdC5iaW5kUmVzdWx0LFxuICAgICAgICAgIGZvcmNlVGFrZW92ZXIuZmFsbGJhY2ssXG4gICAgICAgICAgZm9yY2VUYWtlb3Zlci5yZXBsYWNlbWVudCxcbiAgICAgICAgICBmb3JjZVRha2VvdmVyLmZvcmNlZEtpbGwsXG4gICAgICAgICksXG4gICAgICAgIHRha2VvdmVyQXR0ZW1wdGVkOiBmb3JjZVRha2VvdmVyLnRha2VvdmVyQXR0ZW1wdGVkLFxuICAgICAgICByZWJvdW5kTG9ja0NsYWltZWQ6IGZvcmNlVGFrZW92ZXIucmVib3VuZExvY2tDbGFpbWVkLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExlYWRlciBmYWlsZWQgdG8gYmluZCBwb3J0ICR7Y29uc29sZVBvcnR9IGFuZCBubyBhY3RpdmUgbGVhZGVyIHdhcyBkaXNjb3ZlcmFibGVgKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWdpc3RlciB0aGUgbGVhZGVyIG9ubHkgYWZ0ZXIgdGhlIEhUVFAgbGlzdGVuZXIgaXMgYWN0dWFsbHkgc2VydmluZyB0aGUgcG9ydC5cbiAgaW5nZXN0UmVzdWx0LnJlZ2lzdGVyTGVhZGVyU2Vzc2lvbihvcHRpb25zLnNlc3Npb25JZCwgcHJvY2Vzcy5waWQpO1xuXG4gIC8vIFJlZ2lzdGVyIHRoZSB3ZWIgY29uc29sZSBpdHNlbGYgc28gdGhlIHNlc3Npb24gaW5kaWNhdG9yIGlzIG5ldmVyIGVtcHR5ICgjMTgwNSlcbiAgaW5nZXN0UmVzdWx0LnJlZ2lzdGVyQ29uc29sZVNlc3Npb24oKTtcblxuICAvLyBXaXJlIFNTRSBicm9hZGNhc3RzIGZvciB0aGlzIGxlYWRlcidzIG93biBldmVudHNcbiAgb3B0aW9ucy53aXJlU1NFQnJvYWRjYXN0cyh3ZWJSZXN1bHQsIG9wdGlvbnMubWV0cmljc1NpbmspO1xuXG4gIC8vIE5vdyB3aXJlIHRoZSBsaXZlIGJyb2FkY2FzdCBmdW5jdGlvbnMgaW50byB0aGUgaW5nZXN0IHJvdXRlc1xuICBpZiAod2ViUmVzdWx0LmxvZ0Jyb2FkY2FzdCkge1xuICAgIGNvbnN0IG9yaWdpbmFsQnJvYWRjYXN0ID0gd2ViUmVzdWx0LmxvZ0Jyb2FkY2FzdDtcbiAgICAvLyBTdGFtcCBsZWFkZXIncyBvd24gZW50cmllcyB3aXRoIHNlc3Npb24gSURcbiAgICBsaXZlQnJvYWRjYXN0ID0gKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHN0YW1wZWQ6IFVuaWZpZWRMb2dFbnRyeSA9IHtcbiAgICAgICAgLi4uZW50cnksXG4gICAgICAgIGRhdGE6IHsgLi4uZW50cnkuZGF0YSwgX3Nlc3Npb25JZDogb3B0aW9ucy5zZXNzaW9uSWQgfSxcbiAgICAgIH07XG4gICAgICBvcmlnaW5hbEJyb2FkY2FzdChzdGFtcGVkKTtcbiAgICB9O1xuICB9XG4gIGxpdmVNZXRyaWNzT25TbmFwc2hvdCA9IHdlYlJlc3VsdC5tZXRyaWNzT25TbmFwc2hvdDtcblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBJbmdlc3Rpb24gcm91dGVzIG1vdW50ZWQnKTtcblxuICAvLyBTdGFydCBoZWFydGJlYXQgYW5kIHJlZ2lzdGVyIGNsZWFudXBcbiAgY29uc3Qgc3RvcEhlYXJ0YmVhdCA9IHN0YXJ0SGVhcnRiZWF0KGVsZWN0aW9uLmxlYWRlckluZm8pO1xuICByZWdpc3RlckxlYWRlckNsZWFudXAoKTtcblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBMZWFkZXIgc3RhcnRlZCcsIHtcbiAgICBzZXNzaW9uSWQ6IG9wdGlvbnMuc2Vzc2lvbklkLCBwb3J0OiBjb25zb2xlUG9ydCwgcGlkOiBwcm9jZXNzLnBpZCxcbiAgICByb2xlOiAnbGVhZGVyJywgaW5nZXN0Um91dGVzOiBbJy9hcGkvaW5nZXN0L2xvZ3MnLCAnL2FwaS9pbmdlc3QvbWV0cmljcycsICcvYXBpL2luZ2VzdC9zZXNzaW9uJywgJy9hcGkvc2Vzc2lvbnMnXSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICByb2xlOiAnbGVhZGVyJyxcbiAgICBlbGVjdGlvbixcbiAgICBwb3J0OiBjb25zb2xlUG9ydCxcbiAgICBjbGVhbnVwOiBhc3luYyAoKSA9PiB7XG4gICAgICBzdG9wSGVhcnRiZWF0KCk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBTdGFydCBhcyBhIGZvbGxvd2VyLlxuICogUmVnaXN0ZXJzIGZvcndhcmRpbmcgc2lua3Mgd2l0aCB0aGUgTG9nTWFuYWdlciwgc3RhcnRzIHNlc3Npb24gaGVhcnRiZWF0LlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydEFzRm9sbG93ZXIoXG4gIG9wdGlvbnM6IFVuaWZpZWRDb25zb2xlT3B0aW9ucyxcbiAgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0LFxuICBjb25zb2xlUG9ydDogbnVtYmVyID0gREVGQVVMVF9DT05TT0xFX1BPUlQsXG4gIGluaXRpYWxBdXRoVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsLFxuKTogUHJvbWlzZTxVbmlmaWVkQ29uc29sZVJlc3VsdD4ge1xuICBjb25zdCBsZWFkZXJVcmwgPSBgaHR0cDovLzEyNy4wLjAuMToke2VsZWN0aW9uLmxlYWRlckluZm8ucG9ydH1gO1xuXG4gIC8vIFJlYWQgdGhlIGNvbnNvbGUgYXV0aCB0b2tlbiAoIzE3ODApIHdyaXR0ZW4gYnkgdGhlIGxlYWRlci4gTWF5IGJlIG51bGxcbiAgLy8gaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCB5ZXQg4oCUIHRoZSBzaW5rcyBoYW5kbGUgdGhhdCBncmFjZWZ1bGx5IGFuZFxuICAvLyBzaW1wbHkgb21pdCB0aGUgQmVhcmVyIGhlYWRlciwgd2hpY2ggaXMgZmluZSB3aGVuIGF1dGggaXMgbm90IGVuZm9yY2VkLlxuICBsZXQgYXV0aFRva2VuID0gaW5pdGlhbEF1dGhUb2tlbjtcbiAgaWYgKGF1dGhUb2tlbiA9PT0gbnVsbCkge1xuICAgIGNvbnN0IHsgZ2V0UHJpbWFyeVRva2VuRnJvbUZpbGUgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlVG9rZW4uanMnKTtcbiAgICBhdXRoVG9rZW4gPSBhd2FpdCBnZXRQcmltYXJ5VG9rZW5Gcm9tRmlsZShlbnYuRE9MTEhPVVNFX0NPTlNPTEVfVE9LRU5fRklMRSk7XG4gIH1cbiAgaWYgKGF1dGhUb2tlbikge1xuICAgIGxvZ2dlci5kZWJ1ZygnW1VuaWZpZWRDb25zb2xlXSBGb2xsb3dlciBsb2FkZWQgY29uc29sZSBhdXRoIHRva2VuJyk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdbVW5pZmllZENvbnNvbGVdIE5vIGNvbnNvbGUgYXV0aCB0b2tlbiBmaWxlIGZvdW5kOyBmb2xsb3dlciB3aWxsIFBPU1Qgd2l0aG91dCBCZWFyZXIgaGVhZGVyJyk7XG4gIH1cblxuICAvLyBQZXItaW5zdGFuY2UgcHJvbW90aW9uIG1hbmFnZXIg4oCUIHRyYWNrcyBpdHMgb3duIGF0dGVtcHQgY291bnRlciBzb1xuICAvLyBtdWx0aXBsZSBmb2xsb3dlcnMgZG9uJ3QgaW50ZXJmZXJlIHdpdGggZWFjaCBvdGhlcidzIHByb21vdGlvbiBidWRnZXRzLlxuICBjb25zdCBwcm9tb3Rpb25NZ3IgPSBuZXcgUHJvbW90aW9uTWFuYWdlcihvcHRpb25zLCBjb25zb2xlUG9ydCwgc3RhcnRBc0xlYWRlciwgc3RhcnRBc0ZvbGxvd2VyKTtcblxuICAvLyBEZWNsYXJlIHNlc3Npb25IZWFydGJlYXQgYmVmb3JlIHRoZSBzaW5rIHNvIHRoZSBjbG9zdXJlIGNhbiBjYXB0dXJlIGl0LlxuICAvLyBCb3RoIGFyZSBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGNhbGxiYWNrIGNvdWxkIHBvc3NpYmx5IGZpcmUgKG5lZWRzIDUrIGZhaWxlZCBmbHVzaGVzKS5cbiAgbGV0IHNlc3Npb25IZWFydGJlYXQ6IFNlc3Npb25IZWFydGJlYXQ7XG5cbiAgLy8gUmVnaXN0ZXIgYSBmb3J3YXJkaW5nIGxvZyBzaW5rIHdpdGggbGVhZGVyLWRlYXRoIGNhbGxiYWNrICgjMTg1MCkuXG4gIGNvbnN0IGZvcndhcmRpbmdTaW5rID0gbmV3IExlYWRlckZvcndhcmRpbmdMb2dTaW5rKGxlYWRlclVybCwgb3B0aW9ucy5zZXNzaW9uSWQsIGF1dGhUb2tlbiwgKCkgPT4ge1xuICAgIHByb21vdGlvbk1nci5wcm9tb3RlKGZvcndhcmRpbmdTaW5rLCBzZXNzaW9uSGVhcnRiZWF0KVxuICAgICAgLmNhdGNoKGVyciA9PiBsb2dnZXIuZXJyb3IoJ1tVbmlmaWVkQ29uc29sZV0gUHJvbW90aW9uIGNyYXNoZWQnLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KSk7XG4gIH0pO1xuICBvcHRpb25zLnJlZ2lzdGVyTG9nU2luayhmb3J3YXJkaW5nU2luayk7XG5cbiAgLy8gU3RhcnQgc2Vzc2lvbiBoZWFydGJlYXQgdG8gdGhlIGxlYWRlclxuICBzZXNzaW9uSGVhcnRiZWF0ID0gbmV3IFNlc3Npb25IZWFydGJlYXQobGVhZGVyVXJsLCBvcHRpb25zLnNlc3Npb25JZCwgcHJvY2Vzcy5waWQsIGF1dGhUb2tlbik7XG4gIGF3YWl0IHNlc3Npb25IZWFydGJlYXQuc3RhcnQoKTtcblxuICBsb2dnZXIuaW5mbygnW1VuaWZpZWRDb25zb2xlXSBGb2xsb3dlciBzdGFydGVkJywge1xuICAgIHNlc3Npb25JZDogb3B0aW9ucy5zZXNzaW9uSWQsIHBpZDogcHJvY2Vzcy5waWQsIHJvbGU6ICdmb2xsb3dlcicsXG4gICAgbGVhZGVyU2Vzc2lvbjogZWxlY3Rpb24ubGVhZGVySW5mby5zZXNzaW9uSWQsIGxlYWRlclBpZDogZWxlY3Rpb24ubGVhZGVySW5mby5waWQsXG4gICAgbGVhZGVyUG9ydDogZWxlY3Rpb24ubGVhZGVySW5mby5wb3J0LCBsZWFkZXJVcmwsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcm9sZTogJ2ZvbGxvd2VyJyxcbiAgICBlbGVjdGlvbixcbiAgICBjbGVhbnVwOiBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBzZXNzaW9uSGVhcnRiZWF0LnN0b3AoKTtcbiAgICAgIGF3YWl0IGZvcndhcmRpbmdTaW5rLmNsb3NlKCk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -37,6 +37,13 @@ export declare function findAvailablePort(startPort: number, maxAttempts?: numbe
37
37
  * @returns Path to the PID-keyed port file
38
38
  */
39
39
  export declare function writePortFile(port: number): Promise<string>;
40
+ /**
41
+ * Restore or update the shared latest port file for the active listener.
42
+ *
43
+ * Returns true when the file had to be written or updated, false when it
44
+ * already matched the active port.
45
+ */
46
+ export declare function ensureLatestPortFile(port: number, customDir?: string): Promise<boolean>;
40
47
  /**
41
48
  * Clean up port file on shutdown.
42
49
  */
@@ -1 +1 @@
1
- {"version":3,"file":"portDiscovery.d.ts","sourceRoot":"","sources":["../../src/web/portDiscovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAyCH;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,MAAqF,GACjG,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASjE;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAM1C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0C7E;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,GAAE,MAAuC,GACnD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAY7B"}
1
+ {"version":3,"file":"portDiscovery.d.ts","sourceRoot":"","sources":["../../src/web/portDiscovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAkDH;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,MAAqF,GACjG,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASjE;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB7F;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAM1C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0C7E;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,GAAE,MAAuC,GACnD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAY7B"}
@@ -17,13 +17,20 @@
17
17
  import { createServer } from 'node:net';
18
18
  import { homedir } from 'node:os';
19
19
  import { join } from 'node:path';
20
- import { mkdir, writeFile, unlink, readdir } from 'node:fs/promises';
20
+ import { mkdir, writeFile, unlink, readdir, readFile } from 'node:fs/promises';
21
21
  import { env } from '../config/env.js';
22
22
  import { logger } from '../utils/logger.js';
23
23
  /** Default maximum port attempts before giving up */
24
24
  const DEFAULT_MAX_PORT_ATTEMPTS = 10;
25
25
  /** Directory for runtime state files (port discovery, PID files) */
26
26
  const RUN_DIR = join(homedir(), '.dollhouse', 'run');
27
+ const LATEST_PORT_FILENAME = 'permission-server.port';
28
+ function pidPortFilePath(dir = RUN_DIR, pid = process.pid) {
29
+ return join(dir, `permission-server-${pid}.port`);
30
+ }
31
+ function latestPortFilePath(dir = RUN_DIR) {
32
+ return join(dir, LATEST_PORT_FILENAME);
33
+ }
27
34
  /** Track port file path for cleanup */
28
35
  let portFilePath = null;
29
36
  /**
@@ -92,14 +99,38 @@ export async function findAvailablePort(startPort, maxAttempts = Number(process.
92
99
  */
93
100
  export async function writePortFile(port) {
94
101
  await mkdir(RUN_DIR, { recursive: true });
95
- const pidFile = join(RUN_DIR, `permission-server-${process.pid}.port`);
96
- const latestFile = join(RUN_DIR, 'permission-server.port');
102
+ const pidFile = pidPortFilePath();
103
+ const latestFile = latestPortFilePath();
97
104
  await writeFile(pidFile, String(port), 'utf-8');
98
105
  await writeFile(latestFile, String(port), 'utf-8');
99
106
  portFilePath = pidFile;
100
107
  logger.debug(`[PortDiscovery] Port file written: ${pidFile}`);
101
108
  return pidFile;
102
109
  }
110
+ /**
111
+ * Restore or update the shared latest port file for the active listener.
112
+ *
113
+ * Returns true when the file had to be written or updated, false when it
114
+ * already matched the active port.
115
+ */
116
+ export async function ensureLatestPortFile(port, customDir) {
117
+ const dir = customDir || RUN_DIR;
118
+ const latestFile = latestPortFilePath(dir);
119
+ const desiredValue = String(port);
120
+ await mkdir(dir, { recursive: true });
121
+ try {
122
+ const existingValue = (await readFile(latestFile, 'utf-8')).trim();
123
+ if (existingValue === desiredValue) {
124
+ return false;
125
+ }
126
+ }
127
+ catch {
128
+ // Missing/unreadable file — rewrite below.
129
+ }
130
+ await writeFile(latestFile, desiredValue, 'utf-8');
131
+ logger.debug(`[PortDiscovery] Shared latest port file refreshed: ${latestFile}`);
132
+ return true;
133
+ }
103
134
  /**
104
135
  * Clean up port file on shutdown.
105
136
  */
@@ -199,4 +230,4 @@ export async function discoverAndBindPort(defaultPort = env.DOLLHOUSE_WEB_CONSOL
199
230
  return undefined;
200
231
  }
201
232
  }
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydERpc2NvdmVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWIvcG9ydERpc2NvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0sVUFBVSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QyxxREFBcUQ7QUFDckQsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUM7QUFFckMsb0VBQW9FO0FBQ3BFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFckQsdUNBQXVDO0FBQ3ZDLElBQUksWUFBWSxHQUFrQixJQUFJLENBQUM7QUFFdkM7Ozs7R0FJRztBQUNILFNBQVMsV0FBVyxDQUFDLElBQVk7SUFDL0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sTUFBTSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBMEIsRUFBRSxFQUFFO1lBQ2xELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsSUFB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QUFVLG1CQUFtQixDQUN2QyxjQUFzQixHQUFHLENBQUMsMEJBQTBCO0lBRXBELElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0saUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbEQsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsbUJBQW1CLEVBQUUsQ0FBQztRQUV0QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRHluYW1pYyBwb3J0IGFsbG9jYXRpb24gYW5kIHBvcnQgZmlsZSBkaXNjb3ZlcnkgZm9yIHRoZSB3ZWIgY29uc29sZS5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIERvbGxob3VzZU1DUCBzZXNzaW9ucyBydW4gc2ltdWx0YW5lb3VzbHkgKGUuZy4sIG11bHRpcGxlXG4gKiBDbGF1ZGUgQ29kZSB3aW5kb3dzLCBJREUgaW5zdGFuY2VzLCBvciBhZ2VudCBzZXNzaW9ucyksIGVhY2ggbmVlZHMgaXRzXG4gKiBvd24gd2ViIGNvbnNvbGUgcG9ydC4gVGhpcyBtb2R1bGUgaGFuZGxlczpcbiAqXG4gKiAxLiBGaW5kaW5nIGFuIGF2YWlsYWJsZSBwb3J0IHN0YXJ0aW5nIGZyb20gdGhlIGNvbmZpZ3VyZWQgZGVmYXVsdFxuICogICAgKHNlZSBgRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlRgIGluIGBzcmMvY29uZmlnL2Vudi50c2ApXG4gKiAyLiBXcml0aW5nIHBvcnQgZGlzY292ZXJ5IGZpbGVzIHNvIGV4dGVybmFsIHRvb2xzIGtub3cgd2hpY2ggcG9ydCB0byB1c2VcbiAqIDMuIENsZWFuaW5nIHVwIHBvcnQgZmlsZXMgb24gcHJvY2VzcyBleGl0XG4gKlxuICogUG9ydCBmaWxlcyBhcmUgd3JpdHRlbiB0byB+Ly5kb2xsaG91c2UvcnVuLzpcbiAqIC0gcGVybWlzc2lvbi1zZXJ2ZXIte3BpZH0ucG9ydCDigJQgcGVyLXByb2Nlc3MgZmlsZSAoY2xlYW5lZCBvbiBleGl0KVxuICogLSBwZXJtaXNzaW9uLXNlcnZlci5wb3J0IOKAlCBsYXRlc3QgcG9ydCAoY29udmVuaWVuY2UgZm9yIHNjcmlwdHMpXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlU2VydmVyLCB0eXBlIFNlcnZlciB9IGZyb20gJ25vZGU6bmV0JztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSwgdW5saW5rLCByZWFkZGlyIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9jb25maWcvZW52LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbi8qKiBEZWZhdWx0IG1heGltdW0gcG9ydCBhdHRlbXB0cyBiZWZvcmUgZ2l2aW5nIHVwICovXG5jb25zdCBERUZBVUxUX01BWF9QT1JUX0FUVEVNUFRTID0gMTA7XG5cbi8qKiBEaXJlY3RvcnkgZm9yIHJ1bnRpbWUgc3RhdGUgZmlsZXMgKHBvcnQgZGlzY292ZXJ5LCBQSUQgZmlsZXMpICovXG5jb25zdCBSVU5fRElSID0gam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ3J1bicpO1xuXG4vKiogVHJhY2sgcG9ydCBmaWxlIHBhdGggZm9yIGNsZWFudXAgKi9cbmxldCBwb3J0RmlsZVBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIEF0dGVtcHQgdG8gYmluZCB0byBhIHNpbmdsZSBwb3J0LiBSZXR1cm5zIHRoZSBwb3J0IGlmIHN1Y2Nlc3NmdWwsIG51bGwgaWYgaW4gdXNlLlxuICogS2VlcHMgdGhlIHNlcnZlciBsaXN0ZW5pbmcgdG8gcHJldmVudCBUT0NUT1UgcmFjZSBjb25kaXRpb25zIOKAlCBjYWxsZXIgbXVzdFxuICogY2xvc2UgdGhlIHJldHVybmVkIHNlcnZlciBhZnRlciB0aGVpciBvd24gc2VydmVyIGJpbmRzLlxuICovXG5mdW5jdGlvbiB0cnlCaW5kUG9ydChwb3J0OiBudW1iZXIpOiBQcm9taXNlPHsgcG9ydDogbnVtYmVyOyBzZXJ2ZXI6IFNlcnZlciB9IHwgbnVsbD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBRERSSU5VU0UnKSB7XG4gICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtQb3J0RGlzY292ZXJ5XSBVbmV4cGVjdGVkIGVycm9yIG9uIHBvcnQgJHtwb3J0fTogJHtlcnIuY29kZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgcmVzb2x2ZSh7IHBvcnQsIHNlcnZlciB9KTtcbiAgICB9KTtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICcxMjcuMC4wLjEnKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRmluZCBhbiBhdmFpbGFibGUgcG9ydCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBwb3J0LlxuICpcbiAqIFRyaWVzIHNlcXVlbnRpYWwgcG9ydHMsIGxvZ2dpbmcgZWFjaCBhdHRlbXB0LiBSZXR1cm5zIGJvdGggdGhlIHBvcnQgbnVtYmVyXG4gKiBhbmQgYSBoZWxkIHNlcnZlciB0byBwcmV2ZW50IFRPQ1RPVSByYWNlIGNvbmRpdGlvbnMuIFRoZSBjYWxsZXIgc2hvdWxkXG4gKiBjbG9zZSB0aGUgaGVsZCBzZXJ2ZXIgYWZ0ZXIgYmluZGluZyB0aGVpciBvd24gRXhwcmVzcyBhcHAgdG8gdGhlIHBvcnQuXG4gKlxuICogQHBhcmFtIHN0YXJ0UG9ydCAtIFBvcnQgdG8gdHJ5IGZpcnN0IChzZWUgYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYCBmb3IgdGhlIGRlZmF1bHQpXG4gKiBAcGFyYW0gbWF4QXR0ZW1wdHMgLSBNYXhpbXVtIHBvcnRzIHRvIHRyeSAoZGVmYXVsdDogMTAsIGNvbmZpZ3VyYWJsZSB2aWEgRE9MTEhPVVNFX01BWF9QT1JUX0FUVEVNUFRTKVxuICogQHJldHVybnMgT2JqZWN0IHdpdGggcG9ydCBudW1iZXIgYW5kIGhlbGQgc2VydmVyLCBvciB0aHJvd3MgaWYgYWxsIGF0dGVtcHRzIGZhaWxcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRBdmFpbGFibGVQb3J0KFxuICBzdGFydFBvcnQ6IG51bWJlcixcbiAgbWF4QXR0ZW1wdHM6IG51bWJlciA9IE51bWJlcihwcm9jZXNzLmVudi5ET0xMSE9VU0VfTUFYX1BPUlRfQVRURU1QVFMpIHx8IERFRkFVTFRfTUFYX1BPUlRfQVRURU1QVFMsXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IG1heEF0dGVtcHRzOyBhdHRlbXB0KyspIHtcbiAgICBjb25zdCBwb3J0ID0gc3RhcnRQb3J0ICsgYXR0ZW1wdDtcbiAgICBsb2dnZXIuZGVidWcoYFtQb3J0RGlzY292ZXJ5XSBUcnlpbmcgcG9ydCAke3BvcnR9IChhdHRlbXB0ICR7YXR0ZW1wdCArIDF9LyR7bWF4QXR0ZW1wdHN9KWApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJ5QmluZFBvcnQocG9ydCk7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgLy8gQ2xvc2UgdGhlIHByb2JlIHNlcnZlciDigJQgdGhlcmUncyBhIGJyaWVmIFRPQ1RPVSB3aW5kb3cgaGVyZSBiZXR3ZWVuXG4gICAgICAvLyBjbG9zaW5nIGFuZCB0aGUgY2FsbGVyIGJpbmRpbmcsIGJ1dCBpdCdzIG5lZ2xpZ2libGUgb24gbG9jYWxob3N0LlxuICAgICAgLy8gQSBmdXR1cmUgaW1wcm92ZW1lbnQgY291bGQgcmV0dXJuIHRoZSBzZXJ2ZXIgZm9yIHRoZSBjYWxsZXIgdG8gYWRvcHQuXG4gICAgICByZXN1bHQuc2VydmVyLmNsb3NlKCk7XG4gICAgICBpZiAoYXR0ZW1wdCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtQb3J0RGlzY292ZXJ5XSBQb3J0ICR7c3RhcnRQb3J0fSBpbiB1c2UsIHVzaW5nICR7cG9ydH0gKGFmdGVyICR7YXR0ZW1wdH0gc2tpcCR7YXR0ZW1wdCA+IDEgPyAncycgOiAnJ30pYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcG9ydDtcbiAgICB9XG4gICAgbG9nZ2VyLmRlYnVnKGBbUG9ydERpc2NvdmVyeV0gUG9ydCAke3BvcnR9IGluIHVzZSwgdHJ5aW5nIG5leHRgKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgTm8gYXZhaWxhYmxlIHBvcnQgZm91bmQgaW4gcmFuZ2UgJHtzdGFydFBvcnR9LSR7c3RhcnRQb3J0ICsgbWF4QXR0ZW1wdHMgLSAxfSBgICtcbiAgICBgYWZ0ZXIgJHttYXhBdHRlbXB0c30gYXR0ZW1wdHMuIFNldCBET0xMSE9VU0VfTUFYX1BPUlRfQVRURU1QVFMgdG8gaW5jcmVhc2UgdGhlIHJhbmdlLmBcbiAgKTtcbn1cblxuLyoqXG4gKiBXcml0ZSB0aGUgYWN0aXZlIHNlcnZlciBwb3J0IHRvIGEgZGlzY292ZXJhYmxlIGZpbGUuXG4gKlxuICogQ3JlYXRlcyB0d28gZmlsZXM6XG4gKiAtIFBJRC1rZXllZCBmaWxlIGZvciBwZXItcHJvY2VzcyBjbGVhbnVwXG4gKiAtIExhdGVzdCBmaWxlIGZvciBjb252ZW5pZW5jZSAoc2NyaXB0cyBjYW4gcmVhZCB0aGlzIHdpdGhvdXQga25vd2luZyB0aGUgUElEKVxuICpcbiAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgdGhlIHdlYiBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uXG4gKiBAcmV0dXJucyBQYXRoIHRvIHRoZSBQSUQta2V5ZWQgcG9ydCBmaWxlXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZVBvcnRGaWxlKHBvcnQ6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGF3YWl0IG1rZGlyKFJVTl9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb25zdCBwaWRGaWxlID0gam9pbihSVU5fRElSLCBgcGVybWlzc2lvbi1zZXJ2ZXItJHtwcm9jZXNzLnBpZH0ucG9ydGApO1xuICBjb25zdCBsYXRlc3RGaWxlID0gam9pbihSVU5fRElSLCAncGVybWlzc2lvbi1zZXJ2ZXIucG9ydCcpO1xuICBhd2FpdCB3cml0ZUZpbGUocGlkRmlsZSwgU3RyaW5nKHBvcnQpLCAndXRmLTgnKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGxhdGVzdEZpbGUsIFN0cmluZyhwb3J0KSwgJ3V0Zi04Jyk7XG4gIHBvcnRGaWxlUGF0aCA9IHBpZEZpbGU7XG4gIGxvZ2dlci5kZWJ1ZyhgW1BvcnREaXNjb3ZlcnldIFBvcnQgZmlsZSB3cml0dGVuOiAke3BpZEZpbGV9YCk7XG4gIHJldHVybiBwaWRGaWxlO1xufVxuXG4vKipcbiAqIENsZWFuIHVwIHBvcnQgZmlsZSBvbiBzaHV0ZG93bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFudXBQb3J0RmlsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHBvcnRGaWxlUGF0aCkge1xuICAgIHRyeSB7IGF3YWl0IHVubGluayhwb3J0RmlsZVBhdGgpOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBnb25lICovIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHByb2Nlc3MgZXhpdCBoYW5kbGVycyB0byBjbGVhbiB1cCBwb3J0IGZpbGVzLlxuICogU2hvdWxkIGJlIGNhbGxlZCBvbmNlIGFmdGVyIHRoZSB3ZWIgc2VydmVyIHN1Y2Nlc3NmdWxseSBzdGFydHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclBvcnRDbGVhbnVwKCk6IHZvaWQge1xuICBjb25zdCBleGl0Q2xlYW51cCA9ICgpID0+IHsgY2xlYW51cFBvcnRGaWxlKCkuY2F0Y2goKCkgPT4ge30pOyB9O1xuICBwcm9jZXNzLm9uY2UoJ2V4aXQnLCBleGl0Q2xlYW51cCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGV4aXRDbGVhbnVwKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCBleGl0Q2xlYW51cCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHSFVQJywgZXhpdENsZWFudXApO1xufVxuXG4vKipcbiAqIFN3ZWVwIHN0YWxlIHBvcnQgZmlsZXMgZnJvbSB+Ly5kb2xsaG91c2UvcnVuLyBvbiBzdGFydHVwICgjMTg1NikuXG4gKlxuICogU2NhbnMgZm9yIHBlcm1pc3Npb24tc2VydmVyLXtwaWR9LnBvcnQgZmlsZXMgYW5kIHJlbW92ZXMgYW55IHdob3NlIFBJRFxuICogaXMgbm8gbG9uZ2VyIGFsaXZlLiBUaGlzIHByZXZlbnRzIHVuYm91bmRlZCBhY2N1bXVsYXRpb24gb2YgcG9ydCBmaWxlc1xuICogZnJvbSBjcmFzaGVkIG9yIGFiYW5kb25lZCBzZXNzaW9ucy5cbiAqXG4gKiBOb3RlOiBUaGlzIG9ubHkgcmVtb3ZlcyBtZXRhZGF0YSBmaWxlcywgbm90IHByb2Nlc3NlcyBvciBwb3J0cy4gVGhlIHBvcnRcbiAqIGJpbmRpbmcgaXRzZWxmIChpbiBiaW5kQW5kTGlzdGVuKSBpcyBhdG9taWMgdmlhIGxpc3RlbigpLiBUaGVyZSBpcyBubyByYWNlXG4gKiBiZXR3ZWVuIHN3ZWVwaW5nIGZpbGVzIGFuZCBiaW5kaW5nIOKAlCB0aGV5IG9wZXJhdGUgb24gaW5kZXBlbmRlbnQgcmVzb3VyY2VzLlxuICpcbiAqIFNhZmUgdG8gY2FsbCBvbiBldmVyeSBzdGFydHVwIOKAlCBvbmx5IHJlbW92ZXMgZmlsZXMgZm9yIGRlYWQgcHJvY2Vzc2VzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3dlZXBTdGFsZVBvcnRGaWxlcyhjdXN0b21EaXI/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRpciA9IGN1c3RvbURpciB8fCBSVU5fRElSO1xuICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKGRpcik7XG4gICAgY29uc3QgUE9SVF9GSUxFX1JFID0gL15wZXJtaXNzaW9uLXNlcnZlci0oXFxkKylcXC5wb3J0JC87XG4gICAgbGV0IHJlbW92ZWQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IFBPUlRfRklMRV9SRS5leGVjKGZpbGUpO1xuICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG4gICAgICBjb25zdCBwaWQgPSBOdW1iZXIobWF0Y2hbMV0pO1xuXG4gICAgICAvLyBDaGVjayBpZiBwcm9jZXNzIGlzIGFsaXZlIHZpYSBzaWduYWwtMC5cbiAgICAgIC8vIEVTUkNIID0gcHJvY2VzcyBkb2Vzbid0IGV4aXN0IChkZWFkKS4gRVBFUk0gPSBwcm9jZXNzIGV4aXN0cyBidXRcbiAgICAgIC8vIG93bmVkIGJ5IGFub3RoZXIgdXNlciAoYWxpdmUg4oCUIGRvbid0IHRvdWNoIHRoZWlyIHBvcnQgZmlsZSkuXG4gICAgICBsZXQgYWxpdmUgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgICAgICBhbGl2ZSA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBhbGl2ZSA9IGVycj8uY29kZSA9PT0gJ0VQRVJNJzsgLy8gRVBFUk0gPSBhbGl2ZSBidXQgZGlmZmVyZW50IHVzZXJcbiAgICAgIH1cblxuICAgICAgaWYgKCFhbGl2ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHVubGluayhqb2luKGRpciwgZmlsZSkpO1xuICAgICAgICAgIHJlbW92ZWQrKztcbiAgICAgICAgfSBjYXRjaCB7IC8qIGFscmVhZHkgZ29uZSAqLyB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlbW92ZWQgPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgW1BvcnREaXNjb3ZlcnldIFN3ZXB0ICR7cmVtb3ZlZH0gc3RhbGUgcG9ydCBmaWxlcyBmcm9tICR7ZGlyfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVtb3ZlZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdbUG9ydERpc2NvdmVyeV0gU3RhbGUgcG9ydCBmaWxlIHN3ZWVwIGZhaWxlZCcsIHtcbiAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNjb3ZlciBhbiBhdmFpbGFibGUgcG9ydCwgd3JpdGUgZGlzY292ZXJ5IGZpbGVzLCBhbmQgcmVnaXN0ZXIgY2xlYW51cC5cbiAqXG4gKiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBlbnRyeSBwb2ludCBmb3IgQ29udGFpbmVyIHN0YXJ0dXAuIENvbWJpbmVzXG4gKiBwb3J0IGRpc2NvdmVyeSwgZmlsZSB3cml0aW5nLCBhbmQgY2xlYW51cCByZWdpc3RyYXRpb24gaW4gb25lIGNhbGwuXG4gKlxuICogQHBhcmFtIGRlZmF1bHRQb3J0IC0gUG9ydCB0byB0cnkgZmlyc3QgKHNlZSBgRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlRgIGZvciB0aGUgZGVmYXVsdClcbiAqIEByZXR1cm5zIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgc2hvdWxkIGJpbmQgdG8sIG9yIHVuZGVmaW5lZCBpZiBkaXNjb3ZlcnkgZmFpbGVkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlckFuZEJpbmRQb3J0KFxuICBkZWZhdWx0UG9ydDogbnVtYmVyID0gZW52LkRPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JULFxuKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZmluZEF2YWlsYWJsZVBvcnQoZGVmYXVsdFBvcnQpO1xuXG4gICAgYXdhaXQgd3JpdGVQb3J0RmlsZShwb3J0KTtcbiAgICByZWdpc3RlclBvcnRDbGVhbnVwKCk7XG5cbiAgICByZXR1cm4gcG9ydDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1tQb3J0RGlzY292ZXJ5XSBQb3J0IGRpc2NvdmVyeSBmYWlsZWQ6JywgZXJyKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydERpc2NvdmVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWIvcG9ydERpc2NvdmVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0sVUFBVSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9FLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFNUMscURBQXFEO0FBQ3JELE1BQU0seUJBQXlCLEdBQUcsRUFBRSxDQUFDO0FBRXJDLG9FQUFvRTtBQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3JELE1BQU0sb0JBQW9CLEdBQUcsd0JBQXdCLENBQUM7QUFFdEQsU0FBUyxlQUFlLENBQUMsTUFBYyxPQUFPLEVBQUUsTUFBYyxPQUFPLENBQUMsR0FBRztJQUN2RSxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUscUJBQXFCLEdBQUcsT0FBTyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsTUFBYyxPQUFPO0lBQy9DLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCx1Q0FBdUM7QUFDdkMsSUFBSSxZQUFZLEdBQWtCLElBQUksQ0FBQztBQUV2Qzs7OztHQUlHO0FBQ0gsU0FBUyxXQUFXLENBQUMsSUFB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TSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVsRCxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixtQkFBbUIsRUFBRSxDQUFDO1FBRXRCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEeW5hbWljIHBvcnQgYWxsb2NhdGlvbiBhbmQgcG9ydCBmaWxlIGRpc2NvdmVyeSBmb3IgdGhlIHdlYiBjb25zb2xlLlxuICpcbiAqIFdoZW4gbXVsdGlwbGUgRG9sbGhvdXNlTUNQIHNlc3Npb25zIHJ1biBzaW11bHRhbmVvdXNseSAoZS5nLiwgbXVsdGlwbGVcbiAqIENsYXVkZSBDb2RlIHdpbmRvd3MsIElERSBpbnN0YW5jZXMsIG9yIGFnZW50IHNlc3Npb25zKSwgZWFjaCBuZWVkcyBpdHNcbiAqIG93biB3ZWIgY29uc29sZSBwb3J0LiBUaGlzIG1vZHVsZSBoYW5kbGVzOlxuICpcbiAqIDEuIEZpbmRpbmcgYW4gYXZhaWxhYmxlIHBvcnQgc3RhcnRpbmcgZnJvbSB0aGUgY29uZmlndXJlZCBkZWZhdWx0XG4gKiAgICAoc2VlIGBET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVGAgaW4gYHNyYy9jb25maWcvZW52LnRzYClcbiAqIDIuIFdyaXRpbmcgcG9ydCBkaXNjb3ZlcnkgZmlsZXMgc28gZXh0ZXJuYWwgdG9vbHMga25vdyB3aGljaCBwb3J0IHRvIHVzZVxuICogMy4gQ2xlYW5pbmcgdXAgcG9ydCBmaWxlcyBvbiBwcm9jZXNzIGV4aXRcbiAqXG4gKiBQb3J0IGZpbGVzIGFyZSB3cml0dGVuIHRvIH4vLmRvbGxob3VzZS9ydW4vOlxuICogLSBwZXJtaXNzaW9uLXNlcnZlci17cGlkfS5wb3J0IOKAlCBwZXItcHJvY2VzcyBmaWxlIChjbGVhbmVkIG9uIGV4aXQpXG4gKiAtIHBlcm1pc3Npb24tc2VydmVyLnBvcnQg4oCUIGxhdGVzdCBwb3J0IChjb252ZW5pZW5jZSBmb3Igc2NyaXB0cylcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVTZXJ2ZXIsIHR5cGUgU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBta2Rpciwgd3JpdGVGaWxlLCB1bmxpbmssIHJlYWRkaXIsIHJlYWRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9jb25maWcvZW52LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbi8qKiBEZWZhdWx0IG1heGltdW0gcG9ydCBhdHRlbXB0cyBiZWZvcmUgZ2l2aW5nIHVwICovXG5jb25zdCBERUZBVUxUX01BWF9QT1JUX0FUVEVNUFRTID0gMTA7XG5cbi8qKiBEaXJlY3RvcnkgZm9yIHJ1bnRpbWUgc3RhdGUgZmlsZXMgKHBvcnQgZGlzY292ZXJ5LCBQSUQgZmlsZXMpICovXG5jb25zdCBSVU5fRElSID0gam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ3J1bicpO1xuY29uc3QgTEFURVNUX1BPUlRfRklMRU5BTUUgPSAncGVybWlzc2lvbi1zZXJ2ZXIucG9ydCc7XG5cbmZ1bmN0aW9uIHBpZFBvcnRGaWxlUGF0aChkaXI6IHN0cmluZyA9IFJVTl9ESVIsIHBpZDogbnVtYmVyID0gcHJvY2Vzcy5waWQpOiBzdHJpbmcge1xuICByZXR1cm4gam9pbihkaXIsIGBwZXJtaXNzaW9uLXNlcnZlci0ke3BpZH0ucG9ydGApO1xufVxuXG5mdW5jdGlvbiBsYXRlc3RQb3J0RmlsZVBhdGgoZGlyOiBzdHJpbmcgPSBSVU5fRElSKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oZGlyLCBMQVRFU1RfUE9SVF9GSUxFTkFNRSk7XG59XG5cbi8qKiBUcmFjayBwb3J0IGZpbGUgcGF0aCBmb3IgY2xlYW51cCAqL1xubGV0IHBvcnRGaWxlUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICogQXR0ZW1wdCB0byBiaW5kIHRvIGEgc2luZ2xlIHBvcnQuIFJldHVybnMgdGhlIHBvcnQgaWYgc3VjY2Vzc2Z1bCwgbnVsbCBpZiBpbiB1c2UuXG4gKiBLZWVwcyB0aGUgc2VydmVyIGxpc3RlbmluZyB0byBwcmV2ZW50IFRPQ1RPVSByYWNlIGNvbmRpdGlvbnMg4oCUIGNhbGxlciBtdXN0XG4gKiBjbG9zZSB0aGUgcmV0dXJuZWQgc2VydmVyIGFmdGVyIHRoZWlyIG93biBzZXJ2ZXIgYmluZHMuXG4gKi9cbmZ1bmN0aW9uIHRyeUJpbmRQb3J0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8eyBwb3J0OiBudW1iZXI7IHNlcnZlcjogU2VydmVyIH0gfCBudWxsPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGNyZWF0ZVNlcnZlcigpO1xuICAgIHNlcnZlci5vbmNlKCdlcnJvcicsIChlcnI6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFERFJJTlVTRScpIHtcbiAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW1BvcnREaXNjb3ZlcnldIFVuZXhwZWN0ZWQgZXJyb3Igb24gcG9ydCAke3BvcnR9OiAke2Vyci5jb2RlfWApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNlcnZlci5vbmNlKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICByZXNvbHZlKHsgcG9ydCwgc2VydmVyIH0pO1xuICAgIH0pO1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgJzEyNy4wLjAuMScpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBGaW5kIGFuIGF2YWlsYWJsZSBwb3J0IHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuIHBvcnQuXG4gKlxuICogVHJpZXMgc2VxdWVudGlhbCBwb3J0cywgbG9nZ2luZyBlYWNoIGF0dGVtcHQuIFJldHVybnMgYm90aCB0aGUgcG9ydCBudW1iZXJcbiAqIGFuZCBhIGhlbGQgc2VydmVyIHRvIHByZXZlbnQgVE9DVE9VIHJhY2UgY29uZGl0aW9ucy4gVGhlIGNhbGxlciBzaG91bGRcbiAqIGNsb3NlIHRoZSBoZWxkIHNlcnZlciBhZnRlciBiaW5kaW5nIHRoZWlyIG93biBFeHByZXNzIGFwcCB0byB0aGUgcG9ydC5cbiAqXG4gKiBAcGFyYW0gc3RhcnRQb3J0IC0gUG9ydCB0byB0cnkgZmlyc3QgKHNlZSBgRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlRgIGZvciB0aGUgZGVmYXVsdClcbiAqIEBwYXJhbSBtYXhBdHRlbXB0cyAtIE1heGltdW0gcG9ydHMgdG8gdHJ5IChkZWZhdWx0OiAxMCwgY29uZmlndXJhYmxlIHZpYSBET0xMSE9VU0VfTUFYX1BPUlRfQVRURU1QVFMpXG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBwb3J0IG51bWJlciBhbmQgaGVsZCBzZXJ2ZXIsIG9yIHRocm93cyBpZiBhbGwgYXR0ZW1wdHMgZmFpbFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEF2YWlsYWJsZVBvcnQoXG4gIHN0YXJ0UG9ydDogbnVtYmVyLFxuICBtYXhBdHRlbXB0czogbnVtYmVyID0gTnVtYmVyKHByb2Nlc3MuZW52LkRPTExIT1VTRV9NQVhfUE9SVF9BVFRFTVBUUykgfHwgREVGQVVMVF9NQVhfUE9SVF9BVFRFTVBUUyxcbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IHBvcnQgPSBzdGFydFBvcnQgKyBhdHRlbXB0O1xuICAgIGxvZ2dlci5kZWJ1ZyhgW1BvcnREaXNjb3ZlcnldIFRyeWluZyBwb3J0ICR7cG9ydH0gKGF0dGVtcHQgJHthdHRlbXB0ICsgMX0vJHttYXhBdHRlbXB0c30pYCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cnlCaW5kUG9ydChwb3J0KTtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICAvLyBDbG9zZSB0aGUgcHJvYmUgc2VydmVyIOKAlCB0aGVyZSdzIGEgYnJpZWYgVE9DVE9VIHdpbmRvdyBoZXJlIGJldHdlZW5cbiAgICAgIC8vIGNsb3NpbmcgYW5kIHRoZSBjYWxsZXIgYmluZGluZywgYnV0IGl0J3MgbmVnbGlnaWJsZSBvbiBsb2NhbGhvc3QuXG4gICAgICAvLyBBIGZ1dHVyZSBpbXByb3ZlbWVudCBjb3VsZCByZXR1cm4gdGhlIHNlcnZlciBmb3IgdGhlIGNhbGxlciB0byBhZG9wdC5cbiAgICAgIHJlc3VsdC5zZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIGlmIChhdHRlbXB0ID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW1BvcnREaXNjb3ZlcnldIFBvcnQgJHtzdGFydFBvcnR9IGluIHVzZSwgdXNpbmcgJHtwb3J0fSAoYWZ0ZXIgJHthdHRlbXB0fSBza2lwJHthdHRlbXB0ID4gMSA/ICdzJyA6ICcnfSlgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwb3J0O1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoYFtQb3J0RGlzY292ZXJ5XSBQb3J0ICR7cG9ydH0gaW4gdXNlLCB0cnlpbmcgbmV4dGApO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBObyBhdmFpbGFibGUgcG9ydCBmb3VuZCBpbiByYW5nZSAke3N0YXJ0UG9ydH0tJHtzdGFydFBvcnQgKyBtYXhBdHRlbXB0cyAtIDF9IGAgK1xuICAgIGBhZnRlciAke21heEF0dGVtcHRzfSBhdHRlbXB0cy4gU2V0IERPTExIT1VTRV9NQVhfUE9SVF9BVFRFTVBUUyB0byBpbmNyZWFzZSB0aGUgcmFuZ2UuYFxuICApO1xufVxuXG4vKipcbiAqIFdyaXRlIHRoZSBhY3RpdmUgc2VydmVyIHBvcnQgdG8gYSBkaXNjb3ZlcmFibGUgZmlsZS5cbiAqXG4gKiBDcmVhdGVzIHR3byBmaWxlczpcbiAqIC0gUElELWtleWVkIGZpbGUgZm9yIHBlci1wcm9jZXNzIGNsZWFudXBcbiAqIC0gTGF0ZXN0IGZpbGUgZm9yIGNvbnZlbmllbmNlIChzY3JpcHRzIGNhbiByZWFkIHRoaXMgd2l0aG91dCBrbm93aW5nIHRoZSBQSUQpXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCB0aGUgd2ViIHNlcnZlciBpcyBsaXN0ZW5pbmcgb25cbiAqIEByZXR1cm5zIFBhdGggdG8gdGhlIFBJRC1rZXllZCBwb3J0IGZpbGVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlUG9ydEZpbGUocG9ydDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgYXdhaXQgbWtkaXIoUlVOX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IHBpZEZpbGUgPSBwaWRQb3J0RmlsZVBhdGgoKTtcbiAgY29uc3QgbGF0ZXN0RmlsZSA9IGxhdGVzdFBvcnRGaWxlUGF0aCgpO1xuICBhd2FpdCB3cml0ZUZpbGUocGlkRmlsZSwgU3RyaW5nKHBvcnQpLCAndXRmLTgnKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGxhdGVzdEZpbGUsIFN0cmluZyhwb3J0KSwgJ3V0Zi04Jyk7XG4gIHBvcnRGaWxlUGF0aCA9IHBpZEZpbGU7XG4gIGxvZ2dlci5kZWJ1ZyhgW1BvcnREaXNjb3ZlcnldIFBvcnQgZmlsZSB3cml0dGVuOiAke3BpZEZpbGV9YCk7XG4gIHJldHVybiBwaWRGaWxlO1xufVxuXG4vKipcbiAqIFJlc3RvcmUgb3IgdXBkYXRlIHRoZSBzaGFyZWQgbGF0ZXN0IHBvcnQgZmlsZSBmb3IgdGhlIGFjdGl2ZSBsaXN0ZW5lci5cbiAqXG4gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZmlsZSBoYWQgdG8gYmUgd3JpdHRlbiBvciB1cGRhdGVkLCBmYWxzZSB3aGVuIGl0XG4gKiBhbHJlYWR5IG1hdGNoZWQgdGhlIGFjdGl2ZSBwb3J0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTGF0ZXN0UG9ydEZpbGUocG9ydDogbnVtYmVyLCBjdXN0b21EaXI/OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZGlyID0gY3VzdG9tRGlyIHx8IFJVTl9ESVI7XG4gIGNvbnN0IGxhdGVzdEZpbGUgPSBsYXRlc3RQb3J0RmlsZVBhdGgoZGlyKTtcbiAgY29uc3QgZGVzaXJlZFZhbHVlID0gU3RyaW5nKHBvcnQpO1xuXG4gIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBleGlzdGluZ1ZhbHVlID0gKGF3YWl0IHJlYWRGaWxlKGxhdGVzdEZpbGUsICd1dGYtOCcpKS50cmltKCk7XG4gICAgaWYgKGV4aXN0aW5nVmFsdWUgPT09IGRlc2lyZWRWYWx1ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTWlzc2luZy91bnJlYWRhYmxlIGZpbGUg4oCUIHJld3JpdGUgYmVsb3cuXG4gIH1cblxuICBhd2FpdCB3cml0ZUZpbGUobGF0ZXN0RmlsZSwgZGVzaXJlZFZhbHVlLCAndXRmLTgnKTtcbiAgbG9nZ2VyLmRlYnVnKGBbUG9ydERpc2NvdmVyeV0gU2hhcmVkIGxhdGVzdCBwb3J0IGZpbGUgcmVmcmVzaGVkOiAke2xhdGVzdEZpbGV9YCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENsZWFuIHVwIHBvcnQgZmlsZSBvbiBzaHV0ZG93bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFudXBQb3J0RmlsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHBvcnRGaWxlUGF0aCkge1xuICAgIHRyeSB7IGF3YWl0IHVubGluayhwb3J0RmlsZVBhdGgpOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBnb25lICovIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHByb2Nlc3MgZXhpdCBoYW5kbGVycyB0byBjbGVhbiB1cCBwb3J0IGZpbGVzLlxuICogU2hvdWxkIGJlIGNhbGxlZCBvbmNlIGFmdGVyIHRoZSB3ZWIgc2VydmVyIHN1Y2Nlc3NmdWxseSBzdGFydHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclBvcnRDbGVhbnVwKCk6IHZvaWQge1xuICBjb25zdCBleGl0Q2xlYW51cCA9ICgpID0+IHsgY2xlYW51cFBvcnRGaWxlKCkuY2F0Y2goKCkgPT4ge30pOyB9O1xuICBwcm9jZXNzLm9uY2UoJ2V4aXQnLCBleGl0Q2xlYW51cCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGV4aXRDbGVhbnVwKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdJTlQnLCBleGl0Q2xlYW51cCk7XG4gIHByb2Nlc3Mub25jZSgnU0lHSFVQJywgZXhpdENsZWFudXApO1xufVxuXG4vKipcbiAqIFN3ZWVwIHN0YWxlIHBvcnQgZmlsZXMgZnJvbSB+Ly5kb2xsaG91c2UvcnVuLyBvbiBzdGFydHVwICgjMTg1NikuXG4gKlxuICogU2NhbnMgZm9yIHBlcm1pc3Npb24tc2VydmVyLXtwaWR9LnBvcnQgZmlsZXMgYW5kIHJlbW92ZXMgYW55IHdob3NlIFBJRFxuICogaXMgbm8gbG9uZ2VyIGFsaXZlLiBUaGlzIHByZXZlbnRzIHVuYm91bmRlZCBhY2N1bXVsYXRpb24gb2YgcG9ydCBmaWxlc1xuICogZnJvbSBjcmFzaGVkIG9yIGFiYW5kb25lZCBzZXNzaW9ucy5cbiAqXG4gKiBOb3RlOiBUaGlzIG9ubHkgcmVtb3ZlcyBtZXRhZGF0YSBmaWxlcywgbm90IHByb2Nlc3NlcyBvciBwb3J0cy4gVGhlIHBvcnRcbiAqIGJpbmRpbmcgaXRzZWxmIChpbiBiaW5kQW5kTGlzdGVuKSBpcyBhdG9taWMgdmlhIGxpc3RlbigpLiBUaGVyZSBpcyBubyByYWNlXG4gKiBiZXR3ZWVuIHN3ZWVwaW5nIGZpbGVzIGFuZCBiaW5kaW5nIOKAlCB0aGV5IG9wZXJhdGUgb24gaW5kZXBlbmRlbnQgcmVzb3VyY2VzLlxuICpcbiAqIFNhZmUgdG8gY2FsbCBvbiBldmVyeSBzdGFydHVwIOKAlCBvbmx5IHJlbW92ZXMgZmlsZXMgZm9yIGRlYWQgcHJvY2Vzc2VzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3dlZXBTdGFsZVBvcnRGaWxlcyhjdXN0b21EaXI/OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRpciA9IGN1c3RvbURpciB8fCBSVU5fRElSO1xuICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCByZWFkZGlyKGRpcik7XG4gICAgY29uc3QgUE9SVF9GSUxFX1JFID0gL15wZXJtaXNzaW9uLXNlcnZlci0oXFxkKylcXC5wb3J0JC87XG4gICAgbGV0IHJlbW92ZWQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IFBPUlRfRklMRV9SRS5leGVjKGZpbGUpO1xuICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG4gICAgICBjb25zdCBwaWQgPSBOdW1iZXIobWF0Y2hbMV0pO1xuXG4gICAgICAvLyBDaGVjayBpZiBwcm9jZXNzIGlzIGFsaXZlIHZpYSBzaWduYWwtMC5cbiAgICAgIC8vIEVTUkNIID0gcHJvY2VzcyBkb2Vzbid0IGV4aXN0IChkZWFkKS4gRVBFUk0gPSBwcm9jZXNzIGV4aXN0cyBidXRcbiAgICAgIC8vIG93bmVkIGJ5IGFub3RoZXIgdXNlciAoYWxpdmUg4oCUIGRvbid0IHRvdWNoIHRoZWlyIHBvcnQgZmlsZSkuXG4gICAgICBsZXQgYWxpdmUgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgICAgICBhbGl2ZSA9IHRydWU7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBhbGl2ZSA9IGVycj8uY29kZSA9PT0gJ0VQRVJNJzsgLy8gRVBFUk0gPSBhbGl2ZSBidXQgZGlmZmVyZW50IHVzZXJcbiAgICAgIH1cblxuICAgICAgaWYgKCFhbGl2ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHVubGluayhqb2luKGRpciwgZmlsZSkpO1xuICAgICAgICAgIHJlbW92ZWQrKztcbiAgICAgICAgfSBjYXRjaCB7IC8qIGFscmVhZHkgZ29uZSAqLyB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlbW92ZWQgPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhgW1BvcnREaXNjb3ZlcnldIFN3ZXB0ICR7cmVtb3ZlZH0gc3RhbGUgcG9ydCBmaWxlcyBmcm9tICR7ZGlyfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVtb3ZlZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdbUG9ydERpc2NvdmVyeV0gU3RhbGUgcG9ydCBmaWxlIHN3ZWVwIGZhaWxlZCcsIHtcbiAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNjb3ZlciBhbiBhdmFpbGFibGUgcG9ydCwgd3JpdGUgZGlzY292ZXJ5IGZpbGVzLCBhbmQgcmVnaXN0ZXIgY2xlYW51cC5cbiAqXG4gKiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBlbnRyeSBwb2ludCBmb3IgQ29udGFpbmVyIHN0YXJ0dXAuIENvbWJpbmVzXG4gKiBwb3J0IGRpc2NvdmVyeSwgZmlsZSB3cml0aW5nLCBhbmQgY2xlYW51cCByZWdpc3RyYXRpb24gaW4gb25lIGNhbGwuXG4gKlxuICogQHBhcmFtIGRlZmF1bHRQb3J0IC0gUG9ydCB0byB0cnkgZmlyc3QgKHNlZSBgRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlRgIGZvciB0aGUgZGVmYXVsdClcbiAqIEByZXR1cm5zIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgc2hvdWxkIGJpbmQgdG8sIG9yIHVuZGVmaW5lZCBpZiBkaXNjb3ZlcnkgZmFpbGVkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNjb3ZlckFuZEJpbmRQb3J0KFxuICBkZWZhdWx0UG9ydDogbnVtYmVyID0gZW52LkRPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JULFxuKTogUHJvbWlzZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZmluZEF2YWlsYWJsZVBvcnQoZGVmYXVsdFBvcnQpO1xuXG4gICAgYXdhaXQgd3JpdGVQb3J0RmlsZShwb3J0KTtcbiAgICByZWdpc3RlclBvcnRDbGVhbnVwKCk7XG5cbiAgICByZXR1cm4gcG9ydDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oJ1tQb3J0RGlzY292ZXJ5XSBQb3J0IGRpc2NvdmVyeSBmYWlsZWQ6JywgZXJyKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
@@ -105,6 +105,30 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
105
105
  let activeSort = 'date-desc';
106
106
  let activeSource = 'all'; // 'all' | 'collection' | 'portfolio'
107
107
  let searchQuery = '';
108
+ const DOLLHOUSE_SESSION_ID = document.querySelector('meta[name="dollhouse-session-id"]')?.content || '';
109
+ const DOLLHOUSE_RUNTIME_SESSION_ID = document.querySelector('meta[name="dollhouse-runtime-session-id"]')?.content || '';
110
+
111
+ function escHtml(value) {
112
+ return String(value)
113
+ .replaceAll('&', '&amp;')
114
+ .replaceAll('<', '&lt;')
115
+ .replaceAll('>', '&gt;')
116
+ .replaceAll('"', '&quot;')
117
+ .replaceAll("'", '&#39;');
118
+ }
119
+
120
+ function renderHeaderStatsMarkup(primaryMarkup) {
121
+ const sessionTitle = DOLLHOUSE_RUNTIME_SESSION_ID && DOLLHOUSE_RUNTIME_SESSION_ID !== DOLLHOUSE_SESSION_ID
122
+ ? `Stable session ${DOLLHOUSE_SESSION_ID}; runtime ${DOLLHOUSE_RUNTIME_SESSION_ID}`
123
+ : `Stable session ${DOLLHOUSE_SESSION_ID}`;
124
+ const sessionMarkup = DOLLHOUSE_SESSION_ID
125
+ ? `
126
+ <span class="stat stat--session" title="${escHtml(sessionTitle)}">
127
+ <strong>${escHtml(DOLLHOUSE_SESSION_ID)}</strong> session
128
+ </span>`
129
+ : '';
130
+ return `${primaryMarkup}${sessionMarkup}`;
131
+ }
108
132
 
109
133
  // ── Bootstrap ──────────────────────────────────────────────────────────────
110
134
 
@@ -121,10 +145,10 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
121
145
  renderTopicFilters();
122
146
  applyFilters();
123
147
  const statsEl = document.getElementById('stats');
124
- if (statsEl) statsEl.innerHTML = `
148
+ if (statsEl) statsEl.innerHTML = renderHeaderStatsMarkup(`
125
149
  <span class="stat"><strong>${localElements.length}</strong> portfolio</span>
126
150
  <span class="stat"><strong>${collectionElements.length}</strong> collection</span>
127
- `;
151
+ `);
128
152
  }
129
153
 
130
154
  async function init() {
@@ -208,10 +232,10 @@ globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
208
232
  const el = document.getElementById('stats');
209
233
  if (!el) return;
210
234
  const types = Object.keys(data.index).length;
211
- el.innerHTML = `
235
+ el.innerHTML = renderHeaderStatsMarkup(`
212
236
  <span class="stat"><strong>${data.total_elements}</strong> elements</span>
213
237
  <span class="stat"><strong>${types}</strong> types</span>
214
- `;
238
+ `);
215
239
  }
216
240
 
217
241
  // ── Type filter chips ──────────────────────────────────────────────────────
@@ -14,6 +14,8 @@
14
14
  <meta name="dollhouse-console-token" content="{{CONSOLE_TOKEN}}">
15
15
  <!-- Server version — injected at request time for version-aware UI behaviour (e.g. setup-seen per version). -->
16
16
  <meta name="dollhouse-server-version" content="{{DOLLHOUSE_VERSION}}">
17
+ <meta name="dollhouse-session-id" content="{{DOLLHOUSE_SESSION_ID}}">
18
+ <meta name="dollhouse-runtime-session-id" content="{{DOLLHOUSE_RUNTIME_SESSION_ID}}">
17
19
  <!-- Asset version — injected at request time for cache-busting local CSS/JS/img files. -->
18
20
  <meta name="dollhouse-console-asset-version" content="{{DOLLHOUSE_ASSET_VERSION}}">
19
21
  <link rel="stylesheet" href="fonts.css?v={{DOLLHOUSE_ASSET_VERSION}}">