@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
@@ -62,6 +62,10 @@ export interface WebServerOptions {
62
62
  * middleware is a pass-through when the flag is false (the Phase 1 default).
63
63
  */
64
64
  tokenStore?: ConsoleTokenStore;
65
+ /** Stable Dollhouse session identity shown in the web console UI. */
66
+ sessionId?: string;
67
+ /** Runtime-unique session identity for diagnostics. */
68
+ runtimeSessionId?: string;
65
69
  }
66
70
  /**
67
71
  * Result of attempting to bind the HTTP server to a port.
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAiBH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AA8CnE,qEAAqE;AACrE,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAQxC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAOxC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kFAAkF;IAClF,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,6FAA6F;IAC7F,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,OAAO,SAAS,EAAE,MAAM,EAAE,CAAC;IAC/C;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,GAAG,CAAC,EAAE,OAAO,SAAS,EAAE,OAAO,CAAC;IAChC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,qBAAqB,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9E,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,qBAAqB,EAAE,cAAc,KAAK,IAAI,CAAC;IACrF,yCAAyC;IACzC,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,cAAc,EAAE,OAAO,CAAC;IACxB,kDAAkD;IAClD,aAAa,EAAE,OAAO,CAAC;IACvB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsCD;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAgOxF;AA6DD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AA2DtG;;;;;;;;;;;;GAYG;AACH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC;AAoDD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4BlG"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,10 @@ const PUBLIC_PATH_PREFIXES = [
44
44
  const TOKEN_META_PLACEHOLDER = '{{CONSOLE_TOKEN}}';
45
45
  /** Placeholder in index.html that is replaced with the running server version. */
46
46
  const VERSION_META_PLACEHOLDER = '{{DOLLHOUSE_VERSION}}';
47
+ /** Placeholder in index.html that is replaced with the stable Dollhouse session ID. */
48
+ const SESSION_ID_META_PLACEHOLDER = '{{DOLLHOUSE_SESSION_ID}}';
49
+ /** Placeholder in index.html that is replaced with the runtime session ID. */
50
+ const RUNTIME_SESSION_ID_META_PLACEHOLDER = '{{DOLLHOUSE_RUNTIME_SESSION_ID}}';
47
51
  /** Placeholder in index.html that is replaced with the asset cache-busting version. */
48
52
  const ASSET_VERSION_META_PLACEHOLDER = '{{DOLLHOUSE_ASSET_VERSION}}';
