@dollhousemcp/mcp-server 1.3.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 (1004) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/LICENSE +51 -0
  3. package/README.md +1124 -0
  4. package/data/agents/code-reviewer.md +296 -0
  5. package/data/agents/research-assistant.md +259 -0
  6. package/data/agents/task-manager.md +206 -0
  7. package/data/ensembles/business-advisor.md +354 -0
  8. package/data/ensembles/creative-studio.md +288 -0
  9. package/data/ensembles/development-team.md +292 -0
  10. package/data/ensembles/security-analysis-team.md +438 -0
  11. package/data/memories/conversation-history.md +146 -0
  12. package/data/memories/learning-progress.md +376 -0
  13. package/data/memories/project-context.md +268 -0
  14. package/data/personas/business-consultant.md +50 -0
  15. package/data/personas/creative-writer.md +44 -0
  16. package/data/personas/debug-detective.md +59 -0
  17. package/data/personas/eli5-explainer.md +49 -0
  18. package/data/personas/security-analyst.md +161 -0
  19. package/data/personas/technical-analyst.md +43 -0
  20. package/data/skills/code-review.md +112 -0
  21. package/data/skills/creative-writing.md +174 -0
  22. package/data/skills/data-analysis.md +160 -0
  23. package/data/skills/penetration-testing.md +374 -0
  24. package/data/skills/research.md +181 -0
  25. package/data/skills/threat-modeling.md +469 -0
  26. package/data/skills/translation.md +148 -0
  27. package/data/templates/code-documentation.md +409 -0
  28. package/data/templates/email-professional.md +158 -0
  29. package/data/templates/meeting-notes.md +141 -0
  30. package/data/templates/penetration-test-report.md +608 -0
  31. package/data/templates/project-brief.md +234 -0
  32. package/data/templates/report-executive.md +258 -0
  33. package/data/templates/security-vulnerability-report.md +457 -0
  34. package/data/templates/threat-assessment-report.md +774 -0
  35. package/dist/cache/APICache.d.ts +23 -0
  36. package/dist/cache/APICache.d.ts.map +1 -0
  37. package/dist/cache/APICache.js +42 -0
  38. package/dist/cache/index.d.ts +5 -0
  39. package/dist/cache/index.d.ts.map +1 -0
  40. package/dist/cache/index.js +5 -0
  41. package/dist/collection/CollectionBrowser.d.ts +24 -0
  42. package/dist/collection/CollectionBrowser.d.ts.map +1 -0
  43. package/dist/collection/CollectionBrowser.js +120 -0
  44. package/dist/collection/CollectionSearch.d.ts +18 -0
  45. package/dist/collection/CollectionSearch.d.ts.map +1 -0
  46. package/dist/collection/CollectionSearch.js +48 -0
  47. package/dist/collection/ElementInstaller.d.ts +33 -0
  48. package/dist/collection/ElementInstaller.d.ts.map +1 -0
  49. package/dist/collection/ElementInstaller.js +142 -0
  50. package/dist/collection/GitHubClient.d.ts +22 -0
  51. package/dist/collection/GitHubClient.d.ts.map +1 -0
  52. package/dist/collection/GitHubClient.js +114 -0
  53. package/dist/collection/MarketplaceBrowser.d.ts +24 -0
  54. package/dist/collection/MarketplaceBrowser.d.ts.map +1 -0
  55. package/dist/collection/MarketplaceBrowser.js +115 -0
  56. package/dist/collection/MarketplaceSearch.d.ts +18 -0
  57. package/dist/collection/MarketplaceSearch.d.ts.map +1 -0
  58. package/dist/collection/MarketplaceSearch.js +48 -0
  59. package/dist/collection/PersonaDetails.d.ts +22 -0
  60. package/dist/collection/PersonaDetails.d.ts.map +1 -0
  61. package/dist/collection/PersonaDetails.js +71 -0
  62. package/dist/collection/PersonaInstaller.d.ts +26 -0
  63. package/dist/collection/PersonaInstaller.d.ts.map +1 -0
  64. package/dist/collection/PersonaInstaller.js +103 -0
  65. package/dist/collection/PersonaSubmitter.d.ts +19 -0
  66. package/dist/collection/PersonaSubmitter.d.ts.map +1 -0
  67. package/dist/collection/PersonaSubmitter.js +57 -0
  68. package/dist/collection/index.d.ts +10 -0
  69. package/dist/collection/index.d.ts.map +1 -0
  70. package/dist/collection/index.js +10 -0
  71. package/dist/config/constants.d.ts +25 -0
  72. package/dist/config/constants.d.ts.map +1 -0
  73. package/dist/config/constants.js +34 -0
  74. package/dist/config/index.d.ts +6 -0
  75. package/dist/config/index.d.ts.map +1 -0
  76. package/dist/config/index.js +6 -0
  77. package/dist/config/indicator-config.d.ts +107 -0
  78. package/dist/config/indicator-config.d.ts.map +1 -0
  79. package/dist/config/indicator-config.js +158 -0
  80. package/dist/constants/defaultPersonas.d.ts +10 -0
  81. package/dist/constants/defaultPersonas.d.ts.map +1 -0
  82. package/dist/constants/defaultPersonas.js +18 -0
  83. package/dist/constants/limits.d.ts +10 -0
  84. package/dist/constants/limits.d.ts.map +1 -0
  85. package/dist/constants/limits.js +13 -0
  86. package/dist/elements/BaseElement.d.ts +81 -0
  87. package/dist/elements/BaseElement.d.ts.map +1 -0
  88. package/dist/elements/BaseElement.js +381 -0
  89. package/dist/elements/FeedbackProcessor.d.ts +57 -0
  90. package/dist/elements/FeedbackProcessor.d.ts.map +1 -0
  91. package/dist/elements/FeedbackProcessor.js +418 -0
  92. package/dist/elements/agents/Agent.d.ts +145 -0
  93. package/dist/elements/agents/Agent.d.ts.map +1 -0
  94. package/dist/elements/agents/Agent.js +848 -0
  95. package/dist/elements/agents/AgentManager.d.ts +125 -0
  96. package/dist/elements/agents/AgentManager.d.ts.map +1 -0
  97. package/dist/elements/agents/AgentManager.js +615 -0
  98. package/dist/elements/agents/constants.d.ts +42 -0
  99. package/dist/elements/agents/constants.d.ts.map +1 -0
  100. package/dist/elements/agents/constants.js +45 -0
  101. package/dist/elements/agents/goalTemplates.d.ts +44 -0
  102. package/dist/elements/agents/goalTemplates.d.ts.map +1 -0
  103. package/dist/elements/agents/goalTemplates.js +297 -0
  104. package/dist/elements/agents/index.d.ts +8 -0
  105. package/dist/elements/agents/index.d.ts.map +1 -0
  106. package/dist/elements/agents/index.js +8 -0
  107. package/dist/elements/agents/ruleEngineConfig.d.ts +76 -0
  108. package/dist/elements/agents/ruleEngineConfig.d.ts.map +1 -0
  109. package/dist/elements/agents/ruleEngineConfig.js +143 -0
  110. package/dist/elements/agents/types.d.ts +97 -0
  111. package/dist/elements/agents/types.d.ts.map +1 -0
  112. package/dist/elements/agents/types.js +5 -0
  113. package/dist/elements/ensembles/Ensemble.d.ts +144 -0
  114. package/dist/elements/ensembles/Ensemble.d.ts.map +1 -0
  115. package/dist/elements/ensembles/Ensemble.js +860 -0
  116. package/dist/elements/ensembles/EnsembleManager.d.ts +85 -0
  117. package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -0
  118. package/dist/elements/ensembles/EnsembleManager.js +378 -0
  119. package/dist/elements/ensembles/constants.d.ts +73 -0
  120. package/dist/elements/ensembles/constants.d.ts.map +1 -0
  121. package/dist/elements/ensembles/constants.js +92 -0
  122. package/dist/elements/ensembles/index.d.ts +8 -0
  123. package/dist/elements/ensembles/index.d.ts.map +1 -0
  124. package/dist/elements/ensembles/index.js +8 -0
  125. package/dist/elements/ensembles/types.d.ts +92 -0
  126. package/dist/elements/ensembles/types.d.ts.map +1 -0
  127. package/dist/elements/ensembles/types.js +8 -0
  128. package/dist/elements/index.d.ts +11 -0
  129. package/dist/elements/index.d.ts.map +1 -0
  130. package/dist/elements/index.js +12 -0
  131. package/dist/elements/memories/Memory.d.ts +110 -0
  132. package/dist/elements/memories/Memory.d.ts.map +1 -0
  133. package/dist/elements/memories/Memory.js +470 -0
  134. package/dist/elements/memories/MemoryManager.d.ts +86 -0
  135. package/dist/elements/memories/MemoryManager.d.ts.map +1 -0
  136. package/dist/elements/memories/MemoryManager.js +435 -0
  137. package/dist/elements/memories/constants.d.ts +42 -0
  138. package/dist/elements/memories/constants.d.ts.map +1 -0
  139. package/dist/elements/memories/constants.js +49 -0
  140. package/dist/elements/memories/index.d.ts +6 -0
  141. package/dist/elements/memories/index.d.ts.map +1 -0
  142. package/dist/elements/memories/index.js +6 -0
  143. package/dist/elements/skills/Skill.d.ts +109 -0
  144. package/dist/elements/skills/Skill.d.ts.map +1 -0
  145. package/dist/elements/skills/Skill.js +381 -0
  146. package/dist/elements/skills/index.d.ts +5 -0
  147. package/dist/elements/skills/index.d.ts.map +1 -0
  148. package/dist/elements/skills/index.js +5 -0
  149. package/dist/elements/templates/Template.d.ts +138 -0
  150. package/dist/elements/templates/Template.d.ts.map +1 -0
  151. package/dist/elements/templates/Template.js +673 -0
  152. package/dist/elements/templates/TemplateManager.d.ts +104 -0
  153. package/dist/elements/templates/TemplateManager.d.ts.map +1 -0
  154. package/dist/elements/templates/TemplateManager.js +501 -0
  155. package/dist/elements/templates/index.d.ts +6 -0
  156. package/dist/elements/templates/index.d.ts.map +1 -0
  157. package/dist/elements/templates/index.js +6 -0
  158. package/dist/errors/SecurityError.d.ts +29 -0
  159. package/dist/errors/SecurityError.d.ts.map +1 -0
  160. package/dist/errors/SecurityError.js +47 -0
  161. package/dist/errors/index.d.ts +2 -0
  162. package/dist/errors/index.d.ts.map +1 -0
  163. package/dist/errors/index.js +2 -0
  164. package/dist/index.barrel.d.ts +21 -0
  165. package/dist/index.barrel.d.ts.map +1 -0
  166. package/dist/index.barrel.js +31 -0
  167. package/dist/index.d.ts +223 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +1606 -0
  170. package/dist/marketplace/GitHubClient.d.ts +22 -0
  171. package/dist/marketplace/GitHubClient.d.ts.map +1 -0
  172. package/dist/marketplace/GitHubClient.js +112 -0
  173. package/dist/marketplace/MarketplaceBrowser.d.ts +24 -0
  174. package/dist/marketplace/MarketplaceBrowser.d.ts.map +1 -0
  175. package/dist/marketplace/MarketplaceBrowser.js +115 -0
  176. package/dist/marketplace/MarketplaceSearch.d.ts +18 -0
  177. package/dist/marketplace/MarketplaceSearch.d.ts.map +1 -0
  178. package/dist/marketplace/MarketplaceSearch.js +48 -0
  179. package/dist/marketplace/PersonaDetails.d.ts +22 -0
  180. package/dist/marketplace/PersonaDetails.d.ts.map +1 -0
  181. package/dist/marketplace/PersonaDetails.js +71 -0
  182. package/dist/marketplace/PersonaInstaller.d.ts +25 -0
  183. package/dist/marketplace/PersonaInstaller.d.ts.map +1 -0
  184. package/dist/marketplace/PersonaInstaller.js +100 -0
  185. package/dist/marketplace/PersonaSubmitter.d.ts +19 -0
  186. package/dist/marketplace/PersonaSubmitter.d.ts.map +1 -0
  187. package/dist/marketplace/PersonaSubmitter.js +57 -0
  188. package/dist/marketplace/index.d.ts +10 -0
  189. package/dist/marketplace/index.d.ts.map +1 -0
  190. package/dist/marketplace/index.js +10 -0
  191. package/dist/persona/PersonaElement.d.ts +64 -0
  192. package/dist/persona/PersonaElement.d.ts.map +1 -0
  193. package/dist/persona/PersonaElement.js +223 -0
  194. package/dist/persona/PersonaElementManager.d.ts +97 -0
  195. package/dist/persona/PersonaElementManager.d.ts.map +1 -0
  196. package/dist/persona/PersonaElementManager.js +348 -0
  197. package/dist/persona/PersonaLoader.d.ts +34 -0
  198. package/dist/persona/PersonaLoader.d.ts.map +1 -0
  199. package/dist/persona/PersonaLoader.js +145 -0
  200. package/dist/persona/PersonaManager.d.ts +112 -0
  201. package/dist/persona/PersonaManager.d.ts.map +1 -0
  202. package/dist/persona/PersonaManager.js +341 -0
  203. package/dist/persona/PersonaValidator.d.ts +39 -0
  204. package/dist/persona/PersonaValidator.d.ts.map +1 -0
  205. package/dist/persona/PersonaValidator.js +161 -0
  206. package/dist/persona/export-import/PersonaExporter.d.ts +43 -0
  207. package/dist/persona/export-import/PersonaExporter.d.ts.map +1 -0
  208. package/dist/persona/export-import/PersonaExporter.js +99 -0
  209. package/dist/persona/export-import/PersonaImporter.d.ts +65 -0
  210. package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -0
  211. package/dist/persona/export-import/PersonaImporter.js +315 -0
  212. package/dist/persona/export-import/PersonaSharer.d.ts +60 -0
  213. package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -0
  214. package/dist/persona/export-import/PersonaSharer.js +502 -0
  215. package/dist/persona/export-import/index.d.ts +10 -0
  216. package/dist/persona/export-import/index.d.ts.map +1 -0
  217. package/dist/persona/export-import/index.js +7 -0
  218. package/dist/persona/index.d.ts +7 -0
  219. package/dist/persona/index.d.ts.map +1 -0
  220. package/dist/persona/index.js +7 -0
  221. package/dist/portfolio/MigrationManager.d.ts +44 -0
  222. package/dist/portfolio/MigrationManager.d.ts.map +1 -0
  223. package/dist/portfolio/MigrationManager.js +163 -0
  224. package/dist/portfolio/PortfolioManager.d.ts +54 -0
  225. package/dist/portfolio/PortfolioManager.d.ts.map +1 -0
  226. package/dist/portfolio/PortfolioManager.js +224 -0
  227. package/dist/portfolio/types.d.ts +18 -0
  228. package/dist/portfolio/types.d.ts.map +1 -0
  229. package/dist/portfolio/types.js +13 -0
  230. package/dist/security/InputValidator.d.ts +80 -0
  231. package/dist/security/InputValidator.d.ts.map +1 -0
  232. package/dist/security/InputValidator.js +448 -0
  233. package/dist/security/audit/SecurityAuditor.d.ts +44 -0
  234. package/dist/security/audit/SecurityAuditor.d.ts.map +1 -0
  235. package/dist/security/audit/SecurityAuditor.js +274 -0
  236. package/dist/security/audit/config/suppressions.d.ts +34 -0
  237. package/dist/security/audit/config/suppressions.d.ts.map +1 -0
  238. package/dist/security/audit/config/suppressions.js +575 -0
  239. package/dist/security/audit/index.d.ts +14 -0
  240. package/dist/security/audit/index.d.ts.map +1 -0
  241. package/dist/security/audit/index.js +15 -0
  242. package/dist/security/audit/reporters/ConsoleReporter.d.ts +46 -0
  243. package/dist/security/audit/reporters/ConsoleReporter.d.ts.map +1 -0
  244. package/dist/security/audit/reporters/ConsoleReporter.js +174 -0
  245. package/dist/security/audit/reporters/JsonReporter.d.ts +13 -0
  246. package/dist/security/audit/reporters/JsonReporter.d.ts.map +1 -0
  247. package/dist/security/audit/reporters/JsonReporter.js +25 -0
  248. package/dist/security/audit/reporters/MarkdownReporter.d.ts +13 -0
  249. package/dist/security/audit/reporters/MarkdownReporter.d.ts.map +1 -0
  250. package/dist/security/audit/reporters/MarkdownReporter.js +79 -0
  251. package/dist/security/audit/rules/SecurityRules.d.ts +20 -0
  252. package/dist/security/audit/rules/SecurityRules.d.ts.map +1 -0
  253. package/dist/security/audit/rules/SecurityRules.js +244 -0
  254. package/dist/security/audit/scanners/CodeScanner.d.ts +47 -0
  255. package/dist/security/audit/scanners/CodeScanner.d.ts.map +1 -0
  256. package/dist/security/audit/scanners/CodeScanner.js +174 -0
  257. package/dist/security/audit/scanners/ConfigurationScanner.d.ts +13 -0
  258. package/dist/security/audit/scanners/ConfigurationScanner.d.ts.map +1 -0
  259. package/dist/security/audit/scanners/ConfigurationScanner.js +22 -0
  260. package/dist/security/audit/scanners/DependencyScanner.d.ts +13 -0
  261. package/dist/security/audit/scanners/DependencyScanner.d.ts.map +1 -0
  262. package/dist/security/audit/scanners/DependencyScanner.js +22 -0
  263. package/dist/security/audit/types.d.ts +94 -0
  264. package/dist/security/audit/types.d.ts.map +1 -0
  265. package/dist/security/audit/types.js +6 -0
  266. package/dist/security/commandValidator.d.ts +7 -0
  267. package/dist/security/commandValidator.d.ts.map +1 -0
  268. package/dist/security/commandValidator.js +78 -0
  269. package/dist/security/constants.d.ts +24 -0
  270. package/dist/security/constants.d.ts.map +1 -0
  271. package/dist/security/constants.js +26 -0
  272. package/dist/security/contentValidator.d.ts +47 -0
  273. package/dist/security/contentValidator.d.ts.map +1 -0
  274. package/dist/security/contentValidator.js +301 -0
  275. package/dist/security/errorHandler.d.ts +42 -0
  276. package/dist/security/errorHandler.d.ts.map +1 -0
  277. package/dist/security/errorHandler.js +166 -0
  278. package/dist/security/errors.d.ts +14 -0
  279. package/dist/security/errors.d.ts.map +1 -0
  280. package/dist/security/errors.js +28 -0
  281. package/dist/security/fileLockManager.d.ts +70 -0
  282. package/dist/security/fileLockManager.d.ts.map +1 -0
  283. package/dist/security/fileLockManager.js +187 -0
  284. package/dist/security/index.d.ts +12 -0
  285. package/dist/security/index.d.ts.map +1 -0
  286. package/dist/security/index.js +14 -0
  287. package/dist/security/pathValidator.d.ts +9 -0
  288. package/dist/security/pathValidator.d.ts.map +1 -0
  289. package/dist/security/pathValidator.js +102 -0
  290. package/dist/security/regexValidator.d.ts +59 -0
  291. package/dist/security/regexValidator.d.ts.map +1 -0
  292. package/dist/security/regexValidator.js +214 -0
  293. package/dist/security/secureYamlParser.d.ts +46 -0
  294. package/dist/security/secureYamlParser.d.ts.map +1 -0
  295. package/dist/security/secureYamlParser.js +203 -0
  296. package/dist/security/securityMonitor.d.ts +58 -0
  297. package/dist/security/securityMonitor.d.ts.map +1 -0
  298. package/dist/security/securityMonitor.js +108 -0
  299. package/dist/security/tokenManager.d.ts +85 -0
  300. package/dist/security/tokenManager.d.ts.map +1 -0
  301. package/dist/security/tokenManager.js +286 -0
  302. package/dist/security/validators/unicodeValidator.d.ts +97 -0
  303. package/dist/security/validators/unicodeValidator.d.ts.map +1 -0
  304. package/dist/security/validators/unicodeValidator.js +312 -0
  305. package/dist/security/yamlValidator.d.ts +21 -0
  306. package/dist/security/yamlValidator.d.ts.map +1 -0
  307. package/dist/security/yamlValidator.js +164 -0
  308. package/dist/server/ServerSetup.d.ts +35 -0
  309. package/dist/server/ServerSetup.d.ts.map +1 -0
  310. package/dist/server/ServerSetup.js +116 -0
  311. package/dist/server/index.d.ts +7 -0
  312. package/dist/server/index.d.ts.map +1 -0
  313. package/dist/server/index.js +7 -0
  314. package/dist/server/startup.d.ts +31 -0
  315. package/dist/server/startup.d.ts.map +1 -0
  316. package/dist/server/startup.js +67 -0
  317. package/dist/server/tools/CollectionTools.d.ts +10 -0
  318. package/dist/server/tools/CollectionTools.d.ts.map +1 -0
  319. package/dist/server/tools/CollectionTools.js +96 -0
  320. package/dist/server/tools/ConfigTools.d.ts +10 -0
  321. package/dist/server/tools/ConfigTools.d.ts.map +1 -0
  322. package/dist/server/tools/ConfigTools.js +63 -0
  323. package/dist/server/tools/MarketplaceTools.d.ts +10 -0
  324. package/dist/server/tools/MarketplaceTools.d.ts.map +1 -0
  325. package/dist/server/tools/MarketplaceTools.js +96 -0
  326. package/dist/server/tools/PersonaTools.d.ts +10 -0
  327. package/dist/server/tools/PersonaTools.d.ts.map +1 -0
  328. package/dist/server/tools/PersonaTools.js +257 -0
  329. package/dist/server/tools/ToolRegistry.d.ts +37 -0
  330. package/dist/server/tools/ToolRegistry.d.ts.map +1 -0
  331. package/dist/server/tools/ToolRegistry.js +40 -0
  332. package/dist/server/tools/UpdateTools.d.ts +10 -0
  333. package/dist/server/tools/UpdateTools.d.ts.map +1 -0
  334. package/dist/server/tools/UpdateTools.js +64 -0
  335. package/dist/server/tools/UserTools.d.ts +10 -0
  336. package/dist/server/tools/UserTools.d.ts.map +1 -0
  337. package/dist/server/tools/UserTools.js +51 -0
  338. package/dist/server/tools/index.d.ts +10 -0
  339. package/dist/server/tools/index.d.ts.map +1 -0
  340. package/dist/server/tools/index.js +10 -0
  341. package/dist/server/types.d.ts +34 -0
  342. package/dist/server/types.d.ts.map +1 -0
  343. package/dist/server/types.js +5 -0
  344. package/dist/src/cache/APICache.d.ts +23 -0
  345. package/dist/src/cache/APICache.d.ts.map +1 -0
  346. package/dist/src/cache/APICache.js +42 -0
  347. package/dist/src/cache/index.d.ts +5 -0
  348. package/dist/src/cache/index.d.ts.map +1 -0
  349. package/dist/src/cache/index.js +5 -0
  350. package/dist/src/config/constants.d.ts +25 -0
  351. package/dist/src/config/constants.d.ts.map +1 -0
  352. package/dist/src/config/constants.js +30 -0
  353. package/dist/src/config/index.d.ts +6 -0
  354. package/dist/src/config/index.d.ts.map +1 -0
  355. package/dist/src/config/index.js +6 -0
  356. package/dist/src/config/indicator-config.d.ts +107 -0
  357. package/dist/src/config/indicator-config.d.ts.map +1 -0
  358. package/dist/src/config/indicator-config.js +158 -0
  359. package/dist/src/constants/defaultPersonas.d.ts +10 -0
  360. package/dist/src/constants/defaultPersonas.d.ts.map +1 -0
  361. package/dist/src/constants/defaultPersonas.js +18 -0
  362. package/dist/src/constants/limits.d.ts +10 -0
  363. package/dist/src/constants/limits.d.ts.map +1 -0
  364. package/dist/src/constants/limits.js +13 -0
  365. package/dist/src/errors/SecurityError.d.ts +29 -0
  366. package/dist/src/errors/SecurityError.d.ts.map +1 -0
  367. package/dist/src/errors/SecurityError.js +47 -0
  368. package/dist/src/errors/index.d.ts +2 -0
  369. package/dist/src/errors/index.d.ts.map +1 -0
  370. package/dist/src/errors/index.js +2 -0
  371. package/dist/src/index.barrel.d.ts +21 -0
  372. package/dist/src/index.barrel.d.ts.map +1 -0
  373. package/dist/src/index.barrel.js +31 -0
  374. package/dist/src/index.d.ts +220 -0
  375. package/dist/src/index.d.ts.map +1 -0
  376. package/dist/src/index.js +1559 -0
  377. package/dist/src/marketplace/GitHubClient.d.ts +22 -0
  378. package/dist/src/marketplace/GitHubClient.d.ts.map +1 -0
  379. package/dist/src/marketplace/GitHubClient.js +112 -0
  380. package/dist/src/marketplace/MarketplaceBrowser.d.ts +21 -0
  381. package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +1 -0
  382. package/dist/src/marketplace/MarketplaceBrowser.js +45 -0
  383. package/dist/src/marketplace/MarketplaceSearch.d.ts +18 -0
  384. package/dist/src/marketplace/MarketplaceSearch.d.ts.map +1 -0
  385. package/dist/src/marketplace/MarketplaceSearch.js +36 -0
  386. package/dist/src/marketplace/PersonaDetails.d.ts +22 -0
  387. package/dist/src/marketplace/PersonaDetails.d.ts.map +1 -0
  388. package/dist/src/marketplace/PersonaDetails.js +71 -0
  389. package/dist/src/marketplace/PersonaInstaller.d.ts +25 -0
  390. package/dist/src/marketplace/PersonaInstaller.d.ts.map +1 -0
  391. package/dist/src/marketplace/PersonaInstaller.js +100 -0
  392. package/dist/src/marketplace/PersonaSubmitter.d.ts +19 -0
  393. package/dist/src/marketplace/PersonaSubmitter.d.ts.map +1 -0
  394. package/dist/src/marketplace/PersonaSubmitter.js +57 -0
  395. package/dist/src/marketplace/index.d.ts +10 -0
  396. package/dist/src/marketplace/index.d.ts.map +1 -0
  397. package/dist/src/marketplace/index.js +10 -0
  398. package/dist/src/persona/PersonaLoader.d.ts +33 -0
  399. package/dist/src/persona/PersonaLoader.d.ts.map +1 -0
  400. package/dist/src/persona/PersonaLoader.js +139 -0
  401. package/dist/src/persona/PersonaManager.d.ts +112 -0
  402. package/dist/src/persona/PersonaManager.d.ts.map +1 -0
  403. package/dist/src/persona/PersonaManager.js +341 -0
  404. package/dist/src/persona/PersonaValidator.d.ts +33 -0
  405. package/dist/src/persona/PersonaValidator.d.ts.map +1 -0
  406. package/dist/src/persona/PersonaValidator.js +157 -0
  407. package/dist/src/persona/export-import/PersonaExporter.d.ts +43 -0
  408. package/dist/src/persona/export-import/PersonaExporter.d.ts.map +1 -0
  409. package/dist/src/persona/export-import/PersonaExporter.js +99 -0
  410. package/dist/src/persona/export-import/PersonaImporter.d.ts +65 -0
  411. package/dist/src/persona/export-import/PersonaImporter.d.ts.map +1 -0
  412. package/dist/src/persona/export-import/PersonaImporter.js +313 -0
  413. package/dist/src/persona/export-import/PersonaSharer.d.ts +60 -0
  414. package/dist/src/persona/export-import/PersonaSharer.d.ts.map +1 -0
  415. package/dist/src/persona/export-import/PersonaSharer.js +363 -0
  416. package/dist/src/persona/export-import/index.d.ts +10 -0
  417. package/dist/src/persona/export-import/index.d.ts.map +1 -0
  418. package/dist/src/persona/export-import/index.js +7 -0
  419. package/dist/src/persona/index.d.ts +7 -0
  420. package/dist/src/persona/index.d.ts.map +1 -0
  421. package/dist/src/persona/index.js +7 -0
  422. package/dist/src/security/InputValidator.d.ts +69 -0
  423. package/dist/src/security/InputValidator.d.ts.map +1 -0
  424. package/dist/src/security/InputValidator.js +381 -0
  425. package/dist/src/security/commandValidator.d.ts +7 -0
  426. package/dist/src/security/commandValidator.d.ts.map +1 -0
  427. package/dist/src/security/commandValidator.js +77 -0
  428. package/dist/src/security/constants.d.ts +21 -0
  429. package/dist/src/security/constants.d.ts.map +1 -0
  430. package/dist/src/security/constants.js +23 -0
  431. package/dist/src/security/contentValidator.d.ts +47 -0
  432. package/dist/src/security/contentValidator.d.ts.map +1 -0
  433. package/dist/src/security/contentValidator.js +188 -0
  434. package/dist/src/security/fileLockManager.d.ts +70 -0
  435. package/dist/src/security/fileLockManager.d.ts.map +1 -0
  436. package/dist/src/security/fileLockManager.js +187 -0
  437. package/dist/src/security/index.d.ts +12 -0
  438. package/dist/src/security/index.d.ts.map +1 -0
  439. package/dist/src/security/index.js +14 -0
  440. package/dist/src/security/pathValidator.d.ts +9 -0
  441. package/dist/src/security/pathValidator.d.ts.map +1 -0
  442. package/dist/src/security/pathValidator.js +97 -0
  443. package/dist/src/security/secureYamlParser.d.ts +46 -0
  444. package/dist/src/security/secureYamlParser.d.ts.map +1 -0
  445. package/dist/src/security/secureYamlParser.js +203 -0
  446. package/dist/src/security/securityMonitor.d.ts +58 -0
  447. package/dist/src/security/securityMonitor.d.ts.map +1 -0
  448. package/dist/src/security/securityMonitor.js +108 -0
  449. package/dist/src/security/tokenManager.d.ts +59 -0
  450. package/dist/src/security/tokenManager.d.ts.map +1 -0
  451. package/dist/src/security/tokenManager.js +216 -0
  452. package/dist/src/security/yamlValidator.d.ts +20 -0
  453. package/dist/src/security/yamlValidator.d.ts.map +1 -0
  454. package/dist/src/security/yamlValidator.js +138 -0
  455. package/dist/src/server/ServerSetup.d.ts +31 -0
  456. package/dist/src/server/ServerSetup.d.ts.map +1 -0
  457. package/dist/src/server/ServerSetup.js +79 -0
  458. package/dist/src/server/index.d.ts +7 -0
  459. package/dist/src/server/index.d.ts.map +1 -0
  460. package/dist/src/server/index.js +7 -0
  461. package/dist/src/server/tools/ConfigTools.d.ts +10 -0
  462. package/dist/src/server/tools/ConfigTools.d.ts.map +1 -0
  463. package/dist/src/server/tools/ConfigTools.js +63 -0
  464. package/dist/src/server/tools/MarketplaceTools.d.ts +10 -0
  465. package/dist/src/server/tools/MarketplaceTools.d.ts.map +1 -0
  466. package/dist/src/server/tools/MarketplaceTools.js +92 -0
  467. package/dist/src/server/tools/PersonaTools.d.ts +10 -0
  468. package/dist/src/server/tools/PersonaTools.d.ts.map +1 -0
  469. package/dist/src/server/tools/PersonaTools.js +257 -0
  470. package/dist/src/server/tools/ToolRegistry.d.ts +37 -0
  471. package/dist/src/server/tools/ToolRegistry.d.ts.map +1 -0
  472. package/dist/src/server/tools/ToolRegistry.js +40 -0
  473. package/dist/src/server/tools/UpdateTools.d.ts +10 -0
  474. package/dist/src/server/tools/UpdateTools.d.ts.map +1 -0
  475. package/dist/src/server/tools/UpdateTools.js +64 -0
  476. package/dist/src/server/tools/UserTools.d.ts +10 -0
  477. package/dist/src/server/tools/UserTools.d.ts.map +1 -0
  478. package/dist/src/server/tools/UserTools.js +51 -0
  479. package/dist/src/server/tools/index.d.ts +10 -0
  480. package/dist/src/server/tools/index.d.ts.map +1 -0
  481. package/dist/src/server/tools/index.js +10 -0
  482. package/dist/src/server/types.d.ts +34 -0
  483. package/dist/src/server/types.d.ts.map +1 -0
  484. package/dist/src/server/types.js +5 -0
  485. package/dist/src/tools/debug.d.ts +20 -0
  486. package/dist/src/tools/debug.d.ts.map +1 -0
  487. package/dist/src/tools/debug.js +37 -0
  488. package/dist/src/types/cache.d.ts +8 -0
  489. package/dist/src/types/cache.d.ts.map +1 -0
  490. package/dist/src/types/cache.js +5 -0
  491. package/dist/src/types/index.d.ts +8 -0
  492. package/dist/src/types/index.d.ts.map +1 -0
  493. package/dist/src/types/index.js +8 -0
  494. package/dist/src/types/marketplace.d.ts +23 -0
  495. package/dist/src/types/marketplace.d.ts.map +1 -0
  496. package/dist/src/types/marketplace.js +5 -0
  497. package/dist/src/types/mcp.d.ts +161 -0
  498. package/dist/src/types/mcp.d.ts.map +1 -0
  499. package/dist/src/types/mcp.js +75 -0
  500. package/dist/src/types/persona.d.ts +30 -0
  501. package/dist/src/types/persona.d.ts.map +1 -0
  502. package/dist/src/types/persona.js +5 -0
  503. package/dist/src/update/BackupManager.d.ts +46 -0
  504. package/dist/src/update/BackupManager.d.ts.map +1 -0
  505. package/dist/src/update/BackupManager.js +261 -0
  506. package/dist/src/update/DependencyChecker.d.ts +41 -0
  507. package/dist/src/update/DependencyChecker.d.ts.map +1 -0
  508. package/dist/src/update/DependencyChecker.js +132 -0
  509. package/dist/src/update/RateLimiter.d.ts +80 -0
  510. package/dist/src/update/RateLimiter.d.ts.map +1 -0
  511. package/dist/src/update/RateLimiter.js +172 -0
  512. package/dist/src/update/SignatureVerifier.d.ts +71 -0
  513. package/dist/src/update/SignatureVerifier.d.ts.map +1 -0
  514. package/dist/src/update/SignatureVerifier.js +214 -0
  515. package/dist/src/update/UpdateChecker.d.ts +127 -0
  516. package/dist/src/update/UpdateChecker.d.ts.map +1 -0
  517. package/dist/src/update/UpdateChecker.js +460 -0
  518. package/dist/src/update/UpdateManager.d.ts +41 -0
  519. package/dist/src/update/UpdateManager.d.ts.map +1 -0
  520. package/dist/src/update/UpdateManager.js +260 -0
  521. package/dist/src/update/VersionManager.d.ts +31 -0
  522. package/dist/src/update/VersionManager.d.ts.map +1 -0
  523. package/dist/src/update/VersionManager.js +134 -0
  524. package/dist/src/update/index.d.ts +9 -0
  525. package/dist/src/update/index.d.ts.map +1 -0
  526. package/dist/src/update/index.js +9 -0
  527. package/dist/src/utils/filesystem.d.ts +32 -0
  528. package/dist/src/utils/filesystem.d.ts.map +1 -0
  529. package/dist/src/utils/filesystem.js +73 -0
  530. package/dist/src/utils/git.d.ts +32 -0
  531. package/dist/src/utils/git.d.ts.map +1 -0
  532. package/dist/src/utils/git.js +65 -0
  533. package/dist/src/utils/index.d.ts +7 -0
  534. package/dist/src/utils/index.d.ts.map +1 -0
  535. package/dist/src/utils/index.js +7 -0
  536. package/dist/src/utils/logger.d.ts +45 -0
  537. package/dist/src/utils/logger.d.ts.map +1 -0
  538. package/dist/src/utils/logger.js +91 -0
  539. package/dist/src/utils/version.d.ts +25 -0
  540. package/dist/src/utils/version.d.ts.map +1 -0
  541. package/dist/src/utils/version.js +97 -0
  542. package/dist/test/src/cache/APICache.d.ts +23 -0
  543. package/dist/test/src/cache/APICache.d.ts.map +1 -0
  544. package/dist/test/src/cache/APICache.js +42 -0
  545. package/dist/test/src/cache/index.d.ts +5 -0
  546. package/dist/test/src/cache/index.d.ts.map +1 -0
  547. package/dist/test/src/cache/index.js +5 -0
  548. package/dist/test/src/collection/CollectionBrowser.d.ts +24 -0
  549. package/dist/test/src/collection/CollectionBrowser.d.ts.map +1 -0
  550. package/dist/test/src/collection/CollectionBrowser.js +115 -0
  551. package/dist/test/src/collection/CollectionSearch.d.ts +18 -0
  552. package/dist/test/src/collection/CollectionSearch.d.ts.map +1 -0
  553. package/dist/test/src/collection/CollectionSearch.js +48 -0
  554. package/dist/test/src/collection/GitHubClient.d.ts +22 -0
  555. package/dist/test/src/collection/GitHubClient.d.ts.map +1 -0
  556. package/dist/test/src/collection/GitHubClient.js +114 -0
  557. package/dist/test/src/collection/PersonaDetails.d.ts +22 -0
  558. package/dist/test/src/collection/PersonaDetails.d.ts.map +1 -0
  559. package/dist/test/src/collection/PersonaDetails.js +71 -0
  560. package/dist/test/src/collection/PersonaInstaller.d.ts +26 -0
  561. package/dist/test/src/collection/PersonaInstaller.d.ts.map +1 -0
  562. package/dist/test/src/collection/PersonaInstaller.js +103 -0
  563. package/dist/test/src/collection/PersonaSubmitter.d.ts +19 -0
  564. package/dist/test/src/collection/PersonaSubmitter.d.ts.map +1 -0
  565. package/dist/test/src/collection/PersonaSubmitter.js +57 -0
  566. package/dist/test/src/collection/index.d.ts +10 -0
  567. package/dist/test/src/collection/index.d.ts.map +1 -0
  568. package/dist/test/src/collection/index.js +10 -0
  569. package/dist/test/src/config/constants.d.ts +25 -0
  570. package/dist/test/src/config/constants.d.ts.map +1 -0
  571. package/dist/test/src/config/constants.js +30 -0
  572. package/dist/test/src/config/index.d.ts +6 -0
  573. package/dist/test/src/config/index.d.ts.map +1 -0
  574. package/dist/test/src/config/index.js +6 -0
  575. package/dist/test/src/config/indicator-config.d.ts +107 -0
  576. package/dist/test/src/config/indicator-config.d.ts.map +1 -0
  577. package/dist/test/src/config/indicator-config.js +158 -0
  578. package/dist/test/src/constants/defaultPersonas.d.ts +10 -0
  579. package/dist/test/src/constants/defaultPersonas.d.ts.map +1 -0
  580. package/dist/test/src/constants/defaultPersonas.js +18 -0
  581. package/dist/test/src/constants/limits.d.ts +10 -0
  582. package/dist/test/src/constants/limits.d.ts.map +1 -0
  583. package/dist/test/src/constants/limits.js +13 -0
  584. package/dist/test/src/elements/BaseElement.d.ts +81 -0
  585. package/dist/test/src/elements/BaseElement.d.ts.map +1 -0
  586. package/dist/test/src/elements/BaseElement.js +381 -0
  587. package/dist/test/src/elements/FeedbackProcessor.d.ts +57 -0
  588. package/dist/test/src/elements/FeedbackProcessor.d.ts.map +1 -0
  589. package/dist/test/src/elements/FeedbackProcessor.js +418 -0
  590. package/dist/test/src/elements/agents/Agent.d.ts +145 -0
  591. package/dist/test/src/elements/agents/Agent.d.ts.map +1 -0
  592. package/dist/test/src/elements/agents/Agent.js +848 -0
  593. package/dist/test/src/elements/agents/AgentManager.d.ts +125 -0
  594. package/dist/test/src/elements/agents/AgentManager.d.ts.map +1 -0
  595. package/dist/test/src/elements/agents/AgentManager.js +608 -0
  596. package/dist/test/src/elements/agents/constants.d.ts +42 -0
  597. package/dist/test/src/elements/agents/constants.d.ts.map +1 -0
  598. package/dist/test/src/elements/agents/constants.js +45 -0
  599. package/dist/test/src/elements/agents/goalTemplates.d.ts +44 -0
  600. package/dist/test/src/elements/agents/goalTemplates.d.ts.map +1 -0
  601. package/dist/test/src/elements/agents/goalTemplates.js +297 -0
  602. package/dist/test/src/elements/agents/index.d.ts +8 -0
  603. package/dist/test/src/elements/agents/index.d.ts.map +1 -0
  604. package/dist/test/src/elements/agents/index.js +8 -0
  605. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +76 -0
  606. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +1 -0
  607. package/dist/test/src/elements/agents/ruleEngineConfig.js +143 -0
  608. package/dist/test/src/elements/agents/types.d.ts +97 -0
  609. package/dist/test/src/elements/agents/types.d.ts.map +1 -0
  610. package/dist/test/src/elements/agents/types.js +5 -0
  611. package/dist/test/src/elements/index.d.ts +6 -0
  612. package/dist/test/src/elements/index.d.ts.map +1 -0
  613. package/dist/test/src/elements/index.js +6 -0
  614. package/dist/test/src/elements/memories/Memory.d.ts +110 -0
  615. package/dist/test/src/elements/memories/Memory.d.ts.map +1 -0
  616. package/dist/test/src/elements/memories/Memory.js +470 -0
  617. package/dist/test/src/elements/memories/MemoryManager.d.ts +86 -0
  618. package/dist/test/src/elements/memories/MemoryManager.d.ts.map +1 -0
  619. package/dist/test/src/elements/memories/MemoryManager.js +435 -0
  620. package/dist/test/src/elements/memories/constants.d.ts +42 -0
  621. package/dist/test/src/elements/memories/constants.d.ts.map +1 -0
  622. package/dist/test/src/elements/memories/constants.js +49 -0
  623. package/dist/test/src/elements/memories/index.d.ts +6 -0
  624. package/dist/test/src/elements/memories/index.d.ts.map +1 -0
  625. package/dist/test/src/elements/memories/index.js +6 -0
  626. package/dist/test/src/elements/skills/Skill.d.ts +109 -0
  627. package/dist/test/src/elements/skills/Skill.d.ts.map +1 -0
  628. package/dist/test/src/elements/skills/Skill.js +381 -0
  629. package/dist/test/src/elements/templates/Template.d.ts +138 -0
  630. package/dist/test/src/elements/templates/Template.d.ts.map +1 -0
  631. package/dist/test/src/elements/templates/Template.js +673 -0
  632. package/dist/test/src/elements/templates/TemplateManager.d.ts +104 -0
  633. package/dist/test/src/elements/templates/TemplateManager.d.ts.map +1 -0
  634. package/dist/test/src/elements/templates/TemplateManager.js +496 -0
  635. package/dist/test/src/elements/templates/index.d.ts +6 -0
  636. package/dist/test/src/elements/templates/index.d.ts.map +1 -0
  637. package/dist/test/src/elements/templates/index.js +6 -0
  638. package/dist/test/src/errors/SecurityError.d.ts +29 -0
  639. package/dist/test/src/errors/SecurityError.d.ts.map +1 -0
  640. package/dist/test/src/errors/SecurityError.js +47 -0
  641. package/dist/test/src/errors/index.d.ts +2 -0
  642. package/dist/test/src/errors/index.d.ts.map +1 -0
  643. package/dist/test/src/errors/index.js +2 -0
  644. package/dist/test/src/index.barrel.d.ts +21 -0
  645. package/dist/test/src/index.barrel.d.ts.map +1 -0
  646. package/dist/test/src/index.barrel.js +31 -0
  647. package/dist/test/src/index.d.ts +223 -0
  648. package/dist/test/src/index.d.ts.map +1 -0
  649. package/dist/test/src/index.js +1594 -0
  650. package/dist/test/src/marketplace/GitHubClient.d.ts +22 -0
  651. package/dist/test/src/marketplace/GitHubClient.d.ts.map +1 -0
  652. package/dist/test/src/marketplace/GitHubClient.js +112 -0
  653. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +21 -0
  654. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +1 -0
  655. package/dist/test/src/marketplace/MarketplaceBrowser.js +45 -0
  656. package/dist/test/src/marketplace/MarketplaceSearch.d.ts +18 -0
  657. package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +1 -0
  658. package/dist/test/src/marketplace/MarketplaceSearch.js +36 -0
  659. package/dist/test/src/marketplace/PersonaDetails.d.ts +22 -0
  660. package/dist/test/src/marketplace/PersonaDetails.d.ts.map +1 -0
  661. package/dist/test/src/marketplace/PersonaDetails.js +71 -0
  662. package/dist/test/src/marketplace/PersonaInstaller.d.ts +25 -0
  663. package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +1 -0
  664. package/dist/test/src/marketplace/PersonaInstaller.js +100 -0
  665. package/dist/test/src/marketplace/PersonaSubmitter.d.ts +19 -0
  666. package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +1 -0
  667. package/dist/test/src/marketplace/PersonaSubmitter.js +57 -0
  668. package/dist/test/src/marketplace/index.d.ts +10 -0
  669. package/dist/test/src/marketplace/index.d.ts.map +1 -0
  670. package/dist/test/src/marketplace/index.js +10 -0
  671. package/dist/test/src/persona/PersonaElement.d.ts +64 -0
  672. package/dist/test/src/persona/PersonaElement.d.ts.map +1 -0
  673. package/dist/test/src/persona/PersonaElement.js +223 -0
  674. package/dist/test/src/persona/PersonaElementManager.d.ts +97 -0
  675. package/dist/test/src/persona/PersonaElementManager.d.ts.map +1 -0
  676. package/dist/test/src/persona/PersonaElementManager.js +342 -0
  677. package/dist/test/src/persona/PersonaLoader.d.ts +34 -0
  678. package/dist/test/src/persona/PersonaLoader.d.ts.map +1 -0
  679. package/dist/test/src/persona/PersonaLoader.js +145 -0
  680. package/dist/test/src/persona/PersonaManager.d.ts +112 -0
  681. package/dist/test/src/persona/PersonaManager.d.ts.map +1 -0
  682. package/dist/test/src/persona/PersonaManager.js +341 -0
  683. package/dist/test/src/persona/PersonaValidator.d.ts +33 -0
  684. package/dist/test/src/persona/PersonaValidator.d.ts.map +1 -0
  685. package/dist/test/src/persona/PersonaValidator.js +157 -0
  686. package/dist/test/src/persona/export-import/PersonaExporter.d.ts +43 -0
  687. package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +1 -0
  688. package/dist/test/src/persona/export-import/PersonaExporter.js +99 -0
  689. package/dist/test/src/persona/export-import/PersonaImporter.d.ts +65 -0
  690. package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +1 -0
  691. package/dist/test/src/persona/export-import/PersonaImporter.js +315 -0
  692. package/dist/test/src/persona/export-import/PersonaSharer.d.ts +60 -0
  693. package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +1 -0
  694. package/dist/test/src/persona/export-import/PersonaSharer.js +502 -0
  695. package/dist/test/src/persona/export-import/index.d.ts +10 -0
  696. package/dist/test/src/persona/export-import/index.d.ts.map +1 -0
  697. package/dist/test/src/persona/export-import/index.js +7 -0
  698. package/dist/test/src/persona/index.d.ts +7 -0
  699. package/dist/test/src/persona/index.d.ts.map +1 -0
  700. package/dist/test/src/persona/index.js +7 -0
  701. package/dist/test/src/portfolio/MigrationManager.d.ts +44 -0
  702. package/dist/test/src/portfolio/MigrationManager.d.ts.map +1 -0
  703. package/dist/test/src/portfolio/MigrationManager.js +163 -0
  704. package/dist/test/src/portfolio/PortfolioManager.d.ts +54 -0
  705. package/dist/test/src/portfolio/PortfolioManager.d.ts.map +1 -0
  706. package/dist/test/src/portfolio/PortfolioManager.js +224 -0
  707. package/dist/test/src/portfolio/types.d.ts +18 -0
  708. package/dist/test/src/portfolio/types.d.ts.map +1 -0
  709. package/dist/test/src/portfolio/types.js +13 -0
  710. package/dist/test/src/security/InputValidator.d.ts +80 -0
  711. package/dist/test/src/security/InputValidator.d.ts.map +1 -0
  712. package/dist/test/src/security/InputValidator.js +436 -0
  713. package/dist/test/src/security/audit/SecurityAuditor.d.ts +44 -0
  714. package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +1 -0
  715. package/dist/test/src/security/audit/SecurityAuditor.js +274 -0
  716. package/dist/test/src/security/audit/config/suppressions.d.ts +34 -0
  717. package/dist/test/src/security/audit/config/suppressions.d.ts.map +1 -0
  718. package/dist/test/src/security/audit/config/suppressions.js +575 -0
  719. package/dist/test/src/security/audit/index.d.ts +14 -0
  720. package/dist/test/src/security/audit/index.d.ts.map +1 -0
  721. package/dist/test/src/security/audit/index.js +15 -0
  722. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +46 -0
  723. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +1 -0
  724. package/dist/test/src/security/audit/reporters/ConsoleReporter.js +174 -0
  725. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +13 -0
  726. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +1 -0
  727. package/dist/test/src/security/audit/reporters/JsonReporter.js +25 -0
  728. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +13 -0
  729. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +1 -0
  730. package/dist/test/src/security/audit/reporters/MarkdownReporter.js +79 -0
  731. package/dist/test/src/security/audit/rules/SecurityRules.d.ts +20 -0
  732. package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +1 -0
  733. package/dist/test/src/security/audit/rules/SecurityRules.js +244 -0
  734. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +47 -0
  735. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +1 -0
  736. package/dist/test/src/security/audit/scanners/CodeScanner.js +174 -0
  737. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +13 -0
  738. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +1 -0
  739. package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +22 -0
  740. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +13 -0
  741. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +1 -0
  742. package/dist/test/src/security/audit/scanners/DependencyScanner.js +22 -0
  743. package/dist/test/src/security/audit/types.d.ts +94 -0
  744. package/dist/test/src/security/audit/types.d.ts.map +1 -0
  745. package/dist/test/src/security/audit/types.js +6 -0
  746. package/dist/test/src/security/commandValidator.d.ts +7 -0
  747. package/dist/test/src/security/commandValidator.d.ts.map +1 -0
  748. package/dist/test/src/security/commandValidator.js +78 -0
  749. package/dist/test/src/security/constants.d.ts +24 -0
  750. package/dist/test/src/security/constants.d.ts.map +1 -0
  751. package/dist/test/src/security/constants.js +26 -0
  752. package/dist/test/src/security/contentValidator.d.ts +47 -0
  753. package/dist/test/src/security/contentValidator.d.ts.map +1 -0
  754. package/dist/test/src/security/contentValidator.js +301 -0
  755. package/dist/test/src/security/errors.d.ts +14 -0
  756. package/dist/test/src/security/errors.d.ts.map +1 -0
  757. package/dist/test/src/security/errors.js +28 -0
  758. package/dist/test/src/security/fileLockManager.d.ts +70 -0
  759. package/dist/test/src/security/fileLockManager.d.ts.map +1 -0
  760. package/dist/test/src/security/fileLockManager.js +187 -0
  761. package/dist/test/src/security/index.d.ts +12 -0
  762. package/dist/test/src/security/index.d.ts.map +1 -0
  763. package/dist/test/src/security/index.js +14 -0
  764. package/dist/test/src/security/pathValidator.d.ts +9 -0
  765. package/dist/test/src/security/pathValidator.d.ts.map +1 -0
  766. package/dist/test/src/security/pathValidator.js +98 -0
  767. package/dist/test/src/security/regexValidator.d.ts +59 -0
  768. package/dist/test/src/security/regexValidator.d.ts.map +1 -0
  769. package/dist/test/src/security/regexValidator.js +214 -0
  770. package/dist/test/src/security/secureYamlParser.d.ts +46 -0
  771. package/dist/test/src/security/secureYamlParser.d.ts.map +1 -0
  772. package/dist/test/src/security/secureYamlParser.js +203 -0
  773. package/dist/test/src/security/securityMonitor.d.ts +58 -0
  774. package/dist/test/src/security/securityMonitor.d.ts.map +1 -0
  775. package/dist/test/src/security/securityMonitor.js +108 -0
  776. package/dist/test/src/security/tokenManager.d.ts +85 -0
  777. package/dist/test/src/security/tokenManager.d.ts.map +1 -0
  778. package/dist/test/src/security/tokenManager.js +286 -0
  779. package/dist/test/src/security/validators/unicodeValidator.d.ts +97 -0
  780. package/dist/test/src/security/validators/unicodeValidator.d.ts.map +1 -0
  781. package/dist/test/src/security/validators/unicodeValidator.js +312 -0
  782. package/dist/test/src/security/yamlValidator.d.ts +21 -0
  783. package/dist/test/src/security/yamlValidator.d.ts.map +1 -0
  784. package/dist/test/src/security/yamlValidator.js +164 -0
  785. package/dist/test/src/server/ServerSetup.d.ts +35 -0
  786. package/dist/test/src/server/ServerSetup.d.ts.map +1 -0
  787. package/dist/test/src/server/ServerSetup.js +116 -0
  788. package/dist/test/src/server/index.d.ts +7 -0
  789. package/dist/test/src/server/index.d.ts.map +1 -0
  790. package/dist/test/src/server/index.js +7 -0
  791. package/dist/test/src/server/startup.d.ts +31 -0
  792. package/dist/test/src/server/startup.d.ts.map +1 -0
  793. package/dist/test/src/server/startup.js +67 -0
  794. package/dist/test/src/server/tools/CollectionTools.d.ts +10 -0
  795. package/dist/test/src/server/tools/CollectionTools.d.ts.map +1 -0
  796. package/dist/test/src/server/tools/CollectionTools.js +96 -0
  797. package/dist/test/src/server/tools/ConfigTools.d.ts +10 -0
  798. package/dist/test/src/server/tools/ConfigTools.d.ts.map +1 -0
  799. package/dist/test/src/server/tools/ConfigTools.js +63 -0
  800. package/dist/test/src/server/tools/MarketplaceTools.d.ts +10 -0
  801. package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +1 -0
  802. package/dist/test/src/server/tools/MarketplaceTools.js +92 -0
  803. package/dist/test/src/server/tools/PersonaTools.d.ts +10 -0
  804. package/dist/test/src/server/tools/PersonaTools.d.ts.map +1 -0
  805. package/dist/test/src/server/tools/PersonaTools.js +257 -0
  806. package/dist/test/src/server/tools/ToolRegistry.d.ts +37 -0
  807. package/dist/test/src/server/tools/ToolRegistry.d.ts.map +1 -0
  808. package/dist/test/src/server/tools/ToolRegistry.js +40 -0
  809. package/dist/test/src/server/tools/UpdateTools.d.ts +10 -0
  810. package/dist/test/src/server/tools/UpdateTools.d.ts.map +1 -0
  811. package/dist/test/src/server/tools/UpdateTools.js +64 -0
  812. package/dist/test/src/server/tools/UserTools.d.ts +10 -0
  813. package/dist/test/src/server/tools/UserTools.d.ts.map +1 -0
  814. package/dist/test/src/server/tools/UserTools.js +51 -0
  815. package/dist/test/src/server/tools/index.d.ts +10 -0
  816. package/dist/test/src/server/tools/index.d.ts.map +1 -0
  817. package/dist/test/src/server/tools/index.js +10 -0
  818. package/dist/test/src/server/types.d.ts +34 -0
  819. package/dist/test/src/server/types.d.ts.map +1 -0
  820. package/dist/test/src/server/types.js +5 -0
  821. package/dist/test/src/tools/debug.d.ts +20 -0
  822. package/dist/test/src/tools/debug.d.ts.map +1 -0
  823. package/dist/test/src/tools/debug.js +37 -0
  824. package/dist/test/src/types/cache.d.ts +8 -0
  825. package/dist/test/src/types/cache.d.ts.map +1 -0
  826. package/dist/test/src/types/cache.js +5 -0
  827. package/dist/test/src/types/collection.d.ts +23 -0
  828. package/dist/test/src/types/collection.d.ts.map +1 -0
  829. package/dist/test/src/types/collection.js +5 -0
  830. package/dist/test/src/types/elements/IElement.d.ts +123 -0
  831. package/dist/test/src/types/elements/IElement.d.ts.map +1 -0
  832. package/dist/test/src/types/elements/IElement.js +30 -0
  833. package/dist/test/src/types/elements/IElementManager.d.ts +65 -0
  834. package/dist/test/src/types/elements/IElementManager.d.ts.map +1 -0
  835. package/dist/test/src/types/elements/IElementManager.js +6 -0
  836. package/dist/test/src/types/elements/IRatingManager.d.ts +109 -0
  837. package/dist/test/src/types/elements/IRatingManager.d.ts.map +1 -0
  838. package/dist/test/src/types/elements/IRatingManager.js +6 -0
  839. package/dist/test/src/types/elements/IReferenceResolver.d.ts +52 -0
  840. package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +1 -0
  841. package/dist/test/src/types/elements/IReferenceResolver.js +6 -0
  842. package/dist/test/src/types/elements/RatingBreakdowns.d.ts +49 -0
  843. package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +1 -0
  844. package/dist/test/src/types/elements/RatingBreakdowns.js +6 -0
  845. package/dist/test/src/types/elements/index.d.ts +9 -0
  846. package/dist/test/src/types/elements/index.d.ts.map +1 -0
  847. package/dist/test/src/types/elements/index.js +11 -0
  848. package/dist/test/src/types/index.d.ts +9 -0
  849. package/dist/test/src/types/index.d.ts.map +1 -0
  850. package/dist/test/src/types/index.js +9 -0
  851. package/dist/test/src/types/marketplace.d.ts +23 -0
  852. package/dist/test/src/types/marketplace.d.ts.map +1 -0
  853. package/dist/test/src/types/marketplace.js +5 -0
  854. package/dist/test/src/types/mcp.d.ts +84 -0
  855. package/dist/test/src/types/mcp.d.ts.map +1 -0
  856. package/dist/test/src/types/mcp.js +80 -0
  857. package/dist/test/src/types/persona.d.ts +30 -0
  858. package/dist/test/src/types/persona.d.ts.map +1 -0
  859. package/dist/test/src/types/persona.js +5 -0
  860. package/dist/test/src/update/BackupManager.d.ts +46 -0
  861. package/dist/test/src/update/BackupManager.d.ts.map +1 -0
  862. package/dist/test/src/update/BackupManager.js +261 -0
  863. package/dist/test/src/update/DependencyChecker.d.ts +41 -0
  864. package/dist/test/src/update/DependencyChecker.d.ts.map +1 -0
  865. package/dist/test/src/update/DependencyChecker.js +132 -0
  866. package/dist/test/src/update/RateLimiter.d.ts +80 -0
  867. package/dist/test/src/update/RateLimiter.d.ts.map +1 -0
  868. package/dist/test/src/update/RateLimiter.js +172 -0
  869. package/dist/test/src/update/SignatureVerifier.d.ts +71 -0
  870. package/dist/test/src/update/SignatureVerifier.d.ts.map +1 -0
  871. package/dist/test/src/update/SignatureVerifier.js +214 -0
  872. package/dist/test/src/update/UpdateChecker.d.ts +127 -0
  873. package/dist/test/src/update/UpdateChecker.d.ts.map +1 -0
  874. package/dist/test/src/update/UpdateChecker.js +469 -0
  875. package/dist/test/src/update/UpdateManager.d.ts +41 -0
  876. package/dist/test/src/update/UpdateManager.d.ts.map +1 -0
  877. package/dist/test/src/update/UpdateManager.js +260 -0
  878. package/dist/test/src/update/VersionManager.d.ts +31 -0
  879. package/dist/test/src/update/VersionManager.d.ts.map +1 -0
  880. package/dist/test/src/update/VersionManager.js +134 -0
  881. package/dist/test/src/update/index.d.ts +9 -0
  882. package/dist/test/src/update/index.d.ts.map +1 -0
  883. package/dist/test/src/update/index.js +9 -0
  884. package/dist/test/src/utils/filesystem.d.ts +29 -0
  885. package/dist/test/src/utils/filesystem.d.ts.map +1 -0
  886. package/dist/test/src/utils/filesystem.js +94 -0
  887. package/dist/test/src/utils/git.d.ts +32 -0
  888. package/dist/test/src/utils/git.d.ts.map +1 -0
  889. package/dist/test/src/utils/git.js +65 -0
  890. package/dist/test/src/utils/index.d.ts +7 -0
  891. package/dist/test/src/utils/index.d.ts.map +1 -0
  892. package/dist/test/src/utils/index.js +7 -0
  893. package/dist/test/src/utils/logger.d.ts +45 -0
  894. package/dist/test/src/utils/logger.d.ts.map +1 -0
  895. package/dist/test/src/utils/logger.js +91 -0
  896. package/dist/test/src/utils/version.d.ts +25 -0
  897. package/dist/test/src/utils/version.d.ts.map +1 -0
  898. package/dist/test/src/utils/version.js +97 -0
  899. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +33 -0
  900. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +1 -0
  901. package/dist/test/test/__tests__/integration/helpers/file-utils.js +83 -0
  902. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +26 -0
  903. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +1 -0
  904. package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +95 -0
  905. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +26 -0
  906. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +1 -0
  907. package/dist/test/test/__tests__/integration/helpers/test-server.js +41 -0
  908. package/dist/test/test/__tests__/integration/setup.d.ts +8 -0
  909. package/dist/test/test/__tests__/integration/setup.d.ts.map +1 -0
  910. package/dist/test/test/__tests__/integration/setup.js +31 -0
  911. package/dist/test/test/__tests__/integration/teardown.d.ts +5 -0
  912. package/dist/test/test/__tests__/integration/teardown.d.ts.map +1 -0
  913. package/dist/test/test/__tests__/integration/teardown.js +23 -0
  914. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +34 -0
  915. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +1 -0
  916. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +224 -0
  917. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +89 -0
  918. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +1 -0
  919. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +543 -0
  920. package/dist/test/test/__tests__/security/index.d.ts +46 -0
  921. package/dist/test/test/__tests__/security/index.d.ts.map +1 -0
  922. package/dist/test/test/__tests__/security/index.js +98 -0
  923. package/dist/test/test/__tests__/security/setup.d.ts +3 -0
  924. package/dist/test/test/__tests__/security/setup.d.ts.map +1 -0
  925. package/dist/test/test/__tests__/security/setup.js +23 -0
  926. package/dist/tools/debug.d.ts +20 -0
  927. package/dist/tools/debug.d.ts.map +1 -0
  928. package/dist/tools/debug.js +37 -0
  929. package/dist/types/cache.d.ts +8 -0
  930. package/dist/types/cache.d.ts.map +1 -0
  931. package/dist/types/cache.js +5 -0
  932. package/dist/types/collection.d.ts +23 -0
  933. package/dist/types/collection.d.ts.map +1 -0
  934. package/dist/types/collection.js +5 -0
  935. package/dist/types/elements/IElement.d.ts +123 -0
  936. package/dist/types/elements/IElement.d.ts.map +1 -0
  937. package/dist/types/elements/IElement.js +30 -0
  938. package/dist/types/elements/IElementManager.d.ts +65 -0
  939. package/dist/types/elements/IElementManager.d.ts.map +1 -0
  940. package/dist/types/elements/IElementManager.js +6 -0
  941. package/dist/types/elements/IRatingManager.d.ts +109 -0
  942. package/dist/types/elements/IRatingManager.d.ts.map +1 -0
  943. package/dist/types/elements/IRatingManager.js +6 -0
  944. package/dist/types/elements/IReferenceResolver.d.ts +52 -0
  945. package/dist/types/elements/IReferenceResolver.d.ts.map +1 -0
  946. package/dist/types/elements/IReferenceResolver.js +6 -0
  947. package/dist/types/elements/RatingBreakdowns.d.ts +49 -0
  948. package/dist/types/elements/RatingBreakdowns.d.ts.map +1 -0
  949. package/dist/types/elements/RatingBreakdowns.js +6 -0
  950. package/dist/types/elements/index.d.ts +9 -0
  951. package/dist/types/elements/index.d.ts.map +1 -0
  952. package/dist/types/elements/index.js +11 -0
  953. package/dist/types/index.d.ts +9 -0
  954. package/dist/types/index.d.ts.map +1 -0
  955. package/dist/types/index.js +9 -0
  956. package/dist/types/marketplace.d.ts +23 -0
  957. package/dist/types/marketplace.d.ts.map +1 -0
  958. package/dist/types/marketplace.js +5 -0
  959. package/dist/types/mcp.d.ts +84 -0
  960. package/dist/types/mcp.d.ts.map +1 -0
  961. package/dist/types/mcp.js +80 -0
  962. package/dist/types/persona.d.ts +30 -0
  963. package/dist/types/persona.d.ts.map +1 -0
  964. package/dist/types/persona.js +5 -0
  965. package/dist/update/BackupManager.d.ts +46 -0
  966. package/dist/update/BackupManager.d.ts.map +1 -0
  967. package/dist/update/BackupManager.js +261 -0
  968. package/dist/update/DependencyChecker.d.ts +41 -0
  969. package/dist/update/DependencyChecker.d.ts.map +1 -0
  970. package/dist/update/DependencyChecker.js +132 -0
  971. package/dist/update/RateLimiter.d.ts +80 -0
  972. package/dist/update/RateLimiter.d.ts.map +1 -0
  973. package/dist/update/RateLimiter.js +172 -0
  974. package/dist/update/SignatureVerifier.d.ts +71 -0
  975. package/dist/update/SignatureVerifier.d.ts.map +1 -0
  976. package/dist/update/SignatureVerifier.js +214 -0
  977. package/dist/update/UpdateChecker.d.ts +127 -0
  978. package/dist/update/UpdateChecker.d.ts.map +1 -0
  979. package/dist/update/UpdateChecker.js +469 -0
  980. package/dist/update/UpdateManager.d.ts +41 -0
  981. package/dist/update/UpdateManager.d.ts.map +1 -0
  982. package/dist/update/UpdateManager.js +260 -0
  983. package/dist/update/VersionManager.d.ts +31 -0
  984. package/dist/update/VersionManager.d.ts.map +1 -0
  985. package/dist/update/VersionManager.js +134 -0
  986. package/dist/update/index.d.ts +9 -0
  987. package/dist/update/index.d.ts.map +1 -0
  988. package/dist/update/index.js +9 -0
  989. package/dist/utils/filesystem.d.ts +29 -0
  990. package/dist/utils/filesystem.d.ts.map +1 -0
  991. package/dist/utils/filesystem.js +94 -0
  992. package/dist/utils/git.d.ts +32 -0
  993. package/dist/utils/git.d.ts.map +1 -0
  994. package/dist/utils/git.js +65 -0
  995. package/dist/utils/index.d.ts +7 -0
  996. package/dist/utils/index.d.ts.map +1 -0
  997. package/dist/utils/index.js +7 -0
  998. package/dist/utils/logger.d.ts +45 -0
  999. package/dist/utils/logger.d.ts.map +1 -0
  1000. package/dist/utils/logger.js +91 -0
  1001. package/dist/utils/version.d.ts +25 -0
  1002. package/dist/utils/version.d.ts.map +1 -0
  1003. package/dist/utils/version.js +97 -0
  1004. package/package.json +128 -0
