@dollhousemcp/mcp-server 2.0.39 → 2.0.40

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 (55) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cache/CollectionCache.d.ts +1 -0
  3. package/dist/cache/CollectionCache.d.ts.map +1 -1
  4. package/dist/cache/CollectionCache.js +7 -16
  5. package/dist/cache/CollectionIndexCache.d.ts +1 -1
  6. package/dist/cache/CollectionIndexCache.d.ts.map +1 -1
  7. package/dist/cache/CollectionIndexCache.js +3 -2
  8. package/dist/cache/cachePaths.d.ts +7 -0
  9. package/dist/cache/cachePaths.d.ts.map +1 -0
  10. package/dist/cache/cachePaths.js +15 -0
  11. package/dist/di/Container.js +2 -2
  12. package/dist/elements/agents/AgentManager.d.ts +121 -1
  13. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  14. package/dist/elements/agents/AgentManager.js +203 -31
  15. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  16. package/dist/elements/base/BaseElementManager.js +4 -18
  17. package/dist/elements/memories/Memory.d.ts +7 -0
  18. package/dist/elements/memories/Memory.d.ts.map +1 -1
  19. package/dist/elements/memories/Memory.js +68 -34
  20. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  21. package/dist/elements/memories/MemoryManager.js +10 -2
  22. package/dist/elements/memories/memoryYamlValidation.d.ts +6 -0
  23. package/dist/elements/memories/memoryYamlValidation.d.ts.map +1 -0
  24. package/dist/elements/memories/memoryYamlValidation.js +25 -0
  25. package/dist/generated/version.d.ts +2 -2
  26. package/dist/generated/version.js +3 -3
  27. package/dist/handlers/CollectionHandler.d.ts.map +1 -1
  28. package/dist/handlers/CollectionHandler.js +2 -3
  29. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +1 -1
  30. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  31. package/dist/handlers/mcp-aql/MCPAQLHandler.js +135 -71
  32. package/dist/handlers/mcp-aql/OperationSchema.js +4 -4
  33. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
  34. package/dist/handlers/mcp-aql/policies/ElementPolicies.js +7 -5
  35. package/dist/portfolio/PortfolioManager.d.ts +5 -1
  36. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  37. package/dist/portfolio/PortfolioManager.js +9 -3
  38. package/dist/security/contentValidator.d.ts +9 -1
  39. package/dist/security/contentValidator.d.ts.map +1 -1
  40. package/dist/security/contentValidator.js +24 -3
  41. package/dist/security/secureYamlParser.d.ts +3 -1
  42. package/dist/security/secureYamlParser.d.ts.map +1 -1
  43. package/dist/security/secureYamlParser.js +3 -3
  44. package/dist/security/securityMonitor.d.ts +1 -1
  45. package/dist/security/securityMonitor.d.ts.map +1 -1
  46. package/dist/security/securityMonitor.js +1 -1
  47. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  48. package/dist/security/validation/BackgroundValidator.js +6 -4
  49. package/dist/storage/MemoryMetadataExtractor.d.ts.map +1 -1
  50. package/dist/storage/MemoryMetadataExtractor.js +7 -2
  51. package/dist/utils/filesystem.d.ts +6 -0
  52. package/dist/utils/filesystem.d.ts.map +1 -1
  53. package/dist/utils/filesystem.js +22 -1
  54. package/package.json +9 -9
  55. package/server.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"BaseElementManager.d.ts","sourceRoot":"","sources":["../../../src/elements/base/BaseElementManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BaseElementManager.d.ts","sourceRoot":"","sources":["../../../src/elements/base/BaseElementManager.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,7 @@ import { ElementStorageLayer } from '../../storage/ElementStorageLayer.js';
32
32
  import { getGatekeeperAuthoringErrors } from '../../handlers/mcp-aql/policies/ElementPolicies.js';
33
33
  import { MEMORY_CONSTANTS } from '../memories/constants.js';
34
34
  import { getValidatedScanCooldown, getValidatedElementCacheTTL, getValidatedPathCacheTTL } from '../../config/performance-constants.js';
35
+ import { normalizeElementFilename, normalizeElementStorageIdentity } from '../../utils/filesystem.js';
35
36
  const DEFAULT_ELEMENT_CACHE_TTL_MS = getValidatedElementCacheTTL();
36
37
  const DEFAULT_PATH_CACHE_TTL_MS = getValidatedPathCacheTTL();
37
38
  /**
@@ -1009,22 +1010,7 @@ export class BaseElementManager {
1009
1010
  * @returns Normalized kebab-case filename (without extension)
1010
1011
  */
1011
1012
  normalizeFilename(name) {
1012
- if (!name || name.trim().length === 0) {
1013
- return 'unnamed';
1014
- }
1015
- return name
1016
- // Step 1: Insert hyphens between camelCase boundaries (lowercase followed by uppercase)
1017
- .replace(/([a-z])([A-Z])/g, '$1-$2')
1018
- // Step 2: Replace spaces and underscores with hyphens
1019
- .replace(/[\s_]+/g, '-')
1020
- // Step 3: Convert to lowercase
1021
- .toLowerCase()
1022
- // Step 4: Strip invalid characters (keep only alphanumeric and hyphens)
1023
- .replace(/[^a-z0-9-]/g, '-')
1024
- // Step 5: Collapse multiple consecutive hyphens
1025
- .replace(/-+/g, '-')
1026
- // Step 6: Trim leading and trailing hyphens
1027
- .replace(/^-+|-+$/g, '');
1013
+ return normalizeElementFilename(name);
1028
1014
  }
1029
1015
  /**
1030
1016
  * Get the standardized filename for an element.
@@ -1043,7 +1029,7 @@ export class BaseElementManager {
1043
1029
  * getElementFilename("fix-persona-helper") // → "fix-persona-helper.md" (no mangling)
1044
1030
  */
1045
1031
  getElementFilename(name) {
1046
- const normalizedName = this.normalizeFilename(name) || 'unnamed';
1032
+ const normalizedName = normalizeElementStorageIdentity(name);
1047
1033
  const extension = this.getFileExtension();
1048
1034
  return `${normalizedName}${extension}`;
1049
1035
  }
@@ -1056,4 +1042,4 @@ export class BaseElementManager {
1056
1042
  return result.errors.map(e => ({ field: 'general', message: e }));
1057
1043
  }
1058
1044
  }
1059
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0sd0NBQXdDLENBQUM7QUFDckcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHM0UsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBC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UUFBUSxDQUFDLENBQUM7UUFDL0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZUVsZW1lbnRNYW5hZ2VyIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGVsZW1lbnQgbWFuYWdlcnNcbiAqXG4gKiBQcm92aWRlcyBjb21tb24gQ1JVRCBvcGVyYXRpb25zIGZvciBhbGwgZWxlbWVudCB0eXBlcyB1c2luZyB0aGVcbiAqIFRlbXBsYXRlIE1ldGhvZCBQYXR0ZXJuOlxuICogLSBEZWZpbmVzIHRoZSBza2VsZXRvbiBvZiBvcGVyYXRpb25zIGluIGJhc2UgY2xhc3NcbiAqIC0gTGV0cyBzdWJjbGFzc2VzIG92ZXJyaWRlIHNwZWNpZmljIHN0ZXBzIHdpdGhvdXQgY2hhbmdpbmcgc3RydWN0dXJlXG4gKlxuICogU3ViY2xhc3NlczogU2tpbGxNYW5hZ2VyLCBUZW1wbGF0ZU1hbmFnZXIsIEFnZW50TWFuYWdlciwgTWVtb3J5TWFuYWdlclxuICpcbiAqIFNFQ1VSSVRZOlxuICogMS4gQ1JJVElDQUw6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgcmVhZC93cml0ZSBvcGVyYXRpb25zXG4gKiAyLiBISUdIOiBQYXRoIHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRhY2tzXG4gKiAzLiBNRURJVU06IFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsXG4gKiA0LiBNRURJVU06IElucHV0IHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiB0aHJvdWdob3V0XG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IElFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudCwgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9lcnJvcnMuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvTFJVQ2FjaGUuanMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFBhdGhWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9wYXRoVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEVsZW1lbnRFdmVudERpc3BhdGNoZXIsIEVsZW1lbnRFdmVudFBheWxvYWQgfSBmcm9tICcuLi8uLi9ldmVudHMvRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHJhbnNhY3Rpb25TY29wZSB9IGZyb20gJy4vRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUuanMnO1xuaW1wb3J0IHsgRmlsZVdhdGNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVXYXRjaFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IHR5cGUgRWxlbWVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vRWxlbWVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50U3RvcmFnZUxheWVyIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9FbGVtZW50U3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VMYXllciB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvSVN0b3JhZ2VMYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRJbmRleEVudHJ5IH0gZnJvbSAnLi4vLi4vc3RvcmFnZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXRHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuaW1wb3J0IHsgTUVNT1JZX0NPTlNUQU5UUyB9IGZyb20gJy4uL21lbW9yaWVzL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24sXG4gIGdldFZhbGlkYXRlZEVsZW1lbnRDYWNoZVRUTCxcbiAgZ2V0VmFsaWRhdGVkUGF0aENhY2hlVFRMXG59IGZyb20gJy4uLy4uL2NvbmZpZy9wZXJmb3JtYW5jZS1jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDYWNoZU1lbW9yeUJ1ZGdldCB9IGZyb20gJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJztcbmltcG9ydCB0eXBlIHsgQmFja3VwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnO1xuXG5jb25zdCBERUZBVUxUX0VMRU1FTlRfQ0FDSEVfVFRMX01TID0gZ2V0VmFsaWRhdGVkRWxlbWVudENhY2hlVFRMKCk7XG5jb25zdCBERUZBVUxUX1BBVEhfQ0FDSEVfVFRMX01TID0gZ2V0VmFsaWRhdGVkUGF0aENhY2hlVFRMKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUVsZW1lbnRNYW5hZ2VyT3B0aW9ucyB7XG4gIGVsZW1lbnREaXJPdmVycmlkZT86IHN0cmluZztcbiAgZXZlbnREaXNwYXRjaGVyPzogRWxlbWVudEV2ZW50RGlzcGF0Y2hlcjtcbiAgZWxlbWVudENhY2hlVFRMPzogbnVtYmVyO1xuICBwYXRoQ2FjaGVUVEw/OiBudW1iZXI7XG4gIGVuYWJsZUZpbGVXYXRjaGVyPzogYm9vbGVhbjtcbiAgYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2U/OiBib29sZWFuO1xuICBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZTtcbiAgbWVtb3J5QnVkZ2V0PzogQ2FjaGVNZW1vcnlCdWRnZXQ7XG4gIGJhY2t1cFNlcnZpY2U/OiBCYWNrdXBTZXJ2aWNlO1xufVxuXG4vKipcbiAqIFJlY29yZCBvZiBhbiBlbGVtZW50IHRoYXQgZmFpbGVkIHRvIGxvYWQgKElzc3VlICM3MDgpLlxuICogU3RvcmVkIHNvIGNhbGxlcnMgY2FuIGRpc3Rpbmd1aXNoIFwiZmlsZSBub3QgZm91bmRcIiBmcm9tIFwiZmlsZSBpbnZhbGlkXCIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZEVsZW1lbnRSZWNvcmQge1xuICAvKiogUmVsYXRpdmUgZmlsZSBwYXRoIHdpdGhpbiB0aGUgZWxlbWVudCBkaXJlY3RvcnkuICovXG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSByZWFzb24gdGhlIGVsZW1lbnQgd2FzIHJlamVjdGVkLiAqL1xuICByZWFzb246IHN0cmluZztcbiAgLyoqIElTTyB0aW1lc3RhbXAgb2YgbGFzdCBmYWlsZWQgbG9hZCBhdHRlbXB0LiAqL1xuICBmYWlsZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgaW1wbGVtZW50aW5nIGNvbW1vbiBlbGVtZW50IG1hbmFnZW1lbnQgb3BlcmF0aW9uc1xuICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBlbGVtZW50LXNwZWNpZmljIGxvZ2ljIHZpYSBhYnN0cmFjdCBtZXRob2RzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRWxlbWVudE1hbmFnZXI8VCBleHRlbmRzIElFbGVtZW50PiBpbXBsZW1lbnRzIElFbGVtZW50TWFuYWdlcjxUPiB7XG4gIHByb3RlY3RlZCBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcm90ZWN0ZWQgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXI7XG4gIHByb3RlY3RlZCBmaWxlT3BlcmF0aW9uczogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2U7XG4gIHByb3RlY3RlZCBlbGVtZW50RGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgdGhpcyBlbGVtZW50IHR5cGVcbiAgICogT2J0YWluZWQgZnJvbSBWYWxpZGF0aW9uUmVnaXN0cnkgZHVyaW5nIGNvbnN0cnVjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRvcjogRWxlbWVudFZhbGlkYXRvcjtcblxuICAvLyBQcmltYXJ5IGNhY2hlOiBJRCDihpIgRWxlbWVudCAod2l0aCBzaXplIGxpbWl0cyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcylcbiAgcHJvdGVjdGVkIGVsZW1lbnRzOiBMUlVDYWNoZTxUPjtcblxuICAvLyBSZXZlcnNlIGluZGV4OiBBYnNvbHV0ZSBGaWxlUGF0aCDihpIgRWxlbWVudCBJRCAod2l0aCBzaXplIGxpbWl0cylcbiAgcHJpdmF0ZSBmaWxlUGF0aFRvSWQ6IExSVUNhY2hlPHN0cmluZz47XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudEdlbmVyYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBjYWNoZUdlbmVyYXRpb25Db3VudGVyID0gMDtcbiAgcHJpdmF0ZSB3YXRjaGVyQ2xlYW51cD86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnREaXNwYXRjaGVyOiBFbGVtZW50RXZlbnREaXNwYXRjaGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZW1vcnlCdWRnZXQ/OiBDYWNoZU1lbW9yeUJ1ZGdldDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhY2t1cFNlcnZpY2U/OiBCYWNrdXBTZXJ2aWNlO1xuXG4gIC8qKiBNYXAgcGx1cmFsIEVsZW1lbnRUeXBlIGVudW0gdmFsdWVzIHRvIHNpbmd1bGFyIENvbnRlbnRWYWxpZGF0b3IgY29udGV4dC5cbiAgICogIFBhcnRpYWwgYmVjYXVzZSBub3QgYWxsIGVsZW1lbnQgdHlwZXMgaGF2ZSBhIGNvbnRlbnQgY29udGV4dCAoZS5nLiwgZW5zZW1ibGVzKS4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFQ6IFBhcnRpYWw8UmVjb3JkPEVsZW1lbnRUeXBlLCAncGVyc29uYScgfCAnc2tpbGwnIHwgJ3RlbXBsYXRlJyB8ICdhZ2VudCcgfCAnbWVtb3J5Jz4+ID0ge1xuICAgIFtFbGVtZW50VHlwZS5QRVJTT05BXTogJ3BlcnNvbmEnLFxuICAgIFtFbGVtZW50VHlwZS5TS0lMTF06ICdza2lsbCcsXG4gICAgW0VsZW1lbnRUeXBlLlRFTVBMQVRFXTogJ3RlbXBsYXRlJyxcbiAgICBbRWxlbWVudFR5cGUuQUdFTlRdOiAnYWdlbnQnLFxuICAgIFtFbGVtZW50VHlwZS5NRU1PUlldOiAnbWVtb3J5JyxcbiAgfTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RvcmFnZUxheWVyOiBJU3RvcmFnZUxheWVyO1xuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzA4OiBFbGVtZW50cyB0aGF0IGV4aXN0IG9uIGRpc2sgYnV0IGZhaWxlZCB2YWxpZGF0aW9uIGR1cmluZyBsb2FkLlxuICAgKiBLZXllZCBieSByZWxhdGl2ZSBmaWxlIHBhdGggZm9yIGRlZHVwbGljYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGludmFsaWRFbGVtZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBJbnZhbGlkRWxlbWVudFJlY29yZD4oKTtcblxuICAvKipcbiAgICogVHJhY2tzIGZpbGUgcGF0aHMgd2hvc2UgbG9hZCBmYWlsdXJlIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkIGF0IGVycm9yIGxldmVsLlxuICAgKiBSZXBlYXRlZCBmYWlsdXJlcyB3aXRoIHRoZSBzYW1lIHJlYXNvbiBhcmUgZGVtb3RlZCB0byBkZWJ1ZyB0byBhdm9pZCBsb2cgZmxvb2RpbmcuXG4gICAqIENsZWFyZWQgd2hlbiB0aGUgZmlsZSBjaGFuZ2VzIG9uIGRpc2sgb3IgbG9hZHMgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdXBwcmVzc2VkTG9hZFBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbW9zdCByZWNlbnQgbG9hZCgpIGZhaWx1cmUgZm9yIHRoaXMgcGF0aCB3YXMgc3VwcHJlc3NlZFxuICAgKiBiZWNhdXNlIGl0IHdhcyBhIHJlcGVhdCBvZiBhbiBhbHJlYWR5LWxvZ2dlZCBlcnJvci5cbiAgICogU3ViY2xhc3NlcyBjYW4gdXNlIHRoaXMgdG8gYXZvaWQgZHVwbGljYXRlIHNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIFJlbGF0aXZlIGZpbGUgcGF0aCB3aXRoaW4gdGhlIGVsZW1lbnQgZGlyZWN0b3J5XG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGVycm9yIGZvciB0aGlzIHBhdGggaXMgY3VycmVudGx5IHN1cHByZXNzZWRcbiAgICovXG4gIHByb3RlY3RlZCBpc0xvYWRFcnJvclN1cHByZXNzZWQoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuaGFzKGZpbGVQYXRoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZnRlckxvYWQ/KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYmVmb3JlU2F2ZT8oZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBhZnRlclNhdmU/KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgZmluZEJ5SWRlbnRpZmllcj8oaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPjtcbiAgcHJvdGVjdGVkIGNhbkRlbGV0ZT8oZWxlbWVudDogVCk6IFByb21pc2U8eyBhbGxvd2VkOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfT47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhY2t1cCBiZWZvcmUgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZmlsZS5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gbm8tb3AgKGUuZy4gTWVtb3J5TWFuYWdlciBoYXMgaXRzIG93biBiYWNrdXAgc3lzdGVtKS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVCYWNrdXBCZWZvcmVTYXZlKGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmJhY2t1cFNlcnZpY2UpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlU2F2ZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGJhY2t1cCBiZWZvcmUgZGVsZXRpbmcgYSBmaWxlIChtb3ZlcyBmaWxlIHRvIGJhY2t1cCBkaXIpLlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9yaWdpbmFsIGZpbGUgd2FzIG1vdmVkIChjYWxsZXIgc2hvdWxkIHNraXAgZGVsZXRlRmlsZSkuXG4gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRvIG5vLW9wIChlLmcuIE1lbW9yeU1hbmFnZXIgaGFzIGl0cyBvd24gYmFja3VwIHN5c3RlbSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmJhY2t1cFNlcnZpY2UpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJhY2t1cFNlcnZpY2UuYmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSk7XG4gICAgcmV0dXJuICEhcmVzdWx0Lm1vdmVkT3JpZ2luYWw7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBldmVudCBkaXNwYXRjaGVyIGZvciBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBlbWl0IGN1c3RvbSBldmVudHMuXG4gICAqXG4gICAqIEJhc2VFbGVtZW50TWFuYWdlciBoYW5kbGVzIHN0YW5kYXJkIGxpZmVjeWNsZSBldmVudHMgKGxvYWQsIHNhdmUsIGRlbGV0ZSkgYXV0b21hdGljYWxseS5cbiAgICogU3ViY2xhc3NlcyBzaG91bGQgdXNlIHRoaXMgZ2V0dGVyIG9ubHkgd2hlbiB0aGV5IG5lZWQgdG8gZW1pdCBhZGRpdGlvbmFsIGRvbWFpbi1zcGVjaWZpY1xuICAgKiBldmVudHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkIENSVUQgbGlmZWN5Y2xlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBQZXJzb25hTWFuYWdlciBlbWl0cyBhY3RpdmF0aW9uL2RlYWN0aXZhdGlvbiBldmVudHNcbiAgICogdGhpcy5kaXNwYXRjaGVyLmVtaXQoJ2VsZW1lbnQ6YWN0aXZhdGUnLCB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7Li4ufSkpO1xuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgRWxlbWVudEV2ZW50RGlzcGF0Y2hlciBpbnN0YW5jZSB1c2VkIGJ5IHRoaXMgbWFuYWdlclxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBkaXNwYXRjaGVyKCk6IEVsZW1lbnRFdmVudERpc3BhdGNoZXIge1xuICAgIHJldHVybiB0aGlzLmV2ZW50RGlzcGF0Y2hlcjtcbiAgfVxuXG4gIC8vIENhY2hlIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9FTEVNRU5UX0NBQ0hFX1NJWkUgPSAxMDAwO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUEFUSF9DQUNIRV9TSVpFID0gMTAwMDtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgLSBpbml0aWFsaXplcyBjb21tb24gZGVwZW5kZW5jaWVzXG4gICAqIEBwYXJhbSBlbGVtZW50VHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnQgdGhpcyBtYW5hZ2VyIGhhbmRsZXNcbiAgICogQHBhcmFtIHBvcnRmb2xpb01hbmFnZXIgLSBQb3J0Zm9saW8gbWFuYWdlciBmb3IgZGlyZWN0b3J5IHJlc29sdXRpb25cbiAgICogQHBhcmFtIGZpbGVMb2NrTWFuYWdlciAtIEZpbGUgbG9jayBtYW5hZ2VyIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgZmlsZVdhdGNoU2VydmljZVxuICAgKiBAcGFyYW0gZmlsZU9wZXJhdGlvbnNTZXJ2aWNlIC0gU2VydmljZSBmb3IgZmlsZSBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uUmVnaXN0cnkgLSBSZWdpc3RyeSBmb3Igb2J0YWluaW5nIHR5cGUtc3BlY2lmaWMgdmFsaWRhdG9yc1xuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIsXG4gICAgb3B0aW9uczogQmFzZUVsZW1lbnRNYW5hZ2VyT3B0aW9ucyA9IHt9LFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5XG4gICkge1xuICAgIHRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTtcbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIgPSBwb3J0Zm9saW9NYW5hZ2VyO1xuICAgIHRoaXMuZmlsZUxvY2tNYW5hZ2VyID0gZmlsZUxvY2tNYW5hZ2VyO1xuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBmaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gICAgdGhpcy5maWxlV2F0Y2hTZXJ2aWNlID0gb3B0aW9ucy5maWxlV2F0Y2hTZXJ2aWNlO1xuICAgIHRoaXMuYmFja3VwU2VydmljZSA9IG9wdGlvbnMuYmFja3VwU2VydmljZTtcblxuICAgIC8vIEdldCB0aGUgc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFZhbGlkYXRvcihlbGVtZW50VHlwZSk7XG5cbiAgICBjb25zdCBlbGVtZW50Q2FjaGVUVEwgPSBvcHRpb25zLmVsZW1lbnRDYWNoZVRUTCA/PyBERUZBVUxUX0VMRU1FTlRfQ0FDSEVfVFRMX01TO1xuICAgIGNvbnN0IHBhdGhDYWNoZVRUTCA9IG9wdGlvbnMucGF0aENhY2hlVFRMID8/IERFRkFVTFRfUEFUSF9DQUNIRV9UVExfTVM7XG4gICAgdGhpcy5tZW1vcnlCdWRnZXQgPSBvcHRpb25zLm1lbW9yeUJ1ZGdldDtcblxuICAgIGNvbnN0IG9uU2V0Q2FsbGJhY2sgPSB0aGlzLm1lbW9yeUJ1ZGdldFxuICAgICAgPyAoKSA9PiB0aGlzLm1lbW9yeUJ1ZGdldCEuZW5mb3JjZSgpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIEluaXRpYWxpemUgTFJVIGNhY2hlcyB3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgdGhpcy5lbGVtZW50cyA9IG5ldyBMUlVDYWNoZTxUPih7XG4gICAgICBuYW1lOiBgZWxlbWVudHM6JHtlbGVtZW50VHlwZX1gLFxuICAgICAgbWF4U2l6ZTogQmFzZUVsZW1lbnRNYW5hZ2VyLk1BWF9FTEVNRU5UX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogNTAsIC8vIE1heCA1ME1CIGZvciBlbGVtZW50IGNhY2hlXG4gICAgICB0dGxNczogZWxlbWVudENhY2hlVFRMLFxuICAgICAgb25TZXQ6IG9uU2V0Q2FsbGJhY2ssXG4gICAgfSk7XG5cbiAgICB0aGlzLmZpbGVQYXRoVG9JZCA9IG5ldyBMUlVDYWNoZTxzdHJpbmc+KHtcbiAgICAgIG5hbWU6IGBwYXRoSW5kZXg6JHtlbGVtZW50VHlwZX1gLFxuICAgICAgbWF4U2l6ZTogQmFzZUVsZW1lbnRNYW5hZ2VyLk1BWF9QQVRIX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogMTAsIC8vIE1heCAxME1CIGZvciBwYXRoIG1hcHBpbmdzXG4gICAgICB0dGxNczogcGF0aENhY2hlVFRMLFxuICAgICAgb25TZXQ6IG9uU2V0Q2FsbGJhY2ssXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlciBjYWNoZXMgd2l0aCBnbG9iYWwgbWVtb3J5IGJ1ZGdldFxuICAgIGlmICh0aGlzLm1lbW9yeUJ1ZGdldCkge1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQucmVnaXN0ZXIodGhpcy5lbGVtZW50cyk7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC5yZWdpc3Rlcih0aGlzLmZpbGVQYXRoVG9JZCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZWxlbWVudERpck92ZXJyaWRlKSB7XG4gICAgICB0aGlzLmVsZW1lbnREaXIgPSBvcHRpb25zLmVsZW1lbnREaXJPdmVycmlkZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAodGhpcy5wb3J0Zm9saW9NYW5hZ2VyIGFzIGFueSkuZ2V0RWxlbWVudERpciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5lbGVtZW50RGlyID0gKHRoaXMucG9ydGZvbGlvTWFuYWdlciBhcyBhbnkpLmdldEVsZW1lbnREaXIoZWxlbWVudFR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmFibGUgdG8gcmVzb2x2ZSBlbGVtZW50IGRpcmVjdG9yeSBmb3IgJHtlbGVtZW50VHlwZX0uIGAgK1xuICAgICAgICAnUHJvdmlkZSBhbiBlbGVtZW50RGlyT3ZlcnJpZGUgd2hlbiBpbnN0YW50aWF0aW5nIHRoaXMgbWFuYWdlci4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyID0gb3B0aW9ucy5ldmVudERpc3BhdGNoZXIgPz8gRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5nZXRTaGFyZWREaXNwYXRjaGVyKCk7XG4gICAgdGhpcy5hdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZSA9XG4gICAgICBvcHRpb25zLmF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlID8/IHByb2Nlc3MuZW52LkFVVE9fUkVMT0FEX09OX0VYVEVSTkFMX0NIQU5HRSA9PT0gJ3RydWUnO1xuXG4gICAgY29uc3QgZW5hYmxlV2F0Y2hlciA9IG9wdGlvbnMuZW5hYmxlRmlsZVdhdGNoZXIgPz8gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VOQUJMRV9GSUxFX1dBVENIRVIgPT09ICd0cnVlJztcbiAgICBpZiAoZW5hYmxlV2F0Y2hlciAmJiB0aGlzLmZpbGVXYXRjaFNlcnZpY2UpIHtcbiAgICAgIHRoaXMud2F0Y2hlckNsZWFudXAgPSB0aGlzLmZpbGVXYXRjaFNlcnZpY2Uud2F0Y2hEaXJlY3RvcnkoXG4gICAgICAgIHRoaXMuZWxlbWVudERpcixcbiAgICAgICAgKHJlbGF0aXZlUGF0aCkgPT4gdGhpcy5oYW5kbGVFeHRlcm5hbENoYW5nZShyZWxhdGl2ZVBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmFnZUxheWVyID0gdGhpcy5jcmVhdGVTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgdGhlIHN0b3JhZ2UgbGF5ZXIuXG4gICAqIERlZmF1bHQgcmV0dXJucyBFbGVtZW50U3RvcmFnZUxheWVyIGZvciAubWQgZWxlbWVudHMuXG4gICAqIFN1YmNsYXNzZXMgKGUuZy4gTWVtb3J5TWFuYWdlcikgY2FuIG92ZXJyaWRlIHRvIHJldHVybiBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UpOiBJU3RvcmFnZUxheWVyIHtcbiAgICByZXR1cm4gbmV3IEVsZW1lbnRTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB7XG4gICAgICBlbGVtZW50RGlyOiB0aGlzLmVsZW1lbnREaXIsXG4gICAgICBmaWxlRXh0ZW5zaW9uOiB0aGlzLmdldEZpbGVFeHRlbnNpb24oKSxcbiAgICAgIHNjYW5Db29sZG93bk1zOiBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24oKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaW5ndWxhciBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhpcyBlbGVtZW50IHR5cGUgKGUuZy4sIFwic2tpbGxcIiwgXCJwZXJzb25hXCIpLlxuICAgKiBVc2VkIGluIGZpbGVuYW1lIGdlbmVyYXRpb24gKHtuYW1lfS17bGFiZWx9Lm1kKSBhbmQgZGlzcGxheSBzdHJpbmdzLlxuICAgKiBNdXN0IHJldHVybiB0aGUgc2luZ3VsYXIgZm9ybSDigJQgbm90IHRoZSBwbHVyYWwgRWxlbWVudFR5cGUgdmFsdWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyBhIGNhcGl0YWxpemVkIHZlcnNpb24gb2YgdGhlIGVsZW1lbnQgbGFiZWwuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZ2V0RWxlbWVudExhYmVsKCk7XG4gICAgcmV0dXJuIGxhYmVsLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbGFiZWwuc2xpY2UoMSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbiBlbGVtZW50IGZyb20gZmlsZVxuICAgKiBURU1QTEFURSBNRVRIT0Q6IERlZmluZXMgdGhlIGFsZ29yaXRobSwgc3ViY2xhc3NlcyBjdXN0b21pemUgc3RlcHNcbiAgICpcbiAgICogU0VDVVJJVFkgRklYRVMgKGluaGVyaXRlZCBmcm9tIG9yaWdpbmFsIG1hbmFnZXJzKTpcbiAgICogLSB0aGlzLmZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZSgpIHByZXZlbnRzIHJhY2UgY29uZGl0aW9uc1xuICAgKiAtIFBhdGggdmFsaWRhdGlvbiBwcmV2ZW50cyB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsXG4gICAqL1xuICBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB7IHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpsb2FkOnN0YXJ0JyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEVsZW1lbnRGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubG9hZGBcbiAgICAgIH0pO1xuICAgICAgLy8gSXNzdWUgIzgxMDogUGFzcyBlbGVtZW50IHR5cGUgYXMgY29udGVudENvbnRleHQgc28gU2VjdXJlWWFtbFBhcnNlciBleGVtcHRzXG4gICAgICAvLyBsZWdpdGltYXRlIHBhdHRlcm5zIChlLmcuLCA8c2NyaXB0PiBzZWN0aW9uIHRhZ3MgaW4gdGVtcGxhdGVzKVxuICAgICAgY29uc3QgY29udGVudENvbnRleHQgPSBCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFRbdGhpcy5lbGVtZW50VHlwZV07XG4gICAgICBpZiAoIWNvbnRlbnRDb250ZXh0KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgWyR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfV0gTm8gY29udGVudENvbnRleHQgbWFwcGluZyBmb3IgZWxlbWVudFR5cGUgJyR7dGhpcy5lbGVtZW50VHlwZX0nIOKAlCBwYXJzaW5nIHdpdGhvdXQgY29udGV4dCBleGVtcHRpb25zLiBBdmFpbGFibGU6ICR7T2JqZWN0LmtleXMoQmFzZUVsZW1lbnRNYW5hZ2VyLkVMRU1FTlRfVFlQRV9UT19DT05URVhUKS5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKGNvbnRlbnQsIHVuZGVmaW5lZCwgeyBjb250ZW50Q29udGV4dCB9KTtcblxuICAgICAgLy8gSXNzdWUgIzY5NTogRmlsbCBpbiBtaXNzaW5nIG1ldGFkYXRhIGZpZWxkcyB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzXG4gICAgICAvLyBiZWZvcmUgcGFyc2VNZXRhZGF0YSgpIHNvIG9sZGVyIGVsZW1lbnRzIHdpdGggc3BhcnNlIGZyb250bWF0dGVyXG4gICAgICAvLyBkb24ndCBnZXQgcmVqZWN0ZWQuXG4gICAgICB0aGlzLm1pZ3JhdGVNZXRhZGF0YURlZmF1bHRzKHBhcnNlZC5kYXRhLCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG5cbiAgICAgIGlmICh0aGlzLmFmdGVyTG9hZCkge1xuICAgICAgICBhd2FpdCB0aGlzLmFmdGVyTG9hZChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBJc3N1ZSAjNzA4OiBDbGVhciBhbnkgcHJldmlvdXMgaW52YWxpZCByZWNvcmQgb24gc3VjY2Vzc2Z1bCBsb2FkXG4gICAgICB0aGlzLmludmFsaWRFbGVtZW50cy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5kZWxldGUocmVsYXRpdmVQYXRoKTtcblxuICAgICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBsb2FkZWQ6ICR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OmxvYWQ6c3VjY2VzcycsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCB9KVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElzc3VlICM3MDg6IFJlY29yZCB0aGUgZmFpbHVyZSBzbyBjYWxsZXJzIGNhbiBkaXN0aW5ndWlzaFxuICAgICAgLy8gXCJmaWxlIG5vdCBmb3VuZFwiIGZyb20gXCJmaWxlIGV4aXN0cyBidXQgZmFpbGVkIHZhbGlkYXRpb25cIi5cbiAgICAgIC8vIE9ubHkgdHJhY2sgcGFyc2UvdmFsaWRhdGlvbiBlcnJvcnMg4oCUIEVOT0VOVCBtZWFucyB0aGUgZmlsZSBpcyBnZW51aW5lbHlcbiAgICAgIC8vIG1pc3NpbmcsIG5vdCBpbnZhbGlkLCBzbyB3ZSBtdXN0IG5vdCBwb2xsdXRlIHRoZSBpbnZhbGlkIG1hcCB3aXRoIGl0LlxuICAgICAgY29uc3QgaXNGaWxlTm90Rm91bmQgPSAoZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSAnRU5PRU5UJztcbiAgICAgIGxldCBpc1JlcGVhdEVycm9yID0gZmFsc2U7XG5cbiAgICAgIGlmICghaXNGaWxlTm90Rm91bmQpIHtcbiAgICAgICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuaW52YWxpZEVsZW1lbnRzLmdldChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICBpc1JlcGVhdEVycm9yID0gZXhpc3Rpbmc/LnJlYXNvbiA9PT0gcmVhc29uO1xuXG4gICAgICAgIHRoaXMuaW52YWxpZEVsZW1lbnRzLnNldChyZWxhdGl2ZVBhdGgsIHtcbiAgICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICBmYWlsZWRBdDogaXNSZXBlYXRFcnJvciA/IGV4aXN0aW5nIS5mYWlsZWRBdCA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1JlcGVhdEVycm9yKSB7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5hZGQocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBTdXBwcmVzc2VkIHJlcGVhdGVkIGxvYWQgZXJyb3IgZm9yICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gJHtyZWxhdGl2ZVBhdGh9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgICAnZWxlbWVudDpsb2FkOmVycm9yJyxcbiAgICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVycm9yIH0pXG4gICAgICAgICk7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGxvYWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBmcm9tICR7YWJzb2x1dGVQYXRofTpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY5NTogUHJlLWZpbGwgbWlzc2luZyBtZXRhZGF0YSBmaWVsZHMgd2l0aCBzZW5zaWJsZSBkZWZhdWx0c1xuICAgKiBiZWZvcmUgcGFyc2VNZXRhZGF0YSgpIHJ1bnMuIFRoaXMgaW1wbGVtZW50cyB0aGUgXCJ0b2xlcmFudCByZWFkZXJcIiBwYXR0ZXJuXG4gICAqIOKAlCBzdHJpY3Qgb24gb3V0cHV0LCBsZW5pZW50IG9uIGlucHV0IGZvciBvbGRlci9zcGFyc2UgZnJvbnRtYXR0ZXIuXG4gICAqXG4gICAqIE11dGF0ZXMgYGRhdGFgIGluIHBsYWNlLiBMb2dzIGEgd2FybmluZyBmb3IgZWFjaCBkZWZhdWx0ZWQgZmllbGQgc29cbiAgICogb3BlcmF0b3JzIGtub3cgd2hpY2ggZmlsZXMgbmVlZCB1cGRhdGluZy5cbiAgICovXG4gIHByaXZhdGUgbWlncmF0ZU1ldGFkYXRhRGVmYXVsdHMoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtaWdyYXRlZDogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEluZmVyIHR5cGUgZnJvbSB0aGlzIG1hbmFnZXIncyBlbGVtZW50IHR5cGVcbiAgICBpZiAoIWRhdGEudHlwZSkge1xuICAgICAgLy8gRWxlbWVudFR5cGUgaXMgcGx1cmFsICgncGVyc29uYXMnLCAnc2tpbGxzJywgZXRjLilcbiAgICAgIC8vIFNvbWUgbWFuYWdlcnMgZXhwZWN0IHNpbmd1bGFyICgncGVyc29uYScsICdhZ2VudCcpLCBzb21lIHBsdXJhbC5cbiAgICAgIC8vIFNldCB0aGUgcGx1cmFsIGZvcm0g4oCUIHBhcnNlTWV0YWRhdGEoKSBoYW5kbGVzIG5vcm1hbGl6YXRpb24uXG4gICAgICBkYXRhLnR5cGUgPSB0aGlzLmVsZW1lbnRUeXBlO1xuICAgICAgbWlncmF0ZWQucHVzaCgndHlwZScpO1xuICAgIH1cblxuICAgIC8vIEluZmVyIG5hbWUgZnJvbSBmaWxlbmFtZSAoc3RyaXAgZXh0ZW5zaW9uLCB1bi1zbHVnaWZ5KVxuICAgIGlmICghZGF0YS5uYW1lKSB7XG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsIHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpKTtcbiAgICAgIGRhdGEubmFtZSA9IGJhc2VuYW1lO1xuICAgICAgbWlncmF0ZWQucHVzaCgnbmFtZScpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgdmVyc2lvblxuICAgIGlmICghZGF0YS52ZXJzaW9uKSB7XG4gICAgICBkYXRhLnZlcnNpb24gPSAnMS4wLjAnO1xuICAgICAgbWlncmF0ZWQucHVzaCgndmVyc2lvbicpO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgYXV0aG9yXG4gICAgaWYgKCFkYXRhLmF1dGhvcikge1xuICAgICAgZGF0YS5hdXRob3IgPSAndW5rbm93bic7XG4gICAgICBtaWdyYXRlZC5wdXNoKCdhdXRob3InKTtcbiAgICB9XG5cbiAgICBpZiAobWlncmF0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBbVG9sZXJhbnRSZWFkZXJdICR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBcIiR7ZmlsZVBhdGh9XCI6IGAgK1xuICAgICAgICBgZGVmYXVsdGVkIG1pc3NpbmcgZmllbGRzOiAke21pZ3JhdGVkLmpvaW4oJywgJyl9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzcwODogUmV0dXJucyBlbGVtZW50cyB0aGF0IGV4aXN0IG9uIGRpc2sgYnV0IGZhaWxlZCB2YWxpZGF0aW9uIGR1cmluZyBsb2FkLlxuICAgKiBDYWxsZXJzIGNhbiB1c2UgdGhpcyB0byByZXBvcnQgaW52YWxpZCBlbGVtZW50cyBpbnN0ZWFkIG9mIHNpbGVudGx5IGhpZGluZyB0aGVtLlxuICAgKi9cbiAgZ2V0SW52YWxpZEVsZW1lbnRzKCk6IEludmFsaWRFbGVtZW50UmVjb3JkW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5pbnZhbGlkRWxlbWVudHMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM3MDg6IENoZWNrIGlmIGEgc3BlY2lmaWMgZmlsZSBmYWlsZWQgdmFsaWRhdGlvbiBkdXJpbmcgbG9hZC5cbiAgICogVXNlZCBieSBnZXRfZWxlbWVudCB0byBkaXN0aW5ndWlzaCBcIm5vdCBmb3VuZFwiIGZyb20gXCJpbnZhbGlkXCIuXG4gICAqL1xuICBnZXRJbnZhbGlkRWxlbWVudChuYW1lOiBzdHJpbmcpOiBJbnZhbGlkRWxlbWVudFJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgYnkgZXhhY3QgcGF0aCBtYXRjaCBhbmQgYnkgbmFtZS1iYXNlZCBtYXRjaFxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCByZWNvcmRdIG9mIHRoaXMuaW52YWxpZEVsZW1lbnRzKSB7XG4gICAgICBpZiAoZmlsZVBhdGggPT09IG5hbWUpIHJldHVybiByZWNvcmQ7XG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsIHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpKTtcbiAgICAgIGlmIChiYXNlbmFtZSA9PT0gbmFtZSB8fCB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGJhc2VuYW1lKSA9PT0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShuYW1lKSkge1xuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgYW4gZWxlbWVudCB0byBmaWxlXG4gICAqIFRFTVBMQVRFIE1FVEhPRDogQ29tbW9uIHNhdmUgbG9naWMgd2l0aCBob29rcyBmb3IgY3VzdG9taXphdGlvblxuICAgKlxuICAgKiBTRUNVUklUWSBGSVhFUzpcbiAgICogLSB0aGlzLmZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICogLSBQYXRoIHZhbGlkYXRpb24gdG8gcHJldmVudCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiAtIFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmdcbiAgICovXG4gIGFzeW5jIHNhdmUoZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgcmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEVsZW1lbnRUcmFuc2FjdGlvblNjb3BlKHRoaXMuZ2V0RWxlbWVudExhYmVsKCksIGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfRURJVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5zYXZlYCxcbiAgICAgIGRldGFpbHM6IGBTYXZpbmcgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfTogJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9IHYke2VsZW1lbnQubWV0YWRhdGEudmVyc2lvbiB8fCAndW5rbm93bid9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGVsZW1lbnRJZDogZWxlbWVudC5pZCxcbiAgICAgICAgZWxlbWVudFR5cGU6IHRoaXMuZ2V0RWxlbWVudExhYmVsKCksXG4gICAgICAgIGF1dGhvcjogZWxlbWVudC5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIHZlcnNpb246IGVsZW1lbnQubWV0YWRhdGEudmVyc2lvbixcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpzYXZlOnN0YXJ0JyxcbiAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCB9KVxuICAgICk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRDb21taXQoYXN5bmMgKCkgPT4ge1xuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeVNhdmVkKHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6c2F2ZTpzdWNjZXNzJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50IH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkUm9sbGJhY2soYXN5bmMgKGVycm9yKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAgICdlbGVtZW50OnNhdmU6ZXJyb3InLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVsZW1lbnQsIGVycm9yIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdHJhbnNhY3Rpb24ucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmJlZm9yZVNhdmUpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5iZWZvcmVTYXZlKGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHBhdGguZGlybmFtZShhYnNvbHV0ZVBhdGgpKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlQmFja3VwQmVmb3JlU2F2ZShhYnNvbHV0ZVBhdGgpO1xuXG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5zZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAvLyBGaXggIzkwODogVmFsaWRhdGUgc2VyaWFsaXplZCBjb250ZW50IGJlZm9yZSB3cml0aW5nIChzeW1tZXRyaWMgd2l0aCByZWFkIHBhdGgpLlxuICAgICAgLy8gUmVhZCBwYXRoIHZhbGlkYXRlcyB2aWEgU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpIOKGkiBDb250ZW50VmFsaWRhdG9yOyB3cml0ZSBwYXRoXG4gICAgICAvLyBtdXN0IGFwcGx5IHRoZSBzYW1lIGNoZWNrcyB0byBwcmV2ZW50IHNhdmluZyBjb250ZW50IHRoYXQgd291bGQgZmFpbCB0byBsb2FkLlxuICAgICAgdGhpcy52YWxpZGF0ZVNlcmlhbGl6ZWRDb250ZW50KGNvbnRlbnQpO1xuXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZShhYnNvbHV0ZVBhdGgsIGNvbnRlbnQsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG5cbiAgICAgIGlmICh0aGlzLmFmdGVyU2F2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFmdGVyU2F2ZShlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBzYXZlZDogJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9YCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgc2VyaWFsaXplZCBlbGVtZW50IGNvbnRlbnQgYmVmb3JlIHdyaXRpbmcgdG8gZGlzay5cbiAgICogRml4ICM5MDg6IE1pcnJvcnMgdGhlIHJlYWQtcGF0aCB2YWxpZGF0aW9uIGZyb20gU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpXG4gICAqIHRvIGVuc3VyZSB3cml0ZSDihpIgcmVhZCBzeW1tZXRyeS4gQ29udGVudCB0aGF0IGZhaWxzIHRoaXMgY2hlY2sgd291bGQgYWxzb1xuICAgKiBmYWlsIHRvIGxvYWQsIHNvIHJlamVjdGluZyBpdCBvbiB3cml0ZSBwcmV2ZW50cyBwZXJtYW5lbnRseSBicm9rZW4gZWxlbWVudHMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2VyaWFsaXplZENvbnRlbnQoY29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdmFsaWRhdGVHYXRla2VlcGVyTWV0YWRhdGEgPSAocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCwgc291cmNlTGFiZWw6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgZXJyb3JzID0gZ2V0R2F0ZWtlZXBlckF1dGhvcmluZ0Vycm9ycyhyZWNvcmQpO1xuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeSBpbiBzZXJpYWxpemVkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gJHtzb3VyY2VMYWJlbH06ICR7Wy4uLm5ldyBTZXQoZXJyb3JzKV0uam9pbignOyAnKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dHJhY3QgZnJvbnRtYXR0ZXIgaWYgcHJlc2VudCAoU29uYXJDbG91ZCBTNjU5NDogdXNlIFJlZ0V4cC5leGVjKVxuICAgIGNvbnN0IGZyb250bWF0dGVyUmVnZXggPSAvXi0tLVxccj9cXG4oW1xcc1xcU10qPylcXHI/XFxuLS0tLztcbiAgICBjb25zdCBmcm9udG1hdHRlck1hdGNoID0gZnJvbnRtYXR0ZXJSZWdleC5leGVjKGNvbnRlbnQpO1xuXG4gICAgaWYgKGZyb250bWF0dGVyTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gZnJvbnRtYXR0ZXJNYXRjaFsxXTtcbiAgICAgIGNvbnN0IGJvZHlDb250ZW50ID0gY29udGVudC5zdWJzdHJpbmcoZnJvbnRtYXR0ZXJNYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgICAvLyBZQU1MIGJvbWIgZGV0ZWN0aW9uIChtaXJyb3JzIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSBzdGVwIDQpLlxuICAgICAgLy8gT25seSBydW4gd2hlbiBZQU1MIGlzIHVuZGVyIE1BWF9ZQU1MX0xFTkdUSCAoNjRLQikg4oCUIHRoZSBzYW1lIGxpbWl0XG4gICAgICAvLyB1c2VkIGJ5IHRoZSByZWFkIHBhdGggaW4gU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpLiB2YWxpZGF0ZVlhbWxDb250ZW50KClcbiAgICAgIC8vIGluY2x1ZGVzIGl0cyBvd24gc2l6ZSBjaGVjayBpbnRlcm5hbGx5LCBhbmQgd2UgaW50ZW50aW9uYWxseSBza2lwIHNpemVcbiAgICAgIC8vIGVuZm9yY2VtZW50IG9uIHRoZSB3cml0ZSBwYXRoIGJlY2F1c2UgdGhlIHNlcmlhbGl6ZXIgbWF5IHByb2R1Y2UgbGFyZ2VcbiAgICAgIC8vIGZyb250bWF0dGVyIGZvciBlbGVtZW50cyB3aXRoIGxvbmcgaW5zdHJ1Y3Rpb25zLiBUaGUgcmVhZCBwYXRoIHdpbGxcbiAgICAgIC8vIHJlamVjdCBvdmVyc2l6ZWQgWUFNTCBvbiB0aGUgbmV4dCBsb2FkIGlmIG5lZWRlZC5cbiAgICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPD0gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCkge1xuICAgICAgICBpZiAoIUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS52YWxpZGF0ZVNlcmlhbGl6ZWRDb250ZW50YCxcbiAgICAgICAgICAgIGRldGFpbHM6IGBNYWxpY2lvdXMgWUFNTCBwYXR0ZXJuIGRldGVjdGVkIGluIHNlcmlhbGl6ZWQgb3V0cHV0IGZvciAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7IHlhbWxMZW5ndGg6IHlhbWxDb250ZW50Lmxlbmd0aCB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgICBgU2VyaWFsaXplZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IGNvbnRhaW5zIG1hbGljaW91cyBZQU1MIHBhdHRlcm5zIOKAlCB3cml0ZSBibG9ja2VkLiBgICtcbiAgICAgICAgICAgIGBSZXZpZXcgdGhlIGVsZW1lbnQncyBtZXRhZGF0YSBhbmQgaW5zdHJ1Y3Rpb25zIGZvciBzdXNwaWNpb3VzIGFuY2hvci9hbGlhcyBwYXR0ZXJucy5gLFxuICAgICAgICAgICAgJ2NyaXRpY2FsJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbnRtYXR0ZXJEYXRhID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZVJhd1lhbWwoeWFtbENvbnRlbnQsIFNFQ1VSSVRZX0xJTUlUUy5NQVhfWUFNTF9MRU5HVEgpO1xuICAgICAgdmFsaWRhdGVHYXRla2VlcGVyTWV0YWRhdGEoZnJvbnRtYXR0ZXJEYXRhLCAnZnJvbnRtYXR0ZXInKTtcblxuICAgICAgLy8gQm9keSBjb250ZW50IHZhbGlkYXRpb24gd2l0aCBlbGVtZW50IHR5cGUgY29udGV4dFxuICAgICAgY29uc3QgY29udGVudENvbnRleHQgPSBCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFRbdGhpcy5lbGVtZW50VHlwZV07XG4gICAgICBjb25zdCBib2R5VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShib2R5Q29udGVudCwge1xuICAgICAgICBjb250ZW50Q29udGV4dCxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFib2R5VmFsaWRhdGlvbi5pc1ZhbGlkICYmIGJvZHlWYWxpZGF0aW9uLnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKFxuICAgICAgICAgIGBDcml0aWNhbCBzZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWQgaW4gc2VyaWFsaXplZCBib2R5IGNvbnRlbnQ6ICR7Ym9keVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gLFxuICAgICAgICAgICdjcml0aWNhbCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudFR5cGUgPT09IEVsZW1lbnRUeXBlLk1FTU9SWSkge1xuICAgICAgLy8gSXNzdWUgIzIzMjk6IG1lbW9yaWVzIGFyZSB3aG9sZSBwdXJlLVlBTUwgZG9jdW1lbnRzIGNhcHBlZCBhdCBNQVhfWUFNTF9TSVpFXG4gICAgICAvLyAoMjU2S0IpIG9uIHNhdmUgYW5kIGxvYWQg4oCUIE1BWF9ZQU1MX0xFTkdUSCAoNjRLQikgaXMgYSBmcm9udG1hdHRlciBsaW1pdFxuICAgICAgLy8gYW5kIHJlamVjdGVkIGV2ZXJ5IHNhdmUgb2YgYSBtZW1vcnkgdGhhdCBncmV3IHBhc3QgaXQuXG4gICAgICBjb25zdCByYXdZYW1sID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZVJhd1lhbWwoY29udGVudCwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfWUFNTF9TSVpFKTtcbiAgICAgIHZhbGlkYXRlR2F0ZWtlZXBlck1ldGFkYXRhKHJhd1lhbWwsICdZQU1MIHJvb3QnKTtcbiAgICAgIGlmIChyYXdZYW1sLm1ldGFkYXRhICYmIHR5cGVvZiByYXdZYW1sLm1ldGFkYXRhID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyYXdZYW1sLm1ldGFkYXRhKSkge1xuICAgICAgICB2YWxpZGF0ZUdhdGVrZWVwZXJNZXRhZGF0YShyYXdZYW1sLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCAnbWV0YWRhdGEnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgYXZhaWxhYmxlIGVsZW1lbnRzXG4gICAqIFNFQ1VSSVRZOiBVc2VzIFBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKCkgd2hpY2ggZmlsdGVycyB0ZXN0IGVsZW1lbnRzXG4gICAqL1xuICBhc3luYyBsaXN0KCk6IFByb21pc2U8VFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLmVsZW1lbnREaXIpO1xuXG4gICAgICAvLyBTY2FuIGZvciBjaGFuZ2VzIOKAlCBwb3B1bGF0ZXMgaW5kZXggZm9yIGxpc3RTdW1tYXJpZXMoKS9maW5kQnlOYW1lKClcbiAgICAgIC8vIE5vbi1mYXRhbDogc2NhbiBmYWlsdXJlIG11c3QgbmV2ZXIgcHJldmVudCBsaXN0KCkgZnJvbSByZXR1cm5pbmcgcmVzdWx0c1xuICAgICAgLy8gRXZpY3Qgc3RhbGUgY2FjaGUgZW50cmllcyBzbyB0aGUgY2FjaGUgY2hlY2sgYmVsb3cgbmV2ZXIgcmV0dXJucyBvdXRkYXRlZCBkYXRhXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkaWZmID0gYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIuc2NhbigpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlbFBhdGggb2YgWy4uLmRpZmYubW9kaWZpZWQsIC4uLmRpZmYucmVtb3ZlZF0pIHtcbiAgICAgICAgICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgcmVsUGF0aCk7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNQYXRoKTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdJZCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgICB0aGlzLmZpbGVQYXRoVG9JZC5kZWxldGUoYWJzUGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHsgLyogaW5kZXggdW5hdmFpbGFibGUsIGxpc3QoKSBjb250aW51ZXMgd2l0aG91dCBjYWNoZSBvcHRpbWl6YXRpb24gKi8gfVxuXG4gICAgICAvLyBVc2UgUG9ydGZvbGlvTWFuYWdlciBmb3IgYXV0aG9yaXRhdGl2ZSBmaWxlIGxpc3QgKyBzZWN1cml0eSBmaWx0ZXJpbmdcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cyh0aGlzLmVsZW1lbnRUeXBlKTtcblxuICAgICAgLy8gTG9hZCBhbGwgZWxlbWVudHMgaW4gcGFyYWxsZWwsIGNoZWNraW5nIGNhY2hlIGJlZm9yZSBkaXNrXG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QgKGF2b2lkcyBkaXNrIHJlYWQgaWYgZWxlbWVudCBpcyBhbHJlYWR5IGxvYWRlZClcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gICAgICAgICAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICAgICAgICAgICAgLy8gQ2FjaGUgbWlzcyDigJQgcmVhZCBmcm9tIGRpc2sgKHBvcHVsYXRlcyBjYWNoZSBmb3IgbmV4dCB0aW1lKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChmaWxlKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIGxvYWQoKSBoYW5kbGVzIGVycm9yIGxvZ2dpbmcgd2l0aCBkZWR1cGxpY2F0aW9uXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBGaWx0ZXIgb3V0IGZhaWxlZCBsb2FkcyBhbmQgcmV0dXJuXG4gICAgICByZXR1cm4gZWxlbWVudHMuZmlsdGVyKChlKTogZSBpcyBBd2FpdGVkPFQ+ID0+IGUgIT09IG51bGwpIGFzIFRbXTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYCR7bGFiZWx9cyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgeWV0LCByZXR1cm5pbmcgZW1wdHkgYXJyYXlgKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbGlzdCAke3RoaXMuZWxlbWVudFR5cGV9czpgLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgbGlnaHR3ZWlnaHQgbWV0YWRhdGEgc3VtbWFyaWVzIHdpdGhvdXQgbG9hZGluZyBmdWxsIGVsZW1lbnRzLlxuICAgKiBVc2VmdWwgd2hlbiBvbmx5IG5hbWVzL2Rlc2NyaXB0aW9ucy90YWdzIGFyZSBuZWVkZWQuXG4gICAqL1xuICBhc3luYyBsaXN0U3VtbWFyaWVzKCk6IFByb21pc2U8RWxlbWVudEluZGV4RW50cnlbXT4ge1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuZWxlbWVudERpcik7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZUxheWVyLmxpc3RTdW1tYXJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYnkgcHJlZGljYXRlXG4gICAqL1xuICBhc3luYyBmaW5kKHByZWRpY2F0ZTogKGVsZW1lbnQ6IFQpID0+IGJvb2xlYW4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBlbGVtZW50cy5maW5kKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtdWx0aXBsZSBlbGVtZW50cyBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmRNYW55KHByZWRpY2F0ZTogKGVsZW1lbnQ6IFQpID0+IGJvb2xlYW4pOiBQcm9taXNlPFRbXT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBieSBuYW1lIG9yIElEIHdpdGhvdXQgbG9hZGluZyBhbGwgZWxlbWVudHNcbiAgICpcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gZm9yIGFjdGl2YXRpb24gZmxvd1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhbiBvcHRpbWl6ZWQgbG9va3VwIHRoYXQgdHJpZXMgY2FjaGUgZmlyc3QsIHRoZW5cbiAgICogYXR0ZW1wdHMgZGlyZWN0IGZpbGUgYWNjZXNzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gZnVsbCBsaXN0KCkgc2Nhbi5cbiAgICogVGhpcyBpcyBzaWduaWZpY2FudGx5IGZhc3RlciB0aGFuIGxpc3QoKSBmb3IgbGFyZ2UgcG9ydGZvbGlvcy5cbiAgICpcbiAgICogUEVSRk9STUFOQ0UgSU1QUk9WRU1FTlRTOlxuICAgKiAxLiBDYWNoZSBsb29rdXAgLSBPKDEpIGlmIGVsZW1lbnQgd2FzIHByZXZpb3VzbHkgbG9hZGVkXG4gICAqIDIuIERpcmVjdCBmaWxlIGFjY2VzcyAtIE8oMSkgZm9yIG5hbWUtYmFzZWQgbG9va3Vwc1xuICAgKiAzLiBGdWxsIHNjYW4gZmFsbGJhY2sgLSBPKG4pIG9ubHkgaWYgYWJvdmUgbWV0aG9kcyBmYWlsXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gRWxlbWVudCBuYW1lIG9yIElEIHRvIHNlYXJjaCBmb3JcbiAgICogQHJldHVybnMgRWxlbWVudCBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmFtZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBGaXJzdCwgdHJ5IGZpbmRpbmcgaW4gY2FjaGUgYnkgaXRlcmF0aW5nIGNhY2hlZCBlbGVtZW50c1xuICAgIC8vIFRoaXMgaXMgZmFzdCAoTyhjYWNoZSBzaXplKSkgYW5kIHdvcmtzIGZvciByZWNlbnRseSBhY2Nlc3NlZCBlbGVtZW50c1xuICAgIGNvbnN0IGNhY2hlZEVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRJbkNhY2hlKGlkZW50aWZpZXIpO1xuICAgIGlmIChjYWNoZWRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gY2FjaGVkRWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBTZWNvbmQsIHRyeSBzdG9yYWdlIGxheWVyIGluZGV4IChPKDEpIG5hbWUgbG9va3VwKVxuICAgIGNvbnN0IGluZGV4ZWRQYXRoID0gdGhpcy5zdG9yYWdlTGF5ZXIuZ2V0UGF0aEJ5TmFtZShpZGVudGlmaWVyKTtcbiAgICBpZiAoaW5kZXhlZFBhdGgpIHtcbiAgICAgIHRyeSB7IHJldHVybiBhd2FpdCB0aGlzLmxvYWQoaW5kZXhlZFBhdGgpOyB9IGNhdGNoIHsgLyogZmFsbCB0aHJvdWdoICovIH1cbiAgICB9XG5cbiAgICAvLyBUaGlyZCwgdHJ5IGRpcmVjdCBmaWxlIGFjY2VzcyB1c2luZyBzdGFuZGFyZCBuYW1pbmcgY29udmVudGlvblxuICAgIC8vIEVsZW1lbnQgZmlsZXMgYXJlIHR5cGljYWxseSBuYW1lZDogbG93ZXJjYXNlLW5hbWUtd2l0aC1oeXBoZW5zLntleHR9XG4gICAgLy8gVGhpcyBpcyBPKDEpIGZpbGUgc3lzdGVtIGxvb2t1cFxuICAgIGNvbnN0IGRpcmVjdExvYWRBdHRlbXB0ID0gYXdhaXQgdGhpcy50cnlEaXJlY3RMb2FkKGlkZW50aWZpZXIpO1xuICAgIGlmIChkaXJlY3RMb2FkQXR0ZW1wdCkge1xuICAgICAgcmV0dXJuIGRpcmVjdExvYWRBdHRlbXB0O1xuICAgIH1cblxuICAgIC8vIElmIHN0b3JhZ2UgbGF5ZXIgaGFzIGNvbXBsZXRlZCBhdCBsZWFzdCBvbmUgc2NhbiwgdGhlIGluZGV4IGlzXG4gICAgLy8gYXV0aG9yaXRhdGl2ZSDigJQgYSBtaXNzIG1lYW5zIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LiBTa2lwIHRoZVxuICAgIC8vIGV4cGVuc2l2ZSBsaXN0KCkgZmFsbGJhY2sgdG8gYXZvaWQgTyhuKSByZXNjYW5zIG9uIGV2ZXJ5IGNhY2hlIG1pc3MuXG4gICAgaWYgKHRoaXMuc3RvcmFnZUxheWVyLmhhc0NvbXBsZXRlZFNjYW4oKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogRnVsbCBsaXN0KCkgc2NhbiAoTyhuKSAtIGxvYWRzIGFsbCBlbGVtZW50cylcbiAgICAvLyBPbmx5IHVzZWQgb24gZmlyc3QgYWNjZXNzIGJlZm9yZSBhbnkgc2NhbiBoYXMgY29tcGxldGVkLlxuICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBmaW5kIGVsZW1lbnRzIGV2ZW4gd2l0aCBub24tc3RhbmRhcmQgZmlsZSBuYW1pbmcuXG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoaWRlbnRpZmllcik7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQoZSA9PlxuICAgICAgdGhpcy5ub3JtYWxpemVGaWxlbmFtZShlLm1ldGFkYXRhLm5hbWUpID09PSBub3JtYWxpemVkSWRlbnRpZmllciB8fFxuICAgICAgZS5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGlkZW50aWZpZXIudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgZS5pZCA9PT0gaWRlbnRpZmllclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyOiBTZWFyY2ggY2FjaGUgZm9yIGVsZW1lbnQgYnkgbmFtZSBvciBJRFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmaW5kSW5DYWNoZShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBMUlVDYWNoZSBkb2Vzbid0IHByb3ZpZGUgaXRlcmF0aW9uLCBidXQgd2UgY2FuIGNoZWNrIGlmIHdlIGhhdmVcbiAgICAvLyBhIGNhY2hlZCBwYXRoIGZvciB0aGlzIGlkZW50aWZpZXIgYnkgdHJ5aW5nIGNvbW1vbiBuYW1pbmcgcGF0dGVybnMuXG4gICAgLy8gSU1QT1JUQU5UOiBmaWxlUGF0aFRvSWQgc3RvcmVzIGFic29sdXRlIHBhdGhzIChzZXQgYnkgY2FjaGVFbGVtZW50IHZpYVxuICAgIC8vIHJlc29sdmVBYnNvbHV0ZVBhdGgpLCBzbyB3ZSBtdXN0IHJlc29sdmUgdG8gYWJzb2x1dGUgYmVmb3JlIGxvb2t1cC5cbiAgICBjb25zdCBwb3NzaWJsZUZpbGVuYW1lcyA9IFtcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICBgJHtpZGVudGlmaWVyfSR7dGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCl9YCxcbiAgICAgIC8vIFVzZSB1bmlmaWVkIG5vcm1hbGl6ZUZpbGVuYW1lIGZvciBjb25zaXN0ZW50IGNhY2hlIGxvb2t1cHNcbiAgICAgIHRoaXMuZ2V0RWxlbWVudEZpbGVuYW1lKGlkZW50aWZpZXIpXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgcG9zc2libGVGaWxlbmFtZXMpIHtcbiAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlbmFtZSk7XG4gICAgICBjb25zdCBjYWNoZWRJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNvbHV0ZVBhdGgpO1xuICAgICAgaWYgKGNhY2hlZElkKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRzLmdldChjYWNoZWRJZCk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogVHJ5IGxvYWRpbmcgZWxlbWVudCBkaXJlY3RseSBieSBjb25zdHJ1Y3RpbmcgZXhwZWN0ZWQgZmlsZW5hbWVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdHJ5RGlyZWN0TG9hZChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBUcnkgbG9hZGluZyB1c2luZyBjb21tb24gbmFtaW5nIHBhdHRlcm5zXG4gICAgLy8gVXNlIHVuaWZpZWQgbm9ybWFsaXplRmlsZW5hbWUgZm9yIGNvbnNpc3RlbnQgZmlsZW5hbWUgY29uc3RydWN0aW9uXG4gICAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICAgIC8vIFByaW1hcnk6IFVzZSB1bmlmaWVkIG5vcm1hbGl6YXRpb24gKGhhbmRsZXMgQ2FtZWxDYXNlLCBzcGFjZXMsIHVuZGVyc2NvcmVzLCBldGMuKVxuICAgICAgdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUoaWRlbnRpZmllciksXG4gICAgICAvLyBGYWxsYmFjazogSWRlbnRpZmllciBhcy1pcyB3aXRoIGV4dGVuc2lvblxuICAgICAgYCR7aWRlbnRpZmllcn0ke3RoaXMuZ2V0RmlsZUV4dGVuc2lvbigpfWAsXG4gICAgICAvLyBGYWxsYmFjazogSWRlbnRpZmllciBhbHJlYWR5IGluY2x1ZGVzIGV4dGVuc2lvblxuICAgICAgaWRlbnRpZmllclxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHBvc3NpYmxlUGF0aHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmxvYWQoZmlsZVBhdGgpO1xuICAgICAgICAvLyBWZXJpZnkgdGhlIGxvYWRlZCBlbGVtZW50IG1hdGNoZXMgdGhlIGlkZW50aWZpZXJcbiAgICAgICAgLy8gTm9ybWFsaXplIGJvdGggc2lkZXMgc28gXCJDb2RlIFJldmlld1wiIChzcGFjZXMpIG1hdGNoZXMgXCJjb2RlLXJldmlld1wiIChoeXBoZW5zKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkTWV0YU5hbWUgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGVsZW1lbnQubWV0YWRhdGEubmFtZSk7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShpZGVudGlmaWVyKTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRNZXRhTmFtZSA9PT0gbm9ybWFsaXplZElkZW50aWZpZXIgfHxcbiAgICAgICAgICAgIGVsZW1lbnQubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBpZGVudGlmaWVyLnRvTG93ZXJDYXNlKCkgfHxcbiAgICAgICAgICAgIGVsZW1lbnQuaWQgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCBvciBmYWlsZWQgdG8gbG9hZCAtIHRyeSBuZXh0IHBhdGhcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbiBlbGVtZW50XG4gICAqIERlbGVnYXRlcyB0byBlbGVtZW50J3Mgb3duIHZhbGlkYXRlIG1ldGhvZFxuICAgKlxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIGJvdGggJ3ZhbGlkJyBhbmQgJ2lzVmFsaWQnIHByb3BlcnRpZXMuXG4gICAqICAgICAgICAgICdpc1ZhbGlkJyBpcyBkZXByZWNhdGVkIC0gdXNlICd2YWxpZCcgZm9yIG5ldyBjb2RlLlxuICAgKi9cbiAgdmFsaWRhdGUoZWxlbWVudDogVCk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSBlbGVtZW50LnZhbGlkYXRlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZWxlbWVudFxuICAgKiBTRUNVUklUWTogUGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGVsZXRpb24gb3V0c2lkZSBkaXJlY3RvcnlcbiAgICogQ0FDSEUgRklYOiBVc2VzIGZpbGVwYXRoLWJhc2VkIGNhY2hlIHJlbW92YWwgdG8gcHJldmVudCBzdGFsZSBlbnRyaWVzXG4gICAqL1xuICBhc3luYyBkZWxldGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdFTEVNRU5UX0RFTEVURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmRlbGV0ZWAsXG4gICAgICBkZXRhaWxzOiBgQXR0ZW1wdGluZyB0byBkZWxldGUgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfTogJHtmaWxlUGF0aH1gXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlbGF0aXZlUGF0aCwgYWJzb2x1dGVQYXRoIH0gPSBhd2FpdCB0aGlzLm5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBFbGVtZW50VHJhbnNhY3Rpb25TY29wZSh0aGlzLmdldEVsZW1lbnRMYWJlbCgpLCBjb3JyZWxhdGlvbklkKTtcblxuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXQoXG4gICAgICAnZWxlbWVudDpkZWxldGU6c3RhcnQnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgKTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZENvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLnVuY2FjaGVCeVBhdGgocmVsYXRpdmVQYXRoKTtcbiAgICAgIHRoaXMuc3RvcmFnZUxheWVyLm5vdGlmeURlbGV0ZWQocmVsYXRpdmVQYXRoKTtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6ZGVsZXRlOnN1Y2Nlc3MnLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRSb2xsYmFjayhhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6ZGVsZXRlOmVycm9yJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlcnJvciB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRyYW5zYWN0aW9uLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jYW5EZWxldGUpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudEZvclZhbGlkYXRpb24gPSBhd2FpdCB0aGlzLmxvYWRFbGVtZW50U25hcHNob3QoYWJzb2x1dGVQYXRoLCByZWxhdGl2ZVBhdGgpO1xuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGF3YWl0IHRoaXMuY2FuRGVsZXRlKGVsZW1lbnRGb3JWYWxpZGF0aW9uKTtcbiAgICAgICAgaWYgKCFkZWNpc2lvbi5hbGxvd2VkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGRlY2lzaW9uLnJlYXNvbiA/PyBgRGVsZXRpb24gbm90IHBlcm1pdHRlZCBmb3IgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1vdmVkVG9CYWNrdXAgPSBhd2FpdCB0aGlzLmNyZWF0ZUJhY2t1cEJlZm9yZURlbGV0ZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgaWYgKCFtb3ZlZFRvQmFja3VwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUsIHtcbiAgICAgICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZGVsZXRlYFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxvZ2dlci5pbmZvKGAke3RoaXMuZ2V0RWxlbWVudExhYmVsQ2FwaXRhbGl6ZWQoKX0gZGVsZXRlZDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGV4aXN0c1xuICAgKi9cbiAgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhhYnNvbHV0ZVBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGZpbGUgcGF0aFxuICAgKi9cbiAgdmFsaWRhdGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcblxuICAgICAgaWYgKCFzYW5pdGl6ZWQgfHwgcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2FuaXRpemVkLmluY2x1ZGVzKCcuLicpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKHNhbml0aXplZCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gWycubWQnLCAnLm1hcmtkb3duJywgJy50eHQnLCAnLnltbCcsICcueWFtbCddO1xuXG4gICAgICByZXR1cm4gZXh0ID09PSAnJyB8fCBhbGxvd2VkRXh0ZW5zaW9ucy5pbmNsdWRlcyhleHQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgZ2V0RWxlbWVudFR5cGUoKTogRWxlbWVudFR5cGUge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgZmlsZSBwYXRoIHRvIGl0cyBhYnNvbHV0ZSBmb3JtIGZvciBjYWNoZSBjb25zaXN0ZW5jeVxuICAgKiBFbnN1cmVzIGNvbnNpc3RlbnQgcGF0aCBoYW5kbGluZyBhY3Jvc3MgcmVsYXRpdmUvYWJzb2x1dGUgcGF0aHNcbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpXG4gICAgICA/IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKVxuICAgICAgOiBwYXRoLm5vcm1hbGl6ZShwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCBmaWxlUGF0aCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8eyByZWxhdGl2ZVBhdGg6IHN0cmluZzsgYWJzb2x1dGVQYXRoOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuXG4gICAgaWYgKCFzYW5pdGl6ZWRQYXRoIHx8IHNhbml0aXplZFBhdGgudHJpbSgpLmxlbmd0aCA9PT0gMCB8fCBzYW5pdGl6ZWRQYXRoID09PSAnLicgfHwgc2FuaXRpemVkUGF0aCA9PT0gcGF0aC5zZXApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IHBhdGg6IGVtcHR5IHBhdGggaXMgbm90IGFsbG93ZWRgKTtcbiAgICB9XG5cbiAgICBpZiAocGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEFic29sdXRlICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gcGF0aHMgYXJlIG5vdCBhbGxvd2VkYCk7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoIChyZW1vdmUgcmVkdW5kYW50IHNlcGFyYXRvcnMsIHJlc29sdmUgLiBhbmQgLi4pXG4gICAgY29uc3Qgbm9ybWFsaXplZFJlbGF0aXZlID0gcGF0aC5ub3JtYWxpemUoc2FuaXRpemVkUGF0aCk7XG5cbiAgICAvLyBCdWlsZCBhYnNvbHV0ZSBwYXRoXG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgbm9ybWFsaXplZFJlbGF0aXZlKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSBXSVRIT1VUIHJlc29sdmluZyBzeW1saW5rcyAtIGp1c3QgY2hlY2sgc2VjdXJpdHkgY29uc3RyYWludHNcbiAgICAgIGF3YWl0IFBhdGhWYWxpZGF0b3IudmFsaWRhdGVFbGVtZW50UGF0aE9ubHkoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnREaXIpO1xuXG4gICAgICAvLyBSZXR1cm4gdGhlIGlucHV0IGFzIHJlbGF0aXZlUGF0aCAoaXQncyBhbHJlYWR5IHJlbGF0aXZlKSBhbmQgY29tcHV0ZWQgYWJzb2x1dGVQYXRoXG4gICAgICByZXR1cm4geyByZWxhdGl2ZVBhdGg6IG5vcm1hbGl6ZWRSZWxhdGl2ZSwgYWJzb2x1dGVQYXRoIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ0ludmFsaWQgcGF0aCc7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBwYXRoOiAke3JlYXNvbn1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENhY2hlZEVsZW1lbnRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGVsZW1lbnRJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldCh0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKSk7XG4gICAgaWYgKCFlbGVtZW50SWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLmdldChlbGVtZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3RlY3RlZCBjYWNoZSBsb29rdXAgYnkgYWJzb2x1dGUgcGF0aC5cbiAgICogQWxsb3dzIHN1YmNsYXNzZXMgd2l0aCBjdXN0b20gbG9hZCgpIG92ZXJyaWRlcyAoZS5nLiBNZW1vcnlNYW5hZ2VyKVxuICAgKiB0byBjaGVjayB0aGUgTFJVIGNhY2hlIGJlZm9yZSByZS1yZWFkaW5nIGZyb20gZGlzay5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRDYWNoZWRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldENhY2hlZEVsZW1lbnRCeUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkRWxlbWVudFNuYXBzaG90KGFic29sdXRlUGF0aDogc3RyaW5nLCByZWxhdGl2ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRFbGVtZW50RmlsZShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudFR5cGUsIHtcbiAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5sb2FkRWxlbWVudFNuYXBzaG90YFxuICAgIH0pO1xuICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIuc2FmZU1hdHRlcihyYXcsIHVuZGVmaW5lZCwge1xuICAgICAgY29udGVudENvbnRleHQ6IEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVFt0aGlzLmVsZW1lbnRUeXBlXSxcbiAgICB9KTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMucGFyc2VNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudChtZXRhZGF0YSwgcGFyc2VkLmNvbnRlbnQpO1xuICAgIHRoaXMuY2FjaGVFbGVtZW50KGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHN0YW5kYXJkaXplZCBldmVudCBwYXlsb2FkIGZvciBlbGVtZW50IGxpZmVjeWNsZSBldmVudHMuXG4gICAqXG4gICAqIFRoaXMgaGVscGVyIGlzIGF2YWlsYWJsZSB0byBzdWJjbGFzc2VzIHRvIGVuc3VyZSBjb25zaXN0ZW50IGV2ZW50IHBheWxvYWRcbiAgICogc3RydWN0dXJlIHdoZW4gZW1pdHRpbmcgY3VzdG9tIGV2ZW50cyB2aWEgdGhlIGRpc3BhdGNoZXIgZ2V0dGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gRXZlbnQgcGFyYW1ldGVycyBpbmNsdWRpbmcgY29ycmVsYXRpb24gSUQsIGVsZW1lbnQsIGZpbGUgcGF0aCwgYW5kIG9wdGlvbmFsIGVycm9yXG4gICAqIEByZXR1cm5zIEZ1bGx5LWZvcm1lZCBFbGVtZW50RXZlbnRQYXlsb2FkIHJlYWR5IGZvciBlbWlzc2lvblxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUV2ZW50UGF5bG9hZChwYXJhbXM6IHtcbiAgICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gICAgZmlsZVBhdGg/OiBzdHJpbmc7XG4gICAgZWxlbWVudD86IFQ7XG4gICAgZXJyb3I/OiB1bmtub3duO1xuICB9KTogRWxlbWVudEV2ZW50UGF5bG9hZCB7XG4gICAgY29uc3QgZWxlbWVudElkID0gcGFyYW1zLmVsZW1lbnQ/LmlkO1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSBlbGVtZW50SWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmdldChlbGVtZW50SWQpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBjb3JyZWxhdGlvbklkOiBwYXJhbXMuY29ycmVsYXRpb25JZCxcbiAgICAgIGVsZW1lbnRUeXBlOiB0aGlzLmVsZW1lbnRUeXBlLFxuICAgICAgZWxlbWVudElkLFxuICAgICAgZmlsZVBhdGg6IHBhcmFtcy5maWxlUGF0aCxcbiAgICAgIG1ldGFkYXRhOiBFbGVtZW50RXZlbnREaXNwYXRjaGVyLnNuYXBzaG90TWV0YWRhdGEocGFyYW1zLmVsZW1lbnQpLFxuICAgICAgZ2VuZXJhdGlvbixcbiAgICAgIGVycm9yOiBwYXJhbXMuZXJyb3JcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFeHRlcm5hbENoYW5nZShyZWxhdGl2ZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudW5jYWNoZUJ5UGF0aChyZWxhdGl2ZVBhdGgpO1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmludmFsaWRhdGUoKTtcbiAgICAvLyBDbGVhciBlcnJvciBzdXBwcmVzc2lvbiBzbyBhIGNoYW5nZWQgZmlsZSBnZXRzIGZyZXNoIGxvZ2dpbmdcbiAgICB0aGlzLmludmFsaWRFbGVtZW50cy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuZGVsZXRlKHJlbGF0aXZlUGF0aCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5lbWl0QXN5bmMoXG4gICAgICAnZWxlbWVudDpleHRlcm5hbC1jaGFuZ2UnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgKTtcblxuICAgIGlmICh0aGlzLmF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlKSB7XG4gICAgICB2b2lkIHRoaXMubG9hZChyZWxhdGl2ZVBhdGgpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBsb2dnZXIud2FybignQXV0byByZWxvYWQgYWZ0ZXIgZXh0ZXJuYWwgY2hhbmdlIGZhaWxlZCcsIHtcbiAgICAgICAgICBlbGVtZW50VHlwZTogdGhpcy5lbGVtZW50VHlwZSxcbiAgICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLFxuICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogQWRkcyBhbiBlbGVtZW50IHRvIGJvdGggY2FjaGVzIChiaWRpcmVjdGlvbmFsIG1hcHBpbmcpXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBjYWNoZVxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBGaWxlIHBhdGggKHJlbGF0aXZlIG9yIGFic29sdXRlKVxuICAgKi9cbiAgcHJvdGVjdGVkIGNhY2hlRWxlbWVudChlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcblxuICAgIC8vIENsZWFyIGFueSBzdGFsZSBjYWNoZSBlbnRyaWVzIGZvciB0aGlzIGZpbGVwYXRoIGJlZm9yZSBhZGRpbmcgdGhlIG5ldyBvbmUuXG4gICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBnZW5lcmF0ZUlkKCkgaW4gQmFzZUVsZW1lbnQudHMgaW5jbHVkZXMgYSBEYXRlLm5vdygpXG4gICAgLy8gdGltZXN0YW1wLCBjYXVzaW5nIGVhY2ggbG9hZCBmcm9tIGRpc2sgdG8gZ2VuZXJhdGUgYSBkaWZmZXJlbnQgSUQuIFdpdGhvdXQgdGhpc1xuICAgIC8vIGNsZWFudXAsIG9sZCBJRHMgcmVtYWluIGluIHRoZSBjYWNoZSBhcyBzdGFsZSBkYXRhLCBsZWFkaW5nIHRvIGluY29uc2lzdGVudFxuICAgIC8vIHJlc3VsdHMgaW4gbWV0aG9kcyBsaWtlIGZpbmRQZXJzb25hKCkgb3IgbGlzdCgpLlxuICAgIGNvbnN0IGV4aXN0aW5nSWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzb2x1dGVQYXRoKTtcbiAgICBpZiAoZXhpc3RpbmdJZCAmJiBleGlzdGluZ0lkICE9PSBlbGVtZW50LmlkKSB7XG4gICAgICAvLyBDbGVhciBzdGFsZSBjYWNoZSBlbnRyeSB3aGVuIGVsZW1lbnQgSUQgaGFzIGNoYW5nZWRcbiAgICAgIHRoaXMuZWxlbWVudHMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudHMuc2V0KGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHRoaXMuZmlsZVBhdGhUb0lkLnNldChhYnNvbHV0ZVBhdGgsIGVsZW1lbnQuaWQpO1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSArK3RoaXMuY2FjaGVHZW5lcmF0aW9uQ291bnRlcjtcbiAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5zZXQoZWxlbWVudC5pZCwgZ2VuZXJhdGlvbik7XG5cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpXG4gICAgICA/IHBhdGgucmVsYXRpdmUodGhpcy5lbGVtZW50RGlyLCBmaWxlUGF0aClcbiAgICAgIDogZmlsZVBhdGg7XG5cbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdmaWxlbmFtZScsIHtcbiAgICAgICAgdmFsdWU6IHBhdGguYmFzZW5hbWUocmVsYXRpdmVQYXRoKSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnZmlsZVBhdGgnLCB7XG4gICAgICAgIHZhbHVlOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBhdHRhY2ggZmlsZW5hbWUgbWV0YWRhdGEgdG8gZWxlbWVudCcsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICBmaWxlUGF0aDogcmVsYXRpdmVQYXRoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9yY2UgYSBmcmVzaCBkaXNrIHNjYW4gYW5kIGV2aWN0IGFueSBtb2RpZmllZC9yZW1vdmVkIGVudHJpZXMgZnJvbSB0aGVcbiAgICogaW4tbWVtb3J5IExSVSBjYWNoZS4gQ2FsbCBiZWZvcmUgZmluZEJ5TmFtZSgpIHdoZW4gZnJlc2huZXNzIGlzIGNyaXRpY2FsXG4gICAqIChlLmcuIG9uIGVuc2VtYmxlIGFjdGl2YXRpb24pIHRvIHBpY2sgdXAgZXh0ZXJuYWwgZmlsZSBjaGFuZ2VzIHRoYXRcbiAgICogb2NjdXJyZWQgc2luY2UgdGhlIGxhc3Qgc2NhbiwgZXZlbiBpZiB0aGUgc2NhbiBjb29sZG93biBpcyBzdGlsbCBhY3RpdmUuXG4gICAqXG4gICAqIFVubGlrZSBsaXN0KCksIHRoaXMgZG9lcyBub3QgbG9hZCBhbGwgZWxlbWVudHMg4oCUIGl0IG9ubHkgZXZpY3RzIHN0YWxlIG9uZXMuXG4gICAqIEZpeGVzICMxODk1IChlbnNlbWJsZSBhY3RpdmF0aW9uIHNlcnZpbmcgc3RhbGUgY2FjaGVkIGVsZW1lbnQgbGlzdCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2NhbkFuZEV2aWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmludmFsaWRhdGUoKTsgLy8gYnlwYXNzIGNvb2xkb3duIHNvIHRoZSBuZXh0IHNjYW4gaGl0cyBkaXNrXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRpZmYgPSBhd2FpdCB0aGlzLnN0b3JhZ2VMYXllci5zY2FuKCk7XG4gICAgICBmb3IgKGNvbnN0IHJlbFBhdGggb2YgWy4uLmRpZmYubW9kaWZpZWQsIC4uLmRpZmYucmVtb3ZlZF0pIHtcbiAgICAgICAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIHJlbFBhdGgpO1xuICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic1BhdGgpO1xuICAgICAgICBpZiAoZXhpc3RpbmdJZCkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudHMuZGVsZXRlKGV4aXN0aW5nSWQpO1xuICAgICAgICAgIHRoaXMuZmlsZVBhdGhUb0lkLmRlbGV0ZShhYnNQYXRoKTtcbiAgICAgICAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHsgLyogbm9uLWZhdGFsIOKAlCBjYWNoZSBtYXkgYmUgc2xpZ2h0bHkgc3RhbGUsIGJ1dCBhY3RpdmF0aW9uIHByb2NlZWRzICovIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSBib3RoIGNhY2hlcyBieSBmaWxlIHBhdGhcbiAgICogVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCBmb3IgZGVsZXRpb24gdG8gYXZvaWQgc3RhbGUgY2FjaGUgZW50cmllc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBGaWxlIHBhdGggKHJlbGF0aXZlIG9yIGFic29sdXRlKVxuICAgKi9cbiAgcHJvdGVjdGVkIHVuY2FjaGVCeVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGFic29sdXRlUGF0aCA9IHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChmaWxlUGF0aCk7XG4gICAgY29uc3QgZWxlbWVudElkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic29sdXRlUGF0aCk7XG5cbiAgICBpZiAoZWxlbWVudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWxlbWVudHMuZGVsZXRlKGVsZW1lbnRJZCk7XG4gICAgICB0aGlzLmZpbGVQYXRoVG9JZC5kZWxldGUoYWJzb2x1dGVQYXRoKTtcbiAgICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmRlbGV0ZShlbGVtZW50SWQpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBVbmNhY2hlZCBlbGVtZW50ICR7ZWxlbWVudElkfSBmcm9tICR7YWJzb2x1dGVQYXRofWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgY2FjaGVkIGVsZW1lbnRzXG4gICAqL1xuICBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMuZWxlbWVudHMuY2xlYXIoKTtcbiAgICB0aGlzLmZpbGVQYXRoVG9JZC5jbGVhcigpO1xuICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmNsZWFyKCk7XG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIuY2xlYXIoKTtcbiAgICB0aGlzLnN1cHByZXNzZWRMb2FkUGF0aHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgc3RhdGlzdGljcyBmb3IgZGVidWdnaW5nXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGNhY2hlIHNpemUgbWV0cmljc1xuICAgKi9cbiAgcHJvdGVjdGVkIGdldENhY2hlU3RhdHMoKTogeyBlbGVtZW50Q291bnQ6IG51bWJlcjsgcGF0aE1hcHBpbmdzOiBudW1iZXIgfSB7XG4gICAgY29uc3QgZWxlbWVudHNTdGF0cyA9IHRoaXMuZWxlbWVudHMuZ2V0U3RhdHMoKTtcbiAgICBjb25zdCBwYXRoU3RhdHMgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXRTdGF0cygpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRDb3VudDogZWxlbWVudHNTdGF0cy5zaXplLFxuICAgICAgcGF0aE1hcHBpbmdzOiBwYXRoU3RhdHMuc2l6ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRXhwb3NlIGludGVybmFsIExSVSBjYWNoZSBpbnN0YW5jZXMgZm9yIG1ldHJpY3MgY29sbGVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBnZXRNZXRyaWNzQ2FjaGVzKCk6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBpbnN0YW5jZTogTFJVQ2FjaGU8dW5rbm93bj4gfT4ge1xuICAgIHJldHVybiBbXG4gICAgICB7IG5hbWU6IGBlbGVtZW50czoke3RoaXMuZWxlbWVudFR5cGV9YCwgaW5zdGFuY2U6IHRoaXMuZWxlbWVudHMgYXMgTFJVQ2FjaGU8dW5rbm93bj4gfSxcbiAgICAgIHsgbmFtZTogYHBhdGhJbmRleDoke3RoaXMuZWxlbWVudFR5cGV9YCwgaW5zdGFuY2U6IHRoaXMuZmlsZVBhdGhUb0lkIGFzIExSVUNhY2hlPHVua25vd24+IH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG9mIHJlc291cmNlcyBhbmQgY2xlYW51cFxuICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBhZGQgdGhlaXIgb3duIGNsZWFudXAgbG9naWNcbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1lbW9yeUJ1ZGdldCkge1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQudW5yZWdpc3Rlcih0aGlzLmVsZW1lbnRzKTtcbiAgICAgIHRoaXMubWVtb3J5QnVkZ2V0LnVucmVnaXN0ZXIodGhpcy5maWxlUGF0aFRvSWQpO1xuICAgIH1cbiAgICB0aGlzLmVsZW1lbnRzLmNsZWFyKCk7XG4gICAgdGhpcy5maWxlUGF0aFRvSWQuY2xlYXIoKTtcbiAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5jbGVhcigpO1xuICAgIHRoaXMuc3RvcmFnZUxheWVyLmNsZWFyKCk7XG4gICAgdGhpcy53YXRjaGVyQ2xlYW51cD8uKCk7XG4gICAgdGhpcy53YXRjaGVyQ2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICBsb2dnZXIuZGVidWcoYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfU1hbmFnZXIgZGlzcG9zZWQgYW5kIGNhY2hlcyBjbGVhcmVkYCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBGSUxFTkFNRSBOT1JNQUxJWkFUSU9OIE1FVEhPRFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGEgbmFtZSB0byBrZWJhYi1jYXNlIGZvciBjb25zaXN0ZW50IGZpbGVuYW1lIGZvcm1hdHRpbmcuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIHVuaWZpZWQgZmlsZW5hbWUgbm9ybWFsaXphdGlvbiBhY3Jvc3MgYWxsIGVsZW1lbnQgbWFuYWdlcnMsXG4gICAqIGVuc3VyaW5nIGNvbnNpc3RlbnQgbmFtaW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0IGZvcm1hdCAoQ2FtZWxDYXNlLCBzcGFjZXMsXG4gICAqIHVuZGVyc2NvcmVzLCBtaXhlZCBjYXNlLCBldGMuKS5cbiAgICpcbiAgICogVHJhbnNmb3JtYXRpb25zIGFwcGxpZWQgKGluIG9yZGVyKTpcbiAgICogMS4gSW5zZXJ0IGh5cGhlbnMgYmV0d2VlbiBjYW1lbENhc2UgYm91bmRhcmllcyAoTXlOYW1lIC0+IE15LU5hbWUpXG4gICAqIDIuIFJlcGxhY2Ugc3BhY2VzIGFuZCB1bmRlcnNjb3JlcyB3aXRoIGh5cGhlbnNcbiAgICogMy4gQ29udmVydCB0byBsb3dlcmNhc2VcbiAgICogNC4gU3RyaXAgaW52YWxpZCBjaGFyYWN0ZXJzIChrZWVwIG9ubHkgYS16LCAwLTksIC0pXG4gICAqIDUuIENvbGxhcHNlIG11bHRpcGxlIGNvbnNlY3V0aXZlIGh5cGhlbnNcbiAgICogNi4gVHJpbSBsZWFkaW5nL3RyYWlsaW5nIGh5cGhlbnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJDUlVEVi1BZ2VudC1EZWx0YVwiKSAvLyBcImNydWR2LWFnZW50LWRlbHRhXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJDcmVhdGl2ZSBXcml0ZXJcIikgICAvLyBcImNyZWF0aXZlLXdyaXRlclwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiQ2FtZWxDYXNlTmFtZVwiKSAgICAgLy8gXCJjYW1lbC1jYXNlLW5hbWVcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIm15X3NraWxsX25hbWVcIikgICAgIC8vIFwibXktc2tpbGwtbmFtZVwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwiU3BlY2lhbEBDaGFycyFcIikgICAgLy8gXCJzcGVjaWFsLWNoYXJzXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCItLWxlYWRpbmctYW5kLXRyYWlsaW5nLS1cIikgLy8gXCJsZWFkaW5nLWFuZC10cmFpbGluZ1wiXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIGVsZW1lbnQgbmFtZSB0byBub3JtYWxpemVcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCBrZWJhYi1jYXNlIGZpbGVuYW1lICh3aXRob3V0IGV4dGVuc2lvbilcbiAgICovXG4gIHByb3RlY3RlZCBub3JtYWxpemVGaWxlbmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghbmFtZSB8fCBuYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAndW5uYW1lZCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWVcbiAgICAgIC8vIFN0ZXAgMTogSW5zZXJ0IGh5cGhlbnMgYmV0d2VlbiBjYW1lbENhc2UgYm91bmRhcmllcyAobG93ZXJjYXNlIGZvbGxvd2VkIGJ5IHVwcGVyY2FzZSlcbiAgICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDEtJDInKVxuICAgICAgLy8gU3RlcCAyOiBSZXBsYWNlIHNwYWNlcyBhbmQgdW5kZXJzY29yZXMgd2l0aCBoeXBoZW5zXG4gICAgICAucmVwbGFjZSgvW1xcc19dKy9nLCAnLScpXG4gICAgICAvLyBTdGVwIDM6IENvbnZlcnQgdG8gbG93ZXJjYXNlXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLy8gU3RlcCA0OiBTdHJpcCBpbnZhbGlkIGNoYXJhY3RlcnMgKGtlZXAgb25seSBhbHBoYW51bWVyaWMgYW5kIGh5cGhlbnMpXG4gICAgICAucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpXG4gICAgICAvLyBTdGVwIDU6IENvbGxhcHNlIG11bHRpcGxlIGNvbnNlY3V0aXZlIGh5cGhlbnNcbiAgICAgIC5yZXBsYWNlKC8tKy9nLCAnLScpXG4gICAgICAvLyBTdGVwIDY6IFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgaHlwaGVuc1xuICAgICAgLnJlcGxhY2UoL14tK3wtKyQvZywgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc3RhbmRhcmRpemVkIGZpbGVuYW1lIGZvciBhbiBlbGVtZW50LlxuICAgKlxuICAgKiBOb3JtYWxpemVzIHRoZSBlbGVtZW50IG5hbWUgKGhhbmRsaW5nIENhbWVsQ2FzZSwgc3BhY2VzLCB1bmRlcnNjb3JlcywgZXRjLilcbiAgICogYW5kIGFwcGVuZHMgdGhlIGZpbGUgZXh0ZW5zaW9uLiBUaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSAocGVyc29uYXMvLCBza2lsbHMvLCBldGMuKVxuICAgKiBhbHJlYWR5IHByb3ZpZGVzIHR5cGUgY29udGV4dCwgc28gdGhlIHR5cGUgaXMgTk9UIGluY2x1ZGVkIGluIHRoZSBmaWxlbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgZWxlbWVudCBuYW1lIHRvIGNvbnZlcnQgdG8gYSBmaWxlbmFtZVxuICAgKiBAcmV0dXJucyBUaGUgc3RhbmRhcmRpemVkIGZpbGVuYW1lIChlLmcuLCBcImNvZGUtcmV2aWV3Lm1kXCIpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGdldEVsZW1lbnRGaWxlbmFtZShcIkNvZGUgUmV2aWV3XCIpICAgICAgICAgLy8g4oaSIFwiY29kZS1yZXZpZXcubWRcIlxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJEZWJ1ZyBEZXRlY3RpdmVcIikgICAgIC8vIOKGkiBcImRlYnVnLWRldGVjdGl2ZS5tZFwiXG4gICAqIGdldEVsZW1lbnRGaWxlbmFtZShcIkJ1Z1JlcG9ydFwiKSAgICAgICAgICAgLy8g4oaSIFwiYnVnLXJlcG9ydC5tZFwiIChDYW1lbENhc2Ugc3BsaXQpXG4gICAqIGdldEVsZW1lbnRGaWxlbmFtZShcImZpeC1wZXJzb25hLWhlbHBlclwiKSAgLy8g4oaSIFwiZml4LXBlcnNvbmEtaGVscGVyLm1kXCIgKG5vIG1hbmdsaW5nKVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEVsZW1lbnRGaWxlbmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShuYW1lKSB8fCAndW5uYW1lZCc7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCk7XG4gICAgcmV0dXJuIGAke25vcm1hbGl6ZWROYW1lfSR7ZXh0ZW5zaW9ufWA7XG4gIH1cblxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFCU1RSQUNUIE1FVEhPRFMgLSBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBtZXRhZGF0YSBmcm9tIGZyb250bWF0dGVyXG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGVsZW1lbnQtc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpY1xuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFJhdyBtZXRhZGF0YSBmcm9tIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICogQHJldHVybnMgVmFsaWRhdGVkIGFuZCB0eXBlZCBtZXRhZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlTWV0YWRhdGEoZGF0YTogYW55KTogUHJvbWlzZTxUWydtZXRhZGF0YSddPjtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIEVsZW1lbnRWYWxpZGF0b3IgdmlhIFZhbGlkYXRpb25SZWdpc3RyeSBpbnN0ZWFkLlxuICAgKiBXaWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVNZXRhZGF0YShtZXRhZGF0YTogYW55LCBfc3RyaWN0PzogYm9vbGVhbik6IFByb21pc2U8aW1wb3J0KCcuLi8uLi91dGlscy92YWxpZGF0aW9uL0ZpZWxkVmFsaWRhdG9yLmpzJykuVmFsaWRhdGlvbkVycm9yW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZU1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICByZXR1cm4gcmVzdWx0LmVycm9ycy5tYXAoZSA9PiAoeyBmaWVsZDogJ2dlbmVyYWwnLCBtZXNzYWdlOiBlIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZWxlbWVudCBpbnN0YW5jZSBmcm9tIG1ldGFkYXRhIGFuZCBjb250ZW50XG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGVsZW1lbnQtc3BlY2lmaWMgY29uc3RydWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIFZhbGlkYXRlZCBtZXRhZGF0YVxuICAgKiBAcGFyYW0gY29udGVudCAtIEVsZW1lbnQgY29udGVudCAoaW5zdHJ1Y3Rpb25zLCB0ZW1wbGF0ZSwgZXRjLilcbiAgICogQHJldHVybnMgTmV3IGVsZW1lbnQgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVFbGVtZW50KG1ldGFkYXRhOiBUWydtZXRhZGF0YSddLCBjb250ZW50OiBzdHJpbmcpOiBUO1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgYW4gZWxlbWVudCB0byBmaWxlIGNvbnRlbnRcbiAgICogU3ViY2xhc3NlcyBjYW4gY3VzdG9taXplIHNlcmlhbGl6YXRpb24gZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXJpYWxpemVcbiAgICogQHJldHVybnMgRmlsZSBjb250ZW50ICh1c3VhbGx5IG1hcmtkb3duIHdpdGggZnJvbnRtYXR0ZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2VyaWFsaXplRWxlbWVudChlbGVtZW50OiBUKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgKiBNb3N0IGVsZW1lbnRzIHVzZSAubWQsIGJ1dCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZVxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBlbGVtZW50IGZyb20gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGZvcm1hdC1zcGVjaWZpYyBpbXBvcnQgbG9naWNcbiAgICovXG4gIGFic3RyYWN0IGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ/OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxUPjtcblxuICAvKipcbiAgICogRXhwb3J0IGFuIGVsZW1lbnQgdG8gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGZvcm1hdC1zcGVjaWZpYyBleHBvcnQgbG9naWNcbiAgICovXG4gIGFic3RyYWN0IGV4cG9ydEVsZW1lbnQoZWxlbWVudDogVCwgZm9ybWF0PzogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8c3RyaW5nPjtcbn1cbiJdfQ==
1045
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnRNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHekMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0sd0NBQXdDLENBQUM7QUFDckcsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFLdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFHM0UsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBC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QUM7UUFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsaUNBQWlDO0lBQ2pDLCtDQUErQztJQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCRztJQUNPLGlCQUFpQixDQUFDLElBQVk7UUFDdEMsT0FBTyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ08sa0JBQWtCLENBQUMsSUFBWTtRQUN2QyxNQUFNLGNBQWMsR0FBRywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQyxPQUFPLEdBQUcsY0FBYyxHQUFHLFNBQVMsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFnQkQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQWEsRUFBRSxPQUFpQjtRQUNyRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZUVsZW1lbnRNYW5hZ2VyIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGVsZW1lbnQgbWFuYWdlcnNcbiAqXG4gKiBQcm92aWRlcyBjb21tb24gQ1JVRCBvcGVyYXRpb25zIGZvciBhbGwgZWxlbWVudCB0eXBlcyB1c2luZyB0aGVcbiAqIFRlbXBsYXRlIE1ldGhvZCBQYXR0ZXJuOlxuICogLSBEZWZpbmVzIHRoZSBza2VsZXRvbiBvZiBvcGVyYXRpb25zIGluIGJhc2UgY2xhc3NcbiAqIC0gTGV0cyBzdWJjbGFzc2VzIG92ZXJyaWRlIHNwZWNpZmljIHN0ZXBzIHdpdGhvdXQgY2hhbmdpbmcgc3RydWN0dXJlXG4gKlxuICogU3ViY2xhc3NlczogU2tpbGxNYW5hZ2VyLCBUZW1wbGF0ZU1hbmFnZXIsIEFnZW50TWFuYWdlciwgTWVtb3J5TWFuYWdlclxuICpcbiAqIFNFQ1VSSVRZOlxuICogMS4gQ1JJVElDQUw6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgcmVhZC93cml0ZSBvcGVyYXRpb25zXG4gKiAyLiBISUdIOiBQYXRoIHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRhY2tzXG4gKiAzLiBNRURJVU06IFNlY3VyaXR5IGV2ZW50IGxvZ2dpbmcgZm9yIGF1ZGl0IHRyYWlsXG4gKiA0LiBNRURJVU06IElucHV0IHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiB0aHJvdWdob3V0XG4gKi9cblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IElFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudCwgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEZpbGVMb2NrTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5RXJyb3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9lcnJvcnMuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvTFJVQ2FjaGUuanMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IFBhdGhWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9wYXRoVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEVsZW1lbnRFdmVudERpc3BhdGNoZXIsIEVsZW1lbnRFdmVudFBheWxvYWQgfSBmcm9tICcuLi8uLi9ldmVudHMvRWxlbWVudEV2ZW50RGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHJhbnNhY3Rpb25TY29wZSB9IGZyb20gJy4vRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUuanMnO1xuaW1wb3J0IHsgRmlsZVdhdGNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVXYXRjaFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFZhbGlkYXRpb25SZWdpc3RyeSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IHR5cGUgRWxlbWVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vRWxlbWVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50U3RvcmFnZUxheWVyIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9FbGVtZW50U3RvcmFnZUxheWVyLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VMYXllciB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvSVN0b3JhZ2VMYXllci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRJbmRleEVudHJ5IH0gZnJvbSAnLi4vLi4vc3RvcmFnZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXRHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuaW1wb3J0IHsgTUVNT1JZX0NPTlNUQU5UUyB9IGZyb20gJy4uL21lbW9yaWVzL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24sXG4gIGdldFZhbGlkYXRlZEVsZW1lbnRDYWNoZVRUTCxcbiAgZ2V0VmFsaWRhdGVkUGF0aENhY2hlVFRMXG59IGZyb20gJy4uLy4uL2NvbmZpZy9wZXJmb3JtYW5jZS1jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDYWNoZU1lbW9yeUJ1ZGdldCB9IGZyb20gJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJztcbmltcG9ydCB0eXBlIHsgQmFja3VwU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXplRWxlbWVudEZpbGVuYW1lLCBub3JtYWxpemVFbGVtZW50U3RvcmFnZUlkZW50aXR5IH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZXN5c3RlbS5qcyc7XG5cbmNvbnN0IERFRkFVTFRfRUxFTUVOVF9DQUNIRV9UVExfTVMgPSBnZXRWYWxpZGF0ZWRFbGVtZW50Q2FjaGVUVEwoKTtcbmNvbnN0IERFRkFVTFRfUEFUSF9DQUNIRV9UVExfTVMgPSBnZXRWYWxpZGF0ZWRQYXRoQ2FjaGVUVEwoKTtcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlRWxlbWVudE1hbmFnZXJPcHRpb25zIHtcbiAgZWxlbWVudERpck92ZXJyaWRlPzogc3RyaW5nO1xuICBldmVudERpc3BhdGNoZXI/OiBFbGVtZW50RXZlbnREaXNwYXRjaGVyO1xuICBlbGVtZW50Q2FjaGVUVEw/OiBudW1iZXI7XG4gIHBhdGhDYWNoZVRUTD86IG51bWJlcjtcbiAgZW5hYmxlRmlsZVdhdGNoZXI/OiBib29sZWFuO1xuICBhdXRvUmVsb2FkT25FeHRlcm5hbENoYW5nZT86IGJvb2xlYW47XG4gIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlO1xuICBtZW1vcnlCdWRnZXQ/OiBDYWNoZU1lbW9yeUJ1ZGdldDtcbiAgYmFja3VwU2VydmljZT86IEJhY2t1cFNlcnZpY2U7XG59XG5cbi8qKlxuICogUmVjb3JkIG9mIGFuIGVsZW1lbnQgdGhhdCBmYWlsZWQgdG8gbG9hZCAoSXNzdWUgIzcwOCkuXG4gKiBTdG9yZWQgc28gY2FsbGVycyBjYW4gZGlzdGluZ3Vpc2ggXCJmaWxlIG5vdCBmb3VuZFwiIGZyb20gXCJmaWxlIGludmFsaWRcIi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZhbGlkRWxlbWVudFJlY29yZCB7XG4gIC8qKiBSZWxhdGl2ZSBmaWxlIHBhdGggd2l0aGluIHRoZSBlbGVtZW50IGRpcmVjdG9yeS4gKi9cbiAgZmlsZVBhdGg6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHJlYXNvbiB0aGUgZWxlbWVudCB3YXMgcmVqZWN0ZWQuICovXG4gIHJlYXNvbjogc3RyaW5nO1xuICAvKiogSVNPIHRpbWVzdGFtcCBvZiBsYXN0IGZhaWxlZCBsb2FkIGF0dGVtcHQuICovXG4gIGZhaWxlZEF0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBpbXBsZW1lbnRpbmcgY29tbW9uIGVsZW1lbnQgbWFuYWdlbWVudCBvcGVyYXRpb25zXG4gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IGVsZW1lbnQtc3BlY2lmaWMgbG9naWMgdmlhIGFic3RyYWN0IG1ldGhvZHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFbGVtZW50TWFuYWdlcjxUIGV4dGVuZHMgSUVsZW1lbnQ+IGltcGxlbWVudHMgSUVsZW1lbnRNYW5hZ2VyPFQ+IHtcbiAgcHJvdGVjdGVkIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXI7XG4gIHByb3RlY3RlZCBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcjtcbiAgcHJvdGVjdGVkIGZpbGVPcGVyYXRpb25zOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHByb3RlY3RlZCBmaWxlV2F0Y2hTZXJ2aWNlPzogRmlsZVdhdGNoU2VydmljZTtcbiAgcHJvdGVjdGVkIGVsZW1lbnREaXI6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgKiBPYnRhaW5lZCBmcm9tIFZhbGlkYXRpb25SZWdpc3RyeSBkdXJpbmcgY29uc3RydWN0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdG9yOiBFbGVtZW50VmFsaWRhdG9yO1xuXG4gIC8vIFByaW1hcnkgY2FjaGU6IElEIOKGkiBFbGVtZW50ICh3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzKVxuICBwcm90ZWN0ZWQgZWxlbWVudHM6IExSVUNhY2hlPFQ+O1xuXG4gIC8vIFJldmVyc2UgaW5kZXg6IEFic29sdXRlIEZpbGVQYXRoIOKGkiBFbGVtZW50IElEICh3aXRoIHNpemUgbGltaXRzKVxuICBwcml2YXRlIGZpbGVQYXRoVG9JZDogTFJVQ2FjaGU8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50R2VuZXJhdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBwcml2YXRlIGNhY2hlR2VuZXJhdGlvbkNvdW50ZXIgPSAwO1xuICBwcml2YXRlIHdhdGNoZXJDbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBldmVudERpc3BhdGNoZXI6IEVsZW1lbnRFdmVudERpc3BhdGNoZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2U6IGJvb2xlYW47XG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yeUJ1ZGdldD86IENhY2hlTWVtb3J5QnVkZ2V0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmFja3VwU2VydmljZT86IEJhY2t1cFNlcnZpY2U7XG5cbiAgLyoqIE1hcCBwbHVyYWwgRWxlbWVudFR5cGUgZW51bSB2YWx1ZXMgdG8gc2luZ3VsYXIgQ29udGVudFZhbGlkYXRvciBjb250ZXh0LlxuICAgKiAgUGFydGlhbCBiZWNhdXNlIG5vdCBhbGwgZWxlbWVudCB0eXBlcyBoYXZlIGEgY29udGVudCBjb250ZXh0IChlLmcuLCBlbnNlbWJsZXMpLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBFTEVNRU5UX1RZUEVfVE9fQ09OVEVYVDogUGFydGlhbDxSZWNvcmQ8RWxlbWVudFR5cGUsICdwZXJzb25hJyB8ICdza2lsbCcgfCAndGVtcGxhdGUnIHwgJ2FnZW50JyB8ICdtZW1vcnknPj4gPSB7XG4gICAgW0VsZW1lbnRUeXBlLlBFUlNPTkFdOiAncGVyc29uYScsXG4gICAgW0VsZW1lbnRUeXBlLlNLSUxMXTogJ3NraWxsJyxcbiAgICBbRWxlbWVudFR5cGUuVEVNUExBVEVdOiAndGVtcGxhdGUnLFxuICAgIFtFbGVtZW50VHlwZS5BR0VOVF06ICdhZ2VudCcsXG4gICAgW0VsZW1lbnRUeXBlLk1FTU9SWV06ICdtZW1vcnknLFxuICB9O1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzdG9yYWdlTGF5ZXI6IElTdG9yYWdlTGF5ZXI7XG5cbiAgLyoqXG4gICAqIElzc3VlICM3MDg6IEVsZW1lbnRzIHRoYXQgZXhpc3Qgb24gZGlzayBidXQgZmFpbGVkIHZhbGlkYXRpb24gZHVyaW5nIGxvYWQuXG4gICAqIEtleWVkIGJ5IHJlbGF0aXZlIGZpbGUgcGF0aCBmb3IgZGVkdXBsaWNhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW52YWxpZEVsZW1lbnRzID0gbmV3IE1hcDxzdHJpbmcsIEludmFsaWRFbGVtZW50UmVjb3JkPigpO1xuXG4gIC8qKlxuICAgKiBUcmFja3MgZmlsZSBwYXRocyB3aG9zZSBsb2FkIGZhaWx1cmUgaGFzIGFscmVhZHkgYmVlbiBsb2dnZWQgYXQgZXJyb3IgbGV2ZWwuXG4gICAqIFJlcGVhdGVkIGZhaWx1cmVzIHdpdGggdGhlIHNhbWUgcmVhc29uIGFyZSBkZW1vdGVkIHRvIGRlYnVnIHRvIGF2b2lkIGxvZyBmbG9vZGluZy5cbiAgICogQ2xlYXJlZCB3aGVuIHRoZSBmaWxlIGNoYW5nZXMgb24gZGlzayBvciBsb2FkcyBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHN1cHByZXNzZWRMb2FkUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtb3N0IHJlY2VudCBsb2FkKCkgZmFpbHVyZSBmb3IgdGhpcyBwYXRoIHdhcyBzdXBwcmVzc2VkXG4gICAqIGJlY2F1c2UgaXQgd2FzIGEgcmVwZWF0IG9mIGFuIGFscmVhZHktbG9nZ2VkIGVycm9yLlxuICAgKiBTdWJjbGFzc2VzIGNhbiB1c2UgdGhpcyB0byBhdm9pZCBkdXBsaWNhdGUgc2VjdXJpdHkgZXZlbnQgbG9nZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gUmVsYXRpdmUgZmlsZSBwYXRoIHdpdGhpbiB0aGUgZWxlbWVudCBkaXJlY3RvcnlcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgZXJyb3IgZm9yIHRoaXMgcGF0aCBpcyBjdXJyZW50bHkgc3VwcHJlc3NlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGlzTG9hZEVycm9yU3VwcHJlc3NlZChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5oYXMoZmlsZVBhdGgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFmdGVyTG9hZD8oZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBiZWZvcmVTYXZlPyhlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIGFmdGVyU2F2ZT8oZWxlbWVudDogVCwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCBmaW5kQnlJZGVudGlmaWVyPyhpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xuICBwcm90ZWN0ZWQgY2FuRGVsZXRlPyhlbGVtZW50OiBUKTogUHJvbWlzZTx7IGFsbG93ZWQ6IGJvb2xlYW47IHJlYXNvbj86IHN0cmluZyB9PjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFja3VwIGJlZm9yZSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBmaWxlLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0byBuby1vcCAoZS5nLiBNZW1vcnlNYW5hZ2VyIGhhcyBpdHMgb3duIGJhY2t1cCBzeXN0ZW0pLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUJhY2t1cEJlZm9yZVNhdmUoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuYmFja3VwU2VydmljZSkgcmV0dXJuO1xuICAgIGF3YWl0IHRoaXMuYmFja3VwU2VydmljZS5iYWNrdXBCZWZvcmVTYXZlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFja3VwIGJlZm9yZSBkZWxldGluZyBhIGZpbGUgKG1vdmVzIGZpbGUgdG8gYmFja3VwIGRpcikuXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3JpZ2luYWwgZmlsZSB3YXMgbW92ZWQgKGNhbGxlciBzaG91bGQgc2tpcCBkZWxldGVGaWxlKS5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdG8gbm8tb3AgKGUuZy4gTWVtb3J5TWFuYWdlciBoYXMgaXRzIG93biBiYWNrdXAgc3lzdGVtKS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVCYWNrdXBCZWZvcmVEZWxldGUoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuYmFja3VwU2VydmljZSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYmFja3VwU2VydmljZS5iYWNrdXBCZWZvcmVEZWxldGUoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnRUeXBlKTtcbiAgICByZXR1cm4gISFyZXN1bHQubW92ZWRPcmlnaW5hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGV2ZW50IGRpc3BhdGNoZXIgZm9yIHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvIGVtaXQgY3VzdG9tIGV2ZW50cy5cbiAgICpcbiAgICogQmFzZUVsZW1lbnRNYW5hZ2VyIGhhbmRsZXMgc3RhbmRhcmQgbGlmZWN5Y2xlIGV2ZW50cyAobG9hZCwgc2F2ZSwgZGVsZXRlKSBhdXRvbWF0aWNhbGx5LlxuICAgKiBTdWJjbGFzc2VzIHNob3VsZCB1c2UgdGhpcyBnZXR0ZXIgb25seSB3aGVuIHRoZXkgbmVlZCB0byBlbWl0IGFkZGl0aW9uYWwgZG9tYWluLXNwZWNpZmljXG4gICAqIGV2ZW50cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQgQ1JVRCBsaWZlY3ljbGUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIFBlcnNvbmFNYW5hZ2VyIGVtaXRzIGFjdGl2YXRpb24vZGVhY3RpdmF0aW9uIGV2ZW50c1xuICAgKiB0aGlzLmRpc3BhdGNoZXIuZW1pdCgnZWxlbWVudDphY3RpdmF0ZScsIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsuLi59KSk7XG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBFbGVtZW50RXZlbnREaXNwYXRjaGVyIGluc3RhbmNlIHVzZWQgYnkgdGhpcyBtYW5hZ2VyXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGRpc3BhdGNoZXIoKTogRWxlbWVudEV2ZW50RGlzcGF0Y2hlciB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnREaXNwYXRjaGVyO1xuICB9XG5cbiAgLy8gQ2FjaGUgY29uZmlndXJhdGlvbiBjb25zdGFudHNcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0VMRU1FTlRfQ0FDSEVfU0laRSA9IDEwMDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9QQVRIX0NBQ0hFX1NJWkUgPSAxMDAwO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciAtIGluaXRpYWxpemVzIGNvbW1vbiBkZXBlbmRlbmNpZXNcbiAgICogQHBhcmFtIGVsZW1lbnRUeXBlIC0gVGhlIHR5cGUgb2YgZWxlbWVudCB0aGlzIG1hbmFnZXIgaGFuZGxlc1xuICAgKiBAcGFyYW0gcG9ydGZvbGlvTWFuYWdlciAtIFBvcnRmb2xpbyBtYW5hZ2VyIGZvciBkaXJlY3RvcnkgcmVzb2x1dGlvblxuICAgKiBAcGFyYW0gZmlsZUxvY2tNYW5hZ2VyIC0gRmlsZSBsb2NrIG1hbmFnZXIgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBmaWxlV2F0Y2hTZXJ2aWNlXG4gICAqIEBwYXJhbSBmaWxlT3BlcmF0aW9uc1NlcnZpY2UgLSBTZXJ2aWNlIGZvciBmaWxlIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIHZhbGlkYXRpb25SZWdpc3RyeSAtIFJlZ2lzdHJ5IGZvciBvYnRhaW5pbmcgdHlwZS1zcGVjaWZpYyB2YWxpZGF0b3JzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUsXG4gICAgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcixcbiAgICBmaWxlTG9ja01hbmFnZXI6IEZpbGVMb2NrTWFuYWdlcixcbiAgICBvcHRpb25zOiBCYXNlRWxlbWVudE1hbmFnZXJPcHRpb25zID0ge30sXG4gICAgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgdmFsaWRhdGlvblJlZ2lzdHJ5OiBWYWxpZGF0aW9uUmVnaXN0cnlcbiAgKSB7XG4gICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IHBvcnRmb2xpb01hbmFnZXI7XG4gICAgdGhpcy5maWxlTG9ja01hbmFnZXIgPSBmaWxlTG9ja01hbmFnZXI7XG4gICAgdGhpcy5maWxlT3BlcmF0aW9ucyA9IGZpbGVPcGVyYXRpb25zU2VydmljZTtcbiAgICB0aGlzLmZpbGVXYXRjaFNlcnZpY2UgPSBvcHRpb25zLmZpbGVXYXRjaFNlcnZpY2U7XG4gICAgdGhpcy5iYWNrdXBTZXJ2aWNlID0gb3B0aW9ucy5iYWNrdXBTZXJ2aWNlO1xuXG4gICAgLy8gR2V0IHRoZSBzcGVjaWFsaXplZCB2YWxpZGF0b3IgZm9yIHRoaXMgZWxlbWVudCB0eXBlXG4gICAgdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VmFsaWRhdG9yKGVsZW1lbnRUeXBlKTtcblxuICAgIGNvbnN0IGVsZW1lbnRDYWNoZVRUTCA9IG9wdGlvbnMuZWxlbWVudENhY2hlVFRMID8/IERFRkFVTFRfRUxFTUVOVF9DQUNIRV9UVExfTVM7XG4gICAgY29uc3QgcGF0aENhY2hlVFRMID0gb3B0aW9ucy5wYXRoQ2FjaGVUVEwgPz8gREVGQVVMVF9QQVRIX0NBQ0hFX1RUTF9NUztcbiAgICB0aGlzLm1lbW9yeUJ1ZGdldCA9IG9wdGlvbnMubWVtb3J5QnVkZ2V0O1xuXG4gICAgY29uc3Qgb25TZXRDYWxsYmFjayA9IHRoaXMubWVtb3J5QnVkZ2V0XG4gICAgICA/ICgpID0+IHRoaXMubWVtb3J5QnVkZ2V0IS5lbmZvcmNlKClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBMUlUgY2FjaGVzIHdpdGggc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICB0aGlzLmVsZW1lbnRzID0gbmV3IExSVUNhY2hlPFQ+KHtcbiAgICAgIG5hbWU6IGBlbGVtZW50czoke2VsZW1lbnRUeXBlfWAsXG4gICAgICBtYXhTaXplOiBCYXNlRWxlbWVudE1hbmFnZXIuTUFYX0VMRU1FTlRfQ0FDSEVfU0laRSxcbiAgICAgIG1heE1lbW9yeU1COiA1MCwgLy8gTWF4IDUwTUIgZm9yIGVsZW1lbnQgY2FjaGVcbiAgICAgIHR0bE1zOiBlbGVtZW50Q2FjaGVUVEwsXG4gICAgICBvblNldDogb25TZXRDYWxsYmFjayxcbiAgICB9KTtcblxuICAgIHRoaXMuZmlsZVBhdGhUb0lkID0gbmV3IExSVUNhY2hlPHN0cmluZz4oe1xuICAgICAgbmFtZTogYHBhdGhJbmRleDoke2VsZW1lbnRUeXBlfWAsXG4gICAgICBtYXhTaXplOiBCYXNlRWxlbWVudE1hbmFnZXIuTUFYX1BBVEhfQ0FDSEVfU0laRSxcbiAgICAgIG1heE1lbW9yeU1COiAxMCwgLy8gTWF4IDEwTUIgZm9yIHBhdGggbWFwcGluZ3NcbiAgICAgIHR0bE1zOiBwYXRoQ2FjaGVUVEwsXG4gICAgICBvblNldDogb25TZXRDYWxsYmFjayxcbiAgICB9KTtcblxuICAgIC8vIFJlZ2lzdGVyIGNhY2hlcyB3aXRoIGdsb2JhbCBtZW1vcnkgYnVkZ2V0XG4gICAgaWYgKHRoaXMubWVtb3J5QnVkZ2V0KSB7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC5yZWdpc3Rlcih0aGlzLmVsZW1lbnRzKTtcbiAgICAgIHRoaXMubWVtb3J5QnVkZ2V0LnJlZ2lzdGVyKHRoaXMuZmlsZVBhdGhUb0lkKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5lbGVtZW50RGlyT3ZlcnJpZGUpIHtcbiAgICAgIHRoaXMuZWxlbWVudERpciA9IG9wdGlvbnMuZWxlbWVudERpck92ZXJyaWRlO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mICh0aGlzLnBvcnRmb2xpb01hbmFnZXIgYXMgYW55KS5nZXRFbGVtZW50RGlyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmVsZW1lbnREaXIgPSAodGhpcy5wb3J0Zm9saW9NYW5hZ2VyIGFzIGFueSkuZ2V0RWxlbWVudERpcihlbGVtZW50VHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuYWJsZSB0byByZXNvbHZlIGVsZW1lbnQgZGlyZWN0b3J5IGZvciAke2VsZW1lbnRUeXBlfS4gYCArXG4gICAgICAgICdQcm92aWRlIGFuIGVsZW1lbnREaXJPdmVycmlkZSB3aGVuIGluc3RhbnRpYXRpbmcgdGhpcyBtYW5hZ2VyLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIgPSBvcHRpb25zLmV2ZW50RGlzcGF0Y2hlciA/PyBFbGVtZW50RXZlbnREaXNwYXRjaGVyLmdldFNoYXJlZERpc3BhdGNoZXIoKTtcbiAgICB0aGlzLmF1dG9SZWxvYWRPbkV4dGVybmFsQ2hhbmdlID1cbiAgICAgIG9wdGlvbnMuYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2UgPz8gcHJvY2Vzcy5lbnYuQVVUT19SRUxPQURfT05fRVhURVJOQUxfQ0hBTkdFID09PSAndHJ1ZSc7XG5cbiAgICBjb25zdCBlbmFibGVXYXRjaGVyID0gb3B0aW9ucy5lbmFibGVGaWxlV2F0Y2hlciA/PyBwcm9jZXNzLmVudi5ET0xMSE9VU0VfRU5BQkxFX0ZJTEVfV0FUQ0hFUiA9PT0gJ3RydWUnO1xuICAgIGlmIChlbmFibGVXYXRjaGVyICYmIHRoaXMuZmlsZVdhdGNoU2VydmljZSkge1xuICAgICAgdGhpcy53YXRjaGVyQ2xlYW51cCA9IHRoaXMuZmlsZVdhdGNoU2VydmljZS53YXRjaERpcmVjdG9yeShcbiAgICAgICAgdGhpcy5lbGVtZW50RGlyLFxuICAgICAgICAocmVsYXRpdmVQYXRoKSA9PiB0aGlzLmhhbmRsZUV4dGVybmFsQ2hhbmdlKHJlbGF0aXZlUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIgPSB0aGlzLmNyZWF0ZVN0b3JhZ2VMYXllcihmaWxlT3BlcmF0aW9uc1NlcnZpY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyB0aGUgc3RvcmFnZSBsYXllci5cbiAgICogRGVmYXVsdCByZXR1cm5zIEVsZW1lbnRTdG9yYWdlTGF5ZXIgZm9yIC5tZCBlbGVtZW50cy5cbiAgICogU3ViY2xhc3NlcyAoZS5nLiBNZW1vcnlNYW5hZ2VyKSBjYW4gb3ZlcnJpZGUgdG8gcmV0dXJuIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVN0b3JhZ2VMYXllcihmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSk6IElTdG9yYWdlTGF5ZXIge1xuICAgIHJldHVybiBuZXcgRWxlbWVudFN0b3JhZ2VMYXllcihmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHtcbiAgICAgIGVsZW1lbnREaXI6IHRoaXMuZWxlbWVudERpcixcbiAgICAgIGZpbGVFeHRlbnNpb246IHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpLFxuICAgICAgc2NhbkNvb2xkb3duTXM6IGdldFZhbGlkYXRlZFNjYW5Db29sZG93bigpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbmd1bGFyIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGlzIGVsZW1lbnQgdHlwZSAoZS5nLiwgXCJza2lsbFwiLCBcInBlcnNvbmFcIikuXG4gICAqIFVzZWQgaW4gZmlsZW5hbWUgZ2VuZXJhdGlvbiAoe25hbWV9LXtsYWJlbH0ubWQpIGFuZCBkaXNwbGF5IHN0cmluZ3MuXG4gICAqIE11c3QgcmV0dXJuIHRoZSBzaW5ndWxhciBmb3JtIOKAlCBub3QgdGhlIHBsdXJhbCBFbGVtZW50VHlwZSB2YWx1ZS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY2FwaXRhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgZWxlbWVudCBsYWJlbC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5nZXRFbGVtZW50TGFiZWwoKTtcbiAgICByZXR1cm4gbGFiZWwuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBsYWJlbC5zbGljZSgxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuIGVsZW1lbnQgZnJvbSBmaWxlXG4gICAqIFRFTVBMQVRFIE1FVEhPRDogRGVmaW5lcyB0aGUgYWxnb3JpdGhtLCBzdWJjbGFzc2VzIGN1c3RvbWl6ZSBzdGVwc1xuICAgKlxuICAgKiBTRUNVUklUWSBGSVhFUyAoaW5oZXJpdGVkIGZyb20gb3JpZ2luYWwgbWFuYWdlcnMpOlxuICAgKiAtIHRoaXMuZmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKCkgcHJldmVudHMgcmFjZSBjb25kaXRpb25zXG4gICAqIC0gUGF0aCB2YWxpZGF0aW9uIHByZXZlbnRzIHRyYXZlcnNhbCBhdHRhY2tzXG4gICAqIC0gU2VjdXJpdHkgZXZlbnQgbG9nZ2luZyBmb3IgYXVkaXQgdHJhaWxcbiAgICovXG4gIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHsgcmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdChcbiAgICAgICdlbGVtZW50OmxvYWQ6c3RhcnQnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoIH0pXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRWxlbWVudEZpbGUoYWJzb2x1dGVQYXRoLCB0aGlzLmVsZW1lbnRUeXBlLCB7XG4gICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5sb2FkYFxuICAgICAgfSk7XG4gICAgICAvLyBJc3N1ZSAjODEwOiBQYXNzIGVsZW1lbnQgdHlwZSBhcyBjb250ZW50Q29udGV4dCBzbyBTZWN1cmVZYW1sUGFyc2VyIGV4ZW1wdHNcbiAgICAgIC8vIGxlZ2l0aW1hdGUgcGF0dGVybnMgKGUuZy4sIDxzY3JpcHQ+IHNlY3Rpb24gdGFncyBpbiB0ZW1wbGF0ZXMpXG4gICAgICBjb25zdCBjb250ZW50Q29udGV4dCA9IEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVFt0aGlzLmVsZW1lbnRUeXBlXTtcbiAgICAgIGlmICghY29udGVudENvbnRleHQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XSBObyBjb250ZW50Q29udGV4dCBtYXBwaW5nIGZvciBlbGVtZW50VHlwZSAnJHt0aGlzLmVsZW1lbnRUeXBlfScg4oCUIHBhcnNpbmcgd2l0aG91dCBjb250ZXh0IGV4ZW1wdGlvbnMuIEF2YWlsYWJsZTogJHtPYmplY3Qua2V5cyhCYXNlRWxlbWVudE1hbmFnZXIuRUxFTUVOVF9UWVBFX1RPX0NPTlRFWFQpLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnNhZmVNYXR0ZXIoY29udGVudCwgdW5kZWZpbmVkLCB7IGNvbnRlbnRDb250ZXh0IH0pO1xuXG4gICAgICAvLyBJc3N1ZSAjNjk1OiBGaWxsIGluIG1pc3NpbmcgbWV0YWRhdGEgZmllbGRzIHdpdGggc2Vuc2libGUgZGVmYXVsdHNcbiAgICAgIC8vIGJlZm9yZSBwYXJzZU1ldGFkYXRhKCkgc28gb2xkZXIgZWxlbWVudHMgd2l0aCBzcGFyc2UgZnJvbnRtYXR0ZXJcbiAgICAgIC8vIGRvbid0IGdldCByZWplY3RlZC5cbiAgICAgIHRoaXMubWlncmF0ZU1ldGFkYXRhRGVmYXVsdHMocGFyc2VkLmRhdGEsIHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5wYXJzZU1ldGFkYXRhKHBhcnNlZC5kYXRhKTtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnQobWV0YWRhdGEsIHBhcnNlZC5jb250ZW50KTtcblxuICAgICAgaWYgKHRoaXMuYWZ0ZXJMb2FkKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJMb2FkKGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIC8vIElzc3VlICM3MDg6IENsZWFyIGFueSBwcmV2aW91cyBpbnZhbGlkIHJlY29yZCBvbiBzdWNjZXNzZnVsIGxvYWRcbiAgICAgIHRoaXMuaW52YWxpZEVsZW1lbnRzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IGxvYWRlZDogJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWV9YCk7XG5cbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6bG9hZDpzdWNjZXNzJyxcbiAgICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50IH0pXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSXNzdWUgIzcwODogUmVjb3JkIHRoZSBmYWlsdXJlIHNvIGNhbGxlcnMgY2FuIGRpc3Rpbmd1aXNoXG4gICAgICAvLyBcImZpbGUgbm90IGZvdW5kXCIgZnJvbSBcImZpbGUgZXhpc3RzIGJ1dCBmYWlsZWQgdmFsaWRhdGlvblwiLlxuICAgICAgLy8gT25seSB0cmFjayBwYXJzZS92YWxpZGF0aW9uIGVycm9ycyDigJQgRU5PRU5UIG1lYW5zIHRoZSBmaWxlIGlzIGdlbnVpbmVseVxuICAgICAgLy8gbWlzc2luZywgbm90IGludmFsaWQsIHNvIHdlIG11c3Qgbm90IHBvbGx1dGUgdGhlIGludmFsaWQgbWFwIHdpdGggaXQuXG4gICAgICBjb25zdCBpc0ZpbGVOb3RGb3VuZCA9IChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgPT09ICdFTk9FTlQnO1xuICAgICAgbGV0IGlzUmVwZWF0RXJyb3IgPSBmYWxzZTtcblxuICAgICAgaWYgKCFpc0ZpbGVOb3RGb3VuZCkge1xuICAgICAgICBjb25zdCByZWFzb24gPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5pbnZhbGlkRWxlbWVudHMuZ2V0KHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIGlzUmVwZWF0RXJyb3IgPSBleGlzdGluZz8ucmVhc29uID09PSByZWFzb247XG5cbiAgICAgICAgdGhpcy5pbnZhbGlkRWxlbWVudHMuc2V0KHJlbGF0aXZlUGF0aCwge1xuICAgICAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgICAgcmVhc29uLFxuICAgICAgICAgIGZhaWxlZEF0OiBpc1JlcGVhdEVycm9yID8gZXhpc3RpbmchLmZhaWxlZEF0IDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVwZWF0RXJyb3IpIHtcbiAgICAgICAgdGhpcy5zdXBwcmVzc2VkTG9hZFBhdGhzLmFkZChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYFN1cHByZXNzZWQgcmVwZWF0ZWQgbG9hZCBlcnJvciBmb3IgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSAke3JlbGF0aXZlUGF0aH1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAgICdlbGVtZW50OmxvYWQ6ZXJyb3InLFxuICAgICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZXJyb3IgfSlcbiAgICAgICAgKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IGZyb20gJHthYnNvbHV0ZVBhdGh9OmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNjk1OiBQcmUtZmlsbCBtaXNzaW5nIG1ldGFkYXRhIGZpZWxkcyB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzXG4gICAqIGJlZm9yZSBwYXJzZU1ldGFkYXRhKCkgcnVucy4gVGhpcyBpbXBsZW1lbnRzIHRoZSBcInRvbGVyYW50IHJlYWRlclwiIHBhdHRlcm5cbiAgICog4oCUIHN0cmljdCBvbiBvdXRwdXQsIGxlbmllbnQgb24gaW5wdXQgZm9yIG9sZGVyL3NwYXJzZSBmcm9udG1hdHRlci5cbiAgICpcbiAgICogTXV0YXRlcyBgZGF0YWAgaW4gcGxhY2UuIExvZ3MgYSB3YXJuaW5nIGZvciBlYWNoIGRlZmF1bHRlZCBmaWVsZCBzb1xuICAgKiBvcGVyYXRvcnMga25vdyB3aGljaCBmaWxlcyBuZWVkIHVwZGF0aW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBtaWdyYXRlTWV0YWRhdGFEZWZhdWx0cyhkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG1pZ3JhdGVkOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gSW5mZXIgdHlwZSBmcm9tIHRoaXMgbWFuYWdlcidzIGVsZW1lbnQgdHlwZVxuICAgIGlmICghZGF0YS50eXBlKSB7XG4gICAgICAvLyBFbGVtZW50VHlwZSBpcyBwbHVyYWwgKCdwZXJzb25hcycsICdza2lsbHMnLCBldGMuKVxuICAgICAgLy8gU29tZSBtYW5hZ2VycyBleHBlY3Qgc2luZ3VsYXIgKCdwZXJzb25hJywgJ2FnZW50JyksIHNvbWUgcGx1cmFsLlxuICAgICAgLy8gU2V0IHRoZSBwbHVyYWwgZm9ybSDigJQgcGFyc2VNZXRhZGF0YSgpIGhhbmRsZXMgbm9ybWFsaXphdGlvbi5cbiAgICAgIGRhdGEudHlwZSA9IHRoaXMuZWxlbWVudFR5cGU7XG4gICAgICBtaWdyYXRlZC5wdXNoKCd0eXBlJyk7XG4gICAgfVxuXG4gICAgLy8gSW5mZXIgbmFtZSBmcm9tIGZpbGVuYW1lIChzdHJpcCBleHRlbnNpb24sIHVuLXNsdWdpZnkpXG4gICAgaWYgKCFkYXRhLm5hbWUpIHtcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCkpO1xuICAgICAgZGF0YS5uYW1lID0gYmFzZW5hbWU7XG4gICAgICBtaWdyYXRlZC5wdXNoKCduYW1lJyk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB2ZXJzaW9uXG4gICAgaWYgKCFkYXRhLnZlcnNpb24pIHtcbiAgICAgIGRhdGEudmVyc2lvbiA9ICcxLjAuMCc7XG4gICAgICBtaWdyYXRlZC5wdXNoKCd2ZXJzaW9uJyk7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBhdXRob3JcbiAgICBpZiAoIWRhdGEuYXV0aG9yKSB7XG4gICAgICBkYXRhLmF1dGhvciA9ICd1bmtub3duJztcbiAgICAgIG1pZ3JhdGVkLnB1c2goJ2F1dGhvcicpO1xuICAgIH1cblxuICAgIGlmIChtaWdyYXRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYFtUb2xlcmFudFJlYWRlcl0gJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IFwiJHtmaWxlUGF0aH1cIjogYCArXG4gICAgICAgIGBkZWZhdWx0ZWQgbWlzc2luZyBmaWVsZHM6ICR7bWlncmF0ZWQuam9pbignLCAnKX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNzA4OiBSZXR1cm5zIGVsZW1lbnRzIHRoYXQgZXhpc3Qgb24gZGlzayBidXQgZmFpbGVkIHZhbGlkYXRpb24gZHVyaW5nIGxvYWQuXG4gICAqIENhbGxlcnMgY2FuIHVzZSB0aGlzIHRvIHJlcG9ydCBpbnZhbGlkIGVsZW1lbnRzIGluc3RlYWQgb2Ygc2lsZW50bHkgaGlkaW5nIHRoZW0uXG4gICAqL1xuICBnZXRJbnZhbGlkRWxlbWVudHMoKTogSW52YWxpZEVsZW1lbnRSZWNvcmRbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmludmFsaWRFbGVtZW50cy52YWx1ZXMoKV07XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzcwODogQ2hlY2sgaWYgYSBzcGVjaWZpYyBmaWxlIGZhaWxlZCB2YWxpZGF0aW9uIGR1cmluZyBsb2FkLlxuICAgKiBVc2VkIGJ5IGdldF9lbGVtZW50IHRvIGRpc3Rpbmd1aXNoIFwibm90IGZvdW5kXCIgZnJvbSBcImludmFsaWRcIi5cbiAgICovXG4gIGdldEludmFsaWRFbGVtZW50KG5hbWU6IHN0cmluZyk6IEludmFsaWRFbGVtZW50UmVjb3JkIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBDaGVjayBieSBleGFjdCBwYXRoIG1hdGNoIGFuZCBieSBuYW1lLWJhc2VkIG1hdGNoXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIHJlY29yZF0gb2YgdGhpcy5pbnZhbGlkRWxlbWVudHMpIHtcbiAgICAgIGlmIChmaWxlUGF0aCA9PT0gbmFtZSkgcmV0dXJuIHJlY29yZDtcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCkpO1xuICAgICAgaWYgKGJhc2VuYW1lID09PSBuYW1lIHx8IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoYmFzZW5hbWUpID09PSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKG5hbWUpKSB7XG4gICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhbiBlbGVtZW50IHRvIGZpbGVcbiAgICogVEVNUExBVEUgTUVUSE9EOiBDb21tb24gc2F2ZSBsb2dpYyB3aXRoIGhvb2tzIGZvciBjdXN0b21pemF0aW9uXG4gICAqXG4gICAqIFNFQ1VSSVRZIEZJWEVTOlxuICAgKiAtIHRoaXMuZmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZSgpIGZvciBhdG9taWMgb3BlcmF0aW9uc1xuICAgKiAtIFBhdGggdmFsaWRhdGlvbiB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRhY2tzXG4gICAqIC0gU2VjdXJpdHkgZXZlbnQgbG9nZ2luZ1xuICAgKi9cbiAgYXN5bmMgc2F2ZShlbGVtZW50OiBULCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyByZWxhdGl2ZVBhdGgsIGFic29sdXRlUGF0aCB9ID0gYXdhaXQgdGhpcy5ub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGgpO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSByYW5kb21VVUlEKCk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgRWxlbWVudFRyYW5zYWN0aW9uU2NvcGUodGhpcy5nZXRFbGVtZW50TGFiZWwoKSwgY29ycmVsYXRpb25JZCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9FRElURUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnNhdmVgLFxuICAgICAgZGV0YWlsczogYFNhdmluZyAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9OiAke2VsZW1lbnQubWV0YWRhdGEubmFtZX0gdiR7ZWxlbWVudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICd1bmtub3duJ31gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgZWxlbWVudElkOiBlbGVtZW50LmlkLFxuICAgICAgICBlbGVtZW50VHlwZTogdGhpcy5nZXRFbGVtZW50TGFiZWwoKSxcbiAgICAgICAgYXV0aG9yOiBlbGVtZW50Lm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgdmVyc2lvbjogZWxlbWVudC5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdChcbiAgICAgICdlbGVtZW50OnNhdmU6c3RhcnQnLFxuICAgICAgdGhpcy5jcmVhdGVFdmVudFBheWxvYWQoeyBjb3JyZWxhdGlvbklkLCBmaWxlUGF0aDogcmVsYXRpdmVQYXRoLCBlbGVtZW50IH0pXG4gICAgKTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZENvbW1pdChhc3luYyAoKSA9PiB7XG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChlbGVtZW50LCByZWxhdGl2ZVBhdGgpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIubm90aWZ5U2F2ZWQocmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGgpO1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpzYXZlOnN1Y2Nlc3MnLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVsZW1lbnQgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0cmFuc2FjdGlvbi5hZGRSb2xsYmFjayhhc3luYyAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICAgJ2VsZW1lbnQ6c2F2ZTplcnJvcicsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCwgZWxlbWVudCwgZXJyb3IgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0cmFuc2FjdGlvbi5ydW4oYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuYmVmb3JlU2F2ZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmJlZm9yZVNhdmUoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkocGF0aC5kaXJuYW1lKGFic29sdXRlUGF0aCkpO1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVCYWNrdXBCZWZvcmVTYXZlKGFic29sdXRlUGF0aCk7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLnNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAgIC8vIEZpeCAjOTA4OiBWYWxpZGF0ZSBzZXJpYWxpemVkIGNvbnRlbnQgYmVmb3JlIHdyaXRpbmcgKHN5bW1ldHJpYyB3aXRoIHJlYWQgcGF0aCkuXG4gICAgICAvLyBSZWFkIHBhdGggdmFsaWRhdGVzIHZpYSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkg4oaSIENvbnRlbnRWYWxpZGF0b3I7IHdyaXRlIHBhdGhcbiAgICAgIC8vIG11c3QgYXBwbHkgdGhlIHNhbWUgY2hlY2tzIHRvIHByZXZlbnQgc2F2aW5nIGNvbnRlbnQgdGhhdCB3b3VsZCBmYWlsIHRvIGxvYWQuXG4gICAgICB0aGlzLnZhbGlkYXRlU2VyaWFsaXplZENvbnRlbnQoY29udGVudCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMud3JpdGVGaWxlKGFic29sdXRlUGF0aCwgY29udGVudCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcblxuICAgICAgaWYgKHRoaXMuYWZ0ZXJTYXZlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJTYXZlKGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9IHNhdmVkOiAke2VsZW1lbnQubWV0YWRhdGEubmFtZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBzZXJpYWxpemVkIGVsZW1lbnQgY29udGVudCBiZWZvcmUgd3JpdGluZyB0byBkaXNrLlxuICAgKiBGaXggIzkwODogTWlycm9ycyB0aGUgcmVhZC1wYXRoIHZhbGlkYXRpb24gZnJvbSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKClcbiAgICogdG8gZW5zdXJlIHdyaXRlIOKGkiByZWFkIHN5bW1ldHJ5LiBDb250ZW50IHRoYXQgZmFpbHMgdGhpcyBjaGVjayB3b3VsZCBhbHNvXG4gICAqIGZhaWwgdG8gbG9hZCwgc28gcmVqZWN0aW5nIGl0IG9uIHdyaXRlIHByZXZlbnRzIHBlcm1hbmVudGx5IGJyb2tlbiBlbGVtZW50cy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTZXJpYWxpemVkQ29udGVudChjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB2YWxpZGF0ZUdhdGVrZWVwZXJNZXRhZGF0YSA9IChyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLCBzb3VyY2VMYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBnZXRHYXRla2VlcGVyQXV0aG9yaW5nRXJyb3JzKHJlY29yZCk7XG4gICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5IGluIHNlcmlhbGl6ZWQgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSAke3NvdXJjZUxhYmVsfTogJHtbLi4ubmV3IFNldChlcnJvcnMpXS5qb2luKCc7ICcpfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXh0cmFjdCBmcm9udG1hdHRlciBpZiBwcmVzZW50IChTb25hckNsb3VkIFM2NTk0OiB1c2UgUmVnRXhwLmV4ZWMpXG4gICAgY29uc3QgZnJvbnRtYXR0ZXJSZWdleCA9IC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vO1xuICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBmcm9udG1hdHRlclJlZ2V4LmV4ZWMoY29udGVudCk7XG5cbiAgICBpZiAoZnJvbnRtYXR0ZXJNYXRjaCkge1xuICAgICAgY29uc3QgeWFtbENvbnRlbnQgPSBmcm9udG1hdHRlck1hdGNoWzFdO1xuICAgICAgY29uc3QgYm9keUNvbnRlbnQgPSBjb250ZW50LnN1YnN0cmluZyhmcm9udG1hdHRlck1hdGNoWzBdLmxlbmd0aCk7XG5cbiAgICAgIC8vIFlBTUwgYm9tYiBkZXRlY3Rpb24gKG1pcnJvcnMgU2VjdXJlWWFtbFBhcnNlci5wYXJzZSgpIHN0ZXAgNCkuXG4gICAgICAvLyBPbmx5IHJ1biB3aGVuIFlBTUwgaXMgdW5kZXIgTUFYX1lBTUxfTEVOR1RIICg2NEtCKSDigJQgdGhlIHNhbWUgbGltaXRcbiAgICAgIC8vIHVzZWQgYnkgdGhlIHJlYWQgcGF0aCBpbiBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkuIHZhbGlkYXRlWWFtbENvbnRlbnQoKVxuICAgICAgLy8gaW5jbHVkZXMgaXRzIG93biBzaXplIGNoZWNrIGludGVybmFsbHksIGFuZCB3ZSBpbnRlbnRpb25hbGx5IHNraXAgc2l6ZVxuICAgICAgLy8gZW5mb3JjZW1lbnQgb24gdGhlIHdyaXRlIHBhdGggYmVjYXVzZSB0aGUgc2VyaWFsaXplciBtYXkgcHJvZHVjZSBsYXJnZVxuICAgICAgLy8gZnJvbnRtYXR0ZXIgZm9yIGVsZW1lbnRzIHdpdGggbG9uZyBpbnN0cnVjdGlvbnMuIFRoZSByZWFkIHBhdGggd2lsbFxuICAgICAgLy8gcmVqZWN0IG92ZXJzaXplZCBZQU1MIG9uIHRoZSBuZXh0IGxvYWQgaWYgbmVlZGVkLlxuICAgICAgaWYgKHlhbWxDb250ZW50Lmxlbmd0aCA8PSBTRUNVUklUWV9MSU1JVFMuTUFYX1lBTUxfTEVOR1RIKSB7XG4gICAgICAgIGlmICghQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZVlhbWxDb250ZW50KHlhbWxDb250ZW50KSkge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdZQU1MX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LnZhbGlkYXRlU2VyaWFsaXplZENvbnRlbnRgLFxuICAgICAgICAgICAgZGV0YWlsczogYE1hbGljaW91cyBZQU1MIHBhdHRlcm4gZGV0ZWN0ZWQgaW4gc2VyaWFsaXplZCBvdXRwdXQgZm9yICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHsgeWFtbExlbmd0aDogeWFtbENvbnRlbnQubGVuZ3RoIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihcbiAgICAgICAgICAgIGBTZXJpYWxpemVkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gY29udGFpbnMgbWFsaWNpb3VzIFlBTUwgcGF0dGVybnMg4oCUIHdyaXRlIGJsb2NrZWQuIGAgK1xuICAgICAgICAgICAgYFJldmlldyB0aGUgZWxlbWVudCdzIG1ldGFkYXRhIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHN1c3BpY2lvdXMgYW5jaG9yL2FsaWFzIHBhdHRlcm5zLmAsXG4gICAgICAgICAgICAnY3JpdGljYWwnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmcm9udG1hdHRlckRhdGEgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlUmF3WWFtbCh5YW1sQ29udGVudCwgU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCk7XG4gICAgICB2YWxpZGF0ZUdhdGVrZWVwZXJNZXRhZGF0YShmcm9udG1hdHRlckRhdGEsICdmcm9udG1hdHRlcicpO1xuXG4gICAgICAvLyBCb2R5IGNvbnRlbnQgdmFsaWRhdGlvbiB3aXRoIGVsZW1lbnQgdHlwZSBjb250ZXh0XG4gICAgICBjb25zdCBjb250ZW50Q29udGV4dCA9IEJhc2VFbGVtZW50TWFuYWdlci5FTEVNRU5UX1RZUEVfVE9fQ09OVEVYVFt0aGlzLmVsZW1lbnRUeXBlXTtcbiAgICAgIGNvbnN0IGJvZHlWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGJvZHlDb250ZW50LCB7XG4gICAgICAgIGNvbnRlbnRDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICBpZiAoIWJvZHlWYWxpZGF0aW9uLmlzVmFsaWQgJiYgYm9keVZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoXG4gICAgICAgICAgYENyaXRpY2FsIHNlY3VyaXR5IHRocmVhdCBkZXRlY3RlZCBpbiBzZXJpYWxpemVkIGJvZHkgY29udGVudDogJHtib2R5VmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgJ2NyaXRpY2FsJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50VHlwZSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICAvLyBJc3N1ZSAjMjMyOTogbWVtb3JpZXMgYXJlIHdob2xlIHB1cmUtWUFNTCBkb2N1bWVudHMgY2FwcGVkIGF0IE1BWF9ZQU1MX1NJWkVcbiAgICAgIC8vICgyNTZLQikgb24gc2F2ZSBhbmQgbG9hZCDigJQgTUFYX1lBTUxfTEVOR1RIICg2NEtCKSBpcyBhIGZyb250bWF0dGVyIGxpbWl0XG4gICAgICAvLyBhbmQgcmVqZWN0ZWQgZXZlcnkgc2F2ZSBvZiBhIG1lbW9yeSB0aGF0IGdyZXcgcGFzdCBpdC5cbiAgICAgIGNvbnN0IHJhd1lhbWwgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlUmF3WWFtbChjb250ZW50LCBNRU1PUllfQ09OU1RBTlRTLk1BWF9ZQU1MX1NJWkUpO1xuICAgICAgdmFsaWRhdGVHYXRla2VlcGVyTWV0YWRhdGEocmF3WWFtbCwgJ1lBTUwgcm9vdCcpO1xuICAgICAgaWYgKHJhd1lhbWwubWV0YWRhdGEgJiYgdHlwZW9mIHJhd1lhbWwubWV0YWRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHJhd1lhbWwubWV0YWRhdGEpKSB7XG4gICAgICAgIHZhbGlkYXRlR2F0ZWtlZXBlck1ldGFkYXRhKHJhd1lhbWwubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sICdtZXRhZGF0YScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGFsbCBhdmFpbGFibGUgZWxlbWVudHNcbiAgICogU0VDVVJJVFk6IFVzZXMgUG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHMoKSB3aGljaCBmaWx0ZXJzIHRlc3QgZWxlbWVudHNcbiAgICovXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxUW10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuZWxlbWVudERpcik7XG5cbiAgICAgIC8vIFNjYW4gZm9yIGNoYW5nZXMg4oCUIHBvcHVsYXRlcyBpbmRleCBmb3IgbGlzdFN1bW1hcmllcygpL2ZpbmRCeU5hbWUoKVxuICAgICAgLy8gTm9uLWZhdGFsOiBzY2FuIGZhaWx1cmUgbXVzdCBuZXZlciBwcmV2ZW50IGxpc3QoKSBmcm9tIHJldHVybmluZyByZXN1bHRzXG4gICAgICAvLyBFdmljdCBzdGFsZSBjYWNoZSBlbnRyaWVzIHNvIHRoZSBjYWNoZSBjaGVjayBiZWxvdyBuZXZlciByZXR1cm5zIG91dGRhdGVkIGRhdGFcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBhd2FpdCB0aGlzLnN0b3JhZ2VMYXllci5zY2FuKCk7XG4gICAgICAgIGZvciAoY29uc3QgcmVsUGF0aCBvZiBbLi4uZGlmZi5tb2RpZmllZCwgLi4uZGlmZi5yZW1vdmVkXSkge1xuICAgICAgICAgIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCByZWxQYXRoKTtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0lkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic1BhdGgpO1xuICAgICAgICAgIGlmIChleGlzdGluZ0lkKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZVBhdGhUb0lkLmRlbGV0ZShhYnNQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggeyAvKiBpbmRleCB1bmF2YWlsYWJsZSwgbGlzdCgpIGNvbnRpbnVlcyB3aXRob3V0IGNhY2hlIG9wdGltaXphdGlvbiAqLyB9XG5cbiAgICAgIC8vIFVzZSBQb3J0Zm9saW9NYW5hZ2VyIGZvciBhdXRob3JpdGF0aXZlIGZpbGUgbGlzdCArIHNlY3VyaXR5IGZpbHRlcmluZ1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzKHRoaXMuZWxlbWVudFR5cGUpO1xuXG4gICAgICAvLyBMb2FkIGFsbCBlbGVtZW50cyBpbiBwYXJhbGxlbCwgY2hlY2tpbmcgY2FjaGUgYmVmb3JlIGRpc2tcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZpbGVzLm1hcChhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBDaGVjayBjYWNoZSBmaXJzdCAoYXZvaWRzIGRpc2sgcmVhZCBpZiBlbGVtZW50IGlzIGFscmVhZHkgbG9hZGVkKVxuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGUpO1xuICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5nZXRDYWNoZWRFbGVtZW50QnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgICAgICAgICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG4gICAgICAgICAgICAvLyBDYWNoZSBtaXNzIOKAlCByZWFkIGZyb20gZGlzayAocG9wdWxhdGVzIGNhY2hlIGZvciBuZXh0IHRpbWUpXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkKGZpbGUpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gbG9hZCgpIGhhbmRsZXMgZXJyb3IgbG9nZ2luZyB3aXRoIGRlZHVwbGljYXRpb25cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIC8vIEZpbHRlciBvdXQgZmFpbGVkIGxvYWRzIGFuZCByZXR1cm5cbiAgICAgIHJldHVybiBlbGVtZW50cy5maWx0ZXIoKGUpOiBlIGlzIEF3YWl0ZWQ8VD4gPT4gZSAhPT0gbnVsbCkgYXMgVFtdO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgJHtsYWJlbH1zIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCB5ZXQsIHJldHVybmluZyBlbXB0eSBhcnJheWApO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsaXN0ICR7dGhpcy5lbGVtZW50VHlwZX1zOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBsaWdodHdlaWdodCBtZXRhZGF0YSBzdW1tYXJpZXMgd2l0aG91dCBsb2FkaW5nIGZ1bGwgZWxlbWVudHMuXG4gICAqIFVzZWZ1bCB3aGVuIG9ubHkgbmFtZXMvZGVzY3JpcHRpb25zL3RhZ3MgYXJlIG5lZWRlZC5cbiAgICovXG4gIGFzeW5jIGxpc3RTdW1tYXJpZXMoKTogUHJvbWlzZTxFbGVtZW50SW5kZXhFbnRyeVtdPiB7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkodGhpcy5lbGVtZW50RGlyKTtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlTGF5ZXIubGlzdFN1bW1hcmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmQocHJlZGljYXRlOiAoZWxlbWVudDogVCkgPT4gYm9vbGVhbik6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIGVsZW1lbnRzLmZpbmQocHJlZGljYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIG11bHRpcGxlIGVsZW1lbnRzIGJ5IHByZWRpY2F0ZVxuICAgKi9cbiAgYXN5bmMgZmluZE1hbnkocHJlZGljYXRlOiAoZWxlbWVudDogVCkgPT4gYm9vbGVhbik6IFByb21pc2U8VFtdPiB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gZWxlbWVudHMuZmlsdGVyKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbiBlbGVtZW50IGJ5IG5hbWUgb3IgSUQgd2l0aG91dCBsb2FkaW5nIGFsbCBlbGVtZW50c1xuICAgKlxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBmb3IgYWN0aXZhdGlvbiBmbG93XG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFuIG9wdGltaXplZCBsb29rdXAgdGhhdCB0cmllcyBjYWNoZSBmaXJzdCwgdGhlblxuICAgKiBhdHRlbXB0cyBkaXJlY3QgZmlsZSBhY2Nlc3MgYmVmb3JlIGZhbGxpbmcgYmFjayB0byBmdWxsIGxpc3QoKSBzY2FuLlxuICAgKiBUaGlzIGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gbGlzdCgpIGZvciBsYXJnZSBwb3J0Zm9saW9zLlxuICAgKlxuICAgKiBQRVJGT1JNQU5DRSBJTVBST1ZFTUVOVFM6XG4gICAqIDEuIENhY2hlIGxvb2t1cCAtIE8oMSkgaWYgZWxlbWVudCB3YXMgcHJldmlvdXNseSBsb2FkZWRcbiAgICogMi4gRGlyZWN0IGZpbGUgYWNjZXNzIC0gTygxKSBmb3IgbmFtZS1iYXNlZCBsb29rdXBzXG4gICAqIDMuIEZ1bGwgc2NhbiBmYWxsYmFjayAtIE8obikgb25seSBpZiBhYm92ZSBtZXRob2RzIGZhaWxcbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBFbGVtZW50IG5hbWUgb3IgSUQgdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyBFbGVtZW50IGlmIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICAqL1xuICBhc3luYyBmaW5kQnlOYW1lKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIEZpcnN0LCB0cnkgZmluZGluZyBpbiBjYWNoZSBieSBpdGVyYXRpbmcgY2FjaGVkIGVsZW1lbnRzXG4gICAgLy8gVGhpcyBpcyBmYXN0IChPKGNhY2hlIHNpemUpKSBhbmQgd29ya3MgZm9yIHJlY2VudGx5IGFjY2Vzc2VkIGVsZW1lbnRzXG4gICAgY29uc3QgY2FjaGVkRWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZEluQ2FjaGUoaWRlbnRpZmllcik7XG4gICAgaWYgKGNhY2hlZEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRFbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFNlY29uZCwgdHJ5IHN0b3JhZ2UgbGF5ZXIgaW5kZXggKE8oMSkgbmFtZSBsb29rdXApXG4gICAgY29uc3QgaW5kZXhlZFBhdGggPSB0aGlzLnN0b3JhZ2VMYXllci5nZXRQYXRoQnlOYW1lKGlkZW50aWZpZXIpO1xuICAgIGlmIChpbmRleGVkUGF0aCkge1xuICAgICAgdHJ5IHsgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChpbmRleGVkUGF0aCk7IH0gY2F0Y2ggeyAvKiBmYWxsIHRocm91Z2ggKi8gfVxuICAgIH1cblxuICAgIC8vIFRoaXJkLCB0cnkgZGlyZWN0IGZpbGUgYWNjZXNzIHVzaW5nIHN0YW5kYXJkIG5hbWluZyBjb252ZW50aW9uXG4gICAgLy8gRWxlbWVudCBmaWxlcyBhcmUgdHlwaWNhbGx5IG5hbWVkOiBsb3dlcmNhc2UtbmFtZS13aXRoLWh5cGhlbnMue2V4dH1cbiAgICAvLyBUaGlzIGlzIE8oMSkgZmlsZSBzeXN0ZW0gbG9va3VwXG4gICAgY29uc3QgZGlyZWN0TG9hZEF0dGVtcHQgPSBhd2FpdCB0aGlzLnRyeURpcmVjdExvYWQoaWRlbnRpZmllcik7XG4gICAgaWYgKGRpcmVjdExvYWRBdHRlbXB0KSB7XG4gICAgICByZXR1cm4gZGlyZWN0TG9hZEF0dGVtcHQ7XG4gICAgfVxuXG4gICAgLy8gSWYgc3RvcmFnZSBsYXllciBoYXMgY29tcGxldGVkIGF0IGxlYXN0IG9uZSBzY2FuLCB0aGUgaW5kZXggaXNcbiAgICAvLyBhdXRob3JpdGF0aXZlIOKAlCBhIG1pc3MgbWVhbnMgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuIFNraXAgdGhlXG4gICAgLy8gZXhwZW5zaXZlIGxpc3QoKSBmYWxsYmFjayB0byBhdm9pZCBPKG4pIHJlc2NhbnMgb24gZXZlcnkgY2FjaGUgbWlzcy5cbiAgICBpZiAodGhpcy5zdG9yYWdlTGF5ZXIuaGFzQ29tcGxldGVkU2NhbigpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBGdWxsIGxpc3QoKSBzY2FuIChPKG4pIC0gbG9hZHMgYWxsIGVsZW1lbnRzKVxuICAgIC8vIE9ubHkgdXNlZCBvbiBmaXJzdCBhY2Nlc3MgYmVmb3JlIGFueSBzY2FuIGhhcyBjb21wbGV0ZWQuXG4gICAgLy8gVGhpcyBlbnN1cmVzIHdlIGZpbmQgZWxlbWVudHMgZXZlbiB3aXRoIG5vbi1zdGFuZGFyZCBmaWxlIG5hbWluZy5cbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVGaWxlbmFtZShpZGVudGlmaWVyKTtcbiAgICByZXR1cm4gZWxlbWVudHMuZmluZChlID0+XG4gICAgICB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGUubWV0YWRhdGEubmFtZSkgPT09IG5vcm1hbGl6ZWRJZGVudGlmaWVyIHx8XG4gICAgICBlLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gaWRlbnRpZmllci50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBlLmlkID09PSBpZGVudGlmaWVyXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXI6IFNlYXJjaCBjYWNoZSBmb3IgZWxlbWVudCBieSBuYW1lIG9yIElEXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmRJbkNhY2hlKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIExSVUNhY2hlIGRvZXNuJ3QgcHJvdmlkZSBpdGVyYXRpb24sIGJ1dCB3ZSBjYW4gY2hlY2sgaWYgd2UgaGF2ZVxuICAgIC8vIGEgY2FjaGVkIHBhdGggZm9yIHRoaXMgaWRlbnRpZmllciBieSB0cnlpbmcgY29tbW9uIG5hbWluZyBwYXR0ZXJucy5cbiAgICAvLyBJTVBPUlRBTlQ6IGZpbGVQYXRoVG9JZCBzdG9yZXMgYWJzb2x1dGUgcGF0aHMgKHNldCBieSBjYWNoZUVsZW1lbnQgdmlhXG4gICAgLy8gcmVzb2x2ZUFic29sdXRlUGF0aCksIHNvIHdlIG11c3QgcmVzb2x2ZSB0byBhYnNvbHV0ZSBiZWZvcmUgbG9va3VwLlxuICAgIGNvbnN0IHBvc3NpYmxlRmlsZW5hbWVzID0gW1xuICAgICAgaWRlbnRpZmllcixcbiAgICAgIGAke2lkZW50aWZpZXJ9JHt0aGlzLmdldEZpbGVFeHRlbnNpb24oKX1gLFxuICAgICAgLy8gVXNlIHVuaWZpZWQgbm9ybWFsaXplRmlsZW5hbWUgZm9yIGNvbnNpc3RlbnQgY2FjaGUgbG9va3Vwc1xuICAgICAgdGhpcy5nZXRFbGVtZW50RmlsZW5hbWUoaWRlbnRpZmllcilcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBwb3NzaWJsZUZpbGVuYW1lcykge1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGNhY2hlZElkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KGFic29sdXRlUGF0aCk7XG4gICAgICBpZiAoY2FjaGVkSWQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudHMuZ2V0KGNhY2hlZElkKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyOiBUcnkgbG9hZGluZyBlbGVtZW50IGRpcmVjdGx5IGJ5IGNvbnN0cnVjdGluZyBleHBlY3RlZCBmaWxlbmFtZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB0cnlEaXJlY3RMb2FkKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIFRyeSBsb2FkaW5nIHVzaW5nIGNvbW1vbiBuYW1pbmcgcGF0dGVybnNcbiAgICAvLyBVc2UgdW5pZmllZCBub3JtYWxpemVGaWxlbmFtZSBmb3IgY29uc2lzdGVudCBmaWxlbmFtZSBjb25zdHJ1Y3Rpb25cbiAgICBjb25zdCBwb3NzaWJsZVBhdGhzID0gW1xuICAgICAgLy8gUHJpbWFyeTogVXNlIHVuaWZpZWQgbm9ybWFsaXphdGlvbiAoaGFuZGxlcyBDYW1lbENhc2UsIHNwYWNlcywgdW5kZXJzY29yZXMsIGV0Yy4pXG4gICAgICB0aGlzLmdldEVsZW1lbnRGaWxlbmFtZShpZGVudGlmaWVyKSxcbiAgICAgIC8vIEZhbGxiYWNrOiBJZGVudGlmaWVyIGFzLWlzIHdpdGggZXh0ZW5zaW9uXG4gICAgICBgJHtpZGVudGlmaWVyfSR7dGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCl9YCxcbiAgICAgIC8vIEZhbGxiYWNrOiBJZGVudGlmaWVyIGFscmVhZHkgaW5jbHVkZXMgZXh0ZW5zaW9uXG4gICAgICBpZGVudGlmaWVyXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZmlsZVBhdGggb2YgcG9zc2libGVQYXRocykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMubG9hZChmaWxlUGF0aCk7XG4gICAgICAgIC8vIFZlcmlmeSB0aGUgbG9hZGVkIGVsZW1lbnQgbWF0Y2hlcyB0aGUgaWRlbnRpZmllclxuICAgICAgICAvLyBOb3JtYWxpemUgYm90aCBzaWRlcyBzbyBcIkNvZGUgUmV2aWV3XCIgKHNwYWNlcykgbWF0Y2hlcyBcImNvZGUtcmV2aWV3XCIgKGh5cGhlbnMpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRNZXRhTmFtZSA9IHRoaXMubm9ybWFsaXplRmlsZW5hbWUoZWxlbWVudC5tZXRhZGF0YS5uYW1lKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUZpbGVuYW1lKGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAobm9ybWFsaXplZE1ldGFOYW1lID09PSBub3JtYWxpemVkSWRlbnRpZmllciB8fFxuICAgICAgICAgICAgZWxlbWVudC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IGlkZW50aWZpZXIudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgICAgICAgZWxlbWVudC5pZCA9PT0gaWRlbnRpZmllcikge1xuICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0IG9yIGZhaWxlZCB0byBsb2FkIC0gdHJ5IG5leHQgcGF0aFxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuIGVsZW1lbnRcbiAgICogRGVsZWdhdGVzIHRvIGVsZW1lbnQncyBvd24gdmFsaWRhdGUgbWV0aG9kXG4gICAqXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggYm90aCAndmFsaWQnIGFuZCAnaXNWYWxpZCcgcHJvcGVydGllcy5cbiAgICogICAgICAgICAgJ2lzVmFsaWQnIGlzIGRlcHJlY2F0ZWQgLSB1c2UgJ3ZhbGlkJyBmb3IgbmV3IGNvZGUuXG4gICAqL1xuICB2YWxpZGF0ZShlbGVtZW50OiBUKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIGNvbnN0IHJlc3VsdCA9IGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBlbGVtZW50XG4gICAqIFNFQ1VSSVRZOiBQYXRoIHZhbGlkYXRpb24gdG8gcHJldmVudCBkZWxldGlvbiBvdXRzaWRlIGRpcmVjdG9yeVxuICAgKiBDQUNIRSBGSVg6IFVzZXMgZmlsZXBhdGgtYmFzZWQgY2FjaGUgcmVtb3ZhbCB0byBwcmV2ZW50IHN0YWxlIGVudHJpZXNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0VMRU1FTlRfREVMRVRFRCcsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6IGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0uZGVsZXRlYCxcbiAgICAgIGRldGFpbHM6IGBBdHRlbXB0aW5nIHRvIGRlbGV0ZSAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9OiAke2ZpbGVQYXRofWBcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVsYXRpdmVQYXRoLCBhYnNvbHV0ZVBhdGggfSA9IGF3YWl0IHRoaXMubm9ybWFsaXplQW5kVmFsaWRhdGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IEVsZW1lbnRUcmFuc2FjdGlvblNjb3BlKHRoaXMuZ2V0RWxlbWVudExhYmVsKCksIGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdChcbiAgICAgICdlbGVtZW50OmRlbGV0ZTpzdGFydCcsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICApO1xuXG4gICAgdHJhbnNhY3Rpb24uYWRkQ29tbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIHRoaXMudW5jYWNoZUJ5UGF0aChyZWxhdGl2ZVBhdGgpO1xuICAgICAgdGhpcy5zdG9yYWdlTGF5ZXIubm90aWZ5RGVsZXRlZChyZWxhdGl2ZVBhdGgpO1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpkZWxldGU6c3VjY2VzcycsXG4gICAgICAgIHRoaXMuY3JlYXRlRXZlbnRQYXlsb2FkKHsgY29ycmVsYXRpb25JZCwgZmlsZVBhdGg6IHJlbGF0aXZlUGF0aCB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHRyYW5zYWN0aW9uLmFkZFJvbGxiYWNrKGFzeW5jIChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZW1pdEFzeW5jKFxuICAgICAgICAnZWxlbWVudDpkZWxldGU6ZXJyb3InLFxuICAgICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsIGVycm9yIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdHJhbnNhY3Rpb24ucnVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNhbkRlbGV0ZSkge1xuICAgICAgICBjb25zdCBlbGVtZW50Rm9yVmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMubG9hZEVsZW1lbnRTbmFwc2hvdChhYnNvbHV0ZVBhdGgsIHJlbGF0aXZlUGF0aCk7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gYXdhaXQgdGhpcy5jYW5EZWxldGUoZWxlbWVudEZvclZhbGlkYXRpb24pO1xuICAgICAgICBpZiAoIWRlY2lzaW9uLmFsbG93ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGVjaXNpb24ucmVhc29uID8/IGBEZWxldGlvbiBub3QgcGVybWl0dGVkIGZvciAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbW92ZWRUb0JhY2t1cCA9IGF3YWl0IHRoaXMuY3JlYXRlQmFja3VwQmVmb3JlRGVsZXRlKGFic29sdXRlUGF0aCk7XG4gICAgICBpZiAoIW1vdmVkVG9CYWNrdXApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgICAgIHNvdXJjZTogYCR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfS5kZWxldGVgXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbG9nZ2VyLmluZm8oYCR7dGhpcy5nZXRFbGVtZW50TGFiZWxDYXBpdGFsaXplZCgpfSBkZWxldGVkOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFuIGVsZW1lbnQgZXhpc3RzXG4gICAqL1xuICBhc3luYyBleGlzdHMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFic29sdXRlUGF0aCB9ID0gYXdhaXQgdGhpcy5ub3JtYWxpemVBbmRWYWxpZGF0ZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGFic29sdXRlUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgZmlsZSBwYXRoXG4gICAqL1xuICB2YWxpZGF0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuXG4gICAgICBpZiAoIXNhbml0aXplZCB8fCBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChzYW5pdGl6ZWQuaW5jbHVkZXMoJy4uJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoc2FuaXRpemVkKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgYWxsb3dlZEV4dGVuc2lvbnMgPSBbJy5tZCcsICcubWFya2Rvd24nLCAnLnR4dCcsICcueW1sJywgJy55YW1sJ107XG5cbiAgICAgIHJldHVybiBleHQgPT09ICcnIHx8IGFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGV4dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCB0eXBlXG4gICAqL1xuICBnZXRFbGVtZW50VHlwZSgpOiBFbGVtZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBmaWxlIHBhdGggdG8gaXRzIGFic29sdXRlIGZvcm0gZm9yIGNhY2hlIGNvbnNpc3RlbmN5XG4gICAqIEVuc3VyZXMgY29uc2lzdGVudCBwYXRoIGhhbmRsaW5nIGFjcm9zcyByZWxhdGl2ZS9hYnNvbHV0ZSBwYXRoc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguaXNBYnNvbHV0ZShmaWxlUGF0aClcbiAgICAgID8gcGF0aC5ub3JtYWxpemUoZmlsZVBhdGgpXG4gICAgICA6IHBhdGgubm9ybWFsaXplKHBhdGguam9pbih0aGlzLmVsZW1lbnREaXIsIGZpbGVQYXRoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG5vcm1hbGl6ZUFuZFZhbGlkYXRlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7IHJlbGF0aXZlUGF0aDogc3RyaW5nOyBhYnNvbHV0ZVBhdGg6IHN0cmluZyB9PiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG5cbiAgICBpZiAoIXNhbml0aXplZFBhdGggfHwgc2FuaXRpemVkUGF0aC50cmltKCkubGVuZ3RoID09PSAwIHx8IHNhbml0aXplZFBhdGggPT09ICcuJyB8fCBzYW5pdGl6ZWRQYXRoID09PSBwYXRoLnNlcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gcGF0aDogZW1wdHkgcGF0aCBpcyBub3QgYWxsb3dlZGApO1xuICAgIH1cblxuICAgIGlmIChwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQWJzb2x1dGUgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBwYXRocyBhcmUgbm90IGFsbG93ZWRgKTtcbiAgICB9XG5cbiAgICAvLyBOb3JtYWxpemUgdGhlIHBhdGggKHJlbW92ZSByZWR1bmRhbnQgc2VwYXJhdG9ycywgcmVzb2x2ZSAuIGFuZCAuLilcbiAgICBjb25zdCBub3JtYWxpemVkUmVsYXRpdmUgPSBwYXRoLm5vcm1hbGl6ZShzYW5pdGl6ZWRQYXRoKTtcblxuICAgIC8vIEJ1aWxkIGFic29sdXRlIHBhdGhcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBwYXRoLmpvaW4odGhpcy5lbGVtZW50RGlyLCBub3JtYWxpemVkUmVsYXRpdmUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIFdJVEhPVVQgcmVzb2x2aW5nIHN5bWxpbmtzIC0ganVzdCBjaGVjayBzZWN1cml0eSBjb25zdHJhaW50c1xuICAgICAgYXdhaXQgUGF0aFZhbGlkYXRvci52YWxpZGF0ZUVsZW1lbnRQYXRoT25seShhYnNvbHV0ZVBhdGgsIHRoaXMuZWxlbWVudERpcik7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgaW5wdXQgYXMgcmVsYXRpdmVQYXRoIChpdCdzIGFscmVhZHkgcmVsYXRpdmUpIGFuZCBjb21wdXRlZCBhYnNvbHV0ZVBhdGhcbiAgICAgIHJldHVybiB7IHJlbGF0aXZlUGF0aDogbm9ybWFsaXplZFJlbGF0aXZlLCBhYnNvbHV0ZVBhdGggfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgcmVhc29uID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnSW52YWxpZCBwYXRoJztcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCAke3RoaXMuZ2V0RWxlbWVudExhYmVsKCl9IHBhdGg6ICR7cmVhc29ufWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZWxlbWVudElkID0gdGhpcy5maWxlUGF0aFRvSWQuZ2V0KHRoaXMucmVzb2x2ZUFic29sdXRlUGF0aChhYnNvbHV0ZVBhdGgpKTtcbiAgICBpZiAoIWVsZW1lbnRJZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudHMuZ2V0KGVsZW1lbnRJZCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdGVjdGVkIGNhY2hlIGxvb2t1cCBieSBhYnNvbHV0ZSBwYXRoLlxuICAgKiBBbGxvd3Mgc3ViY2xhc3NlcyB3aXRoIGN1c3RvbSBsb2FkKCkgb3ZlcnJpZGVzIChlLmcuIE1lbW9yeU1hbmFnZXIpXG4gICAqIHRvIGNoZWNrIHRoZSBMUlUgY2FjaGUgYmVmb3JlIHJlLXJlYWRpbmcgZnJvbSBkaXNrLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldENhY2hlZEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2FjaGVkRWxlbWVudEJ5QWJzb2x1dGVQYXRoKGFic29sdXRlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRFbGVtZW50U25hcHNob3QoYWJzb2x1dGVQYXRoOiBzdHJpbmcsIHJlbGF0aXZlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5nZXRDYWNoZWRFbGVtZW50QnlBYnNvbHV0ZVBhdGgoYWJzb2x1dGVQYXRoKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEVsZW1lbnRGaWxlKGFic29sdXRlUGF0aCwgdGhpcy5lbGVtZW50VHlwZSwge1xuICAgICAgc291cmNlOiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9LmxvYWRFbGVtZW50U25hcHNob3RgXG4gICAgfSk7XG4gICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKHJhdywgdW5kZWZpbmVkLCB7XG4gICAgICBjb250ZW50Q29udGV4dDogQmFzZUVsZW1lbnRNYW5hZ2VyLkVMRU1FTlRfVFlQRV9UT19DT05URVhUW3RoaXMuZWxlbWVudFR5cGVdLFxuICAgIH0pO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5wYXJzZU1ldGFkYXRhKHBhcnNlZC5kYXRhKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG4gICAgdGhpcy5jYWNoZUVsZW1lbnQoZWxlbWVudCwgcmVsYXRpdmVQYXRoKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgc3RhbmRhcmRpemVkIGV2ZW50IHBheWxvYWQgZm9yIGVsZW1lbnQgbGlmZWN5Y2xlIGV2ZW50cy5cbiAgICpcbiAgICogVGhpcyBoZWxwZXIgaXMgYXZhaWxhYmxlIHRvIHN1YmNsYXNzZXMgdG8gZW5zdXJlIGNvbnNpc3RlbnQgZXZlbnQgcGF5bG9hZFxuICAgKiBzdHJ1Y3R1cmUgd2hlbiBlbWl0dGluZyBjdXN0b20gZXZlbnRzIHZpYSB0aGUgZGlzcGF0Y2hlciBnZXR0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBFdmVudCBwYXJhbWV0ZXJzIGluY2x1ZGluZyBjb3JyZWxhdGlvbiBJRCwgZWxlbWVudCwgZmlsZSBwYXRoLCBhbmQgb3B0aW9uYWwgZXJyb3JcbiAgICogQHJldHVybnMgRnVsbHktZm9ybWVkIEVsZW1lbnRFdmVudFBheWxvYWQgcmVhZHkgZm9yIGVtaXNzaW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRXZlbnRQYXlsb2FkKHBhcmFtczoge1xuICAgIGNvcnJlbGF0aW9uSWQ6IHN0cmluZztcbiAgICBmaWxlUGF0aD86IHN0cmluZztcbiAgICBlbGVtZW50PzogVDtcbiAgICBlcnJvcj86IHVua25vd247XG4gIH0pOiBFbGVtZW50RXZlbnRQYXlsb2FkIHtcbiAgICBjb25zdCBlbGVtZW50SWQgPSBwYXJhbXMuZWxlbWVudD8uaWQ7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IGVsZW1lbnRJZCAhPT0gdW5kZWZpbmVkID8gdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZ2V0KGVsZW1lbnRJZCkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvcnJlbGF0aW9uSWQ6IHBhcmFtcy5jb3JyZWxhdGlvbklkLFxuICAgICAgZWxlbWVudFR5cGU6IHRoaXMuZWxlbWVudFR5cGUsXG4gICAgICBlbGVtZW50SWQsXG4gICAgICBmaWxlUGF0aDogcGFyYW1zLmZpbGVQYXRoLFxuICAgICAgbWV0YWRhdGE6IEVsZW1lbnRFdmVudERpc3BhdGNoZXIuc25hcHNob3RNZXRhZGF0YShwYXJhbXMuZWxlbWVudCksXG4gICAgICBnZW5lcmF0aW9uLFxuICAgICAgZXJyb3I6IHBhcmFtcy5lcnJvclxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUV4dGVybmFsQ2hhbmdlKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51bmNhY2hlQnlQYXRoKHJlbGF0aXZlUGF0aCk7XG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIuaW52YWxpZGF0ZSgpO1xuICAgIC8vIENsZWFyIGVycm9yIHN1cHByZXNzaW9uIHNvIGEgY2hhbmdlZCBmaWxlIGdldHMgZnJlc2ggbG9nZ2luZ1xuICAgIHRoaXMuaW52YWxpZEVsZW1lbnRzLmRlbGV0ZShyZWxhdGl2ZVBhdGgpO1xuICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5kZWxldGUocmVsYXRpdmVQYXRoKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gcmFuZG9tVVVJRCgpO1xuICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmVtaXRBc3luYyhcbiAgICAgICdlbGVtZW50OmV4dGVybmFsLWNoYW5nZScsXG4gICAgICB0aGlzLmNyZWF0ZUV2ZW50UGF5bG9hZCh7IGNvcnJlbGF0aW9uSWQsIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGggfSlcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuYXV0b1JlbG9hZE9uRXh0ZXJuYWxDaGFuZ2UpIHtcbiAgICAgIHZvaWQgdGhpcy5sb2FkKHJlbGF0aXZlUGF0aCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdBdXRvIHJlbG9hZCBhZnRlciBleHRlcm5hbCBjaGFuZ2UgZmFpbGVkJywge1xuICAgICAgICAgIGVsZW1lbnRUeXBlOiB0aGlzLmVsZW1lbnRUeXBlLFxuICAgICAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGgsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3JcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVsZW1lbnQgdG8gYm90aCBjYWNoZXMgKGJpZGlyZWN0aW9uYWwgbWFwcGluZylcbiAgICogQHBhcmFtIGVsZW1lbnQgLSBFbGVtZW50IHRvIGNhY2hlXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIEZpbGUgcGF0aCAocmVsYXRpdmUgb3IgYWJzb2x1dGUpXG4gICAqL1xuICBwcm90ZWN0ZWQgY2FjaGVFbGVtZW50KGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSB0aGlzLnJlc29sdmVBYnNvbHV0ZVBhdGgoZmlsZVBhdGgpO1xuXG4gICAgLy8gQ2xlYXIgYW55IHN0YWxlIGNhY2hlIGVudHJpZXMgZm9yIHRoaXMgZmlsZXBhdGggYmVmb3JlIGFkZGluZyB0aGUgbmV3IG9uZS5cbiAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGdlbmVyYXRlSWQoKSBpbiBCYXNlRWxlbWVudC50cyBpbmNsdWRlcyBhIERhdGUubm93KClcbiAgICAvLyB0aW1lc3RhbXAsIGNhdXNpbmcgZWFjaCBsb2FkIGZyb20gZGlzayB0byBnZW5lcmF0ZSBhIGRpZmZlcmVudCBJRC4gV2l0aG91dCB0aGlzXG4gICAgLy8gY2xlYW51cCwgb2xkIElEcyByZW1haW4gaW4gdGhlIGNhY2hlIGFzIHN0YWxlIGRhdGEsIGxlYWRpbmcgdG8gaW5jb25zaXN0ZW50XG4gICAgLy8gcmVzdWx0cyBpbiBtZXRob2RzIGxpa2UgZmluZFBlcnNvbmEoKSBvciBsaXN0KCkuXG4gICAgY29uc3QgZXhpc3RpbmdJZCA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldChhYnNvbHV0ZVBhdGgpO1xuICAgIGlmIChleGlzdGluZ0lkICYmIGV4aXN0aW5nSWQgIT09IGVsZW1lbnQuaWQpIHtcbiAgICAgIC8vIENsZWFyIHN0YWxlIGNhY2hlIGVudHJ5IHdoZW4gZWxlbWVudCBJRCBoYXMgY2hhbmdlZFxuICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICB0aGlzLmVsZW1lbnRHZW5lcmF0aW9ucy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgfVxuXG4gICAgdGhpcy5lbGVtZW50cy5zZXQoZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgdGhpcy5maWxlUGF0aFRvSWQuc2V0KGFic29sdXRlUGF0aCwgZWxlbWVudC5pZCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9ICsrdGhpcy5jYWNoZUdlbmVyYXRpb25Db3VudGVyO1xuICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLnNldChlbGVtZW50LmlkLCBnZW5lcmF0aW9uKTtcblxuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShmaWxlUGF0aClcbiAgICAgID8gcGF0aC5yZWxhdGl2ZSh0aGlzLmVsZW1lbnREaXIsIGZpbGVQYXRoKVxuICAgICAgOiBmaWxlUGF0aDtcblxuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ2ZpbGVuYW1lJywge1xuICAgICAgICB2YWx1ZTogcGF0aC5iYXNlbmFtZShyZWxhdGl2ZVBhdGgpLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdmaWxlUGF0aCcsIHtcbiAgICAgICAgdmFsdWU6IHJlbGF0aXZlUGF0aCxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRmFpbGVkIHRvIGF0dGFjaCBmaWxlbmFtZSBtZXRhZGF0YSB0byBlbGVtZW50Jywge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICBlbGVtZW50SWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgIGZpbGVQYXRoOiByZWxhdGl2ZVBhdGhcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSBhIGZyZXNoIGRpc2sgc2NhbiBhbmQgZXZpY3QgYW55IG1vZGlmaWVkL3JlbW92ZWQgZW50cmllcyBmcm9tIHRoZVxuICAgKiBpbi1tZW1vcnkgTFJVIGNhY2hlLiBDYWxsIGJlZm9yZSBmaW5kQnlOYW1lKCkgd2hlbiBmcmVzaG5lc3MgaXMgY3JpdGljYWxcbiAgICogKGUuZy4gb24gZW5zZW1ibGUgYWN0aXZhdGlvbikgdG8gcGljayB1cCBleHRlcm5hbCBmaWxlIGNoYW5nZXMgdGhhdFxuICAgKiBvY2N1cnJlZCBzaW5jZSB0aGUgbGFzdCBzY2FuLCBldmVuIGlmIHRoZSBzY2FuIGNvb2xkb3duIGlzIHN0aWxsIGFjdGl2ZS5cbiAgICpcbiAgICogVW5saWtlIGxpc3QoKSwgdGhpcyBkb2VzIG5vdCBsb2FkIGFsbCBlbGVtZW50cyDigJQgaXQgb25seSBldmljdHMgc3RhbGUgb25lcy5cbiAgICogRml4ZXMgIzE4OTUgKGVuc2VtYmxlIGFjdGl2YXRpb24gc2VydmluZyBzdGFsZSBjYWNoZWQgZWxlbWVudCBsaXN0KS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBzY2FuQW5kRXZpY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIuaW52YWxpZGF0ZSgpOyAvLyBieXBhc3MgY29vbGRvd24gc28gdGhlIG5leHQgc2NhbiBoaXRzIGRpc2tcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlmZiA9IGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLnNjYW4oKTtcbiAgICAgIGZvciAoY29uc3QgcmVsUGF0aCBvZiBbLi4uZGlmZi5tb2RpZmllZCwgLi4uZGlmZi5yZW1vdmVkXSkge1xuICAgICAgICBjb25zdCBhYnNQYXRoID0gcGF0aC5qb2luKHRoaXMuZWxlbWVudERpciwgcmVsUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzUGF0aCk7XG4gICAgICAgIGlmIChleGlzdGluZ0lkKSB7XG4gICAgICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZXhpc3RpbmdJZCk7XG4gICAgICAgICAgdGhpcy5maWxlUGF0aFRvSWQuZGVsZXRlKGFic1BhdGgpO1xuICAgICAgICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmRlbGV0ZShleGlzdGluZ0lkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggeyAvKiBub24tZmF0YWwg4oCUIGNhY2hlIG1heSBiZSBzbGlnaHRseSBzdGFsZSwgYnV0IGFjdGl2YXRpb24gcHJvY2VlZHMgKi8gfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIGJvdGggY2FjaGVzIGJ5IGZpbGUgcGF0aFxuICAgKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBkZWxldGlvbiB0byBhdm9pZCBzdGFsZSBjYWNoZSBlbnRyaWVzXG4gICAqIEBwYXJhbSBmaWxlUGF0aCAtIEZpbGUgcGF0aCAocmVsYXRpdmUgb3IgYWJzb2x1dGUpXG4gICAqL1xuICBwcm90ZWN0ZWQgdW5jYWNoZUJ5UGF0aChmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgYWJzb2x1dGVQYXRoID0gdGhpcy5yZXNvbHZlQWJzb2x1dGVQYXRoKGZpbGVQYXRoKTtcbiAgICBjb25zdCBlbGVtZW50SWQgPSB0aGlzLmZpbGVQYXRoVG9JZC5nZXQoYWJzb2x1dGVQYXRoKTtcblxuICAgIGlmIChlbGVtZW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5lbGVtZW50cy5kZWxldGUoZWxlbWVudElkKTtcbiAgICAgIHRoaXMuZmlsZVBhdGhUb0lkLmRlbGV0ZShhYnNvbHV0ZVBhdGgpO1xuICAgICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuZGVsZXRlKGVsZW1lbnRJZCk7XG4gICAgICBsb2dnZXIuZGVidWcoYFVuY2FjaGVkIGVsZW1lbnQgJHtlbGVtZW50SWR9IGZyb20gJHthYnNvbHV0ZVBhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjYWNoZWQgZWxlbWVudHNcbiAgICovXG4gIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5lbGVtZW50cy5jbGVhcigpO1xuICAgIHRoaXMuZmlsZVBhdGhUb0lkLmNsZWFyKCk7XG4gICAgdGhpcy5lbGVtZW50R2VuZXJhdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLnN0b3JhZ2VMYXllci5jbGVhcigpO1xuICAgIHRoaXMuc3VwcHJlc3NlZExvYWRQYXRocy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjYWNoZSBzdGF0aXN0aWNzIGZvciBkZWJ1Z2dpbmdcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggY2FjaGUgc2l6ZSBtZXRyaWNzXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q2FjaGVTdGF0cygpOiB7IGVsZW1lbnRDb3VudDogbnVtYmVyOyBwYXRoTWFwcGluZ3M6IG51bWJlciB9IHtcbiAgICBjb25zdCBlbGVtZW50c1N0YXRzID0gdGhpcy5lbGVtZW50cy5nZXRTdGF0cygpO1xuICAgIGNvbnN0IHBhdGhTdGF0cyA9IHRoaXMuZmlsZVBhdGhUb0lkLmdldFN0YXRzKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudENvdW50OiBlbGVtZW50c1N0YXRzLnNpemUsXG4gICAgICBwYXRoTWFwcGluZ3M6IHBhdGhTdGF0cy5zaXplXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvc2UgaW50ZXJuYWwgTFJVIGNhY2hlIGluc3RhbmNlcyBmb3IgbWV0cmljcyBjb2xsZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIGdldE1ldHJpY3NDYWNoZXMoKTogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGluc3RhbmNlOiBMUlVDYWNoZTx1bmtub3duPiB9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgbmFtZTogYGVsZW1lbnRzOiR7dGhpcy5lbGVtZW50VHlwZX1gLCBpbnN0YW5jZTogdGhpcy5lbGVtZW50cyBhcyBMUlVDYWNoZTx1bmtub3duPiB9LFxuICAgICAgeyBuYW1lOiBgcGF0aEluZGV4OiR7dGhpcy5lbGVtZW50VHlwZX1gLCBpbnN0YW5jZTogdGhpcy5maWxlUGF0aFRvSWQgYXMgTFJVQ2FjaGU8dW5rbm93bj4gfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgcmVzb3VyY2VzIGFuZCBjbGVhbnVwXG4gICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIGFkZCB0aGVpciBvd24gY2xlYW51cCBsb2dpY1xuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWVtb3J5QnVkZ2V0KSB7XG4gICAgICB0aGlzLm1lbW9yeUJ1ZGdldC51bnJlZ2lzdGVyKHRoaXMuZWxlbWVudHMpO1xuICAgICAgdGhpcy5tZW1vcnlCdWRnZXQudW5yZWdpc3Rlcih0aGlzLmZpbGVQYXRoVG9JZCk7XG4gICAgfVxuICAgIHRoaXMuZWxlbWVudHMuY2xlYXIoKTtcbiAgICB0aGlzLmZpbGVQYXRoVG9JZC5jbGVhcigpO1xuICAgIHRoaXMuZWxlbWVudEdlbmVyYXRpb25zLmNsZWFyKCk7XG4gICAgdGhpcy5zdG9yYWdlTGF5ZXIuY2xlYXIoKTtcbiAgICB0aGlzLndhdGNoZXJDbGVhbnVwPy4oKTtcbiAgICB0aGlzLndhdGNoZXJDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJHt0aGlzLmdldEVsZW1lbnRMYWJlbENhcGl0YWxpemVkKCl9TWFuYWdlciBkaXNwb3NlZCBhbmQgY2FjaGVzIGNsZWFyZWRgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEZJTEVOQU1FIE5PUk1BTElaQVRJT04gTUVUSE9EU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgYSBuYW1lIHRvIGtlYmFiLWNhc2UgZm9yIGNvbnNpc3RlbnQgZmlsZW5hbWUgZm9ybWF0dGluZy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgdW5pZmllZCBmaWxlbmFtZSBub3JtYWxpemF0aW9uIGFjcm9zcyBhbGwgZWxlbWVudCBtYW5hZ2VycyxcbiAgICogZW5zdXJpbmcgY29uc2lzdGVudCBuYW1pbmcgcmVnYXJkbGVzcyBvZiB0aGUgaW5wdXQgZm9ybWF0IChDYW1lbENhc2UsIHNwYWNlcyxcbiAgICogdW5kZXJzY29yZXMsIG1peGVkIGNhc2UsIGV0Yy4pLlxuICAgKlxuICAgKiBUcmFuc2Zvcm1hdGlvbnMgYXBwbGllZCAoaW4gb3JkZXIpOlxuICAgKiAxLiBJbnNlcnQgaHlwaGVucyBiZXR3ZWVuIGNhbWVsQ2FzZSBib3VuZGFyaWVzIChNeU5hbWUgLT4gTXktTmFtZSlcbiAgICogMi4gUmVwbGFjZSBzcGFjZXMgYW5kIHVuZGVyc2NvcmVzIHdpdGggaHlwaGVuc1xuICAgKiAzLiBDb252ZXJ0IHRvIGxvd2VyY2FzZVxuICAgKiA0LiBTdHJpcCBpbnZhbGlkIGNoYXJhY3RlcnMgKGtlZXAgb25seSBhLXosIDAtOSwgLSlcbiAgICogNS4gQ29sbGFwc2UgbXVsdGlwbGUgY29uc2VjdXRpdmUgaHlwaGVuc1xuICAgKiA2LiBUcmltIGxlYWRpbmcvdHJhaWxpbmcgaHlwaGVuc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIkNSVURWLUFnZW50LURlbHRhXCIpIC8vIFwiY3J1ZHYtYWdlbnQtZGVsdGFcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIkNyZWF0aXZlIFdyaXRlclwiKSAgIC8vIFwiY3JlYXRpdmUtd3JpdGVyXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJDYW1lbENhc2VOYW1lXCIpICAgICAvLyBcImNhbWVsLWNhc2UtbmFtZVwiXG4gICAqIG5vcm1hbGl6ZUZpbGVuYW1lKFwibXlfc2tpbGxfbmFtZVwiKSAgICAgLy8gXCJteS1za2lsbC1uYW1lXCJcbiAgICogbm9ybWFsaXplRmlsZW5hbWUoXCJTcGVjaWFsQENoYXJzIVwiKSAgICAvLyBcInNwZWNpYWwtY2hhcnNcIlxuICAgKiBub3JtYWxpemVGaWxlbmFtZShcIi0tbGVhZGluZy1hbmQtdHJhaWxpbmctLVwiKSAvLyBcImxlYWRpbmctYW5kLXRyYWlsaW5nXCJcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgZWxlbWVudCBuYW1lIHRvIG5vcm1hbGl6ZVxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIGtlYmFiLWNhc2UgZmlsZW5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKVxuICAgKi9cbiAgcHJvdGVjdGVkIG5vcm1hbGl6ZUZpbGVuYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUVsZW1lbnRGaWxlbmFtZShuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0YW5kYXJkaXplZCBmaWxlbmFtZSBmb3IgYW4gZWxlbWVudC5cbiAgICpcbiAgICogTm9ybWFsaXplcyB0aGUgZWxlbWVudCBuYW1lIChoYW5kbGluZyBDYW1lbENhc2UsIHNwYWNlcywgdW5kZXJzY29yZXMsIGV0Yy4pXG4gICAqIGFuZCBhcHBlbmRzIHRoZSBmaWxlIGV4dGVuc2lvbi4gVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKHBlcnNvbmFzLywgc2tpbGxzLywgZXRjLilcbiAgICogYWxyZWFkeSBwcm92aWRlcyB0eXBlIGNvbnRleHQsIHNvIHRoZSB0eXBlIGlzIE5PVCBpbmNsdWRlZCBpbiB0aGUgZmlsZW5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIGVsZW1lbnQgbmFtZSB0byBjb252ZXJ0IHRvIGEgZmlsZW5hbWVcbiAgICogQHJldHVybnMgVGhlIHN0YW5kYXJkaXplZCBmaWxlbmFtZSAoZS5nLiwgXCJjb2RlLXJldmlldy5tZFwiKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJDb2RlIFJldmlld1wiKSAgICAgICAgIC8vIOKGkiBcImNvZGUtcmV2aWV3Lm1kXCJcbiAgICogZ2V0RWxlbWVudEZpbGVuYW1lKFwiRGVidWcgRGV0ZWN0aXZlXCIpICAgICAvLyDihpIgXCJkZWJ1Zy1kZXRlY3RpdmUubWRcIlxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJCdWdSZXBvcnRcIikgICAgICAgICAgIC8vIOKGkiBcImJ1Zy1yZXBvcnQubWRcIiAoQ2FtZWxDYXNlIHNwbGl0KVxuICAgKiBnZXRFbGVtZW50RmlsZW5hbWUoXCJmaXgtcGVyc29uYS1oZWxwZXJcIikgIC8vIOKGkiBcImZpeC1wZXJzb25hLWhlbHBlci5tZFwiIChubyBtYW5nbGluZylcbiAgICovXG4gIHByb3RlY3RlZCBnZXRFbGVtZW50RmlsZW5hbWUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZUVsZW1lbnRTdG9yYWdlSWRlbnRpdHkobmFtZSk7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gdGhpcy5nZXRGaWxlRXh0ZW5zaW9uKCk7XG4gICAgcmV0dXJuIGAke25vcm1hbGl6ZWROYW1lfSR7ZXh0ZW5zaW9ufWA7XG4gIH1cblxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFCU1RSQUNUIE1FVEhPRFMgLSBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBtZXRhZGF0YSBmcm9tIGZyb250bWF0dGVyXG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGVsZW1lbnQtc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpY1xuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFJhdyBtZXRhZGF0YSBmcm9tIFlBTUwgZnJvbnRtYXR0ZXJcbiAgICogQHJldHVybnMgVmFsaWRhdGVkIGFuZCB0eXBlZCBtZXRhZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlTWV0YWRhdGEoZGF0YTogYW55KTogUHJvbWlzZTxUWydtZXRhZGF0YSddPjtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIEVsZW1lbnRWYWxpZGF0b3IgdmlhIFZhbGlkYXRpb25SZWdpc3RyeSBpbnN0ZWFkLlxuICAgKiBXaWxsIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciB2ZXJzaW9uLlxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVNZXRhZGF0YShtZXRhZGF0YTogYW55LCBfc3RyaWN0PzogYm9vbGVhbik6IFByb21pc2U8aW1wb3J0KCcuLi8uLi91dGlscy92YWxpZGF0aW9uL0ZpZWxkVmFsaWRhdG9yLmpzJykuVmFsaWRhdGlvbkVycm9yW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZU1ldGFkYXRhKG1ldGFkYXRhKTtcbiAgICByZXR1cm4gcmVzdWx0LmVycm9ycy5tYXAoZSA9PiAoeyBmaWVsZDogJ2dlbmVyYWwnLCBtZXNzYWdlOiBlIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZWxlbWVudCBpbnN0YW5jZSBmcm9tIG1ldGFkYXRhIGFuZCBjb250ZW50XG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGVsZW1lbnQtc3BlY2lmaWMgY29uc3RydWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIFZhbGlkYXRlZCBtZXRhZGF0YVxuICAgKiBAcGFyYW0gY29udGVudCAtIEVsZW1lbnQgY29udGVudCAoaW5zdHJ1Y3Rpb25zLCB0ZW1wbGF0ZSwgZXRjLilcbiAgICogQHJldHVybnMgTmV3IGVsZW1lbnQgaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVFbGVtZW50KG1ldGFkYXRhOiBUWydtZXRhZGF0YSddLCBjb250ZW50OiBzdHJpbmcpOiBUO1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgYW4gZWxlbWVudCB0byBmaWxlIGNvbnRlbnRcbiAgICogU3ViY2xhc3NlcyBjYW4gY3VzdG9taXplIHNlcmlhbGl6YXRpb24gZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gRWxlbWVudCB0byBzZXJpYWxpemVcbiAgICogQHJldHVybnMgRmlsZSBjb250ZW50ICh1c3VhbGx5IG1hcmtkb3duIHdpdGggZnJvbnRtYXR0ZXIpXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2VyaWFsaXplRWxlbWVudChlbGVtZW50OiBUKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgKiBNb3N0IGVsZW1lbnRzIHVzZSAubWQsIGJ1dCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZVxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBlbGVtZW50IGZyb20gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGZvcm1hdC1zcGVjaWZpYyBpbXBvcnQgbG9naWNcbiAgICovXG4gIGFic3RyYWN0IGltcG9ydEVsZW1lbnQoZGF0YTogc3RyaW5nLCBmb3JtYXQ/OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxUPjtcblxuICAvKipcbiAgICogRXhwb3J0IGFuIGVsZW1lbnQgdG8gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFN1YmNsYXNzZXMgaW1wbGVtZW50IGZvcm1hdC1zcGVjaWZpYyBleHBvcnQgbG9naWNcbiAgICovXG4gIGFic3RyYWN0IGV4cG9ydEVsZW1lbnQoZWxlbWVudDogVCwgZm9ybWF0PzogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8c3RyaW5nPjtcbn1cbiJdfQ==
@@ -43,6 +43,8 @@ export interface MemoryEntry {
43
43
  expiresAt?: Date;
44
44
  privacyLevel?: PrivacyLevel;
45
45
  trustLevel?: TrustLevel;
46
+ sanitizedPatterns?: unknown[];
47
+ sanitizedContent?: string;
46
48
  source?: string;
47
49
  }
48
50
  export interface MemorySearchOptions {
@@ -198,6 +200,11 @@ export declare class Memory extends BaseElement implements IElement {
198
200
  * FIX #1269: Sandboxes untrusted content to prevent prompt injection
199
201
  */
200
202
  get content(): string;
203
+ private formatEntryForDisplay;
204
+ private prepareEntryForDisplay;
205
+ private revalidateTrustedEntry;
206
+ private getSafeSanitizedContent;
207
+ private getTrustIndicator;
201
208
  /**
202
209
  * Sandbox untrusted content with clear delimiters
203
210
  * FIX #1269: Prevents AI from interpreting user content as instructions