@dollhousemcp/mcp-server 1.5.2 → 1.6.0

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 (272) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +494 -111
  3. package/data/agents/code-reviewer.md +8 -1
  4. package/data/agents/research-assistant.md +8 -1
  5. package/data/agents/task-manager.md +8 -1
  6. package/data/ensembles/business-advisor.md +8 -1
  7. package/data/ensembles/creative-studio.md +8 -1
  8. package/data/ensembles/development-team.md +8 -1
  9. package/data/ensembles/security-analysis-team.md +8 -1
  10. package/data/memories/conversation-history.md +8 -1
  11. package/data/memories/learning-progress.md +8 -1
  12. package/data/memories/project-context.md +8 -1
  13. package/data/personas/business-consultant.md +8 -1
  14. package/data/personas/creative-writer.md +8 -1
  15. package/data/personas/debug-detective.md +8 -1
  16. package/data/personas/eli5-explainer.md +8 -1
  17. package/data/personas/security-analyst.md +8 -1
  18. package/data/personas/technical-analyst.md +8 -1
  19. package/data/skills/code-review.md +8 -1
  20. package/data/skills/creative-writing.md +8 -1
  21. package/data/skills/data-analysis.md +8 -1
  22. package/data/skills/penetration-testing.md +8 -1
  23. package/data/skills/research.md +8 -1
  24. package/data/skills/threat-modeling.md +8 -1
  25. package/data/skills/translation.md +8 -1
  26. package/data/templates/code-documentation.md +8 -1
  27. package/data/templates/email-professional.md +8 -1
  28. package/data/templates/meeting-notes.md +8 -1
  29. package/data/templates/penetration-test-report.md +8 -1
  30. package/data/templates/project-brief.md +8 -1
  31. package/data/templates/report-executive.md +8 -1
  32. package/data/templates/security-vulnerability-report.md +8 -1
  33. package/data/templates/threat-assessment-report.md +8 -1
  34. package/dist/auth/GitHubAuthManager.d.ts +6 -1
  35. package/dist/auth/GitHubAuthManager.d.ts.map +1 -1
  36. package/dist/auth/GitHubAuthManager.js +45 -18
  37. package/dist/benchmarks/IndexPerformanceBenchmark.d.ts +98 -0
  38. package/dist/benchmarks/IndexPerformanceBenchmark.d.ts.map +1 -0
  39. package/dist/benchmarks/IndexPerformanceBenchmark.js +531 -0
  40. package/dist/cache/CollectionCache.d.ts.map +1 -1
  41. package/dist/cache/CollectionCache.js +13 -3
  42. package/dist/cache/CollectionIndexCache.d.ts +77 -0
  43. package/dist/cache/CollectionIndexCache.d.ts.map +1 -0
  44. package/dist/cache/CollectionIndexCache.js +349 -0
  45. package/dist/cache/LRUCache.d.ts +93 -0
  46. package/dist/cache/LRUCache.d.ts.map +1 -0
  47. package/dist/cache/LRUCache.js +299 -0
  48. package/dist/cache/index.d.ts +1 -0
  49. package/dist/cache/index.d.ts.map +1 -1
  50. package/dist/cache/index.js +2 -1
  51. package/dist/collection/CollectionBrowser.d.ts +21 -1
  52. package/dist/collection/CollectionBrowser.d.ts.map +1 -1
  53. package/dist/collection/CollectionBrowser.js +130 -10
  54. package/dist/collection/CollectionIndexManager.d.ts +151 -0
  55. package/dist/collection/CollectionIndexManager.d.ts.map +1 -0
  56. package/dist/collection/CollectionIndexManager.js +499 -0
  57. package/dist/collection/CollectionSearch.d.ts +55 -0
  58. package/dist/collection/CollectionSearch.d.ts.map +1 -1
  59. package/dist/collection/CollectionSearch.js +338 -13
  60. package/dist/collection/CollectionSeeder.d.ts.map +1 -1
  61. package/dist/collection/CollectionSeeder.js +38 -1
  62. package/dist/collection/ElementInstaller.d.ts +31 -0
  63. package/dist/collection/ElementInstaller.d.ts.map +1 -1
  64. package/dist/collection/ElementInstaller.js +77 -15
  65. package/dist/collection/PersonaSubmitter.d.ts +1 -1
  66. package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
  67. package/dist/collection/PersonaSubmitter.js +2 -2
  68. package/dist/collection/index.d.ts +1 -0
  69. package/dist/collection/index.d.ts.map +1 -1
  70. package/dist/collection/index.js +2 -1
  71. package/dist/config/ConfigManager.d.ts +78 -0
  72. package/dist/config/ConfigManager.d.ts.map +1 -0
  73. package/dist/config/ConfigManager.js +216 -0
  74. package/dist/config/element-types.d.ts +135 -0
  75. package/dist/config/element-types.d.ts.map +1 -0
  76. package/dist/config/element-types.js +108 -0
  77. package/dist/config/index.d.ts +2 -0
  78. package/dist/config/index.d.ts.map +1 -1
  79. package/dist/config/index.js +3 -1
  80. package/dist/config/portfolio-constants.d.ts +83 -0
  81. package/dist/config/portfolio-constants.d.ts.map +1 -0
  82. package/dist/config/portfolio-constants.js +99 -0
  83. package/dist/elements/BaseElement.d.ts +14 -2
  84. package/dist/elements/BaseElement.d.ts.map +1 -1
  85. package/dist/elements/BaseElement.js +88 -6
  86. package/dist/elements/agents/Agent.d.ts +10 -1
  87. package/dist/elements/agents/Agent.d.ts.map +1 -1
  88. package/dist/elements/agents/Agent.js +66 -19
  89. package/dist/elements/agents/AgentManager.d.ts +2 -0
  90. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  91. package/dist/elements/agents/AgentManager.js +12 -10
  92. package/dist/elements/skills/Skill.d.ts +10 -1
  93. package/dist/elements/skills/Skill.d.ts.map +1 -1
  94. package/dist/elements/skills/Skill.js +40 -3
  95. package/dist/elements/skills/SkillManager.d.ts +1 -0
  96. package/dist/elements/skills/SkillManager.d.ts.map +1 -1
  97. package/dist/elements/skills/SkillManager.js +10 -4
  98. package/dist/elements/templates/Template.d.ts +10 -1
  99. package/dist/elements/templates/Template.d.ts.map +1 -1
  100. package/dist/elements/templates/Template.js +35 -18
  101. package/dist/elements/templates/TemplateManager.d.ts +1 -1
  102. package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
  103. package/dist/elements/templates/TemplateManager.js +6 -5
  104. package/dist/generated/version.d.ts +2 -2
  105. package/dist/generated/version.js +3 -3
  106. package/dist/index.barrel.d.ts +1 -2
  107. package/dist/index.barrel.d.ts.map +1 -1
  108. package/dist/index.barrel.js +2 -4
  109. package/dist/index.d.ts +143 -25
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +1883 -310
  112. package/dist/persona/PersonaElement.d.ts +10 -0
  113. package/dist/persona/PersonaElement.d.ts.map +1 -1
  114. package/dist/persona/PersonaElement.js +55 -32
  115. package/dist/persona/PersonaElementManager.d.ts.map +1 -1
  116. package/dist/persona/PersonaElementManager.js +13 -11
  117. package/dist/persona/PersonaLoader.d.ts.map +1 -1
  118. package/dist/persona/PersonaLoader.js +8 -2
  119. package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -1
  120. package/dist/persona/export-import/PersonaImporter.js +24 -5
  121. package/dist/persona/export-import/PersonaSharer.d.ts +21 -0
  122. package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -1
  123. package/dist/persona/export-import/PersonaSharer.js +198 -22
  124. package/dist/portfolio/DefaultElementProvider.d.ts +90 -0
  125. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  126. package/dist/portfolio/DefaultElementProvider.js +499 -7
  127. package/dist/portfolio/GitHubPortfolioIndexer.d.ts +129 -0
  128. package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -0
  129. package/dist/portfolio/GitHubPortfolioIndexer.js +475 -0
  130. package/dist/portfolio/MigrationManager.d.ts.map +1 -1
  131. package/dist/portfolio/MigrationManager.js +136 -3
  132. package/dist/portfolio/PortfolioIndexManager.d.ts +130 -0
  133. package/dist/portfolio/PortfolioIndexManager.d.ts.map +1 -0
  134. package/dist/portfolio/PortfolioIndexManager.js +478 -0
  135. package/dist/portfolio/PortfolioManager.d.ts +5 -0
  136. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  137. package/dist/portfolio/PortfolioManager.js +61 -20
  138. package/dist/portfolio/PortfolioRepoManager.d.ts +75 -0
  139. package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -0
  140. package/dist/portfolio/PortfolioRepoManager.js +337 -0
  141. package/dist/portfolio/UnifiedIndexManager.d.ts +388 -0
  142. package/dist/portfolio/UnifiedIndexManager.d.ts.map +1 -0
  143. package/dist/portfolio/UnifiedIndexManager.js +1434 -0
  144. package/dist/portfolio/index.d.ts +15 -0
  145. package/dist/portfolio/index.d.ts.map +1 -0
  146. package/dist/portfolio/index.js +15 -0
  147. package/dist/portfolio/types.d.ts +7 -0
  148. package/dist/portfolio/types.d.ts.map +1 -1
  149. package/dist/portfolio/types.js +6 -1
  150. package/dist/security/InputValidator.d.ts.map +1 -1
  151. package/dist/security/InputValidator.js +50 -48
  152. package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
  153. package/dist/security/audit/SecurityAuditor.js +17 -9
  154. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  155. package/dist/security/audit/config/suppressions.js +19 -3
  156. package/dist/security/contentValidator.d.ts +2 -0
  157. package/dist/security/contentValidator.d.ts.map +1 -1
  158. package/dist/security/contentValidator.js +115 -4
  159. package/dist/security/secureYamlParser.d.ts +1 -0
  160. package/dist/security/secureYamlParser.d.ts.map +1 -1
  161. package/dist/security/secureYamlParser.js +29 -7
  162. package/dist/security/securityMonitor.d.ts +1 -1
  163. package/dist/security/securityMonitor.d.ts.map +1 -1
  164. package/dist/security/securityMonitor.js +1 -1
  165. package/dist/security/tokenManager.d.ts +1 -1
  166. package/dist/security/tokenManager.d.ts.map +1 -1
  167. package/dist/security/tokenManager.js +30 -10
  168. package/dist/server/ServerSetup.d.ts +22 -2
  169. package/dist/server/ServerSetup.d.ts.map +1 -1
  170. package/dist/server/ServerSetup.js +77 -12
  171. package/dist/server/tools/AuthTools.d.ts.map +1 -1
  172. package/dist/server/tools/AuthTools.js +33 -1
  173. package/dist/server/tools/BuildInfoTools.d.ts +25 -0
  174. package/dist/server/tools/BuildInfoTools.d.ts.map +1 -0
  175. package/dist/server/tools/BuildInfoTools.js +36 -0
  176. package/dist/server/tools/CollectionTools.d.ts.map +1 -1
  177. package/dist/server/tools/CollectionTools.js +55 -46
  178. package/dist/server/tools/ConfigTools.d.ts.map +1 -1
  179. package/dist/server/tools/ConfigTools.js +29 -1
  180. package/dist/server/tools/PersonaTools.d.ts +4 -2
  181. package/dist/server/tools/PersonaTools.d.ts.map +1 -1
  182. package/dist/server/tools/PersonaTools.js +5 -152
  183. package/dist/server/tools/PortfolioTools.d.ts +12 -0
  184. package/dist/server/tools/PortfolioTools.d.ts.map +1 -0
  185. package/dist/server/tools/PortfolioTools.js +221 -0
  186. package/dist/server/tools/index.d.ts +3 -1
  187. package/dist/server/tools/index.d.ts.map +1 -1
  188. package/dist/server/tools/index.js +4 -2
  189. package/dist/server/types.d.ts +40 -5
  190. package/dist/server/types.d.ts.map +1 -1
  191. package/dist/server/types.js +1 -1
  192. package/dist/services/BuildInfoService.d.ts +84 -0
  193. package/dist/services/BuildInfoService.d.ts.map +1 -0
  194. package/dist/services/BuildInfoService.js +271 -0
  195. package/dist/tools/portfolio/PortfolioElementAdapter.d.ts +54 -0
  196. package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -0
  197. package/dist/tools/portfolio/PortfolioElementAdapter.js +229 -0
  198. package/dist/tools/portfolio/submitToPortfolioTool.d.ts +164 -0
  199. package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -0
  200. package/dist/tools/portfolio/submitToPortfolioTool.js +1523 -0
  201. package/dist/tools/portfolio/types.d.ts +41 -0
  202. package/dist/tools/portfolio/types.d.ts.map +1 -0
  203. package/dist/tools/portfolio/types.js +15 -0
  204. package/dist/types/collection.d.ts +51 -0
  205. package/dist/types/collection.d.ts.map +1 -1
  206. package/dist/types/collection.js +1 -1
  207. package/dist/utils/EarlyTerminationSearch.d.ts +41 -0
  208. package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -0
  209. package/dist/utils/EarlyTerminationSearch.js +164 -0
  210. package/dist/utils/ErrorHandler.d.ts +86 -0
  211. package/dist/utils/ErrorHandler.d.ts.map +1 -0
  212. package/dist/utils/ErrorHandler.js +201 -0
  213. package/dist/utils/FileDiscoveryUtil.d.ts +53 -0
  214. package/dist/utils/FileDiscoveryUtil.d.ts.map +1 -0
  215. package/dist/utils/FileDiscoveryUtil.js +169 -0
  216. package/dist/utils/GitHubRateLimiter.d.ts +88 -0
  217. package/dist/utils/GitHubRateLimiter.d.ts.map +1 -0
  218. package/dist/utils/GitHubRateLimiter.js +315 -0
  219. package/dist/utils/PerformanceMonitor.d.ts +134 -0
  220. package/dist/utils/PerformanceMonitor.d.ts.map +1 -0
  221. package/dist/utils/PerformanceMonitor.js +347 -0
  222. package/dist/utils/RateLimiter.d.ts.map +1 -0
  223. package/dist/utils/RateLimiter.js +172 -0
  224. package/dist/utils/SecureDownloader.d.ts +241 -0
  225. package/dist/utils/SecureDownloader.d.ts.map +1 -0
  226. package/dist/utils/SecureDownloader.js +759 -0
  227. package/dist/utils/ToolCache.d.ts +82 -0
  228. package/dist/utils/ToolCache.d.ts.map +1 -0
  229. package/dist/utils/ToolCache.js +196 -0
  230. package/dist/utils/errorCodes.d.ts +136 -0
  231. package/dist/utils/errorCodes.d.ts.map +1 -0
  232. package/dist/utils/errorCodes.js +87 -0
  233. package/dist/utils/index.d.ts +3 -0
  234. package/dist/utils/index.d.ts.map +1 -1
  235. package/dist/utils/index.js +4 -1
  236. package/dist/utils/installation.d.ts +1 -1
  237. package/dist/utils/installation.d.ts.map +1 -1
  238. package/dist/utils/installation.js +9 -8
  239. package/dist/utils/searchUtils.d.ts +31 -0
  240. package/dist/utils/searchUtils.d.ts.map +1 -1
  241. package/dist/utils/searchUtils.js +62 -1
  242. package/package.json +17 -7
  243. package/dist/config/updateConfig.d.ts +0 -84
  244. package/dist/config/updateConfig.d.ts.map +0 -1
  245. package/dist/config/updateConfig.js +0 -148
  246. package/dist/server/tools/UpdateTools.d.ts +0 -10
  247. package/dist/server/tools/UpdateTools.d.ts.map +0 -1
  248. package/dist/server/tools/UpdateTools.js +0 -85
  249. package/dist/update/BackupManager.d.ts +0 -63
  250. package/dist/update/BackupManager.d.ts.map +0 -1
  251. package/dist/update/BackupManager.js +0 -370
  252. package/dist/update/DependencyChecker.d.ts +0 -41
  253. package/dist/update/DependencyChecker.d.ts.map +0 -1
  254. package/dist/update/DependencyChecker.js +0 -132
  255. package/dist/update/RateLimiter.d.ts.map +0 -1
  256. package/dist/update/RateLimiter.js +0 -172
  257. package/dist/update/SignatureVerifier.d.ts +0 -71
  258. package/dist/update/SignatureVerifier.d.ts.map +0 -1
  259. package/dist/update/SignatureVerifier.js +0 -214
  260. package/dist/update/UpdateChecker.d.ts +0 -132
  261. package/dist/update/UpdateChecker.d.ts.map +0 -1
  262. package/dist/update/UpdateChecker.js +0 -506
  263. package/dist/update/UpdateManager.d.ts +0 -60
  264. package/dist/update/UpdateManager.d.ts.map +0 -1
  265. package/dist/update/UpdateManager.js +0 -730
  266. package/dist/update/VersionManager.d.ts +0 -31
  267. package/dist/update/VersionManager.d.ts.map +0 -1
  268. package/dist/update/VersionManager.js +0 -181
  269. package/dist/update/index.d.ts +0 -9
  270. package/dist/update/index.d.ts.map +0 -1
  271. package/dist/update/index.js +0 -9
  272. /package/dist/{update → utils}/RateLimiter.d.ts +0 -0
