@dollhousemcp/mcp-server 1.9.13 → 1.9.15

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 (79) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.github.md +54 -0
  3. package/README.md.backup +1241 -49
  4. package/dist/cache/CollectionCache.js +2 -2
  5. package/dist/collection/CollectionIndexManager.js +3 -3
  6. package/dist/config/ConfigWizard.js +3 -3
  7. package/dist/config/indicator-config.js +2 -2
  8. package/dist/config/portfolio-constants.js +12 -12
  9. package/dist/elements/BaseElement.js +7 -7
  10. package/dist/elements/FeedbackProcessor.d.ts +7 -0
  11. package/dist/elements/FeedbackProcessor.d.ts.map +1 -1
  12. package/dist/elements/FeedbackProcessor.js +67 -14
  13. package/dist/elements/agents/AgentManager.js +6 -6
  14. package/dist/elements/memories/Memory.js +4 -4
  15. package/dist/elements/memories/MemoryManager.js +3 -3
  16. package/dist/elements/memories/utils.js +3 -3
  17. package/dist/elements/skills/Skill.js +2 -2
  18. package/dist/elements/skills/SkillManager.js +2 -2
  19. package/dist/elements/templates/Template.d.ts.map +1 -1
  20. package/dist/elements/templates/Template.js +38 -14
  21. package/dist/elements/templates/TemplateManager.js +2 -2
  22. package/dist/generated/version.d.ts +2 -2
  23. package/dist/generated/version.js +3 -3
  24. package/dist/handlers/ConfigHandler.js +3 -3
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +20 -16
  27. package/dist/persona/PersonaElementManager.js +3 -3
  28. package/dist/persona/PersonaManager.js +2 -2
  29. package/dist/persona/export-import/PersonaImporter.js +3 -3
  30. package/dist/portfolio/DefaultElementProvider.d.ts +12 -0
  31. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  32. package/dist/portfolio/DefaultElementProvider.js +23 -6
  33. package/dist/portfolio/GitHubPortfolioIndexer.js +2 -2
  34. package/dist/portfolio/MigrationManager.js +2 -2
  35. package/dist/portfolio/NLPScoringManager.js +2 -2
  36. package/dist/portfolio/PortfolioManager.d.ts +5 -0
  37. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  38. package/dist/portfolio/PortfolioManager.js +8 -1
  39. package/dist/portfolio/PortfolioRepoManager.js +2 -2
  40. package/dist/portfolio/PortfolioSyncManager.js +5 -5
  41. package/dist/portfolio/RelationshipManager.js +4 -4
  42. package/dist/portfolio/UnifiedIndexManager.js +4 -4
  43. package/dist/portfolio/types/RelationshipTypes.js +2 -2
  44. package/dist/security/InputValidator.d.ts +12 -0
  45. package/dist/security/InputValidator.d.ts.map +1 -1
  46. package/dist/security/InputValidator.js +38 -18
  47. package/dist/security/audit/config/suppressions.js +10 -10
  48. package/dist/security/commandValidator.js +2 -2
  49. package/dist/security/dosProtection.d.ts +123 -0
  50. package/dist/security/dosProtection.d.ts.map +1 -0
  51. package/dist/security/dosProtection.js +392 -0
  52. package/dist/security/pathValidator.js +2 -2
  53. package/dist/security/secureYamlParser.d.ts.map +1 -1
  54. package/dist/security/secureYamlParser.js +4 -3
  55. package/dist/security/tokenManager.js +10 -10
  56. package/dist/security/validators/unicodeValidator.js +2 -2
  57. package/dist/security/yamlValidator.js +3 -3
  58. package/dist/sync/PortfolioDownloader.js +2 -2
  59. package/dist/sync/PortfolioSyncComparer.js +2 -2
  60. package/dist/tools/portfolio/PortfolioElementAdapter.js +3 -3
  61. package/dist/tools/portfolio/submitToPortfolioTool.js +14 -14
  62. package/dist/utils/EarlyTerminationSearch.d.ts +1 -1
  63. package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -1
  64. package/dist/utils/EarlyTerminationSearch.js +3 -3
  65. package/dist/utils/ElementFormatter.d.ts +1 -0
  66. package/dist/utils/ElementFormatter.d.ts.map +1 -1
  67. package/dist/utils/ElementFormatter.js +21 -13
  68. package/dist/utils/GitHubRateLimiter.d.ts +6 -0
  69. package/dist/utils/GitHubRateLimiter.d.ts.map +1 -1
  70. package/dist/utils/GitHubRateLimiter.js +20 -5
  71. package/dist/utils/RateLimiter.js +2 -2
  72. package/dist/utils/SecureDownloader.js +2 -2
  73. package/dist/utils/fileOperations.d.ts +6 -1
  74. package/dist/utils/fileOperations.d.ts.map +1 -1
  75. package/dist/utils/fileOperations.js +29 -5
  76. package/dist/utils/filesystem.js +6 -6
  77. package/dist/utils/searchUtils.js +2 -2
  78. package/dist/utils/version.js +3 -3
  79. package/package.json +1 -1
@@ -104,17 +104,32 @@ export class GitHubRateLimiter {
104
104
  });
105
105
  }
106
106
  }
107
+ statusCheckInterval;
107
108
  /**
108
109
  * Setup periodic check for rate limit status
110
+ * FIX: Store interval reference to allow cleanup in tests
109
111
  */
