@dollhousemcp/mcp-server 2.0.32 → 2.0.35

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 (33) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cli/convert.js +9 -8
  3. package/dist/converters/DollhouseToAnthropicConverter.js +8 -8
  4. package/dist/elements/agents/AgentManager.js +2 -2
  5. package/dist/elements/skills/Skill.d.ts.map +1 -1
  6. package/dist/elements/skills/Skill.js +2 -2
  7. package/dist/elements/templates/Template.d.ts.map +1 -1
  8. package/dist/elements/templates/Template.js +15 -2
  9. package/dist/elements/templates/TemplateManager.js +3 -3
  10. package/dist/generated/version.d.ts +2 -2
  11. package/dist/generated/version.js +3 -3
  12. package/dist/handlers/element-crud/createElement.d.ts.map +1 -1
  13. package/dist/handlers/element-crud/createElement.js +10 -2
  14. package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
  15. package/dist/handlers/element-crud/editElement.js +61 -5
  16. package/dist/security/constants.d.ts +1 -0
  17. package/dist/security/constants.d.ts.map +1 -1
  18. package/dist/security/constants.js +2 -1
  19. package/dist/security/secureYamlParser.js +2 -2
  20. package/dist/services/validation/AgentElementValidator.d.ts.map +1 -1
  21. package/dist/services/validation/AgentElementValidator.js +3 -2
  22. package/dist/services/validation/GenericElementValidator.d.ts +1 -0
  23. package/dist/services/validation/GenericElementValidator.d.ts.map +1 -1
  24. package/dist/services/validation/GenericElementValidator.js +14 -6
  25. package/dist/utils/pathSecurity.d.ts +7 -0
  26. package/dist/utils/pathSecurity.d.ts.map +1 -0
  27. package/dist/utils/pathSecurity.js +30 -0
  28. package/dist/web/public/index.html +1 -1
  29. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  30. package/dist/web/routes/permissionRoutes.js +48 -11
  31. package/package.json +21 -5
  32. package/scripts/pretooluse-dollhouse.sh +23 -4
  33. package/server.json +2 -2
@@ -336,11 +336,12 @@ export class GenericElementValidator {
336
336
  if (typeof description !== 'string') {
337
337
  return ValidatorHelpers.fail(["Description must be a string"]);
338
338
  }
339
- const result = this.validationService.validateAndSanitizeInput(description, {
340
- maxLength: SECURITY_LIMITS.MAX_DESCRIPTION_LENGTH,
341
- allowSpaces: true,
342
- fieldType: 'description'
343
- });
339
+ if (description.length > SECURITY_LIMITS.MAX_DESCRIPTION_LENGTH) {
340
+ return ValidatorHelpers.fail([
341
+ `Description exceeds maximum length of ${SECURITY_LIMITS.MAX_DESCRIPTION_LENGTH} characters`
342
+ ]);
343
+ }
344
+ const result = this.sanitizeDescriptionInput(description);
344
345
  if (!result.isValid) {
345
346
  return ValidatorHelpers.fail(result.errors || ['Invalid description']);
346
347
  }
@@ -353,6 +354,13 @@ export class GenericElementValidator {
353
354
  warnings
354
355
  };
355
356
  }
357
+ sanitizeDescriptionInput(description) {
358
+ return this.validationService.validateAndSanitizeInput(description, {
359
+ maxLength: SECURITY_LIMITS.MAX_DESCRIPTION_LENGTH,
360
+ allowSpaces: true,
361
+ fieldType: 'description'
362
+ });
363
+ }
356
364
  /**
357
365
  * Validate element content
358
366
  */
@@ -473,4 +481,4 @@ export class GenericElementValidator {
473
481
  return labels[this.elementType] || this.elementType;
474
482
  }
475
483
  }
