@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
@@ -5,6 +5,8 @@ import * as path from 'path';
5
5
  import { SECURITY_LIMITS, VALIDATION_PATTERNS } from './constants.js';
6
6
  import { VALID_CATEGORIES } from '../config/constants.js';
7
7
  import { RegexValidator } from './regexValidator.js';
8
+ import { ErrorHandler, ErrorCategory } from '../utils/ErrorHandler.js';
9
+ import { ValidationErrorCodes } from '../utils/errorCodes.js';
8
10
  // Pre-compiled regex patterns for better performance
9
11
  // These patterns are used repeatedly and benefit from pre-compilation
10
12
  const CONTROL_CHARS_REGEX = /[\x00-\x1F\x7F]/g;
@@ -31,15 +33,15 @@ export class MCPInputValidator {
31
33
  */
32
34
  static validatePersonaIdentifier(identifier) {
33
35
  if (!identifier || typeof identifier !== 'string') {
34
- throw new Error('Persona identifier must be a non-empty string');
36
+ throw ErrorHandler.createError('Persona identifier must be a non-empty string', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_PERSONA_ID);
35
37
  }
36
38
  if (identifier.length > 100) {
37
- throw new Error('Persona identifier too long (max 100 characters)');
39
+ throw ErrorHandler.createError('Persona identifier too long (max 100 characters)', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_LENGTH);
38
40
  }
39
41
  // Allow persona names and filenames
40
42
  const sanitized = sanitizeInput(identifier, 100);
41
43
  if (!sanitized) {
42
- throw new Error('Persona identifier contains only invalid characters');
44
+ throw ErrorHandler.createError('Persona identifier contains only invalid characters', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_PERSONA_ID);
43
45
  }
44
46
  return sanitized;
45
47
  }
@@ -48,13 +50,13 @@ export class MCPInputValidator {
48
50
  */
49
51
  static validateSearchQuery(query) {
50
52
  if (!query || typeof query !== 'string') {
51
- throw new Error('Search query must be a non-empty string');
53
+ throw ErrorHandler.createError('Search query must be a non-empty string', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_SEARCH_QUERY);
52
54
  }
53
55
  if (query.length < 2) {
54
- throw new Error('Search query too short (minimum 2 characters)');
56
+ throw ErrorHandler.createError('Search query too short (minimum 2 characters)', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_LENGTH);
55
57
  }
56
58
  if (query.length > 200) {
57
- throw new Error('Search query too long (max 200 characters)');
59
+ throw ErrorHandler.createError('Search query too long (max 200 characters)', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_LENGTH);
58
60
  }
59
61
  // Sanitize but preserve spaces for search
60
62
  const sanitized = query
@@ -64,7 +66,7 @@ export class MCPInputValidator {
64
66
  .replace(RTL_ZEROWIDTH_REGEX, '') // Remove RTL override and zero-width chars
65
67
  .trim();
66
68
  if (!sanitized) {
67
- throw new Error('Search query contains only invalid characters');
69
+ throw ErrorHandler.createError('Search query contains only invalid characters', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_SEARCH_QUERY);
68
70
  }
69
71
  return sanitized;
70
72
  }
@@ -73,10 +75,10 @@ export class MCPInputValidator {
73
75
  */
74
76
  static validateCollectionPath(path) {
75
77
  if (!path || typeof path !== 'string') {
76
- throw new Error('Collection path must be a non-empty string');
78
+ throw ErrorHandler.createError('Collection path must be a non-empty string', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_COLLECTION_PATH);
77
79
  }
78
80
  if (path.length > 500) {
79
- throw new Error('Collection path too long (max 500 characters)');
81
+ throw ErrorHandler.createError('Collection path too long (max 500 characters)', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_LENGTH);
80
82
  }
81
83
  // GitHub API paths should be safe filename patterns
82
84
  // Use single regex test for better performance (avoids O(n) character-by-character check)
@@ -85,11 +87,11 @@ export class MCPInputValidator {
85
87
  for (let i = 0; i < path.length; i++) {
86
88
  const char = path[i];
87
89
  if (!COLLECTION_PATH_CHAR_REGEX.test(char)) {
88
- throw new Error(`Invalid character '${char}' in collection path at position ${i + 1}`);
90
+ throw ErrorHandler.createError(`Invalid character '${char}' in collection path at position ${i + 1}`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_CHARACTER);
89
91
  }
90
92
  }
91
93
  // Fallback error if we somehow don't find the invalid character
92
- throw new Error('Invalid characters in collection path');
94
+ throw ErrorHandler.createError('Invalid characters in collection path', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_COLLECTION_PATH);
93
95
  }
94
96
  // Prevent path traversal in GitHub paths (comprehensive check)
95
97
  const pathLower = path.toLowerCase();
@@ -111,7 +113,7 @@ export class MCPInputValidator {
111
113
  ];
112
114
  for (const pattern of traversalPatterns) {
113
115
  if (pathLower.includes(pattern) || encodedPath.toLowerCase().includes(pattern)) {
114
- throw new Error('Path traversal not allowed in collection path');
116
+ throw ErrorHandler.createError('Path traversal not allowed in collection path', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.PATH_TRAVERSAL);
115
117
  }
116
118
  }
117
119
  return path;
@@ -121,14 +123,14 @@ export class MCPInputValidator {
121
123
  */
122
124
  static validateImportUrl(url) {
123
125
  if (!url || typeof url !== 'string') {
124
- throw new Error('URL must be a non-empty string');
126
+ throw ErrorHandler.createError('URL must be a non-empty string', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_URL);
125
127
  }
126
128
  if (url.length > 2000) {
127
- throw new Error('URL too long (max 2000 characters)');
129
+ throw ErrorHandler.createError('URL too long (max 2000 characters)', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_LENGTH);
128
130
  }
129
131
  // Reject protocol-relative URLs that could bypass validation
130
132
  if (url.startsWith('//')) {
131
- throw new Error('Protocol-relative URLs are not allowed');
133
+ throw ErrorHandler.createError('Protocol-relative URLs are not allowed', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_URL);
132
134
  }
133
135
  try {
134
136
  // Decode URL to prevent encoding-based bypasses
@@ -142,7 +144,7 @@ export class MCPInputValidator {
142
144
  const parsed = new URL(decodedUrl);
143
145
  // Protocol validation
144
146
  if (!['http:', 'https:'].includes(parsed.protocol)) {
145
- throw new Error('Only HTTP(S) URLs are allowed');
147
+ throw ErrorHandler.createError('Only HTTP(S) URLs are allowed', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_URL);
146
148
  }
147
149
  // Enhanced SSRF protection with IDN normalization
148
150
  let hostname = parsed.hostname.toLowerCase();
@@ -153,15 +155,15 @@ export class MCPInputValidator {
153
155
  }
154
156
  catch (idnError) {
155
157
  // If IDN conversion fails, reject the URL for security
156
- throw new Error('Invalid hostname: IDN conversion failed - potentially malicious domain name');
158
+ throw ErrorHandler.createError('Invalid hostname: IDN conversion failed - potentially malicious domain name', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_URL);
157
159
  }
158
160
  // Check for private IPs (now with IDN-normalized hostname)
159
161
  if (this.isPrivateIP(hostname)) {
160
- throw new Error('Private network URLs are not allowed');
162
+ throw ErrorHandler.createError('Private network URLs are not allowed', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_URL);
161
163
  }
162
164
  // Additional SSRF checks for encoded IPs
163
165
  if (this.isEncodedPrivateIP(hostname)) {
164
- throw new Error('Encoded private network URLs are not allowed');
166
+ throw ErrorHandler.createError('Encoded private network URLs are not allowed', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_URL);
165
167
  }
166
168
  return url;
167
169
  }
@@ -170,7 +172,7 @@ export class MCPInputValidator {
170
172
  throw error;
171
173
  }
172
174
  const errorMessage = error instanceof Error ? error.message : 'Unknown error';
173
- throw new Error(`Invalid URL format: ${errorMessage}`);
175
+ throw ErrorHandler.createError(`Invalid URL format: ${errorMessage}`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_URL);
174
176
  }
175
177
  }
176
178
  /**
@@ -178,13 +180,13 @@ export class MCPInputValidator {
178
180
  */
179
181
  static validateExpiryDays(days) {
180
182
  if (typeof days !== 'number') {
181
- throw new Error('Expiry days must be a valid number');
183
+ throw ErrorHandler.createError('Expiry days must be a valid number', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_NUMBER);
182
184
  }
183
185
  if (isNaN(days) || !isFinite(days)) {
184
- throw new Error('Expiry days must be a valid number');
186
+ throw ErrorHandler.createError('Expiry days must be a valid number', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_NUMBER);
185
187
  }
186
188
  if (days < 1 || days > 365) {
187
- throw new Error('Expiry days must be between 1 and 365');
189
+ throw ErrorHandler.createError('Expiry days must be between 1 and 365', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_RANGE);
188
190
  }
189
191
  return Math.floor(days);
190
192
  }
@@ -193,10 +195,10 @@ export class MCPInputValidator {
193
195
  */
194
196
  static validateConfirmation(confirm, operationName) {
195
197
  if (typeof confirm !== 'boolean') {
196
- throw new Error(`${operationName} confirmation must be a boolean value`);
198
+ throw ErrorHandler.createError(`${operationName} confirmation must be a boolean value`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_TYPE);
197
199
  }
198
200
  if (!confirm) {
199
- throw new Error(`${operationName} operation requires explicit confirmation (true)`);
201
+ throw ErrorHandler.createError(`${operationName} operation requires explicit confirmation (true)`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.CONFIRMATION_REQUIRED);
200
202
  }
201
203
  return confirm;
202
204
  }
@@ -205,7 +207,7 @@ export class MCPInputValidator {
205
207
  */
206
208
  static validateEditField(field) {
207
209
  if (!field || typeof field !== 'string') {
208
- throw new Error('Field name must be a non-empty string');
210
+ throw ErrorHandler.createError('Field name must be a non-empty string', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.REQUIRED_FIELD);
209
211
  }
210
212
  const validFields = [
211
213
  'name', 'description', 'category', 'instructions',
@@ -213,7 +215,7 @@ export class MCPInputValidator {
213
215
  ];
214
216
  const normalizedField = field.toLowerCase().trim();
215
217
  if (!validFields.includes(normalizedField)) {
216
- throw new Error(`Invalid field name. Must be one of: ${validFields.join(', ')}`);
218
+ throw ErrorHandler.createError(`Invalid field name. Must be one of: ${validFields.join(', ')}`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_INPUT);
217
219
  }
218
220
  return normalizedField;
219
221
  }
@@ -297,15 +299,15 @@ export class MCPInputValidator {
297
299
  */
298
300
  export function validateFilename(filename) {
299
301
  if (!filename || typeof filename !== 'string') {
300
- throw new Error('Filename must be a non-empty string');
302
+ throw ErrorHandler.createError('Filename must be a non-empty string', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_FILENAME);
301
303
  }
302
304
  if (filename.length > SECURITY_LIMITS.MAX_FILENAME_LENGTH) {
303
- throw new Error(`Filename too long (max ${SECURITY_LIMITS.MAX_FILENAME_LENGTH} characters)`);
305
+ throw ErrorHandler.createError(`Filename too long (max ${SECURITY_LIMITS.MAX_FILENAME_LENGTH} characters)`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_LENGTH);
304
306
  }
305
307
  // Remove any path separators and dangerous characters
306
308
  const sanitized = filename.replace(FILENAME_DANGEROUS_REGEX, '').replace(FILENAME_LEADING_DOTS_REGEX, '');
307
309
  if (!RegexValidator.validate(sanitized, VALIDATION_PATTERNS.SAFE_FILENAME, { maxLength: SECURITY_LIMITS.MAX_FILENAME_LENGTH })) {
308
- throw new Error('Invalid filename format. Use alphanumeric characters, hyphens, underscores, and dots only.');
310
+ throw ErrorHandler.createError('Invalid filename format. Use alphanumeric characters, hyphens, underscores, and dots only.', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_FILENAME);
309
311
  }
310
312
  return sanitized;
311
313
  }
@@ -314,14 +316,14 @@ export function validateFilename(filename) {
314
316
  */
315
317
  export function validatePath(inputPath, baseDir) {
316
318
  if (!inputPath || typeof inputPath !== 'string') {
317
- throw new Error('Path must be a non-empty string');
319
+ throw ErrorHandler.createError('Path must be a non-empty string', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_PATH);
318
320
  }
319
321
  // If baseDir is provided and inputPath is absolute, reject it
320
322
  // Check both Unix-style and Windows-style absolute paths for cross-platform security
321
323
  const isUnixAbsolute = path.isAbsolute(inputPath);
322
324
  const isWindowsAbsolute = /^[a-zA-Z]:[\\/]/.test(inputPath);
323
325
  if (baseDir && (isUnixAbsolute || isWindowsAbsolute)) {
324
- throw new Error('Absolute paths not allowed when base directory is specified');
326
+ throw ErrorHandler.createError('Absolute paths not allowed when base directory is specified', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_PATH);
325
327
  }
326
328
  // Remove leading/trailing slashes and normalize
327
329
  // Length limits added to prevent ReDoS attacks
@@ -336,23 +338,23 @@ export function validatePath(inputPath, baseDir) {
336
338
  normalized = '/' + normalized;
337
339
  }
338
340
  if (!VALIDATION_PATTERNS.SAFE_PATH.test(normalized)) {
339
- throw new Error('Invalid path format. Use alphanumeric characters, hyphens, underscores, dots, and forward slashes only.');
341
+ throw ErrorHandler.createError('Invalid path format. Use alphanumeric characters, hyphens, underscores, dots, and forward slashes only.', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_PATH);
340
342
  }
341
343
  // Check for path traversal attempts
342
344
  if (normalized.includes('..') || normalized.includes('./') || normalized.includes('/.')) {
343
- throw new Error('Path traversal not allowed');
345
+ throw ErrorHandler.createError('Path traversal not allowed', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.PATH_TRAVERSAL);
344
346
  }
345
347
  // Validate path depth
346
348
  const depth = normalized.split('/').length;
347
349
  if (depth > SECURITY_LIMITS.MAX_PATH_DEPTH) {
348
- throw new Error(`Path too deep (max ${SECURITY_LIMITS.MAX_PATH_DEPTH} levels)`);
350
+ throw ErrorHandler.createError(`Path too deep (max ${SECURITY_LIMITS.MAX_PATH_DEPTH} levels)`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_PATH);
349
351
  }
350
352
  // If baseDir provided, ensure path is within it
351
353
  if (baseDir) {
352
354
  const resolvedPath = path.resolve(baseDir, normalized);
353
355
  const resolvedBase = path.resolve(baseDir);
354
356
  if (!resolvedPath.startsWith(resolvedBase)) {
355
- throw new Error('Path traversal attempt detected');
357
+ throw ErrorHandler.createError('Path traversal attempt detected', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.PATH_TRAVERSAL);
356
358
  }
357
359
  }
358
360
  return normalized;
@@ -362,10 +364,10 @@ export function validatePath(inputPath, baseDir) {
362
364
  */
363
365
  export function validateUsername(username) {
364
366
  if (!username || typeof username !== 'string') {
365
- throw new Error('Username must be a non-empty string');
367
+ throw ErrorHandler.createError('Username must be a non-empty string', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.REQUIRED_FIELD);
366
368
  }
367
369
  if (!VALIDATION_PATTERNS.SAFE_USERNAME.test(username)) {
368
- throw new Error('Invalid username format. Use alphanumeric characters, hyphens, underscores, and dots only.');
370
+ throw ErrorHandler.createError('Invalid username format. Use alphanumeric characters, hyphens, underscores, and dots only.', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_FORMAT);
369
371
  }
370
372
  return username.toLowerCase();
371
373
  }
@@ -374,14 +376,14 @@ export function validateUsername(username) {
374
376
  */
375
377
  export function validateCategory(category) {
376
378
  if (!category || typeof category !== 'string') {
377
- throw new Error('Category must be a non-empty string');
379
+ throw ErrorHandler.createError('Category must be a non-empty string', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_CATEGORY);
378
380
  }
379
381
  if (!RegexValidator.validate(category, VALIDATION_PATTERNS.SAFE_CATEGORY, { maxLength: 50 })) {
380
- throw new Error('Invalid category format. Use alphabetic characters, hyphens, and underscores only.');
382
+ throw ErrorHandler.createError('Invalid category format. Use alphabetic characters, hyphens, and underscores only.', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_CATEGORY);
381
383
  }
382
384
  const normalized = category.toLowerCase();
383
385
  if (!VALID_CATEGORIES.includes(normalized)) {
384
- throw new Error(`Invalid category. Must be one of: ${VALID_CATEGORIES.join(', ')}`);
386
+ throw ErrorHandler.createError(`Invalid category. Must be one of: ${VALID_CATEGORIES.join(', ')}`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.INVALID_CATEGORY);
385
387
  }
386
388
  return normalized;
387
389
  }
@@ -390,11 +392,11 @@ export function validateCategory(category) {
390
392
  */
391
393
  export function validateContentSize(content, maxSize = SECURITY_LIMITS.MAX_CONTENT_LENGTH) {
392
394
  if (!content || typeof content !== 'string') {
393
- throw new Error('Content must be a non-empty string');
395
+ throw ErrorHandler.createError('Content must be a non-empty string', ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.REQUIRED_FIELD);
394
396
  }
395
397
  const sizeBytes = Buffer.byteLength(content, 'utf8');
396
398
  if (sizeBytes > maxSize) {
397
- throw new Error(`Content too large (${sizeBytes} bytes, max ${maxSize} bytes)`);
399
+ throw ErrorHandler.createError(`Content too large (${sizeBytes} bytes, max ${maxSize} bytes)`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.CONTENT_TOO_LARGE);
398
400
  }
399
401
  }
400
402
  export function validateInputLengths(content, contentType, options = {}) {
@@ -408,23 +410,23 @@ export function validateInputLengths(content, contentType, options = {}) {
408
410
  switch (contentType) {
409
411
  case 'full':
410
412
  if (content.length > limits.maxContentLength) {
411
- throw new Error(`Content exceeds maximum length of ${limits.maxContentLength} characters (${content.length} provided)`);
413
+ throw ErrorHandler.createError(`Content exceeds maximum length of ${limits.maxContentLength} characters (${content.length} provided)`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.CONTENT_TOO_LARGE);
412
414
  }
413
415
  break;
414
416
  case 'yaml':
415
417
  if (content.length > limits.maxYamlLength) {
416
- throw new Error(`YAML content exceeds maximum length of ${limits.maxYamlLength} characters (${content.length} provided)`);
418
+ throw ErrorHandler.createError(`YAML content exceeds maximum length of ${limits.maxYamlLength} characters (${content.length} provided)`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.CONTENT_TOO_LARGE);
417
419
  }
418
420
  break;
419
421
  case 'metadata':
420
422
  // For metadata, check overall size
421
423
  if (content.length > limits.maxYamlLength) {
422
- throw new Error(`Metadata exceeds maximum length of ${limits.maxYamlLength} characters (${content.length} provided)`);
424
+ throw ErrorHandler.createError(`Metadata exceeds maximum length of ${limits.maxYamlLength} characters (${content.length} provided)`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.CONTENT_TOO_LARGE);
423
425
  }
424
426
  break;
425
427
  case 'field':
426
428
  if (content.length > limits.maxMetadataFieldLength) {
427
- throw new Error(`Field exceeds maximum length of ${limits.maxMetadataFieldLength} characters (${content.length} provided)`);
429
+ throw ErrorHandler.createError(`Field exceeds maximum length of ${limits.maxMetadataFieldLength} characters (${content.length} provided)`, ErrorCategory.VALIDATION_ERROR, ValidationErrorCodes.CONTENT_TOO_LARGE);
428
430
  }
429
431
  break;
430
432
  }
@@ -445,4 +447,4 @@ export function sanitizeInput(input, maxLength = 1000) {
445
447
  .substring(0, maxLength)
446
448
  .trim();
447
449
  }
448
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5wdXRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJELHFEQUFxRDtBQUNyRCxzRUFBc0U7QUFDdEUsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQztBQUMvQyxNQUFNLG9CQUFvQixHQUFHLFVBQVUsQ0FBQztBQUN4QyxNQUFNLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDO0FBQ2xELE1BQU0sbUJBQW1CLEdBQUcsaUJBQWlCLENBQUM7QUFDOUMsTUFBTSwwQkFBMEIsR0FBRyxtQkFBbUIsQ0FBQztBQUN2RCxNQUFNLDJCQUEyQixHQUFHLHNCQUFzQixDQUFDO0FBQzNELE1BQU0sVUFBVSxHQUFHLDhCQUE4QixDQUFDO0FBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDO0FBQ3RDLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDO0FBQzFDLE1BQU0sY0FBYyxHQUFHLGdCQUFnQixDQUFDO0FBQ3hDLE1BQU0sd0JBQXdCLEdBQUcsZ0JBQWdCLENBQUM7QUFDbEQsTUFBTSwyQkFBMkIsR0FBRyxNQUFNLENBQUM7QUFDM0MsTUFBTSxvQkFBb0IsR0FBRyx3QkFBd0IsQ0FBQztBQUN0RCxNQUFNLDJCQUEyQixHQUFHLFlBQVksQ0FBQztBQUNqRCxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQUVwQzs7R0FFRztBQUNILE1BQU0sT0FBTyxpQkFBaUI7SUFDNUI7O09BRUc7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Q2IsbUNBQW1DLE1BQU0sQ0FBQyxzQkFBc0IsZ0JBQWdCLE9BQU8sQ0FBQyxNQUFNLFlBQVksQ0FDM0csQ0FBQztZQUNKLENBQUM7WUFDRCxNQUFNO0lBQ1YsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBYSxFQUFFLFlBQW9CLElBQUk7SUFDbkUsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCwyREFBMkQ7SUFDM0QsT0FBTyxLQUFLO1NBQ1QsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDLDRCQUE0QjtTQUM3RCxPQUFPLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDLENBQUMsbUNBQW1DO1NBQ3JFLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQyx5Q0FBeUM7U0FDM0UsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDLDJDQUEyQztTQUM1RSxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztTQUN2QixJQUFJLEVBQUUsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIElucHV0IHZhbGlkYXRpb24gYW5kIHNhbml0aXphdGlvbiBmdW5jdGlvbnNcbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTLCBWQUxJREFUSU9OX1BBVFRFUk5TIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgVkFMSURfQ0FURUdPUklFUyB9IGZyb20gJy4uL2NvbmZpZy9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgUmVnZXhWYWxpZGF0b3IgfSBmcm9tICcuL3JlZ2V4VmFsaWRhdG9yLmpzJztcblxuLy8gUHJlLWNvbXBpbGVkIHJlZ2V4IHBhdHRlcm5zIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Vcbi8vIFRoZXNlIHBhdHRlcm5zIGFyZSB1c2VkIHJlcGVhdGVkbHkgYW5kIGJlbmVmaXQgZnJvbSBwcmUtY29tcGlsYXRpb25cbmNvbnN0IENPTlRST0xfQ0hBUlNfUkVHRVggPSAvW1xceDAwLVxceDFGXFx4N0ZdL2c7XG5jb25zdCBIVE1MX0RBTkdFUk9VU19SRUdFWCA9IC9bPD4nXCImXS9nO1xuY29uc3QgU0hFTExfTUVUQUNIQVJfUkVHRVggPSAvWzsmfGAkKCkhXFxcXH4qP3t9XS9nO1xuY29uc3QgUlRMX1pFUk9XSURUSF9SRUdFWCA9IC9bXFx1MjAyRVxcdUZFRkZdL2c7XG5jb25zdCBDT0xMRUNUSU9OX1BBVEhfQ0hBUl9SRUdFWCA9IC9bYS16QS1aMC05XFwvXFwtXy5dLztcbmNvbnN0IFZBTElEX0NPTExFQ1RJT05fUEFUSF9SRUdFWCA9IC9eW2EtekEtWjAtOVxcL1xcLV8uXSokLztcbmNvbnN0IElQVjRfUkVHRVggPSAvXihcXGQrKVxcLihcXGQrKVxcLihcXGQrKVxcLihcXGQrKSQvO1xuY29uc3QgREVDSU1BTF9JUF9SRUdFWCA9IC9eXFxkezgsMTB9JC87XG5jb25zdCBIRVhfSVBfUkVHRVggPSAvXjB4WzAtOWEtZl17MSw4fSQvaTtcbmNvbnN0IE9DVEFMX0lQX1JFR0VYID0gL14wWzAtN117OCwxMX0kLztcbmNvbnN0IEZJTEVOQU1FX0RBTkdFUk9VU19SRUdFWCA9IC9bXFwvXFxcXDoqP1wiPD58XS9nO1xuY29uc3QgRklMRU5BTUVfTEVBRElOR19ET1RTX1JFR0VYID0gL15cXC4rLztcbmNvbnN0IFBBVEhfTk9STUFMSVpFX1JFR0VYID0gL15cXC97MSwxMDB9fFxcL3sxLDEwMH0kL2c7XG5jb25zdCBQQVRIX01VTFRJUExFX1NMQVNIRVNfUkVHRVggPSAvXFwvezEsMTAwfS9nO1xuY29uc3QgVVJMX1BMVVNfREVDT0RFX1JFR0VYID0gL1xcKy9nO1xuXG4vKipcbiAqIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb24gZm9yIE1DUCB0b29sc1xuICovXG5leHBvcnQgY2xhc3MgTUNQSW5wdXRWYWxpZGF0b3Ige1xuICAvKipcbiAgICogVmFsaWRhdGUgYSBwZXJzb25hIGlkZW50aWZpZXIgKG5hbWUgb3IgZmlsZW5hbWUpXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVQZXJzb25hSWRlbnRpZmllcihpZGVudGlmaWVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaWRlbnRpZmllciB8fCB0eXBlb2YgaWRlbnRpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGVyc29uYSBpZGVudGlmaWVyIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKGlkZW50aWZpZXIubGVuZ3RoID4gMTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BlcnNvbmEgaWRlbnRpZmllciB0b28gbG9uZyAobWF4IDEwMCBjaGFyYWN0ZXJzKScpO1xuICAgIH1cblxuICAgIC8vIEFsbG93IHBlcnNvbmEgbmFtZXMgYW5kIGZpbGVuYW1lc1xuICAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplSW5wdXQoaWRlbnRpZmllciwgMTAwKTtcbiAgICBpZiAoIXNhbml0aXplZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQZXJzb25hIGlkZW50aWZpZXIgY29udGFpbnMgb25seSBpbnZhbGlkIGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHNlYXJjaCBxdWVyeSBmb3IgY29sbGVjdGlvblxuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlU2VhcmNoUXVlcnkocXVlcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFxdWVyeSB8fCB0eXBlb2YgcXVlcnkgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlYXJjaCBxdWVyeSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cblxuICAgIGlmIChxdWVyeS5sZW5ndGggPCAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlYXJjaCBxdWVyeSB0b28gc2hvcnQgKG1pbmltdW0gMiBjaGFyYWN0ZXJzKScpO1xuICAgIH1cblxuICAgIGlmIChxdWVyeS5sZW5ndGggPiAyMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VhcmNoIHF1ZXJ5IHRvbyBsb25nIChtYXggMjAwIGNoYXJhY3RlcnMpJyk7XG4gICAgfVxuXG4gICAgLy8gU2FuaXRpemUgYnV0IHByZXNlcnZlIHNwYWNlcyBmb3Igc2VhcmNoXG4gICAgY29uc3Qgc2FuaXRpemVkID0gcXVlcnlcbiAgICAgIC5yZXBsYWNlKENPTlRST0xfQ0hBUlNfUkVHRVgsICcnKSAvLyBSZW1vdmUgY29udHJvbCBjaGFyYWN0ZXJzXG4gICAgICAucmVwbGFjZShIVE1MX0RBTkdFUk9VU19SRUdFWCwgJycpIC8vIFJlbW92ZSBIVE1MLWRhbmdlcm91cyBjaGFyYWN0ZXJzXG4gICAgICAucmVwbGFjZShTSEVMTF9NRVRBQ0hBUl9SRUdFWCwgJycpIC8vIFJlbW92ZSBzaGVsbCBtZXRhY2hhcmFjdGVycyAoZXhwYW5kZWQpXG4gICAgICAucmVwbGFjZShSVExfWkVST1dJRFRIX1JFR0VYLCAnJykgLy8gUmVtb3ZlIFJUTCBvdmVycmlkZSBhbmQgemVyby13aWR0aCBjaGFyc1xuICAgICAgLnRyaW0oKTtcblxuICAgIGlmICghc2FuaXRpemVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlYXJjaCBxdWVyeSBjb250YWlucyBvbmx5IGludmFsaWQgY2hhcmFjdGVycycpO1xuICAgIH1cblxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgY29sbGVjdGlvbiBwYXRoXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVDb2xsZWN0aW9uUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghcGF0aCB8fCB0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbiBwYXRoIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKHBhdGgubGVuZ3RoID4gNTAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbGxlY3Rpb24gcGF0aCB0b28gbG9uZyAobWF4IDUwMCBjaGFyYWN0ZXJzKScpO1xuICAgIH1cblxuICAgIC8vIEdpdEh1YiBBUEkgcGF0aHMgc2hvdWxkIGJlIHNhZmUgZmlsZW5hbWUgcGF0dGVybnNcbiAgICAvLyBVc2Ugc2luZ2xlIHJlZ2V4IHRlc3QgZm9yIGJldHRlciBwZXJmb3JtYW5jZSAoYXZvaWRzIE8obikgY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciBjaGVjaylcbiAgICBpZiAoIVZBTElEX0NPTExFQ1RJT05fUEFUSF9SRUdFWC50ZXN0KHBhdGgpKSB7XG4gICAgICAvLyBPbmx5IGRvIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgY2hlY2sgaWYgdmFsaWRhdGlvbiBmYWlscywgdG8gcHJvdmlkZSBkZXRhaWxlZCBlcnJvciBtZXNzYWdlXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgY2hhciA9IHBhdGhbaV07XG4gICAgICAgIGlmICghQ09MTEVDVElPTl9QQVRIX0NIQVJfUkVHRVgudGVzdChjaGFyKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFyYWN0ZXIgJyR7Y2hhcn0nIGluIGNvbGxlY3Rpb24gcGF0aCBhdCBwb3NpdGlvbiAke2kgKyAxfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBGYWxsYmFjayBlcnJvciBpZiB3ZSBzb21laG93IGRvbid0IGZpbmQgdGhlIGludmFsaWQgY2hhcmFjdGVyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hhcmFjdGVycyBpbiBjb2xsZWN0aW9uIHBhdGgnKTtcbiAgICB9XG5cbiAgICAvLyBQcmV2ZW50IHBhdGggdHJhdmVyc2FsIGluIEdpdEh1YiBwYXRocyAoY29tcHJlaGVuc2l2ZSBjaGVjaylcbiAgICBjb25zdCBwYXRoTG93ZXIgPSBwYXRoLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZW5jb2RlZFBhdGggPSBkZWNvZGVVUklDb21wb25lbnQocGF0aC5yZXBsYWNlKFVSTF9QTFVTX0RFQ09ERV9SRUdFWCwgJyAnKSk7IC8vIERlY29kZSBVUkwgZW5jb2RpbmdcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgdmFyaW91cyBwYXRoIHRyYXZlcnNhbCBwYXR0ZXJuc1xuICAgIGNvbnN0IHRyYXZlcnNhbFBhdHRlcm5zID0gW1xuICAgICAgJy4uJywgICAgICAgICAgLy8gQmFzaWMgdHJhdmVyc2FsXG4gICAgICAnLi8nLCAgICAgICAgICAvLyBDdXJyZW50IGRpcmVjdG9yeVxuICAgICAgJy8uLi8nLCAgICAgICAgLy8gRGlyZWN0b3J5IHRyYXZlcnNhbCB3aXRoIHNsYXNoZXNcbiAgICAgICdcXFxcJywgICAgICAgICAgLy8gQmFja3NsYXNoIChXaW5kb3dzLXN0eWxlKVxuICAgICAgJyUyZSUyZScsICAgICAgLy8gVVJMLWVuY29kZWQgLi5cbiAgICAgICclMmUlMmUlMmYnLCAgIC8vIFVSTC1lbmNvZGVkIC4uL1xuICAgICAgJyUyZSUyZSU1YycsICAgLy8gVVJMLWVuY29kZWQgLi5cXFxuICAgICAgJyUyNTJlJTI1MmUnLCAgLy8gRG91YmxlIFVSTC1lbmNvZGVkIC4uXG4gICAgICAnLi4lMmYnLCAgICAgICAvLyBNaXhlZCBlbmNvZGluZ1xuICAgICAgJy4uJTVjJywgICAgICAgLy8gTWl4ZWQgZW5jb2Rpbmcgd2l0aCBiYWNrc2xhc2hcbiAgICAgICcuLi4uLycsICAgICAgIC8vIERvdGRvdCBieXBhc3MgYXR0ZW1wdFxuICAgICAgJy4uOy8nLCAgICAgICAgLy8gU2VtaWNvbG9uIGJ5cGFzcyBhdHRlbXB0XG4gICAgXTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgdHJhdmVyc2FsUGF0dGVybnMpIHtcbiAgICAgIGlmIChwYXRoTG93ZXIuaW5jbHVkZXMocGF0dGVybikgfHwgZW5jb2RlZFBhdGgudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhwYXR0ZXJuKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggdHJhdmVyc2FsIG5vdCBhbGxvd2VkIGluIGNvbGxlY3Rpb24gcGF0aCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIFVSTCBmb3IgaW1wb3J0IG9wZXJhdGlvbnNcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUltcG9ydFVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF1cmwgfHwgdHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVVJMIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgaWYgKHVybC5sZW5ndGggPiAyMDAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VSTCB0b28gbG9uZyAobWF4IDIwMDAgY2hhcmFjdGVycyknKTtcbiAgICB9XG5cbiAgICAvLyBSZWplY3QgcHJvdG9jb2wtcmVsYXRpdmUgVVJMcyB0aGF0IGNvdWxkIGJ5cGFzcyB2YWxpZGF0aW9uXG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCcvLycpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb3RvY29sLXJlbGF0aXZlIFVSTHMgYXJlIG5vdCBhbGxvd2VkJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIERlY29kZSBVUkwgdG8gcHJldmVudCBlbmNvZGluZy1iYXNlZCBieXBhc3Nlc1xuICAgICAgbGV0IGRlY29kZWRVcmwgPSB1cmw7XG4gICAgICB0cnkge1xuICAgICAgICBkZWNvZGVkVXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KHVybCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSWYgZGVjb2RpbmcgZmFpbHMsIHVzZSBvcmlnaW5hbCBVUkxcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTChkZWNvZGVkVXJsKTtcbiAgICAgIFxuICAgICAgLy8gUHJvdG9jb2wgdmFsaWRhdGlvblxuICAgICAgaWYgKCFbJ2h0dHA6JywgJ2h0dHBzOiddLmluY2x1ZGVzKHBhcnNlZC5wcm90b2NvbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IEhUVFAoUykgVVJMcyBhcmUgYWxsb3dlZCcpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbmhhbmNlZCBTU1JGIHByb3RlY3Rpb24gd2l0aCBJRE4gbm9ybWFsaXphdGlvblxuICAgICAgbGV0IGhvc3RuYW1lID0gcGFyc2VkLmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBJRE4gKEludGVybmF0aW9uYWwgRG9tYWluIE5hbWVzKSBieSBjb252ZXJ0aW5nIHRvIEFTQ0lJXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpZG5Ob3JtYWxpemVkID0gbmV3IFVSTChgaHR0cDovLyR7aG9zdG5hbWV9YCkuaG9zdG5hbWU7XG4gICAgICAgIGhvc3RuYW1lID0gaWRuTm9ybWFsaXplZDtcbiAgICAgIH0gY2F0Y2ggKGlkbkVycm9yKSB7XG4gICAgICAgIC8vIElmIElETiBjb252ZXJzaW9uIGZhaWxzLCByZWplY3QgdGhlIFVSTCBmb3Igc2VjdXJpdHlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGhvc3RuYW1lOiBJRE4gY29udmVyc2lvbiBmYWlsZWQgLSBwb3RlbnRpYWxseSBtYWxpY2lvdXMgZG9tYWluIG5hbWUnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIHByaXZhdGUgSVBzIChub3cgd2l0aCBJRE4tbm9ybWFsaXplZCBob3N0bmFtZSlcbiAgICAgIGlmICh0aGlzLmlzUHJpdmF0ZUlQKGhvc3RuYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ByaXZhdGUgbmV0d29yayBVUkxzIGFyZSBub3QgYWxsb3dlZCcpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBBZGRpdGlvbmFsIFNTUkYgY2hlY2tzIGZvciBlbmNvZGVkIElQc1xuICAgICAgaWYgKHRoaXMuaXNFbmNvZGVkUHJpdmF0ZUlQKGhvc3RuYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuY29kZWQgcHJpdmF0ZSBuZXR3b3JrIFVSTHMgYXJlIG5vdCBhbGxvd2VkJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cmw7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdQcml2YXRlIG5ldHdvcmsnKSB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFbmNvZGVkIHByaXZhdGUnKSkpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJztcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBVUkwgZm9ybWF0OiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZXhwaXJ5IGRheXMgZm9yIHNoYXJpbmdcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUV4cGlyeURheXMoZGF5czogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodHlwZW9mIGRheXMgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGlyeSBkYXlzIG11c3QgYmUgYSB2YWxpZCBudW1iZXInKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGlzTmFOKGRheXMpIHx8ICFpc0Zpbml0ZShkYXlzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBpcnkgZGF5cyBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyJyk7XG4gICAgfVxuXG4gICAgaWYgKGRheXMgPCAxIHx8IGRheXMgPiAzNjUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwaXJ5IGRheXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDM2NScpO1xuICAgIH1cblxuICAgIHJldHVybiBNYXRoLmZsb29yKGRheXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGJvb2xlYW4gY29uZmlybWF0aW9uIHBhcmFtZXRlcnNcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUNvbmZpcm1hdGlvbihjb25maXJtOiBib29sZWFuLCBvcGVyYXRpb25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpcm0gIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29wZXJhdGlvbk5hbWV9IGNvbmZpcm1hdGlvbiBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZWApO1xuICAgIH1cblxuICAgIGlmICghY29uZmlybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke29wZXJhdGlvbk5hbWV9IG9wZXJhdGlvbiByZXF1aXJlcyBleHBsaWNpdCBjb25maXJtYXRpb24gKHRydWUpYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpcm07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZmllbGQgbmFtZSBmb3IgZWRpdCBvcGVyYXRpb25zXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVFZGl0RmllbGQoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFmaWVsZCB8fCB0eXBlb2YgZmllbGQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpZWxkIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZEZpZWxkcyA9IFtcbiAgICAgICduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ2NhdGVnb3J5JywgJ2luc3RydWN0aW9ucycsIFxuICAgICAgJ3RyaWdnZXJzJywgJ3ZlcnNpb24nLCAnYXV0aG9yJywgJ3RhZ3MnXG4gICAgXTtcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWVsZCA9IGZpZWxkLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGlmICghdmFsaWRGaWVsZHMuaW5jbHVkZXMobm9ybWFsaXplZEZpZWxkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpZWxkIG5hbWUuIE11c3QgYmUgb25lIG9mOiAke3ZhbGlkRmllbGRzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRGaWVsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBob3N0bmFtZSBpcyBhIHByaXZhdGUgSVAgYWRkcmVzcyAoSVB2NCBhbmQgSVB2NilcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGlzUHJpdmF0ZUlQKGhvc3RuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBmb3IgbG9jYWxob3N0IHZhcmlhdGlvbnNcbiAgICBpZiAoWydsb2NhbGhvc3QnLCAnMTI3LjAuMC4xJywgJzo6MSddLmluY2x1ZGVzKGhvc3RuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHByaXZhdGUgSVB2NCByYW5nZXNcbiAgICBjb25zdCBpcHY0TWF0Y2ggPSBob3N0bmFtZS5tYXRjaChJUFY0X1JFR0VYKTtcbiAgICBcbiAgICBpZiAoaXB2NE1hdGNoKSB7XG4gICAgICBjb25zdCBbLCBhLCBiLCBjLCBkXSA9IGlwdjRNYXRjaC5tYXAoTnVtYmVyKTtcbiAgICAgIFxuICAgICAgLy8gMTAuMC4wLjAvOFxuICAgICAgaWYgKGEgPT09IDEwKSByZXR1cm4gdHJ1ZTtcbiAgICAgIFxuICAgICAgLy8gMTcyLjE2LjAuMC8xMlxuICAgICAgaWYgKGEgPT09IDE3MiAmJiBiID49IDE2ICYmIGIgPD0gMzEpIHJldHVybiB0cnVlO1xuICAgICAgXG4gICAgICAvLyAxOTIuMTY4LjAuMC8xNlxuICAgICAgaWYgKGEgPT09IDE5MiAmJiBiID09PSAxNjgpIHJldHVybiB0cnVlO1xuICAgICAgXG4gICAgICAvLyAxNjkuMjU0LjAuMC8xNiAobGluay1sb2NhbClcbiAgICAgIGlmIChhID09PSAxNjkgJiYgYiA9PT0gMjU0KSByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgcHJpdmF0ZSBJUHY2IHJhbmdlc1xuICAgIGNvbnN0IGlwdjZMb3dlciA9IGhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgXG4gICAgLy8gZmMwMDo6LzcgLSBVbmlxdWUgTG9jYWwgQWRkcmVzc2VzIChVTEEpXG4gICAgaWYgKGlwdjZMb3dlci5zdGFydHNXaXRoKCdmYycpIHx8IGlwdjZMb3dlci5zdGFydHNXaXRoKCdmZCcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gZmU4MDo6LzEwIC0gTGluay1Mb2NhbCBBZGRyZXNzZXNcbiAgICAvLyBJUHY2IGxpbmstbG9jYWwgYWRkcmVzc2VzIGFyZSBmZTgwOjovMTAsIG1lYW5pbmcgdGhlIHZhbGlkIHJhbmdlIGlzIGZlODAgdGhyb3VnaCBmZWJmXG4gICAgY29uc3QgZmU4MFJhbmdlID0gcGFyc2VJbnQoaXB2Nkxvd2VyLnN1YnN0cmluZygwLCA0KSwgMTYpO1xuICAgIGlmIChmZTgwUmFuZ2UgPj0gMHhmZTgwICYmIGZlODBSYW5nZSA8PSAweGZlYmYpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGRpdGlvbmFsIElQdjYgbG9jYWxob3N0IGZvcm1hdHNcbiAgICBpZiAoWyc6OjEnLCAnMDowOjA6MDowOjA6MDoxJ10uaW5jbHVkZXMoaXB2Nkxvd2VyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGZvciBlbmNvZGVkIHByaXZhdGUgSVAgYWRkcmVzc2VzIHRoYXQgY291bGQgYnlwYXNzIGJhc2ljIGRldGVjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaXNFbmNvZGVkUHJpdmF0ZUlQKGhvc3RuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBmb3IgZGVjaW1hbCBlbmNvZGVkIElQcyAoZS5nLiwgMjEzMDcwNjQzMyA9IDEyNy4wLjAuMSlcbiAgICBpZiAoREVDSU1BTF9JUF9SRUdFWC50ZXN0KGhvc3RuYW1lKSkge1xuICAgICAgY29uc3QgbnVtID0gcGFyc2VJbnQoaG9zdG5hbWUsIDEwKTtcbiAgICAgIGlmIChudW0gPj0gMCAmJiBudW0gPD0gNDI5NDk2NzI5NSkgeyAvLyBWYWxpZCBJUHY0IHJhbmdlXG4gICAgICAgIC8vIENvbnZlcnQgdG8gSVAgZm9ybWF0IGFuZCBjaGVjayBpZiBwcml2YXRlXG4gICAgICAgIGNvbnN0IGlwID0gWyhudW0gPj4+IDI0KSAmIDI1NSwgKG51bSA+Pj4gMTYpICYgMjU1LCAobnVtID4+PiA4KSAmIDI1NSwgbnVtICYgMjU1XS5qb2luKCcuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUHJpdmF0ZUlQKGlwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIGhleCBlbmNvZGVkIElQcyAoZS5nLiwgMHg3ZjAwMDAwMSA9IDEyNy4wLjAuMSlcbiAgICBpZiAoSEVYX0lQX1JFR0VYLnRlc3QoaG9zdG5hbWUpKSB7XG4gICAgICBjb25zdCBudW0gPSBwYXJzZUludChob3N0bmFtZSwgMTYpO1xuICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8PSA0Mjk0OTY3Mjk1KSB7XG4gICAgICAgIGNvbnN0IGlwID0gWyhudW0gPj4+IDI0KSAmIDI1NSwgKG51bSA+Pj4gMTYpICYgMjU1LCAobnVtID4+PiA4KSAmIDI1NSwgbnVtICYgMjU1XS5qb2luKCcuJyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlzUHJpdmF0ZUlQKGlwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIG9jdGFsIGVuY29kZWQgSVBzIChlLmcuLCAwMTc3MDAwMDAwMDEgPSAxMjcuMC4wLjEpXG4gICAgaWYgKE9DVEFMX0lQX1JFR0VYLnRlc3QoaG9zdG5hbWUpKSB7XG4gICAgICBjb25zdCBudW0gPSBwYXJzZUludChob3N0bmFtZSwgOCk7XG4gICAgICBpZiAobnVtID49IDAgJiYgbnVtIDw9IDQyOTQ5NjcyOTUpIHtcbiAgICAgICAgY29uc3QgaXAgPSBbKG51bSA+Pj4gMjQpICYgMjU1LCAobnVtID4+PiAxNikgJiAyNTUsIChudW0gPj4+IDgpICYgMjU1LCBudW0gJiAyNTVdLmpvaW4oJy4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNQcml2YXRlSVAoaXApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgYSBmaWxlbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVGaWxlbmFtZShmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFmaWxlbmFtZSB8fCB0eXBlb2YgZmlsZW5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG4gIFxuICBpZiAoZmlsZW5hbWUubGVuZ3RoID4gU0VDVVJJVFlfTElNSVRTLk1BWF9GSUxFTkFNRV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZpbGVuYW1lIHRvbyBsb25nIChtYXggJHtTRUNVUklUWV9MSU1JVFMuTUFYX0ZJTEVOQU1FX0xFTkdUSH0gY2hhcmFjdGVycylgKTtcbiAgfVxuICBcbiAgLy8gUmVtb3ZlIGFueSBwYXRoIHNlcGFyYXRvcnMgYW5kIGRhbmdlcm91cyBjaGFyYWN0ZXJzXG4gIGNvbnN0IHNhbml0aXplZCA9IGZpbGVuYW1lLnJlcGxhY2UoRklMRU5BTUVfREFOR0VST1VTX1JFR0VYLCAnJykucmVwbGFjZShGSUxFTkFNRV9MRUFESU5HX0RPVFNfUkVHRVgsICcnKTtcbiAgXG4gIGlmICghUmVnZXhWYWxpZGF0b3IudmFsaWRhdGUoc2FuaXRpemVkLCBWQUxJREFUSU9OX1BBVFRFUk5TLlNBRkVfRklMRU5BTUUsIHsgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0ZJTEVOQU1FX0xFTkdUSCB9KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmaWxlbmFtZSBmb3JtYXQuIFVzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGFuZCBkb3RzIG9ubHkuJyk7XG4gIH1cbiAgXG4gIHJldHVybiBzYW5pdGl6ZWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIHNhbml0aXplIGEgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQYXRoKGlucHV0UGF0aDogc3RyaW5nLCBiYXNlRGlyPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFpbnB1dFBhdGggfHwgdHlwZW9mIGlucHV0UGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuICBcbiAgLy8gSWYgYmFzZURpciBpcyBwcm92aWRlZCBhbmQgaW5wdXRQYXRoIGlzIGFic29sdXRlLCByZWplY3QgaXRcbiAgLy8gQ2hlY2sgYm90aCBVbml4LXN0eWxlIGFuZCBXaW5kb3dzLXN0eWxlIGFic29sdXRlIHBhdGhzIGZvciBjcm9zcy1wbGF0Zm9ybSBzZWN1cml0eVxuICBjb25zdCBpc1VuaXhBYnNvbHV0ZSA9IHBhdGguaXNBYnNvbHV0ZShpbnB1dFBhdGgpO1xuICBjb25zdCBpc1dpbmRvd3NBYnNvbHV0ZSA9IC9eW2EtekEtWl06W1xcXFwvXS8udGVzdChpbnB1dFBhdGgpO1xuICBcbiAgaWYgKGJhc2VEaXIgJiYgKGlzVW5peEFic29sdXRlIHx8IGlzV2luZG93c0Fic29sdXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignQWJzb2x1dGUgcGF0aHMgbm90IGFsbG93ZWQgd2hlbiBiYXNlIGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQnKTtcbiAgfVxuICBcbiAgLy8gUmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgc2xhc2hlcyBhbmQgbm9ybWFsaXplXG4gIC8vIExlbmd0aCBsaW1pdHMgYWRkZWQgdG8gcHJldmVudCBSZURvUyBhdHRhY2tzXG4gIC8vIFdJTkRPV1MgRklYOiBDb252ZXJ0IGJhY2tzbGFzaGVzIHRvIGZvcndhcmQgc2xhc2hlcyBmb3IgY3Jvc3MtcGxhdGZvcm0gY29tcGF0aWJpbGl0eVxuICBsZXQgbm9ybWFsaXplZCA9IGlucHV0UGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIFxuICAvLyBGSVg6IFByZXNlcnZlIGxlYWRpbmcgc2xhc2ggZm9yIGFic29sdXRlIHBhdGhzXG4gIGNvbnN0IGlzQWJzb2x1dGUgPSBub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSB8fCBpc1dpbmRvd3NBYnNvbHV0ZTtcbiAgXG4gIC8vIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzIGFuZCBub3JtYWxpemUgbXVsdGlwbGUgc2xhc2hlc1xuICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5yZXBsYWNlKC9cXC97MSwxMDB9JC9nLCAnJykucmVwbGFjZSgvXFwvezIsMTAwfS9nLCAnLycpO1xuICBcbiAgLy8gUHJlc2VydmUgdGhlIGxlYWRpbmcgc2xhc2ggaWYgaXQgd2FzIGFuIGFic29sdXRlIHBhdGhcbiAgaWYgKGlzQWJzb2x1dGUgJiYgIW5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnLycpICYmICFpc1dpbmRvd3NBYnNvbHV0ZSkge1xuICAgIG5vcm1hbGl6ZWQgPSAnLycgKyBub3JtYWxpemVkO1xuICB9XG4gIFxuICBpZiAoIVZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9QQVRILnRlc3Qobm9ybWFsaXplZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGF0aCBmb3JtYXQuIFVzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGRvdHMsIGFuZCBmb3J3YXJkIHNsYXNoZXMgb25seS4nKTtcbiAgfVxuICBcbiAgLy8gQ2hlY2sgZm9yIHBhdGggdHJhdmVyc2FsIGF0dGVtcHRzXG4gIGlmIChub3JtYWxpemVkLmluY2x1ZGVzKCcuLicpIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoJy4vJykgfHwgbm9ybWFsaXplZC5pbmNsdWRlcygnLy4nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGF0aCB0cmF2ZXJzYWwgbm90IGFsbG93ZWQnKTtcbiAgfVxuICBcbiAgLy8gVmFsaWRhdGUgcGF0aCBkZXB0aFxuICBjb25zdCBkZXB0aCA9IG5vcm1hbGl6ZWQuc3BsaXQoJy8nKS5sZW5ndGg7XG4gIGlmIChkZXB0aCA+IFNFQ1VSSVRZX0xJTUlUUy5NQVhfUEFUSF9ERVBUSCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCB0b28gZGVlcCAobWF4ICR7U0VDVVJJVFlfTElNSVRTLk1BWF9QQVRIX0RFUFRIfSBsZXZlbHMpYCk7XG4gIH1cbiAgXG4gIC8vIElmIGJhc2VEaXIgcHJvdmlkZWQsIGVuc3VyZSBwYXRoIGlzIHdpdGhpbiBpdFxuICBpZiAoYmFzZURpcikge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRGlyLCBub3JtYWxpemVkKTtcbiAgICBjb25zdCByZXNvbHZlZEJhc2UgPSBwYXRoLnJlc29sdmUoYmFzZURpcik7XG4gICAgXG4gICAgaWYgKCFyZXNvbHZlZFBhdGguc3RhcnRzV2l0aChyZXNvbHZlZEJhc2UpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggdHJhdmVyc2FsIGF0dGVtcHQgZGV0ZWN0ZWQnKTtcbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhIHVzZXJuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVVzZXJuYW1lKHVzZXJuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXVzZXJuYW1lIHx8IHR5cGVvZiB1c2VybmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXJuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gIH1cbiAgXG4gIGlmICghVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX1VTRVJOQU1FLnRlc3QodXNlcm5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHVzZXJuYW1lIGZvcm1hdC4gVXNlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgYW5kIGRvdHMgb25seS4nKTtcbiAgfVxuICBcbiAgcmV0dXJuIHVzZXJuYW1lLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBjYXRlZ29yeVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVDYXRlZ29yeShjYXRlZ29yeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFjYXRlZ29yeSB8fCB0eXBlb2YgY2F0ZWdvcnkgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYXRlZ29yeSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG4gIFxuICBpZiAoIVJlZ2V4VmFsaWRhdG9yLnZhbGlkYXRlKGNhdGVnb3J5LCBWQUxJREFUSU9OX1BBVFRFUk5TLlNBRkVfQ0FURUdPUlksIHsgbWF4TGVuZ3RoOiA1MCB9KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjYXRlZ29yeSBmb3JtYXQuIFVzZSBhbHBoYWJldGljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcyBvbmx5LicpO1xuICB9XG4gIFxuICBjb25zdCBub3JtYWxpemVkID0gY2F0ZWdvcnkudG9Mb3dlckNhc2UoKTtcbiAgXG4gIGlmICghVkFMSURfQ0FURUdPUklFUy5pbmNsdWRlcyhub3JtYWxpemVkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjYXRlZ29yeS4gTXVzdCBiZSBvbmUgb2Y6ICR7VkFMSURfQ0FURUdPUklFUy5qb2luKCcsICcpfWApO1xuICB9XG4gIFxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBjb250ZW50IHNpemVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ29udGVudFNpemUoY29udGVudDogc3RyaW5nLCBtYXhTaXplOiBudW1iZXIgPSBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RIKTogdm9pZCB7XG4gIGlmICghY29udGVudCB8fCB0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRlbnQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgfVxuICBcbiAgY29uc3Qgc2l6ZUJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoY29udGVudCwgJ3V0ZjgnKTtcbiAgaWYgKHNpemVCeXRlcyA+IG1heFNpemUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvbnRlbnQgdG9vIGxhcmdlICgke3NpemVCeXRlc30gYnl0ZXMsIG1heCAke21heFNpemV9IGJ5dGVzKWApO1xuICB9XG59XG5cbi8qKlxuICogQ29tcHJlaGVuc2l2ZSBpbnB1dCB2YWxpZGF0aW9uIGJlZm9yZSBwYXR0ZXJuIG1hdGNoaW5nXG4gKiBWYWxpZGF0ZXMgYWxsIGNvbnRlbnQgdHlwZXMgd2l0aCBhcHByb3ByaWF0ZSBsaW1pdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250ZW50VmFsaWRhdGlvbk9wdGlvbnMge1xuICBtYXhDb250ZW50TGVuZ3RoPzogbnVtYmVyO1xuICBtYXhZYW1sTGVuZ3RoPzogbnVtYmVyO1xuICBtYXhNZXRhZGF0YUZpZWxkTGVuZ3RoPzogbnVtYmVyO1xuICBtYXhGaWxlU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXRMZW5ndGhzKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGNvbnRlbnRUeXBlOiAnZnVsbCcgfCAneWFtbCcgfCAnbWV0YWRhdGEnIHwgJ2ZpZWxkJyxcbiAgb3B0aW9uczogQ29udGVudFZhbGlkYXRpb25PcHRpb25zID0ge31cbik6IHZvaWQge1xuICBjb25zdCBsaW1pdHMgPSB7XG4gICAgbWF4Q29udGVudExlbmd0aDogb3B0aW9ucy5tYXhDb250ZW50TGVuZ3RoID8/IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgsXG4gICAgbWF4WWFtbExlbmd0aDogb3B0aW9ucy5tYXhZYW1sTGVuZ3RoID8/IFNFQ1VSSVRZX0xJTUlUUy5NQVhfWUFNTF9MRU5HVEgsXG4gICAgbWF4TWV0YWRhdGFGaWVsZExlbmd0aDogb3B0aW9ucy5tYXhNZXRhZGF0YUZpZWxkTGVuZ3RoID8/IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTUVUQURBVEFfRklFTERfTEVOR1RILFxuICAgIG1heEZpbGVTaXplOiBvcHRpb25zLm1heEZpbGVTaXplID8/IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRklMRV9TSVpFXG4gIH07XG5cbiAgLy8gVmFsaWRhdGUgYmFzZWQgb24gY29udGVudCB0eXBlXG4gIHN3aXRjaCAoY29udGVudFR5cGUpIHtcbiAgICBjYXNlICdmdWxsJzpcbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IGxpbWl0cy5tYXhDb250ZW50TGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ29udGVudCBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bGltaXRzLm1heENvbnRlbnRMZW5ndGh9IGNoYXJhY3RlcnMgKCR7Y29udGVudC5sZW5ndGh9IHByb3ZpZGVkKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ3lhbWwnOlxuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gbGltaXRzLm1heFlhbWxMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBZQU1MIGNvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke2xpbWl0cy5tYXhZYW1sTGVuZ3RofSBjaGFyYWN0ZXJzICgke2NvbnRlbnQubGVuZ3RofSBwcm92aWRlZClgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBcbiAgICBjYXNlICdtZXRhZGF0YSc6XG4gICAgICAvLyBGb3IgbWV0YWRhdGEsIGNoZWNrIG92ZXJhbGwgc2l6ZVxuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gbGltaXRzLm1heFlhbWxMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNZXRhZGF0YSBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bGltaXRzLm1heFlhbWxMZW5ndGh9IGNoYXJhY3RlcnMgKCR7Y29udGVudC5sZW5ndGh9IHByb3ZpZGVkKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIFxuICAgIGNhc2UgJ2ZpZWxkJzpcbiAgICAgIGlmIChjb250ZW50Lmxlbmd0aCA+IGxpbWl0cy5tYXhNZXRhZGF0YUZpZWxkTGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmllbGQgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke2xpbWl0cy5tYXhNZXRhZGF0YUZpZWxkTGVuZ3RofSBjaGFyYWN0ZXJzICgke2NvbnRlbnQubGVuZ3RofSBwcm92aWRlZClgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxufVxuXG4vKipcbiAqIEdlbmVyYWwgaW5wdXQgc2FuaXRpemF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUlucHV0KGlucHV0OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyID0gMTAwMCk6IHN0cmluZyB7XG4gIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBcbiAgLy8gUmVtb3ZlIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjaGFyYWN0ZXJzIGFuZCBsaW1pdCBsZW5ndGhcbiAgcmV0dXJuIGlucHV0XG4gICAgLnJlcGxhY2UoQ09OVFJPTF9DSEFSU19SRUdFWCwgJycpIC8vIFJlbW92ZSBjb250cm9sIGNoYXJhY3RlcnNcbiAgICAucmVwbGFjZShIVE1MX0RBTkdFUk9VU19SRUdFWCwgJycpIC8vIFJlbW92ZSBIVE1MLWRhbmdlcm91cyBjaGFyYWN0ZXJzXG4gICAgLnJlcGxhY2UoU0hFTExfTUVUQUNIQVJfUkVHRVgsICcnKSAvLyBSZW1vdmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMgKGV4cGFuZGVkKVxuICAgIC5yZXBsYWNlKFJUTF9aRVJPV0lEVEhfUkVHRVgsICcnKSAvLyBSZW1vdmUgUlRMIG92ZXJyaWRlIGFuZCB6ZXJvLXdpZHRoIGNoYXJzXG4gICAgLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpXG4gICAgLnRyaW0oKTtcbn0iXX0=
450
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5wdXRWYWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQscURBQXFEO0FBQ3JELHNFQUFzRTtBQUN0RSxNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO0FBQy9DLE1BQU0sb0JBQW9CLEdBQUcsVUFBVSxDQUFDO0FBQ3hDLE1BQU0sb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7QUFDbEQsTUFBTSxtQkFBbUIsR0FBRyxpQkFBaUIsQ0FBQztBQUM5QyxNQUFNLDBCQUEwQixHQUFHLG1CQUFtQixDQUFDO0FBQ3ZELE1BQU0sMkJBQTJCLEdBQUcsc0JBQXNCLENBQUM7QUFDM0QsTUFBTSxVQUFVLEdBQUcsOEJBQThCLENBQUM7QUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7QUFDdEMsTUFBTSxZQUFZLEdBQUcsb0JBQW9CLENBQUM7QUFDMUMsTUFBTSxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7QUFDeEMsTUFBTSx3QkFBd0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUNsRCxNQUFNLDJCQUEyQixHQUFHLE1BQU0sQ0FBQztBQUMzQyxNQUFNLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO0FBQ3RELE1BQU0sMkJB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RUQsMkRBQTJEO0lBQzNELE9BQU8sS0FBSztTQUNULE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQyw0QkFBNEI7U0FDN0QsT0FBTyxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUFDLG1DQUFtQztTQUNyRSxPQUFPLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDLENBQUMseUNBQXlDO1NBQzNFLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQywyQ0FBMkM7U0FDNUUsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUM7U0FDdkIsSUFBSSxFQUFFLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbnB1dCB2YWxpZGF0aW9uIGFuZCBzYW5pdGl6YXRpb24gZnVuY3Rpb25zXG4gKi9cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUywgVkFMSURBVElPTl9QQVRURVJOUyB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IFZBTElEX0NBVEVHT1JJRVMgfSBmcm9tICcuLi9jb25maWcvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IFJlZ2V4VmFsaWRhdG9yIH0gZnJvbSAnLi9yZWdleFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkVycm9yQ29kZXMgfSBmcm9tICcuLi91dGlscy9lcnJvckNvZGVzLmpzJztcblxuLy8gUHJlLWNvbXBpbGVkIHJlZ2V4IHBhdHRlcm5zIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Vcbi8vIFRoZXNlIHBhdHRlcm5zIGFyZSB1c2VkIHJlcGVhdGVkbHkgYW5kIGJlbmVmaXQgZnJvbSBwcmUtY29tcGlsYXRpb25cbmNvbnN0IENPTlRST0xfQ0hBUlNfUkVHRVggPSAvW1xceDAwLVxceDFGXFx4N0ZdL2c7XG5jb25zdCBIVE1MX0RBTkdFUk9VU19SRUdFWCA9IC9bPD4nXCImXS9nO1xuY29uc3QgU0hFTExfTUVUQUNIQVJfUkVHRVggPSAvWzsmfGAkKCkhXFxcXH4qP3t9XS9nO1xuY29uc3QgUlRMX1pFUk9XSURUSF9SRUdFWCA9IC9bXFx1MjAyRVxcdUZFRkZdL2c7XG5jb25zdCBDT0xMRUNUSU9OX1BBVEhfQ0hBUl9SRUdFWCA9IC9bYS16QS1aMC05XFwvXFwtXy5dLztcbmNvbnN0IFZBTElEX0NPTExFQ1RJT05fUEFUSF9SRUdFWCA9IC9eW2EtekEtWjAtOVxcL1xcLV8uXSokLztcbmNvbnN0IElQVjRfUkVHRVggPSAvXihcXGQrKVxcLihcXGQrKVxcLihcXGQrKVxcLihcXGQrKSQvO1xuY29uc3QgREVDSU1BTF9JUF9SRUdFWCA9IC9eXFxkezgsMTB9JC87XG5jb25zdCBIRVhfSVBfUkVHRVggPSAvXjB4WzAtOWEtZl17MSw4fSQvaTtcbmNvbnN0IE9DVEFMX0lQX1JFR0VYID0gL14wWzAtN117OCwxMX0kLztcbmNvbnN0IEZJTEVOQU1FX0RBTkdFUk9VU19SRUdFWCA9IC9bXFwvXFxcXDoqP1wiPD58XS9nO1xuY29uc3QgRklMRU5BTUVfTEVBRElOR19ET1RTX1JFR0VYID0gL15cXC4rLztcbmNvbnN0IFBBVEhfTk9STUFMSVpFX1JFR0VYID0gL15cXC97MSwxMDB9fFxcL3sxLDEwMH0kL2c7XG5jb25zdCBQQVRIX01VTFRJUExFX1NMQVNIRVNfUkVHRVggPSAvXFwvezEsMTAwfS9nO1xuY29uc3QgVVJMX1BMVVNfREVDT0RFX1JFR0VYID0gL1xcKy9nO1xuXG4vKipcbiAqIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb24gZm9yIE1DUCB0b29sc1xuICovXG5leHBvcnQgY2xhc3MgTUNQSW5wdXRWYWxpZGF0b3Ige1xuICAvKipcbiAgICogVmFsaWRhdGUgYSBwZXJzb25hIGlkZW50aWZpZXIgKG5hbWUgb3IgZmlsZW5hbWUpXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVQZXJzb25hSWRlbnRpZmllcihpZGVudGlmaWVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghaWRlbnRpZmllciB8fCB0eXBlb2YgaWRlbnRpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUGVyc29uYSBpZGVudGlmaWVyIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1BFUlNPTkFfSUQpO1xuICAgIH1cblxuICAgIGlmIChpZGVudGlmaWVyLmxlbmd0aCA+IDEwMCkge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdQZXJzb25hIGlkZW50aWZpZXIgdG9vIGxvbmcgKG1heCAxMDAgY2hhcmFjdGVycyknLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfTEVOR1RIKTtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyBwZXJzb25hIG5hbWVzIGFuZCBmaWxlbmFtZXNcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZUlucHV0KGlkZW50aWZpZXIsIDEwMCk7XG4gICAgaWYgKCFzYW5pdGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUGVyc29uYSBpZGVudGlmaWVyIGNvbnRhaW5zIG9ubHkgaW52YWxpZCBjaGFyYWN0ZXJzJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1BFUlNPTkFfSUQpO1xuICAgIH1cblxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgc2VhcmNoIHF1ZXJ5IGZvciBjb2xsZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVTZWFyY2hRdWVyeShxdWVyeTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXF1ZXJ5IHx8IHR5cGVvZiBxdWVyeSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignU2VhcmNoIHF1ZXJ5IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1NFQVJDSF9RVUVSWSk7XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignU2VhcmNoIHF1ZXJ5IHRvbyBzaG9ydCAobWluaW11bSAyIGNoYXJhY3RlcnMpJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDIwMCkge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdTZWFyY2ggcXVlcnkgdG9vIGxvbmcgKG1heCAyMDAgY2hhcmFjdGVycyknLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfTEVOR1RIKTtcbiAgICB9XG5cbiAgICAvLyBTYW5pdGl6ZSBidXQgcHJlc2VydmUgc3BhY2VzIGZvciBzZWFyY2hcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBxdWVyeVxuICAgICAgLnJlcGxhY2UoQ09OVFJPTF9DSEFSU19SRUdFWCwgJycpIC8vIFJlbW92ZSBjb250cm9sIGNoYXJhY3RlcnNcbiAgICAgIC5yZXBsYWNlKEhUTUxfREFOR0VST1VTX1JFR0VYLCAnJykgLy8gUmVtb3ZlIEhUTUwtZGFuZ2Vyb3VzIGNoYXJhY3RlcnNcbiAgICAgIC5yZXBsYWNlKFNIRUxMX01FVEFDSEFSX1JFR0VYLCAnJykgLy8gUmVtb3ZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIChleHBhbmRlZClcbiAgICAgIC5yZXBsYWNlKFJUTF9aRVJPV0lEVEhfUkVHRVgsICcnKSAvLyBSZW1vdmUgUlRMIG92ZXJyaWRlIGFuZCB6ZXJvLXdpZHRoIGNoYXJzXG4gICAgICAudHJpbSgpO1xuXG4gICAgaWYgKCFzYW5pdGl6ZWQpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignU2VhcmNoIHF1ZXJ5IGNvbnRhaW5zIG9ubHkgaW52YWxpZCBjaGFyYWN0ZXJzJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1NFQVJDSF9RVUVSWSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBjb2xsZWN0aW9uIHBhdGhcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZUNvbGxlY3Rpb25QYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFwYXRoIHx8IHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdDb2xsZWN0aW9uIHBhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfQ09MTEVDVElPTl9QQVRIKTtcbiAgICB9XG5cbiAgICBpZiAocGF0aC5sZW5ndGggPiA1MDApIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignQ29sbGVjdGlvbiBwYXRoIHRvbyBsb25nIChtYXggNTAwIGNoYXJhY3RlcnMpJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0xFTkdUSCk7XG4gICAgfVxuXG4gICAgLy8gR2l0SHViIEFQSSBwYXRocyBzaG91bGQgYmUgc2FmZSBmaWxlbmFtZSBwYXR0ZXJuc1xuICAgIC8vIFVzZSBzaW5nbGUgcmVnZXggdGVzdCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIChhdm9pZHMgTyhuKSBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIGNoZWNrKVxuICAgIGlmICghVkFMSURfQ09MTEVDVElPTl9QQVRIX1JFR0VYLnRlc3QocGF0aCkpIHtcbiAgICAgIC8vIE9ubHkgZG8gY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciBjaGVjayBpZiB2YWxpZGF0aW9uIGZhaWxzLCB0byBwcm92aWRlIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGFyID0gcGF0aFtpXTtcbiAgICAgICAgaWYgKCFDT0xMRUNUSU9OX1BBVEhfQ0hBUl9SRUdFWC50ZXN0KGNoYXIpKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBJbnZhbGlkIGNoYXJhY3RlciAnJHtjaGFyfScgaW4gY29sbGVjdGlvbiBwYXRoIGF0IHBvc2l0aW9uICR7aSArIDF9YCwgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0NIQVJBQ1RFUik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZhbGxiYWNrIGVycm9yIGlmIHdlIHNvbWVob3cgZG9uJ3QgZmluZCB0aGUgaW52YWxpZCBjaGFyYWN0ZXJcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignSW52YWxpZCBjaGFyYWN0ZXJzIGluIGNvbGxlY3Rpb24gcGF0aCcsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9DT0xMRUNUSU9OX1BBVEgpO1xuICAgIH1cblxuICAgIC8vIFByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgaW4gR2l0SHViIHBhdGhzIChjb21wcmVoZW5zaXZlIGNoZWNrKVxuICAgIGNvbnN0IHBhdGhMb3dlciA9IHBhdGgudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBlbmNvZGVkUGF0aCA9IGRlY29kZVVSSUNvbXBvbmVudChwYXRoLnJlcGxhY2UoVVJMX1BMVVNfREVDT0RFX1JFR0VYLCAnICcpKTsgLy8gRGVjb2RlIFVSTCBlbmNvZGluZ1xuICAgIFxuICAgIC8vIENoZWNrIGZvciB2YXJpb3VzIHBhdGggdHJhdmVyc2FsIHBhdHRlcm5zXG4gICAgY29uc3QgdHJhdmVyc2FsUGF0dGVybnMgPSBbXG4gICAgICAnLi4nLCAgICAgICAgICAvLyBCYXNpYyB0cmF2ZXJzYWxcbiAgICAgICcuLycsICAgICAgICAgIC8vIEN1cnJlbnQgZGlyZWN0b3J5XG4gICAgICAnLy4uLycsICAgICAgICAvLyBEaXJlY3RvcnkgdHJhdmVyc2FsIHdpdGggc2xhc2hlc1xuICAgICAgJ1xcXFwnLCAgICAgICAgICAvLyBCYWNrc2xhc2ggKFdpbmRvd3Mtc3R5bGUpXG4gICAgICAnJTJlJTJlJywgICAgICAvLyBVUkwtZW5jb2RlZCAuLlxuICAgICAgJyUyZSUyZSUyZicsICAgLy8gVVJMLWVuY29kZWQgLi4vXG4gICAgICAnJTJlJTJlJTVjJywgICAvLyBVUkwtZW5jb2RlZCAuLlxcXG4gICAgICAnJTI1MmUlMjUyZScsICAvLyBEb3VibGUgVVJMLWVuY29kZWQgLi5cbiAgICAgICcuLiUyZicsICAgICAgIC8vIE1peGVkIGVuY29kaW5nXG4gICAgICAnLi4lNWMnLCAgICAgICAvLyBNaXhlZCBlbmNvZGluZyB3aXRoIGJhY2tzbGFzaFxuICAgICAgJy4uLi4vJywgICAgICAgLy8gRG90ZG90IGJ5cGFzcyBhdHRlbXB0XG4gICAgICAnLi47LycsICAgICAgICAvLyBTZW1pY29sb24gYnlwYXNzIGF0dGVtcHRcbiAgICBdO1xuICAgIFxuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiB0cmF2ZXJzYWxQYXR0ZXJucykge1xuICAgICAgaWYgKHBhdGhMb3dlci5pbmNsdWRlcyhwYXR0ZXJuKSB8fCBlbmNvZGVkUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHBhdHRlcm4pKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUGF0aCB0cmF2ZXJzYWwgbm90IGFsbG93ZWQgaW4gY29sbGVjdGlvbiBwYXRoJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5QQVRIX1RSQVZFUlNBTCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgVVJMIGZvciBpbXBvcnQgb3BlcmF0aW9uc1xuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlSW1wb3J0VXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXVybCB8fCB0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdVUkwgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfVVJMKTtcbiAgICB9XG5cbiAgICBpZiAodXJsLmxlbmd0aCA+IDIwMDApIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignVVJMIHRvbyBsb25nIChtYXggMjAwMCBjaGFyYWN0ZXJzKScsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9MRU5HVEgpO1xuICAgIH1cblxuICAgIC8vIFJlamVjdCBwcm90b2NvbC1yZWxhdGl2ZSBVUkxzIHRoYXQgY291bGQgYnlwYXNzIHZhbGlkYXRpb25cbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8vJykpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUHJvdG9jb2wtcmVsYXRpdmUgVVJMcyBhcmUgbm90IGFsbG93ZWQnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfVVJMKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gRGVjb2RlIFVSTCB0byBwcmV2ZW50IGVuY29kaW5nLWJhc2VkIGJ5cGFzc2VzXG4gICAgICBsZXQgZGVjb2RlZFVybCA9IHVybDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlY29kZWRVcmwgPSBkZWNvZGVVUklDb21wb25lbnQodXJsKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBJZiBkZWNvZGluZyBmYWlscywgdXNlIG9yaWdpbmFsIFVSTFxuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKGRlY29kZWRVcmwpO1xuICAgICAgXG4gICAgICAvLyBQcm90b2NvbCB2YWxpZGF0aW9uXG4gICAgICBpZiAoIVsnaHR0cDonLCAnaHR0cHM6J10uaW5jbHVkZXMocGFyc2VkLnByb3RvY29sKSkge1xuICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ09ubHkgSFRUUChTKSBVUkxzIGFyZSBhbGxvd2VkJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1VSTCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVuaGFuY2VkIFNTUkYgcHJvdGVjdGlvbiB3aXRoIElETiBub3JtYWxpemF0aW9uXG4gICAgICBsZXQgaG9zdG5hbWUgPSBwYXJzZWQuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIElETiAoSW50ZXJuYXRpb25hbCBEb21haW4gTmFtZXMpIGJ5IGNvbnZlcnRpbmcgdG8gQVNDSUlcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGlkbk5vcm1hbGl6ZWQgPSBuZXcgVVJMKGBodHRwOi8vJHtob3N0bmFtZX1gKS5ob3N0bmFtZTtcbiAgICAgICAgaG9zdG5hbWUgPSBpZG5Ob3JtYWxpemVkO1xuICAgICAgfSBjYXRjaCAoaWRuRXJyb3IpIHtcbiAgICAgICAgLy8gSWYgSUROIGNvbnZlcnNpb24gZmFpbHMsIHJlamVjdCB0aGUgVVJMIGZvciBzZWN1cml0eVxuICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0ludmFsaWQgaG9zdG5hbWU6IElETiBjb252ZXJzaW9uIGZhaWxlZCAtIHBvdGVudGlhbGx5IG1hbGljaW91cyBkb21haW4gbmFtZScsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9VUkwpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBmb3IgcHJpdmF0ZSBJUHMgKG5vdyB3aXRoIElETi1ub3JtYWxpemVkIGhvc3RuYW1lKVxuICAgICAgaWYgKHRoaXMuaXNQcml2YXRlSVAoaG9zdG5hbWUpKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUHJpdmF0ZSBuZXR3b3JrIFVSTHMgYXJlIG5vdCBhbGxvd2VkJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1VSTCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEFkZGl0aW9uYWwgU1NSRiBjaGVja3MgZm9yIGVuY29kZWQgSVBzXG4gICAgICBpZiAodGhpcy5pc0VuY29kZWRQcml2YXRlSVAoaG9zdG5hbWUpKSB7XG4gICAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignRW5jb2RlZCBwcml2YXRlIG5ldHdvcmsgVVJMcyBhcmUgbm90IGFsbG93ZWQnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfVVJMKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVybDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgKGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ1ByaXZhdGUgbmV0d29yaycpIHx8IGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VuY29kZWQgcHJpdmF0ZScpKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBJbnZhbGlkIFVSTCBmb3JtYXQ6ICR7ZXJyb3JNZXNzYWdlfWAsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9VUkwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBleHBpcnkgZGF5cyBmb3Igc2hhcmluZ1xuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlRXhwaXJ5RGF5cyhkYXlzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0eXBlb2YgZGF5cyAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignRXhwaXJ5IGRheXMgbXVzdCBiZSBhIHZhbGlkIG51bWJlcicsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9OVU1CRVIpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoaXNOYU4oZGF5cykgfHwgIWlzRmluaXRlKGRheXMpKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0V4cGlyeSBkYXlzIG11c3QgYmUgYSB2YWxpZCBudW1iZXInLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfTlVNQkVSKTtcbiAgICB9XG5cbiAgICBpZiAoZGF5cyA8IDEgfHwgZGF5cyA+IDM2NSkge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdFeHBpcnkgZGF5cyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMzY1JywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1JBTkdFKTtcbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5mbG9vcihkYXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBib29sZWFuIGNvbmZpcm1hdGlvbiBwYXJhbWV0ZXJzXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVDb25maXJtYXRpb24oY29uZmlybTogYm9vbGVhbiwgb3BlcmF0aW9uTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBjb25maXJtICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgJHtvcGVyYXRpb25OYW1lfSBjb25maXJtYXRpb24gbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWVgLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfVFlQRSk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25maXJtKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoYCR7b3BlcmF0aW9uTmFtZX0gb3BlcmF0aW9uIHJlcXVpcmVzIGV4cGxpY2l0IGNvbmZpcm1hdGlvbiAodHJ1ZSlgLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLkNPTkZJUk1BVElPTl9SRVFVSVJFRCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpcm07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZmllbGQgbmFtZSBmb3IgZWRpdCBvcGVyYXRpb25zXG4gICAqL1xuICBzdGF0aWMgdmFsaWRhdGVFZGl0RmllbGQoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFmaWVsZCB8fCB0eXBlb2YgZmllbGQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0ZpZWxkIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLlJFUVVJUkVEX0ZJRUxEKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZEZpZWxkcyA9IFtcbiAgICAgICduYW1lJywgJ2Rlc2NyaXB0aW9uJywgJ2NhdGVnb3J5JywgJ2luc3RydWN0aW9ucycsIFxuICAgICAgJ3RyaWdnZXJzJywgJ3ZlcnNpb24nLCAnYXV0aG9yJywgJ3RhZ3MnXG4gICAgXTtcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWVsZCA9IGZpZWxkLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIGlmICghdmFsaWRGaWVsZHMuaW5jbHVkZXMobm9ybWFsaXplZEZpZWxkKSkge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBJbnZhbGlkIGZpZWxkIG5hbWUuIE11c3QgYmUgb25lIG9mOiAke3ZhbGlkRmllbGRzLmpvaW4oJywgJyl9YCwgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0lOUFVUKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZEZpZWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGhvc3RuYW1lIGlzIGEgcHJpdmF0ZSBJUCBhZGRyZXNzIChJUHY0IGFuZCBJUHY2KVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaXNQcml2YXRlSVAoaG9zdG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGZvciBsb2NhbGhvc3QgdmFyaWF0aW9uc1xuICAgIGlmIChbJ2xvY2FsaG9zdCcsICcxMjcuMC4wLjEnLCAnOjoxJ10uaW5jbHVkZXMoaG9zdG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgcHJpdmF0ZSBJUHY0IHJhbmdlc1xuICAgIGNvbnN0IGlwdjRNYXRjaCA9IGhvc3RuYW1lLm1hdGNoKElQVjRfUkVHRVgpO1xuICAgIFxuICAgIGlmIChpcHY0TWF0Y2gpIHtcbiAgICAgIGNvbnN0IFssIGEsIGIsIGMsIGRdID0gaXB2NE1hdGNoLm1hcChOdW1iZXIpO1xuICAgICAgXG4gICAgICAvLyAxMC4wLjAuMC84XG4gICAgICBpZiAoYSA9PT0gMTApIHJldHVybiB0cnVlO1xuICAgICAgXG4gICAgICAvLyAxNzIuMTYuMC4wLzEyXG4gICAgICBpZiAoYSA9PT0gMTcyICYmIGIgPj0gMTYgJiYgYiA8PSAzMSkgcmV0dXJuIHRydWU7XG4gICAgICBcbiAgICAgIC8vIDE5Mi4xNjguMC4wLzE2XG4gICAgICBpZiAoYSA9PT0gMTkyICYmIGIgPT09IDE2OCkgcmV0dXJuIHRydWU7XG4gICAgICBcbiAgICAgIC8vIDE2OS4yNTQuMC4wLzE2IChsaW5rLWxvY2FsKVxuICAgICAgaWYgKGEgPT09IDE2OSAmJiBiID09PSAyNTQpIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBwcml2YXRlIElQdjYgcmFuZ2VzXG4gICAgY29uc3QgaXB2Nkxvd2VyID0gaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICAvLyBmYzAwOjovNyAtIFVuaXF1ZSBMb2NhbCBBZGRyZXNzZXMgKFVMQSlcbiAgICBpZiAoaXB2Nkxvd2VyLnN0YXJ0c1dpdGgoJ2ZjJykgfHwgaXB2Nkxvd2VyLnN0YXJ0c1dpdGgoJ2ZkJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBcbiAgICAvLyBmZTgwOjovMTAgLSBMaW5rLUxvY2FsIEFkZHJlc3Nlc1xuICAgIC8vIElQdjYgbGluay1sb2NhbCBhZGRyZXNzZXMgYXJlIGZlODA6Oi8xMCwgbWVhbmluZyB0aGUgdmFsaWQgcmFuZ2UgaXMgZmU4MCB0aHJvdWdoIGZlYmZcbiAgICBjb25zdCBmZTgwUmFuZ2UgPSBwYXJzZUludChpcHY2TG93ZXIuc3Vic3RyaW5nKDAsIDQpLCAxNik7XG4gICAgaWYgKGZlODBSYW5nZSA+PSAweGZlODAgJiYgZmU4MFJhbmdlIDw9IDB4ZmViZikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgSVB2NiBsb2NhbGhvc3QgZm9ybWF0c1xuICAgIGlmIChbJzo6MScsICcwOjA6MDowOjA6MDowOjEnXS5pbmNsdWRlcyhpcHY2TG93ZXIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGVuY29kZWQgcHJpdmF0ZSBJUCBhZGRyZXNzZXMgdGhhdCBjb3VsZCBieXBhc3MgYmFzaWMgZGV0ZWN0aW9uXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBpc0VuY29kZWRQcml2YXRlSVAoaG9zdG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGZvciBkZWNpbWFsIGVuY29kZWQgSVBzIChlLmcuLCAyMTMwNzA2NDMzID0gMTI3LjAuMC4xKVxuICAgIGlmIChERUNJTUFMX0lQX1JFR0VYLnRlc3QoaG9zdG5hbWUpKSB7XG4gICAgICBjb25zdCBudW0gPSBwYXJzZUludChob3N0bmFtZSwgMTApO1xuICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8PSA0Mjk0OTY3Mjk1KSB7IC8vIFZhbGlkIElQdjQgcmFuZ2VcbiAgICAgICAgLy8gQ29udmVydCB0byBJUCBmb3JtYXQgYW5kIGNoZWNrIGlmIHByaXZhdGVcbiAgICAgICAgY29uc3QgaXAgPSBbKG51bSA+Pj4gMjQpICYgMjU1LCAobnVtID4+PiAxNikgJiAyNTUsIChudW0gPj4+IDgpICYgMjU1LCBudW0gJiAyNTVdLmpvaW4oJy4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNQcml2YXRlSVAoaXApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgaGV4IGVuY29kZWQgSVBzIChlLmcuLCAweDdmMDAwMDAxID0gMTI3LjAuMC4xKVxuICAgIGlmIChIRVhfSVBfUkVHRVgudGVzdChob3N0bmFtZSkpIHtcbiAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KGhvc3RuYW1lLCAxNik7XG4gICAgICBpZiAobnVtID49IDAgJiYgbnVtIDw9IDQyOTQ5NjcyOTUpIHtcbiAgICAgICAgY29uc3QgaXAgPSBbKG51bSA+Pj4gMjQpICYgMjU1LCAobnVtID4+PiAxNikgJiAyNTUsIChudW0gPj4+IDgpICYgMjU1LCBudW0gJiAyNTVdLmpvaW4oJy4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNQcml2YXRlSVAoaXApO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3Igb2N0YWwgZW5jb2RlZCBJUHMgKGUuZy4sIDAxNzcwMDAwMDAwMSA9IDEyNy4wLjAuMSlcbiAgICBpZiAoT0NUQUxfSVBfUkVHRVgudGVzdChob3N0bmFtZSkpIHtcbiAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KGhvc3RuYW1lLCA4KTtcbiAgICAgIGlmIChudW0gPj0gMCAmJiBudW0gPD0gNDI5NDk2NzI5NSkge1xuICAgICAgICBjb25zdCBpcCA9IFsobnVtID4+PiAyNCkgJiAyNTUsIChudW0gPj4+IDE2KSAmIDI1NSwgKG51bSA+Pj4gOCkgJiAyNTUsIG51bSAmIDI1NV0uam9pbignLicpO1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ByaXZhdGVJUChpcCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhIGZpbGVuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWZpbGVuYW1lIHx8IHR5cGVvZiBmaWxlbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0ZpbGVuYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0ZJTEVOQU1FKTtcbiAgfVxuICBcbiAgaWYgKGZpbGVuYW1lLmxlbmd0aCA+IFNFQ1VSSVRZX0xJTUlUUy5NQVhfRklMRU5BTUVfTEVOR1RIKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBGaWxlbmFtZSB0b28gbG9uZyAobWF4ICR7U0VDVVJJVFlfTElNSVRTLk1BWF9GSUxFTkFNRV9MRU5HVEh9IGNoYXJhY3RlcnMpYCwgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0xFTkdUSCk7XG4gIH1cbiAgXG4gIC8vIFJlbW92ZSBhbnkgcGF0aCBzZXBhcmF0b3JzIGFuZCBkYW5nZXJvdXMgY2hhcmFjdGVyc1xuICBjb25zdCBzYW5pdGl6ZWQgPSBmaWxlbmFtZS5yZXBsYWNlKEZJTEVOQU1FX0RBTkdFUk9VU19SRUdFWCwgJycpLnJlcGxhY2UoRklMRU5BTUVfTEVBRElOR19ET1RTX1JFR0VYLCAnJyk7XG4gIFxuICBpZiAoIVJlZ2V4VmFsaWRhdG9yLnZhbGlkYXRlKHNhbml0aXplZCwgVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX0ZJTEVOQU1FLCB7IG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9GSUxFTkFNRV9MRU5HVEggfSkpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0ludmFsaWQgZmlsZW5hbWUgZm9ybWF0LiBVc2UgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBhbmQgZG90cyBvbmx5LicsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9GSUxFTkFNRSk7XG4gIH1cbiAgXG4gIHJldHVybiBzYW5pdGl6ZWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIHNhbml0aXplIGEgcGF0aFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVQYXRoKGlucHV0UGF0aDogc3RyaW5nLCBiYXNlRGlyPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFpbnB1dFBhdGggfHwgdHlwZW9mIGlucHV0UGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ1BhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfUEFUSCk7XG4gIH1cbiAgXG4gIC8vIElmIGJhc2VEaXIgaXMgcHJvdmlkZWQgYW5kIGlucHV0UGF0aCBpcyBhYnNvbHV0ZSwgcmVqZWN0IGl0XG4gIC8vIENoZWNrIGJvdGggVW5peC1zdHlsZSBhbmQgV2luZG93cy1zdHlsZSBhYnNvbHV0ZSBwYXRocyBmb3IgY3Jvc3MtcGxhdGZvcm0gc2VjdXJpdHlcbiAgY29uc3QgaXNVbml4QWJzb2x1dGUgPSBwYXRoLmlzQWJzb2x1dGUoaW5wdXRQYXRoKTtcbiAgY29uc3QgaXNXaW5kb3dzQWJzb2x1dGUgPSAvXlthLXpBLVpdOltcXFxcL10vLnRlc3QoaW5wdXRQYXRoKTtcbiAgXG4gIGlmIChiYXNlRGlyICYmIChpc1VuaXhBYnNvbHV0ZSB8fCBpc1dpbmRvd3NBYnNvbHV0ZSkpIHtcbiAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoJ0Fic29sdXRlIHBhdGhzIG5vdCBhbGxvd2VkIHdoZW4gYmFzZSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1BBVEgpO1xuICB9XG4gIFxuICAvLyBSZW1vdmUgbGVhZGluZy90cmFpbGluZyBzbGFzaGVzIGFuZCBub3JtYWxpemVcbiAgLy8gTGVuZ3RoIGxpbWl0cyBhZGRlZCB0byBwcmV2ZW50IFJlRG9TIGF0dGFja3NcbiAgLy8gV0lORE9XUyBGSVg6IENvbnZlcnQgYmFja3NsYXNoZXMgdG8gZm9yd2FyZCBzbGFzaGVzIGZvciBjcm9zcy1wbGF0Zm9ybSBjb21wYXRpYmlsaXR5XG4gIGxldCBub3JtYWxpemVkID0gaW5wdXRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgXG4gIC8vIEZJWDogUHJlc2VydmUgbGVhZGluZyBzbGFzaCBmb3IgYWJzb2x1dGUgcGF0aHNcbiAgY29uc3QgaXNBYnNvbHV0ZSA9IG5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnLycpIHx8IGlzV2luZG93c0Fic29sdXRlO1xuICBcbiAgLy8gUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgYW5kIG5vcm1hbGl6ZSBtdWx0aXBsZSBzbGFzaGVzXG4gIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoL1xcL3sxLDEwMH0kL2csICcnKS5yZXBsYWNlKC9cXC97MiwxMDB9L2csICcvJyk7XG4gIFxuICAvLyBQcmVzZXJ2ZSB0aGUgbGVhZGluZyBzbGFzaCBpZiBpdCB3YXMgYW4gYWJzb2x1dGUgcGF0aFxuICBpZiAoaXNBYnNvbHV0ZSAmJiAhbm9ybWFsaXplZC5zdGFydHNXaXRoKCcvJykgJiYgIWlzV2luZG93c0Fic29sdXRlKSB7XG4gICAgbm9ybWFsaXplZCA9ICcvJyArIG5vcm1hbGl6ZWQ7XG4gIH1cbiAgXG4gIGlmICghVkFMSURBVElPTl9QQVRURVJOUy5TQUZFX1BBVEgudGVzdChub3JtYWxpemVkKSkge1xuICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignSW52YWxpZCBwYXRoIGZvcm1hdC4gVXNlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cywgYW5kIGZvcndhcmQgc2xhc2hlcyBvbmx5LicsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9QQVRIKTtcbiAgfVxuICBcbiAgLy8gQ2hlY2sgZm9yIHBhdGggdHJhdmVyc2FsIGF0dGVtcHRzXG4gIGlmIChub3JtYWxpemVkLmluY2x1ZGVzKCcuLicpIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoJy4vJykgfHwgbm9ybWFsaXplZC5pbmNsdWRlcygnLy4nKSkge1xuICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignUGF0aCB0cmF2ZXJzYWwgbm90IGFsbG93ZWQnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLlBBVEhfVFJBVkVSU0FMKTtcbiAgfVxuICBcbiAgLy8gVmFsaWRhdGUgcGF0aCBkZXB0aFxuICBjb25zdCBkZXB0aCA9IG5vcm1hbGl6ZWQuc3BsaXQoJy8nKS5sZW5ndGg7XG4gIGlmIChkZXB0aCA+IFNFQ1VSSVRZX0xJTUlUUy5NQVhfUEFUSF9ERVBUSCkge1xuICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcihgUGF0aCB0b28gZGVlcCAobWF4ICR7U0VDVVJJVFlfTElNSVRTLk1BWF9QQVRIX0RFUFRIfSBsZXZlbHMpYCwgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX1BBVEgpO1xuICB9XG4gIFxuICAvLyBJZiBiYXNlRGlyIHByb3ZpZGVkLCBlbnN1cmUgcGF0aCBpcyB3aXRoaW4gaXRcbiAgaWYgKGJhc2VEaXIpIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUoYmFzZURpciwgbm9ybWFsaXplZCk7XG4gICAgY29uc3QgcmVzb2x2ZWRCYXNlID0gcGF0aC5yZXNvbHZlKGJhc2VEaXIpO1xuICAgIFxuICAgIGlmICghcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgocmVzb2x2ZWRCYXNlKSkge1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdQYXRoIHRyYXZlcnNhbCBhdHRlbXB0IGRldGVjdGVkJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5QQVRIX1RSQVZFUlNBTCk7XG4gICAgfVxuICB9XG4gIFxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgYSB1c2VybmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVVc2VybmFtZSh1c2VybmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCF1c2VybmFtZSB8fCB0eXBlb2YgdXNlcm5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdVc2VybmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuUkVRVUlSRURfRklFTEQpO1xuICB9XG4gIFxuICBpZiAoIVZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9VU0VSTkFNRS50ZXN0KHVzZXJuYW1lKSkge1xuICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignSW52YWxpZCB1c2VybmFtZSBmb3JtYXQuIFVzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGFuZCBkb3RzIG9ubHkuJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0ZPUk1BVCk7XG4gIH1cbiAgXG4gIHJldHVybiB1c2VybmFtZS50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgY2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQ2F0ZWdvcnkoY2F0ZWdvcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghY2F0ZWdvcnkgfHwgdHlwZW9mIGNhdGVnb3J5ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignQ2F0ZWdvcnkgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLklOVkFMSURfQ0FURUdPUlkpO1xuICB9XG4gIFxuICBpZiAoIVJlZ2V4VmFsaWRhdG9yLnZhbGlkYXRlKGNhdGVnb3J5LCBWQUxJREFUSU9OX1BBVFRFUk5TLlNBRkVfQ0FURUdPUlksIHsgbWF4TGVuZ3RoOiA1MCB9KSkge1xuICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignSW52YWxpZCBjYXRlZ29yeSBmb3JtYXQuIFVzZSBhbHBoYWJldGljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcyBvbmx5LicsIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUiwgVmFsaWRhdGlvbkVycm9yQ29kZXMuSU5WQUxJRF9DQVRFR09SWSk7XG4gIH1cbiAgXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBjYXRlZ29yeS50b0xvd2VyQ2FzZSgpO1xuICBcbiAgaWYgKCFWQUxJRF9DQVRFR09SSUVTLmluY2x1ZGVzKG5vcm1hbGl6ZWQpKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBJbnZhbGlkIGNhdGVnb3J5LiBNdXN0IGJlIG9uZSBvZjogJHtWQUxJRF9DQVRFR09SSUVTLmpvaW4oJywgJyl9YCwgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5JTlZBTElEX0NBVEVHT1JZKTtcbiAgfVxuICBcbiAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgY29udGVudCBzaXplXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbnRlbnRTaXplKGNvbnRlbnQ6IHN0cmluZywgbWF4U2l6ZTogbnVtYmVyID0gU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCk6IHZvaWQge1xuICBpZiAoIWNvbnRlbnQgfHwgdHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKCdDb250ZW50IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLCBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5SRVFVSVJFRF9GSUVMRCk7XG4gIH1cbiAgXG4gIGNvbnN0IHNpemVCeXRlcyA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGNvbnRlbnQsICd1dGY4Jyk7XG4gIGlmIChzaXplQnl0ZXMgPiBtYXhTaXplKSB7XG4gICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKGBDb250ZW50IHRvbyBsYXJnZSAoJHtzaXplQnl0ZXN9IGJ5dGVzLCBtYXggJHttYXhTaXplfSBieXRlcylgLCBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsIFZhbGlkYXRpb25FcnJvckNvZGVzLkNPTlRFTlRfVE9PX0xBUkdFKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXByZWhlbnNpdmUgaW5wdXQgdmFsaWRhdGlvbiBiZWZvcmUgcGF0dGVybiBtYXRjaGluZ1xuICogVmFsaWRhdGVzIGFsbCBjb250ZW50IHR5cGVzIHdpdGggYXBwcm9wcmlhdGUgbGltaXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGVudFZhbGlkYXRpb25PcHRpb25zIHtcbiAgbWF4Q29udGVudExlbmd0aD86IG51bWJlcjtcbiAgbWF4WWFtbExlbmd0aD86IG51bWJlcjtcbiAgbWF4TWV0YWRhdGFGaWVsZExlbmd0aD86IG51bWJlcjtcbiAgbWF4RmlsZVNpemU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUlucHV0TGVuZ3RocyhcbiAgY29udGVudDogc3RyaW5nLFxuICBjb250ZW50VHlwZTogJ2Z1bGwnIHwgJ3lhbWwnIHwgJ21ldGFkYXRhJyB8ICdmaWVsZCcsXG4gIG9wdGlvbnM6IENvbnRlbnRWYWxpZGF0aW9uT3B0aW9ucyA9IHt9XG4pOiB2b2lkIHtcbiAgY29uc3QgbGltaXRzID0ge1xuICAgIG1heENvbnRlbnRMZW5ndGg6IG9wdGlvbnMubWF4Q29udGVudExlbmd0aCA/PyBTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RILFxuICAgIG1heFlhbWxMZW5ndGg6IG9wdGlvbnMubWF4WWFtbExlbmd0aCA/PyBTRUNVUklUWV9MSU1JVFMuTUFYX1lBTUxfTEVOR1RILFxuICAgIG1heE1ldGFkYXRhRmllbGRMZW5ndGg6IG9wdGlvbnMubWF4TWV0YWRhdGFGaWVsZExlbmd0aCA/PyBTRUNVUklUWV9MSU1JVFMuTUFYX01FVEFEQVRBX0ZJRUxEX0xFTkdUSCxcbiAgICBtYXhGaWxlU2l6ZTogb3B0aW9ucy5tYXhGaWxlU2l6ZSA/PyBTRUNVUklUWV9MSU1JVFMuTUFYX0ZJTEVfU0laRVxuICB9O1xuXG4gIC8vIFZhbGlkYXRlIGJhc2VkIG9uIGNvbnRlbnQgdHlwZVxuICBzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7XG4gICAgY2FzZSAnZnVsbCc6XG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBsaW1pdHMubWF4Q29udGVudExlbmd0aCkge1xuICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgYENvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke2xpbWl0cy5tYXhDb250ZW50TGVuZ3RofSBjaGFyYWN0ZXJzICgke2NvbnRlbnQubGVuZ3RofSBwcm92aWRlZClgLFxuICAgICAgICAgIEVycm9yQ2F0ZWdvcnkuVkFMSURBVElPTl9FUlJPUixcbiAgICAgICAgICBWYWxpZGF0aW9uRXJyb3JDb2Rlcy5DT05URU5UX1RPT19MQVJHRVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgXG4gICAgY2FzZSAneWFtbCc6XG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBsaW1pdHMubWF4WWFtbExlbmd0aCkge1xuICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgYFlBTUwgY29udGVudCBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bGltaXRzLm1heFlhbWxMZW5ndGh9IGNoYXJhY3RlcnMgKCR7Y29udGVudC5sZW5ndGh9IHByb3ZpZGVkKWAsXG4gICAgICAgICAgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLFxuICAgICAgICAgIFZhbGlkYXRpb25FcnJvckNvZGVzLkNPTlRFTlRfVE9PX0xBUkdFXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBcbiAgICBjYXNlICdtZXRhZGF0YSc6XG4gICAgICAvLyBGb3IgbWV0YWRhdGEsIGNoZWNrIG92ZXJhbGwgc2l6ZVxuICAgICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gbGltaXRzLm1heFlhbWxMZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLmNyZWF0ZUVycm9yKFxuICAgICAgICAgIGBNZXRhZGF0YSBleGNlZWRzIG1heGltdW0gbGVuZ3RoIG9mICR7bGltaXRzLm1heFlhbWxMZW5ndGh9IGNoYXJhY3RlcnMgKCR7Y29udGVudC5sZW5ndGh9IHByb3ZpZGVkKWAsXG4gICAgICAgICAgRXJyb3JDYXRlZ29yeS5WQUxJREFUSU9OX0VSUk9SLFxuICAgICAgICAgIFZhbGlkYXRpb25FcnJvckNvZGVzLkNPTlRFTlRfVE9PX0xBUkdFXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBcbiAgICBjYXNlICdmaWVsZCc6XG4gICAgICBpZiAoY29udGVudC5sZW5ndGggPiBsaW1pdHMubWF4TWV0YWRhdGFGaWVsZExlbmd0aCkge1xuICAgICAgICB0aHJvdyBFcnJvckhhbmRsZXIuY3JlYXRlRXJyb3IoXG4gICAgICAgICAgYEZpZWxkIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHtsaW1pdHMubWF4TWV0YWRhdGFGaWVsZExlbmd0aH0gY2hhcmFjdGVycyAoJHtjb250ZW50Lmxlbmd0aH0gcHJvdmlkZWQpYCxcbiAgICAgICAgICBFcnJvckNhdGVnb3J5LlZBTElEQVRJT05fRVJST1IsXG4gICAgICAgICAgVmFsaWRhdGlvbkVycm9yQ29kZXMuQ09OVEVOVF9UT09fTEFSR0VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhbCBpbnB1dCBzYW5pdGl6YXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplSW5wdXQoaW5wdXQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIgPSAxMDAwKTogc3RyaW5nIHtcbiAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIFxuICAvLyBSZW1vdmUgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNoYXJhY3RlcnMgYW5kIGxpbWl0IGxlbmd0aFxuICByZXR1cm4gaW5wdXRcbiAgICAucmVwbGFjZShDT05UUk9MX0NIQVJTX1JFR0VYLCAnJykgLy8gUmVtb3ZlIGNvbnRyb2wgY2hhcmFjdGVyc1xuICAgIC5yZXBsYWNlKEhUTUxfREFOR0VST1VTX1JFR0VYLCAnJykgLy8gUmVtb3ZlIEhUTUwtZGFuZ2Vyb3VzIGNoYXJhY3RlcnNcbiAgICAucmVwbGFjZShTSEVMTF9NRVRBQ0hBUl9SRUdFWCwgJycpIC8vIFJlbW92ZSBzaGVsbCBtZXRhY2hhcmFjdGVycyAoZXhwYW5kZWQpXG4gICAgLnJlcGxhY2UoUlRMX1pFUk9XSURUSF9SRUdFWCwgJycpIC8vIFJlbW92ZSBSVEwgb3ZlcnJpZGUgYW5kIHplcm8td2lkdGggY2hhcnNcbiAgICAuc3Vic3RyaW5nKDAsIG1heExlbmd0aClcbiAgICAudHJpbSgpO1xufSJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"SecurityAuditor.d.ts","sourceRoot":"","sources":["../../../src/security/audit/SecurityAuditor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,mBAAmB,EAEnB,UAAU,EAIX,MAAM,YAAY,CAAC;AAWpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,YAAY,CAAuC;gBAE/C,MAAM,EAAE,mBAAmB;IAMvC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACG,KAAK,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IA6CrE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkE1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;OAEG;YACW,eAAe;IA6B7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,mBAAmB;CAmC/C"}
1
+ {"version":3,"file":"SecurityAuditor.d.ts","sourceRoot":"","sources":["../../../src/security/audit/SecurityAuditor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EACV,mBAAmB,EAEnB,UAAU,EAIX,MAAM,YAAY,CAAC;AAYpB,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,YAAY,CAAuC;gBAE/C,MAAM,EAAE,mBAAmB;IAMvC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACG,KAAK,CAAC,WAAW,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IA6CrE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqE1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;OAEG;YACW,eAAe;IA+B7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;OAEG;IACH,MAAM,CAAC,gBAAgB,IAAI,mBAAmB;CAmC/C"}