@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
@@ -231,7 +231,7 @@ export class PortfolioManager {
231
231
  /**
232
232
  * List all elements of a specific type
233
233
  */
234
- async listElements(type) {
234
+ async listElements(type, options = {}) {
235
235
  const elementDir = this.getElementDir(type);
236
236
  const fileExtension = ELEMENT_FILE_EXTENSIONS[type] || DEFAULT_ELEMENT_FILE_EXTENSION;
237
237
  try {
@@ -254,13 +254,19 @@ export class PortfolioManager {
254
254
  catch (error) {
255
255
  const err = error;
256
256
  if (err.code === 'ENOENT') {
257
+ if (options.throwOnFilesystemError) {
258
+ throw error;
259
+ }
257
260
  // Directory doesn't exist yet - this is expected for new installations
258
261
  logger.debug(`[PortfolioManager] Element directory doesn't exist yet: ${elementDir}`);
259
262
  return [];
260
263
  }
261
264
  if (err.code === 'EACCES' || err.code === 'EPERM') {
262
- // Permission denied - log but return empty array
263
265
  ErrorHandler.logError('PortfolioManager.listElements', error, { elementDir });
266
+ if (options.throwOnFilesystemError) {
267
+ throw error;
268
+ }
269
+ // Permission denied - preserve the legacy best-effort listing behavior
264
270
  return [];
265
271
  }
266
272
  if (err.code === 'ENOTDIR') {
@@ -419,4 +425,4 @@ export class PortfolioManager {
419
425
  }
420
426
  }
421
427
  }
422
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUdILE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQW1CLE1BQU0sWUFBWSxDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3ZFLFlBQVk7QUFDWixNQUFNLHVCQUF1QixHQUFnQztJQUMzRCxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLO0lBQzVCLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUs7SUFDMUIsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSztJQUM3QixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLO0lBQzFCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU87SUFDN0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSztDQUM5QixDQUFDO0FBRUYsK0NBQStDO0FBQy9DLE1BQU0sOEJBQThCLEdBQUcsS0FBSyxDQUFDO0FBRTdDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsSUFBWTtJQUNsRCxPQUFPLHVCQUF1QixDQUFDLElB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OUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQ2xELENBQUM7NEJBQ0YsU0FBUzt3QkFDWCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1Asa0VBQWtFO2dCQUNwRSxDQUFDO2dCQUVELHdCQUF3QjtnQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsT0FBTyxNQUFNLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3BFLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUVyRCxxQ0FBcUM7Z0JBQ3JDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDL0IsSUFBSSxFQUFFLHFCQUFxQjtvQkFDM0IsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsTUFBTSxFQUFFLGlEQUFpRDtvQkFDekQsT0FBTyxFQUFFLDJCQUEyQixPQUFPLE9BQU8sT0FBTywyQkFBMkI7b0JBQ3BGLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUU7aUJBQzdCLENBQUMsQ0FBQztZQUVMLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLDZDQUE2QztnQkFDN0MsSUFBSyxLQUFhLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUNyQyxNQUFNLENBQUMsS0FBSyxDQUFDLGdEQUFnRCxPQUFPLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbEYsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0Zm9saW8gTWFuYWdlciAtIE1hbmFnZXMgdGhlIHBvcnRmb2xpbyBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBhbGwgZWxlbWVudCB0eXBlc1xuICovXG5cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUsIFBvcnRmb2xpb0NvbmZpZyB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRGVmYXVsdEVsZW1lbnRQcm92aWRlciB9IGZyb20gJy4vRGVmYXVsdEVsZW1lbnRQcm92aWRlci5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcblxuLy8gQ29uc3RhbnRzXG5jb25zdCBFTEVNRU5UX0ZJTEVfRVhURU5TSU9OUzogUmVjb3JkPEVsZW1lbnRUeXBlLCBzdHJpbmc+ID0ge1xuICBbRWxlbWVudFR5cGUuUEVSU09OQV06ICcubWQnLFxuICBbRWxlbWVudFR5cGUuU0tJTExdOiAnLm1kJyxcbiAgW0VsZW1lbnRUeXBlLlRFTVBMQVRFXTogJy5tZCcsXG4gIFtFbGVtZW50VHlwZS5BR0VOVF06ICcubWQnLFxuICBbRWxlbWVudFR5cGUuTUVNT1JZXTogJy55YW1sJyxcbiAgW0VsZW1lbnRUeXBlLkVOU0VNQkxFXTogJy5tZCdcbn07XG5cbi8vIERlZmF1bHQgZXh0ZW5zaW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5jb25zdCBERUZBVUxUX0VMRU1FTlRfRklMRV9FWFRFTlNJT04gPSAnLm1kJztcblxuLyoqXG4gKiBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBhbiBlbGVtZW50IHR5cGUgd2l0aG91dCByZXF1aXJpbmcgYSBQb3J0Zm9saW9NYW5hZ2VyIGluc3RhbmNlLlxuICogSXNzdWUgIzgxNTogU2hhcmVkIGJ5IFBvcnRmb2xpb1JlcG9NYW5hZ2VyIGFuZCBzdWJtaXRUb1BvcnRmb2xpb1Rvb2wgdG8gYXZvaWRcbiAqIGhhcmRjb2RlZCAnLm1kJyBhc3N1bXB0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRGaWxlRXh0ZW5zaW9uKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBFTEVNRU5UX0ZJTEVfRVhURU5TSU9OU1t0eXBlIGFzIEVsZW1lbnRUeXBlXSB8fCBERUZBVUxUX0VMRU1FTlRfRklMRV9FWFRFTlNJT047XG59XG5cbmV4cG9ydCB7IEVsZW1lbnRUeXBlIH07XG5leHBvcnQgdHlwZSB7IFBvcnRmb2xpb0NvbmZpZyB9O1xuXG5leHBvcnQgY2xhc3MgUG9ydGZvbGlvTWFuYWdlciB7XG4gIHByaXZhdGUgaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYmFzZURpcjogc3RyaW5nO1xuICBwcml2YXRlIGZpbGVPcGVyYXRpb25zOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBQb3J0Zm9saW9NYW5hZ2VyIGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBwb3J0Zm9saW8gY29uZmlndXJhdGlvblxuICAgKiBAcGFyYW0gZmlsZU9wZXJhdGlvbnMgLSBPcHRpb25hbCBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBCUkVBS0lORyBDSEFOR0UgKHYxLjUuMCk6IEFkZGVkIGFzIHNlY29uZCBwYXJhbWV0ZXIgZm9yIERJLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3QgaW5zdGFudGlhdGlvbiB3aXRob3V0IERJIGNvbnRhaW5lciBzaG91bGQgcGFzcyB1bmRlZmluZWRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgb3IgcHJvdmlkZSBhIEZpbGVPcGVyYXRpb25zU2VydmljZSBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGZpbGVPcGVyYXRpb25zOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsIGNvbmZpZz86IFBvcnRmb2xpb0NvbmZpZykge1xuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBmaWxlT3BlcmF0aW9ucztcbiAgICAvLyBHZXQgcG90ZW50aWFsIGRpcmVjdG9yeSBmcm9tIGVudmlyb25tZW50IG9yIGNvbmZpZ1xuICAgIGNvbnN0IGVudkRpciA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9QT1JURk9MSU9fRElSO1xuICAgIGNvbnN0IGNvbmZpZ0RpciA9IGNvbmZpZz8uYmFzZURpcjtcbiAgICBjb25zdCBkZWZhdWx0RGlyID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAncG9ydGZvbGlvJyk7XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgcHJvdmlkZWRcbiAgICBpZiAoZW52RGlyKSB7XG4gICAgICBpZiAoIXBhdGguaXNBYnNvbHV0ZShlbnZEaXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRE9MTEhPVVNFX1BPUlRGT0xJT19ESVIgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoJyk7XG4gICAgICB9XG4gICAgICAvLyBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZm9yIHN1c3BpY2lvdXMgcGF0aHNcbiAgICAgIGlmIChlbnZEaXIuaW5jbHVkZXMoJy4uJykgfHwgZW52RGlyLnN0YXJ0c1dpdGgoJy9ldGMnKSB8fCBlbnZEaXIuc3RhcnRzV2l0aCgnL3N5cycpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRE9MTEhPVVNFX1BPUlRGT0xJT19ESVIgY29udGFpbnMgc3VzcGljaW91cyBwYXRoIHNlZ21lbnRzJyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFZhbGlkYXRlIGNvbmZpZyBkaXJlY3RvcnkgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnRGlyICYmICFwYXRoLmlzQWJzb2x1dGUoY29uZmlnRGlyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3J0Zm9saW8gY29uZmlnIGJhc2VEaXIgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIFVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBzZXQsIG90aGVyd2lzZSBjb25maWcsIG90aGVyd2lzZSBkZWZhdWx0XG4gICAgdGhpcy5iYXNlRGlyID0gZW52RGlyIHx8IGNvbmZpZ0RpciB8fCBkZWZhdWx0RGlyO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKGBbUG9ydGZvbGlvTWFuYWdlcl0gUG9ydGZvbGlvIGJhc2UgZGlyZWN0b3J5OiAke3RoaXMuYmFzZURpcn1gKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgYmFzZSBwb3J0Zm9saW8gZGlyZWN0b3J5XG4gICAqL1xuICBwdWJsaWMgZ2V0QmFzZURpcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJhc2VEaXI7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRpcmVjdG9yeSBmb3IgYSBzcGVjaWZpYyBlbGVtZW50IHR5cGVcbiAgICovXG4gIHB1YmxpYyBnZXRFbGVtZW50RGlyKHR5cGU6IEVsZW1lbnRUeXBlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5qb2luKHRoaXMuYmFzZURpciwgdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgYSBzcGVjaWZpYyBlbGVtZW50IHR5cGVcbiAgICogRklYICgjMTIxMyk6IEV4cG9zZSBFTEVNRU5UX0ZJTEVfRVhURU5TSU9OUyBtYXBwaW5nIGZvciBjb3JyZWN0IGV4dGVuc2lvbiBkaXNwbGF5XG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsZUV4dGVuc2lvbih0eXBlOiBFbGVtZW50VHlwZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVMRU1FTlRfRklMRV9FWFRFTlNJT05TW3R5cGVdIHx8IERFRkFVTFRfRUxFTUVOVF9GSUxFX0VYVEVOU0lPTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgKiBVc2VzIGxvY2tpbmcgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgZHVyaW5nIGNvbmN1cnJlbnQgaW5pdGlhbGl6YXRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIElmIGFscmVhZHkgaW5pdGlhbGl6aW5nLCB3YWl0IGZvciB0aGUgZXhpc3RpbmcgaW5pdGlhbGl6YXRpb25cbiAgICBpZiAodGhpcy5pbml0aWFsaXphdGlvblByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBwb3J0Zm9saW8gaXMgZnVsbHkgaW5pdGlhbGl6ZWQgKGJhc2UgZGlyICsgYWxsIHN1YmRpcmVjdG9yaWVzIGV4aXN0KVxuICAgIGlmIChhd2FpdCB0aGlzLmlzRnVsbHlJbml0aWFsaXplZCgpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tQb3J0Zm9saW9NYW5hZ2VyXSBQb3J0Zm9saW8gYWxyZWFkeSBmdWxseSBpbml0aWFsaXplZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBpbml0aWFsaXphdGlvbiBwcm9taXNlIHRvIHByZXZlbnQgY29uY3VycmVudCBpbml0aWFsaXphdGlvblxuICAgIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlID0gdGhpcy5wZXJmb3JtSW5pdGlhbGl6YXRpb24oKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gQ2xlYXIgdGhlIHByb21pc2UgYWZ0ZXIgY29tcGxldGlvblxuICAgICAgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2UgPSBudWxsO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCBpbml0aWFsaXphdGlvbiAtIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1Jbml0aWFsaXphdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuaW5mbygnW1BvcnRmb2xpb01hbmFnZXJdIEluaXRpYWxpemluZyBwb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZScpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBiYXNlIGRpcmVjdG9yeVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLmJhc2VEaXIpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb247XG4gICAgICAvLyBJbiByZWFkLW9ubHkgZW52aXJvbm1lbnRzIChsaWtlIERvY2tlciksIHdlIGNhbid0IGNyZWF0ZSBkaXJlY3Rvcmllc1xuICAgICAgLy8gTG9nIGJ1dCBjb250aW51ZSAtIHRoZSBwb3J0Zm9saW8gd2lsbCBiZSBlbXB0eSBidXQgZnVuY3Rpb25hbFxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRUFDQ0VTJyB8fCBlcnIuY29kZSA9PT0gJ0VST0ZTJyB8fCBlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtQb3J0Zm9saW9NYW5hZ2VyXSBDYW5ub3QgY3JlYXRlIHBvcnRmb2xpbyBkaXJlY3RvcnkgKHJlYWQtb25seSBlbnZpcm9ubWVudD8pOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW0RvbGxob3VzZU1DUF0gUnVubmluZyBpbiByZWFkLW9ubHkgbW9kZSAtIHBvcnRmb2xpbyBmZWF0dXJlcyBkaXNhYmxlZGApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIHN1YmRpcmVjdG9yaWVzIGZvciBlYWNoIGVsZW1lbnQgdHlwZVxuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnREaXIgPSBwYXRoLmpvaW4odGhpcy5iYXNlRGlyLCBlbGVtZW50VHlwZSk7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShlbGVtZW50RGlyKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW1BvcnRmb2xpb01hbmFnZXJdIENyZWF0ZWQgZGlyZWN0b3J5OiAke2VsZW1lbnREaXJ9YCk7XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSBzcGVjaWFsIGRpcmVjdG9yaWVzIGZvciBzdGF0ZWZ1bCBlbGVtZW50c1xuICAgIGNvbnN0IGFnZW50U3RhdGVEaXIgPSBwYXRoLmpvaW4odGhpcy5iYXNlRGlyLCBFbGVtZW50VHlwZS5BR0VOVCwgJy5zdGF0ZScpO1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KGFnZW50U3RhdGVEaXIpO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdbUG9ydGZvbGlvTWFuYWdlcl0gUG9ydGZvbGlvIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQnKTtcbiAgICBcbiAgICAvLyBNaWdyYXRpb24gZm9yIHYxLjQuMiB1c2VyczogcmVuYW1lIHNpbmd1bGFyIGRpcmVjdG9yaWVzIHRvIHBsdXJhbFxuICAgIGF3YWl0IHRoaXMubWlncmF0ZUZyb21TaW5ndWxhckRpcmVjdG9yaWVzKCk7XG4gICAgXG4gICAgLy8gUG9wdWxhdGUgd2l0aCBkZWZhdWx0IGVsZW1lbnRzIGlmIHRoaXMgaXMgYSBuZXcgaW5zdGFsbGF0aW9uXG4gICAgLy8gU2tpcCBkdXJpbmcgdGVzdHMgdG8gYXZvaWQgaW50ZXJmZXJlbmNlXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRQcm92aWRlciA9IG5ldyBEZWZhdWx0RWxlbWVudFByb3ZpZGVyKCk7XG4gICAgICAgIGF3YWl0IGRlZmF1bHRQcm92aWRlci5wb3B1bGF0ZURlZmF1bHRzKHRoaXMuYmFzZURpcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ1tQb3J0Zm9saW9NYW5hZ2VyXSBFcnJvciBwb3B1bGF0aW5nIGRlZmF1bHQgZWxlbWVudHM6JywgZXJyb3IpO1xuICAgICAgICAvLyBMb2cgdG8gc3RkZXJyIGZvciBNQ1AgY2xpZW50IHZpc2liaWxpdHlcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbUG9ydGZvbGlvTWFuYWdlcl0gQ1JJVElDQUw6IEZhaWxlZCB0byBwb3B1bGF0ZSBkZWZhdWx0IGVsZW1lbnRzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgICAgLy8gQ29udGludWUgYW55d2F5IC0gZW1wdHkgcG9ydGZvbGlvIGlzIHZhbGlkXG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgcG9ydGZvbGlvIGRpcmVjdG9yeSBleGlzdHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleGlzdHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyh0aGlzLmJhc2VEaXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwb3J0Zm9saW8gaXMgZnVsbHkgaW5pdGlhbGl6ZWQgKGJhc2UgZGlyICsgYWxsIHN1YmRpcmVjdG9yaWVzIGV4aXN0KVxuICAgKiBUaGlzIHByZXZlbnRzIHRoZSBidWcgd2hlcmUgYmFzZSBkaXIgZXhpc3RzIGJ1dCBzdWJkaXJlY3RvcmllcyB3ZXJlIGRlbGV0ZWRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaXNGdWxseUluaXRpYWxpemVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIEZpcnN0IGNoZWNrIGlmIGJhc2UgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghYXdhaXQgdGhpcy5leGlzdHMoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGFsbCByZXF1aXJlZCBzdWJkaXJlY3RvcmllcyBleGlzdFxuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnREaXIgPSBwYXRoLmpvaW4odGhpcy5iYXNlRGlyLCBlbGVtZW50VHlwZSk7XG4gICAgICAgIGlmICghYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHMoZWxlbWVudERpcikpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgc3BlY2lhbCBkaXJlY3Rvcmllc1xuICAgICAgY29uc3QgYWdlbnRTdGF0ZURpciA9IHBhdGguam9pbih0aGlzLmJhc2VEaXIsIEVsZW1lbnRUeXBlLkFHRU5ULCAnLnN0YXRlJyk7XG4gICAgICBpZiAoIWF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGFnZW50U3RhdGVEaXIpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWYgYW55IHN1YmRpcmVjdG9yeSBpcyBtaXNzaW5nLCBwb3J0Zm9saW8gaXMgbm90IGZ1bGx5IGluaXRpYWxpemVkXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBmaWxlbmFtZSBhcHBlYXJzIHRvIGJlIGEgdGVzdCBlbGVtZW50XG4gICAqIFNBRkVUWTogUGF0dGVybi1iYXNlZCBmaWx0ZXJpbmcgb25seSwgbm8gY29udGVudCBwYXJzaW5nXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIElERU5USUZJRVMgdGVzdCBwYXR0ZXJucyAoYWx3YXlzIHJldHVybnMgdHJ1ZSBmb3IgdGVzdCBmaWxlcykuXG4gICAqIFRoZSBhY3R1YWwgRklMVEVSSU5HIGRlY2lzaW9uICh3aGV0aGVyIHRvIGV4Y2x1ZGUgdGhlbSkgaXMgbWFkZSBpbiBsaXN0RWxlbWVudHMoKS5cbiAgICovXG4gIHB1YmxpYyBpc1Rlc3RFbGVtZW50KGZpbGVuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBEYW5nZXJvdXMgdGVzdCBwYXR0ZXJucyB0aGF0IHNob3VsZCBuZXZlciBhcHBlYXIgaW4gcHJvZHVjdGlvblxuICAgIGNvbnN0IGRhbmdlcm91c1BhdHRlcm5zID0gW1xuICAgICAgL15iaW4tc2gvaSxcbiAgICAgIC9ecm0tcmYvaSxcbiAgICAgIC9ebmMtZS1iaW4vaSxcbiAgICAgIC9ecHl0aG9uLWMtaW1wb3J0L2ksXG4gICAgICAvXmN1cmwuKmV2aWwvaSxcbiAgICAgIC9ed2dldC4qbWFsaWNpb3VzL2ksXG4gICAgICAvXmV2YWwtL2ksXG4gICAgICAvXmV4ZWMtL2ksXG4gICAgICAvXmJhc2gtYy0vaSxcbiAgICAgIC9ec2gtYy0vaSxcbiAgICAgIC9ecG93ZXJzaGVsbC0vaSxcbiAgICAgIC9eY21kLWMtL2ksXG4gICAgICAvc2hlbGwtaW5qZWN0aW9uL2lcbiAgICBdO1xuXG4gICAgLy8gTk9URTogVGVzdC1wYXR0ZXJuIGZpbHRlcmluZyByZW1vdmVkIGVudGlyZWx5IChJc3N1ZSAjMjg3KVxuICAgIC8vIFVzZXJzIGNhbiBsZWdpdGltYXRlbHkgY3JlYXRlIGVsZW1lbnRzIHdpdGggXCJ0ZXN0XCIgaW4gdGhlIG5hbWUuXG4gICAgLy8gT25seSBkYW5nZXJvdXMgcGF0dGVybnMgKHNlY3VyaXR5IGNvbmNlcm5zKSBhcmUgZmlsdGVyZWQuXG5cbiAgICAvLyBDaGVjayBkYW5nZXJvdXMgcGF0dGVybnMgb25seVxuICAgIGlmIChkYW5nZXJvdXNQYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gcGF0dGVybi50ZXN0KGZpbGVuYW1lKSkpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbUG9ydGZvbGlvTWFuYWdlcl0gRmlsdGVyZWQgZGFuZ2Vyb3VzIGVsZW1lbnQ6ICR7ZmlsZW5hbWV9YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgZWxlbWVudHMgb2YgYSBzcGVjaWZpYyB0eXBlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdEVsZW1lbnRzKHR5cGU6IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGVsZW1lbnREaXIgPSB0aGlzLmdldEVsZW1lbnREaXIodHlwZSk7XG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IEVMRU1FTlRfRklMRV9FWFRFTlNJT05TW3R5cGVdIHx8IERFRkFVTFRfRUxFTUVOVF9GSUxFX0VYVEVOU0lPTjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShlbGVtZW50RGlyKTtcbiAgICAgIC8vIEZpbHRlciBmb3IgY29ycmVjdCBmaWxlIGV4dGVuc2lvbiBiYXNlZCBvbiBlbGVtZW50IHR5cGVcbiAgICAgIGxldCBmaWx0ZXJlZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5lbmRzV2l0aChmaWxlRXh0ZW5zaW9uKSk7XG5cbiAgICAgIC8vIElzc3VlICM2NTQ6IEV4Y2x1ZGUgYmFja3VwIGZpbGVzIGZyb20gYWxsIGVsZW1lbnQgdHlwZXMuXG4gICAgICAvLyBTYWZldHkgbmV0IOKAlCBNZW1vcnlTdG9yYWdlTGF5ZXIgYWxzbyBmaWx0ZXJzLCBidXQgYW55IGNvZGUgcGF0aCB0aGF0XG4gICAgICAvLyBjYWxscyBsaXN0RWxlbWVudHMoKSBkaXJlY3RseSBzaG91bGQgbmV2ZXIgcmV0dXJuIGJhY2t1cCBhcnRpZmFjdHMuXG4gICAgICBmaWx0ZXJlZEZpbGVzID0gZmlsdGVyZWRGaWxlcy5maWx0ZXIoZmlsZSA9PlxuICAgICAgICAhZmlsZS5pbmNsdWRlcygnLmJhY2t1cC0nKSAmJiAhZmlsZS5pbmNsdWRlcygnLmJhY2t1cC4nKVxuICAgICAgKTtcblxuICAgICAgLy8gRmlsdGVyIG91dCB0ZXN0L2Rhbmdlcm91cyBlbGVtZW50cyB1bmxlc3MgZXhwbGljaXRseSBkaXNhYmxlZFxuICAgICAgLy8gRElTQUJMRV9FTEVNRU5UX0ZJTFRFUklORyBjYW4gYmUgc2V0IGluIEUyRSB0ZXN0cyB0aGF0IG5lZWQgdGVzdCBlbGVtZW50c1xuICAgICAgLy8gSW50ZWdyYXRpb24gdGVzdHMgYW5kIHByb2R1Y3Rpb24gYm90aCB1c2UgZmlsdGVyaW5nIGJ5IGRlZmF1bHRcbiAgICAgIGNvbnN0IHNob3VsZEZpbHRlciA9IHByb2Nlc3MuZW52LkRJU0FCTEVfRUxFTUVOVF9GSUxURVJJTkcgIT09ICd0cnVlJztcbiAgICAgIGlmIChzaG91bGRGaWx0ZXIpIHtcbiAgICAgICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMuZmlsdGVyKGZpbGUgPT4gIXRoaXMuaXNUZXN0RWxlbWVudChmaWxlKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZEZpbGVzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb247XG4gICAgICBcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgLy8gRGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QgeWV0IC0gdGhpcyBpcyBleHBlY3RlZCBmb3IgbmV3IGluc3RhbGxhdGlvbnNcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbUG9ydGZvbGlvTWFuYWdlcl0gRWxlbWVudCBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCB5ZXQ6ICR7ZWxlbWVudERpcn1gKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUNDRVMnIHx8IGVyci5jb2RlID09PSAnRVBFUk0nKSB7XG4gICAgICAgIC8vIFBlcm1pc3Npb24gZGVuaWVkIC0gbG9nIGJ1dCByZXR1cm4gZW1wdHkgYXJyYXlcbiAgICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cycsIGVycm9yLCB7IGVsZW1lbnREaXIgfSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGVyci5jb2RlID09PSAnRU5PVERJUicpIHtcbiAgICAgICAgLy8gUGF0aCBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeVxuICAgICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1BvcnRmb2xpb01hbmFnZXIubGlzdEVsZW1lbnRzJywgZXJyb3IsIHsgZWxlbWVudERpciB9KTtcbiAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBQYXRoIGlzIG5vdCBhIGRpcmVjdG9yeTogJHtlbGVtZW50RGlyfWAsIEVycm9yQ2F0ZWdvcnkuU1lTVEVNX0VSUk9SKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRm9yIGFueSBvdGhlciBlcnJvcnMsIHRocm93IHdpdGggY29udGV4dFxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cycsIGVycm9yLCB7IGVsZW1lbnREaXIgfSk7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIud3JhcEVycm9yKGVycm9yLCAnRmFpbGVkIHRvIGxpc3QgZWxlbWVudHMnLCBFcnJvckNhdGVnb3J5LlNZU1RFTV9FUlJPUik7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGZ1bGwgcGF0aCB0byBhbiBlbGVtZW50IGZpbGVcbiAgICovXG4gIHB1YmxpYyBnZXRFbGVtZW50UGF0aCh0eXBlOiBFbGVtZW50VHlwZSwgZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gVmFsaWRhdGUgZmlsZW5hbWUgdG8gcHJldmVudCBwYXRoIHRyYXZlcnNhbFxuICAgIGlmICghZmlsZW5hbWUgfHwgdHlwZW9mIGZpbGVuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnUG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50UGF0aCcsXG4gICAgICAgIGRldGFpbHM6IGBJbnZhbGlkIGZpbGVuYW1lIHByb3ZpZGVkOiAke3R5cGVvZiBmaWxlbmFtZX1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbGVtZW50VHlwZTogdHlwZSwgZmlsZW5hbWU6IFN0cmluZyhmaWxlbmFtZSkgfVxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmlsZW5hbWU6IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciBwYXRoIHRyYXZlcnNhbCBhdHRlbXB0c1xuICAgIGlmIChmaWxlbmFtZS5pbmNsdWRlcygnLi4nKSB8fCBmaWxlbmFtZS5pbmNsdWRlcygnLycpIHx8IGZpbGVuYW1lLmluY2x1ZGVzKCdcXFxcJykgfHwgcGF0aC5pc0Fic29sdXRlKGZpbGVuYW1lKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudFBhdGgnLFxuICAgICAgICBkZXRhaWxzOiBgUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCBpbiBmaWxlbmFtZTogJHtmaWxlbmFtZX1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbGVtZW50VHlwZTogdHlwZSwgZmlsZW5hbWUgfVxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmlsZW5hbWU6IGNvbnRhaW5zIHBhdGggdHJhdmVyc2FsIGNoYXJhY3RlcnM6ICR7ZmlsZW5hbWV9YCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmb3IgaGlkZGVuIGZpbGVzIGFuZCBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICBpZiAoZmlsZW5hbWUuc3RhcnRzV2l0aCgnLicpIHx8IGZpbGVuYW1lLmluY2x1ZGVzKCdcXDAnKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnUG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50UGF0aCcsXG4gICAgICAgIGRldGFpbHM6IGBJbnZhbGlkIGZpbGVuYW1lIGNoYXJhY3RlcnMgZGV0ZWN0ZWQ6ICR7ZmlsZW5hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZWxlbWVudFR5cGU6IHR5cGUsIGZpbGVuYW1lLCBoYXNIaWRkZW5GaWxlOiBmaWxlbmFtZS5zdGFydHNXaXRoKCcuJyksIGhhc051bGxCeXRlOiBmaWxlbmFtZS5pbmNsdWRlcygnXFwwJykgfVxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmlsZW5hbWU6IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyczogJHtmaWxlbmFtZX1gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIGZpbGVuYW1lIGVuZHMgd2l0aCAubWRcbiAgICBjb25zdCBzYWZlRmlsZW5hbWUgPSBmaWxlbmFtZS5lbmRzV2l0aCgnLm1kJykgPyBmaWxlbmFtZSA6IGAke2ZpbGVuYW1lfS5tZGA7XG4gICAgcmV0dXJuIHBhdGguam9pbih0aGlzLmdldEVsZW1lbnREaXIodHlwZSksIHNhZmVGaWxlbmFtZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGV4aXN0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGVsZW1lbnRFeGlzdHModHlwZTogRWxlbWVudFR5cGUsIGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHRoaXMuZ2V0RWxlbWVudFBhdGgodHlwZSwgZmlsZW5hbWUpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgbGVnYWN5IHBlcnNvbmFzIGRpcmVjdG9yeSBwYXRoIChmb3IgbWlncmF0aW9uKVxuICAgKi9cbiAgcHVibGljIGdldExlZ2FjeVBlcnNvbmFzRGlyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJ3BlcnNvbmFzJyk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBsZWdhY3kgcGVyc29uYXMgZGlyZWN0b3J5IGV4aXN0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGhhc0xlZ2FjeVBlcnNvbmFzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsZWdhY3lEaXIgPSB0aGlzLmdldExlZ2FjeVBlcnNvbmFzRGlyKCk7XG4gICAgICBpZiAoIWF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGxlZ2FjeURpcikpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5saXN0RGlyZWN0b3J5KGxlZ2FjeURpcik7XG4gICAgICByZXR1cm4gZmlsZXMuc29tZShmaWxlID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgcG9ydGZvbGlvIHN0YXRpc3RpY3NcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTdGF0aXN0aWNzKCk6IFByb21pc2U8UmVjb3JkPEVsZW1lbnRUeXBlLCBudW1iZXI+PiB7XG4gICAgY29uc3Qgc3RhdHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMubGlzdEVsZW1lbnRzKGVsZW1lbnRUeXBlKTtcbiAgICAgIHN0YXRzW2VsZW1lbnRUeXBlXSA9IGVsZW1lbnRzLmxlbmd0aDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHN0YXRzIGFzIFJlY29yZDxFbGVtZW50VHlwZSwgbnVtYmVyPjtcbiAgfVxuICBcbiAgLyoqXG4gICAqIE1pZ3JhdGUgZnJvbSB2MS40LjIgc2luZ3VsYXIgZGlyZWN0b3J5IG5hbWVzIHRvIHYxLjQuMyBwbHVyYWwgbmFtZXNcbiAgICogVGhpcyBoYW5kbGVzIHRoZSB1cGdyYWRlIHBhdGggZm9yIGV4aXN0aW5nIHVzZXJzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1pZ3JhdGVGcm9tU2luZ3VsYXJEaXJlY3RvcmllcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvbGRUb05ldzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdwZXJzb25hJzogJ3BlcnNvbmFzJyxcbiAgICAgICdza2lsbCc6ICdza2lsbHMnLFxuICAgICAgJ3RlbXBsYXRlJzogJ3RlbXBsYXRlcycsXG4gICAgICAnYWdlbnQnOiAnYWdlbnRzJyxcbiAgICAgICdtZW1vcnknOiAnbWVtb3JpZXMnLFxuICAgICAgJ2Vuc2VtYmxlJzogJ2Vuc2VtYmxlcydcbiAgICB9O1xuICAgIFxuICAgIGZvciAoY29uc3QgW29sZE5hbWUsIG5ld05hbWVdIG9mIE9iamVjdC5lbnRyaWVzKG9sZFRvTmV3KSkge1xuICAgICAgLy8gVW5pY29kZSBub3JtYWxpemUgdGhlIGRpcmVjdG9yeSBuYW1lcyAoZXZlbiB0aG91Z2ggdGhleSdyZSBoYXJkY29kZWQsIGZvciBzZWN1cml0eSBhdWRpdClcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRPbGQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShvbGROYW1lKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWROZXcgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShuZXdOYW1lKTtcbiAgICAgIFxuICAgICAgaWYgKCFub3JtYWxpemVkT2xkLmlzVmFsaWQgfHwgIW5vcm1hbGl6ZWROZXcuaXNWYWxpZCkge1xuICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gd2l0aCBvdXIgaGFyZGNvZGVkIHZhbHVlcywgYnV0IGZvciBjb21wbGV0ZW5lc3NcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbUG9ydGZvbGlvTWFuYWdlcl0gSW52YWxpZCBVbmljb2RlIGluIGRpcmVjdG9yeSBuYW1lcyBkdXJpbmcgbWlncmF0aW9uYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBvbGREaXIgPSBwYXRoLmpvaW4odGhpcy5iYXNlRGlyLCBub3JtYWxpemVkT2xkLm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgIGNvbnN0IG5ld0RpciA9IHBhdGguam9pbih0aGlzLmJhc2VEaXIsIG5vcm1hbGl6ZWROZXcubm9ybWFsaXplZENvbnRlbnQpO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICAvLyBDaGVjayBpZiBvbGQgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKG9sZERpcikpIGNvbnRpbnVlO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgbmV3IGRpcmVjdG9yeSBhbHJlYWR5IGhhcyBjb250ZW50XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKG5ld0RpcikpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0RpckZpbGVzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5saXN0RGlyZWN0b3J5KG5ld0Rpcik7XG4gICAgICAgICAgICBpZiAobmV3RGlyRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICBgW1BvcnRmb2xpb01hbmFnZXJdIEJvdGggJHtvbGROYW1lfSBhbmQgJHtuZXdOYW1lfSBkaXJlY3RvcmllcyBleGlzdC4gS2VlcGluZyAke25ld05hbWV9LCBza2lwcGluZyBtaWdyYXRpb24uYCxcbiAgICAgICAgICAgICAgICB7IG9sZERpciwgbmV3RGlyLCBmaWxlQ291bnQ6IG5ld0RpckZpbGVzLmxlbmd0aCB9XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gTmV3IGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IG9yIGlzIGVtcHR5LCBwcm9jZWVkIHdpdGggbWlncmF0aW9uXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFBlcmZvcm0gdGhlIG1pZ3JhdGlvblxuICAgICAgICBsb2dnZXIuaW5mbyhgW1BvcnRmb2xpb01hbmFnZXJdIE1pZ3JhdGluZyAke29sZE5hbWV9IOKGkiAke25ld05hbWV9YCk7XG4gICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVuYW1lRmlsZShvbGREaXIsIG5ld0Rpcik7XG4gICAgICAgIFxuICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnRElSRUNUT1JZX01JR1JBVElPTicsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb01hbmFnZXIubWlncmF0ZUZyb21TaW5ndWxhckRpcmVjdG9yaWVzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgTWlncmF0ZWQgZGlyZWN0b3J5IGZyb20gJHtvbGROYW1lfSB0byAke25ld05hbWV9IGZvciB2MS40LjMgY29tcGF0aWJpbGl0eWAsXG4gICAgICAgICAgbWV0YWRhdGE6IHsgb2xkRGlyLCBuZXdEaXIgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBPbGQgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBbUG9ydGZvbGlvTWFuYWdlcl0gRXJyb3IgZHVyaW5nIG1pZ3JhdGlvbiBvZiAke29sZE5hbWV9OmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
428
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUdILE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQW1CLE1BQU0sWUFBWSxDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3ZFLFlBQVk7QUFDWixNQUFNLHVCQUF1QixHQUFnQztJQUMzRCxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLO0lBQzVCLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUs7SUFDMUIsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSztJQUM3QixDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLO0lBQzFCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU87SUFDN0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSztDQUM5QixDQUFDO0FBRUYsK0NBQStDO0FBQy9DLE1BQU0sOEJBQThCLEdBQUcsS0FBSyxDQUFDO0FBTzdDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsSUFBWTtJQUNsRCxPQUFPLHVCQUF1QixDQUFDLElB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Ii8qKlxuICogUG9ydGZvbGlvIE1hbmFnZXIgLSBNYW5hZ2VzIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgYWxsIGVsZW1lbnQgdHlwZXNcbiAqL1xuXG5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlLCBQb3J0Zm9saW9Db25maWcgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IERlZmF1bHRFbGVtZW50UHJvdmlkZXIgfSBmcm9tICcuL0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBFcnJvckNhdGVnb3J5IH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5cbi8vIENvbnN0YW50c1xuY29uc3QgRUxFTUVOVF9GSUxFX0VYVEVOU0lPTlM6IFJlY29yZDxFbGVtZW50VHlwZSwgc3RyaW5nPiA9IHtcbiAgW0VsZW1lbnRUeXBlLlBFUlNPTkFdOiAnLm1kJyxcbiAgW0VsZW1lbnRUeXBlLlNLSUxMXTogJy5tZCcsXG4gIFtFbGVtZW50VHlwZS5URU1QTEFURV06ICcubWQnLFxuICBbRWxlbWVudFR5cGUuQUdFTlRdOiAnLm1kJyxcbiAgW0VsZW1lbnRUeXBlLk1FTU9SWV06ICcueWFtbCcsXG4gIFtFbGVtZW50VHlwZS5FTlNFTUJMRV06ICcubWQnXG59O1xuXG4vLyBEZWZhdWx0IGV4dGVuc2lvbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuY29uc3QgREVGQVVMVF9FTEVNRU5UX0ZJTEVfRVhURU5TSU9OID0gJy5tZCc7XG5cbmludGVyZmFjZSBMaXN0RWxlbWVudHNPcHRpb25zIHtcbiAgLyoqIFByZXNlcnZlIGZpbGVzeXN0ZW0gZmFpbHVyZXMgaW5zdGVhZCBvZiByZXByZXNlbnRpbmcgdGhlbSBhcyBhbiBlbXB0eSBwb3J0Zm9saW8uICovXG4gIHRocm93T25GaWxlc3lzdGVtRXJyb3I/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEdldCB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGFuIGVsZW1lbnQgdHlwZSB3aXRob3V0IHJlcXVpcmluZyBhIFBvcnRmb2xpb01hbmFnZXIgaW5zdGFuY2UuXG4gKiBJc3N1ZSAjODE1OiBTaGFyZWQgYnkgUG9ydGZvbGlvUmVwb01hbmFnZXIgYW5kIHN1Ym1pdFRvUG9ydGZvbGlvVG9vbCB0byBhdm9pZFxuICogaGFyZGNvZGVkICcubWQnIGFzc3VtcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudEZpbGVFeHRlbnNpb24odHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIEVMRU1FTlRfRklMRV9FWFRFTlNJT05TW3R5cGUgYXMgRWxlbWVudFR5cGVdIHx8IERFRkFVTFRfRUxFTUVOVF9GSUxFX0VYVEVOU0lPTjtcbn1cblxuZXhwb3J0IHsgRWxlbWVudFR5cGUgfTtcbmV4cG9ydCB0eXBlIHsgUG9ydGZvbGlvQ29uZmlnIH07XG5cbmV4cG9ydCBjbGFzcyBQb3J0Zm9saW9NYW5hZ2VyIHtcbiAgcHJpdmF0ZSBpbml0aWFsaXphdGlvblByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBiYXNlRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgZmlsZU9wZXJhdGlvbnM6IEZpbGVPcGVyYXRpb25zU2VydmljZTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IFBvcnRmb2xpb01hbmFnZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIHBvcnRmb2xpbyBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSBmaWxlT3BlcmF0aW9ucyAtIE9wdGlvbmFsIEZpbGVPcGVyYXRpb25zU2VydmljZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgIEJSRUFLSU5HIENIQU5HRSAodjEuNS4wKTogQWRkZWQgYXMgc2Vjb25kIHBhcmFtZXRlciBmb3IgREkuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdCBpbnN0YW50aWF0aW9uIHdpdGhvdXQgREkgY29udGFpbmVyIHNob3VsZCBwYXNzIHVuZGVmaW5lZFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBvciBwcm92aWRlIGEgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZmlsZU9wZXJhdGlvbnM6IEZpbGVPcGVyYXRpb25zU2VydmljZSwgY29uZmlnPzogUG9ydGZvbGlvQ29uZmlnKSB7XG4gICAgdGhpcy5maWxlT3BlcmF0aW9ucyA9IGZpbGVPcGVyYXRpb25zO1xuICAgIC8vIEdldCBwb3RlbnRpYWwgZGlyZWN0b3J5IGZyb20gZW52aXJvbm1lbnQgb3IgY29uZmlnXG4gICAgY29uc3QgZW52RGlyID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1BPUlRGT0xJT19ESVI7XG4gICAgY29uc3QgY29uZmlnRGlyID0gY29uZmlnPy5iYXNlRGlyO1xuICAgIGNvbnN0IGRlZmF1bHREaXIgPSBwYXRoLmpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICdwb3J0Zm9saW8nKTtcbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBwcm92aWRlZFxuICAgIGlmIChlbnZEaXIpIHtcbiAgICAgIGlmICghcGF0aC5pc0Fic29sdXRlKGVudkRpcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdET0xMSE9VU0VfUE9SVEZPTElPX0RJUiBtdXN0IGJlIGFuIGFic29sdXRlIHBhdGgnKTtcbiAgICAgIH1cbiAgICAgIC8vIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmb3Igc3VzcGljaW91cyBwYXRoc1xuICAgICAgaWYgKGVudkRpci5pbmNsdWRlcygnLi4nKSB8fCBlbnZEaXIuc3RhcnRzV2l0aCgnL2V0YycpIHx8IGVudkRpci5zdGFydHNXaXRoKCcvc3lzJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdET0xMSE9VU0VfUE9SVEZPTElPX0RJUiBjb250YWlucyBzdXNwaWNpb3VzIHBhdGggc2VnbWVudHMnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgY29uZmlnIGRpcmVjdG9yeSBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWdEaXIgJiYgIXBhdGguaXNBYnNvbHV0ZShjb25maWdEaXIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvcnRmb2xpbyBjb25maWcgYmFzZURpciBtdXN0IGJlIGFuIGFic29sdXRlIHBhdGgnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXNlIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHNldCwgb3RoZXJ3aXNlIGNvbmZpZywgb3RoZXJ3aXNlIGRlZmF1bHRcbiAgICB0aGlzLmJhc2VEaXIgPSBlbnZEaXIgfHwgY29uZmlnRGlyIHx8IGRlZmF1bHREaXI7XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oYFtQb3J0Zm9saW9NYW5hZ2VyXSBQb3J0Zm9saW8gYmFzZSBkaXJlY3Rvcnk6ICR7dGhpcy5iYXNlRGlyfWApO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBiYXNlIHBvcnRmb2xpbyBkaXJlY3RvcnlcbiAgICovXG4gIHB1YmxpYyBnZXRCYXNlRGlyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZURpcjtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgZGlyZWN0b3J5IGZvciBhIHNwZWNpZmljIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgcHVibGljIGdldEVsZW1lbnREaXIodHlwZTogRWxlbWVudFR5cGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5iYXNlRGlyLCB0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciBhIHNwZWNpZmljIGVsZW1lbnQgdHlwZVxuICAgKiBGSVggKCMxMjEzKTogRXhwb3NlIEVMRU1FTlRfRklMRV9FWFRFTlNJT05TIG1hcHBpbmcgZm9yIGNvcnJlY3QgZXh0ZW5zaW9uIGRpc3BsYXlcbiAgICovXG4gIHB1YmxpYyBnZXRGaWxlRXh0ZW5zaW9uKHR5cGU6IEVsZW1lbnRUeXBlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRUxFTUVOVF9GSUxFX0VYVEVOU0lPTlNbdHlwZV0gfHwgREVGQVVMVF9FTEVNRU5UX0ZJTEVfRVhURU5TSU9OO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIHBvcnRmb2xpbyBkaXJlY3Rvcnkgc3RydWN0dXJlXG4gICAqIFVzZXMgbG9ja2luZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBkdXJpbmcgY29uY3VycmVudCBpbml0aWFsaXphdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gSWYgYWxyZWFkeSBpbml0aWFsaXppbmcsIHdhaXQgZm9yIHRoZSBleGlzdGluZyBpbml0aWFsaXphdGlvblxuICAgIGlmICh0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHBvcnRmb2xpbyBpcyBmdWxseSBpbml0aWFsaXplZCAoYmFzZSBkaXIgKyBhbGwgc3ViZGlyZWN0b3JpZXMgZXhpc3QpXG4gICAgaWYgKGF3YWl0IHRoaXMuaXNGdWxseUluaXRpYWxpemVkKCkpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW1BvcnRmb2xpb01hbmFnZXJdIFBvcnRmb2xpbyBhbHJlYWR5IGZ1bGx5IGluaXRpYWxpemVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGluaXRpYWxpemF0aW9uIHByb21pc2UgdG8gcHJldmVudCBjb25jdXJyZW50IGluaXRpYWxpemF0aW9uXG4gICAgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2UgPSB0aGlzLnBlcmZvcm1Jbml0aWFsaXphdGlvbigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBDbGVhciB0aGUgcHJvbWlzZSBhZnRlciBjb21wbGV0aW9uXG4gICAgICB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZSA9IG51bGw7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgYWN0dWFsIGluaXRpYWxpemF0aW9uIC0gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGVyZm9ybUluaXRpYWxpemF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKCdbUG9ydGZvbGlvTWFuYWdlcl0gSW5pdGlhbGl6aW5nIHBvcnRmb2xpbyBkaXJlY3Rvcnkgc3RydWN0dXJlJyk7XG4gICAgXG4gICAgLy8gQ3JlYXRlIGJhc2UgZGlyZWN0b3J5XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMuYmFzZURpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbjtcbiAgICAgIC8vIEluIHJlYWQtb25seSBlbnZpcm9ubWVudHMgKGxpa2UgRG9ja2VyKSwgd2UgY2FuJ3QgY3JlYXRlIGRpcmVjdG9yaWVzXG4gICAgICAvLyBMb2cgYnV0IGNvbnRpbnVlIC0gdGhlIHBvcnRmb2xpbyB3aWxsIGJlIGVtcHR5IGJ1dCBmdW5jdGlvbmFsXG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFQUNDRVMnIHx8IGVyci5jb2RlID09PSAnRVJPRlMnIHx8IGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIud2FybihgW1BvcnRmb2xpb01hbmFnZXJdIENhbm5vdCBjcmVhdGUgcG9ydGZvbGlvIGRpcmVjdG9yeSAocmVhZC1vbmx5IGVudmlyb25tZW50Pyk6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbRG9sbGhvdXNlTUNQXSBSdW5uaW5nIGluIHJlYWQtb25seSBtb2RlIC0gcG9ydGZvbGlvIGZlYXR1cmVzIGRpc2FibGVkYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBcbiAgICAvLyBDcmVhdGUgc3ViZGlyZWN0b3JpZXMgZm9yIGVhY2ggZWxlbWVudCB0eXBlXG4gICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgY29uc3QgZWxlbWVudERpciA9IHBhdGguam9pbih0aGlzLmJhc2VEaXIsIGVsZW1lbnRUeXBlKTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KGVsZW1lbnREaXIpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbUG9ydGZvbGlvTWFuYWdlcl0gQ3JlYXRlZCBkaXJlY3Rvcnk6ICR7ZWxlbWVudERpcn1gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIHNwZWNpYWwgZGlyZWN0b3JpZXMgZm9yIHN0YXRlZnVsIGVsZW1lbnRzXG4gICAgY29uc3QgYWdlbnRTdGF0ZURpciA9IHBhdGguam9pbih0aGlzLmJhc2VEaXIsIEVsZW1lbnRUeXBlLkFHRU5ULCAnLnN0YXRlJyk7XG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkoYWdlbnRTdGF0ZURpcik7XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ1tQb3J0Zm9saW9NYW5hZ2VyXSBQb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZSBpbml0aWFsaXplZCcpO1xuICAgIFxuICAgIC8vIE1pZ3JhdGlvbiBmb3IgdjEuNC4yIHVzZXJzOiByZW5hbWUgc2luZ3VsYXIgZGlyZWN0b3JpZXMgdG8gcGx1cmFsXG4gICAgYXdhaXQgdGhpcy5taWdyYXRlRnJvbVNpbmd1bGFyRGlyZWN0b3JpZXMoKTtcbiAgICBcbiAgICAvLyBQb3B1bGF0ZSB3aXRoIGRlZmF1bHQgZWxlbWVudHMgaWYgdGhpcyBpcyBhIG5ldyBpbnN0YWxsYXRpb25cbiAgICAvLyBTa2lwIGR1cmluZyB0ZXN0cyB0byBhdm9pZCBpbnRlcmZlcmVuY2VcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0Jykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFByb3ZpZGVyID0gbmV3IERlZmF1bHRFbGVtZW50UHJvdmlkZXIoKTtcbiAgICAgICAgYXdhaXQgZGVmYXVsdFByb3ZpZGVyLnBvcHVsYXRlRGVmYXVsdHModGhpcy5iYXNlRGlyKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignW1BvcnRmb2xpb01hbmFnZXJdIEVycm9yIHBvcHVsYXRpbmcgZGVmYXVsdCBlbGVtZW50czonLCBlcnJvcik7XG4gICAgICAgIC8vIExvZyB0byBzdGRlcnIgZm9yIE1DUCBjbGllbnQgdmlzaWJpbGl0eVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFtQb3J0Zm9saW9NYW5hZ2VyXSBDUklUSUNBTDogRmFpbGVkIHRvIHBvcHVsYXRlIGRlZmF1bHQgZWxlbWVudHM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICAvLyBDb250aW51ZSBhbnl3YXkgLSBlbXB0eSBwb3J0Zm9saW8gaXMgdmFsaWRcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwb3J0Zm9saW8gZGlyZWN0b3J5IGV4aXN0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4aXN0cygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHRoaXMuYmFzZURpcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHBvcnRmb2xpbyBpcyBmdWxseSBpbml0aWFsaXplZCAoYmFzZSBkaXIgKyBhbGwgc3ViZGlyZWN0b3JpZXMgZXhpc3QpXG4gICAqIFRoaXMgcHJldmVudHMgdGhlIGJ1ZyB3aGVyZSBiYXNlIGRpciBleGlzdHMgYnV0IHN1YmRpcmVjdG9yaWVzIHdlcmUgZGVsZXRlZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpc0Z1bGx5SW5pdGlhbGl6ZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gRmlyc3QgY2hlY2sgaWYgYmFzZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgaWYgKCFhd2FpdCB0aGlzLmV4aXN0cygpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYWxsIHJlcXVpcmVkIHN1YmRpcmVjdG9yaWVzIGV4aXN0XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudERpciA9IHBhdGguam9pbih0aGlzLmJhc2VEaXIsIGVsZW1lbnRUeXBlKTtcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhlbGVtZW50RGlyKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBzcGVjaWFsIGRpcmVjdG9yaWVzXG4gICAgICBjb25zdCBhZ2VudFN0YXRlRGlyID0gcGF0aC5qb2luKHRoaXMuYmFzZURpciwgRWxlbWVudFR5cGUuQUdFTlQsICcuc3RhdGUnKTtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHMoYWdlbnRTdGF0ZURpcikpIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZiBhbnkgc3ViZGlyZWN0b3J5IGlzIG1pc3NpbmcsIHBvcnRmb2xpbyBpcyBub3QgZnVsbHkgaW5pdGlhbGl6ZWRcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGZpbGVuYW1lIGFwcGVhcnMgdG8gYmUgYSB0ZXN0IGVsZW1lbnRcbiAgICogU0FGRVRZOiBQYXR0ZXJuLWJhc2VkIGZpbHRlcmluZyBvbmx5LCBubyBjb250ZW50IHBhcnNpbmdcbiAgICpcbiAgICogVGhpcyBtZXRob2QgSURFTlRJRklFUyB0ZXN0IHBhdHRlcm5zIChhbHdheXMgcmV0dXJucyB0cnVlIGZvciB0ZXN0IGZpbGVzKS5cbiAgICogVGhlIGFjdHVhbCBGSUxURVJJTkcgZGVjaXNpb24gKHdoZXRoZXIgdG8gZXhjbHVkZSB0aGVtKSBpcyBtYWRlIGluIGxpc3RFbGVtZW50cygpLlxuICAgKi9cbiAgcHVibGljIGlzVGVzdEVsZW1lbnQoZmlsZW5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIERhbmdlcm91cyB0ZXN0IHBhdHRlcm5zIHRoYXQgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiBwcm9kdWN0aW9uXG4gICAgY29uc3QgZGFuZ2Vyb3VzUGF0dGVybnMgPSBbXG4gICAgICAvXmJpbi1zaC9pLFxuICAgICAgL15ybS1yZi9pLFxuICAgICAgL15uYy1lLWJpbi9pLFxuICAgICAgL15weXRob24tYy1pbXBvcnQvaSxcbiAgICAgIC9eY3VybC4qZXZpbC9pLFxuICAgICAgL153Z2V0LiptYWxpY2lvdXMvaSxcbiAgICAgIC9eZXZhbC0vaSxcbiAgICAgIC9eZXhlYy0vaSxcbiAgICAgIC9eYmFzaC1jLS9pLFxuICAgICAgL15zaC1jLS9pLFxuICAgICAgL15wb3dlcnNoZWxsLS9pLFxuICAgICAgL15jbWQtYy0vaSxcbiAgICAgIC9zaGVsbC1pbmplY3Rpb24vaVxuICAgIF07XG5cbiAgICAvLyBOT1RFOiBUZXN0LXBhdHRlcm4gZmlsdGVyaW5nIHJlbW92ZWQgZW50aXJlbHkgKElzc3VlICMyODcpXG4gICAgLy8gVXNlcnMgY2FuIGxlZ2l0aW1hdGVseSBjcmVhdGUgZWxlbWVudHMgd2l0aCBcInRlc3RcIiBpbiB0aGUgbmFtZS5cbiAgICAvLyBPbmx5IGRhbmdlcm91cyBwYXR0ZXJucyAoc2VjdXJpdHkgY29uY2VybnMpIGFyZSBmaWx0ZXJlZC5cblxuICAgIC8vIENoZWNrIGRhbmdlcm91cyBwYXR0ZXJucyBvbmx5XG4gICAgaWYgKGRhbmdlcm91c1BhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBwYXR0ZXJuLnRlc3QoZmlsZW5hbWUpKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYFtQb3J0Zm9saW9NYW5hZ2VyXSBGaWx0ZXJlZCBkYW5nZXJvdXMgZWxlbWVudDogJHtmaWxlbmFtZX1gKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGFsbCBlbGVtZW50cyBvZiBhIHNwZWNpZmljIHR5cGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsaXN0RWxlbWVudHMoXG4gICAgdHlwZTogRWxlbWVudFR5cGUsXG4gICAgb3B0aW9uczogTGlzdEVsZW1lbnRzT3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBlbGVtZW50RGlyID0gdGhpcy5nZXRFbGVtZW50RGlyKHR5cGUpO1xuICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSBFTEVNRU5UX0ZJTEVfRVhURU5TSU9OU1t0eXBlXSB8fCBERUZBVUxUX0VMRU1FTlRfRklMRV9FWFRFTlNJT047XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3RvcnkoZWxlbWVudERpcik7XG4gICAgICAvLyBGaWx0ZXIgZm9yIGNvcnJlY3QgZmlsZSBleHRlbnNpb24gYmFzZWQgb24gZWxlbWVudCB0eXBlXG4gICAgICBsZXQgZmlsdGVyZWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUuZW5kc1dpdGgoZmlsZUV4dGVuc2lvbikpO1xuXG4gICAgICAvLyBJc3N1ZSAjNjU0OiBFeGNsdWRlIGJhY2t1cCBmaWxlcyBmcm9tIGFsbCBlbGVtZW50IHR5cGVzLlxuICAgICAgLy8gU2FmZXR5IG5ldCDigJQgTWVtb3J5U3RvcmFnZUxheWVyIGFsc28gZmlsdGVycywgYnV0IGFueSBjb2RlIHBhdGggdGhhdFxuICAgICAgLy8gY2FsbHMgbGlzdEVsZW1lbnRzKCkgZGlyZWN0bHkgc2hvdWxkIG5ldmVyIHJldHVybiBiYWNrdXAgYXJ0aWZhY3RzLlxuICAgICAgZmlsdGVyZWRGaWxlcyA9IGZpbHRlcmVkRmlsZXMuZmlsdGVyKGZpbGUgPT5cbiAgICAgICAgIWZpbGUuaW5jbHVkZXMoJy5iYWNrdXAtJykgJiYgIWZpbGUuaW5jbHVkZXMoJy5iYWNrdXAuJylcbiAgICAgICk7XG5cbiAgICAgIC8vIEZpbHRlciBvdXQgdGVzdC9kYW5nZXJvdXMgZWxlbWVudHMgdW5sZXNzIGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgICAgIC8vIERJU0FCTEVfRUxFTUVOVF9GSUxURVJJTkcgY2FuIGJlIHNldCBpbiBFMkUgdGVzdHMgdGhhdCBuZWVkIHRlc3QgZWxlbWVudHNcbiAgICAgIC8vIEludGVncmF0aW9uIHRlc3RzIGFuZCBwcm9kdWN0aW9uIGJvdGggdXNlIGZpbHRlcmluZyBieSBkZWZhdWx0XG4gICAgICBjb25zdCBzaG91bGRGaWx0ZXIgPSBwcm9jZXNzLmVudi5ESVNBQkxFX0VMRU1FTlRfRklMVEVSSU5HICE9PSAndHJ1ZSc7XG4gICAgICBpZiAoc2hvdWxkRmlsdGVyKSB7XG4gICAgICAgIGZpbHRlcmVkRmlsZXMgPSBmaWx0ZXJlZEZpbGVzLmZpbHRlcihmaWxlID0+ICF0aGlzLmlzVGVzdEVsZW1lbnQoZmlsZSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsdGVyZWRGaWxlcztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uO1xuICAgICAgXG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnRocm93T25GaWxlc3lzdGVtRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEaXJlY3RvcnkgZG9lc24ndCBleGlzdCB5ZXQgLSB0aGlzIGlzIGV4cGVjdGVkIGZvciBuZXcgaW5zdGFsbGF0aW9uc1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtQb3J0Zm9saW9NYW5hZ2VyXSBFbGVtZW50IGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IHlldDogJHtlbGVtZW50RGlyfWApO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VBQ0NFUycgfHwgZXJyLmNvZGUgPT09ICdFUEVSTScpIHtcbiAgICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cycsIGVycm9yLCB7IGVsZW1lbnREaXIgfSk7XG4gICAgICAgIGlmIChvcHRpb25zLnRocm93T25GaWxlc3lzdGVtRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBQZXJtaXNzaW9uIGRlbmllZCAtIHByZXNlcnZlIHRoZSBsZWdhY3kgYmVzdC1lZmZvcnQgbGlzdGluZyBiZWhhdmlvclxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmIChlcnIuY29kZSA9PT0gJ0VOT1RESVInKSB7XG4gICAgICAgIC8vIFBhdGggZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnlcbiAgICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cycsIGVycm9yLCB7IGVsZW1lbnREaXIgfSk7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgUGF0aCBpcyBub3QgYSBkaXJlY3Rvcnk6ICR7ZWxlbWVudERpcn1gLCBFcnJvckNhdGVnb3J5LlNZU1RFTV9FUlJPUik7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZvciBhbnkgb3RoZXIgZXJyb3JzLCB0aHJvdyB3aXRoIGNvbnRleHRcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignUG9ydGZvbGlvTWFuYWdlci5saXN0RWxlbWVudHMnLCBlcnJvciwgeyBlbGVtZW50RGlyIH0pO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgJ0ZhaWxlZCB0byBsaXN0IGVsZW1lbnRzJywgRXJyb3JDYXRlZ29yeS5TWVNURU1fRVJST1IpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBmdWxsIHBhdGggdG8gYW4gZWxlbWVudCBmaWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0RWxlbWVudFBhdGgodHlwZTogRWxlbWVudFR5cGUsIGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFZhbGlkYXRlIGZpbGVuYW1lIHRvIHByZXZlbnQgcGF0aCB0cmF2ZXJzYWxcbiAgICBpZiAoIWZpbGVuYW1lIHx8IHR5cGVvZiBmaWxlbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudFBhdGgnLFxuICAgICAgICBkZXRhaWxzOiBgSW52YWxpZCBmaWxlbmFtZSBwcm92aWRlZDogJHt0eXBlb2YgZmlsZW5hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZWxlbWVudFR5cGU6IHR5cGUsIGZpbGVuYW1lOiBTdHJpbmcoZmlsZW5hbWUpIH1cbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZpbGVuYW1lOiBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdHNcbiAgICBpZiAoZmlsZW5hbWUuaW5jbHVkZXMoJy4uJykgfHwgZmlsZW5hbWUuaW5jbHVkZXMoJy8nKSB8fCBmaWxlbmFtZS5pbmNsdWRlcygnXFxcXCcpIHx8IHBhdGguaXNBYnNvbHV0ZShmaWxlbmFtZSkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdQb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnRQYXRoJyxcbiAgICAgICAgZGV0YWlsczogYFBhdGggdHJhdmVyc2FsIGF0dGVtcHQgZGV0ZWN0ZWQgaW4gZmlsZW5hbWU6ICR7ZmlsZW5hbWV9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgZWxlbWVudFR5cGU6IHR5cGUsIGZpbGVuYW1lIH1cbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpbGVuYW1lOiBjb250YWlucyBwYXRoIHRyYXZlcnNhbCBjaGFyYWN0ZXJzOiAke2ZpbGVuYW1lfWApO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGRpdGlvbmFsIHZhbGlkYXRpb24gZm9yIGhpZGRlbiBmaWxlcyBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoJy4nKSB8fCBmaWxlbmFtZS5pbmNsdWRlcygnXFwwJykpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudFBhdGgnLFxuICAgICAgICBkZXRhaWxzOiBgSW52YWxpZCBmaWxlbmFtZSBjaGFyYWN0ZXJzIGRldGVjdGVkOiAke2ZpbGVuYW1lfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGVsZW1lbnRUeXBlOiB0eXBlLCBmaWxlbmFtZSwgaGFzSGlkZGVuRmlsZTogZmlsZW5hbWUuc3RhcnRzV2l0aCgnLicpLCBoYXNOdWxsQnl0ZTogZmlsZW5hbWUuaW5jbHVkZXMoJ1xcMCcpIH1cbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpbGVuYW1lOiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnM6ICR7ZmlsZW5hbWV9YCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBmaWxlbmFtZSBlbmRzIHdpdGggLm1kXG4gICAgY29uc3Qgc2FmZUZpbGVuYW1lID0gZmlsZW5hbWUuZW5kc1dpdGgoJy5tZCcpID8gZmlsZW5hbWUgOiBgJHtmaWxlbmFtZX0ubWRgO1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5nZXRFbGVtZW50RGlyKHR5cGUpLCBzYWZlRmlsZW5hbWUpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gZWxlbWVudCBleGlzdHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbGVtZW50RXhpc3RzKHR5cGU6IEVsZW1lbnRUeXBlLCBmaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyh0aGlzLmdldEVsZW1lbnRQYXRoKHR5cGUsIGZpbGVuYW1lKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGxlZ2FjeSBwZXJzb25hcyBkaXJlY3RvcnkgcGF0aCAoZm9yIG1pZ3JhdGlvbilcbiAgICovXG4gIHB1YmxpYyBnZXRMZWdhY3lQZXJzb25hc0RpcigpOiBzdHJpbmcge1xuICAgIHJldHVybiBwYXRoLmpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICdwZXJzb25hcycpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgbGVnYWN5IHBlcnNvbmFzIGRpcmVjdG9yeSBleGlzdHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBoYXNMZWdhY3lQZXJzb25hcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbGVnYWN5RGlyID0gdGhpcy5nZXRMZWdhY3lQZXJzb25hc0RpcigpO1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhsZWdhY3lEaXIpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShsZWdhY3lEaXIpO1xuICAgICAgcmV0dXJuIGZpbGVzLnNvbWUoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKCcubWQnKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHBvcnRmb2xpbyBzdGF0aXN0aWNzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3RhdGlzdGljcygpOiBQcm9taXNlPFJlY29yZDxFbGVtZW50VHlwZSwgbnVtYmVyPj4ge1xuICAgIGNvbnN0IHN0YXRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgXG4gICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmxpc3RFbGVtZW50cyhlbGVtZW50VHlwZSk7XG4gICAgICBzdGF0c1tlbGVtZW50VHlwZV0gPSBlbGVtZW50cy5sZW5ndGg7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzdGF0cyBhcyBSZWNvcmQ8RWxlbWVudFR5cGUsIG51bWJlcj47XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBNaWdyYXRlIGZyb20gdjEuNC4yIHNpbmd1bGFyIGRpcmVjdG9yeSBuYW1lcyB0byB2MS40LjMgcGx1cmFsIG5hbWVzXG4gICAqIFRoaXMgaGFuZGxlcyB0aGUgdXBncmFkZSBwYXRoIGZvciBleGlzdGluZyB1c2Vyc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtaWdyYXRlRnJvbVNpbmd1bGFyRGlyZWN0b3JpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb2xkVG9OZXc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAncGVyc29uYSc6ICdwZXJzb25hcycsXG4gICAgICAnc2tpbGwnOiAnc2tpbGxzJyxcbiAgICAgICd0ZW1wbGF0ZSc6ICd0ZW1wbGF0ZXMnLFxuICAgICAgJ2FnZW50JzogJ2FnZW50cycsXG4gICAgICAnbWVtb3J5JzogJ21lbW9yaWVzJyxcbiAgICAgICdlbnNlbWJsZSc6ICdlbnNlbWJsZXMnXG4gICAgfTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IFtvbGROYW1lLCBuZXdOYW1lXSBvZiBPYmplY3QuZW50cmllcyhvbGRUb05ldykpIHtcbiAgICAgIC8vIFVuaWNvZGUgbm9ybWFsaXplIHRoZSBkaXJlY3RvcnkgbmFtZXMgKGV2ZW4gdGhvdWdoIHRoZXkncmUgaGFyZGNvZGVkLCBmb3Igc2VjdXJpdHkgYXVkaXQpXG4gICAgICBjb25zdCBub3JtYWxpemVkT2xkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUob2xkTmFtZSk7XG4gICAgICBjb25zdCBub3JtYWxpemVkTmV3ID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmV3TmFtZSk7XG4gICAgICBcbiAgICAgIGlmICghbm9ybWFsaXplZE9sZC5pc1ZhbGlkIHx8ICFub3JtYWxpemVkTmV3LmlzVmFsaWQpIHtcbiAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIHdpdGggb3VyIGhhcmRjb2RlZCB2YWx1ZXMsIGJ1dCBmb3IgY29tcGxldGVuZXNzXG4gICAgICAgIGxvZ2dlci5lcnJvcihgW1BvcnRmb2xpb01hbmFnZXJdIEludmFsaWQgVW5pY29kZSBpbiBkaXJlY3RvcnkgbmFtZXMgZHVyaW5nIG1pZ3JhdGlvbmApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3Qgb2xkRGlyID0gcGF0aC5qb2luKHRoaXMuYmFzZURpciwgbm9ybWFsaXplZE9sZC5ub3JtYWxpemVkQ29udGVudCk7XG4gICAgICBjb25zdCBuZXdEaXIgPSBwYXRoLmpvaW4odGhpcy5iYXNlRGlyLCBub3JtYWxpemVkTmV3Lm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgb2xkIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhvbGREaXIpKSBjb250aW51ZTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIG5ldyBkaXJlY3RvcnkgYWxyZWFkeSBoYXMgY29udGVudFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhuZXdEaXIpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdEaXJGaWxlcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShuZXdEaXIpO1xuICAgICAgICAgICAgaWYgKG5ld0RpckZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgYFtQb3J0Zm9saW9NYW5hZ2VyXSBCb3RoICR7b2xkTmFtZX0gYW5kICR7bmV3TmFtZX0gZGlyZWN0b3JpZXMgZXhpc3QuIEtlZXBpbmcgJHtuZXdOYW1lfSwgc2tpcHBpbmcgbWlncmF0aW9uLmAsXG4gICAgICAgICAgICAgICAgeyBvbGREaXIsIG5ld0RpciwgZmlsZUNvdW50OiBuZXdEaXJGaWxlcy5sZW5ndGggfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIE5ldyBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCBvciBpcyBlbXB0eSwgcHJvY2VlZCB3aXRoIG1pZ3JhdGlvblxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQZXJmb3JtIHRoZSBtaWdyYXRpb25cbiAgICAgICAgbG9nZ2VyLmluZm8oYFtQb3J0Zm9saW9NYW5hZ2VyXSBNaWdyYXRpbmcgJHtvbGROYW1lfSDihpIgJHtuZXdOYW1lfWApO1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlbmFtZUZpbGUob2xkRGlyLCBuZXdEaXIpO1xuICAgICAgICBcbiAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBhdWRpdCB0cmFpbFxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0RJUkVDVE9SWV9NSUdSQVRJT04nLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdQb3J0Zm9saW9NYW5hZ2VyLm1pZ3JhdGVGcm9tU2luZ3VsYXJEaXJlY3RvcmllcycsXG4gICAgICAgICAgZGV0YWlsczogYE1pZ3JhdGVkIGRpcmVjdG9yeSBmcm9tICR7b2xkTmFtZX0gdG8gJHtuZXdOYW1lfSBmb3IgdjEuNC4zIGNvbXBhdGliaWxpdHlgLFxuICAgICAgICAgIG1ldGFkYXRhOiB7IG9sZERpciwgbmV3RGlyIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gT2xkIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgW1BvcnRmb2xpb01hbmFnZXJdIEVycm9yIGR1cmluZyBtaWdyYXRpb24gb2YgJHtvbGROYW1lfTpgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -33,6 +33,7 @@ export interface ContentValidatorOptions {
33
33
  */
34
34
  contentContext?: 'persona' | 'skill' | 'template' | 'agent' | 'memory';
35
35
  }
36
+ export declare const MALICIOUS_YAML_CONTENT_PATTERN = "Malicious YAML content pattern";
36
37
  export declare class ContentValidator {
37
38
  /**
38
39
  * SHA-256 hashes of bundled data/ elements verified against HASHES.json at seed time.
@@ -133,6 +134,11 @@ export declare class ContentValidator {
133
134
  * A pre-check with generous multiplier prevents DoS from huge payloads.
134
135
  */
135
136
  static validateAndSanitize(content: string, options?: ContentValidatorOptions): ContentValidationResult;
137
+ /**
138
+ * Apply the prompt-injection scanner and the complete YAML content-pattern
139
+ * scanner to prose that may later cross a trusted output boundary.
140
+ */
141
+ static validateAndSanitizeYamlAware(content: string, options?: ContentValidatorOptions): ContentValidationResult;
136
142
  /**
137
143
  * Validates YAML frontmatter for malicious content
138
144
  * SECURITY FIX #364: Added YAML bomb detection to prevent denial of service
@@ -146,7 +152,9 @@ export declare class ContentValidator {
146
152
  * MALICIOUS_YAML_PATTERNS scan below is bounded by MAX_CONTENT_LENGTH, so
147
153
  * larger content is rejected here rather than scanned or thrown on.
148
154
  */
149
- static validateYamlContent(yamlContent: string, maxLength?: number): boolean;
155
+ static validateYamlContent(yamlContent: string, maxLength?: number, options?: {
156
+ detectContentPatterns?: boolean;
157
+ }): boolean;
150
158
  /**
151
159
  * SECURITY FIX #364: Check for YAML bombs before other validation.
152
160
  * SECURITY FIX (PR #552 review): Uses RegexValidator for ReDoS protection.
@@ -1 +1 @@
1
- {"version":3,"file":"contentValidator.d.ts","sourceRoot":"","sources":["../../src/security/contentValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAG1E,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;CACxE;AAED,qBAAa,gBAAgB;IAC3B;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAqB;IAEjE,8DAA8D;IAC9D,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAInD,4EAA4E;IAC5E,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMjD,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAsC;WAEzD,0BAA0B,CAAC,QAAQ,EAAE,MAAM,iBAAiB,GAAG,SAAS,GAAG,IAAI;IAI7F,OAAO,CAAC,MAAM,CAAC,YAAY;IAO3B;;;;;;;;;;;OAWG;IAIH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAwExC;IAKF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAcxC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAkF7C;IAEF;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAOzC;IAEH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAK5C;IAEH;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAc1C;IAEH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAI1C;IAEH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAuCtC;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAiErC;;;;;;;;OAQG;IACH,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,uBAAuB;IAiF3G;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,GAAE,MAAwC,GAAG,OAAO;IAyC7G;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAqCjC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,8BAA8B;IAyB7C;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAyBtC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,2BAA2B;IA0B1C,gEAAgE;IAChE,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAqBtC;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,uBAAuB;IA2C/D;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAkCvD"}
1
+ {"version":3,"file":"contentValidator.d.ts","sourceRoot":"","sources":["../../src/security/contentValidator.ts"],"names":[],"mappings":"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"}