@dollhousemcp/mcp-server 1.5.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +494 -111
  3. package/data/agents/code-reviewer.md +8 -1
  4. package/data/agents/research-assistant.md +8 -1
  5. package/data/agents/task-manager.md +8 -1
  6. package/data/ensembles/business-advisor.md +8 -1
  7. package/data/ensembles/creative-studio.md +8 -1
  8. package/data/ensembles/development-team.md +8 -1
  9. package/data/ensembles/security-analysis-team.md +8 -1
  10. package/data/memories/conversation-history.md +8 -1
  11. package/data/memories/learning-progress.md +8 -1
  12. package/data/memories/project-context.md +8 -1
  13. package/data/personas/business-consultant.md +8 -1
  14. package/data/personas/creative-writer.md +8 -1
  15. package/data/personas/debug-detective.md +8 -1
  16. package/data/personas/eli5-explainer.md +8 -1
  17. package/data/personas/security-analyst.md +8 -1
  18. package/data/personas/technical-analyst.md +8 -1
  19. package/data/skills/code-review.md +8 -1
  20. package/data/skills/creative-writing.md +8 -1
  21. package/data/skills/data-analysis.md +8 -1
  22. package/data/skills/penetration-testing.md +8 -1
  23. package/data/skills/research.md +8 -1
  24. package/data/skills/threat-modeling.md +8 -1
  25. package/data/skills/translation.md +8 -1
  26. package/data/templates/code-documentation.md +8 -1
  27. package/data/templates/email-professional.md +8 -1
  28. package/data/templates/meeting-notes.md +8 -1
  29. package/data/templates/penetration-test-report.md +8 -1
  30. package/data/templates/project-brief.md +8 -1
  31. package/data/templates/report-executive.md +8 -1
  32. package/data/templates/security-vulnerability-report.md +8 -1
  33. package/data/templates/threat-assessment-report.md +8 -1
  34. package/dist/auth/GitHubAuthManager.d.ts +6 -1
  35. package/dist/auth/GitHubAuthManager.d.ts.map +1 -1
  36. package/dist/auth/GitHubAuthManager.js +45 -18
  37. package/dist/benchmarks/IndexPerformanceBenchmark.d.ts +98 -0
  38. package/dist/benchmarks/IndexPerformanceBenchmark.d.ts.map +1 -0
  39. package/dist/benchmarks/IndexPerformanceBenchmark.js +531 -0
  40. package/dist/cache/CollectionCache.d.ts.map +1 -1
  41. package/dist/cache/CollectionCache.js +13 -3
  42. package/dist/cache/CollectionIndexCache.d.ts +77 -0
  43. package/dist/cache/CollectionIndexCache.d.ts.map +1 -0
  44. package/dist/cache/CollectionIndexCache.js +349 -0
  45. package/dist/cache/LRUCache.d.ts +93 -0
  46. package/dist/cache/LRUCache.d.ts.map +1 -0
  47. package/dist/cache/LRUCache.js +299 -0
  48. package/dist/cache/index.d.ts +1 -0
  49. package/dist/cache/index.d.ts.map +1 -1
  50. package/dist/cache/index.js +2 -1
  51. package/dist/collection/CollectionBrowser.d.ts +21 -1
  52. package/dist/collection/CollectionBrowser.d.ts.map +1 -1
  53. package/dist/collection/CollectionBrowser.js +130 -10
  54. package/dist/collection/CollectionIndexManager.d.ts +151 -0
  55. package/dist/collection/CollectionIndexManager.d.ts.map +1 -0
  56. package/dist/collection/CollectionIndexManager.js +499 -0
  57. package/dist/collection/CollectionSearch.d.ts +55 -0
  58. package/dist/collection/CollectionSearch.d.ts.map +1 -1
  59. package/dist/collection/CollectionSearch.js +338 -13
  60. package/dist/collection/CollectionSeeder.d.ts.map +1 -1
  61. package/dist/collection/CollectionSeeder.js +38 -1
  62. package/dist/collection/ElementInstaller.d.ts +31 -0
  63. package/dist/collection/ElementInstaller.d.ts.map +1 -1
  64. package/dist/collection/ElementInstaller.js +77 -15
  65. package/dist/collection/PersonaSubmitter.d.ts +1 -1
  66. package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
  67. package/dist/collection/PersonaSubmitter.js +2 -2
  68. package/dist/collection/index.d.ts +1 -0
  69. package/dist/collection/index.d.ts.map +1 -1
  70. package/dist/collection/index.js +2 -1
  71. package/dist/config/ConfigManager.d.ts +78 -0
  72. package/dist/config/ConfigManager.d.ts.map +1 -0
  73. package/dist/config/ConfigManager.js +216 -0
  74. package/dist/config/element-types.d.ts +135 -0
  75. package/dist/config/element-types.d.ts.map +1 -0
  76. package/dist/config/element-types.js +108 -0
  77. package/dist/config/index.d.ts +2 -0
  78. package/dist/config/index.d.ts.map +1 -1
  79. package/dist/config/index.js +3 -1
  80. package/dist/config/portfolio-constants.d.ts +83 -0
  81. package/dist/config/portfolio-constants.d.ts.map +1 -0
  82. package/dist/config/portfolio-constants.js +99 -0
  83. package/dist/elements/BaseElement.d.ts +14 -2
  84. package/dist/elements/BaseElement.d.ts.map +1 -1
  85. package/dist/elements/BaseElement.js +88 -6
  86. package/dist/elements/agents/Agent.d.ts +10 -1
  87. package/dist/elements/agents/Agent.d.ts.map +1 -1
  88. package/dist/elements/agents/Agent.js +66 -19
  89. package/dist/elements/agents/AgentManager.d.ts +2 -0
  90. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  91. package/dist/elements/agents/AgentManager.js +12 -10
  92. package/dist/elements/skills/Skill.d.ts +10 -1
  93. package/dist/elements/skills/Skill.d.ts.map +1 -1
  94. package/dist/elements/skills/Skill.js +40 -3
  95. package/dist/elements/skills/SkillManager.d.ts +1 -0
  96. package/dist/elements/skills/SkillManager.d.ts.map +1 -1
  97. package/dist/elements/skills/SkillManager.js +10 -4
  98. package/dist/elements/templates/Template.d.ts +10 -1
  99. package/dist/elements/templates/Template.d.ts.map +1 -1
  100. package/dist/elements/templates/Template.js +35 -18
  101. package/dist/elements/templates/TemplateManager.d.ts +1 -1
  102. package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
  103. package/dist/elements/templates/TemplateManager.js +6 -5
  104. package/dist/generated/version.d.ts +2 -2
  105. package/dist/generated/version.js +3 -3
  106. package/dist/index.barrel.d.ts +1 -2
  107. package/dist/index.barrel.d.ts.map +1 -1
  108. package/dist/index.barrel.js +2 -4
  109. package/dist/index.d.ts +143 -25
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +1883 -310
  112. package/dist/persona/PersonaElement.d.ts +10 -0
  113. package/dist/persona/PersonaElement.d.ts.map +1 -1
  114. package/dist/persona/PersonaElement.js +55 -32
  115. package/dist/persona/PersonaElementManager.d.ts.map +1 -1
  116. package/dist/persona/PersonaElementManager.js +13 -11
  117. package/dist/persona/PersonaLoader.d.ts.map +1 -1
  118. package/dist/persona/PersonaLoader.js +8 -2
  119. package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -1
  120. package/dist/persona/export-import/PersonaImporter.js +24 -5
  121. package/dist/persona/export-import/PersonaSharer.d.ts +21 -0
  122. package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -1
  123. package/dist/persona/export-import/PersonaSharer.js +198 -22
  124. package/dist/portfolio/DefaultElementProvider.d.ts +90 -0
  125. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  126. package/dist/portfolio/DefaultElementProvider.js +499 -7
  127. package/dist/portfolio/GitHubPortfolioIndexer.d.ts +129 -0
  128. package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -0
  129. package/dist/portfolio/GitHubPortfolioIndexer.js +475 -0
  130. package/dist/portfolio/MigrationManager.d.ts.map +1 -1
  131. package/dist/portfolio/MigrationManager.js +136 -3
  132. package/dist/portfolio/PortfolioIndexManager.d.ts +130 -0
  133. package/dist/portfolio/PortfolioIndexManager.d.ts.map +1 -0
  134. package/dist/portfolio/PortfolioIndexManager.js +478 -0
  135. package/dist/portfolio/PortfolioManager.d.ts +5 -0
  136. package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
  137. package/dist/portfolio/PortfolioManager.js +61 -20
  138. package/dist/portfolio/PortfolioRepoManager.d.ts +75 -0
  139. package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -0
  140. package/dist/portfolio/PortfolioRepoManager.js +337 -0
  141. package/dist/portfolio/UnifiedIndexManager.d.ts +388 -0
  142. package/dist/portfolio/UnifiedIndexManager.d.ts.map +1 -0
  143. package/dist/portfolio/UnifiedIndexManager.js +1434 -0
  144. package/dist/portfolio/index.d.ts +15 -0
  145. package/dist/portfolio/index.d.ts.map +1 -0
  146. package/dist/portfolio/index.js +15 -0
  147. package/dist/portfolio/types.d.ts +7 -0
  148. package/dist/portfolio/types.d.ts.map +1 -1
  149. package/dist/portfolio/types.js +6 -1
  150. package/dist/security/InputValidator.d.ts.map +1 -1
  151. package/dist/security/InputValidator.js +50 -48
  152. package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
  153. package/dist/security/audit/SecurityAuditor.js +17 -9
  154. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  155. package/dist/security/audit/config/suppressions.js +19 -3
  156. package/dist/security/contentValidator.d.ts +2 -0
  157. package/dist/security/contentValidator.d.ts.map +1 -1
  158. package/dist/security/contentValidator.js +115 -4
  159. package/dist/security/secureYamlParser.d.ts +1 -0
  160. package/dist/security/secureYamlParser.d.ts.map +1 -1
  161. package/dist/security/secureYamlParser.js +29 -7
  162. package/dist/security/securityMonitor.d.ts +1 -1
  163. package/dist/security/securityMonitor.d.ts.map +1 -1
  164. package/dist/security/securityMonitor.js +1 -1
  165. package/dist/security/tokenManager.d.ts +1 -1
  166. package/dist/security/tokenManager.d.ts.map +1 -1
  167. package/dist/security/tokenManager.js +30 -10
  168. package/dist/server/ServerSetup.d.ts +22 -2
  169. package/dist/server/ServerSetup.d.ts.map +1 -1
  170. package/dist/server/ServerSetup.js +77 -12
  171. package/dist/server/tools/AuthTools.d.ts.map +1 -1
  172. package/dist/server/tools/AuthTools.js +33 -1
  173. package/dist/server/tools/BuildInfoTools.d.ts +25 -0
  174. package/dist/server/tools/BuildInfoTools.d.ts.map +1 -0
  175. package/dist/server/tools/BuildInfoTools.js +36 -0
  176. package/dist/server/tools/CollectionTools.d.ts.map +1 -1
  177. package/dist/server/tools/CollectionTools.js +55 -46
  178. package/dist/server/tools/ConfigTools.d.ts.map +1 -1
  179. package/dist/server/tools/ConfigTools.js +29 -1
  180. package/dist/server/tools/PersonaTools.d.ts +4 -2
  181. package/dist/server/tools/PersonaTools.d.ts.map +1 -1
  182. package/dist/server/tools/PersonaTools.js +5 -152
  183. package/dist/server/tools/PortfolioTools.d.ts +12 -0
  184. package/dist/server/tools/PortfolioTools.d.ts.map +1 -0
  185. package/dist/server/tools/PortfolioTools.js +221 -0
  186. package/dist/server/tools/index.d.ts +3 -1
  187. package/dist/server/tools/index.d.ts.map +1 -1
  188. package/dist/server/tools/index.js +4 -2
  189. package/dist/server/types.d.ts +40 -5
  190. package/dist/server/types.d.ts.map +1 -1
  191. package/dist/server/types.js +1 -1
  192. package/dist/services/BuildInfoService.d.ts +84 -0
  193. package/dist/services/BuildInfoService.d.ts.map +1 -0
  194. package/dist/services/BuildInfoService.js +271 -0
  195. package/dist/tools/portfolio/PortfolioElementAdapter.d.ts +54 -0
  196. package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -0
  197. package/dist/tools/portfolio/PortfolioElementAdapter.js +229 -0
  198. package/dist/tools/portfolio/submitToPortfolioTool.d.ts +164 -0
  199. package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -0
  200. package/dist/tools/portfolio/submitToPortfolioTool.js +1523 -0
  201. package/dist/tools/portfolio/types.d.ts +41 -0
  202. package/dist/tools/portfolio/types.d.ts.map +1 -0
  203. package/dist/tools/portfolio/types.js +15 -0
  204. package/dist/types/collection.d.ts +51 -0
  205. package/dist/types/collection.d.ts.map +1 -1
  206. package/dist/types/collection.js +1 -1
  207. package/dist/utils/EarlyTerminationSearch.d.ts +41 -0
  208. package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -0
  209. package/dist/utils/EarlyTerminationSearch.js +164 -0
  210. package/dist/utils/ErrorHandler.d.ts +86 -0
  211. package/dist/utils/ErrorHandler.d.ts.map +1 -0
  212. package/dist/utils/ErrorHandler.js +201 -0
  213. package/dist/utils/FileDiscoveryUtil.d.ts +53 -0
  214. package/dist/utils/FileDiscoveryUtil.d.ts.map +1 -0
  215. package/dist/utils/FileDiscoveryUtil.js +169 -0
  216. package/dist/utils/GitHubRateLimiter.d.ts +88 -0
  217. package/dist/utils/GitHubRateLimiter.d.ts.map +1 -0
  218. package/dist/utils/GitHubRateLimiter.js +315 -0
  219. package/dist/utils/PerformanceMonitor.d.ts +134 -0
  220. package/dist/utils/PerformanceMonitor.d.ts.map +1 -0
  221. package/dist/utils/PerformanceMonitor.js +347 -0
  222. package/dist/utils/RateLimiter.d.ts.map +1 -0
  223. package/dist/utils/RateLimiter.js +172 -0
  224. package/dist/utils/SecureDownloader.d.ts +241 -0
  225. package/dist/utils/SecureDownloader.d.ts.map +1 -0
  226. package/dist/utils/SecureDownloader.js +759 -0
  227. package/dist/utils/ToolCache.d.ts +82 -0
  228. package/dist/utils/ToolCache.d.ts.map +1 -0
  229. package/dist/utils/ToolCache.js +196 -0
  230. package/dist/utils/errorCodes.d.ts +136 -0
  231. package/dist/utils/errorCodes.d.ts.map +1 -0
  232. package/dist/utils/errorCodes.js +87 -0
  233. package/dist/utils/index.d.ts +3 -0
  234. package/dist/utils/index.d.ts.map +1 -1
  235. package/dist/utils/index.js +4 -1
  236. package/dist/utils/installation.d.ts +1 -1
  237. package/dist/utils/installation.d.ts.map +1 -1
  238. package/dist/utils/installation.js +9 -8
  239. package/dist/utils/searchUtils.d.ts +31 -0
  240. package/dist/utils/searchUtils.d.ts.map +1 -1
  241. package/dist/utils/searchUtils.js +62 -1
  242. package/package.json +17 -7
  243. package/dist/config/updateConfig.d.ts +0 -84
  244. package/dist/config/updateConfig.d.ts.map +0 -1
  245. package/dist/config/updateConfig.js +0 -148
  246. package/dist/server/tools/UpdateTools.d.ts +0 -10
  247. package/dist/server/tools/UpdateTools.d.ts.map +0 -1
  248. package/dist/server/tools/UpdateTools.js +0 -85
  249. package/dist/update/BackupManager.d.ts +0 -63
  250. package/dist/update/BackupManager.d.ts.map +0 -1
  251. package/dist/update/BackupManager.js +0 -370
  252. package/dist/update/DependencyChecker.d.ts +0 -41
  253. package/dist/update/DependencyChecker.d.ts.map +0 -1
  254. package/dist/update/DependencyChecker.js +0 -132
  255. package/dist/update/RateLimiter.d.ts.map +0 -1
  256. package/dist/update/RateLimiter.js +0 -172
  257. package/dist/update/SignatureVerifier.d.ts +0 -71
  258. package/dist/update/SignatureVerifier.d.ts.map +0 -1
  259. package/dist/update/SignatureVerifier.js +0 -214
  260. package/dist/update/UpdateChecker.d.ts +0 -132
  261. package/dist/update/UpdateChecker.d.ts.map +0 -1
  262. package/dist/update/UpdateChecker.js +0 -506
  263. package/dist/update/UpdateManager.d.ts +0 -60
  264. package/dist/update/UpdateManager.d.ts.map +0 -1
  265. package/dist/update/UpdateManager.js +0 -730
  266. package/dist/update/VersionManager.d.ts +0 -31
  267. package/dist/update/VersionManager.d.ts.map +0 -1
  268. package/dist/update/VersionManager.js +0 -181
  269. package/dist/update/index.d.ts +0 -9
  270. package/dist/update/index.d.ts.map +0 -1
  271. package/dist/update/index.js +0 -9
  272. /package/dist/{update → utils}/RateLimiter.d.ts +0 -0
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Portfolio Tool Configuration Constants
3
+ *
4
+ * Centralized configuration for timeout values, file size limits,
5
+ * retry behavior, and other portfolio-related constants.
6
+ *
7
+ * All values can be overridden via environment variables for flexibility.
8
+ */
9
+ /**
10
+ * Portfolio element metadata interface for type safety
11
+ */
12
+ export interface PortfolioElementMetadata {
13
+ name: string;
14
+ description: string;
15
+ author: string;
16
+ created: string;
17
+ updated: string;
18
+ version: string;
19
+ }
20
+ /**
21
+ * GitHub API timeout configuration
22
+ * Used for collection submission API calls
23
+ */
24
+ export declare const GITHUB_API_TIMEOUT: {
25
+ readonly DEFAULT: number;
26
+ readonly MIN: 5000;
27
+ readonly MAX: 300000;
28
+ };
29
+ /**
30
+ * File size limits for portfolio submissions
31
+ */
32
+ export declare const FILE_SIZE_LIMITS: {
33
+ readonly MAX_FILE_SIZE: number;
34
+ readonly MAX_FILE_SIZE_MB: 10;
35
+ };
36
+ /**
37
+ * Retry configuration for API operations
38
+ */
39
+ export declare const RETRY_CONFIG: {
40
+ readonly MAX_ATTEMPTS: number;
41
+ readonly INITIAL_DELAY: number;
42
+ readonly MAX_DELAY: number;
43
+ readonly BACKOFF_MULTIPLIER: 2;
44
+ };
45
+ /**
46
+ * Search and similarity matching configuration
47
+ */
48
+ export declare const SEARCH_CONFIG: {
49
+ readonly MIN_SIMILARITY_SCORE: number;
50
+ readonly MAX_SUGGESTIONS: number;
51
+ };
52
+ /**
53
+ * Environment variable names for documentation
54
+ */
55
+ export declare const ENV_VARS: {
56
+ readonly GITHUB_API_TIMEOUT: "DOLLHOUSE_GITHUB_API_TIMEOUT";
57
+ readonly MAX_FILE_SIZE: "DOLLHOUSE_MAX_FILE_SIZE";
58
+ readonly MAX_RETRY_ATTEMPTS: "DOLLHOUSE_MAX_RETRY_ATTEMPTS";
59
+ readonly INITIAL_RETRY_DELAY: "DOLLHOUSE_INITIAL_RETRY_DELAY";
60
+ readonly MAX_RETRY_DELAY: "DOLLHOUSE_MAX_RETRY_DELAY";
61
+ readonly MIN_SIMILARITY: "DOLLHOUSE_MIN_SIMILARITY";
62
+ readonly MAX_SUGGESTIONS: "DOLLHOUSE_MAX_SUGGESTIONS";
63
+ };
64
+ /**
65
+ * Validation helper to ensure timeout is within acceptable bounds
66
+ */
67
+ export declare function getValidatedTimeout(): number;
68
+ /**
69
+ * GitHub API rate limiting configuration
70
+ * Implements client-side rate limiting to respect GitHub's API limits
71
+ */
72
+ export declare const GITHUB_API_RATE_LIMITS: {
73
+ readonly AUTHENTICATED_LIMIT: number;
74
+ readonly UNAUTHENTICATED_LIMIT: number;
75
+ readonly WINDOW_MS: number;
76
+ readonly MIN_DELAY_MS: number;
77
+ readonly BUFFER_PERCENTAGE: number;
78
+ };
79
+ /**
80
+ * Calculate retry delay using exponential backoff
81
+ */
82
+ export declare function calculateRetryDelay(attempt: number): number;
83
+ //# sourceMappingURL=portfolio-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio-constants.d.ts","sourceRoot":"","sources":["../../src/config/portfolio-constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;CASrB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;CAMnB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;CAYf,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,aAAa;;;CAMhB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;;;;CAQX,CAAC;AAEX;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAY5C;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB;;;;;;CAazB,CAAC;AAEX;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM3D"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Portfolio Tool Configuration Constants
3
+ *
4
+ * Centralized configuration for timeout values, file size limits,
5
+ * retry behavior, and other portfolio-related constants.
6
+ *
7
+ * All values can be overridden via environment variables for flexibility.
8
+ */
9
+ /**
10
+ * GitHub API timeout configuration
11
+ * Used for collection submission API calls
12
+ */
13
+ export const GITHUB_API_TIMEOUT = {
14
+ // Default timeout for GitHub API requests (milliseconds)
15
+ DEFAULT: parseInt(process.env.DOLLHOUSE_GITHUB_API_TIMEOUT || '30000'),
16
+ // Minimum allowed timeout (5 seconds)
17
+ MIN: 5000,
18
+ // Maximum allowed timeout (5 minutes)
19
+ MAX: 300000
20
+ };
21
+ /**
22
+ * File size limits for portfolio submissions
23
+ */
24
+ export const FILE_SIZE_LIMITS = {
25
+ // Maximum file size for portfolio submissions (10MB)
26
+ MAX_FILE_SIZE: parseInt(process.env.DOLLHOUSE_MAX_FILE_SIZE || String(10 * 1024 * 1024)),
27
+ // Human-readable description of the limit
28
+ MAX_FILE_SIZE_MB: 10
29
+ };
30
+ /**
31
+ * Retry configuration for API operations
32
+ */
33
+ export const RETRY_CONFIG = {
34
+ // Maximum number of retry attempts
35
+ MAX_ATTEMPTS: parseInt(process.env.DOLLHOUSE_MAX_RETRY_ATTEMPTS || '3'),
36
+ // Initial delay between retries (milliseconds)
37
+ INITIAL_DELAY: parseInt(process.env.DOLLHOUSE_INITIAL_RETRY_DELAY || '1000'),
38
+ // Maximum delay between retries (milliseconds)
39
+ MAX_DELAY: parseInt(process.env.DOLLHOUSE_MAX_RETRY_DELAY || '5000'),
40
+ // Backoff multiplier for exponential backoff
41
+ BACKOFF_MULTIPLIER: 2
42
+ };
43
+ /**
44
+ * Search and similarity matching configuration
45
+ */
46
+ export const SEARCH_CONFIG = {
47
+ // Minimum similarity score for name suggestions (0.0 to 1.0)
48
+ MIN_SIMILARITY_SCORE: parseFloat(process.env.DOLLHOUSE_MIN_SIMILARITY || '0.3'),
49
+ // Maximum number of suggestions to return
50
+ MAX_SUGGESTIONS: parseInt(process.env.DOLLHOUSE_MAX_SUGGESTIONS || '5')
51
+ };
52
+ /**
53
+ * Environment variable names for documentation
54
+ */
55
+ export const ENV_VARS = {
56
+ GITHUB_API_TIMEOUT: 'DOLLHOUSE_GITHUB_API_TIMEOUT',
57
+ MAX_FILE_SIZE: 'DOLLHOUSE_MAX_FILE_SIZE',
58
+ MAX_RETRY_ATTEMPTS: 'DOLLHOUSE_MAX_RETRY_ATTEMPTS',
59
+ INITIAL_RETRY_DELAY: 'DOLLHOUSE_INITIAL_RETRY_DELAY',
60
+ MAX_RETRY_DELAY: 'DOLLHOUSE_MAX_RETRY_DELAY',
61
+ MIN_SIMILARITY: 'DOLLHOUSE_MIN_SIMILARITY',
62
+ MAX_SUGGESTIONS: 'DOLLHOUSE_MAX_SUGGESTIONS'
63
+ };
64
+ /**
65
+ * Validation helper to ensure timeout is within acceptable bounds
66
+ */
67
+ export function getValidatedTimeout() {
68
+ const timeout = GITHUB_API_TIMEOUT.DEFAULT;
69
+ if (timeout < GITHUB_API_TIMEOUT.MIN) {
70
+ return GITHUB_API_TIMEOUT.MIN;
71
+ }
72
+ if (timeout > GITHUB_API_TIMEOUT.MAX) {
73
+ return GITHUB_API_TIMEOUT.MAX;
74
+ }
75
+ return timeout;
76
+ }
77
+ /**
78
+ * GitHub API rate limiting configuration
79
+ * Implements client-side rate limiting to respect GitHub's API limits
80
+ */
81
+ export const GITHUB_API_RATE_LIMITS = {
82
+ // GitHub API limits: 5000/hour authenticated, 60/hour unauthenticated
83
+ AUTHENTICATED_LIMIT: parseInt(process.env.DOLLHOUSE_GITHUB_RATE_LIMIT_AUTH || '5000'),
84
+ UNAUTHENTICATED_LIMIT: parseInt(process.env.DOLLHOUSE_GITHUB_RATE_LIMIT_UNAUTH || '60'),
85
+ // Time window for rate limiting (1 hour)
86
+ WINDOW_MS: 60 * 60 * 1000,
87
+ // Minimum delay between API calls to prevent rapid-fire requests
88
+ MIN_DELAY_MS: parseInt(process.env.DOLLHOUSE_GITHUB_MIN_DELAY || '1000'),
89
+ // Buffer percentage - stay below actual limits to avoid hitting them
90
+ BUFFER_PERCENTAGE: parseFloat(process.env.DOLLHOUSE_GITHUB_RATE_BUFFER || '0.9')
91
+ };
92
+ /**
93
+ * Calculate retry delay using exponential backoff
94
+ */
95
+ export function calculateRetryDelay(attempt) {
96
+ const delay = Math.min(RETRY_CONFIG.INITIAL_DELAY * Math.pow(RETRY_CONFIG.BACKOFF_MULTIPLIER, attempt - 1), RETRY_CONFIG.MAX_DELAY);
97
+ return delay;
98
+ }
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGZvbGlvLWNvbnN0YW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvcG9ydGZvbGlvLWNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBY0g7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMseURBQXlEO0lBQ3pELE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsSUFBSSxPQUFPLENBQUM7SUFFdEUsc0NBQXNDO0lBQ3RDLEdBQUcsRUFBRSxJQUFJO0lBRVQsc0NBQXNDO0lBQ3RDLEdBQUcsRUFBRSxNQUFNO0NBQ0gsQ0FBQztBQUVYOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIscURBQXFEO0lBQ3JELGFBQWEsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsSUFBSSxNQUFNLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQztJQUV4RiwwQ0FBMEM7SUFDMUMsZ0JBQWdCLEVBQUUsRUFBRTtDQUNaLENBQUM7QUFFWDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRztJQUMxQixtQ0FBbUM7SUFDbkMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixJQUFJLEdBQUcsQ0FBQztJQUV2RSwrQ0FBK0M7SUFDL0MsYUFBYSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixJQUFJLE1BQU0sQ0FBQztJQUU1RSwrQ0FBK0M7SUFDL0MsU0FBUyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixJQUFJLE1BQU0sQ0FBQztJQUVwRSw2Q0FBNkM7SUFDN0Msa0JBQWtCLEVBQUUsQ0FBQztDQUNiLENBQUM7QUFFWDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUMzQiw2REFBNkQ7SUFDN0Qsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLElBQUksS0FBSyxDQUFDO0lBRS9FLDBDQUEwQztJQUMxQyxlQUFlLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLElBQUksR0FBRyxDQUFDO0NBQy9ELENBQUM7QUFFWDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRztJQUN0QixrQkFBa0IsRUFBRSw4QkFBOEI7SUFDbEQsYUFBYSxFQUFFLHlCQUF5QjtJQUN4QyxrQkFBa0IsRUFBRSw4QkFBOEI7SUFDbEQsbUJBQW1CLEVBQUUsK0JBQStCO0lBQ3BELGVBQWUsRUFBRSwyQkFBMkI7SUFDNUMsY0FBYyxFQUFFLDBCQUEwQjtJQUMxQyxlQUFlLEVBQUUsMkJBQTJCO0NBQ3BDLENBQUM7QUFFWDs7R0FFRztBQUNILE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDO0lBRTNDLElBQUksT0FBTyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sa0JBQWtCLENBQUMsR0FBRyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyQyxPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztJQUNoQyxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHO0lBQ3BDLHNFQUFzRTtJQUN0RSxtQkFBbUIsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsSUFBSSxNQUFNLENBQUM7SUFDckYscUJBQXFCLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLElBQUksSUFBSSxDQUFDO0lBRXZGLHlDQUF5QztJQUN6QyxTQUFTLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJO0lBRXpCLGlFQUFpRTtJQUNqRSxZQUFZLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMEJBQTBCLElBQUksTUFBTSxDQUFDO0lBRXhFLHFFQUFxRTtJQUNyRSxpQkFBaUIsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsSUFBSSxLQUFLLENBQUM7Q0FDeEUsQ0FBQztBQUVYOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE9BQWU7SUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDcEIsWUFBWSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQ25GLFlBQVksQ0FBQyxTQUFTLENBQ3ZCLENBQUM7SUFDRixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvcnRmb2xpbyBUb29sIENvbmZpZ3VyYXRpb24gQ29uc3RhbnRzXG4gKiBcbiAqIENlbnRyYWxpemVkIGNvbmZpZ3VyYXRpb24gZm9yIHRpbWVvdXQgdmFsdWVzLCBmaWxlIHNpemUgbGltaXRzLFxuICogcmV0cnkgYmVoYXZpb3IsIGFuZCBvdGhlciBwb3J0Zm9saW8tcmVsYXRlZCBjb25zdGFudHMuXG4gKiBcbiAqIEFsbCB2YWx1ZXMgY2FuIGJlIG92ZXJyaWRkZW4gdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgZmxleGliaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBQb3J0Zm9saW8gZWxlbWVudCBtZXRhZGF0YSBpbnRlcmZhY2UgZm9yIHR5cGUgc2FmZXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9ydGZvbGlvRWxlbWVudE1ldGFkYXRhIHtcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBhdXRob3I6IHN0cmluZztcbiAgY3JlYXRlZDogc3RyaW5nO1xuICB1cGRhdGVkOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBHaXRIdWIgQVBJIHRpbWVvdXQgY29uZmlndXJhdGlvblxuICogVXNlZCBmb3IgY29sbGVjdGlvbiBzdWJtaXNzaW9uIEFQSSBjYWxsc1xuICovXG5leHBvcnQgY29uc3QgR0lUSFVCX0FQSV9USU1FT1VUID0ge1xuICAvLyBEZWZhdWx0IHRpbWVvdXQgZm9yIEdpdEh1YiBBUEkgcmVxdWVzdHMgKG1pbGxpc2Vjb25kcylcbiAgREVGQVVMVDogcGFyc2VJbnQocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0dJVEhVQl9BUElfVElNRU9VVCB8fCAnMzAwMDAnKSxcbiAgXG4gIC8vIE1pbmltdW0gYWxsb3dlZCB0aW1lb3V0ICg1IHNlY29uZHMpXG4gIE1JTjogNTAwMCxcbiAgXG4gIC8vIE1heGltdW0gYWxsb3dlZCB0aW1lb3V0ICg1IG1pbnV0ZXMpXG4gIE1BWDogMzAwMDAwXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEZpbGUgc2l6ZSBsaW1pdHMgZm9yIHBvcnRmb2xpbyBzdWJtaXNzaW9uc1xuICovXG5leHBvcnQgY29uc3QgRklMRV9TSVpFX0xJTUlUUyA9IHtcbiAgLy8gTWF4aW11bSBmaWxlIHNpemUgZm9yIHBvcnRmb2xpbyBzdWJtaXNzaW9ucyAoMTBNQilcbiAgTUFYX0ZJTEVfU0laRTogcGFyc2VJbnQocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX01BWF9GSUxFX1NJWkUgfHwgU3RyaW5nKDEwICogMTAyNCAqIDEwMjQpKSxcbiAgXG4gIC8vIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBsaW1pdFxuICBNQVhfRklMRV9TSVpFX01COiAxMFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBSZXRyeSBjb25maWd1cmF0aW9uIGZvciBBUEkgb3BlcmF0aW9uc1xuICovXG5leHBvcnQgY29uc3QgUkVUUllfQ09ORklHID0ge1xuICAvLyBNYXhpbXVtIG51bWJlciBvZiByZXRyeSBhdHRlbXB0c1xuICBNQVhfQVRURU1QVFM6IHBhcnNlSW50KHByb2Nlc3MuZW52LkRPTExIT1VTRV9NQVhfUkVUUllfQVRURU1QVFMgfHwgJzMnKSxcbiAgXG4gIC8vIEluaXRpYWwgZGVsYXkgYmV0d2VlbiByZXRyaWVzIChtaWxsaXNlY29uZHMpXG4gIElOSVRJQUxfREVMQVk6IHBhcnNlSW50KHByb2Nlc3MuZW52LkRPTExIT1VTRV9JTklUSUFMX1JFVFJZX0RFTEFZIHx8ICcxMDAwJyksXG4gIFxuICAvLyBNYXhpbXVtIGRlbGF5IGJldHdlZW4gcmV0cmllcyAobWlsbGlzZWNvbmRzKVxuICBNQVhfREVMQVk6IHBhcnNlSW50KHByb2Nlc3MuZW52LkRPTExIT1VTRV9NQVhfUkVUUllfREVMQVkgfHwgJzUwMDAnKSxcbiAgXG4gIC8vIEJhY2tvZmYgbXVsdGlwbGllciBmb3IgZXhwb25lbnRpYWwgYmFja29mZlxuICBCQUNLT0ZGX01VTFRJUExJRVI6IDJcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogU2VhcmNoIGFuZCBzaW1pbGFyaXR5IG1hdGNoaW5nIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFNFQVJDSF9DT05GSUcgPSB7XG4gIC8vIE1pbmltdW0gc2ltaWxhcml0eSBzY29yZSBmb3IgbmFtZSBzdWdnZXN0aW9ucyAoMC4wIHRvIDEuMClcbiAgTUlOX1NJTUlMQVJJVFlfU0NPUkU6IHBhcnNlRmxvYXQocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX01JTl9TSU1JTEFSSVRZIHx8ICcwLjMnKSxcbiAgXG4gIC8vIE1heGltdW0gbnVtYmVyIG9mIHN1Z2dlc3Rpb25zIHRvIHJldHVyblxuICBNQVhfU1VHR0VTVElPTlM6IHBhcnNlSW50KHByb2Nlc3MuZW52LkRPTExIT1VTRV9NQVhfU1VHR0VTVElPTlMgfHwgJzUnKVxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcyBmb3IgZG9jdW1lbnRhdGlvblxuICovXG5leHBvcnQgY29uc3QgRU5WX1ZBUlMgPSB7XG4gIEdJVEhVQl9BUElfVElNRU9VVDogJ0RPTExIT1VTRV9HSVRIVUJfQVBJX1RJTUVPVVQnLFxuICBNQVhfRklMRV9TSVpFOiAnRE9MTEhPVVNFX01BWF9GSUxFX1NJWkUnLFxuICBNQVhfUkVUUllfQVRURU1QVFM6ICdET0xMSE9VU0VfTUFYX1JFVFJZX0FUVEVNUFRTJyxcbiAgSU5JVElBTF9SRVRSWV9ERUxBWTogJ0RPTExIT1VTRV9JTklUSUFMX1JFVFJZX0RFTEFZJyxcbiAgTUFYX1JFVFJZX0RFTEFZOiAnRE9MTEhPVVNFX01BWF9SRVRSWV9ERUxBWScsXG4gIE1JTl9TSU1JTEFSSVRZOiAnRE9MTEhPVVNFX01JTl9TSU1JTEFSSVRZJyxcbiAgTUFYX1NVR0dFU1RJT05TOiAnRE9MTEhPVVNFX01BWF9TVUdHRVNUSU9OUydcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogVmFsaWRhdGlvbiBoZWxwZXIgdG8gZW5zdXJlIHRpbWVvdXQgaXMgd2l0aGluIGFjY2VwdGFibGUgYm91bmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0ZWRUaW1lb3V0KCk6IG51bWJlciB7XG4gIGNvbnN0IHRpbWVvdXQgPSBHSVRIVUJfQVBJX1RJTUVPVVQuREVGQVVMVDtcbiAgXG4gIGlmICh0aW1lb3V0IDwgR0lUSFVCX0FQSV9USU1FT1VULk1JTikge1xuICAgIHJldHVybiBHSVRIVUJfQVBJX1RJTUVPVVQuTUlOO1xuICB9XG4gIFxuICBpZiAodGltZW91dCA+IEdJVEhVQl9BUElfVElNRU9VVC5NQVgpIHtcbiAgICByZXR1cm4gR0lUSFVCX0FQSV9USU1FT1VULk1BWDtcbiAgfVxuICBcbiAgcmV0dXJuIHRpbWVvdXQ7XG59XG5cbi8qKlxuICogR2l0SHViIEFQSSByYXRlIGxpbWl0aW5nIGNvbmZpZ3VyYXRpb25cbiAqIEltcGxlbWVudHMgY2xpZW50LXNpZGUgcmF0ZSBsaW1pdGluZyB0byByZXNwZWN0IEdpdEh1YidzIEFQSSBsaW1pdHNcbiAqL1xuZXhwb3J0IGNvbnN0IEdJVEhVQl9BUElfUkFURV9MSU1JVFMgPSB7XG4gIC8vIEdpdEh1YiBBUEkgbGltaXRzOiA1MDAwL2hvdXIgYXV0aGVudGljYXRlZCwgNjAvaG91ciB1bmF1dGhlbnRpY2F0ZWRcbiAgQVVUSEVOVElDQVRFRF9MSU1JVDogcGFyc2VJbnQocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0dJVEhVQl9SQVRFX0xJTUlUX0FVVEggfHwgJzUwMDAnKSxcbiAgVU5BVVRIRU5USUNBVEVEX0xJTUlUOiBwYXJzZUludChwcm9jZXNzLmVudi5ET0xMSE9VU0VfR0lUSFVCX1JBVEVfTElNSVRfVU5BVVRIIHx8ICc2MCcpLFxuICBcbiAgLy8gVGltZSB3aW5kb3cgZm9yIHJhdGUgbGltaXRpbmcgKDEgaG91cilcbiAgV0lORE9XX01TOiA2MCAqIDYwICogMTAwMCxcbiAgXG4gIC8vIE1pbmltdW0gZGVsYXkgYmV0d2VlbiBBUEkgY2FsbHMgdG8gcHJldmVudCByYXBpZC1maXJlIHJlcXVlc3RzXG4gIE1JTl9ERUxBWV9NUzogcGFyc2VJbnQocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0dJVEhVQl9NSU5fREVMQVkgfHwgJzEwMDAnKSxcbiAgXG4gIC8vIEJ1ZmZlciBwZXJjZW50YWdlIC0gc3RheSBiZWxvdyBhY3R1YWwgbGltaXRzIHRvIGF2b2lkIGhpdHRpbmcgdGhlbVxuICBCVUZGRVJfUEVSQ0VOVEFHRTogcGFyc2VGbG9hdChwcm9jZXNzLmVudi5ET0xMSE9VU0VfR0lUSFVCX1JBVEVfQlVGRkVSIHx8ICcwLjknKVxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBDYWxjdWxhdGUgcmV0cnkgZGVsYXkgdXNpbmcgZXhwb25lbnRpYWwgYmFja29mZlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlUmV0cnlEZWxheShhdHRlbXB0OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBkZWxheSA9IE1hdGgubWluKFxuICAgIFJFVFJZX0NPTkZJRy5JTklUSUFMX0RFTEFZICogTWF0aC5wb3coUkVUUllfQ09ORklHLkJBQ0tPRkZfTVVMVElQTElFUiwgYXR0ZW1wdCAtIDEpLFxuICAgIFJFVFJZX0NPTkZJRy5NQVhfREVMQVlcbiAgKTtcbiAgcmV0dXJuIGRlbGF5O1xufSJdfQ==
@@ -27,10 +27,22 @@ export declare abstract class BaseElement implements IElement {
27
27
  */
28
28
  validate(): ElementValidationResult;
29
29
  /**
30
- * Default serialization to JSON.
31
- * Subclasses can override for custom formats.
30
+ * Serialize to JSON format for internal use and testing.
31
+ * Maintains backward compatibility with existing tests.
32
+ */
33
+ serializeToJSON(): string;
34
+ /**
35
+ * Default serialization to markdown with YAML frontmatter.
36
+ * Uses js-yaml for secure YAML generation to prevent injection attacks.
37
+ * FIX: Changed from JSON to proper markdown format for GitHub portfolio storage.
38
+ * This ensures elements are readable on GitHub and compatible with collection workflow.
32
39
  */
33
40
  serialize(): string;
41
+ /**
42
+ * Get element content for serialization.
43
+ * Subclasses should override this to provide their specific content.
44
+ */
45
+ protected getContent?(): string;
34
46
  /**
35
47
  * Default deserialization from JSON.
36
48
  * Subclasses can override for custom formats.
@@ -1 +1 @@
1
- {"version":3,"file":"BaseElement.d.ts","sourceRoot":"","sources":["../../src/elements/BaseElement.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,SAAS,EACT,uBAAuB,EAGvB,eAAe,EAEhB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMpD,8BAAsB,WAAY,YAAW,QAAQ;IAE5C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAGhB,QAAQ,EAAE,gBAAgB,CAAC;IAG3B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,cAAc,CAAC;IAGhC,SAAS,CAAC,OAAO,EAAE,aAAa,CAA0B;IAC1D,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAS;IAGpC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAO;gBAEhC,IAAI,EAAE,WAAW,EAAE,QAAQ,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAgCvE;;;OAGG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAW1C;;;OAGG;IACI,QAAQ,IAAI,uBAAuB;IA8F1C;;;OAGG;IACI,SAAS,IAAI,MAAM;IAc1B;;;OAGG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA2BtC;;OAEG;IACI,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IA6DzE;;;OAGG;IACH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS;IAcjF;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAyB3D;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IA+BnD;;OAEG;IACI,SAAS,IAAI,aAAa;IAIjC;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKzB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOxC;;OAEG;IACH,SAAS,CAAC,SAAS,IAAI,IAAI;IAK3B;;OAEG;IACI,OAAO,IAAI,OAAO;IAIzB;;OAEG;IACI,SAAS,IAAI,IAAI;CAGzB"}
1
+ {"version":3,"file":"BaseElement.d.ts","sourceRoot":"","sources":["../../src/elements/BaseElement.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,SAAS,EACT,uBAAuB,EAGvB,eAAe,EAEhB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAQpD,8BAAsB,WAAY,YAAW,QAAQ;IAE5C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAGhB,QAAQ,EAAE,gBAAgB,CAAC;IAG3B,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,cAAc,CAAC;IAGhC,SAAS,CAAC,OAAO,EAAE,aAAa,CAA0B;IAC1D,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAS;IAGpC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAO;gBAEhC,IAAI,EAAE,WAAW,EAAE,QAAQ,GAAE,OAAO,CAAC,gBAAgB,CAAM;IAgCvE;;;OAGG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAW1C;;;OAGG;IACI,QAAQ,IAAI,uBAAuB;IA8F1C;;;OAGG;IACI,eAAe,IAAI,MAAM;IAchC;;;;;OAKG;IACI,SAAS,IAAI,MAAM;IAoE1B;;;OAGG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,MAAM;IAE/B;;;OAGG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA0CtC;;OAEG;IACI,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IA6DzE;;;OAGG;IACH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS;IAcjF;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAyB3D;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IA+BnD;;OAEG;IACI,SAAS,IAAI,aAAa;IAIjC;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKzB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOxC;;OAEG;IACH,SAAS,CAAC,SAAS,IAAI,IAAI;IAK3B;;OAEG;IACI,OAAO,IAAI,OAAO;IAIzB;;OAEG;IACI,SAAS,IAAI,IAAI;CAGzB"}
@@ -4,9 +4,11 @@
4
4
  */
5
5
  import { ElementStatus } from '../types/elements/index.js';
6
6
  import { v4 as uuidv4 } from 'uuid';
7
+ import * as yaml from 'js-yaml';
7
8
  import { logger } from '../utils/logger.js';
8
9
  import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
9
10
  import { SecurityMonitor } from '../security/securityMonitor.js';
11
+ import { SecureYamlParser } from '../security/secureYamlParser.js';
10
12
  export class BaseElement {
11
13
  // Identity
12
14
  id;
@@ -153,10 +155,10 @@ export class BaseElement {
153
155
  };
154
156
  }
155
157
  /**
156
- * Default serialization to JSON.
157
- * Subclasses can override for custom formats.
158
+ * Serialize to JSON format for internal use and testing.
159
+ * Maintains backward compatibility with existing tests.
158
160
  */
159
- serialize() {
161
+ serializeToJSON() {
160
162
  const data = {
161
163
  id: this.id,
162
164
  type: this.type,
@@ -168,6 +170,73 @@ export class BaseElement {
168
170
  };
169
171
  return JSON.stringify(data, null, 2);
170
172
  }
173
+ /**
174
+ * Default serialization to markdown with YAML frontmatter.
175
+ * Uses js-yaml for secure YAML generation to prevent injection attacks.
176
+ * FIX: Changed from JSON to proper markdown format for GitHub portfolio storage.
177
+ * This ensures elements are readable on GitHub and compatible with collection workflow.
178
+ */
179
+ serialize() {
180
+ // Build YAML frontmatter starting with all metadata fields
181
+ // This ensures subclasses can add their own fields
182
+ const frontmatter = {
183
+ ...this.metadata, // Include all metadata fields
184
+ type: this.type,
185
+ version: this.version
186
+ };
187
+ // Note: metadata already includes name, description, author, created, modified
188
+ // and any additional fields added by subclasses
189
+ if (this.references && this.references.length > 0) {
190
+ frontmatter.references = this.references.map(ref => ({
191
+ type: ref.type,
192
+ uri: ref.uri,
193
+ title: ref.title
194
+ }));
195
+ }
196
+ if (this.ratings && this.ratings.aiRating > 0) {
197
+ frontmatter.ratings = {
198
+ aiRating: this.ratings.aiRating,
199
+ userRating: this.ratings.userRating,
200
+ ratingCount: this.ratings.ratingCount
201
+ };
202
+ }
203
+ // Remove undefined/null values
204
+ const cleanFrontmatter = Object.fromEntries(Object.entries(frontmatter).filter(([_, value]) => value !== undefined && value !== null));
205
+ // Use js-yaml for secure YAML generation
206
+ // This prevents YAML injection attacks and handles special characters properly
207
+ let yamlFrontmatter;
208
+ try {
209
+ yamlFrontmatter = yaml.dump(cleanFrontmatter, {
210
+ noRefs: true, // Don't use YAML references
211
+ sortKeys: false, // Keep our order
212
+ lineWidth: -1, // Don't wrap lines
213
+ quotingType: '"', // Use double quotes when needed
214
+ forceQuotes: false, // Only quote when necessary
215
+ skipInvalid: false // Don't skip invalid values
216
+ });
217
+ }
218
+ catch (error) {
219
+ // If YAML generation fails, log and throw a more informative error
220
+ logger.error('Failed to generate YAML frontmatter', { error, frontmatter: cleanFrontmatter });
221
+ throw new Error(`Failed to serialize element metadata to YAML: ${error instanceof Error ? error.message : 'Unknown error'}`);
222
+ }
223
+ // Validate the generated YAML can be parsed back using SecureYamlParser
224
+ // HIGH SEVERITY FIX: Use SecureYamlParser instead of yaml.load to prevent code execution
225
+ try {
226
+ SecureYamlParser.parse(yamlFrontmatter, {
227
+ maxYamlSize: 64 * 1024, // 64KB limit for frontmatter
228
+ validateContent: true
229
+ });
230
+ }
231
+ catch (error) {
232
+ logger.error('Generated invalid YAML', { error, yaml: yamlFrontmatter });
233
+ throw new Error(`Generated YAML is invalid: ${error instanceof Error ? error.message : 'Unknown error'}`);
234
+ }
235
+ // Get content - subclasses should override this to provide actual content
236
+ const content = this.getContent ? this.getContent() : `# ${this.metadata.name}\n\n${this.metadata.description || ''}`;
237
+ // Trim the YAML to remove trailing newline that yaml.dump adds
238
+ return `---\n${yamlFrontmatter.trim()}\n---\n\n${content}`;
239
+ }
171
240
  /**
172
241
  * Default deserialization from JSON.
173
242
  * Subclasses can override for custom formats.
@@ -192,8 +261,21 @@ export class BaseElement {
192
261
  this._isDirty = false;
193
262
  }
194
263
  catch (error) {
195
- logger.error('Failed to deserialize element', { error, data });
196
- throw new Error(`Failed to deserialize element: ${error instanceof Error ? error.message : 'Unknown error'}`);
264
+ // Enhanced error context preservation
265
+ const errorMessage = error instanceof Error ? error.message : String(error);
266
+ const errorStack = error instanceof Error ? error.stack : undefined;
267
+ logger.error('Failed to deserialize element', {
268
+ error: errorMessage,
269
+ stack: errorStack,
270
+ dataPreview: data.substring(0, 200), // First 200 chars for context
271
+ elementType: this.type
272
+ });
273
+ // Create new error with original as cause
274
+ const deserializeError = new Error(`BaseElement deserialization failed: ${errorMessage}`);
275
+ if (error instanceof Error) {
276
+ deserializeError.cause = error;
277
+ }
278
+ throw deserializeError;
197
279
  }
198
280
  }
199
281
  /**
@@ -378,4 +460,4 @@ export class BaseElement {
378
460
  this._isDirty = false;
379
461
  }
380
462
  }
381
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZWxlbWVudHMvQmFzZUVsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUdMLGFBQWEsRUFRZCxNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFakUsTUFBTSxPQUFnQixXQUFXO0lBQy9CLFdBQVc7SUFDSixFQUFFLENBQVM7SUFDWCxJQUFJLENBQWM7SUFDbEIsT0FBTyxDQUFTO0lBRXZCLFdBQVc7SUFDSixRQUFRLENBQW1CO0lBRWxDLFdBQVc7SUFDSixVQUFVLENBQWU7SUFDekIsVUFBVSxDQUF1QjtJQUNqQyxPQUFPLENBQWtCO0lBRWhDLGlCQUFpQjtJQUNQLE9BQU8sR0FBa0IsYUFBYSxDQUFDLFFBQVEsQ0FBQztJQUNoRCxRQUFRLEdBQVksS0FBSyxDQUFDO0lBRXBDLFlBQVk7SUFDSyxvQkFBb0IsR0FBRyxHQUFHLENBQUM7SUFFNUMsWUFBWSxJQUFpQixFQUFFLFdBQXNDLEVBQUU7UUFDckUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQztRQUUzQyxvQ0FB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QUFhLENBQUMsVUFBVSxDQUFDO0lBQzFDLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUTtRQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksYUFBYSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO0lBQ3RDLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYTtRQUN4QixNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixJQUFJLENBQUMsSUFBSSxhQUFhLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksYUFBYSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDO1FBQzFDLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ08sU0FBUztRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNkLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRpbmcgSUVsZW1lbnQgaW50ZXJmYWNlLlxuICogUHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgdGhhdCBhbGwgZWxlbWVudCB0eXBlcyBjYW4gZXh0ZW5kLlxuICovXG5cbmltcG9ydCB7XG4gIElFbGVtZW50LFxuICBJRWxlbWVudE1ldGFkYXRhLFxuICBFbGVtZW50U3RhdHVzLFxuICBFbGVtZW50UmF0aW5ncyxcbiAgUmVmZXJlbmNlLFxuICBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBWYWxpZGF0aW9uV2FybmluZyxcbiAgRmVlZGJhY2tDb250ZXh0LFxuICBVc2VyRmVlZGJhY2tcbn0gZnJvbSAnLi4vdHlwZXMvZWxlbWVudHMvaW5kZXguanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUVsZW1lbnQgaW1wbGVtZW50cyBJRWxlbWVudCB7XG4gIC8vIElkZW50aXR5XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgdHlwZTogRWxlbWVudFR5cGU7XG4gIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmc7XG4gIFxuICAvLyBNZXRhZGF0YVxuICBwdWJsaWMgbWV0YWRhdGE6IElFbGVtZW50TWV0YWRhdGE7XG4gIFxuICAvLyBGZWF0dXJlc1xuICBwdWJsaWMgcmVmZXJlbmNlcz86IFJlZmVyZW5jZVtdO1xuICBwdWJsaWMgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHB1YmxpYyByYXRpbmdzPzogRWxlbWVudFJhdGluZ3M7XG4gIFxuICAvLyBJbnRlcm5hbCBzdGF0ZVxuICBwcm90ZWN0ZWQgX3N0YXR1czogRWxlbWVudFN0YXR1cyA9IEVsZW1lbnRTdGF0dXMuSU5BQ1RJVkU7XG4gIHByb3RlY3RlZCBfaXNEaXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gQ29uc3RhbnRzXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX0ZFRURCQUNLX0hJU1RPUlkgPSAxMDA7XG4gIFxuICBjb25zdHJ1Y3Rvcih0eXBlOiBFbGVtZW50VHlwZSwgbWV0YWRhdGE6IFBhcnRpYWw8SUVsZW1lbnRNZXRhZGF0YT4gPSB7fSkge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5pZCA9IG1ldGFkYXRhLm5hbWUgPyB0aGlzLmdlbmVyYXRlSWQobWV0YWRhdGEubmFtZSkgOiB1dWlkdjQoKTtcbiAgICB0aGlzLnZlcnNpb24gPSBtZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAuMCc7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBtZXRhZGF0YSB3aXRoIGRlZmF1bHRzXG4gICAgdGhpcy5tZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUgfHwgJ1VubmFtZWQgRWxlbWVudCcsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICBhdXRob3I6IG1ldGFkYXRhLmF1dGhvcixcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIGNyZWF0ZWQ6IG1ldGFkYXRhLmNyZWF0ZWQgfHwgbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgbW9kaWZpZWQ6IG1ldGFkYXRhLm1vZGlmaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRhZ3M6IG1ldGFkYXRhLnRhZ3MgfHwgW10sXG4gICAgICBkZXBlbmRlbmNpZXM6IG1ldGFkYXRhLmRlcGVuZGVuY2llcyB8fCBbXSxcbiAgICAgIGN1c3RvbTogbWV0YWRhdGEuY3VzdG9tIHx8IHt9XG4gICAgfTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIG9wdGlvbmFsIGZlYXR1cmVzXG4gICAgdGhpcy5yZWZlcmVuY2VzID0gW107XG4gICAgdGhpcy5leHRlbnNpb25zID0ge307XG4gICAgdGhpcy5yYXRpbmdzID0ge1xuICAgICAgYWlSYXRpbmc6IDAsXG4gICAgICB1c2VyUmF0aW5nOiB1bmRlZmluZWQsXG4gICAgICByYXRpbmdDb3VudDogMCxcbiAgICAgIGxhc3RFdmFsdWF0ZWQ6IG5ldyBEYXRlKCksXG4gICAgICBjb25maWRlbmNlOiAwLFxuICAgICAgdHJlbmQ6ICdzdGFibGUnLFxuICAgICAgZmVlZGJhY2tIaXN0b3J5OiBbXVxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhlIGVsZW1lbnQgYmFzZWQgb24gaXRzIG5hbWUgYW5kIHR5cGUuXG4gICAqIEZvcm1hdDogdHlwZV9uYW1lLXNsdWdfdGltZXN0YW1wXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2VuZXJhdGVJZChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVTbHVnID0gdGhpcy50eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbmFtZVNsdWcgPSBuYW1lXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKVxuICAgICAgLnJlcGxhY2UoL14tfC0kL2csICcnKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIFxuICAgIHJldHVybiBgJHt0eXBlU2x1Z31fJHtuYW1lU2x1Z31fJHt0aW1lc3RhbXB9YDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENvcmUgdmFsaWRhdGlvbiB0aGF0IGFsbCBlbGVtZW50cyBzaGFyZS5cbiAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYW5kIGNhbGwgc3VwZXIudmFsaWRhdGUoKSBmaXJzdC5cbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZSgpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgLy8gTG9nIHNlY3VyaXR5LXJlbGV2YW50IHZhbGlkYXRpb24gZXZlbnRcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnWUFNTF9QQVJTRV9TVUNDRVNTJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Jhc2VFbGVtZW50LnZhbGlkYXRlJyxcbiAgICAgIGRldGFpbHM6IGBFbGVtZW50IHZhbGlkYXRpb24gcGVyZm9ybWVkIGZvciAke3RoaXMudHlwZX06JHt0aGlzLmlkfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbGVtZW50VHlwZTogdGhpcy50eXBlLCBlbGVtZW50SWQ6IHRoaXMuaWQgfVxuICAgIH0pO1xuICAgIFxuICAgIGNvbnN0IGVycm9yczogVmFsaWRhdGlvbkVycm9yW10gPSBbXTtcbiAgICBjb25zdCB3YXJuaW5nczogVmFsaWRhdGlvbldhcm5pbmdbXSA9IFtdO1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICAgIFxuICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGZpZWxkc1xuICAgIGlmICghdGhpcy5pZCkge1xuICAgICAgZXJyb3JzLnB1c2goeyBmaWVsZDogJ2lkJywgbWVzc2FnZTogJ0VsZW1lbnQgSUQgaXMgcmVxdWlyZWQnIH0pO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIXRoaXMubWV0YWRhdGEubmFtZSB8fCB0aGlzLm1ldGFkYXRhLm5hbWUudHJpbSgpID09PSAnJykge1xuICAgICAgZXJyb3JzLnB1c2goeyBmaWVsZDogJ21ldGFkYXRhLm5hbWUnLCBtZXNzYWdlOiAnRWxlbWVudCBuYW1lIGlzIHJlcXVpcmVkJyB9KTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8IHRoaXMubWV0YWRhdGEuZGVzY3JpcHRpb24udHJpbSgpID09PSAnJykge1xuICAgICAgd2FybmluZ3MucHVzaCh7IFxuICAgICAgICBmaWVsZDogJ21ldGFkYXRhLmRlc2NyaXB0aW9uJywgXG4gICAgICAgIG1lc3NhZ2U6ICdFbGVtZW50IGRlc2NyaXB0aW9uIGlzIHJlY29tbWVuZGVkJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdtZWRpdW0nXG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgdmVyc2lvbiBmb3JtYXQgKHNlbXZlcilcbiAgICBjb25zdCBzZW12ZXJSZWdleCA9IC9eXFxkK1xcLlxcZCtcXC5cXGQrKC1bYS16QS1aMC05Li1dKyk/KFxcK1thLXpBLVowLTkuLV0rKT8kLztcbiAgICBpZiAoIXNlbXZlclJlZ2V4LnRlc3QodGhpcy52ZXJzaW9uKSkge1xuICAgICAgZXJyb3JzLnB1c2goeyBcbiAgICAgICAgZmllbGQ6ICd2ZXJzaW9uJywgXG4gICAgICAgIG1lc3NhZ2U6ICdWZXJzaW9uIG11c3QgZm9sbG93IHNlbWFudGljIHZlcnNpb25pbmcgKGUuZy4sIDEuMC4wKScsXG4gICAgICAgIGNvZGU6ICdJTlZBTElEX1ZFUlNJT05fRk9STUFUJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFZhbGlkYXRlIHJlZmVyZW5jZXNcbiAgICBpZiAodGhpcy5yZWZlcmVuY2VzKSB7XG4gICAgICB0aGlzLnJlZmVyZW5jZXMuZm9yRWFjaCgocmVmLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoIXJlZi51cmkgfHwgcmVmLnVyaS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goeyBcbiAgICAgICAgICAgIGZpZWxkOiBgcmVmZXJlbmNlc1ske2luZGV4fV0udXJpYCwgXG4gICAgICAgICAgICBtZXNzYWdlOiAnUmVmZXJlbmNlIFVSSSBpcyByZXF1aXJlZCcgXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZWYudGl0bGUgfHwgcmVmLnRpdGxlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKHsgXG4gICAgICAgICAgICBmaWVsZDogYHJlZmVyZW5jZXNbJHtpbmRleH1dLnRpdGxlYCwgXG4gICAgICAgICAgICBtZXNzYWdlOiAnUmVmZXJlbmNlIHRpdGxlIGlzIHJlY29tbWVuZGVkJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnbG93J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgcmF0aW5ncyBpZiBwcmVzZW50XG4gICAgaWYgKHRoaXMucmF0aW5ncykge1xuICAgICAgaWYgKHRoaXMucmF0aW5ncy5haVJhdGluZyA8IDAgfHwgdGhpcy5yYXRpbmdzLmFpUmF0aW5nID4gNSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IFxuICAgICAgICAgIGZpZWxkOiAncmF0aW5ncy5haVJhdGluZycsIFxuICAgICAgICAgIG1lc3NhZ2U6ICdBSSByYXRpbmcgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDUnIFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJhdGluZ3MudXNlclJhdGluZyAhPT0gdW5kZWZpbmVkICYmIFxuICAgICAgICAgICh0aGlzLnJhdGluZ3MudXNlclJhdGluZyA8IDAgfHwgdGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcgPiA1KSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IFxuICAgICAgICAgIGZpZWxkOiAncmF0aW5ncy51c2VyUmF0aW5nJywgXG4gICAgICAgICAgbWVzc2FnZTogJ1VzZXIgcmF0aW5nIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA1JyBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBzdWdnZXN0aW9uc1xuICAgIGlmICghdGhpcy5tZXRhZGF0YS50YWdzIHx8IHRoaXMubWV0YWRhdGEudGFncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goJ0NvbnNpZGVyIGFkZGluZyB0YWdzIHRvIGltcHJvdmUgZGlzY292ZXJhYmlsaXR5Jyk7XG4gICAgfVxuICAgIFxuICAgIGlmICghdGhpcy5tZXRhZGF0YS5hdXRob3IpIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goJ0NvbnNpZGVyIGFkZGluZyBhdXRob3IgaW5mb3JtYXRpb24nKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgICAgZXJyb3JzOiBlcnJvcnMubGVuZ3RoID4gMCA/IGVycm9ycyA6IHVuZGVmaW5lZCxcbiAgICAgIHdhcm5pbmdzOiB3YXJuaW5ncy5sZW5ndGggPiAwID8gd2FybmluZ3MgOiB1bmRlZmluZWQsXG4gICAgICBzdWdnZXN0aW9uczogc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IHN1Z2dlc3Rpb25zIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERlZmF1bHQgc2VyaWFsaXphdGlvbiB0byBKU09OLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBmb3IgY3VzdG9tIGZvcm1hdHMuXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICByZWZlcmVuY2VzOiB0aGlzLnJlZmVyZW5jZXMsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmV4dGVuc2lvbnMsXG4gICAgICByYXRpbmdzOiB0aGlzLnJhdGluZ3NcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERlZmF1bHQgZGVzZXJpYWxpemF0aW9uIGZyb20gSlNPTi5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgZm9yIGN1c3RvbSBmb3JtYXRzLlxuICAgKi9cbiAgcHVibGljIGRlc2VyaWFsaXplKGRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3JtYWxpemUgVW5pY29kZSBpbnB1dCBiZWZvcmUgcGFyc2luZ1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRhdGEpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh2YWxpZGF0aW9uUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gICAgICBpZiAoIXBhcnNlZC5pZCB8fCAhcGFyc2VkLnR5cGUgfHwgIXBhcnNlZC5tZXRhZGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWxlbWVudCBkYXRhOiBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcycpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgcHJvcGVydGllc1xuICAgICAgdGhpcy5pZCA9IHBhcnNlZC5pZDtcbiAgICAgIHRoaXMudHlwZSA9IHBhcnNlZC50eXBlO1xuICAgICAgdGhpcy52ZXJzaW9uID0gcGFyc2VkLnZlcnNpb24gfHwgJzEuMC4wJztcbiAgICAgIHRoaXMubWV0YWRhdGEgPSBwYXJzZWQubWV0YWRhdGE7XG4gICAgICB0aGlzLnJlZmVyZW5jZXMgPSBwYXJzZWQucmVmZXJlbmNlcyB8fCBbXTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHBhcnNlZC5leHRlbnNpb25zIHx8IHt9O1xuICAgICAgdGhpcy5yYXRpbmdzID0gcGFyc2VkLnJhdGluZ3M7XG4gICAgICBcbiAgICAgIHRoaXMuX2lzRGlydHkgPSBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZGVzZXJpYWxpemUgZWxlbWVudCcsIHsgZXJyb3IsIGRhdGEgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXNlcmlhbGl6ZSBlbGVtZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFByb2Nlc3MgdXNlciBmZWVkYmFjayBhbmQgdXBkYXRlIHJhdGluZ3MuXG4gICAqL1xuICBwdWJsaWMgcmVjZWl2ZUZlZWRiYWNrKGZlZWRiYWNrOiBzdHJpbmcsIGNvbnRleHQ/OiBGZWVkYmFja0NvbnRleHQpOiB2b2lkIHtcbiAgICAvLyBOb3JtYWxpemUgVW5pY29kZSBpbnB1dCB0byBwcmV2ZW50IHNlY3VyaXR5IGlzc3Vlc1xuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShmZWVkYmFjayk7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZlZWRiYWNrID0gdmFsaWRhdGlvblJlc3VsdC5ub3JtYWxpemVkQ29udGVudDtcbiAgICBcbiAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGZlZWRiYWNrIHByb2Nlc3NpbmdcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdCYXNlRWxlbWVudC5yZWNlaXZlRmVlZGJhY2snLFxuICAgICAgZGV0YWlsczogYEZlZWRiYWNrIHByb2Nlc3NlZCBmb3IgZWxlbWVudCAke3RoaXMudHlwZX06JHt0aGlzLmlkfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YTogeyBcbiAgICAgICAgZWxlbWVudFR5cGU6IHRoaXMudHlwZSwgXG4gICAgICAgIGVsZW1lbnRJZDogdGhpcy5pZCxcbiAgICAgICAgZmVlZGJhY2tMZW5ndGg6IGZlZWRiYWNrLmxlbmd0aCxcbiAgICAgICAgaGFzVW5pY29kZUlzc3VlczogIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZFxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIGlmICghdGhpcy5yYXRpbmdzKSB7XG4gICAgICB0aGlzLnJhdGluZ3MgPSB7XG4gICAgICAgIGFpUmF0aW5nOiAwLFxuICAgICAgICB1c2VyUmF0aW5nOiB1bmRlZmluZWQsXG4gICAgICAgIHJhdGluZ0NvdW50OiAwLFxuICAgICAgICBsYXN0RXZhbHVhdGVkOiBuZXcgRGF0ZSgpLFxuICAgICAgICBjb25maWRlbmNlOiAwLFxuICAgICAgICB0cmVuZDogJ3N0YWJsZScsXG4gICAgICAgIGZlZWRiYWNrSGlzdG9yeTogW11cbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSBmZWVkYmFjayBlbnRyeSB3aXRoIG5vcm1hbGl6ZWQgY29udGVudFxuICAgIGNvbnN0IHVzZXJGZWVkYmFjazogVXNlckZlZWRiYWNrID0ge1xuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgZmVlZGJhY2s6IG5vcm1hbGl6ZWRGZWVkYmFjayxcbiAgICAgIHNlbnRpbWVudDogdGhpcy5hbmFseXplU2VudGltZW50KG5vcm1hbGl6ZWRGZWVkYmFjayksXG4gICAgICBpbmZlcnJlZFJhdGluZzogdGhpcy5pbmZlclJhdGluZyhub3JtYWxpemVkRmVlZGJhY2spLFxuICAgICAgY29udGV4dCxcbiAgICAgIGVsZW1lbnRWZXJzaW9uOiB0aGlzLnZlcnNpb25cbiAgICB9O1xuICAgIFxuICAgIC8vIEFkZCB0byBoaXN0b3J5IHdpdGggYm91bmRzIGNoZWNraW5nXG4gICAgaWYgKCF0aGlzLnJhdGluZ3MuZmVlZGJhY2tIaXN0b3J5KSB7XG4gICAgICB0aGlzLnJhdGluZ3MuZmVlZGJhY2tIaXN0b3J5ID0gW107XG4gICAgfVxuICAgIHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3RvcnkucHVzaCh1c2VyRmVlZGJhY2spO1xuICAgIFxuICAgIC8vIFByZXZlbnQgdW5ib3VuZGVkIGdyb3d0aFxuICAgIGlmICh0aGlzLnJhdGluZ3MuZmVlZGJhY2tIaXN0b3J5Lmxlbmd0aCA+IHRoaXMuTUFYX0ZFRURCQUNLX0hJU1RPUlkpIHtcbiAgICAgIHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3RvcnkgPSB0aGlzLnJhdGluZ3MuZmVlZGJhY2tIaXN0b3J5LnNsaWNlKC10aGlzLk1BWF9GRUVEQkFDS19ISVNUT1JZKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgRmVlZGJhY2sgaGlzdG9yeSB0cmltbWVkIHRvICR7dGhpcy5NQVhfRkVFREJBQ0tfSElTVE9SWX0gZW50cmllcyBmb3IgZWxlbWVudCAke3RoaXMuaWR9YCk7XG4gICAgfVxuICAgIFxuICAgIC8vIFVwZGF0ZSB1c2VyIHJhdGluZyBpZiB3ZSBpbmZlcnJlZCBvbmVcbiAgICBpZiAodXNlckZlZWRiYWNrLmluZmVycmVkUmF0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlclJhdGluZyh1c2VyRmVlZGJhY2suaW5mZXJyZWRSYXRpbmcpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNpbXBsZSBzZW50aW1lbnQgYW5hbHlzaXMuXG4gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGZvciBtb3JlIHNvcGhpc3RpY2F0ZWQgYW5hbHlzaXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgYW5hbHl6ZVNlbnRpbWVudChmZWVkYmFjazogc3RyaW5nKTogJ3Bvc2l0aXZlJyB8ICduZWdhdGl2ZScgfCAnbmV1dHJhbCcge1xuICAgIGNvbnN0IGxvd2VyID0gZmVlZGJhY2sudG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICBjb25zdCBwb3NpdGl2ZVdvcmRzID0gWydleGNlbGxlbnQnLCAnZ3JlYXQnLCAnZ29vZCcsICdoZWxwZnVsJywgJ3VzZWZ1bCcsICdwZXJmZWN0JywgJ2FtYXppbmcnLCAnbG92ZSddO1xuICAgIGNvbnN0IG5lZ2F0aXZlV29yZHMgPSBbJ2JhZCcsICdwb29yJywgJ3RlcnJpYmxlJywgJ3VzZWxlc3MnLCAnYnJva2VuJywgJ2hhdGUnLCAnYXdmdWwnLCAnZGlzYXBwb2ludGluZyddO1xuICAgIFxuICAgIGNvbnN0IHBvc2l0aXZlQ291bnQgPSBwb3NpdGl2ZVdvcmRzLmZpbHRlcih3b3JkID0+IGxvd2VyLmluY2x1ZGVzKHdvcmQpKS5sZW5ndGg7XG4gICAgY29uc3QgbmVnYXRpdmVDb3VudCA9IG5lZ2F0aXZlV29yZHMuZmlsdGVyKHdvcmQgPT4gbG93ZXIuaW5jbHVkZXMod29yZCkpLmxlbmd0aDtcbiAgICBcbiAgICBpZiAocG9zaXRpdmVDb3VudCA+IG5lZ2F0aXZlQ291bnQpIHJldHVybiAncG9zaXRpdmUnO1xuICAgIGlmIChuZWdhdGl2ZUNvdW50ID4gcG9zaXRpdmVDb3VudCkgcmV0dXJuICduZWdhdGl2ZSc7XG4gICAgcmV0dXJuICduZXV0cmFsJztcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNpbXBsZSByYXRpbmcgaW5mZXJlbmNlIGZyb20gZmVlZGJhY2suXG4gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGZvciBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5mZXJlbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGluZmVyUmF0aW5nKGZlZWRiYWNrOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlbnRpbWVudCA9IHRoaXMuYW5hbHl6ZVNlbnRpbWVudChmZWVkYmFjayk7XG4gICAgY29uc3QgbG93ZXIgPSBmZWVkYmFjay50b0xvd2VyQ2FzZSgpO1xuICAgIFxuICAgIC8vIExvb2sgZm9yIGV4cGxpY2l0IHJhdGluZ3NcbiAgICBjb25zdCByYXRpbmdNYXRjaCA9IGxvd2VyLm1hdGNoKC8oXFxkKylcXHMqKHN0YXJzP3xcXC81fG91dCBvZiA1KS8pO1xuICAgIGlmIChyYXRpbmdNYXRjaCkge1xuICAgICAgY29uc3QgcmF0aW5nID0gcGFyc2VJbnQocmF0aW5nTWF0Y2hbMV0pO1xuICAgICAgaWYgKHJhdGluZyA+PSAxICYmIHJhdGluZyA8PSA1KSByZXR1cm4gcmF0aW5nO1xuICAgIH1cbiAgICBcbiAgICAvLyBJbmZlciBmcm9tIHNlbnRpbWVudFxuICAgIGlmIChzZW50aW1lbnQgPT09ICdwb3NpdGl2ZScpIHtcbiAgICAgIGlmIChsb3dlci5pbmNsdWRlcygncGVyZmVjdCcpIHx8IGxvd2VyLmluY2x1ZGVzKCdleGNlbGxlbnQnKSkgcmV0dXJuIDU7XG4gICAgICBpZiAobG93ZXIuaW5jbHVkZXMoJ2dyZWF0JykgfHwgbG93ZXIuaW5jbHVkZXMoJ3ZlcnkgZ29vZCcpKSByZXR1cm4gNDtcbiAgICAgIHJldHVybiA0O1xuICAgIH0gZWxzZSBpZiAoc2VudGltZW50ID09PSAnbmVnYXRpdmUnKSB7XG4gICAgICBpZiAobG93ZXIuaW5jbHVkZXMoJ3RlcnJpYmxlJykgfHwgbG93ZXIuaW5jbHVkZXMoJ2F3ZnVsJykpIHJldHVybiAxO1xuICAgICAgaWYgKGxvd2VyLmluY2x1ZGVzKCdwb29yJykgfHwgbG93ZXIuaW5jbHVkZXMoJ2JhZCcpKSByZXR1cm4gMjtcbiAgICAgIHJldHVybiAyO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gMzsgLy8gTmV1dHJhbFxuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIHVzZXIgcmF0aW5nIHdpdGggYSBuZXcgdmFsdWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlVXNlclJhdGluZyhuZXdSYXRpbmc6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5yYXRpbmdzKSByZXR1cm47XG4gICAgXG4gICAgaWYgKHRoaXMucmF0aW5ncy51c2VyUmF0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmF0aW5ncy51c2VyUmF0aW5nID0gbmV3UmF0aW5nO1xuICAgICAgdGhpcy5yYXRpbmdzLnJhdGluZ0NvdW50ID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FsY3VsYXRlIHJ1bm5pbmcgYXZlcmFnZVxuICAgICAgY29uc3QgdG90YWxSYXRpbmcgPSB0aGlzLnJhdGluZ3MudXNlclJhdGluZyAqIHRoaXMucmF0aW5ncy5yYXRpbmdDb3VudCArIG5ld1JhdGluZztcbiAgICAgIHRoaXMucmF0aW5ncy5yYXRpbmdDb3VudCsrO1xuICAgICAgdGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcgPSB0b3RhbFJhdGluZyAvIHRoaXMucmF0aW5ncy5yYXRpbmdDb3VudDtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIGRlbHRhIGFuZCB0cmVuZFxuICAgIHRoaXMucmF0aW5ncy5yYXRpbmdEZWx0YSA9IHRoaXMucmF0aW5ncy51c2VyUmF0aW5nIC0gdGhpcy5yYXRpbmdzLmFpUmF0aW5nO1xuICAgIFxuICAgIC8vIFNpbXBsZSB0cmVuZCBjYWxjdWxhdGlvbiBiYXNlZCBvbiByZWNlbnQgZmVlZGJhY2tcbiAgICBjb25zdCByZWNlbnRGZWVkYmFjayA9IHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3Rvcnk/LnNsaWNlKC01KSB8fCBbXTtcbiAgICBjb25zdCByZWNlbnRTZW50aW1lbnRzID0gcmVjZW50RmVlZGJhY2subWFwKGYgPT4gZi5zZW50aW1lbnQpO1xuICAgIGNvbnN0IHBvc2l0aXZlQ291bnQgPSByZWNlbnRTZW50aW1lbnRzLmZpbHRlcihzID0+IHMgPT09ICdwb3NpdGl2ZScpLmxlbmd0aDtcbiAgICBjb25zdCBuZWdhdGl2ZUNvdW50ID0gcmVjZW50U2VudGltZW50cy5maWx0ZXIocyA9PiBzID09PSAnbmVnYXRpdmUnKS5sZW5ndGg7XG4gICAgXG4gICAgaWYgKHBvc2l0aXZlQ291bnQgPiBuZWdhdGl2ZUNvdW50ICsgMSkge1xuICAgICAgdGhpcy5yYXRpbmdzLnRyZW5kID0gJ2ltcHJvdmluZyc7XG4gICAgfSBlbHNlIGlmIChuZWdhdGl2ZUNvdW50ID4gcG9zaXRpdmVDb3VudCArIDEpIHtcbiAgICAgIHRoaXMucmF0aW5ncy50cmVuZCA9ICdkZWNsaW5pbmcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJhdGluZ3MudHJlbmQgPSAnc3RhYmxlJztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBlbGVtZW50IHN0YXR1cy5cbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0dXMoKTogRWxlbWVudFN0YXR1cyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcbiAgfVxuICBcbiAgLyoqXG4gICAqIERlZmF1bHQgbGlmZWN5Y2xlIG1ldGhvZHMgLSBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhcyBuZWVkZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYmVmb3JlQWN0aXZhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmRlYnVnKGBQcmVwYXJpbmcgdG8gYWN0aXZhdGUgJHt0aGlzLnR5cGV9IGVsZW1lbnQ6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfWApO1xuICAgIHRoaXMuX3N0YXR1cyA9IEVsZW1lbnRTdGF0dXMuQUNUSVZBVElORztcbiAgfVxuICBcbiAgcHVibGljIGFzeW5jIGFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKGBBY3RpdmF0aW5nICR7dGhpcy50eXBlfSBlbGVtZW50OiAke3RoaXMubWV0YWRhdGEubmFtZX1gKTtcbiAgICB0aGlzLl9zdGF0dXMgPSBFbGVtZW50U3RhdHVzLkFDVElWRTtcbiAgfVxuICBcbiAgcHVibGljIGFzeW5jIGFmdGVyQWN0aXZhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmRlYnVnKGBDb21wbGV0ZWQgYWN0aXZhdGlvbiBvZiAke3RoaXMudHlwZX0gZWxlbWVudDogJHt0aGlzLm1ldGFkYXRhLm5hbWV9YCk7XG4gIH1cbiAgXG4gIHB1YmxpYyBhc3luYyBkZWFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5pbmZvKGBEZWFjdGl2YXRpbmcgJHt0aGlzLnR5cGV9IGVsZW1lbnQ6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfWApO1xuICAgIHRoaXMuX3N0YXR1cyA9IEVsZW1lbnRTdGF0dXMuREVBQ1RJVkFUSU5HO1xuICAgIC8vIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCBjbGVhbnVwIGxvZ2ljXG4gICAgdGhpcy5fc3RhdHVzID0gRWxlbWVudFN0YXR1cy5JTkFDVElWRTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIE1hcmsgZWxlbWVudCBhcyBtb2RpZmllZC5cbiAgICovXG4gIHByb3RlY3RlZCBtYXJrRGlydHkoKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5tZXRhZGF0YS5tb2RpZmllZCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGlmIGVsZW1lbnQgaGFzIHVuc2F2ZWQgY2hhbmdlcy5cbiAgICovXG4gIHB1YmxpYyBpc0RpcnR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0RpcnR5O1xuICB9XG4gIFxuICAvKipcbiAgICogTWFyayBlbGVtZW50IGFzIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIG1hcmtDbGVhbigpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0RpcnR5ID0gZmFsc2U7XG4gIH1cbn0iXX0=
463
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZWxlbWVudHMvQmFzZUVsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUdMLGFBQWEsRUFRZCxNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFbkUsTUFBTSxPQUFnQixXQUFXO0lBQy9CLFdBQVc7SUFDSixFQUFFLENBQVM7SUFDWCxJQUFJLENBQWM7SUFDbEIsT0FBTyxDQUFTO0lBRXZCLFdBQVc7SUFDSixRQUFRLENBQW1CO0lBRWxDLFdBQVc7SUFDSixVQUFVLENBQWU7SUFDekIsVUFBVSxDQUF1QjtJQUNqQyxPQUFPLENBQWtCO0lBRWhDLGlCQUFpQjtJQUNQLE9BQU8sR0FBa0IsYUFBYSxDQUFDLFFBQVEsQ0FBQztJQUNoRCxRQUFRLEdBQVksS0FBSyxDQUFDO0lBRXBDLFlBQVk7SUFDSyxvQkFBb0IsR0FBRyxHQUFHLENBQUM7SUFFNUMsWUFBWSxJQUFpQixFQUFFLFdBQXNDLEVBQUU7UUFDckUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMs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QUM7SUFFTSxLQUFLLENBQUMsUUFBUTtRQUNuQixNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLElBQUksYUFBYSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO0lBQ3RDLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYTtRQUN4QixNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixJQUFJLENBQUMsSUFBSSxhQUFhLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLElBQUksYUFBYSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDO1FBQzFDLDRDQUE0QztRQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ08sU0FBUztRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksU0FBUztRQUNkLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBpbXBsZW1lbnRpbmcgSUVsZW1lbnQgaW50ZXJmYWNlLlxuICogUHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgdGhhdCBhbGwgZWxlbWVudCB0eXBlcyBjYW4gZXh0ZW5kLlxuICovXG5cbmltcG9ydCB7XG4gIElFbGVtZW50LFxuICBJRWxlbWVudE1ldGFkYXRhLFxuICBFbGVtZW50U3RhdHVzLFxuICBFbGVtZW50UmF0aW5ncyxcbiAgUmVmZXJlbmNlLFxuICBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBWYWxpZGF0aW9uV2FybmluZyxcbiAgRmVlZGJhY2tDb250ZXh0LFxuICBVc2VyRmVlZGJhY2tcbn0gZnJvbSAnLi4vdHlwZXMvZWxlbWVudHMvaW5kZXguanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFbGVtZW50IGltcGxlbWVudHMgSUVsZW1lbnQge1xuICAvLyBJZGVudGl0eVxuICBwdWJsaWMgaWQ6IHN0cmluZztcbiAgcHVibGljIHR5cGU6IEVsZW1lbnRUeXBlO1xuICBwdWJsaWMgdmVyc2lvbjogc3RyaW5nO1xuICBcbiAgLy8gTWV0YWRhdGFcbiAgcHVibGljIG1ldGFkYXRhOiBJRWxlbWVudE1ldGFkYXRhO1xuICBcbiAgLy8gRmVhdHVyZXNcbiAgcHVibGljIHJlZmVyZW5jZXM/OiBSZWZlcmVuY2VbXTtcbiAgcHVibGljIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwdWJsaWMgcmF0aW5ncz86IEVsZW1lbnRSYXRpbmdzO1xuICBcbiAgLy8gSW50ZXJuYWwgc3RhdGVcbiAgcHJvdGVjdGVkIF9zdGF0dXM6IEVsZW1lbnRTdGF0dXMgPSBFbGVtZW50U3RhdHVzLklOQUNUSVZFO1xuICBwcm90ZWN0ZWQgX2lzRGlydHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9GRUVEQkFDS19ISVNUT1JZID0gMTAwO1xuICBcbiAgY29uc3RydWN0b3IodHlwZTogRWxlbWVudFR5cGUsIG1ldGFkYXRhOiBQYXJ0aWFsPElFbGVtZW50TWV0YWRhdGE+ID0ge30pIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuaWQgPSBtZXRhZGF0YS5uYW1lID8gdGhpcy5nZW5lcmF0ZUlkKG1ldGFkYXRhLm5hbWUpIDogdXVpZHY0KCk7XG4gICAgdGhpcy52ZXJzaW9uID0gbWV0YWRhdGEudmVyc2lvbiB8fCAnMS4wLjAnO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgbWV0YWRhdGEgd2l0aCBkZWZhdWx0c1xuICAgIHRoaXMubWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lIHx8ICdVbm5hbWVkIEVsZW1lbnQnLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgYXV0aG9yOiBtZXRhZGF0YS5hdXRob3IsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICBjcmVhdGVkOiBtZXRhZGF0YS5jcmVhdGVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIG1vZGlmaWVkOiBtZXRhZGF0YS5tb2RpZmllZCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0YWdzOiBtZXRhZGF0YS50YWdzIHx8IFtdLFxuICAgICAgZGVwZW5kZW5jaWVzOiBtZXRhZGF0YS5kZXBlbmRlbmNpZXMgfHwgW10sXG4gICAgICBjdXN0b206IG1ldGFkYXRhLmN1c3RvbSB8fCB7fVxuICAgIH07XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBvcHRpb25hbCBmZWF0dXJlc1xuICAgIHRoaXMucmVmZXJlbmNlcyA9IFtdO1xuICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHt9O1xuICAgIHRoaXMucmF0aW5ncyA9IHtcbiAgICAgIGFpUmF0aW5nOiAwLFxuICAgICAgdXNlclJhdGluZzogdW5kZWZpbmVkLFxuICAgICAgcmF0aW5nQ291bnQ6IDAsXG4gICAgICBsYXN0RXZhbHVhdGVkOiBuZXcgRGF0ZSgpLFxuICAgICAgY29uZmlkZW5jZTogMCxcbiAgICAgIHRyZW5kOiAnc3RhYmxlJyxcbiAgICAgIGZlZWRiYWNrSGlzdG9yeTogW11cbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogR2VuZXJhdGUgYSB1bmlxdWUgSUQgZm9yIHRoZSBlbGVtZW50IGJhc2VkIG9uIGl0cyBuYW1lIGFuZCB0eXBlLlxuICAgKiBGb3JtYXQ6IHR5cGVfbmFtZS1zbHVnX3RpbWVzdGFtcFxuICAgKi9cbiAgcHJvdGVjdGVkIGdlbmVyYXRlSWQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0eXBlU2x1ZyA9IHRoaXMudHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG5hbWVTbHVnID0gbmFtZVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csICctJylcbiAgICAgIC5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICBcbiAgICByZXR1cm4gYCR7dHlwZVNsdWd9XyR7bmFtZVNsdWd9XyR7dGltZXN0YW1wfWA7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb3JlIHZhbGlkYXRpb24gdGhhdCBhbGwgZWxlbWVudHMgc2hhcmUuXG4gICAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFuZCBjYWxsIHN1cGVyLnZhbGlkYXRlKCkgZmlyc3QuXG4gICAqL1xuICBwdWJsaWMgdmFsaWRhdGUoKTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIC8vIExvZyBzZWN1cml0eS1yZWxldmFudCB2YWxpZGF0aW9uIGV2ZW50XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1lBTUxfUEFSU0VfU1VDQ0VTUycsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdCYXNlRWxlbWVudC52YWxpZGF0ZScsXG4gICAgICBkZXRhaWxzOiBgRWxlbWVudCB2YWxpZGF0aW9uIHBlcmZvcm1lZCBmb3IgJHt0aGlzLnR5cGV9OiR7dGhpcy5pZH1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHsgZWxlbWVudFR5cGU6IHRoaXMudHlwZSwgZWxlbWVudElkOiB0aGlzLmlkIH1cbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IFZhbGlkYXRpb25XYXJuaW5nW10gPSBbXTtcbiAgICBjb25zdCBzdWdnZXN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBmaWVsZHNcbiAgICBpZiAoIXRoaXMuaWQpIHtcbiAgICAgIGVycm9ycy5wdXNoKHsgZmllbGQ6ICdpZCcsIG1lc3NhZ2U6ICdFbGVtZW50IElEIGlzIHJlcXVpcmVkJyB9KTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLm1ldGFkYXRhLm5hbWUgfHwgdGhpcy5tZXRhZGF0YS5uYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIGVycm9ycy5wdXNoKHsgZmllbGQ6ICdtZXRhZGF0YS5uYW1lJywgbWVzc2FnZTogJ0VsZW1lbnQgbmFtZSBpcyByZXF1aXJlZCcgfSk7XG4gICAgfVxuICAgIFxuICAgIGlmICghdGhpcy5tZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCB0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goeyBcbiAgICAgICAgZmllbGQ6ICdtZXRhZGF0YS5kZXNjcmlwdGlvbicsIFxuICAgICAgICBtZXNzYWdlOiAnRWxlbWVudCBkZXNjcmlwdGlvbiBpcyByZWNvbW1lbmRlZCcsXG4gICAgICAgIHNldmVyaXR5OiAnbWVkaXVtJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFZhbGlkYXRlIHZlcnNpb24gZm9ybWF0IChzZW12ZXIpXG4gICAgY29uc3Qgc2VtdmVyUmVnZXggPSAvXlxcZCtcXC5cXGQrXFwuXFxkKygtW2EtekEtWjAtOS4tXSspPyhcXCtbYS16QS1aMC05Li1dKyk/JC87XG4gICAgaWYgKCFzZW12ZXJSZWdleC50ZXN0KHRoaXMudmVyc2lvbikpIHtcbiAgICAgIGVycm9ycy5wdXNoKHsgXG4gICAgICAgIGZpZWxkOiAndmVyc2lvbicsIFxuICAgICAgICBtZXNzYWdlOiAnVmVyc2lvbiBtdXN0IGZvbGxvdyBzZW1hbnRpYyB2ZXJzaW9uaW5nIChlLmcuLCAxLjAuMCknLFxuICAgICAgICBjb2RlOiAnSU5WQUxJRF9WRVJTSU9OX0ZPUk1BVCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSByZWZlcmVuY2VzXG4gICAgaWYgKHRoaXMucmVmZXJlbmNlcykge1xuICAgICAgdGhpcy5yZWZlcmVuY2VzLmZvckVhY2goKHJlZiwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKCFyZWYudXJpIHx8IHJlZi51cmkudHJpbSgpID09PSAnJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKHsgXG4gICAgICAgICAgICBmaWVsZDogYHJlZmVyZW5jZXNbJHtpbmRleH1dLnVyaWAsIFxuICAgICAgICAgICAgbWVzc2FnZTogJ1JlZmVyZW5jZSBVUkkgaXMgcmVxdWlyZWQnIFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVmLnRpdGxlIHx8IHJlZi50aXRsZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaCh7IFxuICAgICAgICAgICAgZmllbGQ6IGByZWZlcmVuY2VzWyR7aW5kZXh9XS50aXRsZWAsIFxuICAgICAgICAgICAgbWVzc2FnZTogJ1JlZmVyZW5jZSB0aXRsZSBpcyByZWNvbW1lbmRlZCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ2xvdydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFZhbGlkYXRlIHJhdGluZ3MgaWYgcHJlc2VudFxuICAgIGlmICh0aGlzLnJhdGluZ3MpIHtcbiAgICAgIGlmICh0aGlzLnJhdGluZ3MuYWlSYXRpbmcgPCAwIHx8IHRoaXMucmF0aW5ncy5haVJhdGluZyA+IDUpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBcbiAgICAgICAgICBmaWVsZDogJ3JhdGluZ3MuYWlSYXRpbmcnLCBcbiAgICAgICAgICBtZXNzYWdlOiAnQUkgcmF0aW5nIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA1JyBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcgIT09IHVuZGVmaW5lZCAmJiBcbiAgICAgICAgICAodGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcgPCAwIHx8IHRoaXMucmF0aW5ncy51c2VyUmF0aW5nID4gNSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBcbiAgICAgICAgICBmaWVsZDogJ3JhdGluZ3MudXNlclJhdGluZycsIFxuICAgICAgICAgIG1lc3NhZ2U6ICdVc2VyIHJhdGluZyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNScgXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgc3VnZ2VzdGlvbnNcbiAgICBpZiAoIXRoaXMubWV0YWRhdGEudGFncyB8fCB0aGlzLm1ldGFkYXRhLnRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKCdDb25zaWRlciBhZGRpbmcgdGFncyB0byBpbXByb3ZlIGRpc2NvdmVyYWJpbGl0eScpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIXRoaXMubWV0YWRhdGEuYXV0aG9yKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKCdDb25zaWRlciBhZGRpbmcgYXV0aG9yIGluZm9ybWF0aW9uJyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogZXJyb3JzLmxlbmd0aCA9PT0gMCxcbiAgICAgIGVycm9yczogZXJyb3JzLmxlbmd0aCA+IDAgPyBlcnJvcnMgOiB1bmRlZmluZWQsXG4gICAgICB3YXJuaW5nczogd2FybmluZ3MubGVuZ3RoID4gMCA/IHdhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgICAgc3VnZ2VzdGlvbnM6IHN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyBzdWdnZXN0aW9ucyA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdG8gSlNPTiBmb3JtYXQgZm9yIGludGVybmFsIHVzZSBhbmQgdGVzdGluZy5cbiAgICogTWFpbnRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyB0ZXN0cy5cbiAgICovXG4gIHB1YmxpYyBzZXJpYWxpemVUb0pTT04oKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgIHJlZmVyZW5jZXM6IHRoaXMucmVmZXJlbmNlcyxcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMuZXh0ZW5zaW9ucyxcbiAgICAgIHJhdGluZ3M6IHRoaXMucmF0aW5nc1xuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgc2VyaWFsaXphdGlvbiB0byBtYXJrZG93biB3aXRoIFlBTUwgZnJvbnRtYXR0ZXIuXG4gICAqIFVzZXMganMteWFtbCBmb3Igc2VjdXJlIFlBTUwgZ2VuZXJhdGlvbiB0byBwcmV2ZW50IGluamVjdGlvbiBhdHRhY2tzLlxuICAgKiBGSVg6IENoYW5nZWQgZnJvbSBKU09OIHRvIHByb3BlciBtYXJrZG93biBmb3JtYXQgZm9yIEdpdEh1YiBwb3J0Zm9saW8gc3RvcmFnZS5cbiAgICogVGhpcyBlbnN1cmVzIGVsZW1lbnRzIGFyZSByZWFkYWJsZSBvbiBHaXRIdWIgYW5kIGNvbXBhdGlibGUgd2l0aCBjb2xsZWN0aW9uIHdvcmtmbG93LlxuICAgKi9cbiAgcHVibGljIHNlcmlhbGl6ZSgpOiBzdHJpbmcge1xuICAgIC8vIEJ1aWxkIFlBTUwgZnJvbnRtYXR0ZXIgc3RhcnRpbmcgd2l0aCBhbGwgbWV0YWRhdGEgZmllbGRzXG4gICAgLy8gVGhpcyBlbnN1cmVzIHN1YmNsYXNzZXMgY2FuIGFkZCB0aGVpciBvd24gZmllbGRzXG4gICAgY29uc3QgZnJvbnRtYXR0ZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAuLi50aGlzLm1ldGFkYXRhLCAgLy8gSW5jbHVkZSBhbGwgbWV0YWRhdGEgZmllbGRzXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb25cbiAgICB9O1xuICAgIFxuICAgIC8vIE5vdGU6IG1ldGFkYXRhIGFscmVhZHkgaW5jbHVkZXMgbmFtZSwgZGVzY3JpcHRpb24sIGF1dGhvciwgY3JlYXRlZCwgbW9kaWZpZWRcbiAgICAvLyBhbmQgYW55IGFkZGl0aW9uYWwgZmllbGRzIGFkZGVkIGJ5IHN1YmNsYXNzZXNcbiAgICBpZiAodGhpcy5yZWZlcmVuY2VzICYmIHRoaXMucmVmZXJlbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcm9udG1hdHRlci5yZWZlcmVuY2VzID0gdGhpcy5yZWZlcmVuY2VzLm1hcChyZWYgPT4gKHtcbiAgICAgICAgdHlwZTogcmVmLnR5cGUsXG4gICAgICAgIHVyaTogcmVmLnVyaSxcbiAgICAgICAgdGl0bGU6IHJlZi50aXRsZVxuICAgICAgfSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yYXRpbmdzICYmIHRoaXMucmF0aW5ncy5haVJhdGluZyA+IDApIHtcbiAgICAgIGZyb250bWF0dGVyLnJhdGluZ3MgPSB7XG4gICAgICAgIGFpUmF0aW5nOiB0aGlzLnJhdGluZ3MuYWlSYXRpbmcsXG4gICAgICAgIHVzZXJSYXRpbmc6IHRoaXMucmF0aW5ncy51c2VyUmF0aW5nLFxuICAgICAgICByYXRpbmdDb3VudDogdGhpcy5yYXRpbmdzLnJhdGluZ0NvdW50XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBSZW1vdmUgdW5kZWZpbmVkL251bGwgdmFsdWVzXG4gICAgY29uc3QgY2xlYW5Gcm9udG1hdHRlciA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGZyb250bWF0dGVyKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpXG4gICAgKTtcbiAgICBcbiAgICAvLyBVc2UganMteWFtbCBmb3Igc2VjdXJlIFlBTUwgZ2VuZXJhdGlvblxuICAgIC8vIFRoaXMgcHJldmVudHMgWUFNTCBpbmplY3Rpb24gYXR0YWNrcyBhbmQgaGFuZGxlcyBzcGVjaWFsIGNoYXJhY3RlcnMgcHJvcGVybHlcbiAgICBsZXQgeWFtbEZyb250bWF0dGVyOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHlhbWxGcm9udG1hdHRlciA9IHlhbWwuZHVtcChjbGVhbkZyb250bWF0dGVyLCB7XG4gICAgICAgIG5vUmVmczogdHJ1ZSwgICAgICAgICAgLy8gRG9uJ3QgdXNlIFlBTUwgcmVmZXJlbmNlc1xuICAgICAgICBzb3J0S2V5czogZmFsc2UsICAgICAgIC8vIEtlZXAgb3VyIG9yZGVyXG4gICAgICAgIGxpbmVXaWR0aDogLTEsICAgICAgICAgLy8gRG9uJ3Qgd3JhcCBsaW5lc1xuICAgICAgICBxdW90aW5nVHlwZTogJ1wiJywgICAgICAvLyBVc2UgZG91YmxlIHF1b3RlcyB3aGVuIG5lZWRlZFxuICAgICAgICBmb3JjZVF1b3RlczogZmFsc2UsICAgIC8vIE9ubHkgcXVvdGUgd2hlbiBuZWNlc3NhcnlcbiAgICAgICAgc2tpcEludmFsaWQ6IGZhbHNlICAgICAvLyBEb24ndCBza2lwIGludmFsaWQgdmFsdWVzXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgWUFNTCBnZW5lcmF0aW9uIGZhaWxzLCBsb2cgYW5kIHRocm93IGEgbW9yZSBpbmZvcm1hdGl2ZSBlcnJvclxuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgWUFNTCBmcm9udG1hdHRlcicsIHsgZXJyb3IsIGZyb250bWF0dGVyOiBjbGVhbkZyb250bWF0dGVyIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2VyaWFsaXplIGVsZW1lbnQgbWV0YWRhdGEgdG8gWUFNTDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgdGhlIGdlbmVyYXRlZCBZQU1MIGNhbiBiZSBwYXJzZWQgYmFjayB1c2luZyBTZWN1cmVZYW1sUGFyc2VyXG4gICAgLy8gSElHSCBTRVZFUklUWSBGSVg6IFVzZSBTZWN1cmVZYW1sUGFyc2VyIGluc3RlYWQgb2YgeWFtbC5sb2FkIHRvIHByZXZlbnQgY29kZSBleGVjdXRpb25cbiAgICB0cnkge1xuICAgICAgU2VjdXJlWWFtbFBhcnNlci5wYXJzZSh5YW1sRnJvbnRtYXR0ZXIsIHtcbiAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCwgLy8gNjRLQiBsaW1pdCBmb3IgZnJvbnRtYXR0ZXJcbiAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdHZW5lcmF0ZWQgaW52YWxpZCBZQU1MJywgeyBlcnJvciwgeWFtbDogeWFtbEZyb250bWF0dGVyIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBHZW5lcmF0ZWQgWUFNTCBpcyBpbnZhbGlkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgICBcbiAgICAvLyBHZXQgY29udGVudCAtIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdG8gcHJvdmlkZSBhY3R1YWwgY29udGVudFxuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmdldENvbnRlbnQgPyB0aGlzLmdldENvbnRlbnQoKSA6IGAjICR7dGhpcy5tZXRhZGF0YS5uYW1lfVxcblxcbiR7dGhpcy5tZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCAnJ31gO1xuICAgIFxuICAgIC8vIFRyaW0gdGhlIFlBTUwgdG8gcmVtb3ZlIHRyYWlsaW5nIG5ld2xpbmUgdGhhdCB5YW1sLmR1bXAgYWRkc1xuICAgIHJldHVybiBgLS0tXFxuJHt5YW1sRnJvbnRtYXR0ZXIudHJpbSgpfVxcbi0tLVxcblxcbiR7Y29udGVudH1gO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGVsZW1lbnQgY29udGVudCBmb3Igc2VyaWFsaXphdGlvbi5cbiAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyB0byBwcm92aWRlIHRoZWlyIHNwZWNpZmljIGNvbnRlbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q29udGVudD8oKTogc3RyaW5nO1xuICBcbiAgLyoqXG4gICAqIERlZmF1bHQgZGVzZXJpYWxpemF0aW9uIGZyb20gSlNPTi5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgZm9yIGN1c3RvbSBmb3JtYXRzLlxuICAgKi9cbiAgcHVibGljIGRlc2VyaWFsaXplKGRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3JtYWxpemUgVW5pY29kZSBpbnB1dCBiZWZvcmUgcGFyc2luZ1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRhdGEpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh2YWxpZGF0aW9uUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gICAgICBpZiAoIXBhcnNlZC5pZCB8fCAhcGFyc2VkLnR5cGUgfHwgIXBhcnNlZC5tZXRhZGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZWxlbWVudCBkYXRhOiBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcycpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgcHJvcGVydGllc1xuICAgICAgdGhpcy5pZCA9IHBhcnNlZC5pZDtcbiAgICAgIHRoaXMudHlwZSA9IHBhcnNlZC50eXBlO1xuICAgICAgdGhpcy52ZXJzaW9uID0gcGFyc2VkLnZlcnNpb24gfHwgJzEuMC4wJztcbiAgICAgIHRoaXMubWV0YWRhdGEgPSBwYXJzZWQubWV0YWRhdGE7XG4gICAgICB0aGlzLnJlZmVyZW5jZXMgPSBwYXJzZWQucmVmZXJlbmNlcyB8fCBbXTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHBhcnNlZC5leHRlbnNpb25zIHx8IHt9O1xuICAgICAgdGhpcy5yYXRpbmdzID0gcGFyc2VkLnJhdGluZ3M7XG4gICAgICBcbiAgICAgIHRoaXMuX2lzRGlydHkgPSBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRW5oYW5jZWQgZXJyb3IgY29udGV4dCBwcmVzZXJ2YXRpb25cbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnN0IGVycm9yU3RhY2sgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGRlc2VyaWFsaXplIGVsZW1lbnQnLCB7IFxuICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlLFxuICAgICAgICBzdGFjazogZXJyb3JTdGFjayxcbiAgICAgICAgZGF0YVByZXZpZXc6IGRhdGEuc3Vic3RyaW5nKDAsIDIwMCksIC8vIEZpcnN0IDIwMCBjaGFycyBmb3IgY29udGV4dFxuICAgICAgICBlbGVtZW50VHlwZTogdGhpcy50eXBlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIG5ldyBlcnJvciB3aXRoIG9yaWdpbmFsIGFzIGNhdXNlXG4gICAgICBjb25zdCBkZXNlcmlhbGl6ZUVycm9yID0gbmV3IEVycm9yKGBCYXNlRWxlbWVudCBkZXNlcmlhbGl6YXRpb24gZmFpbGVkOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGRlc2VyaWFsaXplRXJyb3IuY2F1c2UgPSBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHRocm93IGRlc2VyaWFsaXplRXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogUHJvY2VzcyB1c2VyIGZlZWRiYWNrIGFuZCB1cGRhdGUgcmF0aW5ncy5cbiAgICovXG4gIHB1YmxpYyByZWNlaXZlRmVlZGJhY2soZmVlZGJhY2s6IHN0cmluZywgY29udGV4dD86IEZlZWRiYWNrQ29udGV4dCk6IHZvaWQge1xuICAgIC8vIE5vcm1hbGl6ZSBVbmljb2RlIGlucHV0IHRvIHByZXZlbnQgc2VjdXJpdHkgaXNzdWVzXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGZlZWRiYWNrKTtcbiAgICBjb25zdCBub3JtYWxpemVkRmVlZGJhY2sgPSB2YWxpZGF0aW9uUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgZmVlZGJhY2sgcHJvY2Vzc2luZ1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Jhc2VFbGVtZW50LnJlY2VpdmVGZWVkYmFjaycsXG4gICAgICBkZXRhaWxzOiBgRmVlZGJhY2sgcHJvY2Vzc2VkIGZvciBlbGVtZW50ICR7dGhpcy50eXBlfToke3RoaXMuaWR9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IFxuICAgICAgICBlbGVtZW50VHlwZTogdGhpcy50eXBlLCBcbiAgICAgICAgZWxlbWVudElkOiB0aGlzLmlkLFxuICAgICAgICBmZWVkYmFja0xlbmd0aDogZmVlZGJhY2subGVuZ3RoLFxuICAgICAgICBoYXNVbmljb2RlSXNzdWVzOiAhdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkXG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCF0aGlzLnJhdGluZ3MpIHtcbiAgICAgIHRoaXMucmF0aW5ncyA9IHtcbiAgICAgICAgYWlSYXRpbmc6IDAsXG4gICAgICAgIHVzZXJSYXRpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgcmF0aW5nQ291bnQ6IDAsXG4gICAgICAgIGxhc3RFdmFsdWF0ZWQ6IG5ldyBEYXRlKCksXG4gICAgICAgIGNvbmZpZGVuY2U6IDAsXG4gICAgICAgIHRyZW5kOiAnc3RhYmxlJyxcbiAgICAgICAgZmVlZGJhY2tIaXN0b3J5OiBbXVxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIGZlZWRiYWNrIGVudHJ5IHdpdGggbm9ybWFsaXplZCBjb250ZW50XG4gICAgY29uc3QgdXNlckZlZWRiYWNrOiBVc2VyRmVlZGJhY2sgPSB7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBmZWVkYmFjazogbm9ybWFsaXplZEZlZWRiYWNrLFxuICAgICAgc2VudGltZW50OiB0aGlzLmFuYWx5emVTZW50aW1lbnQobm9ybWFsaXplZEZlZWRiYWNrKSxcbiAgICAgIGluZmVycmVkUmF0aW5nOiB0aGlzLmluZmVyUmF0aW5nKG5vcm1hbGl6ZWRGZWVkYmFjayksXG4gICAgICBjb250ZXh0LFxuICAgICAgZWxlbWVudFZlcnNpb246IHRoaXMudmVyc2lvblxuICAgIH07XG4gICAgXG4gICAgLy8gQWRkIHRvIGhpc3Rvcnkgd2l0aCBib3VuZHMgY2hlY2tpbmdcbiAgICBpZiAoIXRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3RvcnkpIHtcbiAgICAgIHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3RvcnkgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5yYXRpbmdzLmZlZWRiYWNrSGlzdG9yeS5wdXNoKHVzZXJGZWVkYmFjayk7XG4gICAgXG4gICAgLy8gUHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoXG4gICAgaWYgKHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3RvcnkubGVuZ3RoID4gdGhpcy5NQVhfRkVFREJBQ0tfSElTVE9SWSkge1xuICAgICAgdGhpcy5yYXRpbmdzLmZlZWRiYWNrSGlzdG9yeSA9IHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3Rvcnkuc2xpY2UoLXRoaXMuTUFYX0ZFRURCQUNLX0hJU1RPUlkpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBGZWVkYmFjayBoaXN0b3J5IHRyaW1tZWQgdG8gJHt0aGlzLk1BWF9GRUVEQkFDS19ISVNUT1JZfSBlbnRyaWVzIGZvciBlbGVtZW50ICR7dGhpcy5pZH1gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIHVzZXIgcmF0aW5nIGlmIHdlIGluZmVycmVkIG9uZVxuICAgIGlmICh1c2VyRmVlZGJhY2suaW5mZXJyZWRSYXRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyUmF0aW5nKHVzZXJGZWVkYmFjay5pbmZlcnJlZFJhdGluZyk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogU2ltcGxlIHNlbnRpbWVudCBhbmFseXNpcy5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgZm9yIG1vcmUgc29waGlzdGljYXRlZCBhbmFseXNpcy5cbiAgICovXG4gIHByb3RlY3RlZCBhbmFseXplU2VudGltZW50KGZlZWRiYWNrOiBzdHJpbmcpOiAncG9zaXRpdmUnIHwgJ25lZ2F0aXZlJyB8ICduZXV0cmFsJyB7XG4gICAgY29uc3QgbG93ZXIgPSBmZWVkYmFjay50b0xvd2VyQ2FzZSgpO1xuICAgIFxuICAgIGNvbnN0IHBvc2l0aXZlV29yZHMgPSBbJ2V4Y2VsbGVudCcsICdncmVhdCcsICdnb29kJywgJ2hlbHBmdWwnLCAndXNlZnVsJywgJ3BlcmZlY3QnLCAnYW1hemluZycsICdsb3ZlJ107XG4gICAgY29uc3QgbmVnYXRpdmVXb3JkcyA9IFsnYmFkJywgJ3Bvb3InLCAndGVycmlibGUnLCAndXNlbGVzcycsICdicm9rZW4nLCAnaGF0ZScsICdhd2Z1bCcsICdkaXNhcHBvaW50aW5nJ107XG4gICAgXG4gICAgY29uc3QgcG9zaXRpdmVDb3VudCA9IHBvc2l0aXZlV29yZHMuZmlsdGVyKHdvcmQgPT4gbG93ZXIuaW5jbHVkZXMod29yZCkpLmxlbmd0aDtcbiAgICBjb25zdCBuZWdhdGl2ZUNvdW50ID0gbmVnYXRpdmVXb3Jkcy5maWx0ZXIod29yZCA9PiBsb3dlci5pbmNsdWRlcyh3b3JkKSkubGVuZ3RoO1xuICAgIFxuICAgIGlmIChwb3NpdGl2ZUNvdW50ID4gbmVnYXRpdmVDb3VudCkgcmV0dXJuICdwb3NpdGl2ZSc7XG4gICAgaWYgKG5lZ2F0aXZlQ291bnQgPiBwb3NpdGl2ZUNvdW50KSByZXR1cm4gJ25lZ2F0aXZlJztcbiAgICByZXR1cm4gJ25ldXRyYWwnO1xuICB9XG4gIFxuICAvKipcbiAgICogU2ltcGxlIHJhdGluZyBpbmZlcmVuY2UgZnJvbSBmZWVkYmFjay5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgZm9yIG1vcmUgc29waGlzdGljYXRlZCBpbmZlcmVuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5mZXJSYXRpbmcoZmVlZGJhY2s6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2VudGltZW50ID0gdGhpcy5hbmFseXplU2VudGltZW50KGZlZWRiYWNrKTtcbiAgICBjb25zdCBsb3dlciA9IGZlZWRiYWNrLnRvTG93ZXJDYXNlKCk7XG4gICAgXG4gICAgLy8gTG9vayBmb3IgZXhwbGljaXQgcmF0aW5nc1xuICAgIGNvbnN0IHJhdGluZ01hdGNoID0gbG93ZXIubWF0Y2goLyhcXGQrKVxccyooc3RhcnM/fFxcLzV8b3V0IG9mIDUpLyk7XG4gICAgaWYgKHJhdGluZ01hdGNoKSB7XG4gICAgICBjb25zdCByYXRpbmcgPSBwYXJzZUludChyYXRpbmdNYXRjaFsxXSk7XG4gICAgICBpZiAocmF0aW5nID49IDEgJiYgcmF0aW5nIDw9IDUpIHJldHVybiByYXRpbmc7XG4gICAgfVxuICAgIFxuICAgIC8vIEluZmVyIGZyb20gc2VudGltZW50XG4gICAgaWYgKHNlbnRpbWVudCA9PT0gJ3Bvc2l0aXZlJykge1xuICAgICAgaWYgKGxvd2VyLmluY2x1ZGVzKCdwZXJmZWN0JykgfHwgbG93ZXIuaW5jbHVkZXMoJ2V4Y2VsbGVudCcpKSByZXR1cm4gNTtcbiAgICAgIGlmIChsb3dlci5pbmNsdWRlcygnZ3JlYXQnKSB8fCBsb3dlci5pbmNsdWRlcygndmVyeSBnb29kJykpIHJldHVybiA0O1xuICAgICAgcmV0dXJuIDQ7XG4gICAgfSBlbHNlIGlmIChzZW50aW1lbnQgPT09ICduZWdhdGl2ZScpIHtcbiAgICAgIGlmIChsb3dlci5pbmNsdWRlcygndGVycmlibGUnKSB8fCBsb3dlci5pbmNsdWRlcygnYXdmdWwnKSkgcmV0dXJuIDE7XG4gICAgICBpZiAobG93ZXIuaW5jbHVkZXMoJ3Bvb3InKSB8fCBsb3dlci5pbmNsdWRlcygnYmFkJykpIHJldHVybiAyO1xuICAgICAgcmV0dXJuIDI7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiAzOyAvLyBOZXV0cmFsXG4gIH1cbiAgXG4gIC8qKlxuICAgKiBVcGRhdGUgdXNlciByYXRpbmcgd2l0aCBhIG5ldyB2YWx1ZS5cbiAgICovXG4gIHByb3RlY3RlZCB1cGRhdGVVc2VyUmF0aW5nKG5ld1JhdGluZzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJhdGluZ3MpIHJldHVybjtcbiAgICBcbiAgICBpZiAodGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcgPSBuZXdSYXRpbmc7XG4gICAgICB0aGlzLnJhdGluZ3MucmF0aW5nQ291bnQgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDYWxjdWxhdGUgcnVubmluZyBhdmVyYWdlXG4gICAgICBjb25zdCB0b3RhbFJhdGluZyA9IHRoaXMucmF0aW5ncy51c2VyUmF0aW5nICogdGhpcy5yYXRpbmdzLnJhdGluZ0NvdW50ICsgbmV3UmF0aW5nO1xuICAgICAgdGhpcy5yYXRpbmdzLnJhdGluZ0NvdW50Kys7XG4gICAgICB0aGlzLnJhdGluZ3MudXNlclJhdGluZyA9IHRvdGFsUmF0aW5nIC8gdGhpcy5yYXRpbmdzLnJhdGluZ0NvdW50O1xuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgZGVsdGEgYW5kIHRyZW5kXG4gICAgdGhpcy5yYXRpbmdzLnJhdGluZ0RlbHRhID0gdGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcgLSB0aGlzLnJhdGluZ3MuYWlSYXRpbmc7XG4gICAgXG4gICAgLy8gU2ltcGxlIHRyZW5kIGNhbGN1bGF0aW9uIGJhc2VkIG9uIHJlY2VudCBmZWVkYmFja1xuICAgIGNvbnN0IHJlY2VudEZlZWRiYWNrID0gdGhpcy5yYXRpbmdzLmZlZWRiYWNrSGlzdG9yeT8uc2xpY2UoLTUpIHx8IFtdO1xuICAgIGNvbnN0IHJlY2VudFNlbnRpbWVudHMgPSByZWNlbnRGZWVkYmFjay5tYXAoZiA9PiBmLnNlbnRpbWVudCk7XG4gICAgY29uc3QgcG9zaXRpdmVDb3VudCA9IHJlY2VudFNlbnRpbWVudHMuZmlsdGVyKHMgPT4gcyA9PT0gJ3Bvc2l0aXZlJykubGVuZ3RoO1xuICAgIGNvbnN0IG5lZ2F0aXZlQ291bnQgPSByZWNlbnRTZW50aW1lbnRzLmZpbHRlcihzID0+IHMgPT09ICduZWdhdGl2ZScpLmxlbmd0aDtcbiAgICBcbiAgICBpZiAocG9zaXRpdmVDb3VudCA+IG5lZ2F0aXZlQ291bnQgKyAxKSB7XG4gICAgICB0aGlzLnJhdGluZ3MudHJlbmQgPSAnaW1wcm92aW5nJztcbiAgICB9IGVsc2UgaWYgKG5lZ2F0aXZlQ291bnQgPiBwb3NpdGl2ZUNvdW50ICsgMSkge1xuICAgICAgdGhpcy5yYXRpbmdzLnRyZW5kID0gJ2RlY2xpbmluZyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmF0aW5ncy50cmVuZCA9ICdzdGFibGUnO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGVsZW1lbnQgc3RhdHVzLlxuICAgKi9cbiAgcHVibGljIGdldFN0YXR1cygpOiBFbGVtZW50U3RhdHVzIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xuICB9XG4gIFxuICAvKipcbiAgICogRGVmYXVsdCBsaWZlY3ljbGUgbWV0aG9kcyAtIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lZWRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBiZWZvcmVBY3RpdmF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoYFByZXBhcmluZyB0byBhY3RpdmF0ZSAke3RoaXMudHlwZX0gZWxlbWVudDogJHt0aGlzLm1ldGFkYXRhLm5hbWV9YCk7XG4gICAgdGhpcy5fc3RhdHVzID0gRWxlbWVudFN0YXR1cy5BQ1RJVkFUSU5HO1xuICB9XG4gIFxuICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oYEFjdGl2YXRpbmcgJHt0aGlzLnR5cGV9IGVsZW1lbnQ6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfWApO1xuICAgIHRoaXMuX3N0YXR1cyA9IEVsZW1lbnRTdGF0dXMuQUNUSVZFO1xuICB9XG4gIFxuICBwdWJsaWMgYXN5bmMgYWZ0ZXJBY3RpdmF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoYENvbXBsZXRlZCBhY3RpdmF0aW9uIG9mICR7dGhpcy50eXBlfSBlbGVtZW50OiAke3RoaXMubWV0YWRhdGEubmFtZX1gKTtcbiAgfVxuICBcbiAgcHVibGljIGFzeW5jIGRlYWN0aXZhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oYERlYWN0aXZhdGluZyAke3RoaXMudHlwZX0gZWxlbWVudDogJHt0aGlzLm1ldGFkYXRhLm5hbWV9YCk7XG4gICAgdGhpcy5fc3RhdHVzID0gRWxlbWVudFN0YXR1cy5ERUFDVElWQVRJTkc7XG4gICAgLy8gU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IGNsZWFudXAgbG9naWNcbiAgICB0aGlzLl9zdGF0dXMgPSBFbGVtZW50U3RhdHVzLklOQUNUSVZFO1xuICB9XG4gIFxuICAvKipcbiAgICogTWFyayBlbGVtZW50IGFzIG1vZGlmaWVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIG1hcmtEaXJ0eSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLm1ldGFkYXRhLm1vZGlmaWVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgZWxlbWVudCBoYXMgdW5zYXZlZCBjaGFuZ2VzLlxuICAgKi9cbiAgcHVibGljIGlzRGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGlydHk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBNYXJrIGVsZW1lbnQgYXMgc2F2ZWQuXG4gICAqL1xuICBwdWJsaWMgbWFya0NsZWFuKCk6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlydHkgPSBmYWxzZTtcbiAgfVxufSJdfQ==
@@ -94,7 +94,16 @@ export declare class Agent extends BaseElement implements IElement {
94
94
  */
95
95
  validate(): ElementValidationResult;
96
96
  /**
97
- * Serialize agent including state
97
+ * Serialize to JSON format for internal use and testing
98
+ */
99
+ serializeToJSON(): string;
100
+ /**
101
+ * Get content for serialization
102
+ */
103
+ protected getContent(): string;
104
+ /**
105
+ * Serialize agent to markdown format with YAML frontmatter
106
+ * FIX: Changed from JSON to markdown for GitHub portfolio compatibility
98
107
  */
99
108
  serialize(): string;
100
109
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../../../src/elements/agents/Agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../../../src/elements/agents/Agent.ts"],"names":[],"mappings":"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"}