@dollhousemcp/mcp-server 1.3.0 → 1.3.3

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 (684) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +99 -17
  3. package/dist/collection/ElementInstaller.d.ts.map +1 -1
  4. package/dist/collection/ElementInstaller.js +3 -7
  5. package/dist/elements/index.d.ts +0 -2
  6. package/dist/elements/index.d.ts.map +1 -1
  7. package/dist/elements/index.js +1 -3
  8. package/dist/elements/skills/Skill.d.ts.map +1 -1
  9. package/dist/elements/skills/Skill.js +3 -2
  10. package/dist/elements/skills/SkillManager.d.ts +83 -0
  11. package/dist/elements/skills/SkillManager.d.ts.map +1 -0
  12. package/dist/elements/skills/SkillManager.js +383 -0
  13. package/dist/elements/skills/index.d.ts +1 -0
  14. package/dist/elements/skills/index.d.ts.map +1 -1
  15. package/dist/elements/skills/index.js +2 -1
  16. package/dist/index.d.ts +51 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +577 -3
  19. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  20. package/dist/portfolio/PortfolioManager.js +1 -3
  21. package/dist/portfolio/types.d.ts +1 -3
  22. package/dist/portfolio/types.d.ts.map +1 -1
  23. package/dist/portfolio/types.js +1 -3
  24. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  25. package/dist/security/audit/config/suppressions.js +6 -1
  26. package/dist/server/ServerSetup.d.ts.map +1 -1
  27. package/dist/server/ServerSetup.js +5 -2
  28. package/dist/server/tools/CollectionTools.d.ts.map +1 -1
  29. package/dist/server/tools/CollectionTools.js +52 -7
  30. package/dist/server/tools/ElementTools.d.ts +11 -0
  31. package/dist/server/tools/ElementTools.d.ts.map +1 -0
  32. package/dist/server/tools/ElementTools.js +174 -0
  33. package/dist/server/tools/index.d.ts +1 -0
  34. package/dist/server/tools/index.d.ts.map +1 -1
  35. package/dist/server/tools/index.js +2 -1
  36. package/dist/server/types.d.ts +8 -0
  37. package/dist/server/types.d.ts.map +1 -1
  38. package/dist/server/types.js +1 -1
  39. package/package.json +1 -1
  40. package/dist/collection/MarketplaceBrowser.d.ts +0 -24
  41. package/dist/collection/MarketplaceBrowser.d.ts.map +0 -1
  42. package/dist/collection/MarketplaceBrowser.js +0 -115
  43. package/dist/collection/MarketplaceSearch.d.ts +0 -18
  44. package/dist/collection/MarketplaceSearch.d.ts.map +0 -1
  45. package/dist/collection/MarketplaceSearch.js +0 -48
  46. package/dist/collection/PersonaInstaller.d.ts +0 -26
  47. package/dist/collection/PersonaInstaller.d.ts.map +0 -1
  48. package/dist/collection/PersonaInstaller.js +0 -103
  49. package/dist/elements/ensembles/Ensemble.d.ts +0 -144
  50. package/dist/elements/ensembles/Ensemble.d.ts.map +0 -1
  51. package/dist/elements/ensembles/Ensemble.js +0 -860
  52. package/dist/elements/ensembles/EnsembleManager.d.ts +0 -85
  53. package/dist/elements/ensembles/EnsembleManager.d.ts.map +0 -1
  54. package/dist/elements/ensembles/EnsembleManager.js +0 -378
  55. package/dist/elements/ensembles/constants.d.ts +0 -73
  56. package/dist/elements/ensembles/constants.d.ts.map +0 -1
  57. package/dist/elements/ensembles/constants.js +0 -92
  58. package/dist/elements/ensembles/index.d.ts +0 -8
  59. package/dist/elements/ensembles/index.d.ts.map +0 -1
  60. package/dist/elements/ensembles/index.js +0 -8
  61. package/dist/elements/ensembles/types.d.ts +0 -92
  62. package/dist/elements/ensembles/types.d.ts.map +0 -1
  63. package/dist/elements/ensembles/types.js +0 -8
  64. package/dist/elements/memories/Memory.d.ts +0 -110
  65. package/dist/elements/memories/Memory.d.ts.map +0 -1
  66. package/dist/elements/memories/Memory.js +0 -470
  67. package/dist/elements/memories/MemoryManager.d.ts +0 -86
  68. package/dist/elements/memories/MemoryManager.d.ts.map +0 -1
  69. package/dist/elements/memories/MemoryManager.js +0 -435
  70. package/dist/elements/memories/constants.d.ts +0 -42
  71. package/dist/elements/memories/constants.d.ts.map +0 -1
  72. package/dist/elements/memories/constants.js +0 -49
  73. package/dist/elements/memories/index.d.ts +0 -6
  74. package/dist/elements/memories/index.d.ts.map +0 -1
  75. package/dist/elements/memories/index.js +0 -6
  76. package/dist/marketplace/GitHubClient.d.ts +0 -22
  77. package/dist/marketplace/GitHubClient.d.ts.map +0 -1
  78. package/dist/marketplace/GitHubClient.js +0 -112
  79. package/dist/marketplace/MarketplaceBrowser.d.ts +0 -24
  80. package/dist/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  81. package/dist/marketplace/MarketplaceBrowser.js +0 -115
  82. package/dist/marketplace/MarketplaceSearch.d.ts +0 -18
  83. package/dist/marketplace/MarketplaceSearch.d.ts.map +0 -1
  84. package/dist/marketplace/MarketplaceSearch.js +0 -48
  85. package/dist/marketplace/PersonaDetails.d.ts +0 -22
  86. package/dist/marketplace/PersonaDetails.d.ts.map +0 -1
  87. package/dist/marketplace/PersonaDetails.js +0 -71
  88. package/dist/marketplace/PersonaInstaller.d.ts +0 -25
  89. package/dist/marketplace/PersonaInstaller.d.ts.map +0 -1
  90. package/dist/marketplace/PersonaInstaller.js +0 -100
  91. package/dist/marketplace/PersonaSubmitter.d.ts +0 -19
  92. package/dist/marketplace/PersonaSubmitter.d.ts.map +0 -1
  93. package/dist/marketplace/PersonaSubmitter.js +0 -57
  94. package/dist/marketplace/index.d.ts +0 -10
  95. package/dist/marketplace/index.d.ts.map +0 -1
  96. package/dist/marketplace/index.js +0 -10
  97. package/dist/server/tools/MarketplaceTools.d.ts +0 -10
  98. package/dist/server/tools/MarketplaceTools.d.ts.map +0 -1
  99. package/dist/server/tools/MarketplaceTools.js +0 -96
  100. package/dist/src/cache/APICache.d.ts +0 -23
  101. package/dist/src/cache/APICache.d.ts.map +0 -1
  102. package/dist/src/cache/APICache.js +0 -42
  103. package/dist/src/cache/index.d.ts +0 -5
  104. package/dist/src/cache/index.d.ts.map +0 -1
  105. package/dist/src/cache/index.js +0 -5
  106. package/dist/src/config/constants.d.ts +0 -25
  107. package/dist/src/config/constants.d.ts.map +0 -1
  108. package/dist/src/config/constants.js +0 -30
  109. package/dist/src/config/index.d.ts +0 -6
  110. package/dist/src/config/index.d.ts.map +0 -1
  111. package/dist/src/config/index.js +0 -6
  112. package/dist/src/config/indicator-config.d.ts +0 -107
  113. package/dist/src/config/indicator-config.d.ts.map +0 -1
  114. package/dist/src/config/indicator-config.js +0 -158
  115. package/dist/src/constants/defaultPersonas.d.ts +0 -10
  116. package/dist/src/constants/defaultPersonas.d.ts.map +0 -1
  117. package/dist/src/constants/defaultPersonas.js +0 -18
  118. package/dist/src/constants/limits.d.ts +0 -10
  119. package/dist/src/constants/limits.d.ts.map +0 -1
  120. package/dist/src/constants/limits.js +0 -13
  121. package/dist/src/errors/SecurityError.d.ts +0 -29
  122. package/dist/src/errors/SecurityError.d.ts.map +0 -1
  123. package/dist/src/errors/SecurityError.js +0 -47
  124. package/dist/src/errors/index.d.ts +0 -2
  125. package/dist/src/errors/index.d.ts.map +0 -1
  126. package/dist/src/errors/index.js +0 -2
  127. package/dist/src/index.barrel.d.ts +0 -21
  128. package/dist/src/index.barrel.d.ts.map +0 -1
  129. package/dist/src/index.barrel.js +0 -31
  130. package/dist/src/index.d.ts +0 -220
  131. package/dist/src/index.d.ts.map +0 -1
  132. package/dist/src/index.js +0 -1559
  133. package/dist/src/marketplace/GitHubClient.d.ts +0 -22
  134. package/dist/src/marketplace/GitHubClient.d.ts.map +0 -1
  135. package/dist/src/marketplace/GitHubClient.js +0 -112
  136. package/dist/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  137. package/dist/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  138. package/dist/src/marketplace/MarketplaceBrowser.js +0 -45
  139. package/dist/src/marketplace/MarketplaceSearch.d.ts +0 -18
  140. package/dist/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  141. package/dist/src/marketplace/MarketplaceSearch.js +0 -36
  142. package/dist/src/marketplace/PersonaDetails.d.ts +0 -22
  143. package/dist/src/marketplace/PersonaDetails.d.ts.map +0 -1
  144. package/dist/src/marketplace/PersonaDetails.js +0 -71
  145. package/dist/src/marketplace/PersonaInstaller.d.ts +0 -25
  146. package/dist/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  147. package/dist/src/marketplace/PersonaInstaller.js +0 -100
  148. package/dist/src/marketplace/PersonaSubmitter.d.ts +0 -19
  149. package/dist/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  150. package/dist/src/marketplace/PersonaSubmitter.js +0 -57
  151. package/dist/src/marketplace/index.d.ts +0 -10
  152. package/dist/src/marketplace/index.d.ts.map +0 -1
  153. package/dist/src/marketplace/index.js +0 -10
  154. package/dist/src/persona/PersonaLoader.d.ts +0 -33
  155. package/dist/src/persona/PersonaLoader.d.ts.map +0 -1
  156. package/dist/src/persona/PersonaLoader.js +0 -139
  157. package/dist/src/persona/PersonaManager.d.ts +0 -112
  158. package/dist/src/persona/PersonaManager.d.ts.map +0 -1
  159. package/dist/src/persona/PersonaManager.js +0 -341
  160. package/dist/src/persona/PersonaValidator.d.ts +0 -33
  161. package/dist/src/persona/PersonaValidator.d.ts.map +0 -1
  162. package/dist/src/persona/PersonaValidator.js +0 -157
  163. package/dist/src/persona/export-import/PersonaExporter.d.ts +0 -43
  164. package/dist/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  165. package/dist/src/persona/export-import/PersonaExporter.js +0 -99
  166. package/dist/src/persona/export-import/PersonaImporter.d.ts +0 -65
  167. package/dist/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  168. package/dist/src/persona/export-import/PersonaImporter.js +0 -313
  169. package/dist/src/persona/export-import/PersonaSharer.d.ts +0 -60
  170. package/dist/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  171. package/dist/src/persona/export-import/PersonaSharer.js +0 -363
  172. package/dist/src/persona/export-import/index.d.ts +0 -10
  173. package/dist/src/persona/export-import/index.d.ts.map +0 -1
  174. package/dist/src/persona/export-import/index.js +0 -7
  175. package/dist/src/persona/index.d.ts +0 -7
  176. package/dist/src/persona/index.d.ts.map +0 -1
  177. package/dist/src/persona/index.js +0 -7
  178. package/dist/src/security/InputValidator.d.ts +0 -69
  179. package/dist/src/security/InputValidator.d.ts.map +0 -1
  180. package/dist/src/security/InputValidator.js +0 -381
  181. package/dist/src/security/commandValidator.d.ts +0 -7
  182. package/dist/src/security/commandValidator.d.ts.map +0 -1
  183. package/dist/src/security/commandValidator.js +0 -77
  184. package/dist/src/security/constants.d.ts +0 -21
  185. package/dist/src/security/constants.d.ts.map +0 -1
  186. package/dist/src/security/constants.js +0 -23
  187. package/dist/src/security/contentValidator.d.ts +0 -47
  188. package/dist/src/security/contentValidator.d.ts.map +0 -1
  189. package/dist/src/security/contentValidator.js +0 -188
  190. package/dist/src/security/fileLockManager.d.ts +0 -70
  191. package/dist/src/security/fileLockManager.d.ts.map +0 -1
  192. package/dist/src/security/fileLockManager.js +0 -187
  193. package/dist/src/security/index.d.ts +0 -12
  194. package/dist/src/security/index.d.ts.map +0 -1
  195. package/dist/src/security/index.js +0 -14
  196. package/dist/src/security/pathValidator.d.ts +0 -9
  197. package/dist/src/security/pathValidator.d.ts.map +0 -1
  198. package/dist/src/security/pathValidator.js +0 -97
  199. package/dist/src/security/secureYamlParser.d.ts +0 -46
  200. package/dist/src/security/secureYamlParser.d.ts.map +0 -1
  201. package/dist/src/security/secureYamlParser.js +0 -203
  202. package/dist/src/security/securityMonitor.d.ts +0 -58
  203. package/dist/src/security/securityMonitor.d.ts.map +0 -1
  204. package/dist/src/security/securityMonitor.js +0 -108
  205. package/dist/src/security/tokenManager.d.ts +0 -59
  206. package/dist/src/security/tokenManager.d.ts.map +0 -1
  207. package/dist/src/security/tokenManager.js +0 -216
  208. package/dist/src/security/yamlValidator.d.ts +0 -20
  209. package/dist/src/security/yamlValidator.d.ts.map +0 -1
  210. package/dist/src/security/yamlValidator.js +0 -138
  211. package/dist/src/server/ServerSetup.d.ts +0 -31
  212. package/dist/src/server/ServerSetup.d.ts.map +0 -1
  213. package/dist/src/server/ServerSetup.js +0 -79
  214. package/dist/src/server/index.d.ts +0 -7
  215. package/dist/src/server/index.d.ts.map +0 -1
  216. package/dist/src/server/index.js +0 -7
  217. package/dist/src/server/tools/ConfigTools.d.ts +0 -10
  218. package/dist/src/server/tools/ConfigTools.d.ts.map +0 -1
  219. package/dist/src/server/tools/ConfigTools.js +0 -63
  220. package/dist/src/server/tools/MarketplaceTools.d.ts +0 -10
  221. package/dist/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  222. package/dist/src/server/tools/MarketplaceTools.js +0 -92
  223. package/dist/src/server/tools/PersonaTools.d.ts +0 -10
  224. package/dist/src/server/tools/PersonaTools.d.ts.map +0 -1
  225. package/dist/src/server/tools/PersonaTools.js +0 -257
  226. package/dist/src/server/tools/ToolRegistry.d.ts +0 -37
  227. package/dist/src/server/tools/ToolRegistry.d.ts.map +0 -1
  228. package/dist/src/server/tools/ToolRegistry.js +0 -40
  229. package/dist/src/server/tools/UpdateTools.d.ts +0 -10
  230. package/dist/src/server/tools/UpdateTools.d.ts.map +0 -1
  231. package/dist/src/server/tools/UpdateTools.js +0 -64
  232. package/dist/src/server/tools/UserTools.d.ts +0 -10
  233. package/dist/src/server/tools/UserTools.d.ts.map +0 -1
  234. package/dist/src/server/tools/UserTools.js +0 -51
  235. package/dist/src/server/tools/index.d.ts +0 -10
  236. package/dist/src/server/tools/index.d.ts.map +0 -1
  237. package/dist/src/server/tools/index.js +0 -10
  238. package/dist/src/server/types.d.ts +0 -34
  239. package/dist/src/server/types.d.ts.map +0 -1
  240. package/dist/src/server/types.js +0 -5
  241. package/dist/src/tools/debug.d.ts +0 -20
  242. package/dist/src/tools/debug.d.ts.map +0 -1
  243. package/dist/src/tools/debug.js +0 -37
  244. package/dist/src/types/cache.d.ts +0 -8
  245. package/dist/src/types/cache.d.ts.map +0 -1
  246. package/dist/src/types/cache.js +0 -5
  247. package/dist/src/types/index.d.ts +0 -8
  248. package/dist/src/types/index.d.ts.map +0 -1
  249. package/dist/src/types/index.js +0 -8
  250. package/dist/src/types/marketplace.d.ts +0 -23
  251. package/dist/src/types/marketplace.d.ts.map +0 -1
  252. package/dist/src/types/marketplace.js +0 -5
  253. package/dist/src/types/mcp.d.ts +0 -161
  254. package/dist/src/types/mcp.d.ts.map +0 -1
  255. package/dist/src/types/mcp.js +0 -75
  256. package/dist/src/types/persona.d.ts +0 -30
  257. package/dist/src/types/persona.d.ts.map +0 -1
  258. package/dist/src/types/persona.js +0 -5
  259. package/dist/src/update/BackupManager.d.ts +0 -46
  260. package/dist/src/update/BackupManager.d.ts.map +0 -1
  261. package/dist/src/update/BackupManager.js +0 -261
  262. package/dist/src/update/DependencyChecker.d.ts +0 -41
  263. package/dist/src/update/DependencyChecker.d.ts.map +0 -1
  264. package/dist/src/update/DependencyChecker.js +0 -132
  265. package/dist/src/update/RateLimiter.d.ts +0 -80
  266. package/dist/src/update/RateLimiter.d.ts.map +0 -1
  267. package/dist/src/update/RateLimiter.js +0 -172
  268. package/dist/src/update/SignatureVerifier.d.ts +0 -71
  269. package/dist/src/update/SignatureVerifier.d.ts.map +0 -1
  270. package/dist/src/update/SignatureVerifier.js +0 -214
  271. package/dist/src/update/UpdateChecker.d.ts +0 -127
  272. package/dist/src/update/UpdateChecker.d.ts.map +0 -1
  273. package/dist/src/update/UpdateChecker.js +0 -460
  274. package/dist/src/update/UpdateManager.d.ts +0 -41
  275. package/dist/src/update/UpdateManager.d.ts.map +0 -1
  276. package/dist/src/update/UpdateManager.js +0 -260
  277. package/dist/src/update/VersionManager.d.ts +0 -31
  278. package/dist/src/update/VersionManager.d.ts.map +0 -1
  279. package/dist/src/update/VersionManager.js +0 -134
  280. package/dist/src/update/index.d.ts +0 -9
  281. package/dist/src/update/index.d.ts.map +0 -1
  282. package/dist/src/update/index.js +0 -9
  283. package/dist/src/utils/filesystem.d.ts +0 -32
  284. package/dist/src/utils/filesystem.d.ts.map +0 -1
  285. package/dist/src/utils/filesystem.js +0 -73
  286. package/dist/src/utils/git.d.ts +0 -32
  287. package/dist/src/utils/git.d.ts.map +0 -1
  288. package/dist/src/utils/git.js +0 -65
  289. package/dist/src/utils/index.d.ts +0 -7
  290. package/dist/src/utils/index.d.ts.map +0 -1
  291. package/dist/src/utils/index.js +0 -7
  292. package/dist/src/utils/logger.d.ts +0 -45
  293. package/dist/src/utils/logger.d.ts.map +0 -1
  294. package/dist/src/utils/logger.js +0 -91
  295. package/dist/src/utils/version.d.ts +0 -25
  296. package/dist/src/utils/version.d.ts.map +0 -1
  297. package/dist/src/utils/version.js +0 -97
  298. package/dist/test/src/cache/APICache.d.ts +0 -23
  299. package/dist/test/src/cache/APICache.d.ts.map +0 -1
  300. package/dist/test/src/cache/APICache.js +0 -42
  301. package/dist/test/src/cache/index.d.ts +0 -5
  302. package/dist/test/src/cache/index.d.ts.map +0 -1
  303. package/dist/test/src/cache/index.js +0 -5
  304. package/dist/test/src/collection/CollectionBrowser.d.ts +0 -24
  305. package/dist/test/src/collection/CollectionBrowser.d.ts.map +0 -1
  306. package/dist/test/src/collection/CollectionBrowser.js +0 -115
  307. package/dist/test/src/collection/CollectionSearch.d.ts +0 -18
  308. package/dist/test/src/collection/CollectionSearch.d.ts.map +0 -1
  309. package/dist/test/src/collection/CollectionSearch.js +0 -48
  310. package/dist/test/src/collection/GitHubClient.d.ts +0 -22
  311. package/dist/test/src/collection/GitHubClient.d.ts.map +0 -1
  312. package/dist/test/src/collection/GitHubClient.js +0 -114
  313. package/dist/test/src/collection/PersonaDetails.d.ts +0 -22
  314. package/dist/test/src/collection/PersonaDetails.d.ts.map +0 -1
  315. package/dist/test/src/collection/PersonaDetails.js +0 -71
  316. package/dist/test/src/collection/PersonaInstaller.d.ts +0 -26
  317. package/dist/test/src/collection/PersonaInstaller.d.ts.map +0 -1
  318. package/dist/test/src/collection/PersonaInstaller.js +0 -103
  319. package/dist/test/src/collection/PersonaSubmitter.d.ts +0 -19
  320. package/dist/test/src/collection/PersonaSubmitter.d.ts.map +0 -1
  321. package/dist/test/src/collection/PersonaSubmitter.js +0 -57
  322. package/dist/test/src/collection/index.d.ts +0 -10
  323. package/dist/test/src/collection/index.d.ts.map +0 -1
  324. package/dist/test/src/collection/index.js +0 -10
  325. package/dist/test/src/config/constants.d.ts +0 -25
  326. package/dist/test/src/config/constants.d.ts.map +0 -1
  327. package/dist/test/src/config/constants.js +0 -30
  328. package/dist/test/src/config/index.d.ts +0 -6
  329. package/dist/test/src/config/index.d.ts.map +0 -1
  330. package/dist/test/src/config/index.js +0 -6
  331. package/dist/test/src/config/indicator-config.d.ts +0 -107
  332. package/dist/test/src/config/indicator-config.d.ts.map +0 -1
  333. package/dist/test/src/config/indicator-config.js +0 -158
  334. package/dist/test/src/constants/defaultPersonas.d.ts +0 -10
  335. package/dist/test/src/constants/defaultPersonas.d.ts.map +0 -1
  336. package/dist/test/src/constants/defaultPersonas.js +0 -18
  337. package/dist/test/src/constants/limits.d.ts +0 -10
  338. package/dist/test/src/constants/limits.d.ts.map +0 -1
  339. package/dist/test/src/constants/limits.js +0 -13
  340. package/dist/test/src/elements/BaseElement.d.ts +0 -81
  341. package/dist/test/src/elements/BaseElement.d.ts.map +0 -1
  342. package/dist/test/src/elements/BaseElement.js +0 -381
  343. package/dist/test/src/elements/FeedbackProcessor.d.ts +0 -57
  344. package/dist/test/src/elements/FeedbackProcessor.d.ts.map +0 -1
  345. package/dist/test/src/elements/FeedbackProcessor.js +0 -418
  346. package/dist/test/src/elements/agents/Agent.d.ts +0 -145
  347. package/dist/test/src/elements/agents/Agent.d.ts.map +0 -1
  348. package/dist/test/src/elements/agents/Agent.js +0 -848
  349. package/dist/test/src/elements/agents/AgentManager.d.ts +0 -125
  350. package/dist/test/src/elements/agents/AgentManager.d.ts.map +0 -1
  351. package/dist/test/src/elements/agents/AgentManager.js +0 -608
  352. package/dist/test/src/elements/agents/constants.d.ts +0 -42
  353. package/dist/test/src/elements/agents/constants.d.ts.map +0 -1
  354. package/dist/test/src/elements/agents/constants.js +0 -45
  355. package/dist/test/src/elements/agents/goalTemplates.d.ts +0 -44
  356. package/dist/test/src/elements/agents/goalTemplates.d.ts.map +0 -1
  357. package/dist/test/src/elements/agents/goalTemplates.js +0 -297
  358. package/dist/test/src/elements/agents/index.d.ts +0 -8
  359. package/dist/test/src/elements/agents/index.d.ts.map +0 -1
  360. package/dist/test/src/elements/agents/index.js +0 -8
  361. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts +0 -76
  362. package/dist/test/src/elements/agents/ruleEngineConfig.d.ts.map +0 -1
  363. package/dist/test/src/elements/agents/ruleEngineConfig.js +0 -143
  364. package/dist/test/src/elements/agents/types.d.ts +0 -97
  365. package/dist/test/src/elements/agents/types.d.ts.map +0 -1
  366. package/dist/test/src/elements/agents/types.js +0 -5
  367. package/dist/test/src/elements/index.d.ts +0 -6
  368. package/dist/test/src/elements/index.d.ts.map +0 -1
  369. package/dist/test/src/elements/index.js +0 -6
  370. package/dist/test/src/elements/memories/Memory.d.ts +0 -110
  371. package/dist/test/src/elements/memories/Memory.d.ts.map +0 -1
  372. package/dist/test/src/elements/memories/Memory.js +0 -470
  373. package/dist/test/src/elements/memories/MemoryManager.d.ts +0 -86
  374. package/dist/test/src/elements/memories/MemoryManager.d.ts.map +0 -1
  375. package/dist/test/src/elements/memories/MemoryManager.js +0 -435
  376. package/dist/test/src/elements/memories/constants.d.ts +0 -42
  377. package/dist/test/src/elements/memories/constants.d.ts.map +0 -1
  378. package/dist/test/src/elements/memories/constants.js +0 -49
  379. package/dist/test/src/elements/memories/index.d.ts +0 -6
  380. package/dist/test/src/elements/memories/index.d.ts.map +0 -1
  381. package/dist/test/src/elements/memories/index.js +0 -6
  382. package/dist/test/src/elements/skills/Skill.d.ts +0 -109
  383. package/dist/test/src/elements/skills/Skill.d.ts.map +0 -1
  384. package/dist/test/src/elements/skills/Skill.js +0 -381
  385. package/dist/test/src/elements/templates/Template.d.ts +0 -138
  386. package/dist/test/src/elements/templates/Template.d.ts.map +0 -1
  387. package/dist/test/src/elements/templates/Template.js +0 -673
  388. package/dist/test/src/elements/templates/TemplateManager.d.ts +0 -104
  389. package/dist/test/src/elements/templates/TemplateManager.d.ts.map +0 -1
  390. package/dist/test/src/elements/templates/TemplateManager.js +0 -496
  391. package/dist/test/src/elements/templates/index.d.ts +0 -6
  392. package/dist/test/src/elements/templates/index.d.ts.map +0 -1
  393. package/dist/test/src/elements/templates/index.js +0 -6
  394. package/dist/test/src/errors/SecurityError.d.ts +0 -29
  395. package/dist/test/src/errors/SecurityError.d.ts.map +0 -1
  396. package/dist/test/src/errors/SecurityError.js +0 -47
  397. package/dist/test/src/errors/index.d.ts +0 -2
  398. package/dist/test/src/errors/index.d.ts.map +0 -1
  399. package/dist/test/src/errors/index.js +0 -2
  400. package/dist/test/src/index.barrel.d.ts +0 -21
  401. package/dist/test/src/index.barrel.d.ts.map +0 -1
  402. package/dist/test/src/index.barrel.js +0 -31
  403. package/dist/test/src/index.d.ts +0 -223
  404. package/dist/test/src/index.d.ts.map +0 -1
  405. package/dist/test/src/index.js +0 -1594
  406. package/dist/test/src/marketplace/GitHubClient.d.ts +0 -22
  407. package/dist/test/src/marketplace/GitHubClient.d.ts.map +0 -1
  408. package/dist/test/src/marketplace/GitHubClient.js +0 -112
  409. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts +0 -21
  410. package/dist/test/src/marketplace/MarketplaceBrowser.d.ts.map +0 -1
  411. package/dist/test/src/marketplace/MarketplaceBrowser.js +0 -45
  412. package/dist/test/src/marketplace/MarketplaceSearch.d.ts +0 -18
  413. package/dist/test/src/marketplace/MarketplaceSearch.d.ts.map +0 -1
  414. package/dist/test/src/marketplace/MarketplaceSearch.js +0 -36
  415. package/dist/test/src/marketplace/PersonaDetails.d.ts +0 -22
  416. package/dist/test/src/marketplace/PersonaDetails.d.ts.map +0 -1
  417. package/dist/test/src/marketplace/PersonaDetails.js +0 -71
  418. package/dist/test/src/marketplace/PersonaInstaller.d.ts +0 -25
  419. package/dist/test/src/marketplace/PersonaInstaller.d.ts.map +0 -1
  420. package/dist/test/src/marketplace/PersonaInstaller.js +0 -100
  421. package/dist/test/src/marketplace/PersonaSubmitter.d.ts +0 -19
  422. package/dist/test/src/marketplace/PersonaSubmitter.d.ts.map +0 -1
  423. package/dist/test/src/marketplace/PersonaSubmitter.js +0 -57
  424. package/dist/test/src/marketplace/index.d.ts +0 -10
  425. package/dist/test/src/marketplace/index.d.ts.map +0 -1
  426. package/dist/test/src/marketplace/index.js +0 -10
  427. package/dist/test/src/persona/PersonaElement.d.ts +0 -64
  428. package/dist/test/src/persona/PersonaElement.d.ts.map +0 -1
  429. package/dist/test/src/persona/PersonaElement.js +0 -223
  430. package/dist/test/src/persona/PersonaElementManager.d.ts +0 -97
  431. package/dist/test/src/persona/PersonaElementManager.d.ts.map +0 -1
  432. package/dist/test/src/persona/PersonaElementManager.js +0 -342
  433. package/dist/test/src/persona/PersonaLoader.d.ts +0 -34
  434. package/dist/test/src/persona/PersonaLoader.d.ts.map +0 -1
  435. package/dist/test/src/persona/PersonaLoader.js +0 -145
  436. package/dist/test/src/persona/PersonaManager.d.ts +0 -112
  437. package/dist/test/src/persona/PersonaManager.d.ts.map +0 -1
  438. package/dist/test/src/persona/PersonaManager.js +0 -341
  439. package/dist/test/src/persona/PersonaValidator.d.ts +0 -33
  440. package/dist/test/src/persona/PersonaValidator.d.ts.map +0 -1
  441. package/dist/test/src/persona/PersonaValidator.js +0 -157
  442. package/dist/test/src/persona/export-import/PersonaExporter.d.ts +0 -43
  443. package/dist/test/src/persona/export-import/PersonaExporter.d.ts.map +0 -1
  444. package/dist/test/src/persona/export-import/PersonaExporter.js +0 -99
  445. package/dist/test/src/persona/export-import/PersonaImporter.d.ts +0 -65
  446. package/dist/test/src/persona/export-import/PersonaImporter.d.ts.map +0 -1
  447. package/dist/test/src/persona/export-import/PersonaImporter.js +0 -315
  448. package/dist/test/src/persona/export-import/PersonaSharer.d.ts +0 -60
  449. package/dist/test/src/persona/export-import/PersonaSharer.d.ts.map +0 -1
  450. package/dist/test/src/persona/export-import/PersonaSharer.js +0 -502
  451. package/dist/test/src/persona/export-import/index.d.ts +0 -10
  452. package/dist/test/src/persona/export-import/index.d.ts.map +0 -1
  453. package/dist/test/src/persona/export-import/index.js +0 -7
  454. package/dist/test/src/persona/index.d.ts +0 -7
  455. package/dist/test/src/persona/index.d.ts.map +0 -1
  456. package/dist/test/src/persona/index.js +0 -7
  457. package/dist/test/src/portfolio/MigrationManager.d.ts +0 -44
  458. package/dist/test/src/portfolio/MigrationManager.d.ts.map +0 -1
  459. package/dist/test/src/portfolio/MigrationManager.js +0 -163
  460. package/dist/test/src/portfolio/PortfolioManager.d.ts +0 -54
  461. package/dist/test/src/portfolio/PortfolioManager.d.ts.map +0 -1
  462. package/dist/test/src/portfolio/PortfolioManager.js +0 -224
  463. package/dist/test/src/portfolio/types.d.ts +0 -18
  464. package/dist/test/src/portfolio/types.d.ts.map +0 -1
  465. package/dist/test/src/portfolio/types.js +0 -13
  466. package/dist/test/src/security/InputValidator.d.ts +0 -80
  467. package/dist/test/src/security/InputValidator.d.ts.map +0 -1
  468. package/dist/test/src/security/InputValidator.js +0 -436
  469. package/dist/test/src/security/audit/SecurityAuditor.d.ts +0 -44
  470. package/dist/test/src/security/audit/SecurityAuditor.d.ts.map +0 -1
  471. package/dist/test/src/security/audit/SecurityAuditor.js +0 -274
  472. package/dist/test/src/security/audit/config/suppressions.d.ts +0 -34
  473. package/dist/test/src/security/audit/config/suppressions.d.ts.map +0 -1
  474. package/dist/test/src/security/audit/config/suppressions.js +0 -575
  475. package/dist/test/src/security/audit/index.d.ts +0 -14
  476. package/dist/test/src/security/audit/index.d.ts.map +0 -1
  477. package/dist/test/src/security/audit/index.js +0 -15
  478. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts +0 -46
  479. package/dist/test/src/security/audit/reporters/ConsoleReporter.d.ts.map +0 -1
  480. package/dist/test/src/security/audit/reporters/ConsoleReporter.js +0 -174
  481. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts +0 -13
  482. package/dist/test/src/security/audit/reporters/JsonReporter.d.ts.map +0 -1
  483. package/dist/test/src/security/audit/reporters/JsonReporter.js +0 -25
  484. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts +0 -13
  485. package/dist/test/src/security/audit/reporters/MarkdownReporter.d.ts.map +0 -1
  486. package/dist/test/src/security/audit/reporters/MarkdownReporter.js +0 -79
  487. package/dist/test/src/security/audit/rules/SecurityRules.d.ts +0 -20
  488. package/dist/test/src/security/audit/rules/SecurityRules.d.ts.map +0 -1
  489. package/dist/test/src/security/audit/rules/SecurityRules.js +0 -244
  490. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts +0 -47
  491. package/dist/test/src/security/audit/scanners/CodeScanner.d.ts.map +0 -1
  492. package/dist/test/src/security/audit/scanners/CodeScanner.js +0 -174
  493. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts +0 -13
  494. package/dist/test/src/security/audit/scanners/ConfigurationScanner.d.ts.map +0 -1
  495. package/dist/test/src/security/audit/scanners/ConfigurationScanner.js +0 -22
  496. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts +0 -13
  497. package/dist/test/src/security/audit/scanners/DependencyScanner.d.ts.map +0 -1
  498. package/dist/test/src/security/audit/scanners/DependencyScanner.js +0 -22
  499. package/dist/test/src/security/audit/types.d.ts +0 -94
  500. package/dist/test/src/security/audit/types.d.ts.map +0 -1
  501. package/dist/test/src/security/audit/types.js +0 -6
  502. package/dist/test/src/security/commandValidator.d.ts +0 -7
  503. package/dist/test/src/security/commandValidator.d.ts.map +0 -1
  504. package/dist/test/src/security/commandValidator.js +0 -78
  505. package/dist/test/src/security/constants.d.ts +0 -24
  506. package/dist/test/src/security/constants.d.ts.map +0 -1
  507. package/dist/test/src/security/constants.js +0 -26
  508. package/dist/test/src/security/contentValidator.d.ts +0 -47
  509. package/dist/test/src/security/contentValidator.d.ts.map +0 -1
  510. package/dist/test/src/security/contentValidator.js +0 -301
  511. package/dist/test/src/security/errors.d.ts +0 -14
  512. package/dist/test/src/security/errors.d.ts.map +0 -1
  513. package/dist/test/src/security/errors.js +0 -28
  514. package/dist/test/src/security/fileLockManager.d.ts +0 -70
  515. package/dist/test/src/security/fileLockManager.d.ts.map +0 -1
  516. package/dist/test/src/security/fileLockManager.js +0 -187
  517. package/dist/test/src/security/index.d.ts +0 -12
  518. package/dist/test/src/security/index.d.ts.map +0 -1
  519. package/dist/test/src/security/index.js +0 -14
  520. package/dist/test/src/security/pathValidator.d.ts +0 -9
  521. package/dist/test/src/security/pathValidator.d.ts.map +0 -1
  522. package/dist/test/src/security/pathValidator.js +0 -98
  523. package/dist/test/src/security/regexValidator.d.ts +0 -59
  524. package/dist/test/src/security/regexValidator.d.ts.map +0 -1
  525. package/dist/test/src/security/regexValidator.js +0 -214
  526. package/dist/test/src/security/secureYamlParser.d.ts +0 -46
  527. package/dist/test/src/security/secureYamlParser.d.ts.map +0 -1
  528. package/dist/test/src/security/secureYamlParser.js +0 -203
  529. package/dist/test/src/security/securityMonitor.d.ts +0 -58
  530. package/dist/test/src/security/securityMonitor.d.ts.map +0 -1
  531. package/dist/test/src/security/securityMonitor.js +0 -108
  532. package/dist/test/src/security/tokenManager.d.ts +0 -85
  533. package/dist/test/src/security/tokenManager.d.ts.map +0 -1
  534. package/dist/test/src/security/tokenManager.js +0 -286
  535. package/dist/test/src/security/validators/unicodeValidator.d.ts +0 -97
  536. package/dist/test/src/security/validators/unicodeValidator.d.ts.map +0 -1
  537. package/dist/test/src/security/validators/unicodeValidator.js +0 -312
  538. package/dist/test/src/security/yamlValidator.d.ts +0 -21
  539. package/dist/test/src/security/yamlValidator.d.ts.map +0 -1
  540. package/dist/test/src/security/yamlValidator.js +0 -164
  541. package/dist/test/src/server/ServerSetup.d.ts +0 -35
  542. package/dist/test/src/server/ServerSetup.d.ts.map +0 -1
  543. package/dist/test/src/server/ServerSetup.js +0 -116
  544. package/dist/test/src/server/index.d.ts +0 -7
  545. package/dist/test/src/server/index.d.ts.map +0 -1
  546. package/dist/test/src/server/index.js +0 -7
  547. package/dist/test/src/server/startup.d.ts +0 -31
  548. package/dist/test/src/server/startup.d.ts.map +0 -1
  549. package/dist/test/src/server/startup.js +0 -67
  550. package/dist/test/src/server/tools/CollectionTools.d.ts +0 -10
  551. package/dist/test/src/server/tools/CollectionTools.d.ts.map +0 -1
  552. package/dist/test/src/server/tools/CollectionTools.js +0 -96
  553. package/dist/test/src/server/tools/ConfigTools.d.ts +0 -10
  554. package/dist/test/src/server/tools/ConfigTools.d.ts.map +0 -1
  555. package/dist/test/src/server/tools/ConfigTools.js +0 -63
  556. package/dist/test/src/server/tools/MarketplaceTools.d.ts +0 -10
  557. package/dist/test/src/server/tools/MarketplaceTools.d.ts.map +0 -1
  558. package/dist/test/src/server/tools/MarketplaceTools.js +0 -92
  559. package/dist/test/src/server/tools/PersonaTools.d.ts +0 -10
  560. package/dist/test/src/server/tools/PersonaTools.d.ts.map +0 -1
  561. package/dist/test/src/server/tools/PersonaTools.js +0 -257
  562. package/dist/test/src/server/tools/ToolRegistry.d.ts +0 -37
  563. package/dist/test/src/server/tools/ToolRegistry.d.ts.map +0 -1
  564. package/dist/test/src/server/tools/ToolRegistry.js +0 -40
  565. package/dist/test/src/server/tools/UpdateTools.d.ts +0 -10
  566. package/dist/test/src/server/tools/UpdateTools.d.ts.map +0 -1
  567. package/dist/test/src/server/tools/UpdateTools.js +0 -64
  568. package/dist/test/src/server/tools/UserTools.d.ts +0 -10
  569. package/dist/test/src/server/tools/UserTools.d.ts.map +0 -1
  570. package/dist/test/src/server/tools/UserTools.js +0 -51
  571. package/dist/test/src/server/tools/index.d.ts +0 -10
  572. package/dist/test/src/server/tools/index.d.ts.map +0 -1
  573. package/dist/test/src/server/tools/index.js +0 -10
  574. package/dist/test/src/server/types.d.ts +0 -34
  575. package/dist/test/src/server/types.d.ts.map +0 -1
  576. package/dist/test/src/server/types.js +0 -5
  577. package/dist/test/src/tools/debug.d.ts +0 -20
  578. package/dist/test/src/tools/debug.d.ts.map +0 -1
  579. package/dist/test/src/tools/debug.js +0 -37
  580. package/dist/test/src/types/cache.d.ts +0 -8
  581. package/dist/test/src/types/cache.d.ts.map +0 -1
  582. package/dist/test/src/types/cache.js +0 -5
  583. package/dist/test/src/types/collection.d.ts +0 -23
  584. package/dist/test/src/types/collection.d.ts.map +0 -1
  585. package/dist/test/src/types/collection.js +0 -5
  586. package/dist/test/src/types/elements/IElement.d.ts +0 -123
  587. package/dist/test/src/types/elements/IElement.d.ts.map +0 -1
  588. package/dist/test/src/types/elements/IElement.js +0 -30
  589. package/dist/test/src/types/elements/IElementManager.d.ts +0 -65
  590. package/dist/test/src/types/elements/IElementManager.d.ts.map +0 -1
  591. package/dist/test/src/types/elements/IElementManager.js +0 -6
  592. package/dist/test/src/types/elements/IRatingManager.d.ts +0 -109
  593. package/dist/test/src/types/elements/IRatingManager.d.ts.map +0 -1
  594. package/dist/test/src/types/elements/IRatingManager.js +0 -6
  595. package/dist/test/src/types/elements/IReferenceResolver.d.ts +0 -52
  596. package/dist/test/src/types/elements/IReferenceResolver.d.ts.map +0 -1
  597. package/dist/test/src/types/elements/IReferenceResolver.js +0 -6
  598. package/dist/test/src/types/elements/RatingBreakdowns.d.ts +0 -49
  599. package/dist/test/src/types/elements/RatingBreakdowns.d.ts.map +0 -1
  600. package/dist/test/src/types/elements/RatingBreakdowns.js +0 -6
  601. package/dist/test/src/types/elements/index.d.ts +0 -9
  602. package/dist/test/src/types/elements/index.d.ts.map +0 -1
  603. package/dist/test/src/types/elements/index.js +0 -11
  604. package/dist/test/src/types/index.d.ts +0 -9
  605. package/dist/test/src/types/index.d.ts.map +0 -1
  606. package/dist/test/src/types/index.js +0 -9
  607. package/dist/test/src/types/marketplace.d.ts +0 -23
  608. package/dist/test/src/types/marketplace.d.ts.map +0 -1
  609. package/dist/test/src/types/marketplace.js +0 -5
  610. package/dist/test/src/types/mcp.d.ts +0 -84
  611. package/dist/test/src/types/mcp.d.ts.map +0 -1
  612. package/dist/test/src/types/mcp.js +0 -80
  613. package/dist/test/src/types/persona.d.ts +0 -30
  614. package/dist/test/src/types/persona.d.ts.map +0 -1
  615. package/dist/test/src/types/persona.js +0 -5
  616. package/dist/test/src/update/BackupManager.d.ts +0 -46
  617. package/dist/test/src/update/BackupManager.d.ts.map +0 -1
  618. package/dist/test/src/update/BackupManager.js +0 -261
  619. package/dist/test/src/update/DependencyChecker.d.ts +0 -41
  620. package/dist/test/src/update/DependencyChecker.d.ts.map +0 -1
  621. package/dist/test/src/update/DependencyChecker.js +0 -132
  622. package/dist/test/src/update/RateLimiter.d.ts +0 -80
  623. package/dist/test/src/update/RateLimiter.d.ts.map +0 -1
  624. package/dist/test/src/update/RateLimiter.js +0 -172
  625. package/dist/test/src/update/SignatureVerifier.d.ts +0 -71
  626. package/dist/test/src/update/SignatureVerifier.d.ts.map +0 -1
  627. package/dist/test/src/update/SignatureVerifier.js +0 -214
  628. package/dist/test/src/update/UpdateChecker.d.ts +0 -127
  629. package/dist/test/src/update/UpdateChecker.d.ts.map +0 -1
  630. package/dist/test/src/update/UpdateChecker.js +0 -469
  631. package/dist/test/src/update/UpdateManager.d.ts +0 -41
  632. package/dist/test/src/update/UpdateManager.d.ts.map +0 -1
  633. package/dist/test/src/update/UpdateManager.js +0 -260
  634. package/dist/test/src/update/VersionManager.d.ts +0 -31
  635. package/dist/test/src/update/VersionManager.d.ts.map +0 -1
  636. package/dist/test/src/update/VersionManager.js +0 -134
  637. package/dist/test/src/update/index.d.ts +0 -9
  638. package/dist/test/src/update/index.d.ts.map +0 -1
  639. package/dist/test/src/update/index.js +0 -9
  640. package/dist/test/src/utils/filesystem.d.ts +0 -29
  641. package/dist/test/src/utils/filesystem.d.ts.map +0 -1
  642. package/dist/test/src/utils/filesystem.js +0 -94
  643. package/dist/test/src/utils/git.d.ts +0 -32
  644. package/dist/test/src/utils/git.d.ts.map +0 -1
  645. package/dist/test/src/utils/git.js +0 -65
  646. package/dist/test/src/utils/index.d.ts +0 -7
  647. package/dist/test/src/utils/index.d.ts.map +0 -1
  648. package/dist/test/src/utils/index.js +0 -7
  649. package/dist/test/src/utils/logger.d.ts +0 -45
  650. package/dist/test/src/utils/logger.d.ts.map +0 -1
  651. package/dist/test/src/utils/logger.js +0 -91
  652. package/dist/test/src/utils/version.d.ts +0 -25
  653. package/dist/test/src/utils/version.d.ts.map +0 -1
  654. package/dist/test/src/utils/version.js +0 -97
  655. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts +0 -33
  656. package/dist/test/test/__tests__/integration/helpers/file-utils.d.ts.map +0 -1
  657. package/dist/test/test/__tests__/integration/helpers/file-utils.js +0 -83
  658. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts +0 -26
  659. package/dist/test/test/__tests__/integration/helpers/test-fixtures.d.ts.map +0 -1
  660. package/dist/test/test/__tests__/integration/helpers/test-fixtures.js +0 -95
  661. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts +0 -26
  662. package/dist/test/test/__tests__/integration/helpers/test-server.d.ts.map +0 -1
  663. package/dist/test/test/__tests__/integration/helpers/test-server.js +0 -41
  664. package/dist/test/test/__tests__/integration/setup.d.ts +0 -8
  665. package/dist/test/test/__tests__/integration/setup.d.ts.map +0 -1
  666. package/dist/test/test/__tests__/integration/setup.js +0 -31
  667. package/dist/test/test/__tests__/integration/teardown.d.ts +0 -5
  668. package/dist/test/test/__tests__/integration/teardown.d.ts.map +0 -1
  669. package/dist/test/test/__tests__/integration/teardown.js +0 -23
  670. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts +0 -34
  671. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.d.ts.map +0 -1
  672. package/dist/test/test/__tests__/security/framework/RapidSecurityTesting.js +0 -224
  673. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts +0 -89
  674. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.d.ts.map +0 -1
  675. package/dist/test/test/__tests__/security/framework/SecurityTestFramework.js +0 -543
  676. package/dist/test/test/__tests__/security/index.d.ts +0 -46
  677. package/dist/test/test/__tests__/security/index.d.ts.map +0 -1
  678. package/dist/test/test/__tests__/security/index.js +0 -98
  679. package/dist/test/test/__tests__/security/setup.d.ts +0 -3
  680. package/dist/test/test/__tests__/security/setup.d.ts.map +0 -1
  681. package/dist/test/test/__tests__/security/setup.js +0 -23
  682. package/dist/types/marketplace.d.ts +0 -23
  683. package/dist/types/marketplace.d.ts.map +0 -1
  684. package/dist/types/marketplace.js +0 -5
