@dollhousemcp/mcp-server 1.7.4 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/README.github.md +90 -1
  3. package/README.md +1 -1
  4. package/README.md.backup +90 -1
  5. package/README.npm.md +1 -1
  6. package/dist/collection/CollectionBrowser.js +2 -2
  7. package/dist/collection/CollectionSearch.js +3 -3
  8. package/dist/collection/PersonaDetails.js +2 -2
  9. package/dist/config/ConfigManager.d.ts +20 -0
  10. package/dist/config/ConfigManager.d.ts.map +1 -1
  11. package/dist/config/ConfigManager.js +48 -4
  12. package/dist/generated/version.d.ts +2 -2
  13. package/dist/generated/version.js +3 -3
  14. package/dist/handlers/ConfigHandler.d.ts +30 -0
  15. package/dist/handlers/ConfigHandler.d.ts.map +1 -1
  16. package/dist/handlers/ConfigHandler.js +149 -21
  17. package/dist/index.d.ts +4 -6
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +73 -52
  20. package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -1
  21. package/dist/portfolio/GitHubPortfolioIndexer.js +8 -5
  22. package/dist/portfolio/PortfolioIndexManager.d.ts +1 -1
  23. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  24. package/dist/portfolio/PortfolioRepoManager.d.ts +16 -2
  25. package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -1
  26. package/dist/portfolio/PortfolioRepoManager.js +95 -18
  27. package/dist/portfolio/PortfolioSyncManager.d.ts.map +1 -1
  28. package/dist/portfolio/PortfolioSyncManager.js +23 -15
  29. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  30. package/dist/security/audit/config/suppressions.js +11 -1
  31. package/dist/server/ServerSetup.d.ts.map +1 -1
  32. package/dist/server/ServerSetup.js +11 -6
  33. package/dist/server/tools/CollectionTools.js +6 -6
  34. package/dist/server/tools/ConfigTools.js +2 -2
  35. package/dist/server/tools/ConfigToolsV2.js +5 -5
  36. package/dist/server/tools/PortfolioTools.d.ts.map +1 -1
  37. package/dist/server/tools/PortfolioTools.js +16 -5
  38. package/dist/server/types.d.ts +2 -0
  39. package/dist/server/types.d.ts.map +1 -1
  40. package/dist/server/types.js +1 -1
  41. package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -1
  42. package/dist/tools/portfolio/submitToPortfolioTool.js +6 -5
  43. package/package.json +7 -6