49
53
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -300,9 +304,23 @@ export async function startWebServer(options) {
300
304
  .replaceAll("'", ''')
301
305
  .replaceAll('<', '&lt;')
302
306
  .replaceAll('>', '&gt;');
307
+ const escapedSessionId = (options.sessionId ?? '')
308
+ .replaceAll('&', '&amp;')
309
+ .replaceAll('"', '&quot;')
310
+ .replaceAll("'", '&#39;')
311
+ .replaceAll('<', '&lt;')
312
+ .replaceAll('>', '&gt;');
313
+ const escapedRuntimeSessionId = (options.runtimeSessionId ?? '')
314
+ .replaceAll('&', '&amp;')
315
+ .replaceAll('"', '&quot;')
316
+ .replaceAll("'", '&#39;')
317
+ .replaceAll('<', '&lt;')
318
+ .replaceAll('>', '&gt;');
303
319
  cachedIndexHtml = template
304
320
  .replaceAll(TOKEN_META_PLACEHOLDER, escapedToken)
305
321
  .replaceAll(VERSION_META_PLACEHOLDER, PACKAGE_VERSION)
322
+ .replaceAll(SESSION_ID_META_PLACEHOLDER, escapedSessionId)
323
+ .replaceAll(RUNTIME_SESSION_ID_META_PLACEHOLDER, escapedRuntimeSessionId)
306
324
  .replaceAll(ASSET_VERSION_META_PLACEHOLDER, PACKAGE_VERSION);
307
325
  cachedTokenValue = tokenValue;
308
326
  return cachedIndexHtml;
@@ -518,4 +536,4 @@ export async function openPortfolioBrowser(options) {
518
536
  ...(browserResult.error ? { warning: `Browser could not be opened automatically: ${browserResult.error}. Open ${url} manually.` } : {}),
519
537
  };
520
538
  }
521
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQTRCLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUt2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFMUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLGFBQWE7SUFDYixvQkFBb0I7SUFDcEIsaUJBQWlCO0lBQ2pCLG1CQUFtQjtJQUNuQixvQkFBb0I7Q0FDckIsQ0FBQztBQUVGLGlGQUFpRjtBQUNqRixNQUFNLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDO0FBQ25ELGtGQUFrRjtBQUNsRixNQUFNLHdCQUF3QixHQUFHLHVCQUF1QixDQUFDO0FBQ3pELHVGQUF1RjtBQUN2RixNQUFNLDhCQUE4QixHQUFHLDZCQUE2QixDQUFDO0FBRXJFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFEOzs7OztHQUtHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLDBCQUEwQixDQUFDO0FBQ3BELE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDO0FBQzNDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMzRCxtR0FBbUc7QUFDbkcsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFFL0Isa0VBQWtFO0FBQ2xFLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztBQUMxQixJQUFJLFVBQVUsR0FBRyxZQUFZLENBQUM7QUFDOUIsK0VBQStFO0FBQy9FLElBQUksZ0JBQWdCLEdBQXNDLElBQUksQ0FBQztBQUMvRCxtR0FBbUc7QUFDbkcsSUFBSSxnQkFBZ0IsR0FBNkIsSUFBSSxDQUFDO0FBRXRELHFFQUFxRTtBQUNyRSxNQUFNLFVBQVUsa0JBQWtCO0lBQ2hDLE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBQ0QsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN0QixVQUFVLEdBQUcsWUFBWSxDQUFDO0lBQzFCLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUMxQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4QixhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQztBQUNILENBQUM7QUEwRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsYUFBYSxDQUFDLEdBQVc7SUFDaEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE1BQU0sSUFBSSxHQUFHLFFBQVEsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDcEMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU87Z0JBQzVCLENBQUMsQ0FBQyxVQUFVLENBQUM7UUFFZiw4RUFBOEU7UUFDOUUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsNERBQTRELENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0UsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsa0NBQWtDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLE9BQU87UUFDVCxDQUFDO1FBQ0QsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDOUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixNQUFNLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDbkUsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDbEQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsT0FBeUI7SUFDNUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxZQUFZLENBQUM7SUFDMUMsTUFBTSxNQUFNLEdBQW9CLEVBQUUsQ0FBQztJQUVuQyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hCLGFBQWEsQ0FBQyxVQUFVLFlBQVksSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsTUFBTSxHQUFHLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDdEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUU1QixtQkFBbUI7SUFDbkIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDMUIsR0FBRyxDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNuRCxHQUFHLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLEdBQUcsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDbkQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUNoRCxHQUFHLENBQUMsU0FBUyxDQUFDLDZCQUE2QixFQUFFLFVBQVUsWUFBWSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0UsR0FBRyxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsRUFBRTtZQUN2QyxvQkFBb0I7WUFDcEIseURBQXlEO1lBQ3pELHdFQUF3RTtZQUN4RSxzQkFBc0I7WUFDdEIsOENBQThDO1lBQzlDLGlCQUFpQjtTQUNsQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDLENBQUMsQ0FBQztJQUVILDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsZ0ZBQWdGO0lBQ2hGLGtGQUFrRjtJQUNsRixJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN2QixNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQztZQUMxQyxLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDekIsT0FBTyxFQUFFLEdBQUcsQ0FBQywwQkFBMEI7WUFDdkMsa0JBQWtCLEVBQUUsb0JBQW9CO1lBQ3hDLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLElBQUksQ0FDVCwyQ0FBMkMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixFQUFFLENBQ3RILENBQUM7UUFFRix5RUFBeUU7UUFDekUseUVBQXlFO1FBQ3pFLHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsd0VBQXdFO1FBQ3hFLGdDQUFnQztRQUNoQyxHQUFHLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUUsTUFBTSxDQUFDLElBQUksQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDO1FBRWpGLDBFQUEwRTtRQUMxRSwwRUFBMEU7UUFDMUUsaUVBQWlFO1FBQ2pFLEdBQUcsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoRixNQUFNLENBQUMsSUFBSSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELG1GQUFtRjtJQUNuRiw4RkFBOEY7SUFDOUYsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLE1BQU0sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSx5QkFBeUIsRUFBRSxHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFDN00sR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDaEUsR0FBRyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUN2RSxHQUFHLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzlDLEdBQUcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxHQUFHLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNqRCxHQUFHLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ25FLEdBQUcsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDN0UsR0FBRyxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxlQUFlLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUNsRixNQUFNLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFFMUQsNEVBQTRFO0lBQzVFLDBFQUEwRTtJQUMxRSw0REFBNEQ7SUFDNUQsMEJBQTBCLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FDdkMsTUFBTSxDQUFDLElBQUksQ0FBQyxrREFBa0QsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FDbEgsQ0FBQztJQUVGLDBFQUEwRTtJQUMxRSxJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxQixHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRXJGLG9GQUFvRjtRQUNwRixNQUFNLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2xGLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0RCx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVELEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTVCLE1BQU0sQ0FBQyxJQUFJLENBQUMsOERBQThELENBQUMsQ0FBQztJQUM5RSxDQUFDO1NBQU0sQ0FBQztRQUNOLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLGtGQUFrRixDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVELHNFQUFzRTtJQUN0RSwyQ0FBMkM7SUFDM0Msa0JBQWtCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUV6QyxvRkFBb0Y7SUFDcEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUQsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZDQUE4QyxHQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyRixDQUFDLENBQUMsQ0FBQztJQUNILEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUU1Qzs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUN4QyxJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QyxNQUFNLEtBQUssR0FBRyxLQUFLO2lCQUNoQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksdUJBQXVCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMxRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCw0RkFBNEY7SUFDNUYsT0FBTyxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUU5RCx3QkFBd0I7SUFDeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM1QyxtRUFBbUU7SUFDbkUscUVBQXFFO0lBQ3JFLGtFQUFrRTtJQUNsRSxxREFBcUQ7SUFDckQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNoQyxLQUFLLEVBQUUsS0FBSztRQUNaLG1FQUFtRTtRQUNuRSxpRUFBaUU7UUFDakUsR0FBRyxDQUFDLE9BQU87WUFDVCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUNqRCxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztLQUN2QyxDQUFDLENBQUMsQ0FBQztJQUVKLHFEQUFxRDtJQUNyRCxtRkFBbUY7SUFDbkYsNkVBQTZFO0lBQzdFLCtFQUErRTtJQUMvRSxrRUFBa0U7SUFDbEUsSUFBSSxlQUFlLEdBQWtCLElBQUksQ0FBQztJQUMxQyxJQUFJLGdCQUFnQixHQUFrQixJQUFJLENBQUM7SUFDM0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUVwRCxNQUFNLGVBQWUsR0FBRyxLQUFLLElBQXFCLEVBQUU7UUFDbEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNwRSwyREFBMkQ7UUFDM0QsaUZBQWlGO1FBQ2pGLElBQUksQ0FBQyxPQUFPLElBQUksZUFBZSxLQUFLLElBQUksSUFBSSxnQkFBZ0IsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM1RSxPQUFPLGVBQWUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELDJFQUEyRTtRQUMzRSx3RUFBd0U7UUFDeEUsNEVBQTRFO1FBQzVFLE1BQU0sWUFBWSxHQUFHLFVBQVU7YUFDNUIsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7YUFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7YUFDekIsVUFBVSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUM7YUFDeEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUM7YUFDdkIsVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzQixlQUFlLEdBQUcsUUFBUTthQUN2QixVQUFVLENBQUMsc0JBQXNCLEVBQUUsWUFBWSxDQUFDO2FBQ2hELFVBQVUsQ0FBQyx3QkFBd0IsRUFBRSxlQUFlLENBQUM7YUFDckQsVUFBVSxDQUFDLDhCQUE4QixFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQy9ELGdCQUFnQixHQUFHLFVBQVUsQ0FBQztRQUM5QixPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDLENBQUM7SUFFRixHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUUsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxtQkFBbUIsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLEdBQUcsTUFBTSxlQUFlLEVBQUUsQ0FBQztZQUNyQyxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1lBQzFELG9FQUFvRTtZQUNwRSxtRUFBbUU7WUFDbkUsZ0RBQWdEO1lBQ2hELEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLHFDQUFxQyxDQUFDLENBQUM7WUFDdEUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0NBQXlDLEdBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQy9FLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsdUZBQXVGO0lBQ3ZGLGtGQUFrRjtJQUNsRixrRkFBa0Y7SUFDbEYsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVUsRUFBRSxJQUErQixFQUFFLEdBQStCLEVBQUUsS0FBcUMsRUFBRSxFQUFFO1FBQzlILE1BQU0sTUFBTSxHQUFJLEdBQVcsQ0FBQyxNQUFNLElBQUssR0FBVyxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUM7UUFDckUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCw2REFBNkQ7SUFDN0Qsa0ZBQWtGO0lBQ2xGLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1RCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUN6QixHQUE4QixFQUM5QixPQUF5QixFQUN6QixNQUF1QjtJQUV2QixJQUFJLFNBQXNDLENBQUM7SUFDM0MsSUFBSSxhQUE4QyxDQUFDO0lBRW5ELElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLFNBQVMsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QixhQUFhLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pELEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxNQUFNLENBQUMsaUJBQWlCLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQztRQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO1lBQ3RDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtZQUM5QixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDaEMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMzRCxrQkFBa0IsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDeEUsQ0FBQyxDQUFDO1FBQ0gsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDaEMsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLElBQVksRUFBRSxVQUF5QztJQUNqRixNQUFNLEdBQUcsR0FBRyxVQUFVLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUM3QyxNQUFNLFdBQVcsR0FBRyxvQkFBb0IsSUFBSSxFQUFFLENBQUM7SUFDL0MsTUFBTSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM1RCxPQUFPLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxHQUFHLE9BQU8sV0FBVyxlQUFlLENBQUMsQ0FBQztJQUM5RixJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsVUFBVSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxpR0FBaUc7QUFDakcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXRHOztHQUVHO0FBQ0gsU0FBUyxXQUFXLENBQ2xCLEdBQThCLEVBQzlCLElBQVksRUFDWixPQUF5QjtJQUV6QixPQUFPLElBQUksT0FBTyxDQUFhLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDekMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRTtZQUNwRCxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFDbEIsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO1lBQzlCLGtCQUFrQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0MsSUFBSSxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3hCLGFBQWEsQ0FBQyxVQUFVLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFDRCxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUNILFVBQVUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBMEIsRUFBRSxFQUFFO1lBQ3BELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxRQUFRLElBQUksaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1lBQzFGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixJQUFJLEtBQUssR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3BFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDbkUsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLGFBQWEsQ0FDMUIsR0FBOEIsRUFDOUIsSUFBWSxFQUNaLE9BQXlCO0lBRXpCLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckQsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssWUFBWTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBRW5FLDJEQUEyRDtJQUMzRCxJQUFJLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNqQyxNQUFNLFdBQVcsR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzFELElBQUksV0FBVyxDQUFDLE9BQU87WUFBRSxPQUFPLFdBQVcsQ0FBQztJQUM5QyxDQUFDO0lBRUQsK0NBQStDO0lBQy9DLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksbURBQW1ELENBQUMsQ0FBQztJQUNyRixPQUFPLENBQUMsS0FBSyxDQUFDLHFFQUFxRSxZQUFZLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQztJQUM3RyxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QixhQUFhLENBQUMsVUFBVSxZQUFZLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQTRCRDs7OztHQUlHO0FBQ0gsS0FBSyxVQUFVLG1CQUFtQixDQUFDLE9BQTJCLEVBQUUsSUFBWTtJQUMxRSxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQ3BDLElBQUksV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFFdEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUNyRixVQUFVLEdBQUcsSUFBSSxPQUFPLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEgsQ0FBQztJQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixNQUFNLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUNqRyxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGdGQUFnRjtJQUNoRixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QixNQUFNLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUNwRixNQUFNLEVBQUUsbUJBQW1CLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzFFLGdCQUFnQixHQUFHLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQztZQUFDLE1BQU0sZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUN4RSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxREFBcUQsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVELHVGQUF1RjtJQUN2RixJQUFJLGFBQTJGLENBQUM7SUFDaEcsTUFBTSxFQUFFLGtCQUFrQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUN6RSxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQztRQUN0QyxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUssQ0FBQztRQUMvQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7S0FDdEUsQ0FBQyxDQUFDO0lBQ0gsWUFBWSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFFdEMsTUFBTSxTQUFTLEdBQUcsTUFBTSxjQUFjLENBQUM7UUFDckMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1FBQ2xDLElBQUk7UUFDSixXQUFXLEVBQUUsS0FBSztRQUNsQixhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7UUFDcEMsVUFBVTtRQUNWLFdBQVc7UUFDWCxVQUFVLEVBQUUsZ0JBQWdCO1FBQzVCLGlCQUFpQixFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztLQUN6QyxDQUFDLENBQUM7SUFFSCxhQUFhLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztBQUN6QyxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FBQyxPQUEyQjtJQUNwRSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLFlBQVksQ0FBQztJQUNoRCxNQUFNLE9BQU8sR0FBRyxVQUFVLFlBQVksSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUV2RCx3REFBd0Q7SUFDeEQsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDO0lBQ2xCLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RGLEdBQUcsR0FBRyxHQUFHLE9BQU8sS0FBSyxPQUFPLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDMUQsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxlQUFlLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzdELEdBQUcsR0FBRyxHQUFHLE9BQU8sZUFBZSxFQUFFLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDO0lBRXJDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQixNQUFNLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFL0MsT0FBTztRQUNMLEdBQUc7UUFDSCxjQUFjO1FBQ2QsYUFBYSxFQUFFLGFBQWEsQ0FBQyxPQUFPO1FBQ3BDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSw4Q0FBOEMsYUFBYSxDQUFDLEtBQUssVUFBVSxHQUFHLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDeEksQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERvbGxob3VzZU1DUCBXZWIgVUkgU2VydmVyXG4gKlxuICogTGlnaHR3ZWlnaHQgRXhwcmVzcyBzZXJ2ZXIgZm9yIGJyb3dzaW5nIHBvcnRmb2xpbyBlbGVtZW50cyBpbiBhIGJyb3dzZXIuXG4gKiBCb3VuZCB0byAxMjcuMC4wLjEgb25seSAobG9jYWxob3N0KS4gUmVhZC1vbmx5IGZvciBWMS5cbiAqXG4gKiBDYW4gYmUgc3RhcnRlZCBzdGFuZGFsb25lIChgLS13ZWJgIGZsYWcpIG9yIGZyb20gd2l0aGluIHRoZSBNQ1Agc2VydmVyXG4gKiBwcm9jZXNzIHZpYSBgb3BlblBvcnRmb2xpb0Jyb3dzZXIoKWAuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXItdjItcmVmYWN0b3IvaXNzdWVzLzcwNFxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXItdjItcmVmYWN0b3IvaXNzdWVzLzc3NFxuICovXG5cbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgam9pbiwgZGlybmFtZSwgZXh0bmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgZXhlY0ZpbGUgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcGxhdGZvcm0gfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCByZWFkRmlsZSBhcyByZWFkRmlsZUZzIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVBcGlSb3V0ZXMsIGNyZWF0ZUdhdGV3YXlBcGlSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dSb3V0ZXMsIHR5cGUgTG9nUm91dGVzUmVzdWx0IH0gZnJvbSAnLi9yb3V0ZXMvbG9nUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZU1ldHJpY3NSb3V0ZXMsIHR5cGUgTWV0cmljc1JvdXRlc1Jlc3VsdCB9IGZyb20gJy4vcm91dGVzL21ldHJpY3NSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlSGVhbHRoUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMvaGVhbHRoUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNldHVwUm91dGVzLCByZXBhaXJOdm1MYXVuY2hlck9uU3RhcnR1cCB9IGZyb20gJy4vcm91dGVzL3NldHVwUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVRvdHBSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy90b3RwUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZVRva2VuUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMvdG9rZW5Sb3V0ZXMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uL2NvbmZpZy9lbnYuanMnO1xuaW1wb3J0IHR5cGUgeyBNQ1BBUUxIYW5kbGVyIH0gZnJvbSAnLi4vaGFuZGxlcnMvbWNwLWFxbC9NQ1BBUUxIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TG9nU2luayB9IGZyb20gJy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeU1ldHJpY3NTaW5rIH0gZnJvbSAnLi4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbnNvbGVUb2tlblN0b3JlIH0gZnJvbSAnLi9jb25zb2xlL2NvbnNvbGVUb2tlbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVBdXRoTWlkZGxld2FyZSB9IGZyb20gJy4vbWlkZGxld2FyZS9hdXRoTWlkZGxld2FyZS5qcyc7XG5pbXBvcnQgeyBQQUNLQUdFX1ZFUlNJT04gfSBmcm9tICcuLi9nZW5lcmF0ZWQvdmVyc2lvbi5qcyc7XG5cbi8qKlxuICogUHVibGljIHBhdGggcHJlZml4ZXMgdGhhdCBuZXZlciByZXF1aXJlIGF1dGhlbnRpY2F0aW9uICgjMTc4MCkuXG4gKiBUaGVzZSBlbmRwb2ludHMgcmV0dXJuIHNhZmUgbWV0YWRhdGEgb3IgYWN0IGFzIGhlYWx0aCBwcm9iZXMg4oCUIHJlcXVpcmluZ1xuICogdG9rZW5zIG9uIHRoZW0gd291bGQgYnJlYWsgbW9uaXRvcmluZyBhbmQgY2xpZW50IGRldGVjdGlvbiB3aXRob3V0IGFkZGluZ1xuICogcmVhbCBzZWN1cml0eSB2YWx1ZS5cbiAqL1xuY29uc3QgUFVCTElDX1BBVEhfUFJFRklYRVMgPSBbXG4gICcvYXBpL2hlYWx0aCcsXG4gICcvYXBpL3NldHVwL3ZlcnNpb24nLFxuICAnL2FwaS9zZXR1cC9tY3BiJyxcbiAgJy9hcGkvc2V0dXAvZGV0ZWN0JyxcbiAgJy9hcGkvc2V0dXAvbGljZW5zZScsXG5dO1xuXG4vKiogUGxhY2Vob2xkZXIgaW4gaW5kZXguaHRtbCB0aGF0IGlzIHJlcGxhY2VkIHdpdGggdGhlIGN1cnJlbnQgY29uc29sZSB0b2tlbi4gKi9cbmNvbnN0IFRPS0VOX01FVEFfUExBQ0VIT0xERVIgPSAne3tDT05TT0xFX1RPS0VOfX0nO1xuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBydW5uaW5nIHNlcnZlciB2ZXJzaW9uLiAqL1xuY29uc3QgVkVSU0lPTl9NRVRBX1BMQUNFSE9MREVSID0gJ3t7RE9MTEhPVVNFX1ZFUlNJT059fSc7XG4vKiogUGxhY2Vob2xkZXIgaW4gaW5kZXguaHRtbCB0aGF0IGlzIHJlcGxhY2VkIHdpdGggdGhlIGFzc2V0IGNhY2hlLWJ1c3RpbmcgdmVyc2lvbi4gKi9cbmNvbnN0IEFTU0VUX1ZFUlNJT05fTUVUQV9QTEFDRUhPTERFUiA9ICd7e0RPTExIT1VTRV9BU1NFVF9WRVJTSU9OfX0nO1xuXG5jb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4vKipcbiAqIERlZmF1bHQgcG9ydCBmb3Igc3RhbmRhbG9uZSBgc3RhcnRXZWJTZXJ2ZXJgIGNhbGxzLiBSZWFkcyBmcm9tIHRoZVxuICogYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYCBlbnYgdmFyIHNvIHRoZXJlIGlzIGEgc2luZ2xlIHNvdXJjZSBvZlxuICogdHJ1dGggKHNlZSBgc3JjL2NvbmZpZy9lbnYudHNgKS4gQ2FsbGVycyBwYXNzaW5nIGFuIGV4cGxpY2l0IGBwb3J0YCBpblxuICogYFdlYlNlcnZlck9wdGlvbnNgIG92ZXJyaWRlIHRoaXMgZGVmYXVsdC5cbiAqL1xuY29uc3QgREVGQVVMVF9QT1JUID0gZW52LkRPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUO1xuY29uc3QgQ09OU09MRV9IT1NUID0gJ2RvbGxob3VzZS5sb2NhbGhvc3QnO1xuY29uc3QgQUxMT1dFRF9QQUdFX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFsnLmh0bWwnLCAnLmh0bSddKTtcbi8qKiBNYXggSlNPTiBib2R5IGZvciBzZXR1cCByb3V0ZXMgKGluc3RhbGwvb3Blbi1jb25maWcpLiBJbmdlc3Qgcm91dGVzIHVzZSB0aGVpciBvd24gMW1iIGxpbWl0LiAqL1xuY29uc3QgU0VUVVBfQk9EWV9MSU1JVCA9ICcxa2InO1xuXG4vKiogVHJhY2sgd2hldGhlciB0aGUgd2ViIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcgaW4tcHJvY2Vzcy4gKi9cbmxldCBzZXJ2ZXJSdW5uaW5nID0gZmFsc2U7XG5sZXQgc2VydmVyUG9ydCA9IERFRkFVTFRfUE9SVDtcbi8qKiBBY3RpdmUgSFRUUCBzZXJ2ZXIgaW5zdGFuY2Ug4oCUIHRyYWNrZWQgc28gX3Jlc2V0U2VydmVyU3RhdGUgY2FuIGNsb3NlIGl0LiAqL1xubGV0IGFjdGl2ZUh0dHBTZXJ2ZXI6IGltcG9ydCgnbm9kZTpodHRwJykuU2VydmVyIHwgbnVsbCA9IG51bGw7XG4vKiogQ2FjaGVkIHRva2VuIHN0b3JlIGZvciBvcGVuUG9ydGZvbGlvQnJvd3NlciDigJQgcHJldmVudHMgZHVwbGljYXRlIGluc3RhbmNlcyBvbiB0aGUgc2FtZSBmaWxlLiAqL1xubGV0IGNhY2hlZFRva2VuU3RvcmU6IENvbnNvbGVUb2tlblN0b3JlIHwgbnVsbCA9IG51bGw7XG5cbi8qKiBDaGVjayB3aGV0aGVyIHRoZSB3ZWIgc2VydmVyIGhhcyBiZWVuIHN0YXJ0ZWQgaW4gdGhpcyBwcm9jZXNzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzV2ViU2VydmVyUnVubmluZygpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNlcnZlclJ1bm5pbmc7XG59XG5cbi8qKlxuICogUmVzZXQgbW9kdWxlLWxldmVsIHNlcnZlciBzdGF0ZS4gRXhwb3J0ZWQgZm9yIHRlc3Rpbmcgb25seSDigJRcbiAqIGFsbG93cyB0ZXN0cyB0byBleGVyY2lzZSBzdGFydFdlYlNlcnZlci9iaW5kQW5kTGlzdGVuIHdpdGhvdXRcbiAqIGludGVyZmVyZW5jZSBmcm9tIHByaW9yIHJ1bnMgaW4gdGhlIHNhbWUgcHJvY2Vzcy5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0U2VydmVyU3RhdGUoKTogdm9pZCB7XG4gIGlmIChhY3RpdmVIdHRwU2VydmVyKSB7XG4gICAgYWN0aXZlSHR0cFNlcnZlci5jbG9zZSgpO1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIgPSBudWxsO1xuICB9XG4gIHNlcnZlclJ1bm5pbmcgPSBmYWxzZTtcbiAgc2VydmVyUG9ydCA9IERFRkFVTFRfUE9SVDtcbiAgY2FjaGVkVG9rZW5TdG9yZSA9IG51bGw7XG59XG5cbi8qKlxuICogR3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIEhUVFAgc2VydmVyICgjMTg1NikuXG4gKiBDbG9zZXMgdGhlIGFjdGl2ZSBzZXJ2ZXIgYW5kIHJlc2V0cyBtb2R1bGUgc3RhdGUgc28gdGhlIHBvcnQgaXMgZnJlZWRcbiAqIGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIGxpbmdlcmluZyB1bnRpbCBwcm9jZXNzIGV4aXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaHV0ZG93bldlYlNlcnZlcigpOiB2b2lkIHtcbiAgaWYgKGFjdGl2ZUh0dHBTZXJ2ZXIpIHtcbiAgICBhY3RpdmVIdHRwU2VydmVyLmNsb3NlKCk7XG4gICAgYWN0aXZlSHR0cFNlcnZlciA9IG51bGw7XG4gICAgc2VydmVyUnVubmluZyA9IGZhbHNlO1xuICAgIGxvZ2dlci5pbmZvKGBbV2ViVUldIEhUVFAgc2VydmVyIGNsb3NlZCBvbiBwb3J0ICR7c2VydmVyUG9ydH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIHRoZSB3ZWIgc2VydmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlck9wdGlvbnMge1xuICAvKiogUG9ydCB0byBiaW5kIHRvIChkZWZhdWx0cyB0byBgRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlRgLCBzZWUgYHNyYy9jb25maWcvZW52LnRzYCkgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIFBhdGggdG8gdGhlIHBvcnRmb2xpbyBkaXJlY3RvcnkgKGUuZy4sIH4vLmRvbGxob3VzZS9wb3J0Zm9saW8pICovXG4gIHBvcnRmb2xpb0Rpcjogc3RyaW5nO1xuICAvKiogT3BlbiB0aGUgYnJvd3NlciBhdXRvbWF0aWNhbGx5IGFmdGVyIHN0YXJ0aW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgb3BlbkJyb3dzZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogTUNQQVFMSGFuZGxlciBmb3Igcm91dGluZyB0aHJvdWdoIHRoZSBNQ1AtQVFMIHBpcGVsaW5lLlxuICAgKiBXaGVuIHByb3ZpZGVkLCBBUEkgcm91dGVzIHVzZSB0aGUgZ2F0ZXdheSAodmFsaWRhdGVkLCBjYWNoZWQsIGdhdGVrZWVwZXItY2hlY2tlZCkuXG4gICAqIFdoZW4gYWJzZW50LCBmYWxscyBiYWNrIHRvIGRpcmVjdCBmaWxlc3lzdGVtIGFjY2VzcyAobGVnYWN5IGJlaGF2aW9yKS5cbiAgICogSXNzdWUgIzc5NjogV2ViIE1DUC1BUUwgR2F0ZXdheS5cbiAgICovXG4gIG1jcEFxbEhhbmRsZXI/OiBNQ1BBUUxIYW5kbGVyO1xuICAvKiogTWVtb3J5TG9nU2luayBmb3IgbG9nIHJvdXRlcyAob3B0aW9uYWwg4oCUIGxvZ3MgdGFiIGRpc2FibGVkIGlmIG5vdCBwcm92aWRlZCkgKi9cbiAgbWVtb3J5U2luaz86IE1lbW9yeUxvZ1Npbms7XG4gIC8qKiBNZW1vcnlNZXRyaWNzU2luayBmb3IgbWV0cmljcyByb3V0ZXMgKG9wdGlvbmFsIOKAlCBtZXRyaWNzIHRhYiBkaXNhYmxlZCBpZiBub3QgcHJvdmlkZWQpICovXG4gIG1ldHJpY3NTaW5rPzogTWVtb3J5TWV0cmljc1Npbms7XG4gIC8qKiBBZGRpdGlvbmFsIHJvdXRlcnMgdG8gbW91bnQgYmVmb3JlIHRoZSBTUEEgZmFsbGJhY2sgKGUuZy4sIGluZ2VzdCByb3V0ZXMpICovXG4gIGFkZGl0aW9uYWxSb3V0ZXJzPzogaW1wb3J0KCdleHByZXNzJykuUm91dGVyW107XG4gIC8qKlxuICAgKiBDb25zb2xlIHRva2VuIHN0b3JlICgjMTc4MCkuIFdoZW4gcHJvdmlkZWQsIHRoZSBzZXJ2ZXIgd2lsbDpcbiAgICogICAxLiBNb3VudCBCZWFyZXIgdG9rZW4gYXV0aCBtaWRkbGV3YXJlIGJlZm9yZSBwcm90ZWN0ZWQgcm91dGVycy5cbiAgICogICAyLiBJbmplY3QgdGhlIHByaW1hcnkgdG9rZW4gaW50byBpbmRleC5odG1sIHNvIHRoZSBicm93c2VyIGNsaWVudFxuICAgKiAgICAgIGNhbiBhdHRhY2ggaXQgdG8gZmV0Y2ggY2FsbHMgYW5kIEV2ZW50U291cmNlIFVSTHMuXG4gICAqICAgMy4gQXBwZW5kIHRoZSB0b2tlbiBmaWxlIGxvY2F0aW9uIHRvIHRoZSBzdGFydHVwIGJhbm5lci5cbiAgICogQXV0aCBlbmZvcmNlbWVudCBpcyBzdGlsbCBnYXRlZCBvbiBET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCDigJQgdGhlXG4gICAqIG1pZGRsZXdhcmUgaXMgYSBwYXNzLXRocm91Z2ggd2hlbiB0aGUgZmxhZyBpcyBmYWxzZSAodGhlIFBoYXNlIDEgZGVmYXVsdCkuXG4gICAqL1xuICB0b2tlblN0b3JlPzogQ29uc29sZVRva2VuU3RvcmU7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGF0dGVtcHRpbmcgdG8gYmluZCB0aGUgSFRUUCBzZXJ2ZXIgdG8gYSBwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBlcnJvcj86ICdFQUREUklOVVNFJyB8ICdPVEhFUic7XG4gIGRldGFpbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgdGhlIHdlYiBzZXJ2ZXIsIGluY2x1ZGluZyBob29rcyBmb3IgREkgd2lyaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlclJlc3VsdCB7XG4gIC8qKiBFeHByZXNzIGFwcCBpbnN0YW5jZSDigJQgZm9yIG1vdW50aW5nIGFkZGl0aW9uYWwgcm91dGVzIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhcHA/OiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzO1xuICAvKiogTG9nIGJyb2FkY2FzdCBmdW5jdGlvbiDigJQgY2FsbCB3aXRoIGVhY2ggZW50cnkgdG8gcHVzaCB0byBTU0UgY2xpZW50cyAqL1xuICBsb2dCcm9hZGNhc3Q/OiAoZW50cnk6IGltcG9ydCgnLi4vbG9nZ2luZy90eXBlcy5qcycpLlVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZDtcbiAgLyoqIE1ldHJpY3Mgc25hcHNob3QgZnVuY3Rpb24g4oCUIGNhbGwgd2l0aCBlYWNoIHNuYXBzaG90IHRvIHB1c2ggdG8gU1NFIGNsaWVudHMgKi9cbiAgbWV0cmljc09uU25hcHNob3Q/OiAoc25hcHNob3Q6IGltcG9ydCgnLi4vbWV0cmljcy90eXBlcy5qcycpLk1ldHJpY1NuYXBzaG90KSA9PiB2b2lkO1xuICAvKiogUmVzdWx0IG9mIHRoZSBwb3J0IGJpbmRpbmcgYXR0ZW1wdCAqL1xuICBiaW5kUmVzdWx0PzogQmluZFJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYXR0ZW1wdGluZyB0byBvcGVuIHRoZSBicm93c2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyb3dzZXJPcGVuUmVzdWx0IHtcbiAgLyoqIFRoZSBVUkwgdGhlIHNlcnZlciBpcyBydW5uaW5nIG9uICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IHJ1bm5pbmcgKHRydWUpIG9yIGp1c3Qgc3RhcnRlZCAoZmFsc2UpICovXG4gIGFscmVhZHlSdW5uaW5nOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgYnJvd3NlciB3YXMgc3VjY2Vzc2Z1bGx5IG9wZW5lZCAqL1xuICBicm93c2VyT3BlbmVkOiBib29sZWFuO1xuICAvKiogV2FybmluZyBtZXNzYWdlIGlmIHRoZSBicm93c2VyIGNvdWxkIG5vdCBiZSBvcGVuZWQgKi9cbiAgd2FybmluZz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcGVuIGEgVVJMIGluIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IGJyb3dzZXIuXG4gKlxuICogUGxhdGZvcm0tYXdhcmU6XG4gKiAtIG1hY09TOiBgb3BlbmBcbiAqIC0gTGludXg6IGB4ZGctb3BlbmBcbiAqIC0gV2luZG93czogYHN0YXJ0YFxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIG9wZW5cbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBicm93c2VyIG9wZW5lZCwgZmFsc2Ugd2l0aCBlcnJvciBtZXNzYWdlIGlmIG5vdFxuICovXG5mdW5jdGlvbiBvcGVuSW5Ccm93c2VyKHVybDogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gICAgY29uc3QgY21kID0gcGxhdCA9PT0gJ2RhcndpbicgPyAnb3BlbidcbiAgICAgIDogcGxhdCA9PT0gJ3dpbjMyJyA/ICdzdGFydCdcbiAgICAgIDogJ3hkZy1vcGVuJztcblxuICAgIC8vIFNlY3VyaXR5OiB1c2UgZXhlY0ZpbGUgd2l0aCBVUkwgYXMgYXJndW1lbnQgYXJyYXksIG5vdCBzdHJpbmcgaW50ZXJwb2xhdGlvblxuICAgIGNvbnN0IHVybFN0ciA9IFN0cmluZyh1cmwpO1xuICAgIC8vIEFjY2VwdCBsb2NhbGhvc3QsIDEyNy4wLjAuMSwgYW5kICoubG9jYWxob3N0IHN1YmRvbWFpbnMgKFJGQyA2NzYxKVxuICAgIGlmICghL15odHRwcz86XFwvXFwvKGxvY2FsaG9zdHwxMjdcXC4wXFwuMFxcLjF8W1xcdy1dK1xcLmxvY2FsaG9zdClbOi9dLy50ZXN0KHVybFN0cikpIHtcbiAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVUkwgbXVzdCBiZSBhIGxvY2FsaG9zdCBIVFRQIFVSTCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4ZWNGaWxlKGNtZCwgW3VybFN0cl0sIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gQ291bGQgbm90IGF1dG8tb3BlbiBicm93c2VyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTdGFydCB0aGUgcG9ydGZvbGlvIHdlYiBzZXJ2ZXIuXG4gKlxuICogQmluZHMgdG8gMTI3LjAuMC4xIG9ubHkgKGxvY2FsaG9zdCkuIFNlcnZlcyB0aGUgcG9ydGZvbGlvIGJyb3dzZXJcbiAqIGZyb250ZW5kIGFuZCBBUEkgcm91dGVzIGZvciByZWFkaW5nIGVsZW1lbnRzLlxuICpcbiAqIElkZW1wb3RlbnQ6IGlmIHRoZSBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nLCBvcHRpb25hbGx5IG9wZW5zIHRoZVxuICogYnJvd3NlciB3aXRob3V0IHN0YXJ0aW5nIGEgc2Vjb25kIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gU2VydmVyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEhvb2tzIGZvciBESSB3aXJpbmcgKGxvZyBicm9hZGNhc3QsIG1ldHJpY3Mgb25TbmFwc2hvdClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0V2ViU2VydmVyKG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMpOiBQcm9taXNlPFdlYlNlcnZlclJlc3VsdD4ge1xuICBjb25zdCBwb3J0ID0gb3B0aW9ucy5wb3J0IHx8IERFRkFVTFRfUE9SVDtcbiAgY29uc3QgcmVzdWx0OiBXZWJTZXJ2ZXJSZXN1bHQgPSB7fTtcblxuICBpZiAoc2VydmVyUnVubmluZykge1xuICAgIGlmIChvcHRpb25zLm9wZW5Ccm93c2VyKSB7XG4gICAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7c2VydmVyUG9ydH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgcmVzdWx0LmFwcCA9IGFwcDtcbiAgYXBwLmRpc2FibGUoJ3gtcG93ZXJlZC1ieScpO1xuXG4gIC8vIFNlY3VyaXR5IGhlYWRlcnNcbiAgYXBwLnVzZSgoX3JlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJyk7XG4gICAgcmVzLnNldEhlYWRlcignWC1GcmFtZS1PcHRpb25zJywgJ0RFTlknKTtcbiAgICByZXMuc2V0SGVhZGVyKCdYLVhTUy1Qcm90ZWN0aW9uJywgJzE7IG1vZGU9YmxvY2snKTtcbiAgICByZXMuc2V0SGVhZGVyKCdSZWZlcnJlci1Qb2xpY3knLCAnbm8tcmVmZXJyZXInKTtcbiAgICByZXMuc2V0SGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YCk7XG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBbXG4gICAgICBcImRlZmF1bHQtc3JjICdzZWxmJ1wiLFxuICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJyBjZG4uanNkZWxpdnIubmV0IGNkbmpzLmNsb3VkZmxhcmUuY29tXCIsXG4gICAgICBcInN0eWxlLXNyYyAnc2VsZicgJ3Vuc2FmZS1pbmxpbmUnIGNkbmpzLmNsb3VkZmxhcmUuY29tIGNkbi5qc2RlbGl2ci5uZXRcIixcbiAgICAgIFwiaW1nLXNyYyAnc2VsZicgZGF0YTpcIixcbiAgICAgIFwiY29ubmVjdC1zcmMgJ3NlbGYnIHJhdy5naXRodWJ1c2VyY29udGVudC5jb21cIixcbiAgICAgIFwiZm9udC1zcmMgJ3NlbGYnXCIsXG4gICAgXS5qb2luKCc7ICcpKTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIENvbnNvbGUgdG9rZW4gYXV0aGVudGljYXRpb24gbWlkZGxld2FyZSAoIzE3ODApLiBNb3VudGVkIGJlZm9yZSBhbnkgL2FwaVxuICAvLyByb3V0ZXMgc28gZXZlcnkgcHJvdGVjdGVkIGVuZHBvaW50IGdvZXMgdGhyb3VnaCBpdC4gV2hlbiB0aGUgZmVhdHVyZSBmbGFnXG4gIC8vIERPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVEIGlzIGZhbHNlIChQaGFzZSAxIGRlZmF1bHQpIHRoaXMgaXMgYSBwYXNzLXRocm91Z2guXG4gIC8vIFB1YmxpYyBlbmRwb2ludHMgaW4gUFVCTElDX1BBVEhfUFJFRklYRVMgYWx3YXlzIGJ5cGFzcyBhdXRoIHJlZ2FyZGxlc3Mgb2YgZmxhZy5cbiAgaWYgKG9wdGlvbnMudG9rZW5TdG9yZSkge1xuICAgIGNvbnN0IGF1dGhNaWRkbGV3YXJlID0gY3JlYXRlQXV0aE1pZGRsZXdhcmUoe1xuICAgICAgc3RvcmU6IG9wdGlvbnMudG9rZW5TdG9yZSxcbiAgICAgIGVuYWJsZWQ6IGVudi5ET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCxcbiAgICAgIHB1YmxpY1BhdGhQcmVmaXhlczogUFVCTElDX1BBVEhfUFJFRklYRVMsXG4gICAgICBsYWJlbDogJ2FwaScsXG4gICAgfSk7XG4gICAgYXBwLnVzZSgnL2FwaScsIGF1dGhNaWRkbGV3YXJlKTtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBbV2ViVUldIENvbnNvbGUgYXV0aCBtaWRkbGV3YXJlIG1vdW50ZWQgJHtlbnYuRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQgPyAnRU5GT1JDSU5HJyA6ICdwYXNzLXRocm91Z2ggKGZsYWcgb2ZmKSd9YCxcbiAgICApO1xuXG4gICAgLy8gVE9UUCBlbnJvbGxtZW50IHJvdXRlcyAoIzE3OTQpLiBNb3VudGVkIEFGVEVSIHRoZSAvYXBpIGF1dGggbWlkZGxld2FyZVxuICAgIC8vIGJlY2F1c2UgdGhlIHJvdXRlciBhZGRzIGl0cyBvd24gYWx3YXlzLW9uIGF1dGggZ3VhcmQg4oCUIHRoZSBnbG9iYWwgYXV0aFxuICAgIC8vIG1pZGRsZXdhcmUgYXQgL2FwaSBpcyBhIHBhc3MtdGhyb3VnaCBkdXJpbmcgUGhhc2UgMSByb2xsb3V0LCBidXQgdGhlXG4gICAgLy8gVE9UUCByb3V0ZXIgZW5mb3JjZXMgcmVnYXJkbGVzcyBvZiBET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCBzbyBhblxuICAgIC8vIGF0dGFja2VyIHdpdGggbG9jYWwgcG9ydCBhY2Nlc3MgY2Fubm90IHByZS1lbnJvbGwgYSBzZWNvbmQgZmFjdG9yIGFuZFxuICAgIC8vIGxvY2sgdGhlIGxlZ2l0aW1hdGUgdXNlciBvdXQuXG4gICAgYXBwLnVzZSgnL2FwaS9jb25zb2xlL3RvdHAnLCBjcmVhdGVUb3RwUm91dGVzKHsgc3RvcmU6IG9wdGlvbnMudG9rZW5TdG9yZSB9KSk7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gVE9UUCByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL2NvbnNvbGUvdG90cCAoYWx3YXlzLW9uIGF1dGgpJyk7XG5cbiAgICAvLyBUb2tlbiBtYW5hZ2VtZW50IHJvdXRlcyAoIzE3OTUpLiBNb3VudGVkIGFsb25nc2lkZSB0aGUgVE9UUCByb3V0ZXIgd2l0aFxuICAgIC8vIHRoZSBzYW1lIGFsd2F5cy1vbiBhdXRoIHBhdHRlcm4uIEN1cnJlbnRseSBob3N0cyB0aGUgcm90YXRpb24gZW5kcG9pbnQ7XG4gICAgLy8gZnV0dXJlIHRva2VuIG1hbmFnZW1lbnQgb3BlcmF0aW9ucyAobGlzdCwgcmV2b2tlKSBnbyBoZXJlIHRvby5cbiAgICBhcHAudXNlKCcvYXBpL2NvbnNvbGUvdG9rZW4nLCBjcmVhdGVUb2tlblJvdXRlcyh7IHN0b3JlOiBvcHRpb25zLnRva2VuU3RvcmUgfSkpO1xuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIFRva2VuIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvY29uc29sZS90b2tlbiAoYWx3YXlzLW9uIGF1dGgpJyk7XG4gIH1cblxuICAvLyBTZXR1cCByb3V0ZXM6IGF1dG8taW5zdGFsbCBEb2xsaG91c2VNQ1AgdG8gTUNQIGNsaWVudHMgKG1vdW50IEJFRk9SRSBBUEkgcm91dGVzKVxuICAvLyBCb2R5IGxpbWl0IHNjb3BlZCB0byBzZXR1cCByb3V0ZXMgb25seSDigJQgaW5nZXN0IHJvdXRlcyBuZWVkIDFtYiBmb3IgZm9sbG93ZXIgbG9nIGZvcndhcmRpbmdcbiAgY29uc3Qgc2V0dXBKc29uUGFyc2VyID0gZXhwcmVzcy5qc29uKHsgbGltaXQ6IFNFVFVQX0JPRFlfTElNSVQsIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgY29uc3QgeyBpbnN0YWxsSGFuZGxlciwgb3BlbkNvbmZpZ0hhbmRsZXIsIHZlcnNpb25IYW5kbGVyLCBtY3BiUmVkaXJlY3RIYW5kbGVyLCBkZXRlY3RIYW5kbGVyLCBnZXRMaWNlbnNlSGFuZGxlciwgc2V0TGljZW5zZUhhbmRsZXIsIHZlcmlmeUxpY2Vuc2VIYW5kbGVyLCByZXNlbmRWZXJpZmljYXRpb25IYW5kbGVyIH0gPSBjcmVhdGVTZXR1cFJvdXRlcygpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9pbnN0YWxsJywgc2V0dXBKc29uUGFyc2VyLCBpbnN0YWxsSGFuZGxlcik7XG4gIGFwcC5wb3N0KCcvYXBpL3NldHVwL29wZW4tY29uZmlnJywgc2V0dXBKc29uUGFyc2VyLCBvcGVuQ29uZmlnSGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvdmVyc2lvbicsIHZlcnNpb25IYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC9tY3BiJywgbWNwYlJlZGlyZWN0SGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvZGV0ZWN0JywgZGV0ZWN0SGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvbGljZW5zZScsIGdldExpY2Vuc2VIYW5kbGVyKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvbGljZW5zZScsIHNldHVwSnNvblBhcnNlciwgc2V0TGljZW5zZUhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9saWNlbnNlL3ZlcmlmeScsIHNldHVwSnNvblBhcnNlciwgdmVyaWZ5TGljZW5zZUhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9saWNlbnNlL3Jlc2VuZCcsIHNldHVwSnNvblBhcnNlciwgcmVzZW5kVmVyaWZpY2F0aW9uSGFuZGxlcik7XG4gIGxvZ2dlci5pbmZvKCdbV2ViVUldIFNldHVwIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvc2V0dXAnKTtcblxuICAvLyBGaXJlLWFuZC1mb3JnZXQgTlZNIGxhdW5jaGVyIHJlcGFpcjogcmVjcmVhdGVzIHRoZSB3cmFwcGVyIGlmIGRlbGV0ZWQgYW5kXG4gIC8vIHBhdGNoZXMgYW55IHByZS1leGlzdGluZyBjb25maWdzIHRoYXQgc3RpbGwgdXNlIGJhcmUgYG5weGAuIE5vLW9wcyB3aGVuXG4gIC8vIE5WTSBpcyBhYnNlbnQgb3Igb24gV2luZG93cy4gTmV2ZXIgZGVsYXlzIHNlcnZlciBzdGFydHVwLlxuICByZXBhaXJOdm1MYXVuY2hlck9uU3RhcnR1cCgpLmNhdGNoKGVyciA9PlxuICAgIGxvZ2dlci53YXJuKGBbU2V0dXBdIE5WTSBzdGFydHVwIHJlcGFpciB0aHJldyB1bmV4cGVjdGVkbHk6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApXG4gICk7XG5cbiAgLy8gQVBJIHJvdXRlcyDigJQgdXNlIE1DUC1BUUwgZ2F0ZXdheSB3aGVuIGhhbmRsZXIgaXMgYXZhaWxhYmxlIChJc3N1ZSAjNzk2KVxuICBpZiAob3B0aW9ucy5tY3BBcWxIYW5kbGVyKSB7XG4gICAgYXBwLnVzZSgnL2FwaScsIGNyZWF0ZUdhdGV3YXlBcGlSb3V0ZXMob3B0aW9ucy5tY3BBcWxIYW5kbGVyLCBvcHRpb25zLnBvcnRmb2xpb0RpcikpO1xuXG4gICAgLy8gUGVybWlzc2lvbiBldmFsdWF0aW9uIHJvdXRlcyAoUE9TVCAvZXZhbHVhdGVfcGVybWlzc2lvbiwgR0VUIC9wZXJtaXNzaW9ucy9zdGF0dXMpXG4gICAgY29uc3QgeyByZWdpc3RlclBlcm1pc3Npb25Sb3V0ZXMgfSA9IGF3YWl0IGltcG9ydCgnLi9yb3V0ZXMvcGVybWlzc2lvblJvdXRlcy5qcycpO1xuICAgIGNvbnN0IHBlcm1Sb3V0ZXIgPSAoYXdhaXQgaW1wb3J0KCdleHByZXNzJykpLlJvdXRlcigpO1xuICAgIHJlZ2lzdGVyUGVybWlzc2lvblJvdXRlcyhwZXJtUm91dGVyLCBvcHRpb25zLm1jcEFxbEhhbmRsZXIpO1xuICAgIGFwcC51c2UoJy9hcGknLCBwZXJtUm91dGVyKTtcblxuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIEFQSSByb3V0ZXMgdXNpbmcgTUNQLUFRTCBHYXRld2F5ICsgcGVybWlzc2lvbiByb3V0ZXMnKTtcbiAgfSBlbHNlIHtcbiAgICBhcHAudXNlKCcvYXBpJywgY3JlYXRlQXBpUm91dGVzKG9wdGlvbnMucG9ydGZvbGlvRGlyKSk7XG4gICAgbG9nZ2VyLndhcm4oJ1tXZWJVSV0gQVBJIHJvdXRlcyB1c2luZyBkaXJlY3QgZmlsZXN5c3RlbSBhY2Nlc3MgKG5vIE1DUC1BUUwgaGFuZGxlciBhdmFpbGFibGUpJyk7XG4gIH1cblxuICAvLyBDb25zb2xlIHJvdXRlczogbG9ncywgbWV0cmljcywgaGVhbHRoIOKAlCBleHRyYWN0ZWQgdG8ga2VlcCBjb2duaXRpdmVcbiAgLy8gY29tcGxleGl0eSBvZiBzdGFydFdlYlNlcnZlciBtYW5hZ2VhYmxlLlxuICBtb3VudENvbnNvbGVSb3V0ZXMoYXBwLCBvcHRpb25zLCByZXN1bHQpO1xuXG4gIC8vIFNlcnZlIH4vLmRvbGxob3VzZS9wYWdlcy8gYXQgL3BhZ2VzLyDigJQgZGFzaGJvYXJkcywgZ2VuZXJhdGVkIGNvbnRlbnQsIHN0YWNrIHZpZXdzXG4gIGNvbnN0IHBhZ2VzRGlyID0gam9pbihkaXJuYW1lKG9wdGlvbnMucG9ydGZvbGlvRGlyKSwgJ3BhZ2VzJyk7XG4gIG1rZGlyKHBhZ2VzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KS5jYXRjaChlcnIgPT4ge1xuICAgIGxvZ2dlci53YXJuKGBbV2ViVUldIENvdWxkIG5vdCBjcmVhdGUgcGFnZXMgZGlyZWN0b3J5OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH0pO1xuICBhcHAudXNlKCcvcGFnZXMnLCBleHByZXNzLnN0YXRpYyhwYWdlc0RpcikpO1xuXG4gIC8qKlxuICAgKiBHRVQgL2FwaS9wYWdlc1xuICAgKiBMaXN0cyBhdmFpbGFibGUgSFRNTCBwYWdlcyBpbiB+Ly5kb2xsaG91c2UvcGFnZXMvLlxuICAgKiBSZXR1cm5zIHBhZ2UgbmFtZXMgYW5kIHRoZWlyIFVSTHMgZm9yIHRoZSBtYW5hZ2VtZW50IGNvbnNvbGUuXG4gICAqL1xuICBhcHAuZ2V0KCcvYXBpL3BhZ2VzJywgYXN5bmMgKF9yZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlYWRkaXIocGFnZXNEaXIpO1xuICAgICAgY29uc3QgcGFnZXMgPSBmaWxlc1xuICAgICAgICAuZmlsdGVyKGYgPT4gIWYuc3RhcnRzV2l0aCgnLicpICYmIEFMTE9XRURfUEFHRV9FWFRFTlNJT05TLmhhcyhleHRuYW1lKGYpKSlcbiAgICAgICAgLm1hcChmID0+ICh7IG5hbWU6IGYsIHVybDogYC9wYWdlcy8ke2Z9YCB9KSk7XG4gICAgICByZXMuanNvbih7IHBhZ2VzLCBkaXJlY3Rvcnk6IHBhZ2VzRGlyIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmVzLmpzb24oeyBwYWdlczogW10sIGRpcmVjdG9yeTogcGFnZXNEaXIgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBBZGRpdGlvbmFsIHJvdXRlcnMgKGUuZy4sIHVuaWZpZWQgY29uc29sZSBpbmdlc3Qgcm91dGVzKSDigJQgbXVzdCBtb3VudCBiZWZvcmUgU1BBIGZhbGxiYWNrXG4gIG9wdGlvbnMuYWRkaXRpb25hbFJvdXRlcnM/LmZvckVhY2gocm91dGVyID0+IGFwcC51c2Uocm91dGVyKSk7XG5cbiAgLy8gU3RhdGljIGZyb250ZW5kIGZpbGVzXG4gIGNvbnN0IHB1YmxpY0RpciA9IGpvaW4oX19kaXJuYW1lLCAncHVibGljJyk7XG4gIC8vIFNlcnZlIHN0YXRpYyBhc3NldHMgYnV0IHNraXAgaW5kZXguaHRtbCDigJQgdGhlIFNQQSBmYWxsYmFjayBiZWxvd1xuICAvLyBoYW5kbGVzIGl0IHdpdGggdG9rZW4gaW5qZWN0aW9uIChyZXBsYWNlcyB7e0NPTlNPTEVfVE9LRU59fSBpbiB0aGVcbiAgLy8gbWV0YSB0YWcpLiBXaXRob3V0IHRoaXMsIGV4cHJlc3Muc3RhdGljIHNlcnZlcyB0aGUgcmF3IHRlbXBsYXRlXG4gIC8vIGFuZCB0aGUgYnJvd3NlciBuZXZlciBnZXRzIHRoZSBhdXRoIHRva2VuICgjMTc4MCkuXG4gIGNvbnN0IGlzRGVidWcgPSBCb29sZWFuKHByb2Nlc3MuZW52LkRPTExIT1VTRV9ERUJVRyB8fCBwcm9jZXNzLmVudi5FTkFCTEVfREVCVUcpO1xuICBhcHAudXNlKGV4cHJlc3Muc3RhdGljKHB1YmxpY0Rpciwge1xuICAgIGluZGV4OiBmYWxzZSxcbiAgICAvLyBJbiBkZWJ1ZyBtb2RlLCBkaXNhYmxlIGNhY2hpbmcgb24gYWxsIHN0YXRpYyBhc3NldHMgKEpTLCBDU1MpIHNvXG4gICAgLy8gVUkgY2hhbmdlcyBhcmUgcGlja2VkIHVwIG9uIG5vcm1hbCByZWxvYWQgd2l0aG91dCBDbWQrU2hpZnQrUi5cbiAgICAuLi4oaXNEZWJ1Z1xuICAgICAgPyB7IGV0YWc6IGZhbHNlLCBsYXN0TW9kaWZpZWQ6IGZhbHNlLCBtYXhBZ2U6IDAgfVxuICAgICAgOiB7IG1heEFnZTogJzF5JywgaW1tdXRhYmxlOiB0cnVlIH0pLFxuICB9KSk7XG5cbiAgLy8gU1BBIGZhbGxiYWNrIHdpdGggY29uc29sZSB0b2tlbiBpbmplY3Rpb24gKCMxNzgwKS5cbiAgLy8gUmVhZHMgaW5kZXguaHRtbCBvbiBmaXJzdCByZXF1ZXN0LCBzdWJzdGl0dXRlcyB0aGUge3tDT05TT0xFX1RPS0VOfX0gcGxhY2Vob2xkZXJcbiAgLy8gd2l0aCB0aGUgY3VycmVudCB0b2tlbiB2YWx1ZSwgYW5kIGNhY2hlcyB0aGUgcmVuZGVyZWQgc3RyaW5nLiBUaGUgY2FjaGUgaXNcbiAgLy8gYXV0by1pbnZhbGlkYXRlZCB3aGVuIHRoZSBwcmltYXJ5IHRva2VuIGNoYW5nZXMgKHJvdGF0aW9uKSwgc28gYSBwYWdlIHJlbG9hZFxuICAvLyBhZnRlciByb3RhdGlvbiBwaWNrcyB1cCB0aGUgbmV3IHRva2VuIHdpdGhvdXQgYSBzZXJ2ZXIgcmVzdGFydC5cbiAgbGV0IGNhY2hlZEluZGV4SHRtbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBjYWNoZWRUb2tlblZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgaW5kZXhIdG1sUGF0aCA9IGpvaW4ocHVibGljRGlyLCAnaW5kZXguaHRtbCcpO1xuXG4gIGNvbnN0IHJlbmRlckluZGV4SHRtbCA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIGNvbnN0IHRva2VuVmFsdWUgPSBvcHRpb25zLnRva2VuU3RvcmU/LmdldFByaW1hcnlUb2tlblZhbHVlKCkgPz8gJyc7XG4gICAgLy8gQXV0by1pbnZhbGlkYXRlIGNhY2hlIHdoZW4gdGhlIHRva2VuIGNoYW5nZXMgKHJvdGF0aW9uKS5cbiAgICAvLyBJbiBkZWJ1ZyBtb2RlLCBhbHdheXMgcmUtcmVhZCBmcm9tIGRpc2sgc28gVUkgY2hhbmdlcyBhcmUgcGlja2VkIHVwIG9uIHJlbG9hZC5cbiAgICBpZiAoIWlzRGVidWcgJiYgY2FjaGVkSW5kZXhIdG1sICE9PSBudWxsICYmIGNhY2hlZFRva2VuVmFsdWUgPT09IHRva2VuVmFsdWUpIHtcbiAgICAgIHJldHVybiBjYWNoZWRJbmRleEh0bWw7XG4gICAgfVxuICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgcmVhZEZpbGVGcyhpbmRleEh0bWxQYXRoLCAndXRmOCcpO1xuICAgIC8vIERlZmVuc2l2ZSBIVE1MIGF0dHJpYnV0ZSBlc2NhcGUuIFRva2VucyBhcmUgc3RyaWN0IDY0LWNoYXIgbG93ZXJjYXNlIGhleFxuICAgIC8vIHRvZGF5IHNvIG5vIGVzY2FwaW5nIGlzIGFjdHVhbGx5IG5lZWRlZCwgYnV0IGlmIHRoZSB0b2tlbiBmb3JtYXQgZXZlclxuICAgIC8vIGNoYW5nZXMgdGhpcyBwcmV2ZW50cyBhbiBIVE1MLWluamVjdGlvbiByZWdyZXNzaW9uIGZyb20gbGFuZGluZyBzaWxlbnRseS5cbiAgICBjb25zdCBlc2NhcGVkVG9rZW4gPSB0b2tlblZhbHVlXG4gICAgICAucmVwbGFjZUFsbCgnJicsICcmYW1wOycpXG4gICAgICAucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JylcbiAgICAgIC5yZXBsYWNlQWxsKFwiJ1wiLCAnJiMzOTsnKVxuICAgICAgLnJlcGxhY2VBbGwoJzwnLCAnJmx0OycpXG4gICAgICAucmVwbGFjZUFsbCgnPicsICcmZ3Q7Jyk7XG4gICAgY2FjaGVkSW5kZXhIdG1sID0gdGVtcGxhdGVcbiAgICAgIC5yZXBsYWNlQWxsKFRPS0VOX01FVEFfUExBQ0VIT0xERVIsIGVzY2FwZWRUb2tlbilcbiAgICAgIC5yZXBsYWNlQWxsKFZFUlNJT05fTUVUQV9QTEFDRUhPTERFUiwgUEFDS0FHRV9WRVJTSU9OKVxuICAgICAgLnJlcGxhY2VBbGwoQVNTRVRfVkVSU0lPTl9NRVRBX1BMQUNFSE9MREVSLCBQQUNLQUdFX1ZFUlNJT04pO1xuICAgIGNhY2hlZFRva2VuVmFsdWUgPSB0b2tlblZhbHVlO1xuICAgIHJldHVybiBjYWNoZWRJbmRleEh0bWw7XG4gIH07XG5cbiAgYXBwLmdldCgnL3sqcGF0aH0nLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHJlcS5wYXRoLm5vcm1hbGl6ZSgnTkZDJyk7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoJy9hcGkvJykpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGBBUEkgcm91dGUgbm90IGZvdW5kOiAke25vcm1hbGl6ZWRQYXRofWAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKCcvcGFnZXMvJykpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGBQYWdlIG5vdCBmb3VuZDogJHtub3JtYWxpemVkUGF0aH1gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlckluZGV4SHRtbCgpO1xuICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcpO1xuICAgICAgLy8gVGhlIHNoZWxsIHNob3VsZCBhbHdheXMgcmV2YWxpZGF0ZSBzbyBhIGZvcmNlZCByZWxvYWQgY2FuIHBpY2sgdXBcbiAgICAgIC8vIGEgbmV3IGxlYWRlci92ZXJzaW9uIGltbWVkaWF0ZWx5LiBBc3NldCBmaWxlcyB0aGVtc2VsdmVzIGNhcnJ5IGFcbiAgICAgIC8vIHZlcnNpb24gcXVlcnkgYW5kIGNhbiBiZSBjYWNoZWQgYWdncmVzc2l2ZWx5LlxuICAgICAgcmVzLnNldEhlYWRlcignQ2FjaGUtQ29udHJvbCcsICduby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZScpO1xuICAgICAgcmVzLnNlbmQoaHRtbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtXZWJVSV0gRmFpbGVkIHRvIHJlbmRlciBpbmRleC5odG1sOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCgnRmFpbGVkIHRvIGxvYWQgY29uc29sZScpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gR2xvYmFsIGVycm9yIGhhbmRsZXIg4oCUIGNhdGNoIEV4cHJlc3MgZXJyb3JzIGFuZCByb3V0ZSB0byBsb2dnZXIgaW5zdGVhZCBvZiB0ZXJtaW5hbC5cbiAgLy8gV2l0aG91dCB0aGlzLCBFeHByZXNzIGR1bXBzIHN0YWNrIHRyYWNlcyB0byBzdGRlcnIgKHZpc2libGUgaW4gLS13ZWIgdGVybWluYWwpLlxuICAvLyBBbGwgZXJyb3JzIHN0aWxsIGFwcGVhciBpbiB0aGUgbWFuYWdlbWVudCBjb25zb2xlJ3MgTG9ncyB0YWIgdmlhIE1lbW9yeUxvZ1NpbmsuXG4gIGFwcC51c2UoKGVycjogRXJyb3IsIF9yZXE6IGltcG9ydCgnZXhwcmVzcycpLlJlcXVlc3QsIHJlczogaW1wb3J0KCdleHByZXNzJykuUmVzcG9uc2UsIF9uZXh0OiBpbXBvcnQoJ2V4cHJlc3MnKS5OZXh0RnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyIGFzIGFueSkuc3RhdHVzIHx8IChlcnIgYXMgYW55KS5zdGF0dXNDb2RlIHx8IDUwMDtcbiAgICBsb2dnZXIud2FybihgW1dlYlVJXSAke2Vyci5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgcmVzLnN0YXR1cyhzdGF0dXMpLmpzb24oeyBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBCaW5kIHRvIGxvY2FsaG9zdCBvbmx5IOKAlCBoYW5kbGUgcG9ydCBjb25mbGljdHMgZ3JhY2VmdWxseS5cbiAgLy8gRXh0cmFjdGVkIHRvIGEgaGVscGVyIHRvIGtlZXAgc3RhcnRXZWJTZXJ2ZXIncyBjb2duaXRpdmUgY29tcGxleGl0eSBtYW5hZ2VhYmxlLlxuICByZXN1bHQuYmluZFJlc3VsdCA9IGF3YWl0IGJpbmRBbmRMaXN0ZW4oYXBwLCBwb3J0LCBvcHRpb25zKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE1vdW50IHRoZSBsb2dzLCBtZXRyaWNzLCBhbmQgaGVhbHRoIHJvdXRlcy4gVGhlc2UgYXJlIG9ubHkgbW91bnRlZCB3aGVuIHRoZVxuICogY29ycmVzcG9uZGluZyBzaW5rcyBhcmUgcHJvdmlkZWQgKG1lbW9yeSBsb2cgc2luayBmb3IgbG9ncytoZWFsdGgsIG1ldHJpY3NcbiAqIHNpbmsgZm9yIHRoZSBtZXRyaWNzIHRhYikuIEV4dHJhY3RlZCBmcm9tIHN0YXJ0V2ViU2VydmVyIHRvIGNhcCB0aGUgbWFpblxuICogZnVuY3Rpb24ncyBjb2duaXRpdmUgY29tcGxleGl0eS5cbiAqL1xuZnVuY3Rpb24gbW91bnRDb25zb2xlUm91dGVzKFxuICBhcHA6IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3MsXG4gIG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMsXG4gIHJlc3VsdDogV2ViU2VydmVyUmVzdWx0LFxuKTogdm9pZCB7XG4gIGxldCBsb2dSb3V0ZXM6IExvZ1JvdXRlc1Jlc3VsdCB8IHVuZGVmaW5lZDtcbiAgbGV0IG1ldHJpY3NSb3V0ZXM6IE1ldHJpY3NSb3V0ZXNSZXN1bHQgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKG9wdGlvbnMubWVtb3J5U2luaykge1xuICAgIGxvZ1JvdXRlcyA9IGNyZWF0ZUxvZ1JvdXRlcyhvcHRpb25zLm1lbW9yeVNpbmspO1xuICAgIGFwcC51c2UoJy9hcGknLCBsb2dSb3V0ZXMucm91dGVyKTtcbiAgICByZXN1bHQubG9nQnJvYWRjYXN0ID0gbG9nUm91dGVzLmJyb2FkY2FzdDtcbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBMb2cgdmlld2VyIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvbG9ncycpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMubWV0cmljc1NpbmspIHtcbiAgICBtZXRyaWNzUm91dGVzID0gY3JlYXRlTWV0cmljc1JvdXRlcyhvcHRpb25zLm1ldHJpY3NTaW5rKTtcbiAgICBhcHAudXNlKCcvYXBpJywgbWV0cmljc1JvdXRlcy5yb3V0ZXIpO1xuICAgIHJlc3VsdC5tZXRyaWNzT25TbmFwc2hvdCA9IG1ldHJpY3NSb3V0ZXMub25TbmFwc2hvdDtcbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBNZXRyaWNzIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvbWV0cmljcycpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMubWVtb3J5U2luaykge1xuICAgIGNvbnN0IGhlYWx0aFJvdXRlciA9IGNyZWF0ZUhlYWx0aFJvdXRlcyh7XG4gICAgICBtZW1vcnlTaW5rOiBvcHRpb25zLm1lbW9yeVNpbmssXG4gICAgICBtZXRyaWNzU2luazogb3B0aW9ucy5tZXRyaWNzU2luayxcbiAgICAgIGxvZ0NsaWVudENvdW50OiBsb2dSb3V0ZXMgPyBsb2dSb3V0ZXMuY2xpZW50Q291bnQgOiAoKSA9PiAwLFxuICAgICAgbWV0cmljc0NsaWVudENvdW50OiBtZXRyaWNzUm91dGVzID8gbWV0cmljc1JvdXRlcy5jbGllbnRDb3VudCA6ICgpID0+IDAsXG4gICAgfSk7XG4gICAgYXBwLnVzZSgnL2FwaScsIGhlYWx0aFJvdXRlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmludCB0aGUgc3RhcnR1cCBiYW5uZXIgdG8gc3RkZXJyLlxuICpcbiAqIE5PVEU6IFVzZSBzdGRlcnIgZm9yIHRlcm1pbmFsIG91dHB1dCwgbm90IHN0ZG91dC4gSW4gTUNQIHN0ZGlvIG1vZGUsIHN0ZG91dFxuICogaXMgcmVzZXJ2ZWQgZm9yIEpTT04tUlBDIG1lc3NhZ2VzIOKAlCBhbnkgbm9uLUpTT04gb3V0cHV0IGNvcnJ1cHRzIHRoZSBwcm90b2NvbC5cbiAqIHN0ZGVyciBpcyBzYWZlIGZvciBodW1hbi1yZWFkYWJsZSBtZXNzYWdlcyBpbiBib3RoIE1DUCBhbmQgc3RhbmRhbG9uZSBtb2Rlcy5cbiAqL1xuZnVuY3Rpb24gcHJpbnRTdGFydHVwQmFubmVyKHBvcnQ6IG51bWJlciwgdG9rZW5TdG9yZTogQ29uc29sZVRva2VuU3RvcmUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgdXJsID0gYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fWA7XG4gIGNvbnN0IGZhbGxiYWNrVXJsID0gYGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIGxvZ2dlci5pbmZvKGBbV2ViVUldIE1hbmFnZW1lbnQgY29uc29sZSBydW5uaW5nIGF0ICR7dXJsfWApO1xuICBjb25zb2xlLmVycm9yKGBcXG4gIERvbGxob3VzZU1DUCBNYW5hZ2VtZW50IENvbnNvbGVcXG4gICR7dXJsfVxcbiAgJHtmYWxsYmFja1VybH0gKGZhbGxiYWNrKVxcbmApO1xuICBpZiAodG9rZW5TdG9yZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCAgU2Vzc2lvbiB0b2tlbjogJHt0b2tlblN0b3JlLmdldEZpbGVQYXRoKCl9XFxuYCk7XG4gIH1cbiAgY29uc29sZS5lcnJvcihgICBUeXBlIFwicVwiIG9yIFwicXVpdFwiIHRvIGV4aXQuXFxuYCk7XG59XG5cbi8vIFN0YWxlIHByb2Nlc3MgcmVjb3Zlcnkg4oCUIGV4dHJhY3RlZCB0byBTdGFsZVByb2Nlc3NSZWNvdmVyeS50cyBmb3IgaW5kZXBlbmRlbnQgdGVzdGluZyAoIzE4NTApLlxuaW1wb3J0IHsgcmVjb3ZlclN0YWxlUG9ydCB9IGZyb20gJy4vY29uc29sZS9TdGFsZVByb2Nlc3NSZWNvdmVyeS5qcyc7XG5leHBvcnQgeyBmaW5kUGlkT25Qb3J0LCBraWxsU3RhbGVQcm9jZXNzLCByZWNvdmVyU3RhbGVQb3J0IH0gZnJvbSAnLi9jb25zb2xlL1N0YWxlUHJvY2Vzc1JlY292ZXJ5LmpzJztcblxuLyoqXG4gKiBBdHRlbXB0IGEgc2luZ2xlIHBvcnQgYmluZC4gUmV0dXJucyBhIEJpbmRSZXN1bHQgd2l0aG91dCBhbnkgcmVjb3ZlcnkgbG9naWMuXG4gKi9cbmZ1bmN0aW9uIGF0dGVtcHRCaW5kKFxuICBhcHA6IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3MsXG4gIHBvcnQ6IG51bWJlcixcbiAgb3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyxcbik6IFByb21pc2U8QmluZFJlc3VsdD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8QmluZFJlc3VsdD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBodHRwU2VydmVyID0gYXBwLmxpc3Rlbihwb3J0LCAnMTI3LjAuMC4xJywgKCkgPT4ge1xuICAgICAgc2VydmVyUnVubmluZyA9IHRydWU7XG4gICAgICBzZXJ2ZXJQb3J0ID0gcG9ydDtcbiAgICAgIGFjdGl2ZUh0dHBTZXJ2ZXIgPSBodHRwU2VydmVyO1xuICAgICAgcHJpbnRTdGFydHVwQmFubmVyKHBvcnQsIG9wdGlvbnMudG9rZW5TdG9yZSk7XG4gICAgICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgICAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIGh0dHBTZXJ2ZXIub24oJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnRUFERFJJTlVTRScsIGRldGFpbDogYFBvcnQgJHtwb3J0fSBhbHJlYWR5IGluIHVzZWAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtXZWJVSV0gRmFpbGVkIHRvIGJpbmQgcG9ydCAke3BvcnR9OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnT1RIRVInLCBkZXRhaWw6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCaW5kIHRoZSBFeHByZXNzIGFwcCB0byAxMjcuMC4wLjE6cG9ydC4gT24gRUFERFJJTlVTRSwgYXR0ZW1wdCB0byBmaW5kXG4gKiBhbmQga2lsbCB0aGUgc3RhbGUgRG9sbGhvdXNlTUNQIHByb2Nlc3MgaG9sZGluZyB0aGUgcG9ydCwgdGhlbiByZXRyeSBvbmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBiaW5kQW5kTGlzdGVuKFxuICBhcHA6IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3MsXG4gIHBvcnQ6IG51bWJlcixcbiAgb3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyxcbik6IFByb21pc2U8QmluZFJlc3VsdD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBhdHRlbXB0QmluZChhcHAsIHBvcnQsIG9wdGlvbnMpO1xuICBpZiAocmVzdWx0LnN1Y2Nlc3MgfHwgcmVzdWx0LmVycm9yICE9PSAnRUFERFJJTlVTRScpIHJldHVybiByZXN1bHQ7XG5cbiAgLy8gUG9ydCBvY2N1cGllZCDigJQgYXR0ZW1wdCBzdGFsZSBwcm9jZXNzIHJlY292ZXJ5IGFuZCByZXRyeVxuICBpZiAoYXdhaXQgcmVjb3ZlclN0YWxlUG9ydChwb3J0KSkge1xuICAgIGNvbnN0IHJldHJ5UmVzdWx0ID0gYXdhaXQgYXR0ZW1wdEJpbmQoYXBwLCBwb3J0LCBvcHRpb25zKTtcbiAgICBpZiAocmV0cnlSZXN1bHQuc3VjY2VzcykgcmV0dXJuIHJldHJ5UmVzdWx0O1xuICB9XG5cbiAgLy8gU3RpbGwgY2FuJ3QgYmluZCDigJQgZmFsbCB0aHJvdWdoIHdpdGggd2FybmluZ1xuICBsb2dnZXIud2FybihgW1dlYlVJXSBQb3J0ICR7cG9ydH0gYWxyZWFkeSBpbiB1c2Ug4oCUIGFub3RoZXIgcHJvY2VzcyBob2xkcyB0aGlzIHBvcnRgKTtcbiAgY29uc29sZS5lcnJvcihgXFxuICBEb2xsaG91c2VNQ1AgTWFuYWdlbWVudCBDb25zb2xlIChleGlzdGluZyBpbnN0YW5jZSlcXG4gIGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fVxcbmApO1xuICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgIG9wZW5JbkJyb3dzZXIoYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fWApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogT3BlbiB0aGUgcG9ydGZvbGlvIGJyb3dzZXIgZnJvbSB3aXRoaW4gdGhlIE1DUCBzZXJ2ZXIgcHJvY2Vzcy5cbiAqXG4gKiBTdGFydHMgdGhlIHdlYiBzZXJ2ZXIgaWYgbm90IGFscmVhZHkgcnVubmluZywgdGhlbiBvcGVucyB0aGUgc3lzdGVtXG4gKiBicm93c2VyIHRvIHRoZSBwb3J0Zm9saW8gVUkuIFJldHVybnMgYSByZXN1bHQgb2JqZWN0IGluZGljYXRpbmdcbiAqIHdoZXRoZXIgdGhlIHNlcnZlciBzdGFydGVkIGFuZCB0aGUgYnJvd3NlciBvcGVuZWQgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIENhbGxlZCBieSB0aGUgYG9wZW5fcG9ydGZvbGlvX2Jyb3dzZXJgIE1DUC1BUUwgb3BlcmF0aW9uIChJc3N1ZSAjNzc0KS5cbiAqXG4gKiBAcGFyYW0gcG9ydGZvbGlvRGlyIC0gUGF0aCB0byB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeSAoZS5nLiwgfi8uZG9sbGhvdXNlL3BvcnRmb2xpbylcbiAqIEBwYXJhbSBwb3J0IC0gUG9ydCB0byBiaW5kIHRvIChkZWZhdWx0cyB0byBgRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlRgKVxuICogQHJldHVybnMgUmVzdWx0IHdpdGggVVJMLCBzZXJ2ZXIgc3RhdHVzLCBhbmQgYnJvd3NlciBvcGVuIHN0YXR1c1xuICovXG4vKipcbiAqIE9wdGlvbnMgZm9yIG9wZW5pbmcgdGhlIHBvcnRmb2xpbyBicm93c2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5Ccm93c2VyT3B0aW9ucyB7XG4gIHBvcnRmb2xpb0Rpcjogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICBtY3BBcWxIYW5kbGVyPzogTUNQQVFMSGFuZGxlcjtcbiAgdGFiPzogc3RyaW5nO1xuICB1cmxQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBtZW1vcnlTaW5rPzogTWVtb3J5TG9nU2luaztcbiAgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaztcbn1cblxuLyoqXG4gKiBTZWxmLXByb3Zpc2lvbiBzaW5rcywgdG9rZW4gc3RvcmUsIGFuZCBpbmdlc3Qgcm91dGVzLCB0aGVuIHN0YXJ0IHRoZSB3ZWJcbiAqIHNlcnZlci4gRXh0cmFjdGVkIGZyb20gb3BlblBvcnRmb2xpb0Jyb3dzZXIgdG8ga2VlcCBjb2duaXRpdmUgY29tcGxleGl0eVxuICogbWFuYWdlYWJsZSAoU29uYXJDbG91ZCBTMzc3NikuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0RmFsbGJhY2tTZXJ2ZXIob3B0aW9uczogT3BlbkJyb3dzZXJPcHRpb25zLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IG1lbW9yeVNpbmsgPSBvcHRpb25zLm1lbW9yeVNpbms7XG4gIGxldCBtZXRyaWNzU2luayA9IG9wdGlvbnMubWV0cmljc1Npbms7XG5cbiAgaWYgKCFtZW1vcnlTaW5rKSB7XG4gICAgY29uc3QgeyBNZW1vcnlMb2dTaW5rOiBMb2dTaW5rIH0gPSBhd2FpdCBpbXBvcnQoJy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcycpO1xuICAgIG1lbW9yeVNpbmsgPSBuZXcgTG9nU2luayh7IGFwcENhcGFjaXR5OiAxMDAwMCwgc2VjdXJpdHlDYXBhY2l0eTogNTAwMCwgcGVyZkNhcGFjaXR5OiAyMDAwLCB0ZWxlbWV0cnlDYXBhY2l0eTogMTAwMCB9KTtcbiAgfVxuICBpZiAoIW1ldHJpY3NTaW5rKSB7XG4gICAgY29uc3QgeyBNZW1vcnlNZXRyaWNzU2luazogTWV0cmljc1NpbmsgfSA9IGF3YWl0IGltcG9ydCgnLi4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcycpO1xuICAgIG1ldHJpY3NTaW5rID0gbmV3IE1ldHJpY3NTaW5rKDI0MCk7XG4gIH1cblxuICAvLyBSZXVzZSBjYWNoZWQgdG9rZW4gc3RvcmUg4oCUIHR3byBpbnN0YW5jZXMgb24gdGhlIHNhbWUgZmlsZSBjYW4gcmFjZSBvbiB3cml0ZXMuXG4gIGlmICghY2FjaGVkVG9rZW5TdG9yZSkge1xuICAgIGNvbnN0IHsgQ29uc29sZVRva2VuU3RvcmU6IFRva2VuU3RvcmUgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlL2NvbnNvbGVUb2tlbi5qcycpO1xuICAgIGNvbnN0IHsgcGlja1JhbmRvbVRva2VuTmFtZSB9ID0gYXdhaXQgaW1wb3J0KCcuL2NvbnNvbGUvU2Vzc2lvbk5hbWVzLmpzJyk7XG4gICAgY2FjaGVkVG9rZW5TdG9yZSA9IG5ldyBUb2tlblN0b3JlKGVudi5ET0xMSE9VU0VfQ09OU09MRV9UT0tFTl9GSUxFKTtcbiAgICB0cnkgeyBhd2FpdCBjYWNoZWRUb2tlblN0b3JlLmVuc3VyZUluaXRpYWxpemVkKHBpY2tSYW5kb21Ub2tlbk5hbWUoKSk7IH1cbiAgICBjYXRjaCAoZXJyKSB7IGxvZ2dlci53YXJuKCdbV2ViVUldIEZhaWxlZCB0byBpbml0IHRva2VuIHN0b3JlIGZvciBicm93c2VyIG9wZW4nLCBlcnIpOyB9XG4gIH1cblxuICAvLyBsb2dCcm9hZGNhc3QgaXMgZGVmZXJyZWQg4oCUIHdpcmVkIGFmdGVyIHN0YXJ0V2ViU2VydmVyIHJldHVybnMgdGhlIHJlYWwgYnJvYWRjYXN0IGZuLlxuICBsZXQgbGl2ZUJyb2FkY2FzdDogKChlbnRyeTogaW1wb3J0KCcuLi9sb2dnaW5nL3R5cGVzLmpzJykuVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgeyBjcmVhdGVJbmdlc3RSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlL0luZ2VzdFJvdXRlcy5qcycpO1xuICBjb25zdCBpbmdlc3RSZXN1bHQgPSBjcmVhdGVJbmdlc3RSb3V0ZXMoe1xuICAgIGxvZ0Jyb2FkY2FzdDogKGVudHJ5KSA9PiBsaXZlQnJvYWRjYXN0Py4oZW50cnkpLFxuICAgIHN0b3JlTWV0cmljc1NuYXBzaG90OiAoc25hcHNob3QpID0+IG1ldHJpY3NTaW5rPy5vblNuYXBzaG90KHNuYXBzaG90KSxcbiAgfSk7XG4gIGluZ2VzdFJlc3VsdC5yZWdpc3RlckNvbnNvbGVTZXNzaW9uKCk7XG5cbiAgY29uc3Qgd2ViUmVzdWx0ID0gYXdhaXQgc3RhcnRXZWJTZXJ2ZXIoe1xuICAgIHBvcnRmb2xpb0Rpcjogb3B0aW9ucy5wb3J0Zm9saW9EaXIsXG4gICAgcG9ydCxcbiAgICBvcGVuQnJvd3NlcjogZmFsc2UsXG4gICAgbWNwQXFsSGFuZGxlcjogb3B0aW9ucy5tY3BBcWxIYW5kbGVyLFxuICAgIG1lbW9yeVNpbmssXG4gICAgbWV0cmljc1NpbmssXG4gICAgdG9rZW5TdG9yZTogY2FjaGVkVG9rZW5TdG9yZSxcbiAgICBhZGRpdGlvbmFsUm91dGVyczogW2luZ2VzdFJlc3VsdC5yb3V0ZXJdLFxuICB9KTtcblxuICBsaXZlQnJvYWRjYXN0ID0gd2ViUmVzdWx0LmxvZ0Jyb2FkY2FzdDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5Qb3J0Zm9saW9Ccm93c2VyKG9wdGlvbnM6IE9wZW5Ccm93c2VyT3B0aW9ucyk6IFByb21pc2U8QnJvd3Nlck9wZW5SZXN1bHQ+IHtcbiAgY29uc3QgdGFyZ2V0UG9ydCA9IG9wdGlvbnMucG9ydCB8fCBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IGJhc2VVcmwgPSBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3RhcmdldFBvcnR9YDtcblxuICAvLyBCdWlsZCBVUkwgd2l0aCBvcHRpb25hbCB0YWIgaGFzaCBhbmQgcXVlcnkgcGFyYW1ldGVyc1xuICBsZXQgdXJsID0gYmFzZVVybDtcbiAgaWYgKG9wdGlvbnMudGFiKSB7XG4gICAgY29uc3QgcXMgPSBvcHRpb25zLnVybFBhcmFtcyA/IG5ldyBVUkxTZWFyY2hQYXJhbXMob3B0aW9ucy51cmxQYXJhbXMpLnRvU3RyaW5nKCkgOiAnJztcbiAgICB1cmwgPSBgJHtiYXNlVXJsfS8jJHtvcHRpb25zLnRhYn0ke3FzID8gJz8nICsgcXMgOiAnJ31gO1xuICB9IGVsc2UgaWYgKG9wdGlvbnMudXJsUGFyYW1zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMudXJsUGFyYW1zKS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKG9wdGlvbnMudXJsUGFyYW1zKS50b1N0cmluZygpO1xuICAgIHVybCA9IGAke2Jhc2VVcmx9LyNwb3J0Zm9saW8/JHtxc31gO1xuICB9XG5cbiAgY29uc3QgYWxyZWFkeVJ1bm5pbmcgPSBzZXJ2ZXJSdW5uaW5nO1xuXG4gIGlmICghc2VydmVyUnVubmluZykge1xuICAgIGF3YWl0IHN0YXJ0RmFsbGJhY2tTZXJ2ZXIob3B0aW9ucywgdGFyZ2V0UG9ydCk7XG4gIH1cblxuICBjb25zdCBicm93c2VyUmVzdWx0ID0gYXdhaXQgb3BlbkluQnJvd3Nlcih1cmwpO1xuXG4gIHJldHVybiB7XG4gICAgdXJsLFxuICAgIGFscmVhZHlSdW5uaW5nLFxuICAgIGJyb3dzZXJPcGVuZWQ6IGJyb3dzZXJSZXN1bHQuc3VjY2VzcyxcbiAgICAuLi4oYnJvd3NlclJlc3VsdC5lcnJvciA/IHsgd2FybmluZzogYEJyb3dzZXIgY291bGQgbm90IGJlIG9wZW5lZCBhdXRvbWF0aWNhbGx5OiAke2Jyb3dzZXJSZXN1bHQuZXJyb3J9LiBPcGVuICR7dXJsfSBtYW51YWxseS5gIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
539
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxJQUFJLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQTRCLE1BQU0sMkJBQTJCLENBQUM7QUFDMUYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUt2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUs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QyxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RixHQUFHLEdBQUcsR0FBRyxPQUFPLEtBQUssT0FBTyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQzFELENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzFFLE1BQU0sRUFBRSxHQUFHLElBQUksZUFBZSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3RCxHQUFHLEdBQUcsR0FBRyxPQUFPLGVBQWUsRUFBRSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQztJQUVyQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsTUFBTSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRS9DLE9BQU87UUFDTCxHQUFHO1FBQ0gsY0FBYztRQUNkLGFBQWEsRUFBRSxhQUFhLENBQUMsT0FBTztRQUNwQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsOENBQThDLGFBQWEsQ0FBQyxLQUFLLFVBQVUsR0FBRyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3hJLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEb2xsaG91c2VNQ1AgV2ViIFVJIFNlcnZlclxuICpcbiAqIExpZ2h0d2VpZ2h0IEV4cHJlc3Mgc2VydmVyIGZvciBicm93c2luZyBwb3J0Zm9saW8gZWxlbWVudHMgaW4gYSBicm93c2VyLlxuICogQm91bmQgdG8gMTI3LjAuMC4xIG9ubHkgKGxvY2FsaG9zdCkuIFJlYWQtb25seSBmb3IgVjEuXG4gKlxuICogQ2FuIGJlIHN0YXJ0ZWQgc3RhbmRhbG9uZSAoYC0td2ViYCBmbGFnKSBvciBmcm9tIHdpdGhpbiB0aGUgTUNQIHNlcnZlclxuICogcHJvY2VzcyB2aWEgYG9wZW5Qb3J0Zm9saW9Ccm93c2VyKClgLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyLXYyLXJlZmFjdG9yL2lzc3Vlcy83MDRcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyLXYyLXJlZmFjdG9yL2lzc3Vlcy83NzRcbiAqL1xuXG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGpvaW4sIGRpcm5hbWUsIGV4dG5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IGV4ZWNGaWxlIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHBsYXRmb3JtIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUgYXMgcmVhZEZpbGVGcyB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgY3JlYXRlQXBpUm91dGVzLCBjcmVhdGVHYXRld2F5QXBpUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nUm91dGVzLCB0eXBlIExvZ1JvdXRlc1Jlc3VsdCB9IGZyb20gJy4vcm91dGVzL2xvZ1JvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVNZXRyaWNzUm91dGVzLCB0eXBlIE1ldHJpY3NSb3V0ZXNSZXN1bHQgfSBmcm9tICcuL3JvdXRlcy9tZXRyaWNzUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUhlYWx0aFJvdXRlcyB9IGZyb20gJy4vcm91dGVzL2hlYWx0aFJvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTZXR1cFJvdXRlcywgcmVwYWlyTnZtTGF1bmNoZXJPblN0YXJ0dXAgfSBmcm9tICcuL3JvdXRlcy9zZXR1cFJvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVUb3RwUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMvdG90cFJvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVUb2tlblJvdXRlcyB9IGZyb20gJy4vcm91dGVzL3Rva2VuUm91dGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi9jb25maWcvZW52LmpzJztcbmltcG9ydCB0eXBlIHsgTUNQQVFMSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL21jcC1hcWwvTUNQQVFMSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeUxvZ1NpbmsgfSBmcm9tICcuLi9sb2dnaW5nL3NpbmtzL01lbW9yeUxvZ1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlNZXRyaWNzU2luayB9IGZyb20gJy4uL21ldHJpY3Mvc2lua3MvTWVtb3J5TWV0cmljc1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBDb25zb2xlVG9rZW5TdG9yZSB9IGZyb20gJy4vY29uc29sZS9jb25zb2xlVG9rZW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlQXV0aE1pZGRsZXdhcmUgfSBmcm9tICcuL21pZGRsZXdhcmUvYXV0aE1pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgUEFDS0FHRV9WRVJTSU9OIH0gZnJvbSAnLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIFB1YmxpYyBwYXRoIHByZWZpeGVzIHRoYXQgbmV2ZXIgcmVxdWlyZSBhdXRoZW50aWNhdGlvbiAoIzE3ODApLlxuICogVGhlc2UgZW5kcG9pbnRzIHJldHVybiBzYWZlIG1ldGFkYXRhIG9yIGFjdCBhcyBoZWFsdGggcHJvYmVzIOKAlCByZXF1aXJpbmdcbiAqIHRva2VucyBvbiB0aGVtIHdvdWxkIGJyZWFrIG1vbml0b3JpbmcgYW5kIGNsaWVudCBkZXRlY3Rpb24gd2l0aG91dCBhZGRpbmdcbiAqIHJlYWwgc2VjdXJpdHkgdmFsdWUuXG4gKi9cbmNvbnN0IFBVQkxJQ19QQVRIX1BSRUZJWEVTID0gW1xuICAnL2FwaS9oZWFsdGgnLFxuICAnL2FwaS9zZXR1cC92ZXJzaW9uJyxcbiAgJy9hcGkvc2V0dXAvbWNwYicsXG4gICcvYXBpL3NldHVwL2RldGVjdCcsXG4gICcvYXBpL3NldHVwL2xpY2Vuc2UnLFxuXTtcblxuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBjdXJyZW50IGNvbnNvbGUgdG9rZW4uICovXG5jb25zdCBUT0tFTl9NRVRBX1BMQUNFSE9MREVSID0gJ3t7Q09OU09MRV9UT0tFTn19Jztcbi8qKiBQbGFjZWhvbGRlciBpbiBpbmRleC5odG1sIHRoYXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgcnVubmluZyBzZXJ2ZXIgdmVyc2lvbi4gKi9cbmNvbnN0IFZFUlNJT05fTUVUQV9QTEFDRUhPTERFUiA9ICd7e0RPTExIT1VTRV9WRVJTSU9OfX0nO1xuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdGFibGUgRG9sbGhvdXNlIHNlc3Npb24gSUQuICovXG5jb25zdCBTRVNTSU9OX0lEX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfU0VTU0lPTl9JRH19Jztcbi8qKiBQbGFjZWhvbGRlciBpbiBpbmRleC5odG1sIHRoYXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgcnVudGltZSBzZXNzaW9uIElELiAqL1xuY29uc3QgUlVOVElNRV9TRVNTSU9OX0lEX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfUlVOVElNRV9TRVNTSU9OX0lEfX0nO1xuLyoqIFBsYWNlaG9sZGVyIGluIGluZGV4Lmh0bWwgdGhhdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBhc3NldCBjYWNoZS1idXN0aW5nIHZlcnNpb24uICovXG5jb25zdCBBU1NFVF9WRVJTSU9OX01FVEFfUExBQ0VIT0xERVIgPSAne3tET0xMSE9VU0VfQVNTRVRfVkVSU0lPTn19JztcblxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuLyoqXG4gKiBEZWZhdWx0IHBvcnQgZm9yIHN0YW5kYWxvbmUgYHN0YXJ0V2ViU2VydmVyYCBjYWxscy4gUmVhZHMgZnJvbSB0aGVcbiAqIGBET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVGAgZW52IHZhciBzbyB0aGVyZSBpcyBhIHNpbmdsZSBzb3VyY2Ugb2ZcbiAqIHRydXRoIChzZWUgYHNyYy9jb25maWcvZW52LnRzYCkuIENhbGxlcnMgcGFzc2luZyBhbiBleHBsaWNpdCBgcG9ydGAgaW5cbiAqIGBXZWJTZXJ2ZXJPcHRpb25zYCBvdmVycmlkZSB0aGlzIGRlZmF1bHQuXG4gKi9cbmNvbnN0IERFRkFVTFRfUE9SVCA9IGVudi5ET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVDtcbmNvbnN0IENPTlNPTEVfSE9TVCA9ICdkb2xsaG91c2UubG9jYWxob3N0JztcbmNvbnN0IEFMTE9XRURfUEFHRV9FWFRFTlNJT05TID0gbmV3IFNldChbJy5odG1sJywgJy5odG0nXSk7XG4vKiogTWF4IEpTT04gYm9keSBmb3Igc2V0dXAgcm91dGVzIChpbnN0YWxsL29wZW4tY29uZmlnKS4gSW5nZXN0IHJvdXRlcyB1c2UgdGhlaXIgb3duIDFtYiBsaW1pdC4gKi9cbmNvbnN0IFNFVFVQX0JPRFlfTElNSVQgPSAnMWtiJztcblxuLyoqIFRyYWNrIHdoZXRoZXIgdGhlIHdlYiBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nIGluLXByb2Nlc3MuICovXG5sZXQgc2VydmVyUnVubmluZyA9IGZhbHNlO1xubGV0IHNlcnZlclBvcnQgPSBERUZBVUxUX1BPUlQ7XG4vKiogQWN0aXZlIEhUVFAgc2VydmVyIGluc3RhbmNlIOKAlCB0cmFja2VkIHNvIF9yZXNldFNlcnZlclN0YXRlIGNhbiBjbG9zZSBpdC4gKi9cbmxldCBhY3RpdmVIdHRwU2VydmVyOiBpbXBvcnQoJ25vZGU6aHR0cCcpLlNlcnZlciB8IG51bGwgPSBudWxsO1xuLyoqIENhY2hlZCB0b2tlbiBzdG9yZSBmb3Igb3BlblBvcnRmb2xpb0Jyb3dzZXIg4oCUIHByZXZlbnRzIGR1cGxpY2F0ZSBpbnN0YW5jZXMgb24gdGhlIHNhbWUgZmlsZS4gKi9cbmxldCBjYWNoZWRUb2tlblN0b3JlOiBDb25zb2xlVG9rZW5TdG9yZSB8IG51bGwgPSBudWxsO1xuXG4vKiogQ2hlY2sgd2hldGhlciB0aGUgd2ViIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkIGluIHRoaXMgcHJvY2Vzcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dlYlNlcnZlclJ1bm5pbmcoKTogYm9vbGVhbiB7XG4gIHJldHVybiBzZXJ2ZXJSdW5uaW5nO1xufVxuXG4vKipcbiAqIFJlc2V0IG1vZHVsZS1sZXZlbCBzZXJ2ZXIgc3RhdGUuIEV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHkg4oCUXG4gKiBhbGxvd3MgdGVzdHMgdG8gZXhlcmNpc2Ugc3RhcnRXZWJTZXJ2ZXIvYmluZEFuZExpc3RlbiB3aXRob3V0XG4gKiBpbnRlcmZlcmVuY2UgZnJvbSBwcmlvciBydW5zIGluIHRoZSBzYW1lIHByb2Nlc3MuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFNlcnZlclN0YXRlKCk6IHZvaWQge1xuICBpZiAoYWN0aXZlSHR0cFNlcnZlcikge1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIuY2xvc2UoKTtcbiAgICBhY3RpdmVIdHRwU2VydmVyID0gbnVsbDtcbiAgfVxuICBzZXJ2ZXJSdW5uaW5nID0gZmFsc2U7XG4gIHNlcnZlclBvcnQgPSBERUZBVUxUX1BPUlQ7XG4gIGNhY2hlZFRva2VuU3RvcmUgPSBudWxsO1xufVxuXG4vKipcbiAqIEdyYWNlZnVsbHkgc2h1dCBkb3duIHRoZSBIVFRQIHNlcnZlciAoIzE4NTYpLlxuICogQ2xvc2VzIHRoZSBhY3RpdmUgc2VydmVyIGFuZCByZXNldHMgbW9kdWxlIHN0YXRlIHNvIHRoZSBwb3J0IGlzIGZyZWVkXG4gKiBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBsaW5nZXJpbmcgdW50aWwgcHJvY2VzcyBleGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2h1dGRvd25XZWJTZXJ2ZXIoKTogdm9pZCB7XG4gIGlmIChhY3RpdmVIdHRwU2VydmVyKSB7XG4gICAgYWN0aXZlSHR0cFNlcnZlci5jbG9zZSgpO1xuICAgIGFjdGl2ZUh0dHBTZXJ2ZXIgPSBudWxsO1xuICAgIHNlcnZlclJ1bm5pbmcgPSBmYWxzZTtcbiAgICBsb2dnZXIuaW5mbyhgW1dlYlVJXSBIVFRQIHNlcnZlciBjbG9zZWQgb24gcG9ydCAke3NlcnZlclBvcnR9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyB0aGUgd2ViIHNlcnZlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZXJ2ZXJPcHRpb25zIHtcbiAgLyoqIFBvcnQgdG8gYmluZCB0byAoZGVmYXVsdHMgdG8gYERPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUYCwgc2VlIGBzcmMvY29uZmlnL2Vudi50c2ApICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBQYXRoIHRvIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5IChlLmcuLCB+Ly5kb2xsaG91c2UvcG9ydGZvbGlvKSAqL1xuICBwb3J0Zm9saW9EaXI6IHN0cmluZztcbiAgLyoqIE9wZW4gdGhlIGJyb3dzZXIgYXV0b21hdGljYWxseSBhZnRlciBzdGFydGluZyAoZGVmYXVsdDogZmFsc2UpICovXG4gIG9wZW5Ccm93c2VyPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE1DUEFRTEhhbmRsZXIgZm9yIHJvdXRpbmcgdGhyb3VnaCB0aGUgTUNQLUFRTCBwaXBlbGluZS5cbiAgICogV2hlbiBwcm92aWRlZCwgQVBJIHJvdXRlcyB1c2UgdGhlIGdhdGV3YXkgKHZhbGlkYXRlZCwgY2FjaGVkLCBnYXRla2VlcGVyLWNoZWNrZWQpLlxuICAgKiBXaGVuIGFic2VudCwgZmFsbHMgYmFjayB0byBkaXJlY3QgZmlsZXN5c3RlbSBhY2Nlc3MgKGxlZ2FjeSBiZWhhdmlvcikuXG4gICAqIElzc3VlICM3OTY6IFdlYiBNQ1AtQVFMIEdhdGV3YXkuXG4gICAqL1xuICBtY3BBcWxIYW5kbGVyPzogTUNQQVFMSGFuZGxlcjtcbiAgLyoqIE1lbW9yeUxvZ1NpbmsgZm9yIGxvZyByb3V0ZXMgKG9wdGlvbmFsIOKAlCBsb2dzIHRhYiBkaXNhYmxlZCBpZiBub3QgcHJvdmlkZWQpICovXG4gIG1lbW9yeVNpbms/OiBNZW1vcnlMb2dTaW5rO1xuICAvKiogTWVtb3J5TWV0cmljc1NpbmsgZm9yIG1ldHJpY3Mgcm91dGVzIChvcHRpb25hbCDigJQgbWV0cmljcyB0YWIgZGlzYWJsZWQgaWYgbm90IHByb3ZpZGVkKSAqL1xuICBtZXRyaWNzU2luaz86IE1lbW9yeU1ldHJpY3NTaW5rO1xuICAvKiogQWRkaXRpb25hbCByb3V0ZXJzIHRvIG1vdW50IGJlZm9yZSB0aGUgU1BBIGZhbGxiYWNrIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhZGRpdGlvbmFsUm91dGVycz86IGltcG9ydCgnZXhwcmVzcycpLlJvdXRlcltdO1xuICAvKipcbiAgICogQ29uc29sZSB0b2tlbiBzdG9yZSAoIzE3ODApLiBXaGVuIHByb3ZpZGVkLCB0aGUgc2VydmVyIHdpbGw6XG4gICAqICAgMS4gTW91bnQgQmVhcmVyIHRva2VuIGF1dGggbWlkZGxld2FyZSBiZWZvcmUgcHJvdGVjdGVkIHJvdXRlcnMuXG4gICAqICAgMi4gSW5qZWN0IHRoZSBwcmltYXJ5IHRva2VuIGludG8gaW5kZXguaHRtbCBzbyB0aGUgYnJvd3NlciBjbGllbnRcbiAgICogICAgICBjYW4gYXR0YWNoIGl0IHRvIGZldGNoIGNhbGxzIGFuZCBFdmVudFNvdXJjZSBVUkxzLlxuICAgKiAgIDMuIEFwcGVuZCB0aGUgdG9rZW4gZmlsZSBsb2NhdGlvbiB0byB0aGUgc3RhcnR1cCBiYW5uZXIuXG4gICAqIEF1dGggZW5mb3JjZW1lbnQgaXMgc3RpbGwgZ2F0ZWQgb24gRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQg4oCUIHRoZVxuICAgKiBtaWRkbGV3YXJlIGlzIGEgcGFzcy10aHJvdWdoIHdoZW4gdGhlIGZsYWcgaXMgZmFsc2UgKHRoZSBQaGFzZSAxIGRlZmF1bHQpLlxuICAgKi9cbiAgdG9rZW5TdG9yZT86IENvbnNvbGVUb2tlblN0b3JlO1xuICAvKiogU3RhYmxlIERvbGxob3VzZSBzZXNzaW9uIGlkZW50aXR5IHNob3duIGluIHRoZSB3ZWIgY29uc29sZSBVSS4gKi9cbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICAvKiogUnVudGltZS11bmlxdWUgc2Vzc2lvbiBpZGVudGl0eSBmb3IgZGlhZ25vc3RpY3MuICovXG4gIHJ1bnRpbWVTZXNzaW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGF0dGVtcHRpbmcgdG8gYmluZCB0aGUgSFRUUCBzZXJ2ZXIgdG8gYSBwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRSZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBlcnJvcj86ICdFQUREUklOVVNFJyB8ICdPVEhFUic7XG4gIGRldGFpbD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgdGhlIHdlYiBzZXJ2ZXIsIGluY2x1ZGluZyBob29rcyBmb3IgREkgd2lyaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlclJlc3VsdCB7XG4gIC8qKiBFeHByZXNzIGFwcCBpbnN0YW5jZSDigJQgZm9yIG1vdW50aW5nIGFkZGl0aW9uYWwgcm91dGVzIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhcHA/OiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzO1xuICAvKiogTG9nIGJyb2FkY2FzdCBmdW5jdGlvbiDigJQgY2FsbCB3aXRoIGVhY2ggZW50cnkgdG8gcHVzaCB0byBTU0UgY2xpZW50cyAqL1xuICBsb2dCcm9hZGNhc3Q/OiAoZW50cnk6IGltcG9ydCgnLi4vbG9nZ2luZy90eXBlcy5qcycpLlVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZDtcbiAgLyoqIE1ldHJpY3Mgc25hcHNob3QgZnVuY3Rpb24g4oCUIGNhbGwgd2l0aCBlYWNoIHNuYXBzaG90IHRvIHB1c2ggdG8gU1NFIGNsaWVudHMgKi9cbiAgbWV0cmljc09uU25hcHNob3Q/OiAoc25hcHNob3Q6IGltcG9ydCgnLi4vbWV0cmljcy90eXBlcy5qcycpLk1ldHJpY1NuYXBzaG90KSA9PiB2b2lkO1xuICAvKiogUmVzdWx0IG9mIHRoZSBwb3J0IGJpbmRpbmcgYXR0ZW1wdCAqL1xuICBiaW5kUmVzdWx0PzogQmluZFJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYXR0ZW1wdGluZyB0byBvcGVuIHRoZSBicm93c2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyb3dzZXJPcGVuUmVzdWx0IHtcbiAgLyoqIFRoZSBVUkwgdGhlIHNlcnZlciBpcyBydW5uaW5nIG9uICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgc2VydmVyIHdhcyBhbHJlYWR5IHJ1bm5pbmcgKHRydWUpIG9yIGp1c3Qgc3RhcnRlZCAoZmFsc2UpICovXG4gIGFscmVhZHlSdW5uaW5nOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgYnJvd3NlciB3YXMgc3VjY2Vzc2Z1bGx5IG9wZW5lZCAqL1xuICBicm93c2VyT3BlbmVkOiBib29sZWFuO1xuICAvKiogV2FybmluZyBtZXNzYWdlIGlmIHRoZSBicm93c2VyIGNvdWxkIG5vdCBiZSBvcGVuZWQgKi9cbiAgd2FybmluZz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcGVuIGEgVVJMIGluIHRoZSBzeXN0ZW0ncyBkZWZhdWx0IGJyb3dzZXIuXG4gKlxuICogUGxhdGZvcm0tYXdhcmU6XG4gKiAtIG1hY09TOiBgb3BlbmBcbiAqIC0gTGludXg6IGB4ZGctb3BlbmBcbiAqIC0gV2luZG93czogYHN0YXJ0YFxuICpcbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIHRvIG9wZW5cbiAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBicm93c2VyIG9wZW5lZCwgZmFsc2Ugd2l0aCBlcnJvciBtZXNzYWdlIGlmIG5vdFxuICovXG5mdW5jdGlvbiBvcGVuSW5Ccm93c2VyKHVybDogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG4gICAgY29uc3QgY21kID0gcGxhdCA9PT0gJ2RhcndpbicgPyAnb3BlbidcbiAgICAgIDogcGxhdCA9PT0gJ3dpbjMyJyA/ICdzdGFydCdcbiAgICAgIDogJ3hkZy1vcGVuJztcblxuICAgIC8vIFNlY3VyaXR5OiB1c2UgZXhlY0ZpbGUgd2l0aCBVUkwgYXMgYXJndW1lbnQgYXJyYXksIG5vdCBzdHJpbmcgaW50ZXJwb2xhdGlvblxuICAgIGNvbnN0IHVybFN0ciA9IFN0cmluZyh1cmwpO1xuICAgIC8vIEFjY2VwdCBsb2NhbGhvc3QsIDEyNy4wLjAuMSwgYW5kICoubG9jYWxob3N0IHN1YmRvbWFpbnMgKFJGQyA2NzYxKVxuICAgIGlmICghL15odHRwcz86XFwvXFwvKGxvY2FsaG9zdHwxMjdcXC4wXFwuMFxcLjF8W1xcdy1dK1xcLmxvY2FsaG9zdClbOi9dLy50ZXN0KHVybFN0cikpIHtcbiAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVUkwgbXVzdCBiZSBhIGxvY2FsaG9zdCBIVFRQIFVSTCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4ZWNGaWxlKGNtZCwgW3VybFN0cl0sIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gQ291bGQgbm90IGF1dG8tb3BlbiBicm93c2VyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTdGFydCB0aGUgcG9ydGZvbGlvIHdlYiBzZXJ2ZXIuXG4gKlxuICogQmluZHMgdG8gMTI3LjAuMC4xIG9ubHkgKGxvY2FsaG9zdCkuIFNlcnZlcyB0aGUgcG9ydGZvbGlvIGJyb3dzZXJcbiAqIGZyb250ZW5kIGFuZCBBUEkgcm91dGVzIGZvciByZWFkaW5nIGVsZW1lbnRzLlxuICpcbiAqIElkZW1wb3RlbnQ6IGlmIHRoZSBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nLCBvcHRpb25hbGx5IG9wZW5zIHRoZVxuICogYnJvd3NlciB3aXRob3V0IHN0YXJ0aW5nIGEgc2Vjb25kIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gU2VydmVyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEhvb2tzIGZvciBESSB3aXJpbmcgKGxvZyBicm9hZGNhc3QsIG1ldHJpY3Mgb25TbmFwc2hvdClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0V2ViU2VydmVyKG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMpOiBQcm9taXNlPFdlYlNlcnZlclJlc3VsdD4ge1xuICBjb25zdCBwb3J0ID0gb3B0aW9ucy5wb3J0IHx8IERFRkFVTFRfUE9SVDtcbiAgY29uc3QgcmVzdWx0OiBXZWJTZXJ2ZXJSZXN1bHQgPSB7fTtcblxuICBpZiAoc2VydmVyUnVubmluZykge1xuICAgIGlmIChvcHRpb25zLm9wZW5Ccm93c2VyKSB7XG4gICAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7c2VydmVyUG9ydH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgcmVzdWx0LmFwcCA9IGFwcDtcbiAgYXBwLmRpc2FibGUoJ3gtcG93ZXJlZC1ieScpO1xuXG4gIC8vIFNlY3VyaXR5IGhlYWRlcnNcbiAgYXBwLnVzZSgoX3JlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJyk7XG4gICAgcmVzLnNldEhlYWRlcignWC1GcmFtZS1PcHRpb25zJywgJ0RFTlknKTtcbiAgICByZXMuc2V0SGVhZGVyKCdYLVhTUy1Qcm90ZWN0aW9uJywgJzE7IG1vZGU9YmxvY2snKTtcbiAgICByZXMuc2V0SGVhZGVyKCdSZWZlcnJlci1Qb2xpY3knLCAnbm8tcmVmZXJyZXInKTtcbiAgICByZXMuc2V0SGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YCk7XG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBbXG4gICAgICBcImRlZmF1bHQtc3JjICdzZWxmJ1wiLFxuICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJyBjZG4uanNkZWxpdnIubmV0IGNkbmpzLmNsb3VkZmxhcmUuY29tXCIsXG4gICAgICBcInN0eWxlLXNyYyAnc2VsZicgJ3Vuc2FmZS1pbmxpbmUnIGNkbmpzLmNsb3VkZmxhcmUuY29tIGNkbi5qc2RlbGl2ci5uZXRcIixcbiAgICAgIFwiaW1nLXNyYyAnc2VsZicgZGF0YTpcIixcbiAgICAgIFwiY29ubmVjdC1zcmMgJ3NlbGYnIHJhdy5naXRodWJ1c2VyY29udGVudC5jb21cIixcbiAgICAgIFwiZm9udC1zcmMgJ3NlbGYnXCIsXG4gICAgXS5qb2luKCc7ICcpKTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIENvbnNvbGUgdG9rZW4gYXV0aGVudGljYXRpb24gbWlkZGxld2FyZSAoIzE3ODApLiBNb3VudGVkIGJlZm9yZSBhbnkgL2FwaVxuICAvLyByb3V0ZXMgc28gZXZlcnkgcHJvdGVjdGVkIGVuZHBvaW50IGdvZXMgdGhyb3VnaCBpdC4gV2hlbiB0aGUgZmVhdHVyZSBmbGFnXG4gIC8vIERPTExIT1VTRV9XRUJfQVVUSF9FTkFCTEVEIGlzIGZhbHNlIChQaGFzZSAxIGRlZmF1bHQpIHRoaXMgaXMgYSBwYXNzLXRocm91Z2guXG4gIC8vIFB1YmxpYyBlbmRwb2ludHMgaW4gUFVCTElDX1BBVEhfUFJFRklYRVMgYWx3YXlzIGJ5cGFzcyBhdXRoIHJlZ2FyZGxlc3Mgb2YgZmxhZy5cbiAgaWYgKG9wdGlvbnMudG9rZW5TdG9yZSkge1xuICAgIGNvbnN0IGF1dGhNaWRkbGV3YXJlID0gY3JlYXRlQXV0aE1pZGRsZXdhcmUoe1xuICAgICAgc3RvcmU6IG9wdGlvbnMudG9rZW5TdG9yZSxcbiAgICAgIGVuYWJsZWQ6IGVudi5ET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCxcbiAgICAgIHB1YmxpY1BhdGhQcmVmaXhlczogUFVCTElDX1BBVEhfUFJFRklYRVMsXG4gICAgICBsYWJlbDogJ2FwaScsXG4gICAgfSk7XG4gICAgYXBwLnVzZSgnL2FwaScsIGF1dGhNaWRkbGV3YXJlKTtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBbV2ViVUldIENvbnNvbGUgYXV0aCBtaWRkbGV3YXJlIG1vdW50ZWQgJHtlbnYuRE9MTEhPVVNFX1dFQl9BVVRIX0VOQUJMRUQgPyAnRU5GT1JDSU5HJyA6ICdwYXNzLXRocm91Z2ggKGZsYWcgb2ZmKSd9YCxcbiAgICApO1xuXG4gICAgLy8gVE9UUCBlbnJvbGxtZW50IHJvdXRlcyAoIzE3OTQpLiBNb3VudGVkIEFGVEVSIHRoZSAvYXBpIGF1dGggbWlkZGxld2FyZVxuICAgIC8vIGJlY2F1c2UgdGhlIHJvdXRlciBhZGRzIGl0cyBvd24gYWx3YXlzLW9uIGF1dGggZ3VhcmQg4oCUIHRoZSBnbG9iYWwgYXV0aFxuICAgIC8vIG1pZGRsZXdhcmUgYXQgL2FwaSBpcyBhIHBhc3MtdGhyb3VnaCBkdXJpbmcgUGhhc2UgMSByb2xsb3V0LCBidXQgdGhlXG4gICAgLy8gVE9UUCByb3V0ZXIgZW5mb3JjZXMgcmVnYXJkbGVzcyBvZiBET0xMSE9VU0VfV0VCX0FVVEhfRU5BQkxFRCBzbyBhblxuICAgIC8vIGF0dGFja2VyIHdpdGggbG9jYWwgcG9ydCBhY2Nlc3MgY2Fubm90IHByZS1lbnJvbGwgYSBzZWNvbmQgZmFjdG9yIGFuZFxuICAgIC8vIGxvY2sgdGhlIGxlZ2l0aW1hdGUgdXNlciBvdXQuXG4gICAgYXBwLnVzZSgnL2FwaS9jb25zb2xlL3RvdHAnLCBjcmVhdGVUb3RwUm91dGVzKHsgc3RvcmU6IG9wdGlvbnMudG9rZW5TdG9yZSB9KSk7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gVE9UUCByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL2NvbnNvbGUvdG90cCAoYWx3YXlzLW9uIGF1dGgpJyk7XG5cbiAgICAvLyBUb2tlbiBtYW5hZ2VtZW50IHJvdXRlcyAoIzE3OTUpLiBNb3VudGVkIGFsb25nc2lkZSB0aGUgVE9UUCByb3V0ZXIgd2l0aFxuICAgIC8vIHRoZSBzYW1lIGFsd2F5cy1vbiBhdXRoIHBhdHRlcm4uIEN1cnJlbnRseSBob3N0cyB0aGUgcm90YXRpb24gZW5kcG9pbnQ7XG4gICAgLy8gZnV0dXJlIHRva2VuIG1hbmFnZW1lbnQgb3BlcmF0aW9ucyAobGlzdCwgcmV2b2tlKSBnbyBoZXJlIHRvby5cbiAgICBhcHAudXNlKCcvYXBpL2NvbnNvbGUvdG9rZW4nLCBjcmVhdGVUb2tlblJvdXRlcyh7IHN0b3JlOiBvcHRpb25zLnRva2VuU3RvcmUgfSkpO1xuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIFRva2VuIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvY29uc29sZS90b2tlbiAoYWx3YXlzLW9uIGF1dGgpJyk7XG4gIH1cblxuICAvLyBTZXR1cCByb3V0ZXM6IGF1dG8taW5zdGFsbCBEb2xsaG91c2VNQ1AgdG8gTUNQIGNsaWVudHMgKG1vdW50IEJFRk9SRSBBUEkgcm91dGVzKVxuICAvLyBCb2R5IGxpbWl0IHNjb3BlZCB0byBzZXR1cCByb3V0ZXMgb25seSDigJQgaW5nZXN0IHJvdXRlcyBuZWVkIDFtYiBmb3IgZm9sbG93ZXIgbG9nIGZvcndhcmRpbmdcbiAgY29uc3Qgc2V0dXBKc29uUGFyc2VyID0gZXhwcmVzcy5qc29uKHsgbGltaXQ6IFNFVFVQX0JPRFlfTElNSVQsIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgY29uc3QgeyBpbnN0YWxsSGFuZGxlciwgb3BlbkNvbmZpZ0hhbmRsZXIsIHZlcnNpb25IYW5kbGVyLCBtY3BiUmVkaXJlY3RIYW5kbGVyLCBkZXRlY3RIYW5kbGVyLCBnZXRMaWNlbnNlSGFuZGxlciwgc2V0TGljZW5zZUhhbmRsZXIsIHZlcmlmeUxpY2Vuc2VIYW5kbGVyLCByZXNlbmRWZXJpZmljYXRpb25IYW5kbGVyIH0gPSBjcmVhdGVTZXR1cFJvdXRlcygpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9pbnN0YWxsJywgc2V0dXBKc29uUGFyc2VyLCBpbnN0YWxsSGFuZGxlcik7XG4gIGFwcC5wb3N0KCcvYXBpL3NldHVwL29wZW4tY29uZmlnJywgc2V0dXBKc29uUGFyc2VyLCBvcGVuQ29uZmlnSGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvdmVyc2lvbicsIHZlcnNpb25IYW5kbGVyKTtcbiAgYXBwLmdldCgnL2FwaS9zZXR1cC9tY3BiJywgbWNwYlJlZGlyZWN0SGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvZGV0ZWN0JywgZGV0ZWN0SGFuZGxlcik7XG4gIGFwcC5nZXQoJy9hcGkvc2V0dXAvbGljZW5zZScsIGdldExpY2Vuc2VIYW5kbGVyKTtcbiAgYXBwLnBvc3QoJy9hcGkvc2V0dXAvbGljZW5zZScsIHNldHVwSnNvblBhcnNlciwgc2V0TGljZW5zZUhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9saWNlbnNlL3ZlcmlmeScsIHNldHVwSnNvblBhcnNlciwgdmVyaWZ5TGljZW5zZUhhbmRsZXIpO1xuICBhcHAucG9zdCgnL2FwaS9zZXR1cC9saWNlbnNlL3Jlc2VuZCcsIHNldHVwSnNvblBhcnNlciwgcmVzZW5kVmVyaWZpY2F0aW9uSGFuZGxlcik7XG4gIGxvZ2dlci5pbmZvKCdbV2ViVUldIFNldHVwIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvc2V0dXAnKTtcblxuICAvLyBGaXJlLWFuZC1mb3JnZXQgTlZNIGxhdW5jaGVyIHJlcGFpcjogcmVjcmVhdGVzIHRoZSB3cmFwcGVyIGlmIGRlbGV0ZWQgYW5kXG4gIC8vIHBhdGNoZXMgYW55IHByZS1leGlzdGluZyBjb25maWdzIHRoYXQgc3RpbGwgdXNlIGJhcmUgYG5weGAuIE5vLW9wcyB3aGVuXG4gIC8vIE5WTSBpcyBhYnNlbnQgb3Igb24gV2luZG93cy4gTmV2ZXIgZGVsYXlzIHNlcnZlciBzdGFydHVwLlxuICByZXBhaXJOdm1MYXVuY2hlck9uU3RhcnR1cCgpLmNhdGNoKGVyciA9PlxuICAgIGxvZ2dlci53YXJuKGBbU2V0dXBdIE5WTSBzdGFydHVwIHJlcGFpciB0aHJldyB1bmV4cGVjdGVkbHk6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApXG4gICk7XG5cbiAgLy8gQVBJIHJvdXRlcyDigJQgdXNlIE1DUC1BUUwgZ2F0ZXdheSB3aGVuIGhhbmRsZXIgaXMgYXZhaWxhYmxlIChJc3N1ZSAjNzk2KVxuICBpZiAob3B0aW9ucy5tY3BBcWxIYW5kbGVyKSB7XG4gICAgYXBwLnVzZSgnL2FwaScsIGNyZWF0ZUdhdGV3YXlBcGlSb3V0ZXMob3B0aW9ucy5tY3BBcWxIYW5kbGVyLCBvcHRpb25zLnBvcnRmb2xpb0RpcikpO1xuXG4gICAgLy8gUGVybWlzc2lvbiBldmFsdWF0aW9uIHJvdXRlcyAoUE9TVCAvZXZhbHVhdGVfcGVybWlzc2lvbiwgR0VUIC9wZXJtaXNzaW9ucy9zdGF0dXMpXG4gICAgY29uc3QgeyByZWdpc3RlclBlcm1pc3Npb25Sb3V0ZXMgfSA9IGF3YWl0IGltcG9ydCgnLi9yb3V0ZXMvcGVybWlzc2lvblJvdXRlcy5qcycpO1xuICAgIGNvbnN0IHBlcm1Sb3V0ZXIgPSAoYXdhaXQgaW1wb3J0KCdleHByZXNzJykpLlJvdXRlcigpO1xuICAgIHJlZ2lzdGVyUGVybWlzc2lvblJvdXRlcyhwZXJtUm91dGVyLCBvcHRpb25zLm1jcEFxbEhhbmRsZXIpO1xuICAgIGFwcC51c2UoJy9hcGknLCBwZXJtUm91dGVyKTtcblxuICAgIGxvZ2dlci5pbmZvKCdbV2ViVUldIEFQSSByb3V0ZXMgdXNpbmcgTUNQLUFRTCBHYXRld2F5ICsgcGVybWlzc2lvbiByb3V0ZXMnKTtcbiAgfSBlbHNlIHtcbiAgICBhcHAudXNlKCcvYXBpJywgY3JlYXRlQXBpUm91dGVzKG9wdGlvbnMucG9ydGZvbGlvRGlyKSk7XG4gICAgbG9nZ2VyLndhcm4oJ1tXZWJVSV0gQVBJIHJvdXRlcyB1c2luZyBkaXJlY3QgZmlsZXN5c3RlbSBhY2Nlc3MgKG5vIE1DUC1BUUwgaGFuZGxlciBhdmFpbGFibGUpJyk7XG4gIH1cblxuICAvLyBDb25zb2xlIHJvdXRlczogbG9ncywgbWV0cmljcywgaGVhbHRoIOKAlCBleHRyYWN0ZWQgdG8ga2VlcCBjb2duaXRpdmVcbiAgLy8gY29tcGxleGl0eSBvZiBzdGFydFdlYlNlcnZlciBtYW5hZ2VhYmxlLlxuICBtb3VudENvbnNvbGVSb3V0ZXMoYXBwLCBvcHRpb25zLCByZXN1bHQpO1xuXG4gIC8vIFNlcnZlIH4vLmRvbGxob3VzZS9wYWdlcy8gYXQgL3BhZ2VzLyDigJQgZGFzaGJvYXJkcywgZ2VuZXJhdGVkIGNvbnRlbnQsIHN0YWNrIHZpZXdzXG4gIGNvbnN0IHBhZ2VzRGlyID0gam9pbihkaXJuYW1lKG9wdGlvbnMucG9ydGZvbGlvRGlyKSwgJ3BhZ2VzJyk7XG4gIG1rZGlyKHBhZ2VzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KS5jYXRjaChlcnIgPT4ge1xuICAgIGxvZ2dlci53YXJuKGBbV2ViVUldIENvdWxkIG5vdCBjcmVhdGUgcGFnZXMgZGlyZWN0b3J5OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH0pO1xuICBhcHAudXNlKCcvcGFnZXMnLCBleHByZXNzLnN0YXRpYyhwYWdlc0RpcikpO1xuXG4gIC8qKlxuICAgKiBHRVQgL2FwaS9wYWdlc1xuICAgKiBMaXN0cyBhdmFpbGFibGUgSFRNTCBwYWdlcyBpbiB+Ly5kb2xsaG91c2UvcGFnZXMvLlxuICAgKiBSZXR1cm5zIHBhZ2UgbmFtZXMgYW5kIHRoZWlyIFVSTHMgZm9yIHRoZSBtYW5hZ2VtZW50IGNvbnNvbGUuXG4gICAqL1xuICBhcHAuZ2V0KCcvYXBpL3BhZ2VzJywgYXN5bmMgKF9yZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHJlYWRkaXIocGFnZXNEaXIpO1xuICAgICAgY29uc3QgcGFnZXMgPSBmaWxlc1xuICAgICAgICAuZmlsdGVyKGYgPT4gIWYuc3RhcnRzV2l0aCgnLicpICYmIEFMTE9XRURfUEFHRV9FWFRFTlNJT05TLmhhcyhleHRuYW1lKGYpKSlcbiAgICAgICAgLm1hcChmID0+ICh7IG5hbWU6IGYsIHVybDogYC9wYWdlcy8ke2Z9YCB9KSk7XG4gICAgICByZXMuanNvbih7IHBhZ2VzLCBkaXJlY3Rvcnk6IHBhZ2VzRGlyIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmVzLmpzb24oeyBwYWdlczogW10sIGRpcmVjdG9yeTogcGFnZXNEaXIgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBBZGRpdGlvbmFsIHJvdXRlcnMgKGUuZy4sIHVuaWZpZWQgY29uc29sZSBpbmdlc3Qgcm91dGVzKSDigJQgbXVzdCBtb3VudCBiZWZvcmUgU1BBIGZhbGxiYWNrXG4gIG9wdGlvbnMuYWRkaXRpb25hbFJvdXRlcnM/LmZvckVhY2gocm91dGVyID0+IGFwcC51c2Uocm91dGVyKSk7XG5cbiAgLy8gU3RhdGljIGZyb250ZW5kIGZpbGVzXG4gIGNvbnN0IHB1YmxpY0RpciA9IGpvaW4oX19kaXJuYW1lLCAncHVibGljJyk7XG4gIC8vIFNlcnZlIHN0YXRpYyBhc3NldHMgYnV0IHNraXAgaW5kZXguaHRtbCDigJQgdGhlIFNQQSBmYWxsYmFjayBiZWxvd1xuICAvLyBoYW5kbGVzIGl0IHdpdGggdG9rZW4gaW5qZWN0aW9uIChyZXBsYWNlcyB7e0NPTlNPTEVfVE9LRU59fSBpbiB0aGVcbiAgLy8gbWV0YSB0YWcpLiBXaXRob3V0IHRoaXMsIGV4cHJlc3Muc3RhdGljIHNlcnZlcyB0aGUgcmF3IHRlbXBsYXRlXG4gIC8vIGFuZCB0aGUgYnJvd3NlciBuZXZlciBnZXRzIHRoZSBhdXRoIHRva2VuICgjMTc4MCkuXG4gIGNvbnN0IGlzRGVidWcgPSBCb29sZWFuKHByb2Nlc3MuZW52LkRPTExIT1VTRV9ERUJVRyB8fCBwcm9jZXNzLmVudi5FTkFCTEVfREVCVUcpO1xuICBhcHAudXNlKGV4cHJlc3Muc3RhdGljKHB1YmxpY0Rpciwge1xuICAgIGluZGV4OiBmYWxzZSxcbiAgICAvLyBJbiBkZWJ1ZyBtb2RlLCBkaXNhYmxlIGNhY2hpbmcgb24gYWxsIHN0YXRpYyBhc3NldHMgKEpTLCBDU1MpIHNvXG4gICAgLy8gVUkgY2hhbmdlcyBhcmUgcGlja2VkIHVwIG9uIG5vcm1hbCByZWxvYWQgd2l0aG91dCBDbWQrU2hpZnQrUi5cbiAgICAuLi4oaXNEZWJ1Z1xuICAgICAgPyB7IGV0YWc6IGZhbHNlLCBsYXN0TW9kaWZpZWQ6IGZhbHNlLCBtYXhBZ2U6IDAgfVxuICAgICAgOiB7IG1heEFnZTogJzF5JywgaW1tdXRhYmxlOiB0cnVlIH0pLFxuICB9KSk7XG5cbiAgLy8gU1BBIGZhbGxiYWNrIHdpdGggY29uc29sZSB0b2tlbiBpbmplY3Rpb24gKCMxNzgwKS5cbiAgLy8gUmVhZHMgaW5kZXguaHRtbCBvbiBmaXJzdCByZXF1ZXN0LCBzdWJzdGl0dXRlcyB0aGUge3tDT05TT0xFX1RPS0VOfX0gcGxhY2Vob2xkZXJcbiAgLy8gd2l0aCB0aGUgY3VycmVudCB0b2tlbiB2YWx1ZSwgYW5kIGNhY2hlcyB0aGUgcmVuZGVyZWQgc3RyaW5nLiBUaGUgY2FjaGUgaXNcbiAgLy8gYXV0by1pbnZhbGlkYXRlZCB3aGVuIHRoZSBwcmltYXJ5IHRva2VuIGNoYW5nZXMgKHJvdGF0aW9uKSwgc28gYSBwYWdlIHJlbG9hZFxuICAvLyBhZnRlciByb3RhdGlvbiBwaWNrcyB1cCB0aGUgbmV3IHRva2VuIHdpdGhvdXQgYSBzZXJ2ZXIgcmVzdGFydC5cbiAgbGV0IGNhY2hlZEluZGV4SHRtbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBjYWNoZWRUb2tlblZhbHVlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgaW5kZXhIdG1sUGF0aCA9IGpvaW4ocHVibGljRGlyLCAnaW5kZXguaHRtbCcpO1xuXG4gIGNvbnN0IHJlbmRlckluZGV4SHRtbCA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIGNvbnN0IHRva2VuVmFsdWUgPSBvcHRpb25zLnRva2VuU3RvcmU/LmdldFByaW1hcnlUb2tlblZhbHVlKCkgPz8gJyc7XG4gICAgLy8gQXV0by1pbnZhbGlkYXRlIGNhY2hlIHdoZW4gdGhlIHRva2VuIGNoYW5nZXMgKHJvdGF0aW9uKS5cbiAgICAvLyBJbiBkZWJ1ZyBtb2RlLCBhbHdheXMgcmUtcmVhZCBmcm9tIGRpc2sgc28gVUkgY2hhbmdlcyBhcmUgcGlja2VkIHVwIG9uIHJlbG9hZC5cbiAgICBpZiAoIWlzRGVidWcgJiYgY2FjaGVkSW5kZXhIdG1sICE9PSBudWxsICYmIGNhY2hlZFRva2VuVmFsdWUgPT09IHRva2VuVmFsdWUpIHtcbiAgICAgIHJldHVybiBjYWNoZWRJbmRleEh0bWw7XG4gICAgfVxuICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgcmVhZEZpbGVGcyhpbmRleEh0bWxQYXRoLCAndXRmOCcpO1xuICAgIC8vIERlZmVuc2l2ZSBIVE1MIGF0dHJpYnV0ZSBlc2NhcGUuIFRva2VucyBhcmUgc3RyaWN0IDY0LWNoYXIgbG93ZXJjYXNlIGhleFxuICAgIC8vIHRvZGF5IHNvIG5vIGVzY2FwaW5nIGlzIGFjdHVhbGx5IG5lZWRlZCwgYnV0IGlmIHRoZSB0b2tlbiBmb3JtYXQgZXZlclxuICAgIC8vIGNoYW5nZXMgdGhpcyBwcmV2ZW50cyBhbiBIVE1MLWluamVjdGlvbiByZWdyZXNzaW9uIGZyb20gbGFuZGluZyBzaWxlbnRseS5cbiAgICBjb25zdCBlc2NhcGVkVG9rZW4gPSB0b2tlblZhbHVlXG4gICAgICAucmVwbGFjZUFsbCgnJicsICcmYW1wOycpXG4gICAgICAucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JylcbiAgICAgIC5yZXBsYWNlQWxsKFwiJ1wiLCAnJiMzOTsnKVxuICAgICAgLnJlcGxhY2VBbGwoJzwnLCAnJmx0OycpXG4gICAgICAucmVwbGFjZUFsbCgnPicsICcmZ3Q7Jyk7XG4gICAgY29uc3QgZXNjYXBlZFNlc3Npb25JZCA9IChvcHRpb25zLnNlc3Npb25JZCA/PyAnJylcbiAgICAgIC5yZXBsYWNlQWxsKCcmJywgJyZhbXA7JylcbiAgICAgIC5yZXBsYWNlQWxsKCdcIicsICcmcXVvdDsnKVxuICAgICAgLnJlcGxhY2VBbGwoXCInXCIsICcmIzM5OycpXG4gICAgICAucmVwbGFjZUFsbCgnPCcsICcmbHQ7JylcbiAgICAgIC5yZXBsYWNlQWxsKCc+JywgJyZndDsnKTtcbiAgICBjb25zdCBlc2NhcGVkUnVudGltZVNlc3Npb25JZCA9IChvcHRpb25zLnJ1bnRpbWVTZXNzaW9uSWQgPz8gJycpXG4gICAgICAucmVwbGFjZUFsbCgnJicsICcmYW1wOycpXG4gICAgICAucmVwbGFjZUFsbCgnXCInLCAnJnF1b3Q7JylcbiAgICAgIC5yZXBsYWNlQWxsKFwiJ1wiLCAnJiMzOTsnKVxuICAgICAgLnJlcGxhY2VBbGwoJzwnLCAnJmx0OycpXG4gICAgICAucmVwbGFjZUFsbCgnPicsICcmZ3Q7Jyk7XG4gICAgY2FjaGVkSW5kZXhIdG1sID0gdGVtcGxhdGVcbiAgICAgIC5yZXBsYWNlQWxsKFRPS0VOX01FVEFfUExBQ0VIT0xERVIsIGVzY2FwZWRUb2tlbilcbiAgICAgIC5yZXBsYWNlQWxsKFZFUlNJT05fTUVUQV9QTEFDRUhPTERFUiwgUEFDS0FHRV9WRVJTSU9OKVxuICAgICAgLnJlcGxhY2VBbGwoU0VTU0lPTl9JRF9NRVRBX1BMQUNFSE9MREVSLCBlc2NhcGVkU2Vzc2lvbklkKVxuICAgICAgLnJlcGxhY2VBbGwoUlVOVElNRV9TRVNTSU9OX0lEX01FVEFfUExBQ0VIT0xERVIsIGVzY2FwZWRSdW50aW1lU2Vzc2lvbklkKVxuICAgICAgLnJlcGxhY2VBbGwoQVNTRVRfVkVSU0lPTl9NRVRBX1BMQUNFSE9MREVSLCBQQUNLQUdFX1ZFUlNJT04pO1xuICAgIGNhY2hlZFRva2VuVmFsdWUgPSB0b2tlblZhbHVlO1xuICAgIHJldHVybiBjYWNoZWRJbmRleEh0bWw7XG4gIH07XG5cbiAgYXBwLmdldCgnL3sqcGF0aH0nLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHJlcS5wYXRoLm5vcm1hbGl6ZSgnTkZDJyk7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoJy9hcGkvJykpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGBBUEkgcm91dGUgbm90IGZvdW5kOiAke25vcm1hbGl6ZWRQYXRofWAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKCcvcGFnZXMvJykpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGBQYWdlIG5vdCBmb3VuZDogJHtub3JtYWxpemVkUGF0aH1gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlckluZGV4SHRtbCgpO1xuICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbDsgY2hhcnNldD11dGYtOCcpO1xuICAgICAgLy8gVGhlIHNoZWxsIHNob3VsZCBhbHdheXMgcmV2YWxpZGF0ZSBzbyBhIGZvcmNlZCByZWxvYWQgY2FuIHBpY2sgdXBcbiAgICAgIC8vIGEgbmV3IGxlYWRlci92ZXJzaW9uIGltbWVkaWF0ZWx5LiBBc3NldCBmaWxlcyB0aGVtc2VsdmVzIGNhcnJ5IGFcbiAgICAgIC8vIHZlcnNpb24gcXVlcnkgYW5kIGNhbiBiZSBjYWNoZWQgYWdncmVzc2l2ZWx5LlxuICAgICAgcmVzLnNldEhlYWRlcignQ2FjaGUtQ29udHJvbCcsICduby1jYWNoZSwgbm8tc3RvcmUsIG11c3QtcmV2YWxpZGF0ZScpO1xuICAgICAgcmVzLnNlbmQoaHRtbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtXZWJVSV0gRmFpbGVkIHRvIHJlbmRlciBpbmRleC5odG1sOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZCgnRmFpbGVkIHRvIGxvYWQgY29uc29sZScpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gR2xvYmFsIGVycm9yIGhhbmRsZXIg4oCUIGNhdGNoIEV4cHJlc3MgZXJyb3JzIGFuZCByb3V0ZSB0byBsb2dnZXIgaW5zdGVhZCBvZiB0ZXJtaW5hbC5cbiAgLy8gV2l0aG91dCB0aGlzLCBFeHByZXNzIGR1bXBzIHN0YWNrIHRyYWNlcyB0byBzdGRlcnIgKHZpc2libGUgaW4gLS13ZWIgdGVybWluYWwpLlxuICAvLyBBbGwgZXJyb3JzIHN0aWxsIGFwcGVhciBpbiB0aGUgbWFuYWdlbWVudCBjb25zb2xlJ3MgTG9ncyB0YWIgdmlhIE1lbW9yeUxvZ1NpbmsuXG4gIGFwcC51c2UoKGVycjogRXJyb3IsIF9yZXE6IGltcG9ydCgnZXhwcmVzcycpLlJlcXVlc3QsIHJlczogaW1wb3J0KCdleHByZXNzJykuUmVzcG9uc2UsIF9uZXh0OiBpbXBvcnQoJ2V4cHJlc3MnKS5OZXh0RnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCBzdGF0dXMgPSAoZXJyIGFzIGFueSkuc3RhdHVzIHx8IChlcnIgYXMgYW55KS5zdGF0dXNDb2RlIHx8IDUwMDtcbiAgICBsb2dnZXIud2FybihgW1dlYlVJXSAke2Vyci5uYW1lfTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICBpZiAoIXJlcy5oZWFkZXJzU2VudCkge1xuICAgICAgcmVzLnN0YXR1cyhzdGF0dXMpLmpzb24oeyBlcnJvcjogZXJyLm1lc3NhZ2UgfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBCaW5kIHRvIGxvY2FsaG9zdCBvbmx5IOKAlCBoYW5kbGUgcG9ydCBjb25mbGljdHMgZ3JhY2VmdWxseS5cbiAgLy8gRXh0cmFjdGVkIHRvIGEgaGVscGVyIHRvIGtlZXAgc3RhcnRXZWJTZXJ2ZXIncyBjb2duaXRpdmUgY29tcGxleGl0eSBtYW5hZ2VhYmxlLlxuICByZXN1bHQuYmluZFJlc3VsdCA9IGF3YWl0IGJpbmRBbmRMaXN0ZW4oYXBwLCBwb3J0LCBvcHRpb25zKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIE1vdW50IHRoZSBsb2dzLCBtZXRyaWNzLCBhbmQgaGVhbHRoIHJvdXRlcy4gVGhlc2UgYXJlIG9ubHkgbW91bnRlZCB3aGVuIHRoZVxuICogY29ycmVzcG9uZGluZyBzaW5rcyBhcmUgcHJvdmlkZWQgKG1lbW9yeSBsb2cgc2luayBmb3IgbG9ncytoZWFsdGgsIG1ldHJpY3NcbiAqIHNpbmsgZm9yIHRoZSBtZXRyaWNzIHRhYikuIEV4dHJhY3RlZCBmcm9tIHN0YXJ0V2ViU2VydmVyIHRvIGNhcCB0aGUgbWFpblxuICogZnVuY3Rpb24ncyBjb2duaXRpdmUgY29tcGxleGl0eS5cbiAqL1xuZnVuY3Rpb24gbW91bnRDb25zb2xlUm91dGVzKFxuICBhcHA6IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3MsXG4gIG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMsXG4gIHJlc3VsdDogV2ViU2VydmVyUmVzdWx0LFxuKTogdm9pZCB7XG4gIGxldCBsb2dSb3V0ZXM6IExvZ1JvdXRlc1Jlc3VsdCB8IHVuZGVmaW5lZDtcbiAgbGV0IG1ldHJpY3NSb3V0ZXM6IE1ldHJpY3NSb3V0ZXNSZXN1bHQgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKG9wdGlvbnMubWVtb3J5U2luaykge1xuICAgIGxvZ1JvdXRlcyA9IGNyZWF0ZUxvZ1JvdXRlcyhvcHRpb25zLm1lbW9yeVNpbmspO1xuICAgIGFwcC51c2UoJy9hcGknLCBsb2dSb3V0ZXMucm91dGVyKTtcbiAgICByZXN1bHQubG9nQnJvYWRjYXN0ID0gbG9nUm91dGVzLmJyb2FkY2FzdDtcbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBMb2cgdmlld2VyIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvbG9ncycpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMubWV0cmljc1NpbmspIHtcbiAgICBtZXRyaWNzUm91dGVzID0gY3JlYXRlTWV0cmljc1JvdXRlcyhvcHRpb25zLm1ldHJpY3NTaW5rKTtcbiAgICBhcHAudXNlKCcvYXBpJywgbWV0cmljc1JvdXRlcy5yb3V0ZXIpO1xuICAgIHJlc3VsdC5tZXRyaWNzT25TbmFwc2hvdCA9IG1ldHJpY3NSb3V0ZXMub25TbmFwc2hvdDtcbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBNZXRyaWNzIHJvdXRlcyBtb3VudGVkIGF0IC9hcGkvbWV0cmljcycpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMubWVtb3J5U2luaykge1xuICAgIGNvbnN0IGhlYWx0aFJvdXRlciA9IGNyZWF0ZUhlYWx0aFJvdXRlcyh7XG4gICAgICBtZW1vcnlTaW5rOiBvcHRpb25zLm1lbW9yeVNpbmssXG4gICAgICBtZXRyaWNzU2luazogb3B0aW9ucy5tZXRyaWNzU2luayxcbiAgICAgIGxvZ0NsaWVudENvdW50OiBsb2dSb3V0ZXMgPyBsb2dSb3V0ZXMuY2xpZW50Q291bnQgOiAoKSA9PiAwLFxuICAgICAgbWV0cmljc0NsaWVudENvdW50OiBtZXRyaWNzUm91dGVzID8gbWV0cmljc1JvdXRlcy5jbGllbnRDb3VudCA6ICgpID0+IDAsXG4gICAgfSk7XG4gICAgYXBwLnVzZSgnL2FwaScsIGhlYWx0aFJvdXRlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBQcmludCB0aGUgc3RhcnR1cCBiYW5uZXIgdG8gc3RkZXJyLlxuICpcbiAqIE5PVEU6IFVzZSBzdGRlcnIgZm9yIHRlcm1pbmFsIG91dHB1dCwgbm90IHN0ZG91dC4gSW4gTUNQIHN0ZGlvIG1vZGUsIHN0ZG91dFxuICogaXMgcmVzZXJ2ZWQgZm9yIEpTT04tUlBDIG1lc3NhZ2VzIOKAlCBhbnkgbm9uLUpTT04gb3V0cHV0IGNvcnJ1cHRzIHRoZSBwcm90b2NvbC5cbiAqIHN0ZGVyciBpcyBzYWZlIGZvciBodW1hbi1yZWFkYWJsZSBtZXNzYWdlcyBpbiBib3RoIE1DUCBhbmQgc3RhbmRhbG9uZSBtb2Rlcy5cbiAqL1xuZnVuY3Rpb24gcHJpbnRTdGFydHVwQmFubmVyKHBvcnQ6IG51bWJlciwgdG9rZW5TdG9yZTogQ29uc29sZVRva2VuU3RvcmUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgY29uc3QgdXJsID0gYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fWA7XG4gIGNvbnN0IGZhbGxiYWNrVXJsID0gYGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gIGxvZ2dlci5pbmZvKGBbV2ViVUldIE1hbmFnZW1lbnQgY29uc29sZSBydW5uaW5nIGF0ICR7dXJsfWApO1xuICBjb25zb2xlLmVycm9yKGBcXG4gIERvbGxob3VzZU1DUCBNYW5hZ2VtZW50IENvbnNvbGVcXG4gICR7dXJsfVxcbiAgJHtmYWxsYmFja1VybH0gKGZhbGxiYWNrKVxcbmApO1xuICBpZiAodG9rZW5TdG9yZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYCAgU2Vzc2lvbiB0b2tlbjogJHt0b2tlblN0b3JlLmdldEZpbGVQYXRoKCl9XFxuYCk7XG4gIH1cbiAgY29uc29sZS5lcnJvcihgICBUeXBlIFwicVwiIG9yIFwicXVpdFwiIHRvIGV4aXQuXFxuYCk7XG59XG5cbi8vIFN0YWxlIHByb2Nlc3MgcmVjb3Zlcnkg4oCUIGV4dHJhY3RlZCB0byBTdGFsZVByb2Nlc3NSZWNvdmVyeS50cyBmb3IgaW5kZXBlbmRlbnQgdGVzdGluZyAoIzE4NTApLlxuaW1wb3J0IHsgcmVjb3ZlclN0YWxlUG9ydCB9IGZyb20gJy4vY29uc29sZS9TdGFsZVByb2Nlc3NSZWNvdmVyeS5qcyc7XG5leHBvcnQgeyBmaW5kUGlkT25Qb3J0LCBraWxsU3RhbGVQcm9jZXNzLCByZWNvdmVyU3RhbGVQb3J0IH0gZnJvbSAnLi9jb25zb2xlL1N0YWxlUHJvY2Vzc1JlY292ZXJ5LmpzJztcblxuLyoqXG4gKiBBdHRlbXB0IGEgc2luZ2xlIHBvcnQgYmluZC4gUmV0dXJucyBhIEJpbmRSZXN1bHQgd2l0aG91dCBhbnkgcmVjb3ZlcnkgbG9naWMuXG4gKi9cbmZ1bmN0aW9uIGF0dGVtcHRCaW5kKFxuICBhcHA6IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3MsXG4gIHBvcnQ6IG51bWJlcixcbiAgb3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyxcbik6IFByb21pc2U8QmluZFJlc3VsdD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8QmluZFJlc3VsdD4oKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBodHRwU2VydmVyID0gYXBwLmxpc3Rlbihwb3J0LCAnMTI3LjAuMC4xJywgKCkgPT4ge1xuICAgICAgc2VydmVyUnVubmluZyA9IHRydWU7XG4gICAgICBzZXJ2ZXJQb3J0ID0gcG9ydDtcbiAgICAgIGFjdGl2ZUh0dHBTZXJ2ZXIgPSBodHRwU2VydmVyO1xuICAgICAgcHJpbnRTdGFydHVwQmFubmVyKHBvcnQsIG9wdGlvbnMudG9rZW5TdG9yZSk7XG4gICAgICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgICAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIGh0dHBTZXJ2ZXIub24oJ2Vycm9yJywgKGVycjogTm9kZUpTLkVycm5vRXhjZXB0aW9uKSA9PiB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUREUklOVVNFJykge1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnRUFERFJJTlVTRScsIGRldGFpbDogYFBvcnQgJHtwb3J0fSBhbHJlYWR5IGluIHVzZWAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtXZWJVSV0gRmFpbGVkIHRvIGJpbmQgcG9ydCAke3BvcnR9OiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnT1RIRVInLCBkZXRhaWw6IGVyci5tZXNzYWdlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCaW5kIHRoZSBFeHByZXNzIGFwcCB0byAxMjcuMC4wLjE6cG9ydC4gT24gRUFERFJJTlVTRSwgYXR0ZW1wdCB0byBmaW5kXG4gKiBhbmQga2lsbCB0aGUgc3RhbGUgRG9sbGhvdXNlTUNQIHByb2Nlc3MgaG9sZGluZyB0aGUgcG9ydCwgdGhlbiByZXRyeSBvbmNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBiaW5kQW5kTGlzdGVuKFxuICBhcHA6IGltcG9ydCgnZXhwcmVzcycpLkV4cHJlc3MsXG4gIHBvcnQ6IG51bWJlcixcbiAgb3B0aW9uczogV2ViU2VydmVyT3B0aW9ucyxcbik6IFByb21pc2U8QmluZFJlc3VsdD4ge1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBhdHRlbXB0QmluZChhcHAsIHBvcnQsIG9wdGlvbnMpO1xuICBpZiAocmVzdWx0LnN1Y2Nlc3MgfHwgcmVzdWx0LmVycm9yICE9PSAnRUFERFJJTlVTRScpIHJldHVybiByZXN1bHQ7XG5cbiAgLy8gUG9ydCBvY2N1cGllZCDigJQgYXR0ZW1wdCBzdGFsZSBwcm9jZXNzIHJlY292ZXJ5IGFuZCByZXRyeVxuICBpZiAoYXdhaXQgcmVjb3ZlclN0YWxlUG9ydChwb3J0KSkge1xuICAgIGNvbnN0IHJldHJ5UmVzdWx0ID0gYXdhaXQgYXR0ZW1wdEJpbmQoYXBwLCBwb3J0LCBvcHRpb25zKTtcbiAgICBpZiAocmV0cnlSZXN1bHQuc3VjY2VzcykgcmV0dXJuIHJldHJ5UmVzdWx0O1xuICB9XG5cbiAgLy8gU3RpbGwgY2FuJ3QgYmluZCDigJQgZmFsbCB0aHJvdWdoIHdpdGggd2FybmluZ1xuICBsb2dnZXIud2FybihgW1dlYlVJXSBQb3J0ICR7cG9ydH0gYWxyZWFkeSBpbiB1c2Ug4oCUIGFub3RoZXIgcHJvY2VzcyBob2xkcyB0aGlzIHBvcnRgKTtcbiAgY29uc29sZS5lcnJvcihgXFxuICBEb2xsaG91c2VNQ1AgTWFuYWdlbWVudCBDb25zb2xlIChleGlzdGluZyBpbnN0YW5jZSlcXG4gIGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fVxcbmApO1xuICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgIG9wZW5JbkJyb3dzZXIoYGh0dHA6Ly8ke0NPTlNPTEVfSE9TVH06JHtwb3J0fWApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogT3BlbiB0aGUgcG9ydGZvbGlvIGJyb3dzZXIgZnJvbSB3aXRoaW4gdGhlIE1DUCBzZXJ2ZXIgcHJvY2Vzcy5cbiAqXG4gKiBTdGFydHMgdGhlIHdlYiBzZXJ2ZXIgaWYgbm90IGFscmVhZHkgcnVubmluZywgdGhlbiBvcGVucyB0aGUgc3lzdGVtXG4gKiBicm93c2VyIHRvIHRoZSBwb3J0Zm9saW8gVUkuIFJldHVybnMgYSByZXN1bHQgb2JqZWN0IGluZGljYXRpbmdcbiAqIHdoZXRoZXIgdGhlIHNlcnZlciBzdGFydGVkIGFuZCB0aGUgYnJvd3NlciBvcGVuZWQgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIENhbGxlZCBieSB0aGUgYG9wZW5fcG9ydGZvbGlvX2Jyb3dzZXJgIE1DUC1BUUwgb3BlcmF0aW9uIChJc3N1ZSAjNzc0KS5cbiAqXG4gKiBAcGFyYW0gcG9ydGZvbGlvRGlyIC0gUGF0aCB0byB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeSAoZS5nLiwgfi8uZG9sbGhvdXNlL3BvcnRmb2xpbylcbiAqIEBwYXJhbSBwb3J0IC0gUG9ydCB0byBiaW5kIHRvIChkZWZhdWx0cyB0byBgRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlRgKVxuICogQHJldHVybnMgUmVzdWx0IHdpdGggVVJMLCBzZXJ2ZXIgc3RhdHVzLCBhbmQgYnJvd3NlciBvcGVuIHN0YXR1c1xuICovXG4vKipcbiAqIE9wdGlvbnMgZm9yIG9wZW5pbmcgdGhlIHBvcnRmb2xpbyBicm93c2VyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5Ccm93c2VyT3B0aW9ucyB7XG4gIHBvcnRmb2xpb0Rpcjogc3RyaW5nO1xuICBwb3J0PzogbnVtYmVyO1xuICBtY3BBcWxIYW5kbGVyPzogTUNQQVFMSGFuZGxlcjtcbiAgdGFiPzogc3RyaW5nO1xuICB1cmxQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBtZW1vcnlTaW5rPzogTWVtb3J5TG9nU2luaztcbiAgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaztcbn1cblxuLyoqXG4gKiBTZWxmLXByb3Zpc2lvbiBzaW5rcywgdG9rZW4gc3RvcmUsIGFuZCBpbmdlc3Qgcm91dGVzLCB0aGVuIHN0YXJ0IHRoZSB3ZWJcbiAqIHNlcnZlci4gRXh0cmFjdGVkIGZyb20gb3BlblBvcnRmb2xpb0Jyb3dzZXIgdG8ga2VlcCBjb2duaXRpdmUgY29tcGxleGl0eVxuICogbWFuYWdlYWJsZSAoU29uYXJDbG91ZCBTMzc3NikuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0RmFsbGJhY2tTZXJ2ZXIob3B0aW9uczogT3BlbkJyb3dzZXJPcHRpb25zLCBwb3J0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IG1lbW9yeVNpbmsgPSBvcHRpb25zLm1lbW9yeVNpbms7XG4gIGxldCBtZXRyaWNzU2luayA9IG9wdGlvbnMubWV0cmljc1Npbms7XG5cbiAgaWYgKCFtZW1vcnlTaW5rKSB7XG4gICAgY29uc3QgeyBNZW1vcnlMb2dTaW5rOiBMb2dTaW5rIH0gPSBhd2FpdCBpbXBvcnQoJy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcycpO1xuICAgIG1lbW9yeVNpbmsgPSBuZXcgTG9nU2luayh7IGFwcENhcGFjaXR5OiAxMDAwMCwgc2VjdXJpdHlDYXBhY2l0eTogNTAwMCwgcGVyZkNhcGFjaXR5OiAyMDAwLCB0ZWxlbWV0cnlDYXBhY2l0eTogMTAwMCB9KTtcbiAgfVxuICBpZiAoIW1ldHJpY3NTaW5rKSB7XG4gICAgY29uc3QgeyBNZW1vcnlNZXRyaWNzU2luazogTWV0cmljc1NpbmsgfSA9IGF3YWl0IGltcG9ydCgnLi4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcycpO1xuICAgIG1ldHJpY3NTaW5rID0gbmV3IE1ldHJpY3NTaW5rKDI0MCk7XG4gIH1cblxuICAvLyBSZXVzZSBjYWNoZWQgdG9rZW4gc3RvcmUg4oCUIHR3byBpbnN0YW5jZXMgb24gdGhlIHNhbWUgZmlsZSBjYW4gcmFjZSBvbiB3cml0ZXMuXG4gIGlmICghY2FjaGVkVG9rZW5TdG9yZSkge1xuICAgIGNvbnN0IHsgQ29uc29sZVRva2VuU3RvcmU6IFRva2VuU3RvcmUgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlL2NvbnNvbGVUb2tlbi5qcycpO1xuICAgIGNvbnN0IHsgcGlja1JhbmRvbVRva2VuTmFtZSB9ID0gYXdhaXQgaW1wb3J0KCcuL2NvbnNvbGUvU2Vzc2lvbk5hbWVzLmpzJyk7XG4gICAgY2FjaGVkVG9rZW5TdG9yZSA9IG5ldyBUb2tlblN0b3JlKGVudi5ET0xMSE9VU0VfQ09OU09MRV9UT0tFTl9GSUxFKTtcbiAgICB0cnkgeyBhd2FpdCBjYWNoZWRUb2tlblN0b3JlLmVuc3VyZUluaXRpYWxpemVkKHBpY2tSYW5kb21Ub2tlbk5hbWUoKSk7IH1cbiAgICBjYXRjaCAoZXJyKSB7IGxvZ2dlci53YXJuKCdbV2ViVUldIEZhaWxlZCB0byBpbml0IHRva2VuIHN0b3JlIGZvciBicm93c2VyIG9wZW4nLCBlcnIpOyB9XG4gIH1cblxuICAvLyBsb2dCcm9hZGNhc3QgaXMgZGVmZXJyZWQg4oCUIHdpcmVkIGFmdGVyIHN0YXJ0V2ViU2VydmVyIHJldHVybnMgdGhlIHJlYWwgYnJvYWRjYXN0IGZuLlxuICBsZXQgbGl2ZUJyb2FkY2FzdDogKChlbnRyeTogaW1wb3J0KCcuLi9sb2dnaW5nL3R5cGVzLmpzJykuVW5pZmllZExvZ0VudHJ5KSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgeyBjcmVhdGVJbmdlc3RSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydCgnLi9jb25zb2xlL0luZ2VzdFJvdXRlcy5qcycpO1xuICBjb25zdCBpbmdlc3RSZXN1bHQgPSBjcmVhdGVJbmdlc3RSb3V0ZXMoe1xuICAgIGxvZ0Jyb2FkY2FzdDogKGVudHJ5KSA9PiBsaXZlQnJvYWRjYXN0Py4oZW50cnkpLFxuICAgIHN0b3JlTWV0cmljc1NuYXBzaG90OiAoc25hcHNob3QpID0+IG1ldHJpY3NTaW5rPy5vblNuYXBzaG90KHNuYXBzaG90KSxcbiAgfSk7XG4gIGluZ2VzdFJlc3VsdC5yZWdpc3RlckNvbnNvbGVTZXNzaW9uKCk7XG5cbiAgY29uc3Qgd2ViUmVzdWx0ID0gYXdhaXQgc3RhcnRXZWJTZXJ2ZXIoe1xuICAgIHBvcnRmb2xpb0Rpcjogb3B0aW9ucy5wb3J0Zm9saW9EaXIsXG4gICAgcG9ydCxcbiAgICBvcGVuQnJvd3NlcjogZmFsc2UsXG4gICAgbWNwQXFsSGFuZGxlcjogb3B0aW9ucy5tY3BBcWxIYW5kbGVyLFxuICAgIG1lbW9yeVNpbmssXG4gICAgbWV0cmljc1NpbmssXG4gICAgdG9rZW5TdG9yZTogY2FjaGVkVG9rZW5TdG9yZSxcbiAgICBhZGRpdGlvbmFsUm91dGVyczogW2luZ2VzdFJlc3VsdC5yb3V0ZXJdLFxuICB9KTtcblxuICBsaXZlQnJvYWRjYXN0ID0gd2ViUmVzdWx0LmxvZ0Jyb2FkY2FzdDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5Qb3J0Zm9saW9Ccm93c2VyKG9wdGlvbnM6IE9wZW5Ccm93c2VyT3B0aW9ucyk6IFByb21pc2U8QnJvd3Nlck9wZW5SZXN1bHQ+IHtcbiAgY29uc3QgdGFyZ2V0UG9ydCA9IG9wdGlvbnMucG9ydCB8fCBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IGJhc2VVcmwgPSBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3RhcmdldFBvcnR9YDtcblxuICAvLyBCdWlsZCBVUkwgd2l0aCBvcHRpb25hbCB0YWIgaGFzaCBhbmQgcXVlcnkgcGFyYW1ldGVyc1xuICBsZXQgdXJsID0gYmFzZVVybDtcbiAgaWYgKG9wdGlvbnMudGFiKSB7XG4gICAgY29uc3QgcXMgPSBvcHRpb25zLnVybFBhcmFtcyA/IG5ldyBVUkxTZWFyY2hQYXJhbXMob3B0aW9ucy51cmxQYXJhbXMpLnRvU3RyaW5nKCkgOiAnJztcbiAgICB1cmwgPSBgJHtiYXNlVXJsfS8jJHtvcHRpb25zLnRhYn0ke3FzID8gJz8nICsgcXMgOiAnJ31gO1xuICB9IGVsc2UgaWYgKG9wdGlvbnMudXJsUGFyYW1zICYmIE9iamVjdC5rZXlzKG9wdGlvbnMudXJsUGFyYW1zKS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKG9wdGlvbnMudXJsUGFyYW1zKS50b1N0cmluZygpO1xuICAgIHVybCA9IGAke2Jhc2VVcmx9LyNwb3J0Zm9saW8/JHtxc31gO1xuICB9XG5cbiAgY29uc3QgYWxyZWFkeVJ1bm5pbmcgPSBzZXJ2ZXJSdW5uaW5nO1xuXG4gIGlmICghc2VydmVyUnVubmluZykge1xuICAgIGF3YWl0IHN0YXJ0RmFsbGJhY2tTZXJ2ZXIob3B0aW9ucywgdGFyZ2V0UG9ydCk7XG4gIH1cblxuICBjb25zdCBicm93c2VyUmVzdWx0ID0gYXdhaXQgb3BlbkluQnJvd3Nlcih1cmwpO1xuXG4gIHJldHVybiB7XG4gICAgdXJsLFxuICAgIGFscmVhZHlSdW5uaW5nLFxuICAgIGJyb3dzZXJPcGVuZWQ6IGJyb3dzZXJSZXN1bHQuc3VjY2VzcyxcbiAgICAuLi4oYnJvd3NlclJlc3VsdC5lcnJvciA/IHsgd2FybmluZzogYEJyb3dzZXIgY291bGQgbm90IGJlIG9wZW5lZCBhdXRvbWF0aWNhbGx5OiAke2Jyb3dzZXJSZXN1bHQuZXJyb3J9LiBPcGVuICR7dXJsfSBtYW51YWxseS5gIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "2.0.24",
3
+ "version": "2.0.26",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -32,6 +32,7 @@
32
32
  "test:compiled": "npm run build:test && cross-env NODE_OPTIONS='--experimental-vm-modules' jest --config tests/jest.config.compiled.cjs",
33
33
  "test:compiled:ci": "npm run build:test && cross-env NODE_OPTIONS='--experimental-vm-modules' jest --config tests/jest.config.compiled.cjs --ci --watchAll=false",
34
34
  "test:integration": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.integration.config.cjs",
35
+ "test:integration:hooks:docker": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.integration.config.cjs tests/integration/hooks/permission-hook-docker.test.ts",
35
36
  "test:integration:watch": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.integration.config.cjs --watch",
36
37
  "test:integration:coverage": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.integration.config.cjs --coverage",
37
38
  "test:integration:crud": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs tests/integration/crud/ --no-coverage",
@@ -173,7 +174,7 @@
173
174
  "@dollhousemcp/safety": "^1.0.0",
174
175
  "@modelcontextprotocol/sdk": "^1.25.1",
175
176
  "chalk": "^5.6.2",
176
- "dompurify": "^3.3.1",
177
+ "dompurify": "^3.4.0",
177
178
  "dotenv": "^17.2.3",
178
179
  "express": "^5.2.1",
179
180
  "extract-zip": "^2.0.1",
@@ -234,7 +235,7 @@
234
235
  "@istanbuljs/load-nyc-config": {
235
236
  "js-yaml": "3.14.2"
236
237
  },
237
- "hono": "4.12.12",
238
+ "hono": "4.12.14",
238
239
  "@hono/node-server": "1.19.13"
239
240
  }
240
241
  }
@@ -16,10 +16,14 @@
16
16
  # Set DOLLHOUSE_HOOK_DEBUG=1 for debug logging to stderr.
17
17
  # Set DOLLHOUSE_HOOK_PLATFORM to override the platform sent to the server.
18
18
 
19
- PORT_FILE="$HOME/.dollhouse/run/permission-server.port"
19
+ RUN_DIR="$HOME/.dollhouse/run"
20
+ PORT_FILE="$RUN_DIR/permission-server.port"
21
+ AUTHORITY_FILE="$RUN_DIR/permission-authority.json"
22
+ AUTHORITY_CACHE_TTL_SECONDS=2
20
23
  MAX_RETRIES=2
21
24
  INITIAL_TIMEOUT=5
22
25
  HOOK_PLATFORM="${DOLLHOUSE_HOOK_PLATFORM:-claude_code}"
26
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
23
27
 
24
28
  # Debug logging helper — writes to stderr so it doesn't pollute stdout
25
29
  debug() {
@@ -29,6 +33,66 @@ debug() {
29
33
  return 0
30
34
  }
31
35
 
36
+ authority_host_for_platform() {
37
+ case "$HOOK_PLATFORM" in
38
+ claude_code) echo "claude-code" ;;
39
+ codex) echo "codex" ;;
40
+ cursor) echo "cursor" ;;
41
+ vscode) echo "vscode" ;;
42
+ windsurf) echo "windsurf" ;;
43
+ gemini) echo "gemini-cli" ;;
44
+ *) echo "" ;;
45
+ esac
46
+
47
+ return 0
48
+ }
49
+
50
+ resolve_authority_mode() {
51
+ local authority_host="$1"
52
+ local cache_file="$RUN_DIR/permission-authority-${HOOK_PLATFORM}.cache"
53
+ local resolved
54
+
55
+ if [[ -z "$authority_host" || ! -f "$AUTHORITY_FILE" ]]; then
56
+ echo "shared"
57
+ return 0
58
+ fi
59
+
60
+ if [[ -f "$cache_file" ]]; then
61
+ local cache_age
62
+ cache_age=$(cache_file_age_seconds "$cache_file")
63
+ if [[ -n "$cache_age" && "$cache_age" -lt "$AUTHORITY_CACHE_TTL_SECONDS" ]]; then
64
+ resolved=$(tr -d '\r\n' < "$cache_file" 2>/dev/null)
65
+ if [[ -n "$resolved" ]]; then
66
+ debug "Authority cache hit for ${authority_host}: $resolved"
67
+ echo "$resolved"
68
+ return 0
69
+ fi
70
+ fi
71
+ fi
72
+
73
+ resolved=$(jq -r --arg host "$authority_host" '.hosts[$host].mode // .defaultMode // "shared"' "$AUTHORITY_FILE" 2>/dev/null)
74
+ if [[ -z "$resolved" || "$resolved" == "null" ]]; then
75
+ resolved="shared"
76
+ fi
77
+
78
+ printf '%s' "$resolved" > "$cache_file" 2>/dev/null || true
79
+ echo "$resolved"
80
+ return 0
81
+ }
82
+
83
+ cache_file_age_seconds() {
84
+ local file_path="$1"
85
+ local modified_epoch
86
+
87
+ modified_epoch=$(stat -f %m "$file_path" 2>/dev/null || stat -c %Y "$file_path" 2>/dev/null)
88
+ if [[ -z "$modified_epoch" ]]; then
89
+ return 1
90
+ fi
91
+
92
+ echo $(( $(date +%s) - modified_epoch ))
93
+ return 0
94
+ }
95
+
32
96
  normalize_response() {
33
97
  local response="$1"
34
98
 
@@ -58,18 +122,11 @@ normalize_response() {
58
122
  return 0
59
123
  }
60
124
 
61
- # Discover the port from the port file
62
- if [[ -f "$PORT_FILE" ]]; then
63
- PORT=$(cat "$PORT_FILE" 2>/dev/null)
64
- debug "Port file found: $PORT"
65
- else
66
- debug "No port file at $PORT_FILE — fail open"
67
- exit 0
68
- fi
125
+ source "$SCRIPT_DIR/permission-port-discovery.sh"
69
126
 
70
- # Validate port is a number
71
- if ! [[ "$PORT" =~ ^[0-9]+$ ]]; then
72
- debug "Invalid port value: $PORT — fail open"
127
+ # Discover the port from the shared file or the newest live PID-keyed file
128
+ if ! PORT=$(resolve_permission_port); then
129
+ debug "No usable permission server port file found — fail open"
73
130
  exit 0
74
131
  fi
75
132
 
@@ -92,6 +149,15 @@ fi
92
149
  debug "Evaluating: $TOOL_NAME"
93
150
  debug "Platform: $HOOK_PLATFORM"
94
151
 
152
+ AUTHORITY_HOST=$(authority_host_for_platform)
153
+ AUTHORITY_MODE=$(resolve_authority_mode "$AUTHORITY_HOST")
154
+ debug "Authority mode for ${AUTHORITY_HOST:-unknown}: $AUTHORITY_MODE"
155
+
156
+ if [[ "$AUTHORITY_MODE" == "off" ]]; then
157
+ debug "Authority mode is off — hook no-op"
158
+ exit 0
159
+ fi
160
+
95
161
  if [[ -n "${DOLLHOUSE_SESSION_ID:-}" ]]; then
96
162
  debug "Using DOLLHOUSE_SESSION_ID=${DOLLHOUSE_SESSION_ID}"
97
163
  fi
@@ -5,10 +5,12 @@
5
5
  # tool_input field names differ from Claude Code. This adapter normalizes the
6
6
  # most relevant built-in tool names into Dollhouse's existing permission model.
7
7
 
8
- PORT_FILE="$HOME/.dollhouse/run/permission-server.port"
8
+ RUN_DIR="$HOME/.dollhouse/run"
9
+ PORT_FILE="$RUN_DIR/permission-server.port"
9
10
  MAX_RETRIES=2
10
11
  INITIAL_TIMEOUT=5
11
12
  HOOK_PLATFORM="vscode"
13
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
14
 
13
15
  debug() {
14
16
  if [[ "${DOLLHOUSE_HOOK_DEBUG:-0}" == "1" ]]; then
@@ -17,15 +19,10 @@ debug() {
17
19
  return 0
18
20
  }
19
21
 
20
- if [[ -f "$PORT_FILE" ]]; then
21
- PORT=$(cat "$PORT_FILE" 2>/dev/null)
22
- else
23
- debug "No port file at $PORT_FILE — fail open"
24
- exit 0
25
- fi
22
+ source "$SCRIPT_DIR/permission-port-discovery.sh"
26
23
 
27
- if ! [[ "$PORT" =~ ^[0-9]+$ ]]; then
28
- debug "Invalid port value: $PORT — fail open"
24
+ if ! PORT=$(resolve_permission_port); then
25
+ debug "No usable permission server port file found — fail open"
29
26
  exit 0
30
27
  fi
31
28
 
@@ -5,10 +5,12 @@
5
5
  # This wrapper translates Windsurf hook events into Dollhouse permission
6
6
  # evaluations and then maps the response back to Windsurf exit codes.
7
7
 
8
- PORT_FILE="$HOME/.dollhouse/run/permission-server.port"
8
+ RUN_DIR="$HOME/.dollhouse/run"
9
+ PORT_FILE="$RUN_DIR/permission-server.port"
9
10
  MAX_RETRIES=2
10
11
  INITIAL_TIMEOUT=5
11
12
  HOOK_PLATFORM="windsurf"
13
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12
14
 
13
15
  debug() {
14
16
  if [[ "${DOLLHOUSE_HOOK_DEBUG:-0}" == "1" ]]; then
@@ -17,15 +19,10 @@ debug() {
17
19
  return 0
18
20
  }
19
21
 
20
- if [[ -f "$PORT_FILE" ]]; then
21
- PORT=$(cat "$PORT_FILE" 2>/dev/null)
22
- else
23
- debug "No port file at $PORT_FILE — fail open"
24
- exit 0
25
- fi
22
+ source "$SCRIPT_DIR/permission-port-discovery.sh"
26
23
 
27
- if ! [[ "$PORT" =~ ^[0-9]+$ ]]; then
28
- debug "Invalid port value: $PORT — fail open"
24
+ if ! PORT=$(resolve_permission_port); then
25
+ debug "No usable permission server port file found — fail open"
29
26
  exit 0
30
27
  fi
31
28
 
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.DollhouseMCP/mcp-server",
4
4
  "title": "DollhouseMCP",
5
5
  "description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
6
- "version": "2.0.24",
6
+ "version": "2.0.26",
7
7
  "homepage": "https://dollhousemcp.com",
8
8
  "repository": {
9
9
  "type": "git",
@@ -29,7 +29,7 @@
29
29
  {
30
30
  "registryType": "npm",
31
31
  "identifier": "@dollhousemcp/mcp-server",
32
- "version": "2.0.24",
32
+ "version": "2.0.26",
33
33
  "transport": {
34
34
  "type": "stdio"
35
35
  }