@dollhousemcp/mcp-server 2.0.0-rc.5 → 2.0.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 (256) hide show
  1. package/CHANGELOG.md +54 -17
  2. package/README.github.md +2 -2
  3. package/README.md +2 -2
  4. package/README.md.backup +284 -224
  5. package/README.npm.md +2 -2
  6. package/dist/cache/LRUCache.d.ts +3 -0
  7. package/dist/cache/LRUCache.d.ts.map +1 -1
  8. package/dist/cache/LRUCache.js +36 -26
  9. package/dist/config/env.d.ts +14 -4
  10. package/dist/config/env.d.ts.map +1 -1
  11. package/dist/config/env.js +20 -6
  12. package/dist/di/Container.d.ts +21 -0
  13. package/dist/di/Container.d.ts.map +1 -1
  14. package/dist/di/Container.js +250 -53
  15. package/dist/elements/BaseElement.d.ts.map +1 -1
  16. package/dist/elements/BaseElement.js +5 -10
  17. package/dist/elements/base/BaseElementManager.d.ts +22 -0
  18. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  19. package/dist/elements/base/BaseElementManager.js +47 -7
  20. package/dist/elements/memories/Memory.d.ts +1 -0
  21. package/dist/elements/memories/Memory.d.ts.map +1 -1
  22. package/dist/elements/memories/Memory.js +12 -8
  23. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  24. package/dist/elements/memories/MemoryManager.js +23 -42
  25. package/dist/elements/memories/MemorySearchIndex.js +2 -2
  26. package/dist/generated/version.d.ts +2 -2
  27. package/dist/generated/version.d.ts.map +1 -1
  28. package/dist/generated/version.js +3 -3
  29. package/dist/handlers/EnhancedIndexHandler.js +6 -6
  30. package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
  31. package/dist/handlers/element-crud/editElement.js +39 -18
  32. package/dist/handlers/element-crud/helpers.d.ts.map +1 -1
  33. package/dist/handlers/element-crud/helpers.js +30 -3
  34. package/dist/handlers/element-crud/listElements.d.ts +2 -0
  35. package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
  36. package/dist/handlers/element-crud/listElements.js +3 -1
  37. package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
  38. package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
  39. package/dist/handlers/mcp-aql/GatekeeperTypes.d.ts +4 -0
  40. package/dist/handlers/mcp-aql/GatekeeperTypes.d.ts.map +1 -1
  41. package/dist/handlers/mcp-aql/GatekeeperTypes.js +1 -1
  42. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +33 -0
  43. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  44. package/dist/handlers/mcp-aql/MCPAQLHandler.js +232 -23
  45. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  46. package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
  47. package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
  48. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  49. package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
  50. package/dist/handlers/mcp-aql/UnifiedEndpoint.d.ts.map +1 -1
  51. package/dist/handlers/mcp-aql/UnifiedEndpoint.js +4 -3
  52. package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
  53. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
  54. package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
  55. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts +17 -0
  56. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
  57. package/dist/handlers/mcp-aql/policies/ElementPolicies.js +91 -1
  58. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts +5 -3
  59. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  60. package/dist/handlers/mcp-aql/policies/ToolClassification.js +56 -2
  61. package/dist/handlers/mcp-aql/types.d.ts +22 -0
  62. package/dist/handlers/mcp-aql/types.d.ts.map +1 -1
  63. package/dist/handlers/mcp-aql/types.js +47 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +3 -3
  66. package/dist/logging/LogHooks.js +11 -11
  67. package/dist/logging/LogManager.d.ts +0 -2
  68. package/dist/logging/LogManager.d.ts.map +1 -1
  69. package/dist/logging/LogManager.js +1 -3
  70. package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
  71. package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
  72. package/dist/logging/sinks/MemoryLogSink.js +12 -3
  73. package/dist/logging/types.d.ts +0 -2
  74. package/dist/logging/types.d.ts.map +1 -1
  75. package/dist/logging/types.js +1 -1
  76. package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
  77. package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
  78. package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
  79. package/dist/metrics/MetricsManager.d.ts +47 -0
  80. package/dist/metrics/MetricsManager.d.ts.map +1 -0
  81. package/dist/metrics/MetricsManager.js +232 -0
  82. package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
  83. package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
  84. package/dist/metrics/OperationMetricsTracker.js +53 -0
  85. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
  86. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
  87. package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
  88. package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
  89. package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
  90. package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
  91. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
  92. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
  93. package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
  94. package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
  95. package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
  96. package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
  97. package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
  98. package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
  99. package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
  100. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
  101. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
  102. package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
  103. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
  104. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
  105. package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
  106. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
  107. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
  108. package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
  109. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
  110. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
  111. package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
  112. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
  113. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
  114. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
  115. package/dist/metrics/collectors/index.d.ts +11 -0
  116. package/dist/metrics/collectors/index.d.ts.map +1 -0
  117. package/dist/metrics/collectors/index.js +11 -0
  118. package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
  119. package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
  120. package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
  121. package/dist/metrics/types.d.ts +98 -0
  122. package/dist/metrics/types.d.ts.map +1 -0
  123. package/dist/metrics/types.js +24 -0
  124. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  125. package/dist/portfolio/DefaultElementProvider.js +1 -7
  126. package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
  127. package/dist/portfolio/EnhancedIndexManager.js +18 -18
  128. package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
  129. package/dist/portfolio/NLPScoringManager.js +5 -9
  130. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  131. package/dist/portfolio/RelationshipManager.js +2 -2
  132. package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
  133. package/dist/portfolio/VerbTriggerManager.js +5 -19
  134. package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
  135. package/dist/portfolio/config/IndexConfig.js +1 -12
  136. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
  137. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
  138. package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
  139. package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
  140. package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
  141. package/dist/portfolio/types/RelationshipTypes.js +3 -17
  142. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  143. package/dist/security/audit/config/suppressions.js +36 -8
  144. package/dist/security/constants.d.ts.map +1 -1
  145. package/dist/security/constants.js +10 -6
  146. package/dist/security/fileLockManager.d.ts.map +1 -1
  147. package/dist/security/fileLockManager.js +8 -6
  148. package/dist/security/secureYamlParser.d.ts.map +1 -1
  149. package/dist/security/secureYamlParser.js +1 -13
  150. package/dist/security/securityMonitor.d.ts +2 -1
  151. package/dist/security/securityMonitor.d.ts.map +1 -1
  152. package/dist/security/securityMonitor.js +14 -3
  153. package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
  154. package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
  155. package/dist/security/telemetry/SecurityTelemetry.js +30 -2
  156. package/dist/security/tokenManager.d.ts +3 -0
  157. package/dist/security/tokenManager.d.ts.map +1 -1
  158. package/dist/security/tokenManager.js +13 -5
  159. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  160. package/dist/security/validation/BackgroundValidator.js +7 -7
  161. package/dist/server/startup.d.ts.map +1 -1
  162. package/dist/server/startup.js +8 -24
  163. package/dist/server/tools/MCPAQLTools.js +8 -1
  164. package/dist/services/ActivationStore.d.ts.map +1 -1
  165. package/dist/services/ActivationStore.js +9 -3
  166. package/dist/services/FileWatchService.d.ts +1 -0
  167. package/dist/services/FileWatchService.d.ts.map +1 -1
  168. package/dist/services/FileWatchService.js +83 -48
  169. package/dist/services/MetadataService.d.ts.map +1 -1
  170. package/dist/services/MetadataService.js +7 -2
  171. package/dist/services/PolicyExportService.d.ts.map +1 -1
  172. package/dist/services/PolicyExportService.js +8 -1
  173. package/dist/services/query/ElementQueryService.d.ts.map +1 -1
  174. package/dist/services/query/ElementQueryService.js +1 -41
  175. package/dist/services/query/PaginationService.d.ts.map +1 -1
  176. package/dist/services/query/PaginationService.js +1 -14
  177. package/dist/services/query/SortService.d.ts.map +1 -1
  178. package/dist/services/query/SortService.js +1 -6
  179. package/dist/services/validation/ValidationService.d.ts.map +1 -1
  180. package/dist/services/validation/ValidationService.js +3 -8
  181. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  182. package/dist/storage/ElementStorageLayer.js +5 -2
  183. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  184. package/dist/storage/MemoryStorageLayer.js +5 -2
  185. package/dist/telemetry/OperationalTelemetry.js +2 -2
  186. package/dist/utils/EventDeduplicator.d.ts +44 -0
  187. package/dist/utils/EventDeduplicator.d.ts.map +1 -0
  188. package/dist/utils/EventDeduplicator.js +93 -0
  189. package/dist/utils/FileLock.d.ts.map +1 -1
  190. package/dist/utils/FileLock.js +1 -9
  191. package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
  192. package/dist/utils/PerformanceMonitor.js +5 -5
  193. package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
  194. package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
  195. package/dist/utils/SlidingWindowRateLimiter.js +23 -0
  196. package/dist/web/console/IngestRoutes.d.ts +84 -0
  197. package/dist/web/console/IngestRoutes.d.ts.map +1 -0
  198. package/dist/web/console/IngestRoutes.js +252 -0
  199. package/dist/web/console/LeaderElection.d.ts +89 -0
  200. package/dist/web/console/LeaderElection.d.ts.map +1 -0
  201. package/dist/web/console/LeaderElection.js +205 -0
  202. package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
  203. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
  204. package/dist/web/console/LeaderForwardingSink.js +197 -0
  205. package/dist/web/console/SessionNames.d.ts +46 -0
  206. package/dist/web/console/SessionNames.d.ts.map +1 -0
  207. package/dist/web/console/SessionNames.js +257 -0
  208. package/dist/web/console/UnifiedConsole.d.ts +64 -0
  209. package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
  210. package/dist/web/console/UnifiedConsole.js +119 -0
  211. package/dist/web/contentPipeline.d.ts +58 -0
  212. package/dist/web/contentPipeline.d.ts.map +1 -0
  213. package/dist/web/contentPipeline.js +112 -0
  214. package/dist/web/portDiscovery.d.ts +58 -0
  215. package/dist/web/portDiscovery.d.ts.map +1 -0
  216. package/dist/web/portDiscovery.js +143 -0
  217. package/dist/web/public/app.js +148 -60
  218. package/dist/web/public/logs.js +638 -0
  219. package/dist/web/public/metrics.js +682 -0
  220. package/dist/web/public/permissions.js +394 -0
  221. package/dist/web/public/sessions.js +369 -0
  222. package/dist/web/routes/healthRoutes.d.ts +16 -0
  223. package/dist/web/routes/healthRoutes.d.ts.map +1 -0
  224. package/dist/web/routes/healthRoutes.js +29 -0
  225. package/dist/web/routes/logRoutes.d.ts +18 -0
  226. package/dist/web/routes/logRoutes.d.ts.map +1 -0
  227. package/dist/web/routes/logRoutes.js +126 -0
  228. package/dist/web/routes/metricsRoutes.d.ts +17 -0
  229. package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
  230. package/dist/web/routes/metricsRoutes.js +90 -0
  231. package/dist/web/routes/permissionRoutes.d.ts +16 -0
  232. package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
  233. package/dist/web/routes/permissionRoutes.js +133 -0
  234. package/dist/web/routes.d.ts.map +1 -1
  235. package/dist/web/routes.js +309 -339
  236. package/dist/web/server.d.ts +21 -1
  237. package/dist/web/server.d.ts.map +1 -1
  238. package/dist/web/server.js +42 -4
  239. package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
  240. package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
  241. package/dist/web/sinks/WebSSELogSink.js +22 -0
  242. package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
  243. package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
  244. package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
  245. package/package.json +2 -2
  246. package/server.json +2 -2
  247. package/dist/constants/version.d.ts +0 -3
  248. package/dist/constants/version.d.ts.map +0 -1
  249. package/dist/constants/version.js +0 -4
  250. package/dist/logging/sinks/SSELogSink.d.ts +0 -35
  251. package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
  252. package/dist/logging/sinks/SSELogSink.js +0 -181
  253. package/dist/logging/viewer/viewerHtml.d.ts +0 -8
  254. package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
  255. package/dist/logging/viewer/viewerHtml.js +0 -204
  256. package/dist/web/public/public/app.js +0 -1878
@@ -10,6 +10,7 @@
10
10
  * @module
11
11
  */
12
12
  import { matchesPattern } from '../../../utils/patternMatcher.js';
13
+ import { logger } from '../../../utils/logger.js';
13
14
  // ── Gatekeeper-Essential Operations ──────────────────────────────────
