@dollhousemcp/mcp-server 1.6.4 → 1.6.6

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.
@@ -463,10 +463,21 @@ export class SubmitToPortfolioTool {
463
463
  // Remove null bytes and normalize
464
464
  const cleanPath = filePath.replace(/\x00/g, '');
465
465
  normalizedPath = path.normalize(cleanPath);
466
- // Ensure the normalized path doesn't escape the intended directory
467
- if (normalizedPath.includes('..') || normalizedPath.startsWith('/') ||
468
- (process.platform === 'win32' && /^[a-zA-Z]:/.test(normalizedPath))) {
469
- throw new Error('Path normalization resulted in directory traversal');
466
+ // Check if path is within the portfolio directory
467
+ const portfolioManager = PortfolioManager.getInstance();
468
+ const portfolioBase = portfolioManager.getBaseDir();
469
+ // For absolute paths, verify they're within the portfolio directory
470
+ if (path.isAbsolute(normalizedPath)) {
471
+ const resolvedPath = path.resolve(normalizedPath);
472
+ const resolvedBase = path.resolve(portfolioBase);
473
+ // Path must be within the portfolio directory
474
+ if (!resolvedPath.startsWith(resolvedBase)) {
475
+ throw new Error('Path is outside portfolio directory');
476
+ }
477
+ }
478
+ else if (normalizedPath.includes('..')) {
479
+ // Relative paths with .. are not allowed
480
+ throw new Error('Path contains directory traversal');
470
481
  }
471
482
  }
472
483
  catch (error) {
@@ -1520,4 +1531,4 @@ export class SubmitToPortfolioTool {
1520
1531
  return false;
1521
1532
  }
1522
1533
  }
1523
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0VG9Qb3J0Zm9saW9Ub29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xzL3BvcnRmb2xpby9zdWJtaXRUb1BvcnRmb2xpb1Rvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFHcEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBaUIsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixhQUFhLEVBRWIsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNwQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxz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UUFBUSxDQUFDLFlBQVksQ0FBQztZQUNuQyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsa0RBQWtEO1FBQ2xELElBQUksVUFBVSxLQUFLLEdBQUcsSUFBSSxVQUFVLEtBQUssR0FBRztZQUN4QyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQztZQUNyQyxZQUFZLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUNsQyxZQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUM1QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxVQUFVLEtBQUssR0FBRyxJQUFJLFVBQVUsS0FBSyxHQUFHO1lBQ3hDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQ2hDLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxxRUFBcUU7UUFDckUsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRvb2wgZm9yIHN1Ym1pdHRpbmcgY29udGVudCB0byBHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcmllc1xuICogUmVwbGFjZXMgdGhlIGJyb2tlbiBpc3N1ZS1iYXNlZCBzdWJtaXNzaW9uIHdpdGggZGlyZWN0IHJlcG9zaXRvcnkgc2F2ZXNcbiAqIFxuICogRklYRVMgSU1QTEVNRU5URUQgKFBSICM1MDMpOlxuICogMS4gVFlQRSBTQUZFVFkgRklYICMxIChJc3N1ZSAjNDk3KTogQ2hhbmdlZCBhcGlDYWNoZSBmcm9tICdhbnknIHRvIHByb3BlciBBUElDYWNoZSB0eXBlXG4gKiAyLiBUWVBFIFNBRkVUWSBGSVggIzIgKElzc3VlICM0OTcpOiBSZXBsYWNlZCBjb21wbGV4IHR5cGUgY2FzdGluZyB3aXRoIFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyXG4gKiAzLiBQRVJGT1JNQU5DRSAoUFIgIzQ5NiByZWNvbW1lbmRhdGlvbik6IFVzaW5nIEZpbGVEaXNjb3ZlcnlVdGlsIGZvciBvcHRpbWl6ZWQgZmlsZSBzZWFyY2hcbiAqL1xuXG5pbXBvcnQgeyBHaXRIdWJBdXRoTWFuYWdlciB9IGZyb20gJy4uLy4uL2F1dGgvR2l0SHViQXV0aE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvUmVwb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvUmVwb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgVG9rZW5NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdG9rZW5NYW5hZ2VyLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9JbmRleE1hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBQYXRoVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvcGF0aFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBBUElDYWNoZSB9IGZyb20gJy4uLy4uL2NhY2hlL0FQSUNhY2hlLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb0VsZW1lbnRBZGFwdGVyIH0gZnJvbSAnLi9Qb3J0Zm9saW9FbGVtZW50QWRhcHRlci5qcyc7XG5pbXBvcnQgeyBGaWxlRGlzY292ZXJ5VXRpbCB9IGZyb20gJy4uLy4uL3V0aWxzL0ZpbGVEaXNjb3ZlcnlVdGlsLmpzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlciwgRXJyb3JDYXRlZ29yeSB9IGZyb20gJy4uLy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBcbiAgR0lUSFVCX0FQSV9USU1FT1VULCBcbiAgRklMRV9TSVpFX0xJTUlUUywgXG4gIFJFVFJZX0NPTkZJRywgXG4gIFNFQVJDSF9DT05GSUcsXG4gIFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YSxcbiAgZ2V0VmFsaWRhdGVkVGltZW91dCxcbiAgY2FsY3VsYXRlUmV0cnlEZWxheVxufSBmcm9tICcuLi8uLi9jb25maWcvcG9ydGZvbGlvLWNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBnaXRodWJSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL0dpdEh1YlJhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IEVhcmx5VGVybWluYXRpb25TZWFyY2ggfSBmcm9tICcuLi8uLi91dGlscy9FYXJseVRlcm1pbmF0aW9uU2VhcmNoLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VibWl0VG9Qb3J0Zm9saW9QYXJhbXMge1xuICBuYW1lOiBzdHJpbmc7XG4gIHR5cGU/OiBFbGVtZW50VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3J0Zm9saW9FbGVtZW50IHtcbiAgdHlwZTogRWxlbWVudFR5cGU7XG4gIG1ldGFkYXRhOiBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGE7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdCB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgdXJsPzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RGV0ZWN0aW9uTWF0Y2gge1xuICB0eXBlOiBFbGVtZW50VHlwZTtcbiAgcGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnREZXRlY3Rpb25SZXN1bHQge1xuICBmb3VuZDogYm9vbGVhbjtcbiAgbWF0Y2hlczogRWxlbWVudERldGVjdGlvbk1hdGNoW107XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJtaXRUb1BvcnRmb2xpb1Rvb2wge1xuICBwcml2YXRlIGF1dGhNYW5hZ2VyOiBHaXRIdWJBdXRoTWFuYWdlcjtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9SZXBvTWFuYWdlcjtcbiAgcHJpdmF0ZSBjb250ZW50VmFsaWRhdG9yOiBDb250ZW50VmFsaWRhdG9yO1xuXG4gIGNvbnN0cnVjdG9yKGFwaUNhY2hlOiBBUElDYWNoZSkge1xuICAgIC8vIFRZUEUgU0FGRVRZIEZJWCAjMTogUHJvcGVyIHR5cGluZyBmb3IgYXBpQ2FjaGUgcGFyYW1ldGVyXG4gICAgLy8gUHJldmlvdXNseTogY29uc3RydWN0b3IoYXBpQ2FjaGU6IGFueSlcbiAgICAvLyBOb3c6IGNvbnN0cnVjdG9yKGFwaUNhY2hlOiBBUElDYWNoZSkgd2l0aCBwcm9wZXIgaW1wb3J0XG4gICAgdGhpcy5hdXRoTWFuYWdlciA9IG5ldyBHaXRIdWJBdXRoTWFuYWdlcihhcGlDYWNoZSk7XG4gICAgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyID0gbmV3IFBvcnRmb2xpb1JlcG9NYW5hZ2VyKCk7XG4gICAgdGhpcy5jb250ZW50VmFsaWRhdG9yID0gbmV3IENvbnRlbnRWYWxpZGF0b3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYW5kIG5vcm1hbGl6ZXMgaW5wdXQgcGFyYW1ldGVycyB0byBwcmV2ZW50IFVuaWNvZGUgYXR0YWNrcyBhbmQgZW5zdXJlIGRhdGEgc2FmZXR5XG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIGlucHV0IHBhcmFtZXRlcnMgZnJvbSB0aGUgdXNlclxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIG5vcm1hbGl6ZWQgbmFtZSBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUFuZE5vcm1hbGl6ZVBhcmFtcyhwYXJhbXM6IFN1Ym1pdFRvUG9ydGZvbGlvUGFyYW1zKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBzYWZlTmFtZT86IHN0cmluZztcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgLy8gTm9ybWFsaXplIHVzZXIgaW5wdXQgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgKERNQ1AtU0VDLTAwNClcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHBhcmFtcy5uYW1lKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWROYW1lLmlzVmFsaWQpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1VOSUNPREVfVkFMSURBVElPTl9FUlJPUicsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLmV4ZWN1dGUnLFxuICAgICAgICBkZXRhaWxzOiBgSW52YWxpZCBVbmljb2RlIGluIGVsZW1lbnQgbmFtZTogJHtub3JtYWxpemVkTmFtZS5kZXRlY3RlZElzc3Vlcz8uWzBdIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBJbnZhbGlkIGNoYXJhY3RlcnMgaW4gZWxlbWVudCBuYW1lOiAke25vcm1hbGl6ZWROYW1lLmRldGVjdGVkSXNzdWVzPy5bMF0gfHwgJ3Vua25vd24gZXJyb3InfWAsXG4gICAgICAgICAgZXJyb3I6ICdJTlZBTElEX0lOUFVUJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIHNhZmVOYW1lOiBub3JtYWxpemVkTmFtZS5ub3JtYWxpemVkQ29udGVudFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQgd2l0aCBHaXRIdWJcbiAgICogQHJldHVybnMgQXV0aGVudGljYXRpb24gY2hlY2sgcmVzdWx0IHdpdGggc3RhdHVzIG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrQXV0aGVudGljYXRpb24oKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBhdXRoU3RhdHVzPzogYW55O1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICBjb25zdCBhdXRoU3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoTWFuYWdlci5nZXRBdXRoU3RhdHVzKCk7XG4gICAgaWYgKCFhdXRoU3RhdHVzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgLy8gTG9nIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkICh1c2luZyBleGlzdGluZyBldmVudCB0eXBlKVxuICAgICAgbG9nZ2VyLndhcm4oJ1VzZXIgYXR0ZW1wdGVkIHBvcnRmb2xpbyBzdWJtaXNzaW9uIHdpdGhvdXQgYXV0aGVudGljYXRpb24nKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdOb3QgYXV0aGVudGljYXRlZC4gUGxlYXNlIGF1dGhlbnRpY2F0ZSBmaXJzdCB1c2luZyB0aGUgR2l0SHViIE9BdXRoIGZsb3cuXFxuXFxuJyArXG4gICAgICAgICAgICAgICAgICAgJ1Zpc2l0OiBodHRwczovL2RvY3MuYW50aHJvcGljLmNvbS9lbi9kb2NzL2NsYXVkZS1jb2RlL29hdXRoLXNldHVwXFxuJyArXG4gICAgICAgICAgICAgICAgICAgJ09yIHJ1bjogZ2ggYXV0aCBsb2dpbiAtLXdlYicsXG4gICAgICAgICAgZXJyb3I6ICdOT1RfQVVUSEVOVElDQVRFRCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGF1dGhTdGF0dXNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvdmVycyBjb250ZW50IGxvY2FsbHkgd2l0aCBzbWFydCB0eXBlIGRldGVjdGlvblxuICAgKiBAcGFyYW0gc2FmZU5hbWUgVGhlIG5vcm1hbGl6ZWQgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAqIEBwYXJhbSBleHBsaWNpdFR5cGUgT3B0aW9uYWwgZXhwbGljaXQgZWxlbWVudCB0eXBlIHByb3ZpZGVkIGJ5IHVzZXJcbiAgICogQHBhcmFtIG9yaWdpbmFsTmFtZSBPcmlnaW5hbCB1c2VyLXByb3ZpZGVkIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzXG4gICAqIEByZXR1cm5zIENvbnRlbnQgZGlzY292ZXJ5IHJlc3VsdCB3aXRoIGVsZW1lbnQgdHlwZSBhbmQgcGF0aCBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNjb3ZlckNvbnRlbnRXaXRoVHlwZURldGVjdGlvbihcbiAgICBzYWZlTmFtZTogc3RyaW5nLCBcbiAgICBleHBsaWNpdFR5cGU/OiBFbGVtZW50VHlwZSwgXG4gICAgb3JpZ2luYWxOYW1lPzogc3RyaW5nXG4gICk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgZWxlbWVudFR5cGU/OiBFbGVtZW50VHlwZTtcbiAgICBsb2NhbFBhdGg/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIGxldCBlbGVtZW50VHlwZSA9IGV4cGxpY2l0VHlwZTtcbiAgICBsZXQgbG9jYWxQYXRoOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBcbiAgICBpZiAoZWxlbWVudFR5cGUpIHtcbiAgICAgIC8vIFR5cGUgZXhwbGljaXRseSBwcm92aWRlZCAtIHNlYXJjaCBpbiB0aGF0IHNwZWNpZmljIGRpcmVjdG9yeSBvbmx5XG4gICAgICBsb2NhbFBhdGggPSBhd2FpdCB0aGlzLmZpbmRMb2NhbENvbnRlbnQoc2FmZU5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICAgIGlmICghbG9jYWxQYXRoKSB7XG4gICAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBQcm92aWRlIGhlbHBmdWwgc3VnZ2VzdGlvbnMgZm9yIGZpbmRpbmcgY29udGVudFxuICAgICAgICBjb25zdCBwb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCBlbGVtZW50RGlyID0gcG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYENvdWxkIG5vdCBmaW5kICR7ZWxlbWVudFR5cGV9IG5hbWVkIFwiJHtvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWV9XCIgaW4gbG9jYWwgcG9ydGZvbGlvLlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipTZWFyY2hlZCBpbioqOiAke2VsZW1lbnREaXJ9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAqKlRyb3VibGVzaG9vdGluZyBUaXBzKio6XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgQ2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzIHVzaW5nIHlvdXIgZmlsZSBleHBsb3JlclxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFRyeSB1c2luZyB0aGUgZXhhY3QgZmlsZW5hbWUgKHdpdGhvdXQgZXh0ZW5zaW9uKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFVzZSBcXGBsaXN0X3BvcnRmb2xpb1xcYCB0byBzZWUgYWxsIGF2YWlsYWJsZSAke2VsZW1lbnRUeXBlfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIElmIHVuc3VyZSBvZiB0aGUgdHlwZSwgb21pdCAtLXR5cGUgYW5kIGxldCB0aGUgc3lzdGVtIGRldGVjdCBpdFxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipDb21tb24gbmFtZSBmb3JtYXRzIHRoYXQgd29yayoqOlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFwibXktZWxlbWVudFwiIChrZWJhYi1jYXNlKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFwiTXkgRWxlbWVudFwiICh3aXRoIHNwYWNlcylcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBcIk15RWxlbWVudFwiIChQYXNjYWxDYXNlKVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFBhcnRpYWwgbWF0Y2hlcyBhcmUgc3VwcG9ydGVkYCxcbiAgICAgICAgICAgIGVycm9yOiAnQ09OVEVOVF9OT1RfRk9VTkQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDUklUSUNBTCBGSVg6IE5vIHR5cGUgcHJvdmlkZWQgLSBpbXBsZW1lbnQgc21hcnQgZGV0ZWN0aW9uIGFjcm9zcyBBTEwgZWxlbWVudCB0eXBlc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgcHJldmlvdXMgaGFyZGNvZGVkIGRlZmF1bHQgdG8gUEVSU09OQSBhbmQgZW5hYmxlcyBwcm9wZXIgdHlwZSBkZXRlY3Rpb25cbiAgICAgIGNvbnN0IGRldGVjdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMuZGV0ZWN0RWxlbWVudFR5cGUoc2FmZU5hbWUpO1xuICAgICAgXG4gICAgICBpZiAoIWRldGVjdGlvblJlc3VsdC5mb3VuZCkge1xuICAgICAgICAvLyBVWCBJTVBST1ZFTUVOVDogRW5oYW5jZWQgZ3VpZGFuY2Ugd2l0aCBzcGVjaWZpYyBzdWdnZXN0aW9uc1xuICAgICAgICBjb25zdCBhdmFpbGFibGVUeXBlcyA9IE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgc3VnZ2VzdGlvbnMgZm9yIHNpbWlsYXIgbmFtZXNcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlTmFtZVN1Z2dlc3Rpb25zKHNhZmVOYW1lKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBtZXNzYWdlID0gYENvbnRlbnQgXCIke29yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZX1cIiBub3QgZm91bmQgaW4gcG9ydGZvbGlvLlxcblxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYPCflI0gKipTZWFyY2hlZCBpbiBhbGwgZWxlbWVudCB0eXBlcyoqOiAke2F2YWlsYWJsZVR5cGVzfVxcblxcbmA7XG4gICAgICAgIFxuICAgICAgICBpZiAoc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYPCfkqEgKipEaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlPyoqXFxuYDtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN1Z2dlc3Rpb24gb2Ygc3VnZ2VzdGlvbnMuc2xpY2UoMCwgU0VBUkNIX0NPTkZJRy5NQVhfU1VHR0VTVElPTlMpKSB7XG4gICAgICAgICAgICBtZXNzYWdlICs9IGAgIOKAoiBcIiR7c3VnZ2VzdGlvbi5uYW1lfVwiICgke3N1Z2dlc3Rpb24udHlwZX0pXFxuYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVzc2FnZSArPSBgXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbWVzc2FnZSArPSBg8J+boO+4jyAqKlRyb3VibGVzaG9vdGluZyBTdGVwcyoqOlxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYDEuIPCfk50gVXNlIFxcYGxpc3RfcG9ydGZvbGlvXFxgIHRvIHNlZSBhbGwgYXZhaWxhYmxlIGNvbnRlbnRcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAyLiDwn5SNIENoZWNrIGV4YWN0IHNwZWxsaW5nIGFuZCB0cnkgdmFyaWF0aW9uczpcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAgICDigKIgXCIkeyhvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWUpLnRvTG93ZXJDYXNlKCl9XCIgKGxvd2VyY2FzZSlcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAgICDigKIgXCIkeyhvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWUpLnJlcGxhY2UoL1teYS16MC05XS9naSwgJy0nKS50b0xvd2VyQ2FzZSgpfVwiIChub3JtYWxpemVkKVxcbmA7XG4gICAgICAgIGlmICgob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBgICAg4oCiIFwiJHsob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS5yZXBsYWNlKC9cXC4vZywgJycpfVwiIChubyBkb3RzKVxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnZSArPSBgMy4g8J+OryBTcGVjaWZ5IGVsZW1lbnQgdHlwZTogXFxgc3VibWl0X2NvbnRlbnQgXCIke29yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZX1cIiAtLXR5cGU9cGVyc29uYXNcXGBcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGA0LiDwn5OBIENoZWNrIGlmIGZpbGUgZXhpc3RzIGluIHBvcnRmb2xpbyBkaXJlY3Rvcmllc1xcblxcbmA7XG4gICAgICAgIG1lc3NhZ2UgKz0gYPCfk50gKipUaXAqKjogVGhlIHN5c3RlbSBzZWFyY2hlcyBmaWxlbmFtZXMgQU5EIG1ldGFkYXRhIG5hbWVzIHdpdGggZnV6enkgbWF0Y2hpbmcuYDtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgIGVycm9yOiAnQ09OVEVOVF9OT1RfRk9VTkQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZGV0ZWN0aW9uUmVzdWx0Lm1hdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBNdWx0aXBsZSBtYXRjaGVzIGZvdW5kIC0gYXNrIHVzZXIgdG8gc3BlY2lmeSB0eXBlXG4gICAgICAgIGNvbnN0IG1hdGNoRGV0YWlscyA9IGRldGVjdGlvblJlc3VsdC5tYXRjaGVzLm1hcChtID0+IGAtICR7bS50eXBlfTogJHttLnBhdGh9YCkuam9pbignXFxuJyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogYENvbnRlbnQgXCIke29yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZX1cIiBmb3VuZCBpbiBtdWx0aXBsZSBlbGVtZW50IHR5cGVzOlxcblxcbiR7bWF0Y2hEZXRhaWxzfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgUGxlYXNlIHNwZWNpZnkgdGhlIGVsZW1lbnQgdHlwZSB1c2luZyB0aGUgLS10eXBlIHBhcmFtZXRlciB0byBhdm9pZCBhbWJpZ3VpdHkuYCxcbiAgICAgICAgICAgIGVycm9yOiAnTVVMVElQTEVfTUFUQ0hFU19GT1VORCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNpbmdsZSBtYXRjaCBmb3VuZCAtIHVzZSBpdFxuICAgICAgY29uc3QgbWF0Y2ggPSBkZXRlY3Rpb25SZXN1bHQubWF0Y2hlc1swXTtcbiAgICAgIGVsZW1lbnRUeXBlID0gbWF0Y2gudHlwZTtcbiAgICAgIGxvY2FsUGF0aCA9IG1hdGNoLnBhdGg7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKGBTbWFydCBkZXRlY3Rpb246IEZvdW5kIFwiJHtzYWZlTmFtZX1cIiBhcyAke2VsZW1lbnRUeXBlfWAsIHsgXG4gICAgICAgIG5hbWU6IHNhZmVOYW1lLFxuICAgICAgICBkZXRlY3RlZFR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICBwYXRoOiBsb2NhbFBhdGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgZWxlbWVudFR5cGUsXG4gICAgICBsb2NhbFBhdGhcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBmaWxlIHNpemUgYW5kIGNvbnRlbnQgc2VjdXJpdHkgYmVmb3JlIHByb2Nlc3NpbmdcbiAgICogQHBhcmFtIGxvY2FsUGF0aCBQYXRoIHRvIHRoZSBsb2NhbCBmaWxlIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggY29udGVudCBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZUZpbGVBbmRDb250ZW50KGxvY2FsUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBjb250ZW50Pzogc3RyaW5nO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICAvLyBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjNyk6IFZhbGlkYXRlIGZpbGUgcGF0aCBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgIGNvbnN0IHBhdGhWYWxpZGF0aW9uID0gYXdhaXQgdGhpcy52YWxpZGF0ZVBvcnRmb2xpb1BhdGgobG9jYWxQYXRoKTtcbiAgICBpZiAoIXBhdGhWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjogcGF0aFZhbGlkYXRpb24uZXJyb3JcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSB2YWxpZGF0ZWQgc2FmZSBwYXRoIGZvciBhbGwgc3Vic2VxdWVudCBvcGVyYXRpb25zXG4gICAgY29uc3Qgc2FmZVBhdGggPSBwYXRoVmFsaWRhdGlvbi5zYWZlUGF0aCE7XG5cbiAgICAvLyBWYWxpZGF0ZSBmaWxlIHNpemUgYmVmb3JlIHJlYWRpbmdcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQoc2FmZVBhdGgpO1xuICAgIGlmIChzdGF0cy5zaXplID4gRklMRV9TSVpFX0xJTUlUUy5NQVhfRklMRV9TSVpFKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wuZXhlY3V0ZScsXG4gICAgICAgIGRldGFpbHM6IGBGaWxlIHNpemUgJHtzdGF0cy5zaXplfSBleGNlZWRzIGxpbWl0IG9mICR7RklMRV9TSVpFX0xJTUlUUy5NQVhfRklMRV9TSVpFfWBcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogYEZpbGUgc2l6ZSBleGNlZWRzICR7RklMRV9TSVpFX0xJTUlUUy5NQVhfRklMRV9TSVpFX01CfU1CIGxpbWl0YCxcbiAgICAgICAgICBlcnJvcjogJ0ZJTEVfVE9PX0xBUkdFJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNvbnRlbnQgc2VjdXJpdHlcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoc2FmZVBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoY29udGVudCk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCAmJiB2YWxpZGF0aW9uUmVzdWx0LnNldmVyaXR5ID09PSAnY3JpdGljYWwnKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLmV4ZWN1dGUnLFxuICAgICAgICBkZXRhaWxzOiBgQ3JpdGljYWwgc2VjdXJpdHkgaXNzdWVzIGRldGVjdGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBDb250ZW50IHZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gLFxuICAgICAgICAgIGVycm9yOiAnVkFMSURBVElPTl9GQUlMRUQnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBjb250ZW50XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBtZXRhZGF0YSBmb3IgdGhlIHBvcnRmb2xpbyBlbGVtZW50XG4gICAqIEBwYXJhbSBzYWZlTmFtZSBUaGUgbm9ybWFsaXplZCBuYW1lIG9mIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBlbGVtZW50VHlwZSBUaGUgdHlwZSBvZiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gYXV0aFN0YXR1cyBBdXRoZW50aWNhdGlvbiBzdGF0dXMgY29udGFpbmluZyB1c2VybmFtZVxuICAgKiBAcmV0dXJucyBNZXRhZGF0YSBvYmplY3QgZm9yIHRoZSBlbGVtZW50XG4gICAqL1xuICBwcml2YXRlIHByZXBhcmVFbGVtZW50TWV0YWRhdGEoXG4gICAgc2FmZU5hbWU6IHN0cmluZywgXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLCBcbiAgICBhdXRoU3RhdHVzOiBhbnlcbiAgKTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogc2FmZU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7ZWxlbWVudFR5cGV9IHN1Ym1pdHRlZCBmcm9tIGxvY2FsIHBvcnRmb2xpb2AsXG4gICAgICBhdXRob3I6IGF1dGhTdGF0dXMudXNlcm5hbWUgfHwgJ3Vua25vd24nLFxuICAgICAgY3JlYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgdmVyc2lvbjogJzEuMC4wJ1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIEdpdEh1YiB0b2tlbiBhbmQgY2hlY2tzIGZvciBleHBpcmF0aW9uIGJlZm9yZSB1c2FnZVxuICAgKiBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjNSk6IFRva2VuIGV4cGlyYXRpb24gdmFsaWRhdGlvbiB0byBwcmV2ZW50IHN0YWxlIHRva2VuIHVzYWdlXG4gICAqIEBwYXJhbSB0b2tlbiBUaGUgR2l0SHViIHRva2VuIHRvIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IHdpdGggc3RhdHVzIGFuZCBleHBpcmF0aW9uIGluZm9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgICBpc1ZhbGlkOiBib29sZWFuO1xuICAgIGlzTmVhckV4cGlyeT86IGJvb2xlYW47XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayB0b2tlbiBmb3JtYXQgZmlyc3QgKGJhc2ljIHZhbGlkYXRpb24pXG4gICAgICBpZiAoIVRva2VuTWFuYWdlci52YWxpZGF0ZVRva2VuRm9ybWF0KHRva2VuKSkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICAgIGRldGFpbHM6ICdUb2tlbiBoYXMgaW52YWxpZCBmb3JtYXQnXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCB0b2tlbiBmb3JtYXQuIFBsZWFzZSByZS1hdXRoZW50aWNhdGUuJyxcbiAgICAgICAgICAgIGVycm9yOiAnSU5WQUxJRF9UT0tFTl9GT1JNQVQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0b2tlbiB3aXRoIEdpdEh1YiBBUEkgdG8gY2hlY2sgZXhwaXJhdGlvbiBhbmQgcGVybWlzc2lvbnNcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCBUb2tlbk1hbmFnZXIudmFsaWRhdGVUb2tlblNjb3Blcyh0b2tlbiwge1xuICAgICAgICByZXF1aXJlZDogWydyZXBvJ10sXG4gICAgICAgIG9wdGlvbmFsOiBbJ3VzZXI6ZW1haWwnXVxuICAgICAgfSk7XG5cbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlVG9rZW5CZWZvcmVVc2FnZScsXG4gICAgICAgICAgZGV0YWlsczogYFRva2VuIHZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3J9YFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdHaXRIdWIgdG9rZW4gaXMgaW52YWxpZCBvciBleHBpcmVkLiBQbGVhc2UgcmUtYXV0aGVudGljYXRlLicsXG4gICAgICAgICAgICBlcnJvcjogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTEVEJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdG9rZW4gaXMgbmVhciBleHBpcmF0aW9uIChyYXRlIGxpbWl0IHJlc2V0IHRpbWUgY2FuIGluZGljYXRlIHRva2VuIGZyZXNobmVzcylcbiAgICAgIGxldCBpc05lYXJFeHBpcnkgPSBmYWxzZTtcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdD8ucmVzZXRUaW1lKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgIGNvbnN0IHRpbWVVbnRpbFJlc2V0ID0gdmFsaWRhdGlvblJlc3VsdC5yYXRlTGltaXQucmVzZXRUaW1lLmdldFRpbWUoKSAtIG5vdy5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IG9uZUhvdXIgPSA2MCAqIDYwICogMTAwMDtcbiAgICAgICAgXG4gICAgICAgIC8vIENvbnNpZGVyIHRva2VuIFwibmVhciBleHBpcnlcIiBpZiByYXRlIGxpbWl0IHJlc2V0IGlzIG1vcmUgdGhhbiAyMyBob3VycyBhd2F5XG4gICAgICAgIC8vIChHaXRIdWIgcmF0ZSBsaW1pdHMgcmVzZXQgZXZlcnkgaG91ciwgc28gdGhpcyBzdWdnZXN0cyB0b2tlbiBhZ2UpXG4gICAgICAgIGlmICh0aW1lVW50aWxSZXNldCA+IDIzICogb25lSG91cikge1xuICAgICAgICAgIGlzTmVhckV4cGlyeSA9IHRydWU7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0dpdEh1YiB0b2tlbiBtYXkgYmUgbmVhciBleHBpcmF0aW9uJywge1xuICAgICAgICAgICAgdG9rZW5QcmVmaXg6IFRva2VuTWFuYWdlci5nZXRUb2tlblByZWZpeCh0b2tlbiksXG4gICAgICAgICAgICByYXRlTGltaXRSZXNldFRpbWU6IHZhbGlkYXRpb25SZXN1bHQucmF0ZUxpbWl0LnJlc2V0VGltZSxcbiAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ29uc2lkZXIgcmUtYXV0aGVudGljYXRpbmcgZm9yIGxvbmcgb3BlcmF0aW9ucydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCB2YWxpZGF0aW9uXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIHRva2VuIHZhbGlkYXRlZCBzdWNjZXNzZnVsbHkgYmVmb3JlIHVzYWdlJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB0b2tlblR5cGU6IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pLFxuICAgICAgICAgIHNjb3BlczogdmFsaWRhdGlvblJlc3VsdC5zY29wZXMsXG4gICAgICAgICAgcmF0ZUxpbWl0UmVtYWluaW5nOiB2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdD8ucmVtYWluaW5nLFxuICAgICAgICAgIGlzTmVhckV4cGlyeVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgaXNOZWFyRXhwaXJ5XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSGFuZGxlIHJhdGUgbGltaXQgZXhjZWVkZWQgc3BlY2lmaWNhbGx5XG4gICAgICBpZiAoZXJyb3I/LmNvZGUgPT09ICdSQVRFX0xJTUlUX0VYQ0VFREVEJykge1xuICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0ZWQsIGFsbG93aW5nIG9wZXJhdGlvbiB0byBwcm9jZWVkIHdpdGggY2FjaGVkIHN0YXR1cycpO1xuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiB0cnVlIH07IC8vIEFsbG93IHRvIHByb2NlZWQgaWYgcmF0ZSBsaW1pdGVkLCBhcyBiYXNpYyBmb3JtYXQgY2hlY2sgcGFzc2VkXG4gICAgICB9XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICBkZXRhaWxzOiBgVG9rZW4gdmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlIHx8ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byB2YWxpZGF0ZSBHaXRIdWIgdG9rZW4uIFBsZWFzZSBjaGVjayB5b3VyIGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAgIGVycm9yOiAnVE9LRU5fVkFMSURBVElPTl9FUlJPUidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZWQgcGF0aCB2YWxpZGF0aW9uIGZvciBwb3J0Zm9saW8gb3BlcmF0aW9ucyB3aXRoIGNvbXByZWhlbnNpdmUgc2VjdXJpdHkgY2hlY2tzXG4gICAqIFNFQ1VSSVRZIEVOSEFOQ0VNRU5UIChUYXNrICM3KTogQWRkaXRpb25hbCB2YWxpZGF0aW9uIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIG1hbGljaW91cyBwYXR0ZXJuc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggVGhlIGZpbGUgcGF0aCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHNlY3VyZSBwYXRoIG9yIGVycm9yIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlUG9ydGZvbGlvUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgaXNWYWxpZDogYm9vbGVhbjtcbiAgICBzYWZlUGF0aD86IHN0cmluZztcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEJhc2ljIG51bGwvdW5kZWZpbmVkIGNoZWNrXG4gICAgICBpZiAoIWZpbGVQYXRoIHx8IHR5cGVvZiBmaWxlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogJ0ludmFsaWQgcGF0aCBwcm92aWRlZCAtIG51bGwsIHVuZGVmaW5lZCwgb3Igbm9uLXN0cmluZydcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGZpbGUgcGF0aCBwcm92aWRlZCcsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfUEFUSCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBzdXNwaWNpb3VzIHBhdHRlcm5zIHRoYXQgY291bGQgaW5kaWNhdGUgcGF0aCB0cmF2ZXJzYWwgb3IgaW5qZWN0aW9uXG4gICAgICBjb25zdCBzdXNwaWNpb3VzUGF0dGVybnMgPSBbXG4gICAgICAgIC9cXC5cXC4vLCAgICAgICAgICAgICAgICAgICAgLy8gUGF0aCB0cmF2ZXJzYWxcbiAgICAgICAgL1xcL1xcLlxcLi8sICAgICAgICAgICAgICAgICAgLy8gVW5peCBwYXRoIHRyYXZlcnNhbFxuICAgICAgICAvXFxcXFxcLlxcLi8sICAgICAgICAgICAgICAgICAgLy8gV2luZG93cyBwYXRoIHRyYXZlcnNhbFxuICAgICAgICAvXFx4MDAvLCAgICAgICAgICAgICAgICAgICAgLy8gTnVsbCBieXRlc1xuICAgICAgICAvW1xceDAxLVxceDFmXFx4N2YtXFx4OWZdLywgICAgLy8gQ29udHJvbCBjaGFyYWN0ZXJzXG4gICAgICAgIC9bPD46XCJ8PypdLywgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGZpbGVuYW1lIGNoYXJhY3RlcnMgb24gV2luZG93c1xuICAgICAgICAvXihDT058UFJOfEFVWHxOVUx8Q09NWzEtOV18TFBUWzEtOV0pJC9pLCAvLyBSZXNlcnZlZCBXaW5kb3dzIG5hbWVzXG4gICAgICAgIC9eXFwuLywgICAgICAgICAgICAgICAgICAgICAvLyBIaWRkZW4gZmlsZXMgKHN0YXJ0aW5nIHdpdGggZG90KVxuICAgICAgICAvXFxzKyQvLCAgICAgICAgICAgICAgICAgICAgLy8gVHJhaWxpbmcgd2hpdGVzcGFjZVxuICAgICAgICAvXltcXHNdKiQvLCAgICAgICAgICAgICAgICAgLy8gT25seSB3aGl0ZXNwYWNlXG4gICAgICAgIC8lWzAtOWEtZkEtRl17Mn0vLCAgICAgICAgIC8vIFVSTCBlbmNvZGluZyAocG90ZW50aWFsIGJ5cGFzcyBhdHRlbXB0KVxuICAgICAgICAvXFxcXHhbMC05YS1mQS1GXXsyfS8sICAgICAgIC8vIEhleCBlbmNvZGluZ1xuICAgICAgICAvXFwkXFx7LipcXH0vLCAgICAgICAgICAgICAgICAvLyBUZW1wbGF0ZSBsaXRlcmFsIGluamVjdGlvblxuICAgICAgICAvYC4qYC8sICAgICAgICAgICAgICAgICAgICAvLyBCYWNrdGljayBpbmplY3Rpb25cbiAgICAgICAgL1tcXFxcXFwvXXsyLH0vICAgICAgICAgICAgICAgLy8gTXVsdGlwbGUgY29uc2VjdXRpdmUgc2xhc2hlc1xuICAgICAgXTtcblxuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHN1c3BpY2lvdXNQYXR0ZXJucykge1xuICAgICAgICBpZiAocGF0dGVybi50ZXN0KGZpbGVQYXRoKSkge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBTdXNwaWNpb3VzIHBhdHRlcm4gZGV0ZWN0ZWQgaW4gZmlsZSBwYXRoOiAke3BhdHRlcm4uc291cmNlfWAsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBwYXRoTGVuZ3RoOiBmaWxlUGF0aC5sZW5ndGgsXG4gICAgICAgICAgICAgIHBhdHRlcm46IHBhdHRlcm4uc291cmNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggY29udGFpbnMgaW52YWxpZCBvciBzdXNwaWNpb3VzIGNoYXJhY3RlcnMnLFxuICAgICAgICAgICAgICBlcnJvcjogJ1NVU1BJQ0lPVVNfUEFUSF9QQVRURVJOJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgcGF0aCBsZW5ndGggKHByZXZlbnQgYnVmZmVyIG92ZXJmbG93IGF0dGVtcHRzKVxuICAgICAgY29uc3QgTUFYX1BBVEhfTEVOR1RIID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IDI2MCA6IDQwOTY7XG4gICAgICBpZiAoZmlsZVBhdGgubGVuZ3RoID4gTUFYX1BBVEhfTEVOR1RIKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBGaWxlIHBhdGggZXhjZWVkcyBtYXhpbXVtIGxlbmd0aDogJHtmaWxlUGF0aC5sZW5ndGh9ID4gJHtNQVhfUEFUSF9MRU5HVEh9YFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZpbGUgcGF0aCBpcyB0b28gbG9uZycsXG4gICAgICAgICAgICBlcnJvcjogJ1BBVEhfVE9PX0xPTkcnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBOb3JtYWxpemUgcGF0aCB0byByZXNvbHZlIGFueSByZWxhdGl2ZSBjb21wb25lbnRzIHNhZmVseVxuICAgICAgbGV0IG5vcm1hbGl6ZWRQYXRoOiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBSZW1vdmUgbnVsbCBieXRlcyBhbmQgbm9ybWFsaXplXG4gICAgICAgIGNvbnN0IGNsZWFuUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UoL1xceDAwL2csICcnKTtcbiAgICAgICAgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShjbGVhblBhdGgpO1xuICAgICAgICBcbiAgICAgICAgLy8gRW5zdXJlIHRoZSBub3JtYWxpemVkIHBhdGggZG9lc24ndCBlc2NhcGUgdGhlIGludGVuZGVkIGRpcmVjdG9yeVxuICAgICAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy4uJykgfHwgbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCgnLycpIHx8IFxuICAgICAgICAgICAgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgJiYgL15bYS16QS1aXTovLnRlc3Qobm9ybWFsaXplZFBhdGgpKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCBub3JtYWxpemF0aW9uIHJlc3VsdGVkIGluIGRpcmVjdG9yeSB0cmF2ZXJzYWwnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBQYXRoIG5vcm1hbGl6YXRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggY291bGQgbm90IGJlIHNhZmVseSBwcm9jZXNzZWQnLFxuICAgICAgICAgICAgZXJyb3I6ICdQQVRIX05PUk1BTElaQVRJT05fRkFJTEVEJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZmlsZSBleHRlbnNpb24gKG9ubHkgYWxsb3cgc2FmZSBleHRlbnNpb25zIGZvciBwb3J0Zm9saW8gY29udGVudClcbiAgICAgIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gWycubWQnLCAnLm1hcmtkb3duJywgJy50eHQnLCAnLnltbCcsICcueWFtbCcsICcuanNvbiddO1xuICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShub3JtYWxpemVkUGF0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgaWYgKGZpbGVFeHRlbnNpb24gJiYgIWFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBEaXNhbGxvd2VkIGZpbGUgZXh0ZW5zaW9uOiAke2ZpbGVFeHRlbnNpb259YCxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgYWxsb3dlZEV4dGVuc2lvbnM6IGFsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywgJylcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgRmlsZSBleHRlbnNpb24gJyR7ZmlsZUV4dGVuc2lvbn0nIGlzIG5vdCBhbGxvd2VkLiBBbGxvd2VkIGV4dGVuc2lvbnM6ICR7YWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgZXJyb3I6ICdJTlZBTElEX0ZJTEVfRVhURU5TSU9OJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZmlsZW5hbWUgY2hhcmFjdGVycyAob25seSBhbGxvdyBzYWZlIGNoYXJhY3RlcnMpXG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUobm9ybWFsaXplZFBhdGgpO1xuICAgICAgY29uc3Qgc2FmZUZpbGVuYW1lUGF0dGVybiA9IC9eW2EtekEtWjAtOVxcLV8uXFxzKClbXFxde31dKyQvO1xuICAgICAgXG4gICAgICBpZiAoYmFzZW5hbWUgJiYgIXNhZmVGaWxlbmFtZVBhdHRlcm4udGVzdChiYXNlbmFtZSkpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogJ0ZpbGVuYW1lIGNvbnRhaW5zIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjaGFyYWN0ZXJzJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgZmlsZW5hbWU6IGJhc2VuYW1lLFxuICAgICAgICAgICAgYWxsb3dlZFBhdHRlcm46IHNhZmVGaWxlbmFtZVBhdHRlcm4uc291cmNlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZpbGVuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycy4gT25seSBsZXR0ZXJzLCBudW1iZXJzLCBzcGFjZXMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzLCBhbmQgY29tbW9uIGJyYWNrZXRzIGFyZSBhbGxvd2VkLicsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUydcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIHZhbGlkYXRpb25cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICBkZXRhaWxzOiAnRmlsZSBwYXRoIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bCcsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgb3JpZ2luYWxQYXRoTGVuZ3RoOiBmaWxlUGF0aC5sZW5ndGgsXG4gICAgICAgICAgbm9ybWFsaXplZFBhdGhMZW5ndGg6IG5vcm1hbGl6ZWRQYXRoLmxlbmd0aCxcbiAgICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmaWxlRXh0ZW5zaW9uIHx8ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgc2FmZVBhdGg6IG5vcm1hbGl6ZWRQYXRoXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgZGV0YWlsczogYFBhdGggdmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byB2YWxpZGF0ZSBmaWxlIHBhdGguIFBsZWFzZSBjaGVjayB0aGUgZmlsZSBwYXRoIGFuZCB0cnkgYWdhaW4uJyxcbiAgICAgICAgICBlcnJvcjogJ1BBVEhfVkFMSURBVElPTl9FUlJPUidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU21hcnQgdG9rZW4gbWFuYWdlbWVudCBmb3IgbG9uZyBvcGVyYXRpb25zIHdpdGggcmVmcmVzaC1saWtlIGNhcGFiaWxpdGllc1xuICAgKiBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjMTQpOiBUb2tlbiByZWZyZXNoIGxvZ2ljIGZvciBsb25nIG9wZXJhdGlvbnNcbiAgICogXG4gICAqIE5vdGU6IEdpdEh1YiBPQXV0aCBkZXZpY2UgZmxvdyB0b2tlbnMgZG9uJ3QgaGF2ZSB0cmFkaXRpb25hbCByZWZyZXNoIHRva2VucyxcbiAgICogYnV0IHdlIGNhbiBpbXBsZW1lbnQgc21hcnQgdmFsaWRhdGlvbiBhbmQgZ3VpZGFuY2UgZm9yIGxvbmcgb3BlcmF0aW9uc1xuICAgKiBcbiAgICogQHBhcmFtIG9wZXJhdGlvblR5cGUgVHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEByZXR1cm5zIFRva2VuIG1hbmFnZW1lbnQgcmVzdWx0IHdpdGggcmVjb21tZW5kYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1hbmFnZVRva2VuRm9yTG9uZ09wZXJhdGlvbihvcGVyYXRpb25UeXBlOiAncG9ydGZvbGlvX2NyZWF0aW9uJyB8ICdjb2xsZWN0aW9uX3N1Ym1pc3Npb24nIHwgJ2ZpbGVfdXBsb2FkJyk6IFByb21pc2U8e1xuICAgIGNhblByb2NlZWQ6IGJvb2xlYW47XG4gICAgdG9rZW4/OiBzdHJpbmc7XG4gICAgcmVmcmVzaFJlY29tbWVuZGVkPzogYm9vbGVhbjtcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCBjdXJyZW50IHRva2VuXG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbkFzeW5jKCk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2FuUHJvY2VlZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ05vIEdpdEh1YiB0b2tlbiBhdmFpbGFibGUuIFBsZWFzZSBhdXRoZW50aWNhdGUgZmlyc3QuJyxcbiAgICAgICAgICAgIGVycm9yOiAnTk9fVE9LRU4nXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0b2tlbiBmb3IgdGhlIHNwZWNpZmljIG9wZXJhdGlvblxuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlKHRva2VuKTtcbiAgICAgIGlmICghdmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2FuUHJvY2VlZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHZhbGlkYXRpb24uZXJyb3JcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGxvbmcgb3BlcmF0aW9uIHRoYXQgbWlnaHQgYmVuZWZpdCBmcm9tIGZyZXNoIGF1dGhlbnRpY2F0aW9uXG4gICAgICBjb25zdCBsb25nT3BlcmF0aW9ucyA9IFsncG9ydGZvbGlvX2NyZWF0aW9uJywgJ2NvbGxlY3Rpb25fc3VibWlzc2lvbiddO1xuICAgICAgY29uc3QgaXNMb25nT3BlcmF0aW9uID0gbG9uZ09wZXJhdGlvbnMuaW5jbHVkZXMob3BlcmF0aW9uVHlwZSk7XG5cbiAgICAgIC8vIEdldCB0b2tlbiB0eXBlIHRvIGRldGVybWluZSByZWZyZXNoIGNhcGFiaWxpdGllc1xuICAgICAgY29uc3QgdG9rZW5UeXBlID0gVG9rZW5NYW5hZ2VyLmdldFRva2VuVHlwZSh0b2tlbik7XG4gICAgICBsZXQgcmVmcmVzaFJlY29tbWVuZGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIEZvciBsb25nIG9wZXJhdGlvbnMsIGNoZWNrIHRva2VuIGFnZSBhbmQgcmVjb21tZW5kIHJlZnJlc2ggaWYgbmVlZGVkXG4gICAgICBpZiAoaXNMb25nT3BlcmF0aW9uICYmIHZhbGlkYXRpb24uaXNOZWFyRXhwaXJ5KSB7XG4gICAgICAgIHJlZnJlc2hSZWNvbW1lbmRlZCA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5tYW5hZ2VUb2tlbkZvckxvbmdPcGVyYXRpb24nLFxuICAgICAgICAgIGRldGFpbHM6ICdMb25nIG9wZXJhdGlvbiBkZXRlY3RlZCB3aXRoIGFnaW5nIHRva2VuIC0gcmVmcmVzaCByZWNvbW1lbmRlZCcsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGUsXG4gICAgICAgICAgICB0b2tlblR5cGUsXG4gICAgICAgICAgICByZWZyZXNoUmVjb21tZW5kZWQ6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxvZ2dlci53YXJuKCdMb25nIG9wZXJhdGlvbiB3aXRoIHBvdGVudGlhbGx5IGFnaW5nIHRva2VuIGRldGVjdGVkJywge1xuICAgICAgICAgIG9wZXJhdGlvblR5cGUsXG4gICAgICAgICAgdG9rZW5UeXBlLFxuICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ29uc2lkZXIgcmUtYXV0aGVudGljYXRpbmcgaWYgb3BlcmF0aW9uIGZhaWxzJ1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIE9BdXRoIHRva2VucyBpbiBsb25nIG9wZXJhdGlvbnMsIHdlIGNhbiBwcm92aWRlIGd1aWRhbmNlXG4gICAgICBpZiAodG9rZW5UeXBlID09PSAnT0F1dGggQWNjZXNzIFRva2VuJyAmJiBpc0xvbmdPcGVyYXRpb24pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ09BdXRoIHRva2VuIGRldGVjdGVkIGZvciBsb25nIG9wZXJhdGlvbicsIHtcbiAgICAgICAgICBvcGVyYXRpb25UeXBlLFxuICAgICAgICAgIHRva2VuVHlwZSxcbiAgICAgICAgICBndWlkYW5jZTogJ09BdXRoIHRva2VucyBhcmUgdGltZS1saW1pdGVkLiBJZiBvcGVyYXRpb24gZmFpbHMsIHJlLWF1dGhlbnRpY2F0ZSB1c2luZyBzZXR1cF9naXRodWJfYXV0aCdcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIHRva2VuIG1hbmFnZW1lbnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLm1hbmFnZVRva2VuRm9yTG9uZ09wZXJhdGlvbicsXG4gICAgICAgIGRldGFpbHM6ICdUb2tlbiBtYW5hZ2VtZW50IHN1Y2Nlc3NmdWwgZm9yIGxvbmcgb3BlcmF0aW9uJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBvcGVyYXRpb25UeXBlLFxuICAgICAgICAgIHRva2VuVHlwZSxcbiAgICAgICAgICBpc0xvbmdPcGVyYXRpb24sXG4gICAgICAgICAgcmVmcmVzaFJlY29tbWVuZGVkXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYW5Qcm9jZWVkOiB0cnVlLFxuICAgICAgICB0b2tlbixcbiAgICAgICAgcmVmcmVzaFJlY29tbWVuZGVkXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wubWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uJyxcbiAgICAgICAgZGV0YWlsczogYFRva2VuIG1hbmFnZW1lbnQgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZSB8fCAndW5rbm93biBlcnJvcid9YFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhblByb2NlZWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gbWFuYWdlIHRva2VuIGZvciBvcGVyYXRpb24uIFBsZWFzZSBjaGVjayB5b3VyIGF1dGhlbnRpY2F0aW9uIGFuZCB0cnkgYWdhaW4uJyxcbiAgICAgICAgICBlcnJvcjogJ1RPS0VOX01BTkFHRU1FTlRfRVJST1InXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIHVzZXIgZ3VpZGFuY2UgZm9yIHRva2VuIHJlZnJlc2ggd2hlbiBvcGVyYXRpb25zIGZhaWwgZHVlIHRvIHRva2VuIGlzc3Vlc1xuICAgKiBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjMTQpOiBVc2VyIGd1aWRhbmNlIGZvciBhdXRoZW50aWNhdGlvbiByZWZyZXNoXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdFRva2VuUmVmcmVzaEd1aWRhbmNlKG9wZXJhdGlvblR5cGU6IHN0cmluZywgdG9rZW5UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBndWlkYW5jZSA9ICdcXG5cXG7wn5SEICoqVG9rZW4gUmVmcmVzaCBHdWlkYW5jZSoqOlxcbic7XG4gICAgXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gJ09BdXRoIEFjY2VzcyBUb2tlbicpIHtcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgWW91ciBPQXV0aCB0b2tlbiBtYXkgaGF2ZSBleHBpcmVkXFxuJztcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgUnVuIGBzZXR1cF9naXRodWJfYXV0aGAgdG8gYXV0aGVudGljYXRlIGFnYWluXFxuJztcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgVGhpcyB3aWxsIGdlbmVyYXRlIGEgZnJlc2ggdG9rZW4gZm9yIGNvbnRpbnVlZCBhY2Nlc3NcXG4nO1xuICAgIH0gZWxzZSBpZiAodG9rZW5UeXBlID09PSAnUGVyc29uYWwgQWNjZXNzIFRva2VuJykge1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBZb3VyIFBlcnNvbmFsIEFjY2VzcyBUb2tlbiBtYXkgaGF2ZSBleHBpcmVkXFxuJztcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgQ2hlY2sgeW91ciBHaXRIdWIgc2V0dGluZ3M6IGh0dHBzOi8vZ2l0aHViLmNvbS9zZXR0aW5ncy90b2tlbnNcXG4nO1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBHZW5lcmF0ZSBhIG5ldyB0b2tlbiBpZiBuZWVkZWQgYW5kIHVwZGF0ZSBHSVRIVUJfVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGVcXG4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIFlvdXIgR2l0SHViIHRva2VuIG1heSBoYXZlIGV4cGlyZWQgb3IgYmVlbiByZXZva2VkXFxuJztcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgUmUtYXV0aGVudGljYXRlIHVzaW5nIGBzZXR1cF9naXRodWJfYXV0aGBcXG4nO1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBFbnN1cmUgeW91ciB0b2tlbiBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zXFxuJztcbiAgICB9XG5cbiAgICBndWlkYW5jZSArPSBgXFxuKipPcGVyYXRpb24qKjogJHtvcGVyYXRpb25UeXBlfVxcbmA7XG4gICAgZ3VpZGFuY2UgKz0gJyoqUmVxdWlyZWQgc2NvcGVzKio6IHJlcG8sIHVzZXI6ZW1haWxcXG5cXG4nO1xuICAgIGd1aWRhbmNlICs9ICfwn5KhICoqVGlwKio6IEZyZXNoIHRva2VucyB3b3JrIGJldHRlciBmb3IgY29tcGxleCBvcGVyYXRpb25zIGxpa2UgcG9ydGZvbGlvIGNyZWF0aW9uLic7XG5cbiAgICByZXR1cm4gZ3VpZGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBHaXRIdWIgcmVwb3NpdG9yeSBhY2Nlc3MgYW5kIGVuc3VyZXMgcG9ydGZvbGlvIHJlcG9zaXRvcnkgZXhpc3RzXG4gICAqIEBwYXJhbSBhdXRoU3RhdHVzIEF1dGhlbnRpY2F0aW9uIHN0YXR1cyBjb250YWluaW5nIHVzZXJuYW1lXG4gICAqIEByZXR1cm5zIFNldHVwIHJlc3VsdCBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cEdpdEh1YlJlcG9zaXRvcnkoYXV0aFN0YXR1czogYW55KTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgLy8gU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzE0KTogU21hcnQgdG9rZW4gbWFuYWdlbWVudCBmb3IgbG9uZyBvcGVyYXRpb25zXG4gICAgY29uc3QgdG9rZW5NYW5hZ2VtZW50ID0gYXdhaXQgdGhpcy5tYW5hZ2VUb2tlbkZvckxvbmdPcGVyYXRpb24oJ3BvcnRmb2xpb19jcmVhdGlvbicpO1xuICAgIGlmICghdG9rZW5NYW5hZ2VtZW50LmNhblByb2NlZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjogdG9rZW5NYW5hZ2VtZW50LmVycm9yXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuID0gdG9rZW5NYW5hZ2VtZW50LnRva2VuITtcblxuICAgIC8vIFByb3ZpZGUgdXNlciBndWlkYW5jZSBpZiByZWZyZXNoIGlzIHJlY29tbWVuZGVkIGZvciB0aGlzIGxvbmcgb3BlcmF0aW9uXG4gICAgaWYgKHRva2VuTWFuYWdlbWVudC5yZWZyZXNoUmVjb21tZW5kZWQpIHtcbiAgICAgIGNvbnN0IHRva2VuVHlwZSA9IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pO1xuICAgICAgY29uc3QgZ3VpZGFuY2UgPSB0aGlzLmZvcm1hdFRva2VuUmVmcmVzaEd1aWRhbmNlKCdwb3J0Zm9saW8gY3JlYXRpb24nLCB0b2tlblR5cGUpO1xuICAgICAgbG9nZ2VyLndhcm4oYFRva2VuIHJlZnJlc2ggcmVjb21tZW5kZWQgZm9yIHBvcnRmb2xpbyBjcmVhdGlvbjoke2d1aWRhbmNlfWApO1xuICAgIH1cblxuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlci5zZXRUb2tlbih0b2tlbik7XG5cbiAgICAvLyBDaGVjayBpZiBwb3J0Zm9saW8gZXhpc3RzIGFuZCBjcmVhdGUgaWYgbmVlZGVkXG4gICAgY29uc3QgdXNlcm5hbWUgPSBhdXRoU3RhdHVzLnVzZXJuYW1lIHx8ICd1bmtub3duJztcbiAgICBjb25zdCBwb3J0Zm9saW9FeGlzdHMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuY2hlY2tQb3J0Zm9saW9FeGlzdHModXNlcm5hbWUpO1xuICAgIFxuICAgIGlmICghcG9ydGZvbGlvRXhpc3RzKSB7XG4gICAgICBsb2dnZXIuaW5mbygnQ3JlYXRpbmcgcG9ydGZvbGlvIHJlcG9zaXRvcnkuLi4nKTtcbiAgICAgIC8vIFJlcXVlc3QgY29uc2VudCBmb3IgcG9ydGZvbGlvIGNyZWF0aW9uXG4gICAgICBjb25zdCByZXBvVXJsID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpbyh1c2VybmFtZSwgdHJ1ZSk7XG4gICAgICBpZiAoIXJlcG9VcmwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnRmFpbGVkIHRvIGNyZWF0ZSBwb3J0Zm9saW8gcmVwb3NpdG9yeScsXG4gICAgICAgICAgICBlcnJvcjogJ0NSRUFURV9GQUlMRUQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIGVsZW1lbnQgdG8gcG9ydGZvbGlvIGFuZCBoYW5kbGVzIHRoZSBjb21wbGV0ZSByZXNwb25zZSB3b3JrZmxvd1xuICAgKiBAcGFyYW0gc2FmZU5hbWUgVGhlIG5vcm1hbGl6ZWQgbmFtZSBvZiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgVGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGF1dGhTdGF0dXMgQXV0aGVudGljYXRpb24gc3RhdHVzIGNvbnRhaW5pbmcgdXNlcm5hbWUgYW5kIHRva2VuXG4gICAqIEByZXR1cm5zIENvbXBsZXRlIHN1Ym1pc3Npb24gcmVzdWx0IHdpdGggc3VjY2VzcyBtZXNzYWdlIG9yIGVycm9yXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN1Ym1pdEVsZW1lbnRBbmRIYW5kbGVSZXNwb25zZShcbiAgICBzYWZlTmFtZTogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSxcbiAgICBtZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhLFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICBhdXRoU3RhdHVzOiBhbnlcbiAgKTogUHJvbWlzZTxTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdD4ge1xuICAgIC8vIENyZWF0ZSBlbGVtZW50IHN0cnVjdHVyZSB0byBzYXZlXG4gICAgY29uc3QgZWxlbWVudDogUG9ydGZvbGlvRWxlbWVudCA9IHtcbiAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBjb250ZW50XG4gICAgfTtcbiAgICBcbiAgICAvLyBUWVBFIFNBRkVUWSBGSVggIzI6IFVzZSBhZGFwdGVyIHBhdHRlcm4gaW5zdGVhZCBvZiBjb21wbGV4IHR5cGUgY2FzdGluZ1xuICAgIC8vIFByZXZpb3VzbHk6IGVsZW1lbnQgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPHR5cGVvZiB0aGlzLnBvcnRmb2xpb01hbmFnZXIuc2F2ZUVsZW1lbnQ+WzBdXG4gICAgLy8gTm93OiBDbGVhbiBhZGFwdGVyIHBhdHRlcm4gdGhhdCBpbXBsZW1lbnRzIElFbGVtZW50IGludGVyZmFjZSBwcm9wZXJseVxuICAgIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIoZWxlbWVudCk7XG4gICAgXG4gICAgLy8gVVggSU1QUk9WRU1FTlQ6IEFkZCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAgY29uc3QgZmlsZVVybCA9IGF3YWl0IHRoaXMuc2F2ZUVsZW1lbnRXaXRoUmV0cnkoYWRhcHRlciwgc2FmZU5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICBcbiAgICBpZiAoIWZpbGVVcmwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnRmFpbGVkIHRvIHNhdmUgZWxlbWVudCB0byBHaXRIdWIgcG9ydGZvbGlvIGFmdGVyIG11bHRpcGxlIGF0dGVtcHRzLlxcblxcbicgK1xuICAgICAgICAgICAgICAgICfwn5KhICoqVHJvdWJsZXNob290aW5nIFRpcHMqKjpcXG4nICtcbiAgICAgICAgICAgICAgICAn4oCiIENoZWNrIHlvdXIgR2l0SHViIGF1dGhlbnRpY2F0aW9uOiBgZ2ggYXV0aCBzdGF0dXNgXFxuJyArXG4gICAgICAgICAgICAgICAgJ+KAoiBWZXJpZnkgcmVwb3NpdG9yeSBwZXJtaXNzaW9uc1xcbicgK1xuICAgICAgICAgICAgICAgICfigKIgVHJ5IGFnYWluIGluIGEgZmV3IG1pbnV0ZXMgKEdpdEh1YiBBUEkgcmF0ZSBsaW1pdHMpXFxuJyArXG4gICAgICAgICAgICAgICAgJ+KAoiBDaGVjayBHaXRIdWIgc3RhdHVzOiBodHRwczovL3N0YXR1cy5naXRodWIuY29tJyxcbiAgICAgICAgZXJyb3I6ICdTQVZFX0ZBSUxFRCdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTG9nIHN1Y2Nlc3NmdWwgc3VibWlzc2lvbiAoRE1DUC1TRUMtMDA2KVxuICAgIGxvZ2dlci5pbmZvKGBTdWNjZXNzZnVsbHkgc3VibWl0dGVkICR7c2FmZU5hbWV9IHRvIEdpdEh1YiBwb3J0Zm9saW9gLCB7XG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIHVzZXJuYW1lOiBhdXRoU3RhdHVzLnVzZXJuYW1lLFxuICAgICAgZmlsZVVybFxuICAgIH0pO1xuXG4gICAgLy8gU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzE0KTogU21hcnQgdG9rZW4gbWFuYWdlbWVudCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgY29uc3QgY29sbGVjdGlvblRva2VuTWFuYWdlbWVudCA9IGF3YWl0IHRoaXMubWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uKCdjb2xsZWN0aW9uX3N1Ym1pc3Npb24nKTtcbiAgICBpZiAoIWNvbGxlY3Rpb25Ub2tlbk1hbmFnZW1lbnQuY2FuUHJvY2VlZCkge1xuICAgICAgLy8gVG9rZW4gbWFuYWdlbWVudCBmYWlsZWQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvbiwgYnV0IG1haW4gc3VibWlzc2lvbiBzdWNjZWVkZWRcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGNvbGxlY3Rpb25Ub2tlbk1hbmFnZW1lbnQuZXJyb3I/Lm1lc3NhZ2UgfHwgJ1Rva2VuIG1hbmFnZW1lbnQgZmFpbGVkJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGDinIUgU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkICR7c2FmZU5hbWV9IHRvIHlvdXIgR2l0SHViIHBvcnRmb2xpbyFcXG7wn5OBIFBvcnRmb2xpbyBVUkw6ICR7ZmlsZVVybH1cXG5cXG7imqDvuI8gQ29sbGVjdGlvbiBzdWJtaXNzaW9uIHNraXBwZWQ6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICAgIHVybDogZmlsZVVybFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IGNvbGxlY3Rpb25Ub2tlbk1hbmFnZW1lbnQudG9rZW4hO1xuXG4gICAgLy8gUHJvdmlkZSByZWZyZXNoIGd1aWRhbmNlIGlmIHJlY29tbWVuZGVkIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb25cbiAgICBpZiAoY29sbGVjdGlvblRva2VuTWFuYWdlbWVudC5yZWZyZXNoUmVjb21tZW5kZWQpIHtcbiAgICAgIGNvbnN0IHRva2VuVHlwZSA9IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pO1xuICAgICAgbG9nZ2VyLmluZm8oJ0NvbGxlY3Rpb24gc3VibWlzc2lvbiBwcm9jZWVkaW5nIHdpdGggYWdpbmcgdG9rZW4nLCB7XG4gICAgICAgIHRva2VuVHlwZSxcbiAgICAgICAgcmVjb21tZW5kYXRpb246ICdJZiBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gZmFpbHMsIHRyeSByZS1hdXRoZW50aWNhdGluZyB3aXRoIHNldHVwX2dpdGh1Yl9hdXRoJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRU5IQU5DRU1FTlQgKElzc3VlICM1NDkpOiBBc2sgdXNlciBpZiB0aGV5IHdhbnQgdG8gc3VibWl0IHRvIGNvbGxlY3Rpb25cbiAgICAvLyBUaGlzIGNvbXBsZXRlcyB0aGUgY29tbXVuaXR5IGNvbnRyaWJ1dGlvbiB3b3JrZmxvd1xuICAgIGNvbnN0IGNvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm9tcHRGb3JDb2xsZWN0aW9uU3VibWlzc2lvbih7XG4gICAgICBlbGVtZW50TmFtZTogc2FmZU5hbWUsXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIHBvcnRmb2xpb1VybDogZmlsZVVybCxcbiAgICAgIHVzZXJuYW1lOiBhdXRoU3RhdHVzLnVzZXJuYW1lIHx8ICd1bmtub3duJyxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgdG9rZW5cbiAgICB9KTtcblxuICAgIC8vIEJ1aWxkIHRoZSByZXNwb25zZSBtZXNzYWdlIGJhc2VkIG9uIHdoYXQgaGFwcGVuZWRcbiAgICBsZXQgbWVzc2FnZSA9IGDinIUgU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkICR7c2FmZU5hbWV9IHRvIHlvdXIgR2l0SHViIHBvcnRmb2xpbyFcXG5gO1xuICAgIG1lc3NhZ2UgKz0gYPCfk4EgUG9ydGZvbGlvIFVSTDogJHtmaWxlVXJsfVxcblxcbmA7XG4gICAgXG4gICAgaWYgKGNvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0LnN1Ym1pdHRlZCkge1xuICAgICAgbWVzc2FnZSArPSBg8J+OiSBBbHNvIHN1Ym1pdHRlZCB0byBEb2xsaG91c2VNQ1AgY29sbGVjdGlvbiBmb3IgY29tbXVuaXR5IHJldmlldyFcXG5gO1xuICAgICAgbWVzc2FnZSArPSBg8J+TiyBJc3N1ZTogJHtjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdC5pc3N1ZVVybH1gO1xuICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQuZGVjbGluZWQpIHtcbiAgICAgIG1lc3NhZ2UgKz0gYPCfkqEgWW91IGNhbiBzdWJtaXQgdG8gdGhlIGNvbGxlY3Rpb24gbGF0ZXIgdXNpbmcgdGhlIHNhbWUgY29tbWFuZC5gO1xuICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIG1lc3NhZ2UgKz0gYOKaoO+4jyBDb2xsZWN0aW9uIHN1Ym1pc3Npb24gZmFpbGVkOiAke2NvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0LmVycm9yfVxcbmA7XG4gICAgICBtZXNzYWdlICs9IGDwn5KhIFlvdSBjYW4gbWFudWFsbHkgc3VibWl0IGF0OiBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24vaXNzdWVzL25ld2A7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdXJsOiBmaWxlVXJsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUocGFyYW1zOiBTdWJtaXRUb1BvcnRmb2xpb1BhcmFtcyk6IFByb21pc2U8U3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBpbnB1dCBwYXJhbWV0ZXJzXG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZE5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2FmZU5hbWUgPSB2YWxpZGF0aW9uUmVzdWx0LnNhZmVOYW1lITtcblxuICAgICAgLy8gQ2hlY2sgYXV0aGVudGljYXRpb24gc3RhdHVzXG4gICAgICBjb25zdCBhdXRoUmVzdWx0ID0gYXdhaXQgdGhpcy5jaGVja0F1dGhlbnRpY2F0aW9uKCk7XG4gICAgICBpZiAoIWF1dGhSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gYXV0aFJlc3VsdC5lcnJvciE7XG4gICAgICB9XG4gICAgICBjb25zdCBhdXRoU3RhdHVzID0gYXV0aFJlc3VsdC5hdXRoU3RhdHVzITtcblxuICAgICAgLy8gRmluZCBjb250ZW50IGxvY2FsbHkgd2l0aCBzbWFydCB0eXBlIGRldGVjdGlvblxuICAgICAgY29uc3QgY29udGVudFJlc3VsdCA9IGF3YWl0IHRoaXMuZGlzY292ZXJDb250ZW50V2l0aFR5cGVEZXRlY3Rpb24oc2FmZU5hbWUhLCBwYXJhbXMudHlwZSwgcGFyYW1zLm5hbWUpO1xuICAgICAgaWYgKCFjb250ZW50UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRSZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb250ZW50UmVzdWx0LmVsZW1lbnRUeXBlITtcbiAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IGNvbnRlbnRSZXN1bHQubG9jYWxQYXRoITtcblxuICAgICAgLy8gVmFsaWRhdGUgZmlsZSBhbmQgY29udGVudCBzZWN1cml0eVxuICAgICAgY29uc3Qgc2VjdXJpdHlSZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlRmlsZUFuZENvbnRlbnQobG9jYWxQYXRoKTtcbiAgICAgIGlmICghc2VjdXJpdHlSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gc2VjdXJpdHlSZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGVudCA9IHNlY3VyaXR5UmVzdWx0LmNvbnRlbnQhO1xuXG4gICAgICAvLyBHZXQgdXNlciBjb25zZW50IChwbGFjZWhvbGRlciBmb3Igbm93IC0gY291bGQgYWRkIGludGVyYWN0aXZlIHByb21wdCBsYXRlcilcbiAgICAgIGxvZ2dlci5pbmZvKGBQcmVwYXJpbmcgdG8gc3VibWl0ICR7c2FmZU5hbWV9IHRvIEdpdEh1YiBwb3J0Zm9saW9gKTtcblxuICAgICAgLy8gUHJlcGFyZSBtZXRhZGF0YSBmb3IgZWxlbWVudFxuICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnByZXBhcmVFbGVtZW50TWV0YWRhdGEoc2FmZU5hbWUhLCBlbGVtZW50VHlwZSwgYXV0aFN0YXR1cyk7XG5cbiAgICAgIC8vIFNldCB1cCBHaXRIdWIgcmVwb3NpdG9yeSBhY2Nlc3NcbiAgICAgIGNvbnN0IHJlcG9SZXN1bHQgPSBhd2FpdCB0aGlzLnNldHVwR2l0SHViUmVwb3NpdG9yeShhdXRoU3RhdHVzKTtcbiAgICAgIGlmICghcmVwb1Jlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiByZXBvUmVzdWx0LmVycm9yITtcbiAgICAgIH1cblxuICAgICAgLy8gU3VibWl0IGVsZW1lbnQgdG8gcG9ydGZvbGlvIGFuZCBoYW5kbGUgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRFbGVtZW50QW5kSGFuZGxlUmVzcG9uc2UoXG4gICAgICAgIHNhZmVOYW1lISwgXG4gICAgICAgIGVsZW1lbnRUeXBlLCBcbiAgICAgICAgbWV0YWRhdGEsIFxuICAgICAgICBjb250ZW50LCBcbiAgICAgICAgYXV0aFN0YXR1c1xuICAgICAgKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjMTQpOiBFbmhhbmNlZCBlcnJvciBoYW5kbGluZyB3aXRoIHRva2VuIHJlZnJlc2ggZ3VpZGFuY2VcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignc3VibWl0VG9Qb3J0Zm9saW8nLCBlcnJvciwge1xuICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLm5hbWUsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBwYXJhbXMudHlwZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGVycm9yIGlzIHRva2VuLXJlbGF0ZWQgYW5kIHByb3ZpZGUgcmVmcmVzaCBndWlkYW5jZVxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgY29uc3QgaXNUb2tlbkVycm9yID0gZXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3Rva2VuJykgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhdXRoJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJzQwMScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCc0MDMnKTtcblxuICAgICAgbGV0IGZvcm1hdHRlZEVycm9yID0gRXJyb3JIYW5kbGVyLmZvcm1hdEZvclJlc3BvbnNlKGVycm9yKTtcblxuICAgICAgaWYgKGlzVG9rZW5FcnJvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEdldCBjdXJyZW50IHRva2VuIHRvIGRldGVybWluZSB0eXBlIGZvciBndWlkYW5jZVxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb2tlbiA9IGF3YWl0IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbkFzeW5jKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRUb2tlbikge1xuICAgICAgICAgICAgY29uc3QgdG9rZW5UeXBlID0gVG9rZW5NYW5hZ2VyLmdldFRva2VuVHlwZShjdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgY29uc3QgcmVmcmVzaEd1aWRhbmNlID0gdGhpcy5mb3JtYXRUb2tlblJlZnJlc2hHdWlkYW5jZSgncG9ydGZvbGlvIHN1Ym1pc3Npb24nLCB0b2tlblR5cGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBBcHBlbmQgcmVmcmVzaCBndWlkYW5jZSB0byBlcnJvciBtZXNzYWdlXG4gICAgICAgICAgICBpZiAoZm9ybWF0dGVkRXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICBmb3JtYXR0ZWRFcnJvci5tZXNzYWdlICs9IHJlZnJlc2hHdWlkYW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHRva2VuRXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBjYW4ndCBnZXQgdG9rZW4gaW5mbywgcHJvdmlkZSBnZW5lcmljIGd1aWRhbmNlXG4gICAgICAgICAgZm9ybWF0dGVkRXJyb3IubWVzc2FnZSArPSAnXFxuXFxu8J+UhCAqKkF1dGhlbnRpY2F0aW9uIElzc3VlKio6IFRyeSBydW5uaW5nIGBzZXR1cF9naXRodWJfYXV0aGAgdG8gcmVmcmVzaCB5b3VyIGF1dGhlbnRpY2F0aW9uLic7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm1hdHRlZEVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tcHRzIHVzZXIgdG8gc3VibWl0IGNvbnRlbnQgdG8gdGhlIERvbGxob3VzZU1DUCBjb2xsZWN0aW9uXG4gICAqIEVOSEFOQ0VNRU5UIChJc3N1ZSAjNTQ5KTogQ29tcGxldGUgdGhlIGNvbW11bml0eSBjb250cmlidXRpb24gd29ya2Zsb3dcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvbXB0Rm9yQ29sbGVjdGlvblN1Ym1pc3Npb24ocGFyYW1zOiB7XG4gICAgZWxlbWVudE5hbWU6IHN0cmluZztcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gICAgcG9ydGZvbGlvVXJsOiBzdHJpbmc7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBtZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHsgc3VibWl0dGVkOiBib29sZWFuOyBkZWNsaW5lZDogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmc7IGlzc3VlVXJsPzogc3RyaW5nIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgc2ltcGxlIHByb21wdCBtZXNzYWdlIGZvciB0aGUgdXNlclxuICAgICAgLy8gTm90ZTogSW4gTUNQIGNvbnRleHQsIHdlIGNhbid0IGRvIGludGVyYWN0aXZlIHByb21wdHMsIHNvIHdlJ2xsIG5lZWQgdG9cbiAgICAgIC8vIGVpdGhlciBtYWtlIHRoaXMgYXV0b21hdGljIG9yIHJlcXVpcmUgYSBwYXJhbWV0ZXJcbiAgICAgIFxuICAgICAgLy8gRm9yIG5vdywgbGV0J3MgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICAgICAgLy8gdG8gYXV0by1zdWJtaXQgdG8gY29sbGVjdGlvbiAob3B0LWluIGJlaGF2aW9yKVxuICAgICAgY29uc3QgYXV0b1N1Ym1pdCA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9BVVRPX1NVQk1JVF9UT19DT0xMRUNUSU9OID09PSAndHJ1ZSc7XG4gICAgICBcbiAgICAgIGlmICghYXV0b1N1Ym1pdCkge1xuICAgICAgICAvLyBVc2VyIGhhc24ndCBvcHRlZCBpbiB0byBhdXRvLXN1Ym1pc3Npb25cbiAgICAgICAgbG9nZ2VyLmluZm8oJ0NvbGxlY3Rpb24gc3VibWlzc2lvbiBza2lwcGVkIChzZXQgRE9MTEhPVVNFX0FVVE9fU1VCTUlUX1RPX0NPTExFQ1RJT049dHJ1ZSB0byBlbmFibGUpJyk7XG4gICAgICAgIHJldHVybiB7IHN1Ym1pdHRlZDogZmFsc2UsIGRlY2xpbmVkOiB0cnVlIH07XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKCdBdXRvLXN1Ym1pdHRpbmcgdG8gRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb24uLi4nKTtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBpc3N1ZSBpbiB0aGUgY29sbGVjdGlvbiByZXBvc2l0b3J5XG4gICAgICBjb25zdCBpc3N1ZVVybCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29sbGVjdGlvbklzc3VlKHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB0b2tlbjogcGFyYW1zLnRva2VuXG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzc3VlVXJsKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdTdWNjZXNzZnVsbHkgY3JlYXRlZCBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gaXNzdWUnLCB7IGlzc3VlVXJsIH0pO1xuICAgICAgICByZXR1cm4geyBzdWJtaXR0ZWQ6IHRydWUsIGRlY2xpbmVkOiBmYWxzZSwgaXNzdWVVcmwgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IHN1Ym1pdHRlZDogZmFsc2UsIGRlY2xpbmVkOiBmYWxzZSwgZXJyb3I6ICdGYWlsZWQgdG8gY3JlYXRlIGlzc3VlJyB9O1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgaW4gY29sbGVjdGlvbiBzdWJtaXNzaW9uIHByb21wdCcsIHsgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWJtaXR0ZWQ6IGZhbHNlLFxuICAgICAgICBkZWNsaW5lZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpc3N1ZSBpbiB0aGUgRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24gcmVwb3NpdG9yeVxuICAgKiBFTkhBTkNFTUVOVCAoSXNzdWUgIzU0OSk6IEdpdEh1YiBBUEkgaW50ZWdyYXRpb24gZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVDb2xsZWN0aW9uSXNzdWUocGFyYW1zOiB7XG4gICAgZWxlbWVudE5hbWU6IHN0cmluZztcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gICAgcG9ydGZvbGlvVXJsOiBzdHJpbmc7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBtZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICB0cnkge1xuXG4gICAgICAvLyBGb3JtYXQgdGhlIGlzc3VlIHRpdGxlXG4gICAgICBjb25zdCB0aXRsZSA9IGBbJHtwYXJhbXMuZWxlbWVudFR5cGV9XSBBZGQgJHtwYXJhbXMuZWxlbWVudE5hbWV9IGJ5IEAke3BhcmFtcy51c2VybmFtZX1gO1xuXG4gICAgICAvLyBGb3JtYXQgdGhlIGlzc3VlIGJvZHkgd2l0aCBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb25cbiAgICAgIGNvbnN0IGJvZHkgPSBgIyMgTmV3ICR7cGFyYW1zLmVsZW1lbnRUeXBlfSBTdWJtaXNzaW9uXG5cbmAgK1xuICAgICAgICBgKipOYW1lKio6ICR7cGFyYW1zLmVsZW1lbnROYW1lfVxcbmAgK1xuICAgICAgICBgKipBdXRob3IqKjogQCR7cGFyYW1zLnVzZXJuYW1lfVxcbmAgK1xuICAgICAgICBgKipUeXBlKio6ICR7cGFyYW1zLmVsZW1lbnRUeXBlfVxcbmAgK1xuICAgICAgICBgKipEZXNjcmlwdGlvbioqOiAke3BhcmFtcy5tZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCAnTm8gZGVzY3JpcHRpb24gcHJvdmlkZWQnfVxcblxcbmAgK1xuICAgICAgICBgIyMjIFBvcnRmb2xpbyBMaW5rXFxuYCArXG4gICAgICAgIGAke3BhcmFtcy5wb3J0Zm9saW9Vcmx9XFxuXFxuYCArXG4gICAgICAgIGAjIyMgTWV0YWRhdGFcXG5gICtcbiAgICAgICAgYFxcYFxcYFxcYGpzb25cXG4ke0pTT04uc3RyaW5naWZ5KHBhcmFtcy5tZXRhZGF0YSwgbnVsbCwgMil9XFxuXFxgXFxgXFxgXFxuXFxuYCArXG4gICAgICAgIGAjIyMgUmV2aWV3IENoZWNrbGlzdFxcbmAgK1xuICAgICAgICBgLSBbIF0gQ29udGVudCBpcyBhcHByb3ByaWF0ZSBhbmQgZm9sbG93cyBjb21tdW5pdHkgZ3VpZGVsaW5lc1xcbmAgK1xuICAgICAgICBgLSBbIF0gTm8gc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIG9yIG1hbGljaW91cyBwYXR0ZXJuc1xcbmAgK1xuICAgICAgICBgLSBbIF0gTWV0YWRhdGEgaXMgY29tcGxldGUgYW5kIGFjY3VyYXRlXFxuYCArXG4gICAgICAgIGAtIFsgXSBFbGVtZW50IHdvcmtzIGFzIGRlc2NyaWJlZFxcbmAgK1xuICAgICAgICBgLSBbIF0gTm8gZHVwbGljYXRlIG9mIGV4aXN0aW5nIGNvbGxlY3Rpb24gY29udGVudFxcblxcbmAgK1xuICAgICAgICBgLS0tXFxuYCArXG4gICAgICAgIGAqVGhpcyBzdWJtaXNzaW9uIHdhcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBEb2xsaG91c2VNQ1Agc3VibWl0X2NvbnRlbnQgdG9vbC4qYDtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGxhYmVscyBiYXNlZCBvbiBlbGVtZW50IHR5cGVcbiAgICAgIGNvbnN0IGxhYmVscyA9IFtcbiAgICAgICAgJ2NvbnRyaWJ1dGlvbicsICAvLyBBbGwgc3VibWlzc2lvbnMgZ2V0IHRoaXNcbiAgICAgICAgJ3BlbmRpbmctcmV2aWV3JywgLy8gTmVlZHMgcmV2aWV3XG4gICAgICAgIHBhcmFtcy5lbGVtZW50VHlwZS50b0xvd2VyQ2FzZSgpIC8vIEVsZW1lbnQgdHlwZSBsYWJlbFxuICAgICAgXTtcblxuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM2KTogVXNlIEdpdEh1YiByYXRlIGxpbWl0ZXIgZm9yIEFQSSBjYWxsc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBoaXR0aW5nIEdpdEh1YiByYXRlIGxpbWl0cyBhbmQgcHJvdmlkZXMgYmV0dGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICBjb25zdCBpc3N1ZVVybCA9IGF3YWl0IGdpdGh1YlJhdGVMaW1pdGVyLnF1ZXVlUmVxdWVzdChcbiAgICAgICAgJ2NyZWF0ZS1jb2xsZWN0aW9uLWlzc3VlJyxcbiAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL0RvbGxob3VzZU1DUC9jb2xsZWN0aW9uL2lzc3Vlcyc7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dFxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIGdldFZhbGlkYXRlZFRpbWVvdXQoKSk7XG4gICAgICAgICAgXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3BhcmFtcy50b2tlbn1gLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgbGFiZWxzXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjMTUpOiBFbmhhbmNlZCByYXRlIGxpbWl0IGxvZ2dpbmdcbiAgICAgICAgICAgIC8vIExvZyByYXRlIGxpbWl0IGhlYWRlcnMgZm9yIGRpYWdub3N0aWNzXG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZW1haW5pbmcgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVtYWluaW5nJyk7XG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZXNldCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZXNldCcpO1xuICAgICAgICAgICAgY29uc3QgcmF0ZUxpbWl0TGltaXQgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtTGltaXQnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdHaXRIdWIgQVBJIHJhdGUgbGltaXQgc3RhdHVzJywge1xuICAgICAgICAgICAgICBvcGVyYXRpb246ICdjcmVhdGUtY29sbGVjdGlvbi1pc3N1ZScsXG4gICAgICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgICAgICBsaW1pdDogcmF0ZUxpbWl0TGltaXQsXG4gICAgICAgICAgICAgIHJlc2V0VGltZTogcmF0ZUxpbWl0UmVzZXQgPyBuZXcgRGF0ZShwYXJzZUludChyYXRlTGltaXRSZXNldCkgKiAxMDAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmVzcG9uc2VTdGF0dXM6IHJlc3BvbnNlLnN0YXR1c1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIExvZyB3YXJuaW5nIGlmIGFwcHJvYWNoaW5nIHJhdGUgbGltaXRcbiAgICAgICAgICAgIGlmIChyYXRlTGltaXRSZW1haW5pbmcgJiYgcGFyc2VJbnQocmF0ZUxpbWl0UmVtYWluaW5nKSA8IDEwMCkge1xuICAgICAgICAgICAgICBsb2dnZXIud2FybignQXBwcm9hY2hpbmcgR2l0SHViIEFQSSByYXRlIGxpbWl0Jywge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2NyZWF0ZS1jb2xsZWN0aW9uLWlzc3VlJyxcbiAgICAgICAgICAgICAgICByZW1haW5pbmc6IHJhdGVMaW1pdFJlbWFpbmluZyxcbiAgICAgICAgICAgICAgICByZXNldFRpbWU6IHJhdGVMaW1pdFJlc2V0ID8gbmV3IERhdGUocGFyc2VJbnQocmF0ZUxpbWl0UmVzZXQpICogMTAwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciByZWR1Y2luZyBBUEkgdXNhZ2UgZnJlcXVlbmN5IG9yIGF1dGhlbnRpY2F0aW5nIGZvciBoaWdoZXIgbGltaXRzJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignR2l0SHViIEFQSSBlcnJvciBjcmVhdGluZyBpc3N1ZScsIHsgXG4gICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yVGV4dCxcbiAgICAgICAgICAgICAgICByYXRlTGltaXRSZW1haW5pbmcsXG4gICAgICAgICAgICAgICAgcmF0ZUxpbWl0UmVzZXRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbGxlY3Rpb24gcmVwb3NpdG9yeSBub3QgZm91bmQgb3Igbm8gYWNjZXNzJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Blcm1pc3Npb24gZGVuaWVkIHRvIGNyZWF0ZSBpc3N1ZSBpbiBjb2xsZWN0aW9uIHJlcG8nKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5odG1sX3VybDtcbiAgICAgICAgICAgIFxuICAgICAgICAgIH0gY2F0Y2ggKGZldGNoRXJyb3I6IGFueSkge1xuICAgICAgICAgICAgLy8gUmUtdGhyb3cgdG8gb3V0ZXIgY2F0Y2ggYmxvY2tcbiAgICAgICAgICAgIHRocm93IGZldGNoRXJyb3I7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ2hpZ2gnIC8vIEhpZ2ggcHJpb3JpdHkgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGlzc3VlVXJsO1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSGFuZGxlIHRpbWVvdXQgc3BlY2lmaWNhbGx5XG4gICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgR2l0SHViIEFQSSByZXF1ZXN0IHRpbWVvdXQgYWZ0ZXIgJHtnZXRWYWxpZGF0ZWRUaW1lb3V0KCl9bXNgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBjb2xsZWN0aW9uIGlzc3VlJywgeyBcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSB8fCBlcnJvclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZExvY2FsQ29udGVudChuYW1lOiBzdHJpbmcsIHR5cGU6IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE1FVEFEQVRBIElOREVYIEZJWDogVXNlIHBvcnRmb2xpbyBpbmRleCBmb3IgZmFzdCBtZXRhZGF0YS1iYXNlZCBsb29rdXBzXG4gICAgICAvLyBUaGlzIHNvbHZlcyB0aGUgY3JpdGljYWwgaXNzdWUgd2hlcmUgXCJTYWZlIFJvdW5kdHJpcCBUZXN0ZXJcIiBjb3VsZG4ndCBiZSBmb3VuZFxuICAgICAgLy8gYmVjYXVzZSBmaW5kTG9jYWxDb250ZW50IG9ubHkgc2VhcmNoZWQgZmlsZW5hbWVzLCBub3QgbWV0YWRhdGEgbmFtZXNcbiAgICAgIGNvbnN0IGluZGV4TWFuYWdlciA9IFBvcnRmb2xpb0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgXG4gICAgICAvLyBVWCBJTVBST1ZFTUVOVDogRW5oYW5jZWQgc2VhcmNoIHdpdGggZnV6enkgbWF0Y2hpbmdcbiAgICAgIGNvbnN0IGluZGV4RW50cnkgPSBhd2FpdCBpbmRleE1hbmFnZXIuZmluZEJ5TmFtZShuYW1lLCB7IFxuICAgICAgICBlbGVtZW50VHlwZTogdHlwZSxcbiAgICAgICAgZnV6enlNYXRjaDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmIChpbmRleEVudHJ5KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgY29udGVudCB2aWEgbWV0YWRhdGEgaW5kZXgnLCB7IFxuICAgICAgICAgIHNlYXJjaE5hbWU6IG5hbWUsIFxuICAgICAgICAgIG1ldGFkYXRhTmFtZTogaW5kZXhFbnRyeS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIGZpbGVuYW1lOiBpbmRleEVudHJ5LmZpbGVuYW1lLFxuICAgICAgICAgIGZpbGVQYXRoOiBpbmRleEVudHJ5LmZpbGVQYXRoLFxuICAgICAgICAgIHR5cGUgXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5kZXhFbnRyeS5maWxlUGF0aDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRkFMTEJBQ0s6IFVzZSBvcmlnaW5hbCBmaWxlIGRpc2NvdmVyeSBpZiBpbmRleCBsb29rdXAgZmFpbHNcbiAgICAgIC8vIFRoaXMgbWFpbnRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIGhhbmRsZXMgZWRnZSBjYXNlc1xuICAgICAgbG9nZ2VyLmRlYnVnKCdJbmRleCBsb29rdXAgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZmlsZSBkaXNjb3ZlcnknLCB7IG5hbWUsIHR5cGUgfSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBjb25zdCBwb3J0Zm9saW9EaXIgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIodHlwZSk7XG4gICAgICBcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBUcnkgbXVsdGlwbGUgc2VhcmNoIHN0cmF0ZWdpZXMgZm9yIGJldHRlciB1c2VyIGV4cGVyaWVuY2VcbiAgICAgIGxldCBmaWxlID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUocG9ydGZvbGlvRGlyLCBuYW1lLCB7XG4gICAgICAgIGV4dGVuc2lvbnM6IFsnLm1kJywgJy5qc29uJywgJy55YW1sJywgJy55bWwnXSxcbiAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBJZiBub3QgZm91bmQsIHRyeSBub3JtYWxpemluZyB0aGUgbmFtZSAoZS5nLiwgXCJKLkEuUi5WLkkuUy5cIiAtPiBcImotYS1yLXYtaS1zXCIpXG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAucmVwbGFjZSgvW15hLXowLTldL2dpLCAnLScpICAvLyBSZXBsYWNlIG5vbi1hbHBoYW51bWVyaWMgd2l0aCBkYXNoZXNcbiAgICAgICAgICAucmVwbGFjZSgvLSsvZywgJy0nKSAgICAgICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgZGFzaGVzIHdpdGggc2luZ2xlIGRhc2hcbiAgICAgICAgICAucmVwbGFjZSgvXi18LSQvZywgJycpOyAgICAgIC8vIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIGRhc2hlc1xuICAgICAgICAgIFxuICAgICAgICBpZiAobm9ybWFsaXplZE5hbWUgIT09IG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnVHJ5aW5nIG5vcm1hbGl6ZWQgbmFtZSBzZWFyY2gnLCB7IFxuICAgICAgICAgICAgb3JpZ2luYWw6IG5hbWUsIFxuICAgICAgICAgICAgbm9ybWFsaXplZDogbm9ybWFsaXplZE5hbWUsXG4gICAgICAgICAgICB0eXBlIFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGZpbGUgPSBhd2FpdCBGaWxlRGlzY292ZXJ5VXRpbC5maW5kRmlsZShwb3J0Zm9saW9EaXIsIG5vcm1hbGl6ZWROYW1lLCB7XG4gICAgICAgICAgICBleHRlbnNpb25zOiBbJy5tZCcsICcuanNvbicsICcueWFtbCcsICcueW1sJ10sXG4gICAgICAgICAgICBwYXJ0aWFsTWF0Y2g6IHRydWUsXG4gICAgICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBzdGlsbCBub3QgZm91bmQsIHRyeSBzZWFyY2hpbmcgYnkgZGlzcGxheSBuYW1lIHBhdHRlcm5zXG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgLy8gVHJ5IGNvbW1vbiB2YXJpYXRpb25zIGxpa2UgcmVtb3ZpbmcgZG90cywgc3BhY2VzLCBldGMuXG4gICAgICAgIGNvbnN0IHZhcmlhdGlvbnMgPSBbXG4gICAgICAgICAgbmFtZS5yZXBsYWNlKC9cXC4vZywgJycpLCAgICAgICAgLy8gUmVtb3ZlIGRvdHM6IFwiSi5BLlIuVi5JLlMuXCIgLT4gXCJKQVJWSVNcIlxuICAgICAgICAgIG5hbWUucmVwbGFjZSgvXFxzKy9nLCAnLScpLCAgICAgIC8vIFJlcGxhY2Ugc3BhY2VzIHdpdGggZGFzaGVzXG4gICAgICAgICAgbmFtZS5yZXBsYWNlKC9bXFxzXFwuXS9nLCAnJyksICAgIC8vIFJlbW92ZSBzcGFjZXMgYW5kIGRvdHNcbiAgICAgICAgICBuYW1lLnJlcGxhY2UoL1tcXHNcXC5dL2csICctJyksICAgLy8gUmVwbGFjZSBzcGFjZXMgYW5kIGRvdHMgd2l0aCBkYXNoZXNcbiAgICAgICAgXS5maWx0ZXIodiA9PiB2ICE9PSBuYW1lICYmIHYubGVuZ3RoID4gMCk7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IHZhcmlhdGlvbiBvZiB2YXJpYXRpb25zKSB7XG4gICAgICAgICAgZmlsZSA9IGF3YWl0IEZpbGVEaXNjb3ZlcnlVdGlsLmZpbmRGaWxlKHBvcnRmb2xpb0RpciwgdmFyaWF0aW9uLCB7XG4gICAgICAgICAgICBleHRlbnNpb25zOiBbJy5tZCcsICcuanNvbicsICcueWFtbCcsICcueW1sJ10sXG4gICAgICAgICAgICBwYXJ0aWFsTWF0Y2g6IHRydWUsXG4gICAgICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBjb250ZW50IHVzaW5nIG5hbWUgdmFyaWF0aW9uJywge1xuICAgICAgICAgICAgICBvcmlnaW5hbDogbmFtZSxcbiAgICAgICAgICAgICAgdmFyaWF0aW9uLFxuICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIGxvY2FsIGNvbnRlbnQgZmlsZSB2aWEgZmFsbGJhY2snLCB7IG5hbWUsIHR5cGUsIGZpbGUgfSk7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ05vIGNvbnRlbnQgZm91bmQnLCB7IG5hbWUsIHR5cGUgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGZpbmRpbmcgbG9jYWwgY29udGVudCcsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU21hcnQgZWxlbWVudCB0eXBlIGRldGVjdGlvbiAtIHNlYXJjaGVzIGFjcm9zcyBBTEwgZWxlbWVudCB0eXBlcyBmb3IgY29udGVudFxuICAgKiBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzkpOiBVc2VzIGVhcmx5IHRlcm1pbmF0aW9uIGZvciBleGFjdCBtYXRjaGVzXG4gICAqIFRoaXMgcmVwbGFjZXMgdGhlIHByZXZpb3VzIGhhcmRjb2RlZCBkZWZhdWx0IHRvIFBFUlNPTkEgYW5kIGVuYWJsZXMgcHJvcGVyIHR5cGUgZGV0ZWN0aW9uXG4gICAqIFxuICAgKiBAcGFyYW0gbmFtZSBUaGUgY29udGVudCBuYW1lIHRvIHNlYXJjaCBmb3JcbiAgICogQHJldHVybnMgRGV0ZWN0aW9uIHJlc3VsdCB3aXRoIGZvdW5kIG1hdGNoZXMgYWNyb3NzIGFsbCBlbGVtZW50IHR5cGVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRldGVjdEVsZW1lbnRUeXBlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8RWxlbWVudERldGVjdGlvblJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzkpOiBVc2UgZWFybHkgdGVybWluYXRpb24gc2VhcmNoIHV0aWxpdHlcbiAgICAgIC8vIENyZWF0ZSBzZWFyY2ggZnVuY3Rpb25zIGZvciBlYWNoIGVsZW1lbnQgdHlwZVxuICAgICAgY29uc3QgZWxlbWVudFR5cGVzID0gT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSk7XG4gICAgICBjb25zdCBzZWFyY2hGdW5jdGlvbnMgPSBlbGVtZW50VHlwZXMubWFwKCh0eXBlKSA9PiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBhd2FpdCB0aGlzLmZpbmRMb2NhbENvbnRlbnQobmFtZSwgdHlwZSk7XG4gICAgICAgICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiB0eXBlIGFzIEVsZW1lbnRUeXBlLCBwYXRoOiBmaWxlUGF0aCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIC8vIExvZyB1bmV4cGVjdGVkIGVycm9ycyBidXQgZG9uJ3QgZmFpbCB0aGUgc2VhcmNoXG4gICAgICAgICAgaWYgKGVycm9yPy5jb2RlICE9PSAnRU5PRU5UJyAmJiBlcnJvcj8uY29kZSAhPT0gJ0VOT1RESVInKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEVycm9yIHNlYXJjaGluZyAke3R5cGV9IGRpcmVjdG9yeSBmb3IgY29udGVudCBkZXRlY3Rpb25gLCB7IFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICBlcnJvcjogZXJyb3I/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgY29kZTogZXJyb3I/LmNvZGUgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmV0dXJuIG51bGwgaW5zdGVhZCBvZiB0aHJvd2luZyB0byBsZXQgb3RoZXIgc2VhcmNoZXMgY29udGludWVcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOSk6IERlZmluZSBleGFjdCBtYXRjaCBjcml0ZXJpYVxuICAgICAgY29uc3QgaXNFeGFjdE1hdGNoID0gKG1hdGNoOiBFbGVtZW50RGV0ZWN0aW9uTWF0Y2gpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKG1hdGNoLnBhdGgsIHBhdGguZXh0bmFtZShtYXRjaC5wYXRoKSk7XG4gICAgICAgIHJldHVybiBmaWxlbmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBFeGVjdXRlIHNlYXJjaGVzIHdpdGggZWFybHkgdGVybWluYXRpb24gb3B0aW1pemF0aW9uXG4gICAgICBjb25zdCBzZWFyY2hSZXN1bHRzID0gYXdhaXQgRWFybHlUZXJtaW5hdGlvblNlYXJjaC5leGVjdXRlV2l0aEVhcmx5VGVybWluYXRpb24oXG4gICAgICAgIHNlYXJjaEZ1bmN0aW9ucyxcbiAgICAgICAgaXNFeGFjdE1hdGNoLFxuICAgICAgICB7XG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ2VsZW1lbnQtdHlwZS1kZXRlY3Rpb24nLFxuICAgICAgICAgIHRpbWVvdXRBZnRlckV4YWN0TWF0Y2g6IDEwMDAsIC8vIFdhaXQgMSBzZWNvbmQgZm9yIG90aGVyIHNlYXJjaGVzIGFmdGVyIGV4YWN0IG1hdGNoXG4gICAgICAgICAgbWF4UGFyYWxsZWxTZWFyY2hlczogOCAvLyBMaW1pdCBjb25jdXJyZW50IHNlYXJjaGVzIHRvIGF2b2lkIG92ZXJ3aGVsbWluZyB0aGUgc3lzdGVtXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IEVuaGFuY2VkIGJhdGNoIG9wZXJhdGlvbiByZXBvcnRpbmdcbiAgICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdG90YWxTZWFyY2hlczogc2VhcmNoUmVzdWx0cy50b3RhbFNlYXJjaGVzLFxuICAgICAgICBjb21wbGV0ZWRTZWFyY2hlczogc2VhcmNoUmVzdWx0cy5jb21wbGV0ZWRTZWFyY2hlcyxcbiAgICAgICAgbWF0Y2hlczogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCxcbiAgICAgICAgZmFpbHVyZXM6IHNlYXJjaFJlc3VsdHMuZmFpbHVyZXMubGVuZ3RoLFxuICAgICAgICBleGFjdE1hdGNoRm91bmQ6ICEhc2VhcmNoUmVzdWx0cy5leGFjdE1hdGNoLFxuICAgICAgICBleGFjdE1hdGNoVHlwZTogc2VhcmNoUmVzdWx0cy5leGFjdE1hdGNoPy50eXBlLFxuICAgICAgICBlYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkOiBzZWFyY2hSZXN1bHRzLmVhcmx5VGVybWluYXRpb25UcmlnZ2VyZWQsXG4gICAgICAgIHBlcmZvcm1hbmNlR2Fpbjogc2VhcmNoUmVzdWx0cy5wZXJmb3JtYW5jZUdhaW4sXG4gICAgICAgIG1hdGNoZWRUeXBlczogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLm1hcChtID0+IG0udHlwZSksXG4gICAgICAgIGZhaWxlZFR5cGVzOiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLm1hcChmID0+IGVsZW1lbnRUeXBlc1tmLmluZGV4XSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgICB9O1xuXG4gICAgICBsb2dnZXIuZGVidWcoJ0VsZW1lbnQgdHlwZSBkZXRlY3Rpb24gY29tcGxldGVkIHdpdGggZWFybHkgdGVybWluYXRpb24gb3B0aW1pemF0aW9uJywgYmF0Y2hSZXN1bHRzKTtcblxuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM4KTogQ2xlYXIgcmVwb3J0aW5nIG9mIHBhcnRpYWwgZmFpbHVyZXNcbiAgICAgIGlmIChzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1NvbWUgZWxlbWVudCB0eXBlIHNlYXJjaGVzIGZhaWxlZCBkdXJpbmcgYmF0Y2ggb3BlcmF0aW9uJywge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZmFpbHVyZXM6IHNlYXJjaFJlc3VsdHMuZmFpbHVyZXMubWFwKGYgPT4gKHtcbiAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlc1tmLmluZGV4XSB8fCAndW5rbm93bicsXG4gICAgICAgICAgICBlcnJvcjogZi5lcnJvci5zdWJzdHJpbmcoMCwgMTAwKSAvLyBUcnVuY2F0ZSBsb25nIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIHN1Y2Nlc3NSYXRlOiBgJHtzZWFyY2hSZXN1bHRzLmNvbXBsZXRlZFNlYXJjaGVzfS8ke3NlYXJjaFJlc3VsdHMudG90YWxTZWFyY2hlc31gLFxuICAgICAgICAgIGltcGFjdE9uUmVzdWx0czogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCA+IDAgXG4gICAgICAgICAgICA/ICdObyBpbXBhY3QgLSBtYXRjaGVzIGZvdW5kIGluIHN1Y2Nlc3NmdWwgc2VhcmNoZXMnIFxuICAgICAgICAgICAgOiAnUG90ZW50aWFsIGltcGFjdCAtIG5vIG1hdGNoZXMgZm91bmQnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgZmFpbHVyZXMgYW5kIG5vIG1hdGNoZXMsIHByb3ZpZGUgYWN0aW9uYWJsZSBndWlkYW5jZVxuICAgICAgICBpZiAoc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCA9PT0gMCAmJiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2dnZXIud2FybignQmF0Y2ggb3BlcmF0aW9uIGhhZCBmYWlsdXJlcyBhbmQgbm8gbWF0Y2hlcyBmb3VuZCcsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0NvbnNpZGVyIGNoZWNraW5nIGZpbGUgcGVybWlzc2lvbnMgb3IgcG9ydGZvbGlvIHN0cnVjdHVyZScsXG4gICAgICAgICAgICBmYWlsdXJlQ291bnQ6IHNlYXJjaFJlc3VsdHMuZmFpbHVyZXMubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxTZWFyY2hlczogc2VhcmNoUmVzdWx0cy50b3RhbFNlYXJjaGVzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHBlcmZvcm1hbmNlIGdhaW5zIGZyb20gZWFybHkgdGVybWluYXRpb25cbiAgICAgIGlmIChzZWFyY2hSZXN1bHRzLmVhcmx5VGVybWluYXRpb25UcmlnZ2VyZWQpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0Vhcmx5IHRlcm1pbmF0aW9uIG9wdGltaXphdGlvbiBhcHBsaWVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGV4YWN0TWF0Y2hUeXBlOiBzZWFyY2hSZXN1bHRzLmV4YWN0TWF0Y2g/LnR5cGUsXG4gICAgICAgICAgcGVyZm9ybWFuY2VHYWluOiBzZWFyY2hSZXN1bHRzLnBlcmZvcm1hbmNlR2FpbixcbiAgICAgICAgICBzZWFyY2hlc0NvbXBsZXRlZDogc2VhcmNoUmVzdWx0cy5jb21wbGV0ZWRTZWFyY2hlcyxcbiAgICAgICAgICBzZWFyY2hlc1RvdGFsOiBzZWFyY2hSZXN1bHRzLnRvdGFsU2VhcmNoZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvdW5kOiBzZWFyY2hSZXN1bHRzLm1hdGNoZXMubGVuZ3RoID4gMCxcbiAgICAgICAgbWF0Y2hlczogc2VhcmNoUmVzdWx0cy5tYXRjaGVzXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgaW4gZWxlbWVudCB0eXBlIGRldGVjdGlvbicsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJldHVybiBlbXB0eSByZXN1bHQgb24gZGV0ZWN0aW9uIGZhaWx1cmVcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvdW5kOiBmYWxzZSxcbiAgICAgICAgbWF0Y2hlczogW11cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVYIElNUFJPVkVNRU5UOiBHZW5lcmF0ZSBuYW1lIHN1Z2dlc3Rpb25zIGZvciBzaW1pbGFyIGNvbnRlbnRcbiAgICogUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM4KTogRW5oYW5jZWQgYmF0Y2ggb3BlcmF0aW9uIGhhbmRsaW5nIHdpdGggY2xlYXIgcGFydGlhbCBmYWlsdXJlIHJlcG9ydGluZ1xuICAgKiBIZWxwcyB1c2VycyBmaW5kIGNvbnRlbnQgd2hlbiBleGFjdCBtYXRjaGVzIGZhaWxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVOYW1lU3VnZ2VzdGlvbnMoc2VhcmNoTmFtZTogc3RyaW5nKTogUHJvbWlzZTxBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdWdnZXN0aW9uczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4gPSBbXTtcbiAgICAgIGNvbnN0IHNlYXJjaExvd2VyID0gc2VhcmNoTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgZWxlbWVudFR5cGVzID0gT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSk7XG4gICAgICBcbiAgICAgIC8vIFRyYWNrIGJhdGNoIG9wZXJhdGlvbiByZXN1bHRzIGZvciBiZXR0ZXIgZGlhZ25vc3RpY3NcbiAgICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IHtcbiAgICAgICAgc2VhcmNoTmFtZSxcbiAgICAgICAgdG90YWxUeXBlczogZWxlbWVudFR5cGVzLmxlbmd0aCxcbiAgICAgICAgc3VjY2Vzc2Z1bFNjYW5zOiAwLFxuICAgICAgICBmYWlsZWRTY2FuczogMCxcbiAgICAgICAgZmFpbHVyZURldGFpbHM6IFtdIGFzIEFycmF5PHsgdHlwZTogRWxlbWVudFR5cGU7IGVycm9yOiBzdHJpbmcgfT4sXG4gICAgICAgIHRvdGFsU3VnZ2VzdGlvbnM6IDAsXG4gICAgICAgIHN1Z2dlc3Rpb25zQnlUeXBlOiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+XG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBQcm9jZXNzIGFsbCBlbGVtZW50IHR5cGVzIGZvciBzdWdnZXN0aW9uc1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBlbGVtZW50VHlwZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnREaXIgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoZWxlbWVudFR5cGUpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIEdldCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeVxuICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUoZWxlbWVudERpciwgJyonLCB7XG4gICAgICAgICAgICBleHRlbnNpb25zOiBbJy5tZCcsICcuanNvbicsICcueWFtbCcsICcueW1sJ10sXG4gICAgICAgICAgICBwYXJ0aWFsTWF0Y2g6IGZhbHNlLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHRzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgbGV0IHR5cGVTdWdnZXN0aW9ucyA9IDA7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsZXMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgcGF0aC5leHRuYW1lKGZpbGVQYXRoKSk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgc2ltaWxhcml0eSB1c2luZyBzaW1wbGUgbWV0cmljc1xuICAgICAgICAgICAgICBpZiAodGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaExvd2VyLCBiYXNlbmFtZS50b0xvd2VyQ2FzZSgpKSA+IFNFQVJDSF9DT05GSUcuTUlOX1NJTUlMQVJJVFlfU0NPUkUpIHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGJhc2VuYW1lLFxuICAgICAgICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0eXBlU3VnZ2VzdGlvbnMrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlcywgcGF0aC5leHRuYW1lKGZpbGVzKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaExvd2VyLCBiYXNlbmFtZS50b0xvd2VyQ2FzZSgpKSA+IFNFQVJDSF9DT05GSUcuTUlOX1NJTUlMQVJJVFlfU0NPUkUpIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogYmFzZW5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHR5cGVTdWdnZXN0aW9ucysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBiYXRjaFJlc3VsdHMuc3VjY2Vzc2Z1bFNjYW5zKys7XG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLnN1Z2dlc3Rpb25zQnlUeXBlW2VsZW1lbnRUeXBlXSA9IHR5cGVTdWdnZXN0aW9ucztcbiAgICAgICAgICBcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBUcmFjayBhbmQgcmVwb3J0IHBhcnRpYWwgZmFpbHVyZXNcbiAgICAgICAgICBiYXRjaFJlc3VsdHMuZmFpbGVkU2NhbnMrKztcbiAgICAgICAgICBiYXRjaFJlc3VsdHMuZmFpbHVyZURldGFpbHMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBMb2cgaW5kaXZpZHVhbCBmYWlsdXJlcyBmb3IgZGlhZ25vc3RpY3NcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBzY2FuIGVsZW1lbnQgdHlwZSBmb3Igc3VnZ2VzdGlvbnMnLCB7XG4gICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgYmF0Y2hSZXN1bHRzLnRvdGFsU3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5sZW5ndGg7XG4gICAgICBcbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IENvbXByZWhlbnNpdmUgYmF0Y2ggb3BlcmF0aW9uIHJlcG9ydGluZ1xuICAgICAgbG9nZ2VyLmRlYnVnKCdOYW1lIHN1Z2dlc3Rpb24gYmF0Y2ggb3BlcmF0aW9uIGNvbXBsZXRlZCcsIHtcbiAgICAgICAgLi4uYmF0Y2hSZXN1bHRzLFxuICAgICAgICBzdWNjZXNzUmF0ZTogYCR7YmF0Y2hSZXN1bHRzLnN1Y2Nlc3NmdWxTY2Fuc30vJHtiYXRjaFJlc3VsdHMudG90YWxUeXBlc31gLFxuICAgICAgICAvLyBEb24ndCBsb2cgZnVsbCBmYWlsdXJlIGRldGFpbHMgYXQgZGVidWcgbGV2ZWwgdG8gYXZvaWQgc3BhbVxuICAgICAgICBoYXNGYWlsdXJlczogYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zID4gMFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlcG9ydCBmYWlsdXJlcyBjbGVhcmx5IGlmIHRoZXkgb2NjdXJyZWRcbiAgICAgIGlmIChiYXRjaFJlc3VsdHMuZmFpbGVkU2NhbnMgPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTb21lIGVsZW1lbnQgdHlwZSBzY2FucyBmYWlsZWQgZHVyaW5nIG5hbWUgc3VnZ2VzdGlvbiBnZW5lcmF0aW9uJywge1xuICAgICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgICAgZmFpbGVkVHlwZXM6IGJhdGNoUmVzdWx0cy5mYWlsdXJlRGV0YWlscy5tYXAoZiA9PiBmLnR5cGUpLFxuICAgICAgICAgIHN1Y2Nlc3NmdWxUeXBlczogYmF0Y2hSZXN1bHRzLnN1Y2Nlc3NmdWxTY2FucyxcbiAgICAgICAgICBpbXBhY3RPblJlc3VsdHM6IGJhdGNoUmVzdWx0cy50b3RhbFN1Z2dlc3Rpb25zID4gMCBcbiAgICAgICAgICAgID8gJ1BhcnRpYWwgaW1wYWN0IC0gc3VnZ2VzdGlvbnMgZm91bmQgZnJvbSBzdWNjZXNzZnVsIHNjYW5zJyBcbiAgICAgICAgICAgIDogJ1BvdGVudGlhbCBpbXBhY3QgLSBubyBzdWdnZXN0aW9ucyBnZW5lcmF0ZWQnLFxuICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiBiYXRjaFJlc3VsdHMudG90YWxTdWdnZXN0aW9ucyA9PT0gMCAmJiBiYXRjaFJlc3VsdHMuZmFpbGVkU2NhbnMgPiAwXG4gICAgICAgICAgICA/ICdDaGVjayBwb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZSBhbmQgZmlsZSBwZXJtaXNzaW9ucydcbiAgICAgICAgICAgIDogJ1N1Z2dlc3Rpb24gZ2VuZXJhdGlvbiBwYXJ0aWFsbHkgc3VjY2Vzc2Z1bCBkZXNwaXRlIHNvbWUgZmFpbHVyZXMnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTb3J0IGJ5IHNpbWlsYXJpdHkgKGhpZ2hlciBpcyBiZXR0ZXIpIGFuZCByZXR1cm4gdG9wIHN1Z2dlc3Rpb25zXG4gICAgICBjb25zdCBzb3J0ZWRTdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3Qgc2ltQSA9IHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYS5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBjb25zdCBzaW1CID0gdGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaExvd2VyLCBiLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIHJldHVybiBzaW1CIC0gc2ltQTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ05hbWUgc3VnZ2VzdGlvbnMgZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgc2VhcmNoTmFtZSxcbiAgICAgICAgdG90YWxTdWdnZXN0aW9uczogc29ydGVkU3VnZ2VzdGlvbnMubGVuZ3RoLFxuICAgICAgICB0b3BTdWdnZXN0aW9uczogc29ydGVkU3VnZ2VzdGlvbnMuc2xpY2UoMCwgMykubWFwKHMgPT4gcy5uYW1lKVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBzb3J0ZWRTdWdnZXN0aW9ucztcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGdlbmVyYXRlIG5hbWUgc3VnZ2VzdGlvbnMgLSBiYXRjaCBvcGVyYXRpb24gZmFpbGVkIGNvbXBsZXRlbHknLCB7IFxuICAgICAgICBzZWFyY2hOYW1lLCBcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgcmVjb21tZW5kYXRpb246ICdDaGVjayBwb3J0Zm9saW8gc3RydWN0dXJlIGFuZCBwZXJtaXNzaW9ucydcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFNpbXBsZSBzaW1pbGFyaXR5IGNhbGN1bGF0aW9uIHVzaW5nIExldmVuc2h0ZWluLWxpa2UgYXBwcm9hY2hcbiAgICogUmV0dXJucyB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHdoZXJlIDEgaXMgaWRlbnRpY2FsXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVNpbWlsYXJpdHkoc3RyMTogc3RyaW5nLCBzdHIyOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIEhhbmRsZSBleGFjdCBtYXRjaGVzXG4gICAgaWYgKHN0cjEgPT09IHN0cjIpIHJldHVybiAxO1xuICAgIFxuICAgIC8vIEhhbmRsZSBzdWJzdHJpbmcgbWF0Y2hlc1xuICAgIGlmIChzdHIxLmluY2x1ZGVzKHN0cjIpIHx8IHN0cjIuaW5jbHVkZXMoc3RyMSkpIHJldHVybiAwLjg7XG4gICAgXG4gICAgLy8gSGFuZGxlIHBhcnRpYWwgbWF0Y2hlc1xuICAgIGNvbnN0IGxvbmdlciA9IHN0cjEubGVuZ3RoID4gc3RyMi5sZW5ndGggPyBzdHIxIDogc3RyMjtcbiAgICBjb25zdCBzaG9ydGVyID0gc3RyMS5sZW5ndGggPiBzdHIyLmxlbmd0aCA/IHN0cjIgOiBzdHIxO1xuICAgIFxuICAgIGlmIChsb25nZXIubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICBcbiAgICAvLyBDb3VudCBjb21tb24gY2hhcmFjdGVyc1xuICAgIGxldCBjb21tb24gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hvcnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxvbmdlci5pbmNsdWRlcyhzaG9ydGVyW2ldKSkge1xuICAgICAgICBjb21tb24rKztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGNvbW1vbiAvIGxvbmdlci5sZW5ndGg7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVWCBJTVBST1ZFTUVOVDogU2F2ZSBlbGVtZW50IHdpdGggYXV0b21hdGljIHJldHJ5IGxvZ2ljIGZvciB0cmFuc2llbnQgZmFpbHVyZXNcbiAgICogSGFuZGxlcyBjb21tb24gR2l0SHViIEFQSSBpc3N1ZXMgbGlrZSByYXRlIGxpbWl0cyBhbmQgdGVtcG9yYXJ5IG5ldHdvcmsgcHJvYmxlbXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUVsZW1lbnRXaXRoUmV0cnkoXG4gICAgYWRhcHRlcjogUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIsIFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsIFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSxcbiAgICBtYXhSZXRyaWVzOiBudW1iZXIgPSBSRVRSWV9DT05GSUcuTUFYX0FUVEVNUFRTXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGxldCBsYXN0RXJyb3I6IGFueSA9IG51bGw7XG4gICAgXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEF0dGVtcHRpbmcgdG8gc2F2ZSBlbGVtZW50IChhdHRlbXB0ICR7YXR0ZW1wdH0vJHttYXhSZXRyaWVzfSlgLCB7XG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgYXR0ZW1wdFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVVcmwgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuc2F2ZUVsZW1lbnQoYWRhcHRlciwgdHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZmlsZVVybCkge1xuICAgICAgICAgIGlmIChhdHRlbXB0ID4gMSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEVsZW1lbnQgc2F2ZWQgc3VjY2Vzc2Z1bGx5IGFmdGVyICR7YXR0ZW1wdH0gYXR0ZW1wdHNgLCB7XG4gICAgICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgZmlsZVVybFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaWxlVXJsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJZiBzYXZlRWxlbWVudCByZXR1cm5zIG51bGwsIHRyZWF0IGFzIGEgZmFpbHVyZSBidXQgZG9uJ3QgcmV0cnkgaW1tZWRpYXRlbHlcbiAgICAgICAgbGFzdEVycm9yID0gbmV3IEVycm9yKGBzYXZlRWxlbWVudCByZXR1cm5lZCBudWxsIG9uIGF0dGVtcHQgJHthdHRlbXB0fWApO1xuICAgICAgICBcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3I7XG4gICAgICAgIGNvbnN0IGlzUmV0cnlhYmxlID0gdGhpcy5pc1JldHJ5YWJsZUVycm9yKGVycm9yKTtcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci53YXJuKGBTYXZlIGF0dGVtcHQgJHthdHRlbXB0fSBmYWlsZWRgLCB7XG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICBpc1JldHJ5YWJsZSxcbiAgICAgICAgICB3aWxsUmV0cnk6IGlzUmV0cnlhYmxlICYmIGF0dGVtcHQgPCBtYXhSZXRyaWVzXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSByZXRyeWFibGUgZXJyb3IsIGZhaWwgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKCFpc1JldHJ5YWJsZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignTm9uLXJldHJ5YWJsZSBlcnJvciBlbmNvdW50ZXJlZCwgYWJvcnRpbmcgcmV0cmllcycsIHtcbiAgICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBtb3JlIGF0dGVtcHRzLCB3YWl0IGJlZm9yZSByZXRyeWluZ1xuICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heFJldHJpZXMpIHtcbiAgICAgICAgICBjb25zdCBkZWxheSA9IGNhbGN1bGF0ZVJldHJ5RGVsYXkoYXR0ZW1wdCk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBXYWl0aW5nICR7ZGVsYXl9bXMgYmVmb3JlIHJldHJ5YCwgeyBhdHRlbXB0LCBkZWxheSB9KTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBBbGwgYXR0ZW1wdHMgZmFpbGVkXG4gICAgbG9nZ2VyLmVycm9yKGBBbGwgJHttYXhSZXRyaWVzfSBzYXZlIGF0dGVtcHRzIGZhaWxlZGAsIHtcbiAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgZWxlbWVudFR5cGUsXG4gICAgICBsYXN0RXJyb3I6IGxhc3RFcnJvcj8ubWVzc2FnZVxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIGFuIGVycm9yIGlzIHdvcnRoIHJldHJ5aW5nXG4gICAqIFJldHJ5YWJsZTogbmV0d29yayBpc3N1ZXMsIHJhdGUgbGltaXRzLCB0ZW1wb3JhcnkgR2l0SHViIEFQSSBwcm9ibGVtc1xuICAgKiBOb24tcmV0cnlhYmxlOiBhdXRoZW50aWNhdGlvbiBpc3N1ZXMsIHZhbGlkYXRpb24gZXJyb3JzLCBwZXJtYW5lbnQgZmFpbHVyZXNcbiAgICovXG4gIHByaXZhdGUgaXNSZXRyeWFibGVFcnJvcihlcnJvcjogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3I/Lm1lc3NhZ2U/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgY29uc3QgZXJyb3JDb2RlID0gZXJyb3I/LmNvZGU7XG4gICAgY29uc3Qgc3RhdHVzQ29kZSA9IGVycm9yPy5zdGF0dXMgfHwgZXJyb3I/LnN0YXR1c0NvZGU7XG4gICAgXG4gICAgLy8gTmV0d29yayBhbmQgdGltZW91dCBlcnJvcnNcbiAgICBpZiAoZXJyb3JDb2RlID09PSAnRU5PVEZPVU5EJyB8fCBlcnJvckNvZGUgPT09ICdFQ09OTlJFU0VUJyB8fCBlcnJvckNvZGUgPT09ICdFVElNRURPVVQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gR2l0SHViIEFQSSByYXRlIGxpbWl0c1xuICAgIGlmIChzdGF0dXNDb2RlID09PSA0MjkgfHwgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBUZW1wb3JhcnkgR2l0SHViIEFQSSBpc3N1ZXNcbiAgICBpZiAoc3RhdHVzQ29kZSA+PSA1MDAgJiYgc3RhdHVzQ29kZSA8IDYwMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFRlbXBvcmFyeSBHaXRIdWIgQVBJIHByb2JsZW1zXG4gICAgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygndGVtcG9yYXJpbHkgdW5hdmFpbGFibGUnKSB8fCBcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdzZXJ2aWNlIHVuYXZhaWxhYmxlJykgfHxcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdpbnRlcm5hbCBzZXJ2ZXIgZXJyb3InKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIENvbm5lY3Rpb24gaXNzdWVzXG4gICAgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnY29ubmVjdGlvbicpICYmIFxuICAgICAgICAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd0aW1lb3V0JykgfHwgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdyZXNldCcpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIERvbid0IHJldHJ5IGF1dGhlbnRpY2F0aW9uIG9yIHBlcm1pc3Npb24gaXNzdWVzXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwMSB8fCBzdGF0dXNDb2RlID09PSA0MDMgfHwgXG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygndW5hdXRob3JpemVkJykgfHwgXG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygnZm9yYmlkZGVuJykgfHxcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdhdXRoZW50aWNhdGlvbicpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIERvbid0IHJldHJ5IHZhbGlkYXRpb24gZXJyb3JzXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwMCB8fCBzdGF0dXNDb2RlID09PSA0MjIgfHxcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkJykgfHxcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd2YWxpZGF0aW9uJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gRGVmYXVsdCB0byBub3QgcmV0cnlpbmcgZm9yIHVua25vd24gZXJyb3JzIHRvIGF2b2lkIGluZmluaXRlIGxvb3BzXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59Il19
1534
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0VG9Qb3J0Zm9saW9Ub29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rvb2xzL3BvcnRmb2xpby9zdWJtaXRUb1BvcnRmb2xpb1Rvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFHcEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBaUIsTUFBTSw2QkFBNkIsQ0FBQztBQUMxRSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixhQUFhLEVBRWIsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNwQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQy9FLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBOEJsQyxNQUFNLE9BQU8scUJBQXFCO0lBQ3hCLFdBQVcsQ0FBb0I7SUFDL0IsZ0JBQWdCLENBQXVCO0lBQ3ZDLGdCQUFnQixDQUFtQjtJQUUzQyxZQUFZLFFBQWtCO1FBQzVCLDJEQUEyRDtRQUMzRCx5Q0FBeUM7UUFDekMsMERBQTBEO1FBQzFELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBQ25ELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsMEJBQTBCLENBQUMsTUFBK0I7UUFLdEUsaUVBQWlFO1FBQ2pFLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM1QixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSwwQkFBMEI7Z0JBQ2hDLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsK0JBQStCO2dCQUN2QyxPQUFPLEVBQUUsb0NBQW9DLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLEVBQUU7YUFDckcsQ0FBQyxDQUFDO1lBQ0gsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxLQUFLLEVBQUU7b0JBQ0wsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsT0FBTyxFQUFFLHVDQUF1QyxjQUFjLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxFQUFFO29CQUN2RyxLQUFLLEVBQUUsZUFBZTtpQkFDdkI7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxjQUFjLENBQUMsaUJBQWlCO1NBQzNDLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLG1CQUFtQjtRQUsvQixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNoQywwREFBMEQ7WUFDMUQsTUFBTSxDQUFDLElBQUksQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1lBQzFFLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFO29CQUNMLE9BQU8sRUFBRSxLQUFLO29CQUNkLE9BQU8sRUFBRSwrRUFBK0U7d0JBQy9FLHFFQUFxRTt3QkFDckUsNkJBQTZCO29CQUN0QyxLQUFLLEVBQUUsbUJBQW1CO2lCQUMzQjthQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsVUFBVTtTQUNYLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLGdDQUFnQyxDQUM1QyxRQUFnQixFQUNoQixZQUEwQixFQUMxQixZQUFxQjtRQU9yQixJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUM7UUFDL0IsSUFBSSxTQUFTLEdBQWtCLElBQUksQ0FBQztRQUVwQyxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLG9FQUFvRTtZQUNwRSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDZixrRUFBa0U7Z0JBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3hELE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFFL0QsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxLQUFLLEVBQUU7d0JBQ0wsT0FBTyxFQUFFLEtBQUs7d0JBQ2QsT0FBTyxFQUFFLGtCQUFrQixXQUFXLFdBQVcsWUFBWSxJQUFJLFFBQVEsMkJBQTJCOzRCQUM1RixvQkFBb0IsVUFBVSxNQUFNOzRCQUNwQyw2QkFBNkI7NEJBQzdCLHVEQUF1RDs0QkFDdkQsc0RBQXNEOzRCQUN0RCxpREFBaUQsV0FBVyxJQUFJOzRCQUNoRSx1RUFBdUU7NEJBQ3ZFLHNDQUFzQzs0QkFDdEMsK0JBQStCOzRCQUMvQixnQ0FBZ0M7NEJBQ2hDLDhCQUE4Qjs0QkFDOUIsaUNBQWlDO3dCQUN6QyxLQUFLLEVBQUUsbUJBQW1CO3FCQUMzQjtpQkFDRixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sc0ZBQXNGO1lBQ3RGLDRGQUE0RjtZQUM1RixNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUUvRCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMzQiw4REFBOEQ7Z0JBQzlELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUU3RCxvQ0FBb0M7Z0JBQ3BDLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUVqRSxJQUFJLE9BQU8sR0FBRyxZQUFZLFlBQVksSUFBSSxRQUFRLCtCQUErQixDQUFDO2dCQUNsRixPQUFPLElBQUkseUNBQXlDLGNBQWMsTUFBTSxDQUFDO2dCQUV6RSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzNCLE9BQU8sSUFBSSxxQ0FBcUMsQ0FBQztvQkFDakQsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQzt3QkFDN0UsT0FBTyxJQUFJLFFBQVEsVUFBVSxDQUFDLElBQUksTUFBTSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUM7b0JBQy9ELENBQUM7b0JBQ0QsT0FBTyxJQUFJLElBQUksQ0FBQztnQkFDbEIsQ0FBQztnQkFFRCxPQUFPLElBQUksa0NBQWtDLENBQUM7Z0JBQzlDLE9BQU8sSUFBSSw2REFBNkQsQ0FBQztnQkFDekUsT0FBTyxJQUFJLGtEQUFrRCxDQUFDO2dCQUM5RCxPQUFPLElBQUksU0FBUyxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUM7Z0JBQzlFLE9BQU8sSUFBSSxTQUFTLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDO2dCQUMzRyxJQUFJLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUM3QyxPQUFPLElBQUksU0FBUyxDQUFDLFlBQVksSUFBSSxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQ25GLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLGlEQUFpRCxZQUFZLElBQUksUUFBUSx1QkFBdUIsQ0FBQztnQkFDNUcsT0FBTyxJQUFJLHlEQUF5RCxDQUFDO2dCQUNyRSxPQUFPLElBQUksbUZBQW1GLENBQUM7Z0JBRS9GLE9BQU87b0JBQ0wsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsS0FBSyxFQUFFO3dCQUNMLE9BQU8sRUFBRSxLQUFLO3dCQUNkLE9BQU87d0JBQ1AsS0FBSyxFQUFFLG1CQUFtQjtxQkFDM0I7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCxJQUFJLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxvREFBb0Q7Z0JBQ3BELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0YsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxLQUFLLEVBQUU7d0JBQ0wsT0FBTyxFQUFFLEtBQUs7d0JBQ2QsT0FBTyxFQUFFLFlBQVksWUFBWSxJQUFJLFFBQVEseUNBQXlDLFlBQVksTUFBTTs0QkFDaEcsZ0ZBQWdGO3dCQUN4RixLQUFLLEVBQUUsd0JBQXdCO3FCQUNoQztpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELDhCQUE4QjtZQUM5QixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3pCLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBRXZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkJBQTJCLFFBQVEsUUFBUSxXQUFXLEVBQUUsRUFBRTtnQkFDcEUsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsWUFBWSxFQUFFLFdBQVc7Z0JBQ3pCLElBQUksRUFBRSxTQUFTO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixXQUFXO1lBQ1gsU0FBUztTQUNWLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxTQUFpQjtRQUtwRCx1RUFBdUU7UUFDdkUsTUFBTSxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM1QixPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSzthQUM1QixDQUFDO1FBQ0osQ0FBQztRQUVELDREQUE0RDtRQUM1RCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUyxDQUFDO1FBRTFDLG9DQUFvQztRQUNwQyxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ2hELGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHFCQUFxQjtnQkFDM0IsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSwrQkFBK0I7Z0JBQ3ZDLE9BQU8sRUFBRSxhQUFhLEtBQUssQ0FBQyxJQUFJLHFCQUFxQixnQkFBZ0IsQ0FBQyxhQUFhLEVBQUU7YUFDdEYsQ0FBQyxDQUFDO1lBQ0gsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxLQUFLLEVBQUU7b0JBQ0wsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsT0FBTyxFQUFFLHFCQUFxQixnQkFBZ0IsQ0FBQyxnQkFBZ0IsVUFBVTtvQkFDekUsS0FBSyxFQUFFLGdCQUFnQjtpQkFDeEI7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVELDRCQUE0QjtRQUM1QixNQUFNLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELE1BQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDMUUsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsMkJBQTJCO2dCQUNqQyxRQUFRLEVBQUUsTUFBTTtnQkFDaEIsTUFBTSxFQUFFLCtCQUErQjtnQkFDdkMsT0FBTyxFQUFFLHNDQUFzQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7YUFDL0YsQ0FBQyxDQUFDO1lBQ0gsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxLQUFLLEVBQUU7b0JBQ0wsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsT0FBTyxFQUFFLDhCQUE4QixnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3RGLEtBQUssRUFBRSxtQkFBbUI7aUJBQzNCO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPO1NBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxzQkFBc0IsQ0FDNUIsUUFBZ0IsRUFDaEIsV0FBd0IsRUFDeEIsVUFBZTtRQUVmLE9BQU87WUFDTCxJQUFJLEVBQUUsUUFBUTtZQUNkLFdBQVcsRUFBRSxHQUFHLFdBQVcsaUNBQWlDO1lBQzVELE1BQU0sRUFBRSxVQUFVLENBQUMsUUFBUSxJQUFJLFNBQVM7WUFDeEMsT0FBTyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ2pDLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTtZQUNqQyxPQUFPLEVBQUUsT0FBTztTQUNqQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLHdCQUF3QixDQUFDLEtBQWE7UUFLbEQsSUFBSSxDQUFDO1lBQ0gsOENBQThDO1lBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDN0MsZUFBZSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQixJQUFJLEVBQUUsMEJBQTBCO29CQUNoQyxRQUFRLEVBQUUsUUFBUTtvQkFDbEIsTUFBTSxFQUFFLGdEQUFnRDtvQkFDeEQsT0FBTyxFQUFFLDBCQUEwQjtpQkFDcEMsQ0FBQyxDQUFDO2dCQUVILE9BQU87b0JBQ0wsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsS0FBSyxFQUFFO3dCQUNMLE9BQU8sRUFBRSxLQUFLO3dCQUNkLE9BQU8sRUFBRSwrQ0FBK0M7d0JBQ3hELEtBQUssRUFBRSxzQkFBc0I7cUJBQzlCO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQscUVBQXFFO1lBQ3JFLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxZQUFZLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFO2dCQUNyRSxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQzthQUN6QixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzlCLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDL0IsSUFBSSxFQUFFLDBCQUEwQjtvQkFDaEMsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLE1BQU0sRUFBRSxnREFBZ0Q7b0JBQ3hELE9BQU8sRUFBRSw0QkFBNEIsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO2lCQUM5RCxDQUFDLENBQUM7Z0JBRUgsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxLQUFLLEVBQUU7d0JBQ0wsT0FBTyxFQUFFLEtBQUs7d0JBQ2QsT0FBTyxFQUFFLDZEQUE2RDt3QkFDdEUsS0FBSyxFQUFFLHlCQUF5QjtxQkFDakM7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCx5RkFBeUY7WUFDekYsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLElBQUksZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN2QixNQUFNLGNBQWMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdEYsTUFBTSxPQUFPLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7Z0JBRS9CLDhFQUE4RTtnQkFDOUUsb0VBQW9FO2dCQUNwRSxJQUFJLGNBQWMsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7b0JBQ2xDLFlBQVksR0FBRyxJQUFJLENBQUM7b0JBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMscUNBQXFDLEVBQUU7d0JBQ2pELFdBQVcsRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQzt3QkFDL0Msa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFNBQVM7d0JBQ3hELGNBQWMsRUFBRSxnREFBZ0Q7cUJBQ2pFLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztZQUVELDRCQUE0QjtZQUM1QixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSwwQkFBMEI7Z0JBQ2hDLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSxnREFBZ0Q7Z0JBQ3hELE9BQU8sRUFBRSxrREFBa0Q7Z0JBQzNELFFBQVEsRUFBRTtvQkFDUixTQUFTLEVBQUUsWUFBWSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7b0JBQzNDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNO29CQUMvQixrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsU0FBUztvQkFDekQsWUFBWTtpQkFDYjthQUNGLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0wsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsWUFBWTthQUNiLENBQUM7UUFFSixDQUFDO1FBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztZQUNwQiwwQ0FBMEM7WUFDMUMsSUFBSSxLQUFLLEVBQUUsSUFBSSxLQUFLLHFCQUFxQixFQUFFLENBQUM7Z0JBQzFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUZBQWlGLENBQUMsQ0FBQztnQkFDL0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLGlFQUFpRTtZQUM3RixDQUFDO1lBRUQsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsMEJBQTBCO2dCQUNoQyxRQUFRLEVBQUUsTUFBTTtnQkFDaEIsTUFBTSxFQUFFLGdEQUFnRDtnQkFDeEQsT0FBTyxFQUFFLDJCQUEyQixLQUFLLENBQUMsT0FBTyxJQUFJLGVBQWUsRUFBRTthQUN2RSxDQUFDLENBQUM7WUFFSCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLEtBQUssRUFBRTtvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxPQUFPLEVBQUUsOEVBQThFO29CQUN2RixLQUFLLEVBQUUsd0JBQXdCO2lCQUNoQzthQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLHFCQUFxQixDQUFDLFFBQWdCO1FBS2xELElBQUksQ0FBQztZQUNILDZCQUE2QjtZQUM3QixJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM5QyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSx3QkFBd0I7b0JBQzlCLFFBQVEsRUFBRSxRQUFRO29CQUNsQixNQUFNLEVBQUUsNkNBQTZDO29CQUNyRCxPQUFPLEVBQUUsd0RBQXdEO2lCQUNsRSxDQUFDLENBQUM7Z0JBRUgsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxLQUFLLEVBQUU7d0JBQ0wsT0FBTyxFQUFFLEtBQUs7d0JBQ2QsT0FBTyxFQUFFLDRCQUE0Qjt3QkFDckMsS0FBSyxFQUFFLGNBQWM7cUJBQ3RCO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsZ0ZBQWdGO1lBQ2hGLE1BQU0sa0JBQWtCLEdBQUc7Z0JBQ3pCLE1BQU0sRUFBcUIsaUJBQWlCO2dCQUM1QyxRQUFRLEVBQW1CLHNCQUFzQjtnQkFDakQsUUFBUSxFQUFtQix5QkFBeUI7Z0JBQ3BELE1BQU0sRUFBcUIsYUFBYTtnQkFDeEMsc0JBQXNCLEVBQUsscUJBQXFCO2dCQUNoRCxXQUFXLEVBQWdCLHlDQUF5QztnQkFDcEUsd0NBQXdDLEVBQUUseUJBQXlCO2dCQUNuRSxLQUFLLEVBQXNCLG1DQUFtQztnQkFDOUQsTUFBTSxFQUFxQixzQkFBc0I7Z0JBQ2pELFNBQVMsRUFBa0Isa0JBQWtCO2dCQUM3QyxpQkFBaUIsRUFBVSwwQ0FBMEM7Z0JBQ3JFLG1CQUFtQixFQUFRLGVBQWU7Z0JBQzFDLFVBQVUsRUFBaUIsNkJBQTZCO2dCQUN4RCxNQUFNLEVBQXFCLHFCQUFxQjtnQkFDaEQsWUFBWSxDQUFlLCtCQUErQjthQUMzRCxDQUFDO1lBRUYsS0FBSyxNQUFNLE9BQU8sSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUN6QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDM0IsZUFBZSxDQUFDLGdCQUFnQixDQUFDO3dCQUMvQixJQUFJLEVBQUUsd0JBQXdCO3dCQUM5QixRQUFRLEVBQUUsTUFBTTt3QkFDaEIsTUFBTSxFQUFFLDZDQUE2Qzt3QkFDckQsT0FBTyxFQUFFLDZDQUE2QyxPQUFPLENBQUMsTUFBTSxFQUFFO3dCQUN0RSxRQUFRLEVBQUU7NEJBQ1IsVUFBVSxFQUFFLFFBQVEsQ0FBQyxNQUFNOzRCQUMzQixPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU07eUJBQ3hCO3FCQUNGLENBQUMsQ0FBQztvQkFFSCxPQUFPO3dCQUNMLE9BQU8sRUFBRSxLQUFLO3dCQUNkLEtBQUssRUFBRTs0QkFDTCxPQUFPLEVBQUUsS0FBSzs0QkFDZCxPQUFPLEVBQUUscURBQXFEOzRCQUM5RCxLQUFLLEVBQUUseUJBQXlCO3lCQUNqQztxQkFDRixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBRUQsdURBQXVEO1lBQ3ZELE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNsRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsZUFBZSxFQUFFLENBQUM7Z0JBQ3RDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDL0IsSUFBSSxFQUFFLHdCQUF3QjtvQkFDOUIsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLE1BQU0sRUFBRSw2Q0FBNkM7b0JBQ3JELE9BQU8sRUFBRSxxQ0FBcUMsUUFBUSxDQUFDLE1BQU0sTUFBTSxlQUFlLEVBQUU7aUJBQ3JGLENBQUMsQ0FBQztnQkFFSCxPQUFPO29CQUNMLE9BQU8sRUFBRSxLQUFLO29CQUNkLEtBQUssRUFBRTt3QkFDTCxPQUFPLEVBQUUsS0FBSzt3QkFDZCxPQUFPLEVBQUUsdUJBQXVCO3dCQUNoQyxLQUFLLEVBQUUsZUFBZTtxQkFDdkI7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCwyREFBMkQ7WUFDM0QsSUFBSSxjQUFzQixDQUFDO1lBQzNCLElBQUksQ0FBQztnQkFDSCxrQ0FBa0M7Z0JBQ2xDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRCxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFM0Msa0RBQWtEO2dCQUNsRCxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN4RCxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFFcEQsb0VBQW9FO2dCQUNwRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDbEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFFakQsOENBQThDO29CQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO3dCQUMzQyxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7b0JBQ3pELENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxJQUFJLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDekMseUNBQXlDO29CQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7Z0JBQ3ZELENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixlQUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSx3QkFBd0I7b0JBQzlCLFFBQVEsRUFBRSxNQUFNO29CQUNoQixNQUFNLEVBQUUsNkNBQTZDO29CQUNyRCxPQUFPLEVBQUUsOEJBQThCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRTtpQkFDbEcsQ0FBQyxDQUFDO2dCQUVILE9BQU87b0JBQ0wsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsS0FBSyxFQUFFO3dCQUNMLE9BQU8sRUFBRSxLQUFLO3dCQUNkLE9BQU8sRUFBRSx5Q0FBeUM7d0JBQ2xELEtBQUssRUFBRSwyQkFBMkI7cUJBQ25DO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsNkVBQTZFO1lBQzdFLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFakUsSUFBSSxhQUFhLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDaEUsZUFBZSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQixJQUFJLEVBQUUsMkJBQTJCO29CQUNqQyxRQUFRLEVBQUUsUUFBUTtvQkFDbEIsTUFBTSxFQUFFLDZDQUE2QztvQkFDckQsT0FBTyxFQUFFLDhCQUE4QixhQUFhLEVBQUU7b0JBQ3RELFFBQVEsRUFBRTt3QkFDUixpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUNoRDtpQkFDRixDQUFDLENBQUM7Z0JBRUgsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxLQUFLLEVBQUU7d0JBQ0wsT0FBTyxFQUFFLEtBQUs7d0JBQ2QsT0FBTyxFQUFFLG1CQUFtQixhQUFhLHlDQUF5QyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ2hILEtBQUssRUFBRSx3QkFBd0I7cUJBQ2hDO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsNERBQTREO1lBQzVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDL0MsTUFBTSxtQkFBbUIsR0FBRyw2QkFBNkIsQ0FBQztZQUUxRCxJQUFJLFFBQVEsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxlQUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSwyQkFBMkI7b0JBQ2pDLFFBQVEsRUFBRSxRQUFRO29CQUNsQixNQUFNLEVBQUUsNkNBQTZDO29CQUNyRCxPQUFPLEVBQUUsb0RBQW9EO29CQUM3RCxRQUFRLEVBQUU7d0JBQ1IsUUFBUSxFQUFFLFFBQVE7d0JBQ2xCLGNBQWMsRUFBRSxtQkFBbUIsQ0FBQyxNQUFNO3FCQUMzQztpQkFDRixDQUFDLENBQUM7Z0JBRUgsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxLQUFLLEVBQUU7d0JBQ0wsT0FBTyxFQUFFLEtBQUs7d0JBQ2QsT0FBTyxFQUFFLG1JQUFtSTt3QkFDNUksS0FBSyxFQUFFLDZCQUE2QjtxQkFDckM7aUJBQ0YsQ0FBQztZQUNKLENBQUM7WUFFRCw0QkFBNEI7WUFDNUIsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsMkJBQTJCO2dCQUNqQyxRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsNkNBQTZDO2dCQUNyRCxPQUFPLEVBQUUsaUNBQWlDO2dCQUMxQyxRQUFRLEVBQUU7b0JBQ1Isa0JBQWtCLEVBQUUsUUFBUSxDQUFDLE1BQU07b0JBQ25DLG9CQUFvQixFQUFFLGNBQWMsQ0FBQyxNQUFNO29CQUMzQyxhQUFhLEVBQUUsYUFBYSxJQUFJLE1BQU07aUJBQ3ZDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsT0FBTztnQkFDTCxPQUFPLEVBQUUsSUFBSTtnQkFDYixRQUFRLEVBQUUsY0FBYzthQUN6QixDQUFDO1FBRUosQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSx3QkFBd0I7Z0JBQzlCLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixNQUFNLEVBQUUsNkNBQTZDO2dCQUNyRCxPQUFPLEVBQUUsMEJBQTBCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRTthQUM5RixDQUFDLENBQUM7WUFFSCxPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLEtBQUssRUFBRTtvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxPQUFPLEVBQUUseUVBQXlFO29CQUNsRixLQUFLLEVBQUUsdUJBQXVCO2lCQUMvQjthQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxhQUE2RTtRQU1ySCxJQUFJLENBQUM7WUFDSCxvQkFBb0I7WUFDcEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUN2RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsT0FBTztvQkFDTCxVQUFVLEVBQUUsS0FBSztvQkFDakIsS0FBSyxFQUFFO3dCQUNMLE9BQU8sRUFBRSxLQUFLO3dCQUNkLE9BQU8sRUFBRSx1REFBdUQ7d0JBQ2hFLEtBQUssRUFBRSxVQUFVO3FCQUNsQjtpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELDRDQUE0QztZQUM1QyxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN4QixPQUFPO29CQUNMLFVBQVUsRUFBRSxLQUFLO29CQUNqQixLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7aUJBQ3hCLENBQUM7WUFDSixDQUFDO1lBRUQsaUZBQWlGO1lBQ2pGLE1BQU0sY0FBYyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztZQUN2RSxNQUFNLGVBQWUsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRS9ELG1EQUFtRDtZQUNuRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25ELElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1lBRS9CLHVFQUF1RTtZQUN2RSxJQUFJLGVBQWUsSUFBSSxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQy9DLGtCQUFrQixHQUFHLElBQUksQ0FBQztnQkFFMUIsZUFBZSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQixJQUFJLEVBQUUsMEJBQTBCO29CQUNoQyxRQUFRLEVBQUUsS0FBSztvQkFDZixNQUFNLEVBQUUsbURBQW1EO29CQUMzRCxPQUFPLEVBQUUsZ0VBQWdFO29CQUN6RSxRQUFRLEVBQUU7d0JBQ1IsYUFBYTt3QkFDYixTQUFTO3dCQUNULGtCQUFrQixFQUFFLElBQUk7cUJBQ3pCO2lCQUNGLENBQUMsQ0FBQztnQkFFSCxNQUFNLENBQUMsSUFBSSxDQUFDLHNEQUFzRCxFQUFFO29CQUNsRSxhQUFhO29CQUNiLFNBQVM7b0JBQ1QsY0FBYyxFQUFFLCtDQUErQztpQkFDaEUsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELCtEQUErRDtZQUMvRCxJQUFJLFNBQVMsS0FBSyxvQkFBb0IsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsRUFBRTtvQkFDckQsYUFBYTtvQkFDYixTQUFTO29CQUNULFFBQVEsRUFBRSw0RkFBNEY7aUJBQ3ZHLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxrQ0FBa0M7WUFDbEMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsMEJBQTBCO2dCQUNoQyxRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsbURBQW1EO2dCQUMzRCxPQUFPLEVBQUUsZ0RBQWdEO2dCQUN6RCxRQUFRLEVBQUU7b0JBQ1IsYUFBYTtvQkFDYixTQUFTO29CQUNULGVBQWU7b0JBQ2Ysa0JBQWtCO2lCQUNuQjthQUNGLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0wsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLEtBQUs7Z0JBQ0wsa0JBQWtCO2FBQ25CLENBQUM7UUFFSixDQUFDO1FBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztZQUNwQixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSwwQkFBMEI7Z0JBQ2hDLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsbURBQW1EO2dCQUMzRCxPQUFPLEVBQUUsMkJBQTJCLEtBQUssQ0FBQyxPQUFPLElBQUksZUFBZSxFQUFFO2FBQ3ZFLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0wsVUFBVSxFQUFFLEtBQUs7Z0JBQ2pCLEtBQUssRUFBRTtvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxPQUFPLEVBQUUsdUZBQXVGO29CQUNoRyxLQUFLLEVBQUUsd0JBQXdCO2lCQUNoQzthQUNGLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLDBCQUEwQixDQUFDLGFBQXFCLEVBQUUsU0FBaUI7UUFDekUsSUFBSSxRQUFRLEdBQUcsc0NBQXNDLENBQUM7UUFFdEQsSUFBSSxTQUFTLEtBQUssb0JBQW9CLEVBQUUsQ0FBQztZQUN2QyxRQUFRLElBQUksdUNBQXVDLENBQUM7WUFDcEQsUUFBUSxJQUFJLG1EQUFtRCxDQUFDO1lBQ2hFLFFBQVEsSUFBSSwyREFBMkQsQ0FBQztRQUMxRSxDQUFDO2FBQU0sSUFBSSxTQUFTLEtBQUssdUJBQXVCLEVBQUUsQ0FBQztZQUNqRCxRQUFRLElBQUksaURBQWlELENBQUM7WUFDOUQsUUFBUSxJQUFJLG9FQUFvRSxDQUFDO1lBQ2pGLFFBQVEsSUFBSSxpRkFBaUYsQ0FBQztRQUNoRyxDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsSUFBSSx3REFBd0QsQ0FBQztZQUNyRSxRQUFRLElBQUksK0NBQStDLENBQUM7WUFDNUQsUUFBUSxJQUFJLG9EQUFvRCxDQUFDO1FBQ25FLENBQUM7UUFFRCxRQUFRLElBQUksb0JBQW9CLGFBQWEsSUFBSSxDQUFDO1FBQ2xELFFBQVEsSUFBSSwyQ0FBMkMsQ0FBQztRQUN4RCxRQUFRLElBQUksc0ZBQXNGLENBQUM7UUFFbkcsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMscUJBQXFCLENBQUMsVUFBZTtRQUlqRCw4RUFBOEU7UUFDOUUsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLGVBQWUsQ0FBQyxLQUFLO2FBQzdCLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEtBQU0sQ0FBQztRQUVyQywwRUFBMEU7UUFDMUUsSUFBSSxlQUFlLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN2QyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxvQkFBb0IsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsRixNQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLGlEQUFpRDtRQUNqRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQztRQUNsRCxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVuRixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ2hELHlDQUF5QztZQUN6QyxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixPQUFPO29CQUNMLE9BQU8sRUFBRSxLQUFLO29CQUNkLEtBQUssRUFBRTt3QkFDTCxPQUFPLEVBQUUsS0FBSzt3QkFDZCxPQUFPLEVBQUUsdUNBQXVDO3dCQUNoRCxLQUFLLEVBQUUsZUFBZTtxQkFDdkI7aUJBQ0YsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxLQUFLLENBQUMsOEJBQThCLENBQzFDLFFBQWdCLEVBQ2hCLFdBQXdCLEVBQ3hCLFFBQWtDLEVBQ2xDLE9BQWUsRUFDZixVQUFlO1FBRWYsbUNBQW1DO1FBQ25DLE1BQU0sT0FBTyxHQUFxQjtZQUNoQyxJQUFJLEVBQUUsV0FBVztZQUNqQixRQUFRO1lBQ1IsT0FBTztTQUNSLENBQUM7UUFFRiwwRUFBMEU7UUFDMUUsNEZBQTRGO1FBQzVGLHlFQUF5RTtRQUN6RSxNQUFNLE9BQU8sR0FBRyxJQUFJLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJELHlEQUF5RDtRQUN6RCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRWhGLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLHlFQUF5RTtvQkFDMUUsZ0NBQWdDO29CQUNoQyx3REFBd0Q7b0JBQ3hELG1DQUFtQztvQkFDbkMseURBQXlEO29CQUN6RCxrREFBa0Q7Z0JBQzFELEtBQUssRUFBRSxhQUFhO2FBQ3JCLENBQUM7UUFDSixDQUFDO1FBRUQsMkNBQTJDO1FBQzNDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLFFBQVEsc0JBQXNCLEVBQUU7WUFDcEUsV0FBVztZQUNYLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtZQUM3QixPQUFPO1NBQ1IsQ0FBQyxDQUFDO1FBRUgsb0ZBQW9GO1FBQ3BGLE1BQU0seUJBQXlCLEdBQUcsTUFBTSxJQUFJLENBQUMsMkJBQTJCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNsRyxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDMUMsbUZBQW1GO1lBQ25GLE1BQU0sWUFBWSxHQUFHLHlCQUF5QixDQUFDLEtBQUssRUFBRSxPQUFPLElBQUkseUJBQXlCLENBQUM7WUFDM0YsT0FBTztnQkFDTCxPQUFPLEVBQUUsSUFBSTtnQkFDYixPQUFPLEVBQUUsMkJBQTJCLFFBQVEsaURBQWlELE9BQU8seUNBQXlDLFlBQVksRUFBRTtnQkFDM0osR0FBRyxFQUFFLE9BQU87YUFDYixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLHlCQUF5QixDQUFDLEtBQU0sQ0FBQztRQUUvQyxvRUFBb0U7UUFDcEUsSUFBSSx5QkFBeUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2pELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQyxtREFBbUQsRUFBRTtnQkFDL0QsU0FBUztnQkFDVCxjQUFjLEVBQUUsOEVBQThFO2FBQy9GLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCwwRUFBMEU7UUFDMUUscURBQXFEO1FBQ3JELE1BQU0sMEJBQTBCLEdBQUcsTUFBTSxJQUFJLENBQUMsNkJBQTZCLENBQUM7WUFDMUUsV0FBVyxFQUFFLFFBQVE7WUFDckIsV0FBVztZQUNYLFlBQVksRUFBRSxPQUFPO1lBQ3JCLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUSxJQUFJLFNBQVM7WUFDMUMsUUFBUTtZQUNSLEtBQUs7U0FDTixDQUFDLENBQUM7UUFFSCxvREFBb0Q7UUFDcEQsSUFBSSxPQUFPLEdBQUcsMkJBQTJCLFFBQVEsOEJBQThCLENBQUM7UUFDaEYsT0FBTyxJQUFJLHFCQUFxQixPQUFPLE1BQU0sQ0FBQztRQUU5QyxJQUFJLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxzRUFBc0UsQ0FBQztZQUNsRixPQUFPLElBQUksYUFBYSwwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoRSxDQUFDO2FBQU0sSUFBSSwwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMvQyxPQUFPLElBQUksbUVBQW1FLENBQUM7UUFDakYsQ0FBQzthQUFNLElBQUksMEJBQTBCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDNUMsT0FBTyxJQUFJLG9DQUFvQywwQkFBMEIsQ0FBQyxLQUFLLElBQUksQ0FBQztZQUNwRixPQUFPLElBQUksc0ZBQXNGLENBQUM7UUFDcEcsQ0FBQztRQUVELE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSTtZQUNiLE9BQU87WUFDUCxHQUFHLEVBQUUsT0FBTztTQUNiLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUErQjtRQUMzQyxJQUFJLENBQUM7WUFDSCwwQ0FBMEM7WUFDMUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sZ0JBQWdCLENBQUMsS0FBTSxDQUFDO1lBQ2pDLENBQUM7WUFDRCxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFTLENBQUM7WUFFNUMsOEJBQThCO1lBQzlCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxVQUFVLENBQUMsS0FBTSxDQUFDO1lBQzNCLENBQUM7WUFDRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVyxDQUFDO1lBRTFDLGlEQUFpRDtZQUNqRCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxRQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDM0IsT0FBTyxhQUFhLENBQUMsS0FBTSxDQUFDO1lBQzlCLENBQUM7WUFDRCxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUMsV0FBWSxDQUFDO1lBQy9DLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxTQUFVLENBQUM7WUFFM0MscUNBQXFDO1lBQ3JDLE1BQU0sY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sY0FBYyxDQUFDLEtBQU0sQ0FBQztZQUMvQixDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLE9BQVEsQ0FBQztZQUV4Qyw4RUFBOEU7WUFDOUUsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsUUFBUSxzQkFBc0IsQ0FBQyxDQUFDO1lBRW5FLCtCQUErQjtZQUMvQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsUUFBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUVqRixrQ0FBa0M7WUFDbEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDeEIsT0FBTyxVQUFVLENBQUMsS0FBTSxDQUFDO1lBQzNCLENBQUM7WUFFRCwrREFBK0Q7WUFDL0QsT0FBTyxNQUFNLElBQUksQ0FBQyw4QkFBOEIsQ0FDOUMsUUFBUyxFQUNULFdBQVcsRUFDWCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFVBQVUsQ0FDWCxDQUFDO1FBRUosQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZix1RkFBdUY7WUFDdkYsWUFBWSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUU7Z0JBQ2hELFdBQVcsRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDeEIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJO2FBQ3pCLENBQUMsQ0FBQztZQUVILCtEQUErRDtZQUMvRCxNQUFNLFlBQVksR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUUsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7Z0JBQzdDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUMzQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztnQkFDMUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUUvRCxJQUFJLGNBQWMsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFM0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDO29CQUNILG1EQUFtRDtvQkFDbkQsTUFBTSxZQUFZLEdBQUcsTUFBTSxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDOUQsSUFBSSxZQUFZLEVBQUUsQ0FBQzt3QkFDakIsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQzt3QkFDMUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxDQUFDO3dCQUUzRiwyQ0FBMkM7d0JBQzNDLElBQUksY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDOzRCQUMzQixjQUFjLENBQUMsT0FBTyxJQUFJLGVBQWUsQ0FBQzt3QkFDNUMsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUM7Z0JBQUMsT0FBTyxVQUFVLEVBQUUsQ0FBQztvQkFDcEIsdURBQXVEO29CQUN2RCxjQUFjLENBQUMsT0FBTyxJQUFJLGtHQUFrRyxDQUFDO2dCQUMvSCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLDZCQUE2QixDQUFDLE1BTzNDO1FBQ0MsSUFBSSxDQUFDO1lBQ0gsOENBQThDO1lBQzlDLDBFQUEwRTtZQUMxRSxvREFBb0Q7WUFFcEQsbUVBQW1FO1lBQ25FLGlEQUFpRDtZQUNqRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxLQUFLLE1BQU0sQ0FBQztZQUU5RSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2hCLDBDQUEwQztnQkFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3RkFBd0YsQ0FBQyxDQUFDO2dCQUN0RyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDOUMsQ0FBQztZQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQztZQUU3RCxnREFBZ0Q7WUFDaEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUM7Z0JBQ2hELEdBQUcsTUFBTTtnQkFDVCxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7YUFDcEIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixNQUFNLENBQUMsSUFBSSxDQUFDLGtEQUFrRCxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUN4RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsQ0FBQztZQUNoRixDQUFDO1FBRUgsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNqRSxPQUFPO2dCQUNMLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixRQUFRLEVBQUUsS0FBSztnQkFDZixLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZTthQUNoRSxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFPbkM7UUFDQyxJQUFJLENBQUM7WUFFSCx5QkFBeUI7WUFDekIsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsV0FBVyxTQUFTLE1BQU0sQ0FBQyxXQUFXLFFBQVEsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRXpGLHNEQUFzRDtZQUN0RCxNQUFNLElBQUksR0FBRyxVQUFVLE1BQU0sQ0FBQyxXQUFXOztDQUU5QztnQkFDTyxhQUFhLE1BQU0sQ0FBQyxXQUFXLElBQUk7Z0JBQ25DLGdCQUFnQixNQUFNLENBQUMsUUFBUSxJQUFJO2dCQUNuQyxhQUFhLE1BQU0sQ0FBQyxXQUFXLElBQUk7Z0JBQ25DLG9CQUFvQixNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsSUFBSSx5QkFBeUIsTUFBTTtnQkFDbEYsc0JBQXNCO2dCQUN0QixHQUFHLE1BQU0sQ0FBQyxZQUFZLE1BQU07Z0JBQzVCLGdCQUFnQjtnQkFDaEIsZUFBZSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxjQUFjO2dCQUNyRSx3QkFBd0I7Z0JBQ3hCLGlFQUFpRTtnQkFDakUsMkRBQTJEO2dCQUMzRCwyQ0FBMkM7Z0JBQzNDLG9DQUFvQztnQkFDcEMsdURBQXVEO2dCQUN2RCxPQUFPO2dCQUNQLHVGQUF1RixDQUFDO1lBRTFGLHlDQUF5QztZQUN6QyxNQUFNLE1BQU0sR0FBRztnQkFDYixjQUFjLEVBQUcsMkJBQTJCO2dCQUM1QyxnQkFBZ0IsRUFBRSxlQUFlO2dCQUNqQyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLHFCQUFxQjthQUN2RCxDQUFDO1lBRUYsNEVBQTRFO1lBQzVFLDhFQUE4RTtZQUM5RSxNQUFNLFFBQVEsR0FBRyxNQUFNLGlCQUFpQixDQUFDLFlBQVksQ0FDbkQseUJBQXlCLEVBQ3pCLEtBQUssSUFBSSxFQUFFO2dCQUNULE1BQU0sR0FBRyxHQUFHLDZEQUE2RCxDQUFDO2dCQUUxRSxxQ0FBcUM7Z0JBQ3JDLE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO2dCQUU5RSxJQUFJLENBQUM7b0JBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFO3dCQUNoQyxNQUFNLEVBQUUsTUFBTTt3QkFDZCxPQUFPLEVBQUU7NEJBQ1AsUUFBUSxFQUFFLGdDQUFnQzs0QkFDMUMsZUFBZSxFQUFFLFVBQVUsTUFBTSxDQUFDLEtBQUssRUFBRTs0QkFDekMsY0FBYyxFQUFFLGtCQUFrQjs0QkFDbEMsWUFBWSxFQUFFLGtCQUFrQjt5QkFDakM7d0JBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7NEJBQ25CLEtBQUs7NEJBQ0wsSUFBSTs0QkFDSixNQUFNO3lCQUNQLENBQUM7d0JBQ0YsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO3FCQUMxQixDQUFDLENBQUM7b0JBRUgsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUV4QixtRUFBbUU7b0JBQ25FLHlDQUF5QztvQkFDekMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO29CQUN6RSxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO29CQUNqRSxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO29CQUVqRSxNQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFO3dCQUMzQyxTQUFTLEVBQUUseUJBQXlCO3dCQUNwQyxTQUFTLEVBQUUsa0JBQWtCO3dCQUM3QixLQUFLLEVBQUUsY0FBYzt3QkFDckIsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO3dCQUNqRixjQUFjLEVBQUUsUUFBUSxDQUFDLE1BQU07cUJBQ2hDLENBQUMsQ0FBQztvQkFFSCx3Q0FBd0M7b0JBQ3hDLElBQUksa0JBQWtCLElBQUksUUFBUSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7d0JBQzdELE1BQU0sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLEVBQUU7NEJBQy9DLFNBQVMsRUFBRSx5QkFBeUI7NEJBQ3BDLFNBQVMsRUFBRSxrQkFBa0I7NEJBQzdCLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUzs0QkFDakYsY0FBYyxFQUFFLDJFQUEyRTt5QkFDNUYsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQzt3QkFDakIsTUFBTSxTQUFTLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ3hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUU7NEJBQzlDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTs0QkFDdkIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVOzRCQUMvQixLQUFLLEVBQUUsU0FBUzs0QkFDaEIsa0JBQWtCOzRCQUNsQixjQUFjO3lCQUNmLENBQUMsQ0FBQzt3QkFFSCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7NEJBQzVCLE1BQU0sQ0FBQyxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQzt3QkFDL0QsQ0FBQzs2QkFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7NEJBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQzt3QkFDdkUsQ0FBQzs2QkFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7NEJBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQzt3QkFDbEUsQ0FBQzt3QkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO29CQUNqRixDQUFDO29CQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNuQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBRXZCLENBQUM7Z0JBQUMsT0FBTyxVQUFlLEVBQUUsQ0FBQztvQkFDekIsZ0NBQWdDO29CQUNoQyxNQUFNLFVBQVUsQ0FBQztnQkFDbkIsQ0FBQzt3QkFBUyxDQUFDO29CQUNULFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUMsRUFDRCxNQUFNLENBQUMsMENBQTBDO2FBQ2xELENBQUM7WUFFRixPQUFPLFFBQVEsQ0FBQztRQUVsQixDQUFDO1FBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztZQUNwQiw4QkFBOEI7WUFDOUIsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9DQUFvQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM5RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsRUFBRTtvQkFDaEQsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSztpQkFDOUIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBWSxFQUFFLElBQWlCO1FBQzVELElBQUksQ0FBQztZQUNILDBFQUEwRTtZQUMxRSxpRkFBaUY7WUFDakYsdUVBQXVFO1lBQ3ZFLE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXpELHNEQUFzRDtZQUN0RCxNQUFNLFVBQVUsR0FBRyxNQUFNLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFO2dCQUNyRCxXQUFXLEVBQUUsSUFBSTtnQkFDakIsVUFBVSxFQUFFLElBQUk7YUFDakIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixNQUFNLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFO29CQUMvQyxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsWUFBWSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSTtvQkFDdEMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO29CQUM3QixRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7b0JBQzdCLElBQUk7aUJBQ0wsQ0FBQyxDQUFDO2dCQUNILE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM3QixDQUFDO1lBRUQsOERBQThEO1lBQzlELCtEQUErRDtZQUMvRCxNQUFNLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFcEYsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4RCxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFMUQsNEVBQTRFO1lBQzVFLElBQUksSUFBSSxHQUFHLE1BQU0saUJBQWlCLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUU7Z0JBQzlELFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztnQkFDN0MsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFlBQVksRUFBRSxJQUFJO2FBQ25CLENBQUMsQ0FBQztZQUVILGlGQUFpRjtZQUNqRixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRTtxQkFDdEMsT0FBTyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBRSx1Q0FBdUM7cUJBQ3BFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQVMsMkNBQTJDO3FCQUN2RSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQU0saUNBQWlDO2dCQUVoRSxJQUFJLGNBQWMsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztvQkFDMUMsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRTt3QkFDNUMsUUFBUSxFQUFFLElBQUk7d0JBQ2QsVUFBVSxFQUFFLGNBQWM7d0JBQzFCLElBQUk7cUJBQ0wsQ0FBQyxDQUFDO29CQUVILElBQUksR0FBRyxNQUFNLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsY0FBYyxFQUFFO3dCQUNwRSxVQUFVLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUM7d0JBQzdDLFlBQVksRUFBRSxJQUFJO3dCQUNsQixZQUFZLEVBQUUsSUFBSTtxQkFDbkIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBRUQsNkRBQTZEO1lBQzdELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVix5REFBeUQ7Z0JBQ3pELE1BQU0sVUFBVSxHQUFHO29CQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBUywwQ0FBMEM7b0JBQzFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFPLDZCQUE2QjtvQkFDN0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUsseUJBQXlCO29CQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBSSxzQ0FBc0M7aUJBQ3ZFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUUxQyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO29CQUNuQyxJQUFJLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRTt3QkFDL0QsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO3dCQUM3QyxZQUFZLEVBQUUsSUFBSTt3QkFDbEIsWUFBWSxFQUFFLElBQUk7cUJBQ25CLENBQUMsQ0FBQztvQkFFSCxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUNULE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLEVBQUU7NEJBQ2pELFFBQVEsRUFBRSxJQUFJOzRCQUNkLFNBQVM7NEJBQ1QsSUFBSTs0QkFDSixJQUFJO3lCQUNMLENBQUMsQ0FBQzt3QkFDSCxNQUFNO29CQUNSLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULE1BQU0sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzVFLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQztRQUVkLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRTtnQkFDMUMsSUFBSTtnQkFDSixJQUFJO2dCQUNKLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQzlELENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQVk7UUFDMUMsSUFBSSxDQUFDO1lBQ0gsMkVBQTJFO1lBQzNFLGdEQUFnRDtZQUNoRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUM1RCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUN6RCxJQUFJLFFBQVEsRUFBRSxDQUFDO3dCQUNiLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBbUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7b0JBQ3ZELENBQUM7b0JBQ0QsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO29CQUNwQixrREFBa0Q7b0JBQ2xELElBQUksS0FBSyxFQUFFLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxFQUFFLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDMUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxrQ0FBa0MsRUFBRTs0QkFDdEUsSUFBSTs0QkFDSixJQUFJOzRCQUNKLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUM7NEJBQ3RDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSTt5QkFDbEIsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQ0QsaUVBQWlFO29CQUNqRSxPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxrRUFBa0U7WUFDbEUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUE0QixFQUFXLEVBQUU7Z0JBQzdELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNyRSxPQUFPLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkQsQ0FBQyxDQUFDO1lBRUYsdURBQXVEO1lBQ3ZELE1BQU0sYUFBYSxHQUFHLE1BQU0sc0JBQXNCLENBQUMsMkJBQTJCLENBQzVFLGVBQWUsRUFDZixZQUFZLEVBQ1o7Z0JBQ0UsYUFBYSxFQUFFLHdCQUF3QjtnQkFDdkMsc0JBQXNCLEVBQUUsSUFBSSxFQUFFLHFEQUFxRDtnQkFDbkYsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLDZEQUE2RDthQUNyRixDQUNGLENBQUM7WUFFRix5RUFBeUU7WUFDekUsTUFBTSxZQUFZLEdBQUc7Z0JBQ25CLElBQUk7Z0JBQ0osYUFBYSxFQUFFLGFBQWEsQ0FBQyxhQUFhO2dCQUMxQyxpQkFBaUIsRUFBRSxhQUFhLENBQUMsaUJBQWlCO2dCQUNsRCxPQUFPLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2dCQUNyQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNO2dCQUN2QyxlQUFlLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVO2dCQUMzQyxjQUFjLEVBQUUsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJO2dCQUM5Qyx5QkFBeUIsRUFBRSxhQUFhLENBQUMseUJBQXlCO2dCQUNsRSxlQUFlLEVBQUUsYUFBYSxDQUFDLGVBQWU7Z0JBQzlDLFlBQVksRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3BELFdBQVcsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ3BGLENBQUM7WUFFRixNQUFNLENBQUMsS0FBSyxDQUFDLHNFQUFzRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBRW5HLDBFQUEwRTtZQUMxRSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxFQUFFO29CQUN0RSxJQUFJO29CQUNKLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ3pDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVM7d0JBQ3hDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsK0JBQStCO3FCQUNqRSxDQUFDLENBQUM7b0JBQ0gsV0FBVyxFQUFFLEdBQUcsYUFBYSxDQUFDLGlCQUFpQixJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUU7b0JBQ2hGLGVBQWUsRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO3dCQUMvQyxDQUFDLENBQUMsa0RBQWtEO3dCQUNwRCxDQUFDLENBQUMscUNBQXFDO2lCQUMxQyxDQUFDLENBQUM7Z0JBRUgsa0VBQWtFO2dCQUNsRSxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDNUUsTUFBTSxDQUFDLElBQUksQ0FBQyxtREFBbUQsRUFBRTt3QkFDL0QsSUFBSTt3QkFDSixjQUFjLEVBQUUsMkRBQTJEO3dCQUMzRSxZQUFZLEVBQUUsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNO3dCQUMzQyxhQUFhLEVBQUUsYUFBYSxDQUFDLGFBQWE7cUJBQzNDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztZQUVELCtDQUErQztZQUMvQyxJQUFJLGFBQWEsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO2dCQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxFQUFFO29CQUNqRSxJQUFJO29CQUNKLGNBQWMsRUFBRSxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUk7b0JBQzlDLGVBQWUsRUFBRSxhQUFhLENBQUMsZUFBZTtvQkFDOUMsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLGlCQUFpQjtvQkFDbEQsYUFBYSxFQUFFLGFBQWEsQ0FBQyxhQUFhO2lCQUMzQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsT0FBTztnQkFDTCxLQUFLLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDdkMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxPQUFPO2FBQy9CLENBQUM7UUFFSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUU7Z0JBQzlDLElBQUk7Z0JBQ0osS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7YUFDOUQsQ0FBQyxDQUFDO1lBRUgsMkNBQTJDO1lBQzNDLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osT0FBTyxFQUFFLEVBQUU7YUFDWixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLHVCQUF1QixDQUFDLFVBQWtCO1FBQ3RELElBQUksQ0FBQztZQUNILE1BQU0sV0FBVyxHQUF3QyxFQUFFLENBQUM7WUFDNUQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzdDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFaEQsdURBQXVEO1lBQ3ZELE1BQU0sWUFBWSxHQUFHO2dCQUNuQixVQUFVO2dCQUNWLFVBQVUsRUFBRSxZQUFZLENBQUMsTUFBTTtnQkFDL0IsZUFBZSxFQUFFLENBQUM7Z0JBQ2xCLFdBQVcsRUFBRSxDQUFDO2dCQUNkLGNBQWMsRUFBRSxFQUFpRDtnQkFDakUsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDbkIsaUJBQWlCLEVBQUUsRUFBNEI7YUFDaEQsQ0FBQztZQUVGLDRDQUE0QztZQUM1QyxLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUM7b0JBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDeEQsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUUvRCw4QkFBOEI7b0JBQzlCLE1BQU0sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7d0JBQzlELFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQzt3QkFDN0MsWUFBWSxFQUFFLEtBQUs7d0JBQ25CLFlBQVksRUFBRSxJQUFJO3FCQUNuQixDQUFDLENBQUM7b0JBRUgsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO29CQUV4QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzt3QkFDekIsS0FBSyxNQUFNLFFBQVEsSUFBSSxLQUFLLEVBQUUsQ0FBQzs0QkFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDOzRCQUVqRSw0Q0FBNEM7NEJBQzVDLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQ0FDdkcsV0FBVyxDQUFDLElBQUksQ0FBQztvQ0FDZixJQUFJLEVBQUUsUUFBUTtvQ0FDZCxJQUFJLEVBQUUsV0FBVztpQ0FDbEIsQ0FBQyxDQUFDO2dDQUNILGVBQWUsRUFBRSxDQUFDOzRCQUNwQixDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQzt5QkFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO3dCQUNqQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQzNELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzs0QkFDdkcsV0FBVyxDQUFDLElBQUksQ0FBQztnQ0FDZixJQUFJLEVBQUUsUUFBUTtnQ0FDZCxJQUFJLEVBQUUsV0FBVzs2QkFDbEIsQ0FBQyxDQUFDOzRCQUNILGVBQWUsRUFBRSxDQUFDO3dCQUNwQixDQUFDO29CQUNILENBQUM7b0JBRUQsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUMvQixZQUFZLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEdBQUcsZUFBZSxDQUFDO2dCQUVoRSxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2Ysd0VBQXdFO29CQUN4RSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQzNCLFlBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO3dCQUMvQixJQUFJLEVBQUUsV0FBVzt3QkFDakIsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7cUJBQzlELENBQUMsQ0FBQztvQkFFSCwwQ0FBMEM7b0JBQzFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNkNBQTZDLEVBQUU7d0JBQzFELFdBQVc7d0JBQ1gsVUFBVTt3QkFDVixLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztxQkFDOUQsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1lBRUQsWUFBWSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFFbkQsOEVBQThFO1lBQzlFLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLEVBQUU7Z0JBQ3hELEdBQUcsWUFBWTtnQkFDZixXQUFXLEVBQUUsR0FBRyxZQUFZLENBQUMsZUFBZSxJQUFJLFlBQVksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3pFLDhEQUE4RDtnQkFDOUQsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXLEdBQUcsQ0FBQzthQUMxQyxDQUFDLENBQUM7WUFFSCwyQ0FBMkM7WUFDM0MsSUFBSSxZQUFZLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxFQUFFO29CQUM5RSxVQUFVO29CQUNWLFdBQVcsRUFBRSxZQUFZLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQ3pELGVBQWUsRUFBRSxZQUFZLENBQUMsZUFBZTtvQkFDN0MsZUFBZSxFQUFFLFlBQVksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDO3dCQUNoRCxDQUFDLENBQUMsMERBQTBEO3dCQUM1RCxDQUFDLENBQUMsNkNBQTZDO29CQUNqRCxjQUFjLEVBQUUsWUFBWSxDQUFDLGdCQUFnQixLQUFLLENBQUMsSUFBSSxZQUFZLENBQUMsV0FBVyxHQUFHLENBQUM7d0JBQ2pGLENBQUMsQ0FBQywwREFBMEQ7d0JBQzVELENBQUMsQ0FBQyxrRUFBa0U7aUJBQ3ZFLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxtRUFBbUU7WUFDbkUsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNsRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDekUsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQ3pFLE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQztZQUNyQixDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxLQUFLLENBQUMseUNBQXlDLEVBQUU7Z0JBQ3RELFVBQVU7Z0JBQ1YsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsTUFBTTtnQkFDMUMsY0FBYyxFQUFFLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUMvRCxDQUFDLENBQUM7WUFFSCxPQUFPLGlCQUFpQixDQUFDO1FBRTNCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyx5RUFBeUUsRUFBRTtnQkFDckYsVUFBVTtnQkFDVixLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztnQkFDN0QsY0FBYyxFQUFFLDJDQUEyQzthQUM1RCxDQUFDLENBQUM7WUFDSCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssbUJBQW1CLENBQUMsSUFBWSxFQUFFLElBQVk7UUFDcEQsdUJBQXVCO1FBQ3ZCLElBQUksSUFBSSxLQUFLLElBQUk7WUFBRSxPQUFPLENBQUMsQ0FBQztRQUU1QiwyQkFBMkI7UUFDM0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFFM0QseUJBQXlCO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdkQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUV4RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRWxDLDBCQUEwQjtRQUMxQixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLEVBQUUsQ0FBQztZQUNYLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssS0FBSyxDQUFDLG9CQUFvQixDQUNoQyxPQUFnQyxFQUNoQyxXQUFtQixFQUNuQixXQUF3QixFQUN4QixhQUFxQixZQUFZLENBQUMsWUFBWTtRQUU5QyxJQUFJLFNBQVMsR0FBUSxJQUFJLENBQUM7UUFFMUIsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxJQUFJLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQztnQkFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxPQUFPLElBQUksVUFBVSxHQUFHLEVBQUU7b0JBQzVFLFdBQVc7b0JBQ1gsV0FBVztvQkFDWCxPQUFPO2lCQUNSLENBQUMsQ0FBQztnQkFFSCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUV2RSxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNaLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxPQUFPLFdBQVcsRUFBRTs0QkFDbEUsV0FBVzs0QkFDWCxXQUFXOzRCQUNYLE9BQU87eUJBQ1IsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQ0QsT0FBTyxPQUFPLENBQUM7Z0JBQ2pCLENBQUM7Z0JBRUQsOEVBQThFO2dCQUM5RSxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsd0NBQXdDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFFM0UsQ0FBQztZQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7Z0JBQ3BCLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ2xCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFakQsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsT0FBTyxTQUFTLEVBQUU7b0JBQzVDLFdBQVc7b0JBQ1gsV0FBVztvQkFDWCxPQUFPO29CQUNQLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTztvQkFDcEIsV0FBVztvQkFDWCxTQUFTLEVBQUUsV0FBVyxJQUFJLE9BQU8sR0FBRyxVQUFVO2lCQUMvQyxDQUFDLENBQUM7Z0JBRUgscURBQXFEO2dCQUNyRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsbURBQW1ELEVBQUU7d0JBQ2hFLFdBQVc7d0JBQ1gsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPO3FCQUNyQixDQUFDLENBQUM7b0JBQ0gsTUFBTTtnQkFDUixDQUFDO2dCQUVELGlEQUFpRDtnQkFDakQsSUFBSSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsS0FBSyxpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUNwRSxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLFVBQVUsdUJBQXVCLEVBQUU7WUFDckQsV0FBVztZQUNYLFdBQVc7WUFDWCxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU87U0FDOUIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQixDQUFDLEtBQVU7UUFDakMsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDekQsTUFBTSxTQUFTLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQztRQUM5QixNQUFNLFVBQVUsR0FBRyxLQUFLLEVBQUUsTUFBTSxJQUFJLEtBQUssRUFBRSxVQUFVLENBQUM7UUFFdEQsNkJBQTZCO1FBQzdCLElBQUksU0FBUyxLQUFLLFdBQVcsSUFBSSxTQUFTLEtBQUssWUFBWSxJQUFJLFNBQVMsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN6RixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCx5QkFBeUI7UUFDekIsSUFBSSxVQUFVLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUM5RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsSUFBSSxVQUFVLElBQUksR0FBRyxJQUFJLFVBQVUsR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUMxQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLHlCQUF5QixDQUFDO1lBQ2hELFlBQVksQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7WUFDNUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsb0JBQW9CO1FBQ3BCLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7WUFDbkMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3pFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCxJQUFJLFVBQVUsS0FBSyxHQUFHLElBQUksVUFBVSxLQUFLLEdBQUc7WUFDeEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7WUFDckMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFDbEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDNUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsZ0NBQWdDO1FBQ2hDLElBQUksVUFBVSxLQUFLLEdBQUcsSUFBSSxVQUFVLEtBQUssR0FBRztZQUN4QyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUNoQyxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQscUVBQXFFO1FBQ3JFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUb29sIGZvciBzdWJtaXR0aW5nIGNvbnRlbnQgdG8gR2l0SHViIHBvcnRmb2xpbyByZXBvc2l0b3JpZXNcbiAqIFJlcGxhY2VzIHRoZSBicm9rZW4gaXNzdWUtYmFzZWQgc3VibWlzc2lvbiB3aXRoIGRpcmVjdCByZXBvc2l0b3J5IHNhdmVzXG4gKiBcbiAqIEZJWEVTIElNUExFTUVOVEVEIChQUiAjNTAzKTpcbiAqIDEuIFRZUEUgU0FGRVRZIEZJWCAjMSAoSXNzdWUgIzQ5Nyk6IENoYW5nZWQgYXBpQ2FjaGUgZnJvbSAnYW55JyB0byBwcm9wZXIgQVBJQ2FjaGUgdHlwZVxuICogMi4gVFlQRSBTQUZFVFkgRklYICMyIChJc3N1ZSAjNDk3KTogUmVwbGFjZWQgY29tcGxleCB0eXBlIGNhc3Rpbmcgd2l0aCBQb3J0Zm9saW9FbGVtZW50QWRhcHRlclxuICogMy4gUEVSRk9STUFOQ0UgKFBSICM0OTYgcmVjb21tZW5kYXRpb24pOiBVc2luZyBGaWxlRGlzY292ZXJ5VXRpbCBmb3Igb3B0aW1pemVkIGZpbGUgc2VhcmNoXG4gKi9cblxuaW1wb3J0IHsgR2l0SHViQXV0aE1hbmFnZXIgfSBmcm9tICcuLi8uLi9hdXRoL0dpdEh1YkF1dGhNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb1JlcG9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IFRva2VuTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3Rva2VuTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29udGVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvSW5kZXhNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcG9ydGZvbGlvL1BvcnRmb2xpb0luZGV4TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgUGF0aFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3BhdGhWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgQVBJQ2FjaGUgfSBmcm9tICcuLi8uLi9jYWNoZS9BUElDYWNoZS5qcyc7XG5pbXBvcnQgeyBQb3J0Zm9saW9FbGVtZW50QWRhcHRlciB9IGZyb20gJy4vUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIuanMnO1xuaW1wb3J0IHsgRmlsZURpc2NvdmVyeVV0aWwgfSBmcm9tICcuLi8uLi91dGlscy9GaWxlRGlzY292ZXJ5VXRpbC5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi8uLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgXG4gIEdJVEhVQl9BUElfVElNRU9VVCwgXG4gIEZJTEVfU0laRV9MSU1JVFMsIFxuICBSRVRSWV9DT05GSUcsIFxuICBTRUFSQ0hfQ09ORklHLFxuICBQb3J0Zm9saW9FbGVtZW50TWV0YWRhdGEsXG4gIGdldFZhbGlkYXRlZFRpbWVvdXQsXG4gIGNhbGN1bGF0ZVJldHJ5RGVsYXlcbn0gZnJvbSAnLi4vLi4vY29uZmlnL3BvcnRmb2xpby1jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgZ2l0aHViUmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi8uLi91dGlscy9HaXRIdWJSYXRlTGltaXRlci5qcyc7XG5pbXBvcnQgeyBFYXJseVRlcm1pbmF0aW9uU2VhcmNoIH0gZnJvbSAnLi4vLi4vdXRpbHMvRWFybHlUZXJtaW5hdGlvblNlYXJjaC5qcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1Ym1pdFRvUG9ydGZvbGlvUGFyYW1zIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlPzogRWxlbWVudFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9ydGZvbGlvRWxlbWVudCB7XG4gIHR5cGU6IEVsZW1lbnRUeXBlO1xuICBtZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhO1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQge1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbiAgZXJyb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudERldGVjdGlvbk1hdGNoIHtcbiAgdHlwZTogRWxlbWVudFR5cGU7XG4gIHBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50RGV0ZWN0aW9uUmVzdWx0IHtcbiAgZm91bmQ6IGJvb2xlYW47XG4gIG1hdGNoZXM6IEVsZW1lbnREZXRlY3Rpb25NYXRjaFtdO1xufVxuXG5leHBvcnQgY2xhc3MgU3VibWl0VG9Qb3J0Zm9saW9Ub29sIHtcbiAgcHJpdmF0ZSBhdXRoTWFuYWdlcjogR2l0SHViQXV0aE1hbmFnZXI7XG4gIHByaXZhdGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvUmVwb01hbmFnZXI7XG4gIHByaXZhdGUgY29udGVudFZhbGlkYXRvcjogQ29udGVudFZhbGlkYXRvcjtcblxuICBjb25zdHJ1Y3RvcihhcGlDYWNoZTogQVBJQ2FjaGUpIHtcbiAgICAvLyBUWVBFIFNBRkVUWSBGSVggIzE6IFByb3BlciB0eXBpbmcgZm9yIGFwaUNhY2hlIHBhcmFtZXRlclxuICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0cnVjdG9yKGFwaUNhY2hlOiBhbnkpXG4gICAgLy8gTm93OiBjb25zdHJ1Y3RvcihhcGlDYWNoZTogQVBJQ2FjaGUpIHdpdGggcHJvcGVyIGltcG9ydFxuICAgIHRoaXMuYXV0aE1hbmFnZXIgPSBuZXcgR2l0SHViQXV0aE1hbmFnZXIoYXBpQ2FjaGUpO1xuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IG5ldyBQb3J0Zm9saW9SZXBvTWFuYWdlcigpO1xuICAgIHRoaXMuY29udGVudFZhbGlkYXRvciA9IG5ldyBDb250ZW50VmFsaWRhdG9yKCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFuZCBub3JtYWxpemVzIGlucHV0IHBhcmFtZXRlcnMgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3MgYW5kIGVuc3VyZSBkYXRhIHNhZmV0eVxuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBpbnB1dCBwYXJhbWV0ZXJzIGZyb20gdGhlIHVzZXJcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBub3JtYWxpemVkIG5hbWUgb3IgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVBbmROb3JtYWxpemVQYXJhbXMocGFyYW1zOiBTdWJtaXRUb1BvcnRmb2xpb1BhcmFtcyk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgc2FmZU5hbWU/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIC8vIE5vcm1hbGl6ZSB1c2VyIGlucHV0IHRvIHByZXZlbnQgVW5pY29kZSBhdHRhY2tzIChETUNQLVNFQy0wMDQpXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShwYXJhbXMubmFtZSk7XG4gICAgaWYgKCFub3JtYWxpemVkTmFtZS5pc1ZhbGlkKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5leGVjdXRlJyxcbiAgICAgICAgZGV0YWlsczogYEludmFsaWQgVW5pY29kZSBpbiBlbGVtZW50IG5hbWU6ICR7bm9ybWFsaXplZE5hbWUuZGV0ZWN0ZWRJc3N1ZXM/LlswXSB8fCAndW5rbm93biBlcnJvcid9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCBjaGFyYWN0ZXJzIGluIGVsZW1lbnQgbmFtZTogJHtub3JtYWxpemVkTmFtZS5kZXRlY3RlZElzc3Vlcz8uWzBdIHx8ICd1bmtub3duIGVycm9yJ31gLFxuICAgICAgICAgIGVycm9yOiAnSU5WQUxJRF9JTlBVVCdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBzYWZlTmFtZTogbm9ybWFsaXplZE5hbWUubm9ybWFsaXplZENvbnRlbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIHdpdGggR2l0SHViXG4gICAqIEByZXR1cm5zIEF1dGhlbnRpY2F0aW9uIGNoZWNrIHJlc3VsdCB3aXRoIHN0YXR1cyBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0F1dGhlbnRpY2F0aW9uKCk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgYXV0aFN0YXR1cz86IGFueTtcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgY29uc3QgYXV0aFN0YXR1cyA9IGF3YWl0IHRoaXMuYXV0aE1hbmFnZXIuZ2V0QXV0aFN0YXR1cygpO1xuICAgIGlmICghYXV0aFN0YXR1cy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIC8vIExvZyBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCAodXNpbmcgZXhpc3RpbmcgZXZlbnQgdHlwZSlcbiAgICAgIGxvZ2dlci53YXJuKCdVc2VyIGF0dGVtcHRlZCBwb3J0Zm9saW8gc3VibWlzc2lvbiB3aXRob3V0IGF1dGhlbnRpY2F0aW9uJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiAnTm90IGF1dGhlbnRpY2F0ZWQuIFBsZWFzZSBhdXRoZW50aWNhdGUgZmlyc3QgdXNpbmcgdGhlIEdpdEh1YiBPQXV0aCBmbG93LlxcblxcbicgK1xuICAgICAgICAgICAgICAgICAgICdWaXNpdDogaHR0cHM6Ly9kb2NzLmFudGhyb3BpYy5jb20vZW4vZG9jcy9jbGF1ZGUtY29kZS9vYXV0aC1zZXR1cFxcbicgK1xuICAgICAgICAgICAgICAgICAgICdPciBydW46IGdoIGF1dGggbG9naW4gLS13ZWInLFxuICAgICAgICAgIGVycm9yOiAnTk9UX0FVVEhFTlRJQ0FURUQnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBhdXRoU3RhdHVzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlcnMgY29udGVudCBsb2NhbGx5IHdpdGggc21hcnQgdHlwZSBkZXRlY3Rpb25cbiAgICogQHBhcmFtIHNhZmVOYW1lIFRoZSBub3JtYWxpemVkIG5hbWUgdG8gc2VhcmNoIGZvclxuICAgKiBAcGFyYW0gZXhwbGljaXRUeXBlIE9wdGlvbmFsIGV4cGxpY2l0IGVsZW1lbnQgdHlwZSBwcm92aWRlZCBieSB1c2VyXG4gICAqIEBwYXJhbSBvcmlnaW5hbE5hbWUgT3JpZ2luYWwgdXNlci1wcm92aWRlZCBuYW1lIGZvciBlcnJvciBtZXNzYWdlc1xuICAgKiBAcmV0dXJucyBDb250ZW50IGRpc2NvdmVyeSByZXN1bHQgd2l0aCBlbGVtZW50IHR5cGUgYW5kIHBhdGggb3IgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzY292ZXJDb250ZW50V2l0aFR5cGVEZXRlY3Rpb24oXG4gICAgc2FmZU5hbWU6IHN0cmluZywgXG4gICAgZXhwbGljaXRUeXBlPzogRWxlbWVudFR5cGUsIFxuICAgIG9yaWdpbmFsTmFtZT86IHN0cmluZ1xuICApOiBQcm9taXNlPHtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGVsZW1lbnRUeXBlPzogRWxlbWVudFR5cGU7XG4gICAgbG9jYWxQYXRoPzogc3RyaW5nO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICBsZXQgZWxlbWVudFR5cGUgPSBleHBsaWNpdFR5cGU7XG4gICAgbGV0IGxvY2FsUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgaWYgKGVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBUeXBlIGV4cGxpY2l0bHkgcHJvdmlkZWQgLSBzZWFyY2ggaW4gdGhhdCBzcGVjaWZpYyBkaXJlY3Rvcnkgb25seVxuICAgICAgbG9jYWxQYXRoID0gYXdhaXQgdGhpcy5maW5kTG9jYWxDb250ZW50KHNhZmVOYW1lLCBlbGVtZW50VHlwZSk7XG4gICAgICBpZiAoIWxvY2FsUGF0aCkge1xuICAgICAgICAvLyBVWCBJTVBST1ZFTUVOVDogUHJvdmlkZSBoZWxwZnVsIHN1Z2dlc3Rpb25zIGZvciBmaW5kaW5nIGNvbnRlbnRcbiAgICAgICAgY29uc3QgcG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudERpciA9IHBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihlbGVtZW50VHlwZSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDb3VsZCBub3QgZmluZCAke2VsZW1lbnRUeXBlfSBuYW1lZCBcIiR7b3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lfVwiIGluIGxvY2FsIHBvcnRmb2xpby5cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYCoqU2VhcmNoZWQgaW4qKjogJHtlbGVtZW50RGlyfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipUcm91Ymxlc2hvb3RpbmcgVGlwcyoqOlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIENoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cyB1c2luZyB5b3VyIGZpbGUgZXhwbG9yZXJcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBUcnkgdXNpbmcgdGhlIGV4YWN0IGZpbGVuYW1lICh3aXRob3V0IGV4dGVuc2lvbilcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBVc2UgXFxgbGlzdF9wb3J0Zm9saW9cXGAgdG8gc2VlIGFsbCBhdmFpbGFibGUgJHtlbGVtZW50VHlwZX1cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBJZiB1bnN1cmUgb2YgdGhlIHR5cGUsIG9taXQgLS10eXBlIGFuZCBsZXQgdGhlIHN5c3RlbSBkZXRlY3QgaXRcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYCoqQ29tbW9uIG5hbWUgZm9ybWF0cyB0aGF0IHdvcmsqKjpcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBcIm15LWVsZW1lbnRcIiAoa2ViYWItY2FzZSlcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBcIk15IEVsZW1lbnRcIiAod2l0aCBzcGFjZXMpXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgXCJNeUVsZW1lbnRcIiAoUGFzY2FsQ2FzZSlcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBQYXJ0aWFsIG1hdGNoZXMgYXJlIHN1cHBvcnRlZGAsXG4gICAgICAgICAgICBlcnJvcjogJ0NPTlRFTlRfTk9UX0ZPVU5EJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ1JJVElDQUwgRklYOiBObyB0eXBlIHByb3ZpZGVkIC0gaW1wbGVtZW50IHNtYXJ0IGRldGVjdGlvbiBhY3Jvc3MgQUxMIGVsZW1lbnQgdHlwZXNcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIHByZXZpb3VzIGhhcmRjb2RlZCBkZWZhdWx0IHRvIFBFUlNPTkEgYW5kIGVuYWJsZXMgcHJvcGVyIHR5cGUgZGV0ZWN0aW9uXG4gICAgICBjb25zdCBkZXRlY3Rpb25SZXN1bHQgPSBhd2FpdCB0aGlzLmRldGVjdEVsZW1lbnRUeXBlKHNhZmVOYW1lKTtcbiAgICAgIFxuICAgICAgaWYgKCFkZXRlY3Rpb25SZXN1bHQuZm91bmQpIHtcbiAgICAgICAgLy8gVVggSU1QUk9WRU1FTlQ6IEVuaGFuY2VkIGd1aWRhbmNlIHdpdGggc3BlY2lmaWMgc3VnZ2VzdGlvbnNcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlVHlwZXMgPSBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpO1xuICAgICAgICBcbiAgICAgICAgLy8gR2V0IHN1Z2dlc3Rpb25zIGZvciBzaW1pbGFyIG5hbWVzXG4gICAgICAgIGNvbnN0IHN1Z2dlc3Rpb25zID0gYXdhaXQgdGhpcy5nZW5lcmF0ZU5hbWVTdWdnZXN0aW9ucyhzYWZlTmFtZSk7XG4gICAgICAgIFxuICAgICAgICBsZXQgbWVzc2FnZSA9IGBDb250ZW50IFwiJHtvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWV9XCIgbm90IGZvdW5kIGluIHBvcnRmb2xpby5cXG5cXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGDwn5SNICoqU2VhcmNoZWQgaW4gYWxsIGVsZW1lbnQgdHlwZXMqKjogJHthdmFpbGFibGVUeXBlc31cXG5cXG5gO1xuICAgICAgICBcbiAgICAgICAgaWYgKHN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGDwn5KhICoqRGlkIHlvdSBtZWFuIG9uZSBvZiB0aGVzZT8qKlxcbmA7XG4gICAgICAgICAgZm9yIChjb25zdCBzdWdnZXN0aW9uIG9mIHN1Z2dlc3Rpb25zLnNsaWNlKDAsIFNFQVJDSF9DT05GSUcuTUFYX1NVR0dFU1RJT05TKSkge1xuICAgICAgICAgICAgbWVzc2FnZSArPSBgICDigKIgXCIke3N1Z2dlc3Rpb24ubmFtZX1cIiAoJHtzdWdnZXN0aW9uLnR5cGV9KVxcbmA7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lc3NhZ2UgKz0gYFxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIG1lc3NhZ2UgKz0gYPCfm6DvuI8gKipUcm91Ymxlc2hvb3RpbmcgU3RlcHMqKjpcXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGAxLiDwn5OdIFVzZSBcXGBsaXN0X3BvcnRmb2xpb1xcYCB0byBzZWUgYWxsIGF2YWlsYWJsZSBjb250ZW50XFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBgMi4g8J+UjSBDaGVjayBleGFjdCBzcGVsbGluZyBhbmQgdHJ5IHZhcmlhdGlvbnM6XFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBgICAg4oCiIFwiJHsob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS50b0xvd2VyQ2FzZSgpfVwiIChsb3dlcmNhc2UpXFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBgICAg4oCiIFwiJHsob3JpZ2luYWxOYW1lIHx8IHNhZmVOYW1lKS5yZXBsYWNlKC9bXmEtejAtOV0vZ2ksICctJykudG9Mb3dlckNhc2UoKX1cIiAobm9ybWFsaXplZClcXG5gO1xuICAgICAgICBpZiAoKG9yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZSkuaW5jbHVkZXMoJy4nKSkge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYCAgIOKAoiBcIiR7KG9yaWdpbmFsTmFtZSB8fCBzYWZlTmFtZSkucmVwbGFjZSgvXFwuL2csICcnKX1cIiAobm8gZG90cylcXG5gO1xuICAgICAgICB9XG4gICAgICAgIG1lc3NhZ2UgKz0gYDMuIPCfjq8gU3BlY2lmeSBlbGVtZW50IHR5cGU6IFxcYHN1Ym1pdF9jb250ZW50IFwiJHtvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWV9XCIgLS10eXBlPXBlcnNvbmFzXFxgXFxuYDtcbiAgICAgICAgbWVzc2FnZSArPSBgNC4g8J+TgSBDaGVjayBpZiBmaWxlIGV4aXN0cyBpbiBwb3J0Zm9saW8gZGlyZWN0b3JpZXNcXG5cXG5gO1xuICAgICAgICBtZXNzYWdlICs9IGDwn5OdICoqVGlwKio6IFRoZSBzeXN0ZW0gc2VhcmNoZXMgZmlsZW5hbWVzIEFORCBtZXRhZGF0YSBuYW1lcyB3aXRoIGZ1enp5IG1hdGNoaW5nLmA7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICBlcnJvcjogJ0NPTlRFTlRfTk9UX0ZPVU5EJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGRldGVjdGlvblJlc3VsdC5tYXRjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gTXVsdGlwbGUgbWF0Y2hlcyBmb3VuZCAtIGFzayB1c2VyIHRvIHNwZWNpZnkgdHlwZVxuICAgICAgICBjb25zdCBtYXRjaERldGFpbHMgPSBkZXRlY3Rpb25SZXN1bHQubWF0Y2hlcy5tYXAobSA9PiBgLSAke20udHlwZX06ICR7bS5wYXRofWApLmpvaW4oJ1xcbicpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBDb250ZW50IFwiJHtvcmlnaW5hbE5hbWUgfHwgc2FmZU5hbWV9XCIgZm91bmQgaW4gbXVsdGlwbGUgZWxlbWVudCB0eXBlczpcXG5cXG4ke21hdGNoRGV0YWlsc31cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYFBsZWFzZSBzcGVjaWZ5IHRoZSBlbGVtZW50IHR5cGUgdXNpbmcgdGhlIC0tdHlwZSBwYXJhbWV0ZXIgdG8gYXZvaWQgYW1iaWd1aXR5LmAsXG4gICAgICAgICAgICBlcnJvcjogJ01VTFRJUExFX01BVENIRVNfRk9VTkQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTaW5nbGUgbWF0Y2ggZm91bmQgLSB1c2UgaXRcbiAgICAgIGNvbnN0IG1hdGNoID0gZGV0ZWN0aW9uUmVzdWx0Lm1hdGNoZXNbMF07XG4gICAgICBlbGVtZW50VHlwZSA9IG1hdGNoLnR5cGU7XG4gICAgICBsb2NhbFBhdGggPSBtYXRjaC5wYXRoO1xuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbyhgU21hcnQgZGV0ZWN0aW9uOiBGb3VuZCBcIiR7c2FmZU5hbWV9XCIgYXMgJHtlbGVtZW50VHlwZX1gLCB7IFxuICAgICAgICBuYW1lOiBzYWZlTmFtZSxcbiAgICAgICAgZGV0ZWN0ZWRUeXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgcGF0aDogbG9jYWxQYXRoXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgbG9jYWxQYXRoXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgZmlsZSBzaXplIGFuZCBjb250ZW50IHNlY3VyaXR5IGJlZm9yZSBwcm9jZXNzaW5nXG4gICAqIEBwYXJhbSBsb2NhbFBhdGggUGF0aCB0byB0aGUgbG9jYWwgZmlsZSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIGNvbnRlbnQgb3IgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVGaWxlQW5kQ29udGVudChsb2NhbFBhdGg6IHN0cmluZyk6IFByb21pc2U8e1xuICAgIHN1Y2Nlc3M6IGJvb2xlYW47XG4gICAgY29udGVudD86IHN0cmluZztcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgLy8gU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzcpOiBWYWxpZGF0ZSBmaWxlIHBhdGggYmVmb3JlIHByb2Nlc3NpbmdcbiAgICBjb25zdCBwYXRoVmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMudmFsaWRhdGVQb3J0Zm9saW9QYXRoKGxvY2FsUGF0aCk7XG4gICAgaWYgKCFwYXRoVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHBhdGhWYWxpZGF0aW9uLmVycm9yXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFVzZSB0aGUgdmFsaWRhdGVkIHNhZmUgcGF0aCBmb3IgYWxsIHN1YnNlcXVlbnQgb3BlcmF0aW9uc1xuICAgIGNvbnN0IHNhZmVQYXRoID0gcGF0aFZhbGlkYXRpb24uc2FmZVBhdGghO1xuXG4gICAgLy8gVmFsaWRhdGUgZmlsZSBzaXplIGJlZm9yZSByZWFkaW5nXG4gICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KHNhZmVQYXRoKTtcbiAgICBpZiAoc3RhdHMuc2l6ZSA+IEZJTEVfU0laRV9MSU1JVFMuTUFYX0ZJTEVfU0laRSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLmV4ZWN1dGUnLFxuICAgICAgICBkZXRhaWxzOiBgRmlsZSBzaXplICR7c3RhdHMuc2l6ZX0gZXhjZWVkcyBsaW1pdCBvZiAke0ZJTEVfU0laRV9MSU1JVFMuTUFYX0ZJTEVfU0laRX1gXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBGaWxlIHNpemUgZXhjZWVkcyAke0ZJTEVfU0laRV9MSU1JVFMuTUFYX0ZJTEVfU0laRV9NQn1NQiBsaW1pdGAsXG4gICAgICAgICAgZXJyb3I6ICdGSUxFX1RPT19MQVJHRSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBjb250ZW50IHNlY3VyaXR5XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKHNhZmVQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKGNvbnRlbnQpO1xuXG4gICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQgJiYgdmFsaWRhdGlvblJlc3VsdC5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5leGVjdXRlJyxcbiAgICAgICAgZGV0YWlsczogYENyaXRpY2FsIHNlY3VyaXR5IGlzc3VlcyBkZXRlY3RlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQ29udGVudCB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YCxcbiAgICAgICAgICBlcnJvcjogJ1ZBTElEQVRJT05fRkFJTEVEJ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgY29udGVudFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgbWV0YWRhdGEgZm9yIHRoZSBwb3J0Zm9saW8gZWxlbWVudFxuICAgKiBAcGFyYW0gc2FmZU5hbWUgVGhlIG5vcm1hbGl6ZWQgbmFtZSBvZiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgVGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGF1dGhTdGF0dXMgQXV0aGVudGljYXRpb24gc3RhdHVzIGNvbnRhaW5pbmcgdXNlcm5hbWVcbiAgICogQHJldHVybnMgTWV0YWRhdGEgb2JqZWN0IGZvciB0aGUgZWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBwcmVwYXJlRWxlbWVudE1ldGFkYXRhKFxuICAgIHNhZmVOYW1lOiBzdHJpbmcsIFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSwgXG4gICAgYXV0aFN0YXR1czogYW55XG4gICk6IFBvcnRmb2xpb0VsZW1lbnRNZXRhZGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHNhZmVOYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGAke2VsZW1lbnRUeXBlfSBzdWJtaXR0ZWQgZnJvbSBsb2NhbCBwb3J0Zm9saW9gLFxuICAgICAgYXV0aG9yOiBhdXRoU3RhdHVzLnVzZXJuYW1lIHx8ICd1bmtub3duJyxcbiAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHVwZGF0ZWQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHZlcnNpb246ICcxLjAuMCdcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBHaXRIdWIgdG9rZW4gYW5kIGNoZWNrcyBmb3IgZXhwaXJhdGlvbiBiZWZvcmUgdXNhZ2VcbiAgICogU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzUpOiBUb2tlbiBleHBpcmF0aW9uIHZhbGlkYXRpb24gdG8gcHJldmVudCBzdGFsZSB0b2tlbiB1c2FnZVxuICAgKiBAcGFyYW0gdG9rZW4gVGhlIEdpdEh1YiB0b2tlbiB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHN0YXR1cyBhbmQgZXhwaXJhdGlvbiBpbmZvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlVG9rZW5CZWZvcmVVc2FnZSh0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx7XG4gICAgaXNWYWxpZDogYm9vbGVhbjtcbiAgICBpc05lYXJFeHBpcnk/OiBib29sZWFuO1xuICAgIGVycm9yPzogU3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ7XG4gIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgdG9rZW4gZm9ybWF0IGZpcnN0IChiYXNpYyB2YWxpZGF0aW9uKVxuICAgICAgaWYgKCFUb2tlbk1hbmFnZXIudmFsaWRhdGVUb2tlbkZvcm1hdCh0b2tlbikpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgICBkZXRhaWxzOiAnVG9rZW4gaGFzIGludmFsaWQgZm9ybWF0J1xuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgdG9rZW4gZm9ybWF0LiBQbGVhc2UgcmUtYXV0aGVudGljYXRlLicsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfVE9LRU5fRk9STUFUJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdG9rZW4gd2l0aCBHaXRIdWIgQVBJIHRvIGNoZWNrIGV4cGlyYXRpb24gYW5kIHBlcm1pc3Npb25zXG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgVG9rZW5NYW5hZ2VyLnZhbGlkYXRlVG9rZW5TY29wZXModG9rZW4sIHtcbiAgICAgICAgcmVxdWlyZWQ6IFsncmVwbyddLFxuICAgICAgICBvcHRpb25hbDogWyd1c2VyOmVtYWlsJ11cbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVRva2VuQmVmb3JlVXNhZ2UnLFxuICAgICAgICAgIGRldGFpbHM6IGBUb2tlbiB2YWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9yfWBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnR2l0SHViIHRva2VuIGlzIGludmFsaWQgb3IgZXhwaXJlZC4gUGxlYXNlIHJlLWF1dGhlbnRpY2F0ZS4nLFxuICAgICAgICAgICAgZXJyb3I6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxFRCdcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRva2VuIGlzIG5lYXIgZXhwaXJhdGlvbiAocmF0ZSBsaW1pdCByZXNldCB0aW1lIGNhbiBpbmRpY2F0ZSB0b2tlbiBmcmVzaG5lc3MpXG4gICAgICBsZXQgaXNOZWFyRXhwaXJ5ID0gZmFsc2U7XG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5yYXRlTGltaXQ/LnJlc2V0VGltZSkge1xuICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCB0aW1lVW50aWxSZXNldCA9IHZhbGlkYXRpb25SZXN1bHQucmF0ZUxpbWl0LnJlc2V0VGltZS5nZXRUaW1lKCkgLSBub3cuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBvbmVIb3VyID0gNjAgKiA2MCAqIDEwMDA7XG4gICAgICAgIFxuICAgICAgICAvLyBDb25zaWRlciB0b2tlbiBcIm5lYXIgZXhwaXJ5XCIgaWYgcmF0ZSBsaW1pdCByZXNldCBpcyBtb3JlIHRoYW4gMjMgaG91cnMgYXdheVxuICAgICAgICAvLyAoR2l0SHViIHJhdGUgbGltaXRzIHJlc2V0IGV2ZXJ5IGhvdXIsIHNvIHRoaXMgc3VnZ2VzdHMgdG9rZW4gYWdlKVxuICAgICAgICBpZiAodGltZVVudGlsUmVzZXQgPiAyMyAqIG9uZUhvdXIpIHtcbiAgICAgICAgICBpc05lYXJFeHBpcnkgPSB0cnVlO1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdHaXRIdWIgdG9rZW4gbWF5IGJlIG5lYXIgZXhwaXJhdGlvbicsIHtcbiAgICAgICAgICAgIHRva2VuUHJlZml4OiBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICAgICAgcmF0ZUxpbWl0UmVzZXRUaW1lOiB2YWxpZGF0aW9uUmVzdWx0LnJhdGVMaW1pdC5yZXNldFRpbWUsXG4gICAgICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0NvbnNpZGVyIHJlLWF1dGhlbnRpY2F0aW5nIGZvciBsb25nIG9wZXJhdGlvbnMnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHN1Y2Nlc3NmdWwgdmFsaWRhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiB2YWxpZGF0ZWQgc3VjY2Vzc2Z1bGx5IGJlZm9yZSB1c2FnZScsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdG9rZW5UeXBlOiBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKHRva2VuKSxcbiAgICAgICAgICBzY29wZXM6IHZhbGlkYXRpb25SZXN1bHQuc2NvcGVzLFxuICAgICAgICAgIHJhdGVMaW1pdFJlbWFpbmluZzogdmFsaWRhdGlvblJlc3VsdC5yYXRlTGltaXQ/LnJlbWFpbmluZyxcbiAgICAgICAgICBpc05lYXJFeHBpcnlcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIGlzTmVhckV4cGlyeVxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIEhhbmRsZSByYXRlIGxpbWl0IGV4Y2VlZGVkIHNwZWNpZmljYWxseVxuICAgICAgaWYgKGVycm9yPy5jb2RlID09PSAnUkFURV9MSU1JVF9FWENFRURFRCcpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1Rva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdGVkLCBhbGxvd2luZyBvcGVyYXRpb24gdG8gcHJvY2VlZCB3aXRoIGNhY2hlZCBzdGF0dXMnKTtcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSB9OyAvLyBBbGxvdyB0byBwcm9jZWVkIGlmIHJhdGUgbGltaXRlZCwgYXMgYmFzaWMgZm9ybWF0IGNoZWNrIHBhc3NlZFxuICAgICAgfVxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlJyxcbiAgICAgICAgZGV0YWlsczogYFRva2VuIHZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3IubWVzc2FnZSB8fCAndW5rbm93biBlcnJvcid9YFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gdmFsaWRhdGUgR2l0SHViIHRva2VuLiBQbGVhc2UgY2hlY2sgeW91ciBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uJyxcbiAgICAgICAgICBlcnJvcjogJ1RPS0VOX1ZBTElEQVRJT05fRVJST1InXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuaGFuY2VkIHBhdGggdmFsaWRhdGlvbiBmb3IgcG9ydGZvbGlvIG9wZXJhdGlvbnMgd2l0aCBjb21wcmVoZW5zaXZlIHNlY3VyaXR5IGNoZWNrc1xuICAgKiBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjNyk6IEFkZGl0aW9uYWwgdmFsaWRhdGlvbiBmb3Igc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBtYWxpY2lvdXMgcGF0dGVybnNcbiAgICogQHBhcmFtIGZpbGVQYXRoIFRoZSBmaWxlIHBhdGggdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBzZWN1cmUgcGF0aCBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZVBvcnRmb2xpb1BhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8e1xuICAgIGlzVmFsaWQ6IGJvb2xlYW47XG4gICAgc2FmZVBhdGg/OiBzdHJpbmc7XG4gICAgZXJyb3I/OiBTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdDtcbiAgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBCYXNpYyBudWxsL3VuZGVmaW5lZCBjaGVja1xuICAgICAgaWYgKCFmaWxlUGF0aCB8fCB0eXBlb2YgZmlsZVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6ICdJbnZhbGlkIHBhdGggcHJvdmlkZWQgLSBudWxsLCB1bmRlZmluZWQsIG9yIG5vbi1zdHJpbmcnXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW52YWxpZCBmaWxlIHBhdGggcHJvdmlkZWQnLFxuICAgICAgICAgICAgZXJyb3I6ICdJTlZBTElEX1BBVEgnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3Igc3VzcGljaW91cyBwYXR0ZXJucyB0aGF0IGNvdWxkIGluZGljYXRlIHBhdGggdHJhdmVyc2FsIG9yIGluamVjdGlvblxuICAgICAgY29uc3Qgc3VzcGljaW91c1BhdHRlcm5zID0gW1xuICAgICAgICAvXFwuXFwuLywgICAgICAgICAgICAgICAgICAgIC8vIFBhdGggdHJhdmVyc2FsXG4gICAgICAgIC9cXC9cXC5cXC4vLCAgICAgICAgICAgICAgICAgIC8vIFVuaXggcGF0aCB0cmF2ZXJzYWxcbiAgICAgICAgL1xcXFxcXC5cXC4vLCAgICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MgcGF0aCB0cmF2ZXJzYWxcbiAgICAgICAgL1xceDAwLywgICAgICAgICAgICAgICAgICAgIC8vIE51bGwgYnl0ZXNcbiAgICAgICAgL1tcXHgwMS1cXHgxZlxceDdmLVxceDlmXS8sICAgIC8vIENvbnRyb2wgY2hhcmFjdGVyc1xuICAgICAgICAvWzw+OlwifD8qXS8sICAgICAgICAgICAgICAgLy8gSW52YWxpZCBmaWxlbmFtZSBjaGFyYWN0ZXJzIG9uIFdpbmRvd3NcbiAgICAgICAgL14oQ09OfFBSTnxBVVh8TlVMfENPTVsxLTldfExQVFsxLTldKSQvaSwgLy8gUmVzZXJ2ZWQgV2luZG93cyBuYW1lc1xuICAgICAgICAvXlxcLi8sICAgICAgICAgICAgICAgICAgICAgLy8gSGlkZGVuIGZpbGVzIChzdGFydGluZyB3aXRoIGRvdClcbiAgICAgICAgL1xccyskLywgICAgICAgICAgICAgICAgICAgIC8vIFRyYWlsaW5nIHdoaXRlc3BhY2VcbiAgICAgICAgL15bXFxzXSokLywgICAgICAgICAgICAgICAgIC8vIE9ubHkgd2hpdGVzcGFjZVxuICAgICAgICAvJVswLTlhLWZBLUZdezJ9LywgICAgICAgICAvLyBVUkwgZW5jb2RpbmcgKHBvdGVudGlhbCBieXBhc3MgYXR0ZW1wdClcbiAgICAgICAgL1xcXFx4WzAtOWEtZkEtRl17Mn0vLCAgICAgICAvLyBIZXggZW5jb2RpbmdcbiAgICAgICAgL1xcJFxcey4qXFx9LywgICAgICAgICAgICAgICAgLy8gVGVtcGxhdGUgbGl0ZXJhbCBpbmplY3Rpb25cbiAgICAgICAgL2AuKmAvLCAgICAgICAgICAgICAgICAgICAgLy8gQmFja3RpY2sgaW5qZWN0aW9uXG4gICAgICAgIC9bXFxcXFxcL117Mix9LyAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIGNvbnNlY3V0aXZlIHNsYXNoZXNcbiAgICAgIF07XG5cbiAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBzdXNwaWNpb3VzUGF0dGVybnMpIHtcbiAgICAgICAgaWYgKHBhdHRlcm4udGVzdChmaWxlUGF0aCkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgICBkZXRhaWxzOiBgU3VzcGljaW91cyBwYXR0ZXJuIGRldGVjdGVkIGluIGZpbGUgcGF0aDogJHtwYXR0ZXJuLnNvdXJjZX1gLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgcGF0aExlbmd0aDogZmlsZVBhdGgubGVuZ3RoLFxuICAgICAgICAgICAgICBwYXR0ZXJuOiBwYXR0ZXJuLnNvdXJjZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnRmlsZSBwYXRoIGNvbnRhaW5zIGludmFsaWQgb3Igc3VzcGljaW91cyBjaGFyYWN0ZXJzJyxcbiAgICAgICAgICAgICAgZXJyb3I6ICdTVVNQSUNJT1VTX1BBVEhfUEFUVEVSTidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHBhdGggbGVuZ3RoIChwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyBhdHRlbXB0cylcbiAgICAgIGNvbnN0IE1BWF9QQVRIX0xFTkdUSCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAyNjAgOiA0MDk2O1xuICAgICAgaWYgKGZpbGVQYXRoLmxlbmd0aCA+IE1BWF9QQVRIX0xFTkdUSCkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgICBkZXRhaWxzOiBgRmlsZSBwYXRoIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGg6ICR7ZmlsZVBhdGgubGVuZ3RofSA+ICR7TUFYX1BBVEhfTEVOR1RIfWBcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggaXMgdG9vIGxvbmcnLFxuICAgICAgICAgICAgZXJyb3I6ICdQQVRIX1RPT19MT05HJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9ybWFsaXplIHBhdGggdG8gcmVzb2x2ZSBhbnkgcmVsYXRpdmUgY29tcG9uZW50cyBzYWZlbHlcbiAgICAgIGxldCBub3JtYWxpemVkUGF0aDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUmVtb3ZlIG51bGwgYnl0ZXMgYW5kIG5vcm1hbGl6ZVxuICAgICAgICBjb25zdCBjbGVhblBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXHgwMC9nLCAnJyk7XG4gICAgICAgIG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoY2xlYW5QYXRoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIHBhdGggaXMgd2l0aGluIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICAgIGNvbnN0IHBvcnRmb2xpb0Jhc2UgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEJhc2VEaXIoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEZvciBhYnNvbHV0ZSBwYXRocywgdmVyaWZ5IHRoZXkncmUgd2l0aGluIHRoZSBwb3J0Zm9saW8gZGlyZWN0b3J5XG4gICAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUobm9ybWFsaXplZFBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZEJhc2UgPSBwYXRoLnJlc29sdmUocG9ydGZvbGlvQmFzZSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUGF0aCBtdXN0IGJlIHdpdGhpbiB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeVxuICAgICAgICAgIGlmICghcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgocmVzb2x2ZWRCYXNlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIGlzIG91dHNpZGUgcG9ydGZvbGlvIGRpcmVjdG9yeScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICAgIC8vIFJlbGF0aXZlIHBhdGhzIHdpdGggLi4gYXJlIG5vdCBhbGxvd2VkXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIGNvbnRhaW5zIGRpcmVjdG9yeSB0cmF2ZXJzYWwnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdQQVRIX1RSQVZFUlNBTF9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBQYXRoIG5vcm1hbGl6YXRpb24gZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdGaWxlIHBhdGggY291bGQgbm90IGJlIHNhZmVseSBwcm9jZXNzZWQnLFxuICAgICAgICAgICAgZXJyb3I6ICdQQVRIX05PUk1BTElaQVRJT05fRkFJTEVEJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZmlsZSBleHRlbnNpb24gKG9ubHkgYWxsb3cgc2FmZSBleHRlbnNpb25zIGZvciBwb3J0Zm9saW8gY29udGVudClcbiAgICAgIGNvbnN0IGFsbG93ZWRFeHRlbnNpb25zID0gWycubWQnLCAnLm1hcmtkb3duJywgJy50eHQnLCAnLnltbCcsICcueWFtbCcsICcuanNvbiddO1xuICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IHBhdGguZXh0bmFtZShub3JtYWxpemVkUGF0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgaWYgKGZpbGVFeHRlbnNpb24gJiYgIWFsbG93ZWRFeHRlbnNpb25zLmluY2x1ZGVzKGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICAgIGRldGFpbHM6IGBEaXNhbGxvd2VkIGZpbGUgZXh0ZW5zaW9uOiAke2ZpbGVFeHRlbnNpb259YCxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgYWxsb3dlZEV4dGVuc2lvbnM6IGFsbG93ZWRFeHRlbnNpb25zLmpvaW4oJywgJylcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBgRmlsZSBleHRlbnNpb24gJyR7ZmlsZUV4dGVuc2lvbn0nIGlzIG5vdCBhbGxvd2VkLiBBbGxvd2VkIGV4dGVuc2lvbnM6ICR7YWxsb3dlZEV4dGVuc2lvbnMuam9pbignLCAnKX1gLFxuICAgICAgICAgICAgZXJyb3I6ICdJTlZBTElEX0ZJTEVfRVhURU5TSU9OJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZmlsZW5hbWUgY2hhcmFjdGVycyAob25seSBhbGxvdyBzYWZlIGNoYXJhY3RlcnMpXG4gICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUobm9ybWFsaXplZFBhdGgpO1xuICAgICAgY29uc3Qgc2FmZUZpbGVuYW1lUGF0dGVybiA9IC9eW2EtekEtWjAtOVxcLV8uXFxzKClbXFxde31dKyQvO1xuICAgICAgXG4gICAgICBpZiAoYmFzZW5hbWUgJiYgIXNhZmVGaWxlbmFtZVBhdHRlcm4udGVzdChiYXNlbmFtZSkpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLnZhbGlkYXRlUG9ydGZvbGlvUGF0aCcsXG4gICAgICAgICAgZGV0YWlsczogJ0ZpbGVuYW1lIGNvbnRhaW5zIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjaGFyYWN0ZXJzJyxcbiAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgZmlsZW5hbWU6IGJhc2VuYW1lLFxuICAgICAgICAgICAgYWxsb3dlZFBhdHRlcm46IHNhZmVGaWxlbmFtZVBhdHRlcm4uc291cmNlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ0ZpbGVuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycy4gT25seSBsZXR0ZXJzLCBudW1iZXJzLCBzcGFjZXMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzLCBhbmQgY29tbW9uIGJyYWNrZXRzIGFyZSBhbGxvd2VkLicsXG4gICAgICAgICAgICBlcnJvcjogJ0lOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUydcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIHZhbGlkYXRpb25cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0NPTlRFTlRfSU5KRUNUSU9OX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC52YWxpZGF0ZVBvcnRmb2xpb1BhdGgnLFxuICAgICAgICBkZXRhaWxzOiAnRmlsZSBwYXRoIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bCcsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgb3JpZ2luYWxQYXRoTGVuZ3RoOiBmaWxlUGF0aC5sZW5ndGgsXG4gICAgICAgICAgbm9ybWFsaXplZFBhdGhMZW5ndGg6IG5vcm1hbGl6ZWRQYXRoLmxlbmd0aCxcbiAgICAgICAgICBmaWxlRXh0ZW5zaW9uOiBmaWxlRXh0ZW5zaW9uIHx8ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgc2FmZVBhdGg6IG5vcm1hbGl6ZWRQYXRoXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wudmFsaWRhdGVQb3J0Zm9saW9QYXRoJyxcbiAgICAgICAgZGV0YWlsczogYFBhdGggdmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ1VuYWJsZSB0byB2YWxpZGF0ZSBmaWxlIHBhdGguIFBsZWFzZSBjaGVjayB0aGUgZmlsZSBwYXRoIGFuZCB0cnkgYWdhaW4uJyxcbiAgICAgICAgICBlcnJvcjogJ1BBVEhfVkFMSURBVElPTl9FUlJPUidcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU21hcnQgdG9rZW4gbWFuYWdlbWVudCBmb3IgbG9uZyBvcGVyYXRpb25zIHdpdGggcmVmcmVzaC1saWtlIGNhcGFiaWxpdGllc1xuICAgKiBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjMTQpOiBUb2tlbiByZWZyZXNoIGxvZ2ljIGZvciBsb25nIG9wZXJhdGlvbnNcbiAgICogXG4gICAqIE5vdGU6IEdpdEh1YiBPQXV0aCBkZXZpY2UgZmxvdyB0b2tlbnMgZG9uJ3QgaGF2ZSB0cmFkaXRpb25hbCByZWZyZXNoIHRva2VucyxcbiAgICogYnV0IHdlIGNhbiBpbXBsZW1lbnQgc21hcnQgdmFsaWRhdGlvbiBhbmQgZ3VpZGFuY2UgZm9yIGxvbmcgb3BlcmF0aW9uc1xuICAgKiBcbiAgICogQHBhcmFtIG9wZXJhdGlvblR5cGUgVHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEByZXR1cm5zIFRva2VuIG1hbmFnZW1lbnQgcmVzdWx0IHdpdGggcmVjb21tZW5kYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG1hbmFnZVRva2VuRm9yTG9uZ09wZXJhdGlvbihvcGVyYXRpb25UeXBlOiAncG9ydGZvbGlvX2NyZWF0aW9uJyB8ICdjb2xsZWN0aW9uX3N1Ym1pc3Npb24nIHwgJ2ZpbGVfdXBsb2FkJyk6IFByb21pc2U8e1xuICAgIGNhblByb2NlZWQ6IGJvb2xlYW47XG4gICAgdG9rZW4/OiBzdHJpbmc7XG4gICAgcmVmcmVzaFJlY29tbWVuZGVkPzogYm9vbGVhbjtcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCBjdXJyZW50IHRva2VuXG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbkFzeW5jKCk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2FuUHJvY2VlZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogJ05vIEdpdEh1YiB0b2tlbiBhdmFpbGFibGUuIFBsZWFzZSBhdXRoZW50aWNhdGUgZmlyc3QuJyxcbiAgICAgICAgICAgIGVycm9yOiAnTk9fVE9LRU4nXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSB0b2tlbiBmb3IgdGhlIHNwZWNpZmljIG9wZXJhdGlvblxuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IGF3YWl0IHRoaXMudmFsaWRhdGVUb2tlbkJlZm9yZVVzYWdlKHRva2VuKTtcbiAgICAgIGlmICghdmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY2FuUHJvY2VlZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHZhbGlkYXRpb24uZXJyb3JcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGxvbmcgb3BlcmF0aW9uIHRoYXQgbWlnaHQgYmVuZWZpdCBmcm9tIGZyZXNoIGF1dGhlbnRpY2F0aW9uXG4gICAgICBjb25zdCBsb25nT3BlcmF0aW9ucyA9IFsncG9ydGZvbGlvX2NyZWF0aW9uJywgJ2NvbGxlY3Rpb25fc3VibWlzc2lvbiddO1xuICAgICAgY29uc3QgaXNMb25nT3BlcmF0aW9uID0gbG9uZ09wZXJhdGlvbnMuaW5jbHVkZXMob3BlcmF0aW9uVHlwZSk7XG5cbiAgICAgIC8vIEdldCB0b2tlbiB0eXBlIHRvIGRldGVybWluZSByZWZyZXNoIGNhcGFiaWxpdGllc1xuICAgICAgY29uc3QgdG9rZW5UeXBlID0gVG9rZW5NYW5hZ2VyLmdldFRva2VuVHlwZSh0b2tlbik7XG4gICAgICBsZXQgcmVmcmVzaFJlY29tbWVuZGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIEZvciBsb25nIG9wZXJhdGlvbnMsIGNoZWNrIHRva2VuIGFnZSBhbmQgcmVjb21tZW5kIHJlZnJlc2ggaWYgbmVlZGVkXG4gICAgICBpZiAoaXNMb25nT3BlcmF0aW9uICYmIHZhbGlkYXRpb24uaXNOZWFyRXhwaXJ5KSB7XG4gICAgICAgIHJlZnJlc2hSZWNvbW1lbmRlZCA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5tYW5hZ2VUb2tlbkZvckxvbmdPcGVyYXRpb24nLFxuICAgICAgICAgIGRldGFpbHM6ICdMb25nIG9wZXJhdGlvbiBkZXRlY3RlZCB3aXRoIGFnaW5nIHRva2VuIC0gcmVmcmVzaCByZWNvbW1lbmRlZCcsXG4gICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgIG9wZXJhdGlvblR5cGUsXG4gICAgICAgICAgICB0b2tlblR5cGUsXG4gICAgICAgICAgICByZWZyZXNoUmVjb21tZW5kZWQ6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxvZ2dlci53YXJuKCdMb25nIG9wZXJhdGlvbiB3aXRoIHBvdGVudGlhbGx5IGFnaW5nIHRva2VuIGRldGVjdGVkJywge1xuICAgICAgICAgIG9wZXJhdGlvblR5cGUsXG4gICAgICAgICAgdG9rZW5UeXBlLFxuICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiAnQ29uc2lkZXIgcmUtYXV0aGVudGljYXRpbmcgaWYgb3BlcmF0aW9uIGZhaWxzJ1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9yIE9BdXRoIHRva2VucyBpbiBsb25nIG9wZXJhdGlvbnMsIHdlIGNhbiBwcm92aWRlIGd1aWRhbmNlXG4gICAgICBpZiAodG9rZW5UeXBlID09PSAnT0F1dGggQWNjZXNzIFRva2VuJyAmJiBpc0xvbmdPcGVyYXRpb24pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ09BdXRoIHRva2VuIGRldGVjdGVkIGZvciBsb25nIG9wZXJhdGlvbicsIHtcbiAgICAgICAgICBvcGVyYXRpb25UeXBlLFxuICAgICAgICAgIHRva2VuVHlwZSxcbiAgICAgICAgICBndWlkYW5jZTogJ09BdXRoIHRva2VucyBhcmUgdGltZS1saW1pdGVkLiBJZiBvcGVyYXRpb24gZmFpbHMsIHJlLWF1dGhlbnRpY2F0ZSB1c2luZyBzZXR1cF9naXRodWJfYXV0aCdcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIHRva2VuIG1hbmFnZW1lbnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnU3VibWl0VG9Qb3J0Zm9saW9Ub29sLm1hbmFnZVRva2VuRm9yTG9uZ09wZXJhdGlvbicsXG4gICAgICAgIGRldGFpbHM6ICdUb2tlbiBtYW5hZ2VtZW50IHN1Y2Nlc3NmdWwgZm9yIGxvbmcgb3BlcmF0aW9uJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBvcGVyYXRpb25UeXBlLFxuICAgICAgICAgIHRva2VuVHlwZSxcbiAgICAgICAgICBpc0xvbmdPcGVyYXRpb24sXG4gICAgICAgICAgcmVmcmVzaFJlY29tbWVuZGVkXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYW5Qcm9jZWVkOiB0cnVlLFxuICAgICAgICB0b2tlbixcbiAgICAgICAgcmVmcmVzaFJlY29tbWVuZGVkXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdTdWJtaXRUb1BvcnRmb2xpb1Rvb2wubWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uJyxcbiAgICAgICAgZGV0YWlsczogYFRva2VuIG1hbmFnZW1lbnQgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZSB8fCAndW5rbm93biBlcnJvcid9YFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhblByb2NlZWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdVbmFibGUgdG8gbWFuYWdlIHRva2VuIGZvciBvcGVyYXRpb24uIFBsZWFzZSBjaGVjayB5b3VyIGF1dGhlbnRpY2F0aW9uIGFuZCB0cnkgYWdhaW4uJyxcbiAgICAgICAgICBlcnJvcjogJ1RPS0VOX01BTkFHRU1FTlRfRVJST1InXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIHVzZXIgZ3VpZGFuY2UgZm9yIHRva2VuIHJlZnJlc2ggd2hlbiBvcGVyYXRpb25zIGZhaWwgZHVlIHRvIHRva2VuIGlzc3Vlc1xuICAgKiBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjMTQpOiBVc2VyIGd1aWRhbmNlIGZvciBhdXRoZW50aWNhdGlvbiByZWZyZXNoXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdFRva2VuUmVmcmVzaEd1aWRhbmNlKG9wZXJhdGlvblR5cGU6IHN0cmluZywgdG9rZW5UeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBndWlkYW5jZSA9ICdcXG5cXG7wn5SEICoqVG9rZW4gUmVmcmVzaCBHdWlkYW5jZSoqOlxcbic7XG4gICAgXG4gICAgaWYgKHRva2VuVHlwZSA9PT0gJ09BdXRoIEFjY2VzcyBUb2tlbicpIHtcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgWW91ciBPQXV0aCB0b2tlbiBtYXkgaGF2ZSBleHBpcmVkXFxuJztcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgUnVuIGBzZXR1cF9naXRodWJfYXV0aGAgdG8gYXV0aGVudGljYXRlIGFnYWluXFxuJztcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgVGhpcyB3aWxsIGdlbmVyYXRlIGEgZnJlc2ggdG9rZW4gZm9yIGNvbnRpbnVlZCBhY2Nlc3NcXG4nO1xuICAgIH0gZWxzZSBpZiAodG9rZW5UeXBlID09PSAnUGVyc29uYWwgQWNjZXNzIFRva2VuJykge1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBZb3VyIFBlcnNvbmFsIEFjY2VzcyBUb2tlbiBtYXkgaGF2ZSBleHBpcmVkXFxuJztcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgQ2hlY2sgeW91ciBHaXRIdWIgc2V0dGluZ3M6IGh0dHBzOi8vZ2l0aHViLmNvbS9zZXR0aW5ncy90b2tlbnNcXG4nO1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBHZW5lcmF0ZSBhIG5ldyB0b2tlbiBpZiBuZWVkZWQgYW5kIHVwZGF0ZSBHSVRIVUJfVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGVcXG4nO1xuICAgIH0gZWxzZSB7XG4gICAgICBndWlkYW5jZSArPSAn4oCiIFlvdXIgR2l0SHViIHRva2VuIG1heSBoYXZlIGV4cGlyZWQgb3IgYmVlbiByZXZva2VkXFxuJztcbiAgICAgIGd1aWRhbmNlICs9ICfigKIgUmUtYXV0aGVudGljYXRlIHVzaW5nIGBzZXR1cF9naXRodWJfYXV0aGBcXG4nO1xuICAgICAgZ3VpZGFuY2UgKz0gJ+KAoiBFbnN1cmUgeW91ciB0b2tlbiBoYXMgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zXFxuJztcbiAgICB9XG5cbiAgICBndWlkYW5jZSArPSBgXFxuKipPcGVyYXRpb24qKjogJHtvcGVyYXRpb25UeXBlfVxcbmA7XG4gICAgZ3VpZGFuY2UgKz0gJyoqUmVxdWlyZWQgc2NvcGVzKio6IHJlcG8sIHVzZXI6ZW1haWxcXG5cXG4nO1xuICAgIGd1aWRhbmNlICs9ICfwn5KhICoqVGlwKio6IEZyZXNoIHRva2VucyB3b3JrIGJldHRlciBmb3IgY29tcGxleCBvcGVyYXRpb25zIGxpa2UgcG9ydGZvbGlvIGNyZWF0aW9uLic7XG5cbiAgICByZXR1cm4gZ3VpZGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBHaXRIdWIgcmVwb3NpdG9yeSBhY2Nlc3MgYW5kIGVuc3VyZXMgcG9ydGZvbGlvIHJlcG9zaXRvcnkgZXhpc3RzXG4gICAqIEBwYXJhbSBhdXRoU3RhdHVzIEF1dGhlbnRpY2F0aW9uIHN0YXR1cyBjb250YWluaW5nIHVzZXJuYW1lXG4gICAqIEByZXR1cm5zIFNldHVwIHJlc3VsdCBvciBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cEdpdEh1YlJlcG9zaXRvcnkoYXV0aFN0YXR1czogYW55KTogUHJvbWlzZTx7XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBlcnJvcj86IFN1Ym1pdFRvUG9ydGZvbGlvUmVzdWx0O1xuICB9PiB7XG4gICAgLy8gU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzE0KTogU21hcnQgdG9rZW4gbWFuYWdlbWVudCBmb3IgbG9uZyBvcGVyYXRpb25zXG4gICAgY29uc3QgdG9rZW5NYW5hZ2VtZW50ID0gYXdhaXQgdGhpcy5tYW5hZ2VUb2tlbkZvckxvbmdPcGVyYXRpb24oJ3BvcnRmb2xpb19jcmVhdGlvbicpO1xuICAgIGlmICghdG9rZW5NYW5hZ2VtZW50LmNhblByb2NlZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBlcnJvcjogdG9rZW5NYW5hZ2VtZW50LmVycm9yXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VuID0gdG9rZW5NYW5hZ2VtZW50LnRva2VuITtcblxuICAgIC8vIFByb3ZpZGUgdXNlciBndWlkYW5jZSBpZiByZWZyZXNoIGlzIHJlY29tbWVuZGVkIGZvciB0aGlzIGxvbmcgb3BlcmF0aW9uXG4gICAgaWYgKHRva2VuTWFuYWdlbWVudC5yZWZyZXNoUmVjb21tZW5kZWQpIHtcbiAgICAgIGNvbnN0IHRva2VuVHlwZSA9IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pO1xuICAgICAgY29uc3QgZ3VpZGFuY2UgPSB0aGlzLmZvcm1hdFRva2VuUmVmcmVzaEd1aWRhbmNlKCdwb3J0Zm9saW8gY3JlYXRpb24nLCB0b2tlblR5cGUpO1xuICAgICAgbG9nZ2VyLndhcm4oYFRva2VuIHJlZnJlc2ggcmVjb21tZW5kZWQgZm9yIHBvcnRmb2xpbyBjcmVhdGlvbjoke2d1aWRhbmNlfWApO1xuICAgIH1cblxuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlci5zZXRUb2tlbih0b2tlbik7XG5cbiAgICAvLyBDaGVjayBpZiBwb3J0Zm9saW8gZXhpc3RzIGFuZCBjcmVhdGUgaWYgbmVlZGVkXG4gICAgY29uc3QgdXNlcm5hbWUgPSBhdXRoU3RhdHVzLnVzZXJuYW1lIHx8ICd1bmtub3duJztcbiAgICBjb25zdCBwb3J0Zm9saW9FeGlzdHMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuY2hlY2tQb3J0Zm9saW9FeGlzdHModXNlcm5hbWUpO1xuICAgIFxuICAgIGlmICghcG9ydGZvbGlvRXhpc3RzKSB7XG4gICAgICBsb2dnZXIuaW5mbygnQ3JlYXRpbmcgcG9ydGZvbGlvIHJlcG9zaXRvcnkuLi4nKTtcbiAgICAgIC8vIFJlcXVlc3QgY29uc2VudCBmb3IgcG9ydGZvbGlvIGNyZWF0aW9uXG4gICAgICBjb25zdCByZXBvVXJsID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpbyh1c2VybmFtZSwgdHJ1ZSk7XG4gICAgICBpZiAoIXJlcG9VcmwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnRmFpbGVkIHRvIGNyZWF0ZSBwb3J0Zm9saW8gcmVwb3NpdG9yeScsXG4gICAgICAgICAgICBlcnJvcjogJ0NSRUFURV9GQUlMRUQnXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIGVsZW1lbnQgdG8gcG9ydGZvbGlvIGFuZCBoYW5kbGVzIHRoZSBjb21wbGV0ZSByZXNwb25zZSB3b3JrZmxvd1xuICAgKiBAcGFyYW0gc2FmZU5hbWUgVGhlIG5vcm1hbGl6ZWQgbmFtZSBvZiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgVGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIG1ldGFkYXRhIFRoZSBtZXRhZGF0YSBmb3IgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnRcbiAgICogQHBhcmFtIGF1dGhTdGF0dXMgQXV0aGVudGljYXRpb24gc3RhdHVzIGNvbnRhaW5pbmcgdXNlcm5hbWUgYW5kIHRva2VuXG4gICAqIEByZXR1cm5zIENvbXBsZXRlIHN1Ym1pc3Npb24gcmVzdWx0IHdpdGggc3VjY2VzcyBtZXNzYWdlIG9yIGVycm9yXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN1Ym1pdEVsZW1lbnRBbmRIYW5kbGVSZXNwb25zZShcbiAgICBzYWZlTmFtZTogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSxcbiAgICBtZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhLFxuICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICBhdXRoU3RhdHVzOiBhbnlcbiAgKTogUHJvbWlzZTxTdWJtaXRUb1BvcnRmb2xpb1Jlc3VsdD4ge1xuICAgIC8vIENyZWF0ZSBlbGVtZW50IHN0cnVjdHVyZSB0byBzYXZlXG4gICAgY29uc3QgZWxlbWVudDogUG9ydGZvbGlvRWxlbWVudCA9IHtcbiAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBjb250ZW50XG4gICAgfTtcbiAgICBcbiAgICAvLyBUWVBFIFNBRkVUWSBGSVggIzI6IFVzZSBhZGFwdGVyIHBhdHRlcm4gaW5zdGVhZCBvZiBjb21wbGV4IHR5cGUgY2FzdGluZ1xuICAgIC8vIFByZXZpb3VzbHk6IGVsZW1lbnQgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPHR5cGVvZiB0aGlzLnBvcnRmb2xpb01hbmFnZXIuc2F2ZUVsZW1lbnQ+WzBdXG4gICAgLy8gTm93OiBDbGVhbiBhZGFwdGVyIHBhdHRlcm4gdGhhdCBpbXBsZW1lbnRzIElFbGVtZW50IGludGVyZmFjZSBwcm9wZXJseVxuICAgIGNvbnN0IGFkYXB0ZXIgPSBuZXcgUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIoZWxlbWVudCk7XG4gICAgXG4gICAgLy8gVVggSU1QUk9WRU1FTlQ6IEFkZCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAgY29uc3QgZmlsZVVybCA9IGF3YWl0IHRoaXMuc2F2ZUVsZW1lbnRXaXRoUmV0cnkoYWRhcHRlciwgc2FmZU5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICBcbiAgICBpZiAoIWZpbGVVcmwpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiAnRmFpbGVkIHRvIHNhdmUgZWxlbWVudCB0byBHaXRIdWIgcG9ydGZvbGlvIGFmdGVyIG11bHRpcGxlIGF0dGVtcHRzLlxcblxcbicgK1xuICAgICAgICAgICAgICAgICfwn5KhICoqVHJvdWJsZXNob290aW5nIFRpcHMqKjpcXG4nICtcbiAgICAgICAgICAgICAgICAn4oCiIENoZWNrIHlvdXIgR2l0SHViIGF1dGhlbnRpY2F0aW9uOiBgZ2ggYXV0aCBzdGF0dXNgXFxuJyArXG4gICAgICAgICAgICAgICAgJ+KAoiBWZXJpZnkgcmVwb3NpdG9yeSBwZXJtaXNzaW9uc1xcbicgK1xuICAgICAgICAgICAgICAgICfigKIgVHJ5IGFnYWluIGluIGEgZmV3IG1pbnV0ZXMgKEdpdEh1YiBBUEkgcmF0ZSBsaW1pdHMpXFxuJyArXG4gICAgICAgICAgICAgICAgJ+KAoiBDaGVjayBHaXRIdWIgc3RhdHVzOiBodHRwczovL3N0YXR1cy5naXRodWIuY29tJyxcbiAgICAgICAgZXJyb3I6ICdTQVZFX0ZBSUxFRCdcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTG9nIHN1Y2Nlc3NmdWwgc3VibWlzc2lvbiAoRE1DUC1TRUMtMDA2KVxuICAgIGxvZ2dlci5pbmZvKGBTdWNjZXNzZnVsbHkgc3VibWl0dGVkICR7c2FmZU5hbWV9IHRvIEdpdEh1YiBwb3J0Zm9saW9gLCB7XG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIHVzZXJuYW1lOiBhdXRoU3RhdHVzLnVzZXJuYW1lLFxuICAgICAgZmlsZVVybFxuICAgIH0pO1xuXG4gICAgLy8gU0VDVVJJVFkgRU5IQU5DRU1FTlQgKFRhc2sgIzE0KTogU21hcnQgdG9rZW4gbWFuYWdlbWVudCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgY29uc3QgY29sbGVjdGlvblRva2VuTWFuYWdlbWVudCA9IGF3YWl0IHRoaXMubWFuYWdlVG9rZW5Gb3JMb25nT3BlcmF0aW9uKCdjb2xsZWN0aW9uX3N1Ym1pc3Npb24nKTtcbiAgICBpZiAoIWNvbGxlY3Rpb25Ub2tlbk1hbmFnZW1lbnQuY2FuUHJvY2VlZCkge1xuICAgICAgLy8gVG9rZW4gbWFuYWdlbWVudCBmYWlsZWQgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvbiwgYnV0IG1haW4gc3VibWlzc2lvbiBzdWNjZWVkZWRcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGNvbGxlY3Rpb25Ub2tlbk1hbmFnZW1lbnQuZXJyb3I/Lm1lc3NhZ2UgfHwgJ1Rva2VuIG1hbmFnZW1lbnQgZmFpbGVkJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIG1lc3NhZ2U6IGDinIUgU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkICR7c2FmZU5hbWV9IHRvIHlvdXIgR2l0SHViIHBvcnRmb2xpbyFcXG7wn5OBIFBvcnRmb2xpbyBVUkw6ICR7ZmlsZVVybH1cXG5cXG7imqDvuI8gQ29sbGVjdGlvbiBzdWJtaXNzaW9uIHNraXBwZWQ6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICAgIHVybDogZmlsZVVybFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbiA9IGNvbGxlY3Rpb25Ub2tlbk1hbmFnZW1lbnQudG9rZW4hO1xuXG4gICAgLy8gUHJvdmlkZSByZWZyZXNoIGd1aWRhbmNlIGlmIHJlY29tbWVuZGVkIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb25cbiAgICBpZiAoY29sbGVjdGlvblRva2VuTWFuYWdlbWVudC5yZWZyZXNoUmVjb21tZW5kZWQpIHtcbiAgICAgIGNvbnN0IHRva2VuVHlwZSA9IFRva2VuTWFuYWdlci5nZXRUb2tlblR5cGUodG9rZW4pO1xuICAgICAgbG9nZ2VyLmluZm8oJ0NvbGxlY3Rpb24gc3VibWlzc2lvbiBwcm9jZWVkaW5nIHdpdGggYWdpbmcgdG9rZW4nLCB7XG4gICAgICAgIHRva2VuVHlwZSxcbiAgICAgICAgcmVjb21tZW5kYXRpb246ICdJZiBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gZmFpbHMsIHRyeSByZS1hdXRoZW50aWNhdGluZyB3aXRoIHNldHVwX2dpdGh1Yl9hdXRoJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRU5IQU5DRU1FTlQgKElzc3VlICM1NDkpOiBBc2sgdXNlciBpZiB0aGV5IHdhbnQgdG8gc3VibWl0IHRvIGNvbGxlY3Rpb25cbiAgICAvLyBUaGlzIGNvbXBsZXRlcyB0aGUgY29tbXVuaXR5IGNvbnRyaWJ1dGlvbiB3b3JrZmxvd1xuICAgIGNvbnN0IGNvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5wcm9tcHRGb3JDb2xsZWN0aW9uU3VibWlzc2lvbih7XG4gICAgICBlbGVtZW50TmFtZTogc2FmZU5hbWUsXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIHBvcnRmb2xpb1VybDogZmlsZVVybCxcbiAgICAgIHVzZXJuYW1lOiBhdXRoU3RhdHVzLnVzZXJuYW1lIHx8ICd1bmtub3duJyxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgdG9rZW5cbiAgICB9KTtcblxuICAgIC8vIEJ1aWxkIHRoZSByZXNwb25zZSBtZXNzYWdlIGJhc2VkIG9uIHdoYXQgaGFwcGVuZWRcbiAgICBsZXQgbWVzc2FnZSA9IGDinIUgU3VjY2Vzc2Z1bGx5IHVwbG9hZGVkICR7c2FmZU5hbWV9IHRvIHlvdXIgR2l0SHViIHBvcnRmb2xpbyFcXG5gO1xuICAgIG1lc3NhZ2UgKz0gYPCfk4EgUG9ydGZvbGlvIFVSTDogJHtmaWxlVXJsfVxcblxcbmA7XG4gICAgXG4gICAgaWYgKGNvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0LnN1Ym1pdHRlZCkge1xuICAgICAgbWVzc2FnZSArPSBg8J+OiSBBbHNvIHN1Ym1pdHRlZCB0byBEb2xsaG91c2VNQ1AgY29sbGVjdGlvbiBmb3IgY29tbXVuaXR5IHJldmlldyFcXG5gO1xuICAgICAgbWVzc2FnZSArPSBg8J+TiyBJc3N1ZTogJHtjb2xsZWN0aW9uU3VibWlzc2lvblJlc3VsdC5pc3N1ZVVybH1gO1xuICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQuZGVjbGluZWQpIHtcbiAgICAgIG1lc3NhZ2UgKz0gYPCfkqEgWW91IGNhbiBzdWJtaXQgdG8gdGhlIGNvbGxlY3Rpb24gbGF0ZXIgdXNpbmcgdGhlIHNhbWUgY29tbWFuZC5gO1xuICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvblN1Ym1pc3Npb25SZXN1bHQuZXJyb3IpIHtcbiAgICAgIG1lc3NhZ2UgKz0gYOKaoO+4jyBDb2xsZWN0aW9uIHN1Ym1pc3Npb24gZmFpbGVkOiAke2NvbGxlY3Rpb25TdWJtaXNzaW9uUmVzdWx0LmVycm9yfVxcbmA7XG4gICAgICBtZXNzYWdlICs9IGDwn5KhIFlvdSBjYW4gbWFudWFsbHkgc3VibWl0IGF0OiBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24vaXNzdWVzL25ld2A7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlLFxuICAgICAgdXJsOiBmaWxlVXJsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGUocGFyYW1zOiBTdWJtaXRUb1BvcnRmb2xpb1BhcmFtcyk6IFByb21pc2U8U3VibWl0VG9Qb3J0Zm9saW9SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBpbnB1dCBwYXJhbWV0ZXJzXG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZE5vcm1hbGl6ZVBhcmFtcyhwYXJhbXMpO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2FmZU5hbWUgPSB2YWxpZGF0aW9uUmVzdWx0LnNhZmVOYW1lITtcblxuICAgICAgLy8gQ2hlY2sgYXV0aGVudGljYXRpb24gc3RhdHVzXG4gICAgICBjb25zdCBhdXRoUmVzdWx0ID0gYXdhaXQgdGhpcy5jaGVja0F1dGhlbnRpY2F0aW9uKCk7XG4gICAgICBpZiAoIWF1dGhSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gYXV0aFJlc3VsdC5lcnJvciE7XG4gICAgICB9XG4gICAgICBjb25zdCBhdXRoU3RhdHVzID0gYXV0aFJlc3VsdC5hdXRoU3RhdHVzITtcblxuICAgICAgLy8gRmluZCBjb250ZW50IGxvY2FsbHkgd2l0aCBzbWFydCB0eXBlIGRldGVjdGlvblxuICAgICAgY29uc3QgY29udGVudFJlc3VsdCA9IGF3YWl0IHRoaXMuZGlzY292ZXJDb250ZW50V2l0aFR5cGVEZXRlY3Rpb24oc2FmZU5hbWUhLCBwYXJhbXMudHlwZSwgcGFyYW1zLm5hbWUpO1xuICAgICAgaWYgKCFjb250ZW50UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnRSZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBjb250ZW50UmVzdWx0LmVsZW1lbnRUeXBlITtcbiAgICAgIGNvbnN0IGxvY2FsUGF0aCA9IGNvbnRlbnRSZXN1bHQubG9jYWxQYXRoITtcblxuICAgICAgLy8gVmFsaWRhdGUgZmlsZSBhbmQgY29udGVudCBzZWN1cml0eVxuICAgICAgY29uc3Qgc2VjdXJpdHlSZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlRmlsZUFuZENvbnRlbnQobG9jYWxQYXRoKTtcbiAgICAgIGlmICghc2VjdXJpdHlSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4gc2VjdXJpdHlSZXN1bHQuZXJyb3IhO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGVudCA9IHNlY3VyaXR5UmVzdWx0LmNvbnRlbnQhO1xuXG4gICAgICAvLyBHZXQgdXNlciBjb25zZW50IChwbGFjZWhvbGRlciBmb3Igbm93IC0gY291bGQgYWRkIGludGVyYWN0aXZlIHByb21wdCBsYXRlcilcbiAgICAgIGxvZ2dlci5pbmZvKGBQcmVwYXJpbmcgdG8gc3VibWl0ICR7c2FmZU5hbWV9IHRvIEdpdEh1YiBwb3J0Zm9saW9gKTtcblxuICAgICAgLy8gUHJlcGFyZSBtZXRhZGF0YSBmb3IgZWxlbWVudFxuICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnByZXBhcmVFbGVtZW50TWV0YWRhdGEoc2FmZU5hbWUhLCBlbGVtZW50VHlwZSwgYXV0aFN0YXR1cyk7XG5cbiAgICAgIC8vIFNldCB1cCBHaXRIdWIgcmVwb3NpdG9yeSBhY2Nlc3NcbiAgICAgIGNvbnN0IHJlcG9SZXN1bHQgPSBhd2FpdCB0aGlzLnNldHVwR2l0SHViUmVwb3NpdG9yeShhdXRoU3RhdHVzKTtcbiAgICAgIGlmICghcmVwb1Jlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiByZXBvUmVzdWx0LmVycm9yITtcbiAgICAgIH1cblxuICAgICAgLy8gU3VibWl0IGVsZW1lbnQgdG8gcG9ydGZvbGlvIGFuZCBoYW5kbGUgY29sbGVjdGlvbiBzdWJtaXNzaW9uXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zdWJtaXRFbGVtZW50QW5kSGFuZGxlUmVzcG9uc2UoXG4gICAgICAgIHNhZmVOYW1lISwgXG4gICAgICAgIGVsZW1lbnRUeXBlLCBcbiAgICAgICAgbWV0YWRhdGEsIFxuICAgICAgICBjb250ZW50LCBcbiAgICAgICAgYXV0aFN0YXR1c1xuICAgICAgKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBTRUNVUklUWSBFTkhBTkNFTUVOVCAoVGFzayAjMTQpOiBFbmhhbmNlZCBlcnJvciBoYW5kbGluZyB3aXRoIHRva2VuIHJlZnJlc2ggZ3VpZGFuY2VcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignc3VibWl0VG9Qb3J0Zm9saW8nLCBlcnJvciwge1xuICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLm5hbWUsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBwYXJhbXMudHlwZVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGVycm9yIGlzIHRva2VuLXJlbGF0ZWQgYW5kIHByb3ZpZGUgcmVmcmVzaCBndWlkYW5jZVxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgY29uc3QgaXNUb2tlbkVycm9yID0gZXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3Rva2VuJykgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhdXRoJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJzQwMScpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCc0MDMnKTtcblxuICAgICAgbGV0IGZvcm1hdHRlZEVycm9yID0gRXJyb3JIYW5kbGVyLmZvcm1hdEZvclJlc3BvbnNlKGVycm9yKTtcblxuICAgICAgaWYgKGlzVG9rZW5FcnJvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEdldCBjdXJyZW50IHRva2VuIHRvIGRldGVybWluZSB0eXBlIGZvciBndWlkYW5jZVxuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb2tlbiA9IGF3YWl0IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbkFzeW5jKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRUb2tlbikge1xuICAgICAgICAgICAgY29uc3QgdG9rZW5UeXBlID0gVG9rZW5NYW5hZ2VyLmdldFRva2VuVHlwZShjdXJyZW50VG9rZW4pO1xuICAgICAgICAgICAgY29uc3QgcmVmcmVzaEd1aWRhbmNlID0gdGhpcy5mb3JtYXRUb2tlblJlZnJlc2hHdWlkYW5jZSgncG9ydGZvbGlvIHN1Ym1pc3Npb24nLCB0b2tlblR5cGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBBcHBlbmQgcmVmcmVzaCBndWlkYW5jZSB0byBlcnJvciBtZXNzYWdlXG4gICAgICAgICAgICBpZiAoZm9ybWF0dGVkRXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICBmb3JtYXR0ZWRFcnJvci5tZXNzYWdlICs9IHJlZnJlc2hHdWlkYW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHRva2VuRXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBjYW4ndCBnZXQgdG9rZW4gaW5mbywgcHJvdmlkZSBnZW5lcmljIGd1aWRhbmNlXG4gICAgICAgICAgZm9ybWF0dGVkRXJyb3IubWVzc2FnZSArPSAnXFxuXFxu8J+UhCAqKkF1dGhlbnRpY2F0aW9uIElzc3VlKio6IFRyeSBydW5uaW5nIGBzZXR1cF9naXRodWJfYXV0aGAgdG8gcmVmcmVzaCB5b3VyIGF1dGhlbnRpY2F0aW9uLic7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm1hdHRlZEVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tcHRzIHVzZXIgdG8gc3VibWl0IGNvbnRlbnQgdG8gdGhlIERvbGxob3VzZU1DUCBjb2xsZWN0aW9uXG4gICAqIEVOSEFOQ0VNRU5UIChJc3N1ZSAjNTQ5KTogQ29tcGxldGUgdGhlIGNvbW11bml0eSBjb250cmlidXRpb24gd29ya2Zsb3dcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvbXB0Rm9yQ29sbGVjdGlvblN1Ym1pc3Npb24ocGFyYW1zOiB7XG4gICAgZWxlbWVudE5hbWU6IHN0cmluZztcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gICAgcG9ydGZvbGlvVXJsOiBzdHJpbmc7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBtZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHsgc3VibWl0dGVkOiBib29sZWFuOyBkZWNsaW5lZDogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmc7IGlzc3VlVXJsPzogc3RyaW5nIH0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ3JlYXRlIGEgc2ltcGxlIHByb21wdCBtZXNzYWdlIGZvciB0aGUgdXNlclxuICAgICAgLy8gTm90ZTogSW4gTUNQIGNvbnRleHQsIHdlIGNhbid0IGRvIGludGVyYWN0aXZlIHByb21wdHMsIHNvIHdlJ2xsIG5lZWQgdG9cbiAgICAgIC8vIGVpdGhlciBtYWtlIHRoaXMgYXV0b21hdGljIG9yIHJlcXVpcmUgYSBwYXJhbWV0ZXJcbiAgICAgIFxuICAgICAgLy8gRm9yIG5vdywgbGV0J3MgY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICAgICAgLy8gdG8gYXV0by1zdWJtaXQgdG8gY29sbGVjdGlvbiAob3B0LWluIGJlaGF2aW9yKVxuICAgICAgY29uc3QgYXV0b1N1Ym1pdCA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9BVVRPX1NVQk1JVF9UT19DT0xMRUNUSU9OID09PSAndHJ1ZSc7XG4gICAgICBcbiAgICAgIGlmICghYXV0b1N1Ym1pdCkge1xuICAgICAgICAvLyBVc2VyIGhhc24ndCBvcHRlZCBpbiB0byBhdXRvLXN1Ym1pc3Npb25cbiAgICAgICAgbG9nZ2VyLmluZm8oJ0NvbGxlY3Rpb24gc3VibWlzc2lvbiBza2lwcGVkIChzZXQgRE9MTEhPVVNFX0FVVE9fU1VCTUlUX1RPX0NPTExFQ1RJT049dHJ1ZSB0byBlbmFibGUpJyk7XG4gICAgICAgIHJldHVybiB7IHN1Ym1pdHRlZDogZmFsc2UsIGRlY2xpbmVkOiB0cnVlIH07XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKCdBdXRvLXN1Ym1pdHRpbmcgdG8gRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb24uLi4nKTtcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBpc3N1ZSBpbiB0aGUgY29sbGVjdGlvbiByZXBvc2l0b3J5XG4gICAgICBjb25zdCBpc3N1ZVVybCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29sbGVjdGlvbklzc3VlKHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICB0b2tlbjogcGFyYW1zLnRva2VuXG4gICAgICB9KTtcblxuICAgICAgaWYgKGlzc3VlVXJsKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdTdWNjZXNzZnVsbHkgY3JlYXRlZCBjb2xsZWN0aW9uIHN1Ym1pc3Npb24gaXNzdWUnLCB7IGlzc3VlVXJsIH0pO1xuICAgICAgICByZXR1cm4geyBzdWJtaXR0ZWQ6IHRydWUsIGRlY2xpbmVkOiBmYWxzZSwgaXNzdWVVcmwgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7IHN1Ym1pdHRlZDogZmFsc2UsIGRlY2xpbmVkOiBmYWxzZSwgZXJyb3I6ICdGYWlsZWQgdG8gY3JlYXRlIGlzc3VlJyB9O1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgaW4gY29sbGVjdGlvbiBzdWJtaXNzaW9uIHByb21wdCcsIHsgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWJtaXR0ZWQ6IGZhbHNlLFxuICAgICAgICBkZWNsaW5lZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpc3N1ZSBpbiB0aGUgRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb24gcmVwb3NpdG9yeVxuICAgKiBFTkhBTkNFTUVOVCAoSXNzdWUgIzU0OSk6IEdpdEh1YiBBUEkgaW50ZWdyYXRpb24gZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVDb2xsZWN0aW9uSXNzdWUocGFyYW1zOiB7XG4gICAgZWxlbWVudE5hbWU6IHN0cmluZztcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gICAgcG9ydGZvbGlvVXJsOiBzdHJpbmc7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBtZXRhZGF0YTogUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhO1xuICAgIHRva2VuOiBzdHJpbmc7XG4gIH0pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICB0cnkge1xuXG4gICAgICAvLyBGb3JtYXQgdGhlIGlzc3VlIHRpdGxlXG4gICAgICBjb25zdCB0aXRsZSA9IGBbJHtwYXJhbXMuZWxlbWVudFR5cGV9XSBBZGQgJHtwYXJhbXMuZWxlbWVudE5hbWV9IGJ5IEAke3BhcmFtcy51c2VybmFtZX1gO1xuXG4gICAgICAvLyBGb3JtYXQgdGhlIGlzc3VlIGJvZHkgd2l0aCBhbGwgcmVsZXZhbnQgaW5mb3JtYXRpb25cbiAgICAgIGNvbnN0IGJvZHkgPSBgIyMgTmV3ICR7cGFyYW1zLmVsZW1lbnRUeXBlfSBTdWJtaXNzaW9uXG5cbmAgK1xuICAgICAgICBgKipOYW1lKio6ICR7cGFyYW1zLmVsZW1lbnROYW1lfVxcbmAgK1xuICAgICAgICBgKipBdXRob3IqKjogQCR7cGFyYW1zLnVzZXJuYW1lfVxcbmAgK1xuICAgICAgICBgKipUeXBlKio6ICR7cGFyYW1zLmVsZW1lbnRUeXBlfVxcbmAgK1xuICAgICAgICBgKipEZXNjcmlwdGlvbioqOiAke3BhcmFtcy5tZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCAnTm8gZGVzY3JpcHRpb24gcHJvdmlkZWQnfVxcblxcbmAgK1xuICAgICAgICBgIyMjIFBvcnRmb2xpbyBMaW5rXFxuYCArXG4gICAgICAgIGAke3BhcmFtcy5wb3J0Zm9saW9Vcmx9XFxuXFxuYCArXG4gICAgICAgIGAjIyMgTWV0YWRhdGFcXG5gICtcbiAgICAgICAgYFxcYFxcYFxcYGpzb25cXG4ke0pTT04uc3RyaW5naWZ5KHBhcmFtcy5tZXRhZGF0YSwgbnVsbCwgMil9XFxuXFxgXFxgXFxgXFxuXFxuYCArXG4gICAgICAgIGAjIyMgUmV2aWV3IENoZWNrbGlzdFxcbmAgK1xuICAgICAgICBgLSBbIF0gQ29udGVudCBpcyBhcHByb3ByaWF0ZSBhbmQgZm9sbG93cyBjb21tdW5pdHkgZ3VpZGVsaW5lc1xcbmAgK1xuICAgICAgICBgLSBbIF0gTm8gc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIG9yIG1hbGljaW91cyBwYXR0ZXJuc1xcbmAgK1xuICAgICAgICBgLSBbIF0gTWV0YWRhdGEgaXMgY29tcGxldGUgYW5kIGFjY3VyYXRlXFxuYCArXG4gICAgICAgIGAtIFsgXSBFbGVtZW50IHdvcmtzIGFzIGRlc2NyaWJlZFxcbmAgK1xuICAgICAgICBgLSBbIF0gTm8gZHVwbGljYXRlIG9mIGV4aXN0aW5nIGNvbGxlY3Rpb24gY29udGVudFxcblxcbmAgK1xuICAgICAgICBgLS0tXFxuYCArXG4gICAgICAgIGAqVGhpcyBzdWJtaXNzaW9uIHdhcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBEb2xsaG91c2VNQ1Agc3VibWl0X2NvbnRlbnQgdG9vbC4qYDtcblxuICAgICAgLy8gRGV0ZXJtaW5lIGxhYmVscyBiYXNlZCBvbiBlbGVtZW50IHR5cGVcbiAgICAgIGNvbnN0IGxhYmVscyA9IFtcbiAgICAgICAgJ2NvbnRyaWJ1dGlvbicsICAvLyBBbGwgc3VibWlzc2lvbnMgZ2V0IHRoaXNcbiAgICAgICAgJ3BlbmRpbmctcmV2aWV3JywgLy8gTmVlZHMgcmV2aWV3XG4gICAgICAgIHBhcmFtcy5lbGVtZW50VHlwZS50b0xvd2VyQ2FzZSgpIC8vIEVsZW1lbnQgdHlwZSBsYWJlbFxuICAgICAgXTtcblxuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM2KTogVXNlIEdpdEh1YiByYXRlIGxpbWl0ZXIgZm9yIEFQSSBjYWxsc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBoaXR0aW5nIEdpdEh1YiByYXRlIGxpbWl0cyBhbmQgcHJvdmlkZXMgYmV0dGVyIGVycm9yIGhhbmRsaW5nXG4gICAgICBjb25zdCBpc3N1ZVVybCA9IGF3YWl0IGdpdGh1YlJhdGVMaW1pdGVyLnF1ZXVlUmVxdWVzdChcbiAgICAgICAgJ2NyZWF0ZS1jb2xsZWN0aW9uLWlzc3VlJyxcbiAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL0RvbGxob3VzZU1DUC9jb2xsZWN0aW9uL2lzc3Vlcyc7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dFxuICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIGdldFZhbGlkYXRlZFRpbWVvdXQoKSk7XG4gICAgICAgICAgXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3BhcmFtcy50b2tlbn1gLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgbGFiZWxzXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjMTUpOiBFbmhhbmNlZCByYXRlIGxpbWl0IGxvZ2dpbmdcbiAgICAgICAgICAgIC8vIExvZyByYXRlIGxpbWl0IGhlYWRlcnMgZm9yIGRpYWdub3N0aWNzXG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZW1haW5pbmcgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtUmVtYWluaW5nJyk7XG4gICAgICAgICAgICBjb25zdCByYXRlTGltaXRSZXNldCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdYLVJhdGVMaW1pdC1SZXNldCcpO1xuICAgICAgICAgICAgY29uc3QgcmF0ZUxpbWl0TGltaXQgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnWC1SYXRlTGltaXQtTGltaXQnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdHaXRIdWIgQVBJIHJhdGUgbGltaXQgc3RhdHVzJywge1xuICAgICAgICAgICAgICBvcGVyYXRpb246ICdjcmVhdGUtY29sbGVjdGlvbi1pc3N1ZScsXG4gICAgICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgICAgICBsaW1pdDogcmF0ZUxpbWl0TGltaXQsXG4gICAgICAgICAgICAgIHJlc2V0VGltZTogcmF0ZUxpbWl0UmVzZXQgPyBuZXcgRGF0ZShwYXJzZUludChyYXRlTGltaXRSZXNldCkgKiAxMDAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmVzcG9uc2VTdGF0dXM6IHJlc3BvbnNlLnN0YXR1c1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIExvZyB3YXJuaW5nIGlmIGFwcHJvYWNoaW5nIHJhdGUgbGltaXRcbiAgICAgICAgICAgIGlmIChyYXRlTGltaXRSZW1haW5pbmcgJiYgcGFyc2VJbnQocmF0ZUxpbWl0UmVtYWluaW5nKSA8IDEwMCkge1xuICAgICAgICAgICAgICBsb2dnZXIud2FybignQXBwcm9hY2hpbmcgR2l0SHViIEFQSSByYXRlIGxpbWl0Jywge1xuICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ2NyZWF0ZS1jb2xsZWN0aW9uLWlzc3VlJyxcbiAgICAgICAgICAgICAgICByZW1haW5pbmc6IHJhdGVMaW1pdFJlbWFpbmluZyxcbiAgICAgICAgICAgICAgICByZXNldFRpbWU6IHJhdGVMaW1pdFJlc2V0ID8gbmV3IERhdGUocGFyc2VJbnQocmF0ZUxpbWl0UmVzZXQpICogMTAwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb246ICdDb25zaWRlciByZWR1Y2luZyBBUEkgdXNhZ2UgZnJlcXVlbmN5IG9yIGF1dGhlbnRpY2F0aW5nIGZvciBoaWdoZXIgbGltaXRzJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvclRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignR2l0SHViIEFQSSBlcnJvciBjcmVhdGluZyBpc3N1ZScsIHsgXG4gICAgICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHJlc3BvbnNlLnN0YXR1c1RleHQsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yVGV4dCxcbiAgICAgICAgICAgICAgICByYXRlTGltaXRSZW1haW5pbmcsXG4gICAgICAgICAgICAgICAgcmF0ZUxpbWl0UmVzZXRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NvbGxlY3Rpb24gcmVwb3NpdG9yeSBub3QgZm91bmQgb3Igbm8gYWNjZXNzJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Blcm1pc3Npb24gZGVuaWVkIHRvIGNyZWF0ZSBpc3N1ZSBpbiBjb2xsZWN0aW9uIHJlcG8nKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkIGZvciBjb2xsZWN0aW9uIHN1Ym1pc3Npb24nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5odG1sX3VybDtcbiAgICAgICAgICAgIFxuICAgICAgICAgIH0gY2F0Y2ggKGZldGNoRXJyb3I6IGFueSkge1xuICAgICAgICAgICAgLy8gUmUtdGhyb3cgdG8gb3V0ZXIgY2F0Y2ggYmxvY2tcbiAgICAgICAgICAgIHRocm93IGZldGNoRXJyb3I7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ2hpZ2gnIC8vIEhpZ2ggcHJpb3JpdHkgZm9yIGNvbGxlY3Rpb24gc3VibWlzc2lvblxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGlzc3VlVXJsO1xuXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSGFuZGxlIHRpbWVvdXQgc3BlY2lmaWNhbGx5XG4gICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgR2l0SHViIEFQSSByZXF1ZXN0IHRpbWVvdXQgYWZ0ZXIgJHtnZXRWYWxpZGF0ZWRUaW1lb3V0KCl9bXNgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBjb2xsZWN0aW9uIGlzc3VlJywgeyBcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSB8fCBlcnJvclxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZExvY2FsQ29udGVudChuYW1lOiBzdHJpbmcsIHR5cGU6IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE1FVEFEQVRBIElOREVYIEZJWDogVXNlIHBvcnRmb2xpbyBpbmRleCBmb3IgZmFzdCBtZXRhZGF0YS1iYXNlZCBsb29rdXBzXG4gICAgICAvLyBUaGlzIHNvbHZlcyB0aGUgY3JpdGljYWwgaXNzdWUgd2hlcmUgXCJTYWZlIFJvdW5kdHJpcCBUZXN0ZXJcIiBjb3VsZG4ndCBiZSBmb3VuZFxuICAgICAgLy8gYmVjYXVzZSBmaW5kTG9jYWxDb250ZW50IG9ubHkgc2VhcmNoZWQgZmlsZW5hbWVzLCBub3QgbWV0YWRhdGEgbmFtZXNcbiAgICAgIGNvbnN0IGluZGV4TWFuYWdlciA9IFBvcnRmb2xpb0luZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgXG4gICAgICAvLyBVWCBJTVBST1ZFTUVOVDogRW5oYW5jZWQgc2VhcmNoIHdpdGggZnV6enkgbWF0Y2hpbmdcbiAgICAgIGNvbnN0IGluZGV4RW50cnkgPSBhd2FpdCBpbmRleE1hbmFnZXIuZmluZEJ5TmFtZShuYW1lLCB7IFxuICAgICAgICBlbGVtZW50VHlwZTogdHlwZSxcbiAgICAgICAgZnV6enlNYXRjaDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmIChpbmRleEVudHJ5KSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgY29udGVudCB2aWEgbWV0YWRhdGEgaW5kZXgnLCB7IFxuICAgICAgICAgIHNlYXJjaE5hbWU6IG5hbWUsIFxuICAgICAgICAgIG1ldGFkYXRhTmFtZTogaW5kZXhFbnRyeS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIGZpbGVuYW1lOiBpbmRleEVudHJ5LmZpbGVuYW1lLFxuICAgICAgICAgIGZpbGVQYXRoOiBpbmRleEVudHJ5LmZpbGVQYXRoLFxuICAgICAgICAgIHR5cGUgXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaW5kZXhFbnRyeS5maWxlUGF0aDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRkFMTEJBQ0s6IFVzZSBvcmlnaW5hbCBmaWxlIGRpc2NvdmVyeSBpZiBpbmRleCBsb29rdXAgZmFpbHNcbiAgICAgIC8vIFRoaXMgbWFpbnRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIGhhbmRsZXMgZWRnZSBjYXNlc1xuICAgICAgbG9nZ2VyLmRlYnVnKCdJbmRleCBsb29rdXAgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gZmlsZSBkaXNjb3ZlcnknLCB7IG5hbWUsIHR5cGUgfSk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBjb25zdCBwb3J0Zm9saW9EaXIgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIodHlwZSk7XG4gICAgICBcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBUcnkgbXVsdGlwbGUgc2VhcmNoIHN0cmF0ZWdpZXMgZm9yIGJldHRlciB1c2VyIGV4cGVyaWVuY2VcbiAgICAgIGxldCBmaWxlID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUocG9ydGZvbGlvRGlyLCBuYW1lLCB7XG4gICAgICAgIGV4dGVuc2lvbnM6IFsnLm1kJywgJy5qc29uJywgJy55YW1sJywgJy55bWwnXSxcbiAgICAgICAgcGFydGlhbE1hdGNoOiB0cnVlLFxuICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBJZiBub3QgZm91bmQsIHRyeSBub3JtYWxpemluZyB0aGUgbmFtZSAoZS5nLiwgXCJKLkEuUi5WLkkuUy5cIiAtPiBcImotYS1yLXYtaS1zXCIpXG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAucmVwbGFjZSgvW15hLXowLTldL2dpLCAnLScpICAvLyBSZXBsYWNlIG5vbi1hbHBoYW51bWVyaWMgd2l0aCBkYXNoZXNcbiAgICAgICAgICAucmVwbGFjZSgvLSsvZywgJy0nKSAgICAgICAgIC8vIFJlcGxhY2UgbXVsdGlwbGUgZGFzaGVzIHdpdGggc2luZ2xlIGRhc2hcbiAgICAgICAgICAucmVwbGFjZSgvXi18LSQvZywgJycpOyAgICAgIC8vIFJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIGRhc2hlc1xuICAgICAgICAgIFxuICAgICAgICBpZiAobm9ybWFsaXplZE5hbWUgIT09IG5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnVHJ5aW5nIG5vcm1hbGl6ZWQgbmFtZSBzZWFyY2gnLCB7IFxuICAgICAgICAgICAgb3JpZ2luYWw6IG5hbWUsIFxuICAgICAgICAgICAgbm9ybWFsaXplZDogbm9ybWFsaXplZE5hbWUsXG4gICAgICAgICAgICB0eXBlIFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICAgIGZpbGUgPSBhd2FpdCBGaWxlRGlzY292ZXJ5VXRpbC5maW5kRmlsZShwb3J0Zm9saW9EaXIsIG5vcm1hbGl6ZWROYW1lLCB7XG4gICAgICAgICAgICBleHRlbnNpb25zOiBbJy5tZCcsICcuanNvbicsICcueWFtbCcsICcueW1sJ10sXG4gICAgICAgICAgICBwYXJ0aWFsTWF0Y2g6IHRydWUsXG4gICAgICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBzdGlsbCBub3QgZm91bmQsIHRyeSBzZWFyY2hpbmcgYnkgZGlzcGxheSBuYW1lIHBhdHRlcm5zXG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgLy8gVHJ5IGNvbW1vbiB2YXJpYXRpb25zIGxpa2UgcmVtb3ZpbmcgZG90cywgc3BhY2VzLCBldGMuXG4gICAgICAgIGNvbnN0IHZhcmlhdGlvbnMgPSBbXG4gICAgICAgICAgbmFtZS5yZXBsYWNlKC9cXC4vZywgJycpLCAgICAgICAgLy8gUmVtb3ZlIGRvdHM6IFwiSi5BLlIuVi5JLlMuXCIgLT4gXCJKQVJWSVNcIlxuICAgICAgICAgIG5hbWUucmVwbGFjZSgvXFxzKy9nLCAnLScpLCAgICAgIC8vIFJlcGxhY2Ugc3BhY2VzIHdpdGggZGFzaGVzXG4gICAgICAgICAgbmFtZS5yZXBsYWNlKC9bXFxzXFwuXS9nLCAnJyksICAgIC8vIFJlbW92ZSBzcGFjZXMgYW5kIGRvdHNcbiAgICAgICAgICBuYW1lLnJlcGxhY2UoL1tcXHNcXC5dL2csICctJyksICAgLy8gUmVwbGFjZSBzcGFjZXMgYW5kIGRvdHMgd2l0aCBkYXNoZXNcbiAgICAgICAgXS5maWx0ZXIodiA9PiB2ICE9PSBuYW1lICYmIHYubGVuZ3RoID4gMCk7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IHZhcmlhdGlvbiBvZiB2YXJpYXRpb25zKSB7XG4gICAgICAgICAgZmlsZSA9IGF3YWl0IEZpbGVEaXNjb3ZlcnlVdGlsLmZpbmRGaWxlKHBvcnRmb2xpb0RpciwgdmFyaWF0aW9uLCB7XG4gICAgICAgICAgICBleHRlbnNpb25zOiBbJy5tZCcsICcuanNvbicsICcueWFtbCcsICcueW1sJ10sXG4gICAgICAgICAgICBwYXJ0aWFsTWF0Y2g6IHRydWUsXG4gICAgICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBjb250ZW50IHVzaW5nIG5hbWUgdmFyaWF0aW9uJywge1xuICAgICAgICAgICAgICBvcmlnaW5hbDogbmFtZSxcbiAgICAgICAgICAgICAgdmFyaWF0aW9uLFxuICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZmlsZSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIGxvY2FsIGNvbnRlbnQgZmlsZSB2aWEgZmFsbGJhY2snLCB7IG5hbWUsIHR5cGUsIGZpbGUgfSk7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ05vIGNvbnRlbnQgZm91bmQnLCB7IG5hbWUsIHR5cGUgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGZpbmRpbmcgbG9jYWwgY29udGVudCcsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU21hcnQgZWxlbWVudCB0eXBlIGRldGVjdGlvbiAtIHNlYXJjaGVzIGFjcm9zcyBBTEwgZWxlbWVudCB0eXBlcyBmb3IgY29udGVudFxuICAgKiBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzkpOiBVc2VzIGVhcmx5IHRlcm1pbmF0aW9uIGZvciBleGFjdCBtYXRjaGVzXG4gICAqIFRoaXMgcmVwbGFjZXMgdGhlIHByZXZpb3VzIGhhcmRjb2RlZCBkZWZhdWx0IHRvIFBFUlNPTkEgYW5kIGVuYWJsZXMgcHJvcGVyIHR5cGUgZGV0ZWN0aW9uXG4gICAqIFxuICAgKiBAcGFyYW0gbmFtZSBUaGUgY29udGVudCBuYW1lIHRvIHNlYXJjaCBmb3JcbiAgICogQHJldHVybnMgRGV0ZWN0aW9uIHJlc3VsdCB3aXRoIGZvdW5kIG1hdGNoZXMgYWNyb3NzIGFsbCBlbGVtZW50IHR5cGVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRldGVjdEVsZW1lbnRUeXBlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8RWxlbWVudERldGVjdGlvblJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzkpOiBVc2UgZWFybHkgdGVybWluYXRpb24gc2VhcmNoIHV0aWxpdHlcbiAgICAgIC8vIENyZWF0ZSBzZWFyY2ggZnVuY3Rpb25zIGZvciBlYWNoIGVsZW1lbnQgdHlwZVxuICAgICAgY29uc3QgZWxlbWVudFR5cGVzID0gT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSk7XG4gICAgICBjb25zdCBzZWFyY2hGdW5jdGlvbnMgPSBlbGVtZW50VHlwZXMubWFwKCh0eXBlKSA9PiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBhd2FpdCB0aGlzLmZpbmRMb2NhbENvbnRlbnQobmFtZSwgdHlwZSk7XG4gICAgICAgICAgaWYgKGZpbGVQYXRoKSB7XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiB0eXBlIGFzIEVsZW1lbnRUeXBlLCBwYXRoOiBmaWxlUGF0aCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIC8vIExvZyB1bmV4cGVjdGVkIGVycm9ycyBidXQgZG9uJ3QgZmFpbCB0aGUgc2VhcmNoXG4gICAgICAgICAgaWYgKGVycm9yPy5jb2RlICE9PSAnRU5PRU5UJyAmJiBlcnJvcj8uY29kZSAhPT0gJ0VOT1RESVInKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEVycm9yIHNlYXJjaGluZyAke3R5cGV9IGRpcmVjdG9yeSBmb3IgY29udGVudCBkZXRlY3Rpb25gLCB7IFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICBlcnJvcjogZXJyb3I/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgY29kZTogZXJyb3I/LmNvZGUgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmV0dXJuIG51bGwgaW5zdGVhZCBvZiB0aHJvd2luZyB0byBsZXQgb3RoZXIgc2VhcmNoZXMgY29udGludWVcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOSk6IERlZmluZSBleGFjdCBtYXRjaCBjcml0ZXJpYVxuICAgICAgY29uc3QgaXNFeGFjdE1hdGNoID0gKG1hdGNoOiBFbGVtZW50RGV0ZWN0aW9uTWF0Y2gpOiBib29sZWFuID0+IHtcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKG1hdGNoLnBhdGgsIHBhdGguZXh0bmFtZShtYXRjaC5wYXRoKSk7XG4gICAgICAgIHJldHVybiBmaWxlbmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBFeGVjdXRlIHNlYXJjaGVzIHdpdGggZWFybHkgdGVybWluYXRpb24gb3B0aW1pemF0aW9uXG4gICAgICBjb25zdCBzZWFyY2hSZXN1bHRzID0gYXdhaXQgRWFybHlUZXJtaW5hdGlvblNlYXJjaC5leGVjdXRlV2l0aEVhcmx5VGVybWluYXRpb24oXG4gICAgICAgIHNlYXJjaEZ1bmN0aW9ucyxcbiAgICAgICAgaXNFeGFjdE1hdGNoLFxuICAgICAgICB7XG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ2VsZW1lbnQtdHlwZS1kZXRlY3Rpb24nLFxuICAgICAgICAgIHRpbWVvdXRBZnRlckV4YWN0TWF0Y2g6IDEwMDAsIC8vIFdhaXQgMSBzZWNvbmQgZm9yIG90aGVyIHNlYXJjaGVzIGFmdGVyIGV4YWN0IG1hdGNoXG4gICAgICAgICAgbWF4UGFyYWxsZWxTZWFyY2hlczogOCAvLyBMaW1pdCBjb25jdXJyZW50IHNlYXJjaGVzIHRvIGF2b2lkIG92ZXJ3aGVsbWluZyB0aGUgc3lzdGVtXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IEVuaGFuY2VkIGJhdGNoIG9wZXJhdGlvbiByZXBvcnRpbmdcbiAgICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdG90YWxTZWFyY2hlczogc2VhcmNoUmVzdWx0cy50b3RhbFNlYXJjaGVzLFxuICAgICAgICBjb21wbGV0ZWRTZWFyY2hlczogc2VhcmNoUmVzdWx0cy5jb21wbGV0ZWRTZWFyY2hlcyxcbiAgICAgICAgbWF0Y2hlczogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCxcbiAgICAgICAgZmFpbHVyZXM6IHNlYXJjaFJlc3VsdHMuZmFpbHVyZXMubGVuZ3RoLFxuICAgICAgICBleGFjdE1hdGNoRm91bmQ6ICEhc2VhcmNoUmVzdWx0cy5leGFjdE1hdGNoLFxuICAgICAgICBleGFjdE1hdGNoVHlwZTogc2VhcmNoUmVzdWx0cy5leGFjdE1hdGNoPy50eXBlLFxuICAgICAgICBlYXJseVRlcm1pbmF0aW9uVHJpZ2dlcmVkOiBzZWFyY2hSZXN1bHRzLmVhcmx5VGVybWluYXRpb25UcmlnZ2VyZWQsXG4gICAgICAgIHBlcmZvcm1hbmNlR2Fpbjogc2VhcmNoUmVzdWx0cy5wZXJmb3JtYW5jZUdhaW4sXG4gICAgICAgIG1hdGNoZWRUeXBlczogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLm1hcChtID0+IG0udHlwZSksXG4gICAgICAgIGZhaWxlZFR5cGVzOiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLm1hcChmID0+IGVsZW1lbnRUeXBlc1tmLmluZGV4XSkuZmlsdGVyKEJvb2xlYW4pXG4gICAgICB9O1xuXG4gICAgICBsb2dnZXIuZGVidWcoJ0VsZW1lbnQgdHlwZSBkZXRlY3Rpb24gY29tcGxldGVkIHdpdGggZWFybHkgdGVybWluYXRpb24gb3B0aW1pemF0aW9uJywgYmF0Y2hSZXN1bHRzKTtcblxuICAgICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM4KTogQ2xlYXIgcmVwb3J0aW5nIG9mIHBhcnRpYWwgZmFpbHVyZXNcbiAgICAgIGlmIChzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1NvbWUgZWxlbWVudCB0eXBlIHNlYXJjaGVzIGZhaWxlZCBkdXJpbmcgYmF0Y2ggb3BlcmF0aW9uJywge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZmFpbHVyZXM6IHNlYXJjaFJlc3VsdHMuZmFpbHVyZXMubWFwKGYgPT4gKHtcbiAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlc1tmLmluZGV4XSB8fCAndW5rbm93bicsXG4gICAgICAgICAgICBlcnJvcjogZi5lcnJvci5zdWJzdHJpbmcoMCwgMTAwKSAvLyBUcnVuY2F0ZSBsb25nIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIHN1Y2Nlc3NSYXRlOiBgJHtzZWFyY2hSZXN1bHRzLmNvbXBsZXRlZFNlYXJjaGVzfS8ke3NlYXJjaFJlc3VsdHMudG90YWxTZWFyY2hlc31gLFxuICAgICAgICAgIGltcGFjdE9uUmVzdWx0czogc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCA+IDAgXG4gICAgICAgICAgICA/ICdObyBpbXBhY3QgLSBtYXRjaGVzIGZvdW5kIGluIHN1Y2Nlc3NmdWwgc2VhcmNoZXMnIFxuICAgICAgICAgICAgOiAnUG90ZW50aWFsIGltcGFjdCAtIG5vIG1hdGNoZXMgZm91bmQnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgZmFpbHVyZXMgYW5kIG5vIG1hdGNoZXMsIHByb3ZpZGUgYWN0aW9uYWJsZSBndWlkYW5jZVxuICAgICAgICBpZiAoc2VhcmNoUmVzdWx0cy5tYXRjaGVzLmxlbmd0aCA9PT0gMCAmJiBzZWFyY2hSZXN1bHRzLmZhaWx1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2dnZXIud2FybignQmF0Y2ggb3BlcmF0aW9uIGhhZCBmYWlsdXJlcyBhbmQgbm8gbWF0Y2hlcyBmb3VuZCcsIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICByZWNvbW1lbmRhdGlvbjogJ0NvbnNpZGVyIGNoZWNraW5nIGZpbGUgcGVybWlzc2lvbnMgb3IgcG9ydGZvbGlvIHN0cnVjdHVyZScsXG4gICAgICAgICAgICBmYWlsdXJlQ291bnQ6IHNlYXJjaFJlc3VsdHMuZmFpbHVyZXMubGVuZ3RoLFxuICAgICAgICAgICAgdG90YWxTZWFyY2hlczogc2VhcmNoUmVzdWx0cy50b3RhbFNlYXJjaGVzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHBlcmZvcm1hbmNlIGdhaW5zIGZyb20gZWFybHkgdGVybWluYXRpb25cbiAgICAgIGlmIChzZWFyY2hSZXN1bHRzLmVhcmx5VGVybWluYXRpb25UcmlnZ2VyZWQpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0Vhcmx5IHRlcm1pbmF0aW9uIG9wdGltaXphdGlvbiBhcHBsaWVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGV4YWN0TWF0Y2hUeXBlOiBzZWFyY2hSZXN1bHRzLmV4YWN0TWF0Y2g/LnR5cGUsXG4gICAgICAgICAgcGVyZm9ybWFuY2VHYWluOiBzZWFyY2hSZXN1bHRzLnBlcmZvcm1hbmNlR2FpbixcbiAgICAgICAgICBzZWFyY2hlc0NvbXBsZXRlZDogc2VhcmNoUmVzdWx0cy5jb21wbGV0ZWRTZWFyY2hlcyxcbiAgICAgICAgICBzZWFyY2hlc1RvdGFsOiBzZWFyY2hSZXN1bHRzLnRvdGFsU2VhcmNoZXNcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvdW5kOiBzZWFyY2hSZXN1bHRzLm1hdGNoZXMubGVuZ3RoID4gMCxcbiAgICAgICAgbWF0Y2hlczogc2VhcmNoUmVzdWx0cy5tYXRjaGVzXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgaW4gZWxlbWVudCB0eXBlIGRldGVjdGlvbicsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJldHVybiBlbXB0eSByZXN1bHQgb24gZGV0ZWN0aW9uIGZhaWx1cmVcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvdW5kOiBmYWxzZSxcbiAgICAgICAgbWF0Y2hlczogW11cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVYIElNUFJPVkVNRU5UOiBHZW5lcmF0ZSBuYW1lIHN1Z2dlc3Rpb25zIGZvciBzaW1pbGFyIGNvbnRlbnRcbiAgICogUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OIChUYXNrICM4KTogRW5oYW5jZWQgYmF0Y2ggb3BlcmF0aW9uIGhhbmRsaW5nIHdpdGggY2xlYXIgcGFydGlhbCBmYWlsdXJlIHJlcG9ydGluZ1xuICAgKiBIZWxwcyB1c2VycyBmaW5kIGNvbnRlbnQgd2hlbiBleGFjdCBtYXRjaGVzIGZhaWxcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVOYW1lU3VnZ2VzdGlvbnMoc2VhcmNoTmFtZTogc3RyaW5nKTogUHJvbWlzZTxBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9Pj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdWdnZXN0aW9uczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4gPSBbXTtcbiAgICAgIGNvbnN0IHNlYXJjaExvd2VyID0gc2VhcmNoTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgZWxlbWVudFR5cGVzID0gT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSk7XG4gICAgICBcbiAgICAgIC8vIFRyYWNrIGJhdGNoIG9wZXJhdGlvbiByZXN1bHRzIGZvciBiZXR0ZXIgZGlhZ25vc3RpY3NcbiAgICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IHtcbiAgICAgICAgc2VhcmNoTmFtZSxcbiAgICAgICAgdG90YWxUeXBlczogZWxlbWVudFR5cGVzLmxlbmd0aCxcbiAgICAgICAgc3VjY2Vzc2Z1bFNjYW5zOiAwLFxuICAgICAgICBmYWlsZWRTY2FuczogMCxcbiAgICAgICAgZmFpbHVyZURldGFpbHM6IFtdIGFzIEFycmF5PHsgdHlwZTogRWxlbWVudFR5cGU7IGVycm9yOiBzdHJpbmcgfT4sXG4gICAgICAgIHRvdGFsU3VnZ2VzdGlvbnM6IDAsXG4gICAgICAgIHN1Z2dlc3Rpb25zQnlUeXBlOiB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+XG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBQcm9jZXNzIGFsbCBlbGVtZW50IHR5cGVzIGZvciBzdWdnZXN0aW9uc1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBlbGVtZW50VHlwZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnREaXIgPSBwb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoZWxlbWVudFR5cGUpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIEdldCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeVxuICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUoZWxlbWVudERpciwgJyonLCB7XG4gICAgICAgICAgICBleHRlbnNpb25zOiBbJy5tZCcsICcuanNvbicsICcueWFtbCcsICcueW1sJ10sXG4gICAgICAgICAgICBwYXJ0aWFsTWF0Y2g6IGZhbHNlLFxuICAgICAgICAgICAgY2FjaGVSZXN1bHRzOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgbGV0IHR5cGVTdWdnZXN0aW9ucyA9IDA7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsZXMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgcGF0aC5leHRuYW1lKGZpbGVQYXRoKSk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgc2ltaWxhcml0eSB1c2luZyBzaW1wbGUgbWV0cmljc1xuICAgICAgICAgICAgICBpZiAodGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaExvd2VyLCBiYXNlbmFtZS50b0xvd2VyQ2FzZSgpKSA+IFNFQVJDSF9DT05GSUcuTUlOX1NJTUlMQVJJVFlfU0NPUkUpIHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGJhc2VuYW1lLFxuICAgICAgICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0eXBlU3VnZ2VzdGlvbnMrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlcywgcGF0aC5leHRuYW1lKGZpbGVzKSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaExvd2VyLCBiYXNlbmFtZS50b0xvd2VyQ2FzZSgpKSA+IFNFQVJDSF9DT05GSUcuTUlOX1NJTUlMQVJJVFlfU0NPUkUpIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogYmFzZW5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHR5cGVTdWdnZXN0aW9ucysrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBiYXRjaFJlc3VsdHMuc3VjY2Vzc2Z1bFNjYW5zKys7XG4gICAgICAgICAgYmF0Y2hSZXN1bHRzLnN1Z2dlc3Rpb25zQnlUeXBlW2VsZW1lbnRUeXBlXSA9IHR5cGVTdWdnZXN0aW9ucztcbiAgICAgICAgICBcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT04gKFRhc2sgIzgpOiBUcmFjayBhbmQgcmVwb3J0IHBhcnRpYWwgZmFpbHVyZXNcbiAgICAgICAgICBiYXRjaFJlc3VsdHMuZmFpbGVkU2NhbnMrKztcbiAgICAgICAgICBiYXRjaFJlc3VsdHMuZmFpbHVyZURldGFpbHMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBMb2cgaW5kaXZpZHVhbCBmYWlsdXJlcyBmb3IgZGlhZ25vc3RpY3NcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBzY2FuIGVsZW1lbnQgdHlwZSBmb3Igc3VnZ2VzdGlvbnMnLCB7XG4gICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgYmF0Y2hSZXN1bHRzLnRvdGFsU3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucy5sZW5ndGg7XG4gICAgICBcbiAgICAgIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTiAoVGFzayAjOCk6IENvbXByZWhlbnNpdmUgYmF0Y2ggb3BlcmF0aW9uIHJlcG9ydGluZ1xuICAgICAgbG9nZ2VyLmRlYnVnKCdOYW1lIHN1Z2dlc3Rpb24gYmF0Y2ggb3BlcmF0aW9uIGNvbXBsZXRlZCcsIHtcbiAgICAgICAgLi4uYmF0Y2hSZXN1bHRzLFxuICAgICAgICBzdWNjZXNzUmF0ZTogYCR7YmF0Y2hSZXN1bHRzLnN1Y2Nlc3NmdWxTY2Fuc30vJHtiYXRjaFJlc3VsdHMudG90YWxUeXBlc31gLFxuICAgICAgICAvLyBEb24ndCBsb2cgZnVsbCBmYWlsdXJlIGRldGFpbHMgYXQgZGVidWcgbGV2ZWwgdG8gYXZvaWQgc3BhbVxuICAgICAgICBoYXNGYWlsdXJlczogYmF0Y2hSZXN1bHRzLmZhaWxlZFNjYW5zID4gMFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlcG9ydCBmYWlsdXJlcyBjbGVhcmx5IGlmIHRoZXkgb2NjdXJyZWRcbiAgICAgIGlmIChiYXRjaFJlc3VsdHMuZmFpbGVkU2NhbnMgPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdTb21lIGVsZW1lbnQgdHlwZSBzY2FucyBmYWlsZWQgZHVyaW5nIG5hbWUgc3VnZ2VzdGlvbiBnZW5lcmF0aW9uJywge1xuICAgICAgICAgIHNlYXJjaE5hbWUsXG4gICAgICAgICAgZmFpbGVkVHlwZXM6IGJhdGNoUmVzdWx0cy5mYWlsdXJlRGV0YWlscy5tYXAoZiA9PiBmLnR5cGUpLFxuICAgICAgICAgIHN1Y2Nlc3NmdWxUeXBlczogYmF0Y2hSZXN1bHRzLnN1Y2Nlc3NmdWxTY2FucyxcbiAgICAgICAgICBpbXBhY3RPblJlc3VsdHM6IGJhdGNoUmVzdWx0cy50b3RhbFN1Z2dlc3Rpb25zID4gMCBcbiAgICAgICAgICAgID8gJ1BhcnRpYWwgaW1wYWN0IC0gc3VnZ2VzdGlvbnMgZm91bmQgZnJvbSBzdWNjZXNzZnVsIHNjYW5zJyBcbiAgICAgICAgICAgIDogJ1BvdGVudGlhbCBpbXBhY3QgLSBubyBzdWdnZXN0aW9ucyBnZW5lcmF0ZWQnLFxuICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiBiYXRjaFJlc3VsdHMudG90YWxTdWdnZXN0aW9ucyA9PT0gMCAmJiBiYXRjaFJlc3VsdHMuZmFpbGVkU2NhbnMgPiAwXG4gICAgICAgICAgICA/ICdDaGVjayBwb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZSBhbmQgZmlsZSBwZXJtaXNzaW9ucydcbiAgICAgICAgICAgIDogJ1N1Z2dlc3Rpb24gZ2VuZXJhdGlvbiBwYXJ0aWFsbHkgc3VjY2Vzc2Z1bCBkZXNwaXRlIHNvbWUgZmFpbHVyZXMnXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTb3J0IGJ5IHNpbWlsYXJpdHkgKGhpZ2hlciBpcyBiZXR0ZXIpIGFuZCByZXR1cm4gdG9wIHN1Z2dlc3Rpb25zXG4gICAgICBjb25zdCBzb3J0ZWRTdWdnZXN0aW9ucyA9IHN1Z2dlc3Rpb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3Qgc2ltQSA9IHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2hMb3dlciwgYS5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBjb25zdCBzaW1CID0gdGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaExvd2VyLCBiLm5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIHJldHVybiBzaW1CIC0gc2ltQTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ05hbWUgc3VnZ2VzdGlvbnMgZ2VuZXJhdGVkIHN1Y2Nlc3NmdWxseScsIHtcbiAgICAgICAgc2VhcmNoTmFtZSxcbiAgICAgICAgdG90YWxTdWdnZXN0aW9uczogc29ydGVkU3VnZ2VzdGlvbnMubGVuZ3RoLFxuICAgICAgICB0b3BTdWdnZXN0aW9uczogc29ydGVkU3VnZ2VzdGlvbnMuc2xpY2UoMCwgMykubWFwKHMgPT4gcy5uYW1lKVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBzb3J0ZWRTdWdnZXN0aW9ucztcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGdlbmVyYXRlIG5hbWUgc3VnZ2VzdGlvbnMgLSBiYXRjaCBvcGVyYXRpb24gZmFpbGVkIGNvbXBsZXRlbHknLCB7IFxuICAgICAgICBzZWFyY2hOYW1lLCBcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgcmVjb21tZW5kYXRpb246ICdDaGVjayBwb3J0Zm9saW8gc3RydWN0dXJlIGFuZCBwZXJtaXNzaW9ucydcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFNpbXBsZSBzaW1pbGFyaXR5IGNhbGN1bGF0aW9uIHVzaW5nIExldmVuc2h0ZWluLWxpa2UgYXBwcm9hY2hcbiAgICogUmV0dXJucyB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEsIHdoZXJlIDEgaXMgaWRlbnRpY2FsXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVNpbWlsYXJpdHkoc3RyMTogc3RyaW5nLCBzdHIyOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIEhhbmRsZSBleGFjdCBtYXRjaGVzXG4gICAgaWYgKHN0cjEgPT09IHN0cjIpIHJldHVybiAxO1xuICAgIFxuICAgIC8vIEhhbmRsZSBzdWJzdHJpbmcgbWF0Y2hlc1xuICAgIGlmIChzdHIxLmluY2x1ZGVzKHN0cjIpIHx8IHN0cjIuaW5jbHVkZXMoc3RyMSkpIHJldHVybiAwLjg7XG4gICAgXG4gICAgLy8gSGFuZGxlIHBhcnRpYWwgbWF0Y2hlc1xuICAgIGNvbnN0IGxvbmdlciA9IHN0cjEubGVuZ3RoID4gc3RyMi5sZW5ndGggPyBzdHIxIDogc3RyMjtcbiAgICBjb25zdCBzaG9ydGVyID0gc3RyMS5sZW5ndGggPiBzdHIyLmxlbmd0aCA/IHN0cjIgOiBzdHIxO1xuICAgIFxuICAgIGlmIChsb25nZXIubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICBcbiAgICAvLyBDb3VudCBjb21tb24gY2hhcmFjdGVyc1xuICAgIGxldCBjb21tb24gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hvcnRlci5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxvbmdlci5pbmNsdWRlcyhzaG9ydGVyW2ldKSkge1xuICAgICAgICBjb21tb24rKztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGNvbW1vbiAvIGxvbmdlci5sZW5ndGg7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVWCBJTVBST1ZFTUVOVDogU2F2ZSBlbGVtZW50IHdpdGggYXV0b21hdGljIHJldHJ5IGxvZ2ljIGZvciB0cmFuc2llbnQgZmFpbHVyZXNcbiAgICogSGFuZGxlcyBjb21tb24gR2l0SHViIEFQSSBpc3N1ZXMgbGlrZSByYXRlIGxpbWl0cyBhbmQgdGVtcG9yYXJ5IG5ldHdvcmsgcHJvYmxlbXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUVsZW1lbnRXaXRoUmV0cnkoXG4gICAgYWRhcHRlcjogUG9ydGZvbGlvRWxlbWVudEFkYXB0ZXIsIFxuICAgIGVsZW1lbnROYW1lOiBzdHJpbmcsIFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSxcbiAgICBtYXhSZXRyaWVzOiBudW1iZXIgPSBSRVRSWV9DT05GSUcuTUFYX0FUVEVNUFRTXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGxldCBsYXN0RXJyb3I6IGFueSA9IG51bGw7XG4gICAgXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEF0dGVtcHRpbmcgdG8gc2F2ZSBlbGVtZW50IChhdHRlbXB0ICR7YXR0ZW1wdH0vJHttYXhSZXRyaWVzfSlgLCB7XG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgYXR0ZW1wdFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGZpbGVVcmwgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuc2F2ZUVsZW1lbnQoYWRhcHRlciwgdHJ1ZSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoZmlsZVVybCkge1xuICAgICAgICAgIGlmIChhdHRlbXB0ID4gMSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYEVsZW1lbnQgc2F2ZWQgc3VjY2Vzc2Z1bGx5IGFmdGVyICR7YXR0ZW1wdH0gYXR0ZW1wdHNgLCB7XG4gICAgICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgZmlsZVVybFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaWxlVXJsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBJZiBzYXZlRWxlbWVudCByZXR1cm5zIG51bGwsIHRyZWF0IGFzIGEgZmFpbHVyZSBidXQgZG9uJ3QgcmV0cnkgaW1tZWRpYXRlbHlcbiAgICAgICAgbGFzdEVycm9yID0gbmV3IEVycm9yKGBzYXZlRWxlbWVudCByZXR1cm5lZCBudWxsIG9uIGF0dGVtcHQgJHthdHRlbXB0fWApO1xuICAgICAgICBcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3I7XG4gICAgICAgIGNvbnN0IGlzUmV0cnlhYmxlID0gdGhpcy5pc1JldHJ5YWJsZUVycm9yKGVycm9yKTtcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci53YXJuKGBTYXZlIGF0dGVtcHQgJHthdHRlbXB0fSBmYWlsZWRgLCB7XG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICBpc1JldHJ5YWJsZSxcbiAgICAgICAgICB3aWxsUmV0cnk6IGlzUmV0cnlhYmxlICYmIGF0dGVtcHQgPCBtYXhSZXRyaWVzXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSByZXRyeWFibGUgZXJyb3IsIGZhaWwgaW1tZWRpYXRlbHlcbiAgICAgICAgaWYgKCFpc1JldHJ5YWJsZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignTm9uLXJldHJ5YWJsZSBlcnJvciBlbmNvdW50ZXJlZCwgYWJvcnRpbmcgcmV0cmllcycsIHtcbiAgICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBtb3JlIGF0dGVtcHRzLCB3YWl0IGJlZm9yZSByZXRyeWluZ1xuICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heFJldHJpZXMpIHtcbiAgICAgICAgICBjb25zdCBkZWxheSA9IGNhbGN1bGF0ZVJldHJ5RGVsYXkoYXR0ZW1wdCk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBXYWl0aW5nICR7ZGVsYXl9bXMgYmVmb3JlIHJldHJ5YCwgeyBhdHRlbXB0LCBkZWxheSB9KTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBBbGwgYXR0ZW1wdHMgZmFpbGVkXG4gICAgbG9nZ2VyLmVycm9yKGBBbGwgJHttYXhSZXRyaWVzfSBzYXZlIGF0dGVtcHRzIGZhaWxlZGAsIHtcbiAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgZWxlbWVudFR5cGUsXG4gICAgICBsYXN0RXJyb3I6IGxhc3RFcnJvcj8ubWVzc2FnZVxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIFxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIGFuIGVycm9yIGlzIHdvcnRoIHJldHJ5aW5nXG4gICAqIFJldHJ5YWJsZTogbmV0d29yayBpc3N1ZXMsIHJhdGUgbGltaXRzLCB0ZW1wb3JhcnkgR2l0SHViIEFQSSBwcm9ibGVtc1xuICAgKiBOb24tcmV0cnlhYmxlOiBhdXRoZW50aWNhdGlvbiBpc3N1ZXMsIHZhbGlkYXRpb24gZXJyb3JzLCBwZXJtYW5lbnQgZmFpbHVyZXNcbiAgICovXG4gIHByaXZhdGUgaXNSZXRyeWFibGVFcnJvcihlcnJvcjogYW55KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3I/Lm1lc3NhZ2U/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XG4gICAgY29uc3QgZXJyb3JDb2RlID0gZXJyb3I/LmNvZGU7XG4gICAgY29uc3Qgc3RhdHVzQ29kZSA9IGVycm9yPy5zdGF0dXMgfHwgZXJyb3I/LnN0YXR1c0NvZGU7XG4gICAgXG4gICAgLy8gTmV0d29yayBhbmQgdGltZW91dCBlcnJvcnNcbiAgICBpZiAoZXJyb3JDb2RlID09PSAnRU5PVEZPVU5EJyB8fCBlcnJvckNvZGUgPT09ICdFQ09OTlJFU0VUJyB8fCBlcnJvckNvZGUgPT09ICdFVElNRURPVVQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gR2l0SHViIEFQSSByYXRlIGxpbWl0c1xuICAgIGlmIChzdGF0dXNDb2RlID09PSA0MjkgfHwgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdyYXRlIGxpbWl0JykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBUZW1wb3JhcnkgR2l0SHViIEFQSSBpc3N1ZXNcbiAgICBpZiAoc3RhdHVzQ29kZSA+PSA1MDAgJiYgc3RhdHVzQ29kZSA8IDYwMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIFRlbXBvcmFyeSBHaXRIdWIgQVBJIHByb2JsZW1zXG4gICAgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygndGVtcG9yYXJpbHkgdW5hdmFpbGFibGUnKSB8fCBcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdzZXJ2aWNlIHVuYXZhaWxhYmxlJykgfHxcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdpbnRlcm5hbCBzZXJ2ZXIgZXJyb3InKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIENvbm5lY3Rpb24gaXNzdWVzXG4gICAgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnY29ubmVjdGlvbicpICYmIFxuICAgICAgICAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd0aW1lb3V0JykgfHwgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdyZXNldCcpKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIERvbid0IHJldHJ5IGF1dGhlbnRpY2F0aW9uIG9yIHBlcm1pc3Npb24gaXNzdWVzXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwMSB8fCBzdGF0dXNDb2RlID09PSA0MDMgfHwgXG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygndW5hdXRob3JpemVkJykgfHwgXG4gICAgICAgIGVycm9yTWVzc2FnZS5pbmNsdWRlcygnZm9yYmlkZGVuJykgfHxcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdhdXRoZW50aWNhdGlvbicpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIERvbid0IHJldHJ5IHZhbGlkYXRpb24gZXJyb3JzXG4gICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwMCB8fCBzdGF0dXNDb2RlID09PSA0MjIgfHxcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdpbnZhbGlkJykgfHxcbiAgICAgICAgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd2YWxpZGF0aW9uJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gRGVmYXVsdCB0byBub3QgcmV0cnlpbmcgZm9yIHVua25vd24gZXJyb3JzIHRvIGF2b2lkIGluZmluaXRlIGxvb3BzXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59Il19