@@ -1 +1 @@
1
- {"version":3,"file":"GitHubPortfolioIndexer.d.ts","sourceRoot":"","sources":["../../src/portfolio/GitHubPortfolioIndexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAOzC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,IAAI,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuC;IAC9D,OAAO,CAAC,MAAM,CAAC,YAAY,CAAS;IAEpC,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;IAEnD,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,gBAAgB,CAAwB;IAEhD,OAAO;IAQP;;OAEG;WACW,WAAW,IAAI,sBAAsB;IAgBnD;;OAEG;IACU,QAAQ,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkDnE;;OAEG;IACI,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgBlD;;OAEG;IACI,UAAU,IAAI,IAAI;IAUzB;;OAEG;IACI,aAAa,IAAI;QACtB,aAAa,EAAE,OAAO,CAAC;QACvB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC;QACjB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;KACvB;IAUD;;OAEG;YACW,UAAU;IAmDxB;;OAEG;YACW,sBAAsB;IAapC;;OAEG;YACW,gBAAgB;IA0D9B;;OAEG;YACW,aAAa;IAsD3B;;OAEG;YACW,uBAAuB;IA8DrC;;OAEG;YACW,sBAAsB;IAsDpC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA6BhC;;OAEG;YACW,iBAAiB;IAS/B;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAiBzB"}
1
+ {"version":3,"file":"GitHubPortfolioIndexer.d.ts","sourceRoot":"","sources":["../../src/portfolio/GitHubPortfolioIndexer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQzC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,IAAI,CAAC;IAClB,QAAQ,EAAE,GAAG,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuC;IAC9D,OAAO,CAAC,MAAM,CAAC,YAAY,CAAS;IAEpC,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;IAEnD,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,gBAAgB,CAAwB;IAEhD,OAAO;IAQP;;OAEG;WACW,WAAW,IAAI,sBAAsB;IAgBnD;;OAEG;IACU,QAAQ,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkDnE;;OAEG;IACI,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgBlD;;OAEG;IACI,UAAU,IAAI,IAAI;IAUzB;;OAEG;IACI,aAAa,IAAI;QACtB,aAAa,EAAE,OAAO,CAAC;QACvB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC;QACjB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,aAAa,EAAE,MAAM,CAAC;KACvB;IAUD;;OAEG;YACW,UAAU;IAmDxB;;OAEG;YACW,sBAAsB;IAapC;;OAEG;YACW,gBAAgB;IA0D9B;;OAEG;YACW,aAAa;IAsD3B;;OAEG;YACW,uBAAuB;IA8DrC;;OAEG;YACW,sBAAsB;IAwDpC;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA6BhC;;OAEG;YACW,iBAAiB;IAS/B;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAiBzB"}
@@ -16,6 +16,7 @@ import { SecurityMonitor } from '../security/securityMonitor.js';
16
16
  import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
17
17
  import { ErrorHandler, ErrorCategory } from '../utils/ErrorHandler.js';
18
18
  import { APICache } from '../cache/APICache.js';
19
+ import { getPortfolioRepositoryName } from '../config/portfolioConfig.js';
19
20
  export class GitHubPortfolioIndexer {
20
21
  static instance = null;
21
22
  static instanceLock = false;
@@ -31,7 +32,7 @@ export class GitHubPortfolioIndexer {
31
32
  constructor() {
32
33
  this.apiCache = new APICache(); // Uses default settings
33
34
  this.rateLimitTracker = new Map();
34
- this.portfolioRepoManager = new PortfolioRepoManager();
35
+ this.portfolioRepoManager = new PortfolioRepoManager(getPortfolioRepositoryName());
35
36
  logger.debug('GitHubPortfolioIndexer created');
36
37
  }
37
38
  /**
@@ -147,7 +148,7 @@ export class GitHubPortfolioIndexer {
147
148
  try {
148
149
  // Get GitHub username from token
149
150
  const username = await this.getGitHubUsername();
150
- const repository = 'dollhouse-portfolio';
151
+ const repository = this.portfolioRepoManager.getRepositoryName();
151
152
  // Check if portfolio repository exists
152
153
  const repoExists = await this.portfolioRepoManager.checkPortfolioExists(username);
153
154
  if (!repoExists) {
@@ -357,7 +358,9 @@ export class GitHubPortfolioIndexer {
357
358
  async createGitHubIndexEntry(username, repository, elementType, fileInfo) {
358
359
  try {
359
360
  // Parse metadata from filename or fetch content if needed
360
- const name = fileInfo.name.replace('.md', '').replace(/-/g, ' ');
361
+ // FIX: Keep original filename format to match local file expectations
362
+ // Previously: .replace(/-/g, ' ') converted hyphens to spaces causing sync mismatch
363
+ const name = fileInfo.name.replace('.md', '');
361
364
  const entry = {
362
365
  path: fileInfo.path,
363
366
  name,
@@ -479,7 +482,7 @@ export class GitHubPortfolioIndexer {
479
482
  createEmptyIndex(username, repository) {
480
483
  const index = {
481
484
  username: username || 'unknown',
482
- repository: repository || 'dollhouse-portfolio',
485
+ repository: repository || this.portfolioRepoManager.getRepositoryName(),
483
486
  lastUpdated: new Date(),
484
487
  elements: new Map(),
485
488
  totalElements: 0,
@@ -492,4 +495,4 @@ export class GitHubPortfolioIndexer {
492
495
  return index;
493
496
  }
494
497
  }
495
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViUG9ydGZvbGlvSW5kZXhlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vR2l0SHViUG9ydGZvbGlvSW5kZXhlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBb0NoRCxNQUFNLE9BQU8sc0JBQXNCO0lBQ3pCLE1BQU0sQ0FBQyxRQUFRLEdBQWtDLElBQUksQ0FBQztJQUN0RCxNQUFNLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUU1QixLQUFLLEdBQWdDLElBQUksQ0FBQztJQUMxQyxTQUFTLEdBQWdCLElBQUksQ0FBQztJQUNyQixHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxhQUFhO0lBQzVDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixlQUFlLEdBQWdCLElBQUksQ0FBQztJQUMzQixpQkFBaUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLHlCQUF5QjtJQUVyRSxvQkFBb0IsQ0FBdUI7SUFDM0MsUUFBUSxDQUFXO0lBQ25CLGdCQUFnQixDQUF3QjtJQUVoRDtRQUNFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtRQUN4RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxvQkFBb0IsRUFBRSxDQUFDO1FBRXZELE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsV0FBVztRQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7WUFDeEYsQ0FBQztZQUVELElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztnQkFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHNCQUFzQixFQUFFLENBQUM7WUFDL0MsQ0FBQztvQkFBUyxDQUFDO2dCQUNULElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUs7UUFDakMsSUFBSSxDQUFDO1lBQ0gsOEJBQThCO1lBQzlCLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDakMsQ0FBQztZQUVELDRDQUE0QztZQUM1QyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sQ0FBQyxLQUFLLENBQUMseUNBQXlDLEVBQUU7b0JBQ3RELFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVE7b0JBQzdCLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWE7b0JBQ3ZDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUztpQkFDeEUsQ0FBQyxDQUFDO2dCQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNwQixDQUFDO1lBRUQsMERBQTBEO1lBQzFELElBQUksQ0FBQztnQkFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0VBQXdFLEVBQUU7b0JBQ3BGLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2lCQUM5RCxDQUFDLENBQUM7Z0JBRUgsa0NBQWtDO2dCQUNsQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZixNQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxFQUFFO3dCQUNoRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRO3dCQUM3QixHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7cUJBQ3hFLENBQUMsQ0FBQztvQkFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7Z0JBQ3BCLENBQUM7Z0JBRUQsb0NBQW9DO2dCQUNwQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2pDLENBQUM7UUFFSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLFlBQVksQ0FBQyxRQUFRLENBQUMsaUNBQWlDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFaEUsb0NBQW9DO1lBQ3BDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNwQixDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0kscUJBQXFCLENBQUMsTUFBYztRQUN6QyxNQUFNLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUVqRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUVsQyxxQ0FBcUM7UUFDckMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO1lBQy9CLElBQUksRUFBRSw4QkFBOEI7WUFDcEMsUUFBUSxFQUFFLEtBQUs7WUFDZixNQUFNLEVBQUUsOENBQThDO1lBQ3RELE9BQU8sRUFBRSx3Q0FBd0MsTUFBTSxFQUFFO1lBQ3pELFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRTtTQUNyQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXRCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhO1FBT2xCLE9BQU87WUFDTCxhQUFhLEVBQUUsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJO1lBQ2xDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQzdCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkMsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsYUFBYSxJQUFJLENBQUM7U0FDOUMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxVQUFVO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFFeEQsSUFBSSxDQUFDO1lBQ0gsaUNBQWlDO1lBQ2pDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDaEQsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUM7WUFFekMsdUNBQXVDO1lBQ3ZDLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNyRCxDQUFDO1lBRUQsNENBQTRDO1lBQzVDLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUV0RSxlQUFlO1lBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDOUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFFNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FBQztZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxFQUFFO2dCQUN6RCxRQUFRO2dCQUNSLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtnQkFDbEMsUUFBUSxFQUFFLEdBQUcsUUFBUSxJQUFJO2dCQUN6QixrQkFBa0IsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLFNBQVM7YUFDbkQsQ0FBQyxDQUFDO1lBRUgscUJBQXFCO1lBQ3JCLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHlCQUF5QjtnQkFDL0IsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLG1DQUFtQztnQkFDM0MsT0FBTyxFQUFFLGlDQUFpQyxLQUFLLENBQUMsYUFBYSxnQkFBZ0IsUUFBUSxJQUFJO2dCQUN6RixRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFO2FBQ3JFLENBQUMsQ0FBQztZQUVILE9BQU8sS0FBSyxDQUFDO1FBRWYsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO1lBQ3hDLFlBQVksQ0FBQyxRQUFRLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztZQUNoRixNQUFNLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLHdDQUF3QyxFQUFFLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM3RyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLHNCQUFzQixDQUFDLFFBQWdCLEVBQUUsVUFBa0I7UUFDdkUsNkRBQTZEO1FBQzdELElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFBQyxPQUFPLFlBQVksRUFBRSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0RBQWdELEVBQUU7Z0JBQzdELEtBQUssRUFBRSxZQUFZLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO2FBQ25GLENBQUMsQ0FBQztZQUVILE9BQU8sTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsVUFBa0I7UUFDakUsTUFBTSxLQUFLLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBNENiLENBQUM7UUFFRixNQUFNLFNBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBRXhELGlFQUFpRTtRQUNqRSwyQ0FBMkM7UUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1FBRXhFLG9EQUFvRDtRQUNwRCxpRkFBaUY7UUFDakYsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBZ0IsRUFBRSxVQUFrQjtRQUM5RCxNQUFNLGtCQUFrQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztRQUVsRix3Q0FBd0M7UUFDeEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUM1RCxVQUFVLGtCQUFrQixJQUFJLFVBQVUsRUFBRSxDQUM3QyxDQUFDO1FBRUYsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUNoRSxVQUFVLGtCQUFrQixJQUFJLFVBQVUsZUFBZSxDQUMxRCxDQUFDO1FBRUYsbUJBQW1CO1FBQ25CLE1BQU0sS0FBSyxHQUF5QjtZQUNsQyxRQUFRLEVBQUUsa0JBQWtCO1lBQzVCLFVBQVU7WUFDVixXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ3pELFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUNuQixhQUFhLEVBQUUsQ0FBQztZQUNoQixHQUFHLEVBQUUsWUFBWSxDQUFDLEdBQUc7U0FDdEIsQ0FBQztRQUVGLCtCQUErQjtRQUMvQixLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxNQUFNLENBQUMsSUFBSSxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFFL0UsS0FBSyxNQUFNLFdBQVcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDO2dCQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxXQUFXLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDaEcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QyxLQUFLLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBRXRDLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLE9BQU8sQ0FBQyxNQUFNLElBQUksV0FBVyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUM5RSxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLFdBQVcsc0NBQXNDLENBQUMsQ0FBQztnQkFDM0UsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLFdBQVcsd0JBQXdCLEVBQUU7b0JBQ3BFLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUM3RCxXQUFXO2lCQUNaLENBQUMsQ0FBQztnQkFDSCxvQ0FBb0M7WUFDdEMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyx1QkFBdUIsQ0FDbkMsUUFBZ0IsRUFDaEIsVUFBa0IsRUFDbEIsV0FBd0I7UUFFeEIsSUFBSSxDQUFDO1lBQ0gsbURBQW1EO1lBQ25ELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FDNUQsVUFBVSxRQUFRLElBQUksVUFBVSxhQUFhLFdBQVcsRUFBRSxDQUMzRCxDQUFDO1lBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1lBRUQsTUFBTSxPQUFPLEdBQXVCLEVBQUUsQ0FBQztZQUN2QyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7WUFFckQsa0RBQWtEO1lBQ2xELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDeEQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNLGFBQWEsR0FBRyxLQUFLO3FCQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDakUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBRXJGLE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFFN0QsS0FBSyxNQUFNLE1BQU0sSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDbEMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ2xELE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM3QixDQUFDO2dCQUNILENBQUM7Z0JBRUQsbURBQW1EO2dCQUNuRCxJQUFJLENBQUMsR0FBRyxhQUFhLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUN4QyxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFDO1FBRWpCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsbURBQW1EO1lBQ25ELDZEQUE2RDtZQUM3RCxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztnQkFDM0IsaURBQWlEO2dCQUNqRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDN0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztvQkFDeEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLFdBQVcscUVBQXFFLENBQUMsQ0FBQztvQkFDNUcsT0FBTyxFQUFFLENBQUM7Z0JBQ1osQ0FBQztnQkFFRCxxQ0FBcUM7Z0JBQ3JDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLFdBQVcsS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUNsRSxDQUFDO1lBRUQsd0JBQXdCO1lBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLFdBQVcsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxzQkFBc0IsQ0FDbEMsUUFBZ0IsRUFDaEIsVUFBa0IsRUFDbEIsV0FBd0IsRUFDeEIsUUFBYTtRQUViLElBQUksQ0FBQztZQUNILDBEQUEwRDtZQUMxRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVqRSxNQUFNLEtBQUssR0FBcUI7Z0JBQzlCLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsSUFBSTtnQkFDSixXQUFXO2dCQUNYLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRztnQkFDakIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRO2dCQUMxQixXQUFXLEVBQUUsUUFBUSxDQUFDLFlBQVk7Z0JBQ2xDLFlBQVksRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLDZEQUE2RDtnQkFDdkYsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQzthQUN6QixDQUFDO1lBRUYsK0NBQStDO1lBQy9DLCtFQUErRTtZQUMvRSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDLHdCQUF3QjtnQkFDcEUsSUFBSSxDQUFDO29CQUNILGdFQUFnRTtvQkFDaEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUNwRCxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDdEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUV4RCxJQUFJLFFBQVEsQ0FBQyxJQUFJO3dCQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztvQkFDOUMsSUFBSSxRQUFRLENBQUMsV0FBVzt3QkFBRSxLQUFLLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7b0JBQ25FLElBQUksUUFBUSxDQUFDLE9BQU87d0JBQUUsS0FBSyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO29CQUN2RCxJQUFJLFFBQVEsQ0FBQyxNQUFNO3dCQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDdEQsQ0FBQztnQkFBQyxPQUFPLGFBQWEsRUFBRSxDQUFDO29CQUN2QixnREFBZ0Q7b0JBQ2hELE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUU7d0JBQ2hELElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTt3QkFDbkIsS0FBSyxFQUFFLGFBQWEsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7cUJBQ3RGLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sS0FBSyxDQUFDO1FBRWYsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxFQUFFO2dCQUNsRCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ25CLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQzlELENBQUMsQ0FBQztZQUNILE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLHdCQUF3QixDQUFDLE9BQWU7UUFNOUMsTUFBTSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBRXpCLDhEQUE4RDtRQUM5RCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNoRSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFeEMsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3ZELElBQUksU0FBUztnQkFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVuRCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDOUQsSUFBSSxTQUFTO2dCQUFFLFFBQVEsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRTFELE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM3RCxJQUFJLFlBQVk7Z0JBQUUsUUFBUSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFNUQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzNELElBQUksV0FBVztnQkFBRSxRQUFRLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRCxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGlCQUFpQjtRQUM3QixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEUsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3hCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO1FBQ3JHLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25DLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xELE9BQU8sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCO1FBQ3RCLDJCQUEyQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2xELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDeEUsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sMENBQTBDO2dCQUMxQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO2dCQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUVELFlBQVk7UUFDWixPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLFFBQWlCLEVBQUUsVUFBbUI7UUFDN0QsTUFBTSxLQUFLLEdBQXlCO1lBQ2xDLFFBQVEsRUFBRSxRQUFRLElBQUksU0FBUztZQUMvQixVQUFVLEVBQUUsVUFBVSxJQUFJLHFCQUFxQjtZQUMvQyxXQUFXLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDdkIsUUFBUSxFQUFFLElBQUksR0FBRyxFQUFFO1lBQ25CLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLEdBQUcsRUFBRSxFQUFFO1NBQ1IsQ0FBQztRQUVGLHFDQUFxQztRQUNyQyxLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2l0SHViIFBvcnRmb2xpbyBJbmRleGVyIC0gRmV0Y2hlcyBhbmQgaW5kZXhlcyB1c2VyJ3MgR2l0SHViIHBvcnRmb2xpbyBmb3IgZmFzdCBzZWFyY2hpbmdcbiAqIFxuICogRmVhdHVyZXM6XG4gKiAtIFNpbmdsZXRvbiBwYXR0ZXJuIGZvciBlZmZpY2llbnQgcmVzb3VyY2UgdXNhZ2VcbiAqIC0gU21hcnQgY2FjaGluZyB3aXRoIFRUTCBhbmQgaW52YWxpZGF0aW9uIGFmdGVyIHVzZXIgYWN0aW9uc1xuICogLSBHcmFwaFFML1JFU1QgQVBJIGludGVncmF0aW9uIGZvciBlZmZpY2llbnQgZmV0Y2hpbmdcbiAqIC0gUmF0ZSBsaW1pdGluZyBhbmQgYXV0aGVudGljYXRpb24gaGFuZGxpbmdcbiAqIC0gRmFsbGJhY2sgc3RyYXRlZ3kgZm9yIHJlc2lsaWVudCBvcGVyYXRpb25cbiAqIC0gUGVyZm9ybWFuY2Ugb3B0aW1pemVkIGZvciAxMDAwKyBwb3J0Zm9saW8gZWxlbWVudHNcbiAqL1xuXG5pbXBvcnQgeyBQb3J0Zm9saW9SZXBvTWFuYWdlciB9IGZyb20gJy4vUG9ydGZvbGlvUmVwb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgVG9rZW5NYW5hZ2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvdG9rZW5NYW5hZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRUeXBlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBFcnJvckNhdGVnb3J5IH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IEFQSUNhY2hlIH0gZnJvbSAnLi4vY2FjaGUvQVBJQ2FjaGUuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkluZGV4RW50cnkge1xuICBwYXRoOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGF1dGhvcj86IHN0cmluZztcbiAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICBzaGE6IHN0cmluZzsgLy8gRmlsZSBTSEEgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgaHRtbFVybDogc3RyaW5nOyAvLyBMaW5rIHRvIEdpdEh1YlxuICBkb3dubG9hZFVybDogc3RyaW5nO1xuICBsYXN0TW9kaWZpZWQ6IERhdGU7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRIdWJQb3J0Zm9saW9JbmRleCB7XG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIHJlcG9zaXRvcnk6IHN0cmluZztcbiAgbGFzdFVwZGF0ZWQ6IERhdGU7XG4gIGVsZW1lbnRzOiBNYXA8RWxlbWVudFR5cGUsIEdpdEh1YkluZGV4RW50cnlbXT47XG4gIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcbiAgc2hhOiBzdHJpbmc7IC8vIExhdGVzdCBjb21taXQgU0hBXG4gIHJhdGVMaW1pdEluZm8/OiB7XG4gICAgcmVtYWluaW5nOiBudW1iZXI7XG4gICAgcmVzZXRUaW1lOiBEYXRlO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkZldGNoT3B0aW9ucyB7XG4gIGZvcmNlPzogYm9vbGVhbjtcbiAgbWF4RWxlbWVudHM/OiBudW1iZXI7XG4gIGVsZW1lbnRUeXBlcz86IEVsZW1lbnRUeXBlW107XG4gIHVzZUdyYXBoUUw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgR2l0SHViUG9ydGZvbGlvSW5kZXhlciB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBHaXRIdWJQb3J0Zm9saW9JbmRleGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlTG9jayA9IGZhbHNlO1xuICBcbiAgcHJpdmF0ZSBjYWNoZTogR2l0SHViUG9ydGZvbGlvSW5kZXggfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0RmV0Y2g6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSB0dGwgPSAxNSAqIDYwICogMTAwMDsgLy8gMTUgbWludXRlc1xuICBwcml2YXRlIHJlY2VudFVzZXJBY3Rpb24gPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3Rpb25UaW1lc3RhbXA6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb25HcmFjZVBlcmlvZCA9IDIgKiA2MCAqIDEwMDA7IC8vIDIgbWludXRlcyBhZnRlciBhY3Rpb25cbiAgXG4gIHByaXZhdGUgcG9ydGZvbGlvUmVwb01hbmFnZXI6IFBvcnRmb2xpb1JlcG9NYW5hZ2VyO1xuICBwcml2YXRlIGFwaUNhY2hlOiBBUElDYWNoZTtcbiAgcHJpdmF0ZSByYXRlTGltaXRUcmFja2VyOiBNYXA8c3RyaW5nLCBudW1iZXJbXT47XG4gIFxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYXBpQ2FjaGUgPSBuZXcgQVBJQ2FjaGUoKTsgLy8gVXNlcyBkZWZhdWx0IHNldHRpbmdzXG4gICAgdGhpcy5yYXRlTGltaXRUcmFja2VyID0gbmV3IE1hcCgpO1xuICAgIHRoaXMucG9ydGZvbGlvUmVwb01hbmFnZXIgPSBuZXcgUG9ydGZvbGlvUmVwb01hbmFnZXIoKTtcbiAgICBcbiAgICBsb2dnZXIuZGVidWcoJ0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIgY3JlYXRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpbmdsZXRvbiBwYXR0ZXJuIHdpdGggdGhyZWFkIHNhZmV0eVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBHaXRIdWJQb3J0Zm9saW9JbmRleGVyIHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIGlmICh0aGlzLmluc3RhbmNlTG9jaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIgaW5zdGFuY2UgaXMgYmVpbmcgY3JlYXRlZCBieSBhbm90aGVyIHRocmVhZCcpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmluc3RhbmNlTG9jayA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgR2l0SHViUG9ydGZvbGlvSW5kZXhlcigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZUxvY2sgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogTWFpbiBtZXRob2QgdG8gZ2V0IEdpdEh1YiBwb3J0Zm9saW8gaW5kZXhcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRJbmRleChmb3JjZSA9IGZhbHNlKTogUHJvbWlzZTxHaXRIdWJQb3J0Zm9saW9JbmRleD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIGZyZXNoIGRhdGFcbiAgICAgIGlmIChmb3JjZSB8fCB0aGlzLnNob3VsZEZldGNoRnJlc2goKSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaEZyZXNoKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJldHVybiBjYWNoZWQgZGF0YSBpZiBhdmFpbGFibGUgYW5kIHZhbGlkXG4gICAgICBpZiAodGhpcy5jYWNoZSAmJiB0aGlzLmlzQ2FjaGVWYWxpZCgpKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnUmV0dXJuaW5nIGNhY2hlZCBHaXRIdWIgcG9ydGZvbGlvIGluZGV4Jywge1xuICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLmNhY2hlLnVzZXJuYW1lLFxuICAgICAgICAgIHRvdGFsRWxlbWVudHM6IHRoaXMuY2FjaGUudG90YWxFbGVtZW50cyxcbiAgICAgICAgICBhZ2U6IHRoaXMubGFzdEZldGNoID8gRGF0ZS5ub3coKSAtIHRoaXMubGFzdEZldGNoLmdldFRpbWUoKSA6ICd1bmtub3duJ1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFRyeSB0byBmZXRjaCBmcmVzaCwgZmFsbCBiYWNrIHRvIHN0YWxlIGNhY2hlIG9uIGZhaWx1cmVcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoRnJlc2goKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZmV0Y2ggZnJlc2ggR2l0SHViIHBvcnRmb2xpbyBpbmRleCwgY2hlY2tpbmcgZm9yIHN0YWxlIGNhY2hlJywge1xuICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBSZXR1cm4gc3RhbGUgY2FjaGUgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLmNhY2hlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ1JldHVybmluZyBzdGFsZSBHaXRIdWIgcG9ydGZvbGlvIGNhY2hlIGFzIGZhbGxiYWNrJywge1xuICAgICAgICAgICAgdXNlcm5hbWU6IHRoaXMuY2FjaGUudXNlcm5hbWUsXG4gICAgICAgICAgICBhZ2U6IHRoaXMubGFzdEZldGNoID8gRGF0ZS5ub3coKSAtIHRoaXMubGFzdEZldGNoLmdldFRpbWUoKSA6ICd1bmtub3duJ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzLmNhY2hlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBSZXR1cm4gZW1wdHkgaW5kZXggYXMgbGFzdCByZXNvcnRcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRW1wdHlJbmRleCgpO1xuICAgICAgfVxuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignR2l0SHViUG9ydGZvbGlvSW5kZXhlci5nZXRJbmRleCcsIGVycm9yKTtcbiAgICAgIFxuICAgICAgLy8gUmV0dXJuIHN0YWxlIGNhY2hlIG9yIGVtcHR5IGluZGV4XG4gICAgICBpZiAodGhpcy5jYWNoZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRW1wdHlJbmRleCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZhbGlkYXRlIGNhY2hlIGFmdGVyIHVzZXIgYWN0aW9uc1xuICAgKi9cbiAgcHVibGljIGludmFsaWRhdGVBZnRlckFjdGlvbihhY3Rpb246IHN0cmluZyk6IHZvaWQge1xuICAgIGxvZ2dlci5pbmZvKCdJbnZhbGlkYXRpbmcgR2l0SHViIHBvcnRmb2xpbyBjYWNoZSBhZnRlciB1c2VyIGFjdGlvbicsIHsgYWN0aW9uIH0pO1xuICAgIFxuICAgIHRoaXMucmVjZW50VXNlckFjdGlvbiA9IHRydWU7XG4gICAgdGhpcy5hY3Rpb25UaW1lc3RhbXAgPSBuZXcgRGF0ZSgpO1xuICAgIFxuICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgYXVkaXQgdHJhaWxcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0NBQ0hFX0lOVkFMSURBVElPTicsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdHaXRIdWJQb3J0Zm9saW9JbmRleGVyLmludmFsaWRhdGVBZnRlckFjdGlvbicsXG4gICAgICBkZXRhaWxzOiBgQ2FjaGUgaW52YWxpZGF0ZWQgYWZ0ZXIgdXNlciBhY3Rpb246ICR7YWN0aW9ufWAsXG4gICAgICBtZXRhZGF0YTogeyBhY3Rpb24gfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBjYWNoZWQgZGF0YVxuICAgKi9cbiAgcHVibGljIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5jYWNoZSA9IG51bGw7XG4gICAgdGhpcy5sYXN0RmV0Y2ggPSBudWxsO1xuICAgIHRoaXMucmVjZW50VXNlckFjdGlvbiA9IGZhbHNlO1xuICAgIHRoaXMuYWN0aW9uVGltZXN0YW1wID0gbnVsbDtcbiAgICB0aGlzLmFwaUNhY2hlLmNsZWFyKCk7XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiBwb3J0Zm9saW8gY2FjaGUgY2xlYXJlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjYWNoZSBzdGF0aXN0aWNzXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2FjaGVTdGF0cygpOiB7XG4gICAgaGFzQ2FjaGVkRGF0YTogYm9vbGVhbjtcbiAgICBsYXN0RmV0Y2g6IERhdGUgfCBudWxsO1xuICAgIGlzU3RhbGU6IGJvb2xlYW47XG4gICAgcmVjZW50VXNlckFjdGlvbjogYm9vbGVhbjtcbiAgICB0b3RhbEVsZW1lbnRzOiBudW1iZXI7XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBoYXNDYWNoZWREYXRhOiB0aGlzLmNhY2hlICE9PSBudWxsLFxuICAgICAgbGFzdEZldGNoOiB0aGlzLmxhc3RGZXRjaCxcbiAgICAgIGlzU3RhbGU6ICF0aGlzLmlzQ2FjaGVWYWxpZCgpLFxuICAgICAgcmVjZW50VXNlckFjdGlvbjogdGhpcy5yZWNlbnRVc2VyQWN0aW9uLFxuICAgICAgdG90YWxFbGVtZW50czogdGhpcy5jYWNoZT8udG90YWxFbGVtZW50cyB8fCAwXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBmcmVzaCBkYXRhIGZyb20gR2l0SHViXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoRnJlc2goKTogUHJvbWlzZTxHaXRIdWJQb3J0Zm9saW9JbmRleD4ge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgbG9nZ2VyLmluZm8oJ0ZldGNoaW5nIGZyZXNoIEdpdEh1YiBwb3J0Zm9saW8gaW5kZXguLi4nKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IEdpdEh1YiB1c2VybmFtZSBmcm9tIHRva2VuXG4gICAgICBjb25zdCB1c2VybmFtZSA9IGF3YWl0IHRoaXMuZ2V0R2l0SHViVXNlcm5hbWUoKTtcbiAgICAgIGNvbnN0IHJlcG9zaXRvcnkgPSAnZG9sbGhvdXNlLXBvcnRmb2xpbyc7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIHBvcnRmb2xpbyByZXBvc2l0b3J5IGV4aXN0c1xuICAgICAgY29uc3QgcmVwb0V4aXN0cyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvUmVwb01hbmFnZXIuY2hlY2tQb3J0Zm9saW9FeGlzdHModXNlcm5hbWUpO1xuICAgICAgaWYgKCFyZXBvRXhpc3RzKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QnLCB7IHVzZXJuYW1lIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVFbXB0eUluZGV4KHVzZXJuYW1lLCByZXBvc2l0b3J5KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRmV0Y2ggcmVwb3NpdG9yeSBjb250ZW50IHVzaW5nIEdpdEh1YiBBUElcbiAgICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5mZXRjaFJlcG9zaXRvcnlDb250ZW50KHVzZXJuYW1lLCByZXBvc2l0b3J5KTtcbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGNhY2hlXG4gICAgICB0aGlzLmNhY2hlID0gaW5kZXg7XG4gICAgICB0aGlzLmxhc3RGZXRjaCA9IG5ldyBEYXRlKCk7XG4gICAgICB0aGlzLnJlY2VudFVzZXJBY3Rpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuYWN0aW9uVGltZXN0YW1wID0gbnVsbDtcbiAgICAgIFxuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiBwb3J0Zm9saW8gaW5kZXggZmV0Y2hlZCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICB0b3RhbEVsZW1lbnRzOiBpbmRleC50b3RhbEVsZW1lbnRzLFxuICAgICAgICBkdXJhdGlvbjogYCR7ZHVyYXRpb259bXNgLFxuICAgICAgICByYXRlTGltaXRSZW1haW5pbmc6IGluZGV4LnJhdGVMaW1pdEluZm8/LnJlbWFpbmluZ1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUE9SVEZPTElPX0ZFVENIX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIuZmV0Y2hGcmVzaCcsXG4gICAgICAgIGRldGFpbHM6IGBGZXRjaGVkIEdpdEh1YiBwb3J0Zm9saW8gd2l0aCAke2luZGV4LnRvdGFsRWxlbWVudHN9IGVsZW1lbnRzIGluICR7ZHVyYXRpb259bXNgLFxuICAgICAgICBtZXRhZGF0YTogeyB1c2VybmFtZSwgZHVyYXRpb24sIHRvdGFsRWxlbWVudHM6IGluZGV4LnRvdGFsRWxlbWVudHMgfVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIuZmV0Y2hGcmVzaCcsIGVycm9yLCB7IGR1cmF0aW9uIH0pO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgJ0ZhaWxlZCB0byBmZXRjaCBHaXRIdWIgcG9ydGZvbGlvIGluZGV4JywgRXJyb3JDYXRlZ29yeS5ORVRXT1JLX0VSUk9SKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggcmVwb3NpdG9yeSBjb250ZW50IGZyb20gR2l0SHViIEFQSVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlcG9zaXRvcnlDb250ZW50KHVzZXJuYW1lOiBzdHJpbmcsIHJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8R2l0SHViUG9ydGZvbGlvSW5kZXg+IHtcbiAgICAvLyBUcnkgR3JhcGhRTCBmaXJzdCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLCBmYWxsYmFjayB0byBSRVNUXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoV2l0aEdyYXBoUUwodXNlcm5hbWUsIHJlcG9zaXRvcnkpO1xuICAgIH0gY2F0Y2ggKGdyYXBocWxFcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdHcmFwaFFMIGZldGNoIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIFJFU1QgQVBJJywge1xuICAgICAgICBlcnJvcjogZ3JhcGhxbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBncmFwaHFsRXJyb3IubWVzc2FnZSA6IFN0cmluZyhncmFwaHFsRXJyb3IpXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hXaXRoUkVTVCh1c2VybmFtZSwgcmVwb3NpdG9yeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHVzaW5nIEdyYXBoUUwgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFdpdGhHcmFwaFFMKHVzZXJuYW1lOiBzdHJpbmcsIHJlcG9zaXRvcnk6IHN0cmluZyk6IFByb21pc2U8R2l0SHViUG9ydGZvbGlvSW5kZXg+IHtcbiAgICBjb25zdCBxdWVyeSA9IGBcbiAgICAgIHF1ZXJ5IEdldFBvcnRmb2xpb0NvbnRlbnQoJG93bmVyOiBTdHJpbmchLCAkbmFtZTogU3RyaW5nISkge1xuICAgICAgICByZXBvc2l0b3J5KG93bmVyOiAkb3duZXIsIG5hbWU6ICRuYW1lKSB7XG4gICAgICAgICAgZGVmYXVsdEJyYW5jaFJlZiB7XG4gICAgICAgICAgICB0YXJnZXQge1xuICAgICAgICAgICAgICAuLi4gb24gQ29tbWl0IHtcbiAgICAgICAgICAgICAgICBvaWRcbiAgICAgICAgICAgICAgICBoaXN0b3J5KGZpcnN0OiAxKSB7XG4gICAgICAgICAgICAgICAgICBub2RlcyB7XG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZERhdGVcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0KGV4cHJlc3Npb246IFwiSEVBRDpcIikge1xuICAgICAgICAgICAgLi4uIG9uIFRyZWUge1xuICAgICAgICAgICAgICBlbnRyaWVzIHtcbiAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgICAgIG9iamVjdCB7XG4gICAgICAgICAgICAgICAgICAuLi4gb24gVHJlZSB7XG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXMge1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgb2lkXG4gICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLiBvbiBCbG9iIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVNpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByYXRlTGltaXQge1xuICAgICAgICAgIHJlbWFpbmluZ1xuICAgICAgICAgIHJlc2V0QXRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGA7XG4gICAgXG4gICAgY29uc3QgdmFyaWFibGVzID0geyBvd25lcjogdXNlcm5hbWUsIG5hbWU6IHJlcG9zaXRvcnkgfTtcbiAgICBcbiAgICAvLyBHcmFwaFFMIGVuZHBvaW50IG5vdCB5ZXQgaW1wbGVtZW50ZWQgd2l0aCBQb3J0Zm9saW9SZXBvTWFuYWdlclxuICAgIC8vIEZvciBub3csIGp1c3QgdGhyb3cgdG8gZmFsbCBiYWNrIHRvIFJFU1RcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dyYXBoUUwgbm90IHlldCBpbXBsZW1lbnRlZCBmb3IgcG9ydGZvbGlvIG9wZXJhdGlvbnMnKTtcbiAgICBcbiAgICAvLyBOb3RlOiBUaGlzIGlzIGEgc2ltcGxpZmllZCBHcmFwaFFMIGltcGxlbWVudGF0aW9uXG4gICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB5b3Ugd291bGQgc2VuZCBQT1NUIHJlcXVlc3Qgd2l0aCBxdWVyeSBhbmQgdmFyaWFibGVzXG4gICAgdGhyb3cgbmV3IEVycm9yKCdHcmFwaFFMIGltcGxlbWVudGF0aW9uIG5vdCB5ZXQgY29tcGxldGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB1c2luZyBSRVNUIEFQSSB3aXRoIHBhZ2luYXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hXaXRoUkVTVCh1c2VybmFtZTogc3RyaW5nLCByZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPEdpdEh1YlBvcnRmb2xpb0luZGV4PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFVzZXJuYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodXNlcm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIC8vIEdldCByZXBvc2l0b3J5IGluZm8gYW5kIGxhdGVzdCBjb21taXRcbiAgICBjb25zdCByZXBvSW5mbyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvUmVwb01hbmFnZXIuZ2l0aHViUmVxdWVzdChcbiAgICAgIGAvcmVwb3MvJHtub3JtYWxpemVkVXNlcm5hbWV9LyR7cmVwb3NpdG9yeX1gXG4gICAgKTtcbiAgICBcbiAgICBjb25zdCBsYXRlc3RDb21taXQgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb1JlcG9NYW5hZ2VyLmdpdGh1YlJlcXVlc3QoXG4gICAgICBgL3JlcG9zLyR7bm9ybWFsaXplZFVzZXJuYW1lfS8ke3JlcG9zaXRvcnl9L2NvbW1pdHMvSEVBRGBcbiAgICApO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgaW5kZXhcbiAgICBjb25zdCBpbmRleDogR2l0SHViUG9ydGZvbGlvSW5kZXggPSB7XG4gICAgICB1c2VybmFtZTogbm9ybWFsaXplZFVzZXJuYW1lLFxuICAgICAgcmVwb3NpdG9yeSxcbiAgICAgIGxhc3RVcGRhdGVkOiBuZXcgRGF0ZShsYXRlc3RDb21taXQuY29tbWl0LmNvbW1pdHRlci5kYXRlKSxcbiAgICAgIGVsZW1lbnRzOiBuZXcgTWFwKCksXG4gICAgICB0b3RhbEVsZW1lbnRzOiAwLFxuICAgICAgc2hhOiBsYXRlc3RDb21taXQuc2hhXG4gICAgfTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGVsZW1lbnQgdHlwZSBtYXBzXG4gICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgaW5kZXguZWxlbWVudHMuc2V0KGVsZW1lbnRUeXBlLCBbXSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEZldGNoIGNvbnRlbnQgZm9yIGVhY2ggZWxlbWVudCB0eXBlXG4gICAgbG9nZ2VyLmluZm8oYEZldGNoaW5nIGNvbnRlbnQgZm9yIGFsbCBlbGVtZW50IHR5cGVzIGZyb20gR2l0SHViIHBvcnRmb2xpby4uLmApO1xuICAgIFxuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmV0Y2hpbmcgJHtlbGVtZW50VHlwZX0gZnJvbSBHaXRIdWIuLi5gKTtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuZmV0Y2hFbGVtZW50VHlwZUNvbnRlbnQobm9ybWFsaXplZFVzZXJuYW1lLCByZXBvc2l0b3J5LCBlbGVtZW50VHlwZSk7XG4gICAgICAgIGluZGV4LmVsZW1lbnRzLnNldChlbGVtZW50VHlwZSwgZW50cmllcyk7XG4gICAgICAgIGluZGV4LnRvdGFsRWxlbWVudHMgKz0gZW50cmllcy5sZW5ndGg7XG4gICAgICAgIFxuICAgICAgICBpZiAoZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYOKchSBGb3VuZCAke2VudHJpZXMubGVuZ3RofSAke2VsZW1lbnRUeXBlfSBpbiBHaXRIdWIgcG9ydGZvbGlvYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGDwn5OBIE5vICR7ZWxlbWVudFR5cGV9IGZvdW5kIChkaXJlY3RvcnkgbWF5IG5vdCBleGlzdCB5ZXQpYCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGDinYwgRmFpbGVkIHRvIGZldGNoICR7ZWxlbWVudFR5cGV9IGZyb20gR2l0SHViIHBvcnRmb2xpb2AsIHtcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIGVsZW1lbnRUeXBlXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBDb250aW51ZSB3aXRoIG90aGVyIGVsZW1lbnQgdHlwZXNcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGNvbnRlbnQgZm9yIGEgc3BlY2lmaWMgZWxlbWVudCB0eXBlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoRWxlbWVudFR5cGVDb250ZW50KFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcmVwb3NpdG9yeTogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZVxuICApOiBQcm9taXNlPEdpdEh1YkluZGV4RW50cnlbXT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgZGlyZWN0b3J5IGxpc3RpbmcgdXNpbmcgUG9ydGZvbGlvUmVwb01hbmFnZXJcbiAgICAgIGNvbnN0IGNvbnRlbnRzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5naXRodWJSZXF1ZXN0KFxuICAgICAgICBgL3JlcG9zLyR7dXNlcm5hbWV9LyR7cmVwb3NpdG9yeX0vY29udGVudHMvJHtlbGVtZW50VHlwZX1gXG4gICAgICApO1xuICAgICAgXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudHMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgZW50cmllczogR2l0SHViSW5kZXhFbnRyeVtdID0gW107XG4gICAgICBjb25zdCBtYXhDb25jdXJyZW50ID0gNTsgLy8gTGltaXQgY29uY3VycmVudCByZXF1ZXN0c1xuICAgICAgXG4gICAgICAvLyBQcm9jZXNzIGZpbGVzIGluIGJhdGNoZXMgdG8gYXZvaWQgcmF0ZSBsaW1pdGluZ1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7IGkgKz0gbWF4Q29uY3VycmVudCkge1xuICAgICAgICBjb25zdCBiYXRjaCA9IGNvbnRlbnRzLnNsaWNlKGksIGkgKyBtYXhDb25jdXJyZW50KTtcbiAgICAgICAgY29uc3QgYmF0Y2hQcm9taXNlcyA9IGJhdGNoXG4gICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ2ZpbGUnICYmIGl0ZW0ubmFtZS5lbmRzV2l0aCgnLm1kJykpXG4gICAgICAgICAgLm1hcChpdGVtID0+IHRoaXMuY3JlYXRlR2l0SHViSW5kZXhFbnRyeSh1c2VybmFtZSwgcmVwb3NpdG9yeSwgZWxlbWVudFR5cGUsIGl0ZW0pKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGJhdGNoUmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChiYXRjaFByb21pc2VzKTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIGJhdGNoUmVzdWx0cykge1xuICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChyZXN1bHQudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQWRkIGRlbGF5IGJldHdlZW4gYmF0Y2hlcyB0byByZXNwZWN0IHJhdGUgbGltaXRzXG4gICAgICAgIGlmIChpICsgbWF4Q29uY3VycmVudCA8IGNvbnRlbnRzLmxlbmd0aCkge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gZW50cmllcztcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBEaXJlY3RvcnkgbWlnaHQgbm90IGV4aXN0IC0gY2hlY2sgZm9yIDQwNCBlcnJvcnNcbiAgICAgIC8vIFBvcnRmb2xpb1JlcG9NYW5hZ2VyIHdpbGwgdGhyb3cgc3RhbmRhcmQgR2l0SHViIEFQSSBlcnJvcnNcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciA0MDQgTm90IEZvdW5kIGVycm9ycyBmcm9tIEdpdEh1YiBBUElcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJzQwNCcpIHx8IFxuICAgICAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnTm90IEZvdW5kJykpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYERpcmVjdG9yeSAke2VsZW1lbnRUeXBlfSBub3QgZm91bmQgaW4gR2l0SHViIHJlcG9zaXRvcnkgKHRoaXMgaXMgbm9ybWFsIGlmIG5vdCB5ZXQgY3JlYXRlZClgKTtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIExvZyB0aGUgYWN0dWFsIGVycm9yIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBFcnJvciBmZXRjaGluZyAke2VsZW1lbnRUeXBlfTogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBSZS10aHJvdyBvdGhlciBlcnJvcnNcbiAgICAgIGxvZ2dlci53YXJuKGBVbmV4cGVjdGVkIGVycm9yIGZldGNoaW5nICR7ZWxlbWVudFR5cGV9OmAsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgR2l0SHViIGluZGV4IGVudHJ5IGZyb20gQVBJIHJlc3BvbnNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUdpdEh1YkluZGV4RW50cnkoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICByZXBvc2l0b3J5OiBzdHJpbmcsXG4gICAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlLFxuICAgIGZpbGVJbmZvOiBhbnlcbiAgKTogUHJvbWlzZTxHaXRIdWJJbmRleEVudHJ5IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBQYXJzZSBtZXRhZGF0YSBmcm9tIGZpbGVuYW1lIG9yIGZldGNoIGNvbnRlbnQgaWYgbmVlZGVkXG4gICAgICBjb25zdCBuYW1lID0gZmlsZUluZm8ubmFtZS5yZXBsYWNlKCcubWQnLCAnJykucmVwbGFjZSgvLS9nLCAnICcpO1xuICAgICAgXG4gICAgICBjb25zdCBlbnRyeTogR2l0SHViSW5kZXhFbnRyeSA9IHtcbiAgICAgICAgcGF0aDogZmlsZUluZm8ucGF0aCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIHNoYTogZmlsZUluZm8uc2hhLFxuICAgICAgICBodG1sVXJsOiBmaWxlSW5mby5odG1sX3VybCxcbiAgICAgICAgZG93bmxvYWRVcmw6IGZpbGVJbmZvLmRvd25sb2FkX3VybCxcbiAgICAgICAgbGFzdE1vZGlmaWVkOiBuZXcgRGF0ZSgpLCAvLyBHaXRIdWIgQVBJIGRvZXNuJ3QgcHJvdmlkZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lIGRpcmVjdGx5XG4gICAgICAgIHNpemU6IGZpbGVJbmZvLnNpemUgfHwgMFxuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gT3B0aW9uYWxseSBmZXRjaCBjb250ZW50IHRvIGV4dHJhY3QgbWV0YWRhdGFcbiAgICAgIC8vIFRoaXMgaXMgZXhwZW5zaXZlLCBzbyBvbmx5IGRvIGl0IGZvciBzbWFsbCBmaWxlcyBvciB3aGVuIHNwZWNpZmljYWxseSBuZWVkZWRcbiAgICAgIGlmIChmaWxlSW5mby5zaXplICYmIGZpbGVJbmZvLnNpemUgPCAxMDAwMCkgeyAvLyBPbmx5IGZvciBmaWxlcyA8IDEwS0JcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBGb3IgZG93bmxvYWQgVVJMcywgd2UgbmVlZCB0byBmZXRjaCBkaXJlY3RseSwgbm90IHRocm91Z2ggQVBJXG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChmaWxlSW5mby5kb3dubG9hZF91cmwpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnBhcnNlTWV0YWRhdGFGcm9tQ29udGVudChjb250ZW50KTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAobWV0YWRhdGEubmFtZSkgZW50cnkubmFtZSA9IG1ldGFkYXRhLm5hbWU7XG4gICAgICAgICAgaWYgKG1ldGFkYXRhLmRlc2NyaXB0aW9uKSBlbnRyeS5kZXNjcmlwdGlvbiA9IG1ldGFkYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICAgIGlmIChtZXRhZGF0YS52ZXJzaW9uKSBlbnRyeS52ZXJzaW9uID0gbWV0YWRhdGEudmVyc2lvbjtcbiAgICAgICAgICBpZiAobWV0YWRhdGEuYXV0aG9yKSBlbnRyeS5hdXRob3IgPSBtZXRhZGF0YS5hdXRob3I7XG4gICAgICAgIH0gY2F0Y2ggKG1ldGFkYXRhRXJyb3IpIHtcbiAgICAgICAgICAvLyBOb24tY3JpdGljYWwgZXJyb3IsIGNvbnRpbnVlIHdpdGhvdXQgbWV0YWRhdGFcbiAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZhaWxlZCB0byBmZXRjaCBtZXRhZGF0YSBmb3IgZmlsZScsIHtcbiAgICAgICAgICAgIHBhdGg6IGZpbGVJbmZvLnBhdGgsXG4gICAgICAgICAgICBlcnJvcjogbWV0YWRhdGFFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gbWV0YWRhdGFFcnJvci5tZXNzYWdlIDogU3RyaW5nKG1ldGFkYXRhRXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRmFpbGVkIHRvIGNyZWF0ZSBHaXRIdWIgaW5kZXggZW50cnknLCB7XG4gICAgICAgIHBhdGg6IGZpbGVJbmZvLnBhdGgsXG4gICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIG1ldGFkYXRhIGZyb20gZmlsZSBjb250ZW50IChmcm9udG1hdHRlcilcbiAgICovXG4gIHByaXZhdGUgcGFyc2VNZXRhZGF0YUZyb21Db250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHtcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgYXV0aG9yPzogc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBtZXRhZGF0YTogYW55ID0ge307XG4gICAgXG4gICAgLy8gU2ltcGxlIGZyb250bWF0dGVyIHBhcnNpbmcgKGNvdWxkIHVzZSBhIHByb3BlciBZQU1MIHBhcnNlcilcbiAgICBjb25zdCBmcm9udG1hdHRlck1hdGNoID0gY29udGVudC5tYXRjaCgvXi0tLVxcbihbXFxzXFxTXSo/KVxcbi0tLS8pO1xuICAgIGlmIChmcm9udG1hdHRlck1hdGNoKSB7XG4gICAgICBjb25zdCBmcm9udG1hdHRlciA9IGZyb250bWF0dGVyTWF0Y2hbMV07XG4gICAgICBcbiAgICAgIGNvbnN0IG5hbWVNYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKC9ebmFtZTpcXHMqKC4rKSQvbSk7XG4gICAgICBpZiAobmFtZU1hdGNoKSBtZXRhZGF0YS5uYW1lID0gbmFtZU1hdGNoWzFdLnRyaW0oKTtcbiAgICAgIFxuICAgICAgY29uc3QgZGVzY01hdGNoID0gZnJvbnRtYXR0ZXIubWF0Y2goL15kZXNjcmlwdGlvbjpcXHMqKC4rKSQvbSk7XG4gICAgICBpZiAoZGVzY01hdGNoKSBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9IGRlc2NNYXRjaFsxXS50cmltKCk7XG4gICAgICBcbiAgICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKC9edmVyc2lvbjpcXHMqKC4rKSQvbSk7XG4gICAgICBpZiAodmVyc2lvbk1hdGNoKSBtZXRhZGF0YS52ZXJzaW9uID0gdmVyc2lvbk1hdGNoWzFdLnRyaW0oKTtcbiAgICAgIFxuICAgICAgY29uc3QgYXV0aG9yTWF0Y2ggPSBmcm9udG1hdHRlci5tYXRjaCgvXmF1dGhvcjpcXHMqKC4rKSQvbSk7XG4gICAgICBpZiAoYXV0aG9yTWF0Y2gpIG1ldGFkYXRhLmF1dGhvciA9IGF1dGhvck1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBHaXRIdWIgdXNlcm5hbWUgZnJvbSBhdXRoZW50aWNhdGVkIHRva2VuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEdpdEh1YlVzZXJuYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5naXRodWJSZXF1ZXN0KCcvdXNlcicpO1xuICAgICAgcmV0dXJuIHVzZXJJbmZvLmxvZ2luO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgR2l0SHViIHVzZXJuYW1lLiBQbGVhc2UgZW5zdXJlIHlvdSBhcmUgYXV0aGVudGljYXRlZCB3aXRoIEdpdEh1Yi4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgY2FjaGUgaXMgdmFsaWRcbiAgICovXG4gIHByaXZhdGUgaXNDYWNoZVZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5jYWNoZSB8fCAhdGhpcy5sYXN0RmV0Y2gpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgYWdlID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdEZldGNoLmdldFRpbWUoKTtcbiAgICByZXR1cm4gYWdlIDwgdGhpcy50dGw7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBmZXRjaCBmcmVzaCBkYXRhXG4gICAqL1xuICBwcml2YXRlIHNob3VsZEZldGNoRnJlc2goKTogYm9vbGVhbiB7XG4gICAgLy8gQWx3YXlzIGZldGNoIGlmIG5vIGNhY2hlXG4gICAgaWYgKCF0aGlzLmNhY2hlIHx8ICF0aGlzLmxhc3RGZXRjaCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciByZWNlbnQgdXNlciBhY3Rpb25zXG4gICAgaWYgKHRoaXMucmVjZW50VXNlckFjdGlvbiAmJiB0aGlzLmFjdGlvblRpbWVzdGFtcCkge1xuICAgICAgY29uc3QgYWN0aW9uQWdlID0gRGF0ZS5ub3coKSAtIHRoaXMuYWN0aW9uVGltZXN0YW1wLmdldFRpbWUoKTtcbiAgICAgIGlmIChhY3Rpb25BZ2UgPCB0aGlzLmFjdGlvbkdyYWNlUGVyaW9kKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRmV0Y2hpbmcgZnJlc2ggZHVlIHRvIHJlY2VudCB1c2VyIGFjdGlvbicsIHsgYWN0aW9uQWdlIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEdyYWNlIHBlcmlvZCBleHBpcmVkLCBjbGVhciBhY3Rpb24gZmxhZ1xuICAgICAgICB0aGlzLnJlY2VudFVzZXJBY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY3Rpb25UaW1lc3RhbXAgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBUVExcbiAgICByZXR1cm4gIXRoaXMuaXNDYWNoZVZhbGlkKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGVtcHR5IGluZGV4IHdoZW4gbm8gcG9ydGZvbGlvIGV4aXN0c1xuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFbXB0eUluZGV4KHVzZXJuYW1lPzogc3RyaW5nLCByZXBvc2l0b3J5Pzogc3RyaW5nKTogR2l0SHViUG9ydGZvbGlvSW5kZXgge1xuICAgIGNvbnN0IGluZGV4OiBHaXRIdWJQb3J0Zm9saW9JbmRleCA9IHtcbiAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSB8fCAndW5rbm93bicsXG4gICAgICByZXBvc2l0b3J5OiByZXBvc2l0b3J5IHx8ICdkb2xsaG91c2UtcG9ydGZvbGlvJyxcbiAgICAgIGxhc3RVcGRhdGVkOiBuZXcgRGF0ZSgpLFxuICAgICAgZWxlbWVudHM6IG5ldyBNYXAoKSxcbiAgICAgIHRvdGFsRWxlbWVudHM6IDAsXG4gICAgICBzaGE6ICcnXG4gICAgfTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGVtcHR5IGVsZW1lbnQgdHlwZSBtYXBzXG4gICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgaW5kZXguZWxlbWVudHMuc2V0KGVsZW1lbnRUeXBlLCBbXSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBpbmRleDtcbiAgfVxufSJdfQ==
498
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViUG9ydGZvbGlvSW5kZXhlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vR2l0SHViUG9ydGZvbGlvSW5kZXhlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBb0MxRSxNQUFNLE9BQU8sc0JBQXNCO0lBQ3pCLE1BQU0sQ0FBQyxRQUFRLEdBQWtDLElBQUksQ0FBQztJQUN0RCxNQUFNLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztJQUU1QixLQUFLLEdBQWdDLElBQUksQ0FBQztJQUMxQyxTQUFTLEdBQWdCLElBQUksQ0FBQztJQUNyQixHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxhQUFhO0lBQzVDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixlQUFlLEdBQWdCLElBQUksQ0FBQztJQUMzQixpQkFBaUIsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLHlCQUF5QjtJQUVyRSxvQkFBb0IsQ0FBdUI7SUFDM0MsUUFBUSxDQUFXO0lBQ25CLGdCQUFnQixDQUF3QjtJ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ZGV4ZXIgLSBGZXRjaGVzIGFuZCBpbmRleGVzIHVzZXIncyBHaXRIdWIgcG9ydGZvbGlvIGZvciBmYXN0IHNlYXJjaGluZ1xuICogXG4gKiBGZWF0dXJlczpcbiAqIC0gU2luZ2xldG9uIHBhdHRlcm4gZm9yIGVmZmljaWVudCByZXNvdXJjZSB1c2FnZVxuICogLSBTbWFydCBjYWNoaW5nIHdpdGggVFRMIGFuZCBpbnZhbGlkYXRpb24gYWZ0ZXIgdXNlciBhY3Rpb25zXG4gKiAtIEdyYXBoUUwvUkVTVCBBUEkgaW50ZWdyYXRpb24gZm9yIGVmZmljaWVudCBmZXRjaGluZ1xuICogLSBSYXRlIGxpbWl0aW5nIGFuZCBhdXRoZW50aWNhdGlvbiBoYW5kbGluZ1xuICogLSBGYWxsYmFjayBzdHJhdGVneSBmb3IgcmVzaWxpZW50IG9wZXJhdGlvblxuICogLSBQZXJmb3JtYW5jZSBvcHRpbWl6ZWQgZm9yIDEwMDArIHBvcnRmb2xpbyBlbGVtZW50c1xuICovXG5cbmltcG9ydCB7IFBvcnRmb2xpb1JlcG9NYW5hZ2VyIH0gZnJvbSAnLi9Qb3J0Zm9saW9SZXBvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tICcuLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgQVBJQ2FjaGUgfSBmcm9tICcuLi9jYWNoZS9BUElDYWNoZS5qcyc7XG5pbXBvcnQgeyBnZXRQb3J0Zm9saW9SZXBvc2l0b3J5TmFtZSB9IGZyb20gJy4uL2NvbmZpZy9wb3J0Zm9saW9Db25maWcuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkluZGV4RW50cnkge1xuICBwYXRoOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGF1dGhvcj86IHN0cmluZztcbiAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICBzaGE6IHN0cmluZzsgLy8gRmlsZSBTSEEgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgaHRtbFVybDogc3RyaW5nOyAvLyBMaW5rIHRvIEdpdEh1YlxuICBkb3dubG9hZFVybDogc3RyaW5nO1xuICBsYXN0TW9kaWZpZWQ6IERhdGU7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRIdWJQb3J0Zm9saW9JbmRleCB7XG4gIHVzZXJuYW1lOiBzdHJpbmc7XG4gIHJlcG9zaXRvcnk6IHN0cmluZztcbiAgbGFzdFVwZGF0ZWQ6IERhdGU7XG4gIGVsZW1lbnRzOiBNYXA8RWxlbWVudFR5cGUsIEdpdEh1YkluZGV4RW50cnlbXT47XG4gIHRvdGFsRWxlbWVudHM6IG51bWJlcjtcbiAgc2hhOiBzdHJpbmc7IC8vIExhdGVzdCBjb21taXQgU0hBXG4gIHJhdGVMaW1pdEluZm8/OiB7XG4gICAgcmVtYWluaW5nOiBudW1iZXI7XG4gICAgcmVzZXRUaW1lOiBEYXRlO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdEh1YkZldGNoT3B0aW9ucyB7XG4gIGZvcmNlPzogYm9vbGVhbjtcbiAgbWF4RWxlbWVudHM/OiBudW1iZXI7XG4gIGVsZW1lbnRUeXBlcz86IEVsZW1lbnRUeXBlW107XG4gIHVzZUdyYXBoUUw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgR2l0SHViUG9ydGZvbGlvSW5kZXhlciB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBHaXRIdWJQb3J0Zm9saW9JbmRleGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlTG9jayA9IGZhbHNlO1xuICBcbiAgcHJpdmF0ZSBjYWNoZTogR2l0SHViUG9ydGZvbGlvSW5kZXggfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0RmV0Y2g6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSB0dGwgPSAxNSAqIDYwICogMTAwMDsgLy8gMTUgbWludXRlc1xuICBwcml2YXRlIHJlY2VudFVzZXJBY3Rpb24gPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3Rpb25UaW1lc3RhbXA6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb25HcmFjZVBlcmlvZCA9IDIgKiA2MCAqIDEwMDA7IC8vIDIgbWludXRlcyBhZnRlciBhY3Rpb25cbiAgXG4gIHByaXZhdGUgcG9ydGZvbGlvUmVwb01hbmFnZXI6IFBvcnRmb2xpb1JlcG9NYW5hZ2VyO1xuICBwcml2YXRlIGFwaUNhY2hlOiBBUElDYWNoZTtcbiAgcHJpdmF0ZSByYXRlTGltaXRUcmFja2VyOiBNYXA8c3RyaW5nLCBudW1iZXJbXT47XG4gIFxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuYXBpQ2FjaGUgPSBuZXcgQVBJQ2FjaGUoKTsgLy8gVXNlcyBkZWZhdWx0IHNldHRpbmdzXG4gICAgdGhpcy5yYXRlTGltaXRUcmFja2VyID0gbmV3IE1hcCgpO1xuICAgIHRoaXMucG9ydGZvbGlvUmVwb01hbmFnZXIgPSBuZXcgUG9ydGZvbGlvUmVwb01hbmFnZXIoZ2V0UG9ydGZvbGlvUmVwb3NpdG9yeU5hbWUoKSk7XG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKCdHaXRIdWJQb3J0Zm9saW9JbmRleGVyIGNyZWF0ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5nbGV0b24gcGF0dGVybiB3aXRoIHRocmVhZCBzYWZldHlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogR2l0SHViUG9ydGZvbGlvSW5kZXhlciB7XG4gICAgaWYgKCF0aGlzLmluc3RhbmNlKSB7XG4gICAgICBpZiAodGhpcy5pbnN0YW5jZUxvY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHaXRIdWJQb3J0Zm9saW9JbmRleGVyIGluc3RhbmNlIGlzIGJlaW5nIGNyZWF0ZWQgYnkgYW5vdGhlciB0aHJlYWQnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZUxvY2sgPSB0cnVlO1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gbmV3IEdpdEh1YlBvcnRmb2xpb0luZGV4ZXIoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VMb2NrID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1haW4gbWV0aG9kIHRvIGdldCBHaXRIdWIgcG9ydGZvbGlvIGluZGV4XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0SW5kZXgoZm9yY2UgPSBmYWxzZSk6IFByb21pc2U8R2l0SHViUG9ydGZvbGlvSW5kZXg+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCBmcmVzaCBkYXRhXG4gICAgICBpZiAoZm9yY2UgfHwgdGhpcy5zaG91bGRGZXRjaEZyZXNoKCkpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hGcmVzaCgpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBSZXR1cm4gY2FjaGVkIGRhdGEgaWYgYXZhaWxhYmxlIGFuZCB2YWxpZFxuICAgICAgaWYgKHRoaXMuY2FjaGUgJiYgdGhpcy5pc0NhY2hlVmFsaWQoKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1JldHVybmluZyBjYWNoZWQgR2l0SHViIHBvcnRmb2xpbyBpbmRleCcsIHtcbiAgICAgICAgICB1c2VybmFtZTogdGhpcy5jYWNoZS51c2VybmFtZSxcbiAgICAgICAgICB0b3RhbEVsZW1lbnRzOiB0aGlzLmNhY2hlLnRvdGFsRWxlbWVudHMsXG4gICAgICAgICAgYWdlOiB0aGlzLmxhc3RGZXRjaCA/IERhdGUubm93KCkgLSB0aGlzLmxhc3RGZXRjaC5nZXRUaW1lKCkgOiAndW5rbm93bidcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBUcnkgdG8gZmV0Y2ggZnJlc2gsIGZhbGwgYmFjayB0byBzdGFsZSBjYWNoZSBvbiBmYWlsdXJlXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaEZyZXNoKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGZldGNoIGZyZXNoIEdpdEh1YiBwb3J0Zm9saW8gaW5kZXgsIGNoZWNraW5nIGZvciBzdGFsZSBjYWNoZScsIHtcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gUmV0dXJuIHN0YWxlIGNhY2hlIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5jYWNoZSkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKCdSZXR1cm5pbmcgc3RhbGUgR2l0SHViIHBvcnRmb2xpbyBjYWNoZSBhcyBmYWxsYmFjaycsIHtcbiAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLmNhY2hlLnVzZXJuYW1lLFxuICAgICAgICAgICAgYWdlOiB0aGlzLmxhc3RGZXRjaCA/IERhdGUubm93KCkgLSB0aGlzLmxhc3RGZXRjaC5nZXRUaW1lKCkgOiAndW5rbm93bidcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUmV0dXJuIGVtcHR5IGluZGV4IGFzIGxhc3QgcmVzb3J0XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUVtcHR5SW5kZXgoKTtcbiAgICAgIH1cbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0dpdEh1YlBvcnRmb2xpb0luZGV4ZXIuZ2V0SW5kZXgnLCBlcnJvcik7XG4gICAgICBcbiAgICAgIC8vIFJldHVybiBzdGFsZSBjYWNoZSBvciBlbXB0eSBpbmRleFxuICAgICAgaWYgKHRoaXMuY2FjaGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUVtcHR5SW5kZXgoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW52YWxpZGF0ZSBjYWNoZSBhZnRlciB1c2VyIGFjdGlvbnNcbiAgICovXG4gIHB1YmxpYyBpbnZhbGlkYXRlQWZ0ZXJBY3Rpb24oYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbygnSW52YWxpZGF0aW5nIEdpdEh1YiBwb3J0Zm9saW8gY2FjaGUgYWZ0ZXIgdXNlciBhY3Rpb24nLCB7IGFjdGlvbiB9KTtcbiAgICBcbiAgICB0aGlzLnJlY2VudFVzZXJBY3Rpb24gPSB0cnVlO1xuICAgIHRoaXMuYWN0aW9uVGltZXN0YW1wID0gbmV3IERhdGUoKTtcbiAgICBcbiAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1BPUlRGT0xJT19DQUNIRV9JTlZBTElEQVRJT04nLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnR2l0SHViUG9ydGZvbGlvSW5kZXhlci5pbnZhbGlkYXRlQWZ0ZXJBY3Rpb24nLFxuICAgICAgZGV0YWlsczogYENhY2hlIGludmFsaWRhdGVkIGFmdGVyIHVzZXIgYWN0aW9uOiAke2FjdGlvbn1gLFxuICAgICAgbWV0YWRhdGE6IHsgYWN0aW9uIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgY2FjaGVkIGRhdGFcbiAgICovXG4gIHB1YmxpYyBjbGVhckNhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGUgPSBudWxsO1xuICAgIHRoaXMubGFzdEZldGNoID0gbnVsbDtcbiAgICB0aGlzLnJlY2VudFVzZXJBY3Rpb24gPSBmYWxzZTtcbiAgICB0aGlzLmFjdGlvblRpbWVzdGFtcCA9IG51bGw7XG4gICAgdGhpcy5hcGlDYWNoZS5jbGVhcigpO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdHaXRIdWIgcG9ydGZvbGlvIGNhY2hlIGNsZWFyZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGUgc3RhdGlzdGljc1xuICAgKi9cbiAgcHVibGljIGdldENhY2hlU3RhdHMoKToge1xuICAgIGhhc0NhY2hlZERhdGE6IGJvb2xlYW47XG4gICAgbGFzdEZldGNoOiBEYXRlIHwgbnVsbDtcbiAgICBpc1N0YWxlOiBib29sZWFuO1xuICAgIHJlY2VudFVzZXJBY3Rpb246IGJvb2xlYW47XG4gICAgdG90YWxFbGVtZW50czogbnVtYmVyO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzQ2FjaGVkRGF0YTogdGhpcy5jYWNoZSAhPT0gbnVsbCxcbiAgICAgIGxhc3RGZXRjaDogdGhpcy5sYXN0RmV0Y2gsXG4gICAgICBpc1N0YWxlOiAhdGhpcy5pc0NhY2hlVmFsaWQoKSxcbiAgICAgIHJlY2VudFVzZXJBY3Rpb246IHRoaXMucmVjZW50VXNlckFjdGlvbixcbiAgICAgIHRvdGFsRWxlbWVudHM6IHRoaXMuY2FjaGU/LnRvdGFsRWxlbWVudHMgfHwgMFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggZnJlc2ggZGF0YSBmcm9tIEdpdEh1YlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEZyZXNoKCk6IFByb21pc2U8R2l0SHViUG9ydGZvbGlvSW5kZXg+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxvZ2dlci5pbmZvKCdGZXRjaGluZyBmcmVzaCBHaXRIdWIgcG9ydGZvbGlvIGluZGV4Li4uJyk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCBHaXRIdWIgdXNlcm5hbWUgZnJvbSB0b2tlblxuICAgICAgY29uc3QgdXNlcm5hbWUgPSBhd2FpdCB0aGlzLmdldEdpdEh1YlVzZXJuYW1lKCk7XG4gICAgICBjb25zdCByZXBvc2l0b3J5ID0gdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5nZXRSZXBvc2l0b3J5TmFtZSgpO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBwb3J0Zm9saW8gcmVwb3NpdG9yeSBleGlzdHNcbiAgICAgIGNvbnN0IHJlcG9FeGlzdHMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb1JlcG9NYW5hZ2VyLmNoZWNrUG9ydGZvbGlvRXhpc3RzKHVzZXJuYW1lKTtcbiAgICAgIGlmICghcmVwb0V4aXN0cykge1xuICAgICAgICBsb2dnZXIuaW5mbygnR2l0SHViIHBvcnRmb2xpbyByZXBvc2l0b3J5IGRvZXMgbm90IGV4aXN0JywgeyB1c2VybmFtZSB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRW1wdHlJbmRleCh1c2VybmFtZSwgcmVwb3NpdG9yeSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZldGNoIHJlcG9zaXRvcnkgY29udGVudCB1c2luZyBHaXRIdWIgQVBJXG4gICAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZmV0Y2hSZXBvc2l0b3J5Q29udGVudCh1c2VybmFtZSwgcmVwb3NpdG9yeSk7XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSBjYWNoZVxuICAgICAgdGhpcy5jYWNoZSA9IGluZGV4O1xuICAgICAgdGhpcy5sYXN0RmV0Y2ggPSBuZXcgRGF0ZSgpO1xuICAgICAgdGhpcy5yZWNlbnRVc2VyQWN0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLmFjdGlvblRpbWVzdGFtcCA9IG51bGw7XG4gICAgICBcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGxvZ2dlci5pbmZvKCdHaXRIdWIgcG9ydGZvbGlvIGluZGV4IGZldGNoZWQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgdG90YWxFbGVtZW50czogaW5kZXgudG90YWxFbGVtZW50cyxcbiAgICAgICAgZHVyYXRpb246IGAke2R1cmF0aW9ufW1zYCxcbiAgICAgICAgcmF0ZUxpbWl0UmVtYWluaW5nOiBpbmRleC5yYXRlTGltaXRJbmZvPy5yZW1haW5pbmdcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BPUlRGT0xJT19GRVRDSF9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdHaXRIdWJQb3J0Zm9saW9JbmRleGVyLmZldGNoRnJlc2gnLFxuICAgICAgICBkZXRhaWxzOiBgRmV0Y2hlZCBHaXRIdWIgcG9ydGZvbGlvIHdpdGggJHtpbmRleC50b3RhbEVsZW1lbnRzfSBlbGVtZW50cyBpbiAke2R1cmF0aW9ufW1zYCxcbiAgICAgICAgbWV0YWRhdGE6IHsgdXNlcm5hbWUsIGR1cmF0aW9uLCB0b3RhbEVsZW1lbnRzOiBpbmRleC50b3RhbEVsZW1lbnRzIH1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdHaXRIdWJQb3J0Zm9saW9JbmRleGVyLmZldGNoRnJlc2gnLCBlcnJvciwgeyBkdXJhdGlvbiB9KTtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci53cmFwRXJyb3IoZXJyb3IsICdGYWlsZWQgdG8gZmV0Y2ggR2l0SHViIHBvcnRmb2xpbyBpbmRleCcsIEVycm9yQ2F0ZWdvcnkuTkVUV09SS19FUlJPUik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHJlcG9zaXRvcnkgY29udGVudCBmcm9tIEdpdEh1YiBBUElcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hSZXBvc2l0b3J5Q29udGVudCh1c2VybmFtZTogc3RyaW5nLCByZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPEdpdEh1YlBvcnRmb2xpb0luZGV4PiB7XG4gICAgLy8gVHJ5IEdyYXBoUUwgZmlyc3QgZm9yIGJldHRlciBwZXJmb3JtYW5jZSwgZmFsbGJhY2sgdG8gUkVTVFxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5mZXRjaFdpdGhHcmFwaFFMKHVzZXJuYW1lLCByZXBvc2l0b3J5KTtcbiAgICB9IGNhdGNoIChncmFwaHFsRXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnR3JhcGhRTCBmZXRjaCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBSRVNUIEFQSScsIHtcbiAgICAgICAgZXJyb3I6IGdyYXBocWxFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZ3JhcGhxbEVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZ3JhcGhxbEVycm9yKVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZldGNoV2l0aFJFU1QodXNlcm5hbWUsIHJlcG9zaXRvcnkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB1c2luZyBHcmFwaFFMIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hXaXRoR3JhcGhRTCh1c2VybmFtZTogc3RyaW5nLCByZXBvc2l0b3J5OiBzdHJpbmcpOiBQcm9taXNlPEdpdEh1YlBvcnRmb2xpb0luZGV4PiB7XG4gICAgY29uc3QgcXVlcnkgPSBgXG4gICAgICBxdWVyeSBHZXRQb3J0Zm9saW9Db250ZW50KCRvd25lcjogU3RyaW5nISwgJG5hbWU6IFN0cmluZyEpIHtcbiAgICAgICAgcmVwb3NpdG9yeShvd25lcjogJG93bmVyLCBuYW1lOiAkbmFtZSkge1xuICAgICAgICAgIGRlZmF1bHRCcmFuY2hSZWYge1xuICAgICAgICAgICAgdGFyZ2V0IHtcbiAgICAgICAgICAgICAgLi4uIG9uIENvbW1pdCB7XG4gICAgICAgICAgICAgICAgb2lkXG4gICAgICAgICAgICAgICAgaGlzdG9yeShmaXJzdDogMSkge1xuICAgICAgICAgICAgICAgICAgbm9kZXMge1xuICAgICAgICAgICAgICAgICAgICBjb21taXR0ZWREYXRlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIG9iamVjdChleHByZXNzaW9uOiBcIkhFQUQ6XCIpIHtcbiAgICAgICAgICAgIC4uLiBvbiBUcmVlIHtcbiAgICAgICAgICAgICAgZW50cmllcyB7XG4gICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICAgICBvYmplY3Qge1xuICAgICAgICAgICAgICAgICAgLi4uIG9uIFRyZWUge1xuICAgICAgICAgICAgICAgICAgICBlbnRyaWVzIHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgICAgICAgICAgIG9pZFxuICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4gb24gQmxvYiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVTaXplXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmF0ZUxpbWl0IHtcbiAgICAgICAgICByZW1haW5pbmdcbiAgICAgICAgICByZXNldEF0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICAgIFxuICAgIGNvbnN0IHZhcmlhYmxlcyA9IHsgb3duZXI6IHVzZXJuYW1lLCBuYW1lOiByZXBvc2l0b3J5IH07XG4gICAgXG4gICAgLy8gR3JhcGhRTCBlbmRwb2ludCBub3QgeWV0IGltcGxlbWVudGVkIHdpdGggUG9ydGZvbGlvUmVwb01hbmFnZXJcbiAgICAvLyBGb3Igbm93LCBqdXN0IHRocm93IHRvIGZhbGwgYmFjayB0byBSRVNUXG4gICAgdGhyb3cgbmV3IEVycm9yKCdHcmFwaFFMIG5vdCB5ZXQgaW1wbGVtZW50ZWQgZm9yIHBvcnRmb2xpbyBvcGVyYXRpb25zJyk7XG4gICAgXG4gICAgLy8gTm90ZTogVGhpcyBpcyBhIHNpbXBsaWZpZWQgR3JhcGhRTCBpbXBsZW1lbnRhdGlvblxuICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgeW91IHdvdWxkIHNlbmQgUE9TVCByZXF1ZXN0IHdpdGggcXVlcnkgYW5kIHZhcmlhYmxlc1xuICAgIHRocm93IG5ldyBFcnJvcignR3JhcGhRTCBpbXBsZW1lbnRhdGlvbiBub3QgeWV0IGNvbXBsZXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdXNpbmcgUkVTVCBBUEkgd2l0aCBwYWdpbmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoV2l0aFJFU1QodXNlcm5hbWU6IHN0cmluZywgcmVwb3NpdG9yeTogc3RyaW5nKTogUHJvbWlzZTxHaXRIdWJQb3J0Zm9saW9JbmRleD4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRVc2VybmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHVzZXJuYW1lKS5ub3JtYWxpemVkQ29udGVudDtcbiAgICBcbiAgICAvLyBHZXQgcmVwb3NpdG9yeSBpbmZvIGFuZCBsYXRlc3QgY29tbWl0XG4gICAgY29uc3QgcmVwb0luZm8gPSBhd2FpdCB0aGlzLnBvcnRmb2xpb1JlcG9NYW5hZ2VyLmdpdGh1YlJlcXVlc3QoXG4gICAgICBgL3JlcG9zLyR7bm9ybWFsaXplZFVzZXJuYW1lfS8ke3JlcG9zaXRvcnl9YFxuICAgICk7XG4gICAgXG4gICAgY29uc3QgbGF0ZXN0Q29tbWl0ID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5naXRodWJSZXF1ZXN0KFxuICAgICAgYC9yZXBvcy8ke25vcm1hbGl6ZWRVc2VybmFtZX0vJHtyZXBvc2l0b3J5fS9jb21taXRzL0hFQURgXG4gICAgKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGluZGV4XG4gICAgY29uc3QgaW5kZXg6IEdpdEh1YlBvcnRmb2xpb0luZGV4ID0ge1xuICAgICAgdXNlcm5hbWU6IG5vcm1hbGl6ZWRVc2VybmFtZSxcbiAgICAgIHJlcG9zaXRvcnksXG4gICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUobGF0ZXN0Q29tbWl0LmNvbW1pdC5jb21taXR0ZXIuZGF0ZSksXG4gICAgICBlbGVtZW50czogbmV3IE1hcCgpLFxuICAgICAgdG90YWxFbGVtZW50czogMCxcbiAgICAgIHNoYTogbGF0ZXN0Q29tbWl0LnNoYVxuICAgIH07XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBlbGVtZW50IHR5cGUgbWFwc1xuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIGluZGV4LmVsZW1lbnRzLnNldChlbGVtZW50VHlwZSwgW10pO1xuICAgIH1cbiAgICBcbiAgICAvLyBGZXRjaCBjb250ZW50IGZvciBlYWNoIGVsZW1lbnQgdHlwZVxuICAgIGxvZ2dlci5pbmZvKGBGZXRjaGluZyBjb250ZW50IGZvciBhbGwgZWxlbWVudCB0eXBlcyBmcm9tIEdpdEh1YiBwb3J0Zm9saW8uLi5gKTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYEZldGNoaW5nICR7ZWxlbWVudFR5cGV9IGZyb20gR2l0SHViLi4uYCk7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBhd2FpdCB0aGlzLmZldGNoRWxlbWVudFR5cGVDb250ZW50KG5vcm1hbGl6ZWRVc2VybmFtZSwgcmVwb3NpdG9yeSwgZWxlbWVudFR5cGUpO1xuICAgICAgICBpbmRleC5lbGVtZW50cy5zZXQoZWxlbWVudFR5cGUsIGVudHJpZXMpO1xuICAgICAgICBpbmRleC50b3RhbEVsZW1lbnRzICs9IGVudHJpZXMubGVuZ3RoO1xuICAgICAgICBcbiAgICAgICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGDinIUgRm91bmQgJHtlbnRyaWVzLmxlbmd0aH0gJHtlbGVtZW50VHlwZX0gaW4gR2l0SHViIHBvcnRmb2xpb2ApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1Zyhg8J+TgSBObyAke2VsZW1lbnRUeXBlfSBmb3VuZCAoZGlyZWN0b3J5IG1heSBub3QgZXhpc3QgeWV0KWApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIud2Fybihg4p2MIEZhaWxlZCB0byBmZXRjaCAke2VsZW1lbnRUeXBlfSBmcm9tIEdpdEh1YiBwb3J0Zm9saW9gLCB7XG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICBlbGVtZW50VHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ29udGludWUgd2l0aCBvdGhlciBlbGVtZW50IHR5cGVzXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBjb250ZW50IGZvciBhIHNwZWNpZmljIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaEVsZW1lbnRUeXBlQ29udGVudChcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHJlcG9zaXRvcnk6IHN0cmluZyxcbiAgICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGVcbiAgKTogUHJvbWlzZTxHaXRIdWJJbmRleEVudHJ5W10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IGRpcmVjdG9yeSBsaXN0aW5nIHVzaW5nIFBvcnRmb2xpb1JlcG9NYW5hZ2VyXG4gICAgICBjb25zdCBjb250ZW50cyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvUmVwb01hbmFnZXIuZ2l0aHViUmVxdWVzdChcbiAgICAgICAgYC9yZXBvcy8ke3VzZXJuYW1lfS8ke3JlcG9zaXRvcnl9L2NvbnRlbnRzLyR7ZWxlbWVudFR5cGV9YFxuICAgICAgKTtcbiAgICAgIFxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnRzKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IGVudHJpZXM6IEdpdEh1YkluZGV4RW50cnlbXSA9IFtdO1xuICAgICAgY29uc3QgbWF4Q29uY3VycmVudCA9IDU7IC8vIExpbWl0IGNvbmN1cnJlbnQgcmVxdWVzdHNcbiAgICAgIFxuICAgICAgLy8gUHJvY2VzcyBmaWxlcyBpbiBiYXRjaGVzIHRvIGF2b2lkIHJhdGUgbGltaXRpbmdcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudHMubGVuZ3RoOyBpICs9IG1heENvbmN1cnJlbnQpIHtcbiAgICAgICAgY29uc3QgYmF0Y2ggPSBjb250ZW50cy5zbGljZShpLCBpICsgbWF4Q29uY3VycmVudCk7XG4gICAgICAgIGNvbnN0IGJhdGNoUHJvbWlzZXMgPSBiYXRjaFxuICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtLnR5cGUgPT09ICdmaWxlJyAmJiBpdGVtLm5hbWUuZW5kc1dpdGgoJy5tZCcpKVxuICAgICAgICAgIC5tYXAoaXRlbSA9PiB0aGlzLmNyZWF0ZUdpdEh1YkluZGV4RW50cnkodXNlcm5hbWUsIHJlcG9zaXRvcnksIGVsZW1lbnRUeXBlLCBpdGVtKSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoYmF0Y2hQcm9taXNlcyk7XG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBiYXRjaFJlc3VsdHMpIHtcbiAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgJiYgcmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEFkZCBkZWxheSBiZXR3ZWVuIGJhdGNoZXMgdG8gcmVzcGVjdCByYXRlIGxpbWl0c1xuICAgICAgICBpZiAoaSArIG1heENvbmN1cnJlbnQgPCBjb250ZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRGlyZWN0b3J5IG1pZ2h0IG5vdCBleGlzdCAtIGNoZWNrIGZvciA0MDQgZXJyb3JzXG4gICAgICAvLyBQb3J0Zm9saW9SZXBvTWFuYWdlciB3aWxsIHRocm93IHN0YW5kYXJkIEdpdEh1YiBBUEkgZXJyb3JzXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAvLyBDaGVjayBmb3IgNDA0IE5vdCBGb3VuZCBlcnJvcnMgZnJvbSBHaXRIdWIgQVBJXG4gICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCc0MDQnKSB8fCBcbiAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ05vdCBGb3VuZCcpKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBEaXJlY3RvcnkgJHtlbGVtZW50VHlwZX0gbm90IGZvdW5kIGluIEdpdEh1YiByZXBvc2l0b3J5ICh0aGlzIGlzIG5vcm1hbCBpZiBub3QgeWV0IGNyZWF0ZWQpYCk7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBMb2cgdGhlIGFjdHVhbCBlcnJvciBmb3IgZGVidWdnaW5nXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRXJyb3IgZmV0Y2hpbmcgJHtlbGVtZW50VHlwZX06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmUtdGhyb3cgb3RoZXIgZXJyb3JzXG4gICAgICBsb2dnZXIud2FybihgVW5leHBlY3RlZCBlcnJvciBmZXRjaGluZyAke2VsZW1lbnRUeXBlfTpgLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIEdpdEh1YiBpbmRleCBlbnRyeSBmcm9tIEFQSSByZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVHaXRIdWJJbmRleEVudHJ5KFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcmVwb3NpdG9yeTogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSxcbiAgICBmaWxlSW5mbzogYW55XG4gICk6IFByb21pc2U8R2l0SHViSW5kZXhFbnRyeSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgLy8gUGFyc2UgbWV0YWRhdGEgZnJvbSBmaWxlbmFtZSBvciBmZXRjaCBjb250ZW50IGlmIG5lZWRlZFxuICAgICAgLy8gRklYOiBLZWVwIG9yaWdpbmFsIGZpbGVuYW1lIGZvcm1hdCB0byBtYXRjaCBsb2NhbCBmaWxlIGV4cGVjdGF0aW9uc1xuICAgICAgLy8gUHJldmlvdXNseTogLnJlcGxhY2UoLy0vZywgJyAnKSBjb252ZXJ0ZWQgaHlwaGVucyB0byBzcGFjZXMgY2F1c2luZyBzeW5jIG1pc21hdGNoXG4gICAgICBjb25zdCBuYW1lID0gZmlsZUluZm8ubmFtZS5yZXBsYWNlKCcubWQnLCAnJyk7XG4gICAgICBcbiAgICAgIGNvbnN0IGVudHJ5OiBHaXRIdWJJbmRleEVudHJ5ID0ge1xuICAgICAgICBwYXRoOiBmaWxlSW5mby5wYXRoLFxuICAgICAgICBuYW1lLFxuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgc2hhOiBmaWxlSW5mby5zaGEsXG4gICAgICAgIGh0bWxVcmw6IGZpbGVJbmZvLmh0bWxfdXJsLFxuICAgICAgICBkb3dubG9hZFVybDogZmlsZUluZm8uZG93bmxvYWRfdXJsLFxuICAgICAgICBsYXN0TW9kaWZpZWQ6IG5ldyBEYXRlKCksIC8vIEdpdEh1YiBBUEkgZG9lc24ndCBwcm92aWRlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUgZGlyZWN0bHlcbiAgICAgICAgc2l6ZTogZmlsZUluZm8uc2l6ZSB8fCAwXG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBPcHRpb25hbGx5IGZldGNoIGNvbnRlbnQgdG8gZXh0cmFjdCBtZXRhZGF0YVxuICAgICAgLy8gVGhpcyBpcyBleHBlbnNpdmUsIHNvIG9ubHkgZG8gaXQgZm9yIHNtYWxsIGZpbGVzIG9yIHdoZW4gc3BlY2lmaWNhbGx5IG5lZWRlZFxuICAgICAgaWYgKGZpbGVJbmZvLnNpemUgJiYgZmlsZUluZm8uc2l6ZSA8IDEwMDAwKSB7IC8vIE9ubHkgZm9yIGZpbGVzIDwgMTBLQlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEZvciBkb3dubG9hZCBVUkxzLCB3ZSBuZWVkIHRvIGZldGNoIGRpcmVjdGx5LCBub3QgdGhyb3VnaCBBUElcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGZpbGVJbmZvLmRvd25sb2FkX3VybCk7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMucGFyc2VNZXRhZGF0YUZyb21Db250ZW50KGNvbnRlbnQpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChtZXRhZGF0YS5uYW1lKSBlbnRyeS5uYW1lID0gbWV0YWRhdGEubmFtZTtcbiAgICAgICAgICBpZiAobWV0YWRhdGEuZGVzY3JpcHRpb24pIGVudHJ5LmRlc2NyaXB0aW9uID0gbWV0YWRhdGEuZGVzY3JpcHRpb247XG4gICAgICAgICAgaWYgKG1ldGFkYXRhLnZlcnNpb24pIGVudHJ5LnZlcnNpb24gPSBtZXRhZGF0YS52ZXJzaW9uO1xuICAgICAgICAgIGlmIChtZXRhZGF0YS5hdXRob3IpIGVudHJ5LmF1dGhvciA9IG1ldGFkYXRhLmF1dGhvcjtcbiAgICAgICAgfSBjYXRjaCAobWV0YWRhdGFFcnJvcikge1xuICAgICAgICAgIC8vIE5vbi1jcml0aWNhbCBlcnJvciwgY29udGludWUgd2l0aG91dCBtZXRhZGF0YVxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRmFpbGVkIHRvIGZldGNoIG1ldGFkYXRhIGZvciBmaWxlJywge1xuICAgICAgICAgICAgcGF0aDogZmlsZUluZm8ucGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBtZXRhZGF0YUVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBtZXRhZGF0YUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcobWV0YWRhdGFFcnJvcilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gY3JlYXRlIEdpdEh1YiBpbmRleCBlbnRyeScsIHtcbiAgICAgICAgcGF0aDogZmlsZUluZm8ucGF0aCxcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgbWV0YWRhdGEgZnJvbSBmaWxlIGNvbnRlbnQgKGZyb250bWF0dGVyKVxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZU1ldGFkYXRhRnJvbUNvbnRlbnQoY29udGVudDogc3RyaW5nKToge1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgdmVyc2lvbj86IHN0cmluZztcbiAgICBhdXRob3I/OiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBhbnkgPSB7fTtcbiAgICBcbiAgICAvLyBTaW1wbGUgZnJvbnRtYXR0ZXIgcGFyc2luZyAoY291bGQgdXNlIGEgcHJvcGVyIFlBTUwgcGFyc2VyKVxuICAgIGNvbnN0IGZyb250bWF0dGVyTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9eLS0tXFxuKFtcXHNcXFNdKj8pXFxuLS0tLyk7XG4gICAgaWYgKGZyb250bWF0dGVyTWF0Y2gpIHtcbiAgICAgIGNvbnN0IGZyb250bWF0dGVyID0gZnJvbnRtYXR0ZXJNYXRjaFsxXTtcbiAgICAgIFxuICAgICAgY29uc3QgbmFtZU1hdGNoID0gZnJvbnRtYXR0ZXIubWF0Y2goL15uYW1lOlxccyooLispJC9tKTtcbiAgICAgIGlmIChuYW1lTWF0Y2gpIG1ldGFkYXRhLm5hbWUgPSBuYW1lTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgXG4gICAgICBjb25zdCBkZXNjTWF0Y2ggPSBmcm9udG1hdHRlci5tYXRjaCgvXmRlc2NyaXB0aW9uOlxccyooLispJC9tKTtcbiAgICAgIGlmIChkZXNjTWF0Y2gpIG1ldGFkYXRhLmRlc2NyaXB0aW9uID0gZGVzY01hdGNoWzFdLnRyaW0oKTtcbiAgICAgIFxuICAgICAgY29uc3QgdmVyc2lvbk1hdGNoID0gZnJvbnRtYXR0ZXIubWF0Y2goL152ZXJzaW9uOlxccyooLispJC9tKTtcbiAgICAgIGlmICh2ZXJzaW9uTWF0Y2gpIG1ldGFkYXRhLnZlcnNpb24gPSB2ZXJzaW9uTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgXG4gICAgICBjb25zdCBhdXRob3JNYXRjaCA9IGZyb250bWF0dGVyLm1hdGNoKC9eYXV0aG9yOlxccyooLispJC9tKTtcbiAgICAgIGlmIChhdXRob3JNYXRjaCkgbWV0YWRhdGEuYXV0aG9yID0gYXV0aG9yTWF0Y2hbMV0udHJpbSgpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEdpdEh1YiB1c2VybmFtZSBmcm9tIGF1dGhlbnRpY2F0ZWQgdG9rZW5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0R2l0SHViVXNlcm5hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXNlckluZm8gPSBhd2FpdCB0aGlzLnBvcnRmb2xpb1JlcG9NYW5hZ2VyLmdpdGh1YlJlcXVlc3QoJy91c2VyJyk7XG4gICAgICByZXR1cm4gdXNlckluZm8ubG9naW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBHaXRIdWIgdXNlcm5hbWUuIFBsZWFzZSBlbnN1cmUgeW91IGFyZSBhdXRoZW50aWNhdGVkIHdpdGggR2l0SHViLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjYWNoZSBpcyB2YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSBpc0NhY2hlVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNhY2hlIHx8ICF0aGlzLmxhc3RGZXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gdGhpcy5sYXN0RmV0Y2guZ2V0VGltZSgpO1xuICAgIHJldHVybiBhZ2UgPCB0aGlzLnR0bDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGZldGNoIGZyZXNoIGRhdGFcbiAgICovXG4gIHByaXZhdGUgc2hvdWxkRmV0Y2hGcmVzaCgpOiBib29sZWFuIHtcbiAgICAvLyBBbHdheXMgZmV0Y2ggaWYgbm8gY2FjaGVcbiAgICBpZiAoIXRoaXMuY2FjaGUgfHwgIXRoaXMubGFzdEZldGNoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIHJlY2VudCB1c2VyIGFjdGlvbnNcbiAgICBpZiAodGhpcy5yZWNlbnRVc2VyQWN0aW9uICYmIHRoaXMuYWN0aW9uVGltZXN0YW1wKSB7XG4gICAgICBjb25zdCBhY3Rpb25BZ2UgPSBEYXRlLm5vdygpIC0gdGhpcy5hY3Rpb25UaW1lc3RhbXAuZ2V0VGltZSgpO1xuICAgICAgaWYgKGFjdGlvbkFnZSA8IHRoaXMuYWN0aW9uR3JhY2VQZXJpb2QpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdGZXRjaGluZyBmcmVzaCBkdWUgdG8gcmVjZW50IHVzZXIgYWN0aW9uJywgeyBhY3Rpb25BZ2UgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gR3JhY2UgcGVyaW9kIGV4cGlyZWQsIGNsZWFyIGFjdGlvbiBmbGFnXG4gICAgICAgIHRoaXMucmVjZW50VXNlckFjdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFjdGlvblRpbWVzdGFtcCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIFRUTFxuICAgIHJldHVybiAhdGhpcy5pc0NhY2hlVmFsaWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgZW1wdHkgaW5kZXggd2hlbiBubyBwb3J0Zm9saW8gZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUVtcHR5SW5kZXgodXNlcm5hbWU/OiBzdHJpbmcsIHJlcG9zaXRvcnk/OiBzdHJpbmcpOiBHaXRIdWJQb3J0Zm9saW9JbmRleCB7XG4gICAgY29uc3QgaW5kZXg6IEdpdEh1YlBvcnRmb2xpb0luZGV4ID0ge1xuICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lIHx8ICd1bmtub3duJyxcbiAgICAgIHJlcG9zaXRvcnk6IHJlcG9zaXRvcnkgfHwgdGhpcy5wb3J0Zm9saW9SZXBvTWFuYWdlci5nZXRSZXBvc2l0b3J5TmFtZSgpLFxuICAgICAgbGFzdFVwZGF0ZWQ6IG5ldyBEYXRlKCksXG4gICAgICBlbGVtZW50czogbmV3IE1hcCgpLFxuICAgICAgdG90YWxFbGVtZW50czogMCxcbiAgICAgIHNoYTogJydcbiAgICB9O1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZW1wdHkgZWxlbWVudCB0eXBlIG1hcHNcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICBpbmRleC5lbGVtZW50cy5zZXQoZWxlbWVudFR5cGUsIFtdKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59Il19
@@ -2,7 +2,7 @@
2
2
  * Portfolio Index Manager - Maps element names to file paths
3
3
  *
4
4
  * Solves critical issues:
5
- * 1. submit_content can't find elements by metadata name (e.g., "Safe Roundtrip Tester" -> "safe-roundtrip-tester.md")
5
+ * 1. submit_collection_content can't find elements by metadata name (e.g., "Safe Roundtrip Tester" -> "safe-roundtrip-tester.md")
6
6
  * 2. search_collection doesn't search local portfolio content
7
7
  *
8
8
  * Features:
@@ -2,7 +2,7 @@
2
2
  * Portfolio Index Manager - Maps element names to file paths
3
3
  *
4
4
  * Solves critical issues:
5
- * 1. submit_content can't find elements by metadata name (e.g., "Safe Roundtrip Tester" -> "safe-roundtrip-tester.md")
5
+ * 1. submit_collection_content can't find elements by metadata name (e.g., "Safe Roundtrip Tester" -> "safe-roundtrip-tester.md")
6
6
  * 2. search_collection doesn't search local portfolio content
7
7
  *
8
8
  * Features:
@@ -475,4 +475,4 @@ export class PortfolioIndexManager {
475
475
  return queryTokens.some(token => text.includes(token));
476
476
  }
477
477
  }
478
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BvcnRmb2xpby9Qb3J0Zm9saW9JbmRleE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUE4Q3ZFLE1BQU0sT0FBTyxxQkFBcUI7SUFDeEIsTUFBTSxDQUFDLFFBQVEsR0FBaUMsSUFBSSxDQUFDO0lBQ3JELE1BQU0sQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRTVCLEtBQUssR0FBMEIsSUFBSSxDQUFDO0lBQ3BDLFNBQVMsR0FBZ0IsSUFBSSxDQUFDO0lBQ3JCLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLFlBQVk7SUFDN0MsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixZQUFZLEdBQXlCLElBQUksQ0FBQztJQUVsRDtRQUNFLE1BQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQVc7UUFDdkIs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TUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWpFLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZLENBQUMsSUFBWSxFQUFFLFdBQXFCO1FBQ3RELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0Zm9saW8gSW5kZXggTWFuYWdlciAtIE1hcHMgZWxlbWVudCBuYW1lcyB0byBmaWxlIHBhdGhzXG4gKiBcbiAqIFNvbHZlcyBjcml0aWNhbCBpc3N1ZXM6XG4gKiAxLiBzdWJtaXRfY29udGVudCBjYW4ndCBmaW5kIGVsZW1lbnRzIGJ5IG1ldGFkYXRhIG5hbWUgKGUuZy4sIFwiU2FmZSBSb3VuZHRyaXAgVGVzdGVyXCIgLT4gXCJzYWZlLXJvdW5kdHJpcC10ZXN0ZXIubWRcIilcbiAqIDIuIHNlYXJjaF9jb2xsZWN0aW9uIGRvZXNuJ3Qgc2VhcmNoIGxvY2FsIHBvcnRmb2xpbyBjb250ZW50XG4gKiBcbiAqIEZlYXR1cmVzOlxuICogLSBJbi1tZW1vcnkgaW5kZXggbWFwcGluZyBtZXRhZGF0YS5uYW1lIOKGkiBmaWxlIHBhdGhcbiAqIC0gS2V5d29yZHMvdGFncyDihpIgZmlsZSBwYXRocyBtYXBwaW5nXG4gKiAtIEVsZW1lbnQgdHlwZSDihpIgZmlsZSBwYXRocyBtYXBwaW5nXG4gKiAtIEZhc3QgTygxKSBsb29rdXBzIHdpdGggTWFwc1xuICogLSBMYXp5IGxvYWRpbmcgd2l0aCA1LW1pbnV0ZSBUVEwgY2FjaGVcbiAqIC0gVW5pY29kZSBub3JtYWxpemF0aW9uIGZvciBzZWN1cml0eVxuICogLSBFcnJvciBoYW5kbGluZyBhbmQgbG9nZ2luZ1xuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuL1BvcnRmb2xpb01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBFcnJvckNhdGVnb3J5IH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJbmRleEVudHJ5IHtcbiAgZmlsZVBhdGg6IHN0cmluZztcbiAgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlO1xuICBtZXRhZGF0YToge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB2ZXJzaW9uPzogc3RyaW5nO1xuICAgIGF1dGhvcj86IHN0cmluZztcbiAgICB0YWdzPzogc3RyaW5nW107XG4gICAga2V5d29yZHM/OiBzdHJpbmdbXTtcbiAgICB0cmlnZ2Vycz86IHN0cmluZ1tdO1xuICAgIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAgIGNyZWF0ZWQ/OiBzdHJpbmc7XG4gICAgdXBkYXRlZD86IHN0cmluZztcbiAgfTtcbiAgbGFzdE1vZGlmaWVkOiBEYXRlO1xuICBmaWxlbmFtZTogc3RyaW5nOyAvLyBCYXNlIGZpbGVuYW1lIHdpdGhvdXQgZXh0ZW5zaW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9ydGZvbGlvSW5kZXgge1xuICBieU5hbWU6IE1hcDxzdHJpbmcsIEluZGV4RW50cnk+O1xuICBieUZpbGVuYW1lOiBNYXA8c3RyaW5nLCBJbmRleEVudHJ5PjtcbiAgYnlUeXBlOiBNYXA8RWxlbWVudFR5cGUsIEluZGV4RW50cnlbXT47XG4gIGJ5S2V5d29yZDogTWFwPHN0cmluZywgSW5kZXhFbnRyeVtdPjtcbiAgYnlUYWc6IE1hcDxzdHJpbmcsIEluZGV4RW50cnlbXT47XG4gIGJ5VHJpZ2dlcjogTWFwPHN0cmluZywgSW5kZXhFbnRyeVtdPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgZWxlbWVudFR5cGU/OiBFbGVtZW50VHlwZTtcbiAgZnV6enlNYXRjaD86IGJvb2xlYW47XG4gIG1heFJlc3VsdHM/OiBudW1iZXI7XG4gIGluY2x1ZGVLZXl3b3Jkcz86IGJvb2xlYW47XG4gIGluY2x1ZGVUYWdzPzogYm9vbGVhbjtcbiAgaW5jbHVkZVRyaWdnZXJzPzogYm9vbGVhbjtcbiAgaW5jbHVkZURlc2NyaXB0aW9ucz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VhcmNoUmVzdWx0IHtcbiAgZW50cnk6IEluZGV4RW50cnk7XG4gIG1hdGNoVHlwZTogJ25hbWUnIHwgJ2ZpbGVuYW1lJyB8ICdrZXl3b3JkJyB8ICd0YWcnIHwgJ3RyaWdnZXInIHwgJ2Rlc2NyaXB0aW9uJztcbiAgc2NvcmU6IG51bWJlcjsgLy8gRm9yIGZ1dHVyZSByYW5raW5nXG59XG5cbmV4cG9ydCBjbGFzcyBQb3J0Zm9saW9JbmRleE1hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogUG9ydGZvbGlvSW5kZXhNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlTG9jayA9IGZhbHNlO1xuICBcbiAgcHJpdmF0ZSBpbmRleDogUG9ydGZvbGlvSW5kZXggfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0QnVpbHQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBUVExfTVMgPSA1ICogNjAgKiAxMDAwOyAvLyA1IG1pbnV0ZXNcbiAgcHJpdmF0ZSBpc0J1aWxkaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgYnVpbGRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICBsb2dnZXIuZGVidWcoJ1BvcnRmb2xpb0luZGV4TWFuYWdlciBjcmVhdGVkJyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6IFBvcnRmb2xpb0luZGV4TWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLmluc3RhbmNlKSB7XG4gICAgICBpZiAodGhpcy5pbnN0YW5jZUxvY2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3J0Zm9saW9JbmRleE1hbmFnZXIgaW5zdGFuY2UgaXMgYmVpbmcgY3JlYXRlZCBieSBhbm90aGVyIHRocmVhZCcpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmluc3RhbmNlTG9jayA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgUG9ydGZvbGlvSW5kZXhNYW5hZ2VyKCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLmluc3RhbmNlTG9jayA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgaW5kZXgsIGJ1aWxkaW5nIGl0IGlmIG5lY2Vzc2FyeVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEluZGV4KCk6IFByb21pc2U8UG9ydGZvbGlvSW5kZXg+IHtcbiAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHJlYnVpbGRcbiAgICBpZiAodGhpcy5uZWVkc1JlYnVpbGQoKSkge1xuICAgICAgYXdhaXQgdGhpcy5idWlsZEluZGV4KCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB0aGlzLmluZGV4ITtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggdGhlIHBvcnRmb2xpbyBpbmRleCBieSBuYW1lIHdpdGggZnV6enkgbWF0Y2hpbmdcbiAgICovXG4gIHB1YmxpYyBhc3luYyBmaW5kQnlOYW1lKG5hbWU6IHN0cmluZywgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEVudHJ5IHwgbnVsbD4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuICAgIFxuICAgIC8vIE5vcm1hbGl6ZSBpbnB1dCBmb3Igc2VjdXJpdHlcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG5hbWUpO1xuICAgIGlmICghbm9ybWFsaXplZE5hbWUuaXNWYWxpZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ludmFsaWQgVW5pY29kZSBpbiBzZWFyY2ggbmFtZScsIHtcbiAgICAgICAgaXNzdWVzOiBub3JtYWxpemVkTmFtZS5kZXRlY3RlZElzc3Vlc1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgc2FmZU5hbWUgPSBub3JtYWxpemVkTmFtZS5ub3JtYWxpemVkQ29udGVudDtcbiAgICBcbiAgICAvLyBUcnkgZXhhY3QgbWF0Y2ggZmlyc3QgKGNhc2UgaW5zZW5zaXRpdmUpXG4gICAgY29uc3QgZXhhY3RNYXRjaCA9IGluZGV4LmJ5TmFtZS5nZXQoc2FmZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgaWYgKGV4YWN0TWF0Y2gpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgZXhhY3QgbmFtZSBtYXRjaCcsIHsgbmFtZTogc2FmZU5hbWUsIGZpbGVQYXRoOiBleGFjdE1hdGNoLmZpbGVQYXRoIH0pO1xuICAgICAgcmV0dXJuIGV4YWN0TWF0Y2g7XG4gICAgfVxuICAgIFxuICAgIC8vIFRyeSBmaWxlbmFtZSBtYXRjaFxuICAgIGNvbnN0IGZpbGVuYW1lTWF0Y2ggPSBpbmRleC5ieUZpbGVuYW1lLmdldChzYWZlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoZmlsZW5hbWVNYXRjaCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBmaWxlbmFtZSBtYXRjaCcsIHsgbmFtZTogc2FmZU5hbWUsIGZpbGVQYXRoOiBmaWxlbmFtZU1hdGNoLmZpbGVQYXRoIH0pO1xuICAgICAgcmV0dXJuIGZpbGVuYW1lTWF0Y2g7XG4gICAgfVxuICAgIFxuICAgIC8vIFRyeSBmdXp6eSBtYXRjaGluZyBpZiBlbmFibGVkXG4gICAgaWYgKG9wdGlvbnMuZnV6enlNYXRjaCAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGZ1enp5TWF0Y2ggPSB0aGlzLmZpbmRGdXp6eU1hdGNoKHNhZmVOYW1lLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBpZiAoZnV6enlNYXRjaCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIGZ1enp5IG1hdGNoJywgeyBcbiAgICAgICAgICBuYW1lOiBzYWZlTmFtZSwgXG4gICAgICAgICAgbWF0Y2hOYW1lOiBmdXp6eU1hdGNoLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgZmlsZVBhdGg6IGZ1enp5TWF0Y2guZmlsZVBhdGggXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZnV6enlNYXRjaDtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKCdObyBtYXRjaCBmb3VuZCBmb3IgbmFtZScsIHsgbmFtZTogc2FmZU5hbWUgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHRoZSBwb3J0Zm9saW8gd2l0aCBjb21wcmVoZW5zaXZlIHRleHQgc2VhcmNoXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2VhcmNoUmVzdWx0W10+IHtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgoKTtcbiAgICBcbiAgICAvLyBOb3JtYWxpemUgcXVlcnkgZm9yIHNlY3VyaXR5XG4gICAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUocXVlcnkpO1xuICAgIGlmICghbm9ybWFsaXplZFF1ZXJ5LmlzVmFsaWQpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdJbnZhbGlkIFVuaWNvZGUgaW4gc2VhcmNoIHF1ZXJ5Jywge1xuICAgICAgICBpc3N1ZXM6IG5vcm1hbGl6ZWRRdWVyeS5kZXRlY3RlZElzc3Vlc1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHNhZmVRdWVyeSA9IG5vcm1hbGl6ZWRRdWVyeS5ub3JtYWxpemVkQ29udGVudC50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBjb25zdCBxdWVyeVRva2VucyA9IHNhZmVRdWVyeS5zcGxpdCgvXFxzKy8pLmZpbHRlcih0b2tlbiA9PiB0b2tlbi5sZW5ndGggPiAwKTtcbiAgICBcbiAgICBpZiAocXVlcnlUb2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHJlc3VsdHM6IFNlYXJjaFJlc3VsdFtdID0gW107XG4gICAgY29uc3Qgc2VlblBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgbWF4UmVzdWx0cyA9IG9wdGlvbnMubWF4UmVzdWx0cyB8fCAyMDtcbiAgICBcbiAgICAvLyBIZWxwZXIgdG8gYWRkIHVuaXF1ZSByZXN1bHRzXG4gICAgY29uc3QgYWRkUmVzdWx0ID0gKGVudHJ5OiBJbmRleEVudHJ5LCBtYXRjaFR5cGU6IFNlYXJjaFJlc3VsdFsnbWF0Y2hUeXBlJ10sIHNjb3JlOiBudW1iZXIgPSAxKSA9PiB7XG4gICAgICBpZiAoIXNlZW5QYXRocy5oYXMoZW50cnkuZmlsZVBhdGgpICYmIHJlc3VsdHMubGVuZ3RoIDwgbWF4UmVzdWx0cykge1xuICAgICAgICAvLyBGaWx0ZXIgYnkgZWxlbWVudCB0eXBlIGlmIHNwZWNpZmllZFxuICAgICAgICBpZiAob3B0aW9ucy5lbGVtZW50VHlwZSAmJiBlbnRyeS5lbGVtZW50VHlwZSAhPT0gb3B0aW9ucy5lbGVtZW50VHlwZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgc2VlblBhdGhzLmFkZChlbnRyeS5maWxlUGF0aCk7XG4gICAgICAgIHJlc3VsdHMucHVzaCh7IGVudHJ5LCBtYXRjaFR5cGUsIHNjb3JlIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgXG4gICAgLy8gMS4gU2VhcmNoIGJ5IG5hbWUgKGhpZ2hlc3QgcHJpb3JpdHkpXG4gICAgZm9yIChjb25zdCBbbmFtZSwgZW50cnldIG9mIGluZGV4LmJ5TmFtZSkge1xuICAgICAgaWYgKHRoaXMubWF0Y2hlc1F1ZXJ5KG5hbWUsIHF1ZXJ5VG9rZW5zKSkge1xuICAgICAgICBhZGRSZXN1bHQoZW50cnksICduYW1lJywgMyk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIDIuIFNlYXJjaCBieSBmaWxlbmFtZVxuICAgIGZvciAoY29uc3QgW2ZpbGVuYW1lLCBlbnRyeV0gb2YgaW5kZXguYnlGaWxlbmFtZSkge1xuICAgICAgaWYgKHRoaXMubWF0Y2hlc1F1ZXJ5KGZpbGVuYW1lLCBxdWVyeVRva2VucykpIHtcbiAgICAgICAgYWRkUmVzdWx0KGVudHJ5LCAnZmlsZW5hbWUnLCAyLjUpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyAzLiBTZWFyY2ggYnkga2V5d29yZHNcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlS2V5d29yZHMgIT09IGZhbHNlKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXl3b3JkLCBlbnRyaWVzXSBvZiBpbmRleC5ieUtleXdvcmQpIHtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hlc1F1ZXJ5KGtleXdvcmQsIHF1ZXJ5VG9rZW5zKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgYWRkUmVzdWx0KGVudHJ5LCAna2V5d29yZCcsIDIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyA0LiBTZWFyY2ggYnkgdGFnc1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVUYWdzICE9PSBmYWxzZSkge1xuICAgICAgZm9yIChjb25zdCBbdGFnLCBlbnRyaWVzXSBvZiBpbmRleC5ieVRhZykge1xuICAgICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkodGFnLCBxdWVyeVRva2VucykpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGFkZFJlc3VsdChlbnRyeSwgJ3RhZycsIDIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyA1LiBTZWFyY2ggYnkgdHJpZ2dlcnNcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlVHJpZ2dlcnMgIT09IGZhbHNlKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0cmlnZ2VyLCBlbnRyaWVzXSBvZiBpbmRleC5ieVRyaWdnZXIpIHtcbiAgICAgICAgaWYgKHRoaXMubWF0Y2hlc1F1ZXJ5KHRyaWdnZXIsIHF1ZXJ5VG9rZW5zKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgYWRkUmVzdWx0KGVudHJ5LCAndHJpZ2dlcicsIDEuOCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIDYuIFNlYXJjaCBieSBkZXNjcmlwdGlvblxuICAgIGlmIChvcHRpb25zLmluY2x1ZGVEZXNjcmlwdGlvbnMgIT09IGZhbHNlKSB7XG4gICAgICBmb3IgKGNvbnN0IFtfLCBlbnRyeV0gb2YgaW5kZXguYnlOYW1lKSB7XG4gICAgICAgIGlmIChlbnRyeS5tZXRhZGF0YS5kZXNjcmlwdGlvbiAmJiBcbiAgICAgICAgICAgIHRoaXMubWF0Y2hlc1F1ZXJ5KGVudHJ5Lm1ldGFkYXRhLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCksIHF1ZXJ5VG9rZW5zKSkge1xuICAgICAgICAgIGFkZFJlc3VsdChlbnRyeSwgJ2Rlc2NyaXB0aW9uJywgMS41KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBTb3J0IGJ5IHNjb3JlIChkZXNjZW5kaW5nKVxuICAgIHJlc3VsdHMuc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpO1xuICAgIFxuICAgIGxvZ2dlci5kZWJ1ZygnUG9ydGZvbGlvIHNlYXJjaCBjb21wbGV0ZWQnLCB7XG4gICAgICBxdWVyeTogc2FmZVF1ZXJ5LFxuICAgICAgcmVzdWx0Q291bnQ6IHJlc3VsdHMubGVuZ3RoLFxuICAgICAgdG90YWxJbmRleGVkOiBpbmRleC5ieU5hbWUuc2l6ZVxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZWxlbWVudHMgb2YgYSBzcGVjaWZpYyB0eXBlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RWxlbWVudHNCeVR5cGUoZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxJbmRleEVudHJ5W10+IHtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgoKTtcbiAgICByZXR1cm4gaW5kZXguYnlUeXBlLmdldChlbGVtZW50VHlwZSkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHN0YXRpc3RpY3MgYWJvdXQgdGhlIGluZGV4XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3RhdHMoKTogUHJvbWlzZTx7XG4gICAgdG90YWxFbGVtZW50czogbnVtYmVyO1xuICAgIGVsZW1lbnRzQnlUeXBlOiBSZWNvcmQ8RWxlbWVudFR5cGUsIG51bWJlcj47XG4gICAgbGFzdEJ1aWx0OiBEYXRlIHwgbnVsbDtcbiAgICBpc1N0YWxlOiBib29sZWFuO1xuICB9PiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG4gICAgY29uc3Qgc3RhdHMgPSB7XG4gICAgICB0b3RhbEVsZW1lbnRzOiBpbmRleC5ieU5hbWUuc2l6ZSxcbiAgICAgIGVsZW1lbnRzQnlUeXBlOiB7fSBhcyBSZWNvcmQ8RWxlbWVudFR5cGUsIG51bWJlcj4sXG4gICAgICBsYXN0QnVpbHQ6IHRoaXMubGFzdEJ1aWx0LFxuICAgICAgaXNTdGFsZTogdGhpcy5uZWVkc1JlYnVpbGQoKVxuICAgIH07XG4gICAgXG4gICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgc3RhdHMuZWxlbWVudHNCeVR5cGVbZWxlbWVudFR5cGVdID0gKGluZGV4LmJ5VHlwZS5nZXQoZWxlbWVudFR5cGUpIHx8IFtdKS5sZW5ndGg7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzdGF0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSByZWJ1aWxkIHRoZSBpbmRleFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYnVpbGRJbmRleCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmluZGV4ID0gbnVsbDtcbiAgICB0aGlzLmxhc3RCdWlsdCA9IG51bGw7XG4gICAgYXdhaXQgdGhpcy5idWlsZEluZGV4KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGluZGV4IG5lZWRzIHJlYnVpbGRpbmdcbiAgICovXG4gIHByaXZhdGUgbmVlZHNSZWJ1aWxkKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pbmRleCB8fCAhdGhpcy5sYXN0QnVpbHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBhZ2UgPSBEYXRlLm5vdygpIC0gdGhpcy5sYXN0QnVpbHQuZ2V0VGltZSgpO1xuICAgIHJldHVybiBhZ2UgPiB0aGlzLlRUTF9NUztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgaW5kZXggYnkgc2Nhbm5pbmcgYWxsIHBvcnRmb2xpbyBkaXJlY3Rvcmllc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWlsZEluZGV4KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFByZXZlbnQgY29uY3VycmVudCBidWlsZHNcbiAgICBpZiAodGhpcy5pc0J1aWxkaW5nKSB7XG4gICAgICBpZiAodGhpcy5idWlsZFByb21pc2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5idWlsZFByb21pc2U7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIHRoaXMuaXNCdWlsZGluZyA9IHRydWU7XG4gICAgXG4gICAgdGhpcy5idWlsZFByb21pc2UgPSB0aGlzLnBlcmZvcm1CdWlsZCgpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkUHJvbWlzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0J1aWxkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmJ1aWxkUHJvbWlzZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCBpbmRleCBidWlsZGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwZXJmb3JtQnVpbGQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsb2dnZXIuaW5mbygnQnVpbGRpbmcgcG9ydGZvbGlvIGluZGV4Li4uJyk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBcbiAgICAgIC8vIEluaXRpYWxpemUgZW1wdHkgaW5kZXhcbiAgICAgIGNvbnN0IG5ld0luZGV4OiBQb3J0Zm9saW9JbmRleCA9IHtcbiAgICAgICAgYnlOYW1lOiBuZXcgTWFwKCksXG4gICAgICAgIGJ5RmlsZW5hbWU6IG5ldyBNYXAoKSxcbiAgICAgICAgYnlUeXBlOiBuZXcgTWFwKCksXG4gICAgICAgIGJ5S2V5d29yZDogbmV3IE1hcCgpLFxuICAgICAgICBieVRhZzogbmV3IE1hcCgpLFxuICAgICAgICBieVRyaWdnZXI6IG5ldyBNYXAoKVxuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gSW5pdGlhbGl6ZSB0eXBlIG1hcHNcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgICAgbmV3SW5kZXguYnlUeXBlLnNldChlbGVtZW50VHlwZSwgW10pO1xuICAgICAgfVxuICAgICAgXG4gICAgICBsZXQgdG90YWxGaWxlcyA9IDA7XG4gICAgICBsZXQgcHJvY2Vzc2VkRmlsZXMgPSAwO1xuICAgICAgXG4gICAgICAvLyBTY2FuIGVhY2ggZWxlbWVudCB0eXBlXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudERpciA9IHBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihlbGVtZW50VHlwZSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5hY2Nlc3MoZWxlbWVudERpcik7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEVsZW1lbnQgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3Q6ICR7ZWxlbWVudERpcn1gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIoZWxlbWVudERpcik7XG4gICAgICAgICAgY29uc3QgbWRGaWxlcyA9IGZpbGVzLmZpbHRlcihmaWxlID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpKTtcbiAgICAgICAgICB0b3RhbEZpbGVzICs9IG1kRmlsZXMubGVuZ3RoO1xuICAgICAgICAgIFxuICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBtZEZpbGVzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihlbGVtZW50RGlyLCBmaWxlKTtcbiAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCB0aGlzLmNyZWF0ZUluZGV4RW50cnkoZmlsZVBhdGgsIGVsZW1lbnRUeXBlKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkVG9JbmRleChuZXdJbmRleCwgZW50cnkpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3NlZEZpbGVzKys7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gaW5kZXggZmlsZTogJHtmaWxlfWAsIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBzY2FuIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gLCB7XG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIGluc3RhbmNlIHN0YXRlXG4gICAgICB0aGlzLmluZGV4ID0gbmV3SW5kZXg7XG4gICAgICB0aGlzLmxhc3RCdWlsdCA9IG5ldyBEYXRlKCk7XG4gICAgICBcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGxvZ2dlci5pbmZvKCdQb3J0Zm9saW8gaW5kZXggYnVpbHQgc3VjY2Vzc2Z1bGx5Jywge1xuICAgICAgICB0b3RhbEZpbGVzLFxuICAgICAgICBwcm9jZXNzZWRGaWxlcyxcbiAgICAgICAgZHVyYXRpb246IGAke2R1cmF0aW9ufW1zYCxcbiAgICAgICAgdW5pcXVlTmFtZXM6IG5ld0luZGV4LmJ5TmFtZS5zaXplLFxuICAgICAgICB1bmlxdWVLZXl3b3JkczogbmV3SW5kZXguYnlLZXl3b3JkLnNpemUsXG4gICAgICAgIHVuaXF1ZVRhZ3M6IG5ld0luZGV4LmJ5VGFnLnNpemVcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdQT1JURk9MSU9fSU5JVElBTElaQVRJT04nLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1BvcnRmb2xpb0luZGV4TWFuYWdlci5wZXJmb3JtQnVpbGQnLFxuICAgICAgICBkZXRhaWxzOiBgUG9ydGZvbGlvIGluZGV4IHJlYnVpbHQgd2l0aCAke3Byb2Nlc3NlZEZpbGVzfSBlbGVtZW50cyBpbiAke2R1cmF0aW9ufW1zYFxuICAgICAgfSk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdQb3J0Zm9saW9JbmRleE1hbmFnZXIucGVyZm9ybUJ1aWxkJywgZXJyb3IpO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgJ0ZhaWxlZCB0byBidWlsZCBwb3J0Zm9saW8gaW5kZXgnLCBFcnJvckNhdGVnb3J5LlNZU1RFTV9FUlJPUik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBpbmRleCBlbnRyeSBmcm9tIGEgZmlsZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVJbmRleEVudHJ5KGZpbGVQYXRoOiBzdHJpbmcsIGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSk6IFByb21pc2U8SW5kZXhFbnRyeSB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IGZpbGUgc3RhdHNcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZnMuc3RhdChmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFJlYWQgZmlsZSBjb250ZW50XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgICAgXG4gICAgICAvLyBQYXJzZSBmcm9udG1hdHRlciBzZWN1cmVseVxuICAgICAgY29uc3QgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShjb250ZW50KTtcbiAgICAgIFxuICAgICAgLy8gRXh0cmFjdCBiYXNlIGZpbGVuYW1lXG4gICAgICBjb25zdCBmaWxlbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgsICcubWQnKTtcbiAgICAgIFxuICAgICAgLy8gQnVpbGQgbWV0YWRhdGEgd2l0aCBkZWZhdWx0c1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAgICAgIG5hbWU6IHBhcnNlZC5kYXRhLm5hbWUgfHwgZmlsZW5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBwYXJzZWQuZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgICAgdmVyc2lvbjogcGFyc2VkLmRhdGEudmVyc2lvbixcbiAgICAgICAgYXV0aG9yOiBwYXJzZWQuZGF0YS5hdXRob3IsXG4gICAgICAgIHRhZ3M6IEFycmF5LmlzQXJyYXkocGFyc2VkLmRhdGEudGFncykgPyBwYXJzZWQuZGF0YS50YWdzIDogW10sXG4gICAgICAgIGtleXdvcmRzOiBBcnJheS5pc0FycmF5KHBhcnNlZC5kYXRhLmtleXdvcmRzKSA/IHBhcnNlZC5kYXRhLmtleXdvcmRzIDogW10sXG4gICAgICAgIHRyaWdnZXJzOiBBcnJheS5pc0FycmF5KHBhcnNlZC5kYXRhLnRyaWdnZXJzKSA/IHBhcnNlZC5kYXRhLnRyaWdnZXJzIDogW10sXG4gICAgICAgIGNhdGVnb3J5OiBwYXJzZWQuZGF0YS5jYXRlZ29yeSxcbiAgICAgICAgY3JlYXRlZDogcGFyc2VkLmRhdGEuY3JlYXRlZCB8fCBwYXJzZWQuZGF0YS5jcmVhdGVkX2RhdGUsXG4gICAgICAgIHVwZGF0ZWQ6IHBhcnNlZC5kYXRhLnVwZGF0ZWQgfHwgcGFyc2VkLmRhdGEudXBkYXRlZF9kYXRlXG4gICAgICB9O1xuICAgICAgXG4gICAgICBjb25zdCBlbnRyeTogSW5kZXhFbnRyeSA9IHtcbiAgICAgICAgZmlsZVBhdGgsXG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgbGFzdE1vZGlmaWVkOiBzdGF0cy5tdGltZSxcbiAgICAgICAgZmlsZW5hbWVcbiAgICAgIH07XG4gICAgICBcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEZhaWxlZCB0byBjcmVhdGUgaW5kZXggZW50cnkgZm9yOiAke2ZpbGVQYXRofWAsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGVudHJ5IHRvIGFsbCByZWxldmFudCBpbmRleCBtYXBzXG4gICAqL1xuICBwcml2YXRlIGFkZFRvSW5kZXgoaW5kZXg6IFBvcnRmb2xpb0luZGV4LCBlbnRyeTogSW5kZXhFbnRyeSk6IHZvaWQge1xuICAgIC8vIE5vcm1hbGl6ZSBrZXlzIGZvciBjYXNlLWluc2Vuc2l0aXZlIGxvb2t1cFxuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gZW50cnkubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlbmFtZSA9IGVudHJ5LmZpbGVuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgXG4gICAgLy8gQWRkIHRvIG5hbWUgbWFwXG4gICAgaW5kZXguYnlOYW1lLnNldChub3JtYWxpemVkTmFtZSwgZW50cnkpO1xuICAgIFxuICAgIC8vIEFkZCB0byBmaWxlbmFtZSBtYXBcbiAgICBpbmRleC5ieUZpbGVuYW1lLnNldChub3JtYWxpemVkRmlsZW5hbWUsIGVudHJ5KTtcbiAgICBcbiAgICAvLyBBZGQgdG8gdHlwZSBtYXBcbiAgICBjb25zdCB0eXBlRW50cmllcyA9IGluZGV4LmJ5VHlwZS5nZXQoZW50cnkuZWxlbWVudFR5cGUpIHx8IFtdO1xuICAgIHR5cGVFbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIGluZGV4LmJ5VHlwZS5zZXQoZW50cnkuZWxlbWVudFR5cGUsIHR5cGVFbnRyaWVzKTtcbiAgICBcbiAgICAvLyBBZGQga2V5d29yZHNcbiAgICBmb3IgKGNvbnN0IGtleXdvcmQgb2YgZW50cnkubWV0YWRhdGEua2V5d29yZHMgfHwgW10pIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRLZXl3b3JkID0ga2V5d29yZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3Qga2V5d29yZEVudHJpZXMgPSBpbmRleC5ieUtleXdvcmQuZ2V0KG5vcm1hbGl6ZWRLZXl3b3JkKSB8fCBbXTtcbiAgICAgIGtleXdvcmRFbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgaW5kZXguYnlLZXl3b3JkLnNldChub3JtYWxpemVkS2V5d29yZCwga2V5d29yZEVudHJpZXMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgdGFnc1xuICAgIGZvciAoY29uc3QgdGFnIG9mIGVudHJ5Lm1ldGFkYXRhLnRhZ3MgfHwgW10pIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYWcgPSB0YWcudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IHRhZ0VudHJpZXMgPSBpbmRleC5ieVRhZy5nZXQobm9ybWFsaXplZFRhZykgfHwgW107XG4gICAgICB0YWdFbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgaW5kZXguYnlUYWcuc2V0KG5vcm1hbGl6ZWRUYWcsIHRhZ0VudHJpZXMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgdHJpZ2dlcnNcbiAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgZW50cnkubWV0YWRhdGEudHJpZ2dlcnMgfHwgW10pIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUcmlnZ2VyID0gdHJpZ2dlci50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdHJpZ2dlckVudHJpZXMgPSBpbmRleC5ieVRyaWdnZXIuZ2V0KG5vcm1hbGl6ZWRUcmlnZ2VyKSB8fCBbXTtcbiAgICAgIHRyaWdnZXJFbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgaW5kZXguYnlUcmlnZ2VyLnNldChub3JtYWxpemVkVHJpZ2dlciwgdHJpZ2dlckVudHJpZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGZ1enp5IG1hdGNoZXMgZm9yIGEgbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kRnV6enlNYXRjaChzZWFyY2hOYW1lOiBzdHJpbmcsIGluZGV4OiBQb3J0Zm9saW9JbmRleCwgb3B0aW9uczogU2VhcmNoT3B0aW9ucyk6IEluZGV4RW50cnkgfCBudWxsIHtcbiAgICBjb25zdCBzZWFyY2ggPSBzZWFyY2hOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgbGV0IGJlc3RNYXRjaDogSW5kZXhFbnRyeSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBiZXN0U2NvcmUgPSAwO1xuICAgIFxuICAgIC8vIFNlYXJjaCBuYW1lcyB3aXRoIHBhcnRpYWwgbWF0Y2hpbmdcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgaW5kZXguYnlOYW1lKSB7XG4gICAgICBpZiAob3B0aW9ucy5lbGVtZW50VHlwZSAmJiBlbnRyeS5lbGVtZW50VHlwZSAhPT0gb3B0aW9ucy5lbGVtZW50VHlwZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3Qgc2NvcmUgPSB0aGlzLmNhbGN1bGF0ZVNpbWlsYXJpdHkoc2VhcmNoLCBuYW1lKTtcbiAgICAgIGlmIChzY29yZSA+IGJlc3RTY29yZSAmJiBzY29yZSA+IDAuMykgeyAvLyBNaW5pbXVtIHNpbWlsYXJpdHkgdGhyZXNob2xkXG4gICAgICAgIGJlc3RTY29yZSA9IHNjb3JlO1xuICAgICAgICBiZXN0TWF0Y2ggPSBlbnRyeTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQWxzbyBjaGVjayBmaWxlbmFtZXNcbiAgICBmb3IgKGNvbnN0IFtmaWxlbmFtZSwgZW50cnldIG9mIGluZGV4LmJ5RmlsZW5hbWUpIHtcbiAgICAgIGlmIChvcHRpb25zLmVsZW1lbnRUeXBlICYmIGVudHJ5LmVsZW1lbnRUeXBlICE9PSBvcHRpb25zLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBzY29yZSA9IHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2gsIGZpbGVuYW1lKTtcbiAgICAgIGlmIChzY29yZSA+IGJlc3RTY29yZSAmJiBzY29yZSA+IDAuMykge1xuICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTtcbiAgICAgICAgYmVzdE1hdGNoID0gZW50cnk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBiZXN0TWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHNpbWlsYXJpdHkgYmV0d2VlbiB0d28gc3RyaW5nc1xuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVTaW1pbGFyaXR5KGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyBTaW1wbGUgc2ltaWxhcml0eSBiYXNlZCBvbiBzdWJzdHJpbmcgY29udGFpbm1lbnQgYW5kIGxlbmd0aFxuICAgIGlmIChhID09PSBiKSByZXR1cm4gMS4wO1xuICAgIGlmIChhLmluY2x1ZGVzKGIpIHx8IGIuaW5jbHVkZXMoYSkpIHJldHVybiAwLjg7XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIHdvcmQgb3ZlcmxhcFxuICAgIGNvbnN0IHdvcmRzQSA9IGEuc3BsaXQoL1xccysvKTtcbiAgICBjb25zdCB3b3Jkc0IgPSBiLnNwbGl0KC9cXHMrLyk7XG4gICAgY29uc3QgY29tbW9uV29yZHMgPSB3b3Jkc0EuZmlsdGVyKHdvcmQgPT4gd29yZHNCLmluY2x1ZGVzKHdvcmQpKTtcbiAgICBcbiAgICBpZiAoY29tbW9uV29yZHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGNvbW1vbldvcmRzLmxlbmd0aCAvIE1hdGgubWF4KHdvcmRzQS5sZW5ndGgsIHdvcmRzQi5sZW5ndGgpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbnkgcXVlcnkgdG9rZW5zIG1hdGNoIHRoZSB0ZXh0XG4gICAqL1xuICBwcml2YXRlIG1hdGNoZXNRdWVyeSh0ZXh0OiBzdHJpbmcsIHF1ZXJ5VG9rZW5zOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBxdWVyeVRva2Vucy5zb21lKHRva2VuID0+IHRleHQuaW5jbHVkZXModG9rZW4pKTtcbiAgfVxufSJdfQ==
478
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BvcnRmb2xpby9Qb3J0Zm9saW9JbmRleE1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUE4Q3ZFLE1BQU0sT0FBTyxxQkFBcUI7SUFDeEIsTUFBTSxDQUFDLFFBQVEsR0FBaUMsSUFBSSxDQUFDO0lBQ3JELE1BQU0sQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRTVCLEtBQUssR0FBMEIsSUFBSSxDQUFDO0lBQ3BDLFNBQVMsR0FBZ0IsSUFBSSxDQUFDO0lBQ3JCLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLFlBQVk7SUFDN0MsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixZQUFZLEdBQXlCLElBQUksQ0FBQztJQUVsRDtRQUNFLE1BQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQVc7UUFDdkIs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TUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWpFLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixPQUFPLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxZQUFZLENBQUMsSUFBWSxFQUFFLFdBQXFCO1FBQ3RELE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQb3J0Zm9saW8gSW5kZXggTWFuYWdlciAtIE1hcHMgZWxlbWVudCBuYW1lcyB0byBmaWxlIHBhdGhzXG4gKiBcbiAqIFNvbHZlcyBjcml0aWNhbCBpc3N1ZXM6XG4gKiAxLiBzdWJtaXRfY29sbGVjdGlvbl9jb250ZW50IGNhbid0IGZpbmQgZWxlbWVudHMgYnkgbWV0YWRhdGEgbmFtZSAoZS5nLiwgXCJTYWZlIFJvdW5kdHJpcCBUZXN0ZXJcIiAtPiBcInNhZmUtcm91bmR0cmlwLXRlc3Rlci5tZFwiKVxuICogMi4gc2VhcmNoX2NvbGxlY3Rpb24gZG9lc24ndCBzZWFyY2ggbG9jYWwgcG9ydGZvbGlvIGNvbnRlbnRcbiAqIFxuICogRmVhdHVyZXM6XG4gKiAtIEluLW1lbW9yeSBpbmRleCBtYXBwaW5nIG1ldGFkYXRhLm5hbWUg4oaSIGZpbGUgcGF0aFxuICogLSBLZXl3b3Jkcy90YWdzIOKGkiBmaWxlIHBhdGhzIG1hcHBpbmdcbiAqIC0gRWxlbWVudCB0eXBlIOKGkiBmaWxlIHBhdGhzIG1hcHBpbmdcbiAqIC0gRmFzdCBPKDEpIGxvb2t1cHMgd2l0aCBNYXBzXG4gKiAtIExhenkgbG9hZGluZyB3aXRoIDUtbWludXRlIFRUTCBjYWNoZVxuICogLSBVbmljb2RlIG5vcm1hbGl6YXRpb24gZm9yIHNlY3VyaXR5XG4gKiAtIEVycm9yIGhhbmRsaW5nIGFuZCBsb2dnaW5nXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTZWN1cmVZYW1sUGFyc2VyIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEluZGV4RW50cnkge1xuICBmaWxlUGF0aDogc3RyaW5nO1xuICBlbGVtZW50VHlwZTogRWxlbWVudFR5cGU7XG4gIG1ldGFkYXRhOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIHZlcnNpb24/OiBzdHJpbmc7XG4gICAgYXV0aG9yPzogc3RyaW5nO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICBrZXl3b3Jkcz86IHN0cmluZ1tdO1xuICAgIHRyaWdnZXJzPzogc3RyaW5nW107XG4gICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgY3JlYXRlZD86IHN0cmluZztcbiAgICB1cGRhdGVkPzogc3RyaW5nO1xuICB9O1xuICBsYXN0TW9kaWZpZWQ6IERhdGU7XG4gIGZpbGVuYW1lOiBzdHJpbmc7IC8vIEJhc2UgZmlsZW5hbWUgd2l0aG91dCBleHRlbnNpb25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3J0Zm9saW9JbmRleCB7XG4gIGJ5TmFtZTogTWFwPHN0cmluZywgSW5kZXhFbnRyeT47XG4gIGJ5RmlsZW5hbWU6IE1hcDxzdHJpbmcsIEluZGV4RW50cnk+O1xuICBieVR5cGU6IE1hcDxFbGVtZW50VHlwZSwgSW5kZXhFbnRyeVtdPjtcbiAgYnlLZXl3b3JkOiBNYXA8c3RyaW5nLCBJbmRleEVudHJ5W10+O1xuICBieVRhZzogTWFwPHN0cmluZywgSW5kZXhFbnRyeVtdPjtcbiAgYnlUcmlnZ2VyOiBNYXA8c3RyaW5nLCBJbmRleEVudHJ5W10+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaE9wdGlvbnMge1xuICBlbGVtZW50VHlwZT86IEVsZW1lbnRUeXBlO1xuICBmdXp6eU1hdGNoPzogYm9vbGVhbjtcbiAgbWF4UmVzdWx0cz86IG51bWJlcjtcbiAgaW5jbHVkZUtleXdvcmRzPzogYm9vbGVhbjtcbiAgaW5jbHVkZVRhZ3M/OiBib29sZWFuO1xuICBpbmNsdWRlVHJpZ2dlcnM/OiBib29sZWFuO1xuICBpbmNsdWRlRGVzY3JpcHRpb25zPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hSZXN1bHQge1xuICBlbnRyeTogSW5kZXhFbnRyeTtcbiAgbWF0Y2hUeXBlOiAnbmFtZScgfCAnZmlsZW5hbWUnIHwgJ2tleXdvcmQnIHwgJ3RhZycgfCAndHJpZ2dlcicgfCAnZGVzY3JpcHRpb24nO1xuICBzY29yZTogbnVtYmVyOyAvLyBGb3IgZnV0dXJlIHJhbmtpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFBvcnRmb2xpb0luZGV4TWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBQb3J0Zm9saW9JbmRleE1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2VMb2NrID0gZmFsc2U7XG4gIFxuICBwcml2YXRlIGluZGV4OiBQb3J0Zm9saW9JbmRleCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGxhc3RCdWlsdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IFRUTF9NUyA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWludXRlc1xuICBwcml2YXRlIGlzQnVpbGRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBidWlsZFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIGxvZ2dlci5kZWJ1ZygnUG9ydGZvbGlvSW5kZXhNYW5hZ2VyIGNyZWF0ZWQnKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKTogUG9ydGZvbGlvSW5kZXhNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIGlmICh0aGlzLmluc3RhbmNlTG9jaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvcnRmb2xpb0luZGV4TWFuYWdlciBpbnN0YW5jZSBpcyBiZWluZyBjcmVhdGVkIGJ5IGFub3RoZXIgdGhyZWFkJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VMb2NrID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBQb3J0Zm9saW9JbmRleE1hbmFnZXIoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2VMb2NrID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBpbmRleCwgYnVpbGRpbmcgaXQgaWYgbmVjZXNzYXJ5XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0SW5kZXgoKTogUHJvbWlzZTxQb3J0Zm9saW9JbmRleD4ge1xuICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVidWlsZFxuICAgIGlmICh0aGlzLm5lZWRzUmVidWlsZCgpKSB7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkSW5kZXgoKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHRoaXMuaW5kZXghO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCB0aGUgcG9ydGZvbGlvIGluZGV4IGJ5IG5hbWUgd2l0aCBmdXp6eSBtYXRjaGluZ1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nLCBvcHRpb25zOiBTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4RW50cnkgfCBudWxsPiB7XG4gICAgY29uc3QgaW5kZXggPSBhd2FpdCB0aGlzLmdldEluZGV4KCk7XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIGlucHV0IGZvciBzZWN1cml0eVxuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobmFtZSk7XG4gICAgaWYgKCFub3JtYWxpemVkTmFtZS5pc1ZhbGlkKSB7XG4gICAgICBsb2dnZXIud2FybignSW52YWxpZCBVbmljb2RlIGluIHNlYXJjaCBuYW1lJywge1xuICAgICAgICBpc3N1ZXM6IG5vcm1hbGl6ZWROYW1lLmRldGVjdGVkSXNzdWVzXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBzYWZlTmFtZSA9IG5vcm1hbGl6ZWROYW1lLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIC8vIFRyeSBleGFjdCBtYXRjaCBmaXJzdCAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAgICBjb25zdCBleGFjdE1hdGNoID0gaW5kZXguYnlOYW1lLmdldChzYWZlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoZXhhY3RNYXRjaCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBleGFjdCBuYW1lIG1hdGNoJywgeyBuYW1lOiBzYWZlTmFtZSwgZmlsZVBhdGg6IGV4YWN0TWF0Y2guZmlsZVBhdGggfSk7XG4gICAgICByZXR1cm4gZXhhY3RNYXRjaDtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJ5IGZpbGVuYW1lIG1hdGNoXG4gICAgY29uc3QgZmlsZW5hbWVNYXRjaCA9IGluZGV4LmJ5RmlsZW5hbWUuZ2V0KHNhZmVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgIGlmIChmaWxlbmFtZU1hdGNoKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIGZpbGVuYW1lIG1hdGNoJywgeyBuYW1lOiBzYWZlTmFtZSwgZmlsZVBhdGg6IGZpbGVuYW1lTWF0Y2guZmlsZVBhdGggfSk7XG4gICAgICByZXR1cm4gZmlsZW5hbWVNYXRjaDtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJ5IGZ1enp5IG1hdGNoaW5nIGlmIGVuYWJsZWRcbiAgICBpZiAob3B0aW9ucy5mdXp6eU1hdGNoICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgZnV6enlNYXRjaCA9IHRoaXMuZmluZEZ1enp5TWF0Y2goc2FmZU5hbWUsIGluZGV4LCBvcHRpb25zKTtcbiAgICAgIGlmIChmdXp6eU1hdGNoKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgZnV6enkgbWF0Y2gnLCB7IFxuICAgICAgICAgIG5hbWU6IHNhZmVOYW1lLCBcbiAgICAgICAgICBtYXRjaE5hbWU6IGZ1enp5TWF0Y2gubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBmaWxlUGF0aDogZnV6enlNYXRjaC5maWxlUGF0aCBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmdXp6eU1hdGNoO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBsb2dnZXIuZGVidWcoJ05vIG1hdGNoIGZvdW5kIGZvciBuYW1lJywgeyBuYW1lOiBzYWZlTmFtZSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggdGhlIHBvcnRmb2xpbyB3aXRoIGNvbXByZWhlbnNpdmUgdGV4dCBzZWFyY2hcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2gocXVlcnk6IHN0cmluZywgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTZWFyY2hSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuICAgIFxuICAgIC8vIE5vcm1hbGl6ZSBxdWVyeSBmb3Igc2VjdXJpdHlcbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShxdWVyeSk7XG4gICAgaWYgKCFub3JtYWxpemVkUXVlcnkuaXNWYWxpZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0ludmFsaWQgVW5pY29kZSBpbiBzZWFyY2ggcXVlcnknLCB7XG4gICAgICAgIGlzc3Vlczogbm9ybWFsaXplZFF1ZXJ5LmRldGVjdGVkSXNzdWVzXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgc2FmZVF1ZXJ5ID0gbm9ybWFsaXplZFF1ZXJ5Lm5vcm1hbGl6ZWRDb250ZW50LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGNvbnN0IHF1ZXJ5VG9rZW5zID0gc2FmZVF1ZXJ5LnNwbGl0KC9cXHMrLykuZmlsdGVyKHRva2VuID0+IHRva2VuLmxlbmd0aCA+IDApO1xuICAgIFxuICAgIGlmIChxdWVyeVRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcmVzdWx0czogU2VhcmNoUmVzdWx0W10gPSBbXTtcbiAgICBjb25zdCBzZWVuUGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBtYXhSZXN1bHRzID0gb3B0aW9ucy5tYXhSZXN1bHRzIHx8IDIwO1xuICAgIFxuICAgIC8vIEhlbHBlciB0byBhZGQgdW5pcXVlIHJlc3VsdHNcbiAgICBjb25zdCBhZGRSZXN1bHQgPSAoZW50cnk6IEluZGV4RW50cnksIG1hdGNoVHlwZTogU2VhcmNoUmVzdWx0WydtYXRjaFR5cGUnXSwgc2NvcmU6IG51bWJlciA9IDEpID0+IHtcbiAgICAgIGlmICghc2VlblBhdGhzLmhhcyhlbnRyeS5maWxlUGF0aCkgJiYgcmVzdWx0cy5sZW5ndGggPCBtYXhSZXN1bHRzKSB7XG4gICAgICAgIC8vIEZpbHRlciBieSBlbGVtZW50IHR5cGUgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChvcHRpb25zLmVsZW1lbnRUeXBlICYmIGVudHJ5LmVsZW1lbnRUeXBlICE9PSBvcHRpb25zLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBzZWVuUGF0aHMuYWRkKGVudHJ5LmZpbGVQYXRoKTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHsgZW50cnksIG1hdGNoVHlwZSwgc2NvcmUgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgICBcbiAgICAvLyAxLiBTZWFyY2ggYnkgbmFtZSAoaGlnaGVzdCBwcmlvcml0eSlcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBlbnRyeV0gb2YgaW5kZXguYnlOYW1lKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkobmFtZSwgcXVlcnlUb2tlbnMpKSB7XG4gICAgICAgIGFkZFJlc3VsdChlbnRyeSwgJ25hbWUnLCAzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gMi4gU2VhcmNoIGJ5IGZpbGVuYW1lXG4gICAgZm9yIChjb25zdCBbZmlsZW5hbWUsIGVudHJ5XSBvZiBpbmRleC5ieUZpbGVuYW1lKSB7XG4gICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkoZmlsZW5hbWUsIHF1ZXJ5VG9rZW5zKSkge1xuICAgICAgICBhZGRSZXN1bHQoZW50cnksICdmaWxlbmFtZScsIDIuNSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIDMuIFNlYXJjaCBieSBrZXl3b3Jkc1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVLZXl3b3JkcyAhPT0gZmFsc2UpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleXdvcmQsIGVudHJpZXNdIG9mIGluZGV4LmJ5S2V5d29yZCkge1xuICAgICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkoa2V5d29yZCwgcXVlcnlUb2tlbnMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBhZGRSZXN1bHQoZW50cnksICdrZXl3b3JkJywgMik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIDQuIFNlYXJjaCBieSB0YWdzXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZVRhZ3MgIT09IGZhbHNlKSB7XG4gICAgICBmb3IgKGNvbnN0IFt0YWcsIGVudHJpZXNdIG9mIGluZGV4LmJ5VGFnKSB7XG4gICAgICAgIGlmICh0aGlzLm1hdGNoZXNRdWVyeSh0YWcsIHF1ZXJ5VG9rZW5zKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgYWRkUmVzdWx0KGVudHJ5LCAndGFnJywgMik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIDUuIFNlYXJjaCBieSB0cmlnZ2Vyc1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVUcmlnZ2VycyAhPT0gZmFsc2UpIHtcbiAgICAgIGZvciAoY29uc3QgW3RyaWdnZXIsIGVudHJpZXNdIG9mIGluZGV4LmJ5VHJpZ2dlcikge1xuICAgICAgICBpZiAodGhpcy5tYXRjaGVzUXVlcnkodHJpZ2dlciwgcXVlcnlUb2tlbnMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBhZGRSZXN1bHQoZW50cnksICd0cmlnZ2VyJywgMS44KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gNi4gU2VhcmNoIGJ5IGRlc2NyaXB0aW9uXG4gICAgaWYgKG9wdGlvbnMuaW5jbHVkZURlc2NyaXB0aW9ucyAhPT0gZmFsc2UpIHtcbiAgICAgIGZvciAoY29uc3QgW18sIGVudHJ5XSBvZiBpbmRleC5ieU5hbWUpIHtcbiAgICAgICAgaWYgKGVudHJ5Lm1ldGFkYXRhLmRlc2NyaXB0aW9uICYmIFxuICAgICAgICAgICAgdGhpcy5tYXRjaGVzUXVlcnkoZW50cnkubWV0YWRhdGEuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKSwgcXVlcnlUb2tlbnMpKSB7XG4gICAgICAgICAgYWRkUmVzdWx0KGVudHJ5LCAnZGVzY3JpcHRpb24nLCAxLjUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFNvcnQgYnkgc2NvcmUgKGRlc2NlbmRpbmcpXG4gICAgcmVzdWx0cy5zb3J0KChhLCBiKSA9PiBiLnNjb3JlIC0gYS5zY29yZSk7XG4gICAgXG4gICAgbG9nZ2VyLmRlYnVnKCdQb3J0Zm9saW8gc2VhcmNoIGNvbXBsZXRlZCcsIHtcbiAgICAgIHF1ZXJ5OiBzYWZlUXVlcnksXG4gICAgICByZXN1bHRDb3VudDogcmVzdWx0cy5sZW5ndGgsXG4gICAgICB0b3RhbEluZGV4ZWQ6IGluZGV4LmJ5TmFtZS5zaXplXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbGVtZW50cyBvZiBhIHNwZWNpZmljIHR5cGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRFbGVtZW50c0J5VHlwZShlbGVtZW50VHlwZTogRWxlbWVudFR5cGUpOiBQcm9taXNlPEluZGV4RW50cnlbXT4ge1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy5nZXRJbmRleCgpO1xuICAgIHJldHVybiBpbmRleC5ieVR5cGUuZ2V0KGVsZW1lbnRUeXBlKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RhdGlzdGljcyBhYm91dCB0aGUgaW5kZXhcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRTdGF0cygpOiBQcm9taXNlPHtcbiAgICB0b3RhbEVsZW1lbnRzOiBudW1iZXI7XG4gICAgZWxlbWVudHNCeVR5cGU6IFJlY29yZDxFbGVtZW50VHlwZSwgbnVtYmVyPjtcbiAgICBsYXN0QnVpbHQ6IERhdGUgfCBudWxsO1xuICAgIGlzU3RhbGU6IGJvb2xlYW47XG4gIH0+IHtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgoKTtcbiAgICBjb25zdCBzdGF0cyA9IHtcbiAgICAgIHRvdGFsRWxlbWVudHM6IGluZGV4LmJ5TmFtZS5zaXplLFxuICAgICAgZWxlbWVudHNCeVR5cGU6IHt9IGFzIFJlY29yZDxFbGVtZW50VHlwZSwgbnVtYmVyPixcbiAgICAgIGxhc3RCdWlsdDogdGhpcy5sYXN0QnVpbHQsXG4gICAgICBpc1N0YWxlOiB0aGlzLm5lZWRzUmVidWlsZCgpXG4gICAgfTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICBzdGF0cy5lbGVtZW50c0J5VHlwZVtlbGVtZW50VHlwZV0gPSAoaW5kZXguYnlUeXBlLmdldChlbGVtZW50VHlwZSkgfHwgW10pLmxlbmd0aDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHN0YXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIHJlYnVpbGQgdGhlIGluZGV4XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVidWlsZEluZGV4KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuaW5kZXggPSBudWxsO1xuICAgIHRoaXMubGFzdEJ1aWx0ID0gbnVsbDtcbiAgICBhd2FpdCB0aGlzLmJ1aWxkSW5kZXgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgaW5kZXggbmVlZHMgcmVidWlsZGluZ1xuICAgKi9cbiAgcHJpdmF0ZSBuZWVkc1JlYnVpbGQoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmluZGV4IHx8ICF0aGlzLmxhc3RCdWlsdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSB0aGlzLmxhc3RCdWlsdC5nZXRUaW1lKCk7XG4gICAgcmV0dXJuIGFnZSA+IHRoaXMuVFRMX01TO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBpbmRleCBieSBzY2FubmluZyBhbGwgcG9ydGZvbGlvIGRpcmVjdG9yaWVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gUHJldmVudCBjb25jdXJyZW50IGJ1aWxkc1xuICAgIGlmICh0aGlzLmlzQnVpbGRpbmcpIHtcbiAgICAgIGlmICh0aGlzLmJ1aWxkUHJvbWlzZSkge1xuICAgICAgICBhd2FpdCB0aGlzLmJ1aWxkUHJvbWlzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5pc0J1aWxkaW5nID0gdHJ1ZTtcbiAgICBcbiAgICB0aGlzLmJ1aWxkUHJvbWlzZSA9IHRoaXMucGVyZm9ybUJ1aWxkKCk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuYnVpbGRQcm9taXNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzQnVpbGRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuYnVpbGRQcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgYWN0dWFsIGluZGV4IGJ1aWxkaW5nXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1CdWlsZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxvZ2dlci5pbmZvKCdCdWlsZGluZyBwb3J0Zm9saW8gaW5kZXguLi4nKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIFxuICAgICAgLy8gSW5pdGlhbGl6ZSBlbXB0eSBpbmRleFxuICAgICAgY29uc3QgbmV3SW5kZXg6IFBvcnRmb2xpb0luZGV4ID0ge1xuICAgICAgICBieU5hbWU6IG5ldyBNYXAoKSxcbiAgICAgICAgYnlGaWxlbmFtZTogbmV3IE1hcCgpLFxuICAgICAgICBieVR5cGU6IG5ldyBNYXAoKSxcbiAgICAgICAgYnlLZXl3b3JkOiBuZXcgTWFwKCksXG4gICAgICAgIGJ5VGFnOiBuZXcgTWFwKCksXG4gICAgICAgIGJ5VHJpZ2dlcjogbmV3IE1hcCgpXG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBJbml0aWFsaXplIHR5cGUgbWFwc1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgICBuZXdJbmRleC5ieVR5cGUuc2V0KGVsZW1lbnRUeXBlLCBbXSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxldCB0b3RhbEZpbGVzID0gMDtcbiAgICAgIGxldCBwcm9jZXNzZWRGaWxlcyA9IDA7XG4gICAgICBcbiAgICAgIC8vIFNjYW4gZWFjaCBlbGVtZW50IHR5cGVcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50RGlyID0gcG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDaGVjayBpZiBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLmFjY2VzcyhlbGVtZW50RGlyKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRWxlbWVudCBkaXJlY3RvcnkgZG9lc24ndCBleGlzdDogJHtlbGVtZW50RGlyfWApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihlbGVtZW50RGlyKTtcbiAgICAgICAgICBjb25zdCBtZEZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgnLm1kJykpO1xuICAgICAgICAgIHRvdGFsRmlsZXMgKz0gbWRGaWxlcy5sZW5ndGg7XG4gICAgICAgICAgXG4gICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIG1kRmlsZXMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGVsZW1lbnREaXIsIGZpbGUpO1xuICAgICAgICAgICAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHRoaXMuY3JlYXRlSW5kZXhFbnRyeShmaWxlUGF0aCwgZWxlbWVudFR5cGUpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRUb0luZGV4KG5ld0luZGV4LCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzc2VkRmlsZXMrKztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBpbmRleCBmaWxlOiAke2ZpbGV9YCwge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHNjYW4gZWxlbWVudCB0eXBlOiAke2VsZW1lbnRUeXBlfWAsIHtcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgaW5zdGFuY2Ugc3RhdGVcbiAgICAgIHRoaXMuaW5kZXggPSBuZXdJbmRleDtcbiAgICAgIHRoaXMubGFzdEJ1aWx0ID0gbmV3IERhdGUoKTtcbiAgICAgIFxuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgbG9nZ2VyLmluZm8oJ1BvcnRmb2xpbyBpbmRleCBidWlsdCBzdWNjZXNzZnVsbHknLCB7XG4gICAgICAgIHRvdGFsRmlsZXMsXG4gICAgICAgIHByb2Nlc3NlZEZpbGVzLFxuICAgICAgICBkdXJhdGlvbjogYCR7ZHVyYXRpb259bXNgLFxuICAgICAgICB1bmlxdWVOYW1lczogbmV3SW5kZXguYnlOYW1lLnNpemUsXG4gICAgICAgIHVuaXF1ZUtleXdvcmRzOiBuZXdJbmRleC5ieUtleXdvcmQuc2l6ZSxcbiAgICAgICAgdW5pcXVlVGFnczogbmV3SW5kZXguYnlUYWcuc2l6ZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgYXVkaXQgdHJhaWxcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BPUlRGT0xJT19JTklUSUFMSVpBVElPTicsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLnBlcmZvcm1CdWlsZCcsXG4gICAgICAgIGRldGFpbHM6IGBQb3J0Zm9saW8gaW5kZXggcmVidWlsdCB3aXRoICR7cHJvY2Vzc2VkRmlsZXN9IGVsZW1lbnRzIGluICR7ZHVyYXRpb259bXNgXG4gICAgICB9KTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ1BvcnRmb2xpb0luZGV4TWFuYWdlci5wZXJmb3JtQnVpbGQnLCBlcnJvcik7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIud3JhcEVycm9yKGVycm9yLCAnRmFpbGVkIHRvIGJ1aWxkIHBvcnRmb2xpbyBpbmRleCcsIEVycm9yQ2F0ZWdvcnkuU1lTVEVNX0VSUk9SKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGluZGV4IGVudHJ5IGZyb20gYSBmaWxlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUluZGV4RW50cnkoZmlsZVBhdGg6IHN0cmluZywgZWxlbWVudFR5cGU6IEVsZW1lbnRUeXBlKTogUHJvbWlzZTxJbmRleEVudHJ5IHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgZmlsZSBzdGF0c1xuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBmcy5zdGF0KGZpbGVQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gUmVhZCBmaWxlIGNvbnRlbnRcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIGZyb250bWF0dGVyIHNlY3VyZWx5XG4gICAgICBjb25zdCBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgXG4gICAgICAvLyBFeHRyYWN0IGJhc2UgZmlsZW5hbWVcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlUGF0aCwgJy5tZCcpO1xuICAgICAgXG4gICAgICAvLyBCdWlsZCBtZXRhZGF0YSB3aXRoIGRlZmF1bHRzXG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHtcbiAgICAgICAgbmFtZTogcGFyc2VkLmRhdGEubmFtZSB8fCBmaWxlbmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHBhcnNlZC5kYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgICB2ZXJzaW9uOiBwYXJzZWQuZGF0YS52ZXJzaW9uLFxuICAgICAgICBhdXRob3I6IHBhcnNlZC5kYXRhLmF1dGhvcixcbiAgICAgICAgdGFnczogQXJyYXkuaXNBcnJheShwYXJzZWQuZGF0YS50YWdzKSA/IHBhcnNlZC5kYXRhLnRhZ3MgOiBbXSxcbiAgICAgICAga2V5d29yZHM6IEFycmF5LmlzQXJyYXkocGFyc2VkLmRhdGEua2V5d29yZHMpID8gcGFyc2VkLmRhdGEua2V5d29yZHMgOiBbXSxcbiAgICAgICAgdHJpZ2dlcnM6IEFycmF5LmlzQXJyYXkocGFyc2VkLmRhdGEudHJpZ2dlcnMpID8gcGFyc2VkLmRhdGEudHJpZ2dlcnMgOiBbXSxcbiAgICAgICAgY2F0ZWdvcnk6IHBhcnNlZC5kYXRhLmNhdGVnb3J5LFxuICAgICAgICBjcmVhdGVkOiBwYXJzZWQuZGF0YS5jcmVhdGVkIHx8IHBhcnNlZC5kYXRhLmNyZWF0ZWRfZGF0ZSxcbiAgICAgICAgdXBkYXRlZDogcGFyc2VkLmRhdGEudXBkYXRlZCB8fCBwYXJzZWQuZGF0YS51cGRhdGVkX2RhdGVcbiAgICAgIH07XG4gICAgICBcbiAgICAgIGNvbnN0IGVudHJ5OiBJbmRleEVudHJ5ID0ge1xuICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgICBsYXN0TW9kaWZpZWQ6IHN0YXRzLm10aW1lLFxuICAgICAgICBmaWxlbmFtZVxuICAgICAgfTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGNyZWF0ZSBpbmRleCBlbnRyeSBmb3I6ICR7ZmlsZVBhdGh9YCwge1xuICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgZW50cnkgdG8gYWxsIHJlbGV2YW50IGluZGV4IG1hcHNcbiAgICovXG4gIHByaXZhdGUgYWRkVG9JbmRleChpbmRleDogUG9ydGZvbGlvSW5kZXgsIGVudHJ5OiBJbmRleEVudHJ5KTogdm9pZCB7XG4gICAgLy8gTm9ybWFsaXplIGtleXMgZm9yIGNhc2UtaW5zZW5zaXRpdmUgbG9va3VwXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBlbnRyeS5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZpbGVuYW1lID0gZW50cnkuZmlsZW5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICAvLyBBZGQgdG8gbmFtZSBtYXBcbiAgICBpbmRleC5ieU5hbWUuc2V0KG5vcm1hbGl6ZWROYW1lLCBlbnRyeSk7XG4gICAgXG4gICAgLy8gQWRkIHRvIGZpbGVuYW1lIG1hcFxuICAgIGluZGV4LmJ5RmlsZW5hbWUuc2V0KG5vcm1hbGl6ZWRGaWxlbmFtZSwgZW50cnkpO1xuICAgIFxuICAgIC8vIEFkZCB0byB0eXBlIG1hcFxuICAgIGNvbnN0IHR5cGVFbnRyaWVzID0gaW5kZXguYnlUeXBlLmdldChlbnRyeS5lbGVtZW50VHlwZSkgfHwgW107XG4gICAgdHlwZUVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgaW5kZXguYnlUeXBlLnNldChlbnRyeS5lbGVtZW50VHlwZSwgdHlwZUVudHJpZXMpO1xuICAgIFxuICAgIC8vIEFkZCBrZXl3b3Jkc1xuICAgIGZvciAoY29uc3Qga2V5d29yZCBvZiBlbnRyeS5tZXRhZGF0YS5rZXl3b3JkcyB8fCBbXSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEtleXdvcmQgPSBrZXl3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCBrZXl3b3JkRW50cmllcyA9IGluZGV4LmJ5S2V5d29yZC5nZXQobm9ybWFsaXplZEtleXdvcmQpIHx8IFtdO1xuICAgICAga2V5d29yZEVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBpbmRleC5ieUtleXdvcmQuc2V0KG5vcm1hbGl6ZWRLZXl3b3JkLCBrZXl3b3JkRW50cmllcyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCB0YWdzXG4gICAgZm9yIChjb25zdCB0YWcgb2YgZW50cnkubWV0YWRhdGEudGFncyB8fCBbXSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IHRhZy50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgdGFnRW50cmllcyA9IGluZGV4LmJ5VGFnLmdldChub3JtYWxpemVkVGFnKSB8fCBbXTtcbiAgICAgIHRhZ0VudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBpbmRleC5ieVRhZy5zZXQobm9ybWFsaXplZFRhZywgdGFnRW50cmllcyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCB0cmlnZ2Vyc1xuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiBlbnRyeS5tZXRhZGF0YS50cmlnZ2VycyB8fCBbXSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFRyaWdnZXIgPSB0cmlnZ2VyLnRvTG93ZXJDYXNlKCk7XG4gICAgICBjb25zdCB0cmlnZ2VyRW50cmllcyA9IGluZGV4LmJ5VHJpZ2dlci5nZXQobm9ybWFsaXplZFRyaWdnZXIpIHx8IFtdO1xuICAgICAgdHJpZ2dlckVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICBpbmRleC5ieVRyaWdnZXIuc2V0KG5vcm1hbGl6ZWRUcmlnZ2VyLCB0cmlnZ2VyRW50cmllcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgZnV6enkgbWF0Y2hlcyBmb3IgYSBuYW1lXG4gICAqL1xuICBwcml2YXRlIGZpbmRGdXp6eU1hdGNoKHNlYXJjaE5hbWU6IHN0cmluZywgaW5kZXg6IFBvcnRmb2xpb0luZGV4LCBvcHRpb25zOiBTZWFyY2hPcHRpb25zKTogSW5kZXhFbnRyeSB8IG51bGwge1xuICAgIGNvbnN0IHNlYXJjaCA9IHNlYXJjaE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBsZXQgYmVzdE1hdGNoOiBJbmRleEVudHJ5IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGJlc3RTY29yZSA9IDA7XG4gICAgXG4gICAgLy8gU2VhcmNoIG5hbWVzIHdpdGggcGFydGlhbCBtYXRjaGluZ1xuICAgIGZvciAoY29uc3QgW25hbWUsIGVudHJ5XSBvZiBpbmRleC5ieU5hbWUpIHtcbiAgICAgIGlmIChvcHRpb25zLmVsZW1lbnRUeXBlICYmIGVudHJ5LmVsZW1lbnRUeXBlICE9PSBvcHRpb25zLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBzY29yZSA9IHRoaXMuY2FsY3VsYXRlU2ltaWxhcml0eShzZWFyY2gsIG5hbWUpO1xuICAgICAgaWYgKHNjb3JlID4gYmVzdFNjb3JlICYmIHNjb3JlID4gMC4zKSB7IC8vIE1pbmltdW0gc2ltaWxhcml0eSB0aHJlc2hvbGRcbiAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7XG4gICAgICAgIGJlc3RNYXRjaCA9IGVudHJ5O1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBBbHNvIGNoZWNrIGZpbGVuYW1lc1xuICAgIGZvciAoY29uc3QgW2ZpbGVuYW1lLCBlbnRyeV0gb2YgaW5kZXguYnlGaWxlbmFtZSkge1xuICAgICAgaWYgKG9wdGlvbnMuZWxlbWVudFR5cGUgJiYgZW50cnkuZWxlbWVudFR5cGUgIT09IG9wdGlvbnMuZWxlbWVudFR5cGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IHNjb3JlID0gdGhpcy5jYWxjdWxhdGVTaW1pbGFyaXR5KHNlYXJjaCwgZmlsZW5hbWUpO1xuICAgICAgaWYgKHNjb3JlID4gYmVzdFNjb3JlICYmIHNjb3JlID4gMC4zKSB7XG4gICAgICAgIGJlc3RTY29yZSA9IHNjb3JlO1xuICAgICAgICBiZXN0TWF0Y2ggPSBlbnRyeTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGJlc3RNYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgc2ltaWxhcml0eSBiZXR3ZWVuIHR3byBzdHJpbmdzXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVNpbWlsYXJpdHkoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIC8vIFNpbXBsZSBzaW1pbGFyaXR5IGJhc2VkIG9uIHN1YnN0cmluZyBjb250YWlubWVudCBhbmQgbGVuZ3RoXG4gICAgaWYgKGEgPT09IGIpIHJldHVybiAxLjA7XG4gICAgaWYgKGEuaW5jbHVkZXMoYikgfHwgYi5pbmNsdWRlcyhhKSkgcmV0dXJuIDAuODtcbiAgICBcbiAgICAvLyBDaGVjayBmb3Igd29yZCBvdmVybGFwXG4gICAgY29uc3Qgd29yZHNBID0gYS5zcGxpdCgvXFxzKy8pO1xuICAgIGNvbnN0IHdvcmRzQiA9IGIuc3BsaXQoL1xccysvKTtcbiAgICBjb25zdCBjb21tb25Xb3JkcyA9IHdvcmRzQS5maWx0ZXIod29yZCA9PiB3b3Jkc0IuaW5jbHVkZXMod29yZCkpO1xuICAgIFxuICAgIGlmIChjb21tb25Xb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gY29tbW9uV29yZHMubGVuZ3RoIC8gTWF0aC5tYXgod29yZHNBLmxlbmd0aCwgd29yZHNCLmxlbmd0aCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFueSBxdWVyeSB0b2tlbnMgbWF0Y2ggdGhlIHRleHRcbiAgICovXG4gIHByaXZhdGUgbWF0Y2hlc1F1ZXJ5KHRleHQ6IHN0cmluZywgcXVlcnlUb2tlbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHF1ZXJ5VG9rZW5zLnNvbWUodG9rZW4gPT4gdGV4dC5pbmNsdWRlcyh0b2tlbikpO1xuICB9XG59Il19
@@ -15,11 +15,16 @@ export interface PortfolioRepoOptions {
15
15
  auto_init?: boolean;
16
16
  }
17
17
  export declare class PortfolioRepoManager {
18
- private static readonly PORTFOLIO_REPO_NAME;
18
+ private static readonly DEFAULT_PORTFOLIO_REPO_NAME;
19
19
  private static readonly DEFAULT_DESCRIPTION;
20
20
  private static readonly GITHUB_API_BASE;
21
21
  private token;
22
- constructor();
22
+ private repositoryName;
23
+ constructor(repositoryName?: string);
24
+ /**
25
+ * Get the configured repository name
26
+ */
27
+ getRepositoryName(): string;
23
28
  /**
24
29
  * Set the GitHub token for API calls
25
30
  * Used when token is already available from TokenManager
@@ -72,5 +77,14 @@ export declare class PortfolioRepoManager {
72
77
  * Format element content for storage
73
78
  */
74
79
  private formatElementContent;
80
+ /**
81
+ * Get the authenticated user's username
82
+ */
83
+ private getUsername;
84
+ /**
85
+ * Get file content from GitHub repository
86
+ * Used for pull operations to download elements
87
+ */
88
+ getFileContent(path: string, username?: string, repository?: string): Promise<string>;
75
89
  }
76
90
  //# sourceMappingURL=PortfolioRepoManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PortfolioRepoManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioRepoManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAOzD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAuC;IAClF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAEnE,OAAO,CAAC,KAAK,CAAuB;;IAMpC;;;OAGG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;OAIG;YACW,mBAAmB;IA6BjC;;;OAGG;IACU,aAAa,CACxB,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAc,EACtB,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,GAAG,CAAC;IA2Ef;;;;OAIG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe9D;;;OAGG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IA+EtF;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IA2OnF;;;OAGG;IACG,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CjE;;;OAGG;IACH,OAAO,CAAC,eAAe;IAcvB;;;;OAIG;WACW,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAwBpD;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAQ7B"}
1
+ {"version":3,"file":"PortfolioRepoManager.d.ts","sourceRoot":"","sources":["../../src/portfolio/PortfolioRepoManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAOzD,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,2BAA2B,CAAyB;IAC5E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAuC;IAClF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAA4B;IAEnE,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,cAAc,CAAS;gBAEnB,cAAc,CAAC,EAAE,MAAM;IAQnC;;OAEG;IACI,iBAAiB,IAAI,MAAM;IAIlC;;;OAGG;IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpC;;;;OAIG;YACW,mBAAmB;IA6BjC;;;OAGG;IACU,aAAa,CACxB,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAc,EACtB,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,GAAG,CAAC;IA6Ff;;;;OAIG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe9D;;;OAGG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IA+EtF;;;OAGG;IACG,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IA2OnF;;;OAGG;IACG,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+CjE;;;OAGG;IACH,OAAO,CAAC,eAAe;IAcvB;;;;OAIG;WACW,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAwBpD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAS5B;;OAEG;YACW,WAAW;IAQzB;;;OAGG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA2C5F"}