14
15
  /**
15
16
  * MCP-AQL operations that must NEVER be blocked by permission_prompt,
@@ -66,6 +67,7 @@ const SAFE_MCP_OPERATIONS = new Set([
66
67
  'get_build_info',
67
68
  'get_cache_budget_report',
68
69
  'query_logs',
70
+ 'query_metrics',
69
71
  'find_similar_elements',
70
72
  'get_element_relationships',
71
73
  'search_by_verb',
@@ -441,8 +443,9 @@ export function getStaticPolicyData() {
441
443
  /**
442
444
  * Evaluate a CLI tool call against active element gatekeeper policies.
443
445
  *
444
- * Three-step evaluation per element (Issue #625 Phase 2):
446
+ * Four-step evaluation per element (Issue #625 Phase 2, Issue #1660):
445
447
  * 1. denyPatterns (highest priority) — first match = immediate deny
448
+ * 1.5. confirmPatterns — first match = immediate confirm (requires approval)
446
449
  * 2. allowPatterns — if element defines them, record whether tool matched
447
450
  * 3. After all elements: if any had allowPatterns but tool wasn't allowed by any = deny
448
451
  *
@@ -460,8 +463,10 @@ export function getStaticPolicyData() {
460
463
  export function evaluateCliToolPolicy(toolName, toolInput, activeElements) {
461
464
  const evaluatedElements = [];
462
465
  const decisionChain = [];
466
+ const startTime = performance.now();
463
467
  if (!activeElements.length) {
464
468
  decisionChain.push('No active elements — fall through to default');
469
+ logger.debug(`[CliPolicy] ${toolName}: no active elements, fall through to default`);
465
470
  return {
466
471
  behavior: 'evaluate',
467
472
  policyContext: { evaluatedElements, decisionChain },
@@ -469,20 +474,26 @@ export function evaluateCliToolPolicy(toolName, toolInput, activeElements) {
469
474
  }
470
475
  // Build the strings to match against patterns
471
476
  const matchTargets = buildMatchTargets(toolName, toolInput);
477
+ const elementTypeSummary = summarizeElementTypes(activeElements);
478
+ logger.debug(`[CliPolicy] Evaluating ${toolName} against ${activeElements.length} elements (${elementTypeSummary}), matchTargets: [${matchTargets.join(', ')}]`);
472
479
  let anyElementHasAllowPatterns = false;
473
480
  let toolAllowedByAnyElement = false;
474
481
  const elementsWithAllowPatterns = [];
475
482
  for (const element of activeElements) {
476
483
  const restrictions = element.metadata?.gatekeeper?.externalRestrictions;
477
484
  const denyPatterns = restrictions?.denyPatterns;
485
+ const confirmPatterns = restrictions?.confirmPatterns;
478
486
  const allowPatterns = restrictions?.allowPatterns;
479
487
  const hasRestrictions = (Array.isArray(denyPatterns) && denyPatterns.length > 0)
488
+ || (Array.isArray(confirmPatterns) && confirmPatterns.length > 0)
480
489
  || (Array.isArray(allowPatterns) && allowPatterns.length > 0);
481
490
  if (!hasRestrictions) {
482
491
  evaluatedElements.push({ type: element.type, name: element.name });
483
492
  decisionChain.push(`${element.type} '${element.name}': no externalRestrictions`);
493
+ logger.debug(`[CliPolicy] ${element.type} '${element.name}': no externalRestrictions, skipping`);
484
494
  continue;
485
495
  }
496
+ logger.debug(`[CliPolicy] ${element.type} '${element.name}': evaluating (deny: ${Array.isArray(denyPatterns) ? denyPatterns.length : 0}, confirm: ${Array.isArray(confirmPatterns) ? confirmPatterns.length : 0}, allow: ${Array.isArray(allowPatterns) ? allowPatterns.length : 0} patterns)`);
486
497
  // Step 1: Check denyPatterns (highest priority)
487
498
  if (Array.isArray(denyPatterns)) {
488
499
  for (const pattern of denyPatterns) {
@@ -498,6 +509,7 @@ export function evaluateCliToolPolicy(toolName, toolInput, activeElements) {
498
509
  matchedTarget: target,
499
510
  });
500
511
  decisionChain.push(`DENY: ${element.type} '${element.name}' denyPattern '${pattern}' matches '${target}'`);
512
+ logger.debug(`[CliPolicy] DENY: ${element.type} '${element.name}' denyPattern '${pattern}' matched '${target}' (${elapsed(startTime)})`);
501
513
  return {
502
514
  behavior: 'deny',
503
515
  message: `Denied by ${element.type} '${element.name}' policy: pattern '${pattern}' matches '${target}'`,
@@ -507,6 +519,32 @@ export function evaluateCliToolPolicy(toolName, toolInput, activeElements) {
507
519
  }
508
520
  }
509
521
  }
522
+ // Step 1.5: Check confirmPatterns (requires approval — Issue #1660)
523
+ if (Array.isArray(confirmPatterns) && confirmPatterns.length > 0) {
524
+ for (const pattern of confirmPatterns) {
525
+ if (typeof pattern !== 'string')
526
+ continue;
527
+ for (const target of matchTargets) {
528
+ if (matchesPattern(target, pattern)) {
529
+ evaluatedElements.push({
530
+ type: element.type,
531
+ name: element.name,
532
+ matched: 'confirmPatterns',
533
+ matchedPattern: pattern,
534
+ matchedTarget: target,
535
+ });
536
+ decisionChain.push(`CONFIRM: ${element.type} '${element.name}' confirmPattern '${pattern}' matches '${target}'`);
537
+ logger.debug(`[CliPolicy] CONFIRM: ${element.type} '${element.name}' confirmPattern '${pattern}' matched '${target}' (${elapsed(startTime)})`);
538
+ return {
539
+ behavior: 'confirm',
540
+ message: `Requires approval: ${element.type} '${element.name}' policy requires confirmation for pattern '${pattern}'`,
541
+ confirmSource: `${element.type}:${element.name}`,
542
+ policyContext: { evaluatedElements, decisionChain },
543
+ };
544
+ }
545
+ }
546
+ }
547
+ }
510
548
  // Step 2: Check allowPatterns
511
549
  if (Array.isArray(allowPatterns) && allowPatterns.length > 0) {
512
550
  anyElementHasAllowPatterns = true;
@@ -525,6 +563,7 @@ export function evaluateCliToolPolicy(toolName, toolInput, activeElements) {
525
563
  matchedTarget: target,
526
564
  });
527
565
  decisionChain.push(`${element.type} '${element.name}': allowPattern '${pattern}' matches '${target}'`);
566
+ logger.debug(`[CliPolicy] ALLOW: ${element.type} '${element.name}' allowPattern '${pattern}' matched '${target}'`);
528
567
  toolAllowedByAnyElement = true;
529
568
  matchedAllow = true;
530
569
  break;
@@ -547,6 +586,7 @@ export function evaluateCliToolPolicy(toolName, toolInput, activeElements) {
547
586
  if (anyElementHasAllowPatterns && !toolAllowedByAnyElement) {
548
587
  const restrictors = elementsWithAllowPatterns.join(', ');
549
588
  decisionChain.push(`DENY: tool not in any element allowlist (restricted by: ${restrictors})`);
589
+ logger.debug(`[CliPolicy] DENY: ${toolName} not in any allowlist (restricted by: ${restrictors}) (${elapsed(startTime)})`);
550
590
  return {
551
591
  behavior: 'deny',
552
592
  message: `Tool '${toolName}' not permitted by allowlists defined in: ${restrictors}. Either deactivate these elements or add allowPatterns to match this tool.`,
@@ -555,15 +595,29 @@ export function evaluateCliToolPolicy(toolName, toolInput, activeElements) {
555
595
  }
556
596
  if (anyElementHasAllowPatterns) {
557
597
  decisionChain.push('Tool matched allowlist — fall through to default');
598
+ logger.debug(`[CliPolicy] ${toolName}: matched allowlist, fall through to default (${elapsed(startTime)})`);
558
599
  }
559
600
  else {
560
601
  decisionChain.push('No allowPatterns defined — fall through to default (Phase 1 behavior)');
602
+ logger.debug(`[CliPolicy] ${toolName}: no allowPatterns defined, fall through to default (${elapsed(startTime)})`);
561
603
  }
562
604
  return {
563
605
  behavior: 'evaluate',
564
606
  policyContext: { evaluatedElements, decisionChain },
565
607
  };
566
608
  }
609
+ /** Format elapsed time since startTime in milliseconds. */
610
+ function elapsed(startTime) {
611
+ return `${(performance.now() - startTime).toFixed(2)}ms`;
612
+ }
613
+ /** Summarize active element types for the entry log (e.g., "3 personas, 2 skills, 1 ensemble"). */
614
+ function summarizeElementTypes(elements) {
615
+ const counts = new Map();
616
+ for (const el of elements) {
617
+ counts.set(el.type, (counts.get(el.type) ?? 0) + 1);
618
+ }
619
+ return [...counts.entries()].map(([type, count]) => `${count} ${type}${count > 1 ? 's' : ''}`).join(', ');
620
+ }
567
621
  /**
568
622
  * Maximum input length for pattern matching targets.
569
623
  * Truncates long commands/paths to prevent DoS via pathological glob matching.
@@ -604,4 +658,4 @@ function buildMatchTargets(toolName, toolInput) {
604
658
  }
605
659
  return targets;
606
660
  }
607
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9vbENsYXNzaWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2hhbmRsZXJzL21jcC1hcWwvcG9saWNpZXMvVG9vbENsYXNzaWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFnQ2xFLHdFQUF3RTtBQUV4RTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM5QyxtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixZQUFZO0lBQ1oscUJBQXFCO0lBQ3JCLHFCQUFxQjtJQUNyQixtQkFBbUI7SUFDbkIsd0JBQXdCLEVBQVEscUJBQXFCO0lBQ3JELDJCQUEyQixFQUFLLHFCQUFxQjtDQUN0RCxDQUFDLENBQUM7QUFFSDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNsQyxlQUFlO0lBQ2YsYUFBYTtJQUNiLHFCQUFxQjtJQUNyQixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLGdCQUFnQjtJQUNoQixZQUFZO0lBQ1oscUJBQXFCO0lBQ3JCLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsNkJBQTZCO0lBQzdCLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIseUJBQXlCO0lBQ3pCLFlBQVk7SUFDWix1QkFBdUI7SUFDdkIsMkJBQTJCO0lBQzNCLGdCQUFnQjtJQUNoQix3QkFBd0I7SUFDeEIsNEJBQTRCO0lBQzVC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O0lBQ3ZDLHVFQUF1RTtJQUN2RSxnRkFBZ0Y7SUFDaEYsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyw0Q0FBNEM7SUFDNUMsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLGlCQUFpQixDQUN4QixRQUFnQixFQUNoQixTQUFrQztJQUVsQyxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTNCLElBQUksUUFBUSxLQUFLLE1BQU0sSUFBSSxPQUFPLFNBQVMsQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakUsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUMsQ0FBQztRQUN6RixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNwQyxDQUFDO1NBQU0sSUFBSSxDQUFDLFFBQVEsS0FBSyxNQUFNLElBQUksUUFBUSxLQUFLLE9BQU8sQ0FBQyxJQUFJLE9BQU8sU0FBUyxDQUFDLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNwRyxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1FBQzNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVG9vbCBDbGFzc2lmaWNhdGlvbiBmb3IgQ0xJLUxldmVsIFBlcm1pc3Npb24gUHJvbXB0c1xuICpcbiAqIFByb3ZpZGVzIHN0YXRpYyBjbGFzc2lmaWNhdGlvbiBvZiBDbGF1ZGUgQ29kZSBDTEkgdG9vbCBjYWxscyBhbmRcbiAqIGV2YWx1YXRpb24gYWdhaW5zdCBhY3RpdmUgZWxlbWVudCBnYXRla2VlcGVyIHBvbGljaWVzLlxuICpcbiAqIFVzZWQgYnkgdGhlIHBlcm1pc3Npb25fcHJvbXB0IG9wZXJhdGlvbiAoSXNzdWUgIzYyNSkgdG8gZXZhbHVhdGVcbiAqIC0tcGVybWlzc2lvbi1wcm9tcHQtdG9vbCByZXF1ZXN0cyB3aXRob3V0IHJlcXVpcmluZyBMTE0gZXZhbHVhdGlvbi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWF0Y2hlc1BhdHRlcm4gfSBmcm9tICcuLi8uLi8uLi91dGlscy9wYXR0ZXJuTWF0Y2hlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFjdGl2ZUVsZW1lbnQgfSBmcm9tICcuL0VsZW1lbnRQb2xpY2llcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJpc2tBc3Nlc3NtZW50IH0gZnJvbSAnLi4vR2F0ZWtlZXBlclR5cGVzLmpzJztcblxuLy8g4pSA4pSAIFR5cGVzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgdHlwZSBUb29sUmlza0xldmVsID0gJ3NhZmUnIHwgJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnIHwgJ2Jsb2NrZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xDbGFzc2lmaWNhdGlvblJlc3VsdCB7XG4gIHJpc2tMZXZlbDogVG9vbFJpc2tMZXZlbDtcbiAgLyoqICdhbGxvdycgPSBhdXRvLWFwcHJvdmUsICdkZW55JyA9IGF1dG8tcmVqZWN0LCAnZXZhbHVhdGUnID0gY2hlY2sgZWxlbWVudCBwb2xpY2llcyAqL1xuICBiZWhhdmlvcjogJ2FsbG93JyB8ICdkZW55JyB8ICdldmFsdWF0ZSc7XG4gIHJlYXNvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvbGljeUV2YWx1YXRpb25Db250ZXh0IHtcbiAgZXZhbHVhdGVkRWxlbWVudHM6IEFycmF5PHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1hdGNoZWQ/OiAnYWxsb3dQYXR0ZXJucycgfCAnZGVueVBhdHRlcm5zJztcbiAgICBtYXRjaGVkUGF0dGVybj86IHN0cmluZztcbiAgICBtYXRjaGVkVGFyZ2V0Pzogc3RyaW5nO1xuICB9PjtcbiAgZGVjaXNpb25DaGFpbjogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpVG9vbFBvbGljeVJlc3VsdCB7XG4gIGJlaGF2aW9yOiAnYWxsb3cnIHwgJ2RlbnknIHwgJ2V2YWx1YXRlJztcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgcG9saWN5Q29udGV4dD86IFBvbGljeUV2YWx1YXRpb25Db250ZXh0O1xufVxuXG4vLyDilIDilIAgR2F0ZWtlZXBlci1Fc3NlbnRpYWwgT3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBNQ1AtQVFMIG9wZXJhdGlvbnMgdGhhdCBtdXN0IE5FVkVSIGJlIGJsb2NrZWQgYnkgcGVybWlzc2lvbl9wcm9tcHQsXG4gKiBldmVuIGlmIGVsZW1lbnQgZGVueVBhdHRlcm5zIHdvdWxkIG1hdGNoIHRoZSBNQ1AgdG9vbCBuYW1lLlxuICpcbiAqIFRoZXNlIGFyZSBlc3NlbnRpYWwgZm9yIHRoZSBHYXRla2VlcGVyIGZsb3cgaXRzZWxmLiBCbG9ja2luZyB0aGVtXG4gKiB3b3VsZCBwcmV2ZW50IHRoZSBodW1hbi1pbi10aGUtbG9vcCBhcHByb3ZhbCBwYXRoIGZyb20gZnVuY3Rpb25pbmdcbiAqIChlLmcuLCBhIGRlbnlQYXR0ZXJuIG9mICdtY3BfX0RvbGxob3VzZU1DUConIHdvdWxkIGJsb2NrIGNvbmZpcm1fb3BlcmF0aW9uKS5cbiAqL1xuY29uc3QgR0FURUtFRVBFUl9FU1NFTlRJQUxfT1BFUkFUSU9OUyA9IG5ldyBTZXQoW1xuICAnY29uZmlybV9vcGVyYXRpb24nLFxuICAndmVyaWZ5X2NoYWxsZW5nZScsXG4gICdwZXJtaXNzaW9uX3Byb21wdCcsXG4gICdpbnRyb3NwZWN0JyxcbiAgJ2dldF9hY3RpdmVfZWxlbWVudHMnLFxuICAnZ2V0X2V4ZWN1dGlvbl9zdGF0ZScsXG4gICdnZXRfZ2F0aGVyZWRfZGF0YScsXG4gICdhcHByb3ZlX2NsaV9wZXJtaXNzaW9uJywgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSAzXG4gICdnZXRfcGVuZGluZ19jbGlfYXBwcm92YWxzJywgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSAzXG5dKTtcblxuLyoqXG4gKiBNQ1AtQVFMIG9wZXJhdGlvbnMgdGhhdCBhcmUgaW5oZXJlbnRseSByZWFkLW9ubHkuXG4gKlxuICogVGhlc2UgYXV0by1hbGxvdyBpbiBwZXJtaXNzaW9uX3Byb21wdCAobm8gZWxlbWVudCBwb2xpY3kgZXZhbHVhdGlvbikuXG4gKiBUaGUgR2F0ZWtlZXBlciAoTGF5ZXIgMikgc3RpbGwgYXBwbGllcyBpdHMgb3duIHBlci1vcGVyYXRpb24gcG9saWNpZXMsXG4gKiBzbyB0aGlzIGRvZXNuJ3QgYnlwYXNzIHNlcnZlci1zaWRlIGFjY2VzcyBjb250cm9sIOKAlCBpdCBqdXN0IGF2b2lkc1xuICogdW5uZWNlc3NhcnkgJ2V2YWx1YXRlJyByb3VuZC10cmlwcyBmb3Igb3BlcmF0aW9ucyB0aGF0IGNhbid0IG1vZGlmeSBzdGF0ZS5cbiAqL1xuY29uc3QgU0FGRV9NQ1BfT1BFUkFUSU9OUyA9IG5ldyBTZXQoW1xuICAnbGlzdF9lbGVtZW50cycsXG4gICdnZXRfZWxlbWVudCcsXG4gICdnZXRfZWxlbWVudF9kZXRhaWxzJyxcbiAgJ3NlYXJjaF9lbGVtZW50cycsXG4gICdxdWVyeV9lbGVtZW50cycsXG4gICdnZXRfYWN0aXZlX2VsZW1lbnRzJyxcbiAgJ3ZhbGlkYXRlX2VsZW1lbnQnLFxuICAncmVuZGVyJyxcbiAgJ2V4cG9ydF9lbGVtZW50JyxcbiAgJ2ludHJvc3BlY3QnLFxuICAnZ2V0X2V4ZWN1dGlvbl9zdGF0ZScsXG4gICdnZXRfZ2F0aGVyZWRfZGF0YScsXG4gICdicm93c2VfY29sbGVjdGlvbicsXG4gICdzZWFyY2hfY29sbGVjdGlvbicsXG4gICdzZWFyY2hfY29sbGVjdGlvbl9lbmhhbmNlZCcsXG4gICdnZXRfY29sbGVjdGlvbl9jb250ZW50JyxcbiAgJ2dldF9jb2xsZWN0aW9uX2NhY2hlX2hlYWx0aCcsXG4gICdwb3J0Zm9saW9fc3RhdHVzJyxcbiAgJ3BvcnRmb2xpb19jb25maWcnLFxuICAnc2VhcmNoX3BvcnRmb2xpbycsXG4gICdzZWFyY2hfYWxsJyxcbiAgJ2NoZWNrX2dpdGh1Yl9hdXRoJyxcbiAgJ29hdXRoX2hlbHBlcl9zdGF0dXMnLFxuICAnZG9sbGhvdXNlX2NvbmZpZycsXG4gICdnZXRfYnVpbGRfaW5mbycsXG4gICdnZXRfY2FjaGVfYnVkZ2V0X3JlcG9ydCcsXG4gICdxdWVyeV9sb2dzJyxcbiAgJ2ZpbmRfc2ltaWxhcl9lbGVtZW50cycsXG4gICdnZXRfZWxlbWVudF9yZWxhdGlvbnNoaXBzJyxcbiAgJ3NlYXJjaF9ieV92ZXJiJyxcbiAgJ2dldF9yZWxhdGlvbnNoaXBfc3RhdHMnLFxuICAnZ2V0X2VmZmVjdGl2ZV9jbGlfcG9saWNpZXMnLFxuICAnZ2V0X3BlbmRpbmdfY2xpX2FwcHJvdmFscycsXG5dKTtcblxuLy8g4pSA4pSAIFN0YXRpYyBDbGFzc2lmaWNhdGlvbiBMaXN0cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBUb29scyB0aGF0IGFyZSBhbHdheXMgc2FmZSAocmVhZC1vbmx5LCBubyBzaWRlIGVmZmVjdHMpLlxuICpcbiAqIE5PVEU6IFwiU2FmZVwiIGhlcmUgbWVhbnMgbm8gZGVzdHJ1Y3RpdmUgc2lkZSBlZmZlY3RzIOKAlCBpdCBkb2VzIE5PVCBtZWFuXG4gKiB1bnJlc3RyaWN0ZWQuIFJlYWQtb25seSB0b29scyBjYW4gc3RpbGwgcG9zZSBpbmZvcm1hdGlvbi1sZWFrYWdlIG9yXG4gKiBzY29wZS1jcmVlcCByaXNrcyB3aGVuIHVzZWQgdG8gYWNjZXNzIGZpbGVzIG91dHNpZGUgdGhlIHByb2plY3Qgd29ya2luZ1xuICogZGlyZWN0b3J5IChlLmcuLCB+Ly5zc2gvKiwgL2V0Yy9wYXNzd2QsIGNyZWRlbnRpYWxzIGluIGhvbWUgZGlyZWN0b3JpZXMpLlxuICogTW9zdCBMTE0gY2xpZW50cyAoQ2xhdWRlIENvZGUsIEN1cnNvciwgZXRjLikgYWxyZWFkeSBlbmZvcmNlIGRpcmVjdG9yeVxuICogc2NvcGluZyBhdCB0aGUgY2xpZW50IGxldmVsLiBUaGUgYGFzc2Vzc1Jpc2soKWAgZnVuY3Rpb24gYXBwbGllcyBhIHNtYWxsXG4gKiBzY29yZSBidW1wIGZvciByZWFkIG9wZXJhdGlvbnMgdGFyZ2V0aW5nIG91dC1vZi1zY29wZSBwYXRocyBhcyBhblxuICogYWRkaXRpb25hbCBzaWduYWwgZm9yIGFwcHJvdmFsIHBvbGljaWVzLlxuICovXG5jb25zdCBTQUZFX1RPT0xTID0gbmV3IFNldChbXG4gICdSZWFkJyxcbiAgJ0dyZXAnLFxuICAnR2xvYicsXG4gICdXZWJGZXRjaCcsXG4gICdXZWJTZWFyY2gnLFxuICAnVGFza0NyZWF0ZScsXG4gICdUYXNrVXBkYXRlJyxcbiAgJ1Rhc2tHZXQnLFxuICAnVGFza0xpc3QnLFxuICAnVGFza091dHB1dCcsXG4gICdBc2tVc2VyUXVlc3Rpb24nLFxuICAnRW50ZXJQbGFuTW9kZScsXG4gICdFeGl0UGxhbk1vZGUnLFxuICAnVG9kb1JlYWQnLFxuICAnVG9kb1dyaXRlJyxcbl0pO1xuXG4vKiogQmFzaCBjb21tYW5kIHByZWZpeGVzL3BhdHRlcm5zIHRoYXQgYXJlIHNhZmUgKi9cbmNvbnN0IFNBRkVfQkFTSF9QQVRURVJOUyA9IFtcbiAgJ2dpdCBzdGF0dXMqJyxcbiAgJ2dpdCBsb2cqJyxcbiAgJ2dpdCBkaWZmKicsXG4gICdnaXQgYnJhbmNoKicsXG4gICdnaXQgc2hvdyonLFxuICAnZ2l0IHJlbW90ZSonLFxuICAnZ2l0IHN0YXNoIGxpc3QqJyxcbiAgJ2xzKicsXG4gICdwd2QnLFxuICAnY2F0IConLFxuICAnaGVhZCAqJyxcbiAgJ3RhaWwgKicsXG4gICd3YyAqJyxcbiAgJ2VjaG8gKicsXG4gICducG0gdGVzdConLFxuICAnbnBtIHJ1biBsaW50KicsXG4gICducG0gcnVuIGJ1aWxkKicsXG4gICducG0gcnVuIHRlc3QqJyxcbiAgJ25wbSBydW4gY2hlY2sqJyxcbiAgJ25wbSBydW4gdHlwZWNoZWNrKicsXG4gICducG0gcnVuIGZvcm1hdConLFxuICAnbnBtIGxzKicsXG4gICducG0gaW5mbyonLFxuICAnbnBtIG91dGRhdGVkKicsXG4gICducHggamVzdConLFxuICAnbnB4IHRzYyAtLW5vRW1pdConLFxuICAnbm9kZSAtLXZlcnNpb24qJyxcbiAgJ3doaWNoIConLFxuICAndHlwZSAqJyxcbiAgJ2doIGlzc3VlIGxpc3QqJyxcbiAgJ2doIGlzc3VlIHZpZXcqJyxcbiAgJ2doIHByIGxpc3QqJyxcbiAgJ2doIHByIHZpZXcqJyxcbiAgJ2doIHByIGNoZWNrcyonLFxuXTtcblxuLyoqIEJhc2ggY29tbWFuZCBwYXR0ZXJucyB0aGF0IGFyZSBkYW5nZXJvdXMgKi9cbmNvbnN0IERBTkdFUk9VU19CQVNIX1BBVFRFUk5TID0gW1xuICAncm0gLXJmIConLFxuICAncm0gLWZyIConLFxuICAnZ2l0IHB1c2ggLS1mb3JjZSonLFxuICAnZ2l0IHB1c2ggLWYgKicsXG4gICdnaXQgcmVzZXQgLS1oYXJkKicsXG4gICdnaXQgY2xlYW4gLWYqJyxcbiAgJ2dpdCBjaGVja291dCAtLSAqJyxcbiAgJ2dpdCBicmFuY2ggLUQgKicsXG4gICdjaG1vZCA3NzcqJyxcbiAgJ2NobW9kIC1SIDc3NyonLFxuICAnY2htb2QgK3MgKicsXG4gICdjaG93biByb290IConLFxuICAnc3VkbyAqJyxcbiAgJ2RvYXMgKicsXG4gICdzdSAtKicsXG4gICdldmFsIConLFxuICAvLyBQaXBlLXRvLXNoZWxsIHBhdHRlcm5zICh3aXRoIGFuZCB3aXRob3V0IHNwYWNlcywgbXVsdGlwbGUgc2hlbGxzKVxuICAnKnwgc2gnLFxuICAnKnwgc2ggKicsXG4gICcqfHNoJyxcbiAgJyp8c2ggKicsXG4gICcqfCBiYXNoJyxcbiAgJyp8IGJhc2ggKicsXG4gICcqfGJhc2gnLFxuICAnKnxiYXNoIConLFxuICAnKnwgenNoJyxcbiAgJyp8enNoJyxcbiAgJ2N1cmwgKiB8IConLFxuICAnd2dldCAqIHwgKicsXG4gIC8vIFBhY2thZ2UgbWFuYWdlciBpbnN0YWxscyAoY2FuIGV4ZWN1dGUgYXJiaXRyYXJ5IHBvc3QtaW5zdGFsbCBzY3JpcHRzKVxuICAnbnBtIGluc3RhbGwgKicsXG4gICducG0gaW5zdGFsbCcsXG4gICducG0gaSAqJyxcbiAgJ25wbSBpJyxcbiAgJ3lhcm4gYWRkIConLFxuICAneWFybiBpbnN0YWxsKicsXG4gICdwaXAgaW5zdGFsbCAqJyxcbiAgJ2dlbSBpbnN0YWxsIConLFxuICAvLyBFbnZpcm9ubWVudCBtYW5pcHVsYXRpb24gKHBhdGggcG9pc29uaW5nLCBsaWJyYXJ5IGluamVjdGlvbiwgdmFyaWFibGUgZGVzdHJ1Y3Rpb24pXG4gICdleHBvcnQgUEFUSD0qJyxcbiAgJ2V4cG9ydCBMRF9QUkVMT0FEPSonLFxuICAnZXhwb3J0IExEX0xJQlJBUllfUEFUSD0qJyxcbiAgJ2VudiAtaSAqJyxcbiAgJ3Vuc2V0IConLFxuICAvLyBQcm9jZXNzIGNvbnRyb2wgKGNhbiB0ZXJtaW5hdGUgYWdlbnRzIG9yIHN5c3RlbSBwcm9jZXNzZXMpXG4gICdraWxsIConLFxuICAna2lsbCAtKicsXG4gICdwa2lsbCAqJyxcbiAgJ2tpbGxhbGwgKicsXG4gIC8vIE5ldHdvcmsgdG9vbHMgKGV4ZmlsdHJhdGlvbiwgcmV2ZXJzZSBzaGVsbHMpXG4gICduYyAqJyxcbiAgJ25jIC0qJyxcbiAgJ25ldGNhdCAqJyxcbiAgJ25jYXQgKicsXG4gICdzb2NhdCAqJyxcbiAgLy8gQXJjaGl2ZSBvcGVyYXRpb25zIChhcmNoaXZlIGJvbWJzLCByb290IGRpcmVjdG9yeSBleGZpbHRyYXRpb24vcmFuc29td2FyZSlcbiAgJ3RhciAteGYgKicsXG4gICd0YXIgeGYgKicsXG4gICd6aXAgLXIgKiAvJyxcbiAgLy8gQ29tbWFuZCBjaGFpbmluZyB3aXRoIGRhbmdlcm91cyBzdWJjb21tYW5kc1xuICAnKjsgcm0gLXJmIConLFxuICAnKiYmIHJtIC1yZiAqJyxcbiAgJyp8fCBybSAtcmYgKicsXG4gICcqOyBzdWRvIConLFxuICAnKiYmIHN1ZG8gKicsXG4gICcqfHwgc3VkbyAqJyxcbiAgJyo7IGV2YWwgKicsXG4gICcqJiYgZXZhbCAqJyxcbiAgLy8gU3VicHJvY2VzcyBleGVjdXRpb24gd3JhcHBlcnMgKGJ5cGFzcyBvdXRlciBjb21tYW5kIGNsYXNzaWZpY2F0aW9uKVxuICAnYmFzaCAtYyAqJyxcbiAgJ3NoIC1jIConLFxuICAnenNoIC1jIConLFxuICAnL2Jpbi9iYXNoIC1jIConLFxuICAnL2Jpbi9zaCAtYyAqJyxcbiAgLy8gUHJvY2VzcyBzdWJzdGl0dXRpb24gKGNhbiBpbmplY3QgYXJiaXRyYXJ5IGNvbW1hbmQgb3V0cHV0KVxuICAnKjwoKicsXG4gIC8vIEVuY29kZWQgcGF5bG9hZCBleGVjdXRpb24gKGJhc2U2NC1kZWNvZGUgcGlwZWQgdG8gc2hlbGwpXG4gICcqYmFzZTY0IC1kKnwqJyxcbiAgJypiYXNlNjQgLS1kZWNvZGUqfConLFxuICAnKmJhc2U2NCAtRCp8KicsXG5dO1xuXG4vKiogQmFzaCBjb21tYW5kIHBhdHRlcm5zIHRoYXQgYXJlIGFsd2F5cyBibG9ja2VkICovXG5jb25zdCBCTE9DS0VEX0JBU0hfUEFUVEVSTlMgPSBbXG4gICdta2ZzKicsXG4gICdkZCBpZj0qJyxcbiAgJzooKXs6fDomfTs6JyxcbiAgJ2Zvcm1hdCAqJyxcbiAgJyooKXsgKicsXG5dO1xuXG4vLyDilIDilIAgU3RhdGljIENsYXNzaWZpY2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIENsYXNzaWZ5IGEgQ0xJIHRvb2wgY2FsbCBieSByaXNrIGxldmVsIHVzaW5nIHN0YXRpYyBydWxlcy5cbiAqXG4gKiBSZXR1cm5zICdhbGxvdycgZm9yIGtub3duLXNhZmUgdG9vbHMsICdkZW55JyBmb3Iga25vd24tZGFuZ2Vyb3VzIHBhdHRlcm5zLFxuICogYW5kICdldmFsdWF0ZScgZm9yIGFueXRoaW5nIHRoYXQgbmVlZHMgZnVydGhlciBwb2xpY3kgY2hlY2tpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc2lmeVRvb2woXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIHRvb2xJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IFRvb2xDbGFzc2lmaWNhdGlvblJlc3VsdCB7XG4gIC8vIEtub3duLXNhZmUgdG9vbHM6IGF1dG8tYWxsb3dcbiAgaWYgKFNBRkVfVE9PTFMuaGFzKHRvb2xOYW1lKSkge1xuICAgIHJldHVybiB7IHJpc2tMZXZlbDogJ3NhZmUnLCBiZWhhdmlvcjogJ2FsbG93JywgcmVhc29uOiBgJHt0b29sTmFtZX0gaXMgYSByZWFkLW9ubHkgdG9vbGAgfTtcbiAgfVxuXG4gIC8vIEJhc2g6IHN1Yi1jbGFzc2lmeSBieSBjb21tYW5kIGNvbnRlbnRcbiAgaWYgKHRvb2xOYW1lID09PSAnQmFzaCcpIHtcbiAgICByZXR1cm4gY2xhc3NpZnlCYXNoQ29tbWFuZCh0b29sSW5wdXQpO1xuICB9XG5cbiAgLy8gTUNQIHRvb2wgY2FsbHM6IGF1dG8tYWxsb3cgZ2F0ZWtlZXBlci1lc3NlbnRpYWwgYW5kIHNhZmUgcmVhZC1vbmx5IG9wZXJhdGlvbnMsIGV2YWx1YXRlIG90aGVyc1xuICBpZiAodG9vbE5hbWUuc3RhcnRzV2l0aCgnbWNwX18nKSkge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IHR5cGVvZiB0b29sSW5wdXQub3BlcmF0aW9uID09PSAnc3RyaW5nJyA/IHRvb2xJbnB1dC5vcGVyYXRpb24gOiAnJztcbiAgICBpZiAob3BlcmF0aW9uICYmIEdBVEVLRUVQRVJfRVNTRU5USUFMX09QRVJBVElPTlMuaGFzKG9wZXJhdGlvbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJpc2tMZXZlbDogJ3NhZmUnLFxuICAgICAgICBiZWhhdmlvcjogJ2FsbG93JyxcbiAgICAgICAgcmVhc29uOiBgR2F0ZWtlZXBlci1lc3NlbnRpYWwgb3BlcmF0aW9uICcke29wZXJhdGlvbn0nIOKAlCBjYW5ub3QgYmUgYmxvY2tlZCBieSBwZXJtaXNzaW9uX3Byb21wdGAsXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAob3BlcmF0aW9uICYmIFNBRkVfTUNQX09QRVJBVElPTlMuaGFzKG9wZXJhdGlvbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJpc2tMZXZlbDogJ3NhZmUnLFxuICAgICAgICBiZWhhdmlvcjogJ2FsbG93JyxcbiAgICAgICAgcmVhc29uOiBgUmVhZC1vbmx5IE1DUCBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufSdgLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcmlza0xldmVsOiAnbW9kZXJhdGUnLCBiZWhhdmlvcjogJ2V2YWx1YXRlJywgcmVhc29uOiAnTUNQIHRvb2wgY2FsbCByZXF1aXJlcyBwb2xpY3kgZXZhbHVhdGlvbicgfTtcbiAgfVxuXG4gIC8vIEVkaXQsIFdyaXRlLCBBZ2VudCwgTm90ZWJvb2tFZGl0LCBldGMuOiBtb2RlcmF0ZSByaXNrXG4gIGlmIChbJ0VkaXQnLCAnV3JpdGUnLCAnQWdlbnQnLCAnTm90ZWJvb2tFZGl0J10uaW5jbHVkZXModG9vbE5hbWUpKSB7XG4gICAgcmV0dXJuIHsgcmlza0xldmVsOiAnbW9kZXJhdGUnLCBiZWhhdmlvcjogJ2V2YWx1YXRlJywgcmVhc29uOiBgJHt0b29sTmFtZX0gbW9kaWZpZXMgc3RhdGUsIHJlcXVpcmVzIHBvbGljeSBldmFsdWF0aW9uYCB9O1xuICB9XG5cbiAgLy8gVW5rbm93biB0b29sOiBldmFsdWF0ZSAocGVybWlzc2l2ZSBkZWZhdWx0IGZvciBQaGFzZSAxKVxuICByZXR1cm4geyByaXNrTGV2ZWw6ICdtb2RlcmF0ZScsIGJlaGF2aW9yOiAnZXZhbHVhdGUnLCByZWFzb246IGBVbmtub3duIHRvb2wgJyR7dG9vbE5hbWV9JywgcmVxdWlyZXMgcG9saWN5IGV2YWx1YXRpb25gIH07XG59XG5cbi8qKlxuICogU3ViLWNsYXNzaWZ5IEJhc2ggY29tbWFuZHMgYnkgbWF0Y2hpbmcgYWdhaW5zdCBrbm93biBwYXR0ZXJucy5cbiAqL1xuZnVuY3Rpb24gY2xhc3NpZnlCYXNoQ29tbWFuZChcbiAgdG9vbElucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogVG9vbENsYXNzaWZpY2F0aW9uUmVzdWx0IHtcbiAgY29uc3QgY29tbWFuZCA9IHR5cGVvZiB0b29sSW5wdXQuY29tbWFuZCA9PT0gJ3N0cmluZycgPyB0b29sSW5wdXQuY29tbWFuZC50cmltKCkgOiAnJztcblxuICBpZiAoIWNvbW1hbmQpIHtcbiAgICByZXR1cm4geyByaXNrTGV2ZWw6ICdtb2RlcmF0ZScsIGJlaGF2aW9yOiAnZXZhbHVhdGUnLCByZWFzb246ICdFbXB0eSBCYXNoIGNvbW1hbmQnIH07XG4gIH1cblxuICAvLyBDaGVjayBibG9ja2VkIHBhdHRlcm5zIGZpcnN0IChoaWdoZXN0IHByaW9yaXR5KVxuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgQkxPQ0tFRF9CQVNIX1BBVFRFUk5TKSB7XG4gICAgaWYgKG1hdGNoZXNQYXR0ZXJuKGNvbW1hbmQsIHBhdHRlcm4pKSB7XG4gICAgICByZXR1cm4geyByaXNrTGV2ZWw6ICdibG9ja2VkJywgYmVoYXZpb3I6ICdkZW55JywgcmVhc29uOiBgQmxvY2tlZCBjb21tYW5kIHBhdHRlcm46ICR7cGF0dGVybn1gIH07XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZGFuZ2Vyb3VzIHBhdHRlcm5zXG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBEQU5HRVJPVVNfQkFTSF9QQVRURVJOUykge1xuICAgIGlmIChtYXRjaGVzUGF0dGVybihjb21tYW5kLCBwYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIHsgcmlza0xldmVsOiAnZGFuZ2Vyb3VzJywgYmVoYXZpb3I6ICdkZW55JywgcmVhc29uOiBgRGFuZ2Vyb3VzIGNvbW1hbmQgcGF0dGVybjogJHtwYXR0ZXJufWAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBzYWZlIHBhdHRlcm5zXG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBTQUZFX0JBU0hfUEFUVEVSTlMpIHtcbiAgICBpZiAobWF0Y2hlc1BhdHRlcm4oY29tbWFuZCwgcGF0dGVybikpIHtcbiAgICAgIHJldHVybiB7IHJpc2tMZXZlbDogJ3NhZmUnLCBiZWhhdmlvcjogJ2FsbG93JywgcmVhc29uOiBgU2FmZSBjb21tYW5kIHBhdHRlcm46ICR7cGF0dGVybn1gIH07XG4gICAgfVxuICB9XG5cbiAgLy8gVW5jbGFzc2lmaWVkOiBldmFsdWF0ZSBhZ2FpbnN0IGVsZW1lbnQgcG9saWNpZXNcbiAgcmV0dXJuIHsgcmlza0xldmVsOiAnbW9kZXJhdGUnLCBiZWhhdmlvcjogJ2V2YWx1YXRlJywgcmVhc29uOiAnQmFzaCBjb21tYW5kIG5vdCBzdGF0aWNhbGx5IGNsYXNzaWZpZWQnIH07XG59XG5cbi8vIOKUgOKUgCBSaXNrIEFzc2Vzc21lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQmFzZSByaXNrIHNjb3JlcyBieSBjbGFzc2lmaWNhdGlvbiBsZXZlbCAoMC0xMDAgc2NhbGUpLlxuICpcbiAqIFNjb3JlIHJhbmdlczpcbiAqIC0gIDA6ICAgICBzYWZlIOKAlCByZWFkLW9ubHkgdG9vbHMsIG5vIHNpZGUgZWZmZWN0c1xuICogLSAgMS0zOTogIGxvdyDigJQgbWlub3Igc2lkZSBlZmZlY3RzLCBlYXNpbHkgcmV2ZXJzaWJsZVxuICogLSA0MC01OTogIG1vZGVyYXRlIOKAlCBmaWxlIHdyaXRlcywgcGFja2FnZSBpbnN0YWxscywgdW5jbGFzc2lmaWVkIGNvbW1hbmRzXG4gKiAtIDYwLTc5OiAgZWxldmF0ZWQg4oCUIG1vZGVyYXRlICsgYWdncmF2YXRpbmcgZmFjdG9ycyAobmV0d29yaywgZmlsZSBjcmVhdGlvbilcbiAqIC0gODAtOTk6ICBkYW5nZXJvdXMg4oCUIGRlc3RydWN0aXZlIGNvbW1hbmRzLCBwcml2aWxlZ2UgZXNjYWxhdGlvblxuICogLSAxMDA6ICAgIGJsb2NrZWQg4oCUIGFsd2F5cyBkZW5pZWQgKGUuZy4sIHJldmVyc2Ugc2hlbGxzLCBkaXNrIHdpcGUpXG4gKlxuICogQWRqdXN0bWVudHMgYXBwbGllZCBvbiB0b3Agb2YgYmFzZTogaXJyZXZlcnNpYmxlIHBhdHRlcm4gKCsxMCksXG4gKiBuZXR3b3JrIG9wZXJhdGlvbiAoKzEwKSwgb3V0LW9mLXNjb3BlIHJlYWQgKCsxMCksIGZpbGUgY3JlYXRpb24gKCs1KS5cbiAqIFNjb3JlIGlzIGNhcHBlZCBhdCAxMDAuXG4gKi9cbmNvbnN0IFJJU0tfU0NPUkVTOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge1xuICBzYWZlOiAwLFxuICBtb2RlcmF0ZTogNDAsXG4gIGRhbmdlcm91czogODAsXG4gIGJsb2NrZWQ6IDEwMCxcbn07XG5cbi8qKiBSZWFkLW9ubHkgdG9vbHMgdGhhdCBtYXkgcmVmZXJlbmNlIGZpbGUgcGF0aHMgKi9cbmNvbnN0IFNBRkVfUkVBRF9UT09MUyA9IG5ldyBTZXQoWydSZWFkJywgJ0dyZXAnLCAnR2xvYiddKTtcblxuLyoqIFNlbnNpdGl2ZSBwYXRoIHByZWZpeGVzIHRoYXQgaW5kaWNhdGUgb3V0LW9mLXNjb3BlIHJlYWRzICovXG5jb25zdCBTRU5TSVRJVkVfUEFUSF9QUkVGSVhFUyA9IFtcbiAgJ34vLnNzaC8nLCAnfi8uZ251cGcvJywgJ34vLmF3cy8nLCAnfi8uY29uZmlnLycsXG4gICd+Ly5lbnYnLCAnfi8ubmV0cmMnLCAnfi8ubnBtcmMnLFxuICAnL2V0Yy9zaGFkb3cnLCAnL2V0Yy9wYXNzd2QnLCAnL2V0Yy9zdWRvZXJzJyxcbiAgJy9wcm9jLycsICcvc3lzLycsXG5dO1xuXG4vKipcbiAqIEhldXJpc3RpYzogZG9lcyBhIHBhdGggbG9vayBsaWtlIGl0IHRhcmdldHMgZmlsZXMgb3V0c2lkZSB0aGUgcHJvamVjdCBzY29wZT9cbiAqIENoZWNrcyBmb3IgaG9tZS1kaXJlY3Rvcnkgc2Vuc2l0aXZlIHBhdGhzLCBzeXN0ZW0gcGF0aHMsIGFuZCBwYXJlbnQgdHJhdmVyc2Fscy5cbiAqL1xuZnVuY3Rpb24gaXNPdXRPZlNjb3BlUGF0aCh0YXJnZXRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG4gIC8vIEV4cGxpY2l0IHNlbnNpdGl2ZSBwYXRoc1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBTRU5TSVRJVkVfUEFUSF9QUkVGSVhFUykge1xuICAgIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgocHJlZml4KSB8fCBub3JtYWxpemVkLmluY2x1ZGVzKGAvJHtwcmVmaXh9YCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhvbWUgZGlyZWN0b3J5IHJlZmVyZW5jZXMgKH4vLi4uKSB0aGF0IGFyZW4ndCByZWxhdGl2ZSB0byB0aGUgcHJvamVjdFxuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKCd+LycpIHx8IG5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnL1VzZXJzLycpIHx8IG5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnL2hvbWUvJykpIHtcbiAgICAvLyBIZXVyaXN0aWM6IHJlYWRpbmcgc2Vuc2l0aXZlIGRvdGZpbGVzL2RpcnMgb3V0c2lkZSBhIHByb2plY3QuXG4gICAgLy8gVGFyZ2V0cyBrbm93biBjcmVkZW50aWFsL2NvbmZpZyBzdG9yZXMg4oCUIGF2b2lkcyBmYWxzZSBwb3NpdGl2ZXMgZm9yXG4gICAgLy8gY29tbW9uIHByb2plY3QgZG90ZmlsZXMgbGlrZSAuZ2l0aHViLywgLnZzY29kZS8sIC5lc2xpbnRyYywgZXRjLlxuICAgIGlmICgvXFwvXFwuKHNzaHxnbnVwZ3xhd3N8YXp1cmV8Z2Nsb3VkfGt1YmV8ZG9ja2VyfG5wbXJjfG5ldHJjfGVudnxiYXNoX2hpc3Rvcnl8enNoX2hpc3Rvcnl8Y3JlZGVudGlhbHN8cGFzc3dvcmR8c2VjcmV0KS9pLnRlc3Qobm9ybWFsaXplZCkpIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogQmFzaCBjb21tYW5kIHBhdHRlcm5zIHRoYXQgYXJlIGlycmV2ZXJzaWJsZSAqL1xuY29uc3QgSVJSRVZFUlNJQkxFX1BBVFRFUk5TID0gW1xuICAncm0gLXJmIConLFxuICAncm0gLWZyIConLFxuICAnZ2l0IHB1c2ggLS1mb3JjZSonLFxuICAnZ2l0IHB1c2ggLWYgKicsXG4gICdnaXQgcmVzZXQgLS1oYXJkKicsXG4gICdnaXQgY2xlYW4gLWYqJyxcbiAgJ21rZnMqJyxcbiAgJ2RkIGlmPSonLFxuICAnZHJvcCAqJyxcbiAgJ3RydW5jYXRlIConLFxuXTtcblxuLyoqXG4gKiBBc3Nlc3MgdGhlIHJpc2sgb2YgYSBDTEkgdG9vbCBjYWxsLlxuICpcbiAqIFJldHVybnMgYSBudW1lcmljIHNjb3JlICgwLTEwMCkgYW5kIGlycmV2ZXJzaWJpbGl0eSBpbmRpY2F0b3IgYmFzZWQgb25cbiAqIHRoZSBzdGF0aWMgY2xhc3NpZmljYXRpb24gYW5kIHRvb2wtc3BlY2lmaWMgaGV1cmlzdGljcy5cbiAqXG4gKiBAcGFyYW0gdG9vbE5hbWUgLSBUaGUgdG9vbCBiZWluZyBjYWxsZWRcbiAqIEBwYXJhbSB0b29sSW5wdXQgLSBUaGUgdG9vbCBpbnB1dCBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0gY2xhc3NpZmljYXRpb24gLSBUaGUgcmVzdWx0IGZyb20gY2xhc3NpZnlUb29sKClcbiAqIEByZXR1cm5zIFJpc2sgYXNzZXNzbWVudCB3aXRoIHNjb3JlLCBpcnJldmVyc2liaWxpdHksIGFuZCBjb250cmlidXRpbmcgZmFjdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXNzUmlzayhcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgdG9vbElucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgY2xhc3NpZmljYXRpb246IFRvb2xDbGFzc2lmaWNhdGlvblJlc3VsdFxuKTogUmlza0Fzc2Vzc21lbnQge1xuICBsZXQgc2NvcmUgPSBSSVNLX1NDT1JFU1tjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWxdID8/IDQwO1xuICBjb25zdCBmYWN0b3JzOiBzdHJpbmdbXSA9IFtgQmFzZTogJHtjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWx9ICgke1JJU0tfU0NPUkVTW2NsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbF0gPz8gNDB9KWBdO1xuICBsZXQgaXJyZXZlcnNpYmxlID0gZmFsc2U7XG5cbiAgLy8gQ2hlY2sgZm9yIGlycmV2ZXJzaWJsZSBwYXR0ZXJucyBpbiBCYXNoIGNvbW1hbmRzXG4gIGlmICh0b29sTmFtZSA9PT0gJ0Jhc2gnICYmIHR5cGVvZiB0b29sSW5wdXQuY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBjb21tYW5kID0gdG9vbElucHV0LmNvbW1hbmQudHJpbSgpO1xuICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBJUlJFVkVSU0lCTEVfUEFUVEVSTlMpIHtcbiAgICAgIGlmIChtYXRjaGVzUGF0dGVybihjb21tYW5kLCBwYXR0ZXJuKSkge1xuICAgICAgICBpcnJldmVyc2libGUgPSB0cnVlO1xuICAgICAgICBzY29yZSA9IE1hdGgubWluKDEwMCwgc2NvcmUgKyAxMCk7XG4gICAgICAgIGZhY3RvcnMucHVzaChgSXJyZXZlcnNpYmxlIHBhdHRlcm46ICR7cGF0dGVybn0gKCsxMClgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTmV0d29yayBvcGVyYXRpb25zIGluY3JlYXNlIHJpc2tcbiAgICBpZiAoL1xcYihjdXJsfHdnZXR8ZmV0Y2h8bmN8bmV0Y2F0fG5jYXR8c29jYXQpXFxiLy50ZXN0KGNvbW1hbmQpKSB7XG4gICAgICBzY29yZSA9IE1hdGgubWluKDEwMCwgc2NvcmUgKyAxMCk7XG4gICAgICBmYWN0b3JzLnB1c2goJ05ldHdvcmsgb3BlcmF0aW9uICgrMTApJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gV3JpdGUvRWRpdCBvcGVyYXRpb25zOiBmaWxlIGNyZWF0aW9uIGluY3JlYXNlcyByaXNrIHNsaWdodGx5XG4gIGlmICh0b29sTmFtZSA9PT0gJ1dyaXRlJykge1xuICAgIHNjb3JlID0gTWF0aC5taW4oMTAwLCBzY29yZSArIDUpO1xuICAgIGZhY3RvcnMucHVzaCgnRmlsZSBjcmVhdGlvbiAoKzUpJyk7XG4gIH1cblxuICAvLyBSZWFkLW9ubHkgdG9vbHMgdGFyZ2V0aW5nIHBhdGhzIG91dHNpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LlxuICAvLyBNb3N0IGNsaWVudHMgYWxyZWFkeSBlbmZvcmNlIGRpcmVjdG9yeSBzY29waW5nLCBidXQgdGhpcyBwcm92aWRlcyBhblxuICAvLyBhZGRpdGlvbmFsIHNpZ25hbCBmb3IgYXBwcm92YWwgcG9saWNpZXMgdG8gYWN0IG9uLlxuICBpZiAoU0FGRV9SRUFEX1RPT0xTLmhhcyh0b29sTmFtZSkpIHtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gKHRvb2xJbnB1dC5maWxlX3BhdGggPz8gdG9vbElucHV0LnBhdGggPz8gJycpIGFzIHN0cmluZztcbiAgICBpZiAodGFyZ2V0UGF0aCAmJiBpc091dE9mU2NvcGVQYXRoKHRhcmdldFBhdGgpKSB7XG4gICAgICBzY29yZSA9IE1hdGgubWluKDEwMCwgc2NvcmUgKyAxMCk7XG4gICAgICBmYWN0b3JzLnB1c2goJ091dC1vZi1zY29wZSByZWFkIHBhdGggKCsxMCknKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBzY29yZSwgaXJyZXZlcnNpYmxlLCBmYWN0b3JzIH07XG59XG5cbi8vIOKUgOKUgCBTdGF0aWMgUG9saWN5IERhdGEgRXhwb3J0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJldHVybiBhbGwgc3RhdGljIGNsYXNzaWZpY2F0aW9uIGRhdGEgZm9yIGJyaWRnZSBwb2xpY3kgZXhwb3J0LlxuICpcbiAqIFVzZWQgYnkgUG9saWN5RXhwb3J0U2VydmljZSB0byB3cml0ZSB0aGUgYnJpZGdlLWNvbXBhdGlibGUgcG9saWN5IGZpbGUuXG4gKiBBbGwgZGF0YSBpcyByZXR1cm5lZCBhcyBwbGFpbiBhcnJheXMvb2JqZWN0cyAobm8gU2V0cykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGF0aWNQb2xpY3lEYXRhKCkge1xuICByZXR1cm4ge1xuICAgIHNhZmVfdG9vbHM6IFsuLi5TQUZFX1RPT0xTXSxcbiAgICBzYWZlX2Jhc2hfcGF0dGVybnM6IFsuLi5TQUZFX0JBU0hfUEFUVEVSTlNdLFxuICAgIGRhbmdlcm91c19iYXNoX3BhdHRlcm5zOiBbLi4uREFOR0VST1VTX0JBU0hfUEFUVEVSTlNdLFxuICAgIGJsb2NrZWRfYmFzaF9wYXR0ZXJuczogWy4uLkJMT0NLRURfQkFTSF9QQVRURVJOU10sXG4gICAgaXJyZXZlcnNpYmxlX3BhdHRlcm5zOiBbLi4uSVJSRVZFUlNJQkxFX1BBVFRFUk5TXSxcbiAgICBzZW5zaXRpdmVfcGF0aF9wcmVmaXhlczogWy4uLlNFTlNJVElWRV9QQVRIX1BSRUZJWEVTXSxcbiAgICBnYXRla2VlcGVyX2Vzc2VudGlhbF9vcGVyYXRpb25zOiBbLi4uR0FURUtFRVBFUl9FU1NFTlRJQUxfT1BFUkFUSU9OU10sXG4gICAgc2FmZV9tY3Bfb3BlcmF0aW9uczogWy4uLlNBRkVfTUNQX09QRVJBVElPTlNdLFxuICAgIHJpc2tfc2NvcmVzOiB7IC4uLlJJU0tfU0NPUkVTIH0sXG4gIH07XG59XG5cbi8vIOKUgOKUgCBFbGVtZW50IFBvbGljeSBFdmFsdWF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEV2YWx1YXRlIGEgQ0xJIHRvb2wgY2FsbCBhZ2FpbnN0IGFjdGl2ZSBlbGVtZW50IGdhdGVrZWVwZXIgcG9saWNpZXMuXG4gKlxuICogVGhyZWUtc3RlcCBldmFsdWF0aW9uIHBlciBlbGVtZW50IChJc3N1ZSAjNjI1IFBoYXNlIDIpOlxuICogMS4gZGVueVBhdHRlcm5zIChoaWdoZXN0IHByaW9yaXR5KSDigJQgZmlyc3QgbWF0Y2ggPSBpbW1lZGlhdGUgZGVueVxuICogMi4gYWxsb3dQYXR0ZXJucyDigJQgaWYgZWxlbWVudCBkZWZpbmVzIHRoZW0sIHJlY29yZCB3aGV0aGVyIHRvb2wgbWF0Y2hlZFxuICogMy4gQWZ0ZXIgYWxsIGVsZW1lbnRzOiBpZiBhbnkgaGFkIGFsbG93UGF0dGVybnMgYnV0IHRvb2wgd2Fzbid0IGFsbG93ZWQgYnkgYW55ID0gZGVueVxuICpcbiAqIFVuaW9uIHNlbWFudGljczogdG9vbCBtdXN0IG1hdGNoIGF0IGxlYXN0IE9ORSBlbGVtZW50J3MgYWxsb3dQYXR0ZXJucyAobm90IGFsbCkuXG4gKiBFbGVtZW50cyB3aXRob3V0IGFsbG93UGF0dGVybnMgZG9uJ3QgcmVzdHJpY3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRvb2wgbWF0Y2hlcyBhbGxvd1BhdHRlcm5zIGluIGVsZW1lbnQgQSBidXQgbm90IEIg4oaSIEFMTE9XRUQgKHVuaW9uIHNlbWFudGljcylcbiAqIC8vIFRvb2wgbWF0Y2hlcyBkZW55UGF0dGVybnMgaW4gYW55IGVsZW1lbnQg4oaSIERFTklFRCAoZGVueSBhbHdheXMgd2lucylcbiAqIC8vIFRvb2wgbWF0Y2hlcyBubyBhbGxvd1BhdHRlcm5zIGJ1dCBzb21lIGV4aXN0IOKGkiBERU5JRUQgKFwibm90IGluIGFueSBhbGxvd2xpc3RcIilcbiAqIC8vIE5vIGFsbG93UGF0dGVybnMgZGVmaW5lZCBhbnl3aGVyZSDihpIgUGhhc2UgMSBiZWhhdmlvciAoZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQpXG4gKlxuICogQHJldHVybnMgJ2RlbnknIGlmIGJsb2NrZWQsICdldmFsdWF0ZScgaWYgcGVybWl0dGVkIHRvIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUNsaVRvb2xQb2xpY3koXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIHRvb2xJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGFjdGl2ZUVsZW1lbnRzOiBBY3RpdmVFbGVtZW50W11cbik6IENsaVRvb2xQb2xpY3lSZXN1bHQge1xuICBjb25zdCBldmFsdWF0ZWRFbGVtZW50czogUG9saWN5RXZhbHVhdGlvbkNvbnRleHRbJ2V2YWx1YXRlZEVsZW1lbnRzJ10gPSBbXTtcbiAgY29uc3QgZGVjaXNpb25DaGFpbjogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoIWFjdGl2ZUVsZW1lbnRzLmxlbmd0aCkge1xuICAgIGRlY2lzaW9uQ2hhaW4ucHVzaCgnTm8gYWN0aXZlIGVsZW1lbnRzIOKAlCBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCcpO1xuICAgIHJldHVybiB7XG4gICAgICBiZWhhdmlvcjogJ2V2YWx1YXRlJyxcbiAgICAgIHBvbGljeUNvbnRleHQ6IHsgZXZhbHVhdGVkRWxlbWVudHMsIGRlY2lzaW9uQ2hhaW4gfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQnVpbGQgdGhlIHN0cmluZ3MgdG8gbWF0Y2ggYWdhaW5zdCBwYXR0ZXJuc1xuICBjb25zdCBtYXRjaFRhcmdldHMgPSBidWlsZE1hdGNoVGFyZ2V0cyh0b29sTmFtZSwgdG9vbElucHV0KTtcblxuICBsZXQgYW55RWxlbWVudEhhc0FsbG93UGF0dGVybnMgPSBmYWxzZTtcbiAgbGV0IHRvb2xBbGxvd2VkQnlBbnlFbGVtZW50ID0gZmFsc2U7XG4gIGNvbnN0IGVsZW1lbnRzV2l0aEFsbG93UGF0dGVybnM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFjdGl2ZUVsZW1lbnRzKSB7XG4gICAgY29uc3QgcmVzdHJpY3Rpb25zID0gZWxlbWVudC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uZXh0ZXJuYWxSZXN0cmljdGlvbnM7XG4gICAgY29uc3QgZGVueVBhdHRlcm5zID0gcmVzdHJpY3Rpb25zPy5kZW55UGF0dGVybnM7XG4gICAgY29uc3QgYWxsb3dQYXR0ZXJucyA9IHJlc3RyaWN0aW9ucz8uYWxsb3dQYXR0ZXJucztcblxuICAgIGNvbnN0IGhhc1Jlc3RyaWN0aW9ucyA9IChBcnJheS5pc0FycmF5KGRlbnlQYXR0ZXJucykgJiYgZGVueVBhdHRlcm5zLmxlbmd0aCA+IDApXG4gICAgICB8fCAoQXJyYXkuaXNBcnJheShhbGxvd1BhdHRlcm5zKSAmJiBhbGxvd1BhdHRlcm5zLmxlbmd0aCA+IDApO1xuXG4gICAgaWYgKCFoYXNSZXN0cmljdGlvbnMpIHtcbiAgICAgIGV2YWx1YXRlZEVsZW1lbnRzLnB1c2goeyB0eXBlOiBlbGVtZW50LnR5cGUsIG5hbWU6IGVsZW1lbnQubmFtZSB9KTtcbiAgICAgIGRlY2lzaW9uQ2hhaW4ucHVzaChgJHtlbGVtZW50LnR5cGV9ICcke2VsZW1lbnQubmFtZX0nOiBubyBleHRlcm5hbFJlc3RyaWN0aW9uc2ApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gU3RlcCAxOiBDaGVjayBkZW55UGF0dGVybnMgKGhpZ2hlc3QgcHJpb3JpdHkpXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVueVBhdHRlcm5zKSkge1xuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGRlbnlQYXR0ZXJucykge1xuICAgICAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbWF0Y2hUYXJnZXRzKSB7XG4gICAgICAgICAgaWYgKG1hdGNoZXNQYXR0ZXJuKHRhcmdldCwgcGF0dGVybikpIHtcbiAgICAgICAgICAgIGV2YWx1YXRlZEVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgICAgICAgbWF0Y2hlZDogJ2RlbnlQYXR0ZXJucycsXG4gICAgICAgICAgICAgIG1hdGNoZWRQYXR0ZXJuOiBwYXR0ZXJuLFxuICAgICAgICAgICAgICBtYXRjaGVkVGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlY2lzaW9uQ2hhaW4ucHVzaChgREVOWTogJHtlbGVtZW50LnR5cGV9ICcke2VsZW1lbnQubmFtZX0nIGRlbnlQYXR0ZXJuICcke3BhdHRlcm59JyBtYXRjaGVzICcke3RhcmdldH0nYCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgRGVuaWVkIGJ5ICR7ZWxlbWVudC50eXBlfSAnJHtlbGVtZW50Lm5hbWV9JyBwb2xpY3k6IHBhdHRlcm4gJyR7cGF0dGVybn0nIG1hdGNoZXMgJyR7dGFyZ2V0fSdgLFxuICAgICAgICAgICAgICBwb2xpY3lDb250ZXh0OiB7IGV2YWx1YXRlZEVsZW1lbnRzLCBkZWNpc2lvbkNoYWluIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMjogQ2hlY2sgYWxsb3dQYXR0ZXJuc1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFsbG93UGF0dGVybnMpICYmIGFsbG93UGF0dGVybnMubGVuZ3RoID4gMCkge1xuICAgICAgYW55RWxlbWVudEhhc0FsbG93UGF0dGVybnMgPSB0cnVlO1xuICAgICAgZWxlbWVudHNXaXRoQWxsb3dQYXR0ZXJucy5wdXNoKGAke2VsZW1lbnQudHlwZX0gJyR7ZWxlbWVudC5uYW1lfSdgKTtcbiAgICAgIGxldCBtYXRjaGVkQWxsb3cgPSBmYWxzZTtcblxuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGFsbG93UGF0dGVybnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXR0ZXJuICE9PSAnc3RyaW5nJykgY29udGludWU7XG4gICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIG1hdGNoVGFyZ2V0cykge1xuICAgICAgICAgIGlmIChtYXRjaGVzUGF0dGVybih0YXJnZXQsIHBhdHRlcm4pKSB7XG4gICAgICAgICAgICBldmFsdWF0ZWRFbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZTogZWxlbWVudC50eXBlLFxuICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWUsXG4gICAgICAgICAgICAgIG1hdGNoZWQ6ICdhbGxvd1BhdHRlcm5zJyxcbiAgICAgICAgICAgICAgbWF0Y2hlZFBhdHRlcm46IHBhdHRlcm4sXG4gICAgICAgICAgICAgIG1hdGNoZWRUYXJnZXQ6IHRhcmdldCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVjaXNpb25DaGFpbi5wdXNoKGAke2VsZW1lbnQudHlwZX0gJyR7ZWxlbWVudC5uYW1lfSc6IGFsbG93UGF0dGVybiAnJHtwYXR0ZXJufScgbWF0Y2hlcyAnJHt0YXJnZXR9J2ApO1xuICAgICAgICAgICAgdG9vbEFsbG93ZWRCeUFueUVsZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgbWF0Y2hlZEFsbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobWF0Y2hlZEFsbG93KSBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKCFtYXRjaGVkQWxsb3cpIHtcbiAgICAgICAgZXZhbHVhdGVkRWxlbWVudHMucHVzaCh7IHR5cGU6IGVsZW1lbnQudHlwZSwgbmFtZTogZWxlbWVudC5uYW1lIH0pO1xuICAgICAgICBkZWNpc2lvbkNoYWluLnB1c2goYCR7ZWxlbWVudC50eXBlfSAnJHtlbGVtZW50Lm5hbWV9JzogYWxsb3dQYXR0ZXJucyBkZWZpbmVkIGJ1dCBubyBtYXRjaGApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBldmFsdWF0ZWRFbGVtZW50cy5wdXNoKHsgdHlwZTogZWxlbWVudC50eXBlLCBuYW1lOiBlbGVtZW50Lm5hbWUgfSk7XG4gICAgICBkZWNpc2lvbkNoYWluLnB1c2goYCR7ZWxlbWVudC50eXBlfSAnJHtlbGVtZW50Lm5hbWV9JzogZGVueVBhdHRlcm5zIGNoZWNrZWQsIG5vIG1hdGNoYCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RlcCAzOiBJZiBhbnkgZWxlbWVudCBoYWQgYWxsb3dQYXR0ZXJucywgdG9vbCBtdXN0IGhhdmUgbWF0Y2hlZCBhdCBsZWFzdCBvbmVcbiAgaWYgKGFueUVsZW1lbnRIYXNBbGxvd1BhdHRlcm5zICYmICF0b29sQWxsb3dlZEJ5QW55RWxlbWVudCkge1xuICAgIGNvbnN0IHJlc3RyaWN0b3JzID0gZWxlbWVudHNXaXRoQWxsb3dQYXR0ZXJucy5qb2luKCcsICcpO1xuICAgIGRlY2lzaW9uQ2hhaW4ucHVzaChgREVOWTogdG9vbCBub3QgaW4gYW55IGVsZW1lbnQgYWxsb3dsaXN0IChyZXN0cmljdGVkIGJ5OiAke3Jlc3RyaWN0b3JzfSlgKTtcbiAgICByZXR1cm4ge1xuICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgIG1lc3NhZ2U6IGBUb29sICcke3Rvb2xOYW1lfScgbm90IHBlcm1pdHRlZCBieSBhbGxvd2xpc3RzIGRlZmluZWQgaW46ICR7cmVzdHJpY3RvcnN9LiBFaXRoZXIgZGVhY3RpdmF0ZSB0aGVzZSBlbGVtZW50cyBvciBhZGQgYWxsb3dQYXR0ZXJucyB0byBtYXRjaCB0aGlzIHRvb2wuYCxcbiAgICAgIHBvbGljeUNvbnRleHQ6IHsgZXZhbHVhdGVkRWxlbWVudHMsIGRlY2lzaW9uQ2hhaW4gfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGFueUVsZW1lbnRIYXNBbGxvd1BhdHRlcm5zKSB7XG4gICAgZGVjaXNpb25DaGFpbi5wdXNoKCdUb29sIG1hdGNoZWQgYWxsb3dsaXN0IOKAlCBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCcpO1xuICB9IGVsc2Uge1xuICAgIGRlY2lzaW9uQ2hhaW4ucHVzaCgnTm8gYWxsb3dQYXR0ZXJucyBkZWZpbmVkIOKAlCBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCAoUGhhc2UgMSBiZWhhdmlvciknKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmVoYXZpb3I6ICdldmFsdWF0ZScsXG4gICAgcG9saWN5Q29udGV4dDogeyBldmFsdWF0ZWRFbGVtZW50cywgZGVjaXNpb25DaGFpbiB9LFxuICB9O1xufVxuXG4vKipcbiAqIE1heGltdW0gaW5wdXQgbGVuZ3RoIGZvciBwYXR0ZXJuIG1hdGNoaW5nIHRhcmdldHMuXG4gKiBUcnVuY2F0ZXMgbG9uZyBjb21tYW5kcy9wYXRocyB0byBwcmV2ZW50IERvUyB2aWEgcGF0aG9sb2dpY2FsIGdsb2IgbWF0Y2hpbmcuXG4gKi9cbmNvbnN0IE1BWF9NQVRDSF9JTlBVVF9MRU5HVEggPSAxMDAwO1xuXG4vKipcbiAqIFN0cmlwIG51bGwgYnl0ZXMsIGNvbnRyb2wgY2hhcmFjdGVycywgYW5kIG5vcm1hbGl6ZSBVbmljb2RlIGZvciBtYXRjaCBpbnB1dC5cbiAqIFByZXNlcnZlcyB0YWIgKFxceDA5KSwgbmV3bGluZSAoXFx4MEEpLCBjYXJyaWFnZSByZXR1cm4gKFxceDBEKS5cbiAqIFByZXZlbnRzIHBhdHRlcm4gYnlwYXNzIHZpYSBpbmplY3RlZCBjb250cm9sIGNoYXJhY3RlcnMgb3IgVW5pY29kZVxuICogbm9ybWFsaXphdGlvbiBhdHRhY2tzIChlLmcuLCBjb21iaW5pbmcgY2hhcmFjdGVycyB0aGF0IGxvb2sgbGlrZSBBU0NJSSkuXG4gKi9cbmZ1bmN0aW9uIHNhbml0aXplTWF0Y2hJbnB1dChpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gTm9ybWFsaXplIFVuaWNvZGUgdG8gTkZDIChjYW5vbmljYWwgZGVjb21wb3NpdGlvbiB0aGVuIGNvbXBvc2l0aW9uKS5cbiAgLy8gVGhpcyBwcmV2ZW50cyBieXBhc3MgdmlhIGNvbWJpbmluZyBjaGFyYWN0ZXJzIG9yIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucy5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IGlucHV0Lm5vcm1hbGl6ZSgnTkZDJyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gIHJldHVybiBub3JtYWxpemVkLnJlcGxhY2UoL1tcXHgwMC1cXHgwOFxceDBCXFx4MENcXHgwRS1cXHgxRlxceDdGLVxceDlGXS9nLCAnJyk7XG59XG5cbi8qKlxuICogQnVpbGQgbWF0Y2ggdGFyZ2V0IHN0cmluZ3MgZm9yIGEgdG9vbCBjYWxsLlxuICpcbiAqIEZvciBCYXNoOiBtYXRjaGVzIGFnYWluc3QgdGhlIHRvb2wgbmFtZSBhbmQgXCJCYXNoOjxjb21tYW5kPlwiXG4gKiBGb3IgRWRpdC9Xcml0ZTogbWF0Y2hlcyBhZ2FpbnN0IHRoZSB0b29sIG5hbWUgYW5kIFwiRWRpdDo8ZmlsZV9wYXRoPlwiXG4gKiBGb3IgTUNQIHRvb2xzOiBtYXRjaGVzIGFnYWluc3QgdGhlIGZ1bGwgdG9vbCBuYW1lXG4gKlxuICogSW5wdXRzIGFyZSB0cnVuY2F0ZWQgdG8gTUFYX01BVENIX0lOUFVUX0xFTkdUSCBhbmQgc2FuaXRpemVkIHRvIHByZXZlbnRcbiAqIERvUyB2aWEgcGF0aG9sb2dpY2FsIGdsb2IgbWF0Y2hpbmcgYW5kIHBhdHRlcm4gYnlwYXNzIHZpYSBjb250cm9sIGNoYXJzLlxuICovXG5mdW5jdGlvbiBidWlsZE1hdGNoVGFyZ2V0cyhcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgdG9vbElucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogc3RyaW5nW10ge1xuICBjb25zdCB0YXJnZXRzID0gW3Rvb2xOYW1lXTtcblxuICBpZiAodG9vbE5hbWUgPT09ICdCYXNoJyAmJiB0eXBlb2YgdG9vbElucHV0LmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVNYXRjaElucHV0KHRvb2xJbnB1dC5jb21tYW5kLnNsaWNlKDAsIE1BWF9NQVRDSF9JTlBVVF9MRU5HVEgpKTtcbiAgICB0YXJnZXRzLnB1c2goYEJhc2g6JHtzYW5pdGl6ZWR9YCk7XG4gIH0gZWxzZSBpZiAoKHRvb2xOYW1lID09PSAnRWRpdCcgfHwgdG9vbE5hbWUgPT09ICdXcml0ZScpICYmIHR5cGVvZiB0b29sSW5wdXQuZmlsZV9wYXRoID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplTWF0Y2hJbnB1dCh0b29sSW5wdXQuZmlsZV9wYXRoLnNsaWNlKDAsIE1BWF9NQVRDSF9JTlBVVF9MRU5HVEgpKTtcbiAgICB0YXJnZXRzLnB1c2goYCR7dG9vbE5hbWV9OiR7c2FuaXRpemVkfWApO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldHM7XG59XG4iXX0=
661
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9vbENsYXNzaWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2hhbmRsZXJzL21jcC1hcWwvcG9saWNpZXMvVG9vbENsYXNzaWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBaUNsRCx3RUFBd0U7QUFFeEU7Ozs7Ozs7R0FPRztBQUNILE1BQU0sK0JBQStCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDOUMsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsWUFBWTtJQUNaLHFCQUFxQjtJQUNyQixxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLHdCQUF3QixFQUFRLHFCQUFxQjtJQUNyRCwyQkFBMkIsRUFBSyxxQkFBcUI7Q0FDdEQsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7R0FPRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDbEMsZUFBZTtJQUNmLGFBQWE7SUFDYixxQkFBcUI7SUFDckIsaUJBQWlCO0lBQ2pCLGdCQUFnQjtJQUNoQixxQkFBcUI7SUFDckIsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLHFCQUFxQjtJQUNyQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQiw0QkFBNEI7SUFDNUIsd0JBQXdCO0lBQ3hCLDZCQUE2QjtJQUM3QixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixZQUFZO0lBQ1osbUJBQW1CO0lBQ25CLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsZ0JBQWdCO0lBQ2hCLHlCQUF5QjtJQUN6QixZQUFZO0lBQ1osZUFBZTtJQUNmLHVCQUF1QjtJQUN2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QUUsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1FBQzNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVG9vbCBDbGFzc2lmaWNhdGlvbiBmb3IgQ0xJLUxldmVsIFBlcm1pc3Npb24gUHJvbXB0c1xuICpcbiAqIFByb3ZpZGVzIHN0YXRpYyBjbGFzc2lmaWNhdGlvbiBvZiBDbGF1ZGUgQ29kZSBDTEkgdG9vbCBjYWxscyBhbmRcbiAqIGV2YWx1YXRpb24gYWdhaW5zdCBhY3RpdmUgZWxlbWVudCBnYXRla2VlcGVyIHBvbGljaWVzLlxuICpcbiAqIFVzZWQgYnkgdGhlIHBlcm1pc3Npb25fcHJvbXB0IG9wZXJhdGlvbiAoSXNzdWUgIzYyNSkgdG8gZXZhbHVhdGVcbiAqIC0tcGVybWlzc2lvbi1wcm9tcHQtdG9vbCByZXF1ZXN0cyB3aXRob3V0IHJlcXVpcmluZyBMTE0gZXZhbHVhdGlvbi5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWF0Y2hlc1BhdHRlcm4gfSBmcm9tICcuLi8uLi8uLi91dGlscy9wYXR0ZXJuTWF0Y2hlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBBY3RpdmVFbGVtZW50IH0gZnJvbSAnLi9FbGVtZW50UG9saWNpZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSaXNrQXNzZXNzbWVudCB9IGZyb20gJy4uL0dhdGVrZWVwZXJUeXBlcy5qcyc7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IHR5cGUgVG9vbFJpc2tMZXZlbCA9ICdzYWZlJyB8ICdtb2RlcmF0ZScgfCAnZGFuZ2Vyb3VzJyB8ICdibG9ja2VkJztcblxuZXhwb3J0IGludGVyZmFjZSBUb29sQ2xhc3NpZmljYXRpb25SZXN1bHQge1xuICByaXNrTGV2ZWw6IFRvb2xSaXNrTGV2ZWw7XG4gIC8qKiAnYWxsb3cnID0gYXV0by1hcHByb3ZlLCAnZGVueScgPSBhdXRvLXJlamVjdCwgJ2V2YWx1YXRlJyA9IGNoZWNrIGVsZW1lbnQgcG9saWNpZXMgKi9cbiAgYmVoYXZpb3I6ICdhbGxvdycgfCAnZGVueScgfCAnZXZhbHVhdGUnO1xuICByZWFzb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb2xpY3lFdmFsdWF0aW9uQ29udGV4dCB7XG4gIGV2YWx1YXRlZEVsZW1lbnRzOiBBcnJheTx7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtYXRjaGVkPzogJ2FsbG93UGF0dGVybnMnIHwgJ2NvbmZpcm1QYXR0ZXJucycgfCAnZGVueVBhdHRlcm5zJztcbiAgICBtYXRjaGVkUGF0dGVybj86IHN0cmluZztcbiAgICBtYXRjaGVkVGFyZ2V0Pzogc3RyaW5nO1xuICB9PjtcbiAgZGVjaXNpb25DaGFpbjogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpVG9vbFBvbGljeVJlc3VsdCB7XG4gIGJlaGF2aW9yOiAnYWxsb3cnIHwgJ2RlbnknIHwgJ2V2YWx1YXRlJyB8ICdjb25maXJtJztcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgY29uZmlybVNvdXJjZT86IHN0cmluZztcbiAgcG9saWN5Q29udGV4dD86IFBvbGljeUV2YWx1YXRpb25Db250ZXh0O1xufVxuXG4vLyDilIDilIAgR2F0ZWtlZXBlci1Fc3NlbnRpYWwgT3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBNQ1AtQVFMIG9wZXJhdGlvbnMgdGhhdCBtdXN0IE5FVkVSIGJlIGJsb2NrZWQgYnkgcGVybWlzc2lvbl9wcm9tcHQsXG4gKiBldmVuIGlmIGVsZW1lbnQgZGVueVBhdHRlcm5zIHdvdWxkIG1hdGNoIHRoZSBNQ1AgdG9vbCBuYW1lLlxuICpcbiAqIFRoZXNlIGFyZSBlc3NlbnRpYWwgZm9yIHRoZSBHYXRla2VlcGVyIGZsb3cgaXRzZWxmLiBCbG9ja2luZyB0aGVtXG4gKiB3b3VsZCBwcmV2ZW50IHRoZSBodW1hbi1pbi10aGUtbG9vcCBhcHByb3ZhbCBwYXRoIGZyb20gZnVuY3Rpb25pbmdcbiAqIChlLmcuLCBhIGRlbnlQYXR0ZXJuIG9mICdtY3BfX0RvbGxob3VzZU1DUConIHdvdWxkIGJsb2NrIGNvbmZpcm1fb3BlcmF0aW9uKS5cbiAqL1xuY29uc3QgR0FURUtFRVBFUl9FU1NFTlRJQUxfT1BFUkFUSU9OUyA9IG5ldyBTZXQoW1xuICAnY29uZmlybV9vcGVyYXRpb24nLFxuICAndmVyaWZ5X2NoYWxsZW5nZScsXG4gICdwZXJtaXNzaW9uX3Byb21wdCcsXG4gICdpbnRyb3NwZWN0JyxcbiAgJ2dldF9hY3RpdmVfZWxlbWVudHMnLFxuICAnZ2V0X2V4ZWN1dGlvbl9zdGF0ZScsXG4gICdnZXRfZ2F0aGVyZWRfZGF0YScsXG4gICdhcHByb3ZlX2NsaV9wZXJtaXNzaW9uJywgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSAzXG4gICdnZXRfcGVuZGluZ19jbGlfYXBwcm92YWxzJywgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSAzXG5dKTtcblxuLyoqXG4gKiBNQ1AtQVFMIG9wZXJhdGlvbnMgdGhhdCBhcmUgaW5oZXJlbnRseSByZWFkLW9ubHkuXG4gKlxuICogVGhlc2UgYXV0by1hbGxvdyBpbiBwZXJtaXNzaW9uX3Byb21wdCAobm8gZWxlbWVudCBwb2xpY3kgZXZhbHVhdGlvbikuXG4gKiBUaGUgR2F0ZWtlZXBlciAoTGF5ZXIgMikgc3RpbGwgYXBwbGllcyBpdHMgb3duIHBlci1vcGVyYXRpb24gcG9saWNpZXMsXG4gKiBzbyB0aGlzIGRvZXNuJ3QgYnlwYXNzIHNlcnZlci1zaWRlIGFjY2VzcyBjb250cm9sIOKAlCBpdCBqdXN0IGF2b2lkc1xuICogdW5uZWNlc3NhcnkgJ2V2YWx1YXRlJyByb3VuZC10cmlwcyBmb3Igb3BlcmF0aW9ucyB0aGF0IGNhbid0IG1vZGlmeSBzdGF0ZS5cbiAqL1xuY29uc3QgU0FGRV9NQ1BfT1BFUkFUSU9OUyA9IG5ldyBTZXQoW1xuICAnbGlzdF9lbGVtZW50cycsXG4gICdnZXRfZWxlbWVudCcsXG4gICdnZXRfZWxlbWVudF9kZXRhaWxzJyxcbiAgJ3NlYXJjaF9lbGVtZW50cycsXG4gICdxdWVyeV9lbGVtZW50cycsXG4gICdnZXRfYWN0aXZlX2VsZW1lbnRzJyxcbiAgJ3ZhbGlkYXRlX2VsZW1lbnQnLFxuICAncmVuZGVyJyxcbiAgJ2V4cG9ydF9lbGVtZW50JyxcbiAgJ2ludHJvc3BlY3QnLFxuICAnZ2V0X2V4ZWN1dGlvbl9zdGF0ZScsXG4gICdnZXRfZ2F0aGVyZWRfZGF0YScsXG4gICdicm93c2VfY29sbGVjdGlvbicsXG4gICdzZWFyY2hfY29sbGVjdGlvbicsXG4gICdzZWFyY2hfY29sbGVjdGlvbl9lbmhhbmNlZCcsXG4gICdnZXRfY29sbGVjdGlvbl9jb250ZW50JyxcbiAgJ2dldF9jb2xsZWN0aW9uX2NhY2hlX2hlYWx0aCcsXG4gICdwb3J0Zm9saW9fc3RhdHVzJyxcbiAgJ3BvcnRmb2xpb19jb25maWcnLFxuICAnc2VhcmNoX3BvcnRmb2xpbycsXG4gICdzZWFyY2hfYWxsJyxcbiAgJ2NoZWNrX2dpdGh1Yl9hdXRoJyxcbiAgJ29hdXRoX2hlbHBlcl9zdGF0dXMnLFxuICAnZG9sbGhvdXNlX2NvbmZpZycsXG4gICdnZXRfYnVpbGRfaW5mbycsXG4gICdnZXRfY2FjaGVfYnVkZ2V0X3JlcG9ydCcsXG4gICdxdWVyeV9sb2dzJyxcbiAgJ3F1ZXJ5X21ldHJpY3MnLFxuICAnZmluZF9zaW1pbGFyX2VsZW1lbnRzJyxcbiAgJ2dldF9lbGVtZW50X3JlbGF0aW9uc2hpcHMnLFxuICAnc2VhcmNoX2J5X3ZlcmInLFxuICAnZ2V0X3JlbGF0aW9uc2hpcF9zdGF0cycsXG4gICdnZXRfZWZmZWN0aXZlX2NsaV9wb2xpY2llcycsXG4gICdnZXRfcGVuZGluZ19jbGlfYXBwcm92YWxzJyxcbl0pO1xuXG4vLyDilIDilIAgU3RhdGljIENsYXNzaWZpY2F0aW9uIExpc3RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFRvb2xzIHRoYXQgYXJlIGFsd2F5cyBzYWZlIChyZWFkLW9ubHksIG5vIHNpZGUgZWZmZWN0cykuXG4gKlxuICogTk9URTogXCJTYWZlXCIgaGVyZSBtZWFucyBubyBkZXN0cnVjdGl2ZSBzaWRlIGVmZmVjdHMg4oCUIGl0IGRvZXMgTk9UIG1lYW5cbiAqIHVucmVzdHJpY3RlZC4gUmVhZC1vbmx5IHRvb2xzIGNhbiBzdGlsbCBwb3NlIGluZm9ybWF0aW9uLWxlYWthZ2Ugb3JcbiAqIHNjb3BlLWNyZWVwIHJpc2tzIHdoZW4gdXNlZCB0byBhY2Nlc3MgZmlsZXMgb3V0c2lkZSB0aGUgcHJvamVjdCB3b3JraW5nXG4gKiBkaXJlY3RvcnkgKGUuZy4sIH4vLnNzaC8qLCAvZXRjL3Bhc3N3ZCwgY3JlZGVudGlhbHMgaW4gaG9tZSBkaXJlY3RvcmllcykuXG4gKiBNb3N0IExMTSBjbGllbnRzIChDbGF1ZGUgQ29kZSwgQ3Vyc29yLCBldGMuKSBhbHJlYWR5IGVuZm9yY2UgZGlyZWN0b3J5XG4gKiBzY29waW5nIGF0IHRoZSBjbGllbnQgbGV2ZWwuIFRoZSBgYXNzZXNzUmlzaygpYCBmdW5jdGlvbiBhcHBsaWVzIGEgc21hbGxcbiAqIHNjb3JlIGJ1bXAgZm9yIHJlYWQgb3BlcmF0aW9ucyB0YXJnZXRpbmcgb3V0LW9mLXNjb3BlIHBhdGhzIGFzIGFuXG4gKiBhZGRpdGlvbmFsIHNpZ25hbCBmb3IgYXBwcm92YWwgcG9saWNpZXMuXG4gKi9cbmNvbnN0IFNBRkVfVE9PTFMgPSBuZXcgU2V0KFtcbiAgJ1JlYWQnLFxuICAnR3JlcCcsXG4gICdHbG9iJyxcbiAgJ1dlYkZldGNoJyxcbiAgJ1dlYlNlYXJjaCcsXG4gICdUYXNrQ3JlYXRlJyxcbiAgJ1Rhc2tVcGRhdGUnLFxuICAnVGFza0dldCcsXG4gICdUYXNrTGlzdCcsXG4gICdUYXNrT3V0cHV0JyxcbiAgJ0Fza1VzZXJRdWVzdGlvbicsXG4gICdFbnRlclBsYW5Nb2RlJyxcbiAgJ0V4aXRQbGFuTW9kZScsXG4gICdUb2RvUmVhZCcsXG4gICdUb2RvV3JpdGUnLFxuXSk7XG5cbi8qKiBCYXNoIGNvbW1hbmQgcHJlZml4ZXMvcGF0dGVybnMgdGhhdCBhcmUgc2FmZSAqL1xuY29uc3QgU0FGRV9CQVNIX1BBVFRFUk5TID0gW1xuICAnZ2l0IHN0YXR1cyonLFxuICAnZ2l0IGxvZyonLFxuICAnZ2l0IGRpZmYqJyxcbiAgJ2dpdCBicmFuY2gqJyxcbiAgJ2dpdCBzaG93KicsXG4gICdnaXQgcmVtb3RlKicsXG4gICdnaXQgc3Rhc2ggbGlzdConLFxuICAnbHMqJyxcbiAgJ3B3ZCcsXG4gICdjYXQgKicsXG4gICdoZWFkIConLFxuICAndGFpbCAqJyxcbiAgJ3djIConLFxuICAnZWNobyAqJyxcbiAgJ25wbSB0ZXN0KicsXG4gICducG0gcnVuIGxpbnQqJyxcbiAgJ25wbSBydW4gYnVpbGQqJyxcbiAgJ25wbSBydW4gdGVzdConLFxuICAnbnBtIHJ1biBjaGVjayonLFxuICAnbnBtIHJ1biB0eXBlY2hlY2sqJyxcbiAgJ25wbSBydW4gZm9ybWF0KicsXG4gICducG0gbHMqJyxcbiAgJ25wbSBpbmZvKicsXG4gICducG0gb3V0ZGF0ZWQqJyxcbiAgJ25weCBqZXN0KicsXG4gICducHggdHNjIC0tbm9FbWl0KicsXG4gICdub2RlIC0tdmVyc2lvbionLFxuICAnd2hpY2ggKicsXG4gICd0eXBlIConLFxuICAnZ2ggaXNzdWUgbGlzdConLFxuICAnZ2ggaXNzdWUgdmlldyonLFxuICAnZ2ggcHIgbGlzdConLFxuICAnZ2ggcHIgdmlldyonLFxuICAnZ2ggcHIgY2hlY2tzKicsXG5dO1xuXG4vKiogQmFzaCBjb21tYW5kIHBhdHRlcm5zIHRoYXQgYXJlIGRhbmdlcm91cyAqL1xuY29uc3QgREFOR0VST1VTX0JBU0hfUEFUVEVSTlMgPSBbXG4gICdybSAtcmYgKicsXG4gICdybSAtZnIgKicsXG4gICdnaXQgcHVzaCAtLWZvcmNlKicsXG4gICdnaXQgcHVzaCAtZiAqJyxcbiAgJ2dpdCByZXNldCAtLWhhcmQqJyxcbiAgJ2dpdCBjbGVhbiAtZionLFxuICAnZ2l0IGNoZWNrb3V0IC0tIConLFxuICAnZ2l0IGJyYW5jaCAtRCAqJyxcbiAgJ2NobW9kIDc3NyonLFxuICAnY2htb2QgLVIgNzc3KicsXG4gICdjaG1vZCArcyAqJyxcbiAgJ2Nob3duIHJvb3QgKicsXG4gICdzdWRvIConLFxuICAnZG9hcyAqJyxcbiAgJ3N1IC0qJyxcbiAgJ2V2YWwgKicsXG4gIC8vIFBpcGUtdG8tc2hlbGwgcGF0dGVybnMgKHdpdGggYW5kIHdpdGhvdXQgc3BhY2VzLCBtdWx0aXBsZSBzaGVsbHMpXG4gICcqfCBzaCcsXG4gICcqfCBzaCAqJyxcbiAgJyp8c2gnLFxuICAnKnxzaCAqJyxcbiAgJyp8IGJhc2gnLFxuICAnKnwgYmFzaCAqJyxcbiAgJyp8YmFzaCcsXG4gICcqfGJhc2ggKicsXG4gICcqfCB6c2gnLFxuICAnKnx6c2gnLFxuICAnY3VybCAqIHwgKicsXG4gICd3Z2V0ICogfCAqJyxcbiAgLy8gUGFja2FnZSBtYW5hZ2VyIGluc3RhbGxzIChjYW4gZXhlY3V0ZSBhcmJpdHJhcnkgcG9zdC1pbnN0YWxsIHNjcmlwdHMpXG4gICducG0gaW5zdGFsbCAqJyxcbiAgJ25wbSBpbnN0YWxsJyxcbiAgJ25wbSBpIConLFxuICAnbnBtIGknLFxuICAneWFybiBhZGQgKicsXG4gICd5YXJuIGluc3RhbGwqJyxcbiAgJ3BpcCBpbnN0YWxsIConLFxuICAnZ2VtIGluc3RhbGwgKicsXG4gIC8vIEVudmlyb25tZW50IG1hbmlwdWxhdGlvbiAocGF0aCBwb2lzb25pbmcsIGxpYnJhcnkgaW5qZWN0aW9uLCB2YXJpYWJsZSBkZXN0cnVjdGlvbilcbiAgJ2V4cG9ydCBQQVRIPSonLFxuICAnZXhwb3J0IExEX1BSRUxPQUQ9KicsXG4gICdleHBvcnQgTERfTElCUkFSWV9QQVRIPSonLFxuICAnZW52IC1pIConLFxuICAndW5zZXQgKicsXG4gIC8vIFByb2Nlc3MgY29udHJvbCAoY2FuIHRlcm1pbmF0ZSBhZ2VudHMgb3Igc3lzdGVtIHByb2Nlc3NlcylcbiAgJ2tpbGwgKicsXG4gICdraWxsIC0qJyxcbiAgJ3BraWxsIConLFxuICAna2lsbGFsbCAqJyxcbiAgLy8gTmV0d29yayB0b29scyAoZXhmaWx0cmF0aW9uLCByZXZlcnNlIHNoZWxscylcbiAgJ25jIConLFxuICAnbmMgLSonLFxuICAnbmV0Y2F0IConLFxuICAnbmNhdCAqJyxcbiAgJ3NvY2F0IConLFxuICAvLyBBcmNoaXZlIG9wZXJhdGlvbnMgKGFyY2hpdmUgYm9tYnMsIHJvb3QgZGlyZWN0b3J5IGV4ZmlsdHJhdGlvbi9yYW5zb213YXJlKVxuICAndGFyIC14ZiAqJyxcbiAgJ3RhciB4ZiAqJyxcbiAgJ3ppcCAtciAqIC8nLFxuICAvLyBDb21tYW5kIGNoYWluaW5nIHdpdGggZGFuZ2Vyb3VzIHN1YmNvbW1hbmRzXG4gICcqOyBybSAtcmYgKicsXG4gICcqJiYgcm0gLXJmIConLFxuICAnKnx8IHJtIC1yZiAqJyxcbiAgJyo7IHN1ZG8gKicsXG4gICcqJiYgc3VkbyAqJyxcbiAgJyp8fCBzdWRvIConLFxuICAnKjsgZXZhbCAqJyxcbiAgJyomJiBldmFsIConLFxuICAvLyBTdWJwcm9jZXNzIGV4ZWN1dGlvbiB3cmFwcGVycyAoYnlwYXNzIG91dGVyIGNvbW1hbmQgY2xhc3NpZmljYXRpb24pXG4gICdiYXNoIC1jIConLFxuICAnc2ggLWMgKicsXG4gICd6c2ggLWMgKicsXG4gICcvYmluL2Jhc2ggLWMgKicsXG4gICcvYmluL3NoIC1jIConLFxuICAvLyBQcm9jZXNzIHN1YnN0aXR1dGlvbiAoY2FuIGluamVjdCBhcmJpdHJhcnkgY29tbWFuZCBvdXRwdXQpXG4gICcqPCgqJyxcbiAgLy8gRW5jb2RlZCBwYXlsb2FkIGV4ZWN1dGlvbiAoYmFzZTY0LWRlY29kZSBwaXBlZCB0byBzaGVsbClcbiAgJypiYXNlNjQgLWQqfConLFxuICAnKmJhc2U2NCAtLWRlY29kZSp8KicsXG4gICcqYmFzZTY0IC1EKnwqJyxcbl07XG5cbi8qKiBCYXNoIGNvbW1hbmQgcGF0dGVybnMgdGhhdCBhcmUgYWx3YXlzIGJsb2NrZWQgKi9cbmNvbnN0IEJMT0NLRURfQkFTSF9QQVRURVJOUyA9IFtcbiAgJ21rZnMqJyxcbiAgJ2RkIGlmPSonLFxuICAnOigpezp8OiZ9OzonLFxuICAnZm9ybWF0IConLFxuICAnKigpeyAqJyxcbl07XG5cbi8vIOKUgOKUgCBTdGF0aWMgQ2xhc3NpZmljYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQ2xhc3NpZnkgYSBDTEkgdG9vbCBjYWxsIGJ5IHJpc2sgbGV2ZWwgdXNpbmcgc3RhdGljIHJ1bGVzLlxuICpcbiAqIFJldHVybnMgJ2FsbG93JyBmb3Iga25vd24tc2FmZSB0b29scywgJ2RlbnknIGZvciBrbm93bi1kYW5nZXJvdXMgcGF0dGVybnMsXG4gKiBhbmQgJ2V2YWx1YXRlJyBmb3IgYW55dGhpbmcgdGhhdCBuZWVkcyBmdXJ0aGVyIHBvbGljeSBjaGVja2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5VG9vbChcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgdG9vbElucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogVG9vbENsYXNzaWZpY2F0aW9uUmVzdWx0IHtcbiAgLy8gS25vd24tc2FmZSB0b29sczogYXV0by1hbGxvd1xuICBpZiAoU0FGRV9UT09MUy5oYXModG9vbE5hbWUpKSB7XG4gICAgcmV0dXJuIHsgcmlza0xldmVsOiAnc2FmZScsIGJlaGF2aW9yOiAnYWxsb3cnLCByZWFzb246IGAke3Rvb2xOYW1lfSBpcyBhIHJlYWQtb25seSB0b29sYCB9O1xuICB9XG5cbiAgLy8gQmFzaDogc3ViLWNsYXNzaWZ5IGJ5IGNvbW1hbmQgY29udGVudFxuICBpZiAodG9vbE5hbWUgPT09ICdCYXNoJykge1xuICAgIHJldHVybiBjbGFzc2lmeUJhc2hDb21tYW5kKHRvb2xJbnB1dCk7XG4gIH1cblxuICAvLyBNQ1AgdG9vbCBjYWxsczogYXV0by1hbGxvdyBnYXRla2VlcGVyLWVzc2VudGlhbCBhbmQgc2FmZSByZWFkLW9ubHkgb3BlcmF0aW9ucywgZXZhbHVhdGUgb3RoZXJzXG4gIGlmICh0b29sTmFtZS5zdGFydHNXaXRoKCdtY3BfXycpKSB7XG4gICAgY29uc3Qgb3BlcmF0aW9uID0gdHlwZW9mIHRvb2xJbnB1dC5vcGVyYXRpb24gPT09ICdzdHJpbmcnID8gdG9vbElucHV0Lm9wZXJhdGlvbiA6ICcnO1xuICAgIGlmIChvcGVyYXRpb24gJiYgR0FURUtFRVBFUl9FU1NFTlRJQUxfT1BFUkFUSU9OUy5oYXMob3BlcmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmlza0xldmVsOiAnc2FmZScsXG4gICAgICAgIGJlaGF2aW9yOiAnYWxsb3cnLFxuICAgICAgICByZWFzb246IGBHYXRla2VlcGVyLWVzc2VudGlhbCBvcGVyYXRpb24gJyR7b3BlcmF0aW9ufScg4oCUIGNhbm5vdCBiZSBibG9ja2VkIGJ5IHBlcm1pc3Npb25fcHJvbXB0YCxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChvcGVyYXRpb24gJiYgU0FGRV9NQ1BfT1BFUkFUSU9OUy5oYXMob3BlcmF0aW9uKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmlza0xldmVsOiAnc2FmZScsXG4gICAgICAgIGJlaGF2aW9yOiAnYWxsb3cnLFxuICAgICAgICByZWFzb246IGBSZWFkLW9ubHkgTUNQIG9wZXJhdGlvbiAnJHtvcGVyYXRpb259J2AsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyByaXNrTGV2ZWw6ICdtb2RlcmF0ZScsIGJlaGF2aW9yOiAnZXZhbHVhdGUnLCByZWFzb246ICdNQ1AgdG9vbCBjYWxsIHJlcXVpcmVzIHBvbGljeSBldmFsdWF0aW9uJyB9O1xuICB9XG5cbiAgLy8gRWRpdCwgV3JpdGUsIEFnZW50LCBOb3RlYm9va0VkaXQsIGV0Yy46IG1vZGVyYXRlIHJpc2tcbiAgaWYgKFsnRWRpdCcsICdXcml0ZScsICdBZ2VudCcsICdOb3RlYm9va0VkaXQnXS5pbmNsdWRlcyh0b29sTmFtZSkpIHtcbiAgICByZXR1cm4geyByaXNrTGV2ZWw6ICdtb2RlcmF0ZScsIGJlaGF2aW9yOiAnZXZhbHVhdGUnLCByZWFzb246IGAke3Rvb2xOYW1lfSBtb2RpZmllcyBzdGF0ZSwgcmVxdWlyZXMgcG9saWN5IGV2YWx1YXRpb25gIH07XG4gIH1cblxuICAvLyBVbmtub3duIHRvb2w6IGV2YWx1YXRlIChwZXJtaXNzaXZlIGRlZmF1bHQgZm9yIFBoYXNlIDEpXG4gIHJldHVybiB7IHJpc2tMZXZlbDogJ21vZGVyYXRlJywgYmVoYXZpb3I6ICdldmFsdWF0ZScsIHJlYXNvbjogYFVua25vd24gdG9vbCAnJHt0b29sTmFtZX0nLCByZXF1aXJlcyBwb2xpY3kgZXZhbHVhdGlvbmAgfTtcbn1cblxuLyoqXG4gKiBTdWItY2xhc3NpZnkgQmFzaCBjb21tYW5kcyBieSBtYXRjaGluZyBhZ2FpbnN0IGtub3duIHBhdHRlcm5zLlxuICovXG5mdW5jdGlvbiBjbGFzc2lmeUJhc2hDb21tYW5kKFxuICB0b29sSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4pOiBUb29sQ2xhc3NpZmljYXRpb25SZXN1bHQge1xuICBjb25zdCBjb21tYW5kID0gdHlwZW9mIHRvb2xJbnB1dC5jb21tYW5kID09PSAnc3RyaW5nJyA/IHRvb2xJbnB1dC5jb21tYW5kLnRyaW0oKSA6ICcnO1xuXG4gIGlmICghY29tbWFuZCkge1xuICAgIHJldHVybiB7IHJpc2tMZXZlbDogJ21vZGVyYXRlJywgYmVoYXZpb3I6ICdldmFsdWF0ZScsIHJlYXNvbjogJ0VtcHR5IEJhc2ggY29tbWFuZCcgfTtcbiAgfVxuXG4gIC8vIENoZWNrIGJsb2NrZWQgcGF0dGVybnMgZmlyc3QgKGhpZ2hlc3QgcHJpb3JpdHkpXG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBCTE9DS0VEX0JBU0hfUEFUVEVSTlMpIHtcbiAgICBpZiAobWF0Y2hlc1BhdHRlcm4oY29tbWFuZCwgcGF0dGVybikpIHtcbiAgICAgIHJldHVybiB7IHJpc2tMZXZlbDogJ2Jsb2NrZWQnLCBiZWhhdmlvcjogJ2RlbnknLCByZWFzb246IGBCbG9ja2VkIGNvbW1hbmQgcGF0dGVybjogJHtwYXR0ZXJufWAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBkYW5nZXJvdXMgcGF0dGVybnNcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIERBTkdFUk9VU19CQVNIX1BBVFRFUk5TKSB7XG4gICAgaWYgKG1hdGNoZXNQYXR0ZXJuKGNvbW1hbmQsIHBhdHRlcm4pKSB7XG4gICAgICByZXR1cm4geyByaXNrTGV2ZWw6ICdkYW5nZXJvdXMnLCBiZWhhdmlvcjogJ2RlbnknLCByZWFzb246IGBEYW5nZXJvdXMgY29tbWFuZCBwYXR0ZXJuOiAke3BhdHRlcm59YCB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIHNhZmUgcGF0dGVybnNcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIFNBRkVfQkFTSF9QQVRURVJOUykge1xuICAgIGlmIChtYXRjaGVzUGF0dGVybihjb21tYW5kLCBwYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIHsgcmlza0xldmVsOiAnc2FmZScsIGJlaGF2aW9yOiAnYWxsb3cnLCByZWFzb246IGBTYWZlIGNvbW1hbmQgcGF0dGVybjogJHtwYXR0ZXJufWAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBVbmNsYXNzaWZpZWQ6IGV2YWx1YXRlIGFnYWluc3QgZWxlbWVudCBwb2xpY2llc1xuICByZXR1cm4geyByaXNrTGV2ZWw6ICdtb2RlcmF0ZScsIGJlaGF2aW9yOiAnZXZhbHVhdGUnLCByZWFzb246ICdCYXNoIGNvbW1hbmQgbm90IHN0YXRpY2FsbHkgY2xhc3NpZmllZCcgfTtcbn1cblxuLy8g4pSA4pSAIFJpc2sgQXNzZXNzbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBCYXNlIHJpc2sgc2NvcmVzIGJ5IGNsYXNzaWZpY2F0aW9uIGxldmVsICgwLTEwMCBzY2FsZSkuXG4gKlxuICogU2NvcmUgcmFuZ2VzOlxuICogLSAgMDogICAgIHNhZmUg4oCUIHJlYWQtb25seSB0b29scywgbm8gc2lkZSBlZmZlY3RzXG4gKiAtICAxLTM5OiAgbG93IOKAlCBtaW5vciBzaWRlIGVmZmVjdHMsIGVhc2lseSByZXZlcnNpYmxlXG4gKiAtIDQwLTU5OiAgbW9kZXJhdGUg4oCUIGZpbGUgd3JpdGVzLCBwYWNrYWdlIGluc3RhbGxzLCB1bmNsYXNzaWZpZWQgY29tbWFuZHNcbiAqIC0gNjAtNzk6ICBlbGV2YXRlZCDigJQgbW9kZXJhdGUgKyBhZ2dyYXZhdGluZyBmYWN0b3JzIChuZXR3b3JrLCBmaWxlIGNyZWF0aW9uKVxuICogLSA4MC05OTogIGRhbmdlcm91cyDigJQgZGVzdHJ1Y3RpdmUgY29tbWFuZHMsIHByaXZpbGVnZSBlc2NhbGF0aW9uXG4gKiAtIDEwMDogICAgYmxvY2tlZCDigJQgYWx3YXlzIGRlbmllZCAoZS5nLiwgcmV2ZXJzZSBzaGVsbHMsIGRpc2sgd2lwZSlcbiAqXG4gKiBBZGp1c3RtZW50cyBhcHBsaWVkIG9uIHRvcCBvZiBiYXNlOiBpcnJldmVyc2libGUgcGF0dGVybiAoKzEwKSxcbiAqIG5ldHdvcmsgb3BlcmF0aW9uICgrMTApLCBvdXQtb2Ytc2NvcGUgcmVhZCAoKzEwKSwgZmlsZSBjcmVhdGlvbiAoKzUpLlxuICogU2NvcmUgaXMgY2FwcGVkIGF0IDEwMC5cbiAqL1xuY29uc3QgUklTS19TQ09SRVM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gIHNhZmU6IDAsXG4gIG1vZGVyYXRlOiA0MCxcbiAgZGFuZ2Vyb3VzOiA4MCxcbiAgYmxvY2tlZDogMTAwLFxufTtcblxuLyoqIFJlYWQtb25seSB0b29scyB0aGF0IG1heSByZWZlcmVuY2UgZmlsZSBwYXRocyAqL1xuY29uc3QgU0FGRV9SRUFEX1RPT0xTID0gbmV3IFNldChbJ1JlYWQnLCAnR3JlcCcsICdHbG9iJ10pO1xuXG4vKiogU2Vuc2l0aXZlIHBhdGggcHJlZml4ZXMgdGhhdCBpbmRpY2F0ZSBvdXQtb2Ytc2NvcGUgcmVhZHMgKi9cbmNvbnN0IFNFTlNJVElWRV9QQVRIX1BSRUZJWEVTID0gW1xuICAnfi8uc3NoLycsICd+Ly5nbnVwZy8nLCAnfi8uYXdzLycsICd+Ly5jb25maWcvJyxcbiAgJ34vLmVudicsICd+Ly5uZXRyYycsICd+Ly5ucG1yYycsXG4gICcvZXRjL3NoYWRvdycsICcvZXRjL3Bhc3N3ZCcsICcvZXRjL3N1ZG9lcnMnLFxuICAnL3Byb2MvJywgJy9zeXMvJyxcbl07XG5cbi8qKlxuICogSGV1cmlzdGljOiBkb2VzIGEgcGF0aCBsb29rIGxpa2UgaXQgdGFyZ2V0cyBmaWxlcyBvdXRzaWRlIHRoZSBwcm9qZWN0IHNjb3BlP1xuICogQ2hlY2tzIGZvciBob21lLWRpcmVjdG9yeSBzZW5zaXRpdmUgcGF0aHMsIHN5c3RlbSBwYXRocywgYW5kIHBhcmVudCB0cmF2ZXJzYWxzLlxuICovXG5mdW5jdGlvbiBpc091dE9mU2NvcGVQYXRoKHRhcmdldFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBub3JtYWxpemVkID0gdGFyZ2V0UGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cbiAgLy8gRXhwbGljaXQgc2Vuc2l0aXZlIHBhdGhzXG4gIGZvciAoY29uc3QgcHJlZml4IG9mIFNFTlNJVElWRV9QQVRIX1BSRUZJWEVTKSB7XG4gICAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChwcmVmaXgpIHx8IG5vcm1hbGl6ZWQuaW5jbHVkZXMoYC8ke3ByZWZpeH1gKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gSG9tZSBkaXJlY3RvcnkgcmVmZXJlbmNlcyAofi8uLi4pIHRoYXQgYXJlbid0IHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0XG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ34vJykgfHwgbm9ybWFsaXplZC5zdGFydHNXaXRoKCcvVXNlcnMvJykgfHwgbm9ybWFsaXplZC5zdGFydHNXaXRoKCcvaG9tZS8nKSkge1xuICAgIC8vIEhldXJpc3RpYzogcmVhZGluZyBzZW5zaXRpdmUgZG90ZmlsZXMvZGlycyBvdXRzaWRlIGEgcHJvamVjdC5cbiAgICAvLyBUYXJnZXRzIGtub3duIGNyZWRlbnRpYWwvY29uZmlnIHN0b3JlcyDigJQgYXZvaWRzIGZhbHNlIHBvc2l0aXZlcyBmb3JcbiAgICAvLyBjb21tb24gcHJvamVjdCBkb3RmaWxlcyBsaWtlIC5naXRodWIvLCAudnNjb2RlLywgLmVzbGludHJjLCBldGMuXG4gICAgaWYgKC9cXC9cXC4oc3NofGdudXBnfGF3c3xhenVyZXxnY2xvdWR8a3ViZXxkb2NrZXJ8bnBtcmN8bmV0cmN8ZW52fGJhc2hfaGlzdG9yeXx6c2hfaGlzdG9yeXxjcmVkZW50aWFsc3xwYXNzd29yZHxzZWNyZXQpL2kudGVzdChub3JtYWxpemVkKSkgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBCYXNoIGNvbW1hbmQgcGF0dGVybnMgdGhhdCBhcmUgaXJyZXZlcnNpYmxlICovXG5jb25zdCBJUlJFVkVSU0lCTEVfUEFUVEVSTlMgPSBbXG4gICdybSAtcmYgKicsXG4gICdybSAtZnIgKicsXG4gICdnaXQgcHVzaCAtLWZvcmNlKicsXG4gICdnaXQgcHVzaCAtZiAqJyxcbiAgJ2dpdCByZXNldCAtLWhhcmQqJyxcbiAgJ2dpdCBjbGVhbiAtZionLFxuICAnbWtmcyonLFxuICAnZGQgaWY9KicsXG4gICdkcm9wIConLFxuICAndHJ1bmNhdGUgKicsXG5dO1xuXG4vKipcbiAqIEFzc2VzcyB0aGUgcmlzayBvZiBhIENMSSB0b29sIGNhbGwuXG4gKlxuICogUmV0dXJucyBhIG51bWVyaWMgc2NvcmUgKDAtMTAwKSBhbmQgaXJyZXZlcnNpYmlsaXR5IGluZGljYXRvciBiYXNlZCBvblxuICogdGhlIHN0YXRpYyBjbGFzc2lmaWNhdGlvbiBhbmQgdG9vbC1zcGVjaWZpYyBoZXVyaXN0aWNzLlxuICpcbiAqIEBwYXJhbSB0b29sTmFtZSAtIFRoZSB0b29sIGJlaW5nIGNhbGxlZFxuICogQHBhcmFtIHRvb2xJbnB1dCAtIFRoZSB0b29sIGlucHV0IHBhcmFtZXRlcnNcbiAqIEBwYXJhbSBjbGFzc2lmaWNhdGlvbiAtIFRoZSByZXN1bHQgZnJvbSBjbGFzc2lmeVRvb2woKVxuICogQHJldHVybnMgUmlzayBhc3Nlc3NtZW50IHdpdGggc2NvcmUsIGlycmV2ZXJzaWJpbGl0eSwgYW5kIGNvbnRyaWJ1dGluZyBmYWN0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3Nlc3NSaXNrKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICB0b29sSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjbGFzc2lmaWNhdGlvbjogVG9vbENsYXNzaWZpY2F0aW9uUmVzdWx0XG4pOiBSaXNrQXNzZXNzbWVudCB7XG4gIGxldCBzY29yZSA9IFJJU0tfU0NPUkVTW2NsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbF0gPz8gNDA7XG4gIGNvbnN0IGZhY3RvcnM6IHN0cmluZ1tdID0gW2BCYXNlOiAke2NsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbH0gKCR7UklTS19TQ09SRVNbY2xhc3NpZmljYXRpb24ucmlza0xldmVsXSA/PyA0MH0pYF07XG4gIGxldCBpcnJldmVyc2libGUgPSBmYWxzZTtcblxuICAvLyBDaGVjayBmb3IgaXJyZXZlcnNpYmxlIHBhdHRlcm5zIGluIEJhc2ggY29tbWFuZHNcbiAgaWYgKHRvb2xOYW1lID09PSAnQmFzaCcgJiYgdHlwZW9mIHRvb2xJbnB1dC5jb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGNvbW1hbmQgPSB0b29sSW5wdXQuY29tbWFuZC50cmltKCk7XG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIElSUkVWRVJTSUJMRV9QQVRURVJOUykge1xuICAgICAgaWYgKG1hdGNoZXNQYXR0ZXJuKGNvbW1hbmQsIHBhdHRlcm4pKSB7XG4gICAgICAgIGlycmV2ZXJzaWJsZSA9IHRydWU7XG4gICAgICAgIHNjb3JlID0gTWF0aC5taW4oMTAwLCBzY29yZSArIDEwKTtcbiAgICAgICAgZmFjdG9ycy5wdXNoKGBJcnJldmVyc2libGUgcGF0dGVybjogJHtwYXR0ZXJufSAoKzEwKWApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOZXR3b3JrIG9wZXJhdGlvbnMgaW5jcmVhc2Ugcmlza1xuICAgIGlmICgvXFxiKGN1cmx8d2dldHxmZXRjaHxuY3xuZXRjYXR8bmNhdHxzb2NhdClcXGIvLnRlc3QoY29tbWFuZCkpIHtcbiAgICAgIHNjb3JlID0gTWF0aC5taW4oMTAwLCBzY29yZSArIDEwKTtcbiAgICAgIGZhY3RvcnMucHVzaCgnTmV0d29yayBvcGVyYXRpb24gKCsxMCknKTtcbiAgICB9XG4gIH1cblxuICAvLyBXcml0ZS9FZGl0IG9wZXJhdGlvbnM6IGZpbGUgY3JlYXRpb24gaW5jcmVhc2VzIHJpc2sgc2xpZ2h0bHlcbiAgaWYgKHRvb2xOYW1lID09PSAnV3JpdGUnKSB7XG4gICAgc2NvcmUgPSBNYXRoLm1pbigxMDAsIHNjb3JlICsgNSk7XG4gICAgZmFjdG9ycy5wdXNoKCdGaWxlIGNyZWF0aW9uICgrNSknKTtcbiAgfVxuXG4gIC8vIFJlYWQtb25seSB0b29scyB0YXJnZXRpbmcgcGF0aHMgb3V0c2lkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkuXG4gIC8vIE1vc3QgY2xpZW50cyBhbHJlYWR5IGVuZm9yY2UgZGlyZWN0b3J5IHNjb3BpbmcsIGJ1dCB0aGlzIHByb3ZpZGVzIGFuXG4gIC8vIGFkZGl0aW9uYWwgc2lnbmFsIGZvciBhcHByb3ZhbCBwb2xpY2llcyB0byBhY3Qgb24uXG4gIGlmIChTQUZFX1JFQURfVE9PTFMuaGFzKHRvb2xOYW1lKSkge1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSAodG9vbElucHV0LmZpbGVfcGF0aCA/PyB0b29sSW5wdXQucGF0aCA/PyAnJykgYXMgc3RyaW5nO1xuICAgIGlmICh0YXJnZXRQYXRoICYmIGlzT3V0T2ZTY29wZVBhdGgodGFyZ2V0UGF0aCkpIHtcbiAgICAgIHNjb3JlID0gTWF0aC5taW4oMTAwLCBzY29yZSArIDEwKTtcbiAgICAgIGZhY3RvcnMucHVzaCgnT3V0LW9mLXNjb3BlIHJlYWQgcGF0aCAoKzEwKScpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHNjb3JlLCBpcnJldmVyc2libGUsIGZhY3RvcnMgfTtcbn1cblxuLy8g4pSA4pSAIFN0YXRpYyBQb2xpY3kgRGF0YSBFeHBvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogUmV0dXJuIGFsbCBzdGF0aWMgY2xhc3NpZmljYXRpb24gZGF0YSBmb3IgYnJpZGdlIHBvbGljeSBleHBvcnQuXG4gKlxuICogVXNlZCBieSBQb2xpY3lFeHBvcnRTZXJ2aWNlIHRvIHdyaXRlIHRoZSBicmlkZ2UtY29tcGF0aWJsZSBwb2xpY3kgZmlsZS5cbiAqIEFsbCBkYXRhIGlzIHJldHVybmVkIGFzIHBsYWluIGFycmF5cy9vYmplY3RzIChubyBTZXRzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0YXRpY1BvbGljeURhdGEoKSB7XG4gIHJldHVybiB7XG4gICAgc2FmZV90b29sczogWy4uLlNBRkVfVE9PTFNdLFxuICAgIHNhZmVfYmFzaF9wYXR0ZXJuczogWy4uLlNBRkVfQkFTSF9QQVRURVJOU10sXG4gICAgZGFuZ2Vyb3VzX2Jhc2hfcGF0dGVybnM6IFsuLi5EQU5HRVJPVVNfQkFTSF9QQVRURVJOU10sXG4gICAgYmxvY2tlZF9iYXNoX3BhdHRlcm5zOiBbLi4uQkxPQ0tFRF9CQVNIX1BBVFRFUk5TXSxcbiAgICBpcnJldmVyc2libGVfcGF0dGVybnM6IFsuLi5JUlJFVkVSU0lCTEVfUEFUVEVSTlNdLFxuICAgIHNlbnNpdGl2ZV9wYXRoX3ByZWZpeGVzOiBbLi4uU0VOU0lUSVZFX1BBVEhfUFJFRklYRVNdLFxuICAgIGdhdGVrZWVwZXJfZXNzZW50aWFsX29wZXJhdGlvbnM6IFsuLi5HQVRFS0VFUEVSX0VTU0VOVElBTF9PUEVSQVRJT05TXSxcbiAgICBzYWZlX21jcF9vcGVyYXRpb25zOiBbLi4uU0FGRV9NQ1BfT1BFUkFUSU9OU10sXG4gICAgcmlza19zY29yZXM6IHsgLi4uUklTS19TQ09SRVMgfSxcbiAgfTtcbn1cblxuLy8g4pSA4pSAIEVsZW1lbnQgUG9saWN5IEV2YWx1YXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRXZhbHVhdGUgYSBDTEkgdG9vbCBjYWxsIGFnYWluc3QgYWN0aXZlIGVsZW1lbnQgZ2F0ZWtlZXBlciBwb2xpY2llcy5cbiAqXG4gKiBGb3VyLXN0ZXAgZXZhbHVhdGlvbiBwZXIgZWxlbWVudCAoSXNzdWUgIzYyNSBQaGFzZSAyLCBJc3N1ZSAjMTY2MCk6XG4gKiAxLiBkZW55UGF0dGVybnMgKGhpZ2hlc3QgcHJpb3JpdHkpIOKAlCBmaXJzdCBtYXRjaCA9IGltbWVkaWF0ZSBkZW55XG4gKiAxLjUuIGNvbmZpcm1QYXR0ZXJucyDigJQgZmlyc3QgbWF0Y2ggPSBpbW1lZGlhdGUgY29uZmlybSAocmVxdWlyZXMgYXBwcm92YWwpXG4gKiAyLiBhbGxvd1BhdHRlcm5zIOKAlCBpZiBlbGVtZW50IGRlZmluZXMgdGhlbSwgcmVjb3JkIHdoZXRoZXIgdG9vbCBtYXRjaGVkXG4gKiAzLiBBZnRlciBhbGwgZWxlbWVudHM6IGlmIGFueSBoYWQgYWxsb3dQYXR0ZXJucyBidXQgdG9vbCB3YXNuJ3QgYWxsb3dlZCBieSBhbnkgPSBkZW55XG4gKlxuICogVW5pb24gc2VtYW50aWNzOiB0b29sIG11c3QgbWF0Y2ggYXQgbGVhc3QgT05FIGVsZW1lbnQncyBhbGxvd1BhdHRlcm5zIChub3QgYWxsKS5cbiAqIEVsZW1lbnRzIHdpdGhvdXQgYWxsb3dQYXR0ZXJucyBkb24ndCByZXN0cmljdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVG9vbCBtYXRjaGVzIGFsbG93UGF0dGVybnMgaW4gZWxlbWVudCBBIGJ1dCBub3QgQiDihpIgQUxMT1dFRCAodW5pb24gc2VtYW50aWNzKVxuICogLy8gVG9vbCBtYXRjaGVzIGRlbnlQYXR0ZXJucyBpbiBhbnkgZWxlbWVudCDihpIgREVOSUVEIChkZW55IGFsd2F5cyB3aW5zKVxuICogLy8gVG9vbCBtYXRjaGVzIG5vIGFsbG93UGF0dGVybnMgYnV0IHNvbWUgZXhpc3Qg4oaSIERFTklFRCAoXCJub3QgaW4gYW55IGFsbG93bGlzdFwiKVxuICogLy8gTm8gYWxsb3dQYXR0ZXJucyBkZWZpbmVkIGFueXdoZXJlIOKGkiBQaGFzZSAxIGJlaGF2aW9yIChmYWxsIHRocm91Z2ggdG8gZGVmYXVsdClcbiAqXG4gKiBAcmV0dXJucyAnZGVueScgaWYgYmxvY2tlZCwgJ2V2YWx1YXRlJyBpZiBwZXJtaXR0ZWQgdG8gZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlQ2xpVG9vbFBvbGljeShcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgdG9vbElucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgYWN0aXZlRWxlbWVudHM6IEFjdGl2ZUVsZW1lbnRbXVxuKTogQ2xpVG9vbFBvbGljeVJlc3VsdCB7XG4gIGNvbnN0IGV2YWx1YXRlZEVsZW1lbnRzOiBQb2xpY3lFdmFsdWF0aW9uQ29udGV4dFsnZXZhbHVhdGVkRWxlbWVudHMnXSA9IFtdO1xuICBjb25zdCBkZWNpc2lvbkNoYWluOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gIGlmICghYWN0aXZlRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgZGVjaXNpb25DaGFpbi5wdXNoKCdObyBhY3RpdmUgZWxlbWVudHMg4oCUIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Jyk7XG4gICAgbG9nZ2VyLmRlYnVnKGBbQ2xpUG9saWN5XSAke3Rvb2xOYW1lfTogbm8gYWN0aXZlIGVsZW1lbnRzLCBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdGApO1xuICAgIHJldHVybiB7XG4gICAgICBiZWhhdmlvcjogJ2V2YWx1YXRlJyxcbiAgICAgIHBvbGljeUNvbnRleHQ6IHsgZXZhbHVhdGVkRWxlbWVudHMsIGRlY2lzaW9uQ2hhaW4gfSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQnVpbGQgdGhlIHN0cmluZ3MgdG8gbWF0Y2ggYWdhaW5zdCBwYXR0ZXJuc1xuICBjb25zdCBtYXRjaFRhcmdldHMgPSBidWlsZE1hdGNoVGFyZ2V0cyh0b29sTmFtZSwgdG9vbElucHV0KTtcbiAgY29uc3QgZWxlbWVudFR5cGVTdW1tYXJ5ID0gc3VtbWFyaXplRWxlbWVudFR5cGVzKGFjdGl2ZUVsZW1lbnRzKTtcbiAgbG9nZ2VyLmRlYnVnKGBbQ2xpUG9saWN5XSBFdmFsdWF0aW5nICR7dG9vbE5hbWV9IGFnYWluc3QgJHthY3RpdmVFbGVtZW50cy5sZW5ndGh9IGVsZW1lbnRzICgke2VsZW1lbnRUeXBlU3VtbWFyeX0pLCBtYXRjaFRhcmdldHM6IFske21hdGNoVGFyZ2V0cy5qb2luKCcsICcpfV1gKTtcblxuICBsZXQgYW55RWxlbWVudEhhc0FsbG93UGF0dGVybnMgPSBmYWxzZTtcbiAgbGV0IHRvb2xBbGxvd2VkQnlBbnlFbGVtZW50ID0gZmFsc2U7XG4gIGNvbnN0IGVsZW1lbnRzV2l0aEFsbG93UGF0dGVybnM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFjdGl2ZUVsZW1lbnRzKSB7XG4gICAgY29uc3QgcmVzdHJpY3Rpb25zID0gZWxlbWVudC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uZXh0ZXJuYWxSZXN0cmljdGlvbnM7XG4gICAgY29uc3QgZGVueVBhdHRlcm5zID0gcmVzdHJpY3Rpb25zPy5kZW55UGF0dGVybnM7XG4gICAgY29uc3QgY29uZmlybVBhdHRlcm5zID0gcmVzdHJpY3Rpb25zPy5jb25maXJtUGF0dGVybnM7XG4gICAgY29uc3QgYWxsb3dQYXR0ZXJucyA9IHJlc3RyaWN0aW9ucz8uYWxsb3dQYXR0ZXJucztcblxuICAgIGNvbnN0IGhhc1Jlc3RyaWN0aW9ucyA9IChBcnJheS5pc0FycmF5KGRlbnlQYXR0ZXJucykgJiYgZGVueVBhdHRlcm5zLmxlbmd0aCA+IDApXG4gICAgICB8fCAoQXJyYXkuaXNBcnJheShjb25maXJtUGF0dGVybnMpICYmIGNvbmZpcm1QYXR0ZXJucy5sZW5ndGggPiAwKVxuICAgICAgfHwgKEFycmF5LmlzQXJyYXkoYWxsb3dQYXR0ZXJucykgJiYgYWxsb3dQYXR0ZXJucy5sZW5ndGggPiAwKTtcblxuICAgIGlmICghaGFzUmVzdHJpY3Rpb25zKSB7XG4gICAgICBldmFsdWF0ZWRFbGVtZW50cy5wdXNoKHsgdHlwZTogZWxlbWVudC50eXBlLCBuYW1lOiBlbGVtZW50Lm5hbWUgfSk7XG4gICAgICBkZWNpc2lvbkNoYWluLnB1c2goYCR7ZWxlbWVudC50eXBlfSAnJHtlbGVtZW50Lm5hbWV9Jzogbm8gZXh0ZXJuYWxSZXN0cmljdGlvbnNgKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0NsaVBvbGljeV0gJHtlbGVtZW50LnR5cGV9ICcke2VsZW1lbnQubmFtZX0nOiBubyBleHRlcm5hbFJlc3RyaWN0aW9ucywgc2tpcHBpbmdgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZyhgW0NsaVBvbGljeV0gJHtlbGVtZW50LnR5cGV9ICcke2VsZW1lbnQubmFtZX0nOiBldmFsdWF0aW5nIChkZW55OiAke0FycmF5LmlzQXJyYXkoZGVueVBhdHRlcm5zKSA/IGRlbnlQYXR0ZXJucy5sZW5ndGggOiAwfSwgY29uZmlybTogJHtBcnJheS5pc0FycmF5KGNvbmZpcm1QYXR0ZXJucykgPyBjb25maXJtUGF0dGVybnMubGVuZ3RoIDogMH0sIGFsbG93OiAke0FycmF5LmlzQXJyYXkoYWxsb3dQYXR0ZXJucykgPyBhbGxvd1BhdHRlcm5zLmxlbmd0aCA6IDB9IHBhdHRlcm5zKWApO1xuXG4gICAgLy8gU3RlcCAxOiBDaGVjayBkZW55UGF0dGVybnMgKGhpZ2hlc3QgcHJpb3JpdHkpXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVueVBhdHRlcm5zKSkge1xuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGRlbnlQYXR0ZXJucykge1xuICAgICAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbWF0Y2hUYXJnZXRzKSB7XG4gICAgICAgICAgaWYgKG1hdGNoZXNQYXR0ZXJuKHRhcmdldCwgcGF0dGVybikpIHtcbiAgICAgICAgICAgIGV2YWx1YXRlZEVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgICAgICAgbWF0Y2hlZDogJ2RlbnlQYXR0ZXJucycsXG4gICAgICAgICAgICAgIG1hdGNoZWRQYXR0ZXJuOiBwYXR0ZXJuLFxuICAgICAgICAgICAgICBtYXRjaGVkVGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlY2lzaW9uQ2hhaW4ucHVzaChgREVOWTogJHtlbGVtZW50LnR5cGV9ICcke2VsZW1lbnQubmFtZX0nIGRlbnlQYXR0ZXJuICcke3BhdHRlcm59JyBtYXRjaGVzICcke3RhcmdldH0nYCk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFtDbGlQb2xpY3ldIERFTlk6ICR7ZWxlbWVudC50eXBlfSAnJHtlbGVtZW50Lm5hbWV9JyBkZW55UGF0dGVybiAnJHtwYXR0ZXJufScgbWF0Y2hlZCAnJHt0YXJnZXR9JyAoJHtlbGFwc2VkKHN0YXJ0VGltZSl9KWApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYERlbmllZCBieSAke2VsZW1lbnQudHlwZX0gJyR7ZWxlbWVudC5uYW1lfScgcG9saWN5OiBwYXR0ZXJuICcke3BhdHRlcm59JyBtYXRjaGVzICcke3RhcmdldH0nYCxcbiAgICAgICAgICAgICAgcG9saWN5Q29udGV4dDogeyBldmFsdWF0ZWRFbGVtZW50cywgZGVjaXNpb25DaGFpbiB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdGVwIDEuNTogQ2hlY2sgY29uZmlybVBhdHRlcm5zIChyZXF1aXJlcyBhcHByb3ZhbCDigJQgSXNzdWUgIzE2NjApXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlybVBhdHRlcm5zKSAmJiBjb25maXJtUGF0dGVybnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGNvbmZpcm1QYXR0ZXJucykge1xuICAgICAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbWF0Y2hUYXJnZXRzKSB7XG4gICAgICAgICAgaWYgKG1hdGNoZXNQYXR0ZXJuKHRhcmdldCwgcGF0dGVybikpIHtcbiAgICAgICAgICAgIGV2YWx1YXRlZEVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgICAgICAgbWF0Y2hlZDogJ2NvbmZpcm1QYXR0ZXJucycsXG4gICAgICAgICAgICAgIG1hdGNoZWRQYXR0ZXJuOiBwYXR0ZXJuLFxuICAgICAgICAgICAgICBtYXRjaGVkVGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlY2lzaW9uQ2hhaW4ucHVzaChgQ09ORklSTTogJHtlbGVtZW50LnR5cGV9ICcke2VsZW1lbnQubmFtZX0nIGNvbmZpcm1QYXR0ZXJuICcke3BhdHRlcm59JyBtYXRjaGVzICcke3RhcmdldH0nYCk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFtDbGlQb2xpY3ldIENPTkZJUk06ICR7ZWxlbWVudC50eXBlfSAnJHtlbGVtZW50Lm5hbWV9JyBjb25maXJtUGF0dGVybiAnJHtwYXR0ZXJufScgbWF0Y2hlZCAnJHt0YXJnZXR9JyAoJHtlbGFwc2VkKHN0YXJ0VGltZSl9KWApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmVoYXZpb3I6ICdjb25maXJtJyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFJlcXVpcmVzIGFwcHJvdmFsOiAke2VsZW1lbnQudHlwZX0gJyR7ZWxlbWVudC5uYW1lfScgcG9saWN5IHJlcXVpcmVzIGNvbmZpcm1hdGlvbiBmb3IgcGF0dGVybiAnJHtwYXR0ZXJufSdgLFxuICAgICAgICAgICAgICBjb25maXJtU291cmNlOiBgJHtlbGVtZW50LnR5cGV9OiR7ZWxlbWVudC5uYW1lfWAsXG4gICAgICAgICAgICAgIHBvbGljeUNvbnRleHQ6IHsgZXZhbHVhdGVkRWxlbWVudHMsIGRlY2lzaW9uQ2hhaW4gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RlcCAyOiBDaGVjayBhbGxvd1BhdHRlcm5zXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYWxsb3dQYXR0ZXJucykgJiYgYWxsb3dQYXR0ZXJucy5sZW5ndGggPiAwKSB7XG4gICAgICBhbnlFbGVtZW50SGFzQWxsb3dQYXR0ZXJucyA9IHRydWU7XG4gICAgICBlbGVtZW50c1dpdGhBbGxvd1BhdHRlcm5zLnB1c2goYCR7ZWxlbWVudC50eXBlfSAnJHtlbGVtZW50Lm5hbWV9J2ApO1xuICAgICAgbGV0IG1hdGNoZWRBbGxvdyA9IGZhbHNlO1xuXG4gICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgYWxsb3dQYXR0ZXJucykge1xuICAgICAgICBpZiAodHlwZW9mIHBhdHRlcm4gIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbWF0Y2hUYXJnZXRzKSB7XG4gICAgICAgICAgaWYgKG1hdGNoZXNQYXR0ZXJuKHRhcmdldCwgcGF0dGVybikpIHtcbiAgICAgICAgICAgIGV2YWx1YXRlZEVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgICAgICAgIG5hbWU6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgICAgICAgbWF0Y2hlZDogJ2FsbG93UGF0dGVybnMnLFxuICAgICAgICAgICAgICBtYXRjaGVkUGF0dGVybjogcGF0dGVybixcbiAgICAgICAgICAgICAgbWF0Y2hlZFRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZWNpc2lvbkNoYWluLnB1c2goYCR7ZWxlbWVudC50eXBlfSAnJHtlbGVtZW50Lm5hbWV9JzogYWxsb3dQYXR0ZXJuICcke3BhdHRlcm59JyBtYXRjaGVzICcke3RhcmdldH0nYCk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFtDbGlQb2xpY3ldIEFMTE9XOiAke2VsZW1lbnQudHlwZX0gJyR7ZWxlbWVudC5uYW1lfScgYWxsb3dQYXR0ZXJuICcke3BhdHRlcm59JyBtYXRjaGVkICcke3RhcmdldH0nYCk7XG4gICAgICAgICAgICB0b29sQWxsb3dlZEJ5QW55RWxlbWVudCA9IHRydWU7XG4gICAgICAgICAgICBtYXRjaGVkQWxsb3cgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaGVkQWxsb3cpIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoIW1hdGNoZWRBbGxvdykge1xuICAgICAgICBldmFsdWF0ZWRFbGVtZW50cy5wdXNoKHsgdHlwZTogZWxlbWVudC50eXBlLCBuYW1lOiBlbGVtZW50Lm5hbWUgfSk7XG4gICAgICAgIGRlY2lzaW9uQ2hhaW4ucHVzaChgJHtlbGVtZW50LnR5cGV9ICcke2VsZW1lbnQubmFtZX0nOiBhbGxvd1BhdHRlcm5zIGRlZmluZWQgYnV0IG5vIG1hdGNoYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGV2YWx1YXRlZEVsZW1lbnRzLnB1c2goeyB0eXBlOiBlbGVtZW50LnR5cGUsIG5hbWU6IGVsZW1lbnQubmFtZSB9KTtcbiAgICAgIGRlY2lzaW9uQ2hhaW4ucHVzaChgJHtlbGVtZW50LnR5cGV9ICcke2VsZW1lbnQubmFtZX0nOiBkZW55UGF0dGVybnMgY2hlY2tlZCwgbm8gbWF0Y2hgKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGVwIDM6IElmIGFueSBlbGVtZW50IGhhZCBhbGxvd1BhdHRlcm5zLCB0b29sIG11c3QgaGF2ZSBtYXRjaGVkIGF0IGxlYXN0IG9uZVxuICBpZiAoYW55RWxlbWVudEhhc0FsbG93UGF0dGVybnMgJiYgIXRvb2xBbGxvd2VkQnlBbnlFbGVtZW50KSB7XG4gICAgY29uc3QgcmVzdHJpY3RvcnMgPSBlbGVtZW50c1dpdGhBbGxvd1BhdHRlcm5zLmpvaW4oJywgJyk7XG4gICAgZGVjaXNpb25DaGFpbi5wdXNoKGBERU5ZOiB0b29sIG5vdCBpbiBhbnkgZWxlbWVudCBhbGxvd2xpc3QgKHJlc3RyaWN0ZWQgYnk6ICR7cmVzdHJpY3RvcnN9KWApO1xuICAgIGxvZ2dlci5kZWJ1ZyhgW0NsaVBvbGljeV0gREVOWTogJHt0b29sTmFtZX0gbm90IGluIGFueSBhbGxvd2xpc3QgKHJlc3RyaWN0ZWQgYnk6ICR7cmVzdHJpY3RvcnN9KSAoJHtlbGFwc2VkKHN0YXJ0VGltZSl9KWApO1xuICAgIHJldHVybiB7XG4gICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgbWVzc2FnZTogYFRvb2wgJyR7dG9vbE5hbWV9JyBub3QgcGVybWl0dGVkIGJ5IGFsbG93bGlzdHMgZGVmaW5lZCBpbjogJHtyZXN0cmljdG9yc30uIEVpdGhlciBkZWFjdGl2YXRlIHRoZXNlIGVsZW1lbnRzIG9yIGFkZCBhbGxvd1BhdHRlcm5zIHRvIG1hdGNoIHRoaXMgdG9vbC5gLFxuICAgICAgcG9saWN5Q29udGV4dDogeyBldmFsdWF0ZWRFbGVtZW50cywgZGVjaXNpb25DaGFpbiB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoYW55RWxlbWVudEhhc0FsbG93UGF0dGVybnMpIHtcbiAgICBkZWNpc2lvbkNoYWluLnB1c2goJ1Rvb2wgbWF0Y2hlZCBhbGxvd2xpc3Qg4oCUIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Jyk7XG4gICAgbG9nZ2VyLmRlYnVnKGBbQ2xpUG9saWN5XSAke3Rvb2xOYW1lfTogbWF0Y2hlZCBhbGxvd2xpc3QsIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0ICgke2VsYXBzZWQoc3RhcnRUaW1lKX0pYCk7XG4gIH0gZWxzZSB7XG4gICAgZGVjaXNpb25DaGFpbi5wdXNoKCdObyBhbGxvd1BhdHRlcm5zIGRlZmluZWQg4oCUIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0IChQaGFzZSAxIGJlaGF2aW9yKScpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgW0NsaVBvbGljeV0gJHt0b29sTmFtZX06IG5vIGFsbG93UGF0dGVybnMgZGVmaW5lZCwgZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQgKCR7ZWxhcHNlZChzdGFydFRpbWUpfSlgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmVoYXZpb3I6ICdldmFsdWF0ZScsXG4gICAgcG9saWN5Q29udGV4dDogeyBldmFsdWF0ZWRFbGVtZW50cywgZGVjaXNpb25DaGFpbiB9LFxuICB9O1xufVxuXG4vKiogRm9ybWF0IGVsYXBzZWQgdGltZSBzaW5jZSBzdGFydFRpbWUgaW4gbWlsbGlzZWNvbmRzLiAqL1xuZnVuY3Rpb24gZWxhcHNlZChzdGFydFRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgJHsocGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWUpLnRvRml4ZWQoMil9bXNgO1xufVxuXG4vKiogU3VtbWFyaXplIGFjdGl2ZSBlbGVtZW50IHR5cGVzIGZvciB0aGUgZW50cnkgbG9nIChlLmcuLCBcIjMgcGVyc29uYXMsIDIgc2tpbGxzLCAxIGVuc2VtYmxlXCIpLiAqL1xuZnVuY3Rpb24gc3VtbWFyaXplRWxlbWVudFR5cGVzKGVsZW1lbnRzOiBBY3RpdmVFbGVtZW50W10pOiBzdHJpbmcge1xuICBjb25zdCBjb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IGVsIG9mIGVsZW1lbnRzKSB7XG4gICAgY291bnRzLnNldChlbC50eXBlLCAoY291bnRzLmdldChlbC50eXBlKSA/PyAwKSArIDEpO1xuICB9XG4gIHJldHVybiBbLi4uY291bnRzLmVudHJpZXMoKV0ubWFwKChbdHlwZSwgY291bnRdKSA9PiBgJHtjb3VudH0gJHt0eXBlfSR7Y291bnQgPiAxID8gJ3MnIDogJyd9YCkuam9pbignLCAnKTtcbn1cblxuLyoqXG4gKiBNYXhpbXVtIGlucHV0IGxlbmd0aCBmb3IgcGF0dGVybiBtYXRjaGluZyB0YXJnZXRzLlxuICogVHJ1bmNhdGVzIGxvbmcgY29tbWFuZHMvcGF0aHMgdG8gcHJldmVudCBEb1MgdmlhIHBhdGhvbG9naWNhbCBnbG9iIG1hdGNoaW5nLlxuICovXG5jb25zdCBNQVhfTUFUQ0hfSU5QVVRfTEVOR1RIID0gMTAwMDtcblxuLyoqXG4gKiBTdHJpcCBudWxsIGJ5dGVzLCBjb250cm9sIGNoYXJhY3RlcnMsIGFuZCBub3JtYWxpemUgVW5pY29kZSBmb3IgbWF0Y2ggaW5wdXQuXG4gKiBQcmVzZXJ2ZXMgdGFiIChcXHgwOSksIG5ld2xpbmUgKFxceDBBKSwgY2FycmlhZ2UgcmV0dXJuIChcXHgwRCkuXG4gKiBQcmV2ZW50cyBwYXR0ZXJuIGJ5cGFzcyB2aWEgaW5qZWN0ZWQgY29udHJvbCBjaGFyYWN0ZXJzIG9yIFVuaWNvZGVcbiAqIG5vcm1hbGl6YXRpb24gYXR0YWNrcyAoZS5nLiwgY29tYmluaW5nIGNoYXJhY3RlcnMgdGhhdCBsb29rIGxpa2UgQVNDSUkpLlxuICovXG5mdW5jdGlvbiBzYW5pdGl6ZU1hdGNoSW5wdXQoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIE5vcm1hbGl6ZSBVbmljb2RlIHRvIE5GQyAoY2Fub25pY2FsIGRlY29tcG9zaXRpb24gdGhlbiBjb21wb3NpdGlvbikuXG4gIC8vIFRoaXMgcHJldmVudHMgYnlwYXNzIHZpYSBjb21iaW5pbmcgY2hhcmFjdGVycyBvciBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMuXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBpbnB1dC5ub3JtYWxpemUoJ05GQycpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleFxuICByZXR1cm4gbm9ybWFsaXplZC5yZXBsYWNlKC9bXFx4MDAtXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUZcXHg3Ri1cXHg5Rl0vZywgJycpO1xufVxuXG4vKipcbiAqIEJ1aWxkIG1hdGNoIHRhcmdldCBzdHJpbmdzIGZvciBhIHRvb2wgY2FsbC5cbiAqXG4gKiBGb3IgQmFzaDogbWF0Y2hlcyBhZ2FpbnN0IHRoZSB0b29sIG5hbWUgYW5kIFwiQmFzaDo8Y29tbWFuZD5cIlxuICogRm9yIEVkaXQvV3JpdGU6IG1hdGNoZXMgYWdhaW5zdCB0aGUgdG9vbCBuYW1lIGFuZCBcIkVkaXQ6PGZpbGVfcGF0aD5cIlxuICogRm9yIE1DUCB0b29sczogbWF0Y2hlcyBhZ2FpbnN0IHRoZSBmdWxsIHRvb2wgbmFtZVxuICpcbiAqIElucHV0cyBhcmUgdHJ1bmNhdGVkIHRvIE1BWF9NQVRDSF9JTlBVVF9MRU5HVEggYW5kIHNhbml0aXplZCB0byBwcmV2ZW50XG4gKiBEb1MgdmlhIHBhdGhvbG9naWNhbCBnbG9iIG1hdGNoaW5nIGFuZCBwYXR0ZXJuIGJ5cGFzcyB2aWEgY29udHJvbCBjaGFycy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRNYXRjaFRhcmdldHMoXG4gIHRvb2xOYW1lOiBzdHJpbmcsXG4gIHRvb2xJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgdGFyZ2V0cyA9IFt0b29sTmFtZV07XG5cbiAgaWYgKHRvb2xOYW1lID09PSAnQmFzaCcgJiYgdHlwZW9mIHRvb2xJbnB1dC5jb21tYW5kID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplTWF0Y2hJbnB1dCh0b29sSW5wdXQuY29tbWFuZC5zbGljZSgwLCBNQVhfTUFUQ0hfSU5QVVRfTEVOR1RIKSk7XG4gICAgdGFyZ2V0cy5wdXNoKGBCYXNoOiR7c2FuaXRpemVkfWApO1xuICB9IGVsc2UgaWYgKCh0b29sTmFtZSA9PT0gJ0VkaXQnIHx8IHRvb2xOYW1lID09PSAnV3JpdGUnKSAmJiB0eXBlb2YgdG9vbElucHV0LmZpbGVfcGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZU1hdGNoSW5wdXQodG9vbElucHV0LmZpbGVfcGF0aC5zbGljZSgwLCBNQVhfTUFUQ0hfSU5QVVRfTEVOR1RIKSk7XG4gICAgdGFyZ2V0cy5wdXNoKGAke3Rvb2xOYW1lfToke3Nhbml0aXplZH1gKTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXRzO1xufVxuIl19
@@ -256,5 +256,27 @@ export declare class InputFormatMetrics {
256
256
  * @returns Normalized OperationInput or null if invalid
257
257
  */