110
112
  setupPeriodicStatusCheck() {
113
+ // Clear any existing interval
114
+ if (this.statusCheckInterval) {
115
+ clearInterval(this.statusCheckInterval);
116
+ }
111
117
  // Check auth status every 5 minutes
112
- setInterval(() => {
118
+ this.statusCheckInterval = setInterval(() => {
113
119
  this.updateLimitsForAuthStatus().catch(error => {
114
120
  logger.warn('Periodic auth status check failed', { error });
115
121
  });
116
122
  }, 5 * 60 * 1000);
117
123
  }
124
+ /**
125
+ * Cleanup method for tests
126
+ */
127
+ cleanup() {
128
+ if (this.statusCheckInterval) {
129
+ clearInterval(this.statusCheckInterval);
130
+ this.statusCheckInterval = undefined;
131
+ }
132
+ }
118
133
  /**
119
134
  * Queue a GitHub API request with rate limiting
120
135
  * @param operation Description of the operation
@@ -286,9 +301,9 @@ export class GitHubRateLimiter {
286
301
  // Parse rate limit headers if available
287
302
  if (error?.response?.headers) {
288
303
  const headers = error.response.headers;
289
- const resetTimestamp = parseInt(headers['x-ratelimit-reset'] || '0');
290
- const remaining = parseInt(headers['x-ratelimit-remaining'] || '0');
291
- const limit = parseInt(headers['x-ratelimit-limit'] || '0');
304
+ const resetTimestamp = Number.parseInt(headers['x-ratelimit-reset'] || '0');
305
+ const remaining = Number.parseInt(headers['x-ratelimit-remaining'] || '0');
306
+ const limit = Number.parseInt(headers['x-ratelimit-limit'] || '0');
292
307
  if (resetTimestamp > 0) {
293
308
  resetTime = new Date(resetTimestamp * 1000);
294
309
  }
@@ -373,4 +388,4 @@ export class GitHubRateLimiter {
373
388
  }
374
389
  // Singleton instance for global use
375
390
  export const githubRateLimiter = new GitHubRateLimiter();
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViUmF0ZUxpbWl0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvR2l0SHViUmF0ZUxpbWl0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBc0MsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQXdCMUMsTUFBTSxPQUFPLGlCQUFpQjtJQUNwQixXQUFXLENBQWU7SUFDMUIsWUFBWSxHQUF1QixFQUFFLENBQUM7SUFDdEMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixpQkFBaUIsQ0FBdUI7SUFDeEMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLHFCQUFxQixDQUFpQjtJQUU5QztRQUNFLG9FQUFvRTtRQUNwRSxnRUFBZ0U7UUFDaEUsNEVBQTRFO1FBRTVFLHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDO1lBQ2pDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLHFCQUFxQixHQUFHLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDO1lBQ2hILFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxTQUFTO1lBQzFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxZQUFZO1NBQ2hELENBQUMsQ0FBQztR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Q0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQzNDLENBQUM7Q0FDRjtBQUVELG9DQUFvQztBQUNwQyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdpdEh1YlJhdGVMaW1pdGVyIC0gU3BlY2lhbGl6ZWQgcmF0ZSBsaW1pdGVyIGZvciBHaXRIdWIgQVBJIGNhbGxzXG4gKiBcbiAqIEZlYXR1cmVzOlxuICogLSBSZXNwZWN0cyBHaXRIdWIncyBhdXRoZW50aWNhdGVkICg1MDAwL2hvdXIpIGFuZCB1bmF1dGhlbnRpY2F0ZWQgKDYwL2hvdXIpIGxpbWl0c1xuICogLSBDbGllbnQtc2lkZSBxdWV1aW5nIHdoZW4gYXBwcm9hY2hpbmcgbGltaXRzXG4gKiAtIFJlcXVlc3QgcHJpb3JpdGl6YXRpb24gZm9yIGNyaXRpY2FsIG9wZXJhdGlvbnNcbiAqIC0gQ29tcHJlaGVuc2l2ZSBsb2dnaW5nIGZvciBxdW90YSBtYW5hZ2VtZW50XG4gKiAtIEVhcmx5IHRlcm1pbmF0aW9uIHdoZW4gZXhhY3QgbWF0Y2hlcyBhcmUgZm91bmRcbiAqL1xuXG5pbXBvcnQgeyBSYXRlTGltaXRlciwgUmF0ZUxpbWl0ZXJDb25maWcsIFJhdGVMaW1pdFN0YXR1cyB9IGZyb20gJy4vUmF0ZUxpbWl0ZXIuanMnO1xuaW1wb3J0IHsgR0lUSFVCX0FQSV9SQVRFX0xJTUlUUyB9IGZyb20gJy4uL2NvbmZpZy9wb3J0Zm9saW8tY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IFRva2VuTWFuYWdlciB9IGZyb20gJy4uL3NlY3VyaXR5L3Rva2VuTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ25vZGU6Y3J5cHRvJztcblxuZXhwb3J0IGludGVyZmFjZSBHaXRIdWJSYXRlTGltaXRJbmZvIHtcbiAgbGltaXQ6IG51bWJlcjtcbiAgcmVtYWluaW5nOiBudW1iZXI7XG4gIHJlc2V0OiBEYXRlO1xuICB1c2VkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SHViQXBpUmVxdWVzdCB7XG4gIGlkOiBzdHJpbmc7XG4gIG9wZXJhdGlvbjogc3RyaW5nO1xuICBwcmlvcml0eTogJ2hpZ2gnIHwgJ25vcm1hbCcgfCAnbG93JztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIHJlc29sdmU6ICh2YWx1ZTogYW55KSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogYW55KSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YlJhdGVTdGF0dXMgZXh0ZW5kcyBSYXRlTGltaXRTdGF0dXMge1xuICBxdWV1ZUxlbmd0aDogbnVtYmVyO1xuICBjdXJyZW50TGltaXQ6IG51bWJlcjtcbiAgcmF0ZUxpbWl0SW5mbz86IEdpdEh1YlJhdGVMaW1pdEluZm87XG59XG5cbmV4cG9ydCBjbGFzcyBHaXRIdWJSYXRlTGltaXRlciB7XG4gIHByaXZhdGUgcmF0ZUxpbWl0ZXIhOiBSYXRlTGltaXRlcjtcbiAgcHJpdmF0ZSByZXF1ZXN0UXVldWU6IEdpdEh1YkFwaVJlcXVlc3RbXSA9IFtdO1xuICBwcml2YXRlIHByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBsYXN0UmF0ZUxpbWl0SW5mbz86IEdpdEh1YlJhdGVMaW1pdEluZm87XG4gIHByaXZhdGUgaXNBdXRoZW50aWNhdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbml0aWFsaXphdGlvblByb21pc2U/OiBQcm9taXNlPHZvaWQ+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEZJWCAoU29uYXJDbG91ZCBTNzA1OSk6IFJlbW92ZWQgYXN5bmMgb3BlcmF0aW9ucyBmcm9tIGNvbnN0cnVjdG9yXG4gICAgLy8gUHJldmlvdXNseTogQ2FsbGVkIGFzeW5jIHVwZGF0ZUxpbWl0c0ZvckF1dGhTdGF0dXMoKSBkaXJlY3RseVxuICAgIC8vIE5vdzogVXNpbmcgbGF6eSBpbml0aWFsaXphdGlvbiBwYXR0ZXJuIC0gYXN5bmMgd29yayBkZWZlcnJlZCB0byBmaXJzdCB1c2VcblxuICAgIC8vIEluaXRpYWxpemUgd2l0aCBjb25zZXJ2YXRpdmUgZGVmYXVsdHMgc3luY2hyb25vdXNseVxuICAgIHRoaXMucmF0ZUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXIoe1xuICAgICAgbWF4UmVxdWVzdHM6IE1hdGguZmxvb3IoR0lUSFVCX0FQSV9SQVRFX0xJTUlUUy5VTkFVVEhFTlRJQ0FURURfTElNSVQgKiBHSVRIVUJfQVBJX1JBVEVfTElNSVRTLkJVRkZFUl9QRVJDRU5UQUdFKSxcbiAgICAgIHdpbmRvd01zOiBHSVRIVUJfQVBJX1JBVEVfTElNSVRTLldJTkRPV19NUyxcbiAgICAgIG1pbkRlbGF5TXM6IEdJVEhVQl9BUElfUkFURV9MSU1JVFMuTUlOX0RFTEFZX01TXG4gICAgfSk7XG5cbiAgICAvLyBTZXR1cCBwZXJpb2RpYyBjaGVjayBpbW1lZGlhdGVseSAoc3luY2hyb25vdXMpXG4gICAgdGhpcy5zZXR1cFBlcmlvZGljU3RhdHVzQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgcmF0ZSBsaW1pdGVyIGlzIGluaXRpYWxpemVkIHdpdGggcHJvcGVyIGF1dGggc3RhdHVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUluaXRpYWxpemVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEZJWDogQ2hlY2sgcHJvbWlzZSBmaXJzdCB0byBhZGRyZXNzIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvblxuICAgIGlmICh0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSByZXR1cm47XG5cbiAgICAvLyBQcmV2ZW50IG11bHRpcGxlIGNvbmN1cnJlbnQgaW5pdGlhbGl6YXRpb25zXG4gICAgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2UgPSB0aGlzLnVwZGF0ZUxpbWl0c0ZvckF1dGhTdGF0dXMoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAvLyBGSVg6IE9ubHkgc2V0IGluaXRpYWxpemVkIHRvIHRydWUgb24gc3VjY2Vzc1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIEZJWDogQmV0dGVyIGVycm9yIHJlY292ZXJ5IC0gZG9uJ3QgbWFyayBhcyBpbml0aWFsaXplZCBvbiBmYWlsdXJlXG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3aXRoIGF1dGggc3RhdHVzLCB1c2luZyBkZWZhdWx0cycsIHsgZXJyb3IgfSk7XG4gICAgICAgIC8vIERvbid0IHNldCBpbml0aWFsaXplZCB0byB0cnVlLCBhbGxvdyByZXRyeSBvbiBuZXh0IGNhbGxcbiAgICAgICAgLy8gUmUtdGhyb3cgdG8gbWFpbnRhaW4gcHJvbWlzZSBjaGFpbiBiZWhhdmlvclxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH0pXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHJhdGUgbGltaXRzIGJhc2VkIG9uIGN1cnJlbnQgYXV0aGVudGljYXRpb24gc3RhdHVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHVwZGF0ZUxpbWl0c0ZvckF1dGhTdGF0dXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgIGNvbnN0IG5ld0lzQXV0aGVudGljYXRlZCA9ICEhdG9rZW47XG4gICAgICBcbiAgICAgIC8vIE9ubHkgcmVjcmVhdGUgcmF0ZSBsaW1pdGVyIGlmIGF1dGggc3RhdHVzIGNoYW5nZWRcbiAgICAgIGlmIChuZXdJc0F1dGhlbnRpY2F0ZWQgIT09IHRoaXMuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkID0gbmV3SXNBdXRoZW50aWNhdGVkO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgbGltaXQgPSB0aGlzLmlzQXV0aGVudGljYXRlZCBcbiAgICAgICAgICA/IEdJVEhVQl9BUElfUkFURV9MSU1JVFMuQVVUSEVOVElDQVRFRF9MSU1JVCBcbiAgICAgICAgICA6IEdJVEhVQl9BUElfUkFURV9MSU1JVFMuVU5BVVRIRU5USUNBVEVEX0xJTUlUO1xuICAgICAgICAgIFxuICAgICAgICAvLyBBcHBseSBidWZmZXIgdG8gc3RheSBiZWxvdyBhY3R1YWwgbGltaXRzXG4gICAgICAgIGNvbnN0IGJ1ZmZlcmVkTGltaXQgPSBNYXRoLmZsb29yKGxpbWl0ICogR0lUSFVCX0FQSV9SQVRFX0xJTUlUUy5CVUZGRVJfUEVSQ0VOVEFHRSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBjb25maWc6IFJhdGVMaW1pdGVyQ29uZmlnID0ge1xuICAgICAgICAgIG1heFJlcXVlc3RzOiBidWZmZXJlZExpbWl0LFxuICAgICAgICAgIHdpbmRvd01zOiBHSVRIVUJfQVBJX1JBVEVfTElNSVRTLldJTkRPV19NUyxcbiAgICAgICAgICBtaW5EZWxheU1zOiBHSVRIVUJfQVBJX1JBVEVfTElNSVRTLk1JTl9ERUxBWV9NU1xuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgdGhpcy5yYXRlTGltaXRlciA9IG5ldyBSYXRlTGltaXRlcihjb25maWcpO1xuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiByYXRlIGxpbWl0ZXIgdXBkYXRlZCcsIHtcbiAgICAgICAgICBhdXRoZW50aWNhdGVkOiB0aGlzLmlzQXV0aGVudGljYXRlZCxcbiAgICAgICAgICBsaW1pdDogYnVmZmVyZWRMaW1pdCxcbiAgICAgICAgICBvcmlnaW5hbExpbWl0OiBsaW1pdCxcbiAgICAgICAgICBidWZmZXJQZXJjZW50YWdlOiBHSVRIVUJfQVBJX1JBVEVfTElNSVRTLkJVRkZFUl9QRVJDRU5UQUdFXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGNoZWNrIGF1dGhlbnRpY2F0aW9uIHN0YXR1cyBmb3IgcmF0ZSBsaW1pdGluZycsIHsgZXJyb3IgfSk7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gdW5hdXRoZW50aWNhdGVkIGxpbWl0c1xuICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmF0ZUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXIoe1xuICAgICAgICBtYXhSZXF1ZXN0czogTWF0aC5mbG9vcihHSVRIVUJfQVBJX1JBVEVfTElNSVRTLlVOQVVUSEVOVElDQVRFRF9MSU1JVCAqIEdJVEhVQl9BUElfUkFURV9MSU1JVFMuQlVGRkVSX1BFUkNFTlRBR0UpLFxuICAgICAgICB3aW5kb3dNczogR0lUSFVCX0FQSV9SQVRFX0xJTUlUUy5XSU5ET1dfTVMsXG4gICAgICAgIG1pbkRlbGF5TXM6IEdJVEhVQl9BUElfUkFURV9MSU1JVFMuTUlOX0RFTEFZX01TXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgcGVyaW9kaWMgY2hlY2sgZm9yIHJhdGUgbGltaXQgc3RhdHVzXG4gICAqL1xuICBwcml2YXRlIHNldHVwUGVyaW9kaWNTdGF0dXNDaGVjaygpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBhdXRoIHN0YXR1cyBldmVyeSA1IG1pbnV0ZXNcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUxpbWl0c0ZvckF1dGhTdGF0dXMoKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdQZXJpb2RpYyBhdXRoIHN0YXR1cyBjaGVjayBmYWlsZWQnLCB7IGVycm9yIH0pO1xuICAgICAgfSk7XG4gICAgfSwgNSAqIDYwICogMTAwMCk7XG4gIH1cblxuICAvKipcbiAgICogUXVldWUgYSBHaXRIdWIgQVBJIHJlcXVlc3Qgd2l0aCByYXRlIGxpbWl0aW5nXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gRGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvblxuICAgKiBAcGFyYW0gYXBpQ2FsbCBGdW5jdGlvbiB0aGF0IG1ha2VzIHRoZSBhY3R1YWwgQVBJIGNhbGxcbiAgICogQHBhcmFtIHByaW9yaXR5IFJlcXVlc3QgcHJpb3JpdHkgKGhpZ2gsIG5vcm1hbCwgbG93KVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgQVBJIHJlc3BvbnNlXG4gICAqL1xuICBhc3luYyBxdWV1ZVJlcXVlc3Q8VD4oXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgYXBpQ2FsbDogKCkgPT4gUHJvbWlzZTxUPixcbiAgICBwcmlvcml0eTogJ2hpZ2gnIHwgJ25vcm1hbCcgfCAnbG93JyA9ICdub3JtYWwnXG4gICk6IFByb21pc2U8VD4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWCAoRE1DUC1TRUMtMDA0KTogTm9ybWFsaXplIFVuaWNvZGUgaW4gb3BlcmF0aW9uIG5hbWUgdG8gcHJldmVudCBpbmplY3Rpb24gYXR0YWNrc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcGVyYXRpb24gPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShvcGVyYXRpb24pO1xuICAgIGlmICghbm9ybWFsaXplZE9wZXJhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ0dpdEh1YlJhdGVMaW1pdGVyLnF1ZXVlUmVxdWVzdCcsXG4gICAgICAgIGRldGFpbHM6IGBJbnZhbGlkIFVuaWNvZGUgaW4gb3BlcmF0aW9uIG5hbWU6ICR7bm9ybWFsaXplZE9wZXJhdGlvbi5kZXRlY3RlZElzc3Vlcz8uWzBdIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcbiAgICAgIC8vIFVzZSBhIHNhZmUgZmFsbGJhY2sgZm9yIHRoZSBvcGVyYXRpb24gbmFtZVxuICAgICAgb3BlcmF0aW9uID0gJ2dpdGh1Yi1hcGktcmVxdWVzdCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wZXJhdGlvbiA9IG5vcm1hbGl6ZWRPcGVyYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgfVxuICAgIFxuICAgIC8vIEZJWDogVXNlIGNyeXB0by5yYW5kb21CeXRlcyBpbnN0ZWFkIG9mIE1hdGgucmFuZG9tKCkgZm9yIHNlY3VyZSBJRCBnZW5lcmF0aW9uXG4gICAgLy8gU29uYXJDbG91ZDogTWF0aC5yYW5kb20oKSBpcyBub3QgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlXG4gICAgY29uc3QgcmFuZG9tUGFydCA9IHJhbmRvbUJ5dGVzKDYpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCByZXF1ZXN0SWQgPSBgJHtvcGVyYXRpb259LSR7RGF0ZS5ub3coKX0tJHtyYW5kb21QYXJ0fWA7XG4gICAgXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IEdpdEh1YkFwaVJlcXVlc3QgPSB7XG4gICAgICAgIGlkOiByZXF1ZXN0SWQsXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgcHJpb3JpdHksXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgcmVzb2x2ZTogKCkgPT4ge1xuICAgICAgICAgIC8vIFdyYXAgaW4gYXN5bmMgSUlGRSB0byBoYW5kbGUgYXN5bmMgb3BlcmF0aW9ucyB3aXRob3V0IHJldHVybmluZyBhIFByb21pc2VcbiAgICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmcgR2l0SHViIEFQSSByZXF1ZXN0Jywge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgcXVldWVXYWl0VGltZTogRGF0ZS5ub3coKSAtIHJlcXVlc3QudGltZXN0YW1wXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwaUNhbGwoKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuXG4gICAgICAgICAgICAgIC8vIExvZyBzdWNjZXNzZnVsIEFQSSB1c2FnZSBmb3IgcXVvdGEgdHJhY2tpbmdcbiAgICAgICAgICAgICAgdGhpcy5sb2dBcGlVc2FnZShvcGVyYXRpb24sICdzdWNjZXNzJyk7XG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSByYXRlIGxpbWl0IGVycm9yIGZyb20gR2l0SHViXG4gICAgICAgICAgICAgIGlmICh0aGlzLmlzR2l0SHViUmF0ZUxpbWl0RXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVHaXRIdWJSYXRlTGltaXQoZXJyb3IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIEVuc3VyZSByZWplY3Rpb24gcmVhc29uIGlzIGFuIEVycm9yIG9iamVjdFxuICAgICAgICAgICAgICByZWplY3QoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2dBcGlVc2FnZShvcGVyYXRpb24sICdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIC8vIENhdGNoIGFueSBzeW5jaHJvbm91cyBlcnJvcnMgZnJvbSB0aGUgSUlGRSBpdHNlbGZcbiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgcmVqZWN0aW9uIHJlYXNvbiBpcyBhbiBFcnJvciBvYmplY3RcbiAgICAgICAgICAgIHJlamVjdChlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyKSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICByZWplY3RcbiAgICAgIH07XG5cbiAgICAgIC8vIEFkZCB0byBxdWV1ZSB3aXRoIHByaW9yaXR5IG9yZGVyaW5nXG4gICAgICB0aGlzLmFkZFRvUXVldWUocmVxdWVzdCk7XG4gICAgICB0aGlzLnByb2Nlc3NRdWV1ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCByZXF1ZXN0IHRvIHF1ZXVlIHdpdGggcHJpb3JpdHkgb3JkZXJpbmdcbiAgICovXG4gIHByaXZhdGUgYWRkVG9RdWV1ZShyZXF1ZXN0OiBHaXRIdWJBcGlSZXF1ZXN0KTogdm9pZCB7XG4gICAgLy8gSW5zZXJ0IGJhc2VkIG9uIHByaW9yaXR5OiBoaWdoID4gbm9ybWFsID4gbG93XG4gICAgLy8gV2l0aGluIHNhbWUgcHJpb3JpdHksIG1haW50YWluIEZJRk8gb3JkZXJcbiAgICBjb25zdCBwcmlvcml0eU9yZGVyID0geyBoaWdoOiAwLCBub3JtYWw6IDEsIGxvdzogMiB9O1xuICAgIFxuICAgIGxldCBpbnNlcnRJbmRleCA9IHRoaXMucmVxdWVzdFF1ZXVlLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmVxdWVzdFF1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocHJpb3JpdHlPcmRlcltyZXF1ZXN0LnByaW9yaXR5XSA8IHByaW9yaXR5T3JkZXJbdGhpcy5yZXF1ZXN0UXVldWVbaV0ucHJpb3JpdHldKSB7XG4gICAgICAgIGluc2VydEluZGV4ID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRoaXMucmVxdWVzdFF1ZXVlLnNwbGljZShpbnNlcnRJbmRleCwgMCwgcmVxdWVzdCk7XG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKCdHaXRIdWIgQVBJIHJlcXVlc3QgcXVldWVkJywge1xuICAgICAgb3BlcmF0aW9uOiByZXF1ZXN0Lm9wZXJhdGlvbixcbiAgICAgIHByaW9yaXR5OiByZXF1ZXN0LnByaW9yaXR5LFxuICAgICAgcXVldWVQb3NpdGlvbjogaW5zZXJ0SW5kZXgsXG4gICAgICB0b3RhbFF1ZXVlZDogdGhpcy5yZXF1ZXN0UXVldWUubGVuZ3RoXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0aGUgcmVxdWVzdCBxdWV1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzUXVldWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucHJvY2Vzc2luZyB8fCB0aGlzLnJlcXVlc3RRdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByb2Nlc3NpbmcgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBpbml0aWFsaXphdGlvbiBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgICAgLy8gSWYgaW5pdGlhbGl6YXRpb24gZmFpbHMsIHdlIGNvbnRpbnVlIHdpdGggZGVmYXVsdCByYXRlIGxpbWl0ZXJcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICAgIH0gY2F0Y2ggKGluaXRFcnJvcikge1xuICAgICAgICAvLyBJbml0aWFsaXphdGlvbiBmYWlsZWQgYnV0IHdlIGhhdmUgZmFsbGJhY2sgZGVmYXVsdHMsIGNvbnRpbnVlIHByb2Nlc3NpbmdcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDb250aW51aW5nIHdpdGggZGVmYXVsdCByYXRlIGxpbWl0cyBhZnRlciBpbml0IGZhaWx1cmUnLCB7IGVycm9yOiBpbml0RXJyb3IgfSk7XG4gICAgICB9XG5cbiAgICAgIHdoaWxlICh0aGlzLnJlcXVlc3RRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBhdXRoIHN0YXR1cyBwZXJpb2RpY2FsbHlcbiAgICAgICAgLy8gVXNlIGNyeXB0byBmb3IgY29uc2lzdGVuY3ksIHRob3VnaCB0aGlzIGlzIG5vdCBzZWN1cml0eS1zZW5zaXRpdmVcbiAgICAgICAgY29uc3Qgc2hvdWxkVXBkYXRlID0gcmFuZG9tQnl0ZXMoMSlbMF0gPCAyNjsgLy8gfjEwJSBjaGFuY2UgKDI2LzI1NilcbiAgICAgICAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlTGltaXRzRm9yQXV0aFN0YXR1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmF0ZUxpbWl0U3RhdHVzID0gdGhpcy5yYXRlTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIXJhdGVMaW1pdFN0YXR1cy5hbGxvd2VkKSB7XG4gICAgICAgICAgLy8gTG9nIHJhdGUgbGltaXQgd2FpdFxuICAgICAgICAgIGxvZ2dlci5pbmZvKCdHaXRIdWIgQVBJIHJhdGUgbGltaXQgcmVhY2hlZCwgd2FpdGluZycsIHtcbiAgICAgICAgICAgIHJldHJ5QWZ0ZXJNczogcmF0ZUxpbWl0U3RhdHVzLnJldHJ5QWZ0ZXJNcyxcbiAgICAgICAgICAgIHJlbWFpbmluZ1Rva2VuczogcmF0ZUxpbWl0U3RhdHVzLnJlbWFpbmluZ1Rva2VucyxcbiAgICAgICAgICAgIHF1ZXVlTGVuZ3RoOiB0aGlzLnJlcXVlc3RRdWV1ZS5sZW5ndGgsXG4gICAgICAgICAgICByZXNldFRpbWU6IHJhdGVMaW1pdFN0YXR1cy5yZXNldFRpbWVcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBzcGVjaWZpZWQgdGltZVxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCByYXRlTGltaXRTdGF0dXMucmV0cnlBZnRlck1zIHx8IDEwMDApKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2Nlc3MgdGhlIG5leHQgcmVxdWVzdFxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0UXVldWUuc2hpZnQoKSE7XG4gICAgICAgIHRoaXMucmF0ZUxpbWl0ZXIuY29uc3VtZVRva2VuKCk7XG5cbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgcmVxdWVzdFxuICAgICAgICByZXF1ZXN0LnJlc29sdmUobnVsbCk7IC8vIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBhY3R1YWwgQVBJIGNhbGxcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHJhdGUgbGltaXQgc3RhdHVzXG4gICAqL1xuICBnZXRTdGF0dXMoKTogR2l0SHViUmF0ZVN0YXR1cyB7XG4gICAgY29uc3QgYmFzZVN0YXR1cyA9IHRoaXMucmF0ZUxpbWl0ZXIuZ2V0U3RhdHVzKCk7XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJhc2VTdGF0dXMsXG4gICAgICBxdWV1ZUxlbmd0aDogdGhpcy5yZXF1ZXN0UXVldWUubGVuZ3RoLFxuICAgICAgY3VycmVudExpbWl0OiB0aGlzLmlzQXV0aGVudGljYXRlZCBcbiAgICAgICAgPyBHSVRIVUJfQVBJX1JBVEVfTElNSVRTLkFVVEhFTlRJQ0FURURfTElNSVQgXG4gICAgICAgIDogR0lUSFVCX0FQSV9SQVRFX0xJTUlUUy5VTkFVVEhFTlRJQ0FURURfTElNSVQsXG4gICAgICByYXRlTGltaXRJbmZvOiB0aGlzLmxhc3RSYXRlTGltaXRJbmZvXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlcnJvciBpcyBhIEdpdEh1YiByYXRlIGxpbWl0IGVycm9yXG4gICAqL1xuICBwcml2YXRlIGlzR2l0SHViUmF0ZUxpbWl0RXJyb3IoZXJyb3I6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlcnJvcj8uc3RhdHVzID09PSA0MjkgfHwgXG4gICAgICAgICAgIGVycm9yPy5yZXNwb25zZT8uc3RhdHVzID09PSA0MjkgfHxcbiAgICAgICAgICAgKHR5cGVvZiBlcnJvcj8ubWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgZXJyb3IubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBHaXRIdWIgcmF0ZSBsaW1pdCBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVHaXRIdWJSYXRlTGltaXQoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGxldCByZXNldFRpbWU6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlbWFpbmluZ1JlcXVlc3RzID0gMDtcbiAgICBcbiAgICAvLyBQYXJzZSByYXRlIGxpbWl0IGhlYWRlcnMgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGVycm9yPy5yZXNwb25zZT8uaGVhZGVycykge1xuICAgICAgY29uc3QgaGVhZGVycyA9IGVycm9yLnJlc3BvbnNlLmhlYWRlcnM7XG4gICAgICBjb25zdCByZXNldFRpbWVzdGFtcCA9IHBhcnNlSW50KGhlYWRlcnNbJ3gtcmF0ZWxpbWl0LXJlc2V0J10gfHwgJzAnKTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHBhcnNlSW50KGhlYWRlcnNbJ3gtcmF0ZWxpbWl0LXJlbWFpbmluZyddIHx8ICcwJyk7XG4gICAgICBjb25zdCBsaW1pdCA9IHBhcnNlSW50KGhlYWRlcnNbJ3gtcmF0ZWxpbWl0LWxpbWl0J10gfHwgJzAnKTtcbiAgICAgIFxuICAgICAgaWYgKHJlc2V0VGltZXN0YW1wID4gMCkge1xuICAgICAgICByZXNldFRpbWUgPSBuZXcgRGF0ZShyZXNldFRpbWVzdGFtcCAqIDEwMDApO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLmxhc3RSYXRlTGltaXRJbmZvID0ge1xuICAgICAgICBsaW1pdCxcbiAgICAgICAgcmVtYWluaW5nLFxuICAgICAgICByZXNldDogcmVzZXRUaW1lIHx8IG5ldyBEYXRlKERhdGUubm93KCkgKyA2MCAqIDYwICogMTAwMCksIC8vIERlZmF1bHQgdG8gMSBob3VyXG4gICAgICAgIHVzZWQ6IGxpbWl0IC0gcmVtYWluaW5nXG4gICAgICB9O1xuICAgICAgXG4gICAgICByZW1haW5pbmdSZXF1ZXN0cyA9IHJlbWFpbmluZztcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybignR2l0SHViIEFQSSByYXRlIGxpbWl0IGhpdCBmcm9tIHNlcnZlcicsIHtcbiAgICAgIHJlbWFpbmluZzogcmVtYWluaW5nUmVxdWVzdHMsXG4gICAgICByZXNldFRpbWUsXG4gICAgICBxdWV1ZUxlbmd0aDogdGhpcy5yZXF1ZXN0UXVldWUubGVuZ3RoLFxuICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvcj8ubWVzc2FnZVxuICAgIH0pO1xuXG4gICAgLy8gTG9nIGFzIGEgc2VjdXJpdHkgZXZlbnQgZm9yIG1vbml0b3JpbmdcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6ICdHaXRIdWJSYXRlTGltaXRlci5oYW5kbGVHaXRIdWJSYXRlTGltaXQnLFxuICAgICAgZGV0YWlsczogYEdpdEh1YiBBUEkgcmF0ZSBsaW1pdCBleGNlZWRlZC4gUmVtYWluaW5nOiAke3JlbWFpbmluZ1JlcXVlc3RzfSwgUXVldWU6ICR7dGhpcy5yZXF1ZXN0UXVldWUubGVuZ3RofWAsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICByYXRlTGltaXRJbmZvOiB0aGlzLmxhc3RSYXRlTGltaXRJbmZvLFxuICAgICAgICBhdXRoZW50aWNhdGVkOiB0aGlzLmlzQXV0aGVudGljYXRlZFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZyBBUEkgdXNhZ2UgZm9yIG1vbml0b3JpbmcgYW5kIGRpYWdub3N0aWNzXG4gICAqL1xuICBwcml2YXRlIGxvZ0FwaVVzYWdlKG9wZXJhdGlvbjogc3RyaW5nLCByZXN1bHQ6ICdzdWNjZXNzJyB8ICdlcnJvcicsIGVycm9yPzogYW55KTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5nZXRTdGF0dXMoKTtcbiAgICBcbiAgICBsb2dnZXIuZGVidWcoJ0dpdEh1YiBBUEkgdXNhZ2UgbG9nZ2VkJywge1xuICAgICAgb3BlcmF0aW9uLFxuICAgICAgcmVzdWx0LFxuICAgICAgcmVtYWluaW5nVG9rZW5zOiBzdGF0dXMucmVtYWluaW5nVG9rZW5zLFxuICAgICAgcXVldWVMZW5ndGg6IHN0YXR1cy5xdWV1ZUxlbmd0aCxcbiAgICAgIGF1dGhlbnRpY2F0ZWQ6IHRoaXMuaXNBdXRoZW50aWNhdGVkLFxuICAgICAgZXJyb3I6IGVycm9yPy5tZXNzYWdlXG4gICAgfSk7XG5cbiAgICAvLyBMb2cgd2FybmluZyBpZiBnZXR0aW5nIGNsb3NlIHRvIHJhdGUgbGltaXRzXG4gICAgaWYgKHN0YXR1cy5yZW1haW5pbmdUb2tlbnMgPCAxMDAgJiYgdGhpcy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdBcHByb2FjaGluZyBHaXRIdWIgQVBJIHJhdGUgbGltaXQnLCB7XG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgcmVtYWluaW5nVG9rZW5zOiBzdGF0dXMucmVtYWluaW5nVG9rZW5zLFxuICAgICAgICBjdXJyZW50TGltaXQ6IHN0YXR1cy5jdXJyZW50TGltaXQsXG4gICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ29uc2lkZXIgcmVkdWNpbmcgQVBJIHVzYWdlIGZyZXF1ZW5jeSdcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzLnJlbWFpbmluZ1Rva2VucyA8IDEwICYmICF0aGlzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0FwcHJvYWNoaW5nIEdpdEh1YiBBUEkgcmF0ZSBsaW1pdCAodW5hdXRoZW50aWNhdGVkKScsIHtcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICByZW1haW5pbmdUb2tlbnM6IHN0YXR1cy5yZW1haW5pbmdUb2tlbnMsXG4gICAgICAgIGN1cnJlbnRMaW1pdDogc3RhdHVzLmN1cnJlbnRMaW1pdCxcbiAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciBhdXRoZW50aWNhdGluZyBmb3IgaGlnaGVyIHJhdGUgbGltaXRzJ1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSByZXF1ZXN0IHF1ZXVlIChmb3IgdGVzdGluZyBvciBlbWVyZ2VuY3kgc2l0dWF0aW9ucylcbiAgICovXG4gIGNsZWFyUXVldWUoKTogdm9pZCB7XG4gICAgY29uc3QgY2xlYXJlZENvdW50ID0gdGhpcy5yZXF1ZXN0UXVldWUubGVuZ3RoO1xuICAgIFxuICAgIC8vIFJlamVjdCBhbGwgcGVuZGluZyByZXF1ZXN0c1xuICAgIHRoaXMucmVxdWVzdFF1ZXVlLmZvckVhY2gocmVxdWVzdCA9PiB7XG4gICAgICByZXF1ZXN0LnJlamVjdChuZXcgRXJyb3IoJ1JlcXVlc3QgcXVldWUgY2xlYXJlZCcpKTtcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLnJlcXVlc3RRdWV1ZSA9IFtdO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdHaXRIdWIgQVBJIHJlcXVlc3QgcXVldWUgY2xlYXJlZCcsIHsgY2xlYXJlZENvdW50IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSByYXRlIGxpbWl0ZXIgKGZvciB0ZXN0aW5nKVxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5yYXRlTGltaXRlci5yZXNldCgpO1xuICAgIHRoaXMuY2xlYXJRdWV1ZSgpO1xuICAgIHRoaXMucHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgIGxvZ2dlci5pbmZvKCdHaXRIdWIgcmF0ZSBsaW1pdGVyIHJlc2V0Jyk7XG4gIH1cbn1cblxuLy8gU2luZ2xldG9uIGluc3RhbmNlIGZvciBnbG9iYWwgdXNlXG5leHBvcnQgY29uc3QgZ2l0aHViUmF0ZUxpbWl0ZXIgPSBuZXcgR2l0SHViUmF0ZUxpbWl0ZXIoKTsiXX0=
391
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViUmF0ZUxpbWl0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvR2l0SHViUmF0ZUxpbWl0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBc0MsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQXdCMUMsTUFBTSxPQUFPLGlCQUFpQjtJQUNwQixXQUFXLENBQWU7SUFDMUIsWUFBWSxHQUF1QixFQUFFLENBQUM7SUFDdEMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixpQkFBaUIsQ0FBdUI7SUFDeEMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLHFCQUFxQixDQUFpQjtJQUU5QztRQUNFLG9FQUFvRTtRQUNwRSxnRUFBZ0U7UUFDaEUsNEVBQTRFO1FBRTVFLHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksV0FBVyxDQUFDO1lBQ2pDLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLHFCQUFxQixHQUFHLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDO1lBQ2hILFFBQVEsRUFBRSxzQkFBc0IsQ0FBQyxTQUFTO1lBQzFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxZQUFZO1NBQ2hELENBQUMsQ0FBQztR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QUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFFOUMsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ2xDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFFdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSztRQUNILElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUFFRCxvQ0FBb0M7QUFDcEMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHaXRIdWJSYXRlTGltaXRlciAtIFNwZWNpYWxpemVkIHJhdGUgbGltaXRlciBmb3IgR2l0SHViIEFQSSBjYWxsc1xuICogXG4gKiBGZWF0dXJlczpcbiAqIC0gUmVzcGVjdHMgR2l0SHViJ3MgYXV0aGVudGljYXRlZCAoNTAwMC9ob3VyKSBhbmQgdW5hdXRoZW50aWNhdGVkICg2MC9ob3VyKSBsaW1pdHNcbiAqIC0gQ2xpZW50LXNpZGUgcXVldWluZyB3aGVuIGFwcHJvYWNoaW5nIGxpbWl0c1xuICogLSBSZXF1ZXN0IHByaW9yaXRpemF0aW9uIGZvciBjcml0aWNhbCBvcGVyYXRpb25zXG4gKiAtIENvbXByZWhlbnNpdmUgbG9nZ2luZyBmb3IgcXVvdGEgbWFuYWdlbWVudFxuICogLSBFYXJseSB0ZXJtaW5hdGlvbiB3aGVuIGV4YWN0IG1hdGNoZXMgYXJlIGZvdW5kXG4gKi9cblxuaW1wb3J0IHsgUmF0ZUxpbWl0ZXIsIFJhdGVMaW1pdGVyQ29uZmlnLCBSYXRlTGltaXRTdGF0dXMgfSBmcm9tICcuL1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IEdJVEhVQl9BUElfUkFURV9MSU1JVFMgfSBmcm9tICcuLi9jb25maWcvcG9ydGZvbGlvLWNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdub2RlOmNyeXB0byc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0SHViUmF0ZUxpbWl0SW5mbyB7XG4gIGxpbWl0OiBudW1iZXI7XG4gIHJlbWFpbmluZzogbnVtYmVyO1xuICByZXNldDogRGF0ZTtcbiAgdXNlZDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkFwaVJlcXVlc3Qge1xuICBpZDogc3RyaW5nO1xuICBvcGVyYXRpb246IHN0cmluZztcbiAgcHJpb3JpdHk6ICdoaWdoJyB8ICdub3JtYWwnIHwgJ2xvdyc7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICByZXNvbHZlOiAodmFsdWU6IGFueSkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IGFueSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRIdWJSYXRlU3RhdHVzIGV4dGVuZHMgUmF0ZUxpbWl0U3RhdHVzIHtcbiAgcXVldWVMZW5ndGg6IG51bWJlcjtcbiAgY3VycmVudExpbWl0OiBudW1iZXI7XG4gIHJhdGVMaW1pdEluZm8/OiBHaXRIdWJSYXRlTGltaXRJbmZvO1xufVxuXG5leHBvcnQgY2xhc3MgR2l0SHViUmF0ZUxpbWl0ZXIge1xuICBwcml2YXRlIHJhdGVMaW1pdGVyITogUmF0ZUxpbWl0ZXI7XG4gIHByaXZhdGUgcmVxdWVzdFF1ZXVlOiBHaXRIdWJBcGlSZXF1ZXN0W10gPSBbXTtcbiAgcHJpdmF0ZSBwcm9jZXNzaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgbGFzdFJhdGVMaW1pdEluZm8/OiBHaXRIdWJSYXRlTGltaXRJbmZvO1xuICBwcml2YXRlIGlzQXV0aGVudGljYXRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XG4gIHByaXZhdGUgaW5pdGlhbGl6YXRpb25Qcm9taXNlPzogUHJvbWlzZTx2b2lkPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBGSVggKFNvbmFyQ2xvdWQgUzcwNTkpOiBSZW1vdmVkIGFzeW5jIG9wZXJhdGlvbnMgZnJvbSBjb25zdHJ1Y3RvclxuICAgIC8vIFByZXZpb3VzbHk6IENhbGxlZCBhc3luYyB1cGRhdGVMaW1pdHNGb3JBdXRoU3RhdHVzKCkgZGlyZWN0bHlcbiAgICAvLyBOb3c6IFVzaW5nIGxhenkgaW5pdGlhbGl6YXRpb24gcGF0dGVybiAtIGFzeW5jIHdvcmsgZGVmZXJyZWQgdG8gZmlyc3QgdXNlXG5cbiAgICAvLyBJbml0aWFsaXplIHdpdGggY29uc2VydmF0aXZlIGRlZmF1bHRzIHN5bmNocm9ub3VzbHlcbiAgICB0aGlzLnJhdGVMaW1pdGVyID0gbmV3IFJhdGVMaW1pdGVyKHtcbiAgICAgIG1heFJlcXVlc3RzOiBNYXRoLmZsb29yKEdJVEhVQl9BUElfUkFURV9MSU1JVFMuVU5BVVRIRU5USUNBVEVEX0xJTUlUICogR0lUSFVCX0FQSV9SQVRFX0xJTUlUUy5CVUZGRVJfUEVSQ0VOVEFHRSksXG4gICAgICB3aW5kb3dNczogR0lUSFVCX0FQSV9SQVRFX0xJTUlUUy5XSU5ET1dfTVMsXG4gICAgICBtaW5EZWxheU1zOiBHSVRIVUJfQVBJX1JBVEVfTElNSVRTLk1JTl9ERUxBWV9NU1xuICAgIH0pO1xuXG4gICAgLy8gU2V0dXAgcGVyaW9kaWMgY2hlY2sgaW1tZWRpYXRlbHkgKHN5bmNocm9ub3VzKVxuICAgIHRoaXMuc2V0dXBQZXJpb2RpY1N0YXR1c0NoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHJhdGUgbGltaXRlciBpcyBpbml0aWFsaXplZCB3aXRoIHByb3BlciBhdXRoIHN0YXR1c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbml0aWFsaXplZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBGSVg6IENoZWNrIHByb21pc2UgZmlyc3QgdG8gYWRkcmVzcyBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25cbiAgICBpZiAodGhpcy5pbml0aWFsaXphdGlvblByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuXG4gICAgLy8gUHJldmVudCBtdWx0aXBsZSBjb25jdXJyZW50IGluaXRpYWxpemF0aW9uc1xuICAgIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gdGhpcy51cGRhdGVMaW1pdHNGb3JBdXRoU3RhdHVzKClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgLy8gRklYOiBPbmx5IHNldCBpbml0aWFsaXplZCB0byB0cnVlIG9uIHN1Y2Nlc3NcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAvLyBGSVg6IEJldHRlciBlcnJvciByZWNvdmVyeSAtIGRvbid0IG1hcmsgYXMgaW5pdGlhbGl6ZWQgb24gZmFpbHVyZVxuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGluaXRpYWxpemUgd2l0aCBhdXRoIHN0YXR1cywgdXNpbmcgZGVmYXVsdHMnLCB7IGVycm9yIH0pO1xuICAgICAgICAvLyBEb24ndCBzZXQgaW5pdGlhbGl6ZWQgdG8gdHJ1ZSwgYWxsb3cgcmV0cnkgb24gbmV4dCBjYWxsXG4gICAgICAgIC8vIFJlLXRocm93IHRvIG1haW50YWluIHByb21pc2UgY2hhaW4gYmVoYXZpb3JcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KVxuICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSByYXRlIGxpbWl0cyBiYXNlZCBvbiBjdXJyZW50IGF1dGhlbnRpY2F0aW9uIHN0YXR1c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVMaW1pdHNGb3JBdXRoU3RhdHVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbkFzeW5jKCk7XG4gICAgICBjb25zdCBuZXdJc0F1dGhlbnRpY2F0ZWQgPSAhIXRva2VuO1xuICAgICAgXG4gICAgICAvLyBPbmx5IHJlY3JlYXRlIHJhdGUgbGltaXRlciBpZiBhdXRoIHN0YXR1cyBjaGFuZ2VkXG4gICAgICBpZiAobmV3SXNBdXRoZW50aWNhdGVkICE9PSB0aGlzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgICB0aGlzLmlzQXV0aGVudGljYXRlZCA9IG5ld0lzQXV0aGVudGljYXRlZDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5pc0F1dGhlbnRpY2F0ZWQgXG4gICAgICAgICAgPyBHSVRIVUJfQVBJX1JBVEVfTElNSVRTLkFVVEhFTlRJQ0FURURfTElNSVQgXG4gICAgICAgICAgOiBHSVRIVUJfQVBJX1JBVEVfTElNSVRTLlVOQVVUSEVOVElDQVRFRF9MSU1JVDtcbiAgICAgICAgICBcbiAgICAgICAgLy8gQXBwbHkgYnVmZmVyIHRvIHN0YXkgYmVsb3cgYWN0dWFsIGxpbWl0c1xuICAgICAgICBjb25zdCBidWZmZXJlZExpbWl0ID0gTWF0aC5mbG9vcihsaW1pdCAqIEdJVEhVQl9BUElfUkFURV9MSU1JVFMuQlVGRkVSX1BFUkNFTlRBR0UpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgY29uZmlnOiBSYXRlTGltaXRlckNvbmZpZyA9IHtcbiAgICAgICAgICBtYXhSZXF1ZXN0czogYnVmZmVyZWRMaW1pdCxcbiAgICAgICAgICB3aW5kb3dNczogR0lUSFVCX0FQSV9SQVRFX0xJTUlUUy5XSU5ET1dfTVMsXG4gICAgICAgICAgbWluRGVsYXlNczogR0lUSFVCX0FQSV9SQVRFX0xJTUlUUy5NSU5fREVMQVlfTVNcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMucmF0ZUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXIoY29uZmlnKTtcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci5pbmZvKCdHaXRIdWIgcmF0ZSBsaW1pdGVyIHVwZGF0ZWQnLCB7XG4gICAgICAgICAgYXV0aGVudGljYXRlZDogdGhpcy5pc0F1dGhlbnRpY2F0ZWQsXG4gICAgICAgICAgbGltaXQ6IGJ1ZmZlcmVkTGltaXQsXG4gICAgICAgICAgb3JpZ2luYWxMaW1pdDogbGltaXQsXG4gICAgICAgICAgYnVmZmVyUGVyY2VudGFnZTogR0lUSFVCX0FQSV9SQVRFX0xJTUlUUy5CVUZGRVJfUEVSQ0VOVEFHRVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBjaGVjayBhdXRoZW50aWNhdGlvbiBzdGF0dXMgZm9yIHJhdGUgbGltaXRpbmcnLCB7IGVycm9yIH0pO1xuICAgICAgLy8gRmFsbCBiYWNrIHRvIHVuYXV0aGVudGljYXRlZCBsaW1pdHNcbiAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnJhdGVMaW1pdGVyID0gbmV3IFJhdGVMaW1pdGVyKHtcbiAgICAgICAgbWF4UmVxdWVzdHM6IE1hdGguZmxvb3IoR0lUSFVCX0FQSV9SQVRFX0xJTUlUUy5VTkFVVEhFTlRJQ0FURURfTElNSVQgKiBHSVRIVUJfQVBJX1JBVEVfTElNSVRTLkJVRkZFUl9QRVJDRU5UQUdFKSxcbiAgICAgICAgd2luZG93TXM6IEdJVEhVQl9BUElfUkFURV9MSU1JVFMuV0lORE9XX01TLFxuICAgICAgICBtaW5EZWxheU1zOiBHSVRIVUJfQVBJX1JBVEVfTElNSVRTLk1JTl9ERUxBWV9NU1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0dXNDaGVja0ludGVydmFsPzogTm9kZUpTLlRpbWVvdXQ7XG5cbiAgLyoqXG4gICAqIFNldHVwIHBlcmlvZGljIGNoZWNrIGZvciByYXRlIGxpbWl0IHN0YXR1c1xuICAgKiBGSVg6IFN0b3JlIGludGVydmFsIHJlZmVyZW5jZSB0byBhbGxvdyBjbGVhbnVwIGluIHRlc3RzXG4gICAqL1xuICBwcml2YXRlIHNldHVwUGVyaW9kaWNTdGF0dXNDaGVjaygpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBhbnkgZXhpc3RpbmcgaW50ZXJ2YWxcbiAgICBpZiAodGhpcy5zdGF0dXNDaGVja0ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuc3RhdHVzQ2hlY2tJbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYXV0aCBzdGF0dXMgZXZlcnkgNSBtaW51dGVzXG4gICAgdGhpcy5zdGF0dXNDaGVja0ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVMaW1pdHNGb3JBdXRoU3RhdHVzKCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBsb2dnZXIud2FybignUGVyaW9kaWMgYXV0aCBzdGF0dXMgY2hlY2sgZmFpbGVkJywgeyBlcnJvciB9KTtcbiAgICAgIH0pO1xuICAgIH0sIDUgKiA2MCAqIDEwMDApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAgbWV0aG9kIGZvciB0ZXN0c1xuICAgKi9cbiAgcHVibGljIGNsZWFudXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdHVzQ2hlY2tJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXR1c0NoZWNrSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5zdGF0dXNDaGVja0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBRdWV1ZSBhIEdpdEh1YiBBUEkgcmVxdWVzdCB3aXRoIHJhdGUgbGltaXRpbmdcbiAgICogQHBhcmFtIG9wZXJhdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgb3BlcmF0aW9uXG4gICAqIEBwYXJhbSBhcGlDYWxsIEZ1bmN0aW9uIHRoYXQgbWFrZXMgdGhlIGFjdHVhbCBBUEkgY2FsbFxuICAgKiBAcGFyYW0gcHJpb3JpdHkgUmVxdWVzdCBwcmlvcml0eSAoaGlnaCwgbm9ybWFsLCBsb3cpXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBBUEkgcmVzcG9uc2VcbiAgICovXG4gIGFzeW5jIHF1ZXVlUmVxdWVzdDxUPihcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBhcGlDYWxsOiAoKSA9PiBQcm9taXNlPFQ+LFxuICAgIHByaW9yaXR5OiAnaGlnaCcgfCAnbm9ybWFsJyB8ICdsb3cnID0gJ25vcm1hbCdcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYIChETUNQLVNFQy0wMDQpOiBOb3JtYWxpemUgVW5pY29kZSBpbiBvcGVyYXRpb24gbmFtZSB0byBwcmV2ZW50IGluamVjdGlvbiBhdHRhY2tzXG4gICAgY29uc3Qgbm9ybWFsaXplZE9wZXJhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG9wZXJhdGlvbik7XG4gICAgaWYgKCFub3JtYWxpemVkT3BlcmF0aW9uLmlzVmFsaWQpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1VOSUNPREVfVkFMSURBVElPTl9FUlJPUicsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnR2l0SHViUmF0ZUxpbWl0ZXIucXVldWVSZXF1ZXN0JyxcbiAgICAgICAgZGV0YWlsczogYEludmFsaWQgVW5pY29kZSBpbiBvcGVyYXRpb24gbmFtZTogJHtub3JtYWxpemVkT3BlcmF0aW9uLmRldGVjdGVkSXNzdWVzPy5bMF0gfHwgJ3Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuICAgICAgLy8gVXNlIGEgc2FmZSBmYWxsYmFjayBmb3IgdGhlIG9wZXJhdGlvbiBuYW1lXG4gICAgICBvcGVyYXRpb24gPSAnZ2l0aHViLWFwaS1yZXF1ZXN0JztcbiAgICB9IGVsc2Uge1xuICAgICAgb3BlcmF0aW9uID0gbm9ybWFsaXplZE9wZXJhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcbiAgICB9XG4gICAgXG4gICAgLy8gRklYOiBVc2UgY3J5cHRvLnJhbmRvbUJ5dGVzIGluc3RlYWQgb2YgTWF0aC5yYW5kb20oKSBmb3Igc2VjdXJlIElEIGdlbmVyYXRpb25cbiAgICAvLyBTb25hckNsb3VkOiBNYXRoLnJhbmRvbSgpIGlzIG5vdCBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmVcbiAgICBjb25zdCByYW5kb21QYXJ0ID0gcmFuZG9tQnl0ZXMoNikudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IGAke29wZXJhdGlvbn0tJHtEYXRlLm5vdygpfS0ke3JhbmRvbVBhcnR9YDtcbiAgICBcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdDogR2l0SHViQXBpUmVxdWVzdCA9IHtcbiAgICAgICAgaWQ6IHJlcXVlc3RJZCxcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICBwcmlvcml0eSxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICByZXNvbHZlOiAoKSA9PiB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBhc3luYyBJSUZFIHRvIGhhbmRsZSBhc3luYyBvcGVyYXRpb25zIHdpdGhvdXQgcmV0dXJuaW5nIGEgUHJvbWlzZVxuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0V4ZWN1dGluZyBHaXRIdWIgQVBJIHJlcXVlc3QnLCB7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICBxdWV1ZVdhaXRUaW1lOiBEYXRlLm5vdygpIC0gcmVxdWVzdC50aW1lc3RhbXBcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBpQ2FsbCgpO1xuICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG5cbiAgICAgICAgICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgQVBJIHVzYWdlIGZvciBxdW90YSB0cmFja2luZ1xuICAgICAgICAgICAgICB0aGlzLmxvZ0FwaVVzYWdlKG9wZXJhdGlvbiwgJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHJhdGUgbGltaXQgZXJyb3IgZnJvbSBHaXRIdWJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuaXNHaXRIdWJSYXRlTGltaXRFcnJvcihlcnJvcikpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUdpdEh1YlJhdGVMaW1pdChlcnJvcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gRW5zdXJlIHJlamVjdGlvbiByZWFzb24gaXMgYW4gRXJyb3Igb2JqZWN0XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpO1xuICAgICAgICAgICAgICB0aGlzLmxvZ0FwaVVzYWdlKG9wZXJhdGlvbiwgJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgLy8gQ2F0Y2ggYW55IHN5bmNocm9ub3VzIGVycm9ycyBmcm9tIHRoZSBJSUZFIGl0c2VsZlxuICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSByZWplY3Rpb24gcmVhc29uIGlzIGFuIEVycm9yIG9iamVjdFxuICAgICAgICAgICAgcmVqZWN0KGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKFN0cmluZyhlcnIpKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlamVjdFxuICAgICAgfTtcblxuICAgICAgLy8gQWRkIHRvIHF1ZXVlIHdpdGggcHJpb3JpdHkgb3JkZXJpbmdcbiAgICAgIHRoaXMuYWRkVG9RdWV1ZShyZXF1ZXN0KTtcbiAgICAgIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHJlcXVlc3QgdG8gcXVldWUgd2l0aCBwcmlvcml0eSBvcmRlcmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBhZGRUb1F1ZXVlKHJlcXVlc3Q6IEdpdEh1YkFwaVJlcXVlc3QpOiB2b2lkIHtcbiAgICAvLyBJbnNlcnQgYmFzZWQgb24gcHJpb3JpdHk6IGhpZ2ggPiBub3JtYWwgPiBsb3dcbiAgICAvLyBXaXRoaW4gc2FtZSBwcmlvcml0eSwgbWFpbnRhaW4gRklGTyBvcmRlclxuICAgIGNvbnN0IHByaW9yaXR5T3JkZXIgPSB7IGhpZ2g6IDAsIG5vcm1hbDogMSwgbG93OiAyIH07XG4gICAgXG4gICAgbGV0IGluc2VydEluZGV4ID0gdGhpcy5yZXF1ZXN0UXVldWUubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZXF1ZXN0UXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwcmlvcml0eU9yZGVyW3JlcXVlc3QucHJpb3JpdHldIDwgcHJpb3JpdHlPcmRlclt0aGlzLnJlcXVlc3RRdWV1ZVtpXS5wcmlvcml0eV0pIHtcbiAgICAgICAgaW5zZXJ0SW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5yZXF1ZXN0UXVldWUuc3BsaWNlKGluc2VydEluZGV4LCAwLCByZXF1ZXN0KTtcbiAgICBcbiAgICBsb2dnZXIuZGVidWcoJ0dpdEh1YiBBUEkgcmVxdWVzdCBxdWV1ZWQnLCB7XG4gICAgICBvcGVyYXRpb246IHJlcXVlc3Qub3BlcmF0aW9uLFxuICAgICAgcHJpb3JpdHk6IHJlcXVlc3QucHJpb3JpdHksXG4gICAgICBxdWV1ZVBvc2l0aW9uOiBpbnNlcnRJbmRleCxcbiAgICAgIHRvdGFsUXVldWVkOiB0aGlzLnJlcXVlc3RRdWV1ZS5sZW5ndGhcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHRoZSByZXF1ZXN0IHF1ZXVlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NRdWV1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5wcm9jZXNzaW5nIHx8IHRoaXMucmVxdWVzdFF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJvY2Vzc2luZyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGluaXRpYWxpemF0aW9uIGJlZm9yZSBwcm9jZXNzaW5nXG4gICAgICAvLyBJZiBpbml0aWFsaXphdGlvbiBmYWlscywgd2UgY29udGludWUgd2l0aCBkZWZhdWx0IHJhdGUgbGltaXRlclxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgICAgfSBjYXRjaCAoaW5pdEVycm9yKSB7XG4gICAgICAgIC8vIEluaXRpYWxpemF0aW9uIGZhaWxlZCBidXQgd2UgaGF2ZSBmYWxsYmFjayBkZWZhdWx0cywgY29udGludWUgcHJvY2Vzc2luZ1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0NvbnRpbnVpbmcgd2l0aCBkZWZhdWx0IHJhdGUgbGltaXRzIGFmdGVyIGluaXQgZmFpbHVyZScsIHsgZXJyb3I6IGluaXRFcnJvciB9KTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUgKHRoaXMucmVxdWVzdFF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVXBkYXRlIGF1dGggc3RhdHVzIHBlcmlvZGljYWxseVxuICAgICAgICAvLyBVc2UgY3J5cHRvIGZvciBjb25zaXN0ZW5jeSwgdGhvdWdoIHRoaXMgaXMgbm90IHNlY3VyaXR5LXNlbnNpdGl2ZVxuICAgICAgICBjb25zdCBzaG91bGRVcGRhdGUgPSByYW5kb21CeXRlcygxKVswXSA8IDI2OyAvLyB+MTAlIGNoYW5jZSAoMjYvMjU2KVxuICAgICAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVMaW1pdHNGb3JBdXRoU3RhdHVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByYXRlTGltaXRTdGF0dXMgPSB0aGlzLnJhdGVMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghcmF0ZUxpbWl0U3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgICAgICAvLyBMb2cgcmF0ZSBsaW1pdCB3YWl0XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiBBUEkgcmF0ZSBsaW1pdCByZWFjaGVkLCB3YWl0aW5nJywge1xuICAgICAgICAgICAgcmV0cnlBZnRlck1zOiByYXRlTGltaXRTdGF0dXMucmV0cnlBZnRlck1zLFxuICAgICAgICAgICAgcmVtYWluaW5nVG9rZW5zOiByYXRlTGltaXRTdGF0dXMucmVtYWluaW5nVG9rZW5zLFxuICAgICAgICAgICAgcXVldWVMZW5ndGg6IHRoaXMucmVxdWVzdFF1ZXVlLmxlbmd0aCxcbiAgICAgICAgICAgIHJlc2V0VGltZTogcmF0ZUxpbWl0U3RhdHVzLnJlc2V0VGltZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHNwZWNpZmllZCB0aW1lXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHJhdGVMaW1pdFN0YXR1cy5yZXRyeUFmdGVyTXMgfHwgMTAwMCkpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvY2VzcyB0aGUgbmV4dCByZXF1ZXN0XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3RRdWV1ZS5zaGlmdCgpITtcbiAgICAgICAgdGhpcy5yYXRlTGltaXRlci5jb25zdW1lVG9rZW4oKTtcblxuICAgICAgICAvLyBFeGVjdXRlIHRoZSByZXF1ZXN0XG4gICAgICAgIHJlcXVlc3QucmVzb2x2ZShudWxsKTsgLy8gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIGFjdHVhbCBBUEkgY2FsbFxuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgcmF0ZSBsaW1pdCBzdGF0dXNcbiAgICovXG4gIGdldFN0YXR1cygpOiBHaXRIdWJSYXRlU3RhdHVzIHtcbiAgICBjb25zdCBiYXNlU3RhdHVzID0gdGhpcy5yYXRlTGltaXRlci5nZXRTdGF0dXMoKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZVN0YXR1cyxcbiAgICAgIHF1ZXVlTGVuZ3RoOiB0aGlzLnJlcXVlc3RRdWV1ZS5sZW5ndGgsXG4gICAgICBjdXJyZW50TGltaXQ6IHRoaXMuaXNBdXRoZW50aWNhdGVkIFxuICAgICAgICA/IEdJVEhVQl9BUElfUkFURV9MSU1JVFMuQVVUSEVOVElDQVRFRF9MSU1JVCBcbiAgICAgICAgOiBHSVRIVUJfQVBJX1JBVEVfTElNSVRTLlVOQVVUSEVOVElDQVRFRF9MSU1JVCxcbiAgICAgIHJhdGVMaW1pdEluZm86IHRoaXMubGFzdFJhdGVMaW1pdEluZm9cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGVycm9yIGlzIGEgR2l0SHViIHJhdGUgbGltaXQgZXJyb3JcbiAgICovXG4gIHByaXZhdGUgaXNHaXRIdWJSYXRlTGltaXRFcnJvcihlcnJvcjogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVycm9yPy5zdGF0dXMgPT09IDQyOSB8fCBcbiAgICAgICAgICAgZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgPT09IDQyOSB8fFxuICAgICAgICAgICAodHlwZW9mIGVycm9yPy5tZXNzYWdlID09PSAnc3RyaW5nJyAmJiBlcnJvci5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3JhdGUgbGltaXQnKSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIEdpdEh1YiByYXRlIGxpbWl0IGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUdpdEh1YlJhdGVMaW1pdChlcnJvcjogYW55KTogdm9pZCB7XG4gICAgbGV0IHJlc2V0VGltZTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVtYWluaW5nUmVxdWVzdHMgPSAwO1xuICAgIFxuICAgIC8vIFBhcnNlIHJhdGUgbGltaXQgaGVhZGVycyBpZiBhdmFpbGFibGVcbiAgICBpZiAoZXJyb3I/LnJlc3BvbnNlPy5oZWFkZXJzKSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gZXJyb3IucmVzcG9uc2UuaGVhZGVycztcbiAgICAgIGNvbnN0IHJlc2V0VGltZXN0YW1wID0gTnVtYmVyLnBhcnNlSW50KGhlYWRlcnNbJ3gtcmF0ZWxpbWl0LXJlc2V0J10gfHwgJzAnKTtcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IE51bWJlci5wYXJzZUludChoZWFkZXJzWyd4LXJhdGVsaW1pdC1yZW1haW5pbmcnXSB8fCAnMCcpO1xuICAgICAgY29uc3QgbGltaXQgPSBOdW1iZXIucGFyc2VJbnQoaGVhZGVyc1sneC1yYXRlbGltaXQtbGltaXQnXSB8fCAnMCcpO1xuICAgICAgXG4gICAgICBpZiAocmVzZXRUaW1lc3RhbXAgPiAwKSB7XG4gICAgICAgIHJlc2V0VGltZSA9IG5ldyBEYXRlKHJlc2V0VGltZXN0YW1wICogMTAwMCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRoaXMubGFzdFJhdGVMaW1pdEluZm8gPSB7XG4gICAgICAgIGxpbWl0LFxuICAgICAgICByZW1haW5pbmcsXG4gICAgICAgIHJlc2V0OiByZXNldFRpbWUgfHwgbmV3IERhdGUoRGF0ZS5ub3coKSArIDYwICogNjAgKiAxMDAwKSwgLy8gRGVmYXVsdCB0byAxIGhvdXJcbiAgICAgICAgdXNlZDogbGltaXQgLSByZW1haW5pbmdcbiAgICAgIH07XG4gICAgICBcbiAgICAgIHJlbWFpbmluZ1JlcXVlc3RzID0gcmVtYWluaW5nO1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKCdHaXRIdWIgQVBJIHJhdGUgbGltaXQgaGl0IGZyb20gc2VydmVyJywge1xuICAgICAgcmVtYWluaW5nOiByZW1haW5pbmdSZXF1ZXN0cyxcbiAgICAgIHJlc2V0VGltZSxcbiAgICAgIHF1ZXVlTGVuZ3RoOiB0aGlzLnJlcXVlc3RRdWV1ZS5sZW5ndGgsXG4gICAgICBlcnJvck1lc3NhZ2U6IGVycm9yPy5tZXNzYWdlXG4gICAgfSk7XG5cbiAgICAvLyBMb2cgYXMgYSBzZWN1cml0eSBldmVudCBmb3IgbW9uaXRvcmluZ1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgIHNvdXJjZTogJ0dpdEh1YlJhdGVMaW1pdGVyLmhhbmRsZUdpdEh1YlJhdGVMaW1pdCcsXG4gICAgICBkZXRhaWxzOiBgR2l0SHViIEFQSSByYXRlIGxpbWl0IGV4Y2VlZGVkLiBSZW1haW5pbmc6ICR7cmVtYWluaW5nUmVxdWVzdHN9LCBRdWV1ZTogJHt0aGlzLnJlcXVlc3RRdWV1ZS5sZW5ndGh9YCxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIHJhdGVMaW1pdEluZm86IHRoaXMubGFzdFJhdGVMaW1pdEluZm8sXG4gICAgICAgIGF1dGhlbnRpY2F0ZWQ6IHRoaXMuaXNBdXRoZW50aWNhdGVkXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9nIEFQSSB1c2FnZSBmb3IgbW9uaXRvcmluZyBhbmQgZGlhZ25vc3RpY3NcbiAgICovXG4gIHByaXZhdGUgbG9nQXBpVXNhZ2Uob3BlcmF0aW9uOiBzdHJpbmcsIHJlc3VsdDogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJywgZXJyb3I/OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmdldFN0YXR1cygpO1xuICAgIFxuICAgIGxvZ2dlci5kZWJ1ZygnR2l0SHViIEFQSSB1c2FnZSBsb2dnZWQnLCB7XG4gICAgICBvcGVyYXRpb24sXG4gICAgICByZXN1bHQsXG4gICAgICByZW1haW5pbmdUb2tlbnM6IHN0YXR1cy5yZW1haW5pbmdUb2tlbnMsXG4gICAgICBxdWV1ZUxlbmd0aDogc3RhdHVzLnF1ZXVlTGVuZ3RoLFxuICAgICAgYXV0aGVudGljYXRlZDogdGhpcy5pc0F1dGhlbnRpY2F0ZWQsXG4gICAgICBlcnJvcjogZXJyb3I/Lm1lc3NhZ2VcbiAgICB9KTtcblxuICAgIC8vIExvZyB3YXJuaW5nIGlmIGdldHRpbmcgY2xvc2UgdG8gcmF0ZSBsaW1pdHNcbiAgICBpZiAoc3RhdHVzLnJlbWFpbmluZ1Rva2VucyA8IDEwMCAmJiB0aGlzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0FwcHJvYWNoaW5nIEdpdEh1YiBBUEkgcmF0ZSBsaW1pdCcsIHtcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICByZW1haW5pbmdUb2tlbnM6IHN0YXR1cy5yZW1haW5pbmdUb2tlbnMsXG4gICAgICAgIGN1cnJlbnRMaW1pdDogc3RhdHVzLmN1cnJlbnRMaW1pdCxcbiAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciByZWR1Y2luZyBBUEkgdXNhZ2UgZnJlcXVlbmN5J1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChzdGF0dXMucmVtYWluaW5nVG9rZW5zIDwgMTAgJiYgIXRoaXMuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICBsb2dnZXIud2FybignQXBwcm9hY2hpbmcgR2l0SHViIEFQSSByYXRlIGxpbWl0ICh1bmF1dGhlbnRpY2F0ZWQpJywge1xuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIHJlbWFpbmluZ1Rva2Vuczogc3RhdHVzLnJlbWFpbmluZ1Rva2VucyxcbiAgICAgICAgY3VycmVudExpbWl0OiBzdGF0dXMuY3VycmVudExpbWl0LFxuICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0NvbnNpZGVyIGF1dGhlbnRpY2F0aW5nIGZvciBoaWdoZXIgcmF0ZSBsaW1pdHMnXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIHJlcXVlc3QgcXVldWUgKGZvciB0ZXN0aW5nIG9yIGVtZXJnZW5jeSBzaXR1YXRpb25zKVxuICAgKi9cbiAgY2xlYXJRdWV1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjbGVhcmVkQ291bnQgPSB0aGlzLnJlcXVlc3RRdWV1ZS5sZW5ndGg7XG4gICAgXG4gICAgLy8gUmVqZWN0IGFsbCBwZW5kaW5nIHJlcXVlc3RzXG4gICAgdGhpcy5yZXF1ZXN0UXVldWUuZm9yRWFjaChyZXF1ZXN0ID0+IHtcbiAgICAgIHJlcXVlc3QucmVqZWN0KG5ldyBFcnJvcignUmVxdWVzdCBxdWV1ZSBjbGVhcmVkJykpO1xuICAgIH0pO1xuICAgIFxuICAgIHRoaXMucmVxdWVzdFF1ZXVlID0gW107XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiBBUEkgcmVxdWVzdCBxdWV1ZSBjbGVhcmVkJywgeyBjbGVhcmVkQ291bnQgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHJhdGUgbGltaXRlciAoZm9yIHRlc3RpbmcpXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnJhdGVMaW1pdGVyLnJlc2V0KCk7XG4gICAgdGhpcy5jbGVhclF1ZXVlKCk7XG4gICAgdGhpcy5wcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiByYXRlIGxpbWl0ZXIgcmVzZXQnKTtcbiAgfVxufVxuXG4vLyBTaW5nbGV0b24gaW5zdGFuY2UgZm9yIGdsb2JhbCB1c2VcbmV4cG9ydCBjb25zdCBnaXRodWJSYXRlTGltaXRlciA9IG5ldyBHaXRIdWJSYXRlTGltaXRlcigpOyJdfQ==
@@ -25,7 +25,7 @@ export class RateLimiter {
25
25
  this.tokens = this.maxTokens;
26
26
  this.refillRate = this.maxTokens / config.windowMs;
27
27
  // Validate refill rate to prevent division by zero
28
- if (this.refillRate <= 0 || !isFinite(this.refillRate)) {
28
+ if (this.refillRate <= 0 || !Number.isFinite(this.refillRate)) {
29
29
  throw new Error('Invalid configuration: refill rate must be positive and finite');
30
30
  }
31
31
  this.lastRefill = Date.now();
@@ -169,4 +169,4 @@ export class RateLimiterFactory {
169
169
  });
170
170
  }
171
171
  }
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmF0ZUxpbWl0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvUmF0ZUxpbWl0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFlSCxNQUFNLE9BQU8sV0FBVztJQUNkLE1BQU0sQ0FBUztJQUNmLFVBQVUsQ0FBUztJQUNuQixXQUFXLENBQVM7SUFDWCxTQUFTLENBQVM7SUFDbEIsVUFBVSxDQUFTO0lBQ25CLFFBQVEsQ0FBUztJQUVsQyxZQUFZLE1BQXlCO1FBQ25DLElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFFbkQsbURBQW1EO1FBQ25ELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxV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TCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLHdCQUF3QjtRQUM3QixPQUFPLElBQUksV0FBVyxDQUFDO1lBQ3JCLFdBQVcsRUFBRSxFQUFFO1lBQ2YsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFNBQVM7WUFDbkMsVUFBVSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsNEJBQTRCO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsbUJBQW1CO1FBQ3hCLE9BQU8sSUFBSSxXQUFXLENBQUM7WUFDckIsV0FBVyxFQUFFLENBQUM7WUFDZCxRQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsU0FBUztZQUNuQyxVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyw0QkFBNEI7U0FDbkQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSYXRlTGltaXRlciAtIEltcGxlbWVudHMgcmF0ZSBsaW1pdGluZyBmb3IgQVBJIGNhbGxzIHRvIHByZXZlbnQgYWJ1c2VcbiAqIFxuICogRmVhdHVyZXM6XG4gKiAtIFRva2VuIGJ1Y2tldCBhbGdvcml0aG0gZm9yIGZsZXhpYmxlIHJhdGUgbGltaXRpbmdcbiAqIC0gQ29uZmlndXJhYmxlIGxpbWl0cyBwZXIgdGltZSB3aW5kb3dcbiAqIC0gTWVtb3J5LWVmZmljaWVudCBpbXBsZW1lbnRhdGlvblxuICogLSBUaHJlYWQtc2FmZSBmb3IgY29uY3VycmVudCByZXF1ZXN0c1xuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF0ZUxpbWl0ZXJDb25maWcge1xuICBtYXhSZXF1ZXN0czogbnVtYmVyOyAgICAgIC8vIE1heGltdW0gcmVxdWVzdHMgYWxsb3dlZFxuICB3aW5kb3dNczogbnVtYmVyOyAgICAgICAgIC8vIFRpbWUgd2luZG93IGluIG1pbGxpc2Vjb25kc1xuICBtaW5EZWxheU1zPzogbnVtYmVyOyAgICAgIC8vIE1pbmltdW0gZGVsYXkgYmV0d2VlbiByZXF1ZXN0cyAob3B0aW9uYWwpXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmF0ZUxpbWl0U3RhdHVzIHtcbiAgYWxsb3dlZDogYm9vbGVhbjtcbiAgcmV0cnlBZnRlck1zPzogbnVtYmVyO1xuICByZW1haW5pbmdUb2tlbnM6IG51bWJlcjtcbiAgcmVzZXRUaW1lOiBEYXRlO1xufVxuXG5leHBvcnQgY2xhc3MgUmF0ZUxpbWl0ZXIge1xuICBwcml2YXRlIHRva2VuczogbnVtYmVyO1xuICBwcml2YXRlIGxhc3RSZWZpbGw6IG51bWJlcjtcbiAgcHJpdmF0ZSBsYXN0UmVxdWVzdDogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heFRva2VuczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZmlsbFJhdGU6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtaW5EZWxheTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUmF0ZUxpbWl0ZXJDb25maWcpIHtcbiAgICBpZiAoY29uZmlnLm1heFJlcXVlc3RzIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWF4UmVxdWVzdHMgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLndpbmRvd01zIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignd2luZG93TXMgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cblxuICAgIHRoaXMubWF4VG9rZW5zID0gY29uZmlnLm1heFJlcXVlc3RzO1xuICAgIHRoaXMudG9rZW5zID0gdGhpcy5tYXhUb2tlbnM7XG4gICAgdGhpcy5yZWZpbGxSYXRlID0gdGhpcy5tYXhUb2tlbnMgLyBjb25maWcud2luZG93TXM7XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgcmVmaWxsIHJhdGUgdG8gcHJldmVudCBkaXZpc2lvbiBieSB6ZXJvXG4gICAgaWYgKHRoaXMucmVmaWxsUmF0ZSA8PSAwIHx8ICFpc0Zpbml0ZSh0aGlzLnJlZmlsbFJhdGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29uZmlndXJhdGlvbjogcmVmaWxsIHJhdGUgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgZmluaXRlJyk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMubGFzdFJlZmlsbCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5sYXN0UmVxdWVzdCA9IDA7XG4gICAgdGhpcy5taW5EZWxheSA9IGNvbmZpZy5taW5EZWxheU1zIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSByZXF1ZXN0IGlzIGFsbG93ZWQgdW5kZXIgdGhlIHJhdGUgbGltaXRcbiAgICogQHJldHVybnMgU3RhdHVzIG9iamVjdCBpbmRpY2F0aW5nIGlmIHJlcXVlc3QgaXMgYWxsb3dlZFxuICAgKi9cbiAgY2hlY2tMaW1pdCgpOiBSYXRlTGltaXRTdGF0dXMge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgXG4gICAgLy8gUmVmaWxsIHRva2VucyBiYXNlZCBvbiB0aW1lIGVsYXBzZWRcbiAgICB0aGlzLnJlZmlsbFRva2Vucyhub3cpO1xuXG4gICAgLy8gQ2hlY2sgbWluaW11bSBkZWxheSBiZXR3ZWVuIHJlcXVlc3RzXG4gICAgaWYgKHRoaXMubWluRGVsYXkgPiAwICYmIHRoaXMubGFzdFJlcXVlc3QgPiAwKSB7XG4gICAgICBjb25zdCB0aW1lU2luY2VMYXN0UmVxdWVzdCA9IG5vdyAtIHRoaXMubGFzdFJlcXVlc3Q7XG4gICAgICBpZiAodGltZVNpbmNlTGFzdFJlcXVlc3QgPCB0aGlzLm1pbkRlbGF5KSB7XG4gICAgICAgIGNvbnN0IHJldHJ5QWZ0ZXJNcyA9IHRoaXMubWluRGVsYXkgLSB0aW1lU2luY2VMYXN0UmVxdWVzdDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhbGxvd2VkOiBmYWxzZSxcbiAgICAgICAgICByZXRyeUFmdGVyTXMsXG4gICAgICAgICAgcmVtYWluaW5nVG9rZW5zOiBNYXRoLmZsb29yKHRoaXMudG9rZW5zKSxcbiAgICAgICAgICByZXNldFRpbWU6IG5ldyBEYXRlKG5vdyArIHJldHJ5QWZ0ZXJNcylcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHRva2VucyBhdmFpbGFibGVcbiAgICBpZiAodGhpcy50b2tlbnMgPCAxKSB7XG4gICAgICAvLyBDYWxjdWxhdGUgd2hlbiB0aGUgbmV4dCB0b2tlbiB3aWxsIGJlIGF2YWlsYWJsZVxuICAgICAgY29uc3QgdG9rZW5zTmVlZGVkID0gMSAtIHRoaXMudG9rZW5zO1xuICAgICAgY29uc3QgbXNVbnRpbE5leHRUb2tlbiA9IHRva2Vuc05lZWRlZCAvIHRoaXMucmVmaWxsUmF0ZTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWxsb3dlZDogZmFsc2UsXG4gICAgICAgIHJldHJ5QWZ0ZXJNczogTWF0aC5jZWlsKG1zVW50aWxOZXh0VG9rZW4pLFxuICAgICAgICByZW1haW5pbmdUb2tlbnM6IDAsXG4gICAgICAgIHJlc2V0VGltZTogbmV3IERhdGUobm93ICsgbXNVbnRpbE5leHRUb2tlbilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCBpcyBhbGxvd2VkXG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWQ6IHRydWUsXG4gICAgICByZW1haW5pbmdUb2tlbnM6IE1hdGguZmxvb3IodGhpcy50b2tlbnMpLFxuICAgICAgcmVzZXRUaW1lOiB0aGlzLmdldFJlc2V0VGltZSgpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdW1lIGEgdG9rZW4gZm9yIGFuIGFsbG93ZWQgcmVxdWVzdFxuICAgKiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIGNoZWNrTGltaXQoKSByZXR1cm5zIGFsbG93ZWQ6IHRydWVcbiAgICovXG4gIGNvbnN1bWVUb2tlbigpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMucmVmaWxsVG9rZW5zKG5vdyk7XG4gICAgXG4gICAgaWYgKHRoaXMudG9rZW5zID49IDEpIHtcbiAgICAgIHRoaXMudG9rZW5zIC09IDE7XG4gICAgICB0aGlzLmxhc3RSZXF1ZXN0ID0gbm93O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCByYXRlIGxpbWl0IHN0YXR1cyB3aXRob3V0IGNvbnN1bWluZyBhIHRva2VuXG4gICAqL1xuICBnZXRTdGF0dXMoKTogUmF0ZUxpbWl0U3RhdHVzIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMucmVmaWxsVG9rZW5zKG5vdyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWxsb3dlZDogdGhpcy50b2tlbnMgPj0gMSxcbiAgICAgIHJlbWFpbmluZ1Rva2VuczogTWF0aC5mbG9vcih0aGlzLnRva2VucyksXG4gICAgICByZXNldFRpbWU6IHRoaXMuZ2V0UmVzZXRUaW1lKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSByYXRlIGxpbWl0ZXIgdG8gZnVsbCBjYXBhY2l0eVxuICAgKiBVc2VmdWwgZm9yIHRlc3Rpbmcgb3IgbWFudWFsIGludGVydmVudGlvblxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSB0aGlzLm1heFRva2VucztcbiAgICB0aGlzLmxhc3RSZWZpbGwgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMubGFzdFJlcXVlc3QgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZmlsbCB0b2tlbnMgYmFzZWQgb24gdGltZSBlbGFwc2VkXG4gICAqL1xuICBwcml2YXRlIHJlZmlsbFRva2Vucyhub3c6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRpbWVTaW5jZUxhc3RSZWZpbGwgPSBub3cgLSB0aGlzLmxhc3RSZWZpbGw7XG4gICAgY29uc3QgdG9rZW5zVG9BZGQgPSB0aW1lU2luY2VMYXN0UmVmaWxsICogdGhpcy5yZWZpbGxSYXRlO1xuICAgIFxuICAgIHRoaXMudG9rZW5zID0gTWF0aC5taW4odGhpcy5tYXhUb2tlbnMsIHRoaXMudG9rZW5zICsgdG9rZW5zVG9BZGQpO1xuICAgIHRoaXMubGFzdFJlZmlsbCA9IG5vdztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgd2hlbiB0aGUgcmF0ZSBsaW1pdCB3aW5kb3cgd2lsbCByZXNldFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSZXNldFRpbWUoKTogRGF0ZSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0b2tlbnNUb0Z1bGwgPSB0aGlzLm1heFRva2VucyAtIHRoaXMudG9rZW5zO1xuICAgIGNvbnN0IG1zVW50aWxGdWxsID0gdG9rZW5zVG9GdWxsIC8gdGhpcy5yZWZpbGxSYXRlO1xuICAgIHJldHVybiBuZXcgRGF0ZShub3cgKyBtc1VudGlsRnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGh1bWFuLXJlYWRhYmxlIHJhdGUgbGltaXQgaW5mb3JtYXRpb25cbiAgICovXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhdHVzID0gdGhpcy5nZXRTdGF0dXMoKTtcbiAgICByZXR1cm4gYFJhdGVMaW1pdDogJHtzdGF0dXMucmVtYWluaW5nVG9rZW5zfS8ke3RoaXMubWF4VG9rZW5zfSB0b2tlbnMsIGAgK1xuICAgICAgICAgICBgcmVzZXRzIGF0ICR7c3RhdHVzLnJlc2V0VGltZS50b0lTT1N0cmluZygpfWA7XG4gIH1cbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBjb21tb24gcmF0ZSBsaW1pdGVyc1xuICovXG5leHBvcnQgY2xhc3MgUmF0ZUxpbWl0ZXJGYWN0b3J5IHtcbiAgLyoqXG4gICAqIEdpdEh1YiBBUEkgcmF0ZSBsaW1pdGVyICg2MCByZXF1ZXN0cyBwZXIgaG91ciBmb3IgdW5hdXRoZW50aWNhdGVkKVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUdpdEh1YkxpbWl0ZXIoKTogUmF0ZUxpbWl0ZXIge1xuICAgIHJldHVybiBuZXcgUmF0ZUxpbWl0ZXIoe1xuICAgICAgbWF4UmVxdWVzdHM6IDYwLFxuICAgICAgd2luZG93TXM6IDYwICogNjAgKiAxMDAwLCAvLyAxIGhvdXJcbiAgICAgIG1pbkRlbGF5TXM6IDEwMDAgLy8gMSBzZWNvbmQgbWluaW11bSBiZXR3ZWVuIHJlcXVlc3RzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc2VydmF0aXZlIHJhdGUgbGltaXRlciBmb3IgdXBkYXRlIGNoZWNrc1xuICAgKiBBbGxvd3MgMTAgY2hlY2tzIHBlciBob3VyIHdpdGggMzAgc2Vjb25kIG1pbmltdW0gZGVsYXlcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVVcGRhdGVDaGVja0xpbWl0ZXIoKTogUmF0ZUxpbWl0ZXIge1xuICAgIHJldHVybiBuZXcgUmF0ZUxpbWl0ZXIoe1xuICAgICAgbWF4UmVxdWVzdHM6IDEwLFxuICAgICAgd2luZG93TXM6IDYwICogNjAgKiAxMDAwLCAvLyAxIGhvdXJcbiAgICAgIG1pbkRlbGF5TXM6IDMwICogMTAwMCAvLyAzMCBzZWNvbmRzIGJldHdlZW4gY2hlY2tzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3RyaWN0IHJhdGUgbGltaXRlciBmb3Igc2Vuc2l0aXZlIG9wZXJhdGlvbnNcbiAgICogQWxsb3dzIDUgcmVxdWVzdHMgcGVyIGhvdXIgd2l0aCAxIG1pbnV0ZSBtaW5pbXVtIGRlbGF5XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlU3RyaWN0TGltaXRlcigpOiBSYXRlTGltaXRlciB7XG4gICAgcmV0dXJuIG5ldyBSYXRlTGltaXRlcih7XG4gICAgICBtYXhSZXF1ZXN0czogNSxcbiAgICAgIHdpbmRvd01zOiA2MCAqIDYwICogMTAwMCwgLy8gMSBob3VyXG4gICAgICBtaW5EZWxheU1zOiA2MCAqIDEwMDAgLy8gMSBtaW51dGUgYmV0d2VlbiByZXF1ZXN0c1xuICAgIH0pO1xuICB9XG59Il19
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmF0ZUxpbWl0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvUmF0ZUxpbWl0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFlSCxNQUFNLE9BQU8sV0FBVztJQUNkLE1BQU0sQ0FBUztJQUNmLFVBQVUsQ0FBUztJQUNuQixXQUFXLENBQVM7SUFDWCxTQUFTLENBQVM7SUFDbEIsVUFBVSxDQUFTO0lBQ25CLFFBQVEsQ0FBUztJQUVsQyxZQUFZLE1BQXlCO1FBQ25DLElBQUksTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFFbkQsbURBQW1EO1FBQ25ELElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxN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QyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU0sQ0FBQyx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLFdBQVcsQ0FBQztZQUNyQixXQUFXLEVBQUUsRUFBRTtZQUNmLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxTQUFTO1lBQ25DLFVBQVUsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLDRCQUE0QjtTQUNuRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLG1CQUFtQjtRQUN4QixPQUFPLElBQUksV0FBVyxDQUFDO1lBQ3JCLFdBQVcsRUFBRSxDQUFDO1lBQ2QsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFNBQVM7WUFDbkMsVUFBVSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsNEJBQTRCO1NBQ25ELENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmF0ZUxpbWl0ZXIgLSBJbXBsZW1lbnRzIHJhdGUgbGltaXRpbmcgZm9yIEFQSSBjYWxscyB0byBwcmV2ZW50IGFidXNlXG4gKiBcbiAqIEZlYXR1cmVzOlxuICogLSBUb2tlbiBidWNrZXQgYWxnb3JpdGhtIGZvciBmbGV4aWJsZSByYXRlIGxpbWl0aW5nXG4gKiAtIENvbmZpZ3VyYWJsZSBsaW1pdHMgcGVyIHRpbWUgd2luZG93XG4gKiAtIE1lbW9yeS1lZmZpY2llbnQgaW1wbGVtZW50YXRpb25cbiAqIC0gVGhyZWFkLXNhZmUgZm9yIGNvbmN1cnJlbnQgcmVxdWVzdHNcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFJhdGVMaW1pdGVyQ29uZmlnIHtcbiAgbWF4UmVxdWVzdHM6IG51bWJlcjsgICAgICAvLyBNYXhpbXVtIHJlcXVlc3RzIGFsbG93ZWRcbiAgd2luZG93TXM6IG51bWJlcjsgICAgICAgICAvLyBUaW1lIHdpbmRvdyBpbiBtaWxsaXNlY29uZHNcbiAgbWluRGVsYXlNcz86IG51bWJlcjsgICAgICAvLyBNaW5pbXVtIGRlbGF5IGJldHdlZW4gcmVxdWVzdHMgKG9wdGlvbmFsKVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhdGVMaW1pdFN0YXR1cyB7XG4gIGFsbG93ZWQ6IGJvb2xlYW47XG4gIHJldHJ5QWZ0ZXJNcz86IG51bWJlcjtcbiAgcmVtYWluaW5nVG9rZW5zOiBudW1iZXI7XG4gIHJlc2V0VGltZTogRGF0ZTtcbn1cblxuZXhwb3J0IGNsYXNzIFJhdGVMaW1pdGVyIHtcbiAgcHJpdmF0ZSB0b2tlbnM6IG51bWJlcjtcbiAgcHJpdmF0ZSBsYXN0UmVmaWxsOiBudW1iZXI7XG4gIHByaXZhdGUgbGFzdFJlcXVlc3Q6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhUb2tlbnM6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSByZWZpbGxSYXRlOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWluRGVsYXk6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFJhdGVMaW1pdGVyQ29uZmlnKSB7XG4gICAgaWYgKGNvbmZpZy5tYXhSZXF1ZXN0cyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21heFJlcXVlc3RzIG11c3QgYmUgcG9zaXRpdmUnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy53aW5kb3dNcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dpbmRvd01zIG11c3QgYmUgcG9zaXRpdmUnKTtcbiAgICB9XG5cbiAgICB0aGlzLm1heFRva2VucyA9IGNvbmZpZy5tYXhSZXF1ZXN0cztcbiAgICB0aGlzLnRva2VucyA9IHRoaXMubWF4VG9rZW5zO1xuICAgIHRoaXMucmVmaWxsUmF0ZSA9IHRoaXMubWF4VG9rZW5zIC8gY29uZmlnLndpbmRvd01zO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIHJlZmlsbCByYXRlIHRvIHByZXZlbnQgZGl2aXNpb24gYnkgemVyb1xuICAgIGlmICh0aGlzLnJlZmlsbFJhdGUgPD0gMCB8fCAhTnVtYmVyLmlzRmluaXRlKHRoaXMucmVmaWxsUmF0ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb25maWd1cmF0aW9uOiByZWZpbGwgcmF0ZSBtdXN0IGJlIHBvc2l0aXZlIGFuZCBmaW5pdGUnKTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5sYXN0UmVmaWxsID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmxhc3RSZXF1ZXN0ID0gMDtcbiAgICB0aGlzLm1pbkRlbGF5ID0gY29uZmlnLm1pbkRlbGF5TXMgfHwgMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHJlcXVlc3QgaXMgYWxsb3dlZCB1bmRlciB0aGUgcmF0ZSBsaW1pdFxuICAgKiBAcmV0dXJucyBTdGF0dXMgb2JqZWN0IGluZGljYXRpbmcgaWYgcmVxdWVzdCBpcyBhbGxvd2VkXG4gICAqL1xuICBjaGVja0xpbWl0KCk6IFJhdGVMaW1pdFN0YXR1cyB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBcbiAgICAvLyBSZWZpbGwgdG9rZW5zIGJhc2VkIG9uIHRpbWUgZWxhcHNlZFxuICAgIHRoaXMucmVmaWxsVG9rZW5zKG5vdyk7XG5cbiAgICAvLyBDaGVjayBtaW5pbXVtIGRlbGF5IGJldHdlZW4gcmVxdWVzdHNcbiAgICBpZiAodGhpcy5taW5EZWxheSA+IDAgJiYgdGhpcy5sYXN0UmVxdWVzdCA+IDApIHtcbiAgICAgIGNvbnN0IHRpbWVTaW5jZUxhc3RSZXF1ZXN0ID0gbm93IC0gdGhpcy5sYXN0UmVxdWVzdDtcbiAgICAgIGlmICh0aW1lU2luY2VMYXN0UmVxdWVzdCA8IHRoaXMubWluRGVsYXkpIHtcbiAgICAgICAgY29uc3QgcmV0cnlBZnRlck1zID0gdGhpcy5taW5EZWxheSAtIHRpbWVTaW5jZUxhc3RSZXF1ZXN0O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFsbG93ZWQ6IGZhbHNlLFxuICAgICAgICAgIHJldHJ5QWZ0ZXJNcyxcbiAgICAgICAgICByZW1haW5pbmdUb2tlbnM6IE1hdGguZmxvb3IodGhpcy50b2tlbnMpLFxuICAgICAgICAgIHJlc2V0VGltZTogbmV3IERhdGUobm93ICsgcmV0cnlBZnRlck1zKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgdG9rZW5zIGF2YWlsYWJsZVxuICAgIGlmICh0aGlzLnRva2VucyA8IDEpIHtcbiAgICAgIC8vIENhbGN1bGF0ZSB3aGVuIHRoZSBuZXh0IHRva2VuIHdpbGwgYmUgYXZhaWxhYmxlXG4gICAgICBjb25zdCB0b2tlbnNOZWVkZWQgPSAxIC0gdGhpcy50b2tlbnM7XG4gICAgICBjb25zdCBtc1VudGlsTmV4dFRva2VuID0gdG9rZW5zTmVlZGVkIC8gdGhpcy5yZWZpbGxSYXRlO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhbGxvd2VkOiBmYWxzZSxcbiAgICAgICAgcmV0cnlBZnRlck1zOiBNYXRoLmNlaWwobXNVbnRpbE5leHRUb2tlbiksXG4gICAgICAgIHJlbWFpbmluZ1Rva2VuczogMCxcbiAgICAgICAgcmVzZXRUaW1lOiBuZXcgRGF0ZShub3cgKyBtc1VudGlsTmV4dFRva2VuKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBSZXF1ZXN0IGlzIGFsbG93ZWRcbiAgICByZXR1cm4ge1xuICAgICAgYWxsb3dlZDogdHJ1ZSxcbiAgICAgIHJlbWFpbmluZ1Rva2VuczogTWF0aC5mbG9vcih0aGlzLnRva2VucyksXG4gICAgICByZXNldFRpbWU6IHRoaXMuZ2V0UmVzZXRUaW1lKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWUgYSB0b2tlbiBmb3IgYW4gYWxsb3dlZCByZXF1ZXN0XG4gICAqIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgY2hlY2tMaW1pdCgpIHJldHVybnMgYWxsb3dlZDogdHJ1ZVxuICAgKi9cbiAgY29uc3VtZVRva2VuKCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgdGhpcy5yZWZpbGxUb2tlbnMobm93KTtcbiAgICBcbiAgICBpZiAodGhpcy50b2tlbnMgPj0gMSkge1xuICAgICAgdGhpcy50b2tlbnMgLT0gMTtcbiAgICAgIHRoaXMubGFzdFJlcXVlc3QgPSBub3c7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHJhdGUgbGltaXQgc3RhdHVzIHdpdGhvdXQgY29uc3VtaW5nIGEgdG9rZW5cbiAgICovXG4gIGdldFN0YXR1cygpOiBSYXRlTGltaXRTdGF0dXMge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgdGhpcy5yZWZpbGxUb2tlbnMobm93KTtcblxuICAgIHJldHVybiB7XG4gICAgICBhbGxvd2VkOiB0aGlzLnRva2VucyA+PSAxLFxuICAgICAgcmVtYWluaW5nVG9rZW5zOiBNYXRoLmZsb29yKHRoaXMudG9rZW5zKSxcbiAgICAgIHJlc2V0VGltZTogdGhpcy5nZXRSZXNldFRpbWUoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHJhdGUgbGltaXRlciB0byBmdWxsIGNhcGFjaXR5XG4gICAqIFVzZWZ1bCBmb3IgdGVzdGluZyBvciBtYW51YWwgaW50ZXJ2ZW50aW9uXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLnRva2VucyA9IHRoaXMubWF4VG9rZW5zO1xuICAgIHRoaXMubGFzdFJlZmlsbCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5sYXN0UmVxdWVzdCA9IDA7XG4gIH1cblxuICAvKipcbiAgICogUmVmaWxsIHRva2VucyBiYXNlZCBvbiB0aW1lIGVsYXBzZWRcbiAgICovXG4gIHByaXZhdGUgcmVmaWxsVG9rZW5zKG5vdzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGltZVNpbmNlTGFzdFJlZmlsbCA9IG5vdyAtIHRoaXMubGFzdFJlZmlsbDtcbiAgICBjb25zdCB0b2tlbnNUb0FkZCA9IHRpbWVTaW5jZUxhc3RSZWZpbGwgKiB0aGlzLnJlZmlsbFJhdGU7XG4gICAgXG4gICAgdGhpcy50b2tlbnMgPSBNYXRoLm1pbih0aGlzLm1heFRva2VucywgdGhpcy50b2tlbnMgKyB0b2tlbnNUb0FkZCk7XG4gICAgdGhpcy5sYXN0UmVmaWxsID0gbm93O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB3aGVuIHRoZSByYXRlIGxpbWl0IHdpbmRvdyB3aWxsIHJlc2V0XG4gICAqL1xuICBwcml2YXRlIGdldFJlc2V0VGltZSgpOiBEYXRlIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRva2Vuc1RvRnVsbCA9IHRoaXMubWF4VG9rZW5zIC0gdGhpcy50b2tlbnM7XG4gICAgY29uc3QgbXNVbnRpbEZ1bGwgPSB0b2tlbnNUb0Z1bGwgLyB0aGlzLnJlZmlsbFJhdGU7XG4gICAgcmV0dXJuIG5ldyBEYXRlKG5vdyArIG1zVW50aWxGdWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaHVtYW4tcmVhZGFibGUgcmF0ZSBsaW1pdCBpbmZvcm1hdGlvblxuICAgKi9cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmdldFN0YXR1cygpO1xuICAgIHJldHVybiBgUmF0ZUxpbWl0OiAke3N0YXR1cy5yZW1haW5pbmdUb2tlbnN9LyR7dGhpcy5tYXhUb2tlbnN9IHRva2VucywgYCArXG4gICAgICAgICAgIGByZXNldHMgYXQgJHtzdGF0dXMucmVzZXRUaW1lLnRvSVNPU3RyaW5nKCl9YDtcbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGNvbW1vbiByYXRlIGxpbWl0ZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBSYXRlTGltaXRlckZhY3Rvcnkge1xuICAvKipcbiAgICogR2l0SHViIEFQSSByYXRlIGxpbWl0ZXIgKDYwIHJlcXVlc3RzIHBlciBob3VyIGZvciB1bmF1dGhlbnRpY2F0ZWQpXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlR2l0SHViTGltaXRlcigpOiBSYXRlTGltaXRlciB7XG4gICAgcmV0dXJuIG5ldyBSYXRlTGltaXRlcih7XG4gICAgICBtYXhSZXF1ZXN0czogNjAsXG4gICAgICB3aW5kb3dNczogNjAgKiA2MCAqIDEwMDAsIC8vIDEgaG91clxuICAgICAgbWluRGVsYXlNczogMTAwMCAvLyAxIHNlY29uZCBtaW5pbXVtIGJldHdlZW4gcmVxdWVzdHNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zZXJ2YXRpdmUgcmF0ZSBsaW1pdGVyIGZvciB1cGRhdGUgY2hlY2tzXG4gICAqIEFsbG93cyAxMCBjaGVja3MgcGVyIGhvdXIgd2l0aCAzMCBzZWNvbmQgbWluaW11bSBkZWxheVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZVVwZGF0ZUNoZWNrTGltaXRlcigpOiBSYXRlTGltaXRlciB7XG4gICAgcmV0dXJuIG5ldyBSYXRlTGltaXRlcih7XG4gICAgICBtYXhSZXF1ZXN0czogMTAsXG4gICAgICB3aW5kb3dNczogNjAgKiA2MCAqIDEwMDAsIC8vIDEgaG91clxuICAgICAgbWluRGVsYXlNczogMzAgKiAxMDAwIC8vIDMwIHNlY29uZHMgYmV0d2VlbiBjaGVja3NcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpY3QgcmF0ZSBsaW1pdGVyIGZvciBzZW5zaXRpdmUgb3BlcmF0aW9uc1xuICAgKiBBbGxvd3MgNSByZXF1ZXN0cyBwZXIgaG91ciB3aXRoIDEgbWludXRlIG1pbmltdW0gZGVsYXlcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVTdHJpY3RMaW1pdGVyKCk6IFJhdGVMaW1pdGVyIHtcbiAgICByZXR1cm4gbmV3IFJhdGVMaW1pdGVyKHtcbiAgICAgIG1heFJlcXVlc3RzOiA1LFxuICAgICAgd2luZG93TXM6IDYwICogNjAgKiAxMDAwLCAvLyAxIGhvdXJcbiAgICAgIG1pbkRlbGF5TXM6IDYwICogMTAwMCAvLyAxIG1pbnV0ZSBiZXR3ZWVuIHJlcXVlc3RzXG4gICAgfSk7XG4gIH1cbn0iXX0=