@@ -140,12 +140,12 @@ export class TemplateManager {
140
140
  }
141
141
  /**
142
142
  * List all templates
143
- * SECURITY FIX: Uses validated directory path
143
+ * SECURITY FIX: Uses PortfolioManager.listElements() which filters test elements
144
144
  */
145
145
  async list() {
146
146
  try {
147
- const files = await fs.readdir(this.templatesDir);
148
- const templateFiles = files.filter(file => file.endsWith('.md') || file.endsWith('.yaml'));
147
+ // Use PortfolioManager to get filtered list (excludes test elements)
148
+ const templateFiles = await this.portfolioManager.listElements(ElementType.TEMPLATE);
149
149
  // Load templates in parallel with error handling
150
150
  const templates = await Promise.all(templateFiles.map(async (file) => {
151
151
  try {
@@ -303,7 +303,8 @@ export class TemplateManager {
303
303
  try {
304
304
  switch (format) {
305
305
  case 'json':
306
- return template.serialize();
306
+ // Use serializeToJSON for JSON format, or serialize if not available
307
+ return template.serializeToJSON ? template.serializeToJSON() : template.serialize();
307
308
  case 'yaml':
308
309
  // SECURITY FIX: Use yaml.dump with FAILSAFE_SCHEMA to prevent code execution
309
310
  // Previously: Could potentially use unsafe YAML features
@@ -525,4 +526,4 @@ export class TemplateManager {
525
526
  .slice(0, validatedLimit);
526
527
  }
527
528
  }
528
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVtcGxhdGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFJSCxPQUFPLEVBQUUsUUFBUSxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakMsTUFBTSxPQUFPLGVBQWU7SUFDbEIsZ0JBQWdCLENBQW1CO0lBQ25DLFlBQVksQ0FBUztJQUNyQixTQUFTLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFckQ7UUFDRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMs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Q0FBQyxDQUFDLENBQUM7YUFDN0UsS0FBSyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlbXBsYXRlTWFuYWdlciAtIEltcGxlbWVudGF0aW9uIG9mIElFbGVtZW50TWFuYWdlciBmb3IgVGVtcGxhdGUgZWxlbWVudHNcbiAqIEhhbmRsZXMgQ1JVRCBvcGVyYXRpb25zIGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudCBmb3IgdGVtcGxhdGVzIGltcGxlbWVudGluZyBJRWxlbWVudFxuICogXG4gKiBTRUNVUklUWSBGSVhFUyBJTVBMRU1FTlRFRCAoRm9sbG93aW5nIFBSICMzMTkgcGF0dGVybnMpOlxuICogMS4gQ1JJVElDQUw6IEZpeGVkIHJhY2UgY29uZGl0aW9ucyBpbiBmaWxlIG9wZXJhdGlvbnMgYnkgdXNpbmcgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgcmVhZHMvd3JpdGVzXG4gKiAyLiBDUklUSUNBTDogRml4ZWQgZHluYW1pYyByZXF1aXJlKCkgc3RhdGVtZW50cyBieSB1c2luZyBzdGF0aWMgaW1wb3J0c1xuICogMy4gSElHSDogRml4ZWQgdW52YWxpZGF0ZWQgWUFNTCBwYXJzaW5nIHZ1bG5lcmFiaWxpdHkgYnkgdXNpbmcgU2VjdXJlWWFtbFBhcnNlclxuICogNC4gTUVESVVNOiBBbGwgdXNlciBpbnB1dHMgYXJlIG5vdyB2YWxpZGF0ZWQgYW5kIHNhbml0aXplZFxuICogNS4gTUVESVVNOiBBdWRpdCBsb2dnaW5nIGFkZGVkIGZvciBzZWN1cml0eSBvcGVyYXRpb25zXG4gKiA2LiBNRURJVU06IFBhdGggdHJhdmVyc2FsIHByZXZlbnRpb24gZm9yIGFsbCBmaWxlIG9wZXJhdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBJRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgVGVtcGxhdGVNZXRhZGF0YSB9IGZyb20gJy4vVGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQsIHZhbGlkYXRlUGF0aCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBtYXR0ZXIgZnJvbSAnZ3JheS1tYXR0ZXInO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVNYW5hZ2VyIGltcGxlbWVudHMgSUVsZW1lbnRNYW5hZ2VyPFRlbXBsYXRlPiB7XG4gIHByaXZhdGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcHJpdmF0ZSB0ZW1wbGF0ZXNEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSB0ZW1wbGF0ZXM6IE1hcDxzdHJpbmcsIFRlbXBsYXRlPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgdGhpcy50ZW1wbGF0ZXNEaXIgPSB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5URU1QTEFURSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHRlbXBsYXRlIGZyb20gZmlsZVxuICAgKiBTRUNVUklUWSBGSVggIzE6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKCkgaW5zdGVhZCBvZiBmcy5yZWFkRmlsZSgpXG4gICAqIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIGFuZCBlbnN1cmUgYXRvbWljIGZpbGUgb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNCAmICM2OiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGhlIGZpbGUgcGF0aFxuICAgIC8vIFByZXZpb3VzbHk6IERpcmVjdCB1c2Ugb2YgdXNlci1wcm92aWRlZCBwYXRocyBjb3VsZCBsZWFkIHRvIHBhdGggdHJhdmVyc2FsXG4gICAgLy8gTm93OiBGdWxsIHZhbGlkYXRpb24gcHJldmVudHMgYWNjZXNzaW5nIGZpbGVzIG91dHNpZGUgdGVtcGxhdGVzIGRpcmVjdG9yeVxuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIFxuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyB3aXRoaW4gdGhlIHRlbXBsYXRlcyBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgID8gc2FuaXRpemVkUGF0aCBcbiAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzY6IFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuICAgIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCh0aGlzLnRlbXBsYXRlc0RpcikpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgQXR0ZW1wdGVkIHRvIGFjY2VzcyBmaWxlIG91dHNpZGUgdGVtcGxhdGVzIGRpcmVjdG9yeTogJHtzYW5pdGl6ZWRQYXRofWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIHRyYXZlcnNhbCBhdHRlbXB0IGRldGVjdGVkJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGF0b21pYyBmaWxlIHJlYWQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIHdpdGggcHJvcGVyIGVuY29kaW5nIG9iamVjdCBmb3JtYXRcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUobm9ybWFsaXplZFBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIHRoZSB0ZW1wbGF0ZSBmaWxlIChleHBlY3RlZCBmb3JtYXQ6IFlBTUwgZnJvbnRtYXR0ZXIgKyBjb250ZW50KVxuICAgICAgY29uc3QgcGFyc2VkID0gbWF0dGVyKGNvbnRlbnQpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzM6IFZhbGlkYXRlIFlBTUwgbWV0YWRhdGEgdXNpbmcgU2VjdXJlWWFtbFBhcnNlclxuICAgICAgLy8gUHJldmlvdXNseTogRnJvbnRtYXR0ZXIgcGFyc2luZyBjb3VsZCBiZSB2dWxuZXJhYmxlIHRvIFlBTUwgaW5qZWN0aW9uXG4gICAgICAvLyBOb3c6IFNlY3VyZVlhbWxQYXJzZXIgdmFsaWRhdGVzIGFuZCBzYW5pdGl6ZXMgWUFNTCBjb250ZW50XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSB0aGUgdGVtcGxhdGUgaW5zdGFuY2VcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG4gICAgICBcbiAgICAgIC8vIENhY2hlIHRoZSB0ZW1wbGF0ZVxuICAgICAgdGhpcy50ZW1wbGF0ZXMuc2V0KG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZSk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWCAjNTogTG9nIHN1Y2Nlc3NmdWwgdGVtcGxhdGUgbG9hZCBmb3IgYXVkaXQgdHJhaWxcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RFTVBMQVRFX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgVGVtcGxhdGUgbG9hZGVkOiAke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9IGZyb20gJHtwYXRoLmJhc2VuYW1lKG5vcm1hbGl6ZWRQYXRoKX1gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIHRlbXBsYXRlIGZyb20gJHtub3JtYWxpemVkUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhIHRlbXBsYXRlIHRvIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIHNhdmUodGVtcGxhdGU6IFRlbXBsYXRlLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYICM0OiBWYWxpZGF0ZSBpbnB1dHNcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdGVtcGxhdGUudmFsaWRhdGUoKTtcbiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNhdmUgaW52YWxpZCB0ZW1wbGF0ZTogJHt2YWxpZGF0aW9uLmVycm9ycz8ubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNCAmICM2OiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGhlIGZpbGUgcGF0aFxuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIFxuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyB3aXRoaW4gdGhlIHRlbXBsYXRlcyBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgID8gc2FuaXRpemVkUGF0aCBcbiAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzY6IFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuICAgIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCh0aGlzLnRlbXBsYXRlc0RpcikpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgQXR0ZW1wdGVkIHRvIHNhdmUgZmlsZSBvdXRzaWRlIHRlbXBsYXRlcyBkaXJlY3Rvcnk6ICR7c2FuaXRpemVkUGF0aH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKG5vcm1hbGl6ZWRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBmcm9udG1hdHRlciBjb250ZW50XG4gICAgICBjb25zdCBmcm9udG1hdHRlciA9IHRoaXMuY3JlYXRlRnJvbnRtYXR0ZXIodGVtcGxhdGUubWV0YWRhdGEpO1xuICAgICAgY29uc3QgY29udGVudCA9IGAtLS1cXG4ke2Zyb250bWF0dGVyfVxcbi0tLVxcblxcbiR7dGVtcGxhdGUuY29udGVudH1gO1xuICAgICAgXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFVzZSBhdG9taWMgZmlsZSB3cml0ZSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgICAgLy8gUHJldmlvdXNseTogYXdhaXQgZnMud3JpdGVGaWxlKGZ1bGxQYXRoLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICAgIC8vIE5vdzogVXNlcyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKG5vcm1hbGl6ZWRQYXRoLCBjb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgXG4gICAgICAvLyBVcGRhdGUgY2FjaGVcbiAgICAgIHRoaXMudGVtcGxhdGVzLnNldChub3JtYWxpemVkUGF0aCwgdGVtcGxhdGUpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzU6IExvZyBzdWNjZXNzZnVsIHNhdmUgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdURU1QTEFURV9TQVZFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgVGVtcGxhdGUgc2F2ZWQ6ICR7dGVtcGxhdGUubWV0YWRhdGEubmFtZX0gdG8gJHtwYXRoLmJhc2VuYW1lKG5vcm1hbGl6ZWRQYXRoKX1gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmluZm8oYFRlbXBsYXRlIHNhdmVkOiAke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHNhdmUgdGVtcGxhdGUgdG8gJHtub3JtYWxpemVkUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgdGVtcGxhdGVzXG4gICAqIFNFQ1VSSVRZIEZJWDogVXNlcyB2YWxpZGF0ZWQgZGlyZWN0b3J5IHBhdGhcbiAgICovXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxUZW1wbGF0ZVtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcih0aGlzLnRlbXBsYXRlc0Rpcik7XG4gICAgICBjb25zdCB0ZW1wbGF0ZUZpbGVzID0gZmlsZXMuZmlsdGVyKGZpbGUgPT4gZmlsZS5lbmRzV2l0aCgnLm1kJykgfHwgZmlsZS5lbmRzV2l0aCgnLnlhbWwnKSk7XG4gICAgICBcbiAgICAgIC8vIExvYWQgdGVtcGxhdGVzIGluIHBhcmFsbGVsIHdpdGggZXJyb3IgaGFuZGxpbmdcbiAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0ZW1wbGF0ZUZpbGVzLm1hcChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChmaWxlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCB0ZW1wbGF0ZSAke2ZpbGV9OiAke2Vycm9yfWApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgLy8gRmlsdGVyIG91dCBmYWlsZWQgbG9hZHNcbiAgICAgIHJldHVybiB0ZW1wbGF0ZXMuZmlsdGVyKCh0KTogdCBpcyBUZW1wbGF0ZSA9PiB0ICE9PSBudWxsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIG1pc3NpbmcgZGlyZWN0b3J5IGdyYWNlZnVsbHkgd2l0aCB0eXBlLXNhZmUgY2hlY2tcbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbXBsYXRlcyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgeWV0LCByZXR1cm5pbmcgZW1wdHkgYXJyYXknKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbGlzdCB0ZW1wbGF0ZXM6ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSB0ZW1wbGF0ZSBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmQocHJlZGljYXRlOiAodGVtcGxhdGU6IFRlbXBsYXRlKSA9PiBib29sZWFuKTogUHJvbWlzZTxUZW1wbGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiB0ZW1wbGF0ZXMuZmluZChwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB0ZW1wbGF0ZVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGRhdGE6IHtuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55fSk6IFByb21pc2U8VGVtcGxhdGU+IHtcbiAgICAvLyBTRUNVUklUWSBGSVggIzQ6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhbGwgaW5wdXRzXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQoZGF0YS5uYW1lIHx8ICduZXctdGVtcGxhdGUnLCAxMDApO1xuICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChkYXRhLmRlc2NyaXB0aW9uIHx8ICcnLCA1MDApO1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSBzYW5pdGl6ZUlucHV0KGRhdGEuY29udGVudCB8fCAnJywgMTAwMDAwKTsgLy8gMTAwS0IgbWF4XG4gICAgXG4gICAgLy8gQ3JlYXRlIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZVxuICAgIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHtcbiAgICAgIC4uLmRhdGEubWV0YWRhdGEsXG4gICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uXG4gICAgfSwgc2FuaXRpemVkQ29udGVudCk7XG4gICAgXG4gICAgLy8gR2VuZXJhdGUgZmlsZW5hbWUgZnJvbSB0ZW1wbGF0ZSBuYW1lXG4gICAgY29uc3QgZmlsZW5hbWUgPSBgJHtzYW5pdGl6ZWROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpfS5tZGA7XG4gICAgXG4gICAgLy8gU2F2ZSB0aGUgdGVtcGxhdGVcbiAgICBhd2FpdCB0aGlzLnNhdmUodGVtcGxhdGUsIGZpbGVuYW1lKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzU6IEF1ZGl0IHN1Y2Nlc3NmdWwgY3JlYXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1RlbXBsYXRlTWFuYWdlci5jcmVhdGUnLFxuICAgICAgZGV0YWlsczogYFRlbXBsYXRlIGNyZWF0ZWQ6ICR7dGVtcGxhdGUubWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHRlbXBsYXRlXG4gICAqIFNFQ1VSSVRZIEZJWCAjNjogUGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGVsZXRpb24gb3V0c2lkZSBkaXJlY3RvcnlcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYICM0ICYgIzY6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSB0aGUgZmlsZSBwYXRoXG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgXG4gICAgLy8gRW5zdXJlIHRoZSBwYXRoIGlzIHdpdGhpbiB0aGUgdGVtcGxhdGVzIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpIFxuICAgICAgPyBzYW5pdGl6ZWRQYXRoIFxuICAgICAgOiBwYXRoLmpvaW4odGhpcy50ZW1wbGF0ZXNEaXIsIHNhbml0aXplZFBhdGgpO1xuICAgIFxuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNjogUHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzXG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmdWxsUGF0aCk7XG4gICAgaWYgKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKHRoaXMudGVtcGxhdGVzRGlyKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICBzb3VyY2U6ICdUZW1wbGF0ZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgICAgZGV0YWlsczogYEF0dGVtcHRlZCB0byBkZWxldGUgZmlsZSBvdXRzaWRlIHRlbXBsYXRlcyBkaXJlY3Rvcnk6ICR7c2FuaXRpemVkUGF0aH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsobm9ybWFsaXplZFBhdGgpO1xuICAgICAgdGhpcy50ZW1wbGF0ZXMuZGVsZXRlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYICM1OiBMb2cgZGVsZXRpb24gZm9yIGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdURU1QTEFURV9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdUZW1wbGF0ZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgICAgZGV0YWlsczogYFRlbXBsYXRlIGRlbGV0ZWQ6ICR7cGF0aC5iYXNlbmFtZShub3JtYWxpemVkUGF0aCl9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKGBUZW1wbGF0ZSBkZWxldGVkOiAke3BhdGguYmFzZW5hbWUobm9ybWFsaXplZFBhdGgpfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgdGVtcGxhdGUgJHtub3JtYWxpemVkUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgdGVtcGxhdGUgZnJvbSBleHRlcm5hbCBmb3JtYXRcbiAgICogU0VDVVJJVFkgRklYICMzOiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIgZm9yIHNhZmUgWUFNTCBwYXJzaW5nXG4gICAqL1xuICBhc3luYyBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgbWV0YWRhdGE6IFBhcnRpYWw8VGVtcGxhdGVNZXRhZGF0YT47XG4gICAgICBsZXQgY29udGVudDogc3RyaW5nID0gJyc7XG4gICAgICBcbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgIGNvbnN0IGpzb25EYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICBtZXRhZGF0YSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRhZGF0YShqc29uRGF0YS5tZXRhZGF0YSB8fCB7fSk7XG4gICAgICAgICAgY29udGVudCA9IGpzb25EYXRhLmNvbnRlbnQgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ3lhbWwnOlxuICAgICAgICAgIC8vIEhJR0ggU0VWRVJJVFkgRklYOiBVc2UgU2VjdXJlWWFtbFBhcnNlciB0byBwcmV2ZW50IFlBTUwgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgICAgICAvLyBQcmV2aW91c2x5OiBVc2VkIHVuc2FmZSBZQU1MIHBhcnNpbmcgd2l0aG91dCB2YWxpZGF0aW9uXG4gICAgICAgICAgLy8gTm93OiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIgd2hpY2ggdmFsaWRhdGVzIGNvbnRlbnQgYW5kIHByZXZlbnRzIG1hbGljaW91cyBwYXR0ZXJuc1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoZGF0YSwge1xuICAgICAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCwgLy8gNjRLQiBsaW1pdFxuICAgICAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnZhbGlkYXRlTWV0YWRhdGEoKHBhcnNlZCBhcyBhbnkpLm1ldGFkYXRhIHx8IHt9KTtcbiAgICAgICAgICBjb250ZW50ID0gcGFyc2VkLmNvbnRlbnQgfHwgJyc7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBhdWRpdCB0cmFpbFxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdZQU1MX1BBUlNFX1NVQ0NFU1MnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICAgICAgZGV0YWlsczogJ1lBTUwgY29udGVudCBzYWZlbHkgcGFyc2VkIGR1cmluZyBpbXBvcnQnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ21hcmtkb3duJzpcbiAgICAgICAgICBjb25zdCBtZFBhcnNlZCA9IG1hdHRlcihkYXRhKTtcbiAgICAgICAgICBtZXRhZGF0YSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRhZGF0YShtZFBhcnNlZC5kYXRhKTtcbiAgICAgICAgICBjb250ZW50ID0gbWRQYXJzZWQuY29udGVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGltcG9ydCBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYW5kIHZhbGlkYXRlIHRoZSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUobWV0YWRhdGEsIGNvbnRlbnQpO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRlbXBsYXRlLnZhbGlkYXRlKCk7XG4gICAgICBcbiAgICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGU6ICR7dmFsaWRhdGlvbi5lcnJvcnM/Lm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBpbXBvcnQgdGVtcGxhdGU6ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGEgdGVtcGxhdGUgdG8gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFNFQ1VSSVRZIEZJWCAjMzogVXNlcyBzYWZlIFlBTUwgc2VyaWFsaXphdGlvblxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWxlbWVudCh0ZW1wbGF0ZTogVGVtcGxhdGUsIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZS5zZXJpYWxpemUoKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSAneWFtbCc6XG4gICAgICAgICAgLy8gU0VDVVJJVFkgRklYOiBVc2UgeWFtbC5kdW1wIHdpdGggRkFJTFNBRkVfU0NIRU1BIHRvIHByZXZlbnQgY29kZSBleGVjdXRpb25cbiAgICAgICAgICAvLyBQcmV2aW91c2x5OiBDb3VsZCBwb3RlbnRpYWxseSB1c2UgdW5zYWZlIFlBTUwgZmVhdHVyZXNcbiAgICAgICAgICAvLyBOb3c6IEZBSUxTQUZFX1NDSEVNQSBvbmx5IGFsbG93cyBiYXNpYyBZQU1MIHR5cGVzLCBubyBKUy1zcGVjaWZpYyBjb25zdHJ1Y3RzXG4gICAgICAgICAgY29uc3QgeWFtbERhdGEgPSB7XG4gICAgICAgICAgICBtZXRhZGF0YTogdGVtcGxhdGUubWV0YWRhdGEsXG4gICAgICAgICAgICBjb250ZW50OiB0ZW1wbGF0ZS5jb250ZW50LFxuICAgICAgICAgICAgaWQ6IHRlbXBsYXRlLmlkLFxuICAgICAgICAgICAgdmVyc2lvbjogdGVtcGxhdGUudmVyc2lvblxuICAgICAgICAgIH07XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHlhbWwuZHVtcCh5YW1sRGF0YSwge1xuICAgICAgICAgICAgLy8gU0VDVVJJVFkgVFJBREUtT0ZGOiBVc2luZyBERUZBVUxUX1NDSEVNQSBpbnN0ZWFkIG9mIEZBSUxTQUZFX1NDSEVNQVxuICAgICAgICAgICAgLy8gUmVhc29uOiBGQUlMU0FGRV9TQ0hFTUEgZG9lc24ndCBzdXBwb3J0IG51bWJlciB0eXBlcyB3aGljaCBhcmUgbmVlZGVkIGZvciB0ZW1wbGF0ZSBtZXRhZGF0YVxuICAgICAgICAgICAgLy8gUmlzazogREVGQVVMVF9TQ0hFTUEgYWxsb3dzIG1vcmUgWUFNTCBmZWF0dXJlcyB0aGF0IGNvdWxkIGJlIGV4cGxvaXRlZFxuICAgICAgICAgICAgLy8gTWl0aWdhdGlvbjogbm9SZWZzIHByZXZlbnRzIHJlZmVyZW5jZSBhdHRhY2tzLCBza2lwSW52YWxpZCBkcm9wcyBkYW5nZXJvdXMgY29uc3RydWN0c1xuICAgICAgICAgICAgLy8gQ29uc2lkZXI6IEZvciBtYXhpbXVtIHNlY3VyaXR5LCBpbXBsZW1lbnQgY3VzdG9tIHNjaGVtYSB0aGF0IG9ubHkgYWxsb3dzIG5lZWRlZCB0eXBlc1xuICAgICAgICAgICAgc2NoZW1hOiB5YW1sLkRFRkFVTFRfU0NIRU1BLFxuICAgICAgICAgICAgbm9SZWZzOiB0cnVlLCAgICAgICAgLy8gUHJldmVudCByZWZlcmVuY2UgYXR0YWNrc1xuICAgICAgICAgICAgc29ydEtleXM6IHRydWUsICAgICAgLy8gQ29uc2lzdGVudCBvdXRwdXRcbiAgICAgICAgICAgIHNraXBJbnZhbGlkOiB0cnVlLCAgIC8vIFNraXAgdW5zZXJpYWxpemFibGUgdmFsdWVzIGluc3RlYWQgb2YgdGhyb3dpbmdcbiAgICAgICAgICAgIGNvbmRlbnNlRmxvdzogdHJ1ZSwgIC8vIE1vcmUgY29tcGFjdCBvdXRwdXRcbiAgICAgICAgICAgIHF1b3RpbmdUeXBlOiAnXCInLCAgICAvLyBGb3JjZSBkb3VibGUgcXVvdGVzIGZvciBjb25zaXN0ZW5jeVxuICAgICAgICAgICAgZm9yY2VRdW90ZXM6IGZhbHNlICAgLy8gT25seSBxdW90ZSB3aGVuIG5lY2Vzc2FyeVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlICdtYXJrZG93bic6XG4gICAgICAgICAgY29uc3QgZnJvbnRtYXR0ZXIgPSB0aGlzLmNyZWF0ZUZyb250bWF0dGVyKHRlbXBsYXRlLm1ldGFkYXRhKTtcbiAgICAgICAgICByZXR1cm4gYC0tLVxcbiR7ZnJvbnRtYXR0ZXJ9XFxuLS0tXFxuXFxuJHt0ZW1wbGF0ZS5jb250ZW50fWA7XG4gICAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBleHBvcnQgZm9ybWF0OiAke2Zvcm1hdH1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZXhwb3J0IHRlbXBsYXRlOiAke2Vycm9yfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBtZXRhZGF0YVxuICAgKiBTRUNVUklUWSBGSVggIzQ6IENvbXByZWhlbnNpdmUgbWV0YWRhdGEgdmFsaWRhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZU1ldGFkYXRhKGRhdGE6IGFueSk6IFByb21pc2U8UGFydGlhbDxUZW1wbGF0ZU1ldGFkYXRhPj4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBQYXJ0aWFsPFRlbXBsYXRlTWV0YWRhdGE+ID0ge307XG4gICAgXG4gICAgLy8gU2FuaXRpemUgc3RyaW5nIGZpZWxkc1xuICAgIGlmIChkYXRhLm5hbWUpIHtcbiAgICAgIG1ldGFkYXRhLm5hbWUgPSBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRhdGEubmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChkYXRhLmRlc2NyaXB0aW9uKSB7XG4gICAgICBtZXRhZGF0YS5kZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZGF0YS5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsIDUwMCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChkYXRhLmNhdGVnb3J5KSB7XG4gICAgICBtZXRhZGF0YS5jYXRlZ29yeSA9IHNhbml0aXplSW5wdXQoZGF0YS5jYXRlZ29yeSwgNTApO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZGF0YS5vdXRwdXRfZm9ybWF0KSB7XG4gICAgICBtZXRhZGF0YS5vdXRwdXRfZm9ybWF0ID0gc2FuaXRpemVJbnB1dChkYXRhLm91dHB1dF9mb3JtYXQsIDIwKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgYXJyYXlzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS50YWdzKSkge1xuICAgICAgbWV0YWRhdGEudGFncyA9IGRhdGEudGFncy5tYXAoKHRhZzogYW55KSA9PiBzYW5pdGl6ZUlucHV0KFN0cmluZyh0YWcpLCA1MCkpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLmluY2x1ZGVzKSkge1xuICAgICAgbWV0YWRhdGEuaW5jbHVkZXMgPSBkYXRhLmluY2x1ZGVzLm1hcCgoaW5jOiBhbnkpID0+IHNhbml0aXplSW5wdXQoU3RyaW5nKGluYyksIDIwMCkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb3B5IHNhZmUgZmllbGRzXG4gICAgaWYgKHR5cGVvZiBkYXRhLnVzYWdlX2NvdW50ID09PSAnbnVtYmVyJykge1xuICAgICAgbWV0YWRhdGEudXNhZ2VfY291bnQgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKGRhdGEudXNhZ2VfY291bnQpKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGRhdGEubGFzdF91c2VkKSB7XG4gICAgICBtZXRhZGF0YS5sYXN0X3VzZWQgPSBzYW5pdGl6ZUlucHV0KFN0cmluZyhkYXRhLmxhc3RfdXNlZCksIDUwKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgY29tcGxleCBmaWVsZHNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnZhcmlhYmxlcykpIHtcbiAgICAgIG1ldGFkYXRhLnZhcmlhYmxlcyA9IGRhdGEudmFyaWFibGVzLm1hcCgodjogYW55KSA9PiAoe1xuICAgICAgICBuYW1lOiBzYW5pdGl6ZUlucHV0KHYubmFtZSB8fCAnJywgNTApLFxuICAgICAgICB0eXBlOiBzYW5pdGl6ZUlucHV0KHYudHlwZSB8fCAnc3RyaW5nJywgMjApLFxuICAgICAgICBkZXNjcmlwdGlvbjogdi5kZXNjcmlwdGlvbiA/IHNhbml0aXplSW5wdXQodi5kZXNjcmlwdGlvbiwgMjAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmVxdWlyZWQ6IEJvb2xlYW4odi5yZXF1aXJlZCksXG4gICAgICAgIGRlZmF1bHQ6IHYuZGVmYXVsdCxcbiAgICAgICAgdmFsaWRhdGlvbjogdi52YWxpZGF0aW9uID8gc2FuaXRpemVJbnB1dCh2LnZhbGlkYXRpb24sIDIwMCkgOiB1bmRlZmluZWQsXG4gICAgICAgIG9wdGlvbnM6IEFycmF5LmlzQXJyYXkodi5vcHRpb25zKSA/IHYub3B0aW9ucy5tYXAoKG86IGFueSkgPT4gc2FuaXRpemVJbnB1dChTdHJpbmcobyksIDEwMCkpIDogdW5kZWZpbmVkLFxuICAgICAgICBmb3JtYXQ6IHYuZm9ybWF0ID8gc2FuaXRpemVJbnB1dCh2LmZvcm1hdCwgNTApIDogdW5kZWZpbmVkXG4gICAgICB9KSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEuZXhhbXBsZXMpKSB7XG4gICAgICBtZXRhZGF0YS5leGFtcGxlcyA9IGRhdGEuZXhhbXBsZXMubWFwKChleDogYW55KSA9PiAoe1xuICAgICAgICB0aXRsZTogc2FuaXRpemVJbnB1dChleC50aXRsZSB8fCAnJywgMTAwKSxcbiAgICAgICAgZGVzY3JpcHRpb246IGV4LmRlc2NyaXB0aW9uID8gc2FuaXRpemVJbnB1dChleC5kZXNjcmlwdGlvbiwgNTAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdmFyaWFibGVzOiBleC52YXJpYWJsZXMgfHwge30sXG4gICAgICAgIG91dHB1dDogZXgub3V0cHV0ID8gc2FuaXRpemVJbnB1dChleC5vdXRwdXQsIDUwMDApIDogdW5kZWZpbmVkXG4gICAgICB9KSk7XG4gICAgfVxuICAgIFxuICAgIC8vIENvcHkgc3RhbmRhcmQgZWxlbWVudCBmaWVsZHNcbiAgICBtZXRhZGF0YS5hdXRob3IgPSBkYXRhLmF1dGhvciA/IHNhbml0aXplSW5wdXQoZGF0YS5hdXRob3IsIDEwMCkgOiB1bmRlZmluZWQ7XG4gICAgbWV0YWRhdGEudmVyc2lvbiA9IGRhdGEudmVyc2lvbiA/IHNhbml0aXplSW5wdXQoZGF0YS52ZXJzaW9uLCAyMCkgOiB1bmRlZmluZWQ7XG4gICAgXG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBZQU1MIGZyb250bWF0dGVyIGZyb20gbWV0YWRhdGFcbiAgICogU0VDVVJJVFkgRklYICMzOiBTYWZlIFlBTUwgZ2VuZXJhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVGcm9udG1hdHRlcihtZXRhZGF0YTogVGVtcGxhdGVNZXRhZGF0YSk6IHN0cmluZyB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBVc2UgeWFtbC5kdW1wIHdpdGggc2VjdXJpdHkgb3B0aW9uc1xuICAgIC8vIEVuc3VyZXMgbm8gY29kZSBleGVjdXRpb24gdnVsbmVyYWJpbGl0aWVzIGluIGdlbmVyYXRlZCBZQU1MXG4gICAgY29uc3Qgc2FmZU1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIGF1dGhvcjogbWV0YWRhdGEuYXV0aG9yLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGEudmVyc2lvbixcbiAgICAgIGNhdGVnb3J5OiBtZXRhZGF0YS5jYXRlZ29yeSxcbiAgICAgIG91dHB1dF9mb3JtYXQ6IG1ldGFkYXRhLm91dHB1dF9mb3JtYXQsXG4gICAgICB0YWdzOiBtZXRhZGF0YS50YWdzLFxuICAgICAgaW5jbHVkZXM6IG1ldGFkYXRhLmluY2x1ZGVzLFxuICAgICAgdXNhZ2VfY291bnQ6IG1ldGFkYXRhLnVzYWdlX2NvdW50LFxuICAgICAgbGFzdF91c2VkOiBtZXRhZGF0YS5sYXN0X3VzZWQsXG4gICAgICB2YXJpYWJsZXM6IG1ldGFkYXRhLnZhcmlhYmxlcyxcbiAgICAgIGV4YW1wbGVzOiBtZXRhZGF0YS5leGFtcGxlc1xuICAgIH07XG4gICAgXG4gICAgLy8gUmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICBjb25zdCBjbGVhbk1ldGFkYXRhID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoc2FmZU1ldGFkYXRhKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgKTtcbiAgICBcbiAgICByZXR1cm4geWFtbC5kdW1wKGNsZWFuTWV0YWRhdGEsIHtcbiAgICAgIC8vIFNFQ1VSSVRZIFRSQURFLU9GRjogU2FtZSBhcyBleHBvcnRFbGVtZW50IC0gdXNpbmcgREVGQVVMVF9TQ0hFTUEgZm9yIHR5cGUgc3VwcG9ydFxuICAgICAgLy8gU2VlIGV4cG9ydEVsZW1lbnQgbWV0aG9kIGZvciBkZXRhaWxlZCBzZWN1cml0eSBjb25zaWRlcmF0aW9uc1xuICAgICAgc2NoZW1hOiB5YW1sLkRFRkFVTFRfU0NIRU1BLFxuICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgc29ydEtleXM6IHRydWUsXG4gICAgICBsaW5lV2lkdGg6IDgwLFxuICAgICAgc2tpcEludmFsaWQ6IHRydWUsXG4gICAgICBjb25kZW5zZUZsb3c6IHRydWUsXG4gICAgICBxdW90aW5nVHlwZTogJ1wiJyxcbiAgICAgIGZvcmNlUXVvdGVzOiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgdGVtcGxhdGUgZmlsZSBleGlzdHNcbiAgICovXG4gIGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmlzQWJzb2x1dGUoc2FuaXRpemVkUGF0aCkgXG4gICAgICA/IHNhbml0aXplZFBhdGggXG4gICAgICA6IHBhdGguam9pbih0aGlzLnRlbXBsYXRlc0Rpciwgc2FuaXRpemVkUGF0aCk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmdWxsUGF0aCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBtdWx0aXBsZSB0ZW1wbGF0ZXMgYnkgcHJlZGljYXRlXG4gICAqL1xuICBhc3luYyBmaW5kTWFueShwcmVkaWNhdGU6ICh0ZW1wbGF0ZTogVGVtcGxhdGUpID0+IGJvb2xlYW4pOiBQcm9taXNlPFRlbXBsYXRlW10+IHtcbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gdGVtcGxhdGVzLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgdGVtcGxhdGVcbiAgICovXG4gIHZhbGlkYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZSk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gdGVtcGxhdGUudmFsaWRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhIGZpbGUgcGF0aFxuICAgKi9cbiAgdmFsaWRhdGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgICAgPyBzYW5pdGl6ZWRQYXRoIFxuICAgICAgICA6IHBhdGguam9pbih0aGlzLnRlbXBsYXRlc0Rpciwgc2FuaXRpemVkUGF0aCk7XG4gICAgICBcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgodGhpcy50ZW1wbGF0ZXNEaXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgZ2V0RWxlbWVudFR5cGUoKTogRWxlbWVudFR5cGUge1xuICAgIHJldHVybiBFbGVtZW50VHlwZS5URU1QTEFURTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZpbGUgZXh0ZW5zaW9uXG4gICAqL1xuICBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcubWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGVtcGxhdGVzIGJ5IGNhdGVnb3J5XG4gICAqL1xuICBhc3luYyBmaW5kQnlDYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nKTogUHJvbWlzZTxUZW1wbGF0ZVtdPiB7XG4gICAgY29uc3Qgc2FuaXRpemVkQ2F0ZWdvcnkgPSBzYW5pdGl6ZUlucHV0KGNhdGVnb3J5LCA1MCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdCgpLnRoZW4odGVtcGxhdGVzID0+IFxuICAgICAgdGVtcGxhdGVzLmZpbHRlcih0ID0+IHQubWV0YWRhdGEuY2F0ZWdvcnkgPT09IHNhbml0aXplZENhdGVnb3J5KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0ZW1wbGF0ZXMgYnkgdGFnXG4gICAqL1xuICBhc3luYyBmaW5kQnlUYWcodGFnOiBzdHJpbmcpOiBQcm9taXNlPFRlbXBsYXRlW10+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRUYWcgPSBzYW5pdGl6ZUlucHV0KHRhZywgNTApO1xuICAgIHJldHVybiB0aGlzLmxpc3QoKS50aGVuKHRlbXBsYXRlcyA9PiBcbiAgICAgIHRlbXBsYXRlcy5maWx0ZXIodCA9PiB0Lm1ldGFkYXRhLnRhZ3M/LmluY2x1ZGVzKHNhbml0aXplZFRhZykpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbW9zdCB1c2VkIHRlbXBsYXRlc1xuICAgKi9cbiAgYXN5bmMgZ2V0TW9zdFVzZWQobGltaXQ6IG51bWJlciA9IDEwKTogUHJvbWlzZTxUZW1wbGF0ZVtdPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBWYWxpZGF0ZSBsaW1pdCBwYXJhbWV0ZXIgdG8gcHJldmVudCBleGNlc3NpdmUgbWVtb3J5IHVzYWdlXG4gICAgLy8gUHJldmlvdXNseTogTm8gdmFsaWRhdGlvbiBjb3VsZCBhbGxvdyB2ZXJ5IGxhcmdlIGxpbWl0c1xuICAgIC8vIE5vdzogRW5mb3JjZXMgcmVhc29uYWJsZSBib3VuZHNcbiAgICBjb25zdCBNSU5fTElNSVQgPSAxO1xuICAgIGNvbnN0IE1BWF9MSU1JVCA9IDEwMDtcbiAgICBjb25zdCB2YWxpZGF0ZWRMaW1pdCA9IE1hdGgubWF4KE1JTl9MSU1JVCwgTWF0aC5taW4oTUFYX0xJTUlULCBNYXRoLmZsb29yKGxpbWl0KSkpO1xuICAgIFxuICAgIGlmIChsaW1pdCAhPT0gdmFsaWRhdGVkTGltaXQpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBnZXRNb3N0VXNlZDogbGltaXQgJHtsaW1pdH0gYWRqdXN0ZWQgdG8gJHt2YWxpZGF0ZWRMaW1pdH0gKHZhbGlkIHJhbmdlOiAke01JTl9MSU1JVH0tJHtNQVhfTElNSVR9KWApO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gdGVtcGxhdGVzXG4gICAgICAuc29ydCgoYSwgYikgPT4gKGIubWV0YWRhdGEudXNhZ2VfY291bnQgfHwgMCkgLSAoYS5tZXRhZGF0YS51c2FnZV9jb3VudCB8fCAwKSlcbiAgICAgIC5zbGljZSgwLCB2YWxpZGF0ZWRMaW1pdCk7XG4gIH1cbn0iXX0=
529
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGVtcGxhdGVNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZU1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFJSCxPQUFPLEVBQUUsUUFBUSxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsUUFBUSxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFFakMsTUFBTSxPQUFPLGVBQWU7SUFDbEIsZ0JBQWdCLENBQW1CO0lBQ25DLFlBQVksQ0FBUztJQUNyQixTQUFTLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7SUFFckQ7UUFDRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMs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LENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlbXBsYXRlTWFuYWdlciAtIEltcGxlbWVudGF0aW9uIG9mIElFbGVtZW50TWFuYWdlciBmb3IgVGVtcGxhdGUgZWxlbWVudHNcbiAqIEhhbmRsZXMgQ1JVRCBvcGVyYXRpb25zIGFuZCBsaWZlY3ljbGUgbWFuYWdlbWVudCBmb3IgdGVtcGxhdGVzIGltcGxlbWVudGluZyBJRWxlbWVudFxuICogXG4gKiBTRUNVUklUWSBGSVhFUyBJTVBMRU1FTlRFRCAoRm9sbG93aW5nIFBSICMzMTkgcGF0dGVybnMpOlxuICogMS4gQ1JJVElDQUw6IEZpeGVkIHJhY2UgY29uZGl0aW9ucyBpbiBmaWxlIG9wZXJhdGlvbnMgYnkgdXNpbmcgRmlsZUxvY2tNYW5hZ2VyIGZvciBhdG9taWMgcmVhZHMvd3JpdGVzXG4gKiAyLiBDUklUSUNBTDogRml4ZWQgZHluYW1pYyByZXF1aXJlKCkgc3RhdGVtZW50cyBieSB1c2luZyBzdGF0aWMgaW1wb3J0c1xuICogMy4gSElHSDogRml4ZWQgdW52YWxpZGF0ZWQgWUFNTCBwYXJzaW5nIHZ1bG5lcmFiaWxpdHkgYnkgdXNpbmcgU2VjdXJlWWFtbFBhcnNlclxuICogNC4gTUVESVVNOiBBbGwgdXNlciBpbnB1dHMgYXJlIG5vdyB2YWxpZGF0ZWQgYW5kIHNhbml0aXplZFxuICogNS4gTUVESVVNOiBBdWRpdCBsb2dnaW5nIGFkZGVkIGZvciBzZWN1cml0eSBvcGVyYXRpb25zXG4gKiA2LiBNRURJVU06IFBhdGggdHJhdmVyc2FsIHByZXZlbnRpb24gZm9yIGFsbCBmaWxlIG9wZXJhdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBJRWxlbWVudE1hbmFnZXIgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSwgVGVtcGxhdGVNZXRhZGF0YSB9IGZyb20gJy4vVGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQsIHZhbGlkYXRlUGF0aCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCBtYXR0ZXIgZnJvbSAnZ3JheS1tYXR0ZXInO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVNYW5hZ2VyIGltcGxlbWVudHMgSUVsZW1lbnRNYW5hZ2VyPFRlbXBsYXRlPiB7XG4gIHByaXZhdGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcHJpdmF0ZSB0ZW1wbGF0ZXNEaXI6IHN0cmluZztcbiAgcHJpdmF0ZSB0ZW1wbGF0ZXM6IE1hcDxzdHJpbmcsIFRlbXBsYXRlPiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgdGhpcy50ZW1wbGF0ZXNEaXIgPSB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5URU1QTEFURSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIHRlbXBsYXRlIGZyb20gZmlsZVxuICAgKiBTRUNVUklUWSBGSVggIzE6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKCkgaW5zdGVhZCBvZiBmcy5yZWFkRmlsZSgpXG4gICAqIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIGFuZCBlbnN1cmUgYXRvbWljIGZpbGUgb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgbG9hZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNCAmICM2OiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGhlIGZpbGUgcGF0aFxuICAgIC8vIFByZXZpb3VzbHk6IERpcmVjdCB1c2Ugb2YgdXNlci1wcm92aWRlZCBwYXRocyBjb3VsZCBsZWFkIHRvIHBhdGggdHJhdmVyc2FsXG4gICAgLy8gTm93OiBGdWxsIHZhbGlkYXRpb24gcHJldmVudHMgYWNjZXNzaW5nIGZpbGVzIG91dHNpZGUgdGVtcGxhdGVzIGRpcmVjdG9yeVxuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIFxuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyB3aXRoaW4gdGhlIHRlbXBsYXRlcyBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgID8gc2FuaXRpemVkUGF0aCBcbiAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzY6IFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuICAgIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCh0aGlzLnRlbXBsYXRlc0RpcikpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgQXR0ZW1wdGVkIHRvIGFjY2VzcyBmaWxlIG91dHNpZGUgdGVtcGxhdGVzIGRpcmVjdG9yeTogJHtzYW5pdGl6ZWRQYXRofWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIHRyYXZlcnNhbCBhdHRlbXB0IGRldGVjdGVkJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGF0b21pYyBmaWxlIHJlYWQgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyIHdpdGggcHJvcGVyIGVuY29kaW5nIG9iamVjdCBmb3JtYXRcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljUmVhZEZpbGUobm9ybWFsaXplZFBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIFBhcnNlIHRoZSB0ZW1wbGF0ZSBmaWxlIChleHBlY3RlZCBmb3JtYXQ6IFlBTUwgZnJvbnRtYXR0ZXIgKyBjb250ZW50KVxuICAgICAgY29uc3QgcGFyc2VkID0gbWF0dGVyKGNvbnRlbnQpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzM6IFZhbGlkYXRlIFlBTUwgbWV0YWRhdGEgdXNpbmcgU2VjdXJlWWFtbFBhcnNlclxuICAgICAgLy8gUHJldmlvdXNseTogRnJvbnRtYXR0ZXIgcGFyc2luZyBjb3VsZCBiZSB2dWxuZXJhYmxlIHRvIFlBTUwgaW5qZWN0aW9uXG4gICAgICAvLyBOb3c6IFNlY3VyZVlhbWxQYXJzZXIgdmFsaWRhdGVzIGFuZCBzYW5pdGl6ZXMgWUFNTCBjb250ZW50XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRhZGF0YShwYXJzZWQuZGF0YSk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSB0aGUgdGVtcGxhdGUgaW5zdGFuY2VcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKG1ldGFkYXRhLCBwYXJzZWQuY29udGVudCk7XG4gICAgICBcbiAgICAgIC8vIENhY2hlIHRoZSB0ZW1wbGF0ZVxuICAgICAgdGhpcy50ZW1wbGF0ZXMuc2V0KG5vcm1hbGl6ZWRQYXRoLCB0ZW1wbGF0ZSk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWCAjNTogTG9nIHN1Y2Nlc3NmdWwgdGVtcGxhdGUgbG9hZCBmb3IgYXVkaXQgdHJhaWxcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RFTVBMQVRFX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgVGVtcGxhdGUgbG9hZGVkOiAke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9IGZyb20gJHtwYXRoLmJhc2VuYW1lKG5vcm1hbGl6ZWRQYXRoKX1gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsb2FkIHRlbXBsYXRlIGZyb20gJHtub3JtYWxpemVkUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhIHRlbXBsYXRlIHRvIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIHNhdmUodGVtcGxhdGU6IFRlbXBsYXRlLCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYICM0OiBWYWxpZGF0ZSBpbnB1dHNcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gdGVtcGxhdGUudmFsaWRhdGUoKTtcbiAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNhdmUgaW52YWxpZCB0ZW1wbGF0ZTogJHt2YWxpZGF0aW9uLmVycm9ycz8ubWFwKGUgPT4gZS5tZXNzYWdlKS5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNCAmICM2OiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGhlIGZpbGUgcGF0aFxuICAgIGNvbnN0IHNhbml0aXplZFBhdGggPSBzYW5pdGl6ZUlucHV0KGZpbGVQYXRoLCAyNTUpO1xuICAgIFxuICAgIC8vIEVuc3VyZSB0aGUgcGF0aCBpcyB3aXRoaW4gdGhlIHRlbXBsYXRlcyBkaXJlY3RvcnlcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgID8gc2FuaXRpemVkUGF0aCBcbiAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzY6IFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZnVsbFBhdGgpO1xuICAgIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCh0aGlzLnRlbXBsYXRlc0RpcikpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgQXR0ZW1wdGVkIHRvIHNhdmUgZmlsZSBvdXRzaWRlIHRlbXBsYXRlcyBkaXJlY3Rvcnk6ICR7c2FuaXRpemVkUGF0aH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKG5vcm1hbGl6ZWRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIENyZWF0ZSBmcm9udG1hdHRlciBjb250ZW50XG4gICAgICBjb25zdCBmcm9udG1hdHRlciA9IHRoaXMuY3JlYXRlRnJvbnRtYXR0ZXIodGVtcGxhdGUubWV0YWRhdGEpO1xuICAgICAgY29uc3QgY29udGVudCA9IGAtLS1cXG4ke2Zyb250bWF0dGVyfVxcbi0tLVxcblxcbiR7dGVtcGxhdGUuY29udGVudH1gO1xuICAgICAgXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFVzZSBhdG9taWMgZmlsZSB3cml0ZSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgICAgLy8gUHJldmlvdXNseTogYXdhaXQgZnMud3JpdGVGaWxlKGZ1bGxQYXRoLCBjb250ZW50LCAndXRmLTgnKTtcbiAgICAgIC8vIE5vdzogVXNlcyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyBvcGVyYXRpb25zXG4gICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKG5vcm1hbGl6ZWRQYXRoLCBjb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuICAgICAgXG4gICAgICAvLyBVcGRhdGUgY2FjaGVcbiAgICAgIHRoaXMudGVtcGxhdGVzLnNldChub3JtYWxpemVkUGF0aCwgdGVtcGxhdGUpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVggIzU6IExvZyBzdWNjZXNzZnVsIHNhdmUgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdURU1QTEFURV9TQVZFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgVGVtcGxhdGUgc2F2ZWQ6ICR7dGVtcGxhdGUubWV0YWRhdGEubmFtZX0gdG8gJHtwYXRoLmJhc2VuYW1lKG5vcm1hbGl6ZWRQYXRoKX1gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmluZm8oYFRlbXBsYXRlIHNhdmVkOiAke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHNhdmUgdGVtcGxhdGUgdG8gJHtub3JtYWxpemVkUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgdGVtcGxhdGVzXG4gICAqIFNFQ1VSSVRZIEZJWDogVXNlcyBQb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cygpIHdoaWNoIGZpbHRlcnMgdGVzdCBlbGVtZW50c1xuICAgKi9cbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFRlbXBsYXRlW10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIFBvcnRmb2xpb01hbmFnZXIgdG8gZ2V0IGZpbHRlcmVkIGxpc3QgKGV4Y2x1ZGVzIHRlc3QgZWxlbWVudHMpXG4gICAgICBjb25zdCB0ZW1wbGF0ZUZpbGVzID0gYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmxpc3RFbGVtZW50cyhFbGVtZW50VHlwZS5URU1QTEFURSk7XG4gICAgICBcbiAgICAgIC8vIExvYWQgdGVtcGxhdGVzIGluIHBhcmFsbGVsIHdpdGggZXJyb3IgaGFuZGxpbmdcbiAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0ZW1wbGF0ZUZpbGVzLm1hcChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZChmaWxlKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbG9hZCB0ZW1wbGF0ZSAke2ZpbGV9OiAke2Vycm9yfWApO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgLy8gRmlsdGVyIG91dCBmYWlsZWQgbG9hZHNcbiAgICAgIHJldHVybiB0ZW1wbGF0ZXMuZmlsdGVyKCh0KTogdCBpcyBUZW1wbGF0ZSA9PiB0ICE9PSBudWxsKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIG1pc3NpbmcgZGlyZWN0b3J5IGdyYWNlZnVsbHkgd2l0aCB0eXBlLXNhZmUgY2hlY2tcbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdjb2RlJyBpbiBlcnJvciAmJiBlcnJvci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1RlbXBsYXRlcyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgeWV0LCByZXR1cm5pbmcgZW1wdHkgYXJyYXknKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gbGlzdCB0ZW1wbGF0ZXM6ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSB0ZW1wbGF0ZSBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmQocHJlZGljYXRlOiAodGVtcGxhdGU6IFRlbXBsYXRlKSA9PiBib29sZWFuKTogUHJvbWlzZTxUZW1wbGF0ZSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiB0ZW1wbGF0ZXMuZmluZChwcmVkaWNhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB0ZW1wbGF0ZVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKGRhdGE6IHtuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55fSk6IFByb21pc2U8VGVtcGxhdGU+IHtcbiAgICAvLyBTRUNVUklUWSBGSVggIzQ6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhbGwgaW5wdXRzXG4gICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQoZGF0YS5uYW1lIHx8ICduZXctdGVtcGxhdGUnLCAxMDApO1xuICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChkYXRhLmRlc2NyaXB0aW9uIHx8ICcnLCA1MDApO1xuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSBzYW5pdGl6ZUlucHV0KGRhdGEuY29udGVudCB8fCAnJywgMTAwMDAwKTsgLy8gMTAwS0IgbWF4XG4gICAgXG4gICAgLy8gQ3JlYXRlIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZVxuICAgIGNvbnN0IHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlKHtcbiAgICAgIC4uLmRhdGEubWV0YWRhdGEsXG4gICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uXG4gICAgfSwgc2FuaXRpemVkQ29udGVudCk7XG4gICAgXG4gICAgLy8gR2VuZXJhdGUgZmlsZW5hbWUgZnJvbSB0ZW1wbGF0ZSBuYW1lXG4gICAgY29uc3QgZmlsZW5hbWUgPSBgJHtzYW5pdGl6ZWROYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpfS5tZGA7XG4gICAgXG4gICAgLy8gU2F2ZSB0aGUgdGVtcGxhdGVcbiAgICBhd2FpdCB0aGlzLnNhdmUodGVtcGxhdGUsIGZpbGVuYW1lKTtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVggIzU6IEF1ZGl0IHN1Y2Nlc3NmdWwgY3JlYXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnRUxFTUVOVF9DUkVBVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ1RlbXBsYXRlTWFuYWdlci5jcmVhdGUnLFxuICAgICAgZGV0YWlsczogYFRlbXBsYXRlIGNyZWF0ZWQ6ICR7dGVtcGxhdGUubWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIHRlbXBsYXRlXG4gICAqIFNFQ1VSSVRZIEZJWCAjNjogUGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGVsZXRpb24gb3V0c2lkZSBkaXJlY3RvcnlcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYICM0ICYgIzY6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSB0aGUgZmlsZSBwYXRoXG4gICAgY29uc3Qgc2FuaXRpemVkUGF0aCA9IHNhbml0aXplSW5wdXQoZmlsZVBhdGgsIDI1NSk7XG4gICAgXG4gICAgLy8gRW5zdXJlIHRoZSBwYXRoIGlzIHdpdGhpbiB0aGUgdGVtcGxhdGVzIGRpcmVjdG9yeVxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpIFxuICAgICAgPyBzYW5pdGl6ZWRQYXRoIFxuICAgICAgOiBwYXRoLmpvaW4odGhpcy50ZW1wbGF0ZXNEaXIsIHNhbml0aXplZFBhdGgpO1xuICAgIFxuICAgIC8vIFNFQ1VSSVRZIEZJWCAjNjogUHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzXG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmdWxsUGF0aCk7XG4gICAgaWYgKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKHRoaXMudGVtcGxhdGVzRGlyKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICBzb3VyY2U6ICdUZW1wbGF0ZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgICAgZGV0YWlsczogYEF0dGVtcHRlZCB0byBkZWxldGUgZmlsZSBvdXRzaWRlIHRlbXBsYXRlcyBkaXJlY3Rvcnk6ICR7c2FuaXRpemVkUGF0aH1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy51bmxpbmsobm9ybWFsaXplZFBhdGgpO1xuICAgICAgdGhpcy50ZW1wbGF0ZXMuZGVsZXRlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYICM1OiBMb2cgZGVsZXRpb24gZm9yIGF1ZGl0IHRyYWlsXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdURU1QTEFURV9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdUZW1wbGF0ZU1hbmFnZXIuZGVsZXRlJyxcbiAgICAgICAgZGV0YWlsczogYFRlbXBsYXRlIGRlbGV0ZWQ6ICR7cGF0aC5iYXNlbmFtZShub3JtYWxpemVkUGF0aCl9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5pbmZvKGBUZW1wbGF0ZSBkZWxldGVkOiAke3BhdGguYmFzZW5hbWUobm9ybWFsaXplZFBhdGgpfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgdGVtcGxhdGUgJHtub3JtYWxpemVkUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgdGVtcGxhdGUgZnJvbSBleHRlcm5hbCBmb3JtYXRcbiAgICogU0VDVVJJVFkgRklYICMzOiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIgZm9yIHNhZmUgWUFNTCBwYXJzaW5nXG4gICAqL1xuICBhc3luYyBpbXBvcnRFbGVtZW50KGRhdGE6IHN0cmluZywgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nKTogUHJvbWlzZTxUZW1wbGF0ZT4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgbWV0YWRhdGE6IFBhcnRpYWw8VGVtcGxhdGVNZXRhZGF0YT47XG4gICAgICBsZXQgY29udGVudDogc3RyaW5nID0gJyc7XG4gICAgICBcbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgIGNvbnN0IGpzb25EYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICBtZXRhZGF0YSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRhZGF0YShqc29uRGF0YS5tZXRhZGF0YSB8fCB7fSk7XG4gICAgICAgICAgY29udGVudCA9IGpzb25EYXRhLmNvbnRlbnQgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ3lhbWwnOlxuICAgICAgICAgIC8vIEhJR0ggU0VWRVJJVFkgRklYOiBVc2UgU2VjdXJlWWFtbFBhcnNlciB0byBwcmV2ZW50IFlBTUwgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgICAgICAvLyBQcmV2aW91c2x5OiBVc2VkIHVuc2FmZSBZQU1MIHBhcnNpbmcgd2l0aG91dCB2YWxpZGF0aW9uXG4gICAgICAgICAgLy8gTm93OiBVc2VzIFNlY3VyZVlhbWxQYXJzZXIgd2hpY2ggdmFsaWRhdGVzIGNvbnRlbnQgYW5kIHByZXZlbnRzIG1hbGljaW91cyBwYXR0ZXJuc1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoZGF0YSwge1xuICAgICAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCwgLy8gNjRLQiBsaW1pdFxuICAgICAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnZhbGlkYXRlTWV0YWRhdGEoKHBhcnNlZCBhcyBhbnkpLm1ldGFkYXRhIHx8IHt9KTtcbiAgICAgICAgICBjb250ZW50ID0gcGFyc2VkLmNvbnRlbnQgfHwgJyc7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBhdWRpdCB0cmFpbFxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdZQU1MX1BBUlNFX1NVQ0NFU1MnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnVGVtcGxhdGVNYW5hZ2VyLmltcG9ydEVsZW1lbnQnLFxuICAgICAgICAgICAgZGV0YWlsczogJ1lBTUwgY29udGVudCBzYWZlbHkgcGFyc2VkIGR1cmluZyBpbXBvcnQnXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ21hcmtkb3duJzpcbiAgICAgICAgICBjb25zdCBtZFBhcnNlZCA9IG1hdHRlcihkYXRhKTtcbiAgICAgICAgICBtZXRhZGF0YSA9IGF3YWl0IHRoaXMudmFsaWRhdGVNZXRhZGF0YShtZFBhcnNlZC5kYXRhKTtcbiAgICAgICAgICBjb250ZW50ID0gbWRQYXJzZWQuY29udGVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGltcG9ydCBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDcmVhdGUgYW5kIHZhbGlkYXRlIHRoZSB0ZW1wbGF0ZVxuICAgICAgY29uc3QgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUobWV0YWRhdGEsIGNvbnRlbnQpO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHRlbXBsYXRlLnZhbGlkYXRlKCk7XG4gICAgICBcbiAgICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGU6ICR7dmFsaWRhdGlvbi5lcnJvcnM/Lm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBpbXBvcnQgdGVtcGxhdGU6ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGEgdGVtcGxhdGUgdG8gZXh0ZXJuYWwgZm9ybWF0XG4gICAqIFNFQ1VSSVRZIEZJWCAjMzogVXNlcyBzYWZlIFlBTUwgc2VyaWFsaXphdGlvblxuICAgKi9cbiAgYXN5bmMgZXhwb3J0RWxlbWVudCh0ZW1wbGF0ZTogVGVtcGxhdGUsIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdHJ5IHtcbiAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgIC8vIFVzZSBzZXJpYWxpemVUb0pTT04gZm9yIEpTT04gZm9ybWF0LCBvciBzZXJpYWxpemUgaWYgbm90IGF2YWlsYWJsZVxuICAgICAgICAgIHJldHVybiAodGVtcGxhdGUgYXMgYW55KS5zZXJpYWxpemVUb0pTT04gPyAodGVtcGxhdGUgYXMgYW55KS5zZXJpYWxpemVUb0pTT04oKSA6IHRlbXBsYXRlLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlICd5YW1sJzpcbiAgICAgICAgICAvLyBTRUNVUklUWSBGSVg6IFVzZSB5YW1sLmR1bXAgd2l0aCBGQUlMU0FGRV9TQ0hFTUEgdG8gcHJldmVudCBjb2RlIGV4ZWN1dGlvblxuICAgICAgICAgIC8vIFByZXZpb3VzbHk6IENvdWxkIHBvdGVudGlhbGx5IHVzZSB1bnNhZmUgWUFNTCBmZWF0dXJlc1xuICAgICAgICAgIC8vIE5vdzogRkFJTFNBRkVfU0NIRU1BIG9ubHkgYWxsb3dzIGJhc2ljIFlBTUwgdHlwZXMsIG5vIEpTLXNwZWNpZmljIGNvbnN0cnVjdHNcbiAgICAgICAgICBjb25zdCB5YW1sRGF0YSA9IHtcbiAgICAgICAgICAgIG1ldGFkYXRhOiB0ZW1wbGF0ZS5tZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRlbXBsYXRlLmNvbnRlbnQsXG4gICAgICAgICAgICBpZDogdGVtcGxhdGUuaWQsXG4gICAgICAgICAgICB2ZXJzaW9uOiB0ZW1wbGF0ZS52ZXJzaW9uXG4gICAgICAgICAgfTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4geWFtbC5kdW1wKHlhbWxEYXRhLCB7XG4gICAgICAgICAgICAvLyBTRUNVUklUWSBUUkFERS1PRkY6IFVzaW5nIERFRkFVTFRfU0NIRU1BIGluc3RlYWQgb2YgRkFJTFNBRkVfU0NIRU1BXG4gICAgICAgICAgICAvLyBSZWFzb246IEZBSUxTQUZFX1NDSEVNQSBkb2Vzbid0IHN1cHBvcnQgbnVtYmVyIHR5cGVzIHdoaWNoIGFyZSBuZWVkZWQgZm9yIHRlbXBsYXRlIG1ldGFkYXRhXG4gICAgICAgICAgICAvLyBSaXNrOiBERUZBVUxUX1NDSEVNQSBhbGxvd3MgbW9yZSBZQU1MIGZlYXR1cmVzIHRoYXQgY291bGQgYmUgZXhwbG9pdGVkXG4gICAgICAgICAgICAvLyBNaXRpZ2F0aW9uOiBub1JlZnMgcHJldmVudHMgcmVmZXJlbmNlIGF0dGFja3MsIHNraXBJbnZhbGlkIGRyb3BzIGRhbmdlcm91cyBjb25zdHJ1Y3RzXG4gICAgICAgICAgICAvLyBDb25zaWRlcjogRm9yIG1heGltdW0gc2VjdXJpdHksIGltcGxlbWVudCBjdXN0b20gc2NoZW1hIHRoYXQgb25seSBhbGxvd3MgbmVlZGVkIHR5cGVzXG4gICAgICAgICAgICBzY2hlbWE6IHlhbWwuREVGQVVMVF9TQ0hFTUEsXG4gICAgICAgICAgICBub1JlZnM6IHRydWUsICAgICAgICAvLyBQcmV2ZW50IHJlZmVyZW5jZSBhdHRhY2tzXG4gICAgICAgICAgICBzb3J0S2V5czogdHJ1ZSwgICAgICAvLyBDb25zaXN0ZW50IG91dHB1dFxuICAgICAgICAgICAgc2tpcEludmFsaWQ6IHRydWUsICAgLy8gU2tpcCB1bnNlcmlhbGl6YWJsZSB2YWx1ZXMgaW5zdGVhZCBvZiB0aHJvd2luZ1xuICAgICAgICAgICAgY29uZGVuc2VGbG93OiB0cnVlLCAgLy8gTW9yZSBjb21wYWN0IG91dHB1dFxuICAgICAgICAgICAgcXVvdGluZ1R5cGU6ICdcIicsICAgIC8vIEZvcmNlIGRvdWJsZSBxdW90ZXMgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgICBmb3JjZVF1b3RlczogZmFsc2UgICAvLyBPbmx5IHF1b3RlIHdoZW4gbmVjZXNzYXJ5XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgJ21hcmtkb3duJzpcbiAgICAgICAgICBjb25zdCBmcm9udG1hdHRlciA9IHRoaXMuY3JlYXRlRnJvbnRtYXR0ZXIodGVtcGxhdGUubWV0YWRhdGEpO1xuICAgICAgICAgIHJldHVybiBgLS0tXFxuJHtmcm9udG1hdHRlcn1cXG4tLS1cXG5cXG4ke3RlbXBsYXRlLmNvbnRlbnR9YDtcbiAgICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGV4cG9ydCBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBleHBvcnQgdGVtcGxhdGU6ICR7ZXJyb3J9YCk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYW5kIHNhbml0aXplIG1ldGFkYXRhXG4gICAqIFNFQ1VSSVRZIEZJWCAjNDogQ29tcHJlaGVuc2l2ZSBtZXRhZGF0YSB2YWxpZGF0aW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlTWV0YWRhdGEoZGF0YTogYW55KTogUHJvbWlzZTxQYXJ0aWFsPFRlbXBsYXRlTWV0YWRhdGE+PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFBhcnRpYWw8VGVtcGxhdGVNZXRhZGF0YT4gPSB7fTtcbiAgICBcbiAgICAvLyBTYW5pdGl6ZSBzdHJpbmcgZmllbGRzXG4gICAgaWYgKGRhdGEubmFtZSkge1xuICAgICAgbWV0YWRhdGEubmFtZSA9IHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZGF0YS5uYW1lKS5ub3JtYWxpemVkQ29udGVudCwgMTAwKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgIG1ldGFkYXRhLmRlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkYXRhLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGRhdGEuY2F0ZWdvcnkpIHtcbiAgICAgIG1ldGFkYXRhLmNhdGVnb3J5ID0gc2FuaXRpemVJbnB1dChkYXRhLmNhdGVnb3J5LCA1MCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChkYXRhLm91dHB1dF9mb3JtYXQpIHtcbiAgICAgIG1ldGFkYXRhLm91dHB1dF9mb3JtYXQgPSBzYW5pdGl6ZUlucHV0KGRhdGEub3V0cHV0X2Zvcm1hdCwgMjApO1xuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhLnRhZ3MpKSB7XG4gICAgICBtZXRhZGF0YS50YWdzID0gZGF0YS50YWdzLm1hcCgodGFnOiBhbnkpID0+IHNhbml0aXplSW5wdXQoU3RyaW5nKHRhZyksIDUwKSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEuaW5jbHVkZXMpKSB7XG4gICAgICBtZXRhZGF0YS5pbmNsdWRlcyA9IGRhdGEuaW5jbHVkZXMubWFwKChpbmM6IGFueSkgPT4gc2FuaXRpemVJbnB1dChTdHJpbmcoaW5jKSwgMjAwKSk7XG4gICAgfVxuICAgIFxuICAgIC8vIENvcHkgc2FmZSBmaWVsZHNcbiAgICBpZiAodHlwZW9mIGRhdGEudXNhZ2VfY291bnQgPT09ICdudW1iZXInKSB7XG4gICAgICBtZXRhZGF0YS51c2FnZV9jb3VudCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoZGF0YS51c2FnZV9jb3VudCkpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoZGF0YS5sYXN0X3VzZWQpIHtcbiAgICAgIG1ldGFkYXRhLmxhc3RfdXNlZCA9IHNhbml0aXplSW5wdXQoU3RyaW5nKGRhdGEubGFzdF91c2VkKSwgNTApO1xuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBjb21wbGV4IGZpZWxkc1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEudmFyaWFibGVzKSkge1xuICAgICAgbWV0YWRhdGEudmFyaWFibGVzID0gZGF0YS52YXJpYWJsZXMubWFwKCh2OiBhbnkpID0+ICh7XG4gICAgICAgIG5hbWU6IHNhbml0aXplSW5wdXQodi5uYW1lIHx8ICcnLCA1MCksXG4gICAgICAgIHR5cGU6IHNhbml0aXplSW5wdXQodi50eXBlIHx8ICdzdHJpbmcnLCAyMCksXG4gICAgICAgIGRlc2NyaXB0aW9uOiB2LmRlc2NyaXB0aW9uID8gc2FuaXRpemVJbnB1dCh2LmRlc2NyaXB0aW9uLCAyMDApIDogdW5kZWZpbmVkLFxuICAgICAgICByZXF1aXJlZDogQm9vbGVhbih2LnJlcXVpcmVkKSxcbiAgICAgICAgZGVmYXVsdDogdi5kZWZhdWx0LFxuICAgICAgICB2YWxpZGF0aW9uOiB2LnZhbGlkYXRpb24gPyBzYW5pdGl6ZUlucHV0KHYudmFsaWRhdGlvbiwgMjAwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgb3B0aW9uczogQXJyYXkuaXNBcnJheSh2Lm9wdGlvbnMpID8gdi5vcHRpb25zLm1hcCgobzogYW55KSA9PiBzYW5pdGl6ZUlucHV0KFN0cmluZyhvKSwgMTAwKSkgOiB1bmRlZmluZWQsXG4gICAgICAgIGZvcm1hdDogdi5mb3JtYXQgPyBzYW5pdGl6ZUlucHV0KHYuZm9ybWF0LCA1MCkgOiB1bmRlZmluZWRcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS5leGFtcGxlcykpIHtcbiAgICAgIG1ldGFkYXRhLmV4YW1wbGVzID0gZGF0YS5leGFtcGxlcy5tYXAoKGV4OiBhbnkpID0+ICh7XG4gICAgICAgIHRpdGxlOiBzYW5pdGl6ZUlucHV0KGV4LnRpdGxlIHx8ICcnLCAxMDApLFxuICAgICAgICBkZXNjcmlwdGlvbjogZXguZGVzY3JpcHRpb24gPyBzYW5pdGl6ZUlucHV0KGV4LmRlc2NyaXB0aW9uLCA1MDApIDogdW5kZWZpbmVkLFxuICAgICAgICB2YXJpYWJsZXM6IGV4LnZhcmlhYmxlcyB8fCB7fSxcbiAgICAgICAgb3V0cHV0OiBleC5vdXRwdXQgPyBzYW5pdGl6ZUlucHV0KGV4Lm91dHB1dCwgNTAwMCkgOiB1bmRlZmluZWRcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ29weSBzdGFuZGFyZCBlbGVtZW50IGZpZWxkc1xuICAgIG1ldGFkYXRhLmF1dGhvciA9IGRhdGEuYXV0aG9yID8gc2FuaXRpemVJbnB1dChkYXRhLmF1dGhvciwgMTAwKSA6IHVuZGVmaW5lZDtcbiAgICBtZXRhZGF0YS52ZXJzaW9uID0gZGF0YS52ZXJzaW9uID8gc2FuaXRpemVJbnB1dChkYXRhLnZlcnNpb24sIDIwKSA6IHVuZGVmaW5lZDtcbiAgICBcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFlBTUwgZnJvbnRtYXR0ZXIgZnJvbSBtZXRhZGF0YVxuICAgKiBTRUNVUklUWSBGSVggIzM6IFNhZmUgWUFNTCBnZW5lcmF0aW9uXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUZyb250bWF0dGVyKG1ldGFkYXRhOiBUZW1wbGF0ZU1ldGFkYXRhKTogc3RyaW5nIHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IFVzZSB5YW1sLmR1bXAgd2l0aCBzZWN1cml0eSBvcHRpb25zXG4gICAgLy8gRW5zdXJlcyBubyBjb2RlIGV4ZWN1dGlvbiB2dWxuZXJhYmlsaXRpZXMgaW4gZ2VuZXJhdGVkIFlBTUxcbiAgICBjb25zdCBzYWZlTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uLFxuICAgICAgYXV0aG9yOiBtZXRhZGF0YS5hdXRob3IsXG4gICAgICB2ZXJzaW9uOiBtZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgY2F0ZWdvcnk6IG1ldGFkYXRhLmNhdGVnb3J5LFxuICAgICAgb3V0cHV0X2Zvcm1hdDogbWV0YWRhdGEub3V0cHV0X2Zvcm1hdCxcbiAgICAgIHRhZ3M6IG1ldGFkYXRhLnRhZ3MsXG4gICAgICBpbmNsdWRlczogbWV0YWRhdGEuaW5jbHVkZXMsXG4gICAgICB1c2FnZV9jb3VudDogbWV0YWRhdGEudXNhZ2VfY291bnQsXG4gICAgICBsYXN0X3VzZWQ6IG1ldGFkYXRhLmxhc3RfdXNlZCxcbiAgICAgIHZhcmlhYmxlczogbWV0YWRhdGEudmFyaWFibGVzLFxuICAgICAgZXhhbXBsZXM6IG1ldGFkYXRhLmV4YW1wbGVzXG4gICAgfTtcbiAgICBcbiAgICAvLyBSZW1vdmUgdW5kZWZpbmVkIHZhbHVlc1xuICAgIGNvbnN0IGNsZWFuTWV0YWRhdGEgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhzYWZlTWV0YWRhdGEpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICApO1xuICAgIFxuICAgIHJldHVybiB5YW1sLmR1bXAoY2xlYW5NZXRhZGF0YSwge1xuICAgICAgLy8gU0VDVVJJVFkgVFJBREUtT0ZGOiBTYW1lIGFzIGV4cG9ydEVsZW1lbnQgLSB1c2luZyBERUZBVUxUX1NDSEVNQSBmb3IgdHlwZSBzdXBwb3J0XG4gICAgICAvLyBTZWUgZXhwb3J0RWxlbWVudCBtZXRob2QgZm9yIGRldGFpbGVkIHNlY3VyaXR5IGNvbnNpZGVyYXRpb25zXG4gICAgICBzY2hlbWE6IHlhbWwuREVGQVVMVF9TQ0hFTUEsXG4gICAgICBub1JlZnM6IHRydWUsXG4gICAgICBzb3J0S2V5czogdHJ1ZSxcbiAgICAgIGxpbmVXaWR0aDogODAsXG4gICAgICBza2lwSW52YWxpZDogdHJ1ZSxcbiAgICAgIGNvbmRlbnNlRmxvdzogdHJ1ZSxcbiAgICAgIHF1b3RpbmdUeXBlOiAnXCInLFxuICAgICAgZm9yY2VRdW90ZXM6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB0ZW1wbGF0ZSBmaWxlIGV4aXN0c1xuICAgKi9cbiAgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguaXNBYnNvbHV0ZShzYW5pdGl6ZWRQYXRoKSBcbiAgICAgID8gc2FuaXRpemVkUGF0aCBcbiAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZ1bGxQYXRoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIG11bHRpcGxlIHRlbXBsYXRlcyBieSBwcmVkaWNhdGVcbiAgICovXG4gIGFzeW5jIGZpbmRNYW55KHByZWRpY2F0ZTogKHRlbXBsYXRlOiBUZW1wbGF0ZSkgPT4gYm9vbGVhbik6IFByb21pc2U8VGVtcGxhdGVbXT4ge1xuICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiB0ZW1wbGF0ZXMuZmlsdGVyKHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSB0ZW1wbGF0ZVxuICAgKi9cbiAgdmFsaWRhdGUodGVtcGxhdGU6IFRlbXBsYXRlKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIHJldHVybiB0ZW1wbGF0ZS52YWxpZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgZmlsZSBwYXRoXG4gICAqL1xuICB2YWxpZGF0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWRQYXRoID0gc2FuaXRpemVJbnB1dChmaWxlUGF0aCwgMjU1KTtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5pc0Fic29sdXRlKHNhbml0aXplZFBhdGgpIFxuICAgICAgICA/IHNhbml0aXplZFBhdGggXG4gICAgICAgIDogcGF0aC5qb2luKHRoaXMudGVtcGxhdGVzRGlyLCBzYW5pdGl6ZWRQYXRoKTtcbiAgICAgIFxuICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmdWxsUGF0aCk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCh0aGlzLnRlbXBsYXRlc0Rpcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZWxlbWVudCB0eXBlXG4gICAqL1xuICBnZXRFbGVtZW50VHlwZSgpOiBFbGVtZW50VHlwZSB7XG4gICAgcmV0dXJuIEVsZW1lbnRUeXBlLlRFTVBMQVRFO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlsZSBleHRlbnNpb25cbiAgICovXG4gIGdldEZpbGVFeHRlbnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJy5tZCc7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0ZW1wbGF0ZXMgYnkgY2F0ZWdvcnlcbiAgICovXG4gIGFzeW5jIGZpbmRCeUNhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiBQcm9taXNlPFRlbXBsYXRlW10+IHtcbiAgICBjb25zdCBzYW5pdGl6ZWRDYXRlZ29yeSA9IHNhbml0aXplSW5wdXQoY2F0ZWdvcnksIDUwKTtcbiAgICByZXR1cm4gdGhpcy5saXN0KCkudGhlbih0ZW1wbGF0ZXMgPT4gXG4gICAgICB0ZW1wbGF0ZXMuZmlsdGVyKHQgPT4gdC5tZXRhZGF0YS5jYXRlZ29yeSA9PT0gc2FuaXRpemVkQ2F0ZWdvcnkpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRlbXBsYXRlcyBieSB0YWdcbiAgICovXG4gIGFzeW5jIGZpbmRCeVRhZyh0YWc6IHN0cmluZyk6IFByb21pc2U8VGVtcGxhdGVbXT4ge1xuICAgIGNvbnN0IHNhbml0aXplZFRhZyA9IHNhbml0aXplSW5wdXQodGFnLCA1MCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdCgpLnRoZW4odGVtcGxhdGVzID0+IFxuICAgICAgdGVtcGxhdGVzLmZpbHRlcih0ID0+IHQubWV0YWRhdGEudGFncz8uaW5jbHVkZXMoc2FuaXRpemVkVGFnKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtb3N0IHVzZWQgdGVtcGxhdGVzXG4gICAqL1xuICBhc3luYyBnZXRNb3N0VXNlZChsaW1pdDogbnVtYmVyID0gMTApOiBQcm9taXNlPFRlbXBsYXRlW10+IHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIGxpbWl0IHBhcmFtZXRlciB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2VcbiAgICAvLyBQcmV2aW91c2x5OiBObyB2YWxpZGF0aW9uIGNvdWxkIGFsbG93IHZlcnkgbGFyZ2UgbGltaXRzXG4gICAgLy8gTm93OiBFbmZvcmNlcyByZWFzb25hYmxlIGJvdW5kc1xuICAgIGNvbnN0IE1JTl9MSU1JVCA9IDE7XG4gICAgY29uc3QgTUFYX0xJTUlUID0gMTAwO1xuICAgIGNvbnN0IHZhbGlkYXRlZExpbWl0ID0gTWF0aC5tYXgoTUlOX0xJTUlULCBNYXRoLm1pbihNQVhfTElNSVQsIE1hdGguZmxvb3IobGltaXQpKSk7XG4gICAgXG4gICAgaWYgKGxpbWl0ICE9PSB2YWxpZGF0ZWRMaW1pdCkge1xuICAgICAgbG9nZ2VyLndhcm4oYGdldE1vc3RVc2VkOiBsaW1pdCAke2xpbWl0fSBhZGp1c3RlZCB0byAke3ZhbGlkYXRlZExpbWl0fSAodmFsaWQgcmFuZ2U6ICR7TUlOX0xJTUlUfS0ke01BWF9MSU1JVH0pYCk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiB0ZW1wbGF0ZXNcbiAgICAgIC5zb3J0KChhLCBiKSA9PiAoYi5tZXRhZGF0YS51c2FnZV9jb3VudCB8fCAwKSAtIChhLm1ldGFkYXRhLnVzYWdlX2NvdW50IHx8IDApKVxuICAgICAgLnNsaWNlKDAsIHZhbGlkYXRlZExpbWl0KTtcbiAgfVxufSJdfQ==
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export declare const PACKAGE_VERSION = "1.5.2";
6
- export declare const BUILD_TIMESTAMP = "2025-08-06T20:36:22.499Z";
5
+ export declare const PACKAGE_VERSION = "1.6.0";
6
+ export declare const BUILD_TIMESTAMP = "2025-08-25T17:29:38.593Z";
7
7
  export declare const BUILD_TYPE: 'npm' | 'git';
8
8
  export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
9
9
  //# sourceMappingURL=version.d.ts.map
@@ -2,8 +2,8 @@
2
2
  * Auto-generated file - DO NOT EDIT
3
3
  * Generated at build time by scripts/generate-version.js
4
4
  */
5
- export const PACKAGE_VERSION = '1.5.2';
6
- export const BUILD_TIMESTAMP = '2025-08-06T20:36:22.499Z';
5
+ export const PACKAGE_VERSION = '1.6.0';
6
+ export const BUILD_TIMESTAMP = '2025-08-25T17:29:38.593Z';
7
7
  export const BUILD_TYPE = 'npm';
8
8
  export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcxLjUuMic7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjUtMDgtMDZUMjA6MzY6MjIuNDk5Wic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcxLjYuMCc7XG5leHBvcnQgY29uc3QgQlVJTERfVElNRVNUQU1QID0gJzIwMjUtMDgtMjVUMTc6Mjk6MzguNTkzWic7XG5leHBvcnQgY29uc3QgQlVJTERfVFlQRTogJ25wbScgfCAnZ2l0JyA9ICducG0nO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9ICdAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXInO1xuIl19
@@ -2,7 +2,7 @@
2
2
  * Central barrel file for easier imports
3
3
  *
4
4
  * Usage:
5
- * import { PersonaManager, GitHubClient, UpdateManager } from '@/index.barrel';
5
+ * import { PersonaManager, GitHubClient } from '@/index.barrel';
6
6
  */
7
7
  export * from './types/index.js';
8
8
  export * from './config/constants.js';
@@ -15,7 +15,6 @@ export * from './utils/version.js';
15
15
  export * from './cache/APICache.js';
16
16
  export * from './persona/index.js';
17
17
  export * from './collection/index.js';
18
- export * from './update/index.js';
19
18
  export * from './server/index.js';
20
19
  export { DollhouseMCPServer } from './index.js';
21
20
  //# sourceMappingURL=index.barrel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.barrel.d.ts","sourceRoot":"","sources":["../src/index.barrel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAG7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAG7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,uBAAuB,CAAC;AAGtC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.barrel.d.ts","sourceRoot":"","sources":["../src/index.barrel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAG7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAG7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AAGnC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,uBAAuB,CAAC;AAItC,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * Central barrel file for easier imports
3
3
  *
4
4
  * Usage:
5
- * import { PersonaManager, GitHubClient, UpdateManager } from '@/index.barrel';
5
+ * import { PersonaManager, GitHubClient } from '@/index.barrel';
6
6
  */
7
7
  // Types
8
8
  export * from './types/index.js';
@@ -22,10 +22,8 @@ export * from './cache/APICache.js';
22
22
  export * from './persona/index.js';
23
23
  // Collection
24
24
  export * from './collection/index.js';
25
- // Update
26
- export * from './update/index.js';
27
25
  // Server
28
26
  export * from './server/index.js';
29
27
  // Main server
30
28
  export { DollhouseMCPServer } from './index.js';
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguYmFycmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LmJhcnJlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILFFBQVE7QUFDUixjQUFjLGtCQUFrQixDQUFDO0FBRWpDLFNBQVM7QUFDVCxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsOEJBQThCLENBQUM7QUFFN0MsV0FBVztBQUNYLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxRQUFRO0FBQ1IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsb0JBQW9CLENBQUM7QUFFbkMsUUFBUTtBQUNSLGNBQWMscUJBQXFCLENBQUM7QUFFcEMsVUFBVTtBQUNWLGNBQWMsb0JBQW9CLENBQUM7QUFFbkMsYUFBYTtBQUNiLGNBQWMsdUJBQXVCLENBQUM7QUFFdEMsU0FBUztBQUNULGNBQWMsbUJBQW1CLENBQUM7QUFFbEMsU0FBUztBQUNULGNBQWMsbUJBQW1CLENBQUM7QUFFbEMsY0FBYztBQUNkLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2VudHJhbCBiYXJyZWwgZmlsZSBmb3IgZWFzaWVyIGltcG9ydHNcbiAqIFxuICogVXNhZ2U6XG4gKiBpbXBvcnQgeyBQZXJzb25hTWFuYWdlciwgR2l0SHViQ2xpZW50LCBVcGRhdGVNYW5hZ2VyIH0gZnJvbSAnQC9pbmRleC5iYXJyZWwnO1xuICovXG5cbi8vIFR5cGVzXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL2luZGV4LmpzJztcblxuLy8gQ29uZmlnXG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9jb25zdGFudHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25maWcvaW5kaWNhdG9yLWNvbmZpZy5qcyc7XG5cbi8vIFNlY3VyaXR5XG5leHBvcnQgKiBmcm9tICcuL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcblxuLy8gVXRpbHNcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvZmlsZXN5c3RlbS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL2dpdC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vLyBDYWNoZVxuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS9BUElDYWNoZS5qcyc7XG5cbi8vIFBlcnNvbmFcbmV4cG9ydCAqIGZyb20gJy4vcGVyc29uYS9pbmRleC5qcyc7XG5cbi8vIENvbGxlY3Rpb25cbmV4cG9ydCAqIGZyb20gJy4vY29sbGVjdGlvbi9pbmRleC5qcyc7XG5cbi8vIFVwZGF0ZVxuZXhwb3J0ICogZnJvbSAnLi91cGRhdGUvaW5kZXguanMnO1xuXG4vLyBTZXJ2ZXJcbmV4cG9ydCAqIGZyb20gJy4vc2VydmVyL2luZGV4LmpzJztcblxuLy8gTWFpbiBzZXJ2ZXJcbmV4cG9ydCB7IERvbGxob3VzZU1DUFNlcnZlciB9IGZyb20gJy4vaW5kZXguanMnOyJdfQ==
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguYmFycmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LmJhcnJlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILFFBQVE7QUFDUixjQUFjLGtCQUFrQixDQUFDO0FBRWpDLFNBQVM7QUFDVCxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsOEJBQThCLENBQUM7QUFFN0MsV0FBVztBQUNYLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw4QkFBOEIsQ0FBQztBQUU3QyxRQUFRO0FBQ1IsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsb0JBQW9CLENBQUM7QUFFbkMsUUFBUTtBQUNSLGNBQWMscUJBQXFCLENBQUM7QUFFcEMsVUFBVTtBQUNWLGNBQWMsb0JBQW9CLENBQUM7QUFFbkMsYUFBYTtBQUNiLGNBQWMsdUJBQXVCLENBQUM7QUFHdEMsU0FBUztBQUNULGNBQWMsbUJBQW1CLENBQUM7QUFFbEMsY0FBYztBQUNkLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2VudHJhbCBiYXJyZWwgZmlsZSBmb3IgZWFzaWVyIGltcG9ydHNcbiAqIFxuICogVXNhZ2U6XG4gKiBpbXBvcnQgeyBQZXJzb25hTWFuYWdlciwgR2l0SHViQ2xpZW50IH0gZnJvbSAnQC9pbmRleC5iYXJyZWwnO1xuICovXG5cbi8vIFR5cGVzXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL2luZGV4LmpzJztcblxuLy8gQ29uZmlnXG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy9jb25zdGFudHMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25maWcvaW5kaWNhdG9yLWNvbmZpZy5qcyc7XG5cbi8vIFNlY3VyaXR5XG5leHBvcnQgKiBmcm9tICcuL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcblxuLy8gVXRpbHNcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvZmlsZXN5c3RlbS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL2dpdC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vLyBDYWNoZVxuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS9BUElDYWNoZS5qcyc7XG5cbi8vIFBlcnNvbmFcbmV4cG9ydCAqIGZyb20gJy4vcGVyc29uYS9pbmRleC5qcyc7XG5cbi8vIENvbGxlY3Rpb25cbmV4cG9ydCAqIGZyb20gJy4vY29sbGVjdGlvbi9pbmRleC5qcyc7XG5cblxuLy8gU2VydmVyXG5leHBvcnQgKiBmcm9tICcuL3NlcnZlci9pbmRleC5qcyc7XG5cbi8vIE1haW4gc2VydmVyXG5leHBvcnQgeyBEb2xsaG91c2VNQ1BTZXJ2ZXIgfSBmcm9tICcuL2luZGV4LmpzJzsiXX0=
package/dist/index.d.ts CHANGED
@@ -3,22 +3,24 @@ import { type IndicatorConfig } from './config/indicator-config.js';
3
3
  import { IToolHandler } from './server/index.js';
4
4
  export declare class DollhouseMCPServer implements IToolHandler {
5
5
  private server;
6
- private personasDir;
6
+ personasDir: string | null;
7
7
  private personas;
8
8
  private activePersona;
9
9
  private currentUser;
10
+ private isInitialized;
11
+ private initializationPromise;
10
12
  private apiCache;
11
13
  private collectionCache;
12
14
  private rateLimitTracker;
13
15
  private indicatorConfig;
14
16
  private githubClient;
15
17
  private githubAuthManager;
18
+ private collectionIndexManager;
16
19
  private collectionBrowser;
17
20
  private collectionSearch;
18
21
  private personaDetails;
19
22
  private elementInstaller;
20
23
  private personaSubmitter;
21
- private updateManager?;
22
24
  private serverSetup;
23
25
  private personaExporter;
24
26
  private personaImporter?;
@@ -30,6 +32,17 @@ export declare class DollhouseMCPServer implements IToolHandler {
30
32
  private agentManager;
31
33
  constructor();
32
34
  private initializePortfolio;
35
+ /**
36
+ * Complete initialization after portfolio is ready
37
+ * FIX #610: This was previously in a .then() callback in the constructor
38
+ * Now called synchronously from run() to prevent race condition
39
+ */
40
+ private completeInitialization;
41
+ /**
42
+ * Ensure server is initialized before any operation
43
+ * FIX #610: Added for test compatibility - tests don't call run()
44
+ */
45
+ private ensureInitialized;
33
46
  /**
34
47
  * Initialize collection cache with seed data for anonymous browsing
35
48
  */
@@ -185,6 +198,12 @@ export declare class DollhouseMCPServer implements IToolHandler {
185
198
  text: string;
186
199
  }[];
187
200
  }>;
201
+ searchCollectionEnhanced(query: string, options?: any): Promise<{
202
+ content: {
203
+ type: string;
204
+ text: string;
205
+ }[];
206
+ }>;
188
207
  getCollectionContent(path: string): Promise<{
189
208
  content: {
190
209
  type: string;
@@ -240,16 +259,25 @@ export declare class DollhouseMCPServer implements IToolHandler {
240
259
  text: string;
241
260
  }[];
242
261
  }>;
262
+ getOAuthHelperStatus(verbose?: boolean): Promise<{
263
+ content: {
264
+ type: string;
265
+ text: string;
266
+ }[];
267
+ }>;
268
+ private checkOAuthHelperHealth;
243
269
  clearGitHubAuth(): Promise<{
244
270
  content: {
245
271
  type: string;
246
272
  text: string;
247
273
  }[];
248
274
  }>;
249
- /**
250
- * Poll for auth completion in the background
251
- */
252
- private pollForAuthCompletion;
275
+ configureOAuth(client_id?: string): Promise<{
276
+ content: {
277
+ type: string;
278
+ text: string;
279
+ }[];
280
+ }>;
253
281
  createPersona(name: string, description: string, instructions: string, triggers?: string): Promise<{
254
282
  content: {
255
283
  type: string;
@@ -268,99 +296,189 @@ export declare class DollhouseMCPServer implements IToolHandler {
268
296
  text: string;
269
297
  }[];
270
298
  }>;
271
- checkForUpdates(): Promise<{
299
+ /**
300
+ * Configure indicator settings
301
+ */
302
+ configureIndicator(config: Partial<IndicatorConfig>): Promise<{
272
303
  content: {
273
304
  type: string;
274
305
  text: string;
275
306
  }[];
276
307
  }>;
277
- updateServer(confirm: boolean): Promise<{
308
+ /**
309
+ * Get current indicator configuration
310
+ */
311
+ configureCollectionSubmission(autoSubmit: boolean): Promise<{
278
312
  content: {
279
313
  type: string;
280
314
  text: string;
281
315
  }[];
282
316
  }>;
283
- rollbackUpdate(confirm: boolean): Promise<{
317
+ getCollectionSubmissionConfig(): Promise<{
284
318
  content: {
285
319
  type: string;
286
320
  text: string;
287
321
  }[];
288
322
  }>;
289
- getServerStatus(): Promise<{
323
+ getIndicatorConfig(): Promise<{
290
324
  content: {
291
325
  type: string;
292
326
  text: string;
293
327
  }[];
294
328
  }>;
295
- convertToGitInstallation(targetDir?: string, confirm?: boolean): Promise<{
329
+ /**
330
+ * Export a single persona
331
+ */
332
+ exportPersona(personaName: string): Promise<{
296
333
  content: {
297
334
  type: string;
298
335
  text: string;
299
336
  }[];
300
337
  }>;
301
338
  /**
302
- * Configure indicator settings
339
+ * Export all personas
303
340
  */
304
- configureIndicator(config: Partial<IndicatorConfig>): Promise<{
341
+ exportAllPersonas(includeDefaults?: boolean): Promise<{
305
342
  content: {
306
343
  type: string;
307
344
  text: string;
308
345
  }[];
309
346
  }>;
310
347
  /**
311
- * Get current indicator configuration
348
+ * Import a persona
312
349
  */
313
- getIndicatorConfig(): Promise<{
350
+ importPersona(source: string, overwrite?: boolean): Promise<{
314
351
  content: {
315
352
  type: string;
316
353
  text: string;
317
354
  }[];
318
355
  }>;
319
356
  /**
320
- * Export a single persona
357
+ * Share a persona via URL
321
358
  */
322
- exportPersona(personaName: string): Promise<{
359
+ sharePersona(personaName: string, expiryDays?: number): Promise<{
323
360
  content: {
324
361
  type: string;
325
362
  text: string;
326
363
  }[];
327
364
  }>;
328
365
  /**
329
- * Export all personas
366
+ * Import from a shared URL
330
367
  */
331
- exportAllPersonas(includeDefaults?: boolean): Promise<{
368
+ importFromUrl(url: string, overwrite?: boolean): Promise<{
332
369
  content: {
333
370
  type: string;
334
371
  text: string;
335
372
  }[];
336
373
  }>;
337
374
  /**
338
- * Import a persona
375
+ * Portfolio management methods
339
376
  */
340
- importPersona(source: string, overwrite?: boolean): Promise<{
377
+ /**
378
+ * Check portfolio status including repository existence and sync information
379
+ */
380
+ portfolioStatus(username?: string): Promise<{
341
381
  content: {
342
382
  type: string;
343
383
  text: string;
344
384
  }[];
345
385
  }>;
346
386
  /**
347
- * Share a persona via URL
387
+ * Initialize a new GitHub portfolio repository
348
388
  */
349
- sharePersona(personaName: string, expiryDays?: number): Promise<{
389
+ initPortfolio(options: {
390
+ repositoryName?: string;
391
+ private?: boolean;
392
+ description?: string;
393
+ }): Promise<{
350
394
  content: {
351
395
  type: string;
352
396
  text: string;
353
397
  }[];
354
398
  }>;
355
399
  /**
356
- * Import from a shared URL
400
+ * Configure portfolio settings
357
401
  */
358
- importFromUrl(url: string, overwrite?: boolean): Promise<{
402
+ portfolioConfig(options: {
403
+ autoSync?: boolean;
404
+ defaultVisibility?: string;
405
+ autoSubmit?: boolean;
406
+ repositoryName?: string;
407
+ }): Promise<{
408
+ content: {
409
+ type: string;
410
+ text: string;
411
+ }[];
412
+ }>;
413
+ /**
414
+ * Sync portfolio with GitHub
415
+ */
416
+ syncPortfolio(options: {
417
+ direction: string;
418
+ force: boolean;
419
+ dryRun: boolean;
420
+ }): Promise<{
421
+ content: {
422
+ type: string;
423
+ text: string;
424
+ }[];
425
+ }>;
426
+ /**
427
+ * Search local portfolio using the metadata index system
428
+ * This provides fast, comprehensive search across all element types
429
+ */
430
+ searchPortfolio(options: {
431
+ query: string;
432
+ elementType?: string;
433
+ fuzzyMatch?: boolean;
434
+ maxResults?: number;
435
+ includeKeywords?: boolean;
436
+ includeTags?: boolean;
437
+ includeTriggers?: boolean;
438
+ includeDescriptions?: boolean;
439
+ }): Promise<{
359
440
  content: {
360
441
  type: string;
361
442
  text: string;
362
443
  }[];
363
444
  }>;
445
+ /**
446
+ * Search across all sources (local, GitHub, collection) using UnifiedIndexManager
447
+ * This provides comprehensive search with duplicate detection and version comparison
448
+ */
449
+ searchAll(options: {
450
+ query: string;
451
+ sources?: string[];
452
+ elementType?: string;
453
+ page?: number;
454
+ pageSize?: number;
455
+ sortBy?: string;
456
+ }): Promise<{
457
+ content: {
458
+ type: string;
459
+ text: string;
460
+ }[];
461
+ }>;
462
+ /**
463
+ * Get icon for source type
464
+ */
465
+ private getSourceIcon;
466
+ /**
467
+ * Get icon for element type
468
+ */
469
+ private getElementIcon;
470
+ /**
471
+ * Helper method to count elements in a directory
472
+ */
473
+ private countElementsInDir;
474
+ /**
475
+ * Helper method to get list of elements by type
476
+ */
477
+ private getElementsList;
478
+ /**
479
+ * Helper method to load element by type
480
+ */
481
+ private loadElementByType;
364
482
  run(): Promise<void>;
365
483
  }
366
484
  //# sourceMappingURL=index.d.ts.map