258
258
  export declare function parseOperationInput(input: unknown): OperationInput | null;
259
+ /**
260
+ * Generate a diagnostic summary of invalid input for error messages.
261
+ * Helps agents and developers understand what was actually received when
262
+ * parsing fails — especially useful for debugging parallel-call issues (#1656).
263
+ *
264
+ * @param input - The raw input that failed to parse
265
+ * @returns Human-readable diagnostic string describing what was received
266
+ *
267
+ * @example
268
+ * describeInvalidInput(null)
269
+ * // => 'Received: null'
270
+ *
271
+ * describeInvalidInput({ params: { element_name: 'x' } })
272
+ * // => 'Received: { params } (missing "operation" field)'
273
+ *
274
+ * describeInvalidInput([{ operation: 'addEntry' }, { operation: 'addEntry' }])
275
+ * // => 'Received: array with 2 items (use { operations: [...] } for batch calls)'
276
+ *
277
+ * describeInvalidInput({ operation: 123, params: {} })
278
+ * // => 'Received: { operation, params } ("operation" is number, expected string)'
279
+ */
280
+ export declare function describeInvalidInput(input: unknown): string;
259
281
  export {};
260
282
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/handlers/mcp-aql/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/handlers/mcp-aql/types.ts"],"names":[],"mappings":"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"}