@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
@@ -374,6 +374,18 @@ export class DefaultElementProvider {
374
374
  }
375
375
  };
376
376
  }
377
+ /**
378
+ * Read only the YAML frontmatter metadata from a file (first 4KB)
379
+ *
380
+ * SECURITY NOTE (Issue #1228): This method MUST use validateContent: true when calling
381
+ * SecureYamlParser.parse() to ensure Unicode security validation runs. Setting validateContent
382
+ * to false would disable ALL content validation including zero-width character detection,
383
+ * creating a security bypass vulnerability.
384
+ *
385
+ * @param filePath - Absolute path to the file to read
386
+ * @param retries - Number of retries for transient failures (default: 2)
387
+ * @returns Parsed metadata object or null if no valid frontmatter found
388
+ */
377
389
  async readMetadataOnly(filePath, retries = 2) {
378
390
  // PERFORMANCE: Check cache first before reading file
379
391
  try {
@@ -406,14 +418,19 @@ export class DefaultElementProvider {
406
418
  }
407
419
  // Parse the YAML frontmatter safely
408
420
  try {
409
- // SECURITY FIX: Replace direct YAML parsing function with SecureYamlParser for enhanced security
421
+ // SECURITY FIX (Issue #1228): Enable validateContent to block zero-width Unicode and other security threats
410
422
  // SecureYamlParser provides additional validation, injection prevention, and content sanitization
411
423
  // It expects full YAML with --- markers, so we reconstruct the frontmatter block
412
- // We disable specific field validation as this is general metadata parsing, not persona-specific
424
+ // We disable field-specific validation as this is general metadata parsing, not persona-specific
425
+ // but we MUST keep validateContent: true to ensure Unicode security validation runs
413
426
  const fullYaml = `---\n${match[1]}\n---`;
414
427
  const parseResult = SecureYamlParser.parse(fullYaml, {
415
- validateContent: false,
416
- validateFields: false
428
+ // REQUIRED: validateContent must be true to enable Unicode security validation including
429
+ // zero-width character detection (U+200B-U+200F, U+FEFF, etc.). Setting this to false
430
+ // would disable ALL content validation, creating a security bypass for Unicode-based attacks.
431
+ // See UnicodeValidator.normalize() for detection logic.
432
+ validateContent: true,
433
+ validateFields: false // Field-specific validation is optional for general metadata parsing
417
434
  });
418
435
  const metadata = parseResult.data;
419
436
  // PERFORMANCE: Cache the metadata with file stats for future reads
@@ -529,7 +546,7 @@ export class DefaultElementProvider {
529
546
  notInTestDir: (() => {
530
547
  const cwd = process.cwd().toLowerCase();
531
548
  // Normalize path separators for cross-platform checking (Windows uses \ but checks use /)
532
- const normalizedCwd = cwd.replace(/\\/g, '/');
549
+ const normalizedCwd = cwd.replaceAll('\\', '/');
533
550
  return !normalizedCwd.includes('/test') &&
534
551
  !normalizedCwd.includes('/__tests__') &&
535
552
  !normalizedCwd.includes('/temp') &&
@@ -875,4 +892,4 @@ export class DefaultElementProvider {
875
892
  }
876
893
  }
877
894
  }
878
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVsZW1lbnRQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vRGVmYXVsdEVsZW1lbnRQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRW5FLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsTUFBTTtJQUNyQixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsZ0NBQWdDO0lBQ2pFLGtCQUFrQixFQUFFLFFBQVE7SUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxzQ0FBc0M7Q0FDcEQsQ0FBQztBQUVYLDZCQUE2QjtBQUM3QixzRUFBc0U7QUFDdEUsTUFBTSxtQkFBbUIsR0FBRyxD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QixDQUFDLENBQUM7WUFDdkYsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixNQUFNLENBQUMsSUFBSSxDQUNULGtFQUFrRSxXQUFXLHFCQUFxQixFQUNsRztnQkFDRSxnQkFBZ0I7Z0JBQ2hCLE9BQU87Z0JBQ1AsU0FBUyxFQUFFLFlBQVk7YUFDeEIsQ0FDRixDQUFDO1lBRUYsK0NBQStDO1lBQy9DLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHFCQUFxQjtnQkFDM0IsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLDBDQUEwQztnQkFDbEQsT0FBTyxFQUFFLHlDQUF5QyxXQUFXLG1CQUFtQjtnQkFDaEYsUUFBUSxFQUFFO29CQUNSLGdCQUFnQjtvQkFDaEIsT0FBTztvQkFDUCxZQUFZO2lCQUNiO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsSUFBSSxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDdkcsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZmF1bHRFbGVtZW50UHJvdmlkZXIgLSBQb3B1bGF0ZXMgcG9ydGZvbGlvIHdpdGggZGVmYXVsdCBlbGVtZW50cyBmcm9tIGJ1bmRsZWQgZGF0YVxuICogXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMgY29weWluZyBkZWZhdWx0IHBlcnNvbmFzLCBza2lsbHMsIHRlbXBsYXRlcywgYW5kIG90aGVyIGVsZW1lbnRzXG4gKiBmcm9tIHRoZSBOUE0gcGFja2FnZSBvciBHaXQgcmVwb3NpdG9yeSB0byB0aGUgdXNlcidzIHBvcnRmb2xpbyBvbiBmaXJzdCBydW4uXG4gKiBJdCBlbnN1cmVzIHVzZXJzIGhhdmUgZXhhbXBsZSBjb250ZW50IHRvIHdvcmsgd2l0aCBpbW1lZGlhdGVseSBhZnRlciBpbnN0YWxsYXRpb24uXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgZnNTeW5jIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuXG4vLyBGaWxlIG9wZXJhdGlvbiBjb25zdGFudHNcbmV4cG9ydCBjb25zdCBGSUxFX0NPTlNUQU5UUyA9IHtcbiAgRUxFTUVOVF9FWFRFTlNJT046ICcubWQnLFxuICBZQU1MX0VYVEVOU0lPTjogJy55YW1sJyxcbiAgWU1MX0VYVEVOU0lPTjogJy55bWwnLFxuICBKU09OX0VYVEVOU0lPTjogJy5qc29uJyxcbiAgTUFYX0ZJTEVfU0laRTogMTAgKiAxMDI0ICogMTAyNCwgLy8gMTBNQiBtYXggZmlsZSBzaXplIGZvciBzYWZldHlcbiAgQ0hFQ0tTVU1fQUxHT1JJVEhNOiAnc2hhMjU2JyxcbiAgRklMRV9QRVJNSVNTSU9OUzogMG82NDQsXG4gIENIVU5LX1NJWkU6IDY0ICogMTAyNCAvLyA2NEtCIGNodW5rcyBmb3IgcmVhZGluZyBsYXJnZSBmaWxlc1xufSBhcyBjb25zdDtcblxuLy8gRGV2ZWxvcG1lbnQgbW9kZSBkZXRlY3Rpb25cbi8vIFdoZW4gcnVubmluZyBmcm9tIGEgZ2l0IGNsb25lLCB3ZSBkb24ndCB3YW50IHRvIGF1dG8tbG9hZCB0ZXN0IGRhdGFcbmNvbnN0IElTX0RFVkVMT1BNRU5UX01PREUgPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGEgZ2l0IHJlcG9zaXRvcnkgKGRldmVsb3BtZW50IG1vZGUpXG4gICAgY29uc3QgZ2l0RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuZ2l0Jyk7XG4gICAgcmV0dXJuIGZzU3luYy5leGlzdHNTeW5jKGdpdERpcik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSkoKTtcblxuLy8gSW50ZXJuYWwgY29uc3RhbnRzXG5jb25zdCBEQVRBX0RJUl9DQUNIRV9LRVkgPSAnZG9sbGhvdXNlX2RhdGFfZGlyJztcbmNvbnN0IENPUFlfUkVUUllfQVRURU1QVFMgPSAzO1xuY29uc3QgQ09QWV9SRVRSWV9ERUxBWSA9IDEwMDsgLy8gbXNcblxuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29uZmlnIHtcbiAgLyoqIEN1c3RvbSBkYXRhIGRpcmVjdG9yeSBwYXRocyB0byBzZWFyY2ggKGNoZWNrZWQgYmVmb3JlIGRlZmF1bHQgcGF0aHMpICovXG4gIGN1c3RvbURhdGFQYXRocz86IHN0cmluZ1tdO1xuICAvKiogV2hldGhlciB0byB1c2UgZGVmYXVsdCBzZWFyY2ggcGF0aHMgYWZ0ZXIgY3VzdG9tIHBhdGhzICovXG4gIHVzZURlZmF1bHRQYXRocz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRvIGxvYWQgdGVzdC9leGFtcGxlIGRhdGEgZnJvbSByZXBvc2l0b3J5IChkZWZhdWx0OiBmYWxzZSBpbiBkZXYgbW9kZSkgKi9cbiAgbG9hZFRlc3REYXRhPzogYm9vbGVhbjtcbn1cblxuLy8gUEVSRk9STUFOQ0U6IE1ldGFkYXRhIGNhY2hlIHdpdGggbXRpbWUtYmFzZWQgaW52YWxpZGF0aW9uXG5pbnRlcmZhY2UgTWV0YWRhdGFDYWNoZUVudHJ5IHtcbiAgbWV0YWRhdGE6IGFueTtcbiAgbXRpbWU6IG51bWJlcjtcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdEVsZW1lbnRQcm92aWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX19kaXJuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdGljIGNhY2hlZERhdGFEaXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyBwb3B1bGF0ZUluUHJvZ3Jlc3M6IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogRGVmYXVsdEVsZW1lbnRQcm92aWRlckNvbmZpZztcbiAgXG4gIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTjogQ2FjaGUgbWV0YWRhdGEgd2l0aCBmaWxlIG10aW1lIGZvciBpbnZhbGlkYXRpb25cbiAgcHJpdmF0ZSBzdGF0aWMgbWV0YWRhdGFDYWNoZTogTWFwPHN0cmluZywgTWV0YWRhdGFDYWNoZUVudHJ5PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0NBQ0hFX1NJWkUgPSAyMDsgLy8gTUVNT1JZIExFQUsgRklYOiBGdXJ0aGVyIHJlZHVjZWQgY2FjaGUgc2l6ZSB0byBwcmV2ZW50IGFjY3VtdWxhdGlvbiBkdXJpbmcgcGVyZm9ybWFuY2UgdGVzdHNcbiAgXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IERlZmF1bHRFbGVtZW50UHJvdmlkZXJDb25maWcpIHtcbiAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgIHRoaXMuX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuICAgIFxuICAgIC8vIENoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciB0ZXN0IGRhdGEgbG9hZGluZ1xuICAgIGNvbnN0IGVudkxvYWRUZXN0RGF0YSA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9MT0FEX1RFU1RfREFUQTtcbiAgICBjb25zdCBsb2FkVGVzdERhdGFGcm9tRW52ID0gZW52TG9hZFRlc3REYXRhID09PSAndHJ1ZScgfHwgZW52TG9hZFRlc3REYXRhID09PSAnMSc7XG4gICAgY29uc3QgZGlzYWJsZVRlc3REYXRhRnJvbUVudiA9IGVudkxvYWRUZXN0RGF0YSA9PT0gJ2ZhbHNlJyB8fCBlbnZMb2FkVGVzdERhdGEgPT09ICcwJztcbiAgICBcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBkZXZlbG9wbWVudCBtb2RlICh3aXRoIHJlc3BlY3QgdG8gRk9SQ0VfUFJPRFVDVElPTl9NT0RFIG92ZXJyaWRlKVxuICAgIGNvbnN0IGlzRGV2TW9kZSA9ICgoKSA9PiB7XG4gICAgICAvLyBSZXNwZWN0IEZPUkNFX1BST0RVQ1RJT05fTU9ERSBvdmVycmlkZSBmaXJzdFxuICAgICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm9yY2UgcHJvZHVjdGlvbiBtb2RlXG4gICAgICB9XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuRk9SQ0VfUFJPRFVDVElPTl9NT0RFID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBGb3JjZSBkZXZlbG9wbWVudCBtb2RlXG4gICAgICB9XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gZ2l0IGRldGVjdGlvblxuICAgICAgcmV0dXJuIElTX0RFVkVMT1BNRU5UX01PREU7XG4gICAgfSkoKTtcbiAgICBcbiAgICAvLyBEZXRlcm1pbmUgbG9hZFRlc3REYXRhIHZhbHVlXG4gICAgbGV0IGNvbXB1dGVkTG9hZFRlc3REYXRhOiBib29sZWFuO1xuICAgIGlmIChsb2FkVGVzdERhdGFGcm9tRW52KSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCBleHBsaWNpdGx5IGVuYWJsZXMgdGVzdCBkYXRhXG4gICAgICBjb21wdXRlZExvYWRUZXN0RGF0YSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkaXNhYmxlVGVzdERhdGFGcm9tRW52KSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCBleHBsaWNpdGx5IGRpc2FibGVzIHRlc3QgZGF0YVxuICAgICAgY29tcHV0ZWRMb2FkVGVzdERhdGEgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCBsb2dpYzogZW5hYmxlIGluIHByb2R1Y3Rpb24sIGRpc2FibGUgaW4gZGV2ZWxvcG1lbnQgdW5sZXNzIGNvbmZpZyBvdmVycmlkZXNcbiAgICAgIGNvbXB1dGVkTG9hZFRlc3REYXRhID0gIWlzRGV2TW9kZSAmJiAoY29uZmlnPy5sb2FkVGVzdERhdGEgPz8gdHJ1ZSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgdXNlRGVmYXVsdFBhdGhzOiB0cnVlLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgLy8gQXBwbHkgZmluYWwgbG9hZFRlc3REYXRhIGxvZ2ljIC0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBkZXZlbG9wbWVudCBtb2RlIHRha2UgcHJlY2VkZW5jZVxuICAgICAgbG9hZFRlc3REYXRhOiBsb2FkVGVzdERhdGFGcm9tRW52ID8gdHJ1ZSA6IGRpc2FibGVUZXN0RGF0YUZyb21FbnYgPyBmYWxzZSA6IGNvbXB1dGVkTG9hZFRlc3REYXRhXG4gICAgfTtcbiAgICBcbiAgICBpZiAoaXNEZXZNb2RlICYmICF0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRGV2ZWxvcG1lbnQgbW9kZSBkZXRlY3RlZCAtIHRlc3QgZGF0YSBsb2FkaW5nIGRpc2FibGVkJyk7XG4gICAgICBsb2dnZXIuaW5mbygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFRvIGVuYWJsZSB0ZXN0IGRhdGEsIHNldCBET0xMSE9VU0VfTE9BRF9URVNUX0RBVEE9dHJ1ZScpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBsb2FkVGVzdERhdGEgY29uZmlndXJhdGlvbiB2YWx1ZVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRlc3QgZGF0YSBsb2FkaW5nIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNUZXN0RGF0YUxvYWRpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEgPz8gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGUgc3lzdGVtIGlzIGluIGRldmVsb3BtZW50IG1vZGVcbiAgICogQHJldHVybnMgV2hldGhlciBydW5uaW5nIGluIGRldmVsb3BtZW50IG1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEZXZlbG9wbWVudE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIElTX0RFVkVMT1BNRU5UX01PREU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggcGF0aHMgZm9yIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnlcbiAgICogT3JkZXJlZCBieSBwcmlvcml0eSAtIGN1c3RvbSBwYXRocyBmaXJzdCwgdGhlbiBkZXZlbG9wbWVudC9naXQsIHRoZW4gTlBNIGxvY2F0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZGF0YVNlYXJjaFBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICAvLyBBZGQgY3VzdG9tIHBhdGhzIGZpcnN0IChoaWdoZXN0IHByaW9yaXR5KVxuICAgIGlmICh0aGlzLmNvbmZpZy5jdXN0b21EYXRhUGF0aHMpIHtcbiAgICAgIHBhdGhzLnB1c2goLi4udGhpcy5jb25maWcuY3VzdG9tRGF0YVBhdGhzKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIGRlZmF1bHQgcGF0aHMgaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmNvbmZpZy51c2VEZWZhdWx0UGF0aHMgIT09IGZhbHNlKSB7XG4gICAgICAvLyBTa2lwIGRldmVsb3BtZW50L3JlcG9zaXRvcnkgZGF0YSBwYXRocyB1bmxlc3MgdGVzdCBkYXRhIGxvYWRpbmcgaXMgZW5hYmxlZFxuICAgICAgaWYgKHRoaXMuY29uZmlnLmxvYWRUZXN0RGF0YSkge1xuICAgICAgICAvLyBEZXZlbG9wbWVudC9HaXQgaW5zdGFsbGF0aW9uIChyZWxhdGl2ZSB0byB0aGlzIGZpbGUpXG4gICAgICAgIHBhdGhzLnB1c2goXG4gICAgICAgICAgcGF0aC5qb2luKHRoaXMuX19kaXJuYW1lLCAnLi4vLi4vZGF0YScpLFxuICAgICAgICAgIHBhdGguam9pbih0aGlzLl9fZGlybmFtZSwgJy4uLy4uLy4uL2RhdGEnKSxcbiAgICAgICAgICAvLyBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChsYXN0IHJlc29ydClcbiAgICAgICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2RhdGEnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBBbHdheXMgaW5jbHVkZSBOUE0gaW5zdGFsbGF0aW9uIHBhdGhzICh0aGVzZSB3b3VsZCBoYXZlIHByb2R1Y3Rpb24gZGF0YSlcbiAgICAgIHBhdGhzLnB1c2goXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gbWFjT1MgSG9tZWJyZXdcbiAgICAgICAgJy9vcHQvaG9tZWJyZXcvbGliL25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIvZGF0YScsXG4gICAgICAgIFxuICAgICAgICAvLyBOUE0gaW5zdGFsbGF0aW9ucyAtIHN0YW5kYXJkIFVuaXgvTGludXhcbiAgICAgICAgJy91c3IvbG9jYWwvbGliL25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIvZGF0YScsXG4gICAgICAgICcvdXNyL2xpYi9ub2RlX21vZHVsZXMvQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyL2RhdGEnLFxuICAgICAgICBcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBXaW5kb3dzXG4gICAgICAgICdDOlxcXFxQcm9ncmFtIEZpbGVzXFxcXG5vZGVqc1xcXFxub2RlX21vZHVsZXNcXFxcQGRvbGxob3VzZW1jcFxcXFxtY3Atc2VydmVyXFxcXGRhdGEnLFxuICAgICAgICAnQzpcXFxcUHJvZ3JhbSBGaWxlcyAoeDg2KVxcXFxub2RlanNcXFxcbm9kZV9tb2R1bGVzXFxcXEBkb2xsaG91c2VtY3BcXFxcbWNwLXNlcnZlclxcXFxkYXRhJyxcbiAgICAgICAgXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gV2luZG93cyB3aXRoIG52bVxuICAgICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5lbnYuQVBQREFUQSB8fCAnJywgJ25wbScsICdub2RlX21vZHVsZXMnLCAnQGRvbGxob3VzZW1jcCcsICdtY3Atc2VydmVyJywgJ2RhdGEnKVxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHBhdGhzO1xuICB9XG4gIFxuICAvKipcbiAgICogRmluZCB0aGUgYnVuZGxlZCBkYXRhIGRpcmVjdG9yeSBieSBjaGVja2luZyBlYWNoIHNlYXJjaCBwYXRoXG4gICAqIFVzZXMgUHJvbWlzZS5hbGxTZXR0bGVkIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIGNhY2hlcyB0aGUgcmVzdWx0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmREYXRhRGlyZWN0b3J5KCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIC8vIFJldHVybiBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlXG4gICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2FjaGVkRGF0YURpciAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2FjaGVkRGF0YURpcjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgYWxsIHBhdGhzIGluIHBhcmFsbGVsIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICBjb25zdCBjaGVja1Byb21pc2VzID0gdGhpcy5kYXRhU2VhcmNoUGF0aHMubWFwKGFzeW5jIChzZWFyY2hQYXRoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoc2VhcmNoUGF0aCk7XG4gICAgICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgLy8gVmVyaWZ5IGl0IGNvbnRhaW5zIGV4cGVjdGVkIHN1YmRpcmVjdG9yaWVzXG4gICAgICAgICAgY29uc3QgaGFzUGVyc29uYXMgPSBhd2FpdCB0aGlzLmRpcmVjdG9yeUV4aXN0cyhwYXRoLmpvaW4oc2VhcmNoUGF0aCwgJ3BlcnNvbmFzJykpO1xuICAgICAgICAgIGNvbnN0IGhhc1NraWxscyA9IGF3YWl0IHRoaXMuZGlyZWN0b3J5RXhpc3RzKHBhdGguam9pbihzZWFyY2hQYXRoLCAnc2tpbGxzJykpO1xuICAgICAgICAgIGlmIChoYXNQZXJzb25hcyB8fCBoYXNTa2lsbHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWFyY2hQYXRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgYWNjZXNzZWRcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNoZWNrUHJvbWlzZXMpO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgcmVzdWx0XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHJlc3VsdC52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEZvdW5kIGRhdGEgZGlyZWN0b3J5IGF0OiAke3Jlc3VsdC52YWx1ZX1gKTtcbiAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXIgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci53YXJuKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTm8gYnVuZGxlZCBkYXRhIGRpcmVjdG9yeSBmb3VuZCBpbiBhbnkgc2VhcmNoIHBhdGgnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhlbHBlciB0byBjaGVjayBpZiBhIGRpcmVjdG9yeSBleGlzdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlyZWN0b3J5RXhpc3RzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZGlyUGF0aCk7XG4gICAgICByZXR1cm4gc3RhdHMuaXNEaXJlY3RvcnkoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZmlsZSBwYXRoIHRvIHByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiBTRUNVUklUWSBGSVg6IEFkZGVkIGZpbGUgcGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGlyZWN0b3J5IHRyYXZlcnNhbFxuICAgKiBQcmV2aW91c2x5OiBGaWxlIHBhdGhzIHdlcmUgdXNlZCB3aXRob3V0IHZhbGlkYXRpb24sIGFsbG93aW5nIHBvdGVudGlhbCAuLi8uLi8uLi8gYXR0YWNrc1xuICAgKiBOb3c6IFN0cmljdCB2YWxpZGF0aW9uIGVuc3VyZXMgcGF0aHMgc3RheSB3aXRoaW4gYWxsb3dlZCBkaXJlY3Rvcmllc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggVGhlIGZpbGUgcGF0aCB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gYWxsb3dlZEJhc2VQYXRocyBBcnJheSBvZiBhbGxvd2VkIGJhc2UgcGF0aHMgKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHBhdGggaXMgc2FmZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZywgYWxsb3dlZEJhc2VQYXRocz86IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBOb3JtYWxpemUgcGF0aCB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRlbXB0c1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZOiBSZWplY3QgcGF0aHMgY29udGFpbmluZyB0cmF2ZXJzYWwgcGF0dGVybnNcbiAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFBhdGggdHJhdmVyc2FsIGF0dGVtcHQgYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogQ2hlY2sgZm9yIGhvbWUgZGlyZWN0b3J5IGV4cGFuc2lvbiBhdHRlbXB0cywgYnV0IGFsbG93IFdpbmRvd3MgOC4zIHNob3J0IHBhdGggbmFtZXNcbiAgICAgIC8vIFdpbmRvd3Mgc2hvcnQgcGF0aCBuYW1lcyB1c2UgfiBmb2xsb3dlZCBieSBhIGRpZ2l0IChlLmcuLCBSVU5ORVJ+MSksIHdoaWNoIHNob3VsZCBiZSBhbGxvd2VkXG4gICAgICAvLyBPbmx5IGJsb2NrIH4gZm9sbG93ZWQgYnkgLyBvciBcXCAoaG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uIHBhdHRlcm5zKVxuICAgICAgaWYgKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCd+LycpIHx8IG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCd+XFxcXCcpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gSG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uIGF0dGVtcHQgYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogUmVqZWN0IGFic29sdXRlIHBhdGhzIG91dHNpZGUgYWxsb3dlZCBkaXJlY3Rvcmllc1xuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShub3JtYWxpemVkUGF0aCkgJiYgYWxsb3dlZEJhc2VQYXRocykge1xuICAgICAgICBjb25zdCBpc0FsbG93ZWQgPSBhbGxvd2VkQmFzZVBhdGhzLnNvbWUoYmFzZVBhdGggPT4ge1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRCYXNlID0gcGF0aC5ub3JtYWxpemUoYmFzZVBhdGgpO1xuICAgICAgICAgIHJldHVybiBub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRCYXNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWlzQWxsb3dlZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQWJzb2x1dGUgcGF0aCBvdXRzaWRlIGFsbG93ZWQgZGlyZWN0b3JpZXM6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZOiBSZWplY3QgbnVsbCBieXRlcyBhbmQgb3RoZXIgZGFuZ2Vyb3VzIGNoYXJhY3RlcnNcbiAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnXFwwJykgfHwgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJ1xceDAwJykpIHsgLy8gTk9TT05BUiAtIE51bGwgYnl0ZSBkZXRlY3Rpb24gZm9yIHNlY3VyaXR5XG4gICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTnVsbCBieXRlIGluIHBhdGggYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQYXRoIHZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gREVQUkVDQVRFRDogQ29tbWVudGVkIG91dCBmaWxlbmFtZSBwYXR0ZXJuIGRldGVjdGlvbiAtIHJlcGxhY2VkIHdpdGggbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uXG4gIC8qKlxuICAgKiBDYWNoZWQgY29tcGlsZWQgcmVnZXggcGF0dGVybnMgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICovXG4gIC8vIHByaXZhdGUgc3RhdGljIGNvbXBpbGVkVGVzdFBhdHRlcm5zOiBSZWdFeHBbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBHZXQgY29tcGlsZWQgdGVzdCBwYXR0ZXJucyB3aXRoIGNhY2hpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICogQHJldHVybnMgQXJyYXkgb2YgY29tcGlsZWQgcmVnZXggcGF0dGVybnNcbiAgICovXG4gIC8vIHByaXZhdGUgZ2V0Q29tcGlsZWRUZXN0UGF0dGVybnMoKTogUmVnRXhwW10ge1xuICAvLyAgIC8vIFVzZSBjYWNoZWQgcGF0dGVybnMgaWYgYXZhaWxhYmxlXG4gIC8vICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29tcGlsZWRUZXN0UGF0dGVybnMpIHtcbiAgLy8gICAgIHJldHVybiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zO1xuICAvLyAgIH1cbiAgLy8gICBcbiAgLy8gICAvLyBDb21waWxlIGFuZCBjYWNoZSBwYXR0ZXJucyBvbiBmaXJzdCB1c2VcbiAgLy8gICAvLyBDUklUSUNBTCBGSVg6IFJlbW92ZWQgb3Zlcmx5IGJyb2FkIC9edGVzdC0vaSBwYXR0ZXJuIHRoYXQgd2FzIGJsb2NraW5nIGxlZ2l0aW1hdGUgdXNlXG4gIC8vICAgLy8gVXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRlIHBlcnNvbmFzIGxpa2UgXCJ0ZXN0LWRyaXZlbi1kZXZlbG9wZXJcIiBvciBcInRlc3QtYXV0b21hdGlvbi1leHBlcnRcIlxuICAvLyAgIC8vIFdlIG9ubHkgYmxvY2sgc3BlY2lmaWMgdGVzdCBwYXR0ZXJucyB0aGF0IGFyZSBjbGVhcmx5IGZyb20gb3VyIHRlc3Qgc3VpdGVcbiAgLy8gICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zID0gW1xuICAvLyAgICAgL150ZXN0cGVyc29uYS9pLCAgICAgICAgICAgICAgLy8gT3VyIHRlc3Qgc3VpdGUgcGF0dGVyblxuICAvLyAgICAgL155YW1sdGVzdC9pLCAgICAgICAgICAgICAgICAgLy8gU2VjdXJpdHkgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXnlhbWxib21iL2ksICAgICAgICAgICAgICAgICAvLyBTZWN1cml0eSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9ebWVtb3J5LXRlc3QtL2ksICAgICAgICAgICAgIC8vIFBlcmZvcm1hbmNlIHRlc3QgcGF0dGVyblxuICAvLyAgICAgL15wZXJmLXRlc3QtL2ksICAgICAgICAgICAgICAgLy8gUGVyZm9ybWFuY2UgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXnRlc3QtZml4dHVyZS0vaSwgICAgICAgICAgICAvLyBUZXN0IGZpeHR1cmUgcGF0dGVybiAobW9yZSBzcGVjaWZpYylcbiAgLy8gICAgIC9edGVzdC1kYXRhLS9pLCAgICAgICAgICAgICAgIC8vIFRlc3QgZGF0YSBwYXR0ZXJuIChtb3JlIHNwZWNpZmljKVxuICAvLyAgICAgL2Jpbi1zaHxybS1yZnxwd25lZC9pLCAgICAgICAgLy8gTWFsaWNpb3VzIHBhdHRlcm5zXG4gIC8vICAgICAvY29uY3VycmVudC1cXGQrL2ksICAgICAgICAgICAgLy8gQ29uY3VycmVudCB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9sZWdhY3lcXC5tZCQvaSwgICAgICAgICAgICAgICAvLyBMZWdhY3kgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvcGVyZm9ybWFuY2UtdGVzdC9pLCAgICAgICAgICAvLyBQZXJmb3JtYW5jZSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC8tXFxkezEzfS1bYS16MC05XStcXC5tZCQvaSwgICAgLy8gVGltZXN0YW1wLWJhc2VkIHRlc3QgZmlsZXNcbiAgLy8gICAgIC9edW5pdHRlc3QtL2ksICAgICAgICAgICAgICAgIC8vIFVuaXQgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXmludGVncmF0aW9udGVzdC0vaSwgICAgICAgICAvLyBJbnRlZ3JhdGlvbiB0ZXN0IHBhdHRlcm5cbiAgLy8gICBdO1xuICAvLyAgIFxuICAvLyAgIHJldHVybiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZmlsZW5hbWUgbWF0Y2hlcyB0ZXN0IGRhdGEgcGF0dGVybnMgdGhhdCBzaG91bGQgbmV2ZXIgYmUgY29waWVkIHRvIHByb2R1Y3Rpb25cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGlzRG9sbGhvdXNlTUNQVGVzdEVsZW1lbnQoKSBmb3IgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlbmFtZSBtYXRjaGVzIHRlc3QgcGF0dGVybnMgdGhhdCBzaG91bGQgYmUgYmxvY2tlZFxuICAgKi9cbiAgLy8gcHJpdmF0ZSBpc1Rlc3REYXRhUGF0dGVybihmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLmdldENvbXBpbGVkVGVzdFBhdHRlcm5zKCk7XG4gIC8vICAgcmV0dXJuIHBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBwYXR0ZXJuLnRlc3QoZmlsZW5hbWUpKTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBSZWFkIG1ldGFkYXRhIGZyb20gWUFNTCBmcm9udG1hdHRlciBvbmx5IChuZXZlciByZWFkcyBjb250ZW50IGJvZHkpXG4gICAqIFVzZXMgYSBzbWFsbCBidWZmZXIgdG8gc2FmZWx5IGV4dHJhY3Qgb25seSB0aGUgZnJvbnRtYXR0ZXIgYmV0d2VlbiAtLS0gbWFya2Vyc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZSB0byByZWFkIG1ldGFkYXRhIGZyb21cbiAgICogQHJldHVybnMgUGFyc2VkIG1ldGFkYXRhIG9iamVjdCBvciBudWxsIGlmIG5vIGZyb250bWF0dGVyIGZvdW5kXG4gICAqL1xuICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT046IFJldXNhYmxlIGJ1ZmZlciBwb29sIHRvIHJlZHVjZSBhbGxvY2F0aW9uc1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBidWZmZXJQb29sOiBCdWZmZXJbXSA9IFtdO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUE9PTF9TSVpFID0gMjA7IC8vIE1FTU9SWSBMRUFLIEZJWDogUmVkdWNlZCBidWZmZXIgcG9vbCBzaXplIHRvIG1hdGNoIGNhY2hlIHNpemUgZm9yIGNvbnNpc3RlbnQgbWVtb3J5IG1hbmFnZW1lbnRcbiAgcHJpdmF0ZSBzdGF0aWMgYnVmZmVyUG9vbFN0YXRzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAsIGNyZWF0ZWQ6IDAgfTtcbiAgXG4gIHByaXZhdGUgZ2V0QnVmZmVyKCk6IEJ1ZmZlciB7XG4gICAgLy8gUEVSRk9STUFOQ0U6IFRyYWNrIGJ1ZmZlciBwb29sIHVzYWdlIGZvciBvcHRpbWl6YXRpb24gbW9uaXRvcmluZ1xuICAgIGxldCBidWZmZXIgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wucG9wKCk7XG4gICAgaWYgKGJ1ZmZlcikge1xuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuaGl0cysrO1xuICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMubWlzc2VzKys7XG4gICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5jcmVhdGVkKys7XG4gICAgICBidWZmZXIgPSBCdWZmZXIuYWxsb2MoNDA5Nik7XG4gICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDcmVhdGVkIG5ldyBidWZmZXIgKHBvb2wgZW1wdHkpLCB0b3RhbCBjcmVhdGVkOiAke0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLmNyZWF0ZWR9YCk7XG4gICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSByZWxlYXNlQnVmZmVyKGJ1ZmZlcjogQnVmZmVyKTogdm9pZCB7XG4gICAgLy8gQ1JJVElDQUwgRklYOiBBbHdheXMgYXR0ZW1wdCB0byByZXR1cm4gYnVmZmVyIHRvIHBvb2wgZm9yIHJldXNlXG4gICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5sZW5ndGggPCBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9QT09MX1NJWkUpIHtcbiAgICAgIGJ1ZmZlci5maWxsKDApOyAvLyBTRUNVUklUWTogQ2xlYXIgYnVmZmVyIGJlZm9yZSByZXVzZSB0byBwcmV2ZW50IGRhdGEgbGVha2FnZVxuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLnB1c2goYnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUEVSRk9STUFOQ0U6IElmIHBvb2wgaXMgZnVsbCwgY2xlYXIgdGhlIGJ1ZmZlciB0byBoZWxwIEdDXG4gICAgICBidWZmZXIuZmlsbCgwKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEJ1ZmZlciBwb29sIGZ1bGwsIGRpc2NhcmRpbmcgYnVmZmVyJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIGJ1ZmZlciBwb29sIGFuZCBjYWNoZSB0byBmcmVlIG1lbW9yeVxuICAgKiBQRVJGT1JNQU5DRSBGSVg6IEFkZGVkIGNsZWFudXAgbWV0aG9kIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgYXBwbGljYXRpb24gc2h1dGRvd24gb3IgcGVyaW9kaWMgY2xlYW51cFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbGVhbnVwKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGJ1ZmZlciBwb29sXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLmxlbmd0aCA9IDA7XG4gICAgXG4gICAgLy8gQ2xlYXIgbWV0YWRhdGEgY2FjaGVcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuY2xlYXIoKTtcbiAgICBcbiAgICAvLyBDbGVhciBjYWNoZWQgZGF0YSBkaXJlY3RvcnlcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXIgPSBudWxsO1xuICAgIFxuICAgIC8vIENsZWFyIHBvcHVsYXRpb24gcHJvbWlzZXNcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBvcHVsYXRlSW5Qcm9ncmVzcy5jbGVhcigpO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTWVtb3J5IGNsZWFudXAgY29tcGxldGVkJywge1xuICAgICAgYnVmZmVyU3RhdHM6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLFxuICAgICAgY2FjaGVDbGVhcmVkOiB0cnVlXG4gICAgfSk7XG4gICAgXG4gICAgLy8gUmVzZXQgc3RhdHNcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cyA9IHsgaGl0czogMCwgbWlzc2VzOiAwLCBjcmVhdGVkOiAwIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlcmZvcm1hbmNlIHN0YXRpc3RpY3MgZm9yIG1vbml0b3JpbmdcbiAgICogUEVSRk9STUFOQ0UgTU9OSVRPUklORzogQWRkZWQgc3RhdGlzdGljcyBtZXRob2QgZm9yIHBlcmZvcm1hbmNlIHRyYWNraW5nXG4gICAqIFRoaXMgcHJvdmlkZXMgaW5zaWdodHMgaW50byBidWZmZXIgcG9vbCBlZmZpY2llbmN5IGFuZCBjYWNoZSBwZXJmb3JtYW5jZVxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFBlcmZvcm1hbmNlU3RhdHMoKToge1xuICAgIGJ1ZmZlclBvb2w6IHtcbiAgICAgIGhpdHM6IG51bWJlcjtcbiAgICAgIG1pc3NlczogbnVtYmVyOyBcbiAgICAgIGNyZWF0ZWQ6IG51bWJlcjtcbiAgICAgIGhpdFJhdGU6IG51bWJlcjtcbiAgICAgIHBvb2xTaXplOiBudW1iZXI7XG4gICAgICBtYXhQb29sU2l6ZTogbnVtYmVyO1xuICAgIH07XG4gICAgbWV0YWRhdGFDYWNoZToge1xuICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgbWF4U2l6ZTogbnVtYmVyO1xuICAgIH07XG4gIH0ge1xuICAgIGNvbnN0IGJ1ZmZlckhpdHMgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5oaXRzO1xuICAgIGNvbnN0IGJ1ZmZlck1pc3NlcyA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLm1pc3NlcztcbiAgICBjb25zdCB0b3RhbFJlcXVlc3RzID0gYnVmZmVySGl0cyArIGJ1ZmZlck1pc3NlcztcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgYnVmZmVyUG9vbDoge1xuICAgICAgICBoaXRzOiBidWZmZXJIaXRzLFxuICAgICAgICBtaXNzZXM6IGJ1ZmZlck1pc3NlcyxcbiAgICAgICAgY3JlYXRlZDogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuY3JlYXRlZCxcbiAgICAgICAgaGl0UmF0ZTogdG90YWxSZXF1ZXN0cyA+IDAgPyBidWZmZXJIaXRzIC8gdG90YWxSZXF1ZXN0cyA6IDAsXG4gICAgICAgIHBvb2xTaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wubGVuZ3RoLFxuICAgICAgICBtYXhQb29sU2l6ZTogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfUE9PTF9TSVpFXG4gICAgICB9LFxuICAgICAgbWV0YWRhdGFDYWNoZToge1xuICAgICAgICBzaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2l6ZSxcbiAgICAgICAgbWF4U2l6ZTogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfQ0FDSEVfU0laRVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRNZXRhZGF0YU9ubHkoZmlsZVBhdGg6IHN0cmluZywgcmV0cmllcyA9IDIpOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgICAvLyBQRVJGT1JNQU5DRTogQ2hlY2sgY2FjaGUgZmlyc3QgYmVmb3JlIHJlYWRpbmcgZmlsZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBmaWxlUGF0aDtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgXG4gICAgICAvLyBSZXR1cm4gY2FjaGVkIG1ldGFkYXRhIGlmIGZpbGUgaGFzbid0IGNoYW5nZWQgXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFVzZSBpbnRlZ2VyIG10aW1lIGNvbXBhcmlzb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgcHJlY2lzaW9uIGlzc3Vlc1xuICAgICAgaWYgKGNhY2hlZCAmJiBNYXRoLmZsb29yKGNhY2hlZC5tdGltZSkgPT09IE1hdGguZmxvb3Ioc3RhdHMubXRpbWVNcykgJiYgY2FjaGVkLnNpemUgPT09IHN0YXRzLnNpemUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ2FjaGUgaGl0IGZvciAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gY2FjaGVkLm1ldGFkYXRhO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBwcm9jZWVkIHdpdGggbm9ybWFsIGZsb3dcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIE9wZW4gZmlsZSBhbmQgcmVhZCBvbmx5IGZpcnN0IDRLQiB0byBhdm9pZCByZWFkaW5nIGRhbmdlcm91cyBjb250ZW50XG4gICAgICBjb25zdCBmZCA9IGF3YWl0IGZzLm9wZW4oZmlsZVBhdGgsICdyJyk7XG4gICAgICAvLyBQRVJGT1JNQU5DRTogVXNlIGJ1ZmZlciBwb29sIGluc3RlYWQgb2YgYWxsb2NhdGluZyBuZXcgYnVmZmVyIGVhY2ggdGltZVxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmQucmVhZChidWZmZXIsIDAsIDQwOTYsIDApO1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBidWZmZXIuc3ViYXJyYXkoMCwgcmVzdWx0LmJ5dGVzUmVhZCkudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyBMb29rIGZvciBZQU1MIGZyb250bWF0dGVyIGJldHdlZW4gLS0tIG1hcmtlcnNcbiAgICAgICAgLy8gU3VwcG9ydCBib3RoIFVuaXggKFxcbikgYW5kIFdpbmRvd3MgKFxcclxcbikgbGluZSBlbmRpbmdzXG4gICAgICAgIGNvbnN0IG1hdGNoID0gaGVhZGVyLm1hdGNoKC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIHJldHVybiBudWxsOyAvLyBObyBmcm9udG1hdHRlciBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQYXJzZSB0aGUgWUFNTCBmcm9udG1hdHRlciBzYWZlbHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTRUNVUklUWSBGSVg6IFJlcGxhY2UgZGlyZWN0IFlBTUwgcGFyc2luZyBmdW5jdGlvbiB3aXRoIFNlY3VyZVlhbWxQYXJzZXIgZm9yIGVuaGFuY2VkIHNlY3VyaXR5XG4gICAgICAgICAgLy8gU2VjdXJlWWFtbFBhcnNlciBwcm92aWRlcyBhZGRpdGlvbmFsIHZhbGlkYXRpb24sIGluamVjdGlvbiBwcmV2ZW50aW9uLCBhbmQgY29udGVudCBzYW5pdGl6YXRpb25cbiAgICAgICAgICAvLyBJdCBleHBlY3RzIGZ1bGwgWUFNTCB3aXRoIC0tLSBtYXJrZXJzLCBzbyB3ZSByZWNvbnN0cnVjdCB0aGUgZnJvbnRtYXR0ZXIgYmxvY2tcbiAgICAgICAgICAvLyBXZSBkaXNhYmxlIHNwZWNpZmljIGZpZWxkIHZhbGlkYXRpb24gYXMgdGhpcyBpcyBnZW5lcmFsIG1ldGFkYXRhIHBhcnNpbmcsIG5vdCBwZXJzb25hLXNwZWNpZmljXG4gICAgICAgICAgY29uc3QgZnVsbFlhbWwgPSBgLS0tXFxuJHttYXRjaFsxXX1cXG4tLS1gO1xuICAgICAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShmdWxsWWFtbCwgeyBcbiAgICAgICAgICAgIHZhbGlkYXRlQ29udGVudDogZmFsc2UsIFxuICAgICAgICAgICAgdmFsaWRhdGVGaWVsZHM6IGZhbHNlIFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyc2VSZXN1bHQuZGF0YTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBQRVJGT1JNQU5DRTogQ2FjaGUgdGhlIG1ldGFkYXRhIHdpdGggZmlsZSBzdGF0cyBmb3IgZnV0dXJlIHJlYWRzXG4gICAgICAgICAgaWYgKHR5cGVvZiBtZXRhZGF0YSA9PT0gJ29iamVjdCcgJiYgbWV0YWRhdGEgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gICAgICAgICAgICAgIGNvbnN0IGNhY2hlRW50cnk6IE1ldGFkYXRhQ2FjaGVFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBtdGltZTogc3RhdHMubXRpbWVNcyxcbiAgICAgICAgICAgICAgICBzaXplOiBzdGF0cy5zaXplXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBDUklUSUNBTCBNRU1PUlkgTEVBSyBGSVg6IE1vcmUgYWdncmVzc2l2ZSBjYWNoZSBtYW5hZ2VtZW50IHRvIHByZXZlbnQgdW5ib3VuZGVkIGdyb3d0aFxuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGVudHJ5IGFscmVhZHkgZXhpc3RzIGFuZCBqdXN0IHVwZGF0ZSBpdCBpbnN0ZWFkIG9mIGFkZGluZyBuZXdcbiAgICAgICAgICAgICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGV4aXN0aW5nIGVudHJ5IC0gbm8gZXZpY3Rpb24gbmVlZGVkXG4gICAgICAgICAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNldChmaWxlUGF0aCwgY2FjaGVFbnRyeSk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gVXBkYXRlZCBleGlzdGluZyBjYWNoZSBlbnRyeSBmb3IgJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBOZXcgZW50cnkgLSBjaGVjayBpZiB3ZSBuZWVkIHRvIGV2aWN0IGZpcnN0XG4gICAgICAgICAgICAgICAgLy8gVXNlID4gaW5zdGVhZCBvZiA+PSB0byBlbnN1cmUgd2UgbmV2ZXIgZXhjZWVkIE1BWF9DQUNIRV9TSVpFXG4gICAgICAgICAgICAgICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zaXplID49IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuTUFYX0NBQ0hFX1NJWkUpIHtcbiAgICAgICAgICAgICAgICAgIC8vIE1vcmUgYWdncmVzc2l2ZSBldmljdGlvbjogcmVtb3ZlIGVub3VnaCBlbnRyaWVzIHRvIHN0YXkgd2VsbCB1bmRlciBsaW1pdFxuICAgICAgICAgICAgICAgICAgY29uc3QgZW50cmllc1RvRXZpY3QgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuTUFYX0NBQ0hFX1NJWkUgKiAwLjQpKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGtleXNUb0V2aWN0ID0gQXJyYXkuZnJvbShEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUua2V5cygpKS5zbGljZSgwLCBlbnRyaWVzVG9FdmljdCk7XG4gICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzVG9FdmljdCkge1xuICAgICAgICAgICAgICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFdmljdGVkICR7a2V5c1RvRXZpY3QubGVuZ3RofSBjYWNoZSBlbnRyaWVzIHRvIG1hbmFnZSBtZW1vcnkgKGNhY2hlIHNpemUgd2FzICR7RGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNpemUgKyBrZXlzVG9FdmljdC5sZW5ndGh9KWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2V0KGZpbGVQYXRoLCBjYWNoZUVudHJ5KTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBBZGRlZCBuZXcgY2FjaGUgZW50cnkgZm9yICR7ZmlsZVBhdGh9IChjYWNoZSBzaXplIG5vdzogJHtEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2l6ZX0pYCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAvLyBJZ25vcmUgY2FjaGUgZXJyb3JzLCByZXR1cm4gbWV0YWRhdGEgYW55d2F5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGNhdGNoICh5YW1sRXJyb3IpIHtcbiAgICAgICAgICAvLyBJbnZhbGlkIFlBTUwsIHJldHVybiBudWxsXG4gICAgICAgICAgLy8gRU5IQU5DRU1FTlQ6IEluY2x1ZGUgZXJyb3IgdHlwZSBmb3IgYmV0dGVyIGRlYnVnZ2luZ1xuICAgICAgICAgIGNvbnN0IHlhbWxFcnJvclR5cGUgPSAoeWFtbEVycm9yIGFzIGFueSk/LmNvbnN0cnVjdG9yPy5uYW1lIHx8ICdZQU1MRXJyb3InO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEludmFsaWQgWUFNTCBpbiAke2ZpbGVQYXRofTogJHt5YW1sRXJyb3JUeXBlfSAtICR7eWFtbEVycm9yfWApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBDUklUSUNBTCBGSVg6IEVuc3VyZSBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkIGFuZCBidWZmZXIgaXMgcmVsZWFzZWQgaW4gQUxMIHBhdGhzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZmQuY2xvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoY2xvc2VFcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEVycm9yIGNsb3NpbmcgZmlsZSBkZXNjcmlwdG9yIGZvciAke2ZpbGVQYXRofTogJHtjbG9zZUVycm9yfWApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBFUkZPUk1BTkNFOiBSZXR1cm4gYnVmZmVyIHRvIHBvb2wgZm9yIHJldXNlXG4gICAgICAgIHRoaXMucmVsZWFzZUJ1ZmZlcihidWZmZXIpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIEVOSEFOQ0VNRU5UOiBJbmNsdWRlIGVycm9yIHR5cGUgaW4gZGVidWcgbG9ncyBmb3IgYmV0dGVyIGRlYnVnZ2luZ1xuICAgICAgY29uc3QgZXJyb3JUeXBlID0gZXJyb3I/LmNvbnN0cnVjdG9yPy5uYW1lIHx8ICdVbmtub3duRXJyb3InO1xuICAgICAgY29uc3QgZXJyb3JDb2RlID0gZXJyb3I/LmNvZGUgfHwgJ05PX0NPREUnO1xuICAgICAgXG4gICAgICAvLyBSRUxJQUJJTElUWTogQWRkIHJldHJ5IGxvZ2ljIGZvciB0cmFuc2llbnQgZmFpbHVyZXNcbiAgICAgIGlmIChyZXRyaWVzID4gMCAmJiAoZXJyb3JDb2RlID09PSAnRUJVU1knIHx8IGVycm9yQ29kZSA9PT0gJ0VBR0FJTicpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFJldHJ5aW5nIHJlYWQgZm9yICR7ZmlsZVBhdGh9IGFmdGVyICR7ZXJyb3JUeXBlfToke2Vycm9yQ29kZX1gKTtcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7IC8vIEJyaWVmIGRlbGF5IGJlZm9yZSByZXRyeVxuICAgICAgICByZXR1cm4gdGhpcy5yZWFkTWV0YWRhdGFPbmx5KGZpbGVQYXRoLCByZXRyaWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvdWxkIG5vdCByZWFkIG1ldGFkYXRhIGZyb20gJHtmaWxlUGF0aH06ICR7ZXJyb3JUeXBlfToke2Vycm9yQ29kZX0gLSAke2Vycm9yPy5tZXNzYWdlIHx8IGVycm9yfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZmlsZSBpcyBhIERvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgYmFzZWQgb24gbWV0YWRhdGFcbiAgICogVGhpcyByZXBsYWNlcyBmaWxlbmFtZSBwYXR0ZXJuIGRldGVjdGlvbiB3aXRoIGFjY3VyYXRlIG1ldGFkYXRhLWJhc2VkIGRldGVjdGlvblxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGNvbnRhaW5zIF9kb2xsaG91c2VNQ1BUZXN0OiB0cnVlIG1ldGFkYXRhXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGlzRG9sbGhvdXNlTUNQVGVzdEVsZW1lbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucmVhZE1ldGFkYXRhT25seShmaWxlUGF0aCk7XG4gICAgICBjb25zdCBpc1Rlc3QgPSAhIShtZXRhZGF0YSAmJiBtZXRhZGF0YS5fZG9sbGhvdXNlTUNQVGVzdCA9PT0gdHJ1ZSk7XG4gICAgICBcbiAgICAgIFxuICAgICAgcmV0dXJuIGlzVGVzdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgd2UgY2FuJ3QgcmVhZCB0aGUgbWV0YWRhdGEsIGFzc3VtZSBpdCdzIG5vdCBhIHRlc3QgZmlsZVxuICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXJyb3IgY2hlY2tpbmcgdGVzdCBtZXRhZGF0YSBmb3IgJHtmaWxlUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBpZiB3ZSdyZSBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgYnkgY2hlY2tpbmcgZm9yIHByb2R1Y3Rpb24gaW5kaWNhdG9yc1xuICAgKiBVc2VzIGEgY29uZmlkZW5jZS1iYXNlZCBhcHByb2FjaCByZXF1aXJpbmcgbXVsdGlwbGUgaW5kaWNhdG9ycyBmb3IgYmV0dGVyIGFjY3VyYWN5XG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBhcHBlYXJzIHRvIGJlIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudFxuICAgKi9cbiAgcHJpdmF0ZSBpc1Byb2R1Y3Rpb25FbnZpcm9ubWVudCgpOiBib29sZWFuIHtcbiAgICAvLyBBbGxvdyB0ZXN0cyB0byBleHBsaWNpdGx5IG92ZXJyaWRlIHByb2R1Y3Rpb24gbW9kZSBkZXRlY3Rpb25cbiAgICBpZiAocHJvY2Vzcy5lbnYuRk9SQ0VfUFJPRFVDVElPTl9NT0RFID09PSAndHJ1ZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5lbnYuRk9SQ0VfUFJPRFVDVElPTl9NT0RFID09PSAnZmFsc2UnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIFdlaWdodGVkIGluZGljYXRvcnMgZm9yIHByb2R1Y3Rpb24gZGV0ZWN0aW9uXG4gICAgY29uc3QgaW5kaWNhdG9ycyA9IHtcbiAgICAgIC8vIFN0cm9uZyBpbmRpY2F0b3JzICh3ZWlnaHQ6IDIpXG4gICAgICBoYXNVc2VySG9tZURpcjogKHByb2Nlc3MuZW52LkhPTUUgJiYgKHByb2Nlc3MuZW52LkhPTUUuaW5jbHVkZXMoJy9Vc2Vycy8nKSB8fCBwcm9jZXNzLmVudi5IT01FLmluY2x1ZGVzKCcvaG9tZS8nKSkpIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICEhcHJvY2Vzcy5lbnYuVVNFUlBST0ZJTEUsXG4gICAgICBpc1Byb2R1Y3Rpb25Ob2RlOiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nLFxuICAgICAgbm90SW5UZXN0RGlyOiAoKCkgPT4ge1xuICAgICAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBwYXRoIHNlcGFyYXRvcnMgZm9yIGNyb3NzLXBsYXRmb3JtIGNoZWNraW5nIChXaW5kb3dzIHVzZXMgXFwgYnV0IGNoZWNrcyB1c2UgLylcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEN3ZCA9IGN3ZC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIHJldHVybiAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL3Rlc3QnKSAmJiBcbiAgICAgICAgICAgICAgICFub3JtYWxpemVkQ3dkLmluY2x1ZGVzKCcvX190ZXN0c19fJykgJiYgXG4gICAgICAgICAgICAgICAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL3RlbXAnKSAmJlxuICAgICAgICAgICAgICAgIW5vcm1hbGl6ZWRDd2QuaW5jbHVkZXMoJy9kaXN0L3Rlc3QnKTtcbiAgICAgIH0pKCksXG4gICAgICBcbiAgICAgIC8vIE1vZGVyYXRlIGluZGljYXRvcnMgKHdlaWdodDogMSlcbiAgICAgIG5vdEluQ0k6ICFwcm9jZXNzLmVudi5DSSxcbiAgICAgIG5vVGVzdEVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyxcbiAgICAgIG5vRGV2RW52OiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ2RldmVsb3BtZW50JyxcbiAgICB9O1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSB3ZWlnaHRlZCBzY29yZVxuICAgIGxldCBzY29yZSA9IDA7XG4gICAgaWYgKGluZGljYXRvcnMuaGFzVXNlckhvbWVEaXIpIHNjb3JlICs9IDI7XG4gICAgaWYgKGluZGljYXRvcnMuaXNQcm9kdWN0aW9uTm9kZSkgc2NvcmUgKz0gMjtcbiAgICBpZiAoaW5kaWNhdG9ycy5ub3RJblRlc3REaXIpIHNjb3JlICs9IDI7XG4gICAgaWYgKGluZGljYXRvcnMubm90SW5DSSkgc2NvcmUgKz0gMTtcbiAgICBpZiAoaW5kaWNhdG9ycy5ub1Rlc3RFbnYpIHNjb3JlICs9IDE7XG4gICAgaWYgKGluZGljYXRvcnMubm9EZXZFbnYpIHNjb3JlICs9IDE7XG4gICAgXG4gICAgLy8gTG9nIGRldGVjdGlvbiBkZXRhaWxzIGZvciBkZWJ1Z2dpbmdcbiAgICBjb25zdCBhY3RpdmVJbmRpY2F0b3JzID0gT2JqZWN0LmVudHJpZXMoaW5kaWNhdG9ycylcbiAgICAgIC5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlKVxuICAgICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gICAgXG4gICAgLy8gVFlQRVNDUklQVCBGSVg6IFJlbW92ZWQgbG9nZ2VyLmlzRGVidWdFbmFibGVkKCkgY2hlY2sgYXMgdGhpcyBtZXRob2QgZG9lc24ndCBleGlzdCBvbiBNQ1BMb2dnZXJcbiAgICAvLyBUaGUgbG9nZ2VyIGFscmVhZHkgaGFuZGxlcyBkZWJ1ZyBsZXZlbCBpbnRlcm5hbGx5LCBzbyB3ZSBjYW4gY2FsbCBkZWJ1ZygpIGRpcmVjdGx5XG4gICAgaWYgKHNjb3JlID49IDMpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQcm9kdWN0aW9uIGVudmlyb25tZW50IGRldGVjdGVkJyxcbiAgICAgICAgeyBzY29yZSwgYWN0aXZlSW5kaWNhdG9ycywgZm9yY2VNb2RlOiAnbm90IHNldCcgfVxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVxdWlyZSBhIHNjb3JlIG9mIGF0IGxlYXN0IDMgZm9yIHByb2R1Y3Rpb24gZGV0ZWN0aW9uIChtb3JlIGNvbmZpZGVudClcbiAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBpbiBlZGdlIGNhc2VzIHdoaWxlIG1haW50YWluaW5nIHNlY3VyaXR5XG4gICAgcmV0dXJuIHNjb3JlID49IDM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb3B5IGFsbCBmaWxlcyBmcm9tIHNvdXJjZSBkaXJlY3RvcnkgdG8gZGVzdGluYXRpb24gZGlyZWN0b3J5XG4gICAqIFNraXBzIGZpbGVzIHRoYXQgYWxyZWFkeSBleGlzdCB0byBwcmVzZXJ2ZSB1c2VyIG1vZGlmaWNhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29weUVsZW1lbnRGaWxlcyhzb3VyY2VEaXI6IHN0cmluZywgZGVzdERpcjogc3RyaW5nLCBlbGVtZW50VHlwZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgY29waWVkQ291bnQgPSAwO1xuICAgIFxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgZnMubWtkaXIoZGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlYWQgc291cmNlIGRpcmVjdG9yeVxuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHNvdXJjZURpcik7XG4gICAgICBcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIFxuICAgICAgICAvLyBPbmx5IGNvcHkgbWFya2Rvd24gZmlsZXNcbiAgICAgICAgaWYgKCFmaWxlLmVuZHNXaXRoKEZJTEVfQ09OU1RBTlRTLkVMRU1FTlRfRVhURU5TSU9OKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBOb3JtYWxpemUgZmlsZW5hbWUgZm9yIHNlY3VyaXR5XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZmlsZSk7XG4gICAgICAgIGlmICghbm9ybWFsaXplZEZpbGUuaXNWYWxpZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZmlsZSB3aXRoIGludmFsaWQgVW5pY29kZTogJHtmaWxlfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlUGF0aCA9IHBhdGguam9pbihzb3VyY2VEaXIsIG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdERpciwgbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQpO1xuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIC8vIFNFQ1VSSVRZIEZJWDogVmFsaWRhdGUgZmlsZSBwYXRocyB0byBwcmV2ZW50IHBhdGggdHJhdmVyc2FsIGF0dGFja3NcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBtYWxpY2lvdXMgZmlsZXMgZnJvbSBlc2NhcGluZyB0aGUgaW50ZW5kZWQgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgICAgICBjb25zdCBzb3VyY2VWYWxpZCA9IHRoaXMudmFsaWRhdGVGaWxlUGF0aChzb3VyY2VQYXRoLCBbc291cmNlRGlyXSk7XG4gICAgICAgIGNvbnN0IGRlc3RWYWxpZCA9IHRoaXMudmFsaWRhdGVGaWxlUGF0aChkZXN0UGF0aCwgW2Rlc3REaXJdKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghc291cmNlVmFsaWQgfHwgIWRlc3RWYWxpZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBmaWxlIHdpdGggaW52YWxpZCBwYXRoOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICB7IHNvdXJjZVBhdGgsIGRlc3RQYXRoLCBlbGVtZW50VHlwZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUHJvZHVjdGlvbiBzYWZldHkgY2hlY2s6IEJsb2NrIERvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnRzIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzXG4gICAgICAgIC8vIFNraXAgdGhpcyBjaGVjayBpZiBsb2FkVGVzdERhdGEgaXMgZXhwbGljaXRseSBlbmFibGVkIChmb3IgdGVzdGluZyBzY2VuYXJpb3MpXG4gICAgICAgIGlmICghdGhpcy5jb25maWcubG9hZFRlc3REYXRhICYmIHRoaXMuaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQoKSkge1xuICAgICAgICAgIGNvbnN0IGlzRG9sbGhvdXNlVGVzdCA9IGF3YWl0IHRoaXMuaXNEb2xsaG91c2VNQ1BUZXN0RWxlbWVudChzb3VyY2VQYXRoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaXNEb2xsaG91c2VUZXN0KSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTRUNVUklUWTogQmxvY2tpbmcgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBpbiBwcm9kdWN0aW9uOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgZmlsZTogbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgICAgICAgICAgcmVhc29uOiAnRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBkZXRlY3RlZCBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50JyxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGJsb2NrZWQgdGVzdCBkYXRhXG4gICAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdURVNUX0RBVEFfQkxPQ0tFRCcsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb3B5RWxlbWVudEZpbGVzJyxcbiAgICAgICAgICAgICAgZGV0YWlsczogYEJsb2NrZWQgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBpbiBwcm9kdWN0aW9uOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogJ0RvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgZGV0ZWN0ZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgZGV0ZWN0aW9uTWV0aG9kOiAnbWV0YWRhdGEtYmFzZWQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgZGVzdGluYXRpb24gZmlsZSBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgIGF3YWl0IGZzLmFjY2VzcyhkZXN0UGF0aCk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZXhpc3RpbmcgZmlsZTogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBwcm9jZWVkIHdpdGggY29weVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFZhbGlkYXRlIHNvdXJjZSBmaWxlIGJlZm9yZSBjb3B5aW5nXG4gICAgICAgICAgY29uc3Qgc291cmNlU3RhdHMgPSBhd2FpdCBmcy5zdGF0KHNvdXJjZVBhdGgpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIENoZWNrIGZpbGUgc2l6ZSBsaW1pdFxuICAgICAgICAgIGlmIChzb3VyY2VTdGF0cy5zaXplID4gRklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgb3ZlcnNpemVkIGZpbGUgJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH06IGAgK1xuICAgICAgICAgICAgICBgJHtzb3VyY2VTdGF0cy5zaXplfSBieXRlcyAobWF4OiAke0ZJTEVfQ09OU1RBTlRTLk1BWF9GSUxFX1NJWkV9IGJ5dGVzKWAsXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgZmlsZTogbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQsIFxuICAgICAgICAgICAgICAgIHNpemU6IHNvdXJjZVN0YXRzLnNpemUsXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogRklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRSxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDb3B5IHRoZSBmaWxlIHdpdGggdmVyaWZpY2F0aW9uXG4gICAgICAgICAgXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZVdpdGhWZXJpZmljYXRpb24oc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICAgICAgICAgIGNvcGllZENvdW50Kys7XG4gICAgICAgICAgXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29waWVkICR7ZWxlbWVudFR5cGV9OiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWApO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgZWFjaCBmaWxlIGNvcGllZFxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvcHlFbGVtZW50RmlsZXMnLFxuICAgICAgICAgICAgZGV0YWlsczogYENvcGllZCBkZWZhdWx0ICR7ZWxlbWVudFR5cGV9IGZpbGU6ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgIGRlc3RQYXRoLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgZmlsZVNpemU6IChhd2FpdCBmcy5zdGF0KGRlc3RQYXRoKSkuc2l6ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRmFpbGVkIHRvIGNvcHkgJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgZXJyb3I6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICAgICAgICBzb3VyY2VQYXRoLFxuICAgICAgICAgICAgICBkZXN0UGF0aCxcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgZmlsZXMgaW5zdGVhZCBvZiBmYWlsaW5nIGNvbXBsZXRlbHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY29waWVkQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29waWVkICR7Y29waWVkQ291bnR9ICR7ZWxlbWVudFR5cGV9IGZpbGUocylgKTtcbiAgICAgIH1cbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjb3B5aW5nICR7ZWxlbWVudFR5cGV9IGZpbGVzOmAsIGVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGNvcGllZENvdW50O1xuICB9XG4gIFxuICAvKipcbiAgICogQ29weSBhIGZpbGUgd2l0aCBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uXG4gICAqIEVuc3VyZXMgdGhlIGZpbGUgd2FzIGNvcGllZCBjb3JyZWN0bHkgYnkgY29tcGFyaW5nIHNpemVzXG4gICAqL1xuICAvKipcbiAgICogQ2FsY3VsYXRlIGNoZWNrc3VtIG9mIGEgZmlsZSBmb3IgaW50ZWdyaXR5IHZlcmlmaWNhdGlvblxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZVxuICAgKiBAcmV0dXJucyBIZXgtZW5jb2RlZCBjaGVja3N1bVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjYWxjdWxhdGVDaGVja3N1bShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChGSUxFX0NPTlNUQU5UUy5DSEVDS1NVTV9BTEdPUklUSE0pO1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGZzLm9wZW4oZmlsZVBhdGgsICdyJyk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhGSUxFX0NPTlNUQU5UUy5DSFVOS19TSVpFKTtcbiAgICAgIGxldCBieXRlc1JlYWQ6IG51bWJlcjtcbiAgICAgIFxuICAgICAgZG8ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJlYW0ucmVhZChidWZmZXIsIDAsIEZJTEVfQ09OU1RBTlRTLkNIVU5LX1NJWkUpO1xuICAgICAgICBieXRlc1JlYWQgPSByZXN1bHQuYnl0ZXNSZWFkO1xuICAgICAgICBcbiAgICAgICAgaWYgKGJ5dGVzUmVhZCA+IDApIHtcbiAgICAgICAgICBoYXNoLnVwZGF0ZShidWZmZXIuc3ViYXJyYXkoMCwgYnl0ZXNSZWFkKSk7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKGJ5dGVzUmVhZCA+IDApO1xuICAgICAgXG4gICAgICByZXR1cm4gaGFzaC5kaWdlc3QoJ2hleCcpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBzdHJlYW0uY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29weSBmaWxlIHdpdGggaW50ZWdyaXR5IHZlcmlmaWNhdGlvbiBhbmQgcmV0cnkgbG9naWNcbiAgICogQHBhcmFtIHNvdXJjZVBhdGggU291cmNlIGZpbGUgcGF0aFxuICAgKiBAcGFyYW0gZGVzdFBhdGggRGVzdGluYXRpb24gZmlsZSBwYXRoXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgY29weSBmYWlscyBhZnRlciBhbGwgcmV0cnkgYXR0ZW1wdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29weUZpbGVXaXRoVmVyaWZpY2F0aW9uKHNvdXJjZVBhdGg6IHN0cmluZywgZGVzdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gQ09QWV9SRVRSWV9BVFRFTVBUUzsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDb3B5IHRoZSBmaWxlXG4gICAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKHNvdXJjZVBhdGgsIGRlc3RQYXRoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFZlcmlmeSBzaXplIG1hdGNoZXNcbiAgICAgICAgY29uc3QgW3NvdXJjZVN0YXRzLCBkZXN0U3RhdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGZzLnN0YXQoc291cmNlUGF0aCksXG4gICAgICAgICAgZnMuc3RhdChkZXN0UGF0aClcbiAgICAgICAgXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc291cmNlU3RhdHMuc2l6ZSAhPT0gZGVzdFN0YXRzLnNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU2l6ZSBtaXNtYXRjaCBhZnRlciBjb3B5IC0gc291cmNlOiAke3NvdXJjZVN0YXRzLnNpemV9IGJ5dGVzLCBgICtcbiAgICAgICAgICAgIGBkZXN0aW5hdGlvbjogJHtkZXN0U3RhdHMuc2l6ZX0gYnl0ZXNgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gVmVyaWZ5IGNoZWNrc3VtIG1hdGNoZXMgZm9yIGNvbXBsZXRlIGludGVncml0eVxuICAgICAgICBjb25zdCBbc291cmNlQ2hlY2tzdW0sIGRlc3RDaGVja3N1bV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVDaGVja3N1bShzb3VyY2VQYXRoKSxcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNoZWNrc3VtKGRlc3RQYXRoKVxuICAgICAgICBdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChzb3VyY2VDaGVja3N1bSAhPT0gZGVzdENoZWNrc3VtKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENoZWNrc3VtIG1pc21hdGNoIGFmdGVyIGNvcHkgLSBzb3VyY2U6ICR7c291cmNlQ2hlY2tzdW19LCBgICtcbiAgICAgICAgICAgIGBkZXN0aW5hdGlvbjogJHtkZXN0Q2hlY2tzdW19YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFNldCBwcm9wZXIgcGVybWlzc2lvbnNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmcy5jaG1vZChkZXN0UGF0aCwgRklMRV9DT05TVEFOVFMuRklMRV9QRVJNSVNTSU9OUyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3VsZCBub3Qgc2V0IHBlcm1pc3Npb25zIG9uICR7ZGVzdFBhdGh9OiAke2Vycm9yfWAsXG4gICAgICAgICAgICB7IHNvdXJjZVBhdGgsIGRlc3RQYXRoLCBhdHRlbXB0IH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBTdWNjZXNzIC0gZmlsZSBjb3BpZWQgYW5kIHZlcmlmaWVkXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN1Y2Nlc3NmdWxseSBjb3BpZWQgYW5kIHZlcmlmaWVkOiAke3BhdGguYmFzZW5hbWUoc291cmNlUGF0aCl9YCxcbiAgICAgICAgICB7IHNpemU6IHNvdXJjZVN0YXRzLnNpemUsIGNoZWNrc3VtOiBzb3VyY2VDaGVja3N1bS5zdWJzdHJpbmcoMCwgOCkgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgYXMgRXJyb3I7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhbiB1cCBmYWlsZWQgY29weVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLnVubGluayhkZXN0UGF0aCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoYXR0ZW1wdCA8IENPUFlfUkVUUllfQVRURU1QVFMpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvcHkgYXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZCwgcmV0cnlpbmcuLi5gLFxuICAgICAgICAgICAgeyBlcnJvcjogbGFzdEVycm9yLm1lc3NhZ2UsIHNvdXJjZVBhdGgsIGRlc3RQYXRoIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBDT1BZX1JFVFJZX0RFTEFZICogYXR0ZW1wdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFsbCBhdHRlbXB0cyBmYWlsZWRcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGNvcHkgJHtwYXRoLmJhc2VuYW1lKHNvdXJjZVBhdGgpfSBhZnRlciAke0NPUFlfUkVUUllfQVRURU1QVFN9IGF0dGVtcHRzOiBgICtcbiAgICAgIGAke2xhc3RFcnJvcj8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YFxuICAgICk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSB0aGUgcG9ydGZvbGlvIHdpdGggZGVmYXVsdCBlbGVtZW50cyBmcm9tIGJ1bmRsZWQgZGF0YVxuICAgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgcG9ydGZvbGlvIGluaXRpYWxpemF0aW9uIGZvciBuZXcgaW5zdGFsbGF0aW9uc1xuICAgKiBQcm90ZWN0ZWQgYWdhaW5zdCBjb25jdXJyZW50IGNhbGxzIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcG9wdWxhdGVEZWZhdWx0cyhwb3J0Zm9saW9CYXNlRGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBwb3B1bGF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgcG9ydGZvbGlvXG4gICAgY29uc3QgZXhpc3RpbmdQb3B1bGF0aW9uID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wb3B1bGF0ZUluUHJvZ3Jlc3MuZ2V0KHBvcnRmb2xpb0Jhc2VEaXIpO1xuICAgIGlmIChleGlzdGluZ1BvcHVsYXRpb24pIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQb3B1bGF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yIHBvcnRmb2xpbywgd2FpdGluZy4uLicsXG4gICAgICAgIHsgcG9ydGZvbGlvQmFzZURpciB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nUG9wdWxhdGlvbjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIG5ldyBwb3B1bGF0aW9uIHByb21pc2VcbiAgICBjb25zdCBwb3B1bGF0aW9uUHJvbWlzZSA9IHRoaXMucGVyZm9ybVBvcHVsYXRpb24ocG9ydGZvbGlvQmFzZURpcilcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgd2hlbiBkb25lXG4gICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLmRlbGV0ZShwb3J0Zm9saW9CYXNlRGlyKTtcbiAgICAgIH0pO1xuICAgIFxuICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLnNldChwb3J0Zm9saW9CYXNlRGlyLCBwb3B1bGF0aW9uUHJvbWlzZSk7XG4gICAgcmV0dXJuIHBvcHVsYXRpb25Qcm9taXNlO1xuICB9XG4gIFxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHBvcHVsYXRpb24gb2YgZGVmYXVsdCBlbGVtZW50c1xuICAgKiBAcGFyYW0gcG9ydGZvbGlvQmFzZURpciBCYXNlIGRpcmVjdG9yeSBvZiB0aGUgcG9ydGZvbGlvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1Qb3B1bGF0aW9uKHBvcnRmb2xpb0Jhc2VEaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIHRlc3QgZGF0YSBsb2FkaW5nIGlzIGRpc2FibGVkXG4gICAgLy8gTm90ZTogVGhpcyBjaGVjayBpcyBuZWVkZWQgZXZlbiB0aG91Z2ggY29uc3RydWN0b3Igc2V0cyBjb25maWcsIGJlY2F1c2VcbiAgICAvLyBjb25maWcgY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgY29uc3RydWN0aW9uXG4gICAgXG4gICAgLy8gVXNlIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgZGV0ZWN0aW9uIHRoYXQgcmVzcGVjdHMgRk9SQ0VfUFJPRFVDVElPTl9NT0RFXG4gICAgY29uc3QgaXNEZXZlbG9wbWVudE1vZGUgPSAhdGhpcy5pc1Byb2R1Y3Rpb25FbnZpcm9ubWVudCgpO1xuICAgIFxuICAgIGlmIChpc0RldmVsb3BtZW50TW9kZSAmJiAhdGhpcy5jb25maWcubG9hZFRlc3REYXRhKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBkZWZhdWx0IGVsZW1lbnQgcG9wdWxhdGlvbiBpbiBkZXZlbG9wbWVudCBtb2RlJyxcbiAgICAgICAgeyBcbiAgICAgICAgICBwb3J0Zm9saW9CYXNlRGlyLFxuICAgICAgICAgIHJlYXNvbjogJ1Rlc3QgZGF0YSBsb2FkaW5nIGRpc2FibGVkJyxcbiAgICAgICAgICBlbmFibGVXaXRoOiAnU2V0IERPTExIT1VTRV9MT0FEX1RFU1RfREFUQT10cnVlIHRvIGVuYWJsZSdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN0YXJ0aW5nIGRlZmF1bHQgZWxlbWVudCBwb3B1bGF0aW9uJyxcbiAgICAgIHsgcG9ydGZvbGlvQmFzZURpciB9XG4gICAgKTtcbiAgICBcbiAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIHBvcnRmb2xpbyBpbml0aWFsaXphdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdQT1JURk9MSU9fSU5JVElBTElaQVRJT04nLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wZXJmb3JtUG9wdWxhdGlvbicsXG4gICAgICBkZXRhaWxzOiBgU3RhcnRpbmcgZGVmYXVsdCBlbGVtZW50IHBvcHVsYXRpb24gZm9yIHBvcnRmb2xpbzogJHtwb3J0Zm9saW9CYXNlRGlyfWBcbiAgICB9KTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBidW5kbGVkIGRhdGEgZGlyZWN0b3J5XG4gICAgY29uc3QgZGF0YURpciA9IGF3YWl0IHRoaXMuZmluZERhdGFEaXJlY3RvcnkoKTtcbiAgICBpZiAoIWRhdGFEaXIpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnkgZm91bmQgLSBwb3J0Zm9saW8gd2lsbCBzdGFydCBlbXB0eScsXG4gICAgICAgIHsgXG4gICAgICAgICAgc2VhcmNoUGF0aHM6IHRoaXMuZGF0YVNlYXJjaFBhdGhzLnNsaWNlKDAsIDMpLCAvLyBMb2cgZmlyc3QgZmV3IHBhdGhzIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgZGlybmFtZTogdGhpcy5fX2Rpcm5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJhY2sgdG90YWwgZmlsZXMgY29waWVkXG4gICAgbGV0IHRvdGFsQ29waWVkID0gMDtcbiAgICBjb25zdCBjb3BpZWRDb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBcbiAgICAvLyBDb3B5IGVhY2ggZWxlbWVudCB0eXBlIC0gZGlyZWN0b3JpZXMgbm93IG1hdGNoIGVudW0gdmFsdWVzIChhbGwgcGx1cmFsKVxuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZURpciA9IHBhdGguam9pbihkYXRhRGlyLCBlbGVtZW50VHlwZSk7XG4gICAgICBjb25zdCBkZXN0RGlyID0gcGF0aC5qb2luKHBvcnRmb2xpb0Jhc2VEaXIsIGVsZW1lbnRUeXBlKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgc291cmNlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKHNvdXJjZURpcik7XG4gICAgICAgIGNvbnN0IGNvcGllZENvdW50ID0gYXdhaXQgdGhpcy5jb3B5RWxlbWVudEZpbGVzKHNvdXJjZURpciwgZGVzdERpciwgZWxlbWVudFR5cGUpO1xuICAgICAgICBjb3BpZWRDb3VudHNbZWxlbWVudFR5cGVdID0gY29waWVkQ291bnQ7XG4gICAgICAgIHRvdGFsQ29waWVkICs9IGNvcGllZENvdW50O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gU291cmNlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBza2lwXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vICR7ZWxlbWVudFR5cGV9IGRpcmVjdG9yeSBpbiBidW5kbGVkIGRhdGFgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKHRvdGFsQ29waWVkID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU3VjY2Vzc2Z1bGx5IHBvcHVsYXRlZCBwb3J0Zm9saW8gd2l0aCAke3RvdGFsQ29waWVkfSBkZWZhdWx0IGVsZW1lbnQocylgLFxuICAgICAgICB7XG4gICAgICAgICAgcG9ydGZvbGlvQmFzZURpcixcbiAgICAgICAgICBkYXRhRGlyLFxuICAgICAgICAgIGJyZWFrZG93bjogY29waWVkQ291bnRzXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBcbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3Igc3VjY2Vzc2Z1bCBwb3B1bGF0aW9uXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQT1JURk9MSU9fUE9QVUxBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBlcmZvcm1Qb3B1bGF0aW9uJyxcbiAgICAgICAgZGV0YWlsczogYFN1Y2Nlc3NmdWxseSBwb3B1bGF0ZWQgcG9ydGZvbGlvIHdpdGggJHt0b3RhbENvcGllZH0gZGVmYXVsdCBlbGVtZW50c2AsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgcG9ydGZvbGlvQmFzZURpcixcbiAgICAgICAgICBkYXRhRGlyLFxuICAgICAgICAgIGNvcGllZENvdW50c1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBObyBuZXcgZWxlbWVudHMgdG8gY29weSAtIHBvcnRmb2xpbyBtYXkgYWxyZWFkeSBoYXZlIGNvbnRlbnQnKTtcbiAgICB9XG4gIH1cbn0iXX0=
895
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVsZW1lbnRQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vRGVmYXVsdEVsZW1lbnRQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRW5FLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsTUFBTTtJQUNyQixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsZ0NBQWdDO0lBQ2pFLGtCQUFrQixFQUFFLFFBQVE7SUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxzQ0FBc0M7Q0FDcEQsQ0FBQztBQUVYLDZCQUE2QjtBQUM3QixzRUFBc0U7QUFDdEUsTUFBTSxtQkFBbUIsR0FBRyxD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QUFXLENBQUM7WUFDN0IsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsdUNBQXVDO2dCQUN2QyxNQUFNLENBQUMsS0FBSyxDQUFDLCtCQUErQixXQUFXLDRCQUE0QixDQUFDLENBQUM7WUFDdkYsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixNQUFNLENBQUMsSUFBSSxDQUNULGtFQUFrRSxXQUFXLHFCQUFxQixFQUNsRztnQkFDRSxnQkFBZ0I7Z0JBQ2hCLE9BQU87Z0JBQ1AsU0FBUyxFQUFFLFlBQVk7YUFDeEIsQ0FDRixDQUFDO1lBRUYsK0NBQStDO1lBQy9DLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHFCQUFxQjtnQkFDM0IsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLDBDQUEwQztnQkFDbEQsT0FBTyxFQUFFLHlDQUF5QyxXQUFXLG1CQUFtQjtnQkFDaEYsUUFBUSxFQUFFO29CQUNSLGdCQUFnQjtvQkFDaEIsT0FBTztvQkFDUCxZQUFZO2lCQUNiO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsSUFBSSxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDdkcsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZmF1bHRFbGVtZW50UHJvdmlkZXIgLSBQb3B1bGF0ZXMgcG9ydGZvbGlvIHdpdGggZGVmYXVsdCBlbGVtZW50cyBmcm9tIGJ1bmRsZWQgZGF0YVxuICogXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMgY29weWluZyBkZWZhdWx0IHBlcnNvbmFzLCBza2lsbHMsIHRlbXBsYXRlcywgYW5kIG90aGVyIGVsZW1lbnRzXG4gKiBmcm9tIHRoZSBOUE0gcGFja2FnZSBvciBHaXQgcmVwb3NpdG9yeSB0byB0aGUgdXNlcidzIHBvcnRmb2xpbyBvbiBmaXJzdCBydW4uXG4gKiBJdCBlbnN1cmVzIHVzZXJzIGhhdmUgZXhhbXBsZSBjb250ZW50IHRvIHdvcmsgd2l0aCBpbW1lZGlhdGVseSBhZnRlciBpbnN0YWxsYXRpb24uXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgZnNTeW5jIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuXG4vLyBGaWxlIG9wZXJhdGlvbiBjb25zdGFudHNcbmV4cG9ydCBjb25zdCBGSUxFX0NPTlNUQU5UUyA9IHtcbiAgRUxFTUVOVF9FWFRFTlNJT046ICcubWQnLFxuICBZQU1MX0VYVEVOU0lPTjogJy55YW1sJyxcbiAgWU1MX0VYVEVOU0lPTjogJy55bWwnLFxuICBKU09OX0VYVEVOU0lPTjogJy5qc29uJyxcbiAgTUFYX0ZJTEVfU0laRTogMTAgKiAxMDI0ICogMTAyNCwgLy8gMTBNQiBtYXggZmlsZSBzaXplIGZvciBzYWZldHlcbiAgQ0hFQ0tTVU1fQUxHT1JJVEhNOiAnc2hhMjU2JyxcbiAgRklMRV9QRVJNSVNTSU9OUzogMG82NDQsXG4gIENIVU5LX1NJWkU6IDY0ICogMTAyNCAvLyA2NEtCIGNodW5rcyBmb3IgcmVhZGluZyBsYXJnZSBmaWxlc1xufSBhcyBjb25zdDtcblxuLy8gRGV2ZWxvcG1lbnQgbW9kZSBkZXRlY3Rpb25cbi8vIFdoZW4gcnVubmluZyBmcm9tIGEgZ2l0IGNsb25lLCB3ZSBkb24ndCB3YW50IHRvIGF1dG8tbG9hZCB0ZXN0IGRhdGFcbmNvbnN0IElTX0RFVkVMT1BNRU5UX01PREUgPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGEgZ2l0IHJlcG9zaXRvcnkgKGRldmVsb3BtZW50IG1vZGUpXG4gICAgY29uc3QgZ2l0RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuZ2l0Jyk7XG4gICAgcmV0dXJuIGZzU3luYy5leGlzdHNTeW5jKGdpdERpcik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSkoKTtcblxuLy8gSW50ZXJuYWwgY29uc3RhbnRzXG5jb25zdCBEQVRBX0RJUl9DQUNIRV9LRVkgPSAnZG9sbGhvdXNlX2RhdGFfZGlyJztcbmNvbnN0IENPUFlfUkVUUllfQVRURU1QVFMgPSAzO1xuY29uc3QgQ09QWV9SRVRSWV9ERUxBWSA9IDEwMDsgLy8gbXNcblxuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29uZmlnIHtcbiAgLyoqIEN1c3RvbSBkYXRhIGRpcmVjdG9yeSBwYXRocyB0byBzZWFyY2ggKGNoZWNrZWQgYmVmb3JlIGRlZmF1bHQgcGF0aHMpICovXG4gIGN1c3RvbURhdGFQYXRocz86IHN0cmluZ1tdO1xuICAvKiogV2hldGhlciB0byB1c2UgZGVmYXVsdCBzZWFyY2ggcGF0aHMgYWZ0ZXIgY3VzdG9tIHBhdGhzICovXG4gIHVzZURlZmF1bHRQYXRocz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRvIGxvYWQgdGVzdC9leGFtcGxlIGRhdGEgZnJvbSByZXBvc2l0b3J5IChkZWZhdWx0OiBmYWxzZSBpbiBkZXYgbW9kZSkgKi9cbiAgbG9hZFRlc3REYXRhPzogYm9vbGVhbjtcbn1cblxuLy8gUEVSRk9STUFOQ0U6IE1ldGFkYXRhIGNhY2hlIHdpdGggbXRpbWUtYmFzZWQgaW52YWxpZGF0aW9uXG5pbnRlcmZhY2UgTWV0YWRhdGFDYWNoZUVudHJ5IHtcbiAgbWV0YWRhdGE6IGFueTtcbiAgbXRpbWU6IG51bWJlcjtcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdEVsZW1lbnRQcm92aWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX19kaXJuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdGljIGNhY2hlZERhdGFEaXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyBwb3B1bGF0ZUluUHJvZ3Jlc3M6IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogRGVmYXVsdEVsZW1lbnRQcm92aWRlckNvbmZpZztcbiAgXG4gIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTjogQ2FjaGUgbWV0YWRhdGEgd2l0aCBmaWxlIG10aW1lIGZvciBpbnZhbGlkYXRpb25cbiAgcHJpdmF0ZSBzdGF0aWMgbWV0YWRhdGFDYWNoZTogTWFwPHN0cmluZywgTWV0YWRhdGFDYWNoZUVudHJ5PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0NBQ0hFX1NJWkUgPSAyMDsgLy8gTUVNT1JZIExFQUsgRklYOiBGdXJ0aGVyIHJlZHVjZWQgY2FjaGUgc2l6ZSB0byBwcmV2ZW50IGFjY3VtdWxhdGlvbiBkdXJpbmcgcGVyZm9ybWFuY2UgdGVzdHNcbiAgXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IERlZmF1bHRFbGVtZW50UHJvdmlkZXJDb25maWcpIHtcbiAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgIHRoaXMuX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuICAgIFxuICAgIC8vIENoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciB0ZXN0IGRhdGEgbG9hZGluZ1xuICAgIGNvbnN0IGVudkxvYWRUZXN0RGF0YSA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9MT0FEX1RFU1RfREFUQTtcbiAgICBjb25zdCBsb2FkVGVzdERhdGFGcm9tRW52ID0gZW52TG9hZFRlc3REYXRhID09PSAndHJ1ZScgfHwgZW52TG9hZFRlc3REYXRhID09PSAnMSc7XG4gICAgY29uc3QgZGlzYWJsZVRlc3REYXRhRnJvbUVudiA9IGVudkxvYWRUZXN0RGF0YSA9PT0gJ2ZhbHNlJyB8fCBlbnZMb2FkVGVzdERhdGEgPT09ICcwJztcbiAgICBcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBkZXZlbG9wbWVudCBtb2RlICh3aXRoIHJlc3BlY3QgdG8gRk9SQ0VfUFJPRFVDVElPTl9NT0RFIG92ZXJyaWRlKVxuICAgIGNvbnN0IGlzRGV2TW9kZSA9ICgoKSA9PiB7XG4gICAgICAvLyBSZXNwZWN0IEZPUkNFX1BST0RVQ1RJT05fTU9ERSBvdmVycmlkZSBmaXJzdFxuICAgICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm9yY2UgcHJvZHVjdGlvbiBtb2RlXG4gICAgICB9XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuRk9SQ0VfUFJPRFVDVElPTl9NT0RFID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBGb3JjZSBkZXZlbG9wbWVudCBtb2RlXG4gICAgICB9XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gZ2l0IGRldGVjdGlvblxuICAgICAgcmV0dXJuIElTX0RFVkVMT1BNRU5UX01PREU7XG4gICAgfSkoKTtcbiAgICBcbiAgICAvLyBEZXRlcm1pbmUgbG9hZFRlc3REYXRhIHZhbHVlXG4gICAgbGV0IGNvbXB1dGVkTG9hZFRlc3REYXRhOiBib29sZWFuO1xuICAgIGlmIChsb2FkVGVzdERhdGFGcm9tRW52KSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCBleHBsaWNpdGx5IGVuYWJsZXMgdGVzdCBkYXRhXG4gICAgICBjb21wdXRlZExvYWRUZXN0RGF0YSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkaXNhYmxlVGVzdERhdGFGcm9tRW52KSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCBleHBsaWNpdGx5IGRpc2FibGVzIHRlc3QgZGF0YVxuICAgICAgY29tcHV0ZWRMb2FkVGVzdERhdGEgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCBsb2dpYzogZW5hYmxlIGluIHByb2R1Y3Rpb24sIGRpc2FibGUgaW4gZGV2ZWxvcG1lbnQgdW5sZXNzIGNvbmZpZyBvdmVycmlkZXNcbiAgICAgIGNvbXB1dGVkTG9hZFRlc3REYXRhID0gIWlzRGV2TW9kZSAmJiAoY29uZmlnPy5sb2FkVGVzdERhdGEgPz8gdHJ1ZSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgdXNlRGVmYXVsdFBhdGhzOiB0cnVlLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgLy8gQXBwbHkgZmluYWwgbG9hZFRlc3REYXRhIGxvZ2ljIC0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBkZXZlbG9wbWVudCBtb2RlIHRha2UgcHJlY2VkZW5jZVxuICAgICAgbG9hZFRlc3REYXRhOiBsb2FkVGVzdERhdGFGcm9tRW52ID8gdHJ1ZSA6IGRpc2FibGVUZXN0RGF0YUZyb21FbnYgPyBmYWxzZSA6IGNvbXB1dGVkTG9hZFRlc3REYXRhXG4gICAgfTtcbiAgICBcbiAgICBpZiAoaXNEZXZNb2RlICYmICF0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRGV2ZWxvcG1lbnQgbW9kZSBkZXRlY3RlZCAtIHRlc3QgZGF0YSBsb2FkaW5nIGRpc2FibGVkJyk7XG4gICAgICBsb2dnZXIuaW5mbygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFRvIGVuYWJsZSB0ZXN0IGRhdGEsIHNldCBET0xMSE9VU0VfTE9BRF9URVNUX0RBVEE9dHJ1ZScpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBsb2FkVGVzdERhdGEgY29uZmlndXJhdGlvbiB2YWx1ZVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRlc3QgZGF0YSBsb2FkaW5nIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNUZXN0RGF0YUxvYWRpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEgPz8gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGUgc3lzdGVtIGlzIGluIGRldmVsb3BtZW50IG1vZGVcbiAgICogQHJldHVybnMgV2hldGhlciBydW5uaW5nIGluIGRldmVsb3BtZW50IG1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEZXZlbG9wbWVudE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIElTX0RFVkVMT1BNRU5UX01PREU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggcGF0aHMgZm9yIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnlcbiAgICogT3JkZXJlZCBieSBwcmlvcml0eSAtIGN1c3RvbSBwYXRocyBmaXJzdCwgdGhlbiBkZXZlbG9wbWVudC9naXQsIHRoZW4gTlBNIGxvY2F0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZGF0YVNlYXJjaFBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICAvLyBBZGQgY3VzdG9tIHBhdGhzIGZpcnN0IChoaWdoZXN0IHByaW9yaXR5KVxuICAgIGlmICh0aGlzLmNvbmZpZy5jdXN0b21EYXRhUGF0aHMpIHtcbiAgICAgIHBhdGhzLnB1c2goLi4udGhpcy5jb25maWcuY3VzdG9tRGF0YVBhdGhzKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIGRlZmF1bHQgcGF0aHMgaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmNvbmZpZy51c2VEZWZhdWx0UGF0aHMgIT09IGZhbHNlKSB7XG4gICAgICAvLyBTa2lwIGRldmVsb3BtZW50L3JlcG9zaXRvcnkgZGF0YSBwYXRocyB1bmxlc3MgdGVzdCBkYXRhIGxvYWRpbmcgaXMgZW5hYmxlZFxuICAgICAgaWYgKHRoaXMuY29uZmlnLmxvYWRUZXN0RGF0YSkge1xuICAgICAgICAvLyBEZXZlbG9wbWVudC9HaXQgaW5zdGFsbGF0aW9uIChyZWxhdGl2ZSB0byB0aGlzIGZpbGUpXG4gICAgICAgIHBhdGhzLnB1c2goXG4gICAgICAgICAgcGF0aC5qb2luKHRoaXMuX19kaXJuYW1lLCAnLi4vLi4vZGF0YScpLFxuICAgICAgICAgIHBhdGguam9pbih0aGlzLl9fZGlybmFtZSwgJy4uLy4uLy4uL2RhdGEnKSxcbiAgICAgICAgICAvLyBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChsYXN0IHJlc29ydClcbiAgICAgICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2RhdGEnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBBbHdheXMgaW5jbHVkZSBOUE0gaW5zdGFsbGF0aW9uIHBhdGhzICh0aGVzZSB3b3VsZCBoYXZlIHByb2R1Y3Rpb24gZGF0YSlcbiAgICAgIHBhdGhzLnB1c2goXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gbWFjT1MgSG9tZWJyZXdcbiAgICAgICAgJy9vcHQvaG9tZWJyZXcvbGliL25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIvZGF0YScsXG4gICAgICAgIFxuICAgICAgICAvLyBOUE0gaW5zdGFsbGF0aW9ucyAtIHN0YW5kYXJkIFVuaXgvTGludXhcbiAgICAgICAgJy91c3IvbG9jYWwvbGliL25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIvZGF0YScsXG4gICAgICAgICcvdXNyL2xpYi9ub2RlX21vZHVsZXMvQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyL2RhdGEnLFxuICAgICAgICBcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBXaW5kb3dzXG4gICAgICAgICdDOlxcXFxQcm9ncmFtIEZpbGVzXFxcXG5vZGVqc1xcXFxub2RlX21vZHVsZXNcXFxcQGRvbGxob3VzZW1jcFxcXFxtY3Atc2VydmVyXFxcXGRhdGEnLFxuICAgICAgICAnQzpcXFxcUHJvZ3JhbSBGaWxlcyAoeDg2KVxcXFxub2RlanNcXFxcbm9kZV9tb2R1bGVzXFxcXEBkb2xsaG91c2VtY3BcXFxcbWNwLXNlcnZlclxcXFxkYXRhJyxcbiAgICAgICAgXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gV2luZG93cyB3aXRoIG52bVxuICAgICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5lbnYuQVBQREFUQSB8fCAnJywgJ25wbScsICdub2RlX21vZHVsZXMnLCAnQGRvbGxob3VzZW1jcCcsICdtY3Atc2VydmVyJywgJ2RhdGEnKVxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHBhdGhzO1xuICB9XG4gIFxuICAvKipcbiAgICogRmluZCB0aGUgYnVuZGxlZCBkYXRhIGRpcmVjdG9yeSBieSBjaGVja2luZyBlYWNoIHNlYXJjaCBwYXRoXG4gICAqIFVzZXMgUHJvbWlzZS5hbGxTZXR0bGVkIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIGNhY2hlcyB0aGUgcmVzdWx0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmREYXRhRGlyZWN0b3J5KCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIC8vIFJldHVybiBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlXG4gICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2FjaGVkRGF0YURpciAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2FjaGVkRGF0YURpcjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgYWxsIHBhdGhzIGluIHBhcmFsbGVsIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICBjb25zdCBjaGVja1Byb21pc2VzID0gdGhpcy5kYXRhU2VhcmNoUGF0aHMubWFwKGFzeW5jIChzZWFyY2hQYXRoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoc2VhcmNoUGF0aCk7XG4gICAgICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgLy8gVmVyaWZ5IGl0IGNvbnRhaW5zIGV4cGVjdGVkIHN1YmRpcmVjdG9yaWVzXG4gICAgICAgICAgY29uc3QgaGFzUGVyc29uYXMgPSBhd2FpdCB0aGlzLmRpcmVjdG9yeUV4aXN0cyhwYXRoLmpvaW4oc2VhcmNoUGF0aCwgJ3BlcnNvbmFzJykpO1xuICAgICAgICAgIGNvbnN0IGhhc1NraWxscyA9IGF3YWl0IHRoaXMuZGlyZWN0b3J5RXhpc3RzKHBhdGguam9pbihzZWFyY2hQYXRoLCAnc2tpbGxzJykpO1xuICAgICAgICAgIGlmIChoYXNQZXJzb25hcyB8fCBoYXNTa2lsbHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWFyY2hQYXRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgYWNjZXNzZWRcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNoZWNrUHJvbWlzZXMpO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgcmVzdWx0XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHJlc3VsdC52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEZvdW5kIGRhdGEgZGlyZWN0b3J5IGF0OiAke3Jlc3VsdC52YWx1ZX1gKTtcbiAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXIgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci53YXJuKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTm8gYnVuZGxlZCBkYXRhIGRpcmVjdG9yeSBmb3VuZCBpbiBhbnkgc2VhcmNoIHBhdGgnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhlbHBlciB0byBjaGVjayBpZiBhIGRpcmVjdG9yeSBleGlzdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlyZWN0b3J5RXhpc3RzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZGlyUGF0aCk7XG4gICAgICByZXR1cm4gc3RhdHMuaXNEaXJlY3RvcnkoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZmlsZSBwYXRoIHRvIHByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiBTRUNVUklUWSBGSVg6IEFkZGVkIGZpbGUgcGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGlyZWN0b3J5IHRyYXZlcnNhbFxuICAgKiBQcmV2aW91c2x5OiBGaWxlIHBhdGhzIHdlcmUgdXNlZCB3aXRob3V0IHZhbGlkYXRpb24sIGFsbG93aW5nIHBvdGVudGlhbCAuLi8uLi8uLi8gYXR0YWNrc1xuICAgKiBOb3c6IFN0cmljdCB2YWxpZGF0aW9uIGVuc3VyZXMgcGF0aHMgc3RheSB3aXRoaW4gYWxsb3dlZCBkaXJlY3Rvcmllc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggVGhlIGZpbGUgcGF0aCB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gYWxsb3dlZEJhc2VQYXRocyBBcnJheSBvZiBhbGxvd2VkIGJhc2UgcGF0aHMgKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHBhdGggaXMgc2FmZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZywgYWxsb3dlZEJhc2VQYXRocz86IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBOb3JtYWxpemUgcGF0aCB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRlbXB0c1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZOiBSZWplY3QgcGF0aHMgY29udGFpbmluZyB0cmF2ZXJzYWwgcGF0dGVybnNcbiAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFBhdGggdHJhdmVyc2FsIGF0dGVtcHQgYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogQ2hlY2sgZm9yIGhvbWUgZGlyZWN0b3J5IGV4cGFuc2lvbiBhdHRlbXB0cywgYnV0IGFsbG93IFdpbmRvd3MgOC4zIHNob3J0IHBhdGggbmFtZXNcbiAgICAgIC8vIFdpbmRvd3Mgc2hvcnQgcGF0aCBuYW1lcyB1c2UgfiBmb2xsb3dlZCBieSBhIGRpZ2l0IChlLmcuLCBSVU5ORVJ+MSksIHdoaWNoIHNob3VsZCBiZSBhbGxvd2VkXG4gICAgICAvLyBPbmx5IGJsb2NrIH4gZm9sbG93ZWQgYnkgLyBvciBcXCAoaG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uIHBhdHRlcm5zKVxuICAgICAgaWYgKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCd+LycpIHx8IG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCd+XFxcXCcpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gSG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uIGF0dGVtcHQgYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogUmVqZWN0IGFic29sdXRlIHBhdGhzIG91dHNpZGUgYWxsb3dlZCBkaXJlY3Rvcmllc1xuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShub3JtYWxpemVkUGF0aCkgJiYgYWxsb3dlZEJhc2VQYXRocykge1xuICAgICAgICBjb25zdCBpc0FsbG93ZWQgPSBhbGxvd2VkQmFzZVBhdGhzLnNvbWUoYmFzZVBhdGggPT4ge1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRCYXNlID0gcGF0aC5ub3JtYWxpemUoYmFzZVBhdGgpO1xuICAgICAgICAgIHJldHVybiBub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRCYXNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWlzQWxsb3dlZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQWJzb2x1dGUgcGF0aCBvdXRzaWRlIGFsbG93ZWQgZGlyZWN0b3JpZXM6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZOiBSZWplY3QgbnVsbCBieXRlcyBhbmQgb3RoZXIgZGFuZ2Vyb3VzIGNoYXJhY3RlcnNcbiAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnXFwwJykgfHwgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJ1xceDAwJykpIHsgLy8gTk9TT05BUiAtIE51bGwgYnl0ZSBkZXRlY3Rpb24gZm9yIHNlY3VyaXR5XG4gICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTnVsbCBieXRlIGluIHBhdGggYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQYXRoIHZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gREVQUkVDQVRFRDogQ29tbWVudGVkIG91dCBmaWxlbmFtZSBwYXR0ZXJuIGRldGVjdGlvbiAtIHJlcGxhY2VkIHdpdGggbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uXG4gIC8qKlxuICAgKiBDYWNoZWQgY29tcGlsZWQgcmVnZXggcGF0dGVybnMgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICovXG4gIC8vIHByaXZhdGUgc3RhdGljIGNvbXBpbGVkVGVzdFBhdHRlcm5zOiBSZWdFeHBbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBHZXQgY29tcGlsZWQgdGVzdCBwYXR0ZXJucyB3aXRoIGNhY2hpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICogQHJldHVybnMgQXJyYXkgb2YgY29tcGlsZWQgcmVnZXggcGF0dGVybnNcbiAgICovXG4gIC8vIHByaXZhdGUgZ2V0Q29tcGlsZWRUZXN0UGF0dGVybnMoKTogUmVnRXhwW10ge1xuICAvLyAgIC8vIFVzZSBjYWNoZWQgcGF0dGVybnMgaWYgYXZhaWxhYmxlXG4gIC8vICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29tcGlsZWRUZXN0UGF0dGVybnMpIHtcbiAgLy8gICAgIHJldHVybiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zO1xuICAvLyAgIH1cbiAgLy8gICBcbiAgLy8gICAvLyBDb21waWxlIGFuZCBjYWNoZSBwYXR0ZXJucyBvbiBmaXJzdCB1c2VcbiAgLy8gICAvLyBDUklUSUNBTCBGSVg6IFJlbW92ZWQgb3Zlcmx5IGJyb2FkIC9edGVzdC0vaSBwYXR0ZXJuIHRoYXQgd2FzIGJsb2NraW5nIGxlZ2l0aW1hdGUgdXNlXG4gIC8vICAgLy8gVXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRlIHBlcnNvbmFzIGxpa2UgXCJ0ZXN0LWRyaXZlbi1kZXZlbG9wZXJcIiBvciBcInRlc3QtYXV0b21hdGlvbi1leHBlcnRcIlxuICAvLyAgIC8vIFdlIG9ubHkgYmxvY2sgc3BlY2lmaWMgdGVzdCBwYXR0ZXJucyB0aGF0IGFyZSBjbGVhcmx5IGZyb20gb3VyIHRlc3Qgc3VpdGVcbiAgLy8gICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zID0gW1xuICAvLyAgICAgL150ZXN0cGVyc29uYS9pLCAgICAgICAgICAgICAgLy8gT3VyIHRlc3Qgc3VpdGUgcGF0dGVyblxuICAvLyAgICAgL155YW1sdGVzdC9pLCAgICAgICAgICAgICAgICAgLy8gU2VjdXJpdHkgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXnlhbWxib21iL2ksICAgICAgICAgICAgICAgICAvLyBTZWN1cml0eSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9ebWVtb3J5LXRlc3QtL2ksICAgICAgICAgICAgIC8vIFBlcmZvcm1hbmNlIHRlc3QgcGF0dGVyblxuICAvLyAgICAgL15wZXJmLXRlc3QtL2ksICAgICAgICAgICAgICAgLy8gUGVyZm9ybWFuY2UgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXnRlc3QtZml4dHVyZS0vaSwgICAgICAgICAgICAvLyBUZXN0IGZpeHR1cmUgcGF0dGVybiAobW9yZSBzcGVjaWZpYylcbiAgLy8gICAgIC9edGVzdC1kYXRhLS9pLCAgICAgICAgICAgICAgIC8vIFRlc3QgZGF0YSBwYXR0ZXJuIChtb3JlIHNwZWNpZmljKVxuICAvLyAgICAgL2Jpbi1zaHxybS1yZnxwd25lZC9pLCAgICAgICAgLy8gTWFsaWNpb3VzIHBhdHRlcm5zXG4gIC8vICAgICAvY29uY3VycmVudC1cXGQrL2ksICAgICAgICAgICAgLy8gQ29uY3VycmVudCB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9sZWdhY3lcXC5tZCQvaSwgICAgICAgICAgICAgICAvLyBMZWdhY3kgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvcGVyZm9ybWFuY2UtdGVzdC9pLCAgICAgICAgICAvLyBQZXJmb3JtYW5jZSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC8tXFxkezEzfS1bYS16MC05XStcXC5tZCQvaSwgICAgLy8gVGltZXN0YW1wLWJhc2VkIHRlc3QgZmlsZXNcbiAgLy8gICAgIC9edW5pdHRlc3QtL2ksICAgICAgICAgICAgICAgIC8vIFVuaXQgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXmludGVncmF0aW9udGVzdC0vaSwgICAgICAgICAvLyBJbnRlZ3JhdGlvbiB0ZXN0IHBhdHRlcm5cbiAgLy8gICBdO1xuICAvLyAgIFxuICAvLyAgIHJldHVybiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZmlsZW5hbWUgbWF0Y2hlcyB0ZXN0IGRhdGEgcGF0dGVybnMgdGhhdCBzaG91bGQgbmV2ZXIgYmUgY29waWVkIHRvIHByb2R1Y3Rpb25cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGlzRG9sbGhvdXNlTUNQVGVzdEVsZW1lbnQoKSBmb3IgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlbmFtZSBtYXRjaGVzIHRlc3QgcGF0dGVybnMgdGhhdCBzaG91bGQgYmUgYmxvY2tlZFxuICAgKi9cbiAgLy8gcHJpdmF0ZSBpc1Rlc3REYXRhUGF0dGVybihmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLmdldENvbXBpbGVkVGVzdFBhdHRlcm5zKCk7XG4gIC8vICAgcmV0dXJuIHBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBwYXR0ZXJuLnRlc3QoZmlsZW5hbWUpKTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBSZWFkIG1ldGFkYXRhIGZyb20gWUFNTCBmcm9udG1hdHRlciBvbmx5IChuZXZlciByZWFkcyBjb250ZW50IGJvZHkpXG4gICAqIFVzZXMgYSBzbWFsbCBidWZmZXIgdG8gc2FmZWx5IGV4dHJhY3Qgb25seSB0aGUgZnJvbnRtYXR0ZXIgYmV0d2VlbiAtLS0gbWFya2Vyc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZSB0byByZWFkIG1ldGFkYXRhIGZyb21cbiAgICogQHJldHVybnMgUGFyc2VkIG1ldGFkYXRhIG9iamVjdCBvciBudWxsIGlmIG5vIGZyb250bWF0dGVyIGZvdW5kXG4gICAqL1xuICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT046IFJldXNhYmxlIGJ1ZmZlciBwb29sIHRvIHJlZHVjZSBhbGxvY2F0aW9uc1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBidWZmZXJQb29sOiBCdWZmZXJbXSA9IFtdO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUE9PTF9TSVpFID0gMjA7IC8vIE1FTU9SWSBMRUFLIEZJWDogUmVkdWNlZCBidWZmZXIgcG9vbCBzaXplIHRvIG1hdGNoIGNhY2hlIHNpemUgZm9yIGNvbnNpc3RlbnQgbWVtb3J5IG1hbmFnZW1lbnRcbiAgcHJpdmF0ZSBzdGF0aWMgYnVmZmVyUG9vbFN0YXRzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAsIGNyZWF0ZWQ6IDAgfTtcbiAgXG4gIHByaXZhdGUgZ2V0QnVmZmVyKCk6IEJ1ZmZlciB7XG4gICAgLy8gUEVSRk9STUFOQ0U6IFRyYWNrIGJ1ZmZlciBwb29sIHVzYWdlIGZvciBvcHRpbWl6YXRpb24gbW9uaXRvcmluZ1xuICAgIGxldCBidWZmZXIgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wucG9wKCk7XG4gICAgaWYgKGJ1ZmZlcikge1xuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuaGl0cysrO1xuICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMubWlzc2VzKys7XG4gICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5jcmVhdGVkKys7XG4gICAgICBidWZmZXIgPSBCdWZmZXIuYWxsb2MoNDA5Nik7XG4gICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDcmVhdGVkIG5ldyBidWZmZXIgKHBvb2wgZW1wdHkpLCB0b3RhbCBjcmVhdGVkOiAke0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLmNyZWF0ZWR9YCk7XG4gICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSByZWxlYXNlQnVmZmVyKGJ1ZmZlcjogQnVmZmVyKTogdm9pZCB7XG4gICAgLy8gQ1JJVElDQUwgRklYOiBBbHdheXMgYXR0ZW1wdCB0byByZXR1cm4gYnVmZmVyIHRvIHBvb2wgZm9yIHJldXNlXG4gICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5sZW5ndGggPCBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9QT09MX1NJWkUpIHtcbiAgICAgIGJ1ZmZlci5maWxsKDApOyAvLyBTRUNVUklUWTogQ2xlYXIgYnVmZmVyIGJlZm9yZSByZXVzZSB0byBwcmV2ZW50IGRhdGEgbGVha2FnZVxuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLnB1c2goYnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUEVSRk9STUFOQ0U6IElmIHBvb2wgaXMgZnVsbCwgY2xlYXIgdGhlIGJ1ZmZlciB0byBoZWxwIEdDXG4gICAgICBidWZmZXIuZmlsbCgwKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEJ1ZmZlciBwb29sIGZ1bGwsIGRpc2NhcmRpbmcgYnVmZmVyJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIGJ1ZmZlciBwb29sIGFuZCBjYWNoZSB0byBmcmVlIG1lbW9yeVxuICAgKiBQRVJGT1JNQU5DRSBGSVg6IEFkZGVkIGNsZWFudXAgbWV0aG9kIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgYXBwbGljYXRpb24gc2h1dGRvd24gb3IgcGVyaW9kaWMgY2xlYW51cFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbGVhbnVwKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGJ1ZmZlciBwb29sXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLmxlbmd0aCA9IDA7XG4gICAgXG4gICAgLy8gQ2xlYXIgbWV0YWRhdGEgY2FjaGVcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuY2xlYXIoKTtcbiAgICBcbiAgICAvLyBDbGVhciBjYWNoZWQgZGF0YSBkaXJlY3RvcnlcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXIgPSBudWxsO1xuICAgIFxuICAgIC8vIENsZWFyIHBvcHVsYXRpb24gcHJvbWlzZXNcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBvcHVsYXRlSW5Qcm9ncmVzcy5jbGVhcigpO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTWVtb3J5IGNsZWFudXAgY29tcGxldGVkJywge1xuICAgICAgYnVmZmVyU3RhdHM6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLFxuICAgICAgY2FjaGVDbGVhcmVkOiB0cnVlXG4gICAgfSk7XG4gICAgXG4gICAgLy8gUmVzZXQgc3RhdHNcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cyA9IHsgaGl0czogMCwgbWlzc2VzOiAwLCBjcmVhdGVkOiAwIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlcmZvcm1hbmNlIHN0YXRpc3RpY3MgZm9yIG1vbml0b3JpbmdcbiAgICogUEVSRk9STUFOQ0UgTU9OSVRPUklORzogQWRkZWQgc3RhdGlzdGljcyBtZXRob2QgZm9yIHBlcmZvcm1hbmNlIHRyYWNraW5nXG4gICAqIFRoaXMgcHJvdmlkZXMgaW5zaWdodHMgaW50byBidWZmZXIgcG9vbCBlZmZpY2llbmN5IGFuZCBjYWNoZSBwZXJmb3JtYW5jZVxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFBlcmZvcm1hbmNlU3RhdHMoKToge1xuICAgIGJ1ZmZlclBvb2w6IHtcbiAgICAgIGhpdHM6IG51bWJlcjtcbiAgICAgIG1pc3NlczogbnVtYmVyOyBcbiAgICAgIGNyZWF0ZWQ6IG51bWJlcjtcbiAgICAgIGhpdFJhdGU6IG51bWJlcjtcbiAgICAgIHBvb2xTaXplOiBudW1iZXI7XG4gICAgICBtYXhQb29sU2l6ZTogbnVtYmVyO1xuICAgIH07XG4gICAgbWV0YWRhdGFDYWNoZToge1xuICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgbWF4U2l6ZTogbnVtYmVyO1xuICAgIH07XG4gIH0ge1xuICAgIGNvbnN0IGJ1ZmZlckhpdHMgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5oaXRzO1xuICAgIGNvbnN0IGJ1ZmZlck1pc3NlcyA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLm1pc3NlcztcbiAgICBjb25zdCB0b3RhbFJlcXVlc3RzID0gYnVmZmVySGl0cyArIGJ1ZmZlck1pc3NlcztcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgYnVmZmVyUG9vbDoge1xuICAgICAgICBoaXRzOiBidWZmZXJIaXRzLFxuICAgICAgICBtaXNzZXM6IGJ1ZmZlck1pc3NlcyxcbiAgICAgICAgY3JlYXRlZDogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuY3JlYXRlZCxcbiAgICAgICAgaGl0UmF0ZTogdG90YWxSZXF1ZXN0cyA+IDAgPyBidWZmZXJIaXRzIC8gdG90YWxSZXF1ZXN0cyA6IDAsXG4gICAgICAgIHBvb2xTaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wubGVuZ3RoLFxuICAgICAgICBtYXhQb29sU2l6ZTogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfUE9PTF9TSVpFXG4gICAgICB9LFxuICAgICAgbWV0YWRhdGFDYWNoZToge1xuICAgICAgICBzaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2l6ZSxcbiAgICAgICAgbWF4U2l6ZTogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfQ0FDSEVfU0laRVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBvbmx5IHRoZSBZQU1MIGZyb250bWF0dGVyIG1ldGFkYXRhIGZyb20gYSBmaWxlIChmaXJzdCA0S0IpXG4gICAqXG4gICAqIFNFQ1VSSVRZIE5PVEUgKElzc3VlICMxMjI4KTogVGhpcyBtZXRob2QgTVVTVCB1c2UgdmFsaWRhdGVDb250ZW50OiB0cnVlIHdoZW4gY2FsbGluZ1xuICAgKiBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkgdG8gZW5zdXJlIFVuaWNvZGUgc2VjdXJpdHkgdmFsaWRhdGlvbiBydW5zLiBTZXR0aW5nIHZhbGlkYXRlQ29udGVudFxuICAgKiB0byBmYWxzZSB3b3VsZCBkaXNhYmxlIEFMTCBjb250ZW50IHZhbGlkYXRpb24gaW5jbHVkaW5nIHplcm8td2lkdGggY2hhcmFjdGVyIGRldGVjdGlvbixcbiAgICogY3JlYXRpbmcgYSBzZWN1cml0eSBieXBhc3MgdnVsbmVyYWJpbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gQWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZSB0byByZWFkXG4gICAqIEBwYXJhbSByZXRyaWVzIC0gTnVtYmVyIG9mIHJldHJpZXMgZm9yIHRyYW5zaWVudCBmYWlsdXJlcyAoZGVmYXVsdDogMilcbiAgICogQHJldHVybnMgUGFyc2VkIG1ldGFkYXRhIG9iamVjdCBvciBudWxsIGlmIG5vIHZhbGlkIGZyb250bWF0dGVyIGZvdW5kXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWRNZXRhZGF0YU9ubHkoZmlsZVBhdGg6IHN0cmluZywgcmV0cmllcyA9IDIpOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgICAvLyBQRVJGT1JNQU5DRTogQ2hlY2sgY2FjaGUgZmlyc3QgYmVmb3JlIHJlYWRpbmcgZmlsZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBmaWxlUGF0aDtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgXG4gICAgICAvLyBSZXR1cm4gY2FjaGVkIG1ldGFkYXRhIGlmIGZpbGUgaGFzbid0IGNoYW5nZWQgXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFVzZSBpbnRlZ2VyIG10aW1lIGNvbXBhcmlzb24gdG8gYXZvaWQgZmxvYXRpbmctcG9pbnQgcHJlY2lzaW9uIGlzc3Vlc1xuICAgICAgaWYgKGNhY2hlZCAmJiBNYXRoLmZsb29yKGNhY2hlZC5tdGltZSkgPT09IE1hdGguZmxvb3Ioc3RhdHMubXRpbWVNcykgJiYgY2FjaGVkLnNpemUgPT09IHN0YXRzLnNpemUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ2FjaGUgaGl0IGZvciAke2ZpbGVQYXRofWApO1xuICAgICAgICByZXR1cm4gY2FjaGVkLm1ldGFkYXRhO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBwcm9jZWVkIHdpdGggbm9ybWFsIGZsb3dcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIE9wZW4gZmlsZSBhbmQgcmVhZCBvbmx5IGZpcnN0IDRLQiB0byBhdm9pZCByZWFkaW5nIGRhbmdlcm91cyBjb250ZW50XG4gICAgICBjb25zdCBmZCA9IGF3YWl0IGZzLm9wZW4oZmlsZVBhdGgsICdyJyk7XG4gICAgICAvLyBQRVJGT1JNQU5DRTogVXNlIGJ1ZmZlciBwb29sIGluc3RlYWQgb2YgYWxsb2NhdGluZyBuZXcgYnVmZmVyIGVhY2ggdGltZVxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmQucmVhZChidWZmZXIsIDAsIDQwOTYsIDApO1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBidWZmZXIuc3ViYXJyYXkoMCwgcmVzdWx0LmJ5dGVzUmVhZCkudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyBMb29rIGZvciBZQU1MIGZyb250bWF0dGVyIGJldHdlZW4gLS0tIG1hcmtlcnNcbiAgICAgICAgLy8gU3VwcG9ydCBib3RoIFVuaXggKFxcbikgYW5kIFdpbmRvd3MgKFxcclxcbikgbGluZSBlbmRpbmdzXG4gICAgICAgIGNvbnN0IG1hdGNoID0gaGVhZGVyLm1hdGNoKC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIHJldHVybiBudWxsOyAvLyBObyBmcm9udG1hdHRlciBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQYXJzZSB0aGUgWUFNTCBmcm9udG1hdHRlciBzYWZlbHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTRUNVUklUWSBGSVggKElzc3VlICMxMjI4KTogRW5hYmxlIHZhbGlkYXRlQ29udGVudCB0byBibG9jayB6ZXJvLXdpZHRoIFVuaWNvZGUgYW5kIG90aGVyIHNlY3VyaXR5IHRocmVhdHNcbiAgICAgICAgICAvLyBTZWN1cmVZYW1sUGFyc2VyIHByb3ZpZGVzIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiwgaW5qZWN0aW9uIHByZXZlbnRpb24sIGFuZCBjb250ZW50IHNhbml0aXphdGlvblxuICAgICAgICAgIC8vIEl0IGV4cGVjdHMgZnVsbCBZQU1MIHdpdGggLS0tIG1hcmtlcnMsIHNvIHdlIHJlY29uc3RydWN0IHRoZSBmcm9udG1hdHRlciBibG9ja1xuICAgICAgICAgIC8vIFdlIGRpc2FibGUgZmllbGQtc3BlY2lmaWMgdmFsaWRhdGlvbiBhcyB0aGlzIGlzIGdlbmVyYWwgbWV0YWRhdGEgcGFyc2luZywgbm90IHBlcnNvbmEtc3BlY2lmaWNcbiAgICAgICAgICAvLyBidXQgd2UgTVVTVCBrZWVwIHZhbGlkYXRlQ29udGVudDogdHJ1ZSB0byBlbnN1cmUgVW5pY29kZSBzZWN1cml0eSB2YWxpZGF0aW9uIHJ1bnNcbiAgICAgICAgICBjb25zdCBmdWxsWWFtbCA9IGAtLS1cXG4ke21hdGNoWzFdfVxcbi0tLWA7XG4gICAgICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGZ1bGxZYW1sLCB7XG4gICAgICAgICAgICAvLyBSRVFVSVJFRDogdmFsaWRhdGVDb250ZW50IG11c3QgYmUgdHJ1ZSB0byBlbmFibGUgVW5pY29kZSBzZWN1cml0eSB2YWxpZGF0aW9uIGluY2x1ZGluZ1xuICAgICAgICAgICAgLy8gemVyby13aWR0aCBjaGFyYWN0ZXIgZGV0ZWN0aW9uIChVKzIwMEItVSsyMDBGLCBVK0ZFRkYsIGV0Yy4pLiBTZXR0aW5nIHRoaXMgdG8gZmFsc2VcbiAgICAgICAgICAgIC8vIHdvdWxkIGRpc2FibGUgQUxMIGNvbnRlbnQgdmFsaWRhdGlvbiwgY3JlYXRpbmcgYSBzZWN1cml0eSBieXBhc3MgZm9yIFVuaWNvZGUtYmFzZWQgYXR0YWNrcy5cbiAgICAgICAgICAgIC8vIFNlZSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSgpIGZvciBkZXRlY3Rpb24gbG9naWMuXG4gICAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgICAgICB2YWxpZGF0ZUZpZWxkczogZmFsc2UgICAvLyBGaWVsZC1zcGVjaWZpYyB2YWxpZGF0aW9uIGlzIG9wdGlvbmFsIGZvciBnZW5lcmFsIG1ldGFkYXRhIHBhcnNpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHBhcnNlUmVzdWx0LmRhdGE7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUEVSRk9STUFOQ0U6IENhY2hlIHRoZSBtZXRhZGF0YSB3aXRoIGZpbGUgc3RhdHMgZm9yIGZ1dHVyZSByZWFkc1xuICAgICAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09ICdvYmplY3QnICYmIG1ldGFkYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICBjb25zdCBjYWNoZUVudHJ5OiBNZXRhZGF0YUNhY2hlRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbXRpbWU6IHN0YXRzLm10aW1lTXMsXG4gICAgICAgICAgICAgICAgc2l6ZTogc3RhdHMuc2l6ZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gQ1JJVElDQUwgTUVNT1JZIExFQUsgRklYOiBNb3JlIGFnZ3Jlc3NpdmUgY2FjaGUgbWFuYWdlbWVudCB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGhcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBlbnRyeSBhbHJlYWR5IGV4aXN0cyBhbmQganVzdCB1cGRhdGUgaXQgaW5zdGVhZCBvZiBhZGRpbmcgbmV3XG4gICAgICAgICAgICAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBlbnRyeSAtIG5vIGV2aWN0aW9uIG5lZWRlZFxuICAgICAgICAgICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zZXQoZmlsZVBhdGgsIGNhY2hlRW50cnkpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFVwZGF0ZWQgZXhpc3RpbmcgY2FjaGUgZW50cnkgZm9yICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IGVudHJ5IC0gY2hlY2sgaWYgd2UgbmVlZCB0byBldmljdCBmaXJzdFxuICAgICAgICAgICAgICAgIC8vIFVzZSA+IGluc3RlYWQgb2YgPj0gdG8gZW5zdXJlIHdlIG5ldmVyIGV4Y2VlZCBNQVhfQ0FDSEVfU0laRVxuICAgICAgICAgICAgICAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2l6ZSA+PSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9DQUNIRV9TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAvLyBNb3JlIGFnZ3Jlc3NpdmUgZXZpY3Rpb246IHJlbW92ZSBlbm91Z2ggZW50cmllcyB0byBzdGF5IHdlbGwgdW5kZXIgbGltaXRcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJpZXNUb0V2aWN0ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9DQUNIRV9TSVpFICogMC40KSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBrZXlzVG9FdmljdCA9IEFycmF5LmZyb20oRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmtleXMoKSkuc2xpY2UoMCwgZW50cmllc1RvRXZpY3QpO1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1RvRXZpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXZpY3RlZCAke2tleXNUb0V2aWN0Lmxlbmd0aH0gY2FjaGUgZW50cmllcyB0byBtYW5hZ2UgbWVtb3J5IChjYWNoZSBzaXplIHdhcyAke0RlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zaXplICsga2V5c1RvRXZpY3QubGVuZ3RofSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNldChmaWxlUGF0aCwgY2FjaGVFbnRyeSk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQWRkZWQgbmV3IGNhY2hlIGVudHJ5IGZvciAke2ZpbGVQYXRofSAoY2FjaGUgc2l6ZSBub3c6ICR7RGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNpemV9KWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgLy8gSWdub3JlIGNhY2hlIGVycm9ycywgcmV0dXJuIG1ldGFkYXRhIGFueXdheVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoeWFtbEVycm9yKSB7XG4gICAgICAgICAgLy8gSW52YWxpZCBZQU1MLCByZXR1cm4gbnVsbFxuICAgICAgICAgIC8vIEVOSEFOQ0VNRU5UOiBJbmNsdWRlIGVycm9yIHR5cGUgZm9yIGJldHRlciBkZWJ1Z2dpbmdcbiAgICAgICAgICBjb25zdCB5YW1sRXJyb3JUeXBlID0gKHlhbWxFcnJvciBhcyBhbnkpPy5jb25zdHJ1Y3Rvcj8ubmFtZSB8fCAnWUFNTEVycm9yJztcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBJbnZhbGlkIFlBTUwgaW4gJHtmaWxlUGF0aH06ICR7eWFtbEVycm9yVHlwZX0gLSAke3lhbWxFcnJvcn1gKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gQ1JJVElDQUwgRklYOiBFbnN1cmUgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCBhbmQgYnVmZmVyIGlzIHJlbGVhc2VkIGluIEFMTCBwYXRoc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZkLmNsb3NlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGNsb3NlRXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjbG9zaW5nIGZpbGUgZGVzY3JpcHRvciBmb3IgJHtmaWxlUGF0aH06ICR7Y2xvc2VFcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQRVJGT1JNQU5DRTogUmV0dXJuIGJ1ZmZlciB0byBwb29sIGZvciByZXVzZVxuICAgICAgICB0aGlzLnJlbGVhc2VCdWZmZXIoYnVmZmVyKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBFTkhBTkNFTUVOVDogSW5jbHVkZSBlcnJvciB0eXBlIGluIGRlYnVnIGxvZ3MgZm9yIGJldHRlciBkZWJ1Z2dpbmdcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IGVycm9yPy5jb25zdHJ1Y3Rvcj8ubmFtZSB8fCAnVW5rbm93bkVycm9yJztcbiAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGVycm9yPy5jb2RlIHx8ICdOT19DT0RFJztcbiAgICAgIFxuICAgICAgLy8gUkVMSUFCSUxJVFk6IEFkZCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAgICBpZiAocmV0cmllcyA+IDAgJiYgKGVycm9yQ29kZSA9PT0gJ0VCVVNZJyB8fCBlcnJvckNvZGUgPT09ICdFQUdBSU4nKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBSZXRyeWluZyByZWFkIGZvciAke2ZpbGVQYXRofSBhZnRlciAke2Vycm9yVHlwZX06JHtlcnJvckNvZGV9YCk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MCkpOyAvLyBCcmllZiBkZWxheSBiZWZvcmUgcmV0cnlcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZE1ldGFkYXRhT25seShmaWxlUGF0aCwgcmV0cmllcyAtIDEpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3VsZCBub3QgcmVhZCBtZXRhZGF0YSBmcm9tICR7ZmlsZVBhdGh9OiAke2Vycm9yVHlwZX06JHtlcnJvckNvZGV9IC0gJHtlcnJvcj8ubWVzc2FnZSB8fCBlcnJvcn1gKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGZpbGUgaXMgYSBEb2xsaG91c2VNQ1AgdGVzdCBlbGVtZW50IGJhc2VkIG9uIG1ldGFkYXRhXG4gICAqIFRoaXMgcmVwbGFjZXMgZmlsZW5hbWUgcGF0dGVybiBkZXRlY3Rpb24gd2l0aCBhY2N1cmF0ZSBtZXRhZGF0YS1iYXNlZCBkZXRlY3Rpb25cbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIGZpbGUgdG8gY2hlY2tcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBjb250YWlucyBfZG9sbGhvdXNlTUNQVGVzdDogdHJ1ZSBtZXRhZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpc0RvbGxob3VzZU1DUFRlc3RFbGVtZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnJlYWRNZXRhZGF0YU9ubHkoZmlsZVBhdGgpO1xuICAgICAgY29uc3QgaXNUZXN0ID0gISEobWV0YWRhdGEgJiYgbWV0YWRhdGEuX2RvbGxob3VzZU1DUFRlc3QgPT09IHRydWUpO1xuICAgICAgXG4gICAgICBcbiAgICAgIHJldHVybiBpc1Rlc3Q7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHdlIGNhbid0IHJlYWQgdGhlIG1ldGFkYXRhLCBhc3N1bWUgaXQncyBub3QgYSB0ZXN0IGZpbGVcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEVycm9yIGNoZWNraW5nIHRlc3QgbWV0YWRhdGEgZm9yICR7ZmlsZVBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgaWYgd2UncmUgaW4gYSBwcm9kdWN0aW9uIGVudmlyb25tZW50IGJ5IGNoZWNraW5nIGZvciBwcm9kdWN0aW9uIGluZGljYXRvcnNcbiAgICogVXNlcyBhIGNvbmZpZGVuY2UtYmFzZWQgYXBwcm9hY2ggcmVxdWlyaW5nIG11bHRpcGxlIGluZGljYXRvcnMgZm9yIGJldHRlciBhY2N1cmFjeVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgYXBwZWFycyB0byBiZSBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRcbiAgICovXG4gIHByaXZhdGUgaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gQWxsb3cgdGVzdHMgdG8gZXhwbGljaXRseSBvdmVycmlkZSBwcm9kdWN0aW9uIG1vZGUgZGV0ZWN0aW9uXG4gICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ3RydWUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ2ZhbHNlJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBXZWlnaHRlZCBpbmRpY2F0b3JzIGZvciBwcm9kdWN0aW9uIGRldGVjdGlvblxuICAgIGNvbnN0IGluZGljYXRvcnMgPSB7XG4gICAgICAvLyBTdHJvbmcgaW5kaWNhdG9ycyAod2VpZ2h0OiAyKVxuICAgICAgaGFzVXNlckhvbWVEaXI6IChwcm9jZXNzLmVudi5IT01FICYmIChwcm9jZXNzLmVudi5IT01FLmluY2x1ZGVzKCcvVXNlcnMvJykgfHwgcHJvY2Vzcy5lbnYuSE9NRS5pbmNsdWRlcygnL2hvbWUvJykpKSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAhIXByb2Nlc3MuZW52LlVTRVJQUk9GSUxFLFxuICAgICAgaXNQcm9kdWN0aW9uTm9kZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyxcbiAgICAgIG5vdEluVGVzdERpcjogKCgpID0+IHtcbiAgICAgICAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIGZvciBjcm9zcy1wbGF0Zm9ybSBjaGVja2luZyAoV2luZG93cyB1c2VzIFxcIGJ1dCBjaGVja3MgdXNlIC8pXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDd2QgPSBjd2QucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICAgIHJldHVybiAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL3Rlc3QnKSAmJiBcbiAgICAgICAgICAgICAgICFub3JtYWxpemVkQ3dkLmluY2x1ZGVzKCcvX190ZXN0c19fJykgJiYgXG4gICAgICAgICAgICAgICAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL3RlbXAnKSAmJlxuICAgICAgICAgICAgICAgIW5vcm1hbGl6ZWRDd2QuaW5jbHVkZXMoJy9kaXN0L3Rlc3QnKTtcbiAgICAgIH0pKCksXG4gICAgICBcbiAgICAgIC8vIE1vZGVyYXRlIGluZGljYXRvcnMgKHdlaWdodDogMSlcbiAgICAgIG5vdEluQ0k6ICFwcm9jZXNzLmVudi5DSSxcbiAgICAgIG5vVGVzdEVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyxcbiAgICAgIG5vRGV2RW52OiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ2RldmVsb3BtZW50JyxcbiAgICB9O1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSB3ZWlnaHRlZCBzY29yZVxuICAgIGxldCBzY29yZSA9IDA7XG4gICAgaWYgKGluZGljYXRvcnMuaGFzVXNlckhvbWVEaXIpIHNjb3JlICs9IDI7XG4gICAgaWYgKGluZGljYXRvcnMuaXNQcm9kdWN0aW9uTm9kZSkgc2NvcmUgKz0gMjtcbiAgICBpZiAoaW5kaWNhdG9ycy5ub3RJblRlc3REaXIpIHNjb3JlICs9IDI7XG4gICAgaWYgKGluZGljYXRvcnMubm90SW5DSSkgc2NvcmUgKz0gMTtcbiAgICBpZiAoaW5kaWNhdG9ycy5ub1Rlc3RFbnYpIHNjb3JlICs9IDE7XG4gICAgaWYgKGluZGljYXRvcnMubm9EZXZFbnYpIHNjb3JlICs9IDE7XG4gICAgXG4gICAgLy8gTG9nIGRldGVjdGlvbiBkZXRhaWxzIGZvciBkZWJ1Z2dpbmdcbiAgICBjb25zdCBhY3RpdmVJbmRpY2F0b3JzID0gT2JqZWN0LmVudHJpZXMoaW5kaWNhdG9ycylcbiAgICAgIC5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlKVxuICAgICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gICAgXG4gICAgLy8gVFlQRVNDUklQVCBGSVg6IFJlbW92ZWQgbG9nZ2VyLmlzRGVidWdFbmFibGVkKCkgY2hlY2sgYXMgdGhpcyBtZXRob2QgZG9lc24ndCBleGlzdCBvbiBNQ1BMb2dnZXJcbiAgICAvLyBUaGUgbG9nZ2VyIGFscmVhZHkgaGFuZGxlcyBkZWJ1ZyBsZXZlbCBpbnRlcm5hbGx5LCBzbyB3ZSBjYW4gY2FsbCBkZWJ1ZygpIGRpcmVjdGx5XG4gICAgaWYgKHNjb3JlID49IDMpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQcm9kdWN0aW9uIGVudmlyb25tZW50IGRldGVjdGVkJyxcbiAgICAgICAgeyBzY29yZSwgYWN0aXZlSW5kaWNhdG9ycywgZm9yY2VNb2RlOiAnbm90IHNldCcgfVxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVxdWlyZSBhIHNjb3JlIG9mIGF0IGxlYXN0IDMgZm9yIHByb2R1Y3Rpb24gZGV0ZWN0aW9uIChtb3JlIGNvbmZpZGVudClcbiAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBpbiBlZGdlIGNhc2VzIHdoaWxlIG1haW50YWluaW5nIHNlY3VyaXR5XG4gICAgcmV0dXJuIHNjb3JlID49IDM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb3B5IGFsbCBmaWxlcyBmcm9tIHNvdXJjZSBkaXJlY3RvcnkgdG8gZGVzdGluYXRpb24gZGlyZWN0b3J5XG4gICAqIFNraXBzIGZpbGVzIHRoYXQgYWxyZWFkeSBleGlzdCB0byBwcmVzZXJ2ZSB1c2VyIG1vZGlmaWNhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29weUVsZW1lbnRGaWxlcyhzb3VyY2VEaXI6IHN0cmluZywgZGVzdERpcjogc3RyaW5nLCBlbGVtZW50VHlwZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgY29waWVkQ291bnQgPSAwO1xuICAgIFxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgZnMubWtkaXIoZGVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlYWQgc291cmNlIGRpcmVjdG9yeVxuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKHNvdXJjZURpcik7XG4gICAgICBcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIFxuICAgICAgICAvLyBPbmx5IGNvcHkgbWFya2Rvd24gZmlsZXNcbiAgICAgICAgaWYgKCFmaWxlLmVuZHNXaXRoKEZJTEVfQ09OU1RBTlRTLkVMRU1FTlRfRVhURU5TSU9OKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBOb3JtYWxpemUgZmlsZW5hbWUgZm9yIHNlY3VyaXR5XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZmlsZSk7XG4gICAgICAgIGlmICghbm9ybWFsaXplZEZpbGUuaXNWYWxpZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZmlsZSB3aXRoIGludmFsaWQgVW5pY29kZTogJHtmaWxlfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlUGF0aCA9IHBhdGguam9pbihzb3VyY2VEaXIsIG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdERpciwgbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQpO1xuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIC8vIFNFQ1VSSVRZIEZJWDogVmFsaWRhdGUgZmlsZSBwYXRocyB0byBwcmV2ZW50IHBhdGggdHJhdmVyc2FsIGF0dGFja3NcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBtYWxpY2lvdXMgZmlsZXMgZnJvbSBlc2NhcGluZyB0aGUgaW50ZW5kZWQgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgICAgICBjb25zdCBzb3VyY2VWYWxpZCA9IHRoaXMudmFsaWRhdGVGaWxlUGF0aChzb3VyY2VQYXRoLCBbc291cmNlRGlyXSk7XG4gICAgICAgIGNvbnN0IGRlc3RWYWxpZCA9IHRoaXMudmFsaWRhdGVGaWxlUGF0aChkZXN0UGF0aCwgW2Rlc3REaXJdKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghc291cmNlVmFsaWQgfHwgIWRlc3RWYWxpZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBmaWxlIHdpdGggaW52YWxpZCBwYXRoOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICB7IHNvdXJjZVBhdGgsIGRlc3RQYXRoLCBlbGVtZW50VHlwZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUHJvZHVjdGlvbiBzYWZldHkgY2hlY2s6IEJsb2NrIERvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnRzIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzXG4gICAgICAgIC8vIFNraXAgdGhpcyBjaGVjayBpZiBsb2FkVGVzdERhdGEgaXMgZXhwbGljaXRseSBlbmFibGVkIChmb3IgdGVzdGluZyBzY2VuYXJpb3MpXG4gICAgICAgIGlmICghdGhpcy5jb25maWcubG9hZFRlc3REYXRhICYmIHRoaXMuaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQoKSkge1xuICAgICAgICAgIGNvbnN0IGlzRG9sbGhvdXNlVGVzdCA9IGF3YWl0IHRoaXMuaXNEb2xsaG91c2VNQ1BUZXN0RWxlbWVudChzb3VyY2VQYXRoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaXNEb2xsaG91c2VUZXN0KSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTRUNVUklUWTogQmxvY2tpbmcgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBpbiBwcm9kdWN0aW9uOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgZmlsZTogbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgICAgICAgICAgcmVhc29uOiAnRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBkZXRlY3RlZCBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50JyxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGJsb2NrZWQgdGVzdCBkYXRhXG4gICAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdURVNUX0RBVEFfQkxPQ0tFRCcsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb3B5RWxlbWVudEZpbGVzJyxcbiAgICAgICAgICAgICAgZGV0YWlsczogYEJsb2NrZWQgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBpbiBwcm9kdWN0aW9uOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogJ0RvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgZGV0ZWN0ZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgZGV0ZWN0aW9uTWV0aG9kOiAnbWV0YWRhdGEtYmFzZWQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgZGVzdGluYXRpb24gZmlsZSBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgIGF3YWl0IGZzLmFjY2VzcyhkZXN0UGF0aCk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZXhpc3RpbmcgZmlsZTogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBwcm9jZWVkIHdpdGggY29weVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFZhbGlkYXRlIHNvdXJjZSBmaWxlIGJlZm9yZSBjb3B5aW5nXG4gICAgICAgICAgY29uc3Qgc291cmNlU3RhdHMgPSBhd2FpdCBmcy5zdGF0KHNvdXJjZVBhdGgpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIENoZWNrIGZpbGUgc2l6ZSBsaW1pdFxuICAgICAgICAgIGlmIChzb3VyY2VTdGF0cy5zaXplID4gRklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgb3ZlcnNpemVkIGZpbGUgJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH06IGAgK1xuICAgICAgICAgICAgICBgJHtzb3VyY2VTdGF0cy5zaXplfSBieXRlcyAobWF4OiAke0ZJTEVfQ09OU1RBTlRTLk1BWF9GSUxFX1NJWkV9IGJ5dGVzKWAsXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgZmlsZTogbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQsIFxuICAgICAgICAgICAgICAgIHNpemU6IHNvdXJjZVN0YXRzLnNpemUsXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogRklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRSxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDb3B5IHRoZSBmaWxlIHdpdGggdmVyaWZpY2F0aW9uXG4gICAgICAgICAgXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZVdpdGhWZXJpZmljYXRpb24oc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICAgICAgICAgIGNvcGllZENvdW50Kys7XG4gICAgICAgICAgXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29waWVkICR7ZWxlbWVudFR5cGV9OiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWApO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgZWFjaCBmaWxlIGNvcGllZFxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvcHlFbGVtZW50RmlsZXMnLFxuICAgICAgICAgICAgZGV0YWlsczogYENvcGllZCBkZWZhdWx0ICR7ZWxlbWVudFR5cGV9IGZpbGU6ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgIGRlc3RQYXRoLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgZmlsZVNpemU6IChhd2FpdCBmcy5zdGF0KGRlc3RQYXRoKSkuc2l6ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRmFpbGVkIHRvIGNvcHkgJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgZXJyb3I6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICAgICAgICBzb3VyY2VQYXRoLFxuICAgICAgICAgICAgICBkZXN0UGF0aCxcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgZmlsZXMgaW5zdGVhZCBvZiBmYWlsaW5nIGNvbXBsZXRlbHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY29waWVkQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29waWVkICR7Y29waWVkQ291bnR9ICR7ZWxlbWVudFR5cGV9IGZpbGUocylgKTtcbiAgICAgIH1cbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjb3B5aW5nICR7ZWxlbWVudFR5cGV9IGZpbGVzOmAsIGVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGNvcGllZENvdW50O1xuICB9XG4gIFxuICAvKipcbiAgICogQ29weSBhIGZpbGUgd2l0aCBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uXG4gICAqIEVuc3VyZXMgdGhlIGZpbGUgd2FzIGNvcGllZCBjb3JyZWN0bHkgYnkgY29tcGFyaW5nIHNpemVzXG4gICAqL1xuICAvKipcbiAgICogQ2FsY3VsYXRlIGNoZWNrc3VtIG9mIGEgZmlsZSBmb3IgaW50ZWdyaXR5IHZlcmlmaWNhdGlvblxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZVxuICAgKiBAcmV0dXJucyBIZXgtZW5jb2RlZCBjaGVja3N1bVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjYWxjdWxhdGVDaGVja3N1bShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChGSUxFX0NPTlNUQU5UUy5DSEVDS1NVTV9BTEdPUklUSE0pO1xuICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IGZzLm9wZW4oZmlsZVBhdGgsICdyJyk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhGSUxFX0NPTlNUQU5UUy5DSFVOS19TSVpFKTtcbiAgICAgIGxldCBieXRlc1JlYWQ6IG51bWJlcjtcbiAgICAgIFxuICAgICAgZG8ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJlYW0ucmVhZChidWZmZXIsIDAsIEZJTEVfQ09OU1RBTlRTLkNIVU5LX1NJWkUpO1xuICAgICAgICBieXRlc1JlYWQgPSByZXN1bHQuYnl0ZXNSZWFkO1xuICAgICAgICBcbiAgICAgICAgaWYgKGJ5dGVzUmVhZCA+IDApIHtcbiAgICAgICAgICBoYXNoLnVwZGF0ZShidWZmZXIuc3ViYXJyYXkoMCwgYnl0ZXNSZWFkKSk7XG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKGJ5dGVzUmVhZCA+IDApO1xuICAgICAgXG4gICAgICByZXR1cm4gaGFzaC5kaWdlc3QoJ2hleCcpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBzdHJlYW0uY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29weSBmaWxlIHdpdGggaW50ZWdyaXR5IHZlcmlmaWNhdGlvbiBhbmQgcmV0cnkgbG9naWNcbiAgICogQHBhcmFtIHNvdXJjZVBhdGggU291cmNlIGZpbGUgcGF0aFxuICAgKiBAcGFyYW0gZGVzdFBhdGggRGVzdGluYXRpb24gZmlsZSBwYXRoXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgY29weSBmYWlscyBhZnRlciBhbGwgcmV0cnkgYXR0ZW1wdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29weUZpbGVXaXRoVmVyaWZpY2F0aW9uKHNvdXJjZVBhdGg6IHN0cmluZywgZGVzdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gQ09QWV9SRVRSWV9BVFRFTVBUUzsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDb3B5IHRoZSBmaWxlXG4gICAgICAgIGF3YWl0IGZzLmNvcHlGaWxlKHNvdXJjZVBhdGgsIGRlc3RQYXRoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFZlcmlmeSBzaXplIG1hdGNoZXNcbiAgICAgICAgY29uc3QgW3NvdXJjZVN0YXRzLCBkZXN0U3RhdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGZzLnN0YXQoc291cmNlUGF0aCksXG4gICAgICAgICAgZnMuc3RhdChkZXN0UGF0aClcbiAgICAgICAgXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoc291cmNlU3RhdHMuc2l6ZSAhPT0gZGVzdFN0YXRzLnNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU2l6ZSBtaXNtYXRjaCBhZnRlciBjb3B5IC0gc291cmNlOiAke3NvdXJjZVN0YXRzLnNpemV9IGJ5dGVzLCBgICtcbiAgICAgICAgICAgIGBkZXN0aW5hdGlvbjogJHtkZXN0U3RhdHMuc2l6ZX0gYnl0ZXNgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gVmVyaWZ5IGNoZWNrc3VtIG1hdGNoZXMgZm9yIGNvbXBsZXRlIGludGVncml0eVxuICAgICAgICBjb25zdCBbc291cmNlQ2hlY2tzdW0sIGRlc3RDaGVja3N1bV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVDaGVja3N1bShzb3VyY2VQYXRoKSxcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNoZWNrc3VtKGRlc3RQYXRoKVxuICAgICAgICBdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChzb3VyY2VDaGVja3N1bSAhPT0gZGVzdENoZWNrc3VtKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENoZWNrc3VtIG1pc21hdGNoIGFmdGVyIGNvcHkgLSBzb3VyY2U6ICR7c291cmNlQ2hlY2tzdW19LCBgICtcbiAgICAgICAgICAgIGBkZXN0aW5hdGlvbjogJHtkZXN0Q2hlY2tzdW19YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFNldCBwcm9wZXIgcGVybWlzc2lvbnNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmcy5jaG1vZChkZXN0UGF0aCwgRklMRV9DT05TVEFOVFMuRklMRV9QRVJNSVNTSU9OUyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3VsZCBub3Qgc2V0IHBlcm1pc3Npb25zIG9uICR7ZGVzdFBhdGh9OiAke2Vycm9yfWAsXG4gICAgICAgICAgICB7IHNvdXJjZVBhdGgsIGRlc3RQYXRoLCBhdHRlbXB0IH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBTdWNjZXNzIC0gZmlsZSBjb3BpZWQgYW5kIHZlcmlmaWVkXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN1Y2Nlc3NmdWxseSBjb3BpZWQgYW5kIHZlcmlmaWVkOiAke3BhdGguYmFzZW5hbWUoc291cmNlUGF0aCl9YCxcbiAgICAgICAgICB7IHNpemU6IHNvdXJjZVN0YXRzLnNpemUsIGNoZWNrc3VtOiBzb3VyY2VDaGVja3N1bS5zdWJzdHJpbmcoMCwgOCkgfVxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgYXMgRXJyb3I7XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhbiB1cCBmYWlsZWQgY29weVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLnVubGluayhkZXN0UGF0aCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoYXR0ZW1wdCA8IENPUFlfUkVUUllfQVRURU1QVFMpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvcHkgYXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZCwgcmV0cnlpbmcuLi5gLFxuICAgICAgICAgICAgeyBlcnJvcjogbGFzdEVycm9yLm1lc3NhZ2UsIHNvdXJjZVBhdGgsIGRlc3RQYXRoIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBDT1BZX1JFVFJZX0RFTEFZICogYXR0ZW1wdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFsbCBhdHRlbXB0cyBmYWlsZWRcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGNvcHkgJHtwYXRoLmJhc2VuYW1lKHNvdXJjZVBhdGgpfSBhZnRlciAke0NPUFlfUkVUUllfQVRURU1QVFN9IGF0dGVtcHRzOiBgICtcbiAgICAgIGAke2xhc3RFcnJvcj8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YFxuICAgICk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSB0aGUgcG9ydGZvbGlvIHdpdGggZGVmYXVsdCBlbGVtZW50cyBmcm9tIGJ1bmRsZWQgZGF0YVxuICAgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgcG9ydGZvbGlvIGluaXRpYWxpemF0aW9uIGZvciBuZXcgaW5zdGFsbGF0aW9uc1xuICAgKiBQcm90ZWN0ZWQgYWdhaW5zdCBjb25jdXJyZW50IGNhbGxzIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcG9wdWxhdGVEZWZhdWx0cyhwb3J0Zm9saW9CYXNlRGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBwb3B1bGF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgcG9ydGZvbGlvXG4gICAgY29uc3QgZXhpc3RpbmdQb3B1bGF0aW9uID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wb3B1bGF0ZUluUHJvZ3Jlc3MuZ2V0KHBvcnRmb2xpb0Jhc2VEaXIpO1xuICAgIGlmIChleGlzdGluZ1BvcHVsYXRpb24pIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQb3B1bGF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yIHBvcnRmb2xpbywgd2FpdGluZy4uLicsXG4gICAgICAgIHsgcG9ydGZvbGlvQmFzZURpciB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nUG9wdWxhdGlvbjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIG5ldyBwb3B1bGF0aW9uIHByb21pc2VcbiAgICBjb25zdCBwb3B1bGF0aW9uUHJvbWlzZSA9IHRoaXMucGVyZm9ybVBvcHVsYXRpb24ocG9ydGZvbGlvQmFzZURpcilcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgd2hlbiBkb25lXG4gICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLmRlbGV0ZShwb3J0Zm9saW9CYXNlRGlyKTtcbiAgICAgIH0pO1xuICAgIFxuICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLnNldChwb3J0Zm9saW9CYXNlRGlyLCBwb3B1bGF0aW9uUHJvbWlzZSk7XG4gICAgcmV0dXJuIHBvcHVsYXRpb25Qcm9taXNlO1xuICB9XG4gIFxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHBvcHVsYXRpb24gb2YgZGVmYXVsdCBlbGVtZW50c1xuICAgKiBAcGFyYW0gcG9ydGZvbGlvQmFzZURpciBCYXNlIGRpcmVjdG9yeSBvZiB0aGUgcG9ydGZvbGlvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1Qb3B1bGF0aW9uKHBvcnRmb2xpb0Jhc2VEaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIHRlc3QgZGF0YSBsb2FkaW5nIGlzIGRpc2FibGVkXG4gICAgLy8gTm90ZTogVGhpcyBjaGVjayBpcyBuZWVkZWQgZXZlbiB0aG91Z2ggY29uc3RydWN0b3Igc2V0cyBjb25maWcsIGJlY2F1c2VcbiAgICAvLyBjb25maWcgY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgY29uc3RydWN0aW9uXG4gICAgXG4gICAgLy8gVXNlIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgZGV0ZWN0aW9uIHRoYXQgcmVzcGVjdHMgRk9SQ0VfUFJPRFVDVElPTl9NT0RFXG4gICAgY29uc3QgaXNEZXZlbG9wbWVudE1vZGUgPSAhdGhpcy5pc1Byb2R1Y3Rpb25FbnZpcm9ubWVudCgpO1xuICAgIFxuICAgIGlmIChpc0RldmVsb3BtZW50TW9kZSAmJiAhdGhpcy5jb25maWcubG9hZFRlc3REYXRhKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBkZWZhdWx0IGVsZW1lbnQgcG9wdWxhdGlvbiBpbiBkZXZlbG9wbWVudCBtb2RlJyxcbiAgICAgICAgeyBcbiAgICAgICAgICBwb3J0Zm9saW9CYXNlRGlyLFxuICAgICAgICAgIHJlYXNvbjogJ1Rlc3QgZGF0YSBsb2FkaW5nIGRpc2FibGVkJyxcbiAgICAgICAgICBlbmFibGVXaXRoOiAnU2V0IERPTExIT1VTRV9MT0FEX1RFU1RfREFUQT10cnVlIHRvIGVuYWJsZSdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN0YXJ0aW5nIGRlZmF1bHQgZWxlbWVudCBwb3B1bGF0aW9uJyxcbiAgICAgIHsgcG9ydGZvbGlvQmFzZURpciB9XG4gICAgKTtcbiAgICBcbiAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIHBvcnRmb2xpbyBpbml0aWFsaXphdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdQT1JURk9MSU9fSU5JVElBTElaQVRJT04nLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wZXJmb3JtUG9wdWxhdGlvbicsXG4gICAgICBkZXRhaWxzOiBgU3RhcnRpbmcgZGVmYXVsdCBlbGVtZW50IHBvcHVsYXRpb24gZm9yIHBvcnRmb2xpbzogJHtwb3J0Zm9saW9CYXNlRGlyfWBcbiAgICB9KTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBidW5kbGVkIGRhdGEgZGlyZWN0b3J5XG4gICAgY29uc3QgZGF0YURpciA9IGF3YWl0IHRoaXMuZmluZERhdGFEaXJlY3RvcnkoKTtcbiAgICBpZiAoIWRhdGFEaXIpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnkgZm91bmQgLSBwb3J0Zm9saW8gd2lsbCBzdGFydCBlbXB0eScsXG4gICAgICAgIHsgXG4gICAgICAgICAgc2VhcmNoUGF0aHM6IHRoaXMuZGF0YVNlYXJjaFBhdGhzLnNsaWNlKDAsIDMpLCAvLyBMb2cgZmlyc3QgZmV3IHBhdGhzIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgZGlybmFtZTogdGhpcy5fX2Rpcm5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJhY2sgdG90YWwgZmlsZXMgY29waWVkXG4gICAgbGV0IHRvdGFsQ29waWVkID0gMDtcbiAgICBjb25zdCBjb3BpZWRDb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBcbiAgICAvLyBDb3B5IGVhY2ggZWxlbWVudCB0eXBlIC0gZGlyZWN0b3JpZXMgbm93IG1hdGNoIGVudW0gdmFsdWVzIChhbGwgcGx1cmFsKVxuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZURpciA9IHBhdGguam9pbihkYXRhRGlyLCBlbGVtZW50VHlwZSk7XG4gICAgICBjb25zdCBkZXN0RGlyID0gcGF0aC5qb2luKHBvcnRmb2xpb0Jhc2VEaXIsIGVsZW1lbnRUeXBlKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgc291cmNlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgYXdhaXQgZnMuYWNjZXNzKHNvdXJjZURpcik7XG4gICAgICAgIGNvbnN0IGNvcGllZENvdW50ID0gYXdhaXQgdGhpcy5jb3B5RWxlbWVudEZpbGVzKHNvdXJjZURpciwgZGVzdERpciwgZWxlbWVudFR5cGUpO1xuICAgICAgICBjb3BpZWRDb3VudHNbZWxlbWVudFR5cGVdID0gY29waWVkQ291bnQ7XG4gICAgICAgIHRvdGFsQ29waWVkICs9IGNvcGllZENvdW50O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gU291cmNlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBza2lwXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vICR7ZWxlbWVudFR5cGV9IGRpcmVjdG9yeSBpbiBidW5kbGVkIGRhdGFgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKHRvdGFsQ29waWVkID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU3VjY2Vzc2Z1bGx5IHBvcHVsYXRlZCBwb3J0Zm9saW8gd2l0aCAke3RvdGFsQ29waWVkfSBkZWZhdWx0IGVsZW1lbnQocylgLFxuICAgICAgICB7XG4gICAgICAgICAgcG9ydGZvbGlvQmFzZURpcixcbiAgICAgICAgICBkYXRhRGlyLFxuICAgICAgICAgIGJyZWFrZG93bjogY29waWVkQ291bnRzXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICBcbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3Igc3VjY2Vzc2Z1bCBwb3B1bGF0aW9uXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQT1JURk9MSU9fUE9QVUxBVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBlcmZvcm1Qb3B1bGF0aW9uJyxcbiAgICAgICAgZGV0YWlsczogYFN1Y2Nlc3NmdWxseSBwb3B1bGF0ZWQgcG9ydGZvbGlvIHdpdGggJHt0b3RhbENvcGllZH0gZGVmYXVsdCBlbGVtZW50c2AsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgcG9ydGZvbGlvQmFzZURpcixcbiAgICAgICAgICBkYXRhRGlyLFxuICAgICAgICAgIGNvcGllZENvdW50c1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmluZm8oJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBObyBuZXcgZWxlbWVudHMgdG8gY29weSAtIHBvcnRmb2xpbyBtYXkgYWxyZWFkeSBoYXZlIGNvbnRlbnQnKTtcbiAgICB9XG4gIH1cbn0iXX0=