@@ -0,0 +1,312 @@
1
+ /**
2
+ * Unicode Validator for DollhouseMCP
3
+ *
4
+ * Prevents Unicode-based bypass attacks including:
5
+ * - Homograph attacks (visually similar characters)
6
+ * - Direction override attacks (RLO/LRO)
7
+ * - Mixed script attacks
8
+ * - Zero-width character injection
9
+ * - Unicode normalization bypasses
10
+ *
11
+ * Security: SEC-001 - Unicode attack prevention
12
+ */
13
+ import { SecurityMonitor } from '../securityMonitor.js';
14
+ export class UnicodeValidator {
15
+ /**
16
+ * Unicode attack patterns and confusable characters
17
+ */
18
+ /**
19
+ * Direction override characters that can hide or reverse text display
20
+ * @see https://unicode.org/reports/tr9/#Directional_Formatting_Characters
21
+ * U+202A-U+202E: Left/Right embedding and override marks (LRE, RLE, PDF, LRO, RLO)
22
+ * U+2066-U+2069: Isolate formatting characters (LRI, RLI, FSI, PDI)
23
+ */
24
+ static DIRECTION_OVERRIDE_CHARS = /[\u202A-\u202E\u2066-\u2069]/g;
25
+ /**
26
+ * Zero-width and invisible formatting characters often used to hide payloads
27
+ * U+200B-U+200F: Zero-width spaces and directional marks
28
+ * U+2028-U+202F: Line/paragraph separators and formatting characters
29
+ * U+FEFF: Zero-width no-break space (Byte Order Mark)
30
+ */
31
+ static ZERO_WIDTH_CHARS = /[\u200B-\u200F\u2028-\u202F\uFEFF]/g;
32
+ /**
33
+ * Non-printable control characters that should not appear in normal text
34
+ * U+0000-U+0008, U+000B-U+000C, U+000E-U+001F: C0 control codes (except TAB, LF, CR)
35
+ * U+007F-U+009F: Delete and C1 control codes
36
+ * U+FFFE-U+FFFF: Non-characters that should never appear in valid text
37
+ */
38
+ static NON_PRINTABLE_CHARS = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F\uFFFE\uFFFF]/g;
39
+ /**
40
+ * Common homograph/confusable character mappings
41
+ * Maps visually similar Unicode characters to their ASCII equivalents
42
+ */
43
+ static CONFUSABLE_MAPPINGS = new Map([
44
+ // Cyrillic to Latin
45
+ ['а', 'a'], ['е', 'e'], ['о', 'o'], ['р', 'p'], ['с', 'c'], ['х', 'x'], ['у', 'y'],
46
+ ['А', 'A'], ['В', 'B'], ['Е', 'E'], ['К', 'K'], ['М', 'M'], ['Н', 'H'], ['О', 'O'],
47
+ ['Р', 'P'], ['С', 'C'], ['Т', 'T'], ['У', 'Y'], ['Х', 'X'],
48
+ // Greek to Latin
49
+ ['α', 'a'], ['β', 'b'], ['γ', 'g'], ['δ', 'd'], ['ε', 'e'], ['ζ', 'z'], ['η', 'h'],
50
+ ['θ', 'th'], ['ι', 'i'], ['κ', 'k'], ['λ', 'l'], ['μ', 'm'], ['ν', 'n'], ['ξ', 'x'],
51
+ ['ο', 'o'], ['π', 'p'], ['ρ', 'r'], ['σ', 's'], ['τ', 't'], ['υ', 'u'], ['φ', 'f'],
52
+ ['χ', 'ch'], ['ψ', 'ps'], ['ω', 'w'],
53
+ // Mathematical symbols to ASCII (various styles)
54
+ ['𝒂', 'a'], ['𝒃', 'b'], ['𝒄', 'c'], ['𝒅', 'd'], ['𝒆', 'e'], ['𝒇', 'f'], ['𝒈', 'g'], ['𝒉', 'h'], ['𝒊', 'i'], ['𝒋', 'j'], ['𝒌', 'k'], ['𝒍', 'l'], ['𝒎', 'm'], ['𝒏', 'n'], ['𝒐', 'o'], ['𝒑', 'p'], ['𝒒', 'q'], ['𝒓', 'r'], ['𝒔', 's'], ['𝒕', 't'], ['𝒖', 'u'], ['𝒗', 'v'], ['𝒘', 'w'], ['𝒙', 'x'], ['𝒚', 'y'], ['𝒛', 'z'],
55
+ ['𝐚', 'a'], ['𝐛', 'b'], ['𝐜', 'c'], ['𝐝', 'd'], ['𝐞', 'e'], ['𝐟', 'f'], ['𝐠', 'g'], ['𝐡', 'h'], ['𝐢', 'i'], ['𝐣', 'j'], ['𝐤', 'k'], ['𝐥', 'l'], ['𝐦', 'm'], ['𝐧', 'n'], ['𝐨', 'o'], ['𝐩', 'p'], ['𝐪', 'q'], ['𝐫', 'r'], ['𝐬', 's'], ['𝐭', 't'], ['𝐮', 'u'], ['𝐯', 'v'], ['𝐰', 'w'], ['𝐱', 'x'], ['𝐲', 'y'], ['𝐳', 'z'],
56
+ // Special i variants (Turkish, etc.)
57
+ ['ı', 'i'], ['İ', 'I'], ['і', 'i'], ['Ӏ', 'I'],
58
+ // Other common confusables
59
+ ['ǝ', 'e'], ['ɐ', 'a'], ['ɔ', 'o'], ['ʇ', 't'], ['ʌ', 'v'], ['ʍ', 'w'],
60
+ ['℃', 'C'], ['℉', 'F'], ['№', 'No'], ['™', 'TM'], ['®', 'R'],
61
+ // Fullwidth characters
62
+ ['A', 'A'], ['B', 'B'], ['C', 'C'], ['D', 'D'], ['E', 'E'], ['F', 'F'], ['G', 'G'], ['H', 'H'], ['I', 'I'], ['J', 'J'], ['K', 'K'], ['L', 'L'], ['M', 'M'], ['N', 'N'], ['O', 'O'], ['P', 'P'], ['Q', 'Q'], ['R', 'R'], ['S', 'S'], ['T', 'T'], ['U', 'U'], ['V', 'V'], ['W', 'W'], ['X', 'X'], ['Y', 'Y'], ['Z', 'Z'],
63
+ ['a', 'a'], ['b', 'b'], ['c', 'c'], ['d', 'd'], ['e', 'e'], ['f', 'f'], ['g', 'g'], ['h', 'h'], ['i', 'i'], ['j', 'j'], ['k', 'k'], ['l', 'l'], ['m', 'm'], ['n', 'n'], ['o', 'o'], ['p', 'p'], ['q', 'q'], ['r', 'r'], ['s', 's'], ['t', 't'], ['u', 'u'], ['v', 'v'], ['w', 'w'], ['x', 'x'], ['y', 'y'], ['z', 'z'],
64
+ ['0', '0'], ['1', '1'], ['2', '2'], ['3', '3'], ['4', '4'], ['5', '5'], ['6', '6'], ['7', '7'], ['8', '8'], ['9', '9'],
65
+ ]);
66
+ /**
67
+ * Script mixing detection patterns
68
+ * Detects suspicious mixing of different Unicode scripts
69
+ */
70
+ static SCRIPT_PATTERNS = {
71
+ LATIN: /[\u0000-\u007F\u00A0-\u00FF\u0100-\u017F\u0180-\u024F]/,
72
+ CYRILLIC: /[\u0400-\u04FF\u0500-\u052F\u2DE0-\u2DFF\uA640-\uA69F]/,
73
+ GREEK: /[\u0370-\u03FF\u1F00-\u1FFF]/,
74
+ ARABIC: /[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF]/,
75
+ HEBREW: /[\u0590-\u05FF\uFB1D-\uFB4F]/,
76
+ CJK: /[\u2E80-\u2EFF\u2F00-\u2FDF\u3000-\u303F\u3040-\u309F\u30A0-\u30FF\u3100-\u312F\u3130-\u318F\u3190-\u319F\u31A0-\u31BF\u31C0-\u31EF\u31F0-\u31FF\u3200-\u32FF\u3300-\u33FF\u3400-\u4DBF\u4DC0-\u4DFF\u4E00-\u9FFF]/,
77
+ };
78
+ /**
79
+ * Normalize Unicode content to prevent bypass attacks
80
+ */
81
+ static normalize(content) {
82
+ const issues = [];
83
+ let normalized = content;
84
+ let severity = 'low';
85
+ try {
86
+ // 1. Detect and log suspicious Unicode patterns before normalization
87
+ const suspiciousPatterns = this.detectSuspiciousPatterns(content);
88
+ issues.push(...suspiciousPatterns.issues);
89
+ if (suspiciousPatterns.severity) {
90
+ severity = this.escalateSeverity(severity, suspiciousPatterns.severity);
91
+ }
92
+ // 2. Remove direction override characters (prevents RLO/LRO attacks)
93
+ if (this.DIRECTION_OVERRIDE_CHARS.test(normalized)) {
94
+ issues.push('Direction override characters detected');
95
+ severity = this.escalateSeverity(severity, 'high');
96
+ normalized = normalized.replace(this.DIRECTION_OVERRIDE_CHARS, '');
97
+ SecurityMonitor.logSecurityEvent({
98
+ type: 'UNICODE_DIRECTION_OVERRIDE',
99
+ severity: 'HIGH',
100
+ source: 'unicode_validation',
101
+ details: 'Direction override characters removed from content'
102
+ });
103
+ }
104
+ // 3. Remove zero-width and non-printable characters
105
+ if (this.ZERO_WIDTH_CHARS.test(normalized) || this.NON_PRINTABLE_CHARS.test(normalized)) {
106
+ issues.push('Zero-width or non-printable characters detected');
107
+ severity = this.escalateSeverity(severity, 'medium');
108
+ normalized = normalized
109
+ .replace(this.ZERO_WIDTH_CHARS, '')
110
+ .replace(this.NON_PRINTABLE_CHARS, '');
111
+ }
112
+ // 4. Apply Unicode normalization (NFC - Canonical Decomposition + Composition)
113
+ normalized = normalized.normalize('NFC');
114
+ // 5. Detect mixed script attacks BEFORE confusable replacement
115
+ const mixedScriptResult = this.detectMixedScripts(normalized);
116
+ if (mixedScriptResult.isSuspicious) {
117
+ issues.push(`Mixed script usage detected: ${mixedScriptResult.scripts.join(', ')}`);
118
+ severity = this.escalateSeverity(severity, 'high');
119
+ SecurityMonitor.logSecurityEvent({
120
+ type: 'UNICODE_MIXED_SCRIPT',
121
+ severity: 'HIGH',
122
+ source: 'unicode_validation',
123
+ details: `Mixed scripts detected: ${mixedScriptResult.scripts.join(', ')}`
124
+ });
125
+ }
126
+ // 6. Always replace confusable characters with ASCII equivalents for security
127
+ // This prevents homograph attacks regardless of script mixing
128
+ const confusableResult = this.replaceConfusables(normalized);
129
+ if (confusableResult.hasConfusables) {
130
+ normalized = confusableResult.normalized;
131
+ issues.push('Confusable Unicode characters detected and normalized');
132
+ severity = this.escalateSeverity(severity, 'medium');
133
+ // Log if this happens in legitimate multilingual context
134
+ if (!mixedScriptResult.isSuspicious) {
135
+ SecurityMonitor.logSecurityEvent({
136
+ type: 'UNICODE_VALIDATION_ERROR',
137
+ severity: 'LOW',
138
+ source: 'unicode_validation',
139
+ details: 'Confusable characters normalized in legitimate multilingual content'
140
+ });
141
+ }
142
+ }
143
+ return {
144
+ isValid: issues.length === 0,
145
+ normalizedContent: normalized,
146
+ detectedIssues: issues.length > 0 ? issues : undefined,
147
+ severity: issues.length > 0 ? severity : undefined
148
+ };
149
+ }
150
+ catch (error) {
151
+ SecurityMonitor.logSecurityEvent({
152
+ type: 'UNICODE_VALIDATION_ERROR',
153
+ severity: 'HIGH',
154
+ source: 'unicode_validation',
155
+ details: `Unicode validation failed: ${error instanceof Error ? error.message : String(error)}`
156
+ });
157
+ // Fallback: return original content if normalization fails
158
+ return {
159
+ isValid: false,
160
+ normalizedContent: content,
161
+ detectedIssues: ['Unicode validation failed'],
162
+ severity: 'high'
163
+ };
164
+ }
165
+ }
166
+ /**
167
+ * Detect suspicious Unicode patterns that might indicate attacks
168
+ */
169
+ static detectSuspiciousPatterns(content) {
170
+ const issues = [];
171
+ let severity;
172
+ // Check for excessive Unicode escapes (possible encoding bypass)
173
+ /**
174
+ * Pattern to match Unicode escape sequences
175
+ * \\u: Literal backslash followed by 'u'
176
+ * [0-9a-fA-F]{4}: Exactly 4 hexadecimal digits
177
+ * Used to detect attempts to bypass filters using \u0061dmin style encoding
178
+ */
179
+ const unicodeEscapePattern = /\\u[0-9a-fA-F]{4}/g;
180
+ const unicodeEscapes = content.match(unicodeEscapePattern);
181
+ if (unicodeEscapes && unicodeEscapes.length > 10) {
182
+ issues.push(`Excessive Unicode escapes detected (${unicodeEscapes.length})`);
183
+ severity = 'high';
184
+ }
185
+ // Check for suspicious Unicode ranges that might hide content
186
+ const suspiciousRanges = [
187
+ { range: /[\uE000-\uF8FF]/g, name: 'Private Use Area' },
188
+ // Note: Properly paired surrogate pairs [\uD800-\uDFFF] are normal for emojis
189
+ { range: /[\uFDD0-\uFDEF]/g, name: 'Non-characters' },
190
+ { range: /[\uFFFE\uFFFF]/g, name: 'Non-characters' }
191
+ ];
192
+ for (const { range, name } of suspiciousRanges) {
193
+ if (range.test(content)) {
194
+ issues.push(`Suspicious Unicode range detected: ${name}`);
195
+ severity = this.escalateSeverity(severity, 'medium');
196
+ }
197
+ }
198
+ // Check for malformed surrogate pairs using safe character-by-character validation
199
+ // This avoids ReDoS vulnerabilities from complex regex patterns
200
+ if (this.hasMalformedSurrogates(content)) {
201
+ issues.push('Malformed surrogate pairs detected');
202
+ severity = this.escalateSeverity(severity, 'high');
203
+ }
204
+ return { issues, severity };
205
+ }
206
+ /**
207
+ * Replace confusable Unicode characters with ASCII equivalents
208
+ */
209
+ static replaceConfusables(content) {
210
+ let normalized = content;
211
+ let hasConfusables = false;
212
+ for (const [confusable, replacement] of this.CONFUSABLE_MAPPINGS) {
213
+ if (normalized.includes(confusable)) {
214
+ normalized = normalized.replace(new RegExp(this.escapeRegex(confusable), 'g'), replacement);
215
+ hasConfusables = true;
216
+ }
217
+ }
218
+ return { normalized, hasConfusables };
219
+ }
220
+ /**
221
+ * Detect suspicious mixing of different Unicode scripts
222
+ */
223
+ static detectMixedScripts(content) {
224
+ const detectedScripts = [];
225
+ for (const [scriptName, pattern] of Object.entries(this.SCRIPT_PATTERNS)) {
226
+ if (pattern.test(content)) {
227
+ detectedScripts.push(scriptName);
228
+ }
229
+ }
230
+ // Consider it suspicious if:
231
+ // 1. More than 3 scripts are mixed (legitimate text rarely mixes >3 scripts)
232
+ // 2. Content contains Latin + dangerous confusable scripts (Cyrillic/Greek - common attack pattern)
233
+ // Note: Latin + CJK is common and legitimate (e.g., Chinese with English)
234
+ const isSuspicious = detectedScripts.length > 3 ||
235
+ (detectedScripts.includes('LATIN') && detectedScripts.length > 1 &&
236
+ (detectedScripts.includes('CYRILLIC') || detectedScripts.includes('GREEK')));
237
+ return { isSuspicious, scripts: detectedScripts };
238
+ }
239
+ /**
240
+ * Escalate severity level (higher severity takes precedence)
241
+ */
242
+ static escalateSeverity(current, newSeverity) {
243
+ const severityLevels = { low: 1, medium: 2, high: 3, critical: 4 };
244
+ const currentLevel = current ? severityLevels[current] : 0;
245
+ const newLevel = severityLevels[newSeverity];
246
+ return newLevel > currentLevel ? newSeverity : (current || 'low');
247
+ }
248
+ /**
249
+ * Escape special regex characters for safe replacement
250
+ */
251
+ static escapeRegex(string) {
252
+ return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
253
+ }
254
+ /**
255
+ * Check if content contains potentially dangerous Unicode patterns
256
+ */
257
+ static containsDangerousUnicode(content) {
258
+ // Quick check for obviously dangerous patterns
259
+ return this.DIRECTION_OVERRIDE_CHARS.test(content) ||
260
+ this.ZERO_WIDTH_CHARS.test(content) ||
261
+ this.NON_PRINTABLE_CHARS.test(content) ||
262
+ this.hasExcessiveUnicodeEscapes(content);
263
+ }
264
+ /**
265
+ * Check if content has excessive Unicode escape sequences
266
+ * Prevents null pointer exception by safely checking match results
267
+ */
268
+ static hasExcessiveUnicodeEscapes(content) {
269
+ const matches = content.match(/\\u[0-9a-fA-F]{4}/g);
270
+ return matches !== null && matches.length > 10;
271
+ }
272
+ /**
273
+ * Safely check for malformed surrogate pairs without ReDoS vulnerability
274
+ * Uses character-by-character validation instead of complex regex
275
+ */
276
+ static hasMalformedSurrogates(content) {
277
+ for (let i = 0; i < content.length; i++) {
278
+ const char = content.charCodeAt(i);
279
+ // High surrogate (U+D800-U+DBFF)
280
+ if (char >= 0xD800 && char <= 0xDBFF) {
281
+ // Check if it's followed by a low surrogate
282
+ if (i + 1 >= content.length) {
283
+ return true; // High surrogate at end of string
284
+ }
285
+ const nextChar = content.charCodeAt(i + 1);
286
+ if (nextChar < 0xDC00 || nextChar > 0xDFFF) {
287
+ return true; // High surrogate not followed by low surrogate
288
+ }
289
+ i++; // Skip the valid low surrogate
290
+ }
291
+ // Low surrogate (U+DC00-U+DFFF) without preceding high surrogate
292
+ else if (char >= 0xDC00 && char <= 0xDFFF) {
293
+ return true; // Unpaired low surrogate
294
+ }
295
+ }
296
+ return false;
297
+ }
298
+ /**
299
+ * Get safe preview of Unicode content for logging
300
+ */
301
+ static getSafePreview(content, maxLength = 100) {
302
+ // Remove dangerous Unicode characters and truncate for safe logging
303
+ const cleaned = content
304
+ .replace(this.DIRECTION_OVERRIDE_CHARS, '[DIR]')
305
+ .replace(this.ZERO_WIDTH_CHARS, '[ZW]')
306
+ .replace(this.NON_PRINTABLE_CHARS, '[NP]');
307
+ return cleaned.length > maxLength ?
308
+ cleaned.substring(0, maxLength) + '...' :
309
+ cleaned;
310
+ }
311
+ }
312
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pY29kZVZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFTeEQsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQjs7T0FFRztJQUVIOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFVLHdCQUF3QixHQUFHLCtCQUErQixDQUFDO0lBRW5GOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFVLGdCQUFnQixHQUFHLHFDQUFxQyxDQUFDO0lBRWpGOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFVLG1CQUFtQixHQUFHLG9FQUFvRSxDQUFDO0lBRW5IOzs7T0FHRztJQUNLLE1BQU0sQ0FBVSxtQkFBbUIsR0FBd0IsSUFBSSxHQUFHLENBQUM7UUFDekUsb0JBQW9CO1FBQ3BCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNsRixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDbEYsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBRTFELGlCQUFpQjtRQUNqQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDbEYsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ25GLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNsRixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFFcEMsaURBQWlEO1FBQ2pELENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztRQUNoVixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7UUFFaFYscUNBQXFDO1FBQ3JDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUU5QywyQkFBMkI7UUFDM0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ3RFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUU1RCx1QkFBdUI7UUFDdkIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ3RULENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxF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SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBZSxFQUFFLFlBQW9CLEdBQUc7UUFDNUQsb0VBQW9FO1FBQ3BFLE1BQU0sT0FBTyxHQUFHLE9BQU87YUFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUM7YUFDL0MsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUM7YUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU3QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDekMsT0FBTyxDQUFDO0lBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVW5pY29kZSBWYWxpZGF0b3IgZm9yIERvbGxob3VzZU1DUFxuICogXG4gKiBQcmV2ZW50cyBVbmljb2RlLWJhc2VkIGJ5cGFzcyBhdHRhY2tzIGluY2x1ZGluZzpcbiAqIC0gSG9tb2dyYXBoIGF0dGFja3MgKHZpc3VhbGx5IHNpbWlsYXIgY2hhcmFjdGVycylcbiAqIC0gRGlyZWN0aW9uIG92ZXJyaWRlIGF0dGFja3MgKFJMTy9MUk8pXG4gKiAtIE1peGVkIHNjcmlwdCBhdHRhY2tzXG4gKiAtIFplcm8td2lkdGggY2hhcmFjdGVyIGluamVjdGlvblxuICogLSBVbmljb2RlIG5vcm1hbGl6YXRpb24gYnlwYXNzZXNcbiAqIFxuICogU2VjdXJpdHk6IFNFQy0wMDEgLSBVbmljb2RlIGF0dGFjayBwcmV2ZW50aW9uXG4gKi9cblxuaW1wb3J0IHsgU2VjdXJpdHlFcnJvciB9IGZyb20gJy4uL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eU1vbml0b3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVuaWNvZGVWYWxpZGF0aW9uUmVzdWx0IHtcbiAgaXNWYWxpZDogYm9vbGVhbjtcbiAgbm9ybWFsaXplZENvbnRlbnQ6IHN0cmluZztcbiAgZGV0ZWN0ZWRJc3N1ZXM/OiBzdHJpbmdbXTtcbiAgc2V2ZXJpdHk/OiAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ2NyaXRpY2FsJztcbn1cblxuZXhwb3J0IGNsYXNzIFVuaWNvZGVWYWxpZGF0b3Ige1xuICAvKipcbiAgICogVW5pY29kZSBhdHRhY2sgcGF0dGVybnMgYW5kIGNvbmZ1c2FibGUgY2hhcmFjdGVyc1xuICAgKi9cbiAgXG4gIC8qKlxuICAgKiBEaXJlY3Rpb24gb3ZlcnJpZGUgY2hhcmFjdGVycyB0aGF0IGNhbiBoaWRlIG9yIHJldmVyc2UgdGV4dCBkaXNwbGF5XG4gICAqIEBzZWUgaHR0cHM6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyOS8jRGlyZWN0aW9uYWxfRm9ybWF0dGluZ19DaGFyYWN0ZXJzXG4gICAqIFUrMjAyQS1VKzIwMkU6IExlZnQvUmlnaHQgZW1iZWRkaW5nIGFuZCBvdmVycmlkZSBtYXJrcyAoTFJFLCBSTEUsIFBERiwgTFJPLCBSTE8pXG4gICAqIFUrMjA2Ni1VKzIwNjk6IElzb2xhdGUgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIChMUkksIFJMSSwgRlNJLCBQREkpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBESVJFQ1RJT05fT1ZFUlJJREVfQ0hBUlMgPSAvW1xcdTIwMkEtXFx1MjAyRVxcdTIwNjYtXFx1MjA2OV0vZztcbiAgXG4gIC8qKlxuICAgKiBaZXJvLXdpZHRoIGFuZCBpbnZpc2libGUgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIG9mdGVuIHVzZWQgdG8gaGlkZSBwYXlsb2Fkc1xuICAgKiBVKzIwMEItVSsyMDBGOiBaZXJvLXdpZHRoIHNwYWNlcyBhbmQgZGlyZWN0aW9uYWwgbWFya3NcbiAgICogVSsyMDI4LVUrMjAyRjogTGluZS9wYXJhZ3JhcGggc2VwYXJhdG9ycyBhbmQgZm9ybWF0dGluZyBjaGFyYWN0ZXJzXG4gICAqIFUrRkVGRjogWmVyby13aWR0aCBuby1icmVhayBzcGFjZSAoQnl0ZSBPcmRlciBNYXJrKVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgWkVST19XSURUSF9DSEFSUyA9IC9bXFx1MjAwQi1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1RkVGRl0vZztcbiAgXG4gIC8qKlxuICAgKiBOb24tcHJpbnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBub3QgYXBwZWFyIGluIG5vcm1hbCB0ZXh0XG4gICAqIFUrMDAwMC1VKzAwMDgsIFUrMDAwQi1VKzAwMEMsIFUrMDAwRS1VKzAwMUY6IEMwIGNvbnRyb2wgY29kZXMgKGV4Y2VwdCBUQUIsIExGLCBDUilcbiAgICogVSswMDdGLVUrMDA5RjogRGVsZXRlIGFuZCBDMSBjb250cm9sIGNvZGVzXG4gICAqIFUrRkZGRS1VK0ZGRkY6IE5vbi1jaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIG5ldmVyIGFwcGVhciBpbiB2YWxpZCB0ZXh0XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBOT05fUFJJTlRBQkxFX0NIQVJTID0gL1tcXHUwMDAwLVxcdTAwMDhcXHUwMDBCXFx1MDAwQ1xcdTAwMEUtXFx1MDAxRlxcdTAwN0YtXFx1MDA5RlxcdUZGRkVcXHVGRkZGXS9nO1xuICBcbiAgLyoqXG4gICAqIENvbW1vbiBob21vZ3JhcGgvY29uZnVzYWJsZSBjaGFyYWN0ZXIgbWFwcGluZ3NcbiAgICogTWFwcyB2aXN1YWxseSBzaW1pbGFyIFVuaWNvZGUgY2hhcmFjdGVycyB0byB0aGVpciBBU0NJSSBlcXVpdmFsZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ09ORlVTQUJMRV9NQVBQSU5HUzogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoW1xuICAgIC8vIEN5cmlsbGljIHRvIExhdGluXG4gICAgWyfQsCcsICdhJ10sIFsn0LUnLCAnZSddLCBbJ9C+JywgJ28nXSwgWyfRgCcsICdwJ10sIFsn0YEnLCAnYyddLCBbJ9GFJywgJ3gnXSwgWyfRgycsICd5J10sXG4gICAgWyfQkCcsICdBJ10sIFsn0JInLCAnQiddLCBbJ9CVJywgJ0UnXSwgWyfQmicsICdLJ10sIFsn0JwnLCAnTSddLCBbJ9CdJywgJ0gnXSwgWyfQnicsICdPJ10sIFxuICAgIFsn0KAnLCAnUCddLCBbJ9ChJywgJ0MnXSwgWyfQoicsICdUJ10sIFsn0KMnLCAnWSddLCBbJ9ClJywgJ1gnXSxcbiAgICBcbiAgICAvLyBHcmVlayB0byBMYXRpblxuICAgIFsnzrEnLCAnYSddLCBbJ86yJywgJ2InXSwgWyfOsycsICdnJ10sIFsnzrQnLCAnZCddLCBbJ861JywgJ2UnXSwgWyfOticsICd6J10sIFsnzrcnLCAnaCddLFxuICAgIFsnzrgnLCAndGgnXSwgWyfOuScsICdpJ10sIFsnzronLCAnayddLCBbJ867JywgJ2wnXSwgWyfOvCcsICdtJ10sIFsnzr0nLCAnbiddLCBbJ86+JywgJ3gnXSxcbiAgICBbJ86/JywgJ28nXSwgWyfPgCcsICdwJ10sIFsnz4EnLCAnciddLCBbJ8+DJywgJ3MnXSwgWyfPhCcsICd0J10sIFsnz4UnLCAndSddLCBbJ8+GJywgJ2YnXSxcbiAgICBbJ8+HJywgJ2NoJ10sIFsnz4gnLCAncHMnXSwgWyfPiScsICd3J10sXG4gICAgXG4gICAgLy8gTWF0aGVtYXRpY2FsIHN5bWJvbHMgdG8gQVNDSUkgKHZhcmlvdXMgc3R5bGVzKVxuICAgIFsn8J2SgicsICdhJ10sIFsn8J2SgycsICdiJ10sIFsn8J2ShCcsICdjJ10sIFsn8J2ShScsICdkJ10sIFsn8J2ShicsICdlJ10sIFsn8J2ShycsICdmJ10sIFsn8J2SiCcsICdnJ10sIFsn8J2SiScsICdoJ10sIFsn8J2SiicsICdpJ10sIFsn8J2SiycsICdqJ10sIFsn8J2SjCcsICdrJ10sIFsn8J2SjScsICdsJ10sIFsn8J2SjicsICdtJ10sIFsn8J2SjycsICduJ10sIFsn8J2SkCcsICdvJ10sIFsn8J2SkScsICdwJ10sIFsn8J2SkicsICdxJ10sIFsn8J2SkycsICdyJ10sIFsn8J2SlCcsICdzJ10sIFsn8J2SlScsICd0J10sIFsn8J2SlicsICd1J10sIFsn8J2SlycsICd2J10sIFsn8J2SmCcsICd3J10sIFsn8J2SmScsICd4J10sIFsn8J2SmicsICd5J10sIFsn8J2SmycsICd6J10sXG4gICAgWyfwnZCaJywgJ2EnXSwgWyfwnZCbJywgJ2InXSwgWyfwnZCcJywgJ2MnXSwgWyfwnZCdJywgJ2QnXSwgWyfwnZCeJywgJ2UnXSwgWyfwnZCfJywgJ2YnXSwgWyfwnZCgJywgJ2cnXSwgWyfwnZChJywgJ2gnXSwgWyfwnZCiJywgJ2knXSwgWyfwnZCjJywgJ2onXSwgWyfwnZCkJywgJ2snXSwgWyfwnZClJywgJ2wnXSwgWyfwnZCmJywgJ20nXSwgWyfwnZCnJywgJ24nXSwgWyfwnZCoJywgJ28nXSwgWyfwnZCpJywgJ3AnXSwgWyfwnZCqJywgJ3EnXSwgWyfwnZCrJywgJ3InXSwgWyfwnZCsJywgJ3MnXSwgWyfwnZCtJywgJ3QnXSwgWyfwnZCuJywgJ3UnXSwgWyfwnZCvJywgJ3YnXSwgWyfwnZCwJywgJ3cnXSwgWyfwnZCxJywgJ3gnXSwgWyfwnZCyJywgJ3knXSwgWyfwnZCzJywgJ3onXSxcbiAgICBcbiAgICAvLyBTcGVjaWFsIGkgdmFyaWFudHMgKFR1cmtpc2gsIGV0Yy4pXG4gICAgWyfEsScsICdpJ10sIFsnxLAnLCAnSSddLCBbJ9GWJywgJ2knXSwgWyfTgCcsICdJJ10sXG4gICAgXG4gICAgLy8gT3RoZXIgY29tbW9uIGNvbmZ1c2FibGVzXG4gICAgWyfHnScsICdlJ10sIFsnyZAnLCAnYSddLCBbJ8mUJywgJ28nXSwgWyfKhycsICd0J10sIFsnyownLCAndiddLCBbJ8qNJywgJ3cnXSxcbiAgICBbJ+KEgycsICdDJ10sIFsn4oSJJywgJ0YnXSwgWyfihJYnLCAnTm8nXSwgWyfihKInLCAnVE0nXSwgWyfCricsICdSJ10sXG4gICAgXG4gICAgLy8gRnVsbHdpZHRoIGNoYXJhY3RlcnNcbiAgICBbJ++8oScsICdBJ10sIFsn77yiJywgJ0InXSwgWyfvvKMnLCAnQyddLCBbJ++8pCcsICdEJ10sIFsn77ylJywgJ0UnXSwgWyfvvKYnLCAnRiddLCBbJ++8pycsICdHJ10sIFsn77yoJywgJ0gnXSwgWyfvvKknLCAnSSddLCBbJ++8qicsICdKJ10sIFsn77yrJywgJ0snXSwgWyfvvKwnLCAnTCddLCBbJ++8rScsICdNJ10sIFsn77yuJywgJ04nXSwgWyfvvK8nLCAnTyddLCBbJ++8sCcsICdQJ10sIFsn77yxJywgJ1EnXSwgWyfvvLInLCAnUiddLCBbJ++8sycsICdTJ10sIFsn77y0JywgJ1QnXSwgWyfvvLUnLCAnVSddLCBbJ++8ticsICdWJ10sIFsn77y3JywgJ1cnXSwgWyfvvLgnLCAnWCddLCBbJ++8uScsICdZJ10sIFsn77y6JywgJ1onXSxcbiAgICBbJ++9gScsICdhJ10sIFsn772CJywgJ2InXSwgWyfvvYMnLCAnYyddLCBbJ++9hCcsICdkJ10sIFsn772FJywgJ2UnXSwgWyfvvYYnLCAnZiddLCBbJ++9hycsICdnJ10sIFsn772IJywgJ2gnXSwgWyfvvYknLCAnaSddLCBbJ++9iicsICdqJ10sIFsn772LJywgJ2snXSwgWyfvvYwnLCAnbCddLCBbJ++9jScsICdtJ10sIFsn772OJywgJ24nXSwgWyfvvY8nLCAnbyddLCBbJ++9kCcsICdwJ10sIFsn772RJywgJ3EnXSwgWyfvvZInLCAnciddLCBbJ++9kycsICdzJ10sIFsn772UJywgJ3QnXSwgWyfvvZUnLCAndSddLCBbJ++9licsICd2J10sIFsn772XJywgJ3cnXSwgWyfvvZgnLCAneCddLCBbJ++9mScsICd5J10sIFsn772aJywgJ3onXSxcbiAgICBbJ++8kCcsICcwJ10sIFsn77yRJywgJzEnXSwgWyfvvJInLCAnMiddLCBbJ++8kycsICczJ10sIFsn77yUJywgJzQnXSwgWyfvvJUnLCAnNSddLCBbJ++8licsICc2J10sIFsn77yXJywgJzcnXSwgWyfvvJgnLCAnOCddLCBbJ++8mScsICc5J10sXG4gIF0pO1xuXG4gIC8qKlxuICAgKiBTY3JpcHQgbWl4aW5nIGRldGVjdGlvbiBwYXR0ZXJuc1xuICAgKiBEZXRlY3RzIHN1c3BpY2lvdXMgbWl4aW5nIG9mIGRpZmZlcmVudCBVbmljb2RlIHNjcmlwdHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNDUklQVF9QQVRURVJOUyA9IHtcbiAgICBMQVRJTjogL1tcXHUwMDAwLVxcdTAwN0ZcXHUwMEEwLVxcdTAwRkZcXHUwMTAwLVxcdTAxN0ZcXHUwMTgwLVxcdTAyNEZdLyxcbiAgICBDWVJJTExJQzogL1tcXHUwNDAwLVxcdTA0RkZcXHUwNTAwLVxcdTA1MkZcXHUyREUwLVxcdTJERkZcXHVBNjQwLVxcdUE2OUZdLyxcbiAgICBHUkVFSzogL1tcXHUwMzcwLVxcdTAzRkZcXHUxRjAwLVxcdTFGRkZdLyxcbiAgICBBUkFCSUM6IC9bXFx1MDYwMC1cXHUwNkZGXFx1MDc1MC1cXHUwNzdGXFx1MDhBMC1cXHUwOEZGXFx1RkI1MC1cXHVGREZGXFx1RkU3MC1cXHVGRUZGXS8sXG4gICAgSEVCUkVXOiAvW1xcdTA1OTAtXFx1MDVGRlxcdUZCMUQtXFx1RkI0Rl0vLFxuICAgIENKSzogL1tcXHUyRTgwLVxcdTJFRkZcXHUyRjAwLVxcdTJGREZcXHUzMDAwLVxcdTMwM0ZcXHUzMDQwLVxcdTMwOUZcXHUzMEEwLVxcdTMwRkZcXHUzMTAwLVxcdTMxMkZcXHUzMTMwLVxcdTMxOEZcXHUzMTkwLVxcdTMxOUZcXHUzMUEwLVxcdTMxQkZcXHUzMUMwLVxcdTMxRUZcXHUzMUYwLVxcdTMxRkZcXHUzMjAwLVxcdTMyRkZcXHUzMzAwLVxcdTMzRkZcXHUzNDAwLVxcdTREQkZcXHU0REMwLVxcdTRERkZcXHU0RTAwLVxcdTlGRkZdLyxcbiAgfTtcblxuICAvKipcbiAgICogTm9ybWFsaXplIFVuaWNvZGUgY29udGVudCB0byBwcmV2ZW50IGJ5cGFzcyBhdHRhY2tzXG4gICAqL1xuICBzdGF0aWMgbm9ybWFsaXplKGNvbnRlbnQ6IHN0cmluZyk6IFVuaWNvZGVWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG5vcm1hbGl6ZWQgPSBjb250ZW50O1xuICAgIGxldCBzZXZlcml0eTogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCcgPSAnbG93JztcblxuICAgIHRyeSB7XG4gICAgICAvLyAxLiBEZXRlY3QgYW5kIGxvZyBzdXNwaWNpb3VzIFVuaWNvZGUgcGF0dGVybnMgYmVmb3JlIG5vcm1hbGl6YXRpb25cbiAgICAgIGNvbnN0IHN1c3BpY2lvdXNQYXR0ZXJucyA9IHRoaXMuZGV0ZWN0U3VzcGljaW91c1BhdHRlcm5zKGNvbnRlbnQpO1xuICAgICAgaXNzdWVzLnB1c2goLi4uc3VzcGljaW91c1BhdHRlcm5zLmlzc3Vlcyk7XG4gICAgICBpZiAoc3VzcGljaW91c1BhdHRlcm5zLnNldmVyaXR5KSB7XG4gICAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCBzdXNwaWNpb3VzUGF0dGVybnMuc2V2ZXJpdHkpO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBSZW1vdmUgZGlyZWN0aW9uIG92ZXJyaWRlIGNoYXJhY3RlcnMgKHByZXZlbnRzIFJMTy9MUk8gYXR0YWNrcylcbiAgICAgIGlmICh0aGlzLkRJUkVDVElPTl9PVkVSUklERV9DSEFSUy50ZXN0KG5vcm1hbGl6ZWQpKSB7XG4gICAgICAgIGlzc3Vlcy5wdXNoKCdEaXJlY3Rpb24gb3ZlcnJpZGUgY2hhcmFjdGVycyBkZXRlY3RlZCcpO1xuICAgICAgICBzZXZlcml0eSA9IHRoaXMuZXNjYWxhdGVTZXZlcml0eShzZXZlcml0eSwgJ2hpZ2gnKTtcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSh0aGlzLkRJUkVDVElPTl9PVkVSUklERV9DSEFSUywgJycpO1xuICAgICAgICBcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdVTklDT0RFX0RJUkVDVElPTl9PVkVSUklERScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICd1bmljb2RlX3ZhbGlkYXRpb24nLFxuICAgICAgICAgIGRldGFpbHM6ICdEaXJlY3Rpb24gb3ZlcnJpZGUgY2hhcmFjdGVycyByZW1vdmVkIGZyb20gY29udGVudCdcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFJlbW92ZSB6ZXJvLXdpZHRoIGFuZCBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnNcbiAgICAgIGlmICh0aGlzLlpFUk9fV0lEVEhfQ0hBUlMudGVzdChub3JtYWxpemVkKSB8fCB0aGlzLk5PTl9QUklOVEFCTEVfQ0hBUlMudGVzdChub3JtYWxpemVkKSkge1xuICAgICAgICBpc3N1ZXMucHVzaCgnWmVyby13aWR0aCBvciBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgZGV0ZWN0ZWQnKTtcbiAgICAgICAgc2V2ZXJpdHkgPSB0aGlzLmVzY2FsYXRlU2V2ZXJpdHkoc2V2ZXJpdHksICdtZWRpdW0nKTtcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWRcbiAgICAgICAgICAucmVwbGFjZSh0aGlzLlpFUk9fV0lEVEhfQ0hBUlMsICcnKVxuICAgICAgICAgIC5yZXBsYWNlKHRoaXMuTk9OX1BSSU5UQUJMRV9DSEFSUywgJycpO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBBcHBseSBVbmljb2RlIG5vcm1hbGl6YXRpb24gKE5GQyAtIENhbm9uaWNhbCBEZWNvbXBvc2l0aW9uICsgQ29tcG9zaXRpb24pXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5ub3JtYWxpemUoJ05GQycpO1xuXG4gICAgICAvLyA1LiBEZXRlY3QgbWl4ZWQgc2NyaXB0IGF0dGFja3MgQkVGT1JFIGNvbmZ1c2FibGUgcmVwbGFjZW1lbnRcbiAgICAgIGNvbnN0IG1peGVkU2NyaXB0UmVzdWx0ID0gdGhpcy5kZXRlY3RNaXhlZFNjcmlwdHMobm9ybWFsaXplZCk7XG4gICAgICBpZiAobWl4ZWRTY3JpcHRSZXN1bHQuaXNTdXNwaWNpb3VzKSB7XG4gICAgICAgIGlzc3Vlcy5wdXNoKGBNaXhlZCBzY3JpcHQgdXNhZ2UgZGV0ZWN0ZWQ6ICR7bWl4ZWRTY3JpcHRSZXN1bHQuc2NyaXB0cy5qb2luKCcsICcpfWApO1xuICAgICAgICBzZXZlcml0eSA9IHRoaXMuZXNjYWxhdGVTZXZlcml0eShzZXZlcml0eSwgJ2hpZ2gnKTtcbiAgICAgICAgXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVU5JQ09ERV9NSVhFRF9TQ1JJUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgc291cmNlOiAndW5pY29kZV92YWxpZGF0aW9uJyxcbiAgICAgICAgICBkZXRhaWxzOiBgTWl4ZWQgc2NyaXB0cyBkZXRlY3RlZDogJHttaXhlZFNjcmlwdFJlc3VsdC5zY3JpcHRzLmpvaW4oJywgJyl9YFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gNi4gQWx3YXlzIHJlcGxhY2UgY29uZnVzYWJsZSBjaGFyYWN0ZXJzIHdpdGggQVNDSUkgZXF1aXZhbGVudHMgZm9yIHNlY3VyaXR5XG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGhvbW9ncmFwaCBhdHRhY2tzIHJlZ2FyZGxlc3Mgb2Ygc2NyaXB0IG1peGluZ1xuICAgICAgY29uc3QgY29uZnVzYWJsZVJlc3VsdCA9IHRoaXMucmVwbGFjZUNvbmZ1c2FibGVzKG5vcm1hbGl6ZWQpO1xuICAgICAgaWYgKGNvbmZ1c2FibGVSZXN1bHQuaGFzQ29uZnVzYWJsZXMpIHtcbiAgICAgICAgbm9ybWFsaXplZCA9IGNvbmZ1c2FibGVSZXN1bHQubm9ybWFsaXplZDtcbiAgICAgICAgaXNzdWVzLnB1c2goJ0NvbmZ1c2FibGUgVW5pY29kZSBjaGFyYWN0ZXJzIGRldGVjdGVkIGFuZCBub3JtYWxpemVkJyk7XG4gICAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCAnbWVkaXVtJyk7XG4gICAgICAgIFxuICAgICAgICAvLyBMb2cgaWYgdGhpcyBoYXBwZW5zIGluIGxlZ2l0aW1hdGUgbXVsdGlsaW5ndWFsIGNvbnRleHRcbiAgICAgICAgaWYgKCFtaXhlZFNjcmlwdFJlc3VsdC5pc1N1c3BpY2lvdXMpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVU5JQ09ERV9WQUxJREFUSU9OX0VSUk9SJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ3VuaWNvZGVfdmFsaWRhdGlvbicsXG4gICAgICAgICAgICBkZXRhaWxzOiAnQ29uZnVzYWJsZSBjaGFyYWN0ZXJzIG5vcm1hbGl6ZWQgaW4gbGVnaXRpbWF0ZSBtdWx0aWxpbmd1YWwgY29udGVudCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBpc3N1ZXMubGVuZ3RoID09PSAwLFxuICAgICAgICBub3JtYWxpemVkQ29udGVudDogbm9ybWFsaXplZCxcbiAgICAgICAgZGV0ZWN0ZWRJc3N1ZXM6IGlzc3Vlcy5sZW5ndGggPiAwID8gaXNzdWVzIDogdW5kZWZpbmVkLFxuICAgICAgICBzZXZlcml0eTogaXNzdWVzLmxlbmd0aCA+IDAgPyBzZXZlcml0eSA6IHVuZGVmaW5lZFxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICd1bmljb2RlX3ZhbGlkYXRpb24nLFxuICAgICAgICBkZXRhaWxzOiBgVW5pY29kZSB2YWxpZGF0aW9uIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZhbGxiYWNrOiByZXR1cm4gb3JpZ2luYWwgY29udGVudCBpZiBub3JtYWxpemF0aW9uIGZhaWxzXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgbm9ybWFsaXplZENvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgIGRldGVjdGVkSXNzdWVzOiBbJ1VuaWNvZGUgdmFsaWRhdGlvbiBmYWlsZWQnXSxcbiAgICAgICAgc2V2ZXJpdHk6ICdoaWdoJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHN1c3BpY2lvdXMgVW5pY29kZSBwYXR0ZXJucyB0aGF0IG1pZ2h0IGluZGljYXRlIGF0dGFja3NcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRldGVjdFN1c3BpY2lvdXNQYXR0ZXJucyhjb250ZW50OiBzdHJpbmcpOiB7IGlzc3Vlczogc3RyaW5nW107IHNldmVyaXR5PzogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCcgfSB7XG4gICAgY29uc3QgaXNzdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBzZXZlcml0eTogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCcgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBDaGVjayBmb3IgZXhjZXNzaXZlIFVuaWNvZGUgZXNjYXBlcyAocG9zc2libGUgZW5jb2RpbmcgYnlwYXNzKVxuICAgIC8qKlxuICAgICAqIFBhdHRlcm4gdG8gbWF0Y2ggVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzXG4gICAgICogXFxcXHU6IExpdGVyYWwgYmFja3NsYXNoIGZvbGxvd2VkIGJ5ICd1J1xuICAgICAqIFswLTlhLWZBLUZdezR9OiBFeGFjdGx5IDQgaGV4YWRlY2ltYWwgZGlnaXRzXG4gICAgICogVXNlZCB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gYnlwYXNzIGZpbHRlcnMgdXNpbmcgXFx1MDA2MWRtaW4gc3R5bGUgZW5jb2RpbmdcbiAgICAgKi9cbiAgICBjb25zdCB1bmljb2RlRXNjYXBlUGF0dGVybiA9IC9cXFxcdVswLTlhLWZBLUZdezR9L2c7XG4gICAgY29uc3QgdW5pY29kZUVzY2FwZXMgPSBjb250ZW50Lm1hdGNoKHVuaWNvZGVFc2NhcGVQYXR0ZXJuKTtcbiAgICBpZiAodW5pY29kZUVzY2FwZXMgJiYgdW5pY29kZUVzY2FwZXMubGVuZ3RoID4gMTApIHtcbiAgICAgIGlzc3Vlcy5wdXNoKGBFeGNlc3NpdmUgVW5pY29kZSBlc2NhcGVzIGRldGVjdGVkICgke3VuaWNvZGVFc2NhcGVzLmxlbmd0aH0pYCk7XG4gICAgICBzZXZlcml0eSA9ICdoaWdoJztcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3Igc3VzcGljaW91cyBVbmljb2RlIHJhbmdlcyB0aGF0IG1pZ2h0IGhpZGUgY29udGVudFxuICAgIGNvbnN0IHN1c3BpY2lvdXNSYW5nZXMgPSBbXG4gICAgICB7IHJhbmdlOiAvW1xcdUUwMDAtXFx1RjhGRl0vZywgbmFtZTogJ1ByaXZhdGUgVXNlIEFyZWEnIH0sXG4gICAgICAvLyBOb3RlOiBQcm9wZXJseSBwYWlyZWQgc3Vycm9nYXRlIHBhaXJzIFtcXHVEODAwLVxcdURGRkZdIGFyZSBub3JtYWwgZm9yIGVtb2ppc1xuICAgICAgeyByYW5nZTogL1tcXHVGREQwLVxcdUZERUZdL2csIG5hbWU6ICdOb24tY2hhcmFjdGVycycgfSxcbiAgICAgIHsgcmFuZ2U6IC9bXFx1RkZGRVxcdUZGRkZdL2csIG5hbWU6ICdOb24tY2hhcmFjdGVycycgfVxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHsgcmFuZ2UsIG5hbWUgfSBvZiBzdXNwaWNpb3VzUmFuZ2VzKSB7XG4gICAgICBpZiAocmFuZ2UudGVzdChjb250ZW50KSkge1xuICAgICAgICBpc3N1ZXMucHVzaChgU3VzcGljaW91cyBVbmljb2RlIHJhbmdlIGRldGVjdGVkOiAke25hbWV9YCk7XG4gICAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCAnbWVkaXVtJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIG1hbGZvcm1lZCBzdXJyb2dhdGUgcGFpcnMgdXNpbmcgc2FmZSBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIHZhbGlkYXRpb25cbiAgICAvLyBUaGlzIGF2b2lkcyBSZURvUyB2dWxuZXJhYmlsaXRpZXMgZnJvbSBjb21wbGV4IHJlZ2V4IHBhdHRlcm5zXG4gICAgaWYgKHRoaXMuaGFzTWFsZm9ybWVkU3Vycm9nYXRlcyhjb250ZW50KSkge1xuICAgICAgaXNzdWVzLnB1c2goJ01hbGZvcm1lZCBzdXJyb2dhdGUgcGFpcnMgZGV0ZWN0ZWQnKTtcbiAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCAnaGlnaCcpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGlzc3Vlcywgc2V2ZXJpdHkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGNvbmZ1c2FibGUgVW5pY29kZSBjaGFyYWN0ZXJzIHdpdGggQVNDSUkgZXF1aXZhbGVudHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlcGxhY2VDb25mdXNhYmxlcyhjb250ZW50OiBzdHJpbmcpOiB7IG5vcm1hbGl6ZWQ6IHN0cmluZzsgaGFzQ29uZnVzYWJsZXM6IGJvb2xlYW4gfSB7XG4gICAgbGV0IG5vcm1hbGl6ZWQgPSBjb250ZW50O1xuICAgIGxldCBoYXNDb25mdXNhYmxlcyA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBbY29uZnVzYWJsZSwgcmVwbGFjZW1lbnRdIG9mIHRoaXMuQ09ORlVTQUJMRV9NQVBQSU5HUykge1xuICAgICAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoY29uZnVzYWJsZSkpIHtcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZShuZXcgUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXgoY29uZnVzYWJsZSksICdnJyksIHJlcGxhY2VtZW50KTtcbiAgICAgICAgaGFzQ29uZnVzYWJsZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IG5vcm1hbGl6ZWQsIGhhc0NvbmZ1c2FibGVzIH07XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHN1c3BpY2lvdXMgbWl4aW5nIG9mIGRpZmZlcmVudCBVbmljb2RlIHNjcmlwdHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRldGVjdE1peGVkU2NyaXB0cyhjb250ZW50OiBzdHJpbmcpOiB7IGlzU3VzcGljaW91czogYm9vbGVhbjsgc2NyaXB0czogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgZGV0ZWN0ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbc2NyaXB0TmFtZSwgcGF0dGVybl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5TQ1JJUFRfUEFUVEVSTlMpKSB7XG4gICAgICBpZiAocGF0dGVybi50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIGRldGVjdGVkU2NyaXB0cy5wdXNoKHNjcmlwdE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnNpZGVyIGl0IHN1c3BpY2lvdXMgaWY6XG4gICAgLy8gMS4gTW9yZSB0aGFuIDMgc2NyaXB0cyBhcmUgbWl4ZWQgKGxlZ2l0aW1hdGUgdGV4dCByYXJlbHkgbWl4ZXMgPjMgc2NyaXB0cylcbiAgICAvLyAyLiBDb250ZW50IGNvbnRhaW5zIExhdGluICsgZGFuZ2Vyb3VzIGNvbmZ1c2FibGUgc2NyaXB0cyAoQ3lyaWxsaWMvR3JlZWsgLSBjb21tb24gYXR0YWNrIHBhdHRlcm4pXG4gICAgLy8gTm90ZTogTGF0aW4gKyBDSksgaXMgY29tbW9uIGFuZCBsZWdpdGltYXRlIChlLmcuLCBDaGluZXNlIHdpdGggRW5nbGlzaClcbiAgICBjb25zdCBpc1N1c3BpY2lvdXMgPSBkZXRlY3RlZFNjcmlwdHMubGVuZ3RoID4gMyB8fCBcbiAgICAgIChkZXRlY3RlZFNjcmlwdHMuaW5jbHVkZXMoJ0xBVElOJykgJiYgZGV0ZWN0ZWRTY3JpcHRzLmxlbmd0aCA+IDEgJiYgXG4gICAgICAgKGRldGVjdGVkU2NyaXB0cy5pbmNsdWRlcygnQ1lSSUxMSUMnKSB8fCBkZXRlY3RlZFNjcmlwdHMuaW5jbHVkZXMoJ0dSRUVLJykpKTtcblxuICAgIHJldHVybiB7IGlzU3VzcGljaW91cywgc2NyaXB0czogZGV0ZWN0ZWRTY3JpcHRzIH07XG4gIH1cblxuICAvKipcbiAgICogRXNjYWxhdGUgc2V2ZXJpdHkgbGV2ZWwgKGhpZ2hlciBzZXZlcml0eSB0YWtlcyBwcmVjZWRlbmNlKVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXNjYWxhdGVTZXZlcml0eShcbiAgICBjdXJyZW50OiAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ2NyaXRpY2FsJyB8IHVuZGVmaW5lZCwgXG4gICAgbmV3U2V2ZXJpdHk6ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnXG4gICk6ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnIHtcbiAgICBjb25zdCBzZXZlcml0eUxldmVscyA9IHsgbG93OiAxLCBtZWRpdW06IDIsIGhpZ2g6IDMsIGNyaXRpY2FsOiA0IH07XG4gICAgY29uc3QgY3VycmVudExldmVsID0gY3VycmVudCA/IHNldmVyaXR5TGV2ZWxzW2N1cnJlbnRdIDogMDtcbiAgICBjb25zdCBuZXdMZXZlbCA9IHNldmVyaXR5TGV2ZWxzW25ld1NldmVyaXR5XTtcbiAgICBcbiAgICByZXR1cm4gbmV3TGV2ZWwgPiBjdXJyZW50TGV2ZWwgPyBuZXdTZXZlcml0eSA6IChjdXJyZW50IHx8ICdsb3cnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc2NhcGUgc3BlY2lhbCByZWdleCBjaGFyYWN0ZXJzIGZvciBzYWZlIHJlcGxhY2VtZW50XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBlc2NhcGVSZWdleChzdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNvbnRlbnQgY29udGFpbnMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIFVuaWNvZGUgcGF0dGVybnNcbiAgICovXG4gIHN0YXRpYyBjb250YWluc0Rhbmdlcm91c1VuaWNvZGUoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gUXVpY2sgY2hlY2sgZm9yIG9idmlvdXNseSBkYW5nZXJvdXMgcGF0dGVybnNcbiAgICByZXR1cm4gdGhpcy5ESVJFQ1RJT05fT1ZFUlJJREVfQ0hBUlMudGVzdChjb250ZW50KSB8fFxuICAgICAgICAgICB0aGlzLlpFUk9fV0lEVEhfQ0hBUlMudGVzdChjb250ZW50KSB8fFxuICAgICAgICAgICB0aGlzLk5PTl9QUklOVEFCTEVfQ0hBUlMudGVzdChjb250ZW50KSB8fFxuICAgICAgICAgICB0aGlzLmhhc0V4Y2Vzc2l2ZVVuaWNvZGVFc2NhcGVzKGNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNvbnRlbnQgaGFzIGV4Y2Vzc2l2ZSBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXNcbiAgICogUHJldmVudHMgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBieSBzYWZlbHkgY2hlY2tpbmcgbWF0Y2ggcmVzdWx0c1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaGFzRXhjZXNzaXZlVW5pY29kZUVzY2FwZXMoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2goL1xcXFx1WzAtOWEtZkEtRl17NH0vZyk7XG4gICAgcmV0dXJuIG1hdGNoZXMgIT09IG51bGwgJiYgbWF0Y2hlcy5sZW5ndGggPiAxMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYWZlbHkgY2hlY2sgZm9yIG1hbGZvcm1lZCBzdXJyb2dhdGUgcGFpcnMgd2l0aG91dCBSZURvUyB2dWxuZXJhYmlsaXR5XG4gICAqIFVzZXMgY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciB2YWxpZGF0aW9uIGluc3RlYWQgb2YgY29tcGxleCByZWdleFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaGFzTWFsZm9ybWVkU3Vycm9nYXRlcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoYXIgPSBjb250ZW50LmNoYXJDb2RlQXQoaSk7XG4gICAgICBcbiAgICAgIC8vIEhpZ2ggc3Vycm9nYXRlIChVK0Q4MDAtVStEQkZGKVxuICAgICAgaWYgKGNoYXIgPj0gMHhEODAwICYmIGNoYXIgPD0gMHhEQkZGKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGl0J3MgZm9sbG93ZWQgYnkgYSBsb3cgc3Vycm9nYXRlXG4gICAgICAgIGlmIChpICsgMSA+PSBjb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBIaWdoIHN1cnJvZ2F0ZSBhdCBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBjb250ZW50LmNoYXJDb2RlQXQoaSArIDEpO1xuICAgICAgICBpZiAobmV4dENoYXIgPCAweERDMDAgfHwgbmV4dENoYXIgPiAweERGRkYpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gSGlnaCBzdXJyb2dhdGUgbm90IGZvbGxvd2VkIGJ5IGxvdyBzdXJyb2dhdGVcbiAgICAgICAgfVxuICAgICAgICBpKys7IC8vIFNraXAgdGhlIHZhbGlkIGxvdyBzdXJyb2dhdGVcbiAgICAgIH1cbiAgICAgIC8vIExvdyBzdXJyb2dhdGUgKFUrREMwMC1VK0RGRkYpIHdpdGhvdXQgcHJlY2VkaW5nIGhpZ2ggc3Vycm9nYXRlXG4gICAgICBlbHNlIGlmIChjaGFyID49IDB4REMwMCAmJiBjaGFyIDw9IDB4REZGRikge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gVW5wYWlyZWQgbG93IHN1cnJvZ2F0ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNhZmUgcHJldmlldyBvZiBVbmljb2RlIGNvbnRlbnQgZm9yIGxvZ2dpbmdcbiAgICovXG4gIHN0YXRpYyBnZXRTYWZlUHJldmlldyhjb250ZW50OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyID0gMTAwKTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgZGFuZ2Vyb3VzIFVuaWNvZGUgY2hhcmFjdGVycyBhbmQgdHJ1bmNhdGUgZm9yIHNhZmUgbG9nZ2luZ1xuICAgIGNvbnN0IGNsZWFuZWQgPSBjb250ZW50XG4gICAgICAucmVwbGFjZSh0aGlzLkRJUkVDVElPTl9PVkVSUklERV9DSEFSUywgJ1tESVJdJylcbiAgICAgIC5yZXBsYWNlKHRoaXMuWkVST19XSURUSF9DSEFSUywgJ1taV10nKVxuICAgICAgLnJlcGxhY2UodGhpcy5OT05fUFJJTlRBQkxFX0NIQVJTLCAnW05QXScpO1xuICAgIFxuICAgIHJldHVybiBjbGVhbmVkLmxlbmd0aCA+IG1heExlbmd0aCA/IFxuICAgICAgY2xlYW5lZC5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKSArICcuLi4nIDogXG4gICAgICBjbGVhbmVkO1xuICB9XG59Il19
@@ -0,0 +1,21 @@
1
+ export declare class YamlValidator {
2
+ private static readonly YAML_BOMB_LIMITS;
3
+ private static purifyWindow;
4
+ private static purify;
5
+ static parsePersonaMetadataSafely(yamlContent: string): any;
6
+ private static sanitizeMetadata;
7
+ /**
8
+ * Initialize DOMPurify instance if not already initialized
9
+ */
10
+ private static initializePurify;
11
+ /**
12
+ * Sanitize string input using DOMPurify to prevent XSS attacks
13
+ * This replaces the regex-based approach with a more robust solution
14
+ */
15
+ private static sanitizeString;
16
+ /**
17
+ * Reset static DOMPurify cache (useful for long-running processes)
18
+ */
19
+ static resetCache(): void;
20
+ }
21
+ //# sourceMappingURL=yamlValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yamlValidator.d.ts","sourceRoot":"","sources":["../../src/security/yamlValidator.ts"],"names":[],"mappings":"AA4BA,qBAAa,aAAa;IAExB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAKtC;IAGF,OAAO,CAAC,MAAM,CAAC,YAAY,CAAa;IACxC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAkC;IAEvD,MAAM,CAAC,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG;IAiE3D,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAmB/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAQ/B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IA4C7B;;OAEG;WACW,UAAU,IAAI,IAAI;CAIjC"}
@@ -0,0 +1,164 @@
1
+ import yaml from 'js-yaml';
2
+ import { z } from 'zod';
3
+ import { logger } from '../utils/logger.js';
4
+ import DOMPurify from 'dompurify';
5
+ import { JSDOM } from 'jsdom';
6
+ import { SECURITY_LIMITS } from './constants.js';
7
+ const PersonaMetadataSchema = z.object({
8
+ name: z.string().min(1).max(100),
9
+ description: z.string().min(1).max(1000),
10
+ unique_id: z.string().optional(),
11
+ author: z.string().max(50).optional(),
12
+ triggers: z.array(z.string().max(50)).max(20).optional(),
13
+ version: z.string().regex(/^\d+\.\d+\.\d+$/).optional(),
14
+ category: z.enum(['creative', 'professional', 'educational', 'gaming', 'personal']).optional(),
15
+ age_rating: z.enum(['all', '13+', '18+']).optional(),
16
+ content_flags: z.array(z.string()).optional(),
17
+ ai_generated: z.boolean().optional(),
18
+ generation_method: z.string().max(50).optional(),
19
+ price: z.string().max(20).optional(),
20
+ license: z.string().max(100).optional(),
21
+ created_date: z.string().optional()
22
+ });
23
+ export class YamlValidator {
24
+ // YAML bomb detection limits - extracted from Issue #164 review feedback
25
+ static YAML_BOMB_LIMITS = {
26
+ MAX_ANCHORS: 10, // Maximum allowed anchor definitions (&name)
27
+ MAX_ALIASES: 20, // Maximum allowed alias references (*name)
28
+ MAX_MERGE_KEYS: 5, // Maximum allowed merge key operations (<<:)
29
+ MAX_DOCUMENTS: 3 // Maximum allowed documents in a single YAML
30
+ };
31
+ // Static cache for DOMPurify to improve performance
32
+ static purifyWindow = null;
33
+ static purify = null;
34
+ static parsePersonaMetadataSafely(yamlContent) {
35
+ if (!yamlContent || typeof yamlContent !== 'string') {
36
+ throw new Error('YAML content must be a non-empty string');
37
+ }
38
+ // Size check
39
+ if (yamlContent.length > SECURITY_LIMITS.MAX_YAML_LENGTH) {
40
+ throw new Error(`YAML content too large: ${yamlContent.length} bytes (max: ${SECURITY_LIMITS.MAX_YAML_LENGTH})`);
41
+ }
42
+ // Check for dangerous tags - expanded from Issue #164
43
+ const dangerousTags = [
44
+ '!!js/', '!!python/', '!!ruby/', '!!perl/', '!!php/',
45
+ '!!java', '!!javax', '!!com.sun',
46
+ '!!exec', '!!eval', '!!new', '!!construct', '!!apply',
47
+ '!!call', '!!invoke', '!!binary', '!!merge'
48
+ ];
49
+ for (const tag of dangerousTags) {
50
+ if (yamlContent.includes(tag)) {
51
+ throw new Error(`Dangerous YAML tag detected: ${tag}`);
52
+ }
53
+ }
54
+ // Enhanced YAML bomb protection - Issue #164
55
+ const anchorCount = (yamlContent.match(/&\w+/g) || []).length;
56
+ const aliasCount = (yamlContent.match(/\*\w+/g) || []).length;
57
+ const mergeKeyCount = (yamlContent.match(/<<:/g) || []).length;
58
+ const documentCount = (yamlContent.match(/^---/gm) || []).length;
59
+ if (anchorCount > this.YAML_BOMB_LIMITS.MAX_ANCHORS ||
60
+ aliasCount > this.YAML_BOMB_LIMITS.MAX_ALIASES ||
61
+ mergeKeyCount > this.YAML_BOMB_LIMITS.MAX_MERGE_KEYS ||
62
+ documentCount > this.YAML_BOMB_LIMITS.MAX_DOCUMENTS) {
63
+ throw new Error(`Potential YAML bomb detected: anchors=${anchorCount}, aliases=${aliasCount}, merges=${mergeKeyCount}, documents=${documentCount}`);
64
+ }
65
+ // Check for nested tag combinations
66
+ const nestedTagPattern = /[&*]\w+\s*!!/;
67
+ if (nestedTagPattern.test(yamlContent)) {
68
+ throw new Error('Dangerous nested YAML tag combination detected');
69
+ }
70
+ try {
71
+ // Use safe load with restricted schema
72
+ const rawData = yaml.load(yamlContent, {
73
+ schema: yaml.CORE_SCHEMA, // No functions, only basic types
74
+ onWarning: (warning) => {
75
+ logger.warn('YAML parsing warning:', warning);
76
+ }
77
+ });
78
+ // Validate against schema
79
+ const validatedData = PersonaMetadataSchema.parse(rawData);
80
+ // Additional sanitization
81
+ return this.sanitizeMetadata(validatedData);
82
+ }
83
+ catch (error) {
84
+ if (error instanceof Error && error.name === 'YAMLException') {
85
+ throw new Error(`Invalid YAML syntax: ${error.message}`);
86
+ }
87
+ throw new Error(`Invalid persona metadata: ${error instanceof Error ? error.message : String(error)}`);
88
+ }
89
+ }
90
+ static sanitizeMetadata(data) {
91
+ const sanitized = { ...data };
92
+ // Sanitize string fields
93
+ const stringFields = ['name', 'description', 'author', 'unique_id'];
94
+ for (const field of stringFields) {
95
+ if (sanitized[field]) {
96
+ sanitized[field] = this.sanitizeString(sanitized[field]);
97
+ }
98
+ }
99
+ // Sanitize array fields
100
+ if (sanitized.triggers) {
101
+ sanitized.triggers = sanitized.triggers.map((t) => this.sanitizeString(t));
102
+ }
103
+ return sanitized;
104
+ }
105
+ /**
106
+ * Initialize DOMPurify instance if not already initialized
107
+ */
108
+ static initializePurify() {
109
+ if (!this.purifyWindow || !this.purify) {
110
+ const dom = new JSDOM('');
111
+ this.purifyWindow = dom.window;
112
+ this.purify = DOMPurify(this.purifyWindow);
113
+ }
114
+ }
115
+ /**
116
+ * Sanitize string input using DOMPurify to prevent XSS attacks
117
+ * This replaces the regex-based approach with a more robust solution
118
+ */
119
+ static sanitizeString(input) {
120
+ // Limit input length to prevent DoS
121
+ if (input.length > 10000) {
122
+ input = input.substring(0, 10000);
123
+ }
124
+ // Initialize DOMPurify if needed
125
+ this.initializePurify();
126
+ // Use DOMPurify with strict configuration
127
+ // ALLOWED_TAGS: [] strips all HTML tags
128
+ // ALLOWED_ATTR: [] strips all attributes
129
+ // FORBID_TAGS/FORBID_ATTR provide additional protection
130
+ let sanitized = this.purify.sanitize(input, {
131
+ ALLOWED_TAGS: [], // Strip all HTML tags
132
+ ALLOWED_ATTR: [], // Strip all attributes
133
+ FORBID_TAGS: ['style', 'script', 'iframe', 'object', 'embed', 'link'],
134
+ FORBID_ATTR: ['onerror', 'onload', 'onclick', 'onmouseover', 'style', 'href', 'src']
135
+ });
136
+ // Additional protection against command injection patterns
137
+ // These patterns might not be caught by DOMPurify
138
+ const commandInjectionPatterns = [
139
+ /`[^`]{0,1000}`/g, // Backtick expressions
140
+ /\$\([^)]{0,1000}\)/g, // Command substitution
141
+ /\$\{[^}]{0,1000}\}/g, // Variable expansion
142
+ /\\x[0-9a-fA-F]{2}/g, // Hex escapes
143
+ /\\u[0-9a-fA-F]{4}/g, // Unicode escapes
144
+ /\\[0-7]{1,3}/g // Octal escapes
145
+ ];
146
+ for (const pattern of commandInjectionPatterns) {
147
+ sanitized = sanitized.replace(pattern, '');
148
+ }
149
+ // Remove null bytes and normalize whitespace
150
+ sanitized = sanitized
151
+ .replace(/\x00/g, '') // Remove null bytes
152
+ .replace(/[\r\n]+/g, ' ') // Replace newlines with spaces
153
+ .trim();
154
+ return sanitized;
155
+ }
156
+ /**
157
+ * Reset static DOMPurify cache (useful for long-running processes)
158
+ */
159
+ static resetCache() {
160
+ this.purifyWindow = null;
161
+ this.purify = null;
162
+ }
163
+ }
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWFtbFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZWN1cml0eS95YW1sVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUMzQixPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLFNBQVMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUU5QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3JDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDaEMsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztJQUN4QyxTQUFTLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNoQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDckMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDeEQsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDdkQsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDOUYsVUFBVSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ3BELGFBQWEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUM3QyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNwQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUNoRCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDcEMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLFlBQVksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ3BDLENBQUMsQ0FBQztBQUtILE1BQU0sT0FBTyxhQUFhO0lBQ3hCLHlFQUF5RTtJQUNqRSxNQUFNLENBQVUsZ0JBQWdCLEdBQUc7UUFDekMsV0FBVyxFQUFFLEVBQUUsRUFBUyw2Q0FBNkM7UUFDckUsV0FBVyxFQUFFLEVBQUUsRUFBUywyQ0FBMkM7UUFDbkUsY0FBYyxFQUFFLENBQUMsRUFBTyw2Q0FBNkM7UUFDckUsYUFBYSxFQUFFLENBQUMsQ0FBUSw2Q0FBNkM7S0FDdEUsQ0FBQztJQUVGLG9EQUFvRDtJQUM1QyxNQUFNLENBQUMsWUFBWSxHQUFRLElBQUksQ0FBQztJQUNoQyxNQUFNLENBQUMsTUFBTSxHQUE2QixJQUFJLENBQUM7SUFFdkQsTUFBTSxDQUFDLDBCQUEwQixDQUFDLFdBQW1CO1FBQ25ELElBQUksQ0FBQyxXQUFXLElBQUksT0FBTyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCxhQUFhO1FBQ2IsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixXQUFXLENBQUMsTUFBTSxnQkFBZ0IsZUFBZSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDbkgsQ0FBQztRQUVELHNEQUFzRDtRQUN0RCxNQUFNLGFBQWEsR0FBRztZQUNwQixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUTtZQUNwRCxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVc7WUFDaEMsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVM7WUFDckQsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUztTQUM1QyxDQUFDO1FBRUYsS0FBSyxNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNoQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN6RCxDQUFDO1FBQ0gsQ0FBQztRQUVELDZDQUE2QztRQUM3QyxNQUFNLFdBQVcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzlELE1BQU0sVUFBVSxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDOUQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUMvRCxNQUFNLGFBQWEsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRWpFLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXO1lBQy9DLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVztZQUM5QyxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWM7WUFDcEQsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxXQUFXLGFBQWEsVUFBVSxZQUFZLGFBQWEsZUFBZSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3RKLENBQUM7UUFFRCxvQ0FBb0M7UUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUM7UUFDeEMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILHVDQUF1QztZQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDckMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsaUNBQWlDO2dCQUMzRCxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDaEQsQ0FBQzthQUNGLENBQUMsQ0FBQztZQUVILDBCQUEwQjtZQUMxQixNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFM0QsMEJBQTBCO1lBQzFCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssZUFBZSxFQUFFLENBQUM7Z0JBQzdELE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQVM7UUFDdkMsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1FBRTlCLHlCQUF5QjtRQUN6QixNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3BFLEtBQUssTUFBTSxLQUFLLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0QsQ0FBQztRQUNILENBQUM7UUFFRCx3QkFBd0I7UUFDeEIsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDdkIsU0FBUyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsZ0JBQWdCO1FBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0MsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWE7UUFDekMsb0NBQW9DO1FBQ3BDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLEVBQUUsQ0FBQztZQUN6QixLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVELGlDQUFpQztRQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUV4QiwwQ0FBMEM7UUFDMUMsd0NBQXdDO1FBQ3hDLHlDQUF5QztRQUN6Qyx3REFBd0Q7UUFDeEQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQzNDLFlBQVksRUFBRSxFQUFFLEVBQU8sc0JBQXNCO1lBQzdDLFlBQVksRUFBRSxFQUFFLEVBQU8sdUJBQXVCO1lBQzlDLFdBQVcsRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO1lBQ3JFLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQztTQUNyRixDQUFDLENBQUM7UUFFSCwyREFBMkQ7UUFDM0Qsa0RBQWtEO1FBQ2xELE1BQU0sd0JBQXdCLEdBQUc7WUFDL0IsaUJBQWlCLEVBQVksdUJBQXVCO1lBQ3BELHFCQUFxQixFQUFRLHVCQUF1QjtZQUNwRCxxQkFBcUIsRUFBUSxxQkFBcUI7WUFDbEQsb0JBQW9CLEVBQVMsY0FBYztZQUMzQyxvQkFBb0IsRUFBUyxrQkFBa0I7WUFDL0MsZUFBZSxDQUFjLGdCQUFnQjtTQUM5QyxDQUFDO1FBRUYsS0FBSyxNQUFNLE9BQU8sSUFBSSx3QkFBd0IsRUFBRSxDQUFDO1lBQy9DLFNBQVMsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsNkNBQTZDO1FBQzdDLFNBQVMsR0FBRyxTQUFTO2FBQ2xCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQVUsb0JBQW9CO2FBQ2xELE9BQU8sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQU0sK0JBQStCO2FBQzdELElBQUksRUFBRSxDQUFDO1FBRVYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFVBQVU7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IERPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknO1xuaW1wb3J0IHsgSlNET00gfSBmcm9tICdqc2RvbSc7XG5pbXBvcnQgeyBSZWdleFZhbGlkYXRvciB9IGZyb20gJy4vcmVnZXhWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5jb25zdCBQZXJzb25hTWV0YWRhdGFTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5hbWU6IHouc3RyaW5nKCkubWluKDEpLm1heCgxMDApLFxuICBkZXNjcmlwdGlvbjogei5zdHJpbmcoKS5taW4oMSkubWF4KDEwMDApLFxuICB1bmlxdWVfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgYXV0aG9yOiB6LnN0cmluZygpLm1heCg1MCkub3B0aW9uYWwoKSxcbiAgdHJpZ2dlcnM6IHouYXJyYXkoei5zdHJpbmcoKS5tYXgoNTApKS5tYXgoMjApLm9wdGlvbmFsKCksXG4gIHZlcnNpb246IHouc3RyaW5nKCkucmVnZXgoL15cXGQrXFwuXFxkK1xcLlxcZCskLykub3B0aW9uYWwoKSxcbiAgY2F0ZWdvcnk6IHouZW51bShbJ2NyZWF0aXZlJywgJ3Byb2Zlc3Npb25hbCcsICdlZHVjYXRpb25hbCcsICdnYW1pbmcnLCAncGVyc29uYWwnXSkub3B0aW9uYWwoKSxcbiAgYWdlX3JhdGluZzogei5lbnVtKFsnYWxsJywgJzEzKycsICcxOCsnXSkub3B0aW9uYWwoKSxcbiAgY29udGVudF9mbGFnczogei5hcnJheSh6LnN0cmluZygpKS5vcHRpb25hbCgpLFxuICBhaV9nZW5lcmF0ZWQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGdlbmVyYXRpb25fbWV0aG9kOiB6LnN0cmluZygpLm1heCg1MCkub3B0aW9uYWwoKSxcbiAgcHJpY2U6IHouc3RyaW5nKCkubWF4KDIwKS5vcHRpb25hbCgpLFxuICBsaWNlbnNlOiB6LnN0cmluZygpLm1heCgxMDApLm9wdGlvbmFsKCksXG4gIGNyZWF0ZWRfZGF0ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpXG59KTtcblxuLy8gVHlwZSBkZWNsYXJhdGlvbnMgZm9yIGJldHRlciB0eXBlIHNhZmV0eVxudHlwZSBET01QdXJpZnlJbnN0YW5jZSA9IFJldHVyblR5cGU8dHlwZW9mIERPTVB1cmlmeT47XG5cbmV4cG9ydCBjbGFzcyBZYW1sVmFsaWRhdG9yIHtcbiAgLy8gWUFNTCBib21iIGRldGVjdGlvbiBsaW1pdHMgLSBleHRyYWN0ZWQgZnJvbSBJc3N1ZSAjMTY0IHJldmlldyBmZWVkYmFja1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBZQU1MX0JPTUJfTElNSVRTID0ge1xuICAgIE1BWF9BTkNIT1JTOiAxMCwgICAgICAgIC8vIE1heGltdW0gYWxsb3dlZCBhbmNob3IgZGVmaW5pdGlvbnMgKCZuYW1lKVxuICAgIE1BWF9BTElBU0VTOiAyMCwgICAgICAgIC8vIE1heGltdW0gYWxsb3dlZCBhbGlhcyByZWZlcmVuY2VzICgqbmFtZSlcbiAgICBNQVhfTUVSR0VfS0VZUzogNSwgICAgICAvLyBNYXhpbXVtIGFsbG93ZWQgbWVyZ2Uga2V5IG9wZXJhdGlvbnMgKDw8OilcbiAgICBNQVhfRE9DVU1FTlRTOiAzICAgICAgICAvLyBNYXhpbXVtIGFsbG93ZWQgZG9jdW1lbnRzIGluIGEgc2luZ2xlIFlBTUxcbiAgfTtcblxuICAvLyBTdGF0aWMgY2FjaGUgZm9yIERPTVB1cmlmeSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlXG4gIHByaXZhdGUgc3RhdGljIHB1cmlmeVdpbmRvdzogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgcHVyaWZ5OiBET01QdXJpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG4gIHN0YXRpYyBwYXJzZVBlcnNvbmFNZXRhZGF0YVNhZmVseSh5YW1sQ29udGVudDogc3RyaW5nKTogYW55IHtcbiAgICBpZiAoIXlhbWxDb250ZW50IHx8IHR5cGVvZiB5YW1sQ29udGVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWUFNTCBjb250ZW50IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIFNpemUgY2hlY2tcbiAgICBpZiAoeWFtbENvbnRlbnQubGVuZ3RoID4gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBZQU1MIGNvbnRlbnQgdG9vIGxhcmdlOiAke3lhbWxDb250ZW50Lmxlbmd0aH0gYnl0ZXMgKG1heDogJHtTRUNVUklUWV9MSU1JVFMuTUFYX1lBTUxfTEVOR1RIfSlgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIGRhbmdlcm91cyB0YWdzIC0gZXhwYW5kZWQgZnJvbSBJc3N1ZSAjMTY0XG4gICAgY29uc3QgZGFuZ2Vyb3VzVGFncyA9IFtcbiAgICAgICchIWpzLycsICchIXB5dGhvbi8nLCAnISFydWJ5LycsICchIXBlcmwvJywgJyEhcGhwLycsXG4gICAgICAnISFqYXZhJywgJyEhamF2YXgnLCAnISFjb20uc3VuJyxcbiAgICAgICchIWV4ZWMnLCAnISFldmFsJywgJyEhbmV3JywgJyEhY29uc3RydWN0JywgJyEhYXBwbHknLFxuICAgICAgJyEhY2FsbCcsICchIWludm9rZScsICchIWJpbmFyeScsICchIW1lcmdlJ1xuICAgIF07XG4gICAgXG4gICAgZm9yIChjb25zdCB0YWcgb2YgZGFuZ2Vyb3VzVGFncykge1xuICAgICAgaWYgKHlhbWxDb250ZW50LmluY2x1ZGVzKHRhZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYW5nZXJvdXMgWUFNTCB0YWcgZGV0ZWN0ZWQ6ICR7dGFnfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBFbmhhbmNlZCBZQU1MIGJvbWIgcHJvdGVjdGlvbiAtIElzc3VlICMxNjRcbiAgICBjb25zdCBhbmNob3JDb3VudCA9ICh5YW1sQ29udGVudC5tYXRjaCgvJlxcdysvZykgfHwgW10pLmxlbmd0aDtcbiAgICBjb25zdCBhbGlhc0NvdW50ID0gKHlhbWxDb250ZW50Lm1hdGNoKC9cXCpcXHcrL2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgY29uc3QgbWVyZ2VLZXlDb3VudCA9ICh5YW1sQ29udGVudC5tYXRjaCgvPDw6L2cpIHx8IFtdKS5sZW5ndGg7XG4gICAgY29uc3QgZG9jdW1lbnRDb3VudCA9ICh5YW1sQ29udGVudC5tYXRjaCgvXi0tLS9nbSkgfHwgW10pLmxlbmd0aDtcbiAgICBcbiAgICBpZiAoYW5jaG9yQ291bnQgPiB0aGlzLllBTUxfQk9NQl9MSU1JVFMuTUFYX0FOQ0hPUlMgfHwgXG4gICAgICAgIGFsaWFzQ291bnQgPiB0aGlzLllBTUxfQk9NQl9MSU1JVFMuTUFYX0FMSUFTRVMgfHwgXG4gICAgICAgIG1lcmdlS2V5Q291bnQgPiB0aGlzLllBTUxfQk9NQl9MSU1JVFMuTUFYX01FUkdFX0tFWVMgfHwgXG4gICAgICAgIGRvY3VtZW50Q291bnQgPiB0aGlzLllBTUxfQk9NQl9MSU1JVFMuTUFYX0RPQ1VNRU5UUykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQb3RlbnRpYWwgWUFNTCBib21iIGRldGVjdGVkOiBhbmNob3JzPSR7YW5jaG9yQ291bnR9LCBhbGlhc2VzPSR7YWxpYXNDb3VudH0sIG1lcmdlcz0ke21lcmdlS2V5Q291bnR9LCBkb2N1bWVudHM9JHtkb2N1bWVudENvdW50fWApO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgbmVzdGVkIHRhZyBjb21iaW5hdGlvbnNcbiAgICBjb25zdCBuZXN0ZWRUYWdQYXR0ZXJuID0gL1smKl1cXHcrXFxzKiEhLztcbiAgICBpZiAobmVzdGVkVGFnUGF0dGVybi50ZXN0KHlhbWxDb250ZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYW5nZXJvdXMgbmVzdGVkIFlBTUwgdGFnIGNvbWJpbmF0aW9uIGRldGVjdGVkJyk7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBVc2Ugc2FmZSBsb2FkIHdpdGggcmVzdHJpY3RlZCBzY2hlbWFcbiAgICAgIGNvbnN0IHJhd0RhdGEgPSB5YW1sLmxvYWQoeWFtbENvbnRlbnQsIHtcbiAgICAgICAgc2NoZW1hOiB5YW1sLkNPUkVfU0NIRU1BLCAvLyBObyBmdW5jdGlvbnMsIG9ubHkgYmFzaWMgdHlwZXNcbiAgICAgICAgb25XYXJuaW5nOiAod2FybmluZykgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdZQU1MIHBhcnNpbmcgd2FybmluZzonLCB3YXJuaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGFnYWluc3Qgc2NoZW1hXG4gICAgICBjb25zdCB2YWxpZGF0ZWREYXRhID0gUGVyc29uYU1ldGFkYXRhU2NoZW1hLnBhcnNlKHJhd0RhdGEpO1xuICAgICAgXG4gICAgICAvLyBBZGRpdGlvbmFsIHNhbml0aXphdGlvblxuICAgICAgcmV0dXJuIHRoaXMuc2FuaXRpemVNZXRhZGF0YSh2YWxpZGF0ZWREYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ1lBTUxFeGNlcHRpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBZQU1MIHN5bnRheDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBlcnNvbmEgbWV0YWRhdGE6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNhbml0aXplTWV0YWRhdGEoZGF0YTogYW55KTogYW55IHtcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSB7IC4uLmRhdGEgfTtcbiAgICBcbiAgICAvLyBTYW5pdGl6ZSBzdHJpbmcgZmllbGRzXG4gICAgY29uc3Qgc3RyaW5nRmllbGRzID0gWyduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ2F1dGhvcicsICd1bmlxdWVfaWQnXTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIHN0cmluZ0ZpZWxkcykge1xuICAgICAgaWYgKHNhbml0aXplZFtmaWVsZF0pIHtcbiAgICAgICAgc2FuaXRpemVkW2ZpZWxkXSA9IHRoaXMuc2FuaXRpemVTdHJpbmcoc2FuaXRpemVkW2ZpZWxkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIFNhbml0aXplIGFycmF5IGZpZWxkc1xuICAgIGlmIChzYW5pdGl6ZWQudHJpZ2dlcnMpIHtcbiAgICAgIHNhbml0aXplZC50cmlnZ2VycyA9IHNhbml0aXplZC50cmlnZ2Vycy5tYXAoKHQ6IHN0cmluZykgPT4gdGhpcy5zYW5pdGl6ZVN0cmluZyh0KSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBET01QdXJpZnkgaW5zdGFuY2UgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGluaXRpYWxpemVQdXJpZnkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnB1cmlmeVdpbmRvdyB8fCAhdGhpcy5wdXJpZnkpIHtcbiAgICAgIGNvbnN0IGRvbSA9IG5ldyBKU0RPTSgnJyk7XG4gICAgICB0aGlzLnB1cmlmeVdpbmRvdyA9IGRvbS53aW5kb3c7XG4gICAgICB0aGlzLnB1cmlmeSA9IERPTVB1cmlmeSh0aGlzLnB1cmlmeVdpbmRvdyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhbml0aXplIHN0cmluZyBpbnB1dCB1c2luZyBET01QdXJpZnkgdG8gcHJldmVudCBYU1MgYXR0YWNrc1xuICAgKiBUaGlzIHJlcGxhY2VzIHRoZSByZWdleC1iYXNlZCBhcHByb2FjaCB3aXRoIGEgbW9yZSByb2J1c3Qgc29sdXRpb25cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNhbml0aXplU3RyaW5nKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIExpbWl0IGlucHV0IGxlbmd0aCB0byBwcmV2ZW50IERvU1xuICAgIGlmIChpbnB1dC5sZW5ndGggPiAxMDAwMCkge1xuICAgICAgaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoMCwgMTAwMDApO1xuICAgIH1cbiAgICBcbiAgICAvLyBJbml0aWFsaXplIERPTVB1cmlmeSBpZiBuZWVkZWRcbiAgICB0aGlzLmluaXRpYWxpemVQdXJpZnkoKTtcbiAgICBcbiAgICAvLyBVc2UgRE9NUHVyaWZ5IHdpdGggc3RyaWN0IGNvbmZpZ3VyYXRpb25cbiAgICAvLyBBTExPV0VEX1RBR1M6IFtdIHN0cmlwcyBhbGwgSFRNTCB0YWdzXG4gICAgLy8gQUxMT1dFRF9BVFRSOiBbXSBzdHJpcHMgYWxsIGF0dHJpYnV0ZXNcbiAgICAvLyBGT1JCSURfVEFHUy9GT1JCSURfQVRUUiBwcm92aWRlIGFkZGl0aW9uYWwgcHJvdGVjdGlvblxuICAgIGxldCBzYW5pdGl6ZWQgPSB0aGlzLnB1cmlmeSEuc2FuaXRpemUoaW5wdXQsIHtcbiAgICAgIEFMTE9XRURfVEFHUzogW10sICAgICAgLy8gU3RyaXAgYWxsIEhUTUwgdGFnc1xuICAgICAgQUxMT1dFRF9BVFRSOiBbXSwgICAgICAvLyBTdHJpcCBhbGwgYXR0cmlidXRlc1xuICAgICAgRk9SQklEX1RBR1M6IFsnc3R5bGUnLCAnc2NyaXB0JywgJ2lmcmFtZScsICdvYmplY3QnLCAnZW1iZWQnLCAnbGluayddLFxuICAgICAgRk9SQklEX0FUVFI6IFsnb25lcnJvcicsICdvbmxvYWQnLCAnb25jbGljaycsICdvbm1vdXNlb3ZlcicsICdzdHlsZScsICdocmVmJywgJ3NyYyddXG4gICAgfSk7XG4gICAgXG4gICAgLy8gQWRkaXRpb25hbCBwcm90ZWN0aW9uIGFnYWluc3QgY29tbWFuZCBpbmplY3Rpb24gcGF0dGVybnNcbiAgICAvLyBUaGVzZSBwYXR0ZXJucyBtaWdodCBub3QgYmUgY2F1Z2h0IGJ5IERPTVB1cmlmeVxuICAgIGNvbnN0IGNvbW1hbmRJbmplY3Rpb25QYXR0ZXJucyA9IFtcbiAgICAgIC9gW15gXXswLDEwMDB9YC9nLCAgICAgICAgICAgLy8gQmFja3RpY2sgZXhwcmVzc2lvbnNcbiAgICAgIC9cXCRcXChbXildezAsMTAwMH1cXCkvZywgICAgICAgLy8gQ29tbWFuZCBzdWJzdGl0dXRpb25cbiAgICAgIC9cXCRcXHtbXn1dezAsMTAwMH1cXH0vZywgICAgICAgLy8gVmFyaWFibGUgZXhwYW5zaW9uXG4gICAgICAvXFxcXHhbMC05YS1mQS1GXXsyfS9nLCAgICAgICAgLy8gSGV4IGVzY2FwZXNcbiAgICAgIC9cXFxcdVswLTlhLWZBLUZdezR9L2csICAgICAgICAvLyBVbmljb2RlIGVzY2FwZXNcbiAgICAgIC9cXFxcWzAtN117MSwzfS9nICAgICAgICAgICAgICAvLyBPY3RhbCBlc2NhcGVzXG4gICAgXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgY29tbWFuZEluamVjdGlvblBhdHRlcm5zKSB7XG4gICAgICBzYW5pdGl6ZWQgPSBzYW5pdGl6ZWQucmVwbGFjZShwYXR0ZXJuLCAnJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlbW92ZSBudWxsIGJ5dGVzIGFuZCBub3JtYWxpemUgd2hpdGVzcGFjZVxuICAgIHNhbml0aXplZCA9IHNhbml0aXplZFxuICAgICAgLnJlcGxhY2UoL1xceDAwL2csICcnKSAgICAgICAgICAvLyBSZW1vdmUgbnVsbCBieXRlc1xuICAgICAgLnJlcGxhY2UoL1tcXHJcXG5dKy9nLCAnICcpICAgICAgLy8gUmVwbGFjZSBuZXdsaW5lcyB3aXRoIHNwYWNlc1xuICAgICAgLnRyaW0oKTtcbiAgICBcbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG4gIFxuICAvKipcbiAgICogUmVzZXQgc3RhdGljIERPTVB1cmlmeSBjYWNoZSAodXNlZnVsIGZvciBsb25nLXJ1bm5pbmcgcHJvY2Vzc2VzKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZXNldENhY2hlKCk6IHZvaWQge1xuICAgIHRoaXMucHVyaWZ5V2luZG93ID0gbnVsbDtcbiAgICB0aGlzLnB1cmlmeSA9IG51bGw7XG4gIH1cbn0iXX0=