@@ -1,502 +0,0 @@
1
- /**
2
- * Persona sharing functionality via URLs
3
- */
4
- import { PersonaExporter } from './PersonaExporter.js';
5
- import { TokenManager } from '../../security/tokenManager.js';
6
- import { SecurityError } from '../../security/errors.js';
7
- import { logger } from '../../utils/logger.js';
8
- import { RateLimiter } from '../../update/RateLimiter.js';
9
- export class PersonaSharer {
10
- githubClient;
11
- currentUser;
12
- exporter;
13
- githubRateLimiter;
14
- constructor(githubClient, currentUser) {
15
- this.githubClient = githubClient;
16
- this.currentUser = currentUser;
17
- this.exporter = new PersonaExporter(currentUser);
18
- // GitHub API rate limit: 60 requests per hour for unauthenticated
19
- // 5000 per hour for authenticated - use TokenManager to check
20
- const hasValidToken = TokenManager.getGitHubToken() !== null;
21
- this.githubRateLimiter = new RateLimiter({
22
- maxRequests: hasValidToken ? 100 : 30, // Conservative limits
23
- windowMs: 60 * 60 * 1000, // 1 hour
24
- minDelayMs: 1000 // Minimum 1 second between requests
25
- });
26
- }
27
- /**
28
- * Share a persona via GitHub Gist
29
- */
30
- async sharePersona(persona, expiryDays = 7) {
31
- try {
32
- // Validate gist permissions if token is available
33
- const token = TokenManager.getGitHubToken();
34
- let hasValidToken = false;
35
- if (token) {
36
- try {
37
- const validation = await TokenManager.ensureTokenPermissions('gist');
38
- if (!validation.isValid) {
39
- const safeMessage = TokenManager.createSafeErrorMessage(validation.error || 'Unknown validation error', token);
40
- logger.warn('GitHub token lacks gist permissions, falling back to base64 URL', { error: safeMessage });
41
- // Continue to fallback instead of failing
42
- }
43
- else {
44
- hasValidToken = true;
45
- }
46
- }
47
- catch (error) {
48
- // Handle rate limiting or other security errors gracefully
49
- if (error instanceof SecurityError && error.code === 'RATE_LIMIT_EXCEEDED') {
50
- logger.warn('Token validation rate limited, falling back to base64 URL', {
51
- error: 'Rate limit exceeded for token validation'
52
- });
53
- }
54
- else if (error instanceof Error) {
55
- const safeMessage = TokenManager.createSafeErrorMessage(error.message, token);
56
- logger.warn('Token validation failed, falling back to base64 URL', { error: safeMessage });
57
- }
58
- // Continue to fallback instead of failing
59
- }
60
- }
61
- // Export persona to structured format
62
- const exportData = this.exporter.exportPersona(persona);
63
- // Add sharing metadata
64
- const shareData = {
65
- ...exportData,
66
- sharedAt: new Date().toISOString(),
67
- sharedBy: this.currentUser || 'anonymous',
68
- expiresAt: new Date(Date.now() + expiryDays * 24 * 60 * 60 * 1000).toISOString(),
69
- shareVersion: '1.0.0'
70
- };
71
- // Create GitHub Gist if token has proper permissions
72
- if (hasValidToken) {
73
- const gistResult = await this.createGist(persona.metadata.name, shareData);
74
- if (gistResult.success) {
75
- return {
76
- success: true,
77
- url: gistResult.url,
78
- gistId: gistResult.gistId,
79
- expiresAt: shareData.expiresAt,
80
- message: this.formatShareSuccess(gistResult.url, shareData.expiresAt)
81
- };
82
- }
83
- }
84
- // Fallback to base64 URL if Gist fails or no token
85
- return this.createBase64Url(shareData);
86
- }
87
- catch (error) {
88
- const errorMessage = error instanceof Error ? error.message : String(error);
89
- const safeMessage = TokenManager.createSafeErrorMessage(errorMessage);
90
- logger.error('Share error', { error: safeMessage });
91
- return {
92
- success: false,
93
- message: `Failed to share persona: ${safeMessage}`
94
- };
95
- }
96
- }
97
- /**
98
- * Import a persona from a share URL
99
- */
100
- async importFromUrl(url) {
101
- try {
102
- // Validate URL first
103
- if (!this.validateShareUrl(url)) {
104
- return {
105
- success: false,
106
- message: 'Invalid or unsafe URL provided'
107
- };
108
- }
109
- // Check if it's a GitHub Gist URL
110
- const gistId = this.extractGistId(url);
111
- if (gistId) {
112
- return await this.importFromGist(gistId);
113
- }
114
- // Check if it's a base64 URL
115
- if (url.includes('#dollhouse-persona=')) {
116
- return this.importFromBase64Url(url);
117
- }
118
- // Validate URL for security
119
- if (!this.validateShareUrl(url)) {
120
- throw new Error('Invalid or potentially malicious URL');
121
- }
122
- // Try direct fetch with timeout
123
- const controller = new AbortController();
124
- const timeoutId = setTimeout(() => controller.abort(), 5000); // 5 second timeout
125
- try {
126
- const response = await fetch(url, {
127
- signal: controller.signal,
128
- headers: {
129
- 'User-Agent': 'DollhouseMCP/1.0',
130
- 'Accept': 'application/json'
131
- }
132
- });
133
- clearTimeout(timeoutId);
134
- if (!response.ok) {
135
- throw new Error(`Request failed with status ${response.status}`);
136
- }
137
- // Validate Content-Type header
138
- const contentType = response.headers.get('content-type');
139
- if (!contentType || !contentType.toLowerCase().includes('application/json')) {
140
- throw new Error('Invalid response type: expected JSON');
141
- }
142
- // Check response size to prevent memory exhaustion
143
- const contentLength = response.headers.get('content-length');
144
- const maxSize = 5 * 1024 * 1024; // 5MB max
145
- if (contentLength && parseInt(contentLength) > maxSize) {
146
- throw new Error('Response too large');
147
- }
148
- const data = await response.json();
149
- return {
150
- success: true,
151
- data,
152
- message: 'Successfully retrieved persona data'
153
- };
154
- }
155
- finally {
156
- clearTimeout(timeoutId);
157
- }
158
- }
159
- catch (error) {
160
- logger.error('Import from URL error', error);
161
- return {
162
- success: false,
163
- message: `Failed to import from URL: ${error instanceof Error ? error.message : String(error)}`
164
- };
165
- }
166
- }
167
- /**
168
- * Create a GitHub Gist
169
- */
170
- async createGist(personaName, data) {
171
- try {
172
- // Use TokenManager for secure token handling
173
- const token = TokenManager.getGitHubToken();
174
- if (!token) {
175
- logger.info('No valid GitHub token available for Gist creation');
176
- return { success: false };
177
- }
178
- // Check rate limit
179
- const rateLimitStatus = this.githubRateLimiter.checkLimit();
180
- if (!rateLimitStatus.allowed) {
181
- logger.warn(`GitHub API rate limit exceeded. Retry after ${rateLimitStatus.retryAfterMs}ms`);
182
- return { success: false };
183
- }
184
- const controller = new AbortController();
185
- const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout
186
- try {
187
- const response = await fetch('https://api.github.com/gists', {
188
- method: 'POST',
189
- signal: controller.signal,
190
- headers: {
191
- 'Authorization': `Bearer ${token}`,
192
- 'Accept': 'application/vnd.github.v3+json',
193
- 'Content-Type': 'application/json',
194
- 'User-Agent': 'DollhouseMCP/1.0'
195
- },
196
- body: JSON.stringify({
197
- description: `DollhouseMCP Persona: ${personaName}`,
198
- public: false, // Private gist for security
199
- files: {
200
- 'persona.json': {
201
- content: JSON.stringify(data, null, 2)
202
- }
203
- }
204
- })
205
- });
206
- clearTimeout(timeoutId);
207
- if (!response.ok) {
208
- throw new Error(`GitHub API error: ${response.status}`);
209
- }
210
- // Validate Content-Type for GitHub API response
211
- const contentType = response.headers.get('content-type');
212
- if (!contentType || !contentType.toLowerCase().includes('application/json')) {
213
- throw new Error('Invalid GitHub API response type');
214
- }
215
- const gist = await response.json();
216
- // Consume the rate limit token after successful request
217
- this.githubRateLimiter.consumeToken();
218
- return {
219
- success: true,
220
- url: gist.html_url,
221
- gistId: gist.id
222
- };
223
- }
224
- finally {
225
- clearTimeout(timeoutId);
226
- }
227
- }
228
- catch (error) {
229
- const errorMessage = error instanceof Error ? error.message : String(error);
230
- const safeMessage = TokenManager.createSafeErrorMessage(errorMessage);
231
- logger.error('Gist creation error', { error: safeMessage });
232
- return { success: false };
233
- }
234
- }
235
- /**
236
- * Create a base64 URL (fallback)
237
- */
238
- createBase64Url(data) {
239
- const base64 = this.exporter.toBase64(data);
240
- const url = `https://dollhousemcp.com/import#dollhouse-persona=${base64}`;
241
- return {
242
- success: true,
243
- url,
244
- expiresAt: data.expiresAt,
245
- message: this.formatShareSuccess(url, data.expiresAt)
246
- };
247
- }
248
- /**
249
- * Import from GitHub Gist
250
- */
251
- async importFromGist(gistId) {
252
- try {
253
- // Check rate limit
254
- const rateLimitStatus = this.githubRateLimiter.checkLimit();
255
- if (!rateLimitStatus.allowed) {
256
- throw new Error(`GitHub API rate limit exceeded. Please try again in ${Math.ceil(rateLimitStatus.retryAfterMs / 1000)} seconds`);
257
- }
258
- const gistUrl = `https://api.github.com/gists/${gistId}`;
259
- // Validate URL (should always pass for GitHub API)
260
- if (!this.validateShareUrl(gistUrl)) {
261
- throw new Error('Invalid GitHub API URL');
262
- }
263
- const controller = new AbortController();
264
- const timeoutId = setTimeout(() => controller.abort(), 10000); // 10 second timeout for API
265
- try {
266
- const response = await fetch(gistUrl, {
267
- signal: controller.signal,
268
- headers: {
269
- 'Accept': 'application/vnd.github.v3+json',
270
- 'User-Agent': 'DollhouseMCP/1.0'
271
- }
272
- });
273
- clearTimeout(timeoutId);
274
- if (!response.ok) {
275
- throw new Error(`Failed to fetch gist: ${response.status}`);
276
- }
277
- // Validate Content-Type for GitHub API response
278
- const contentType = response.headers.get('content-type');
279
- if (!contentType || !contentType.toLowerCase().includes('application/json')) {
280
- throw new Error('Invalid GitHub API response type');
281
- }
282
- const gist = await response.json();
283
- const personaFile = gist.files['persona.json'];
284
- if (!personaFile) {
285
- throw new Error('No persona data found in gist');
286
- }
287
- const data = JSON.parse(personaFile.content);
288
- // Check expiry
289
- if (data.expiresAt && new Date(data.expiresAt) < new Date()) {
290
- return {
291
- success: false,
292
- message: 'This share link has expired'
293
- };
294
- }
295
- // Consume the rate limit token after successful request
296
- this.githubRateLimiter.consumeToken();
297
- return {
298
- success: true,
299
- data,
300
- message: 'Successfully retrieved persona from GitHub'
301
- };
302
- }
303
- finally {
304
- clearTimeout(timeoutId);
305
- }
306
- }
307
- catch (error) {
308
- logger.error('Gist import error', error);
309
- return {
310
- success: false,
311
- message: `Failed to import from gist: ${error instanceof Error ? error.message : String(error)}`
312
- };
313
- }
314
- }
315
- /**
316
- * Validate URL for security (prevent SSRF attacks)
317
- */
318
- validateShareUrl(url) {
319
- try {
320
- // 1. URL length check to prevent DoS
321
- if (url.length > 2048) {
322
- logger.warn('URL exceeds maximum length', { urlLength: url.length });
323
- return false;
324
- }
325
- const parsed = new URL(url);
326
- // 2. Protocol check - only allow http/https
327
- if (!['https:', 'http:'].includes(parsed.protocol)) {
328
- logger.warn('Invalid protocol in URL', { protocol: parsed.protocol });
329
- return false;
330
- }
331
- // 3. Port restrictions - block non-standard ports that could be internal services
332
- const port = parsed.port || (parsed.protocol === 'https:' ? '443' : '80');
333
- const allowedPorts = ['80', '443', '8080', '8443'];
334
- if (!allowedPorts.includes(port)) {
335
- logger.warn('Blocked non-standard port', { port });
336
- return false;
337
- }
338
- // 4. Hostname validation
339
- const hostname = parsed.hostname.toLowerCase();
340
- // Block various localhost representations
341
- const blockedHostnames = [
342
- 'localhost',
343
- 'localhost.localdomain',
344
- '0.0.0.0',
345
- '0',
346
- '0x0',
347
- '0x00000000',
348
- '[::1]',
349
- '[::ffff:127.0.0.1]',
350
- '[0000:0000:0000:0000:0000:0000:0000:0001]'
351
- ];
352
- if (blockedHostnames.includes(hostname)) {
353
- logger.warn('Blocked localhost hostname', { hostname });
354
- return false;
355
- }
356
- // Block private IP ranges with comprehensive patterns
357
- const privateIpPatterns = [
358
- /^127\./, // Loopback
359
- /^10\./, // Private class A
360
- /^192\.168\./, // Private class C
361
- /^172\.(1[6-9]|2[0-9]|3[0-1])\./, // Private class B
362
- /^169\.254\./, // Link-local
363
- /^fc00:/i, // IPv6 private
364
- /^fe80:/i, // IPv6 link-local
365
- /^::1$/, // IPv6 loopback
366
- /^::ffff:0?:?0?:?0?:?0?$/i, // IPv6 mapped IPv4
367
- /^100\.6[4-9]\./, // Carrier-grade NAT
368
- /^100\.[7-9][0-9]\./, // Carrier-grade NAT
369
- /^100\.1[0-2][0-9]\./, // Carrier-grade NAT
370
- /^0\./, // Reserved
371
- /^255\.255\.255\.255$/ // Broadcast
372
- ];
373
- if (privateIpPatterns.some(pattern => pattern.test(hostname))) {
374
- logger.warn('Blocked private IP range', { hostname });
375
- return false;
376
- }
377
- // Block cloud metadata endpoints
378
- const metadataEndpoints = [
379
- '169.254.169.254', // AWS/GCP/Azure
380
- 'metadata.google.internal',
381
- 'metadata.azure.com',
382
- '100.100.100.200' // Alibaba Cloud
383
- ];
384
- if (metadataEndpoints.includes(hostname)) {
385
- logger.warn('Blocked cloud metadata endpoint', { hostname });
386
- return false;
387
- }
388
- // Block numeric IP representations that could bypass checks
389
- if (/^\d+$/.test(hostname)) {
390
- // Convert decimal to IP and check
391
- const num = parseInt(hostname, 10);
392
- if (num <= 0xFFFFFFFF) {
393
- const ip = `${(num >>> 24) & 0xFF}.${(num >>> 16) & 0xFF}.${(num >>> 8) & 0xFF}.${num & 0xFF}`;
394
- logger.warn('Blocked numeric IP representation', { hostname, resolvedIp: ip });
395
- return false;
396
- }
397
- }
398
- // Block hex IP representations
399
- if (/^0x[0-9a-f]+$/i.test(hostname)) {
400
- logger.warn('Blocked hex IP representation', { hostname });
401
- return false;
402
- }
403
- // Validate domain format (basic check)
404
- // Allow GitHub domains and common share platforms
405
- const trustedDomains = [
406
- 'github.com',
407
- 'gist.github.com',
408
- 'api.github.com',
409
- 'raw.githubusercontent.com',
410
- 'dollhousemcp.com'
411
- ];
412
- // Check if it's a trusted domain
413
- const isTrustedDomain = trustedDomains.some(domain => hostname === domain || hostname.endsWith(`.${domain}`));
414
- if (!isTrustedDomain) {
415
- // For non-trusted domains, apply stricter validation
416
- // Must be a valid domain format, not just an IP
417
- const domainPattern = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i;
418
- const ipv4Pattern = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
419
- const ipv6Pattern = /^\[?([0-9a-f]{0,4}:){2,7}[0-9a-f]{0,4}\]?$/i;
420
- if (ipv4Pattern.test(hostname) || ipv6Pattern.test(hostname)) {
421
- logger.warn('Direct IP access not allowed for untrusted sources', { hostname });
422
- return false;
423
- }
424
- if (!domainPattern.test(hostname)) {
425
- logger.warn('Invalid domain format', { hostname });
426
- return false;
427
- }
428
- }
429
- logger.debug('URL validation passed', {
430
- hostname,
431
- protocol: parsed.protocol,
432
- isTrusted: isTrustedDomain
433
- });
434
- return true;
435
- }
436
- catch (error) {
437
- logger.warn('URL validation error', { error: error instanceof Error ? error.message : 'Unknown error' });
438
- return false;
439
- }
440
- }
441
- /**
442
- * Import from base64 URL
443
- */
444
- importFromBase64Url(url) {
445
- try {
446
- // Limit base64 length to prevent ReDoS attacks (10KB max for base64 encoded data)
447
- const match = url.match(/#dollhouse-persona=([A-Za-z0-9+/=]{1,10000})$/);
448
- if (!match) {
449
- throw new Error('Invalid share URL format');
450
- }
451
- const base64 = match[1];
452
- const json = Buffer.from(base64, 'base64').toString('utf-8');
453
- const data = JSON.parse(json);
454
- // Check expiry
455
- if (data.expiresAt && new Date(data.expiresAt) < new Date()) {
456
- return {
457
- success: false,
458
- message: 'This share link has expired'
459
- };
460
- }
461
- return {
462
- success: true,
463
- data,
464
- message: 'Successfully decoded persona data'
465
- };
466
- }
467
- catch (error) {
468
- return {
469
- success: false,
470
- message: `Failed to decode share URL: ${error instanceof Error ? error.message : String(error)}`
471
- };
472
- }
473
- }
474
- /**
475
- * Extract Gist ID from GitHub URL
476
- */
477
- extractGistId(url) {
478
- const match = url.match(/gist\.github\.com\/[^\/]+\/([a-f0-9]+)/);
479
- return match ? match[1] : null;
480
- }
481
- /**
482
- * Format share success message
483
- */
484
- formatShareSuccess(url, expiresAt) {
485
- const expiryDate = new Date(expiresAt);
486
- const daysUntilExpiry = Math.ceil((expiryDate.getTime() - Date.now()) / (24 * 60 * 60 * 1000));
487
- return `✅ Successfully created share link!
488
-
489
- 🔗 Share URL:
490
- ${url}
491
-
492
- ⏱️ Expires: ${expiryDate.toLocaleDateString()} (${daysUntilExpiry} days)
493
-
494
- 📋 To share this persona:
495
- 1. Copy the URL above
496
- 2. Share it with others
497
- 3. They can import using: import_from_url "${url}"
498
-
499
- 🔒 Privacy: This link is private and will expire automatically.`;
500
- }
501
- }
502
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVyc29uYVNoYXJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wZXJzb25hL2V4cG9ydC1pbXBvcnQvUGVyc29uYVNoYXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUdILE9BQU8sRUFBRSxlQUFlLEVBQW1CLE1BQU0sc0JBQXNCLENBQUM7QUFFeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBVTFELE1BQU0sT0FBTyxhQUFhO0lBS2Q7SUFDQTtJQUxGLFFBQVEsQ0FBa0I7SUFDMUIsaUJBQWlCLENBQWM7SUFFdkMsWUFDVSxZQUEwQixFQUMxQixXQUEwQjtRQUQxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQUVsQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWpELGtFQUFrRTtRQUNsRSw4REFBOEQ7UUFDOUQsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLGNBQWMsRUFBRSxLQUFLLElBQUksQ0FBQztRQUM3RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDdkMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsc0JBQXNCO1lBQzdELFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxTQUFTO1lBQ25DLFVBQVUsRUFBRSxJQUFJLENBQUMsb0NBQW9DO1NBQ3RELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBZ0IsRUFBRSxhQUFxQixDQUFDO1FBQ3pELElBQUksQ0FBQztZQUNILGtEQUFrRDtZQUNsRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDNUMsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBRTFCLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxDQUFDO29CQUNILE1BQU0sVUFBVSxHQUFHLE1BQU0sWUFBWSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNyRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN4QixNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSwwQkFBMEIsRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDL0csTUFBTSxDQUFDLElBQUksQ0FBQyxpRUFBaUUsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO3dCQUN2RywwQ0FBMEM7b0JBQzVDLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUN2QixDQUFDO2dCQUNILENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZiwyREFBMkQ7b0JBQzNELElBQUksS0FBSyxZQUFZLGFBQWEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLHFCQUFxQixFQUFFLENBQUM7d0JBQzNFLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkRBQTJELEVBQUU7NEJBQ3ZFLEtBQUssRUFBRSwwQ0FBMEM7eUJBQ2xELENBQUMsQ0FBQztvQkFDTCxDQUFDO3lCQUFNLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO3dCQUNsQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDOUUsTUFBTSxDQUFDLElBQUksQ0FBQyxxREFBcUQsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO29CQUM3RixDQUFDO29CQUNELDBDQUEwQztnQkFDNUMsQ0FBQztZQUNILENBQUM7WUFFRCxzQ0FBc0M7WUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFeEQsdUJBQXVCO1lBQ3ZCLE1BQU0sU0FBUyxHQUFHO2dCQUNoQixHQUFHLFVBQVU7Z0JBQ2IsUUFBUSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO2dCQUNsQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxXQUFXO2dCQUN6QyxTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLFVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUU7Z0JBQ2hGLFlBQVksRUFBRSxPQUFPO2FBQ3RCLENBQUM7WUFFRixxREFBcUQ7WUFDckQsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUUzRSxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDdkIsT0FBTzt3QkFDTCxPQUFPLEVBQUUsSUFBSTt3QkFDYixHQUFHLEVBQUUsVUFBVSxDQUFDLEdBQUk7d0JBQ3BCLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTTt3QkFDekIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTO3dCQUM5QixPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxHQUFJLEVBQUUsU0FBUyxDQUFDLFNBQVMsQ0FBQztxQkFDdkUsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELG1EQUFtRDtZQUNuRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFekMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLFlBQVksR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFFcEQsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxPQUFPLEVBQUUsNEJBQTRCLFdBQVcsRUFBRTthQUNuRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBVztRQUM3QixJQUFJLENBQUM7WUFDSCxxQkFBcUI7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxPQUFPO29CQUNMLE9BQU8sRUFBRSxLQUFLO29CQUNkLE9BQU8sRUFBRSxnQ0FBZ0M7aUJBQzFDLENBQUM7WUFDSixDQUFDO1lBQ0Qsa0NBQWtDO1lBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxPQUFPLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBRUQsNkJBQTZCO1lBQzdCLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7WUFFRCw0QkFBNEI7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUVELGdDQUFnQztZQUNoQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxtQkFBbUI7WUFFakYsSUFBSSxDQUFDO2dCQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRTtvQkFDaEMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO29CQUN6QixPQUFPLEVBQUU7d0JBQ1AsWUFBWSxFQUFFLGtCQUFrQjt3QkFDaEMsUUFBUSxFQUFFLGtCQUFrQjtxQkFDN0I7aUJBQ0YsQ0FBQyxDQUFDO2dCQUVILFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ25FLENBQUM7Z0JBRUQsK0JBQStCO2dCQUMvQixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO29CQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7Z0JBQzFELENBQUM7Z0JBRUQsbURBQW1EO2dCQUNuRCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVU7Z0JBQzNDLElBQUksYUFBYSxJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQztvQkFDdkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO2dCQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQyxPQUFPO29CQUNMLE9BQU8sRUFBRSxJQUFJO29CQUNiLElBQUk7b0JBQ0osT0FBTyxFQUFFLHFDQUFxQztpQkFDL0MsQ0FBQztZQUNKLENBQUM7b0JBQVMsQ0FBQztnQkFDVCxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUIsQ0FBQztRQUVILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QyxPQUFPO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLE9BQU8sRUFBRSw4QkFBOEIsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO2FBQ2hHLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFVBQVUsQ0FBQyxXQUFtQixFQUFFLElBQVM7UUFDckQsSUFBSSxDQUFDO1lBQ0gsNkNBQTZDO1lBQzdDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO2dCQUNqRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzVCLENBQUM7WUFFRCxtQkFBbUI7WUFDbkIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0NBQStDLGVBQWUsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDO2dCQUM3RixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQzVCLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7WUFFbkYsSUFBSSxDQUFDO2dCQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLDhCQUE4QixFQUFFO29CQUMzRCxNQUFNLEVBQUUsTUFBTTtvQkFDZCxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07b0JBQzNCLE9BQU8sRUFBRTt3QkFDUCxlQUFlLEVBQUUsVUFBVSxLQUFLLEVBQUU7d0JBQ2xDLFFBQVEsRUFBRSxnQ0FBZ0M7d0JBQzFDLGNBQWMsRUFBRSxrQkFBa0I7d0JBQ2xDLFlBQVksRUFBRSxrQkFBa0I7cUJBQ2pDO29CQUNELElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUNuQixXQUFXLEVBQUUseUJBQXlCLFdBQVcsRUFBRTt3QkFDbkQsTUFBTSxFQUFFLEtBQUssRUFBRSw0QkFBNEI7d0JBQzNDLEtBQUssRUFBRTs0QkFDTCxjQUFjLEVBQUU7Z0NBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7NkJBQ3ZDO3lCQUNGO3FCQUNGLENBQUM7aUJBQ0QsQ0FBQyxDQUFDO2dCQUVILFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzFELENBQUM7Z0JBRUQsZ0RBQWdEO2dCQUNoRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO29CQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQ3RELENBQUM7Z0JBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBRW5DLHdEQUF3RDtnQkFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUV0QyxPQUFPO29CQUNMLE9BQU8sRUFBRSxJQUFJO29CQUNiLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2lCQUNoQixDQUFDO1lBQ0osQ0FBQztvQkFBUyxDQUFDO2dCQUNULFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxQixDQUFDO1FBRUgsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLFlBQVksR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsSUFBUztRQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLEdBQUcsR0FBRyxxREFBcUQsTUFBTSxFQUFFLENBQUM7UUFFMUUsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJO1lBQ2IsR0FBRztZQUNILFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ3RELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQWM7UUFDekMsSUFBSSxDQUFDO1lBQ0gsbUJBQW1CO1lBQ25CLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUM1RCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3BJLENBQUM7WUFFRCxNQUFNLE9BQU8sR0FBRyxnQ0FBZ0MsTUFBTSxFQUFFLENBQUM7WUFFekQsbURBQW1EO1lBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7WUFFM0YsSUFBSSxDQUFDO2dCQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLE9BQU8sRUFBRTtvQkFDcEMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO29CQUN6QixPQUFPLEVBQUU7d0JBQ1AsUUFBUSxFQUFFLGdDQUFnQzt3QkFDMUMsWUFBWSxFQUFFLGtCQUFrQjtxQkFDakM7aUJBQ0YsQ0FBQyxDQUFDO2dCQUVILFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzlELENBQUM7Z0JBRUQsZ0RBQWdEO2dCQUNoRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO29CQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQ3RELENBQUM7Z0JBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBRS9DLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO2dCQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUU3QyxlQUFlO2dCQUNmLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsRUFBRSxDQUFDO29CQUM1RCxPQUFPO3dCQUNMLE9BQU8sRUFBRSxLQUFLO3dCQUNkLE9BQU8sRUFBRSw2QkFBNkI7cUJBQ3ZDLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCx3REFBd0Q7Z0JBQ3hELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFFdEMsT0FBTztvQkFDTCxPQUFPLEVBQUUsSUFBSTtvQkFDYixJQUFJO29CQUNKLE9BQU8sRUFBRSw0Q0FBNEM7aUJBQ3RELENBQUM7WUFDSixDQUFDO29CQUFTLENBQUM7Z0JBQ1QsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFCLENBQUM7UUFFSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekMsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxPQUFPLEVBQUUsK0JBQStCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTthQUNqRyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLEdBQVc7UUFDbEMsSUFBSSxDQUFDO1lBQ0gscUNBQXFDO1lBQ3JDLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztnQkFDckUsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFNUIsNENBQTRDO1lBQzVDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ3RFLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELGtGQUFrRjtZQUNsRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDbkQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQseUJBQXlCO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFL0MsMENBQTBDO1lBQzFDLE1BQU0sZ0JBQWdCLEdBQUc7Z0JBQ3ZCLFdBQVc7Z0JBQ1gsdUJBQXVCO2dCQUN2QixTQUFTO2dCQUNULEdBQUc7Z0JBQ0gsS0FBSztnQkFDTCxZQUFZO2dCQUNaLE9BQU87Z0JBQ1Asb0JBQW9CO2dCQUNwQiwyQ0FBMkM7YUFDNUMsQ0FBQztZQUVGLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCxzREFBc0Q7WUFDdEQsTUFBTSxpQkFBaUIsR0FBRztnQkFDeEIsUUFBUSxFQUFxQyxXQUFXO2dCQUN4RCxPQUFPLEVBQXNDLGtCQUFrQjtnQkFDL0QsYUFBYSxFQUFnQyxrQkFBa0I7Z0JBQy9ELGdDQUFnQyxFQUFXLGtCQUFrQjtnQkFDN0QsYUFBYSxFQUFnQyxhQUFhO2dCQUMxRCxTQUFTLEVBQW9DLGVBQWU7Z0JBQzVELFNBQVMsRUFBb0Msa0JBQWtCO2dCQUMvRCxPQUFPLEVBQXNDLGdCQUFnQjtnQkFDN0QsMEJBQTBCLEVBQWlCLG1CQUFtQjtnQkFDOUQsZ0JBQWdCLEVBQTRCLG9CQUFvQjtnQkFDaEUsb0JBQW9CLEVBQXdCLG9CQUFvQjtnQkFDaEUscUJBQXFCLEVBQXVCLG9CQUFvQjtnQkFDaEUsTUFBTSxFQUF1QyxXQUFXO2dCQUN4RCxzQkFBc0IsQ0FBc0IsWUFBWTthQUN6RCxDQUFDO1lBRUYsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7Z0JBQ3RELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUVELGlDQUFpQztZQUNqQyxNQUFNLGlCQUFpQixHQUFHO2dCQUN4QixpQkFBaUIsRUFBTSxnQkFBZ0I7Z0JBQ3ZDLDBCQUEwQjtnQkFDMUIsb0JBQW9CO2dCQUNwQixpQkFBaUIsQ0FBTSxnQkFBZ0I7YUFDeEMsQ0FBQztZQUVGLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUM3RCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFFRCw0REFBNEQ7WUFDNUQsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLGtDQUFrQztnQkFDbEMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ3RCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO29CQUMvRixNQUFNLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMvRSxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO1lBQ0gsQ0FBQztZQUVELCtCQUErQjtZQUMvQixJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDM0QsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsdUNBQXVDO1lBQ3ZDLGtEQUFrRDtZQUNsRCxNQUFNLGNBQWMsR0FBRztnQkFDckIsWUFBWTtnQkFDWixpQkFBaUI7Z0JBQ2pCLGdCQUFnQjtnQkFDaEIsMkJBQTJCO2dCQUMzQixrQkFBa0I7YUFDbkIsQ0FBQztZQUVGLGlDQUFpQztZQUNqQyxNQUFNLGVBQWUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ25ELFFBQVEsS0FBSyxNQUFNLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQ3ZELENBQUM7WUFFRixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3JCLHFEQUFxRDtnQkFDckQsZ0RBQWdEO2dCQUNoRCxNQUFNLGFBQWEsR0FBRyx5Q0FBeUMsQ0FBQztnQkFDaEUsTUFBTSxXQUFXLEdBQUcsc0NBQXNDLENBQUM7Z0JBQzNELE1BQU0sV0FBVyxHQUFHLDZDQUE2QyxDQUFDO2dCQUVsRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDaEYsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztnQkFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDbkQsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFO2dCQUNwQyxRQUFRO2dCQUNSLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsU0FBUyxFQUFFLGVBQWU7YUFDM0IsQ0FBQyxDQUFDO1lBRUgsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztZQUN6RyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUIsQ0FBQyxHQUFXO1FBQ3JDLElBQUksQ0FBQztZQUNILGtGQUFrRjtZQUNsRixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztZQUM5QyxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTlCLGVBQWU7WUFDZixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDNUQsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxPQUFPLEVBQUUsNkJBQTZCO2lCQUN2QyxDQUFDO1lBQ0osQ0FBQztZQUVELE9BQU87Z0JBQ0wsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsSUFBSTtnQkFDSixPQUFPLEVBQUUsbUNBQW1DO2FBQzdDLENBQUM7UUFFSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFLCtCQUErQixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7YUFDakcsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxhQUFhLENBQUMsR0FBVztRQUMvQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDbEUsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNLLGtCQUFrQixDQUFDLEdBQVcsRUFBRSxTQUFpQjtRQUN2RCxNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUvRixPQUFPOzs7RUFHVCxHQUFHOztjQUVTLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLGVBQWU7Ozs7OzZDQUtwQixHQUFHOztnRUFFZ0IsQ0FBQztJQUMvRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBlcnNvbmEgc2hhcmluZyBmdW5jdGlvbmFsaXR5IHZpYSBVUkxzXG4gKi9cblxuaW1wb3J0IHsgUGVyc29uYSB9IGZyb20gJy4uLy4uL3R5cGVzL3BlcnNvbmEuanMnO1xuaW1wb3J0IHsgUGVyc29uYUV4cG9ydGVyLCBFeHBvcnRlZFBlcnNvbmEgfSBmcm9tICcuL1BlcnNvbmFFeHBvcnRlci5qcyc7XG5pbXBvcnQgeyBHaXRIdWJDbGllbnQgfSBmcm9tICcuLi8uLi9jb2xsZWN0aW9uL0dpdEh1YkNsaWVudC5qcyc7XG5pbXBvcnQgeyBUb2tlbk1hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlFcnJvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi8uLi91cGRhdGUvUmF0ZUxpbWl0ZXIuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlUmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgdXJsPzogc3RyaW5nO1xuICBnaXN0SWQ/OiBzdHJpbmc7XG4gIGV4cGlyZXNBdD86IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUGVyc29uYVNoYXJlciB7XG4gIHByaXZhdGUgZXhwb3J0ZXI6IFBlcnNvbmFFeHBvcnRlcjtcbiAgcHJpdmF0ZSBnaXRodWJSYXRlTGltaXRlcjogUmF0ZUxpbWl0ZXI7XG4gIFxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50LFxuICAgIHByaXZhdGUgY3VycmVudFVzZXI6IHN0cmluZyB8IG51bGxcbiAgKSB7XG4gICAgdGhpcy5leHBvcnRlciA9IG5ldyBQZXJzb25hRXhwb3J0ZXIoY3VycmVudFVzZXIpO1xuICAgIFxuICAgIC8vIEdpdEh1YiBBUEkgcmF0ZSBsaW1pdDogNjAgcmVxdWVzdHMgcGVyIGhvdXIgZm9yIHVuYXV0aGVudGljYXRlZFxuICAgIC8vIDUwMDAgcGVyIGhvdXIgZm9yIGF1dGhlbnRpY2F0ZWQgLSB1c2UgVG9rZW5NYW5hZ2VyIHRvIGNoZWNrXG4gICAgY29uc3QgaGFzVmFsaWRUb2tlbiA9IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbigpICE9PSBudWxsO1xuICAgIHRoaXMuZ2l0aHViUmF0ZUxpbWl0ZXIgPSBuZXcgUmF0ZUxpbWl0ZXIoe1xuICAgICAgbWF4UmVxdWVzdHM6IGhhc1ZhbGlkVG9rZW4gPyAxMDAgOiAzMCwgLy8gQ29uc2VydmF0aXZlIGxpbWl0c1xuICAgICAgd2luZG93TXM6IDYwICogNjAgKiAxMDAwLCAvLyAxIGhvdXJcbiAgICAgIG1pbkRlbGF5TXM6IDEwMDAgLy8gTWluaW11bSAxIHNlY29uZCBiZXR3ZWVuIHJlcXVlc3RzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgYSBwZXJzb25hIHZpYSBHaXRIdWIgR2lzdFxuICAgKi9cbiAgYXN5bmMgc2hhcmVQZXJzb25hKHBlcnNvbmE6IFBlcnNvbmEsIGV4cGlyeURheXM6IG51bWJlciA9IDcpOiBQcm9taXNlPFNoYXJlUmVzdWx0PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIGdpc3QgcGVybWlzc2lvbnMgaWYgdG9rZW4gaXMgYXZhaWxhYmxlXG4gICAgICBjb25zdCB0b2tlbiA9IFRva2VuTWFuYWdlci5nZXRHaXRIdWJUb2tlbigpO1xuICAgICAgbGV0IGhhc1ZhbGlkVG9rZW4gPSBmYWxzZTtcbiAgICAgIFxuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IGF3YWl0IFRva2VuTWFuYWdlci5lbnN1cmVUb2tlblBlcm1pc3Npb25zKCdnaXN0Jyk7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNhZmVNZXNzYWdlID0gVG9rZW5NYW5hZ2VyLmNyZWF0ZVNhZmVFcnJvck1lc3NhZ2UodmFsaWRhdGlvbi5lcnJvciB8fCAnVW5rbm93biB2YWxpZGF0aW9uIGVycm9yJywgdG9rZW4pO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0dpdEh1YiB0b2tlbiBsYWNrcyBnaXN0IHBlcm1pc3Npb25zLCBmYWxsaW5nIGJhY2sgdG8gYmFzZTY0IFVSTCcsIHsgZXJyb3I6IHNhZmVNZXNzYWdlIH0pO1xuICAgICAgICAgICAgLy8gQ29udGludWUgdG8gZmFsbGJhY2sgaW5zdGVhZCBvZiBmYWlsaW5nXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhhc1ZhbGlkVG9rZW4gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBIYW5kbGUgcmF0ZSBsaW1pdGluZyBvciBvdGhlciBzZWN1cml0eSBlcnJvcnMgZ3JhY2VmdWxseVxuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ1JBVEVfTElNSVRfRVhDRUVERUQnKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0ZWQsIGZhbGxpbmcgYmFjayB0byBiYXNlNjQgVVJMJywgeyBcbiAgICAgICAgICAgICAgZXJyb3I6ICdSYXRlIGxpbWl0IGV4Y2VlZGVkIGZvciB0b2tlbiB2YWxpZGF0aW9uJyBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgY29uc3Qgc2FmZU1lc3NhZ2UgPSBUb2tlbk1hbmFnZXIuY3JlYXRlU2FmZUVycm9yTWVzc2FnZShlcnJvci5tZXNzYWdlLCB0b2tlbik7XG4gICAgICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBiYXNlNjQgVVJMJywgeyBlcnJvcjogc2FmZU1lc3NhZ2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENvbnRpbnVlIHRvIGZhbGxiYWNrIGluc3RlYWQgb2YgZmFpbGluZ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEV4cG9ydCBwZXJzb25hIHRvIHN0cnVjdHVyZWQgZm9ybWF0XG4gICAgICBjb25zdCBleHBvcnREYXRhID0gdGhpcy5leHBvcnRlci5leHBvcnRQZXJzb25hKHBlcnNvbmEpO1xuICAgICAgXG4gICAgICAvLyBBZGQgc2hhcmluZyBtZXRhZGF0YVxuICAgICAgY29uc3Qgc2hhcmVEYXRhID0ge1xuICAgICAgICAuLi5leHBvcnREYXRhLFxuICAgICAgICBzaGFyZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBzaGFyZWRCeTogdGhpcy5jdXJyZW50VXNlciB8fCAnYW5vbnltb3VzJyxcbiAgICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZShEYXRlLm5vdygpICsgZXhwaXJ5RGF5cyAqIDI0ICogNjAgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHNoYXJlVmVyc2lvbjogJzEuMC4wJ1xuICAgICAgfTtcblxuICAgICAgLy8gQ3JlYXRlIEdpdEh1YiBHaXN0IGlmIHRva2VuIGhhcyBwcm9wZXIgcGVybWlzc2lvbnNcbiAgICAgIGlmIChoYXNWYWxpZFRva2VuKSB7XG4gICAgICAgIGNvbnN0IGdpc3RSZXN1bHQgPSBhd2FpdCB0aGlzLmNyZWF0ZUdpc3QocGVyc29uYS5tZXRhZGF0YS5uYW1lLCBzaGFyZURhdGEpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGdpc3RSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgdXJsOiBnaXN0UmVzdWx0LnVybCEsXG4gICAgICAgICAgICBnaXN0SWQ6IGdpc3RSZXN1bHQuZ2lzdElkLFxuICAgICAgICAgICAgZXhwaXJlc0F0OiBzaGFyZURhdGEuZXhwaXJlc0F0LFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5mb3JtYXRTaGFyZVN1Y2Nlc3MoZ2lzdFJlc3VsdC51cmwhLCBzaGFyZURhdGEuZXhwaXJlc0F0KVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRmFsbGJhY2sgdG8gYmFzZTY0IFVSTCBpZiBHaXN0IGZhaWxzIG9yIG5vIHRva2VuXG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVCYXNlNjRVcmwoc2hhcmVEYXRhKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBjb25zdCBzYWZlTWVzc2FnZSA9IFRva2VuTWFuYWdlci5jcmVhdGVTYWZlRXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1NoYXJlIGVycm9yJywgeyBlcnJvcjogc2FmZU1lc3NhZ2UgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICBtZXNzYWdlOiBgRmFpbGVkIHRvIHNoYXJlIHBlcnNvbmE6ICR7c2FmZU1lc3NhZ2V9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgcGVyc29uYSBmcm9tIGEgc2hhcmUgVVJMXG4gICAqL1xuICBhc3luYyBpbXBvcnRGcm9tVXJsKHVybDogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGRhdGE/OiBhbnk7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIFVSTCBmaXJzdFxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlU2hhcmVVcmwodXJsKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIG9yIHVuc2FmZSBVUkwgcHJvdmlkZWQnXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBDaGVjayBpZiBpdCdzIGEgR2l0SHViIEdpc3QgVVJMXG4gICAgICBjb25zdCBnaXN0SWQgPSB0aGlzLmV4dHJhY3RHaXN0SWQodXJsKTtcbiAgICAgIGlmIChnaXN0SWQpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW1wb3J0RnJvbUdpc3QoZ2lzdElkKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIGJhc2U2NCBVUkxcbiAgICAgIGlmICh1cmwuaW5jbHVkZXMoJyNkb2xsaG91c2UtcGVyc29uYT0nKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbXBvcnRGcm9tQmFzZTY0VXJsKHVybCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIFVSTCBmb3Igc2VjdXJpdHlcbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZVNoYXJlVXJsKHVybCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG9yIHBvdGVudGlhbGx5IG1hbGljaW91cyBVUkwnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVHJ5IGRpcmVjdCBmZXRjaCB3aXRoIHRpbWVvdXRcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgNTAwMCk7IC8vIDUgc2Vjb25kIHRpbWVvdXRcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnLFxuICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgICAgICAgaWYgKCFjb250ZW50VHlwZSB8fCAhY29udGVudFR5cGUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJlc3BvbnNlIHR5cGU6IGV4cGVjdGVkIEpTT04nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHJlc3BvbnNlIHNpemUgdG8gcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvblxuICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgIGNvbnN0IG1heFNpemUgPSA1ICogMTAyNCAqIDEwMjQ7IC8vIDVNQiBtYXhcbiAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggJiYgcGFyc2VJbnQoY29udGVudExlbmd0aCkgPiBtYXhTaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXNwb25zZSB0b28gbGFyZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIG1lc3NhZ2U6ICdTdWNjZXNzZnVsbHkgcmV0cmlldmVkIHBlcnNvbmEgZGF0YSdcbiAgICAgICAgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignSW1wb3J0IGZyb20gVVJMIGVycm9yJywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gaW1wb3J0IGZyb20gVVJMOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBHaXRIdWIgR2lzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVHaXN0KHBlcnNvbmFOYW1lOiBzdHJpbmcsIGRhdGE6IGFueSk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyB1cmw/OiBzdHJpbmc7IGdpc3RJZD86IHN0cmluZyB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBUb2tlbk1hbmFnZXIgZm9yIHNlY3VyZSB0b2tlbiBoYW5kbGluZ1xuICAgICAgY29uc3QgdG9rZW4gPSBUb2tlbk1hbmFnZXIuZ2V0R2l0SHViVG9rZW4oKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ05vIHZhbGlkIEdpdEh1YiB0b2tlbiBhdmFpbGFibGUgZm9yIEdpc3QgY3JlYXRpb24nKTtcbiAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgcmF0ZSBsaW1pdFxuICAgICAgY29uc3QgcmF0ZUxpbWl0U3RhdHVzID0gdGhpcy5naXRodWJSYXRlTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgICBpZiAoIXJhdGVMaW1pdFN0YXR1cy5hbGxvd2VkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBHaXRIdWIgQVBJIHJhdGUgbGltaXQgZXhjZWVkZWQuIFJldHJ5IGFmdGVyICR7cmF0ZUxpbWl0U3RhdHVzLnJldHJ5QWZ0ZXJNc31tc2ApO1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgY29uc3QgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIDEwMDAwKTsgLy8gMTAgc2Vjb25kIHRpbWVvdXRcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9naXN0cycsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBEb2xsaG91c2VNQ1AgUGVyc29uYTogJHtwZXJzb25hTmFtZX1gLFxuICAgICAgICAgIHB1YmxpYzogZmFsc2UsIC8vIFByaXZhdGUgZ2lzdCBmb3Igc2VjdXJpdHlcbiAgICAgICAgICBmaWxlczoge1xuICAgICAgICAgICAgJ3BlcnNvbmEuanNvbic6IHtcbiAgICAgICAgICAgICAgY29udGVudDogSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l0SHViIEFQSSBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBDb250ZW50LVR5cGUgZm9yIEdpdEh1YiBBUEkgcmVzcG9uc2VcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gICAgICAgIGlmICghY29udGVudFR5cGUgfHwgIWNvbnRlbnRUeXBlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBHaXRIdWIgQVBJIHJlc3BvbnNlIHR5cGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdpc3QgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBDb25zdW1lIHRoZSByYXRlIGxpbWl0IHRva2VuIGFmdGVyIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICB0aGlzLmdpdGh1YlJhdGVMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIHVybDogZ2lzdC5odG1sX3VybCxcbiAgICAgICAgICBnaXN0SWQ6IGdpc3QuaWRcbiAgICAgICAgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnN0IHNhZmVNZXNzYWdlID0gVG9rZW5NYW5hZ2VyLmNyZWF0ZVNhZmVFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTtcbiAgICAgIGxvZ2dlci5lcnJvcignR2lzdCBjcmVhdGlvbiBlcnJvcicsIHsgZXJyb3I6IHNhZmVNZXNzYWdlIH0pO1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgYmFzZTY0IFVSTCAoZmFsbGJhY2spXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUJhc2U2NFVybChkYXRhOiBhbnkpOiBTaGFyZVJlc3VsdCB7XG4gICAgY29uc3QgYmFzZTY0ID0gdGhpcy5leHBvcnRlci50b0Jhc2U2NChkYXRhKTtcbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9kb2xsaG91c2VtY3AuY29tL2ltcG9ydCNkb2xsaG91c2UtcGVyc29uYT0ke2Jhc2U2NH1gO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgdXJsLFxuICAgICAgZXhwaXJlc0F0OiBkYXRhLmV4cGlyZXNBdCxcbiAgICAgIG1lc3NhZ2U6IHRoaXMuZm9ybWF0U2hhcmVTdWNjZXNzKHVybCwgZGF0YS5leHBpcmVzQXQpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgZnJvbSBHaXRIdWIgR2lzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbXBvcnRGcm9tR2lzdChnaXN0SWQ6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogYW55OyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayByYXRlIGxpbWl0XG4gICAgICBjb25zdCByYXRlTGltaXRTdGF0dXMgPSB0aGlzLmdpdGh1YlJhdGVMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICAgIGlmICghcmF0ZUxpbWl0U3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBHaXRIdWIgQVBJIHJhdGUgbGltaXQgZXhjZWVkZWQuIFBsZWFzZSB0cnkgYWdhaW4gaW4gJHtNYXRoLmNlaWwocmF0ZUxpbWl0U3RhdHVzLnJldHJ5QWZ0ZXJNcyEgLyAxMDAwKX0gc2Vjb25kc2ApO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBnaXN0VXJsID0gYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vZ2lzdHMvJHtnaXN0SWR9YDtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgVVJMIChzaG91bGQgYWx3YXlzIHBhc3MgZm9yIEdpdEh1YiBBUEkpXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVTaGFyZVVybChnaXN0VXJsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgR2l0SHViIEFQSSBVUkwnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIGNvbnN0IHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCAxMDAwMCk7IC8vIDEwIHNlY29uZCB0aW1lb3V0IGZvciBBUElcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChnaXN0VXJsLCB7XG4gICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdEb2xsaG91c2VNQ1AvMS4wJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZ2lzdDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBDb250ZW50LVR5cGUgZm9yIEdpdEh1YiBBUEkgcmVzcG9uc2VcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gICAgICAgIGlmICghY29udGVudFR5cGUgfHwgIWNvbnRlbnRUeXBlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBHaXRIdWIgQVBJIHJlc3BvbnNlIHR5cGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdpc3QgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGNvbnN0IHBlcnNvbmFGaWxlID0gZ2lzdC5maWxlc1sncGVyc29uYS5qc29uJ107XG4gICAgICAgIFxuICAgICAgICBpZiAoIXBlcnNvbmFGaWxlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBwZXJzb25hIGRhdGEgZm91bmQgaW4gZ2lzdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UocGVyc29uYUZpbGUuY29udGVudCk7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBleHBpcnlcbiAgICAgICAgaWYgKGRhdGEuZXhwaXJlc0F0ICYmIG5ldyBEYXRlKGRhdGEuZXhwaXJlc0F0KSA8IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiAnVGhpcyBzaGFyZSBsaW5rIGhhcyBleHBpcmVkJ1xuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zdW1lIHRoZSByYXRlIGxpbWl0IHRva2VuIGFmdGVyIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICB0aGlzLmdpdGh1YlJhdGVMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgbWVzc2FnZTogJ1N1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgcGVyc29uYSBmcm9tIEdpdEh1YidcbiAgICAgICAgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignR2lzdCBpbXBvcnQgZXJyb3InLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBpbXBvcnQgZnJvbSBnaXN0OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBVUkwgZm9yIHNlY3VyaXR5IChwcmV2ZW50IFNTUkYgYXR0YWNrcylcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTaGFyZVVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAvLyAxLiBVUkwgbGVuZ3RoIGNoZWNrIHRvIHByZXZlbnQgRG9TXG4gICAgICBpZiAodXJsLmxlbmd0aCA+IDIwNDgpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1VSTCBleGNlZWRzIG1heGltdW0gbGVuZ3RoJywgeyB1cmxMZW5ndGg6IHVybC5sZW5ndGggfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICAgICAgXG4gICAgICAvLyAyLiBQcm90b2NvbCBjaGVjayAtIG9ubHkgYWxsb3cgaHR0cC9odHRwc1xuICAgICAgaWYgKCFbJ2h0dHBzOicsICdodHRwOiddLmluY2x1ZGVzKHBhcnNlZC5wcm90b2NvbCkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0ludmFsaWQgcHJvdG9jb2wgaW4gVVJMJywgeyBwcm90b2NvbDogcGFyc2VkLnByb3RvY29sIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIDMuIFBvcnQgcmVzdHJpY3Rpb25zIC0gYmxvY2sgbm9uLXN0YW5kYXJkIHBvcnRzIHRoYXQgY291bGQgYmUgaW50ZXJuYWwgc2VydmljZXNcbiAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZWQucG9ydCB8fCAocGFyc2VkLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICc0NDMnIDogJzgwJyk7XG4gICAgICBjb25zdCBhbGxvd2VkUG9ydHMgPSBbJzgwJywgJzQ0MycsICc4MDgwJywgJzg0NDMnXTtcbiAgICAgIGlmICghYWxsb3dlZFBvcnRzLmluY2x1ZGVzKHBvcnQpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdCbG9ja2VkIG5vbi1zdGFuZGFyZCBwb3J0JywgeyBwb3J0IH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIDQuIEhvc3RuYW1lIHZhbGlkYXRpb25cbiAgICAgIGNvbnN0IGhvc3RuYW1lID0gcGFyc2VkLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBcbiAgICAgIC8vIEJsb2NrIHZhcmlvdXMgbG9jYWxob3N0IHJlcHJlc2VudGF0aW9uc1xuICAgICAgY29uc3QgYmxvY2tlZEhvc3RuYW1lcyA9IFtcbiAgICAgICAgJ2xvY2FsaG9zdCcsIFxuICAgICAgICAnbG9jYWxob3N0LmxvY2FsZG9tYWluJyxcbiAgICAgICAgJzAuMC4wLjAnLFxuICAgICAgICAnMCcsXG4gICAgICAgICcweDAnLFxuICAgICAgICAnMHgwMDAwMDAwMCcsXG4gICAgICAgICdbOjoxXScsXG4gICAgICAgICdbOjpmZmZmOjEyNy4wLjAuMV0nLFxuICAgICAgICAnWzAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMV0nXG4gICAgICBdO1xuICAgICAgXG4gICAgICBpZiAoYmxvY2tlZEhvc3RuYW1lcy5pbmNsdWRlcyhob3N0bmFtZSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0Jsb2NrZWQgbG9jYWxob3N0IGhvc3RuYW1lJywgeyBob3N0bmFtZSB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBCbG9jayBwcml2YXRlIElQIHJhbmdlcyB3aXRoIGNvbXByZWhlbnNpdmUgcGF0dGVybnNcbiAgICAgIGNvbnN0IHByaXZhdGVJcFBhdHRlcm5zID0gW1xuICAgICAgICAvXjEyN1xcLi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9vcGJhY2tcbiAgICAgICAgL14xMFxcLi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByaXZhdGUgY2xhc3MgQVxuICAgICAgICAvXjE5MlxcLjE2OFxcLi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByaXZhdGUgY2xhc3MgQ1xuICAgICAgICAvXjE3MlxcLigxWzYtOV18MlswLTldfDNbMC0xXSlcXC4vLCAgICAgICAgICAvLyBQcml2YXRlIGNsYXNzIEJcbiAgICAgICAgL14xNjlcXC4yNTRcXC4vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW5rLWxvY2FsXG4gICAgICAgIC9eZmMwMDovaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElQdjYgcHJpdmF0ZVxuICAgICAgICAvXmZlODA6L2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJUHY2IGxpbmstbG9jYWxcbiAgICAgICAgL146OjEkLywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSVB2NiBsb29wYmFja1xuICAgICAgICAvXjo6ZmZmZjowPzo/MD86PzA/Oj8wPyQvaSwgICAgICAgICAgICAgICAgLy8gSVB2NiBtYXBwZWQgSVB2NFxuICAgICAgICAvXjEwMFxcLjZbNC05XVxcLi8sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2Fycmllci1ncmFkZSBOQVRcbiAgICAgICAgL14xMDBcXC5bNy05XVswLTldXFwuLywgICAgICAgICAgICAgICAgICAgICAgIC8vIENhcnJpZXItZ3JhZGUgTkFUXG4gICAgICAgIC9eMTAwXFwuMVswLTJdWzAtOV1cXC4vLCAgICAgICAgICAgICAgICAgICAgICAvLyBDYXJyaWVyLWdyYWRlIE5BVFxuICAgICAgICAvXjBcXC4vLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXJ2ZWRcbiAgICAgICAgL14yNTVcXC4yNTVcXC4yNTVcXC4yNTUkLyAgICAgICAgICAgICAgICAgICAgICAvLyBCcm9hZGNhc3RcbiAgICAgIF07XG4gICAgICBcbiAgICAgIGlmIChwcml2YXRlSXBQYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gcGF0dGVybi50ZXN0KGhvc3RuYW1lKSkpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0Jsb2NrZWQgcHJpdmF0ZSBJUCByYW5nZScsIHsgaG9zdG5hbWUgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQmxvY2sgY2xvdWQgbWV0YWRhdGEgZW5kcG9pbnRzXG4gICAgICBjb25zdCBtZXRhZGF0YUVuZHBvaW50cyA9IFtcbiAgICAgICAgJzE2OS4yNTQuMTY5LjI1NCcsICAgICAvLyBBV1MvR0NQL0F6dXJlXG4gICAgICAgICdtZXRhZGF0YS5nb29nbGUuaW50ZXJuYWwnLFxuICAgICAgICAnbWV0YWRhdGEuYXp1cmUuY29tJyxcbiAgICAgICAgJzEwMC4xMDAuMTAwLjIwMCcgICAgICAvLyBBbGliYWJhIENsb3VkXG4gICAgICBdO1xuICAgICAgXG4gICAgICBpZiAobWV0YWRhdGFFbmRwb2ludHMuaW5jbHVkZXMoaG9zdG5hbWUpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdCbG9ja2VkIGNsb3VkIG1ldGFkYXRhIGVuZHBvaW50JywgeyBob3N0bmFtZSB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBCbG9jayBudW1lcmljIElQIHJlcHJlc2VudGF0aW9ucyB0aGF0IGNvdWxkIGJ5cGFzcyBjaGVja3NcbiAgICAgIGlmICgvXlxcZCskLy50ZXN0KGhvc3RuYW1lKSkge1xuICAgICAgICAvLyBDb252ZXJ0IGRlY2ltYWwgdG8gSVAgYW5kIGNoZWNrXG4gICAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KGhvc3RuYW1lLCAxMCk7XG4gICAgICAgIGlmIChudW0gPD0gMHhGRkZGRkZGRikge1xuICAgICAgICAgIGNvbnN0IGlwID0gYCR7KG51bSA+Pj4gMjQpICYgMHhGRn0uJHsobnVtID4+PiAxNikgJiAweEZGfS4keyhudW0gPj4+IDgpICYgMHhGRn0uJHtudW0gJiAweEZGfWA7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0Jsb2NrZWQgbnVtZXJpYyBJUCByZXByZXNlbnRhdGlvbicsIHsgaG9zdG5hbWUsIHJlc29sdmVkSXA6IGlwIH0pO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBCbG9jayBoZXggSVAgcmVwcmVzZW50YXRpb25zXG4gICAgICBpZiAoL14weFswLTlhLWZdKyQvaS50ZXN0KGhvc3RuYW1lKSkge1xuICAgICAgICBsb2dnZXIud2FybignQmxvY2tlZCBoZXggSVAgcmVwcmVzZW50YXRpb24nLCB7IGhvc3RuYW1lIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGRvbWFpbiBmb3JtYXQgKGJhc2ljIGNoZWNrKVxuICAgICAgLy8gQWxsb3cgR2l0SHViIGRvbWFpbnMgYW5kIGNvbW1vbiBzaGFyZSBwbGF0Zm9ybXNcbiAgICAgIGNvbnN0IHRydXN0ZWREb21haW5zID0gW1xuICAgICAgICAnZ2l0aHViLmNvbScsXG4gICAgICAgICdnaXN0LmdpdGh1Yi5jb20nLCBcbiAgICAgICAgJ2FwaS5naXRodWIuY29tJyxcbiAgICAgICAgJ3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20nLFxuICAgICAgICAnZG9sbGhvdXNlbWNwLmNvbSdcbiAgICAgIF07XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSB0cnVzdGVkIGRvbWFpblxuICAgICAgY29uc3QgaXNUcnVzdGVkRG9tYWluID0gdHJ1c3RlZERvbWFpbnMuc29tZShkb21haW4gPT4gXG4gICAgICAgIGhvc3RuYW1lID09PSBkb21haW4gfHwgaG9zdG5hbWUuZW5kc1dpdGgoYC4ke2RvbWFpbn1gKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgaWYgKCFpc1RydXN0ZWREb21haW4pIHtcbiAgICAgICAgLy8gRm9yIG5vbi10cnVzdGVkIGRvbWFpbnMsIGFwcGx5IHN0cmljdGVyIHZhbGlkYXRpb25cbiAgICAgICAgLy8gTXVzdCBiZSBhIHZhbGlkIGRvbWFpbiBmb3JtYXQsIG5vdCBqdXN0IGFuIElQXG4gICAgICAgIGNvbnN0IGRvbWFpblBhdHRlcm4gPSAvXihbYS16MC05XSsoLVthLXowLTldKykqXFwuKStbYS16XXsyLH0kL2k7XG4gICAgICAgIGNvbnN0IGlwdjRQYXR0ZXJuID0gL15cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfSQvO1xuICAgICAgICBjb25zdCBpcHY2UGF0dGVybiA9IC9eXFxbPyhbMC05YS1mXXswLDR9Oil7Miw3fVswLTlhLWZdezAsNH1cXF0/JC9pO1xuICAgICAgICBcbiAgICAgICAgaWYgKGlwdjRQYXR0ZXJuLnRlc3QoaG9zdG5hbWUpIHx8IGlwdjZQYXR0ZXJuLnRlc3QoaG9zdG5hbWUpKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0RpcmVjdCBJUCBhY2Nlc3Mgbm90IGFsbG93ZWQgZm9yIHVudHJ1c3RlZCBzb3VyY2VzJywgeyBob3N0bmFtZSB9KTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICghZG9tYWluUGF0dGVybi50ZXN0KGhvc3RuYW1lKSkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdJbnZhbGlkIGRvbWFpbiBmb3JtYXQnLCB7IGhvc3RuYW1lIH0pO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ1VSTCB2YWxpZGF0aW9uIHBhc3NlZCcsIHsgXG4gICAgICAgIGhvc3RuYW1lLCBcbiAgICAgICAgcHJvdG9jb2w6IHBhcnNlZC5wcm90b2NvbCxcbiAgICAgICAgaXNUcnVzdGVkOiBpc1RydXN0ZWREb21haW4gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdVUkwgdmFsaWRhdGlvbiBlcnJvcicsIHsgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgZnJvbSBiYXNlNjQgVVJMXG4gICAqL1xuICBwcml2YXRlIGltcG9ydEZyb21CYXNlNjRVcmwodXJsOiBzdHJpbmcpOiB7IHN1Y2Nlc3M6IGJvb2xlYW47IGRhdGE/OiBhbnk7IG1lc3NhZ2U6IHN0cmluZyB9IHtcbiAgICB0cnkge1xuICAgICAgLy8gTGltaXQgYmFzZTY0IGxlbmd0aCB0byBwcmV2ZW50IFJlRG9TIGF0dGFja3MgKDEwS0IgbWF4IGZvciBiYXNlNjQgZW5jb2RlZCBkYXRhKVxuICAgICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goLyNkb2xsaG91c2UtcGVyc29uYT0oW0EtWmEtejAtOSsvPV17MSwxMDAwMH0pJC8pO1xuICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc2hhcmUgVVJMIGZvcm1hdCcpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlNjQgPSBtYXRjaFsxXTtcbiAgICAgIGNvbnN0IGpzb24gPSBCdWZmZXIuZnJvbShiYXNlNjQsICdiYXNlNjQnKS50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xuXG4gICAgICAvLyBDaGVjayBleHBpcnlcbiAgICAgIGlmIChkYXRhLmV4cGlyZXNBdCAmJiBuZXcgRGF0ZShkYXRhLmV4cGlyZXNBdCkgPCBuZXcgRGF0ZSgpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZTogJ1RoaXMgc2hhcmUgbGluayBoYXMgZXhwaXJlZCdcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgbWVzc2FnZTogJ1N1Y2Nlc3NmdWxseSBkZWNvZGVkIHBlcnNvbmEgZGF0YSdcbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gZGVjb2RlIHNoYXJlIFVSTDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBHaXN0IElEIGZyb20gR2l0SHViIFVSTFxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0R2lzdElkKHVybDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goL2dpc3RcXC5naXRodWJcXC5jb21cXC9bXlxcL10rXFwvKFthLWYwLTldKykvKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHNoYXJlIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRTaGFyZVN1Y2Nlc3ModXJsOiBzdHJpbmcsIGV4cGlyZXNBdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBleHBpcnlEYXRlID0gbmV3IERhdGUoZXhwaXJlc0F0KTtcbiAgICBjb25zdCBkYXlzVW50aWxFeHBpcnkgPSBNYXRoLmNlaWwoKGV4cGlyeURhdGUuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAoMjQgKiA2MCAqIDYwICogMTAwMCkpO1xuXG4gICAgcmV0dXJuIGDinIUgU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc2hhcmUgbGluayFcblxu8J+UlyBTaGFyZSBVUkw6XG4ke3VybH1cblxu4o+x77iPIEV4cGlyZXM6ICR7ZXhwaXJ5RGF0ZS50b0xvY2FsZURhdGVTdHJpbmcoKX0gKCR7ZGF5c1VudGlsRXhwaXJ5fSBkYXlzKVxuXG7wn5OLIFRvIHNoYXJlIHRoaXMgcGVyc29uYTpcbjEuIENvcHkgdGhlIFVSTCBhYm92ZVxuMi4gU2hhcmUgaXQgd2l0aCBvdGhlcnNcbjMuIFRoZXkgY2FuIGltcG9ydCB1c2luZzogaW1wb3J0X2Zyb21fdXJsIFwiJHt1cmx9XCJcblxu8J+UkiBQcml2YWN5OiBUaGlzIGxpbmsgaXMgcHJpdmF0ZSBhbmQgd2lsbCBleHBpcmUgYXV0b21hdGljYWxseS5gO1xuICB9XG59Il19
@@ -1,10 +0,0 @@
1
- /**
2
- * Export all export/import/sharing modules
3
- */
4
- export { PersonaExporter } from './PersonaExporter.js';
5
- export { PersonaImporter } from './PersonaImporter.js';
6
- export { PersonaSharer } from './PersonaSharer.js';
7
- export type { ExportedPersona, ExportBundle } from './PersonaExporter.js';
8
- export type { ImportResult } from './PersonaImporter.js';
9
- export type { ShareResult } from './PersonaSharer.js';
10
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/persona/export-import/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC1E,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Export all export/import/sharing modules
3
- */
4
- export { PersonaExporter } from './PersonaExporter.js';
5
- export { PersonaImporter } from './PersonaImporter.js';
6
- export { PersonaSharer } from './PersonaSharer.js';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcGVyc29uYS9leHBvcnQtaW1wb3J0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4cG9ydCBhbGwgZXhwb3J0L2ltcG9ydC9zaGFyaW5nIG1vZHVsZXNcbiAqL1xuXG5leHBvcnQgeyBQZXJzb25hRXhwb3J0ZXIgfSBmcm9tICcuL1BlcnNvbmFFeHBvcnRlci5qcyc7XG5leHBvcnQgeyBQZXJzb25hSW1wb3J0ZXIgfSBmcm9tICcuL1BlcnNvbmFJbXBvcnRlci5qcyc7XG5leHBvcnQgeyBQZXJzb25hU2hhcmVyIH0gZnJvbSAnLi9QZXJzb25hU2hhcmVyLmpzJztcblxuZXhwb3J0IHR5cGUgeyBFeHBvcnRlZFBlcnNvbmEsIEV4cG9ydEJ1bmRsZSB9IGZyb20gJy4vUGVyc29uYUV4cG9ydGVyLmpzJztcbmV4cG9ydCB0eXBlIHsgSW1wb3J0UmVzdWx0IH0gZnJvbSAnLi9QZXJzb25hSW1wb3J0ZXIuanMnO1xuZXhwb3J0IHR5cGUgeyBTaGFyZVJlc3VsdCB9IGZyb20gJy4vUGVyc29uYVNoYXJlci5qcyc7Il19
@@ -1,7 +0,0 @@
1
- /**
2
- * Persona module exports
3
- */
4
- export * from './PersonaManager.js';
5
- export * from './PersonaLoader.js';
6
- export * from './PersonaValidator.js';
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/persona/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Persona module exports
3
- */
4
- export * from './PersonaManager.js';
5
- export * from './PersonaLoader.js';
6
- export * from './PersonaValidator.js';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGVyc29uYS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQZXJzb25hIG1vZHVsZSBleHBvcnRzXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9QZXJzb25hTWFuYWdlci5qcyc7XG5leHBvcnQgKiBmcm9tICcuL1BlcnNvbmFMb2FkZXIuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9QZXJzb25hVmFsaWRhdG9yLmpzJzsiXX0=