476
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VuZXJpY0VsZW1lbnRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdmFsaWRhdGlvbi9HZW5lcmljRWxlbWVudFZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFJdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBTUwsZ0JBQWdCLEVBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0I7O0dBRUc7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBS3RCO0lBQ0E7SUFDQTtJQU5ILFdBQVcsQ0FBYztJQUVsQyxZQUNFLFdBQXdCLEVBQ2QsaUJBQW9DLEVBQ3BDLHdCQUFrRCxFQUNsRCxlQUFnQztRQUZoQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBRTFDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQ2xCLElBQWEsRUFDYixPQUFrQztRQUVsQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztRQUVqQyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCw0REFB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Q0FBQyxFQUFFLE9BQU87WUFDNUIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUTtZQUM5QixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVO1NBQ25DLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN0RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyaWNFbGVtZW50VmFsaWRhdG9yIC0gRGVmYXVsdCB2YWxpZGF0b3IgaW1wbGVtZW50YXRpb24gZm9yIG1vc3QgZWxlbWVudCB0eXBlc1xuICpcbiAqIFByb3ZpZGVzIHN0YW5kYXJkIHZhbGlkYXRpb24gbG9naWMgdGhhdCB3b3JrcyBmb3IgYW55IGVsZW1lbnQgdHlwZS5cbiAqIFVzZXMgdGhlIGV4aXN0aW5nIFZhbGlkYXRpb25TZXJ2aWNlIGFuZCBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgZm9yXG4gKiBjb25zaXN0ZW50IHNlY3VyaXR5LWZpcnN0IHZhbGlkYXRpb24gcGF0dGVybnMuXG4gKlxuICogRWxlbWVudCB0eXBlcyB0aGF0IG5lZWQgc3BlY2lhbGl6ZWQgdmFsaWRhdGlvbiAobGlrZSBwZXJzb25hcykgY2FuXG4gKiBleHRlbmQgdGhpcyBjbGFzcyBvciBpbXBsZW1lbnQgRWxlbWVudFZhbGlkYXRvciBkaXJlY3RseS5cbiAqL1xuXG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4vVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9UcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBJbnB1dE5vcm1hbGl6ZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dE5vcm1hbGl6ZXIuanMnO1xuaW1wb3J0IHtcbiAgRWxlbWVudFZhbGlkYXRvcixcbiAgVmFsaWRhdGlvblJlc3VsdCxcbiAgVmFsaWRhdGlvblJlcG9ydCxcbiAgRWxlbWVudFZhbGlkYXRpb25PcHRpb25zLFxuICBNZXRhZGF0YVZhbGlkYXRpb25PcHRpb25zLFxuICBWYWxpZGF0b3JIZWxwZXJzXG59IGZyb20gJy4vRWxlbWVudFZhbGlkYXRvci5qcyc7XG5cbi8qKlxuICogRGVmYXVsdCB2YWxpZGF0b3IgaW1wbGVtZW50YXRpb24gZm9yIG1vc3QgZWxlbWVudCB0eXBlc1xuICovXG5leHBvcnQgY2xhc3MgR2VuZXJpY0VsZW1lbnRWYWxpZGF0b3IgaW1wbGVtZW50cyBFbGVtZW50VmFsaWRhdG9yIHtcbiAgcmVhZG9ubHkgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSxcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlLFxuICAgIHByb3RlY3RlZCB0cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U6IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGRhdGEgZm9yIGVsZW1lbnQgY3JlYXRpb25cbiAgICpcbiAgICogQVJDSElURUNUVVJFOiBJbnB1dCBOb3JtYWxpemF0aW9uIGF0IEJvdW5kYXJ5XG4gICAqIFN0ZXAgMTogTm9ybWFsaXplIEFMTCBzdHJpbmcgZmllbGRzIChVbmljb2RlLCBjb25mdXNhYmxlcywgZGlyZWN0aW9uIG92ZXJyaWRlcylcbiAgICogU3RlcCAyOiBWYWxpZGF0ZSB0aGUgbm9ybWFsaXplZCBkYXRhIChmaWVsZCBydWxlcywgbGVuZ3RocywgcGF0dGVybnMpXG4gICAqXG4gICAqIFRoaXMgZW5zdXJlcyB3ZSBjYW4ndCBmb3JnZXQgdG8gbm9ybWFsaXplIGEgZmllbGQgLSBpdCBoYXBwZW5zIG9uY2UgYXQgZW50cnkuXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZUNyZWF0ZShcbiAgICBkYXRhOiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBFbGVtZW50VmFsaWRhdGlvbk9wdGlvbnNcbiAgKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbJ0RhdGEgbXVzdCBiZSBhIG5vbi1udWxsIG9iamVjdCddKTtcbiAgICB9XG5cbiAgICAvLyBTVEVQIDE6IE5PUk1BTElaRSBhdCB0aGUgYm91bmRhcnkgKGJlZm9yZSBhbnkgdmFsaWRhdGlvbilcbiAgICBjb25zdCBub3JtYWxpemVkID0gSW5wdXROb3JtYWxpemVyLm5vcm1hbGl6ZShkYXRhKTtcblxuICAgIC8vIEZhaWwgZmFzdCBpZiBoaWdoIG9yIGNyaXRpY2FsIFVuaWNvZGUgaXNzdWVzIGRldGVjdGVkXG4gICAgaWYgKG5vcm1hbGl6ZWQuaGFzSGlnaE9yQ3JpdGljYWxJc3N1ZXMpIHtcbiAgICAgIHJldHVybiBWYWxpZGF0b3JIZWxwZXJzLmZhaWwobm9ybWFsaXplZC5lcnJvcnMpO1xuICAgIH1cblxuICAgIC8vIEFkZCBub3JtYWxpemF0aW9uIHdhcm5pbmdzIHRvIHJlc3VsdHNcbiAgICB3YXJuaW5ncy5wdXNoKC4uLm5vcm1hbGl6ZWQud2FybmluZ3MpO1xuXG4gICAgLy8gU1RFUCAyOiBWQUxJREFURSB0aGUgbm9ybWFsaXplZCBkYXRhXG4gICAgY29uc3QgcmVjb3JkID0gbm9ybWFsaXplZC5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgLy8gVmFsaWRhdGUgbmFtZVxuICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRlTmFtZShyZWNvcmQubmFtZSk7XG4gICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIGVycm9ycy5wdXNoKC4uLm5hbWVSZXN1bHQuZXJyb3JzKTtcbiAgICB9XG4gICAgd2FybmluZ3MucHVzaCguLi5uYW1lUmVzdWx0Lndhcm5pbmdzKTtcblxuICAgIC8vIFZhbGlkYXRlIGRlc2NyaXB0aW9uXG4gICAgY29uc3QgZGVzY1Jlc3VsdCA9IHRoaXMudmFsaWRhdGVEZXNjcmlwdGlvbihyZWNvcmQuZGVzY3JpcHRpb24pO1xuICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICBlcnJvcnMucHVzaCguLi5kZXNjUmVzdWx0LmVycm9ycyk7XG4gICAgfVxuICAgIHdhcm5pbmdzLnB1c2goLi4uZGVzY1Jlc3VsdC53YXJuaW5ncyk7XG5cbiAgICAvLyBWYWxpZGF0ZSBjb250ZW50IGlmIHByZXNlbnRcbiAgICBpZiAocmVjb3JkLmNvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhb3B0aW9ucz8uc2tpcENvbnRlbnRWYWxpZGF0aW9uKSB7XG4gICAgICBjb25zdCBjb250ZW50UmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZUNvbnRlbnQoXG4gICAgICAgIHJlY29yZC5jb250ZW50LFxuICAgICAgICBvcHRpb25zPy5tYXhDb250ZW50TGVuZ3RoXG4gICAgICApO1xuICAgICAgaWYgKCFjb250ZW50UmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4uY29udGVudFJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3MucHVzaCguLi5jb250ZW50UmVzdWx0Lndhcm5pbmdzKTtcbiAgICB9XG5cbiAgICAvLyBGaXggIzkwODogVmFsaWRhdGUgaW5zdHJ1Y3Rpb25zIGZpZWxkIOKAlCBwcmV2aW91c2x5IG9ubHkgY29udGVudCB3YXMgY2hlY2tlZCxcbiAgICAvLyBhbGxvd2luZyBpbmplY3Rpb24gcGF5bG9hZHMgaW4gaW5zdHJ1Y3Rpb25zIHRvIHJlYWNoIGRpc2sgdW5zY2FubmVkLlxuICAgIGlmIChyZWNvcmQuaW5zdHJ1Y3Rpb25zICE9PSB1bmRlZmluZWQgJiYgIW9wdGlvbnM/LnNraXBDb250ZW50VmFsaWRhdGlvbikge1xuICAgICAgY29uc3QgaW5zdHJSZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlQ29udGVudChcbiAgICAgICAgcmVjb3JkLmluc3RydWN0aW9ucyxcbiAgICAgICAgb3B0aW9ucz8ubWF4Q29udGVudExlbmd0aFxuICAgICAgKTtcbiAgICAgIGlmICghaW5zdHJSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICBlcnJvcnMucHVzaCguLi5pbnN0clJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3MucHVzaCguLi5pbnN0clJlc3VsdC53YXJuaW5ncyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdHJpZ2dlcnMgaWYgcHJlc2VudFxuICAgIGlmIChyZWNvcmQudHJpZ2dlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdHJpZ2dlclJlc3VsdCA9IHRoaXMudmFsaWRhdGVUcmlnZ2VycyhcbiAgICAgICAgcmVjb3JkLnRyaWdnZXJzLFxuICAgICAgICBTdHJpbmcocmVjb3JkLm5hbWUgfHwgJ3Vua25vd24nKVxuICAgICAgKTtcbiAgICAgIGlmICghdHJpZ2dlclJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKC4uLnRyaWdnZXJSZXN1bHQuZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIHdhcm5pbmdzLnB1c2goLi4udHJpZ2dlclJlc3VsdC53YXJuaW5ncyk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHN1Z2dlc3Rpb25zIGZvciBtaXNzaW5nIG9wdGlvbmFsIGZpZWxkc1xuICAgIGlmICghcmVjb3JkLnRyaWdnZXJzIHx8IChBcnJheS5pc0FycmF5KHJlY29yZC50cmlnZ2VycykgJiYgcmVjb3JkLnRyaWdnZXJzLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goJ0FkZCB0cmlnZ2VyIGtleXdvcmRzIHRvIGltcHJvdmUgZGlzY292ZXJhYmlsaXR5Jyk7XG4gICAgfVxuICAgIGlmICghcmVjb3JkLmF1dGhvcikge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaCgnQWRkIGFuIGF1dGhvciBmaWVsZCBmb3IgcHJvcGVyIGF0dHJpYnV0aW9uJyk7XG4gICAgfVxuICAgIGlmICghcmVjb3JkLnZlcnNpb24pIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goJ0FkZCBhIHZlcnNpb24gbnVtYmVyIGZvciB0cmFja2luZyB1cGRhdGVzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzVmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsXG4gICAgICBlcnJvcnMsXG4gICAgICB3YXJuaW5ncyxcbiAgICAgIHN1Z2dlc3Rpb25zOiBzdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gc3VnZ2VzdGlvbnMgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGNoYW5nZXMgdG8gYW4gZXhpc3RpbmcgZWxlbWVudFxuICAgKlxuICAgKiBBUkNISVRFQ1RVUkU6IElucHV0IE5vcm1hbGl6YXRpb24gYXQgQm91bmRhcnlcbiAgICogU3RlcCAxOiBOb3JtYWxpemUgQUxMIHN0cmluZyBmaWVsZHMgaW4gY2hhbmdlcyBvYmplY3RcbiAgICogU3RlcCAyOiBWYWxpZGF0ZSB0aGUgbm9ybWFsaXplZCBjaGFuZ2VzXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZUVkaXQoXG4gICAgZWxlbWVudDogdW5rbm93bixcbiAgICBjaGFuZ2VzOiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBFbGVtZW50VmFsaWRhdGlvbk9wdGlvbnNcbiAgKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKCFlbGVtZW50IHx8IHR5cGVvZiBlbGVtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbJ0VsZW1lbnQgbXVzdCBiZSBhIG5vbi1udWxsIG9iamVjdCddKTtcbiAgICB9XG5cbiAgICBpZiAoIWNoYW5nZXMgfHwgdHlwZW9mIGNoYW5nZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gVmFsaWRhdG9ySGVscGVycy5mYWlsKFsnQ2hhbmdlcyBtdXN0IGJlIGEgbm9uLW51bGwgb2JqZWN0J10pO1xuICAgIH1cblxuICAgIC8vIFNURVAgMTogTk9STUFMSVpFIGNoYW5nZXMgYXQgdGhlIGJvdW5kYXJ5XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IElucHV0Tm9ybWFsaXplci5ub3JtYWxpemUoY2hhbmdlcyk7XG5cbiAgICAvLyBGYWlsIGZhc3QgaWYgaGlnaCBvciBjcml0aWNhbCBVbmljb2RlIGlzc3VlcyBkZXRlY3RlZFxuICAgIGlmIChub3JtYWxpemVkLmhhc0hpZ2hPckNyaXRpY2FsSXNzdWVzKSB7XG4gICAgICByZXR1cm4gVmFsaWRhdG9ySGVscGVycy5mYWlsKG5vcm1hbGl6ZWQuZXJyb3JzKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgbm9ybWFsaXphdGlvbiB3YXJuaW5ncyB0byByZXN1bHRzXG4gICAgd2FybmluZ3MucHVzaCguLi5ub3JtYWxpemVkLndhcm5pbmdzKTtcblxuICAgIC8vIFNURVAgMjogVkFMSURBVEUgdGhlIG5vcm1hbGl6ZWQgY2hhbmdlc1xuICAgIGNvbnN0IGNoYW5nZVJlY29yZCA9IG5vcm1hbGl6ZWQuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggY2hhbmdlZCBmaWVsZFxuICAgIGlmIChjaGFuZ2VSZWNvcmQubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0ZU5hbWUoY2hhbmdlUmVjb3JkLm5hbWUpO1xuICAgICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4ubmFtZVJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3MucHVzaCguLi5uYW1lUmVzdWx0Lndhcm5pbmdzKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlUmVjb3JkLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGRlc2NSZXN1bHQgPSB0aGlzLnZhbGlkYXRlRGVzY3JpcHRpb24oY2hhbmdlUmVjb3JkLmRlc2NyaXB0aW9uKTtcbiAgICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKC4uLmRlc2NSZXN1bHQuZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIHdhcm5pbmdzLnB1c2goLi4uZGVzY1Jlc3VsdC53YXJuaW5ncyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZVJlY29yZC5jb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIW9wdGlvbnM/LnNraXBDb250ZW50VmFsaWRhdGlvbikge1xuICAgICAgY29uc3QgY29udGVudFJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGVDb250ZW50KFxuICAgICAgICBjaGFuZ2VSZWNvcmQuY29udGVudCxcbiAgICAgICAgb3B0aW9ucz8ubWF4Q29udGVudExlbmd0aFxuICAgICAgKTtcbiAgICAgIGlmICghY29udGVudFJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKC4uLmNvbnRlbnRSZXN1bHQuZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIHdhcm5pbmdzLnB1c2goLi4uY29udGVudFJlc3VsdC53YXJuaW5ncyk7XG4gICAgfVxuXG4gICAgLy8gRml4ICM5MDg6IFZhbGlkYXRlIGluc3RydWN0aW9ucyBvbiBlZGl0IHBhdGggKHNhbWUgZ2FwIGFzIHZhbGlkYXRlQ3JlYXRlKVxuICAgIGlmIChjaGFuZ2VSZWNvcmQuaW5zdHJ1Y3Rpb25zICE9PSB1bmRlZmluZWQgJiYgIW9wdGlvbnM/LnNraXBDb250ZW50VmFsaWRhdGlvbikge1xuICAgICAgY29uc3QgaW5zdHJSZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlQ29udGVudChcbiAgICAgICAgY2hhbmdlUmVjb3JkLmluc3RydWN0aW9ucyxcbiAgICAgICAgb3B0aW9ucz8ubWF4Q29udGVudExlbmd0aFxuICAgICAgKTtcbiAgICAgIGlmICghaW5zdHJSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICBlcnJvcnMucHVzaCguLi5pbnN0clJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3MucHVzaCguLi5pbnN0clJlc3VsdC53YXJuaW5ncyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZVJlY29yZC50cmlnZ2VycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlbGVtZW50UmVjb3JkID0gZWxlbWVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IHRyaWdnZXJSZXN1bHQgPSB0aGlzLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIGNoYW5nZVJlY29yZC50cmlnZ2VycyxcbiAgICAgICAgU3RyaW5nKGVsZW1lbnRSZWNvcmQubmFtZSB8fCBjaGFuZ2VSZWNvcmQubmFtZSB8fCAndW5rbm93bicpXG4gICAgICApO1xuICAgICAgaWYgKCF0cmlnZ2VyUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4udHJpZ2dlclJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3MucHVzaCguLi50cmlnZ2VyUmVzdWx0Lndhcm5pbmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZXJyb3JzLmxlbmd0aCA9PT0gMCxcbiAgICAgIGVycm9ycyxcbiAgICAgIHdhcm5pbmdzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBlbGVtZW50IG1ldGFkYXRhXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZU1ldGFkYXRhKFxuICAgIG1ldGFkYXRhOiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBNZXRhZGF0YVZhbGlkYXRpb25PcHRpb25zXG4gICk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICghbWV0YWRhdGEgfHwgdHlwZW9mIG1ldGFkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbJ01ldGFkYXRhIG11c3QgYmUgYSBub24tbnVsbCBvYmplY3QnXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3JkID0gbWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBDaGVjayByZXF1aXJlZCBmaWVsZHNcbiAgICBjb25zdCByZXF1aXJlZEZpZWxkcyA9IG9wdGlvbnM/LnJlcXVpcmVkRmllbGRzIHx8IFsnbmFtZSddO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgcmVxdWlyZWRGaWVsZHMpIHtcbiAgICAgIGlmICghcmVjb3JkW2ZpZWxkXSkge1xuICAgICAgICBlcnJvcnMucHVzaChgUmVxdWlyZWQgZmllbGQgJyR7ZmllbGR9JyBpcyBtaXNzaW5nIG9yIGVtcHR5YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZmllbGQgZm9ybWF0c1xuICAgIGlmIChvcHRpb25zPy5mb3JtYXRGaWVsZHMpIHtcbiAgICAgIGZvciAoY29uc3QgW2ZpZWxkLCBwYXR0ZXJuXSBvZiBPYmplY3QuZW50cmllcyhvcHRpb25zLmZvcm1hdEZpZWxkcykpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmRbZmllbGRdO1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhcGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGBGaWVsZCAnJHtmaWVsZH0nIGhhcyBpbnZhbGlkIGZvcm1hdGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWF4IGxlbmd0aHNcbiAgICBpZiAob3B0aW9ucz8ubWF4TGVuZ3Rocykge1xuICAgICAgZm9yIChjb25zdCBbZmllbGQsIG1heExlbmd0aF0gb2YgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5tYXhMZW5ndGhzKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFtmaWVsZF07XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGBGaWVsZCAnJHtmaWVsZH0nIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHttYXhMZW5ndGh9IGNoYXJhY3RlcnNgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0YW5kYXJkIGZpZWxkIHZhbGlkYXRpb25zXG4gICAgaWYgKHJlY29yZC5uYW1lKSB7XG4gICAgICBjb25zdCBuYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0ZU5hbWUocmVjb3JkLm5hbWUpO1xuICAgICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4ubmFtZVJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3MucHVzaCguLi5uYW1lUmVzdWx0Lndhcm5pbmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZXJyb3JzLmxlbmd0aCA9PT0gMCxcbiAgICAgIGVycm9ycyxcbiAgICAgIHdhcm5pbmdzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIGNvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiByZXBvcnRcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlUmVwb3J0KGVsZW1lbnQ6IHVua25vd24pOiBQcm9taXNlPFZhbGlkYXRpb25SZXBvcnQ+IHtcbiAgICBjb25zdCBkZXRhaWxzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBzdGF0dXM6ICdwYXNzJyB8ICdmYWlsJyB8ICd3YXJuaW5nJyA9ICdwYXNzJztcblxuICAgIGlmICghZWxlbWVudCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2ZhaWwnLFxuICAgICAgICBzdW1tYXJ5OiAnSW52YWxpZCBlbGVtZW50OiBtdXN0IGJlIGEgbm9uLW51bGwgb2JqZWN0JyxcbiAgICAgICAgZGV0YWlsczogWydFbGVtZW50IHZhbGlkYXRpb24gZmFpbGVkIC0gaW52YWxpZCBpbnB1dCB0eXBlJ10sXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNvcmQgPSBlbGVtZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG1ldGFkYXRhID0gKHJlY29yZC5tZXRhZGF0YSB8fCByZWNvcmQpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBTdHJpbmcocmVjb3JkLmNvbnRlbnQgfHwgcmVjb3JkLmluc3RydWN0aW9ucyB8fCAnJyk7XG5cbiAgICAvLyBWYWxpZGF0ZSBhbGwgZmllbGRzXG4gICAgY29uc3QgY3JlYXRlUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZUNyZWF0ZSh7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgY29udGVudCxcbiAgICAgIHRyaWdnZXJzOiBtZXRhZGF0YS50cmlnZ2VycyxcbiAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGEudmVyc2lvblxuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyB2YWxpZGF0aW9uIHJlc3VsdHNcbiAgICBpZiAoY3JlYXRlUmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBzdGF0dXMgPSAnZmFpbCc7XG4gICAgICBkZXRhaWxzLnB1c2goJ0Vycm9yczonKTtcbiAgICAgIGNyZWF0ZVJlc3VsdC5lcnJvcnMuZm9yRWFjaCgoZXJyb3IsIGkpID0+IHtcbiAgICAgICAgZGV0YWlscy5wdXNoKGAgICR7aSArIDF9LiAke2Vycm9yfWApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZVJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoc3RhdHVzID09PSAncGFzcycpIHtcbiAgICAgICAgc3RhdHVzID0gJ3dhcm5pbmcnO1xuICAgICAgfVxuICAgICAgZGV0YWlscy5wdXNoKCdXYXJuaW5nczonKTtcbiAgICAgIGNyZWF0ZVJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nLCBpKSA9PiB7XG4gICAgICAgIGRldGFpbHMucHVzaChgICAke2kgKyAxfS4gJHt3YXJuaW5nfWApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZVJlc3VsdC5zdWdnZXN0aW9ucyAmJiBjcmVhdGVSZXN1bHQuc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgZGV0YWlscy5wdXNoKCdTdWdnZXN0aW9uczonKTtcbiAgICAgIGNyZWF0ZVJlc3VsdC5zdWdnZXN0aW9ucy5mb3JFYWNoKChzdWdnZXN0aW9uLCBpKSA9PiB7XG4gICAgICAgIGRldGFpbHMucHVzaChgICAke2kgKyAxfS4gJHtzdWdnZXN0aW9ufWApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIG1ldHJpY3NcbiAgICBjb25zdCB0cmlnZ2VyQ291bnQgPSBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRyaWdnZXJzKSA/IG1ldGFkYXRhLnRyaWdnZXJzLmxlbmd0aCA6IDA7XG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IGNvbnRlbnQubGVuZ3RoO1xuXG4gICAgLy8gR2VuZXJhdGUgc3VtbWFyeVxuICAgIGxldCBzdW1tYXJ5OiBzdHJpbmc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ3Bhc3MnKSB7XG4gICAgICBzdW1tYXJ5ID0gYCR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gdmFsaWRhdGlvbiBwYXNzZWQgd2l0aCBubyBpc3N1ZXNgO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnd2FybmluZycpIHtcbiAgICAgIHN1bW1hcnkgPSBgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBpcyB2YWxpZCBidXQgaGFzICR7Y3JlYXRlUmVzdWx0Lndhcm5pbmdzLmxlbmd0aH0gd2FybmluZyhzKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1bW1hcnkgPSBgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSB2YWxpZGF0aW9uIGZhaWxlZCB3aXRoICR7Y3JlYXRlUmVzdWx0LmVycm9ycy5sZW5ndGh9IGVycm9yKHMpYDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzLFxuICAgICAgc3VtbWFyeSxcbiAgICAgIGRldGFpbHMsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBtZXRyaWNzOiB7XG4gICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgIHRyaWdnZXJDb3VudCxcbiAgICAgICAgcXVhbGl0eVNjb3JlOiB0aGlzLmNhbGN1bGF0ZVF1YWxpdHlTY29yZShtZXRhZGF0YSwgY29udGVudClcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGVsZW1lbnQgbmFtZVxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlTmFtZShuYW1lOiB1bmtub3duKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgaWYgKCFuYW1lIHx8IHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbXCJOYW1lIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGEgc3RyaW5nXCJdKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChuYW1lLCB7XG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTkFNRV9MRU5HVEgsXG4gICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgIGZpZWxkVHlwZTogJ25hbWUnXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gVmFsaWRhdG9ySGVscGVycy5mYWlsKHJlc3VsdC5lcnJvcnMgfHwgWydJbnZhbGlkIG5hbWUnXSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5hbWUubGVuZ3RoID4gNTApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goJ05hbWUgaXMgdmVyeSBsb25nIC0gY29uc2lkZXIgc2hvcnRlbmluZyBmb3IgYmV0dGVyIGRpc3BsYXknKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgIGVycm9yczogW10sXG4gICAgICB3YXJuaW5nc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZWxlbWVudCBkZXNjcmlwdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHVua25vd24pOiBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICghZGVzY3JpcHRpb24pIHtcbiAgICAgIHJldHVybiBWYWxpZGF0b3JIZWxwZXJzLmZhaWwoW1wiRGVzY3JpcHRpb24gaXMgcmVxdWlyZWRcIl0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGVzY3JpcHRpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gVmFsaWRhdG9ySGVscGVycy5mYWlsKFtcIkRlc2NyaXB0aW9uIG11c3QgYmUgYSBzdHJpbmdcIl0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVBbmRTYW5pdGl6ZUlucHV0KGRlc2NyaXB0aW9uLCB7XG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgYWxsb3dTcGFjZXM6IHRydWUsXG4gICAgICBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbidcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBWYWxpZGF0b3JIZWxwZXJzLmZhaWwocmVzdWx0LmVycm9ycyB8fCBbJ0ludmFsaWQgZGVzY3JpcHRpb24nXSk7XG4gICAgfVxuXG4gICAgaWYgKGRlc2NyaXB0aW9uLmxlbmd0aCA+IDIwMCkge1xuICAgICAgd2FybmluZ3MucHVzaCgnRGVzY3JpcHRpb24gaXMgdmVyeSBsb25nIC0gY29uc2lkZXIga2VlcGluZyBpdCB1bmRlciAyMDAgY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgZXJyb3JzOiBbXSxcbiAgICAgIHdhcm5pbmdzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBlbGVtZW50IGNvbnRlbnRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB2YWxpZGF0ZUNvbnRlbnQoXG4gICAgY29udGVudDogdW5rbm93bixcbiAgICBtYXhMZW5ndGg/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbWF4ID0gbWF4TGVuZ3RoIHx8IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEg7XG5cbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHJldHVybiBWYWxpZGF0b3JIZWxwZXJzLmZhaWwoWydDb250ZW50IGlzIHJlcXVpcmVkJ10pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBWYWxpZGF0b3JIZWxwZXJzLmZhaWwoWydDb250ZW50IG11c3QgYmUgYSBzdHJpbmcnXSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgbWluaW11bSBsZW5ndGhcbiAgICBpZiAoY29udGVudC50cmltKCkubGVuZ3RoIDwgMTApIHtcbiAgICAgIHJldHVybiBWYWxpZGF0b3JIZWxwZXJzLmZhaWwoWydDb250ZW50IGlzIHRvbyBzaG9ydCAobWluaW11bSAxMCBjaGFyYWN0ZXJzKSddKTtcbiAgICB9XG5cbiAgICAvLyBVc2UgVmFsaWRhdGlvblNlcnZpY2UgZm9yIGNvbnRlbnQgdmFsaWRhdGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVDb250ZW50KGNvbnRlbnQsIHtcbiAgICAgIG1heExlbmd0aDogbWF4XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gVmFsaWRhdG9ySGVscGVycy5mYWlsKFxuICAgICAgICByZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucyB8fCBbJ0NvbnRlbnQgdmFsaWRhdGlvbiBmYWlsZWQnXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb250ZW50IHF1YWxpdHkgd2FybmluZ3NcbiAgICBpZiAoY29udGVudC5sZW5ndGggPiA1MDAwKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKCdDb250ZW50IGlzIHZlcnkgbG9uZyAtIGNvbnNpZGVyIGJyZWFraW5nIGl0IGludG8gc2VjdGlvbnMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgIGVycm9yczogW10sXG4gICAgICB3YXJuaW5nc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdHJpZ2dlcnMgYXJyYXlcbiAgICovXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVRyaWdnZXJzKHRyaWdnZXJzOiB1bmtub3duLCBlbGVtZW50TmFtZTogc3RyaW5nKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRyaWdnZXJzKSkge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbJ1RyaWdnZXJzIG11c3QgYmUgYW4gYXJyYXknXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy50cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UudmFsaWRhdGVUcmlnZ2VycyhcbiAgICAgIHRyaWdnZXJzLFxuICAgICAgdGhpcy5lbGVtZW50VHlwZSxcbiAgICAgIGVsZW1lbnROYW1lXG4gICAgKTtcblxuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbLi4ucmVzdWx0Lndhcm5pbmdzXTtcblxuICAgIGlmIChyZXN1bHQuaGFzUmVqZWN0aW9ucykge1xuICAgICAgcmVzdWx0LnJlamVjdGVkVHJpZ2dlcnMuZm9yRWFjaChyZWplY3RlZCA9PiB7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goYFRyaWdnZXIgXCIke3JlamVjdGVkLm9yaWdpbmFsfVwiIHJlamVjdGVkOiAke3JlamVjdGVkLnJlYXNvbn1gKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpc1ZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2FybmluZ3NcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBhIHF1YWxpdHkgc2NvcmUgZm9yIHRoZSBlbGVtZW50ICgwLTEwMClcbiAgICovXG4gIHByb3RlY3RlZCBjYWxjdWxhdGVRdWFsaXR5U2NvcmUoXG4gICAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGNvbnRlbnQ6IHN0cmluZ1xuICApOiBudW1iZXIge1xuICAgIGxldCBzY29yZSA9IDA7XG5cbiAgICAvLyBOYW1lIHF1YWxpdHkgKDAtMTUgcG9pbnRzKVxuICAgIGlmIChtZXRhZGF0YS5uYW1lICYmIHR5cGVvZiBtZXRhZGF0YS5uYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgc2NvcmUgKz0gMTA7XG4gICAgICBpZiAobWV0YWRhdGEubmFtZS5sZW5ndGggPj0gMyAmJiBtZXRhZGF0YS5uYW1lLmxlbmd0aCA8PSA1MCkge1xuICAgICAgICBzY29yZSArPSA1O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlc2NyaXB0aW9uIHF1YWxpdHkgKDAtMTUgcG9pbnRzKVxuICAgIGlmIChtZXRhZGF0YS5kZXNjcmlwdGlvbiAmJiB0eXBlb2YgbWV0YWRhdGEuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBzY29yZSArPSAxMDtcbiAgICAgIGNvbnN0IGRlc2MgPSBtZXRhZGF0YS5kZXNjcmlwdGlvbiBhcyBzdHJpbmc7XG4gICAgICBpZiAoZGVzYy5sZW5ndGggPj0gMjAgJiYgZGVzYy5sZW5ndGggPD0gMjAwKSB7XG4gICAgICAgIHNjb3JlICs9IDU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29udGVudCBxdWFsaXR5ICgwLTMwIHBvaW50cylcbiAgICBpZiAoY29udGVudCkge1xuICAgICAgc2NvcmUgKz0gMTU7XG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPj0gNTApIHtcbiAgICAgICAgc2NvcmUgKz0gMTA7XG4gICAgICB9XG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPD0gNTAwMCkge1xuICAgICAgICBzY29yZSArPSA1O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1ldGFkYXRhIGNvbXBsZXRlbmVzcyAoMC0yMCBwb2ludHMpXG4gICAgaWYgKG1ldGFkYXRhLmF1dGhvcikgc2NvcmUgKz0gNTtcbiAgICBpZiAobWV0YWRhdGEudmVyc2lvbikgc2NvcmUgKz0gNTtcbiAgICBpZiAobWV0YWRhdGEuY2F0ZWdvcnkpIHNjb3JlICs9IDU7XG4gICAgaWYgKG1ldGFkYXRhLmNyZWF0ZWQpIHNjb3JlICs9IDU7XG5cbiAgICAvLyBUcmlnZ2VycyAoMC0yMCBwb2ludHMpXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWV0YWRhdGEudHJpZ2dlcnMpKSB7XG4gICAgICBjb25zdCB0cmlnZ2VycyA9IG1ldGFkYXRhLnRyaWdnZXJzIGFzIHVua25vd25bXTtcbiAgICAgIGlmICh0cmlnZ2Vycy5sZW5ndGggPiAwKSBzY29yZSArPSAxMDtcbiAgICAgIGlmICh0cmlnZ2Vycy5sZW5ndGggPj0gMykgc2NvcmUgKz0gNTtcbiAgICAgIGlmICh0cmlnZ2Vycy5sZW5ndGggPD0gMTApIHNjb3JlICs9IDU7XG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGgubWluKDEwMCwgc2NvcmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhpcyBlbGVtZW50IHR5cGVcbiAgICovXG4gIHByb3RlY3RlZCBnZXRFbGVtZW50TGFiZWwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBsYWJlbHM6IFJlY29yZDxFbGVtZW50VHlwZSwgc3RyaW5nPiA9IHtcbiAgICAgIFtFbGVtZW50VHlwZS5QRVJTT05BXTogJ1BlcnNvbmEnLFxuICAgICAgW0VsZW1lbnRUeXBlLlNLSUxMXTogJ1NraWxsJyxcbiAgICAgIFtFbGVtZW50VHlwZS5URU1QTEFURV06ICdUZW1wbGF0ZScsXG4gICAgICBbRWxlbWVudFR5cGUuQUdFTlRdOiAnQWdlbnQnLFxuICAgICAgW0VsZW1lbnRUeXBlLk1FTU9SWV06ICdNZW1vcnknLFxuICAgICAgW0VsZW1lbnRUeXBlLkVOU0VNQkxFXTogJ0Vuc2VtYmxlJ1xuICAgIH07XG4gICAgcmV0dXJuIGxhYmVsc1t0aGlzLmVsZW1lbnRUeXBlXSB8fCB0aGlzLmVsZW1lbnRUeXBlO1xuICB9XG59XG4iXX0=
484
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2VuZXJpY0VsZW1lbnRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvdmFsaWRhdGlvbi9HZW5lcmljRWxlbWVudFZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFJdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBTUwsZ0JBQWdCLEVBQ2pCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0I7O0dBRUc7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBS3RCO0lBQ0E7SUFDQTtJQU5ILFdBQVcsQ0FBYztJQUVsQyxZQUNFLFdBQXdCLEVBQ2QsaUJBQW9DLEVBQ3BDLHdCQUFrRCxFQUNsRCxlQUFnQztRQUZoQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBRTFDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQ2xCLElBQWEsRUFDYixPQUFrQztRQUVsQyxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztRQUVqQyxJQUFJLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCw0REFB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LENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNPLGVBQWU7UUFDdkIsTUFBTSxNQUFNLEdBQWdDO1lBQzFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVM7WUFDaEMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTztZQUM1QixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVO1lBQ2xDLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU87WUFDNUIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUTtZQUM5QixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxVQUFVO1NBQ25DLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN0RCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyaWNFbGVtZW50VmFsaWRhdG9yIC0gRGVmYXVsdCB2YWxpZGF0b3IgaW1wbGVtZW50YXRpb24gZm9yIG1vc3QgZWxlbWVudCB0eXBlc1xuICpcbiAqIFByb3ZpZGVzIHN0YW5kYXJkIHZhbGlkYXRpb24gbG9naWMgdGhhdCB3b3JrcyBmb3IgYW55IGVsZW1lbnQgdHlwZS5cbiAqIFVzZXMgdGhlIGV4aXN0aW5nIFZhbGlkYXRpb25TZXJ2aWNlIGFuZCBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgZm9yXG4gKiBjb25zaXN0ZW50IHNlY3VyaXR5LWZpcnN0IHZhbGlkYXRpb24gcGF0dGVybnMuXG4gKlxuICogRWxlbWVudCB0eXBlcyB0aGF0IG5lZWQgc3BlY2lhbGl6ZWQgdmFsaWRhdGlvbiAobGlrZSBwZXJzb25hcykgY2FuXG4gKiBleHRlbmQgdGhpcyBjbGFzcyBvciBpbXBsZW1lbnQgRWxlbWVudFZhbGlkYXRvciBkaXJlY3RseS5cbiAqL1xuXG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSwgdHlwZSBWYWxpZGF0aW9uUmVzdWx0IGFzIElucHV0VmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4vVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9UcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBJbnB1dE5vcm1hbGl6ZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dE5vcm1hbGl6ZXIuanMnO1xuaW1wb3J0IHtcbiAgRWxlbWVudFZhbGlkYXRvcixcbiAgVmFsaWRhdGlvblJlc3VsdCxcbiAgVmFsaWRhdGlvblJlcG9ydCxcbiAgRWxlbWVudFZhbGlkYXRpb25PcHRpb25zLFxuICBNZXRhZGF0YVZhbGlkYXRpb25PcHRpb25zLFxuICBWYWxpZGF0b3JIZWxwZXJzXG59IGZyb20gJy4vRWxlbWVudFZhbGlkYXRvci5qcyc7XG5cbi8qKlxuICogRGVmYXVsdCB2YWxpZGF0b3IgaW1wbGVtZW50YXRpb24gZm9yIG1vc3QgZWxlbWVudCB0eXBlc1xuICovXG5leHBvcnQgY2xhc3MgR2VuZXJpY0VsZW1lbnRWYWxpZGF0b3IgaW1wbGVtZW50cyBFbGVtZW50VmFsaWRhdG9yIHtcbiAgcmVhZG9ubHkgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSxcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlLFxuICAgIHByb3RlY3RlZCB0cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U6IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGRhdGEgZm9yIGVsZW1lbnQgY3JlYXRpb25cbiAgICpcbiAgICogQVJDSElURUNUVVJFOiBJbnB1dCBOb3JtYWxpemF0aW9uIGF0IEJvdW5kYXJ5XG4gICAqIFN0ZXAgMTogTm9ybWFsaXplIEFMTCBzdHJpbmcgZmllbGRzIChVbmljb2RlLCBjb25mdXNhYmxlcywgZGlyZWN0aW9uIG92ZXJyaWRlcylcbiAgICogU3RlcCAyOiBWYWxpZGF0ZSB0aGUgbm9ybWFsaXplZCBkYXRhIChmaWVsZCBydWxlcywgbGVuZ3RocywgcGF0dGVybnMpXG4gICAqXG4gICAqIFRoaXMgZW5zdXJlcyB3ZSBjYW4ndCBmb3JnZXQgdG8gbm9ybWFsaXplIGEgZmllbGQgLSBpdCBoYXBwZW5zIG9uY2UgYXQgZW50cnkuXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZUNyZWF0ZShcbiAgICBkYXRhOiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBFbGVtZW50VmFsaWRhdGlvbk9wdGlvbnNcbiAgKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKCFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbJ0RhdGEgbXVzdCBiZSBhIG5vbi1udWxsIG9iamVjdCddKTtcbiAgICB9XG5cbiAgICAvLyBTVEVQIDE6IE5PUk1BTElaRSBhdCB0aGUgYm91bmRhcnkgKGJlZm9yZSBhbnkgdmFsaWRhdGlvbilcbiAgICBjb25zdCBub3JtYWxpemVkID0gSW5wdXROb3JtYWxpemVyLm5vcm1hbGl6ZShkYXRhKTtcblxuICAgIC8vIEZhaWwgZmFzdCBpZiBoaWdoIG9yIGNyaXRpY2FsIFVuaWNvZGUgaXNzdWVzIGRldGVjdGVkXG4gICAgaWYgKG5vcm1hbGl6ZWQuaGFzSGlnaE9yQ3JpdGljYWxJc3N1ZXMpIHtcbiAgICAgIHJldHVybiBWYWxpZGF0b3JIZWxwZXJzLmZhaWwobm9ybWFsaXplZC5lcnJvcnMpO1xuICAgIH1cblxuICAgIC8vIEFkZCBub3JtYWxpemF0aW9uIHdhcm5pbmdzIHRvIHJlc3VsdHNcbiAgICB3YXJuaW5ncy5wdXNoKC4uLm5vcm1hbGl6ZWQud2FybmluZ3MpO1xuXG4gICAgLy8gU1RFUCAyOiBWQUxJREFURSB0aGUgbm9ybWFsaXplZCBkYXRhXG4gICAgY29uc3QgcmVjb3JkID0gbm9ybWFsaXplZC5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgLy8gVmFsaWRhdGUgbmFtZVxuICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRlTmFtZShyZWNvcmQubmFtZSk7XG4gICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIGVycm9ycy5wdXNoKC4uLm5hbWVSZXN1bHQuZXJyb3JzKTtcbiAgICB9XG4gICAgd2FybmluZ3MucHVzaCguLi5uYW1lUmVzdWx0Lndhcm5pbmdzKTtcblxuICAgIC8vIFZhbGlkYXRlIGRlc2NyaXB0aW9uXG4gICAgY29uc3QgZGVzY1Jlc3VsdCA9IHRoaXMudmFsaWRhdGVEZXNjcmlwdGlvbihyZWNvcmQuZGVzY3JpcHRpb24pO1xuICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICBlcnJvcnMucHVzaCguLi5kZXNjUmVzdWx0LmVycm9ycyk7XG4gICAgfVxuICAgIHdhcm5pbmdzLnB1c2goLi4uZGVzY1Jlc3VsdC53YXJuaW5ncyk7XG5cbiAgICAvLyBWYWxpZGF0ZSBjb250ZW50IGlmIHByZXNlbnRcbiAgICBpZiAocmVjb3JkLmNvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiAhb3B0aW9ucz8uc2tpcENvbnRlbnRWYWxpZGF0aW9uKSB7XG4gICAgICBjb25zdCBjb250ZW50UmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZUNvbnRlbnQoXG4gICAgICAgIHJlY29yZC5jb250ZW50LFxuICAgICAgICBvcHRpb25zPy5tYXhDb250ZW50TGVuZ3RoXG4gICAgICApO1xuICAgICAgaWYgKCFjb250ZW50UmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4uY29udGVudFJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3MucHVzaCguLi5jb250ZW50UmVzdWx0Lndhcm5pbmdzKTtcbiAgICB9XG5cbiAgICAvLyBGaXggIzkwODogVmFsaWRhdGUgaW5zdHJ1Y3Rpb25zIGZpZWxkIOKAlCBwcmV2aW91c2x5IG9ubHkgY29udGVudCB3YXMgY2hlY2tlZCxcbiAgICAvLyBhbGxvd2luZyBpbmplY3Rpb24gcGF5bG9hZHMgaW4gaW5zdHJ1Y3Rpb25zIHRvIHJlYWNoIGRpc2sgdW5zY2FubmVkLlxuICAgIGlmIChyZWNvcmQuaW5zdHJ1Y3Rpb25zICE9PSB1bmRlZmluZWQgJiYgIW9wdGlvbnM/LnNraXBDb250ZW50VmFsaWRhdGlvbikge1xuICAgICAgY29uc3QgaW5zdHJSZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlQ29udGVudChcbiAgICAgICAgcmVjb3JkLmluc3RydWN0aW9ucyxcbiAgICAgICAgb3B0aW9ucz8ubWF4Q29udGVudExlbmd0aFxuICAgICAgKTtcbiAgICAgIGlmICghaW5zdHJSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICBlcnJvcnMucHVzaCguLi5pbnN0clJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3MucHVzaCguLi5pbnN0clJlc3VsdC53YXJuaW5ncyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdHJpZ2dlcnMgaWYgcHJlc2VudFxuICAgIGlmIChyZWNvcmQudHJpZ2dlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdHJpZ2dlclJlc3VsdCA9IHRoaXMudmFsaWRhdGVUcmlnZ2VycyhcbiAgICAgICAgcmVjb3JkLnRyaWdnZXJzLFxuICAgICAgICBTdHJpbmcocmVjb3JkLm5hbWUgfHwgJ3Vua25vd24nKVxuICAgICAgKTtcbiAgICAgIGlmICghdHJpZ2dlclJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKC4uLnRyaWdnZXJSZXN1bHQuZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIHdhcm5pbmdzLnB1c2goLi4udHJpZ2dlclJlc3VsdC53YXJuaW5ncyk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHN1Z2dlc3Rpb25zIGZvciBtaXNzaW5nIG9wdGlvbmFsIGZpZWxkc1xuICAgIGlmICghcmVjb3JkLnRyaWdnZXJzIHx8IChBcnJheS5pc0FycmF5KHJlY29yZC50cmlnZ2VycykgJiYgcmVjb3JkLnRyaWdnZXJzLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goJ0FkZCB0cmlnZ2VyIGtleXdvcmRzIHRvIGltcHJvdmUgZGlzY292ZXJhYmlsaXR5Jyk7XG4gICAgfVxuICAgIGlmICghcmVjb3JkLmF1dGhvcikge1xuICAgICAgc3VnZ2VzdGlvbnMucHVzaCgnQWRkIGFuIGF1dGhvciBmaWVsZCBmb3IgcHJvcGVyIGF0dHJpYnV0aW9uJyk7XG4gICAgfVxuICAgIGlmICghcmVjb3JkLnZlcnNpb24pIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goJ0FkZCBhIHZlcnNpb24gbnVtYmVyIGZvciB0cmFja2luZyB1cGRhdGVzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzVmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsXG4gICAgICBlcnJvcnMsXG4gICAgICB3YXJuaW5ncyxcbiAgICAgIHN1Z2dlc3Rpb25zOiBzdWdnZXN0aW9ucy5sZW5ndGggPiAwID8gc3VnZ2VzdGlvbnMgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGNoYW5nZXMgdG8gYW4gZXhpc3RpbmcgZWxlbWVudFxuICAgKlxuICAgKiBBUkNISVRFQ1RVUkU6IElucHV0IE5vcm1hbGl6YXRpb24gYXQgQm91bmRhcnlcbiAgICogU3RlcCAxOiBOb3JtYWxpemUgQUxMIHN0cmluZyBmaWVsZHMgaW4gY2hhbmdlcyBvYmplY3RcbiAgICogU3RlcCAyOiBWYWxpZGF0ZSB0aGUgbm9ybWFsaXplZCBjaGFuZ2VzXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZUVkaXQoXG4gICAgZWxlbWVudDogdW5rbm93bixcbiAgICBjaGFuZ2VzOiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBFbGVtZW50VmFsaWRhdGlvbk9wdGlvbnNcbiAgKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKCFlbGVtZW50IHx8IHR5cGVvZiBlbGVtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbJ0VsZW1lbnQgbXVzdCBiZSBhIG5vbi1udWxsIG9iamVjdCddKTtcbiAgICB9XG5cbiAgICBpZiAoIWNoYW5nZXMgfHwgdHlwZW9mIGNoYW5nZXMgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gVmFsaWRhdG9ySGVscGVycy5mYWlsKFsnQ2hhbmdlcyBtdXN0IGJlIGEgbm9uLW51bGwgb2JqZWN0J10pO1xuICAgIH1cblxuICAgIC8vIFNURVAgMTogTk9STUFMSVpFIGNoYW5nZXMgYXQgdGhlIGJvdW5kYXJ5XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IElucHV0Tm9ybWFsaXplci5ub3JtYWxpemUoY2hhbmdlcyk7XG5cbiAgICAvLyBGYWlsIGZhc3QgaWYgaGlnaCBvciBjcml0aWNhbCBVbmljb2RlIGlzc3VlcyBkZXRlY3RlZFxuICAgIGlmIChub3JtYWxpemVkLmhhc0hpZ2hPckNyaXRpY2FsSXNzdWVzKSB7XG4gICAgICByZXR1cm4gVmFsaWRhdG9ySGVscGVycy5mYWlsKG5vcm1hbGl6ZWQuZXJyb3JzKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgbm9ybWFsaXphdGlvbiB3YXJuaW5ncyB0byByZXN1bHRzXG4gICAgd2FybmluZ3MucHVzaCguLi5ub3JtYWxpemVkLndhcm5pbmdzKTtcblxuICAgIC8vIFNURVAgMjogVkFMSURBVEUgdGhlIG5vcm1hbGl6ZWQgY2hhbmdlc1xuICAgIGNvbnN0IGNoYW5nZVJlY29yZCA9IG5vcm1hbGl6ZWQuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggY2hhbmdlZCBmaWVsZFxuICAgIGlmIChjaGFuZ2VSZWNvcmQubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0ZU5hbWUoY2hhbmdlUmVjb3JkLm5hbWUpO1xuICAgICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4ubmFtZVJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3MucHVzaCguLi5uYW1lUmVzdWx0Lndhcm5pbmdzKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlUmVjb3JkLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGRlc2NSZXN1bHQgPSB0aGlzLnZhbGlkYXRlRGVzY3JpcHRpb24oY2hhbmdlUmVjb3JkLmRlc2NyaXB0aW9uKTtcbiAgICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKC4uLmRlc2NSZXN1bHQuZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIHdhcm5pbmdzLnB1c2goLi4uZGVzY1Jlc3VsdC53YXJuaW5ncyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZVJlY29yZC5jb250ZW50ICE9PSB1bmRlZmluZWQgJiYgIW9wdGlvbnM/LnNraXBDb250ZW50VmFsaWRhdGlvbikge1xuICAgICAgY29uc3QgY29udGVudFJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGVDb250ZW50KFxuICAgICAgICBjaGFuZ2VSZWNvcmQuY29udGVudCxcbiAgICAgICAgb3B0aW9ucz8ubWF4Q29udGVudExlbmd0aFxuICAgICAgKTtcbiAgICAgIGlmICghY29udGVudFJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKC4uLmNvbnRlbnRSZXN1bHQuZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIHdhcm5pbmdzLnB1c2goLi4uY29udGVudFJlc3VsdC53YXJuaW5ncyk7XG4gICAgfVxuXG4gICAgLy8gRml4ICM5MDg6IFZhbGlkYXRlIGluc3RydWN0aW9ucyBvbiBlZGl0IHBhdGggKHNhbWUgZ2FwIGFzIHZhbGlkYXRlQ3JlYXRlKVxuICAgIGlmIChjaGFuZ2VSZWNvcmQuaW5zdHJ1Y3Rpb25zICE9PSB1bmRlZmluZWQgJiYgIW9wdGlvbnM/LnNraXBDb250ZW50VmFsaWRhdGlvbikge1xuICAgICAgY29uc3QgaW5zdHJSZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlQ29udGVudChcbiAgICAgICAgY2hhbmdlUmVjb3JkLmluc3RydWN0aW9ucyxcbiAgICAgICAgb3B0aW9ucz8ubWF4Q29udGVudExlbmd0aFxuICAgICAgKTtcbiAgICAgIGlmICghaW5zdHJSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICBlcnJvcnMucHVzaCguLi5pbnN0clJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3MucHVzaCguLi5pbnN0clJlc3VsdC53YXJuaW5ncyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZVJlY29yZC50cmlnZ2VycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBlbGVtZW50UmVjb3JkID0gZWxlbWVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IHRyaWdnZXJSZXN1bHQgPSB0aGlzLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIGNoYW5nZVJlY29yZC50cmlnZ2VycyxcbiAgICAgICAgU3RyaW5nKGVsZW1lbnRSZWNvcmQubmFtZSB8fCBjaGFuZ2VSZWNvcmQubmFtZSB8fCAndW5rbm93bicpXG4gICAgICApO1xuICAgICAgaWYgKCF0cmlnZ2VyUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4udHJpZ2dlclJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3MucHVzaCguLi50cmlnZ2VyUmVzdWx0Lndhcm5pbmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZXJyb3JzLmxlbmd0aCA9PT0gMCxcbiAgICAgIGVycm9ycyxcbiAgICAgIHdhcm5pbmdzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBlbGVtZW50IG1ldGFkYXRhXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZU1ldGFkYXRhKFxuICAgIG1ldGFkYXRhOiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBNZXRhZGF0YVZhbGlkYXRpb25PcHRpb25zXG4gICk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICghbWV0YWRhdGEgfHwgdHlwZW9mIG1ldGFkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbJ01ldGFkYXRhIG11c3QgYmUgYSBub24tbnVsbCBvYmplY3QnXSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3JkID0gbWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBDaGVjayByZXF1aXJlZCBmaWVsZHNcbiAgICBjb25zdCByZXF1aXJlZEZpZWxkcyA9IG9wdGlvbnM/LnJlcXVpcmVkRmllbGRzIHx8IFsnbmFtZSddO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgcmVxdWlyZWRGaWVsZHMpIHtcbiAgICAgIGlmICghcmVjb3JkW2ZpZWxkXSkge1xuICAgICAgICBlcnJvcnMucHVzaChgUmVxdWlyZWQgZmllbGQgJyR7ZmllbGR9JyBpcyBtaXNzaW5nIG9yIGVtcHR5YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZmllbGQgZm9ybWF0c1xuICAgIGlmIChvcHRpb25zPy5mb3JtYXRGaWVsZHMpIHtcbiAgICAgIGZvciAoY29uc3QgW2ZpZWxkLCBwYXR0ZXJuXSBvZiBPYmplY3QuZW50cmllcyhvcHRpb25zLmZvcm1hdEZpZWxkcykpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWNvcmRbZmllbGRdO1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhcGF0dGVybi50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGBGaWVsZCAnJHtmaWVsZH0nIGhhcyBpbnZhbGlkIGZvcm1hdGApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWF4IGxlbmd0aHNcbiAgICBpZiAob3B0aW9ucz8ubWF4TGVuZ3Rocykge1xuICAgICAgZm9yIChjb25zdCBbZmllbGQsIG1heExlbmd0aF0gb2YgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5tYXhMZW5ndGhzKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHJlY29yZFtmaWVsZF07XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGBGaWVsZCAnJHtmaWVsZH0nIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHttYXhMZW5ndGh9IGNoYXJhY3RlcnNgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0YW5kYXJkIGZpZWxkIHZhbGlkYXRpb25zXG4gICAgaWYgKHJlY29yZC5uYW1lKSB7XG4gICAgICBjb25zdCBuYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0ZU5hbWUocmVjb3JkLm5hbWUpO1xuICAgICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goLi4ubmFtZVJlc3VsdC5lcnJvcnMpO1xuICAgICAgfVxuICAgICAgd2FybmluZ3MucHVzaCguLi5uYW1lUmVzdWx0Lndhcm5pbmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogZXJyb3JzLmxlbmd0aCA9PT0gMCxcbiAgICAgIGVycm9ycyxcbiAgICAgIHdhcm5pbmdzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIGNvbXByZWhlbnNpdmUgdmFsaWRhdGlvbiByZXBvcnRcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlUmVwb3J0KGVsZW1lbnQ6IHVua25vd24pOiBQcm9taXNlPFZhbGlkYXRpb25SZXBvcnQ+IHtcbiAgICBjb25zdCBkZXRhaWxzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBzdGF0dXM6ICdwYXNzJyB8ICdmYWlsJyB8ICd3YXJuaW5nJyA9ICdwYXNzJztcblxuICAgIGlmICghZWxlbWVudCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogJ2ZhaWwnLFxuICAgICAgICBzdW1tYXJ5OiAnSW52YWxpZCBlbGVtZW50OiBtdXN0IGJlIGEgbm9uLW51bGwgb2JqZWN0JyxcbiAgICAgICAgZGV0YWlsczogWydFbGVtZW50IHZhbGlkYXRpb24gZmFpbGVkIC0gaW52YWxpZCBpbnB1dCB0eXBlJ10sXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZWNvcmQgPSBlbGVtZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG1ldGFkYXRhID0gKHJlY29yZC5tZXRhZGF0YSB8fCByZWNvcmQpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBTdHJpbmcocmVjb3JkLmNvbnRlbnQgfHwgcmVjb3JkLmluc3RydWN0aW9ucyB8fCAnJyk7XG5cbiAgICAvLyBWYWxpZGF0ZSBhbGwgZmllbGRzXG4gICAgY29uc3QgY3JlYXRlUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZUNyZWF0ZSh7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgY29udGVudCxcbiAgICAgIHRyaWdnZXJzOiBtZXRhZGF0YS50cmlnZ2VycyxcbiAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGEudmVyc2lvblxuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyB2YWxpZGF0aW9uIHJlc3VsdHNcbiAgICBpZiAoY3JlYXRlUmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBzdGF0dXMgPSAnZmFpbCc7XG4gICAgICBkZXRhaWxzLnB1c2goJ0Vycm9yczonKTtcbiAgICAgIGNyZWF0ZVJlc3VsdC5lcnJvcnMuZm9yRWFjaCgoZXJyb3IsIGkpID0+IHtcbiAgICAgICAgZGV0YWlscy5wdXNoKGAgICR7aSArIDF9LiAke2Vycm9yfWApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZVJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoc3RhdHVzID09PSAncGFzcycpIHtcbiAgICAgICAgc3RhdHVzID0gJ3dhcm5pbmcnO1xuICAgICAgfVxuICAgICAgZGV0YWlscy5wdXNoKCdXYXJuaW5nczonKTtcbiAgICAgIGNyZWF0ZVJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nLCBpKSA9PiB7XG4gICAgICAgIGRldGFpbHMucHVzaChgICAke2kgKyAxfS4gJHt3YXJuaW5nfWApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNyZWF0ZVJlc3VsdC5zdWdnZXN0aW9ucyAmJiBjcmVhdGVSZXN1bHQuc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgZGV0YWlscy5wdXNoKCdTdWdnZXN0aW9uczonKTtcbiAgICAgIGNyZWF0ZVJlc3VsdC5zdWdnZXN0aW9ucy5mb3JFYWNoKChzdWdnZXN0aW9uLCBpKSA9PiB7XG4gICAgICAgIGRldGFpbHMucHVzaChgICAke2kgKyAxfS4gJHtzdWdnZXN0aW9ufWApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIG1ldHJpY3NcbiAgICBjb25zdCB0cmlnZ2VyQ291bnQgPSBBcnJheS5pc0FycmF5KG1ldGFkYXRhLnRyaWdnZXJzKSA/IG1ldGFkYXRhLnRyaWdnZXJzLmxlbmd0aCA6IDA7XG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IGNvbnRlbnQubGVuZ3RoO1xuXG4gICAgLy8gR2VuZXJhdGUgc3VtbWFyeVxuICAgIGxldCBzdW1tYXJ5OiBzdHJpbmc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ3Bhc3MnKSB7XG4gICAgICBzdW1tYXJ5ID0gYCR7dGhpcy5nZXRFbGVtZW50TGFiZWwoKX0gdmFsaWRhdGlvbiBwYXNzZWQgd2l0aCBubyBpc3N1ZXNgO1xuICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnd2FybmluZycpIHtcbiAgICAgIHN1bW1hcnkgPSBgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSBpcyB2YWxpZCBidXQgaGFzICR7Y3JlYXRlUmVzdWx0Lndhcm5pbmdzLmxlbmd0aH0gd2FybmluZyhzKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1bW1hcnkgPSBgJHt0aGlzLmdldEVsZW1lbnRMYWJlbCgpfSB2YWxpZGF0aW9uIGZhaWxlZCB3aXRoICR7Y3JlYXRlUmVzdWx0LmVycm9ycy5sZW5ndGh9IGVycm9yKHMpYDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzLFxuICAgICAgc3VtbWFyeSxcbiAgICAgIGRldGFpbHMsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBtZXRyaWNzOiB7XG4gICAgICAgIGNvbnRlbnRMZW5ndGgsXG4gICAgICAgIHRyaWdnZXJDb3VudCxcbiAgICAgICAgcXVhbGl0eVNjb3JlOiB0aGlzLmNhbGN1bGF0ZVF1YWxpdHlTY29yZShtZXRhZGF0YSwgY29udGVudClcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGVsZW1lbnQgbmFtZVxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlTmFtZShuYW1lOiB1bmtub3duKTogVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgaWYgKCFuYW1lIHx8IHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbXCJOYW1lIGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIGEgc3RyaW5nXCJdKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChuYW1lLCB7XG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTkFNRV9MRU5HVEgsXG4gICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgIGZpZWxkVHlwZTogJ25hbWUnXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gVmFsaWRhdG9ySGVscGVycy5mYWlsKHJlc3VsdC5lcnJvcnMgfHwgWydJbnZhbGlkIG5hbWUnXSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5hbWUubGVuZ3RoID4gNTApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goJ05hbWUgaXMgdmVyeSBsb25nIC0gY29uc2lkZXIgc2hvcnRlbmluZyBmb3IgYmV0dGVyIGRpc3BsYXknKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgIGVycm9yczogW10sXG4gICAgICB3YXJuaW5nc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZWxlbWVudCBkZXNjcmlwdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlRGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHVua25vd24pOiBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICghZGVzY3JpcHRpb24pIHtcbiAgICAgIHJldHVybiBWYWxpZGF0b3JIZWxwZXJzLmZhaWwoW1wiRGVzY3JpcHRpb24gaXMgcmVxdWlyZWRcIl0pO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGVzY3JpcHRpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gVmFsaWRhdG9ySGVscGVycy5mYWlsKFtcIkRlc2NyaXB0aW9uIG11c3QgYmUgYSBzdHJpbmdcIl0pO1xuICAgIH1cblxuICAgIGlmIChkZXNjcmlwdGlvbi5sZW5ndGggPiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCkge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbXG4gICAgICAgIGBEZXNjcmlwdGlvbiBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7U0VDVVJJVFlfTElNSVRTLk1BWF9ERVNDUklQVElPTl9MRU5HVEh9IGNoYXJhY3RlcnNgXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNhbml0aXplRGVzY3JpcHRpb25JbnB1dChkZXNjcmlwdGlvbik7XG5cbiAgICBpZiAoIXJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4gVmFsaWRhdG9ySGVscGVycy5mYWlsKHJlc3VsdC5lcnJvcnMgfHwgWydJbnZhbGlkIGRlc2NyaXB0aW9uJ10pO1xuICAgIH1cblxuICAgIGlmIChkZXNjcmlwdGlvbi5sZW5ndGggPiAyMDApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goJ0Rlc2NyaXB0aW9uIGlzIHZlcnkgbG9uZyAtIGNvbnNpZGVyIGtlZXBpbmcgaXQgdW5kZXIgMjAwIGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgIGVycm9yczogW10sXG4gICAgICB3YXJuaW5nc1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNhbml0aXplRGVzY3JpcHRpb25JbnB1dChkZXNjcmlwdGlvbjogc3RyaW5nKTogSW5wdXRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQoZGVzY3JpcHRpb24sIHtcbiAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9ERVNDUklQVElPTl9MRU5HVEgsXG4gICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgIGZpZWxkVHlwZTogJ2Rlc2NyaXB0aW9uJ1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGVsZW1lbnQgY29udGVudFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHZhbGlkYXRlQ29udGVudChcbiAgICBjb250ZW50OiB1bmtub3duLFxuICAgIG1heExlbmd0aD86IG51bWJlclxuICApOiBQcm9taXNlPFZhbGlkYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBtYXggPSBtYXhMZW5ndGggfHwgU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSDtcblxuICAgIGlmICghY29udGVudCkge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbJ0NvbnRlbnQgaXMgcmVxdWlyZWQnXSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbJ0NvbnRlbnQgbXVzdCBiZSBhIHN0cmluZyddKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBtaW5pbXVtIGxlbmd0aFxuICAgIGlmIChjb250ZW50LnRyaW0oKS5sZW5ndGggPCAxMCkge1xuICAgICAgcmV0dXJuIFZhbGlkYXRvckhlbHBlcnMuZmFpbChbJ0NvbnRlbnQgaXMgdG9vIHNob3J0IChtaW5pbXVtIDEwIGNoYXJhY3RlcnMpJ10pO1xuICAgIH1cblxuICAgIC8vIFVzZSBWYWxpZGF0aW9uU2VydmljZSBmb3IgY29udGVudCB2YWxpZGF0aW9uXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUNvbnRlbnQoY29udGVudCwge1xuICAgICAgbWF4TGVuZ3RoOiBtYXhcbiAgICB9KTtcblxuICAgIGlmICghcmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiBWYWxpZGF0b3JIZWxwZXJzLmZhaWwoXG4gICAgICAgIHJlc3VsdC5kZXRlY3RlZFBhdHRlcm5zIHx8IFsnQ29udGVudCB2YWxpZGF0aW9uIGZhaWxlZCddXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENvbnRlbnQgcXVhbGl0eSB3YXJuaW5nc1xuICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IDUwMDApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goJ0NvbnRlbnQgaXMgdmVyeSBsb25nIC0gY29uc2lkZXIgYnJlYWtpbmcgaXQgaW50byBzZWN0aW9ucycpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgZXJyb3JzOiBbXSxcbiAgICAgIHdhcm5pbmdzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0cmlnZ2VycyBhcnJheVxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlVHJpZ2dlcnModHJpZ2dlcnM6IHVua25vd24sIGVsZW1lbnROYW1lOiBzdHJpbmcpOiBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodHJpZ2dlcnMpKSB7XG4gICAgICByZXR1cm4gVmFsaWRhdG9ySGVscGVycy5mYWlsKFsnVHJpZ2dlcnMgbXVzdCBiZSBhbiBhcnJheSddKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZVRyaWdnZXJzKFxuICAgICAgdHJpZ2dlcnMsXG4gICAgICB0aGlzLmVsZW1lbnRUeXBlLFxuICAgICAgZWxlbWVudE5hbWVcbiAgICApO1xuXG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFsuLi5yZXN1bHQud2FybmluZ3NdO1xuXG4gICAgaWYgKHJlc3VsdC5oYXNSZWplY3Rpb25zKSB7XG4gICAgICByZXN1bHQucmVqZWN0ZWRUcmlnZ2Vycy5mb3JFYWNoKHJlamVjdGVkID0+IHtcbiAgICAgICAgd2FybmluZ3MucHVzaChgVHJpZ2dlciBcIiR7cmVqZWN0ZWQub3JpZ2luYWx9XCIgcmVqZWN0ZWQ6ICR7cmVqZWN0ZWQucmVhc29ufWApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlzVmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsXG4gICAgICBlcnJvcnMsXG4gICAgICB3YXJuaW5nc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGEgcXVhbGl0eSBzY29yZSBmb3IgdGhlIGVsZW1lbnQgKDAtMTAwKVxuICAgKi9cbiAgcHJvdGVjdGVkIGNhbGN1bGF0ZVF1YWxpdHlTY29yZShcbiAgICBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgY29udGVudDogc3RyaW5nXG4gICk6IG51bWJlciB7XG4gICAgbGV0IHNjb3JlID0gMDtcblxuICAgIC8vIE5hbWUgcXVhbGl0eSAoMC0xNSBwb2ludHMpXG4gICAgaWYgKG1ldGFkYXRhLm5hbWUgJiYgdHlwZW9mIG1ldGFkYXRhLm5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzY29yZSArPSAxMDtcbiAgICAgIGlmIChtZXRhZGF0YS5uYW1lLmxlbmd0aCA+PSAzICYmIG1ldGFkYXRhLm5hbWUubGVuZ3RoIDw9IDUwKSB7XG4gICAgICAgIHNjb3JlICs9IDU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVzY3JpcHRpb24gcXVhbGl0eSAoMC0xNSBwb2ludHMpXG4gICAgaWYgKG1ldGFkYXRhLmRlc2NyaXB0aW9uICYmIHR5cGVvZiBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNjb3JlICs9IDEwO1xuICAgICAgY29uc3QgZGVzYyA9IG1ldGFkYXRhLmRlc2NyaXB0aW9uIGFzIHN0cmluZztcbiAgICAgIGlmIChkZXNjLmxlbmd0aCA+PSAyMCAmJiBkZXNjLmxlbmd0aCA8PSAyMDApIHtcbiAgICAgICAgc2NvcmUgKz0gNTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb250ZW50IHF1YWxpdHkgKDAtMzAgcG9pbnRzKVxuICAgIGlmIChjb250ZW50KSB7XG4gICAgICBzY29yZSArPSAxNTtcbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+PSA1MCkge1xuICAgICAgICBzY29yZSArPSAxMDtcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA8PSA1MDAwKSB7XG4gICAgICAgIHNjb3JlICs9IDU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWV0YWRhdGEgY29tcGxldGVuZXNzICgwLTIwIHBvaW50cylcbiAgICBpZiAobWV0YWRhdGEuYXV0aG9yKSBzY29yZSArPSA1O1xuICAgIGlmIChtZXRhZGF0YS52ZXJzaW9uKSBzY29yZSArPSA1O1xuICAgIGlmIChtZXRhZGF0YS5jYXRlZ29yeSkgc2NvcmUgKz0gNTtcbiAgICBpZiAobWV0YWRhdGEuY3JlYXRlZCkgc2NvcmUgKz0gNTtcblxuICAgIC8vIFRyaWdnZXJzICgwLTIwIHBvaW50cylcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YS50cmlnZ2VycykpIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gbWV0YWRhdGEudHJpZ2dlcnMgYXMgdW5rbm93bltdO1xuICAgICAgaWYgKHRyaWdnZXJzLmxlbmd0aCA+IDApIHNjb3JlICs9IDEwO1xuICAgICAgaWYgKHRyaWdnZXJzLmxlbmd0aCA+PSAzKSBzY29yZSArPSA1O1xuICAgICAgaWYgKHRyaWdnZXJzLmxlbmd0aCA8PSAxMCkgc2NvcmUgKz0gNTtcbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBzY29yZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGlzIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldEVsZW1lbnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxhYmVsczogUmVjb3JkPEVsZW1lbnRUeXBlLCBzdHJpbmc+ID0ge1xuICAgICAgW0VsZW1lbnRUeXBlLlBFUlNPTkFdOiAnUGVyc29uYScsXG4gICAgICBbRWxlbWVudFR5cGUuU0tJTExdOiAnU2tpbGwnLFxuICAgICAgW0VsZW1lbnRUeXBlLlRFTVBMQVRFXTogJ1RlbXBsYXRlJyxcbiAgICAgIFtFbGVtZW50VHlwZS5BR0VOVF06ICdBZ2VudCcsXG4gICAgICBbRWxlbWVudFR5cGUuTUVNT1JZXTogJ01lbW9yeScsXG4gICAgICBbRWxlbWVudFR5cGUuRU5TRU1CTEVdOiAnRW5zZW1ibGUnXG4gICAgfTtcbiAgICByZXR1cm4gbGFiZWxzW3RoaXMuZWxlbWVudFR5cGVdIHx8IHRoaXMuZWxlbWVudFR5cGU7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Resolve a target path and verify that it remains inside the intended base
3
+ * directory. This is separator-aware, so sibling paths such as `/tmp/base2`
4
+ * are not treated as children of `/tmp/base`.
5
+ */
6
+ export declare function resolvePathWithinBase(baseDir: string, ...segments: string[]): string;
7
+ //# sourceMappingURL=pathSecurity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathSecurity.d.ts","sourceRoot":"","sources":["../../src/utils/pathSecurity.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BpF"}
@@ -0,0 +1,30 @@
1
+ import * as path from 'node:path';
2
+ /**
3
+ * Resolve a target path and verify that it remains inside the intended base
4
+ * directory. This is separator-aware, so sibling paths such as `/tmp/base2`
5
+ * are not treated as children of `/tmp/base`.
6
+ */
7
+ export function resolvePathWithinBase(baseDir, ...segments) {
8
+ if (!baseDir || typeof baseDir !== 'string') {
9
+ throw new TypeError('Base directory must be a non-empty string');
10
+ }
11
+ for (const segment of segments) {
12
+ if (typeof segment !== 'string') {
13
+ throw new TypeError('Path segments must be strings');
14
+ }
15
+ if (segment.includes('\0')) {
16
+ throw new Error('Path segment contains a null byte');
17
+ }
18
+ }
19
+ const resolvedBase = path.resolve(baseDir);
20
+ const resolvedTarget = path.resolve(resolvedBase, ...segments);
21
+ const relativePath = path.relative(resolvedBase, resolvedTarget);
22
+ const isTraversal = relativePath === '..'
23
+ || relativePath.startsWith('..' + path.sep)
24
+ || path.isAbsolute(relativePath);
25
+ if (!isTraversal) {
26
+ return resolvedTarget;
27
+ }
28
+ throw new Error('Resolved path escapes the base directory');
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aFNlY3VyaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhdGhTZWN1cml0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE9BQWUsRUFBRSxHQUFHLFFBQWtCO0lBQzFFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUMsTUFBTSxJQUFJLFNBQVMsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDL0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDakUsTUFBTSxXQUFXLEdBQUcsWUFBWSxLQUFLLElBQUk7V0FDcEMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztXQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRW5DLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQixPQUFPLGNBQWMsQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0FBQzlELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogUmVzb2x2ZSBhIHRhcmdldCBwYXRoIGFuZCB2ZXJpZnkgdGhhdCBpdCByZW1haW5zIGluc2lkZSB0aGUgaW50ZW5kZWQgYmFzZVxuICogZGlyZWN0b3J5LiBUaGlzIGlzIHNlcGFyYXRvci1hd2FyZSwgc28gc2libGluZyBwYXRocyBzdWNoIGFzIGAvdG1wL2Jhc2UyYFxuICogYXJlIG5vdCB0cmVhdGVkIGFzIGNoaWxkcmVuIG9mIGAvdG1wL2Jhc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVBhdGhXaXRoaW5CYXNlKGJhc2VEaXI6IHN0cmluZywgLi4uc2VnbWVudHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKCFiYXNlRGlyIHx8IHR5cGVvZiBiYXNlRGlyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Jhc2UgZGlyZWN0b3J5IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNlZ21lbnQgb2Ygc2VnbWVudHMpIHtcbiAgICBpZiAodHlwZW9mIHNlZ21lbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQYXRoIHNlZ21lbnRzIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICBpZiAoc2VnbWVudC5pbmNsdWRlcygnXFwwJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCBzZWdtZW50IGNvbnRhaW5zIGEgbnVsbCBieXRlJyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIpO1xuICBjb25zdCByZXNvbHZlZFRhcmdldCA9IHBhdGgucmVzb2x2ZShyZXNvbHZlZEJhc2UsIC4uLnNlZ21lbnRzKTtcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShyZXNvbHZlZEJhc2UsIHJlc29sdmVkVGFyZ2V0KTtcbiAgY29uc3QgaXNUcmF2ZXJzYWwgPSByZWxhdGl2ZVBhdGggPT09ICcuLidcbiAgICB8fCByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nICsgcGF0aC5zZXApXG4gICAgfHwgcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCk7XG5cbiAgaWYgKCFpc1RyYXZlcnNhbCkge1xuICAgIHJldHVybiByZXNvbHZlZFRhcmdldDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignUmVzb2x2ZWQgcGF0aCBlc2NhcGVzIHRoZSBiYXNlIGRpcmVjdG9yeScpO1xufVxuIl19
@@ -100,7 +100,7 @@
100
100
 
101
101
  <fieldset class="setup-channel-toggle" id="setup-channel-toggle">
102
102
  <legend class="setup-channel-legend">Release channel</legend>
103
- <select id="setup-channel-select" class="setup-channel-select" aria-describedby="setup-channel-hint">
103
+ <select id="setup-channel-select" class="setup-channel-select" aria-label="Release channel" aria-describedby="setup-channel-hint">
104
104
  <option value="latest" selected>Stable</option>
105
105
  <option value="rc">Release Candidate</option>
106
106
  <option value="beta">Beta</option>
@@ -1 +1 @@
1
- {"version":3,"file":"permissionRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/permissionRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAgW7E;;;GAGG;AACH,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,+BAAoC,GAC5C,IAAI,CAqQN"}
1
+ {"version":3,"file":"permissionRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/permissionRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAmZ7E;;;GAGG;AACH,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,+BAAoC,GAC5C,IAAI,CAiRN"}