@dollhousemcp/mcp-server 2.0.0-rc.6 → 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 (238) hide show
  1. package/CHANGELOG.md +52 -61
  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/listElements.d.ts +2 -0
  31. package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
  32. package/dist/handlers/element-crud/listElements.js +3 -1
  33. package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
  34. package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
  35. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
  36. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  37. package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
  38. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  39. package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
  40. package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
  41. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  42. package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
  43. package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
  44. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
  45. package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
  46. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  47. package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -3
  50. package/dist/logging/LogHooks.js +11 -11
  51. package/dist/logging/LogManager.d.ts +0 -2
  52. package/dist/logging/LogManager.d.ts.map +1 -1
  53. package/dist/logging/LogManager.js +1 -3
  54. package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
  55. package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
  56. package/dist/logging/sinks/MemoryLogSink.js +12 -3
  57. package/dist/logging/types.d.ts +0 -2
  58. package/dist/logging/types.d.ts.map +1 -1
  59. package/dist/logging/types.js +1 -1
  60. package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
  61. package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
  62. package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
  63. package/dist/metrics/MetricsManager.d.ts +47 -0
  64. package/dist/metrics/MetricsManager.d.ts.map +1 -0
  65. package/dist/metrics/MetricsManager.js +232 -0
  66. package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
  67. package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
  68. package/dist/metrics/OperationMetricsTracker.js +53 -0
  69. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
  70. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
  71. package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
  72. package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
  73. package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
  74. package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
  75. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
  76. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
  77. package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
  78. package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
  79. package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
  80. package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
  81. package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
  82. package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
  83. package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
  84. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
  85. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
  86. package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
  87. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
  88. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
  89. package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
  90. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
  91. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
  92. package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
  93. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
  94. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
  95. package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
  96. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
  97. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
  98. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
  99. package/dist/metrics/collectors/index.d.ts +11 -0
  100. package/dist/metrics/collectors/index.d.ts.map +1 -0
  101. package/dist/metrics/collectors/index.js +11 -0
  102. package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
  103. package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
  104. package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
  105. package/dist/metrics/types.d.ts +98 -0
  106. package/dist/metrics/types.d.ts.map +1 -0
  107. package/dist/metrics/types.js +24 -0
  108. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  109. package/dist/portfolio/DefaultElementProvider.js +1 -7
  110. package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
  111. package/dist/portfolio/EnhancedIndexManager.js +18 -18
  112. package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
  113. package/dist/portfolio/NLPScoringManager.js +5 -9
  114. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  115. package/dist/portfolio/RelationshipManager.js +2 -2
  116. package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
  117. package/dist/portfolio/VerbTriggerManager.js +5 -19
  118. package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
  119. package/dist/portfolio/config/IndexConfig.js +1 -12
  120. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
  121. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
  122. package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
  123. package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
  124. package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
  125. package/dist/portfolio/types/RelationshipTypes.js +3 -17
  126. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  127. package/dist/security/audit/config/suppressions.js +36 -8
  128. package/dist/security/constants.d.ts.map +1 -1
  129. package/dist/security/constants.js +10 -6
  130. package/dist/security/fileLockManager.d.ts.map +1 -1
  131. package/dist/security/fileLockManager.js +8 -6
  132. package/dist/security/secureYamlParser.d.ts.map +1 -1
  133. package/dist/security/secureYamlParser.js +1 -13
  134. package/dist/security/securityMonitor.d.ts +2 -1
  135. package/dist/security/securityMonitor.d.ts.map +1 -1
  136. package/dist/security/securityMonitor.js +14 -3
  137. package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
  138. package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
  139. package/dist/security/telemetry/SecurityTelemetry.js +30 -2
  140. package/dist/security/tokenManager.d.ts +3 -0
  141. package/dist/security/tokenManager.d.ts.map +1 -1
  142. package/dist/security/tokenManager.js +13 -5
  143. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  144. package/dist/security/validation/BackgroundValidator.js +7 -7
  145. package/dist/server/startup.d.ts.map +1 -1
  146. package/dist/server/startup.js +8 -24
  147. package/dist/server/tools/MCPAQLTools.js +4 -1
  148. package/dist/services/ActivationStore.d.ts.map +1 -1
  149. package/dist/services/ActivationStore.js +9 -3
  150. package/dist/services/FileWatchService.d.ts +1 -0
  151. package/dist/services/FileWatchService.d.ts.map +1 -1
  152. package/dist/services/FileWatchService.js +83 -48
  153. package/dist/services/MetadataService.d.ts.map +1 -1
  154. package/dist/services/MetadataService.js +7 -2
  155. package/dist/services/query/ElementQueryService.d.ts.map +1 -1
  156. package/dist/services/query/ElementQueryService.js +1 -41
  157. package/dist/services/query/PaginationService.d.ts.map +1 -1
  158. package/dist/services/query/PaginationService.js +1 -14
  159. package/dist/services/query/SortService.d.ts.map +1 -1
  160. package/dist/services/query/SortService.js +1 -6
  161. package/dist/services/validation/ValidationService.d.ts.map +1 -1
  162. package/dist/services/validation/ValidationService.js +3 -8
  163. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  164. package/dist/storage/ElementStorageLayer.js +5 -2
  165. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  166. package/dist/storage/MemoryStorageLayer.js +5 -2
  167. package/dist/telemetry/OperationalTelemetry.js +2 -2
  168. package/dist/utils/EventDeduplicator.d.ts +44 -0
  169. package/dist/utils/EventDeduplicator.d.ts.map +1 -0
  170. package/dist/utils/EventDeduplicator.js +93 -0
  171. package/dist/utils/FileLock.d.ts.map +1 -1
  172. package/dist/utils/FileLock.js +1 -9
  173. package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
  174. package/dist/utils/PerformanceMonitor.js +5 -5
  175. package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
  176. package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
  177. package/dist/utils/SlidingWindowRateLimiter.js +23 -0
  178. package/dist/web/console/IngestRoutes.d.ts +84 -0
  179. package/dist/web/console/IngestRoutes.d.ts.map +1 -0
  180. package/dist/web/console/IngestRoutes.js +252 -0
  181. package/dist/web/console/LeaderElection.d.ts +89 -0
  182. package/dist/web/console/LeaderElection.d.ts.map +1 -0
  183. package/dist/web/console/LeaderElection.js +205 -0
  184. package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
  185. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
  186. package/dist/web/console/LeaderForwardingSink.js +197 -0
  187. package/dist/web/console/SessionNames.d.ts +46 -0
  188. package/dist/web/console/SessionNames.d.ts.map +1 -0
  189. package/dist/web/console/SessionNames.js +257 -0
  190. package/dist/web/console/UnifiedConsole.d.ts +64 -0
  191. package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
  192. package/dist/web/console/UnifiedConsole.js +119 -0
  193. package/dist/web/contentPipeline.d.ts +58 -0
  194. package/dist/web/contentPipeline.d.ts.map +1 -0
  195. package/dist/web/contentPipeline.js +112 -0
  196. package/dist/web/portDiscovery.d.ts +58 -0
  197. package/dist/web/portDiscovery.d.ts.map +1 -0
  198. package/dist/web/portDiscovery.js +143 -0
  199. package/dist/web/public/app.js +148 -60
  200. package/dist/web/public/logs.js +638 -0
  201. package/dist/web/public/metrics.js +682 -0
  202. package/dist/web/public/permissions.js +394 -0
  203. package/dist/web/public/sessions.js +369 -0
  204. package/dist/web/routes/healthRoutes.d.ts +16 -0
  205. package/dist/web/routes/healthRoutes.d.ts.map +1 -0
  206. package/dist/web/routes/healthRoutes.js +29 -0
  207. package/dist/web/routes/logRoutes.d.ts +18 -0
  208. package/dist/web/routes/logRoutes.d.ts.map +1 -0
  209. package/dist/web/routes/logRoutes.js +126 -0
  210. package/dist/web/routes/metricsRoutes.d.ts +17 -0
  211. package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
  212. package/dist/web/routes/metricsRoutes.js +90 -0
  213. package/dist/web/routes/permissionRoutes.d.ts +16 -0
  214. package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
  215. package/dist/web/routes/permissionRoutes.js +133 -0
  216. package/dist/web/routes.d.ts.map +1 -1
  217. package/dist/web/routes.js +309 -339
  218. package/dist/web/server.d.ts +21 -1
  219. package/dist/web/server.d.ts.map +1 -1
  220. package/dist/web/server.js +42 -4
  221. package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
  222. package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
  223. package/dist/web/sinks/WebSSELogSink.js +22 -0
  224. package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
  225. package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
  226. package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
  227. package/package.json +2 -2
  228. package/server.json +2 -2
  229. package/dist/constants/version.d.ts +0 -3
  230. package/dist/constants/version.d.ts.map +0 -1
  231. package/dist/constants/version.js +0 -4
  232. package/dist/logging/sinks/SSELogSink.d.ts +0 -35
  233. package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
  234. package/dist/logging/sinks/SSELogSink.js +0 -181
  235. package/dist/logging/viewer/viewerHtml.d.ts +0 -8
  236. package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
  237. package/dist/logging/viewer/viewerHtml.js +0 -204
  238. package/dist/web/public/public/app.js +0 -1878
@@ -267,13 +267,10 @@ export class MemoryManager extends BaseElementManager {
267
267
  memory.setFilePath(relativePath);
268
268
  // Cache via base class LRU cache
269
269
  this.cacheElement(memory, relativePath);
270
- // Log successful load
271
- SecurityMonitor.logSecurityEvent({
272
- type: MEMORY_SECURITY_EVENTS.MEMORY_LOADED,
273
- severity: 'LOW',
274
- source: 'MemoryManager.load',
275
- details: `Loaded memory from ${path.basename(fullPath)}`
276
- });
270
+ // Routine load — debug level only. Security event for MEMORY_LOADED was
271
+ // generating ~128K entries/session, overwhelming the 5K security ring buffer
272
+ // with 25x turnover (backpressure). Downgraded per Issue #1687 analysis.
273
+ logger.debug(`[MemoryManager] Loaded memory from ${path.basename(fullPath)}`);
277
274
  return memory;
278
275
  }
279
276
  catch (error) {
@@ -577,12 +574,15 @@ export class MemoryManager extends BaseElementManager {
577
574
  handleLoadFailure(file, error, failedLoads) {
578
575
  const errorMsg = error instanceof Error ? error.message : String(error);
579
576
  failedLoads.push({ file, error: errorMsg });
580
- SecurityMonitor.logSecurityEvent({
581
- type: MEMORY_SECURITY_EVENTS.MEMORY_LIST_ITEM_FAILED,
582
- severity: 'LOW',
583
- source: 'MemoryManager.list',
584
- details: `Failed to load ${file}: ${error}`
585
- });
577
+ // Only log security event if load() didn't suppress this as a repeat
578
+ if (!this.isLoadErrorSuppressed(file)) {
579
+ SecurityMonitor.logSecurityEvent({
580
+ type: MEMORY_SECURITY_EVENTS.MEMORY_LIST_ITEM_FAILED,
581
+ severity: 'LOW',
582
+ source: 'MemoryManager.list',
583
+ details: `Failed to load ${file}: ${error}`
584
+ });
585
+ }
586
586
  }
587
587
  /**
588
588
  * List all available memories from all locations.
@@ -666,12 +666,8 @@ export class MemoryManager extends BaseElementManager {
666
666
  this.activeMemoryNames.add(memory.metadata.name);
667
667
  // Update memory status in memory
668
668
  await memory.activate();
669
- SecurityMonitor.logSecurityEvent({
670
- type: 'MEMORY_LOADED',
671
- severity: 'LOW',
672
- source: 'MemoryManager.activateMemory',
673
- details: `Memory activated: ${memory.metadata.name}`
674
- });
669
+ // Routine activation — debug only (was flooding security buffer)
670
+ logger.debug(`[MemoryManager] Memory activated: ${memory.metadata.name}`);
675
671
  logger.info(`Memory activated: ${memory.metadata.name}`);
676
672
  return {
677
673
  success: true,
@@ -1201,12 +1197,7 @@ export class MemoryManager extends BaseElementManager {
1201
1197
  throw saveError;
1202
1198
  }
1203
1199
  logger.info(`[MemoryManager] 🎉 Step 15: Seed memory installation COMPLETE!`);
1204
- SecurityMonitor.logSecurityEvent({
1205
- type: 'MEMORY_LOADED',
1206
- severity: 'LOW',
1207
- source: 'MemoryManager.installSeedMemories',
1208
- details: `Installed seed memory: ${seedFileName}`
1209
- });
1200
+ logger.debug(`[MemoryManager] Installed seed memory: ${seedFileName}`);
1210
1201
  }
1211
1202
  catch (error) {
1212
1203
  // Log error but don't throw - seed installation should not break server startup
@@ -1713,9 +1704,10 @@ export class MemoryManager extends BaseElementManager {
1713
1704
  const emergencyDisabled = process.env.DOLLHOUSE_DISABLE_AUTOLOAD === 'true';
1714
1705
  if (emergencyDisabled) {
1715
1706
  logger.info('[MemoryManager] Auto-load disabled via DOLLHOUSE_DISABLE_AUTOLOAD');
1707
+ // Keep as security event — emergency disable is a notable operational decision
1716
1708
  SecurityMonitor.logSecurityEvent({
1717
1709
  type: 'MEMORY_LOADED',
1718
- severity: 'LOW',
1710
+ severity: 'MEDIUM',
1719
1711
  source: 'MemoryManager.loadAndActivateAutoLoadMemories',
1720
1712
  details: 'Auto-load memories disabled via emergency environment variable',
1721
1713
  additionalData: { reason: 'DOLLHOUSE_DISABLE_AUTOLOAD=true' }
@@ -1753,19 +1745,8 @@ export class MemoryManager extends BaseElementManager {
1753
1745
  loaded++;
1754
1746
  totalTokens += estimatedTokens;
1755
1747
  logger.info(`[MemoryManager] Auto-loaded: ${memoryName} (~${estimatedTokens} tokens)`);
1756
- // Log security event
1757
- SecurityMonitor.logSecurityEvent({
1758
- type: 'MEMORY_LOADED',
1759
- severity: 'LOW',
1760
- source: 'MemoryManager.loadAndActivateAutoLoadMemories',
1761
- details: `Auto-loaded memory: ${memoryName}`,
1762
- additionalData: {
1763
- memoryName,
1764
- estimatedTokens,
1765
- priority: memory.metadata.priority,
1766
- totalTokensSoFar: totalTokens
1767
- }
1768
- });
1748
+ // Routine auto-load — debug only (was flooding security buffer)
1749
+ logger.debug(`[MemoryManager] Auto-loaded: ${memoryName} (~${estimatedTokens} tokens, priority: ${memory.metadata.priority})`);
1769
1750
  }
1770
1751
  catch (error) {
1771
1752
  const memoryName = memory.metadata.name || 'unknown';
@@ -1778,12 +1759,12 @@ export class MemoryManager extends BaseElementManager {
1778
1759
  const elapsedTime = Date.now() - startTime;
1779
1760
  logger.info(`[MemoryManager] Auto-load complete: ${loaded} memories activated ` +
1780
1761
  `(~${totalTokens} tokens), ${skipped} skipped, ${errors.length} errors, ${elapsedTime}ms`);
1781
- // Log completion
1762
+ // Summary event — fires once per startup, keep as security event
1782
1763
  SecurityMonitor.logSecurityEvent({
1783
1764
  type: 'MEMORY_LOADED',
1784
1765
  severity: 'LOW',
1785
1766
  source: 'MemoryManager.loadAndActivateAutoLoadMemories',
1786
- details: 'Auto-load memories completed successfully',
1767
+ details: `Auto-load complete: ${loaded} loaded, ${skipped} skipped, ${errors.length} errors`,
1787
1768
  additionalData: {
1788
1769
  loadedCount: loaded,
1789
1770
  skippedCount: skipped,
@@ -1815,4 +1796,4 @@ export class MemoryManager extends BaseElementManager {
1815
1796
  }
1816
1797
  }
1817
1798
  }
1818
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5TWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFrQixNQUFNLGFBQWEsQ0FBQztBQUVyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLG9CQUFvQixFQUNyQixNQUFNLHVDQUF1QyxDQUFDO0FBRS9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVF4QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtB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QUFZLEVBQUUsQ0FDcEYsQ0FBQztZQUVGLGNBQWM7WUFDZCxlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxvQkFBb0I7Z0JBQzFCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsK0NBQStDO2dCQUN2RCxPQUFPLEVBQUUsOEJBQThCLFNBQVMsTUFBTSxZQUFZLEVBQUU7Z0JBQ3BFLGNBQWMsRUFBRTtvQkFDZCxTQUFTO29CQUNULFlBQVk7b0JBQ1osVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTO2lCQUNuQzthQUNGLENBQUMsQ0FBQztZQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQzNFLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeU1hbmFnZXIgLSBJbXBsZW1lbnRhdGlvbiBvZiBJRWxlbWVudE1hbmFnZXIgZm9yIE1lbW9yeSBlbGVtZW50c1xuICogSGFuZGxlcyBDUlVEIG9wZXJhdGlvbnMgYW5kIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGZvciBtZW1vcmllcyBpbXBsZW1lbnRpbmcgSUVsZW1lbnRcbiAqIFxuICogRklYRVMgSU1QTEVNRU5URUQ6XG4gKiAxLiBDUklUSUNBTDogRml4ZWQgcmFjZSBjb25kaXRpb25zIGluIGZpbGUgb3BlcmF0aW9ucyBieSB1c2luZyBGaWxlTG9ja01hbmFnZXIgZm9yIGF0b21pYyByZWFkcy93cml0ZXNcbiAqIDIuIEhJR0g6IEZpeGVkIHVudmFsaWRhdGVkIFlBTUwgcGFyc2luZyB2dWxuZXJhYmlsaXR5IGJ5IHVzaW5nIFNlY3VyZVlhbWxQYXJzZXJcbiAqIDMuIE1FRElVTTogQWxsIHVzZXIgaW5wdXRzIGFyZSBub3cgdmFsaWRhdGVkIGFuZCBzYW5pdGl6ZWRcbiAqIDQuIE1FRElVTTogQXVkaXQgbG9nZ2luZyBhZGRlZCBmb3Igc2VjdXJpdHkgb3BlcmF0aW9uc1xuICogNS4gTUVESVVNOiBQYXRoIHZhbGlkYXRpb24gcHJldmVudHMgZGlyZWN0b3J5IHRyYXZlcnNhbCBhdHRhY2tzXG4gKi9cblxuaW1wb3J0IHsgTWVtb3J5LCBNZW1vcnlNZXRhZGF0YSB9IGZyb20gJy4vTWVtb3J5LmpzJztcbmltcG9ydCB7IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdG9TaW5ndWxhckxhYmVsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZWxlbWVudFR5cGVOb3JtYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IEJhc2VFbGVtZW50TWFuYWdlciB9IGZyb20gJy4uL2Jhc2UvQmFzZUVsZW1lbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB7XG4gIGdldFZhbGlkYXRlZFNjYW5Db29sZG93bixcbiAgZ2V0VmFsaWRhdGVkSW5kZXhEZWJvdW5jZSxcbiAgU1RPUkFHRV9MQVlFUl9DT05GSUdcbn0gZnJvbSAnLi4vLi4vY29uZmlnL3BlcmZvcm1hbmNlLWNvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IElTdG9yYWdlTGF5ZXIgfSBmcm9tICcuLi8uLi9zdG9yYWdlL0lTdG9yYWdlTGF5ZXIuanMnO1xuaW1wb3J0IHsgTWVtb3J5U3RvcmFnZUxheWVyIH0gZnJvbSAnLi4vLi4vc3RvcmFnZS9NZW1vcnlTdG9yYWdlTGF5ZXIuanMnO1xuaW1wb3J0IHsgTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IgfSBmcm9tICcuLi8uLi9zdG9yYWdlL01lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLmpzJztcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvTFJVQ2FjaGUuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvZmlsZUxvY2tNYW5hZ2VyLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBNRU1PUllfQ09OU1RBTlRTLCBNRU1PUllfU0VDVVJJVFlfRVZFTlRTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgTWVtb3J5VHlwZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVnaXN0cnkuanMnO1xuaW1wb3J0IHsgVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi9UcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvU2VyaWFsaXphdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5pbXBvcnQgeyBGaWxlV2F0Y2hTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZVdhdGNoU2VydmljZS5qcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50TWVzc2FnZXMgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50TWVzc2FnZXMuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVHYXRla2VlcGVyUG9saWN5IH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9wb2xpY2llcy9FbGVtZW50UG9saWNpZXMuanMnO1xuXG4vLyBJc3N1ZSAjODM6IENlbnRyYWxpemVkIGFjdGl2ZSBlbGVtZW50IGxpbWl0cyAoY29uZmlndXJhYmxlIHZpYSBlbnYgdmFycylcbmltcG9ydCB7IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZywgZ2V0TWF4QWN0aXZlTGltaXQgfSBmcm9tICcuLi8uLi9jb25maWcvYWN0aXZlLWVsZW1lbnQtbGltaXRzLmpzJztcblxuLyoqXG4gKiBJc3N1ZSAjMTM6IFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBmaWxlbmFtZSBpcyBhIGJhY2t1cCBmaWxlXG4gKiBCYWNrdXAgZmlsZXMgc2hvdWxkIG5vdCBiZSBsb2FkZWQgYnkgbGlzdCgpIC0gdGhleSBhcmUgYXJjaGl2ZWQgZGF0YSwgbm90IGFjdGl2ZSBtZW1vcmllc1xuICpcbiAqIEJhY2t1cCBwYXR0ZXJucyBpbmNsdWRlOlxuICogLSAuYmFja3VwLSB0aW1lc3RhbXAgcGF0dGVybiAoZS5nLiwgbmFtZS5iYWNrdXAtMjAyNS0xMS0xNC0yMi00MC01Ny0zMDMueWFtbClcbiAqIC0gQW55IGZpbGUgd2l0aCAnYmFja3VwJyBpbiB0aGUgbmFtZSAoY2FzZS1pbnNlbnNpdGl2ZSlcbiAqIC0gRmlsZXMgaW4gYmFja3VwLyBvciBiYWNrdXBzLyBkaXJlY3RvcmllcyAoaGFuZGxlZCBhdCBkaXJlY3RvcnkgbGV2ZWwpXG4gKlxuICogQHBhcmFtIGZpbGVuYW1lIC0gVGhlIGZpbGVuYW1lIHRvIGNoZWNrICh3aXRob3V0IGRpcmVjdG9yeSBwYXRoKVxuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBpcyBhIGJhY2t1cCBmaWxlIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkXG4gKi9cbmZ1bmN0aW9uIGlzQmFja3VwRmlsZShmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaWxlbmFtZS5pbmNsdWRlcygnLmJhY2t1cC0nKSB8fCBmaWxlbmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdiYWNrdXAnKTtcbn1cblxuLyoqXG4gKiBJc3N1ZSAjMzk6IENoZWNrIGlmIGEgbWVtb3J5IG5hbWUgY29udGFpbnMgYmFja3VwIHBhdHRlcm5zIChjb3JydXB0ZWQgbmFtZSlcbiAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGJhY2t1cCBmaWxlIG1ldGFkYXRhIGxlYWtzIGludG8gdGhlIGNhbm9uaWNhbCBmaWxlXG4gKlxuICogUGF0dGVybjogbmFtZS5iYWNrdXAtWVlZWS1NTS1ERC1ISC1tbS1zcy1TU1Mgb3IgbmFtZS5iYWNrdXAtLi4uLXZOXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbWVtb3J5IG5hbWUgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG5hbWUgY29udGFpbnMgYmFja3VwIHBhdHRlcm5zIGluZGljYXRpbmcgY29ycnVwdGlvblxuICovXG5mdW5jdGlvbiBpc0NvcnJ1cHRlZEJhY2t1cE5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIENoZWNrIGZvciAuYmFja3VwLSB0aW1lc3RhbXAgcGF0dGVybiBpbiB0aGUgbmFtZVxuICByZXR1cm4gL1xcLmJhY2t1cC1cXGR7NH0tXFxkezJ9LVxcZHsyfS8udGVzdChuYW1lKTtcbn1cblxuLyoqXG4gKiBJc3N1ZSAjMzk6IEV4dHJhY3QgdGhlIG9yaWdpbmFsIG5hbWUgZnJvbSBhIGNvcnJ1cHRlZCBiYWNrdXAgbmFtZVxuICpcbiAqIEV4YW1wbGVzOlxuICogLSBcImRvbGxob3VzZW1jcC1iYXNlbGluZS1rbm93bGVkZ2UuYmFja3VwLTIwMjUtMTEtMTQtMjItNDAtNTctMzAzXCJcbiAqICAgLT4gXCJkb2xsaG91c2VtY3AtYmFzZWxpbmUta25vd2xlZGdlXCJcbiAqIC0gXCJteS1tZW1vcnkuYmFja3VwLTIwMjUtMDEtMDEtMDAtMDAtMDAtMDAwLXYyXCJcbiAqICAgLT4gXCJteS1tZW1vcnlcIlxuICpcbiAqIEBwYXJhbSBjb3JydXB0ZWROYW1lIC0gVGhlIGNvcnJ1cHRlZCBuYW1lIGNvbnRhaW5pbmcgYmFja3VwIHBhdHRlcm5cbiAqIEByZXR1cm5zIFRoZSBvcmlnaW5hbCBuYW1lIHdpdGggYmFja3VwIHN1ZmZpeCByZW1vdmVkXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RPcmlnaW5hbE5hbWUoY29ycnVwdGVkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gUmVtb3ZlIC5iYWNrdXAtWVlZWS1NTS1ERC1ISC1tbS1zcy1TU1MgYW5kIGFueSAtdk4gc3VmZml4XG4gIHJldHVybiBjb3JydXB0ZWROYW1lLnJlcGxhY2UoL1xcLmJhY2t1cC1cXGR7NH0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7M30oLXZcXGQrKT8kLywgJycpO1xufVxuXG4vLyBJbnRlcm5hbCBpbnRlcmZhY2UgZm9yIHBhcnNlZCBZQU1MIHN0cnVjdHVyZVxuaW50ZXJmYWNlIFBhcnNlZE1lbW9yeURhdGEge1xuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBjb250ZW50OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNZW1vcnlNYW5hZ2VyIGV4dGVuZHMgQmFzZUVsZW1lbnRNYW5hZ2VyPE1lbW9yeT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IG1lbW9yaWVzRGlyOiBzdHJpbmc7XG4gIC8vIFBoYXNlIDI6IEJvdW5kZWQgY29udGVudCBoYXNoIGluZGV4IHJlcGxhY2VzIHVuYm91bmRlZCBNYXBcbiAgcHJpdmF0ZSBjb250ZW50SGFzaEluZGV4ID0gbmV3IExSVUNhY2hlPHN0cmluZz4oe1xuICAgIG5hbWU6ICdtZW1vcnk6Y29udGVudEhhc2gnLFxuICAgIG1heFNpemU6IDUwMDAsXG4gICAgbWF4TWVtb3J5TUI6IDUsXG4gICAgdHRsTXM6IDAsXG4gIH0pO1xuICBwcml2YXRlIGNvbnRlbnRIYXNoQnlQYXRoID0gbmV3IExSVUNhY2hlPHN0cmluZz4oe1xuICAgIG5hbWU6ICdtZW1vcnk6Y29udGVudEhhc2hSZXZlcnNlJyxcbiAgICBtYXhTaXplOiA1MDAwLFxuICAgIG1heE1lbW9yeU1COiA1LFxuICAgIHR0bE1zOiAwLFxuICB9KTtcbiAgcHJpdmF0ZSB0cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U6IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSB2YWxpZGF0aW9uU2VydmljZTogVmFsaWRhdGlvblNlcnZpY2U7XG4gIHByaXZhdGUgc2VyaWFsaXphdGlvblNlcnZpY2U6IFNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuXG4gIC8vIFRyYWNrIGFjdGl2ZSBtZW1vcmllcyBieSBuYW1lIChzdGFibGUgaWRlbnRpZmllcikgLSBJc3N1ZSAjMTggUGhhc2UgNFxuICBwcml2YXRlIGFjdGl2ZU1lbW9yeU5hbWVzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyLFxuICAgIGZpbGVMb2NrTWFuYWdlcjogRmlsZUxvY2tNYW5hZ2VyLFxuICAgIGZpbGVPcGVyYXRpb25zU2VydmljZTogRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLFxuICAgIHZhbGlkYXRpb25SZWdpc3RyeTogVmFsaWRhdGlvblJlZ2lzdHJ5LFxuICAgIHNlcmlhbGl6YXRpb25TZXJ2aWNlOiBTZXJpYWxpemF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlLFxuICAgIGZpbGVXYXRjaFNlcnZpY2U/OiBGaWxlV2F0Y2hTZXJ2aWNlLFxuICAgIG1lbW9yeUJ1ZGdldD86IGltcG9ydCgnLi4vLi4vY2FjaGUvQ2FjaGVNZW1vcnlCdWRnZXQuanMnKS5DYWNoZU1lbW9yeUJ1ZGdldCxcbiAgICBiYWNrdXBTZXJ2aWNlPzogaW1wb3J0KCcuLi8uLi9zZXJ2aWNlcy9CYWNrdXBTZXJ2aWNlLmpzJykuQmFja3VwU2VydmljZVxuICApIHtcbiAgICBzdXBlcihFbGVtZW50VHlwZS5NRU1PUlksIHBvcnRmb2xpb01hbmFnZXIsIGZpbGVMb2NrTWFuYWdlciwgeyBmaWxlV2F0Y2hTZXJ2aWNlLCBtZW1vcnlCdWRnZXQsIGJhY2t1cFNlcnZpY2UgfSwgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB2YWxpZGF0aW9uUmVnaXN0cnkpO1xuICAgIHRoaXMubWVtb3JpZXNEaXIgPSB0aGlzLmVsZW1lbnREaXI7XG4gICAgdGhpcy50cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgPSB2YWxpZGF0aW9uUmVnaXN0cnkuZ2V0VHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy52YWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0aW9uU2VydmljZSgpO1xuICAgIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UgPSBzZXJpYWxpemF0aW9uU2VydmljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQaGFzZSAyOiBPdmVycmlkZSBmYWN0b3J5IHRvIHVzZSBNZW1vcnlTdG9yYWdlTGF5ZXIgZm9yIG11bHRpLWRpcmVjdG9yeSBzY2FubmluZy5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UpOiBJU3RvcmFnZUxheWVyIHtcbiAgICAvLyBOb3RlOiBVc2UgdGhpcy5lbGVtZW50RGlyIChzZXQgYnkgQmFzZUVsZW1lbnRNYW5hZ2VyIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCksXG4gICAgLy8gbm90IHRoaXMubWVtb3JpZXNEaXIgKHNldCBhZnRlciBzdXBlcigpIHJldHVybnMpLlxuICAgIHJldHVybiBuZXcgTWVtb3J5U3RvcmFnZUxheWVyKGZpbGVPcGVyYXRpb25zU2VydmljZSwge1xuICAgICAgbWVtb3JpZXNEaXI6IHRoaXMuZWxlbWVudERpcixcbiAgICAgIHNjYW5Db29sZG93bk1zOiBnZXRWYWxpZGF0ZWRTY2FuQ29vbGRvd24oKSxcbiAgICAgIGluZGV4RGVib3VuY2VNczogZ2V0VmFsaWRhdGVkSW5kZXhEZWJvdW5jZSgpLFxuICAgICAgZmlsZUZpbHRlcjogKGZpbGVuYW1lOiBzdHJpbmcpID0+ICFpc0JhY2t1cEZpbGUoZmlsZW5hbWUpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldEVsZW1lbnRMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnbWVtb3J5JztcbiAgfVxuXG4gIC8vIE1lbW9yeU1hbmFnZXIgaGFzIGl0cyBvd24gYmFja3VwIHN5c3RlbSAobW92ZVRvVXNlckJhY2t1cCkgYW5kIGl0c1xuICAvLyBzYXZlL2RlbGV0ZSBkb24ndCBjYWxsIHN1cGVyIOKAlCBuby1vcCB0aGUgdW5pdmVyc2FsIGJhY2t1cCBob29rcy5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUJhY2t1cEJlZm9yZVNhdmUoKTogUHJvbWlzZTx2b2lkPiB7IC8qIG5vLW9wICovIH1cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZUJhY2t1cEJlZm9yZURlbGV0ZSgpOiBQcm9taXNlPGJvb2xlYW4+IHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGNsZWFyQ2FjaGUgdG8gYWxzbyBjbGVhciBtZW1vcnktc3BlY2lmaWMgY2FjaGVzLlxuICAgKiBQaGFzZSAyOiBSZW1vdmVkIHVuYm91bmRlZCBtZW1vcnlDYWNoZSBhbmQgZGF0ZUZvbGRlcnNDYWNoZS5cbiAgICovXG4gIG92ZXJyaWRlIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgc3VwZXIuY2xlYXJDYWNoZSgpO1xuICAgIHRoaXMuY29udGVudEhhc2hJbmRleC5jbGVhcigpO1xuICAgIHRoaXMuY29udGVudEhhc2hCeVBhdGguY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSBkaXNwb3NlIHRvIGZsdXNoIE1lbW9yeVN0b3JhZ2VMYXllciBfaW5kZXguanNvbiBhbmQgY2xlYXIgY2FjaGVzLlxuICAgKiBQcmV2ZW50cyByZXNvdXJjZSBsZWFrcyBhbmQgXCJKZXN0IGRpZCBub3QgZXhpdFwiIHdhcm5pbmdzIGluIHRlc3RzLlxuICAgKi9cbiAgb3ZlcnJpZGUgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAvLyBzdG9yYWdlTGF5ZXIuY2xlYXIoKSBjYW5jZWxzIHBlbmRpbmcgX2luZGV4Lmpzb24gZGVib3VuY2VkIHdyaXRlcyxcbiAgICAvLyBwcmV2ZW50aW5nIEVOT1RFTVBUWSBlcnJvcnMgd2hlbiB0ZXN0cyBkZWxldGUgdGVtcCBkaXJlY3Rvcmllcy5cbiAgICBzdXBlci5kaXNwb3NlKCk7ICAvLyBDYWxscyBCYXNlRWxlbWVudE1hbmFnZXIuZGlzcG9zZSgpIOKAlCBydW5zIHN0b3JhZ2VMYXllci5jbGVhcigpICsgd2F0Y2hlciBjbGVhbnVwXG4gICAgdGhpcy5jb250ZW50SGFzaEluZGV4LmNsZWFyKCk7XG4gICAgdGhpcy5jb250ZW50SGFzaEJ5UGF0aC5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgbWVtb3J5IGZpbGUgcGF0aCBhY3Jvc3MgZGlmZmVyZW50IHN0b3JhZ2UgbG9jYXRpb25zXG4gICAqIFNlYXJjaGVzIGluIHRoaXMgb3JkZXI6IHN5c3RlbS8sIGFkYXB0ZXJzLywgZGF0ZSBmb2xkZXJzLCByb290IChsZWdhY3kpXG4gICAqIEV4dHJhY3RlZCBtZXRob2QgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5IChQUiAjNylcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZU1lbW9yeVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIHJlbGF0aXZlIHBhdGggKG5vIGRhdGUgZm9sZGVyKVxuICAgIGlmICghZmlsZVBhdGguaW5jbHVkZXMocGF0aC5zZXApIHx8ICFmaWxlUGF0aC5tYXRjaCgvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9LykpIHtcbiAgICAgIC8vIFNlYXJjaCBpbiBzeXN0ZW0vIGZvbGRlciBmaXJzdFxuICAgICAgY29uc3Qgc3lzdGVtUGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnc3lzdGVtJywgZmlsZVBhdGgpO1xuICAgICAgaWYgKGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHN5c3RlbVBhdGgpKSB7XG4gICAgICAgIHJldHVybiBzeXN0ZW1QYXRoO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIGNoZWNrIGFkYXB0ZXJzLyBmb2xkZXJcbiAgICAgIGNvbnN0IGFkYXB0ZXJQYXRoID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdhZGFwdGVycycsIGZpbGVQYXRoKTtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhhZGFwdGVyUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIGFkYXB0ZXJQYXRoO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIHNlYXJjaCBpbiBkYXRlIGZvbGRlcnNcbiAgICAgIGNvbnN0IGRhdGVGb2xkZXJzID0gYXdhaXQgdGhpcy5nZXREYXRlRm9sZGVycygpO1xuICAgICAgZm9yIChjb25zdCBkYXRlRm9sZGVyIG9mIGRhdGVGb2xkZXJzKSB7XG4gICAgICAgIGNvbnN0IHRlc3RQYXRoID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsIGRhdGVGb2xkZXIsIGZpbGVQYXRoKTtcbiAgICAgICAgaWYgKGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHRlc3RQYXRoKSkge1xuICAgICAgICAgIHJldHVybiB0ZXN0UGF0aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBGYWxsIGJhY2sgdG8gcm9vdCBkaXJlY3RvcnkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgZHVyaW5nIHRyYW5zaXRpb25cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIG1lbW9yeSBmcm9tIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNSZWFkRmlsZSgpIGluc3RlYWQgb2YgZnMucmVhZEZpbGUoKVxuICAgKiB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBhbmQgZW5zdXJlIGF0b21pYyBmaWxlIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIG1lbW9yeSBmaWxlIHRvIGxvYWRcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGxvYWRlZCBNZW1vcnkgaW5zdGFuY2VcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gZmlsZSBjYW5ub3QgYmUgZm91bmQgb3IgcGF0aCB2YWxpZGF0aW9uIGZhaWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIFlBTUwgcGFyc2luZyBmYWlscyBvciBjb250ZW50IGlzIG1hbGZvcm1lZFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBtZW1vcnkgdmFsaWRhdGlvbiBmYWlscyBhZnRlciBsb2FkaW5nXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPE1lbW9yeT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBSZXNvbHZlIHBhdGggdXNpbmcgZXh0cmFjdGVkIGhlbHBlciBtZXRob2RcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gYXdhaXQgdGhpcy5yZXNvbHZlTWVtb3J5UGF0aChmaWxlUGF0aCk7XG5cbiAgICAgIC8vIEVuc3VyZSBmdWxsUGF0aCBpcyBkZWZpbmVkXG4gICAgICBpZiAoIWZ1bGxQYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHJlc29sdmUgcGF0aDogJHtmaWxlUGF0aH1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGhhc2UgMjogQ2hlY2sgYmFzZSBjbGFzcyBMUlUgY2FjaGUgKHJlcGxhY2VzIHJlbW92ZWQgbWVtb3J5Q2FjaGUgTWFwKVxuICAgICAgY29uc3QgY2FjaGVkID0gdGhpcy5nZXRDYWNoZWRCeUFic29sdXRlUGF0aChmdWxsUGF0aCk7XG4gICAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFVzZSBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgZm9yIGF0b21pYyBmaWxlIHJlYWRcbiAgICAgIC8vIFByZXZpb3VzbHk6IGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmdWxsUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIHdoaWNoIHdyYXBzIEZpbGVMb2NrTWFuYWdlclxuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoZnVsbFBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBcbiAgICAgIC8vIEhJR0ggU0VWRVJJVFkgRklYOiBVc2UgU2VjdXJlWWFtbFBhcnNlciB0byBwcmV2ZW50IFlBTUwgaW5qZWN0aW9uIGF0dGFja3NcbiAgICAgIC8vIFVzZXMgU2VyaWFsaXphdGlvblNlcnZpY2Ugd2hpY2ggd3JhcHMgU2VjdXJlWWFtbFBhcnNlciBhbmQgaGFuZGxlcyBwdXJlIFlBTUwgYXV0b21hdGljYWxseVxuXG4gICAgICAvLyBNZW1vcnkgZmlsZXMgYXJlIHB1cmUgWUFNTCAodW5saWtlIG90aGVyIGVsZW1lbnRzIHdoaWNoIGFyZSBtYXJrZG93biB3aXRoIGZyb250bWF0dGVyKVxuICAgICAgLy8gU2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcigpIGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBhbmQgd3JhcHMgcHVyZSBZQU1MXG5cbiAgICAgIC8vIEhhbmRsZSBlbXB0eSBjb250ZW50IGVkZ2UgY2FzZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyB0ZXN0cy9maWxlcylcbiAgICAgIGxldCBwYXJzZWQ6IFBhcnNlZE1lbW9yeURhdGE7XG5cbiAgICAgIGlmIChjb250ZW50LnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgLy8gRW1wdHkgb3IgYWxsIHdoaXRlc3BhY2UgZmlsZSAtIGNyZWF0ZSBtaW5pbWFsIHZhbGlkIHN0cnVjdHVyZVxuICAgICAgICBwYXJzZWQgPSB7IGRhdGE6IHt9LCBjb250ZW50OiAnJyB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLnBhcnNlRnJvbnRtYXR0ZXIoY29udGVudCwge1xuICAgICAgICAgIG1heFlhbWxTaXplOiBNRU1PUllfQ09OU1RBTlRTLk1BWF9ZQU1MX1NJWkUsXG4gICAgICAgICAgdmFsaWRhdGVDb250ZW50OiBmYWxzZSwgIC8vIEZJWCAoIzEyMDYpOiBMb2NhbCBmaWxlcyBhcmUgcHJlLXRydXN0ZWRcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxvYWQnLFxuICAgICAgICAgIHNjaGVtYTogJ2pzb24nICAvLyBGSVggIzE0MzA6IFByZXNlcnZlIGJvb2xlYW5zIChhdXRvTG9hZCkgYW5kIG51bWJlcnMgKHByaW9yaXR5KVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDb252ZXJ0IHRvIFBhcnNlZE1lbW9yeURhdGEgZm9ybWF0XG4gICAgICAgIHBhcnNlZCA9IHtcbiAgICAgICAgICBkYXRhOiBwYXJzZVJlc3VsdC5kYXRhLFxuICAgICAgICAgIGNvbnRlbnQ6IHBhcnNlUmVzdWx0LmNvbnRlbnRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBtZXRhZGF0YSBhbmQgbWFya2Rvd24gY29udGVudFxuICAgICAgY29uc3QgeyBtZXRhZGF0YSwgY29udGVudDogbWFya2Rvd25Db250ZW50RnJvbUZpbGUgfSA9IHRoaXMucGFyc2VNZW1vcnlGaWxlKHBhcnNlZCk7XG5cbiAgICAgIC8vIENyZWF0ZSBtZW1vcnkgaW5zdGFuY2VcbiAgICAgIGNvbnN0IG1lbW9yeSA9IG5ldyBNZW1vcnkobWV0YWRhdGEsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgICAgLy8gRml4ICM5MTg6IFJlYWQgaW5zdHJ1Y3Rpb25zIGZyb20gcm9vdC1sZXZlbCBZQU1MICh3aGVyZSBzZXJpYWxpemVFbGVtZW50IHdyaXRlcyB0aGVtKS5cbiAgICAgIC8vIFByZXZpb3VzbHkgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiB0byByb290IGJ1dCBuZXZlciByZWFkIGJhY2sg4oCUIHNpbGVudCBkYXRhIGxvc3MuXG4gICAgICBjb25zdCByb290SW5zdHJ1Y3Rpb25zID0gcGFyc2VkLmRhdGE/Lmluc3RydWN0aW9ucztcbiAgICAgIGlmIChyb290SW5zdHJ1Y3Rpb25zICYmIHR5cGVvZiByb290SW5zdHJ1Y3Rpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICBtZW1vcnkuaW5zdHJ1Y3Rpb25zID0gcm9vdEluc3RydWN0aW9ucztcbiAgICAgIH1cblxuICAgICAgLy8gU3RyaXAgZm9ybWF0X3ZlcnNpb24gZnJvbSBydW50aW1lIG1ldGFkYXRhIChGaXggIzkxMilcbiAgICAgIGRlbGV0ZSAobWVtb3J5Lm1ldGFkYXRhIGFzIGFueSkuZm9ybWF0X3ZlcnNpb247XG5cbiAgICAgIC8vIExvYWQgc2F2ZWQgZW50cmllcyBpZiBwcmVzZW50XG4gICAgICAvLyBNZW1vcnkgZmlsZXMgaGF2ZSBlbnRyaWVzIGFzIGEgdG9wLWxldmVsIGtleSBpbiB0aGUgWUFNTFxuICAgICAgY29uc3QgZW50cmllcyA9IHBhcnNlZC5kYXRhPy5lbnRyaWVzO1xuICAgICAgaWYgKGVudHJpZXMpIHtcbiAgICAgICAgbWVtb3J5LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBpZDogbWVtb3J5LmlkLFxuICAgICAgICAgIHR5cGU6IG1lbW9yeS50eXBlLFxuICAgICAgICAgIHZlcnNpb246IG1lbW9yeS52ZXJzaW9uLFxuICAgICAgICAgIG1ldGFkYXRhOiBtZW1vcnkubWV0YWRhdGEsXG4gICAgICAgICAgZXh0ZW5zaW9uczogbWVtb3J5LmV4dGVuc2lvbnMsXG4gICAgICAgICAgZW50cmllczogZW50cmllc1xuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG1hcmtkb3duIGNvbnRlbnQgZXhpc3RzIGFmdGVyIHRoZSBmcm9udG1hdHRlciwgYWRkIGl0IGFzIGEgbWVtb3J5IGVudHJ5XG4gICAgICAvLyBUaGlzIHByZXNlcnZlcyBjb250ZW50IGZyb20gc2VlZCBtZW1vcmllcyBhbmQgbWVtb3J5IGZpbGVzIHdpdGggbWFya2Rvd24gc2VjdGlvbnNcbiAgICAgIGlmIChtYXJrZG93bkNvbnRlbnRGcm9tRmlsZSAmJiBtYXJrZG93bkNvbnRlbnRGcm9tRmlsZS50cmltKCkgJiYgcGFyc2VkLmNvbnRlbnQgJiYgcGFyc2VkLmNvbnRlbnQudHJpbSgpKSB7XG4gICAgICAgIGF3YWl0IG1lbW9yeS5hZGRFbnRyeShcbiAgICAgICAgICBwYXJzZWQuY29udGVudC50cmltKCksXG4gICAgICAgICAgW10sICAvLyB0YWdzXG4gICAgICAgICAgeyBsb2FkZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0sICAvLyBtZXRhZGF0YVxuICAgICAgICAgICdmaWxlJyAgLy8gc291cmNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZJWCAjMTMyMDogU2V0IGZpbGUgcGF0aCBvbiBtZW1vcnkgZm9yIHBlcnNpc3RlbmNlIChzdG9yZSByZWxhdGl2ZSBwYXRoKVxuICAgICAgLy8gTm9ybWFsaXplIHRvIGZvcndhcmQgc2xhc2hlcyBzbyBwYXRocyBhcmUgY29uc2lzdGVudCBhY3Jvc3MgcGxhdGZvcm1zXG4gICAgICAvLyAocGF0aC5yZWxhdGl2ZSgpIHJldHVybnMgYmFja3NsYXNoZXMgb24gV2luZG93cykuXG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMubWVtb3JpZXNEaXIsIGZ1bGxQYXRoKS5zcGxpdChwYXRoLnNlcCkuam9pbignLycpO1xuICAgICAgbWVtb3J5LnNldEZpbGVQYXRoKHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIC8vIENhY2hlIHZpYSBiYXNlIGNsYXNzIExSVSBjYWNoZVxuICAgICAgdGhpcy5jYWNoZUVsZW1lbnQobWVtb3J5LCByZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBMb2cgc3VjY2Vzc2Z1bCBsb2FkXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0xPQURFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgTG9hZGVkIG1lbW9yeSBmcm9tICR7cGF0aC5iYXNlbmFtZShmdWxsUGF0aCl9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiBtZW1vcnk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9MT0FEX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGxvYWQgbWVtb3J5IGZyb20gJHtmaWxlUGF0aH06ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIG1lbW9yeTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBleGlzdGluZyBtZW1vcnkgZmlsZSB0byB1c2VyIGJhY2t1cCBkaXJlY3RvcnlcbiAgICogSXNzdWUgIzQ5OiBQcmV2ZW50cyBkdXBsaWNhdGUgZmlsZXMgYnkgYmFja2luZyB1cCBpbnN0ZWFkIG9mIHZlcnNpb25pbmdcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW92ZVRvVXNlckJhY2t1cChleGlzdGluZ1BhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGRhdGVGb2xkZXIgPSBgJHtkYXRlLmdldEZ1bGxZZWFyKCl9LSR7U3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyl9LSR7U3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgY29uc3QgYmFja3VwRGlyID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdiYWNrdXBzJywgJ3VzZXInLCBkYXRlRm9sZGVyKTtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShiYWNrdXBEaXIpO1xuXG4gICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGV4aXN0aW5nUGF0aCk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gZGF0ZS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1s6Ll0vZywgJy0nKTtcbiAgICBjb25zdCBiYWNrdXBOYW1lID0gZmlsZW5hbWUucmVwbGFjZSgnLnlhbWwnLCBgLmJhY2t1cC0ke3RpbWVzdGFtcH0ueWFtbGApO1xuXG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZW5hbWVGaWxlKGV4aXN0aW5nUGF0aCwgcGF0aC5qb2luKGJhY2t1cERpciwgYmFja3VwTmFtZSkpO1xuICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzQ5OiBNb3ZlZCBleGlzdGluZyBmaWxlIHRvIGJhY2t1cDogJHtiYWNrdXBOYW1lfWApO1xuXG4gICAgLy8gSXNzdWUgIzY1NDogUHJ1bmUgZXhjZXNzIGJhY2t1cHMgZm9yIHRoaXMgbWVtb3J5IGluIHRoaXMgZGF0ZSBmb2xkZXJcbiAgICBhd2FpdCB0aGlzLnBydW5lQmFja3Vwc0Zvck1lbW9yeShiYWNrdXBEaXIsIGZpbGVuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcnVuZSBleGNlc3MgYmFja3VwcyBmb3IgYSBzcGVjaWZpYyBtZW1vcnkgaW4gYSBkYXRlIGZvbGRlci5cbiAgICogS2VlcHMgb25seSB0aGUgTiBtb3N0IHJlY2VudCBiYWNrdXBzIChieSB0aW1lc3RhbXAgaW4gZmlsZW5hbWUpLlxuICAgKiBJc3N1ZSAjNjU0OiBQcmV2ZW50cyB1bmJvdW5kZWQgYmFja3VwIGdyb3d0aCAod2FzIDE5N2srIGZpbGVzKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJ1bmVCYWNrdXBzRm9yTWVtb3J5KGJhY2t1cERpcjogc3RyaW5nLCBtZW1vcnlGaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWF4QmFja3VwcyA9IFNUT1JBR0VfTEFZRVJfQ09ORklHLk1BWF9CQUNLVVBTX1BFUl9NRU1PUlk7XG4gICAgY29uc3QgYmFzZU5hbWUgPSBtZW1vcnlGaWxlbmFtZS5yZXBsYWNlKCcueWFtbCcsICcnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhbGxGaWxlcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShiYWNrdXBEaXIpO1xuICAgICAgLy8gRmluZCBhbGwgYmFja3VwcyBmb3IgdGhpcyBzcGVjaWZpYyBtZW1vcnlcbiAgICAgIGNvbnN0IG1lbW9yeUJhY2t1cHMgPSBhbGxGaWxlc1xuICAgICAgICAuZmlsdGVyKGYgPT4gZi5zdGFydHNXaXRoKGAke2Jhc2VOYW1lfS5iYWNrdXAtYCkgJiYgZi5lbmRzV2l0aCgnLnlhbWwnKSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7IC8vIExleGljb2dyYXBoaWMgc29ydCA9IGNocm9ub2xvZ2ljYWwgZm9yIElTTyB0aW1lc3RhbXBzXG5cbiAgICAgIGlmIChtZW1vcnlCYWNrdXBzLmxlbmd0aCA8PSBtYXhCYWNrdXBzKSByZXR1cm47XG5cbiAgICAgIC8vIERlbGV0ZSBvbGRlc3QgYmFja3VwcyAoa2VlcCB0aGUgbGFzdCBOKVxuICAgICAgY29uc3QgdG9EZWxldGUgPSBtZW1vcnlCYWNrdXBzLnNsaWNlKDAsIG1lbW9yeUJhY2t1cHMubGVuZ3RoIC0gbWF4QmFja3Vwcyk7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdG9EZWxldGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoXG4gICAgICAgICAgICBwYXRoLmpvaW4oYmFja3VwRGlyLCBmaWxlKSxcbiAgICAgICAgICAgIEVsZW1lbnRUeXBlLk1FTU9SWSxcbiAgICAgICAgICAgIHsgc291cmNlOiAnTWVtb3J5TWFuYWdlci5wcnVuZUJhY2t1cHNGb3JNZW1vcnknIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIEZhaWxlZCB0byBwcnVuZSBiYWNrdXAgJHtmaWxlfTpgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRvRGVsZXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjNjU0OiBQcnVuZWQgJHt0b0RlbGV0ZS5sZW5ndGh9IGV4Y2VzcyBiYWNrdXBzIGZvciAke2Jhc2VOYW1lfSAoa2VwdCAke21heEJhY2t1cHN9KWApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBOb24tZmF0YWwg4oCUIGJhY2t1cCBwcnVuaW5nIGlzIGJlc3QtZWZmb3J0XG4gICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBCYWNrdXAgcHJ1bmluZyBmYWlsZWQgZm9yICR7YmFja3VwRGlyfTpgLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHBhdGggZm9yIG1lbW9yeSBzdG9yYWdlIGJhc2VkIG9uIG1lbW9yeSB0eXBlXG4gICAqIFJvdXRlcyBtZW1vcmllcyB0byBhcHByb3ByaWF0ZSBmb2xkZXJzOlxuICAgKiAtIFNZU1RFTTogc3lzdGVtL1xuICAgKiAtIEFEQVBURVI6IGFkYXB0ZXJzL1xuICAgKiAtIFVTRVI6IFlZWVktTU0tREQvIChkYXRlLWJhc2VkIGZvbGRlcnMpXG4gICAqIEBwYXJhbSBlbGVtZW50IE1lbW9yeSBlbGVtZW50IHRvIHNhdmVcbiAgICogQHBhcmFtIG1lbW9yeVR5cGUgVHlwZSBvZiBtZW1vcnkgKGRlZmF1bHRzIHRvIFVTRVIpXG4gICAqIEBwYXJhbSBmaWxlTmFtZSBPcHRpb25hbCBjdXN0b20gZmlsZW5hbWVcbiAgICogQHJldHVybnMgRnVsbCBwYXRoIHRvIG1lbW9yeSBmaWxlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTWVtb3J5UGF0aChlbGVtZW50OiBNZW1vcnksIG1lbW9yeVR5cGU/OiBNZW1vcnlUeXBlLCBmaWxlTmFtZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdHlwZSA9IG1lbW9yeVR5cGUgfHwgTWVtb3J5VHlwZS5VU0VSO1xuICAgIGxldCB0YXJnZXREaXI6IHN0cmluZztcblxuICAgIC8vIFJvdXRlIHRvIGFwcHJvcHJpYXRlIGZvbGRlciBiYXNlZCBvbiBtZW1vcnkgdHlwZVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBNZW1vcnlUeXBlLlNZU1RFTTpcbiAgICAgICAgdGFyZ2V0RGlyID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdzeXN0ZW0nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1lbW9yeVR5cGUuQURBUFRFUjpcbiAgICAgICAgdGFyZ2V0RGlyID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdhZGFwdGVycycpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTWVtb3J5VHlwZS5VU0VSOlxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBVc2VyIG1lbW9yaWVzIGdvIGluIGRhdGUtYmFzZWQgZm9sZGVycyAoZXhpc3RpbmcgYmVoYXZpb3IpXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBkYXRlRm9sZGVyID0gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0ke1N0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpfS0ke1N0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgICAgICB0YXJnZXREaXIgPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgZGF0ZUZvbGRlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0YXJnZXQgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRhcmdldERpcik7XG5cbiAgICAvLyBHZW5lcmF0ZSBmaWxlbmFtZSB1c2luZyB1bmlmaWVkIG5vcm1hbGl6YXRpb25cbiAgICAvLyBOb3RlOiBNZW1vcnkgZmlsZXMgdXNlIC55YW1sIGV4dGVuc2lvbiwgc28gd2UgdXNlIG5vcm1hbGl6ZUZpbGVuYW1lKCkgZGlyZWN0bHlcbiAgICBjb25zdCBiYXNlTmFtZSA9IGZpbGVOYW1lIHx8IGAke3RoaXMubm9ybWFsaXplRmlsZW5hbWUoZWxlbWVudC5tZXRhZGF0YS5uYW1lIHx8ICdtZW1vcnknKX0ueWFtbGA7XG5cbiAgICAvLyBJc3N1ZSAjNDk6IENoZWNrIGlmIGZpbGUgZXhpc3RzIGFuZCBtb3ZlIHRvIGJhY2t1cCBpZiBzbyAoaW5zdGVhZCBvZiB2ZXJzaW9uIHN1ZmZpeGVzKVxuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCBiYXNlTmFtZSk7XG4gICAgaWYgKGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHRhcmdldFBhdGgpKSB7XG4gICAgICBhd2FpdCB0aGlzLm1vdmVUb1VzZXJCYWNrdXAodGFyZ2V0UGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBtZW1vcnkgdHlwZSBmcm9tIGZpbGUgcGF0aFxuICAgKiBAcGFyYW0gZmlsZVBhdGggUmVsYXRpdmUgcGF0aCB3aXRoaW4gbWVtb3JpZXMgZGlyZWN0b3J5XG4gICAqIEByZXR1cm5zIE1lbW9yeSB0eXBlIGJhc2VkIG9uIHBhdGhcbiAgICovXG4gIHByaXZhdGUgZ2V0TWVtb3J5VHlwZUZyb21QYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBNZW1vcnlUeXBlIHtcbiAgICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aCgnc3lzdGVtLycpIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoJ3N5c3RlbVxcXFwnKSkge1xuICAgICAgcmV0dXJuIE1lbW9yeVR5cGUuU1lTVEVNO1xuICAgIH1cbiAgICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aCgnYWRhcHRlcnMvJykgfHwgZmlsZVBhdGguc3RhcnRzV2l0aCgnYWRhcHRlcnNcXFxcJykpIHtcbiAgICAgIHJldHVybiBNZW1vcnlUeXBlLkFEQVBURVI7XG4gICAgfVxuICAgIHJldHVybiBNZW1vcnlUeXBlLlVTRVI7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGFsbCByZXF1aXJlZCBmb2xkZXIgc3RydWN0dXJlIGV4aXN0c1xuICAgKiBDcmVhdGVzIHN5c3RlbS8sIGJhY2t1cHMvc3lzdGVtLywgYmFja3Vwcy91c2VyLywgYWRhcHRlcnMvIGZvbGRlcnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlRm9sZGVyU3RydWN0dXJlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZvbGRlcnMgPSBbXG4gICAgICBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgJ3N5c3RlbScpLFxuICAgICAgcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdiYWNrdXBzJywgJ3N5c3RlbScpLFxuICAgICAgcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdiYWNrdXBzJywgJ3VzZXInKSxcbiAgICAgIHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnYWRhcHRlcnMnKVxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZvbGRlciBvZiBmb2xkZXJzKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShmb2xkZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgU0hBLTI1NiBoYXNoIG9mIG1lbW9yeSBjb250ZW50IGZvciBkZWR1cGxpY2F0aW9uXG4gICAqIEltcGxlbWVudHMgSXNzdWUgIzk5NCAtIENvbnRlbnQtYmFzZWQgZGVkdXBsaWNhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZW50SGFzaChlbGVtZW50OiBNZW1vcnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBtZXRhZGF0YTogZWxlbWVudC5tZXRhZGF0YSxcbiAgICAgIGVudHJpZXM6IEpTT04ucGFyc2UoZWxlbWVudC5zZXJpYWxpemUoKSkuZW50cmllc1xuICAgIH0pO1xuICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGNvbnRlbnQpLmRpZ2VzdCgnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBkYXRlIGZvbGRlcnMgaW4gbWVtb3JpZXMgZGlyZWN0b3J5LlxuICAgKiBQaGFzZSAyOiBSZW1vdmVkIGxvY2FsIGNhY2hlIOKAlCBNZW1vcnlTdG9yYWdlTGF5ZXIgc2NhbiBjb29sZG93biBoYW5kbGVzIHRoZSBob3QgcGF0aC5cbiAgICogVGhpcyBtZXRob2QgaXMgbm93IG9ubHkgdXNlZCBieSByZXNvbHZlTWVtb3J5UGF0aCgpIGFzIGEgZmFsbGJhY2suXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGRhdGUgZm9sZGVyIG5hbWVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldERhdGVGb2xkZXJzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeSh0aGlzLm1lbW9yaWVzRGlyKTtcbiAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgICAgIC5maWx0ZXIobmFtZSA9PiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdChuYW1lKSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgICAgLnJldmVyc2UoKTsgLy8gTW9zdCByZWNlbnQgZmlyc3RcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGEgbWVtb3J5IHRvIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGVsZW1lbnQgTWVtb3J5IGVsZW1lbnQgdG8gc2F2ZVxuICAgKiBAcGFyYW0gZmlsZVBhdGggT3B0aW9uYWwgY3VzdG9tIGZpbGUgcGF0aCwgZGVmYXVsdHMgdG8gdHlwZS1iYXNlZCBwYXRoXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNhdmUgaXMgY29tcGxldGVcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gbWVtb3J5IHZhbGlkYXRpb24gZmFpbHMgYmVmb3JlIHNhdmluZ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwYXRoIHZhbGlkYXRpb24gZmFpbHMgb3IgZmlsZSBzeXN0ZW0gZXJyb3JzIG9jY3VyXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGF0b21pYyB3cml0ZSBvcGVyYXRpb24gZmFpbHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNhdmUoZWxlbWVudDogTWVtb3J5LCBmaWxlUGF0aD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBJc3N1ZSAjMzk6IEF1dG8tcmVwYWlyIGNvcnJ1cHRlZCBiYWNrdXAgbmFtZXMgYmVmb3JlIHNhdmluZ1xuICAgICAgY29uc3QgbWVtb3J5TmFtZSA9IGVsZW1lbnQubWV0YWRhdGEubmFtZTtcbiAgICAgIGlmIChpc0NvcnJ1cHRlZEJhY2t1cE5hbWUobWVtb3J5TmFtZSkpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxOYW1lID0gZXh0cmFjdE9yaWdpbmFsTmFtZShtZW1vcnlOYW1lKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IERldGVjdGVkIGNvcnJ1cHRlZCBiYWNrdXAgbmFtZSAnJHttZW1vcnlOYW1lfScsIGAgK1xuICAgICAgICAgIGBhdXRvLXJlcGFpcmluZyB0byAnJHtvcmlnaW5hbE5hbWV9J2BcbiAgICAgICAgKTtcbiAgICAgICAgZWxlbWVudC5tZXRhZGF0YS5uYW1lID0gb3JpZ2luYWxOYW1lO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TQVZFRCxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgSXNzdWUgIzM5OiBBdXRvLXJlcGFpcmVkIGNvcnJ1cHRlZCBiYWNrdXAgbmFtZTogJyR7bWVtb3J5TmFtZX0nIC0+ICcke29yaWdpbmFsTmFtZX0nYFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZWxlbWVudFxuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbWVtb3J5OiAke3ZhbGlkYXRpb24uZXJyb3JzPy5tYXAoZSA9PiBlLm1lc3NhZ2UpLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBjb250ZW50IGhhc2ggZm9yIGRlZHVwbGljYXRpb25cbiAgICAgIGNvbnN0IGNvbnRlbnRIYXNoID0gdGhpcy5jYWxjdWxhdGVDb250ZW50SGFzaChlbGVtZW50KTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUGF0aCA9IHRoaXMuY29udGVudEhhc2hJbmRleC5nZXQoY29udGVudEhhc2gpO1xuXG4gICAgICBpZiAoZXhpc3RpbmdQYXRoKSB7XG4gICAgICAgIC8vIExvZyBkdXBsaWNhdGUgZGV0ZWN0aW9uXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnTUVNT1JZX0RVUExJQ0FURV9ERVRFQ1RFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuc2F2ZScsXG4gICAgICAgICAgZGV0YWlsczogYER1cGxpY2F0ZSBjb250ZW50IGRldGVjdGVkLiBFeGlzdGluZzogJHtleGlzdGluZ1BhdGh9YFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZWN0IG1lbW9yeSB0eXBlIGZyb20gbWV0YWRhdGEgb3IgZGVmYXVsdCB0byBVU0VSXG4gICAgICBjb25zdCBtZW1vcnlNZXRhID0gZWxlbWVudC5tZXRhZGF0YSBhcyBNZW1vcnlNZXRhZGF0YTtcbiAgICAgIGNvbnN0IG1lbW9yeVR5cGUgPSBtZW1vcnlNZXRhLm1lbW9yeVR5cGUgfHwgTWVtb3J5VHlwZS5VU0VSO1xuXG4gICAgICAvLyBTYXZlIHBhdGggcHJlY2VkZW5jZTpcbiAgICAgIC8vIDEpIGV4cGxpY2l0IGZpbGVQYXRoIGFyZ3VtZW50XG4gICAgICAvLyAyKSBleGlzdGluZyBwZXJzaXN0ZWQgcGF0aCBvbiB0aGUgZWxlbWVudCAoZXhpc3RpbmdGaWxlUGF0aClcbiAgICAgIC8vIDMpIG5ld2x5IGdlbmVyYXRlZCBkYXRlL3R5cGUtYmFzZWQgcGF0aCBmb3IgZmlyc3QtdGltZSBzYXZlc1xuICAgICAgLy8gS2VlcGluZyAjMiBhaGVhZCBvZiAjMyBwcmV2ZW50cyBsb2FkZWQgbWVtb3JpZXMgZnJvbSBiZWluZyBjb3BpZWQgaW50byBhIG5ld1xuICAgICAgLy8gZGF0ZSBmb2xkZXIgb24gZWFjaCBzYXZlIChJc3N1ZSAjNjk5KS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZVBhdGggPSBlbGVtZW50LmdldEZpbGVQYXRoKCk7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGZpbGVQYXRoXG4gICAgICAgID8gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoKVxuICAgICAgICA6IGV4aXN0aW5nRmlsZVBhdGhcbiAgICAgICAgICA/IGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChleGlzdGluZ0ZpbGVQYXRoKVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5nZW5lcmF0ZU1lbW9yeVBhdGgoZWxlbWVudCwgbWVtb3J5VHlwZSk7XG5cbiAgICAgIC8vIEVuc3VyZSBwYXJlbnQgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSk7XG5cbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gYXdhaXQgdGhpcy5zZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAvLyBGaXggIzkxNi8jOTE4OiBTaXplIGVuZm9yY2VtZW50IG9uIE1lbW9yeSdzIGN1c3RvbSBzYXZlIHBhdGhcbiAgICAgIC8vIChCYXNlRWxlbWVudE1hbmFnZXIuc2F2ZSgpIGhhcyB0aGlzIGJ1dCBNZW1vcnkgb3ZlcnJpZGVzIGl0IGVudGlyZWx5KVxuICAgICAgaWYgKHlhbWxDb250ZW50Lmxlbmd0aCA+IFNFQ1VSSVRZX0xJTUlUUy5NQVhfUEVSU09OQV9TSVpFX0JZVEVTKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TQVZFX0ZBSUxFRCxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuc2F2ZS5zaXplRW5mb3JjZW1lbnQnLFxuICAgICAgICAgIGRldGFpbHM6IGBNZW1vcnkgZXhjZWVkcyBtYXhpbXVtIGZpbGUgc2l6ZSAoJHt5YW1sQ29udGVudC5sZW5ndGh9ID4gJHtTRUNVUklUWV9MSU1JVFMuTUFYX1BFUlNPTkFfU0laRV9CWVRFU30pYCxcbiAgICAgICAgICBtZXRhZGF0YTogeyBjb250ZW50TGVuZ3RoOiB5YW1sQ29udGVudC5sZW5ndGgsIGxpbWl0OiBTRUNVUklUWV9MSU1JVFMuTUFYX1BFUlNPTkFfU0laRV9CWVRFUyB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE1lbW9yeSBleGNlZWRzIG1heGltdW0gZmlsZSBzaXplICgke3lhbWxDb250ZW50Lmxlbmd0aH0gPiAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfUEVSU09OQV9TSVpFX0JZVEVTfSlgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpeCAjOTA4LyM5MTg6IFlBTUwgYm9tYiBkZXRlY3Rpb24gb24gTWVtb3J5J3MgY3VzdG9tIHNhdmUgcGF0aFxuICAgICAgY29uc3QgdmFsaWRhdGlvblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPD0gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCkge1xuICAgICAgICBpZiAoIUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuc2F2ZS55YW1sQm9tYkRldGVjdGlvbicsXG4gICAgICAgICAgICBkZXRhaWxzOiAnU2VyaWFsaXplZCBtZW1vcnkgY29udGFpbnMgbWFsaWNpb3VzIFlBTUwgcGF0dGVybnMg4oCUIHdyaXRlIGJsb2NrZWQnLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHsgY29udGVudExlbmd0aDogeWFtbENvbnRlbnQubGVuZ3RoIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcmlhbGl6ZWQgbWVtb3J5IGNvbnRhaW5zIG1hbGljaW91cyBZQU1MIHBhdHRlcm5zIOKAlCB3cml0ZSBibG9ja2VkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbGlkYXRpb25NcyA9IERhdGUubm93KCkgLSB2YWxpZGF0aW9uU3RhcnQ7XG4gICAgICBpZiAodmFsaWRhdGlvbk1zID4gNTApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtNZW1vcnlNYW5hZ2VyXSBXcml0ZS1wYXRoIFlBTUwgdmFsaWRhdGlvbiB0b29rICR7dmFsaWRhdGlvbk1zfW1zIGZvciAke3lhbWxDb250ZW50Lmxlbmd0aH0gYnl0ZXNgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIGZvciBhdG9taWMgZmlsZSB3cml0ZVxuICAgICAgLy8gUHJldmlvdXNseTogYXdhaXQgZnMud3JpdGVGaWxlKGZ1bGxQYXRoLCB5YW1sQ29udGVudCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIHdoaWNoIHdyYXBzIEZpbGVMb2NrTWFuYWdlclxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy53cml0ZUZpbGUoZnVsbFBhdGgsIHlhbWxDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICAvLyBGSVggIzEzMjA6IFNldCBmaWxlIHBhdGggb24gbWVtb3J5IGFmdGVyIHN1Y2Nlc3NmdWwgc2F2ZVxuICAgICAgLy8gTm9ybWFsaXplIHRvIGZvcndhcmQgc2xhc2hlcyBzbyBwYXRocyBhcmUgY29uc2lzdGVudCBhY3Jvc3MgcGxhdGZvcm1zXG4gICAgICAvLyAocGF0aC5yZWxhdGl2ZSgpIHJldHVybnMgYmFja3NsYXNoZXMgb24gV2luZG93cykuXG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMubWVtb3JpZXNEaXIsIGZ1bGxQYXRoKS5zcGxpdChwYXRoLnNlcCkuam9pbignLycpO1xuICAgICAgZWxlbWVudC5zZXRGaWxlUGF0aChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBDYWNoZSB2aWEgYmFzZSBjbGFzcyBMUlUgY2FjaGVcbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIC8vIFBoYXNlIDI6IE5vdGlmeSBzdG9yYWdlIGxheWVyIG9mIHNhdmVcbiAgICAgIGNvbnN0IHJlbFBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMubWVtb3JpZXNEaXIsIGZ1bGxQYXRoKS5zcGxpdChwYXRoLnNlcCkuam9pbignLycpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIubm90aWZ5U2F2ZWQocmVsUGF0aCwgZnVsbFBhdGgpO1xuXG4gICAgICAvLyBVcGRhdGUgYm91bmRlZCBjb250ZW50IGhhc2ggaW5kZXhcbiAgICAgIHRoaXMuY29udGVudEhhc2hJbmRleC5zZXQoY29udGVudEhhc2gsIGZ1bGxQYXRoKTtcbiAgICAgIHRoaXMuY29udGVudEhhc2hCeVBhdGguc2V0KGZ1bGxQYXRoLCBjb250ZW50SGFzaCk7XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIHNhdmVcbiAgICAgIGNvbnN0IHN0YXRzID0gZWxlbWVudC5nZXRTdGF0cygpO1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TQVZFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgU2F2ZWQgbWVtb3J5IHRvICR7cGF0aC5iYXNlbmFtZShmdWxsUGF0aCl9IHdpdGggJHtzdGF0cy50b3RhbEVudHJpZXN9IGVudHJpZXNgXG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX1NBVkVfRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIHNhdmUgbWVtb3J5IHRvICR7ZmlsZVBhdGh9OiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2F2ZSBtZW1vcnk6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBIYW5kbGUgbWVtb3J5IGxvYWQgZmFpbHVyZVxuICAgKiBGSVggKFNvbmFyQ2xvdWQpOiBFeHRyYWN0IGR1cGxpY2F0ZWQgZXJyb3IgaGFuZGxpbmcgdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlTG9hZEZhaWx1cmUoXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIGVycm9yOiB1bmtub3duLFxuICAgIGZhaWxlZExvYWRzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBlcnJvck1zZyA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICBmYWlsZWRMb2Fkcy5wdXNoKHsgZmlsZSwgZXJyb3I6IGVycm9yTXNnIH0pO1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0xJU1RfSVRFTV9GQUlMRUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxpc3QnLFxuICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBsb2FkICR7ZmlsZX06ICR7ZXJyb3J9YFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIGF2YWlsYWJsZSBtZW1vcmllcyBmcm9tIGFsbCBsb2NhdGlvbnMuXG4gICAqIFBoYXNlIDI6IERlbGVnYXRlcyBtdWx0aS1kaXJlY3Rvcnkgc2Nhbm5pbmcgdG8gTWVtb3J5U3RvcmFnZUxheWVyLlxuICAgKiBTdG9yYWdlIGxheWVyIGhhbmRsZXM6IHN5c3RlbS8sIGFkYXB0ZXJzLywgZGF0ZSBmb2xkZXJzLCByb290LCBiYWNrdXAgZmlsdGVyaW5nLCBjb29sZG93bi5cbiAgICpcbiAgICogSXNzdWUgIzE4IFBoYXNlIDQ6IEFwcGx5IGFjdGl2ZSBzdGF0dXMgdG8gbWVtb3JpZXMgdGhhdCBhcmUgaW4gdGhlIGFjdGl2ZSBzZXQuXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBsaXN0KCk6IFByb21pc2U8TWVtb3J5W10+IHtcbiAgICBjb25zdCBmYWlsZWRMb2FkczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT4gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeSh0aGlzLm1lbW9yaWVzRGlyKTtcblxuICAgICAgLy8gU3RvcmFnZSBsYXllciBoYW5kbGVzIG11bHRpLWRpcmVjdG9yeSBzY2FuICsgY29vbGRvd25cbiAgICAgIGNvbnN0IGluZGV4ZWRQYXRocyA9IGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLmdldEluZGV4ZWRQYXRocygpO1xuXG4gICAgICAvLyBMb2FkIHRocm91Z2ggTFJVIGNhY2hlXG4gICAgICBjb25zdCBtZW1vcmllczogTWVtb3J5W10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcmVsYXRpdmVQYXRoIG9mIGluZGV4ZWRQYXRocykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IHRoaXMubG9hZChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgIC8vIEVuc3VyZSBtZW1vcnlUeXBlIGlzIHNldCBiYXNlZCBvbiBsb2NhdGlvblxuICAgICAgICAgIGNvbnN0IG1lbW9yeU1ldGEgPSBtZW1vcnkubWV0YWRhdGEgYXMgTWVtb3J5TWV0YWRhdGE7XG4gICAgICAgICAgaWYgKCFtZW1vcnlNZXRhLm1lbW9yeVR5cGUpIHtcbiAgICAgICAgICAgIG1lbW9yeU1ldGEubWVtb3J5VHlwZSA9IE1lbW9yeU1ldGFkYXRhRXh0cmFjdG9yLmluZmVyTWVtb3J5VHlwZShyZWxhdGl2ZVBhdGgpIGFzIE1lbW9yeVR5cGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1lbW9yaWVzLnB1c2gobWVtb3J5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUxvYWRGYWlsdXJlKHJlbGF0aXZlUGF0aCwgZXJyb3IsIGZhaWxlZExvYWRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmFpbGVkTG9hZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2dnZXIud2FybihgW01lbW9yeU1hbmFnZXJdIEZhaWxlZCB0byBsb2FkICR7ZmFpbGVkTG9hZHMubGVuZ3RofSBtZW1vcmllczpgLFxuICAgICAgICAgIGZhaWxlZExvYWRzLm1hcChmID0+IGAgIC0gJHtmLmZpbGV9OiAke2YuZXJyb3J9YCkuam9pbignXFxuJykpO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWR1cGxpY2F0ZSBieSBmaWxlIHBhdGggKHByZXNlcnZlcyBleGlzdGluZyBiZWhhdmlvcilcbiAgICAgIGNvbnN0IHVuaXF1ZU1lbW9yaWVzID0gbmV3IE1hcDxzdHJpbmcsIE1lbW9yeT4oKTtcbiAgICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIG1lbW9yaWVzKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gbWVtb3J5LmdldEZpbGVQYXRoKCk7XG4gICAgICAgIGlmIChmaWxlUGF0aCAmJiAhdW5pcXVlTWVtb3JpZXMuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHVuaXF1ZU1lbW9yaWVzLnNldChmaWxlUGF0aCwgbWVtb3J5KTtcbiAgICAgICAgfSBlbHNlIGlmICghZmlsZVBhdGgpIHtcbiAgICAgICAgICB1bmlxdWVNZW1vcmllcy5zZXQoYG5vLXBhdGgtJHttZW1vcnkubWV0YWRhdGEubmFtZX0tJHtEYXRlLm5vdygpfWAsIG1lbW9yeSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0TWVtb3JpZXMgPSBBcnJheS5mcm9tKHVuaXF1ZU1lbW9yaWVzLnZhbHVlcygpKTtcblxuICAgICAgLy8gSXNzdWUgIzE4IFBoYXNlIDQ6IEFwcGx5IGFjdGl2ZSBzdGF0dXMgdG8gbWVtb3JpZXMgaW4gdGhlIGFjdGl2ZSBzZXRcbiAgICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIHJlc3VsdE1lbW9yaWVzKSB7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLmhhcyhtZW1vcnkubWV0YWRhdGEubmFtZSkpIHtcbiAgICAgICAgICBhd2FpdCBtZW1vcnkuYWN0aXZhdGUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0TWVtb3JpZXM7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZSBhIG1lbW9yeSBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICogSXNzdWUgIzE4IFBoYXNlIDQ6IENvbnRleHQtbG9hZGluZyBhY3RpdmF0aW9uIHN0cmF0ZWd5XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ2xlYW51cCB0cmlnZ2VyIGZvciBtZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqL1xuICBhc3luYyBhY3RpdmF0ZU1lbW9yeShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyBtZW1vcnk/OiBNZW1vcnkgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghbWVtb3J5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5NRU1PUlksIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE1FTU9SWSBMRUFLIEZJWDogQ2hlY2sgaWYgY2xlYW51cCBpcyBuZWVkZWQgYmVmb3JlIGFkZGluZ1xuICAgIHRoaXMuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk7XG5cbiAgICAvLyBBZGQgdG8gYWN0aXZlIHNldCAoYnkgbmFtZSwgd2hpY2ggaXMgc3RhYmxlIGFjcm9zcyByZWxvYWRzKVxuICAgIHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuYWRkKG1lbW9yeS5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFVwZGF0ZSBtZW1vcnkgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IG1lbW9yeS5hY3RpdmF0ZSgpO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ01FTU9SWV9MT0FERUQnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5hY3RpdmF0ZU1lbW9yeScsXG4gICAgICBkZXRhaWxzOiBgTWVtb3J5IGFjdGl2YXRlZDogJHttZW1vcnkubWV0YWRhdGEubmFtZX1gXG4gICAgfSk7XG5cbiAgICBsb2dnZXIuaW5mbyhgTWVtb3J5IGFjdGl2YXRlZDogJHttZW1vcnkubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5hY3RpdmF0ZWQoRWxlbWVudFR5cGUuTUVNT1JZLCBtZW1vcnkubWV0YWRhdGEubmFtZSksXG4gICAgICBtZW1vcnlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlYWN0aXZhdGUgYSBtZW1vcnkgYnkgbmFtZSBvciBpZGVudGlmaWVyXG4gICAqIElzc3VlICMxOCBQaGFzZSA0OiBSZW1vdmUgZnJvbSBhY3RpdmUgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHVzaW5nIGZpbmRCeU5hbWUoKVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IENvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgdXNpbmcgRWxlbWVudE1lc3NhZ2VzXG4gICAqL1xuICBhc3luYyBkZWFjdGl2YXRlTWVtb3J5KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIC8vIFBFUkZPUk1BTkNFIEZJWDogVXNlIGZpbmRCeU5hbWUoKSBpbnN0ZWFkIG9mIGxpc3QoKVxuICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IHRoaXMuZmluZEJ5TmFtZShpZGVudGlmaWVyKTtcblxuICAgIGlmICghbWVtb3J5KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIGVycm9yIG1lc3NhZ2UgZm9ybWF0XG4gICAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5ub3RGb3VuZChFbGVtZW50VHlwZS5NRU1PUlksIGlkZW50aWZpZXIpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSBmcm9tIGFjdGl2ZSBzZXRcbiAgICB0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLmRlbGV0ZShtZW1vcnkubWV0YWRhdGEubmFtZSk7XG5cbiAgICAvLyBVcGRhdGUgbWVtb3J5IHN0YXR1cyBpbiBtZW1vcnlcbiAgICBhd2FpdCBtZW1vcnkuZGVhY3RpdmF0ZSgpO1xuXG4gICAgbG9nZ2VyLmluZm8oYE1lbW9yeSBkZWFjdGl2YXRlZDogJHttZW1vcnkubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgLy8gQ09OU0lTVEVOQ1kgRklYOiBVc2Ugc3RhbmRhcmRpemVkIHN1Y2Nlc3MgbWVzc2FnZSBmb3JtYXRcbiAgICAgIG1lc3NhZ2U6IEVsZW1lbnRNZXNzYWdlcy5kZWFjdGl2YXRlZChFbGVtZW50VHlwZS5NRU1PUlksIG1lbW9yeS5tZXRhZGF0YS5uYW1lKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBhY3RpdmUgbWVtb3JpZXNcbiAgICogSXNzdWUgIzE4IFBoYXNlIDQ6IFJldHVybiBtZW1vcmllcyB0aGF0IGFyZSBpbiB0aGUgYWN0aXZlIHNldFxuICAgKi9cbiAgYXN5bmMgZ2V0QWN0aXZlTWVtb3JpZXMoKTogUHJvbWlzZTxNZW1vcnlbXT4ge1xuICAgIGNvbnN0IG1lbW9yaWVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIG1lbW9yaWVzLmZpbHRlcihtID0+IHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuaGFzKG0ubWV0YWRhdGEubmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICMzOTogU2NhbiBhbGwgbWVtb3JpZXMgYW5kIHJlcGFpciBjb3JydXB0ZWQgYmFja3VwIG5hbWVzXG4gICAqIFRoaXMgbWV0aG9kIGxvYWRzIGFsbCBtZW1vcmllcywgY2hlY2tzIGZvciBjb3JydXB0ZWQgbmFtZXMsIHJlcGFpcnMgdGhlbSxcbiAgICogYW5kIHNhdmVzIHRoZSBjb3JyZWN0ZWQgZmlsZXMgYmFjayB0byBkaXNrLlxuICAgKlxuICAgKiBAcGFyYW0gb25Qcm9ncmVzcyBPcHRpb25hbCBjYWxsYmFjayBmb3IgcHJvZ3Jlc3MgdXBkYXRlcyBkdXJpbmcgbG9uZyBvcGVyYXRpb25zXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHJlcGFpciBzdGF0aXN0aWNzIGFuZCBsaXN0IG9mIHJlcGFpcmVkIG1lbW9yaWVzXG4gICAqL1xuICBhc3luYyByZXBhaXJDb3JydXB0ZWROYW1lcyhcbiAgICBvblByb2dyZXNzPzogKHByb2Nlc3NlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyLCBjdXJyZW50Pzogc3RyaW5nKSA9PiB2b2lkXG4gICk6IFByb21pc2U8e1xuICAgIHNjYW5uZWQ6IG51bWJlcjtcbiAgICByZXBhaXJlZDogbnVtYmVyO1xuICAgIGVycm9yczogbnVtYmVyO1xuICAgIHJlcGFpcmVkTWVtb3JpZXM6IEFycmF5PHsgb3JpZ2luYWw6IHN0cmluZzsgcmVwYWlyZWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nIH0+O1xuICAgIGVycm9yRGV0YWlsczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT47XG4gIH0+IHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBzY2FubmVkOiAwLFxuICAgICAgcmVwYWlyZWQ6IDAsXG4gICAgICBlcnJvcnM6IDAsXG4gICAgICByZXBhaXJlZE1lbW9yaWVzOiBbXSBhcyBBcnJheTx7IG9yaWdpbmFsOiBzdHJpbmc7IHJlcGFpcmVkOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9PixcbiAgICAgIGVycm9yRGV0YWlsczogW10gYXMgQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgICB9O1xuXG4gICAgbG9nZ2VyLmluZm8oJ1tNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IFN0YXJ0aW5nIGNvcnJ1cHRlZCBuYW1lIHJlcGFpciBzY2FuLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRm9yY2UgZnJlc2ggc2NhbiDigJQgcmVwYWlyIG11c3Qgc2VlIGN1cnJlbnQgZGlzayBzdGF0ZSwgbm90IGNhY2hlZCBpbmRleFxuICAgICAgdGhpcy5zdG9yYWdlTGF5ZXIuaW52YWxpZGF0ZSgpO1xuICAgICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIHJlc3VsdC5zY2FubmVkID0gbWVtb3JpZXMubGVuZ3RoO1xuXG4gICAgICBsZXQgcHJvY2Vzc2VkID0gMDtcbiAgICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIG1lbW9yaWVzKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnROYW1lID0gbWVtb3J5Lm1ldGFkYXRhLm5hbWU7XG4gICAgICAgIHByb2Nlc3NlZCsrO1xuXG4gICAgICAgIC8vIFJlcG9ydCBwcm9ncmVzc1xuICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgIG9uUHJvZ3Jlc3MocHJvY2Vzc2VkLCBtZW1vcmllcy5sZW5ndGgsIGN1cnJlbnROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0NvcnJ1cHRlZEJhY2t1cE5hbWUoY3VycmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc3QgcmVwYWlyZWROYW1lID0gZXh0cmFjdE9yaWdpbmFsTmFtZShjdXJyZW50TmFtZSk7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBtZW1vcnkuZ2V0RmlsZVBhdGgoKSB8fCAndW5rbm93bic7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBuYW1lXG4gICAgICAgICAgICBtZW1vcnkubWV0YWRhdGEubmFtZSA9IHJlcGFpcmVkTmFtZTtcblxuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgcmVwYWlyZWQgbWVtb3J5XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmUobWVtb3J5KTtcblxuICAgICAgICAgICAgcmVzdWx0LnJlcGFpcmVkKys7XG4gICAgICAgICAgICByZXN1bHQucmVwYWlyZWRNZW1vcmllcy5wdXNoKHtcbiAgICAgICAgICAgICAgb3JpZ2luYWw6IGN1cnJlbnROYW1lLFxuICAgICAgICAgICAgICByZXBhaXJlZDogcmVwYWlyZWROYW1lLFxuICAgICAgICAgICAgICBwYXRoOiBmaWxlUGF0aFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICBgW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogUmVwYWlyZWQgJyR7Y3VycmVudE5hbWV9JyAtPiAnJHtyZXBhaXJlZE5hbWV9JyBhdCAke2ZpbGVQYXRofWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvcnMrKztcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvckRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICAgIG5hbWU6IGN1cnJlbnROYW1lLFxuICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogRmFpbGVkIHRvIHJlcGFpciAnJHtjdXJyZW50TmFtZX0nOmAsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiBSZXBhaXIgc2NhbiBjb21wbGV0ZS4gYCArXG4gICAgICAgIGBTY2FubmVkOiAke3Jlc3VsdC5zY2FubmVkfSwgUmVwYWlyZWQ6ICR7cmVzdWx0LnJlcGFpcmVkfSwgRXJyb3JzOiAke3Jlc3VsdC5lcnJvcnN9YFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdC5yZXBhaXJlZCA+IDApIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX1NBVkVELFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnJlcGFpckNvcnJ1cHRlZE5hbWVzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgSXNzdWUgIzM5OiBSZXBhaXJlZCAke3Jlc3VsdC5yZXBhaXJlZH0gY29ycnVwdGVkIG1lbW9yeSBuYW1lc2AsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIHNjYW5uZWQ6IHJlc3VsdC5zY2FubmVkLFxuICAgICAgICAgICAgcmVwYWlyZWQ6IHJlc3VsdC5yZXBhaXJlZCxcbiAgICAgICAgICAgIGVycm9yczogcmVzdWx0LmVycm9yc1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogUmVwYWlyIHNjYW4gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjMzk6IENsZWFuIHVwIGV4Y2Vzc2l2ZSBiYWNrdXAgZmlsZXMgaW4gYSBkaXJlY3RvcnlcbiAgICogUmVtb3ZlcyB2ZXJzaW9uZWQgYmFja3VwIGZpbGVzIChlLmcuLCBuYW1lLmJhY2t1cC0uLi4tdjIueWFtbCwgLXYzLnlhbWwsIGV0Yy4pXG4gICAqIGtlZXBpbmcgb25seSB0aGUgbW9zdCByZWNlbnQgYmFja3VwICh3aXRob3V0IHZlcnNpb24gc3VmZml4KVxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0RGlyIERpcmVjdG9yeSB0byBjbGVhbiB1cCAoZGVmYXVsdHMgdG8gc3lzdGVtLyBmb2xkZXIpXG4gICAqIEBwYXJhbSBkcnlSdW4gSWYgdHJ1ZSwgb25seSByZXBvcnRzIHdoYXQgd291bGQgYmUgZGVsZXRlZCB3aXRob3V0IGFjdHVhbGx5IGRlbGV0aW5nXG4gICAqIEBwYXJhbSBvblByb2dyZXNzIE9wdGlvbmFsIGNhbGxiYWNrIGZvciBwcm9ncmVzcyB1cGRhdGVzIGR1cmluZyBsb25nIG9wZXJhdGlvbnNcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggY2xlYW51cCBzdGF0aXN0aWNzXG4gICAqL1xuICBhc3luYyBjbGVhbnVwRXhjZXNzaXZlQmFja3VwcyhcbiAgICB0YXJnZXREaXI/OiBzdHJpbmcsXG4gICAgZHJ5UnVuOiBib29sZWFuID0gZmFsc2UsXG4gICAgb25Qcm9ncmVzcz86IChwcm9jZXNzZWQ6IG51bWJlciwgdG90YWw6IG51bWJlciwgY3VycmVudD86IHN0cmluZykgPT4gdm9pZFxuICApOiBQcm9taXNlPHtcbiAgICBzY2FubmVkOiBudW1iZXI7XG4gICAgZGVsZXRlZDogbnVtYmVyO1xuICAgIGVycm9yczogbnVtYmVyO1xuICAgIGRlbGV0ZWRGaWxlczogc3RyaW5nW107XG4gICAga2VwdEZpbGVzOiBzdHJpbmdbXTtcbiAgICBlcnJvckRldGFpbHM6IEFycmF5PHsgZmlsZTogc3RyaW5nOyBlcnJvcjogc3RyaW5nIH0+O1xuICB9PiB7XG4gICAgY29uc3QgZGlyID0gdGFyZ2V0RGlyIHx8IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnc3lzdGVtJyk7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgc2Nhbm5lZDogMCxcbiAgICAgIGRlbGV0ZWQ6IDAsXG4gICAgICBlcnJvcnM6IDAsXG4gICAgICBkZWxldGVkRmlsZXM6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAga2VwdEZpbGVzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgIGVycm9yRGV0YWlsczogW10gYXMgQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgICB9O1xuXG4gICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IFN0YXJ0aW5nIGJhY2t1cCBjbGVhbnVwIGluICR7ZGlyfSR7ZHJ5UnVuID8gJyAoRFJZIFJVTiknIDogJyd9Li4uYCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3RvcnkoZGlyKTtcbiAgICAgIHJlc3VsdC5zY2FubmVkID0gZmlsZXMubGVuZ3RoO1xuXG4gICAgICAvLyBHcm91cCBiYWNrdXAgZmlsZXMgYnkgYmFzZSBuYW1lXG4gICAgICBjb25zdCBiYWNrdXBHcm91cHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAvLyBNYXRjaCB2ZXJzaW9uZWQgYmFja3VwIGZpbGVzOiBuYW1lLmJhY2t1cC1ZWVlZLU1NLURELUhILW1tLXNzLVNTUy12Ti55YW1sXG4gICAgICAgIGNvbnN0IHZlcnNpb25lZE1hdGNoID0gZmlsZS5tYXRjaCgvXiguK1xcLmJhY2t1cC1cXGR7NH0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7M30pLXYoXFxkKylcXC55YW1sJC8pO1xuICAgICAgICBpZiAodmVyc2lvbmVkTWF0Y2gpIHtcbiAgICAgICAgICBjb25zdCBiYXNlTmFtZSA9IHZlcnNpb25lZE1hdGNoWzFdO1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYmFja3VwR3JvdXBzLmdldChiYXNlTmFtZSkgfHwgW107XG4gICAgICAgICAgZXhpc3RpbmcucHVzaChmaWxlKTtcbiAgICAgICAgICBiYWNrdXBHcm91cHMuc2V0KGJhc2VOYW1lLCBleGlzdGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRGVsZXRlIGFsbCB2ZXJzaW9uZWQgYmFja3VwIGZpbGVzXG4gICAgICBsZXQgcHJvY2Vzc2VkID0gMDtcbiAgICAgIGNvbnN0IHRvdGFsVmVyc2lvbmVkRmlsZXMgPSBBcnJheS5mcm9tKGJhY2t1cEdyb3Vwcy52YWx1ZXMoKSkucmVkdWNlKChzdW0sIGZpbGVzKSA9PiBzdW0gKyBmaWxlcy5sZW5ndGgsIDApO1xuXG4gICAgICBmb3IgKGNvbnN0IFtiYXNlTmFtZSwgdmVyc2lvbmVkRmlsZXNdIG9mIGJhY2t1cEdyb3Vwcykge1xuICAgICAgICAvLyBLZWVwIHRoZSBiYXNlIGJhY2t1cCBmaWxlICh3aXRob3V0IC12TiksIGRlbGV0ZSBhbGwgdmVyc2lvbmVkIG9uZXNcbiAgICAgICAgY29uc3QgYmFzZUJhY2t1cEZpbGUgPSBgJHtiYXNlTmFtZX0ueWFtbGA7XG4gICAgICAgIGlmIChmaWxlcy5pbmNsdWRlcyhiYXNlQmFja3VwRmlsZSkpIHtcbiAgICAgICAgICByZXN1bHQua2VwdEZpbGVzLnB1c2goYmFzZUJhY2t1cEZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCB2ZXJzaW9uZWRGaWxlIG9mIHZlcnNpb25lZEZpbGVzKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkKys7XG5cbiAgICAgICAgICAvLyBSZXBvcnQgcHJvZ3Jlc3NcbiAgICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgICAgb25Qcm9ncmVzcyhwcm9jZXNzZWQsIHRvdGFsVmVyc2lvbmVkRmlsZXMsIHZlcnNpb25lZEZpbGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgdmVyc2lvbmVkRmlsZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghZHJ5UnVuKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZGVsZXRlRmlsZShmdWxsUGF0aCwgRWxlbWVudFR5cGUuTUVNT1JZLCB7XG4gICAgICAgICAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5jbGVhbnVwRXhjZXNzaXZlQmFja3VwcydcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQuZGVsZXRlZCsrO1xuICAgICAgICAgICAgcmVzdWx0LmRlbGV0ZWRGaWxlcy5wdXNoKHZlcnNpb25lZEZpbGUpO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiAke2RyeVJ1biA/ICdXb3VsZCBkZWxldGUnIDogJ0RlbGV0ZWQnfSAke3ZlcnNpb25lZEZpbGV9YCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvcnMrKztcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvckRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICAgIGZpbGU6IHZlcnNpb25lZEZpbGUsXG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiBGYWlsZWQgdG8gZGVsZXRlICR7dmVyc2lvbmVkRmlsZX06YCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IEJhY2t1cCBjbGVhbnVwIGNvbXBsZXRlJHtkcnlSdW4gPyAnIChEUlkgUlVOKScgOiAnJ30uIGAgK1xuICAgICAgICBgU2Nhbm5lZDogJHtyZXN1bHQuc2Nhbm5lZH0sICR7ZHJ5UnVuID8gJ1dvdWxkIGRlbGV0ZScgOiAnRGVsZXRlZCd9OiAke3Jlc3VsdC5kZWxldGVkfSwgRXJyb3JzOiAke3Jlc3VsdC5lcnJvcnN9YFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdC5kZWxldGVkID4gMCAmJiAhZHJ5UnVuKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9DTEVBUkVELFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmNsZWFudXBFeGNlc3NpdmVCYWNrdXBzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgSXNzdWUgIzM5OiBDbGVhbmVkIHVwICR7cmVzdWx0LmRlbGV0ZWR9IGV4Y2Vzc2l2ZSBiYWNrdXAgZmlsZXNgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICBkaXJlY3Rvcnk6IGRpcixcbiAgICAgICAgICAgIHNjYW5uZWQ6IHJlc3VsdC5zY2FubmVkLFxuICAgICAgICAgICAgZGVsZXRlZDogcmVzdWx0LmRlbGV0ZWQsXG4gICAgICAgICAgICBlcnJvcnM6IHJlc3VsdC5lcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IEJhY2t1cCBjbGVhbnVwIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWN0aXZlIHNldCBjbGVhbnVwIGlzIG5lZWRlZCBhbmQgcGVyZm9ybSBjbGVhbnVwIGlmIG5lY2Vzc2FyeVxuICAgKiBJc3N1ZSAjMjQgKExPVyBQUklPUklUWSk6IE1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0KCk6IHZvaWQge1xuICAgIGNvbnN0IHsgbWF4LCBjbGVhbnVwVGhyZXNob2xkIH0gPSBnZXRBY3RpdmVFbGVtZW50TGltaXRDb25maWcoJ21lbW9yaWVzJyk7XG5cbiAgICAvLyBCZWxvdyB0aHJlc2hvbGQg4oCUIG5vIGFjdGlvbiBuZWVkZWRcbiAgICBpZiAodGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5zaXplIDwgY2xlYW51cFRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIG1heCDigJQgd2FybiBiZWZvcmUgY2xlYW51cFxuICAgIGlmICh0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLnNpemUgPj0gbWF4KSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEFjdGl2ZSBtZW1vcmllcyBsaW1pdCByZWFjaGVkICgke21heH0pLiBgICtcbiAgICAgICAgYENvbnNpZGVyIGRlYWN0aXZhdGluZyB1bnVzZWQgbWVtb3JpZXMgb3Igc2V0dGluZyBET0xMSE9VU0VfTUFYX0FDVElWRV9NRU1PUklFUyB0byBhIGhpZ2hlciB2YWx1ZS5gXG4gICAgICApO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfTE9BREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmNoZWNrQW5kQ2xlYW51cEFjdGl2ZVNldCcsXG4gICAgICAgIGRldGFpbHM6IGBBY3RpdmUgbWVtb3JpZXMgbGltaXQgcmVhY2hlZDogJHt0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLnNpemV9LyR7bWF4fWBcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEF0IG9yIGFib3ZlIHRocmVzaG9sZCDigJQgcHJvYWN0aXZlbHkgY2xlYW4gc3RhbGUgZW50cmllc1xuICAgIHZvaWQgdGhpcy5jbGVhbnVwU3RhbGVBY3RpdmVNZW1vcmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHN0YWxlIGVudHJpZXMgZnJvbSBhY3RpdmUgbWVtb3JpZXMgc2V0XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjbGVhbnVwU3RhbGVBY3RpdmVNZW1vcmllcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRTaXplID0gdGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5zaXplO1xuICAgICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nTWVtb3J5TmFtZXMgPSBuZXcgU2V0KG1lbW9yaWVzLm1hcChtID0+IG0ubWV0YWRhdGEubmFtZSkpO1xuXG4gICAgICBjb25zdCBzdGFsZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhY3RpdmVOYW1lIG9mIHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMpIHtcbiAgICAgICAgaWYgKCFleGlzdGluZ01lbW9yeU5hbWVzLmhhcyhhY3RpdmVOYW1lKSkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuZGVsZXRlKGFjdGl2ZU5hbWUpO1xuICAgICAgICAgIHN0YWxlTmFtZXMucHVzaChhY3RpdmVOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbmRTaXplID0gdGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5zaXplO1xuICAgICAgY29uc3QgcmVtb3ZlZCA9IHN0YXJ0U2l6ZSAtIGVuZFNpemU7XG5cbiAgICAgIGlmIChyZW1vdmVkID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgQ2xlYW5lZCB1cCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBtZW1vcnkgcmVmZXJlbmNlKHMpLiBgICtcbiAgICAgICAgICBgQWN0aXZlIG1lbW9yaWVzOiAke2VuZFNpemV9LyR7Z2V0TWF4QWN0aXZlTGltaXQoJ21lbW9yaWVzJyl9YFxuICAgICAgICApO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnTUVNT1JZX0RFTEVURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZU1lbW9yaWVzJyxcbiAgICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke3JlbW92ZWR9IHN0YWxlIGFjdGl2ZSBtZW1vcnkgcmVmZXJlbmNlc2AsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudDogcmVtb3ZlZCxcbiAgICAgICAgICAgIGFjdGl2ZUNvdW50OiBlbmRTaXplLFxuICAgICAgICAgICAgc3RhbGVOYW1lczogc3RhbGVOYW1lcy5qb2luKCcsICcpXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY2xlYW51cCBzdGFsZSBhY3RpdmUgbWVtb3JpZXM6JywgZXJyb3IpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfREVMRVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5jbGVhbnVwU3RhbGVBY3RpdmVNZW1vcmllcycsXG4gICAgICAgIGRldGFpbHM6IGBDbGVhbnVwIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgcm9vdCBmaWxlcyBmb3IgbG9hZCBmYWlsdXJlc1xuICAgKiBGSVggKFNvbmFyQ2xvdWQgUzM3NzYpOiBFeHRyYWN0IHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja1Jvb3RGaWxlcyhcbiAgICBmYWlsdXJlczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCByb290RmlsZXMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmxpc3REaXJlY3RvcnkodGhpcy5tZW1vcmllc0RpcilcbiAgICAgIC50aGVuKGZpbGVzID0+IGZpbGVzLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy55YW1sJykpKVxuICAgICAgLmNhdGNoKCgpID0+IFtdKTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiByb290RmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZChmaWxlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBmYWlsdXJlcy5wdXNoKHsgZmlsZSwgZXJyb3I6IGVycm9yTXNnIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByb290RmlsZXMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGRhdGUgZm9sZGVyIGZpbGVzIGZvciBsb2FkIGZhaWx1cmVzXG4gICAqIEZJWCAoU29uYXJDbG91ZCBTMzc3Nik6IEV4dHJhY3QgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrRGF0ZUZvbGRlckZpbGVzKFxuICAgIGRhdGVGb2xkZXI6IHN0cmluZyxcbiAgICBmYWlsdXJlczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT5cbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgZGF0ZUZvbGRlcikpXG4gICAgICAudGhlbihmaWxlcyA9PiBmaWxlcy5maWx0ZXIoZiA9PiBmLmVuZHNXaXRoKCcueWFtbCcpKSlcbiAgICAgIC5jYXRjaCgoKSA9PiBbXSk7XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZChwYXRoLmpvaW4oZGF0ZUZvbGRlciwgZmlsZSkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goeyBmaWxlOiBgJHtkYXRlRm9sZGVyfS8ke2ZpbGV9YCwgZXJyb3I6IGVycm9yTXNnIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWxlcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRpYWdub3N0aWMgaW5mb3JtYXRpb24gYWJvdXQgbWVtb3J5IGxvYWRpbmcgc3RhdHVzXG4gICAqIEZJWCAoIzEyMDYpOiBOZXcgbWV0aG9kIHRvIGV4cG9zZSBmYWlsZWQgbG9hZHMgdG8gdXNlcnNcbiAgICovXG4gIGFzeW5jIGdldExvYWRTdGF0dXMoKTogUHJvbWlzZTx7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICBsb2FkZWQ6IG51bWJlcjtcbiAgICBmYWlsZWQ6IG51bWJlcjtcbiAgICBmYWlsdXJlczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT47XG4gIH0+IHtcbiAgICBjb25zdCBmYWlsdXJlczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT4gPSBbXTtcbiAgICBsZXQgdG90YWxGaWxlcyA9IDA7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0ZUZvbGRlcnMgPSBhd2FpdCB0aGlzLmdldERhdGVGb2xkZXJzKCk7XG5cbiAgICAgIC8vIENoZWNrIHJvb3QgZmlsZXNcbiAgICAgIHRvdGFsRmlsZXMgKz0gYXdhaXQgdGhpcy5jaGVja1Jvb3RGaWxlcyhmYWlsdXJlcyk7XG5cbiAgICAgIC8vIENoZWNrIGRhdGUgZm9sZGVyc1xuICAgICAgZm9yIChjb25zdCBkYXRlRm9sZGVyIG9mIGRhdGVGb2xkZXJzKSB7XG4gICAgICAgIHRvdGFsRmlsZXMgKz0gYXdhaXQgdGhpcy5jaGVja0RhdGVGb2xkZXJGaWxlcyhkYXRlRm9sZGVyLCBmYWlsdXJlcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRvdGFsOiB0b3RhbEZpbGVzLFxuICAgICAgICBsb2FkZWQ6IHRvdGFsRmlsZXMgLSBmYWlsdXJlcy5sZW5ndGgsXG4gICAgICAgIGZhaWxlZDogZmFpbHVyZXMubGVuZ3RoLFxuICAgICAgICBmYWlsdXJlc1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZ2V0IGxvYWQgc3RhdHVzOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtb3JpZXMgbWFya2VkIGZvciBhdXRvLWxvYWRpbmcgb24gc2VydmVyIGluaXRpYWxpemF0aW9uLlxuICAgKiBQaGFzZSAyOiBRdWVyaWVzIGluZGV4IGZvciBhdXRvTG9hZCBlbnRyaWVzIGluc3RlYWQgb2YgbG9hZGluZyBhbGwgbWVtb3JpZXMuXG4gICAqIERyb3BzIGZyb20gfjcwcyB0byA8MzBtcyBmb3IgdHlwaWNhbCBwb3J0Zm9saW9zIHdpdGggMTRrIG1lbW9yaWVzLlxuICAgKiBJc3N1ZSAjMTQzMDogQXV0by1sb2FkIGJhc2VsaW5lIG1lbW9yaWVzIGZlYXR1cmVcbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYXJyYXkgb2YgYXV0by1sb2FkIG1lbW9yaWVzIHNvcnRlZCBieSBwcmlvcml0eVxuICAgKi9cbiAgYXN5bmMgZ2V0QXV0b0xvYWRNZW1vcmllcygpOiBQcm9taXNlPE1lbW9yeVtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuc3VyZSBpbmRleCBpcyBwb3B1bGF0ZWRcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmFnZUxheWVyLnNjYW4oKTtcblxuICAgICAgLy8gUGhhc2UgMjogUXVlcnkgaW5kZXggZm9yIGF1dG9Mb2FkIGVudHJpZXMg4oCUIGRvZXMgTk9UIGxvYWQgYWxsIGZpbGVzXG4gICAgICBjb25zdCBtZW1TdG9yYWdlTGF5ZXIgPSB0aGlzLnN0b3JhZ2VMYXllciBhcyBNZW1vcnlTdG9yYWdlTGF5ZXI7XG4gICAgICBjb25zdCBhdXRvTG9hZEVudHJpZXMgPSBtZW1TdG9yYWdlTGF5ZXIuZ2V0QXV0b0xvYWRFbnRyaWVzKCk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gZ2V0QXV0b0xvYWRNZW1vcmllczogRm91bmQgJHthdXRvTG9hZEVudHJpZXMubGVuZ3RofSBhdXRvLWxvYWQgZW50cmllcyBpbiBpbmRleGApO1xuXG4gICAgICAvLyBMb2FkIG9ubHkgbWF0Y2hpbmcgbWVtb3JpZXMgKHR5cGljYWxseSAzLTUpXG4gICAgICBjb25zdCBhdXRvTG9hZE1lbW9yaWVzOiBNZW1vcnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBhdXRvTG9hZEVudHJpZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtZW1vcnkgPSBhd2FpdCB0aGlzLmxvYWQoZW50cnkuZmlsZVBhdGgpO1xuICAgICAgICAgIGF1dG9Mb2FkTWVtb3JpZXMucHVzaChtZW1vcnkpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdICAgLSAke2VudHJ5Lm5hbWV9OiBwcmlvcml0eT0ke2VudHJ5LnByaW9yaXR5ID8/IDk5OX0gKExPQURFRClgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW01lbW9yeU1hbmFnZXJdIEZhaWxlZCB0byBsb2FkIGF1dG8tbG9hZCBtZW1vcnkgJHtlbnRyeS5maWxlUGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU29ydCBieSBwcmlvcml0eSAoYWxyZWFkeSBzb3J0ZWQgZnJvbSBnZXRBdXRvTG9hZEVudHJpZXMsIGJ1dCBlbnN1cmUgY29uc2lzdGVuY3kpXG4gICAgICBhdXRvTG9hZE1lbW9yaWVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgcGEgPSAoYS5tZXRhZGF0YSBhcyBNZW1vcnlNZXRhZGF0YSkucHJpb3JpdHkgPz8gOTk5O1xuICAgICAgICBjb25zdCBwYiA9IChiLm1ldGFkYXRhIGFzIE1lbW9yeU1ldGFkYXRhKS5wcmlvcml0eSA/PyA5OTk7XG4gICAgICAgIHJldHVybiBwYSAtIHBiO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBhdXRvTG9hZE1lbW9yaWVzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tNZW1vcnlNYW5hZ2VyXSBGYWlsZWQgdG8gZ2V0IGF1dG8tbG9hZCBtZW1vcmllczonLCBlcnJvcik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgc2VlZCBtZW1vcmllcyBmcm9tIHRoZSBzZWVkLWVsZW1lbnRzIGRpcmVjdG9yeVxuICAgKiBJc3N1ZSAjMTQzMDogQ29weSBiYXNlbGluZSBtZW1vcnkgdG8gdXNlciBwb3J0Zm9saW8gb24gZmlyc3QgcnVuXG4gICAqXG4gICAqIENvcGllcyBzZWVkIGZpbGVzIGZyb20gc3JjL3NlZWQtZWxlbWVudHMvbWVtb3JpZXMvIHRvIHRoZSB1c2VyJ3MgcG9ydGZvbGlvXG4gICAqIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBleGlzdC4gVGhpcyBhbGxvd3MgdXNlcnMgdG8gaGF2ZSBiYXNlbGluZSBrbm93bGVkZ2VcbiAgICogYXZhaWxhYmxlIGltbWVkaWF0ZWx5IHdpdGhvdXQgbWFudWFsIGluc3RhbGxhdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgd2hlbiBpbnN0YWxsYXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIGFzeW5jIGluc3RhbGxTZWVkTWVtb3JpZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nZ2VyLmluZm8oJ1tNZW1vcnlNYW5hZ2VyXSDwn4yxIFN0YXJ0aW5nIHNlZWQgbWVtb3J5IGluc3RhbGxhdGlvbi4uLicpO1xuICAgIHRyeSB7XG4gICAgICAvLyBEZWZpbmUgdGhlIHNlZWQgZmlsZVxuICAgICAgY29uc3Qgc2VlZEZpbGVOYW1lID0gJ2RvbGxob3VzZW1jcC1iYXNlbGluZS1rbm93bGVkZ2UueWFtbCc7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDE6IFRhcmdldCBzZWVkIGZpbGU6ICR7c2VlZEZpbGVOYW1lfWApO1xuXG4gICAgICAvLyBDb25zdHJ1Y3QgcGF0aHNcbiAgICAgIC8vIFdoZW4gcnVubmluZyBmcm9tIGRpc3QvZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5TWFuYWdlci5qczpcbiAgICAgIC8vICAgR28gdXAgdG8gZGlzdC8gdGhlbiBpbnRvIHNlZWQtZWxlbWVudHMvbWVtb3JpZXMvXG4gICAgICAvLyBXaGVuIHJ1bm5pbmcgZnJvbSBzcmMvZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5TWFuYWdlci50czpcbiAgICAgIC8vICAgR28gdXAgdG8gc3JjLyB0aGVuIGludG8gc2VlZC1lbGVtZW50cy9tZW1vcmllcy9cbiAgICAgIC8vIEZJWDogVXNlIGZpbGVVUkxUb1BhdGggZm9yIGNyb3NzLXBsYXRmb3JtIFdpbmRvd3MgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gT24gV2luZG93cywgVVJMLnBhdGhuYW1lIHJldHVybnMgL0M6L1VzZXJzLy4uLiB3aGljaCBpcyBpbnZhbGlkXG4gICAgICAvLyBmaWxlVVJMVG9QYXRoIGNvcnJlY3RseSBjb252ZXJ0cyBmaWxlOi8vIFVSTHMgdG8gbmF0aXZlIHBhdGhzXG4gICAgICBjb25zdCBjdXJyZW50TW9kdWxlRGlyID0gcGF0aC5kaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDI6IEN1cnJlbnQgbW9kdWxlIGRpcmVjdG9yeTogJHtjdXJyZW50TW9kdWxlRGlyfWApO1xuXG4gICAgICAvLyBUcnkgZGlzdCBsb2NhdGlvbiBmaXJzdCAocHJvZHVjdGlvbi9idWlsdCBjb2RlKVxuICAgICAgbGV0IHNlZWRTb3VyY2VQYXRoID0gcGF0aC5yZXNvbHZlKGN1cnJlbnRNb2R1bGVEaXIsICcuLi8uLi9zZWVkLWVsZW1lbnRzL21lbW9yaWVzJywgc2VlZEZpbGVOYW1lKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU3RlcCAzOiBUcnlpbmcgc2VlZCBwYXRoIChkaXN0KTogJHtzZWVkU291cmNlUGF0aH1gKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgaXQgZXhpc3RzLCBpZiBub3QgdHJ5IHNyYyBsb2NhdGlvbiAoZGV2ZWxvcG1lbnQvdGVzdClcbiAgICAgIGlmIChhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhzZWVkU291cmNlUGF0aCkpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgU3RlcCA0OiBGb3VuZCBzZWVkIGZpbGUgaW4gZGlzdCBsb2NhdGlvbmApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtNZW1vcnlNYW5hZ2VyXSDimqDvuI8gIFN0ZXAgNDogU2VlZCBmaWxlIG5vdCBpbiBkaXN0IGxvY2F0aW9uLCB0cnlpbmcgc3JjLi4uYCk7XG4gICAgICAgIC8vIFRyeSBzcmMgbG9jYXRpb25cbiAgICAgICAgc2VlZFNvdXJjZVBhdGggPSBwYXRoLnJlc29sdmUoY3VycmVudE1vZHVsZURpciwgJy4uLy4uLy4uL3NyYy9zZWVkLWVsZW1lbnRzL21lbW9yaWVzJywgc2VlZEZpbGVOYW1lKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDRiOiBUcnlpbmcgc2VlZCBwYXRoIChzcmMpOiAke3NlZWRTb3VyY2VQYXRofWApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc2VlZCBmaWxlIGV4aXN0c1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhzZWVkU291cmNlUGF0aCkpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbTWVtb3J5TWFuYWdlcl0g4p2MIFN0ZXAgNTogU2VlZCBmaWxlIG5vdCBmb3VuZCBhdCAke3NlZWRTb3VyY2VQYXRofWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBTdGVwIDU6IFZlcmlmaWVkIHNlZWQgZmlsZSBleGlzdHMgYXQ6ICR7c2VlZFNvdXJjZVBhdGh9YCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdXNlciBwb3J0Zm9saW9cbiAgICAgIC8vIElTU1VFICM1OiBTZWVkIGZpbGVzIGFyZSBzeXN0ZW0gZmlsZXMgLSBBTFdBWVMgdXNlIGxhdGVzdCB2ZXJzaW9uXG4gICAgICAvLyBCYWNrdXAgZXhpc3RpbmcgaWYgaXQgaGFzIHVzZXIgY29udGVudCwgdGhlbiBpbnN0YWxsIGZyZXNoIHNlZWRcblxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDY6IENoZWNraW5nIGZvciBleGlzdGluZyBzZWVkIG1lbW9yeSBpbiBwb3J0Zm9saW8uLi5gKTtcbiAgICAgIGxldCBleGlzdGluZ01lbW9yeTogTWVtb3J5IHwgdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBUcnkgdG8gbG9hZCBleGlzdGluZyBtZW1vcnlcbiAgICAgICAgZXhpc3RpbmdNZW1vcnkgPSBhd2FpdCB0aGlzLmxvYWQoc2VlZEZpbGVOYW1lKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgU3RlcCA3OiBGb3VuZCBleGlzdGluZyBzZWVkIG1lbW9yeSAnJHtzZWVkRmlsZU5hbWV9J2ApO1xuICAgICAgICBjb25zdCBleGlzdGluZ1BhdGggPSBleGlzdGluZ01lbW9yeS5nZXRGaWxlUGF0aCgpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIEV4aXN0aW5nIGZpbGUgbG9jYXRpb246ICR7ZXhpc3RpbmdQYXRofWApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIE1lbW9yeSBkb2Vzbid0IGV4aXN0IC0gcHJvY2VlZCB3aXRoIGZyZXNoIGluc3RhbGxhdGlvblxuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKEue+4jyAgU3RlcCA3OiBTZWVkIG1lbW9yeSAnJHtzZWVkRmlsZU5hbWV9JyBub3QgZm91bmQgaW4gcG9ydGZvbGlvLCB3aWxsIGluc3RhbGwgZnJlc2hgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgZXhpc3RpbmcgbWVtb3J5IGZvdW5kLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHJlaW5zdGFsbFxuICAgICAgaWYgKGV4aXN0aW5nTWVtb3J5KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU3RlcCA4OiBBbmFseXppbmcgZXhpc3Rpbmcgc2VlZCBtZW1vcnkgY29udGVudC4uLmApO1xuICAgICAgICBjb25zdCBlbnRyaWVzID0gZXhpc3RpbmdNZW1vcnkuZ2V0QWxsRW50cmllcygpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBGb3VuZCAke2VudHJpZXMubGVuZ3RofSBlbnRyaWVzIGluIGV4aXN0aW5nIG1lbW9yeWApO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIG1lbW9yeSBoYXMgbWVhbmluZ2Z1bCBjb250ZW50IChub3QganVzdCBcImVudHJpZXM6IFtdXCIpXG4gICAgICAgIC8vIEVtcHR5IGZpbGVzIG9mdGVuIGhhdmUganVzdCB0aGUgXCJlbnRyaWVzOiBbXVwiIFlBTUwgZmllbGQgYXMgY29udGVudFxuICAgICAgICBsZXQgaGFzQ29udGVudCA9IGVudHJpZXMubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAoaGFzQ29udGVudCAmJiBlbnRyaWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0RW50cnkgPSBlbnRyaWVzWzBdO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmaXJzdEVudHJ5LmNvbnRlbnQ/LnRyaW0oKSB8fCAnJztcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBTaW5nbGUgZW50cnkgY29udGVudCBsZW5ndGg6ICR7Y29udGVudC5sZW5ndGh9IGNoYXJzYCk7XG4gICAgICAgICAgLy8gSWYgb25seSBjb250ZW50IGlzIFwiZW50cmllczogW11cIiwgY29uc2lkZXIgaXQgZW1wdHlcbiAgICAgICAgICBpZiAoY29udGVudCA9PT0gJ2VudHJpZXM6IFtdJyB8fCBjb250ZW50ID09PSAnJykge1xuICAgICAgICAgICAgaGFzQ29udGVudCA9IGZhbHNlO1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBFbnRyeSBhcHBlYXJzIGVtcHR5IChlbnRyaWVzOiBbXSBvciBibGFuaylgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzQ29udGVudCkge1xuICAgICAgICAgIC8vIEZJWCAjMTQzMDogU2tpcCByZWluc3RhbGxhdGlvbiBpZiBzZWVkIGFscmVhZHkgZXhpc3RzIHdpdGggY29udGVudFxuICAgICAgICAgIC8vIFJlaW5zdGFsbGluZyBkZWxldGVzIHRoZSBtZW1vcnkgZnJvbSBjYWNoZSwgbG9zaW5nIGFjdGl2YXRpb24gc3RhdHVzXG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgU2VlZCBtZW1vcnkgYWxyZWFkeSBpbnN0YWxsZWQgd2l0aCBjb250ZW50IC0gc2tpcHBpbmcgcmVpbnN0YWxsYXRpb25gKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIPCfjokgU2VlZCBtZW1vcnkgaW5zdGFsbGF0aW9uIGNoZWNrIGNvbXBsZXRlIChhbHJlYWR5IGluc3RhbGxlZClgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDk6IEV4aXN0aW5nIHNlZWQgbWVtb3J5IGlzIGVtcHR5ICgke2VudHJpZXMubGVuZ3RofSBlbnRyaWVzKSwgd2lsbCByZWluc3RhbGxgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlbGV0ZSBleGlzdGluZyAod2lsbCBiZSByZXBsYWNlZCB3aXRoIGxhdGVzdClcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDEwOiBSZW1vdmluZyBleGlzdGluZyBzZWVkIG1lbW9yeS4uLmApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKHNlZWRGaWxlTmFtZSk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgUmVtb3ZlZCBleGlzdGluZyBzZWVkIG1lbW9yeSwgd2lsbCBpbnN0YWxsIGxhdGVzdCB2ZXJzaW9uYCk7XG4gICAgICAgIH0gY2F0Y2ggKGRlbGV0ZUVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBbTWVtb3J5TWFuYWdlcl0g4p2MIEZhaWxlZCB0byBkZWxldGUgZXhpc3Rpbmcgc2VlZCBtZW1vcnk6YCwgZGVsZXRlRXJyb3IpO1xuICAgICAgICAgIHRocm93IGRlbGV0ZUVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWQgdGhlIHNlZWQgZmlsZVxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDExOiBSZWFkaW5nIHNlZWQgZmlsZSBjb250ZW50Li4uYCk7XG4gICAgICBjb25zdCBzZWVkQ29udGVudCA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoc2VlZFNvdXJjZVBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7XG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBSZWFkIHNlZWQgZmlsZTogJHtzZWVkQ29udGVudC5sZW5ndGh9IGNoYXJhY3RlcnNgKTtcblxuICAgICAgLy8gUGFyc2UgYW5kIGNyZWF0ZSBtZW1vcnkgaW5zdGFuY2VcbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU3RlcCAxMjogUGFyc2luZyBzZWVkIGNvbnRlbnQgYW5kIGNyZWF0aW5nIG1lbW9yeSBpbnN0YW5jZS4uLmApO1xuICAgICAgbGV0IG1lbW9yeTogTWVtb3J5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgbWVtb3J5ID0gYXdhaXQgdGhpcy5pbXBvcnRFbGVtZW50KHNlZWRDb250ZW50LCAneWFtbCcpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBTdWNjZXNzZnVsbHkgcGFyc2VkIHNlZWQgbWVtb3J5YCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIE1lbW9yeSBuYW1lOiAke21lbW9yeS5tZXRhZGF0YS5uYW1lfWApO1xuICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNZW1vcnlNYW5hZ2VyXSDinYwgRmFpbGVkIHRvIHBhcnNlIHNlZWQgY29udGVudDpgLCBwYXJzZUVycm9yKTtcbiAgICAgICAgdGhyb3cgcGFyc2VFcnJvcjtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IG1lbW9yeSB0eXBlIHRvIFNZU1RFTSBhbmQgZW5zdXJlIGF1dG9Mb2FkIGlzIGVuYWJsZWRcbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU3RlcCAxMzogU2V0dGluZyBtZW1vcnkgdHlwZSB0byBTWVNURU0gYW5kIGF1dG9Mb2FkLi4uYCk7XG4gICAgICBjb25zdCBtZW1vcnlNZXRhID0gbWVtb3J5Lm1ldGFkYXRhIGFzIE1lbW9yeU1ldGFkYXRhO1xuICAgICAgbWVtb3J5TWV0YS5tZW1vcnlUeXBlID0gTWVtb3J5VHlwZS5TWVNURU07XG4gICAgICBtZW1vcnlNZXRhLmF1dG9Mb2FkID0gdHJ1ZTsgLy8gRW5zdXJlIHNlZWQgbWVtb3JpZXMgYXV0by1sb2FkXG4gICAgICBtZW1vcnlNZXRhLnByaW9yaXR5ID0gMTsgICAvLyBIaWdoIHByaW9yaXR5IGZvciBiYXNlbGluZSBrbm93bGVkZ2VcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIE1lbW9yeSB0eXBlOiAke21lbW9yeU1ldGEubWVtb3J5VHlwZX0sIGF1dG9Mb2FkOiAke21lbW9yeU1ldGEuYXV0b0xvYWR9LCBwcmlvcml0eTogJHttZW1vcnlNZXRhLnByaW9yaXR5fWApO1xuXG4gICAgICAvLyBTYXZlIHRvIHBvcnRmb2xpbyAodGhpcyB3aWxsIHVzZSBzeXN0ZW0vIGZvbGRlciBiYXNlZCBvbiBtZW1vcnlUeXBlKVxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDE0OiBTYXZpbmcgc2VlZCBtZW1vcnkgdG8gcG9ydGZvbGlvIChzaG91bGQgZ28gdG8gc3lzdGVtLyBmb2xkZXIpLi4uYCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnNhdmUobWVtb3J5KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSDinIUgU3VjY2Vzc2Z1bGx5IHNhdmVkIHNlZWQgbWVtb3J5YCk7XG4gICAgICAgIGNvbnN0IHNhdmVkUGF0aCA9IG1lbW9yeS5nZXRGaWxlUGF0aCgpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIFNhdmVkIHRvOiAke3NhdmVkUGF0aH1gKTtcbiAgICAgIH0gY2F0Y2ggKHNhdmVFcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNZW1vcnlNYW5hZ2VyXSDinYwgRmFpbGVkIHRvIHNhdmUgc2VlZCBtZW1vcnk6YCwgc2F2ZUVycm9yKTtcbiAgICAgICAgdGhyb3cgc2F2ZUVycm9yO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIPCfjokgU3RlcCAxNTogU2VlZCBtZW1vcnkgaW5zdGFsbGF0aW9uIENPTVBMRVRFIWApO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfTE9BREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmluc3RhbGxTZWVkTWVtb3JpZXMnLFxuICAgICAgICBkZXRhaWxzOiBgSW5zdGFsbGVkIHNlZWQgbWVtb3J5OiAke3NlZWRGaWxlTmFtZX1gXG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBMb2cgZXJyb3IgYnV0IGRvbid0IHRocm93IC0gc2VlZCBpbnN0YWxsYXRpb24gc2hvdWxkIG5vdCBicmVhayBzZXJ2ZXIgc3RhcnR1cFxuICAgICAgbG9nZ2VyLmVycm9yKCdbTWVtb3J5TWFuYWdlcl0gRmFpbGVkIHRvIGluc3RhbGwgc2VlZCBtZW1vcmllczonLCBlcnJvcik7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdNRU1PUllfTE9BRF9GQUlMRUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuaW5zdGFsbFNlZWRNZW1vcmllcycsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gaW5zdGFsbCBzZWVkIG1lbW9yaWVzOiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEZpbmQgbWVtb3JpZXMgbWF0Y2hpbmcgYSBwcmVkaWNhdGVcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGZpbmQocHJlZGljYXRlOiAoZWxlbWVudDogTWVtb3J5KSA9PiBib29sZWFuKTogUHJvbWlzZTxNZW1vcnkgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBtZW1vcmllcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIHJldHVybiBtZW1vcmllcy5maW5kKHByZWRpY2F0ZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaW5kIG11bHRpcGxlIG1lbW9yaWVzIG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBmaW5kTWFueShwcmVkaWNhdGU6IChlbGVtZW50OiBNZW1vcnkpID0+IGJvb2xlYW4pOiBQcm9taXNlPE1lbW9yeVtdPiB7XG4gICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gbWVtb3JpZXMuZmlsdGVyKHByZWRpY2F0ZSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZWxldGUgYSBtZW1vcnkgZmlsZVxuICAgKiBTRUNVUklUWTogVmFsaWRhdGVzIHBhdGggYW5kIGxvZ3MgZGVsZXRpb25cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHNcbiAgICAgIGlmICghYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHMoZnVsbFBhdGgpKSB7XG4gICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgbm90IGFuIGVycm9yIGZvciBkZWxldGUgb3BlcmF0aW9uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRGVsZXRlIHRoZSBmaWxlXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoZnVsbFBhdGgsIEVsZW1lbnRUeXBlLk1FTU9SWSwge1xuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmRlbGV0ZSdcbiAgICAgIH0pO1xuXG4gICAgICAvLyBSZW1vdmUgZnJvbSBjYWNoZXNcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5tZW1vcmllc0RpciwgZnVsbFBhdGgpO1xuICAgICAgdGhpcy51bmNhY2hlQnlQYXRoKHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIC8vIFBoYXNlIDI6IE5vdGlmeSBzdG9yYWdlIGxheWVyIG9mIGRlbGV0aW9uXG4gICAgICB0aGlzLnN0b3JhZ2VMYXllci5ub3RpZnlEZWxldGVkKHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIC8vIFBoYXNlIDI6IFVzZSByZXZlcnNlIG1hcCBmb3IgTygxKSBoYXNoIGNsZWFudXBcbiAgICAgIGNvbnN0IGhhc2ggPSB0aGlzLmNvbnRlbnRIYXNoQnlQYXRoLmdldChmdWxsUGF0aCk7XG4gICAgICBpZiAoaGFzaCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRIYXNoSW5kZXguZGVsZXRlKGhhc2gpO1xuICAgICAgICB0aGlzLmNvbnRlbnRIYXNoQnlQYXRoLmRlbGV0ZShmdWxsUGF0aCk7XG4gICAgICB9XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfREVMRVRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmRlbGV0ZScsXG4gICAgICAgIGRldGFpbHM6IGBEZWxldGVkIG1lbW9yeSBmaWxlOiAke3BhdGguYmFzZW5hbWUoZnVsbFBhdGgpfWBcbiAgICAgIH0pO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIG5vdCBhbiBlcnJvciBmb3IgZGVsZXRlIG9wZXJhdGlvblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG1lbW9yeSBmaWxlIGV4aXN0c1xuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGZ1bGxQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgbWVtb3J5IHdpdGggbWV0YWRhdGFcbiAgICovXG4gIGFzeW5jIGNyZWF0ZShtZXRhZGF0YTogUGFydGlhbDxNZW1vcnlNZXRhZGF0YT4gJiB7IGNvbnRlbnQ/OiBzdHJpbmc7IGluc3RydWN0aW9ucz86IHN0cmluZyB9KTogUHJvbWlzZTxNZW1vcnk+IHtcbiAgICAvLyBVc2Ugc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGZvciBpbnB1dCB2YWxpZGF0aW9uXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdG9yLnZhbGlkYXRlQ3JlYXRlKHtcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb25cbiAgICB9KTtcblxuICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhbGlkYXRpb24gZmFpbGVkOiAke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gTG9nIHdhcm5pbmdzIGlmIGFueVxuICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLndhcm4oYE1lbW9yeSBjcmVhdGlvbiB3YXJuaW5nczogJHt2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSAobW92ZWQgZnJvbSBjcmVhdGVFbGVtZW50IGhhbmRsZXIpXG4gICAgY29uc3QgZXhpc3RpbmdNZW1vcmllcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IGR1cGxpY2F0ZSA9IGV4aXN0aW5nTWVtb3JpZXMuZmluZChtID0+XG4gICAgICBtLm1ldGFkYXRhLm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IG1ldGFkYXRhLm5hbWU/LnRvTG93ZXJDYXNlKClcbiAgICApO1xuICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQSBtZW1vcnkgbmFtZWQgXCIke21ldGFkYXRhLm5hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG5cbiAgICAvLyBTZXBhcmF0ZSBjb250ZW50IGFuZCBpbnN0cnVjdGlvbnMgZnJvbSBtZXRhZGF0YSBmaWVsZHNcbiAgICAvLyBOb3RlOiBCYXNlRWxlbWVudC5jb25zdHJ1Y3RvciBnZW5lcmF0ZXMgdGhlIGVsZW1lbnQgaWQgZnJvbSB0aGUgbmFtZSxcbiAgICAvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIHNldCBpZCBoZXJlIOKAlCBpdCB3b3VsZCBiZSBpZ25vcmVkLlxuICAgIGNvbnN0IHsgY29udGVudCwgaW5zdHJ1Y3Rpb25zLCAuLi5tZXRhZGF0YUZpZWxkcyB9ID0gbWV0YWRhdGE7XG5cbiAgICAvLyBDcmVhdGUgaW5zdGFuY2VcbiAgICBjb25zdCBtZW1vcnkgPSBuZXcgTWVtb3J5KG1ldGFkYXRhRmllbGRzLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG5cbiAgICAvLyBTZXQgaW5zdHJ1Y3Rpb25zIGlmIHByb3ZpZGVkICh2Mi4wIGR1YWwtZmllbGQ6IG1lbW9yeS1sZXZlbCBkaXJlY3RpdmVzKVxuICAgIGlmIChpbnN0cnVjdGlvbnMpIHtcbiAgICAgIG1lbW9yeS5pbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gQWRkIGluaXRpYWwgZW50cnkgaWYgY29udGVudCBwcm92aWRlZCAobW92ZWQgZnJvbSBjcmVhdGVFbGVtZW50IGhhbmRsZXIpXG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIGF3YWl0IG1lbW9yeS5hZGRFbnRyeShjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBTYXZlIChtb3ZlZCBmcm9tIGNyZWF0ZUVsZW1lbnQgaGFuZGxlcilcbiAgICBhd2FpdCB0aGlzLnNhdmUobWVtb3J5KTtcbiAgICAvLyBOb3RlOiBObyByZWxvYWQoKSBoZXJlIOKAlCBzYXZlKCkgY2FjaGVzIHRoZSBlbGVtZW50IGNvcnJlY3RseS5cbiAgICAvLyBTZWUgSXNzdWUgIzQ5MSBmb3Igd2h5IFBlcnNvbmFNYW5hZ2VyJ3MgcmVsb2FkLWFmdGVyLWNyZWF0ZSB3YXMgcmVtb3ZlZC5cblxuICAgIGxvZ2dlci5pbmZvKGBNZW1vcnkgY3JlYXRlZDogJHttZW1vcnkubWV0YWRhdGEubmFtZX1gKTtcbiAgICByZXR1cm4gbWVtb3J5O1xuICB9XG4gIFxuICAvKipcbiAgICogUGFyc2UgWUFNTCBkYXRhIGZvciBpbXBvcnRcbiAgICogRXh0cmFjdGVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eSAoU29uYXJDbG91ZClcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcGFyc2VZYW1sRm9ySW1wb3J0KGRhdGE6IHN0cmluZyk6IHsgcGFyc2VkOiBhbnk7IG1hcmtkb3duQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkIH0ge1xuICAgIC8vIFVzZSBTZXJpYWxpemF0aW9uU2VydmljZSBmb3IgY29uc2lzdGVudCBwYXJzaW5nXG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKGRhdGEsIHtcbiAgICAgIG1heFlhbWxTaXplOiBNRU1PUllfQ09OU1RBTlRTLk1BWF9ZQU1MX1NJWkUsXG4gICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnBhcnNlWWFtbEZvckltcG9ydCcsXG4gICAgICBzY2hlbWE6ICdqc29uJyAgLy8gRklYICMxNDMwOiBQcmVzZXJ2ZSBib29sZWFucyAoYXV0b0xvYWQpIGFuZCBudW1iZXJzIChwcmlvcml0eSlcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXJzZWQ6IHJlc3VsdC5kYXRhLFxuICAgICAgbWFya2Rvd25Db250ZW50OiByZXN1bHQuY29udGVudFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG1lbW9yeSBmcm9tIHBhcnNlZCBkYXRhXG4gICAqIEV4dHJhY3RlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHkgKFNvbmFyQ2xvdWQpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNyZWF0ZU1lbW9yeUZyb21QYXJzZWQoXG4gICAgcGFyc2VkOiBhbnksXG4gICAgbWFya2Rvd25Db250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxNZW1vcnk+IHtcbiAgICAvLyBIYW5kbGUgZGlmZmVyZW50IHN0cnVjdHVyZXMgZnJvbSBZQU1MIHBhcnNpbmdcbiAgICAvLyBTdXBwb3J0IGJvdGggZm9ybWF0cyAoc2VlIGNvbW1pdCBmZWI1Y2UwIG9uIG1haW4pOlxuICAgIC8vIDEuIEZyb250bWF0dGVyLXN0eWxlIChzZWVkIGZpbGVzKTogbWV0YWRhdGEgZmllbGRzIGF0IHRvcCBsZXZlbFxuICAgIC8vIDIuIFNhdmVkIG1lbW9yeSBmaWxlczogbmVzdGVkIHVuZGVyICdtZXRhZGF0YScga2V5XG4gICAgLy8gVGhpcyBtYXRjaGVzIG1haW4ncyBwYXJzZU1lbW9yeUZpbGUgbG9naWM6IHlhbWxEYXRhLm1ldGFkYXRhIHx8IHlhbWxEYXRhXG4gICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZWQubWV0YWRhdGEgfHwgcGFyc2VkO1xuICAgIGNvbnN0IGVudHJpZXMgPSBwYXJzZWQuZW50cmllcyB8fCBwYXJzZWQuZGF0YT8uZW50cmllcztcblxuICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGZpZWxkc1xuICAgIGlmICghbWV0YWRhdGE/Lm5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IG11c3QgaGF2ZSBtZXRhZGF0YSB3aXRoIG5hbWUnKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbWVtb3J5IGluc3RhbmNlXG4gICAgY29uc3QgbWVtb3J5ID0gbmV3IE1lbW9yeShtZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgLy8gTG9hZCBlbnRyaWVzIGlmIHByZXNlbnRcbiAgICBpZiAoZW50cmllcykge1xuICAgICAgbWVtb3J5LmRlc2VyaWFsaXplKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgaWQ6IG1lbW9yeS5pZCxcbiAgICAgICAgdHlwZTogbWVtb3J5LnR5cGUsXG4gICAgICAgIHZlcnNpb246IG1lbW9yeS52ZXJzaW9uLFxuICAgICAgICBtZXRhZGF0YTogbWVtb3J5Lm1ldGFkYXRhLFxuICAgICAgICBleHRlbnNpb25zOiBtZW1vcnkuZXh0ZW5zaW9ucyxcbiAgICAgICAgZW50cmllczogZW50cmllc1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIC8vIElmIG1hcmtkb3duIGNvbnRlbnQgZXhpc3RzIGFmdGVyIHRoZSBmcm9udG1hdHRlciwgYWRkIGl0IGFzIGEgbWVtb3J5IGVudHJ5XG4gICAgLy8gVGhpcyBwcmVzZXJ2ZXMgY29udGVudCBmcm9tIHNlZWQgbWVtb3JpZXMgYW5kIGltcG9ydGVkIFlBTUwgZmlsZXMgd2l0aCBtYXJrZG93biBzZWN0aW9uc1xuICAgIGlmIChtYXJrZG93bkNvbnRlbnQ/LnRyaW0oKSkge1xuICAgICAgYXdhaXQgbWVtb3J5LmFkZEVudHJ5KFxuICAgICAgICBtYXJrZG93bkNvbnRlbnQudHJpbSgpLFxuICAgICAgICBbXSwgIC8vIHRhZ3NcbiAgICAgICAgeyBpbXBvcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSwgIC8vIG1ldGFkYXRhXG4gICAgICAgICdpbXBvcnQnICAvLyBzb3VyY2VcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbW9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYSBtZW1vcnkgZnJvbSBKU09OL1lBTUwgc3RyaW5nXG4gICAqIFNFQ1VSSVRZOiBGdWxsIHZhbGlkYXRpb24gb2YgaW1wb3J0ZWQgY29udGVudFxuICAgKiBAcGFyYW0gZGF0YSBKU09OIG9yIFlBTUwgc3RyaW5nIGNvbnRhaW5pbmcgbWVtb3J5IGRhdGFcbiAgICogQHBhcmFtIGZvcm1hdCBGb3JtYXQgb2YgdGhlIGlucHV0IGRhdGEgKCdqc29uJyBvciAneWFtbCcpXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBpbXBvcnRlZCBNZW1vcnkgaW5zdGFuY2VcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gSlNPTi9ZQU1MIHBhcnNpbmcgZmFpbHNcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gaW1wb3J0ZWQgZGF0YSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBZQU1MIGNvbnRlbnQgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgc2l6ZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBpbXBvcnRlZCBtZW1vcnkgZmFpbHMgdmFsaWRhdGlvblxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgaW1wb3J0RWxlbWVudChcbiAgICBkYXRhOiBzdHJpbmcsXG4gICAgZm9ybWF0OiAnanNvbicgfCAneWFtbCcgfCAnbWFya2Rvd24nID0gJ3lhbWwnXG4gICk6IFByb21pc2U8TWVtb3J5PiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBwYXJzZWQ6IGFueTtcbiAgICAgIGxldCBtYXJrZG93bkNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBISUdIIFNFVkVSSVRZIEZJWDogVXNlIHNlY3VyZSBZQU1MIHBhcnNpbmdcbiAgICAgICAgLy8gTWVtb3J5IGltcG9ydCBleHBlY3RzIHB1cmUgWUFNTCAobm90IGZyb250bWF0dGVyKSwgc28gd2UgcGFyc2UgaXQgc2VjdXJlbHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBhcnNlWWFtbEZvckltcG9ydChkYXRhKTtcbiAgICAgICAgICBwYXJzZWQgPSByZXN1bHQucGFyc2VkO1xuICAgICAgICAgIG1hcmtkb3duQ29udGVudCA9IHJlc3VsdC5tYXJrZG93bkNvbnRlbnQ7XG4gICAgICAgIH0gY2F0Y2ggKHlhbWxFcnJvcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBZQU1MOiAke3lhbWxFcnJvcn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGl0J3MgYW4gb2JqZWN0XG4gICAgICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZQU1MIG11c3QgY29udGFpbiBhbiBvYmplY3QnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVNZW1vcnlGcm9tUGFyc2VkKHBhcnNlZCwgbWFya2Rvd25Db250ZW50KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0lNUE9SVF9GQUlMRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5pbXBvcnRFbGVtZW50JyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBpbXBvcnQgbWVtb3J5OiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gaW1wb3J0IG1lbW9yeTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBFeHBvcnQgYSBtZW1vcnkgdG8gWUFNTCBzdHJpbmdcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGV4cG9ydEVsZW1lbnQoXG4gICAgZWxlbWVudDogTWVtb3J5LFxuICAgIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICd5YW1sJ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgcmV0dXJuIGVsZW1lbnQuc2VyaWFsaXplKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdHMgPSBlbGVtZW50LmdldFN0YXRzKCk7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIG1ldGFkYXRhOiBlbGVtZW50Lm1ldGFkYXRhLFxuICAgICAgZXh0ZW5zaW9uczogZWxlbWVudC5leHRlbnNpb25zLFxuICAgICAgc3RhdHM6IHtcbiAgICAgICAgdG90YWxFbnRyaWVzOiBzdGF0cy50b3RhbEVudHJpZXMsXG4gICAgICAgIHRvdGFsU2l6ZTogc3RhdHMudG90YWxTaXplLFxuICAgICAgICBvbGRlc3RFbnRyeTogc3RhdHMub2xkZXN0RW50cnk/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIG5ld2VzdEVudHJ5OiBzdGF0cy5uZXdlc3RFbnRyeT8udG9JU09TdHJpbmcoKVxuICAgICAgfSxcbiAgICAgIGVudHJpZXM6IEpTT04ucGFyc2UoZWxlbWVudC5zZXJpYWxpemUoKSkuZW50cmllc1xuICAgIH07XG5cbiAgICAvLyBTRUNVUklUWSBGSVg6IFVzZSBzZWN1cmUgWUFNTCBkdW1waW5nXG4gICAgLy8gRklYICMxNDMwOiBVc2UgSlNPTl9TQ0hFTUEgdG8gcHJlc2VydmUgYm9vbGVhbnMgKGF1dG9Mb2FkKSBhbmQgbnVtYmVycyAocHJpb3JpdHkpXG4gICAgLy8gSlNPTl9TQ0hFTUEgPSBGQUlMU0FGRSArIGJvb2wvaW50L2Zsb2F0L251bGwgKHNhZmVyIHRoYW4gREVGQVVMVCB3aGljaCBhZGRzIHRpbWVzdGFtcHMpXG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UuZHVtcFlhbWwoZGF0YSwge1xuICAgICAgc2NoZW1hOiAnanNvbicsXG4gICAgICBub1JlZnM6IHRydWUsXG4gICAgICBza2lwSW52YWxpZDogdHJ1ZSxcbiAgICAgIHNvcnRLZXlzOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgcGFyc2VNZXRhZGF0YShkYXRhOiBhbnkpOiBQcm9taXNlPE1lbW9yeU1ldGFkYXRhPiB7XG4gICAgY29uc3QgeyBtZXRhZGF0YSB9ID0gdGhpcy5wYXJzZU1lbW9yeUZpbGUoeyBkYXRhLCBjb250ZW50OiAnJyB9KTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlRWxlbWVudChtZXRhZGF0YTogTWVtb3J5TWV0YWRhdGEsIF9jb250ZW50OiBzdHJpbmcpOiBNZW1vcnkge1xuICAgIGNvbnN0IG1lbW9yeSA9IG5ldyBNZW1vcnkobWV0YWRhdGEsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICAvLyBFeHRyYWN0IGluc3RydWN0aW9ucyBmcm9tIG1ldGFkYXRhIGlmIHByZXNlbnQgKHYyIGR1YWwtZmllbGQpXG4gICAgaWYgKG1ldGFkYXRhLmluc3RydWN0aW9ucykge1xuICAgICAgbWVtb3J5Lmluc3RydWN0aW9ucyA9IG1ldGFkYXRhLmluc3RydWN0aW9ucztcbiAgICAgIGRlbGV0ZSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBtZW1vcnk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgc2VyaWFsaXplRWxlbWVudChlbGVtZW50OiBNZW1vcnkpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHN0YXRzID0gZWxlbWVudC5nZXRTdGF0cygpO1xuICAgIC8vIElzc3VlICM3NTU6IFNlcmlhbGl6ZSB0eXBlIGFzIHNpbmd1bGFyIGFuZCBwZXJzaXN0IHVuaXF1ZV9pZFxuICAgIGNvbnN0IG1ldGFkYXRhID0geyAuLi5lbGVtZW50Lm1ldGFkYXRhIH07XG4gICAgbWV0YWRhdGEudHlwZSA9IHRvU2luZ3VsYXJMYWJlbChFbGVtZW50VHlwZS5NRU1PUlkpIGFzIGFueTtcbiAgICAobWV0YWRhdGEgYXMgYW55KS5mb3JtYXRfdmVyc2lvbiA9ICd2Mic7ICAvLyBGaXggIzkxMi8jOTE4OiBFeHBsaWNpdCBmb3JtYXQgbWFya2VyXG4gICAgKG1ldGFkYXRhIGFzIGFueSkudW5pcXVlX2lkID0gZWxlbWVudC5pZDtcbiAgICBjb25zdCBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgLi4uKGVsZW1lbnQuaW5zdHJ1Y3Rpb25zID8geyBpbnN0cnVjdGlvbnM6IGVsZW1lbnQuaW5zdHJ1Y3Rpb25zIH0gOiB7fSksXG4gICAgICBleHRlbnNpb25zOiBlbGVtZW50LmV4dGVuc2lvbnMsXG4gICAgICBzdGF0czoge1xuICAgICAgICB0b3RhbEVudHJpZXM6IHN0YXRzLnRvdGFsRW50cmllcyxcbiAgICAgICAgdG90YWxTaXplOiBzdGF0cy50b3RhbFNpemUsXG4gICAgICAgIG9sZGVzdEVudHJ5OiBzdGF0cy5vbGRlc3RFbnRyeT8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgbmV3ZXN0RW50cnk6IHN0YXRzLm5ld2VzdEVudHJ5Py50b0lTT1N0cmluZygpLFxuICAgICAgICB0b3BUYWdzOiBBcnJheS5mcm9tKHN0YXRzLnRhZ0ZyZXF1ZW5jeS5lbnRyaWVzKCkpXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGJbMV0gLSBhWzFdKVxuICAgICAgICAgIC5zbGljZSgwLCAxMClcbiAgICAgICAgICAubWFwKChbdGFnLCBjb3VudF0pID0+ICh7IHRhZywgY291bnQgfSkpXG4gICAgICB9LFxuICAgICAgZW50cmllczogSlNPTi5wYXJzZShlbGVtZW50LnNlcmlhbGl6ZSgpKS5lbnRyaWVzXG4gICAgfTtcblxuICAgIC8vIEZJWCAjMTQzMDogVXNlIEpTT05fU0NIRU1BIHRvIHByZXNlcnZlIGJvb2xlYW5zIChhdXRvTG9hZCkgYW5kIG51bWJlcnMgKHByaW9yaXR5KVxuICAgIC8vIEpTT05fU0NIRU1BID0gRkFJTFNBRkUgKyBib29sL2ludC9mbG9hdC9udWxsIChzYWZlciB0aGFuIERFRkFVTFQgd2hpY2ggYWRkcyB0aW1lc3RhbXBzKVxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLmR1bXBZYW1sKHBheWxvYWQsIHtcbiAgICAgIHNjaGVtYTogJ2pzb24nLFxuICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgc2tpcEludmFsaWQ6IHRydWUsXG4gICAgICBzb3J0S2V5czogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogVmFsaWRhdGUgYSBtZW1vcnkgZWxlbWVudFxuICAgKi9cbiAgb3ZlcnJpZGUgdmFsaWRhdGUoZWxlbWVudDogTWVtb3J5KTogRWxlbWVudFZhbGlkYXRpb25SZXN1bHQge1xuICAgIHJldHVybiBlbGVtZW50LnZhbGlkYXRlKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgcmVzb2x2ZSBhIGZpbGUgcGF0aFxuICAgKiBTRUNVUklUWTogUHJldmVudHMgZGlyZWN0b3J5IHRyYXZlcnNhbCBhdHRhY2tzXG4gICAqL1xuICBvdmVycmlkZSB2YWxpZGF0ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBQZXJmb3JtIHN5bmNocm9ub3VzIHZhbGlkYXRpb24gY2hlY2tzXG4gICAgICBjb25zdCBub3JtYWxpemVkID0gcGF0aC5ub3JtYWxpemUoZmlsZVBhdGgpO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdHNcbiAgICAgIGlmIChub3JtYWxpemVkLmluY2x1ZGVzKCcuLicpIHx8IHBhdGguaXNBYnNvbHV0ZShub3JtYWxpemVkKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVuc3VyZSBwcm9wZXIgZXh0ZW5zaW9uXG4gICAgICBpZiAoIW5vcm1hbGl6ZWQuZW5kc1dpdGgoJy5tZCcpICYmICFub3JtYWxpemVkLmVuZHNXaXRoKCcueWFtbCcpICYmICFub3JtYWxpemVkLmVuZHNXaXRoKCcueW1sJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVsZW1lbnQgdHlwZSB0aGlzIG1hbmFnZXIgaGFuZGxlc1xuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0RWxlbWVudFR5cGUoKTogRWxlbWVudFR5cGUge1xuICAgIHJldHVybiBFbGVtZW50VHlwZS5NRU1PUlk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgbWVtb3J5IGZpbGVzXG4gICAqL1xuICBvdmVycmlkZSBnZXRGaWxlRXh0ZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcueWFtbCc7XG4gIH1cbiAgXG4gIC8vIFByaXZhdGUgaGVscGVyIG1ldGhvZHNcbiAgXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBhbmQgcmVzb2x2ZSBhIGZpbGUgcGF0aCB0byBwcmV2ZW50IHNlY3VyaXR5IGlzc3Vlc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB2YWxpZGF0ZSBhbmQgcmVzb2x2ZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdmFsaWRhdGVkIGZ1bGwgcGF0aFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwYXRoIGNvbnRhaW5zIHRyYXZlcnNhbCBhdHRlbXB0cyAoLi4vKVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwYXRoIGlzIGFic29sdXRlIG9yIGludmFsaWRcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gZmlsZSBleHRlbnNpb24gaXMgbm90IGFsbG93ZWQgKC5tZCwgLnlhbWwsIC55bWwpXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHJlc29sdmVkIHBhdGggd291bGQgYmUgb3V0c2lkZSBtZW1vcmllcyBkaXJlY3RvcnlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IENvbXByZWhlbnNpdmUgcGF0aCB2YWxpZGF0aW9uXG4gICAgLy8gRW5oYW5jZWQgdmFsaWRhdGlvbiBpbnNwaXJlZCBieSBKZWV0IFNpbmdoIChAamVldHNpbmdoMDA4KSAtIFBSICMxMDM1XG5cbiAgICAvLyBGaXJzdCBub3JtYWxpemUgdGhlIHBhdGggdG8gcmVzb2x2ZSBhbnkgLi8gb3IgLi4vIHNlcXVlbmNlc1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG5cbiAgICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdHMgLSBib3RoIGluIG9yaWdpbmFsIGFuZCBub3JtYWxpemVkXG4gICAgLy8gQ2hlY2sgYm90aCB0aGUgbm9ybWFsaXplZCBwYXRoIGFuZCB0aGUgb3JpZ2luYWwgZm9yIGFueSB0cmF2ZXJzYWwgcGF0dGVybnNcbiAgICBpZiAobm9ybWFsaXplZC5pbmNsdWRlcygnLi4nKSB8fFxuICAgICAgICBmaWxlUGF0aC5pbmNsdWRlcygnLi4nKSB8fFxuICAgICAgICBwYXRoLmlzQWJzb2x1dGUobm9ybWFsaXplZCkgfHxcbiAgICAgICAgcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSkge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUEFUSF9UUkFWRVJTQUxfQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIudmFsaWRhdGVBbmRSZXNvbHZlUGF0aCcsXG4gICAgICAgIGRldGFpbHM6IGBCbG9ja2VkIHBhdGggdHJhdmVyc2FsIGF0dGVtcHQ6ICR7ZmlsZVBhdGh9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZmlsZSBwYXRoOiBQYXRoIHRyYXZlcnNhbCBkZXRlY3RlZCcpO1xuICAgIH1cbiAgICBcbiAgICAvLyBFbnN1cmUgcHJvcGVyIGV4dGVuc2lvbiAtIG1lbW9yaWVzIHNob3VsZCBvbmx5IGJlIC55YW1sIG9yIC55bWxcbiAgICBpZiAoIW5vcm1hbGl6ZWQuZW5kc1dpdGgoJy55YW1sJykgJiYgIW5vcm1hbGl6ZWQuZW5kc1dpdGgoJy55bWwnKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgZmlsZXMgbXVzdCBoYXZlIC55YW1sIG9yIC55bWwgZXh0ZW5zaW9uJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENvbnN0cnVjdCBmdWxsIHBhdGhcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCBub3JtYWxpemVkKTtcbiAgICBcbiAgICAvLyBWZXJpZnkgaXQncyB3aXRoaW4gbWVtb3JpZXMgZGlyZWN0b3J5XG4gICAgY29uc3QgcmVsYXRpdmUgPSBwYXRoLnJlbGF0aXZlKHRoaXMubWVtb3JpZXNEaXIsIGZ1bGxQYXRoKTtcbiAgICBpZiAocmVsYXRpdmUuc3RhcnRzV2l0aCgnLi4nKSB8fCBwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbGUgcGF0aCBtdXN0IGJlIHdpdGhpbiBtZW1vcmllcyBkaXJlY3RvcnknKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGZ1bGxQYXRoO1xuICB9XG4gIFxuICBwcml2YXRlIHBhcnNlTWVtb3J5RmlsZShwYXJzZWQ6IFBhcnNlZE1lbW9yeURhdGEpOiB7IG1ldGFkYXRhOiBNZW1vcnlNZXRhZGF0YTsgY29udGVudDogc3RyaW5nIH0ge1xuICAgIC8vIEZJWDogU2VjdXJlWWFtbFBhcnNlciByZXR1cm5zIGRhdGEgaW4gJ2RhdGEnIHByb3BlcnR5LCBub3QgJ21ldGFkYXRhJ1xuICAgIC8vIEZvciBtYXJrZG93biBmaWxlcyB3aXRoIFlBTUwgZnJvbnRtYXR0ZXIsIHRoZSBzdHJ1Y3R1cmUgaXM6XG4gICAgLy8gcGFyc2VkLmRhdGEgPSBZQU1MIGZyb250bWF0dGVyIHZhbHVlc1xuICAgIC8vIHBhcnNlZC5jb250ZW50ID0gbWFya2Rvd24gY29udGVudCBhZnRlciBmcm9udG1hdHRlclxuXG4gICAgLy8gRm9yIHB1cmUgWUFNTCBtZW1vcnkgZmlsZXMsIHdlIG5lZWQgdG8gY2hlY2sgaWYgbWV0YWRhdGEgaXMgZGlyZWN0bHkgaW4gZGF0YVxuICAgIGNvbnN0IHlhbWxEYXRhID0gcGFyc2VkLmRhdGEgfHwge307XG5cbiAgICAvLyBNZW1vcnkgZmlsZXMgc2F2ZWQgYnkgdGhlIHN5c3RlbSBoYXZlIG1ldGFkYXRhIGFzIGEgdG9wLWxldmVsIGtleVxuICAgIGNvbnN0IG1ldGFkYXRhU291cmNlID0geWFtbERhdGEubWV0YWRhdGEgfHwgeWFtbERhdGE7XG5cbiAgICAvLyBFeHRyYWN0IG1ldGFkYXRhIHdpdGggdmFsaWRhdGlvblxuICAgIC8vIFNFQ1VSSVRZIEZJWDogVmFsaWRhdGUgQkVGT1JFIHNhbml0aXphdGlvbiB0byBwcmV2ZW50IGJ5cGFzcyBhdHRhY2tzXG4gICAgY29uc3QgbmFtZUlucHV0ID0gbWV0YWRhdGFTb3VyY2UubmFtZSB8fCAnVW5uYW1lZCBNZW1vcnknO1xuICAgIGNvbnN0IG5hbWVSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChuYW1lSW5wdXQsIHtcbiAgICAgIG1heExlbmd0aDogU0VDVVJJVFlfTElNSVRTLk1BWF9OQU1FX0xFTkdUSCxcbiAgICAgIGFsbG93U3BhY2VzOiB0cnVlXG4gICAgfSk7XG4gICAgaWYgKCFuYW1lUmVzdWx0LmlzVmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtZW1vcnkgbmFtZTogJHtuYW1lUmVzdWx0LmVycm9ycz8uam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICAvLyBGSVg6IE11c3Qgc3BlY2lmeSBmaWVsZFR5cGU6ICdkZXNjcmlwdGlvbicgdG8gYWxsb3cgcHVuY3R1YXRpb24gbGlrZSBjb2xvbnMsIHNlbWljb2xvbnMsIGV0Yy5cbiAgICBsZXQgc2FuaXRpemVkRGVzY3JpcHRpb24gPSAnJztcbiAgICBpZiAobWV0YWRhdGFTb3VyY2UuZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IGRlc2NSZXN1bHQgPSB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlQW5kU2FuaXRpemVJbnB1dChtZXRhZGF0YVNvdXJjZS5kZXNjcmlwdGlvbiwge1xuICAgICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfREVTQ1JJUFRJT05fTEVOR1RILFxuICAgICAgICBhbGxvd1NwYWNlczogdHJ1ZSxcbiAgICAgICAgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nXG4gICAgICB9KTtcbiAgICAgIGlmICghZGVzY1Jlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtZW1vcnkgZGVzY3JpcHRpb246ICR7ZGVzY1Jlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBzYW5pdGl6ZWREZXNjcmlwdGlvbiA9IGRlc2NSZXN1bHQuc2FuaXRpemVkVmFsdWUhO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGFkYXRhOiBNZW1vcnlNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IG5hbWVSZXN1bHQuc2FuaXRpemVkVmFsdWUhLFxuICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogbWV0YWRhdGFTb3VyY2UudmVyc2lvbiB8fCAnMS4wLjAnLFxuICAgICAgYXV0aG9yOiBtZXRhZGF0YVNvdXJjZS5hdXRob3IsXG4gICAgICBjcmVhdGVkOiBtZXRhZGF0YVNvdXJjZS5jcmVhdGVkLFxuICAgICAgbW9kaWZpZWQ6IG1ldGFkYXRhU291cmNlLm1vZGlmaWVkIHx8IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRhZ3M6IEFycmF5LmlzQXJyYXkobWV0YWRhdGFTb3VyY2UudGFncykgP1xuICAgICAgICBtZXRhZGF0YVNvdXJjZS50YWdzLm1hcCgodGFnOiBzdHJpbmcpID0+IHNhbml0aXplSW5wdXQodGFnLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9UQUdfTEVOR1RIKSkgOlxuICAgICAgICBbXSxcbiAgICAgIC8vIEZJWCAjMTEyNDogRXh0cmFjdCB0cmlnZ2VycyBmb3IgRW5oYW5jZWQgSW5kZXggc3VwcG9ydFxuICAgICAgLy8gRW5oYW5jZWQgdHJpZ2dlciB2YWxpZGF0aW9uIGxvZ2dpbmcgZm9yIElzc3VlICMxMTM5XG4gICAgICB0cmlnZ2VyczogW10sICAvLyBXaWxsIGJlIHNldCBiZWxvdyB3aXRoIGVuaGFuY2VkIGxvZ2dpbmdcbiAgICAgIHN0b3JhZ2VCYWNrZW5kOiBtZXRhZGF0YVNvdXJjZS5zdG9yYWdlX2JhY2tlbmQgfHwgbWV0YWRhdGFTb3VyY2Uuc3RvcmFnZUJhY2tlbmQgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1NUT1JBR0VfQkFDS0VORCxcbiAgICAgIHJldGVudGlvbkRheXM6IG1ldGFkYXRhU291cmNlLnJldGVudGlvbl9wb2xpY3k/LmRlZmF1bHQgP1xuICAgICAgICB0aGlzLnBhcnNlUmV0ZW50aW9uRGF5cyhtZXRhZGF0YVNvdXJjZS5yZXRlbnRpb25fcG9saWN5LmRlZmF1bHQpIDpcbiAgICAgICAgKG1ldGFkYXRhU291cmNlLnJldGVudGlvbkRheXMgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1JFVEVOVElPTl9EQVlTKSxcbiAgICAgIHByaXZhY3lMZXZlbDogbWV0YWRhdGFTb3VyY2UucHJpdmFjeV9sZXZlbCB8fCBtZXRhZGF0YVNvdXJjZS5wcml2YWN5TGV2ZWwgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1BSSVZBQ1lfTEVWRUwsXG4gICAgICBzZWFyY2hhYmxlOiBtZXRhZGF0YVNvdXJjZS5zZWFyY2hhYmxlICE9PSBmYWxzZSxcbiAgICAgIG1heEVudHJpZXM6IG1ldGFkYXRhU291cmNlLm1heEVudHJpZXMgfHwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxULFxuICAgICAgLy8gRklYICMxNDMwOiBFeHRyYWN0IGF1dG8tbG9hZCBjb25maWd1cmF0aW9uXG4gICAgICBhdXRvTG9hZDogbWV0YWRhdGFTb3VyY2UuYXV0b0xvYWQsXG4gICAgICBwcmlvcml0eTogbWV0YWRhdGFTb3VyY2UucHJpb3JpdHksXG4gICAgICAvLyBNZW1vcnkgdHlwZSBjbGFzc2lmaWNhdGlvblxuICAgICAgbWVtb3J5VHlwZTogbWV0YWRhdGFTb3VyY2UubWVtb3J5VHlwZSxcbiAgICAgIC8vIElzc3VlICM1MjQg4oCUIEdhdGVrZWVwZXIgcG9saWN5IChhbGwgZWxlbWVudCB0eXBlcylcbiAgICAgIGdhdGVrZWVwZXI6IHNhbml0aXplR2F0ZWtlZXBlclBvbGljeShtZXRhZGF0YVNvdXJjZS5nYXRla2VlcGVyLCBuYW1lUmVzdWx0LnNhbml0aXplZFZhbHVlIHx8ICd1bmtub3duJywgJ21lbW9yeScpLFxuICAgIH07XG5cbiAgICAvLyBFbmhhbmNlZCB0cmlnZ2VyIHZhbGlkYXRpb24gYW5kIGxvZ2dpbmdcbiAgICAvLyBOT1RFOiBNZW1vcnkgdHJpZ2dlcnMgbWF5IGV2b2x2ZSB0byBzdXBwb3J0IGRhdGUgcGF0dGVybnMgKDIwMjQtUTMpLFxuICAgIC8vIHNlbWFudGljIG1hcmtlcnMgKHJlY2FsbC1jb250ZXh0KSwgb3IgbmF0dXJhbCBsYW5ndWFnZSBwaHJhc2VzLlxuICAgIC8vIEtlcHQgc2VwYXJhdGUgZnJvbSBTa2lsbHMgKHRlY2huaWNhbCkgYW5kIFBlcnNvbmFzIChjaGFyYWN0ZXIgbmFtZXMpLlxuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhU291cmNlLnRyaWdnZXJzKSkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLnZhbGlkYXRlVHJpZ2dlcnMoXG4gICAgICAgIG1ldGFkYXRhU291cmNlLnRyaWdnZXJzLFxuICAgICAgICBFbGVtZW50VHlwZS5NRU1PUlksXG4gICAgICAgIG1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nXG4gICAgICApO1xuICAgICAgbWV0YWRhdGEudHJpZ2dlcnMgPSB2YWxpZGF0aW9uUmVzdWx0LnZhbGlkVHJpZ2dlcnM7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBjb250ZW50IChpZiBhbnkpXG4gICAgY29uc3QgY29udGVudCA9IHBhcnNlZC5jb250ZW50IHx8ICcnO1xuXG4gICAgcmV0dXJuIHsgbWV0YWRhdGEsIGNvbnRlbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gcGFyc2UgcmV0ZW50aW9uIGRheXMgZnJvbSB2YXJpb3VzIGZvcm1hdHNcbiAgICovXG4gIHByaXZhdGUgcGFyc2VSZXRlbnRpb25EYXlzKHJldGVudGlvbjogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodHlwZW9mIHJldGVudGlvbiA9PT0gJ251bWJlcicpIHJldHVybiByZXRlbnRpb247XG4gICAgaWYgKHJldGVudGlvbiA9PT0gJ3Blcm1hbmVudCcgfHwgcmV0ZW50aW9uID09PSAncGVycGV0dWFsJykgcmV0dXJuIDk5OTk5OTtcbiAgICBjb25zdCByZWdleCA9IC8oXFxkKylcXHMqZGF5cz8vaTtcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4LmV4ZWMocmV0ZW50aW9uKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0pIDogTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1JFVEVOVElPTl9EQVlTO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGltYXRlIHRva2VucyBpbiBtZW1vcnkgY29udGVudCAocm91Z2ggYXBwcm94aW1hdGlvbilcbiAgICogVXNlcyAxIHRva2VuIOKJiCAwLjc1IHdvcmRzIGZvciBFbmdsaXNoIHRleHRcbiAgICogQHBhcmFtIGNvbnRlbnQgTWVtb3J5IGNvbnRlbnQgdG8gZXN0aW1hdGVcbiAgICogQHJldHVybnMgRXN0aW1hdGVkIHRva2VuIGNvdW50XG4gICAqL1xuICBwdWJsaWMgZXN0aW1hdGVUb2tlbnMoY29udGVudDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIWNvbnRlbnQgfHwgdHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSByZXR1cm4gMDtcblxuICAgIC8vIFNpbXBsZSB3b3JkIGNvdW50IGFwcHJveGltYXRpb25cbiAgICBjb25zdCB3b3JkcyA9IGNvbnRlbnQudHJpbSgpLnNwbGl0KC9cXHMrLykubGVuZ3RoO1xuXG4gICAgLy8gMSB0b2tlbiDiiYggMC43NSB3b3JkcyAoY29uc2VydmF0aXZlIGVzdGltYXRlKVxuICAgIHJldHVybiBNYXRoLmNlaWwod29yZHMgLyAwLjc1KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGFuZCBhY3RpdmF0ZSBhdXRvLWxvYWQgbWVtb3JpZXMgZHVyaW5nIHNlcnZlciBpbml0aWFsaXphdGlvblxuICAgKiBJc3N1ZSAjMTQzMDogQXV0by1sb2FkIGJhc2VsaW5lIG1lbW9yaWVzIGZlYXR1cmVcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IENvbnRhaW5lci5wcmVwYXJlUG9ydGZvbGlvKCkgZHVyaW5nIHNlcnZlciBzdGFydHVwXG4gICAqIHRvIGF1dG9tYXRpY2FsbHkgbG9hZCBtZW1vcmllcyBtYXJrZWQgd2l0aCBhdXRvTG9hZDogdHJ1ZVxuICAgKlxuICAgKiBBcmNoaXRlY3R1cmUgTm90ZTpcbiAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBESS1hbGlnbmVkIHBhdHRlcm4gd2hlcmUgbWFuYWdlcnMgb3duIGFsbCBvcGVyYXRpb25zXG4gICAqIGZvciB0aGVpciBlbGVtZW50IHR5cGUuIEF1dG8tbG9hZCBsb2dpYyBsaXZlcyBpbiBNZW1vcnlNYW5hZ2VyIChub3QgU2VydmVyU3RhcnR1cClcbiAgICogYmVjYXVzZSBNZW1vcnlNYW5hZ2VyIGFscmVhZHkgb3ducyBhbGwgbWVtb3J5IG9wZXJhdGlvbnMgKENSVUQsIGFjdGl2YXRpb24sIGV0Yy4pXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGF1dG8tbG9hZCBzdGF0aXN0aWNzXG4gICAqL1xuICBhc3luYyBsb2FkQW5kQWN0aXZhdGVBdXRvTG9hZE1lbW9yaWVzKCk6IFByb21pc2U8e1xuICAgIGxvYWRlZDogbnVtYmVyO1xuICAgIHNraXBwZWQ6IG51bWJlcjtcbiAgICB0b3RhbFRva2VuczogbnVtYmVyO1xuICAgIGVycm9yczogc3RyaW5nW107XG4gIH0+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGxldCBsb2FkZWQgPSAwO1xuICAgIGxldCBza2lwcGVkID0gMDtcbiAgICBsZXQgdG90YWxUb2tlbnMgPSAwO1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBmb3IgZW1lcmdlbmN5IGRpc2FibGVcbiAgICAgIGNvbnN0IGVtZXJnZW5jeURpc2FibGVkID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0RJU0FCTEVfQVVUT0xPQUQgPT09ICd0cnVlJztcbiAgICAgIGlmIChlbWVyZ2VuY3lEaXNhYmxlZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnW01lbW9yeU1hbmFnZXJdIEF1dG8tbG9hZCBkaXNhYmxlZCB2aWEgRE9MTEhPVVNFX0RJU0FCTEVfQVVUT0xPQUQnKTtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdNRU1PUllfTE9BREVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5sb2FkQW5kQWN0aXZhdGVBdXRvTG9hZE1lbW9yaWVzJyxcbiAgICAgICAgICBkZXRhaWxzOiAnQXV0by1sb2FkIG1lbW9yaWVzIGRpc2FibGVkIHZpYSBlbWVyZ2VuY3kgZW52aXJvbm1lbnQgdmFyaWFibGUnLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IHJlYXNvbjogJ0RPTExIT1VTRV9ESVNBQkxFX0FVVE9MT0FEPXRydWUnIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGxvYWRlZDogMCwgc2tpcHBlZDogMCwgdG90YWxUb2tlbnM6IDAsIGVycm9yczogW10gfTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5zdGFsbCBzZWVkIG1lbW9yaWVzIGZpcnN0XG4gICAgICBhd2FpdCB0aGlzLmluc3RhbGxTZWVkTWVtb3JpZXMoKTtcblxuICAgICAgLy8gR2V0IGF1dG8tbG9hZCBtZW1vcmllc1xuICAgICAgY29uc3QgYXV0b0xvYWRNZW1vcmllcyA9IGF3YWl0IHRoaXMuZ2V0QXV0b0xvYWRNZW1vcmllcygpO1xuXG4gICAgICBpZiAoYXV0b0xvYWRNZW1vcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdbTWVtb3J5TWFuYWdlcl0gTm8gYXV0by1sb2FkIG1lbW9yaWVzIGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgcmV0dXJuIHsgbG9hZGVkOiAwLCBza2lwcGVkOiAwLCB0b3RhbFRva2VuczogMCwgZXJyb3JzOiBbXSB9O1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIEZvdW5kICR7YXV0b0xvYWRNZW1vcmllcy5sZW5ndGh9IGF1dG8tbG9hZCBtZW1vcmllc2ApO1xuXG4gICAgICAvLyBQcm9jZXNzIGVhY2ggYXV0by1sb2FkIG1lbW9yeVxuICAgICAgZm9yIChjb25zdCBtZW1vcnkgb2YgYXV0b0xvYWRNZW1vcmllcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1lbW9yeU5hbWUgPSBtZW1vcnkubWV0YWRhdGEubmFtZSB8fCAndW5rbm93bic7XG5cbiAgICAgICAgICAvLyBWYWxpZGF0ZSBtZW1vcnkgYmVmb3JlIGxvYWRpbmdcbiAgICAgICAgICBjb25zdCB2YWxpZGF0aW9uID0gbWVtb3J5LnZhbGlkYXRlKCk7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvck1zZyA9IGBWYWxpZGF0aW9uIGZhaWxlZCBmb3IgJyR7bWVtb3J5TmFtZX0nOiAke3ZhbGlkYXRpb24uZXJyb3JzPy5tYXAoZSA9PiBlLm1lc3NhZ2UpLmpvaW4oJywgJyl9YDtcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKGVycm9yTXNnKTtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBbTWVtb3J5TWFuYWdlcl0gJHtlcnJvck1zZ31gKTtcbiAgICAgICAgICAgIHNraXBwZWQrKztcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEVzdGltYXRlIHRva2Vuc1xuICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFRva2VucyA9IHRoaXMuZXN0aW1hdGVUb2tlbnMobWVtb3J5LmNvbnRlbnQgfHwgJycpO1xuXG4gICAgICAgICAgLy8gQWN0aXZhdGUgdGhlIG1lbW9yeVxuICAgICAgICAgIC8vIEZJWCBJc3N1ZSAjMzU6IEFkZCB0byBhY3RpdmVNZW1vcnlOYW1lcyBzZXQgc28gZ2V0QWN0aXZlTWVtb3JpZXMoKSByZXR1cm5zIGl0XG4gICAgICAgICAgdGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5hZGQobWVtb3J5TmFtZSk7XG4gICAgICAgICAgYXdhaXQgbWVtb3J5LmFjdGl2YXRlKCk7XG4gICAgICAgICAgbG9hZGVkKys7XG4gICAgICAgICAgdG90YWxUb2tlbnMgKz0gZXN0aW1hdGVkVG9rZW5zO1xuXG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBBdXRvLWxvYWRlZDogJHttZW1vcnlOYW1lfSAofiR7ZXN0aW1hdGVkVG9rZW5zfSB0b2tlbnMpYCk7XG5cbiAgICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnRcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnTUVNT1JZX0xPQURFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxvYWRBbmRBY3RpdmF0ZUF1dG9Mb2FkTWVtb3JpZXMnLFxuICAgICAgICAgICAgZGV0YWlsczogYEF1dG8tbG9hZGVkIG1lbW9yeTogJHttZW1vcnlOYW1lfWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgICBtZW1vcnlOYW1lLFxuICAgICAgICAgICAgICBlc3RpbWF0ZWRUb2tlbnMsXG4gICAgICAgICAgICAgIHByaW9yaXR5OiAobWVtb3J5Lm1ldGFkYXRhIGFzIGFueSkucHJpb3JpdHksXG4gICAgICAgICAgICAgIHRvdGFsVG9rZW5zU29GYXI6IHRvdGFsVG9rZW5zXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBtZW1vcnlOYW1lID0gbWVtb3J5Lm1ldGFkYXRhLm5hbWUgfHwgJ3Vua25vd24nO1xuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gYEZhaWxlZCB0byBsb2FkICcke21lbW9yeU5hbWV9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YDtcbiAgICAgICAgICBlcnJvcnMucHVzaChlcnJvck1zZyk7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFtNZW1vcnlNYW5hZ2VyXSAke2Vycm9yTXNnfWApO1xuICAgICAgICAgIHNraXBwZWQrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBlbGFwc2VkVGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYFtNZW1vcnlNYW5hZ2VyXSBBdXRvLWxvYWQgY29tcGxldGU6ICR7bG9hZGVkfSBtZW1vcmllcyBhY3RpdmF0ZWQgYCArXG4gICAgICAgIGAofiR7dG90YWxUb2tlbnN9IHRva2VucyksICR7c2tpcHBlZH0gc2tpcHBlZCwgJHtlcnJvcnMubGVuZ3RofSBlcnJvcnMsICR7ZWxhcHNlZFRpbWV9bXNgXG4gICAgICApO1xuXG4gICAgICAvLyBMb2cgY29tcGxldGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnTUVNT1JZX0xPQURFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5sb2FkQW5kQWN0aXZhdGVBdXRvTG9hZE1lbW9yaWVzJyxcbiAgICAgICAgZGV0YWlsczogJ0F1dG8tbG9hZCBtZW1vcmllcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBsb2FkZWRDb3VudDogbG9hZGVkLFxuICAgICAgICAgIHNraXBwZWRDb3VudDogc2tpcHBlZCxcbiAgICAgICAgICBlcnJvckNvdW50OiBlcnJvcnMubGVuZ3RoLFxuICAgICAgICAgIHRvdGFsVG9rZW5zLFxuICAgICAgICAgIGxvYWRUaW1lTXM6IGVsYXBzZWRUaW1lXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyBsb2FkZWQsIHNraXBwZWQsIHRvdGFsVG9rZW5zLCBlcnJvcnMgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBEb24ndCBmYWlsIHN0YXJ0dXAgaWYgYXV0by1sb2FkIGZhaWxzLCBidXQgcHJvdmlkZSBkZXRhaWxlZCBkaWFnbm9zdGljc1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgY29uc3QgZXJyb3JUeXBlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgOiAnVW5rbm93bic7XG5cbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgW01lbW9yeU1hbmFnZXJdIEZhaWxlZCB0byBsb2FkIGF1dG8tbG9hZCBtZW1vcmllcyAoJHtlcnJvclR5cGV9KTogJHtlcnJvck1lc3NhZ2V9YFxuICAgICAgKTtcblxuICAgICAgLy8gTG9nIGZhaWx1cmVcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ01FTU9SWV9MT0FEX0ZBSUxFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5sb2FkQW5kQWN0aXZhdGVBdXRvTG9hZE1lbW9yaWVzJyxcbiAgICAgICAgZGV0YWlsczogYEF1dG8tbG9hZCBtZW1vcmllcyBmYWlsZWQ6ICR7ZXJyb3JUeXBlfSAtICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgZXJyb3JUeXBlLFxuICAgICAgICAgIGVycm9yTWVzc2FnZSxcbiAgICAgICAgICBsb2FkVGltZU1zOiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4geyBsb2FkZWQ6IDAsIHNraXBwZWQ6IDAsIHRvdGFsVG9rZW5zOiAwLCBlcnJvcnM6IFtlcnJvck1lc3NhZ2VdIH07XG4gICAgfVxuICB9XG59XG4iXX0=
1799
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5TWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFrQixNQUFNLGFBQWEsQ0FBQztBQUVyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ25FLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLG9CQUFvQixFQUNyQixNQUFNLHVDQUF1QyxDQUFDO0FBRS9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQVF4QyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtB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O2FBQ0YsQ0FBQyxDQUFDO1lBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVtb3J5TWFuYWdlciAtIEltcGxlbWVudGF0aW9uIG9mIElFbGVtZW50TWFuYWdlciBmb3IgTWVtb3J5IGVsZW1lbnRzXG4gKiBIYW5kbGVzIENSVUQgb3BlcmF0aW9ucyBhbmQgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgZm9yIG1lbW9yaWVzIGltcGxlbWVudGluZyBJRWxlbWVudFxuICogXG4gKiBGSVhFUyBJTVBMRU1FTlRFRDpcbiAqIDEuIENSSVRJQ0FMOiBGaXhlZCByYWNlIGNvbmRpdGlvbnMgaW4gZmlsZSBvcGVyYXRpb25zIGJ5IHVzaW5nIEZpbGVMb2NrTWFuYWdlciBmb3IgYXRvbWljIHJlYWRzL3dyaXRlc1xuICogMi4gSElHSDogRml4ZWQgdW52YWxpZGF0ZWQgWUFNTCBwYXJzaW5nIHZ1bG5lcmFiaWxpdHkgYnkgdXNpbmcgU2VjdXJlWWFtbFBhcnNlclxuICogMy4gTUVESVVNOiBBbGwgdXNlciBpbnB1dHMgYXJlIG5vdyB2YWxpZGF0ZWQgYW5kIHNhbml0aXplZFxuICogNC4gTUVESVVNOiBBdWRpdCBsb2dnaW5nIGFkZGVkIGZvciBzZWN1cml0eSBvcGVyYXRpb25zXG4gKiA1LiBNRURJVU06IFBhdGggdmFsaWRhdGlvbiBwcmV2ZW50cyBkaXJlY3RvcnkgdHJhdmVyc2FsIGF0dGFja3NcbiAqL1xuXG5pbXBvcnQgeyBNZW1vcnksIE1lbW9yeU1ldGFkYXRhIH0gZnJvbSAnLi9NZW1vcnkuanMnO1xuaW1wb3J0IHsgRWxlbWVudFZhbGlkYXRpb25SZXN1bHQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyB0b1Npbmd1bGFyTGFiZWwgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgQmFzZUVsZW1lbnRNYW5hZ2VyIH0gZnJvbSAnLi4vYmFzZS9CYXNlRWxlbWVudE1hbmFnZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0VmFsaWRhdGVkU2NhbkNvb2xkb3duLFxuICBnZXRWYWxpZGF0ZWRJbmRleERlYm91bmNlLFxuICBTVE9SQUdFX0xBWUVSX0NPTkZJR1xufSBmcm9tICcuLi8uLi9jb25maWcvcGVyZm9ybWFuY2UtY29uc3RhbnRzLmpzJztcbmltcG9ydCB0eXBlIHsgSVN0b3JhZ2VMYXllciB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvSVN0b3JhZ2VMYXllci5qcyc7XG5pbXBvcnQgeyBNZW1vcnlTdG9yYWdlTGF5ZXIgfSBmcm9tICcuLi8uLi9zdG9yYWdlL01lbW9yeVN0b3JhZ2VMYXllci5qcyc7XG5pbXBvcnQgeyBNZW1vcnlNZXRhZGF0YUV4dHJhY3RvciB9IGZyb20gJy4uLy4uL3N0b3JhZ2UvTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IuanMnO1xuaW1wb3J0IHsgTFJVQ2FjaGUgfSBmcm9tICcuLi8uLi9jYWNoZS9MUlVDYWNoZS5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUlucHV0IH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvSW5wdXRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU0VDVVJJVFlfTElNSVRTIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IE1FTU9SWV9DT05TVEFOVFMsIE1FTU9SWV9TRUNVUklUWV9FVkVOVFMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBNZW1vcnlUeXBlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZWdpc3RyeS5qcyc7XG5pbXBvcnQgeyBUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL1RyaWdnZXJWYWxpZGF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9TZXJpYWxpemF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UuanMnO1xuaW1wb3J0IHsgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcbmltcG9ydCB7IEZpbGVXYXRjaFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9GaWxlV2F0Y2hTZXJ2aWNlLmpzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuaW1wb3J0IHsgUG9ydGZvbGlvTWFuYWdlciB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IEVsZW1lbnRNZXNzYWdlcyB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRNZXNzYWdlcy5qcyc7XG5pbXBvcnQgeyBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL3BvbGljaWVzL0VsZW1lbnRQb2xpY2llcy5qcyc7XG5cbi8vIElzc3VlICM4MzogQ2VudHJhbGl6ZWQgYWN0aXZlIGVsZW1lbnQgbGltaXRzIChjb25maWd1cmFibGUgdmlhIGVudiB2YXJzKVxuaW1wb3J0IHsgZ2V0QWN0aXZlRWxlbWVudExpbWl0Q29uZmlnLCBnZXRNYXhBY3RpdmVMaW1pdCB9IGZyb20gJy4uLy4uL2NvbmZpZy9hY3RpdmUtZWxlbWVudC1saW1pdHMuanMnO1xuXG4vKipcbiAqIElzc3VlICMxMzogVXRpbGl0eSBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGZpbGVuYW1lIGlzIGEgYmFja3VwIGZpbGVcbiAqIEJhY2t1cCBmaWxlcyBzaG91bGQgbm90IGJlIGxvYWRlZCBieSBsaXN0KCkgLSB0aGV5IGFyZSBhcmNoaXZlZCBkYXRhLCBub3QgYWN0aXZlIG1lbW9yaWVzXG4gKlxuICogQmFja3VwIHBhdHRlcm5zIGluY2x1ZGU6XG4gKiAtIC5iYWNrdXAtIHRpbWVzdGFtcCBwYXR0ZXJuIChlLmcuLCBuYW1lLmJhY2t1cC0yMDI1LTExLTE0LTIyLTQwLTU3LTMwMy55YW1sKVxuICogLSBBbnkgZmlsZSB3aXRoICdiYWNrdXAnIGluIHRoZSBuYW1lIChjYXNlLWluc2Vuc2l0aXZlKVxuICogLSBGaWxlcyBpbiBiYWNrdXAvIG9yIGJhY2t1cHMvIGRpcmVjdG9yaWVzIChoYW5kbGVkIGF0IGRpcmVjdG9yeSBsZXZlbClcbiAqXG4gKiBAcGFyYW0gZmlsZW5hbWUgLSBUaGUgZmlsZW5hbWUgdG8gY2hlY2sgKHdpdGhvdXQgZGlyZWN0b3J5IHBhdGgpXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlIGlzIGEgYmFja3VwIGZpbGUgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWRcbiAqL1xuZnVuY3Rpb24gaXNCYWNrdXBGaWxlKGZpbGVuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZpbGVuYW1lLmluY2x1ZGVzKCcuYmFja3VwLScpIHx8IGZpbGVuYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2JhY2t1cCcpO1xufVxuXG4vKipcbiAqIElzc3VlICMzOTogQ2hlY2sgaWYgYSBtZW1vcnkgbmFtZSBjb250YWlucyBiYWNrdXAgcGF0dGVybnMgKGNvcnJ1cHRlZCBuYW1lKVxuICogVGhpcyBjYW4gaGFwcGVuIHdoZW4gYmFja3VwIGZpbGUgbWV0YWRhdGEgbGVha3MgaW50byB0aGUgY2Fub25pY2FsIGZpbGVcbiAqXG4gKiBQYXR0ZXJuOiBuYW1lLmJhY2t1cC1ZWVlZLU1NLURELUhILW1tLXNzLVNTUyBvciBuYW1lLmJhY2t1cC0uLi4tdk5cbiAqXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBtZW1vcnkgbmFtZSB0byBjaGVja1xuICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgbmFtZSBjb250YWlucyBiYWNrdXAgcGF0dGVybnMgaW5kaWNhdGluZyBjb3JydXB0aW9uXG4gKi9cbmZ1bmN0aW9uIGlzQ29ycnVwdGVkQmFja3VwTmFtZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gQ2hlY2sgZm9yIC5iYWNrdXAtIHRpbWVzdGFtcCBwYXR0ZXJuIGluIHRoZSBuYW1lXG4gIHJldHVybiAvXFwuYmFja3VwLVxcZHs0fS1cXGR7Mn0tXFxkezJ9Ly50ZXN0KG5hbWUpO1xufVxuXG4vKipcbiAqIElzc3VlICMzOTogRXh0cmFjdCB0aGUgb3JpZ2luYWwgbmFtZSBmcm9tIGEgY29ycnVwdGVkIGJhY2t1cCBuYW1lXG4gKlxuICogRXhhbXBsZXM6XG4gKiAtIFwiZG9sbGhvdXNlbWNwLWJhc2VsaW5lLWtub3dsZWRnZS5iYWNrdXAtMjAyNS0xMS0xNC0yMi00MC01Ny0zMDNcIlxuICogICAtPiBcImRvbGxob3VzZW1jcC1iYXNlbGluZS1rbm93bGVkZ2VcIlxuICogLSBcIm15LW1lbW9yeS5iYWNrdXAtMjAyNS0wMS0wMS0wMC0wMC0wMC0wMDAtdjJcIlxuICogICAtPiBcIm15LW1lbW9yeVwiXG4gKlxuICogQHBhcmFtIGNvcnJ1cHRlZE5hbWUgLSBUaGUgY29ycnVwdGVkIG5hbWUgY29udGFpbmluZyBiYWNrdXAgcGF0dGVyblxuICogQHJldHVybnMgVGhlIG9yaWdpbmFsIG5hbWUgd2l0aCBiYWNrdXAgc3VmZml4IHJlbW92ZWRcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdE9yaWdpbmFsTmFtZShjb3JydXB0ZWROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZW1vdmUgLmJhY2t1cC1ZWVlZLU1NLURELUhILW1tLXNzLVNTUyBhbmQgYW55IC12TiBzdWZmaXhcbiAgcmV0dXJuIGNvcnJ1cHRlZE5hbWUucmVwbGFjZSgvXFwuYmFja3VwLVxcZHs0fS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHszfSgtdlxcZCspPyQvLCAnJyk7XG59XG5cbi8vIEludGVybmFsIGludGVyZmFjZSBmb3IgcGFyc2VkIFlBTUwgc3RydWN0dXJlXG5pbnRlcmZhY2UgUGFyc2VkTWVtb3J5RGF0YSB7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE1lbW9yeU1hbmFnZXIgZXh0ZW5kcyBCYXNlRWxlbWVudE1hbmFnZXI8TWVtb3J5PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVtb3JpZXNEaXI6IHN0cmluZztcbiAgLy8gUGhhc2UgMjogQm91bmRlZCBjb250ZW50IGhhc2ggaW5kZXggcmVwbGFjZXMgdW5ib3VuZGVkIE1hcFxuICBwcml2YXRlIGNvbnRlbnRIYXNoSW5kZXggPSBuZXcgTFJVQ2FjaGU8c3RyaW5nPih7XG4gICAgbmFtZTogJ21lbW9yeTpjb250ZW50SGFzaCcsXG4gICAgbWF4U2l6ZTogNTAwMCxcbiAgICBtYXhNZW1vcnlNQjogNSxcbiAgICB0dGxNczogMCxcbiAgfSk7XG4gIHByaXZhdGUgY29udGVudEhhc2hCeVBhdGggPSBuZXcgTFJVQ2FjaGU8c3RyaW5nPih7XG4gICAgbmFtZTogJ21lbW9yeTpjb250ZW50SGFzaFJldmVyc2UnLFxuICAgIG1heFNpemU6IDUwMDAsXG4gICAgbWF4TWVtb3J5TUI6IDUsXG4gICAgdHRsTXM6IDAsXG4gIH0pO1xuICBwcml2YXRlIHRyaWdnZXJWYWxpZGF0aW9uU2VydmljZTogVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlO1xuICBwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBzZXJpYWxpemF0aW9uU2VydmljZTogU2VyaWFsaXphdGlvblNlcnZpY2U7XG5cbiAgLy8gVHJhY2sgYWN0aXZlIG1lbW9yaWVzIGJ5IG5hbWUgKHN0YWJsZSBpZGVudGlmaWVyKSAtIElzc3VlICMxOCBQaGFzZSA0XG4gIHByaXZhdGUgYWN0aXZlTWVtb3J5TmFtZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBvcnRmb2xpb01hbmFnZXI6IFBvcnRmb2xpb01hbmFnZXIsXG4gICAgZmlsZUxvY2tNYW5hZ2VyOiBGaWxlTG9ja01hbmFnZXIsXG4gICAgZmlsZU9wZXJhdGlvbnNTZXJ2aWNlOiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UsXG4gICAgdmFsaWRhdGlvblJlZ2lzdHJ5OiBWYWxpZGF0aW9uUmVnaXN0cnksXG4gICAgc2VyaWFsaXphdGlvblNlcnZpY2U6IFNlcmlhbGl6YXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2UsXG4gICAgZmlsZVdhdGNoU2VydmljZT86IEZpbGVXYXRjaFNlcnZpY2UsXG4gICAgbWVtb3J5QnVkZ2V0PzogaW1wb3J0KCcuLi8uLi9jYWNoZS9DYWNoZU1lbW9yeUJ1ZGdldC5qcycpLkNhY2hlTWVtb3J5QnVkZ2V0LFxuICAgIGJhY2t1cFNlcnZpY2U/OiBpbXBvcnQoJy4uLy4uL3NlcnZpY2VzL0JhY2t1cFNlcnZpY2UuanMnKS5CYWNrdXBTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKEVsZW1lbnRUeXBlLk1FTU9SWSwgcG9ydGZvbGlvTWFuYWdlciwgZmlsZUxvY2tNYW5hZ2VyLCB7IGZpbGVXYXRjaFNlcnZpY2UsIG1lbW9yeUJ1ZGdldCwgYmFja3VwU2VydmljZSB9LCBmaWxlT3BlcmF0aW9uc1NlcnZpY2UsIHZhbGlkYXRpb25SZWdpc3RyeSk7XG4gICAgdGhpcy5tZW1vcmllc0RpciA9IHRoaXMuZWxlbWVudERpcjtcbiAgICB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRUcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UoKTtcbiAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlID0gdmFsaWRhdGlvblJlZ2lzdHJ5LmdldFZhbGlkYXRpb25TZXJ2aWNlKCk7XG4gICAgdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZSA9IHNlcmlhbGl6YXRpb25TZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFBoYXNlIDI6IE92ZXJyaWRlIGZhY3RvcnkgdG8gdXNlIE1lbW9yeVN0b3JhZ2VMYXllciBmb3IgbXVsdGktZGlyZWN0b3J5IHNjYW5uaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZVN0b3JhZ2VMYXllcihmaWxlT3BlcmF0aW9uc1NlcnZpY2U6IEZpbGVPcGVyYXRpb25zU2VydmljZSk6IElTdG9yYWdlTGF5ZXIge1xuICAgIC8vIE5vdGU6IFVzZSB0aGlzLmVsZW1lbnREaXIgKHNldCBieSBCYXNlRWxlbWVudE1hbmFnZXIgYmVmb3JlIHRoaXMgaXMgY2FsbGVkKSxcbiAgICAvLyBub3QgdGhpcy5tZW1vcmllc0RpciAoc2V0IGFmdGVyIHN1cGVyKCkgcmV0dXJucykuXG4gICAgcmV0dXJuIG5ldyBNZW1vcnlTdG9yYWdlTGF5ZXIoZmlsZU9wZXJhdGlvbnNTZXJ2aWNlLCB7XG4gICAgICBtZW1vcmllc0RpcjogdGhpcy5lbGVtZW50RGlyLFxuICAgICAgc2NhbkNvb2xkb3duTXM6IGdldFZhbGlkYXRlZFNjYW5Db29sZG93bigpLFxuICAgICAgaW5kZXhEZWJvdW5jZU1zOiBnZXRWYWxpZGF0ZWRJbmRleERlYm91bmNlKCksXG4gICAgICBmaWxlRmlsdGVyOiAoZmlsZW5hbWU6IHN0cmluZykgPT4gIWlzQmFja3VwRmlsZShmaWxlbmFtZSksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0RWxlbWVudExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdtZW1vcnknO1xuICB9XG5cbiAgLy8gTWVtb3J5TWFuYWdlciBoYXMgaXRzIG93biBiYWNrdXAgc3lzdGVtIChtb3ZlVG9Vc2VyQmFja3VwKSBhbmQgaXRzXG4gIC8vIHNhdmUvZGVsZXRlIGRvbid0IGNhbGwgc3VwZXIg4oCUIG5vLW9wIHRoZSB1bml2ZXJzYWwgYmFja3VwIGhvb2tzLlxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQmFja3VwQmVmb3JlU2F2ZSgpOiBQcm9taXNlPHZvaWQ+IHsgLyogbm8tb3AgKi8gfVxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQmFja3VwQmVmb3JlRGVsZXRlKCk6IFByb21pc2U8Ym9vbGVhbj4geyByZXR1cm4gZmFsc2U7IH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgY2xlYXJDYWNoZSB0byBhbHNvIGNsZWFyIG1lbW9yeS1zcGVjaWZpYyBjYWNoZXMuXG4gICAqIFBoYXNlIDI6IFJlbW92ZWQgdW5ib3VuZGVkIG1lbW9yeUNhY2hlIGFuZCBkYXRlRm9sZGVyc0NhY2hlLlxuICAgKi9cbiAgb3ZlcnJpZGUgY2xlYXJDYWNoZSgpOiB2b2lkIHtcbiAgICBzdXBlci5jbGVhckNhY2hlKCk7XG4gICAgdGhpcy5jb250ZW50SGFzaEluZGV4LmNsZWFyKCk7XG4gICAgdGhpcy5jb250ZW50SGFzaEJ5UGF0aC5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIGRpc3Bvc2UgdG8gZmx1c2ggTWVtb3J5U3RvcmFnZUxheWVyIF9pbmRleC5qc29uIGFuZCBjbGVhciBjYWNoZXMuXG4gICAqIFByZXZlbnRzIHJlc291cmNlIGxlYWtzIGFuZCBcIkplc3QgZGlkIG5vdCBleGl0XCIgd2FybmluZ3MgaW4gdGVzdHMuXG4gICAqL1xuICBvdmVycmlkZSBkaXNwb3NlKCk6IHZvaWQge1xuICAgIC8vIHN0b3JhZ2VMYXllci5jbGVhcigpIGNhbmNlbHMgcGVuZGluZyBfaW5kZXguanNvbiBkZWJvdW5jZWQgd3JpdGVzLFxuICAgIC8vIHByZXZlbnRpbmcgRU5PVEVNUFRZIGVycm9ycyB3aGVuIHRlc3RzIGRlbGV0ZSB0ZW1wIGRpcmVjdG9yaWVzLlxuICAgIHN1cGVyLmRpc3Bvc2UoKTsgIC8vIENhbGxzIEJhc2VFbGVtZW50TWFuYWdlci5kaXNwb3NlKCkg4oCUIHJ1bnMgc3RvcmFnZUxheWVyLmNsZWFyKCkgKyB3YXRjaGVyIGNsZWFudXBcbiAgICB0aGlzLmNvbnRlbnRIYXNoSW5kZXguY2xlYXIoKTtcbiAgICB0aGlzLmNvbnRlbnRIYXNoQnlQYXRoLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBtZW1vcnkgZmlsZSBwYXRoIGFjcm9zcyBkaWZmZXJlbnQgc3RvcmFnZSBsb2NhdGlvbnNcbiAgICogU2VhcmNoZXMgaW4gdGhpcyBvcmRlcjogc3lzdGVtLywgYWRhcHRlcnMvLCBkYXRlIGZvbGRlcnMsIHJvb3QgKGxlZ2FjeSlcbiAgICogRXh0cmFjdGVkIG1ldGhvZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHkgKFBSICM3KVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlTWVtb3J5UGF0aChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgcmVsYXRpdmUgcGF0aCAobm8gZGF0ZSBmb2xkZXIpXG4gICAgaWYgKCFmaWxlUGF0aC5pbmNsdWRlcyhwYXRoLnNlcCkgfHwgIWZpbGVQYXRoLm1hdGNoKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn0vKSkge1xuICAgICAgLy8gU2VhcmNoIGluIHN5c3RlbS8gZm9sZGVyIGZpcnN0XG4gICAgICBjb25zdCBzeXN0ZW1QYXRoID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdzeXN0ZW0nLCBmaWxlUGF0aCk7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHMoc3lzdGVtUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHN5c3RlbVBhdGg7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZW4gY2hlY2sgYWRhcHRlcnMvIGZvbGRlclxuICAgICAgY29uc3QgYWRhcHRlclBhdGggPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgJ2FkYXB0ZXJzJywgZmlsZVBhdGgpO1xuICAgICAgaWYgKGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGFkYXB0ZXJQYXRoKSkge1xuICAgICAgICByZXR1cm4gYWRhcHRlclBhdGg7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZW4gc2VhcmNoIGluIGRhdGUgZm9sZGVyc1xuICAgICAgY29uc3QgZGF0ZUZvbGRlcnMgPSBhd2FpdCB0aGlzLmdldERhdGVGb2xkZXJzKCk7XG4gICAgICBmb3IgKGNvbnN0IGRhdGVGb2xkZXIgb2YgZGF0ZUZvbGRlcnMpIHtcbiAgICAgICAgY29uc3QgdGVzdFBhdGggPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgZGF0ZUZvbGRlciwgZmlsZVBhdGgpO1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHModGVzdFBhdGgpKSB7XG4gICAgICAgICAgcmV0dXJuIHRlc3RQYXRoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEZhbGwgYmFjayB0byByb290IGRpcmVjdG9yeSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBkdXJpbmcgdHJhbnNpdGlvblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgbWVtb3J5IGZyb20gZmlsZVxuICAgKiBTRUNVUklUWSBGSVggIzE6IFVzZXMgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1JlYWRGaWxlKCkgaW5zdGVhZCBvZiBmcy5yZWFkRmlsZSgpXG4gICAqIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIGFuZCBlbnN1cmUgYXRvbWljIGZpbGUgb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgbWVtb3J5IGZpbGUgdG8gbG9hZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgbG9hZGVkIE1lbW9yeSBpbnN0YW5jZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBmaWxlIGNhbm5vdCBiZSBmb3VuZCBvciBwYXRoIHZhbGlkYXRpb24gZmFpbHNcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gWUFNTCBwYXJzaW5nIGZhaWxzIG9yIGNvbnRlbnQgaXMgbWFsZm9ybWVkXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIG1lbW9yeSB2YWxpZGF0aW9uIGZhaWxzIGFmdGVyIGxvYWRpbmdcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8TWVtb3J5PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFJlc29sdmUgcGF0aCB1c2luZyBleHRyYWN0ZWQgaGVscGVyIG1ldGhvZFxuICAgICAgY29uc3QgZnVsbFBhdGggPSBhd2FpdCB0aGlzLnJlc29sdmVNZW1vcnlQYXRoKGZpbGVQYXRoKTtcblxuICAgICAgLy8gRW5zdXJlIGZ1bGxQYXRoIGlzIGRlZmluZWRcbiAgICAgIGlmICghZnVsbFBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVzb2x2ZSBwYXRoOiAke2ZpbGVQYXRofWApO1xuICAgICAgfVxuXG4gICAgICAvLyBQaGFzZSAyOiBDaGVjayBiYXNlIGNsYXNzIExSVSBjYWNoZSAocmVwbGFjZXMgcmVtb3ZlZCBtZW1vcnlDYWNoZSBNYXApXG4gICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmdldENhY2hlZEJ5QWJzb2x1dGVQYXRoKGZ1bGxQYXRoKTtcbiAgICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIEZpbGVPcGVyYXRpb25zU2VydmljZSBmb3IgYXRvbWljIGZpbGUgcmVhZFxuICAgICAgLy8gUHJldmlvdXNseTogY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZ1bGxQYXRoLCAndXRmLTgnKTtcbiAgICAgIC8vIE5vdzogVXNlcyBGaWxlT3BlcmF0aW9uc1NlcnZpY2Ugd2hpY2ggd3JhcHMgRmlsZUxvY2tNYW5hZ2VyXG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShmdWxsUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICAgIFxuICAgICAgLy8gSElHSCBTRVZFUklUWSBGSVg6IFVzZSBTZWN1cmVZYW1sUGFyc2VyIHRvIHByZXZlbnQgWUFNTCBpbmplY3Rpb24gYXR0YWNrc1xuICAgICAgLy8gVXNlcyBTZXJpYWxpemF0aW9uU2VydmljZSB3aGljaCB3cmFwcyBTZWN1cmVZYW1sUGFyc2VyIGFuZCBoYW5kbGVzIHB1cmUgWUFNTCBhdXRvbWF0aWNhbGx5XG5cbiAgICAgIC8vIE1lbW9yeSBmaWxlcyBhcmUgcHVyZSBZQU1MICh1bmxpa2Ugb3RoZXIgZWxlbWVudHMgd2hpY2ggYXJlIG1hcmtkb3duIHdpdGggZnJvbnRtYXR0ZXIpXG4gICAgICAvLyBTZXJpYWxpemF0aW9uU2VydmljZS5wYXJzZUZyb250bWF0dGVyKCkgYXV0b21hdGljYWxseSBkZXRlY3RzIGFuZCB3cmFwcyBwdXJlIFlBTUxcblxuICAgICAgLy8gSGFuZGxlIGVtcHR5IGNvbnRlbnQgZWRnZSBjYXNlIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRlc3RzL2ZpbGVzKVxuICAgICAgbGV0IHBhcnNlZDogUGFyc2VkTWVtb3J5RGF0YTtcblxuICAgICAgaWYgKGNvbnRlbnQudHJpbSgpID09PSAnJykge1xuICAgICAgICAvLyBFbXB0eSBvciBhbGwgd2hpdGVzcGFjZSBmaWxlIC0gY3JlYXRlIG1pbmltYWwgdmFsaWQgc3RydWN0dXJlXG4gICAgICAgIHBhcnNlZCA9IHsgZGF0YToge30sIGNvbnRlbnQ6ICcnIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihjb250ZW50LCB7XG4gICAgICAgICAgbWF4WWFtbFNpemU6IE1FTU9SWV9DT05TVEFOVFMuTUFYX1lBTUxfU0laRSxcbiAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IGZhbHNlLCAgLy8gRklYICgjMTIwNik6IExvY2FsIGZpbGVzIGFyZSBwcmUtdHJ1c3RlZFxuICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIubG9hZCcsXG4gICAgICAgICAgc2NoZW1hOiAnanNvbicgIC8vIEZJWCAjMTQzMDogUHJlc2VydmUgYm9vbGVhbnMgKGF1dG9Mb2FkKSBhbmQgbnVtYmVycyAocHJpb3JpdHkpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENvbnZlcnQgdG8gUGFyc2VkTWVtb3J5RGF0YSBmb3JtYXRcbiAgICAgICAgcGFyc2VkID0ge1xuICAgICAgICAgIGRhdGE6IHBhcnNlUmVzdWx0LmRhdGEsXG4gICAgICAgICAgY29udGVudDogcGFyc2VSZXN1bHQuY29udGVudFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IG1ldGFkYXRhIGFuZCBtYXJrZG93biBjb250ZW50XG4gICAgICBjb25zdCB7IG1ldGFkYXRhLCBjb250ZW50OiBtYXJrZG93bkNvbnRlbnRGcm9tRmlsZSB9ID0gdGhpcy5wYXJzZU1lbW9yeUZpbGUocGFyc2VkKTtcblxuICAgICAgLy8gQ3JlYXRlIG1lbW9yeSBpbnN0YW5jZVxuICAgICAgY29uc3QgbWVtb3J5ID0gbmV3IE1lbW9yeShtZXRhZGF0YSwgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgICAvLyBGaXggIzkxODogUmVhZCBpbnN0cnVjdGlvbnMgZnJvbSByb290LWxldmVsIFlBTUwgKHdoZXJlIHNlcmlhbGl6ZUVsZW1lbnQgd3JpdGVzIHRoZW0pLlxuICAgICAgLy8gUHJldmlvdXNseSBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIHRvIHJvb3QgYnV0IG5ldmVyIHJlYWQgYmFjayDigJQgc2lsZW50IGRhdGEgbG9zcy5cbiAgICAgIGNvbnN0IHJvb3RJbnN0cnVjdGlvbnMgPSBwYXJzZWQuZGF0YT8uaW5zdHJ1Y3Rpb25zO1xuICAgICAgaWYgKHJvb3RJbnN0cnVjdGlvbnMgJiYgdHlwZW9mIHJvb3RJbnN0cnVjdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG1lbW9yeS5pbnN0cnVjdGlvbnMgPSByb290SW5zdHJ1Y3Rpb25zO1xuICAgICAgfVxuXG4gICAgICAvLyBTdHJpcCBmb3JtYXRfdmVyc2lvbiBmcm9tIHJ1bnRpbWUgbWV0YWRhdGEgKEZpeCAjOTEyKVxuICAgICAgZGVsZXRlIChtZW1vcnkubWV0YWRhdGEgYXMgYW55KS5mb3JtYXRfdmVyc2lvbjtcblxuICAgICAgLy8gTG9hZCBzYXZlZCBlbnRyaWVzIGlmIHByZXNlbnRcbiAgICAgIC8vIE1lbW9yeSBmaWxlcyBoYXZlIGVudHJpZXMgYXMgYSB0b3AtbGV2ZWwga2V5IGluIHRoZSBZQU1MXG4gICAgICBjb25zdCBlbnRyaWVzID0gcGFyc2VkLmRhdGE/LmVudHJpZXM7XG4gICAgICBpZiAoZW50cmllcykge1xuICAgICAgICBtZW1vcnkuZGVzZXJpYWxpemUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGlkOiBtZW1vcnkuaWQsXG4gICAgICAgICAgdHlwZTogbWVtb3J5LnR5cGUsXG4gICAgICAgICAgdmVyc2lvbjogbWVtb3J5LnZlcnNpb24sXG4gICAgICAgICAgbWV0YWRhdGE6IG1lbW9yeS5tZXRhZGF0YSxcbiAgICAgICAgICBleHRlbnNpb25zOiBtZW1vcnkuZXh0ZW5zaW9ucyxcbiAgICAgICAgICBlbnRyaWVzOiBlbnRyaWVzXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbWFya2Rvd24gY29udGVudCBleGlzdHMgYWZ0ZXIgdGhlIGZyb250bWF0dGVyLCBhZGQgaXQgYXMgYSBtZW1vcnkgZW50cnlcbiAgICAgIC8vIFRoaXMgcHJlc2VydmVzIGNvbnRlbnQgZnJvbSBzZWVkIG1lbW9yaWVzIGFuZCBtZW1vcnkgZmlsZXMgd2l0aCBtYXJrZG93biBzZWN0aW9uc1xuICAgICAgaWYgKG1hcmtkb3duQ29udGVudEZyb21GaWxlICYmIG1hcmtkb3duQ29udGVudEZyb21GaWxlLnRyaW0oKSAmJiBwYXJzZWQuY29udGVudCAmJiBwYXJzZWQuY29udGVudC50cmltKCkpIHtcbiAgICAgICAgYXdhaXQgbWVtb3J5LmFkZEVudHJ5KFxuICAgICAgICAgIHBhcnNlZC5jb250ZW50LnRyaW0oKSxcbiAgICAgICAgICBbXSwgIC8vIHRhZ3NcbiAgICAgICAgICB7IGxvYWRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSwgIC8vIG1ldGFkYXRhXG4gICAgICAgICAgJ2ZpbGUnICAvLyBzb3VyY2VcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRklYICMxMzIwOiBTZXQgZmlsZSBwYXRoIG9uIG1lbW9yeSBmb3IgcGVyc2lzdGVuY2UgKHN0b3JlIHJlbGF0aXZlIHBhdGgpXG4gICAgICAvLyBOb3JtYWxpemUgdG8gZm9yd2FyZCBzbGFzaGVzIHNvIHBhdGhzIGFyZSBjb25zaXN0ZW50IGFjcm9zcyBwbGF0Zm9ybXNcbiAgICAgIC8vIChwYXRoLnJlbGF0aXZlKCkgcmV0dXJucyBiYWNrc2xhc2hlcyBvbiBXaW5kb3dzKS5cbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUodGhpcy5tZW1vcmllc0RpciwgZnVsbFBhdGgpLnNwbGl0KHBhdGguc2VwKS5qb2luKCcvJyk7XG4gICAgICBtZW1vcnkuc2V0RmlsZVBhdGgocmVsYXRpdmVQYXRoKTtcblxuICAgICAgLy8gQ2FjaGUgdmlhIGJhc2UgY2xhc3MgTFJVIGNhY2hlXG4gICAgICB0aGlzLmNhY2hlRWxlbWVudChtZW1vcnksIHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIC8vIFJvdXRpbmUgbG9hZCDigJQgZGVidWcgbGV2ZWwgb25seS4gU2VjdXJpdHkgZXZlbnQgZm9yIE1FTU9SWV9MT0FERUQgd2FzXG4gICAgICAvLyBnZW5lcmF0aW5nIH4xMjhLIGVudHJpZXMvc2Vzc2lvbiwgb3ZlcndoZWxtaW5nIHRoZSA1SyBzZWN1cml0eSByaW5nIGJ1ZmZlclxuICAgICAgLy8gd2l0aCAyNXggdHVybm92ZXIgKGJhY2twcmVzc3VyZSkuIERvd25ncmFkZWQgcGVyIElzc3VlICMxNjg3IGFuYWx5c2lzLlxuICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5TWFuYWdlcl0gTG9hZGVkIG1lbW9yeSBmcm9tICR7cGF0aC5iYXNlbmFtZShmdWxsUGF0aCl9YCk7XG4gICAgICBcbiAgICAgIHJldHVybiBtZW1vcnk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9MT0FEX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxvYWQnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGxvYWQgbWVtb3J5IGZyb20gJHtmaWxlUGF0aH06ICR7ZXJyb3J9YFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIG1lbW9yeTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBleGlzdGluZyBtZW1vcnkgZmlsZSB0byB1c2VyIGJhY2t1cCBkaXJlY3RvcnlcbiAgICogSXNzdWUgIzQ5OiBQcmV2ZW50cyBkdXBsaWNhdGUgZmlsZXMgYnkgYmFja2luZyB1cCBpbnN0ZWFkIG9mIHZlcnNpb25pbmdcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgbW92ZVRvVXNlckJhY2t1cChleGlzdGluZ1BhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGRhdGVGb2xkZXIgPSBgJHtkYXRlLmdldEZ1bGxZZWFyKCl9LSR7U3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyl9LSR7U3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gICAgY29uc3QgYmFja3VwRGlyID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdiYWNrdXBzJywgJ3VzZXInLCBkYXRlRm9sZGVyKTtcbiAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShiYWNrdXBEaXIpO1xuXG4gICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGV4aXN0aW5nUGF0aCk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gZGF0ZS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1s6Ll0vZywgJy0nKTtcbiAgICBjb25zdCBiYWNrdXBOYW1lID0gZmlsZW5hbWUucmVwbGFjZSgnLnlhbWwnLCBgLmJhY2t1cC0ke3RpbWVzdGFtcH0ueWFtbGApO1xuXG4gICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZW5hbWVGaWxlKGV4aXN0aW5nUGF0aCwgcGF0aC5qb2luKGJhY2t1cERpciwgYmFja3VwTmFtZSkpO1xuICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzQ5OiBNb3ZlZCBleGlzdGluZyBmaWxlIHRvIGJhY2t1cDogJHtiYWNrdXBOYW1lfWApO1xuXG4gICAgLy8gSXNzdWUgIzY1NDogUHJ1bmUgZXhjZXNzIGJhY2t1cHMgZm9yIHRoaXMgbWVtb3J5IGluIHRoaXMgZGF0ZSBmb2xkZXJcbiAgICBhd2FpdCB0aGlzLnBydW5lQmFja3Vwc0Zvck1lbW9yeShiYWNrdXBEaXIsIGZpbGVuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcnVuZSBleGNlc3MgYmFja3VwcyBmb3IgYSBzcGVjaWZpYyBtZW1vcnkgaW4gYSBkYXRlIGZvbGRlci5cbiAgICogS2VlcHMgb25seSB0aGUgTiBtb3N0IHJlY2VudCBiYWNrdXBzIChieSB0aW1lc3RhbXAgaW4gZmlsZW5hbWUpLlxuICAgKiBJc3N1ZSAjNjU0OiBQcmV2ZW50cyB1bmJvdW5kZWQgYmFja3VwIGdyb3d0aCAod2FzIDE5N2srIGZpbGVzKS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJ1bmVCYWNrdXBzRm9yTWVtb3J5KGJhY2t1cERpcjogc3RyaW5nLCBtZW1vcnlGaWxlbmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWF4QmFja3VwcyA9IFNUT1JBR0VfTEFZRVJfQ09ORklHLk1BWF9CQUNLVVBTX1BFUl9NRU1PUlk7XG4gICAgY29uc3QgYmFzZU5hbWUgPSBtZW1vcnlGaWxlbmFtZS5yZXBsYWNlKCcueWFtbCcsICcnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhbGxGaWxlcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShiYWNrdXBEaXIpO1xuICAgICAgLy8gRmluZCBhbGwgYmFja3VwcyBmb3IgdGhpcyBzcGVjaWZpYyBtZW1vcnlcbiAgICAgIGNvbnN0IG1lbW9yeUJhY2t1cHMgPSBhbGxGaWxlc1xuICAgICAgICAuZmlsdGVyKGYgPT4gZi5zdGFydHNXaXRoKGAke2Jhc2VOYW1lfS5iYWNrdXAtYCkgJiYgZi5lbmRzV2l0aCgnLnlhbWwnKSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7IC8vIExleGljb2dyYXBoaWMgc29ydCA9IGNocm9ub2xvZ2ljYWwgZm9yIElTTyB0aW1lc3RhbXBzXG5cbiAgICAgIGlmIChtZW1vcnlCYWNrdXBzLmxlbmd0aCA8PSBtYXhCYWNrdXBzKSByZXR1cm47XG5cbiAgICAgIC8vIERlbGV0ZSBvbGRlc3QgYmFja3VwcyAoa2VlcCB0aGUgbGFzdCBOKVxuICAgICAgY29uc3QgdG9EZWxldGUgPSBtZW1vcnlCYWNrdXBzLnNsaWNlKDAsIG1lbW9yeUJhY2t1cHMubGVuZ3RoIC0gbWF4QmFja3Vwcyk7XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdG9EZWxldGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoXG4gICAgICAgICAgICBwYXRoLmpvaW4oYmFja3VwRGlyLCBmaWxlKSxcbiAgICAgICAgICAgIEVsZW1lbnRUeXBlLk1FTU9SWSxcbiAgICAgICAgICAgIHsgc291cmNlOiAnTWVtb3J5TWFuYWdlci5wcnVuZUJhY2t1cHNGb3JNZW1vcnknIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIEZhaWxlZCB0byBwcnVuZSBiYWNrdXAgJHtmaWxlfTpgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRvRGVsZXRlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjNjU0OiBQcnVuZWQgJHt0b0RlbGV0ZS5sZW5ndGh9IGV4Y2VzcyBiYWNrdXBzIGZvciAke2Jhc2VOYW1lfSAoa2VwdCAke21heEJhY2t1cHN9KWApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBOb24tZmF0YWwg4oCUIGJhY2t1cCBwcnVuaW5nIGlzIGJlc3QtZWZmb3J0XG4gICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBCYWNrdXAgcHJ1bmluZyBmYWlsZWQgZm9yICR7YmFja3VwRGlyfTpgLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHBhdGggZm9yIG1lbW9yeSBzdG9yYWdlIGJhc2VkIG9uIG1lbW9yeSB0eXBlXG4gICAqIFJvdXRlcyBtZW1vcmllcyB0byBhcHByb3ByaWF0ZSBmb2xkZXJzOlxuICAgKiAtIFNZU1RFTTogc3lzdGVtL1xuICAgKiAtIEFEQVBURVI6IGFkYXB0ZXJzL1xuICAgKiAtIFVTRVI6IFlZWVktTU0tREQvIChkYXRlLWJhc2VkIGZvbGRlcnMpXG4gICAqIEBwYXJhbSBlbGVtZW50IE1lbW9yeSBlbGVtZW50IHRvIHNhdmVcbiAgICogQHBhcmFtIG1lbW9yeVR5cGUgVHlwZSBvZiBtZW1vcnkgKGRlZmF1bHRzIHRvIFVTRVIpXG4gICAqIEBwYXJhbSBmaWxlTmFtZSBPcHRpb25hbCBjdXN0b20gZmlsZW5hbWVcbiAgICogQHJldHVybnMgRnVsbCBwYXRoIHRvIG1lbW9yeSBmaWxlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlTWVtb3J5UGF0aChlbGVtZW50OiBNZW1vcnksIG1lbW9yeVR5cGU/OiBNZW1vcnlUeXBlLCBmaWxlTmFtZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdHlwZSA9IG1lbW9yeVR5cGUgfHwgTWVtb3J5VHlwZS5VU0VSO1xuICAgIGxldCB0YXJnZXREaXI6IHN0cmluZztcblxuICAgIC8vIFJvdXRlIHRvIGFwcHJvcHJpYXRlIGZvbGRlciBiYXNlZCBvbiBtZW1vcnkgdHlwZVxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBNZW1vcnlUeXBlLlNZU1RFTTpcbiAgICAgICAgdGFyZ2V0RGlyID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdzeXN0ZW0nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIE1lbW9yeVR5cGUuQURBUFRFUjpcbiAgICAgICAgdGFyZ2V0RGlyID0gcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdhZGFwdGVycycpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTWVtb3J5VHlwZS5VU0VSOlxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBVc2VyIG1lbW9yaWVzIGdvIGluIGRhdGUtYmFzZWQgZm9sZGVycyAoZXhpc3RpbmcgYmVoYXZpb3IpXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBjb25zdCBkYXRlRm9sZGVyID0gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0ke1N0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpfS0ke1N0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKX1gO1xuICAgICAgICB0YXJnZXREaXIgPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgZGF0ZUZvbGRlcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0YXJnZXQgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRhcmdldERpcik7XG5cbiAgICAvLyBHZW5lcmF0ZSBmaWxlbmFtZSB1c2luZyB1bmlmaWVkIG5vcm1hbGl6YXRpb25cbiAgICAvLyBOb3RlOiBNZW1vcnkgZmlsZXMgdXNlIC55YW1sIGV4dGVuc2lvbiwgc28gd2UgdXNlIG5vcm1hbGl6ZUZpbGVuYW1lKCkgZGlyZWN0bHlcbiAgICBjb25zdCBiYXNlTmFtZSA9IGZpbGVOYW1lIHx8IGAke3RoaXMubm9ybWFsaXplRmlsZW5hbWUoZWxlbWVudC5tZXRhZGF0YS5uYW1lIHx8ICdtZW1vcnknKX0ueWFtbGA7XG5cbiAgICAvLyBJc3N1ZSAjNDk6IENoZWNrIGlmIGZpbGUgZXhpc3RzIGFuZCBtb3ZlIHRvIGJhY2t1cCBpZiBzbyAoaW5zdGVhZCBvZiB2ZXJzaW9uIHN1ZmZpeGVzKVxuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCBiYXNlTmFtZSk7XG4gICAgaWYgKGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHRhcmdldFBhdGgpKSB7XG4gICAgICBhd2FpdCB0aGlzLm1vdmVUb1VzZXJCYWNrdXAodGFyZ2V0UGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXRQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBtZW1vcnkgdHlwZSBmcm9tIGZpbGUgcGF0aFxuICAgKiBAcGFyYW0gZmlsZVBhdGggUmVsYXRpdmUgcGF0aCB3aXRoaW4gbWVtb3JpZXMgZGlyZWN0b3J5XG4gICAqIEByZXR1cm5zIE1lbW9yeSB0eXBlIGJhc2VkIG9uIHBhdGhcbiAgICovXG4gIHByaXZhdGUgZ2V0TWVtb3J5VHlwZUZyb21QYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBNZW1vcnlUeXBlIHtcbiAgICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aCgnc3lzdGVtLycpIHx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoJ3N5c3RlbVxcXFwnKSkge1xuICAgICAgcmV0dXJuIE1lbW9yeVR5cGUuU1lTVEVNO1xuICAgIH1cbiAgICBpZiAoZmlsZVBhdGguc3RhcnRzV2l0aCgnYWRhcHRlcnMvJykgfHwgZmlsZVBhdGguc3RhcnRzV2l0aCgnYWRhcHRlcnNcXFxcJykpIHtcbiAgICAgIHJldHVybiBNZW1vcnlUeXBlLkFEQVBURVI7XG4gICAgfVxuICAgIHJldHVybiBNZW1vcnlUeXBlLlVTRVI7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGFsbCByZXF1aXJlZCBmb2xkZXIgc3RydWN0dXJlIGV4aXN0c1xuICAgKiBDcmVhdGVzIHN5c3RlbS8sIGJhY2t1cHMvc3lzdGVtLywgYmFja3Vwcy91c2VyLywgYWRhcHRlcnMvIGZvbGRlcnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlRm9sZGVyU3RydWN0dXJlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZvbGRlcnMgPSBbXG4gICAgICBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0RpciwgJ3N5c3RlbScpLFxuICAgICAgcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdiYWNrdXBzJywgJ3N5c3RlbScpLFxuICAgICAgcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdiYWNrdXBzJywgJ3VzZXInKSxcbiAgICAgIHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCAnYWRhcHRlcnMnKVxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZvbGRlciBvZiBmb2xkZXJzKSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShmb2xkZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgU0hBLTI1NiBoYXNoIG9mIG1lbW9yeSBjb250ZW50IGZvciBkZWR1cGxpY2F0aW9uXG4gICAqIEltcGxlbWVudHMgSXNzdWUgIzk5NCAtIENvbnRlbnQtYmFzZWQgZGVkdXBsaWNhdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZW50SGFzaChlbGVtZW50OiBNZW1vcnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBtZXRhZGF0YTogZWxlbWVudC5tZXRhZGF0YSxcbiAgICAgIGVudHJpZXM6IEpTT04ucGFyc2UoZWxlbWVudC5zZXJpYWxpemUoKSkuZW50cmllc1xuICAgIH0pO1xuICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGNvbnRlbnQpLmRpZ2VzdCgnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBkYXRlIGZvbGRlcnMgaW4gbWVtb3JpZXMgZGlyZWN0b3J5LlxuICAgKiBQaGFzZSAyOiBSZW1vdmVkIGxvY2FsIGNhY2hlIOKAlCBNZW1vcnlTdG9yYWdlTGF5ZXIgc2NhbiBjb29sZG93biBoYW5kbGVzIHRoZSBob3QgcGF0aC5cbiAgICogVGhpcyBtZXRob2QgaXMgbm93IG9ubHkgdXNlZCBieSByZXNvbHZlTWVtb3J5UGF0aCgpIGFzIGEgZmFsbGJhY2suXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGRhdGUgZm9sZGVyIG5hbWVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldERhdGVGb2xkZXJzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeSh0aGlzLm1lbW9yaWVzRGlyKTtcbiAgICAgIHJldHVybiBlbnRyaWVzXG4gICAgICAgIC5maWx0ZXIobmFtZSA9PiAvXlxcZHs0fS1cXGR7Mn0tXFxkezJ9JC8udGVzdChuYW1lKSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgICAgLnJldmVyc2UoKTsgLy8gTW9zdCByZWNlbnQgZmlyc3RcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGEgbWVtb3J5IHRvIGZpbGVcbiAgICogU0VDVVJJVFkgRklYICMxOiBVc2VzIEZpbGVMb2NrTWFuYWdlci5hdG9taWNXcml0ZUZpbGUoKSBmb3IgYXRvbWljIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGVsZW1lbnQgTWVtb3J5IGVsZW1lbnQgdG8gc2F2ZVxuICAgKiBAcGFyYW0gZmlsZVBhdGggT3B0aW9uYWwgY3VzdG9tIGZpbGUgcGF0aCwgZGVmYXVsdHMgdG8gdHlwZS1iYXNlZCBwYXRoXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNhdmUgaXMgY29tcGxldGVcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gbWVtb3J5IHZhbGlkYXRpb24gZmFpbHMgYmVmb3JlIHNhdmluZ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwYXRoIHZhbGlkYXRpb24gZmFpbHMgb3IgZmlsZSBzeXN0ZW0gZXJyb3JzIG9jY3VyXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGF0b21pYyB3cml0ZSBvcGVyYXRpb24gZmFpbHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNhdmUoZWxlbWVudDogTWVtb3J5LCBmaWxlUGF0aD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBJc3N1ZSAjMzk6IEF1dG8tcmVwYWlyIGNvcnJ1cHRlZCBiYWNrdXAgbmFtZXMgYmVmb3JlIHNhdmluZ1xuICAgICAgY29uc3QgbWVtb3J5TmFtZSA9IGVsZW1lbnQubWV0YWRhdGEubmFtZTtcbiAgICAgIGlmIChpc0NvcnJ1cHRlZEJhY2t1cE5hbWUobWVtb3J5TmFtZSkpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxOYW1lID0gZXh0cmFjdE9yaWdpbmFsTmFtZShtZW1vcnlOYW1lKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IERldGVjdGVkIGNvcnJ1cHRlZCBiYWNrdXAgbmFtZSAnJHttZW1vcnlOYW1lfScsIGAgK1xuICAgICAgICAgIGBhdXRvLXJlcGFpcmluZyB0byAnJHtvcmlnaW5hbE5hbWV9J2BcbiAgICAgICAgKTtcbiAgICAgICAgZWxlbWVudC5tZXRhZGF0YS5uYW1lID0gb3JpZ2luYWxOYW1lO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TQVZFRCxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5zYXZlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgSXNzdWUgIzM5OiBBdXRvLXJlcGFpcmVkIGNvcnJ1cHRlZCBiYWNrdXAgbmFtZTogJyR7bWVtb3J5TmFtZX0nIC0+ICcke29yaWdpbmFsTmFtZX0nYFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZWxlbWVudFxuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IGVsZW1lbnQudmFsaWRhdGUoKTtcbiAgICAgIGlmICghdmFsaWRhdGlvbi52YWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbWVtb3J5OiAke3ZhbGlkYXRpb24uZXJyb3JzPy5tYXAoZSA9PiBlLm1lc3NhZ2UpLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBjb250ZW50IGhhc2ggZm9yIGRlZHVwbGljYXRpb25cbiAgICAgIGNvbnN0IGNvbnRlbnRIYXNoID0gdGhpcy5jYWxjdWxhdGVDb250ZW50SGFzaChlbGVtZW50KTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nUGF0aCA9IHRoaXMuY29udGVudEhhc2hJbmRleC5nZXQoY29udGVudEhhc2gpO1xuXG4gICAgICBpZiAoZXhpc3RpbmdQYXRoKSB7XG4gICAgICAgIC8vIExvZyBkdXBsaWNhdGUgZGV0ZWN0aW9uXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnTUVNT1JZX0RVUExJQ0FURV9ERVRFQ1RFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuc2F2ZScsXG4gICAgICAgICAgZGV0YWlsczogYER1cGxpY2F0ZSBjb250ZW50IGRldGVjdGVkLiBFeGlzdGluZzogJHtleGlzdGluZ1BhdGh9YFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gRGV0ZWN0IG1lbW9yeSB0eXBlIGZyb20gbWV0YWRhdGEgb3IgZGVmYXVsdCB0byBVU0VSXG4gICAgICBjb25zdCBtZW1vcnlNZXRhID0gZWxlbWVudC5tZXRhZGF0YSBhcyBNZW1vcnlNZXRhZGF0YTtcbiAgICAgIGNvbnN0IG1lbW9yeVR5cGUgPSBtZW1vcnlNZXRhLm1lbW9yeVR5cGUgfHwgTWVtb3J5VHlwZS5VU0VSO1xuXG4gICAgICAvLyBTYXZlIHBhdGggcHJlY2VkZW5jZTpcbiAgICAgIC8vIDEpIGV4cGxpY2l0IGZpbGVQYXRoIGFyZ3VtZW50XG4gICAgICAvLyAyKSBleGlzdGluZyBwZXJzaXN0ZWQgcGF0aCBvbiB0aGUgZWxlbWVudCAoZXhpc3RpbmdGaWxlUGF0aClcbiAgICAgIC8vIDMpIG5ld2x5IGdlbmVyYXRlZCBkYXRlL3R5cGUtYmFzZWQgcGF0aCBmb3IgZmlyc3QtdGltZSBzYXZlc1xuICAgICAgLy8gS2VlcGluZyAjMiBhaGVhZCBvZiAjMyBwcmV2ZW50cyBsb2FkZWQgbWVtb3JpZXMgZnJvbSBiZWluZyBjb3BpZWQgaW50byBhIG5ld1xuICAgICAgLy8gZGF0ZSBmb2xkZXIgb24gZWFjaCBzYXZlIChJc3N1ZSAjNjk5KS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZVBhdGggPSBlbGVtZW50LmdldEZpbGVQYXRoKCk7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGZpbGVQYXRoXG4gICAgICAgID8gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoKVxuICAgICAgICA6IGV4aXN0aW5nRmlsZVBhdGhcbiAgICAgICAgICA/IGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChleGlzdGluZ0ZpbGVQYXRoKVxuICAgICAgICAgIDogYXdhaXQgdGhpcy5nZW5lcmF0ZU1lbW9yeVBhdGgoZWxlbWVudCwgbWVtb3J5VHlwZSk7XG5cbiAgICAgIC8vIEVuc3VyZSBwYXJlbnQgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSk7XG5cbiAgICAgIGNvbnN0IHlhbWxDb250ZW50ID0gYXdhaXQgdGhpcy5zZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAvLyBGaXggIzkxNi8jOTE4OiBTaXplIGVuZm9yY2VtZW50IG9uIE1lbW9yeSdzIGN1c3RvbSBzYXZlIHBhdGhcbiAgICAgIC8vIChCYXNlRWxlbWVudE1hbmFnZXIuc2F2ZSgpIGhhcyB0aGlzIGJ1dCBNZW1vcnkgb3ZlcnJpZGVzIGl0IGVudGlyZWx5KVxuICAgICAgaWYgKHlhbWxDb250ZW50Lmxlbmd0aCA+IFNFQ1VSSVRZX0xJTUlUUy5NQVhfUEVSU09OQV9TSVpFX0JZVEVTKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TQVZFX0ZBSUxFRCxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuc2F2ZS5zaXplRW5mb3JjZW1lbnQnLFxuICAgICAgICAgIGRldGFpbHM6IGBNZW1vcnkgZXhjZWVkcyBtYXhpbXVtIGZpbGUgc2l6ZSAoJHt5YW1sQ29udGVudC5sZW5ndGh9ID4gJHtTRUNVUklUWV9MSU1JVFMuTUFYX1BFUlNPTkFfU0laRV9CWVRFU30pYCxcbiAgICAgICAgICBtZXRhZGF0YTogeyBjb250ZW50TGVuZ3RoOiB5YW1sQ29udGVudC5sZW5ndGgsIGxpbWl0OiBTRUNVUklUWV9MSU1JVFMuTUFYX1BFUlNPTkFfU0laRV9CWVRFUyB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE1lbW9yeSBleGNlZWRzIG1heGltdW0gZmlsZSBzaXplICgke3lhbWxDb250ZW50Lmxlbmd0aH0gPiAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfUEVSU09OQV9TSVpFX0JZVEVTfSlgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZpeCAjOTA4LyM5MTg6IFlBTUwgYm9tYiBkZXRlY3Rpb24gb24gTWVtb3J5J3MgY3VzdG9tIHNhdmUgcGF0aFxuICAgICAgY29uc3QgdmFsaWRhdGlvblN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgIGlmICh5YW1sQ29udGVudC5sZW5ndGggPD0gU0VDVVJJVFlfTElNSVRTLk1BWF9ZQU1MX0xFTkdUSCkge1xuICAgICAgICBpZiAoIUNvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVZYW1sQ29udGVudCh5YW1sQ29udGVudCkpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnWUFNTF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0NSSVRJQ0FMJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuc2F2ZS55YW1sQm9tYkRldGVjdGlvbicsXG4gICAgICAgICAgICBkZXRhaWxzOiAnU2VyaWFsaXplZCBtZW1vcnkgY29udGFpbnMgbWFsaWNpb3VzIFlBTUwgcGF0dGVybnMg4oCUIHdyaXRlIGJsb2NrZWQnLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHsgY29udGVudExlbmd0aDogeWFtbENvbnRlbnQubGVuZ3RoIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcmlhbGl6ZWQgbWVtb3J5IGNvbnRhaW5zIG1hbGljaW91cyBZQU1MIHBhdHRlcm5zIOKAlCB3cml0ZSBibG9ja2VkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbGlkYXRpb25NcyA9IERhdGUubm93KCkgLSB2YWxpZGF0aW9uU3RhcnQ7XG4gICAgICBpZiAodmFsaWRhdGlvbk1zID4gNTApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtNZW1vcnlNYW5hZ2VyXSBXcml0ZS1wYXRoIFlBTUwgdmFsaWRhdGlvbiB0b29rICR7dmFsaWRhdGlvbk1zfW1zIGZvciAke3lhbWxDb250ZW50Lmxlbmd0aH0gYnl0ZXNgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIGZvciBhdG9taWMgZmlsZSB3cml0ZVxuICAgICAgLy8gUHJldmlvdXNseTogYXdhaXQgZnMud3JpdGVGaWxlKGZ1bGxQYXRoLCB5YW1sQ29udGVudCwgJ3V0Zi04Jyk7XG4gICAgICAvLyBOb3c6IFVzZXMgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIHdoaWNoIHdyYXBzIEZpbGVMb2NrTWFuYWdlclxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy53cml0ZUZpbGUoZnVsbFBhdGgsIHlhbWxDb250ZW50LCB7IGVuY29kaW5nOiAndXRmLTgnIH0pO1xuXG4gICAgICAvLyBGSVggIzEzMjA6IFNldCBmaWxlIHBhdGggb24gbWVtb3J5IGFmdGVyIHN1Y2Nlc3NmdWwgc2F2ZVxuICAgICAgLy8gTm9ybWFsaXplIHRvIGZvcndhcmQgc2xhc2hlcyBzbyBwYXRocyBhcmUgY29uc2lzdGVudCBhY3Jvc3MgcGxhdGZvcm1zXG4gICAgICAvLyAocGF0aC5yZWxhdGl2ZSgpIHJldHVybnMgYmFja3NsYXNoZXMgb24gV2luZG93cykuXG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMubWVtb3JpZXNEaXIsIGZ1bGxQYXRoKS5zcGxpdChwYXRoLnNlcCkuam9pbignLycpO1xuICAgICAgZWxlbWVudC5zZXRGaWxlUGF0aChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBDYWNoZSB2aWEgYmFzZSBjbGFzcyBMUlUgY2FjaGVcbiAgICAgIHRoaXMuY2FjaGVFbGVtZW50KGVsZW1lbnQsIHJlbGF0aXZlUGF0aCk7XG5cbiAgICAgIC8vIFBoYXNlIDI6IE5vdGlmeSBzdG9yYWdlIGxheWVyIG9mIHNhdmVcbiAgICAgIGNvbnN0IHJlbFBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMubWVtb3JpZXNEaXIsIGZ1bGxQYXRoKS5zcGxpdChwYXRoLnNlcCkuam9pbignLycpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIubm90aWZ5U2F2ZWQocmVsUGF0aCwgZnVsbFBhdGgpO1xuXG4gICAgICAvLyBVcGRhdGUgYm91bmRlZCBjb250ZW50IGhhc2ggaW5kZXhcbiAgICAgIHRoaXMuY29udGVudEhhc2hJbmRleC5zZXQoY29udGVudEhhc2gsIGZ1bGxQYXRoKTtcbiAgICAgIHRoaXMuY29udGVudEhhc2hCeVBhdGguc2V0KGZ1bGxQYXRoLCBjb250ZW50SGFzaCk7XG5cbiAgICAgIC8vIExvZyBzdWNjZXNzZnVsIHNhdmVcbiAgICAgIGNvbnN0IHN0YXRzID0gZWxlbWVudC5nZXRTdGF0cygpO1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TQVZFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgU2F2ZWQgbWVtb3J5IHRvICR7cGF0aC5iYXNlbmFtZShmdWxsUGF0aCl9IHdpdGggJHtzdGF0cy50b3RhbEVudHJpZXN9IGVudHJpZXNgXG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX1NBVkVfRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnNhdmUnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIHNhdmUgbWVtb3J5IHRvICR7ZmlsZVBhdGh9OiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2F2ZSBtZW1vcnk6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBIYW5kbGUgbWVtb3J5IGxvYWQgZmFpbHVyZVxuICAgKiBGSVggKFNvbmFyQ2xvdWQpOiBFeHRyYWN0IGR1cGxpY2F0ZWQgZXJyb3IgaGFuZGxpbmcgdG8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlTG9hZEZhaWx1cmUoXG4gICAgZmlsZTogc3RyaW5nLFxuICAgIGVycm9yOiB1bmtub3duLFxuICAgIGZhaWxlZExvYWRzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBlcnJvck1zZyA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICBmYWlsZWRMb2Fkcy5wdXNoKHsgZmlsZSwgZXJyb3I6IGVycm9yTXNnIH0pO1xuICAgIC8vIE9ubHkgbG9nIHNlY3VyaXR5IGV2ZW50IGlmIGxvYWQoKSBkaWRuJ3Qgc3VwcHJlc3MgdGhpcyBhcyBhIHJlcGVhdFxuICAgIGlmICghdGhpcy5pc0xvYWRFcnJvclN1cHByZXNzZWQoZmlsZSkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfTElTVF9JVEVNX0ZBSUxFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxpc3QnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGxvYWQgJHtmaWxlfTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBhbGwgYXZhaWxhYmxlIG1lbW9yaWVzIGZyb20gYWxsIGxvY2F0aW9ucy5cbiAgICogUGhhc2UgMjogRGVsZWdhdGVzIG11bHRpLWRpcmVjdG9yeSBzY2FubmluZyB0byBNZW1vcnlTdG9yYWdlTGF5ZXIuXG4gICAqIFN0b3JhZ2UgbGF5ZXIgaGFuZGxlczogc3lzdGVtLywgYWRhcHRlcnMvLCBkYXRlIGZvbGRlcnMsIHJvb3QsIGJhY2t1cCBmaWx0ZXJpbmcsIGNvb2xkb3duLlxuICAgKlxuICAgKiBJc3N1ZSAjMTggUGhhc2UgNDogQXBwbHkgYWN0aXZlIHN0YXR1cyB0byBtZW1vcmllcyB0aGF0IGFyZSBpbiB0aGUgYWN0aXZlIHNldC5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxNZW1vcnlbXT4ge1xuICAgIGNvbnN0IGZhaWxlZExvYWRzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PiA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KHRoaXMubWVtb3JpZXNEaXIpO1xuXG4gICAgICAvLyBTdG9yYWdlIGxheWVyIGhhbmRsZXMgbXVsdGktZGlyZWN0b3J5IHNjYW4gKyBjb29sZG93blxuICAgICAgY29uc3QgaW5kZXhlZFBhdGhzID0gYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIuZ2V0SW5kZXhlZFBhdGhzKCk7XG5cbiAgICAgIC8vIExvYWQgdGhyb3VnaCBMUlUgY2FjaGVcbiAgICAgIGNvbnN0IG1lbW9yaWVzOiBNZW1vcnlbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCByZWxhdGl2ZVBhdGggb2YgaW5kZXhlZFBhdGhzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbWVtb3J5ID0gYXdhaXQgdGhpcy5sb2FkKHJlbGF0aXZlUGF0aCk7XG4gICAgICAgICAgLy8gRW5zdXJlIG1lbW9yeVR5cGUgaXMgc2V0IGJhc2VkIG9uIGxvY2F0aW9uXG4gICAgICAgICAgY29uc3QgbWVtb3J5TWV0YSA9IG1lbW9yeS5tZXRhZGF0YSBhcyBNZW1vcnlNZXRhZGF0YTtcbiAgICAgICAgICBpZiAoIW1lbW9yeU1ldGEubWVtb3J5VHlwZSkge1xuICAgICAgICAgICAgbWVtb3J5TWV0YS5tZW1vcnlUeXBlID0gTWVtb3J5TWV0YWRhdGFFeHRyYWN0b3IuaW5mZXJNZW1vcnlUeXBlKHJlbGF0aXZlUGF0aCkgYXMgTWVtb3J5VHlwZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVtb3JpZXMucHVzaChtZW1vcnkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMuaGFuZGxlTG9hZEZhaWx1cmUocmVsYXRpdmVQYXRoLCBlcnJvciwgZmFpbGVkTG9hZHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmYWlsZWRMb2Fkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbTWVtb3J5TWFuYWdlcl0gRmFpbGVkIHRvIGxvYWQgJHtmYWlsZWRMb2Fkcy5sZW5ndGh9IG1lbW9yaWVzOmAsXG4gICAgICAgICAgZmFpbGVkTG9hZHMubWFwKGYgPT4gYCAgLSAke2YuZmlsZX06ICR7Zi5lcnJvcn1gKS5qb2luKCdcXG4nKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlZHVwbGljYXRlIGJ5IGZpbGUgcGF0aCAocHJlc2VydmVzIGV4aXN0aW5nIGJlaGF2aW9yKVxuICAgICAgY29uc3QgdW5pcXVlTWVtb3JpZXMgPSBuZXcgTWFwPHN0cmluZywgTWVtb3J5PigpO1xuICAgICAgZm9yIChjb25zdCBtZW1vcnkgb2YgbWVtb3JpZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBtZW1vcnkuZ2V0RmlsZVBhdGgoKTtcbiAgICAgICAgaWYgKGZpbGVQYXRoICYmICF1bmlxdWVNZW1vcmllcy5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgdW5pcXVlTWVtb3JpZXMuc2V0KGZpbGVQYXRoLCBtZW1vcnkpO1xuICAgICAgICB9IGVsc2UgaWYgKCFmaWxlUGF0aCkge1xuICAgICAgICAgIHVuaXF1ZU1lbW9yaWVzLnNldChgbm8tcGF0aC0ke21lbW9yeS5tZXRhZGF0YS5uYW1lfS0ke0RhdGUubm93KCl9YCwgbWVtb3J5KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRNZW1vcmllcyA9IEFycmF5LmZyb20odW5pcXVlTWVtb3JpZXMudmFsdWVzKCkpO1xuXG4gICAgICAvLyBJc3N1ZSAjMTggUGhhc2UgNDogQXBwbHkgYWN0aXZlIHN0YXR1cyB0byBtZW1vcmllcyBpbiB0aGUgYWN0aXZlIHNldFxuICAgICAgZm9yIChjb25zdCBtZW1vcnkgb2YgcmVzdWx0TWVtb3JpZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuaGFzKG1lbW9yeS5tZXRhZGF0YS5uYW1lKSkge1xuICAgICAgICAgIGF3YWl0IG1lbW9yeS5hY3RpdmF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHRNZW1vcmllcztcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFjdGl2YXRlIGEgbWVtb3J5IGJ5IG5hbWUgb3IgaWRlbnRpZmllclxuICAgKiBJc3N1ZSAjMTggUGhhc2UgNDogQ29udGV4dC1sb2FkaW5nIGFjdGl2YXRpb24gc3RyYXRlZ3lcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBDbGVhbnVwIHRyaWdnZXIgZm9yIG1lbW9yeSBsZWFrIHByZXZlbnRpb25cbiAgICovXG4gIGFzeW5jIGFjdGl2YXRlTWVtb3J5KGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBtZXNzYWdlOiBzdHJpbmc7IG1lbW9yeT86IE1lbW9yeSB9PiB7XG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgbWVtb3J5ID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFtZW1vcnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLk1FTU9SWSwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gTUVNT1JZIExFQUsgRklYOiBDaGVjayBpZiBjbGVhbnVwIGlzIG5lZWRlZCBiZWZvcmUgYWRkaW5nXG4gICAgdGhpcy5jaGVja0FuZENsZWFudXBBY3RpdmVTZXQoKTtcblxuICAgIC8vIEFkZCB0byBhY3RpdmUgc2V0IChieSBuYW1lLCB3aGljaCBpcyBzdGFibGUgYWNyb3NzIHJlbG9hZHMpXG4gICAgdGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5hZGQobWVtb3J5Lm1ldGFkYXRhLm5hbWUpO1xuXG4gICAgLy8gVXBkYXRlIG1lbW9yeSBzdGF0dXMgaW4gbWVtb3J5XG4gICAgYXdhaXQgbWVtb3J5LmFjdGl2YXRlKCk7XG5cbiAgICAvLyBSb3V0aW5lIGFjdGl2YXRpb24g4oCUIGRlYnVnIG9ubHkgKHdhcyBmbG9vZGluZyBzZWN1cml0eSBidWZmZXIpXG4gICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5TWFuYWdlcl0gTWVtb3J5IGFjdGl2YXRlZDogJHttZW1vcnkubWV0YWRhdGEubmFtZX1gKTtcblxuICAgIGxvZ2dlci5pbmZvKGBNZW1vcnkgYWN0aXZhdGVkOiAke21lbW9yeS5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmFjdGl2YXRlZChFbGVtZW50VHlwZS5NRU1PUlksIG1lbW9yeS5tZXRhZGF0YS5uYW1lKSxcbiAgICAgIG1lbW9yeVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVhY3RpdmF0ZSBhIG1lbW9yeSBieSBuYW1lIG9yIGlkZW50aWZpZXJcbiAgICogSXNzdWUgIzE4IFBoYXNlIDQ6IFJlbW92ZSBmcm9tIGFjdGl2ZSBzZXRcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdXNpbmcgZmluZEJ5TmFtZSgpXG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogQ29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB1c2luZyBFbGVtZW50TWVzc2FnZXNcbiAgICovXG4gIGFzeW5jIGRlYWN0aXZhdGVNZW1vcnkoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgLy8gUEVSRk9STUFOQ0UgRklYOiBVc2UgZmluZEJ5TmFtZSgpIGluc3RlYWQgb2YgbGlzdCgpXG4gICAgY29uc3QgbWVtb3J5ID0gYXdhaXQgdGhpcy5maW5kQnlOYW1lKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKCFtZW1vcnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgZXJyb3IgbWVzc2FnZSBmb3JtYXRcbiAgICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLm5vdEZvdW5kKEVsZW1lbnRUeXBlLk1FTU9SWSwgaWRlbnRpZmllcilcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGZyb20gYWN0aXZlIHNldFxuICAgIHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuZGVsZXRlKG1lbW9yeS5tZXRhZGF0YS5uYW1lKTtcblxuICAgIC8vIFVwZGF0ZSBtZW1vcnkgc3RhdHVzIGluIG1lbW9yeVxuICAgIGF3YWl0IG1lbW9yeS5kZWFjdGl2YXRlKCk7XG5cbiAgICBsb2dnZXIuaW5mbyhgTWVtb3J5IGRlYWN0aXZhdGVkOiAke21lbW9yeS5tZXRhZGF0YS5uYW1lfWApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAvLyBDT05TSVNURU5DWSBGSVg6IFVzZSBzdGFuZGFyZGl6ZWQgc3VjY2VzcyBtZXNzYWdlIGZvcm1hdFxuICAgICAgbWVzc2FnZTogRWxlbWVudE1lc3NhZ2VzLmRlYWN0aXZhdGVkKEVsZW1lbnRUeXBlLk1FTU9SWSwgbWVtb3J5Lm1ldGFkYXRhLm5hbWUpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGFjdGl2ZSBtZW1vcmllc1xuICAgKiBJc3N1ZSAjMTggUGhhc2UgNDogUmV0dXJuIG1lbW9yaWVzIHRoYXQgYXJlIGluIHRoZSBhY3RpdmUgc2V0XG4gICAqL1xuICBhc3luYyBnZXRBY3RpdmVNZW1vcmllcygpOiBQcm9taXNlPE1lbW9yeVtdPiB7XG4gICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gbWVtb3JpZXMuZmlsdGVyKG0gPT4gdGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5oYXMobS5tZXRhZGF0YS5uYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzM5OiBTY2FuIGFsbCBtZW1vcmllcyBhbmQgcmVwYWlyIGNvcnJ1cHRlZCBiYWNrdXAgbmFtZXNcbiAgICogVGhpcyBtZXRob2QgbG9hZHMgYWxsIG1lbW9yaWVzLCBjaGVja3MgZm9yIGNvcnJ1cHRlZCBuYW1lcywgcmVwYWlycyB0aGVtLFxuICAgKiBhbmQgc2F2ZXMgdGhlIGNvcnJlY3RlZCBmaWxlcyBiYWNrIHRvIGRpc2suXG4gICAqXG4gICAqIEBwYXJhbSBvblByb2dyZXNzIE9wdGlvbmFsIGNhbGxiYWNrIGZvciBwcm9ncmVzcyB1cGRhdGVzIGR1cmluZyBsb25nIG9wZXJhdGlvbnNcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggcmVwYWlyIHN0YXRpc3RpY3MgYW5kIGxpc3Qgb2YgcmVwYWlyZWQgbWVtb3JpZXNcbiAgICovXG4gIGFzeW5jIHJlcGFpckNvcnJ1cHRlZE5hbWVzKFxuICAgIG9uUHJvZ3Jlc3M/OiAocHJvY2Vzc2VkOiBudW1iZXIsIHRvdGFsOiBudW1iZXIsIGN1cnJlbnQ/OiBzdHJpbmcpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx7XG4gICAgc2Nhbm5lZDogbnVtYmVyO1xuICAgIHJlcGFpcmVkOiBudW1iZXI7XG4gICAgZXJyb3JzOiBudW1iZXI7XG4gICAgcmVwYWlyZWRNZW1vcmllczogQXJyYXk8eyBvcmlnaW5hbDogc3RyaW5nOyByZXBhaXJlZDogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfT47XG4gICAgZXJyb3JEZXRhaWxzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PjtcbiAgfT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHNjYW5uZWQ6IDAsXG4gICAgICByZXBhaXJlZDogMCxcbiAgICAgIGVycm9yczogMCxcbiAgICAgIHJlcGFpcmVkTWVtb3JpZXM6IFtdIGFzIEFycmF5PHsgb3JpZ2luYWw6IHN0cmluZzsgcmVwYWlyZWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nIH0+LFxuICAgICAgZXJyb3JEZXRhaWxzOiBbXSBhcyBBcnJheTx7IG5hbWU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PlxuICAgIH07XG5cbiAgICBsb2dnZXIuaW5mbygnW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogU3RhcnRpbmcgY29ycnVwdGVkIG5hbWUgcmVwYWlyIHNjYW4uLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBGb3JjZSBmcmVzaCBzY2FuIOKAlCByZXBhaXIgbXVzdCBzZWUgY3VycmVudCBkaXNrIHN0YXRlLCBub3QgY2FjaGVkIGluZGV4XG4gICAgICB0aGlzLnN0b3JhZ2VMYXllci5pbnZhbGlkYXRlKCk7XG4gICAgICBjb25zdCBtZW1vcmllcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgcmVzdWx0LnNjYW5uZWQgPSBtZW1vcmllcy5sZW5ndGg7XG5cbiAgICAgIGxldCBwcm9jZXNzZWQgPSAwO1xuICAgICAgZm9yIChjb25zdCBtZW1vcnkgb2YgbWVtb3JpZXMpIHtcbiAgICAgICAgY29uc3QgY3VycmVudE5hbWUgPSBtZW1vcnkubWV0YWRhdGEubmFtZTtcbiAgICAgICAgcHJvY2Vzc2VkKys7XG5cbiAgICAgICAgLy8gUmVwb3J0IHByb2dyZXNzXG4gICAgICAgIGlmIChvblByb2dyZXNzKSB7XG4gICAgICAgICAgb25Qcm9ncmVzcyhwcm9jZXNzZWQsIG1lbW9yaWVzLmxlbmd0aCwgY3VycmVudE5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQ29ycnVwdGVkQmFja3VwTmFtZShjdXJyZW50TmFtZSkpIHtcbiAgICAgICAgICBjb25zdCByZXBhaXJlZE5hbWUgPSBleHRyYWN0T3JpZ2luYWxOYW1lKGN1cnJlbnROYW1lKTtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IG1lbW9yeS5nZXRGaWxlUGF0aCgpIHx8ICd1bmtub3duJztcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG5hbWVcbiAgICAgICAgICAgIG1lbW9yeS5tZXRhZGF0YS5uYW1lID0gcmVwYWlyZWROYW1lO1xuXG4gICAgICAgICAgICAvLyBTYXZlIHRoZSByZXBhaXJlZCBtZW1vcnlcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2F2ZShtZW1vcnkpO1xuXG4gICAgICAgICAgICByZXN1bHQucmVwYWlyZWQrKztcbiAgICAgICAgICAgIHJlc3VsdC5yZXBhaXJlZE1lbW9yaWVzLnB1c2goe1xuICAgICAgICAgICAgICBvcmlnaW5hbDogY3VycmVudE5hbWUsXG4gICAgICAgICAgICAgIHJlcGFpcmVkOiByZXBhaXJlZE5hbWUsXG4gICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgIGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiBSZXBhaXJlZCAnJHtjdXJyZW50TmFtZX0nIC0+ICcke3JlcGFpcmVkTmFtZX0nIGF0ICR7ZmlsZVBhdGh9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmVzdWx0LmVycm9ycysrO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yRGV0YWlscy5wdXNoKHtcbiAgICAgICAgICAgICAgbmFtZTogY3VycmVudE5hbWUsXG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiBGYWlsZWQgdG8gcmVwYWlyICcke2N1cnJlbnROYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IFJlcGFpciBzY2FuIGNvbXBsZXRlLiBgICtcbiAgICAgICAgYFNjYW5uZWQ6ICR7cmVzdWx0LnNjYW5uZWR9LCBSZXBhaXJlZDogJHtyZXN1bHQucmVwYWlyZWR9LCBFcnJvcnM6ICR7cmVzdWx0LmVycm9yc31gXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0LnJlcGFpcmVkID4gMCkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfU0FWRUQsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIucmVwYWlyQ29ycnVwdGVkTmFtZXMnLFxuICAgICAgICAgIGRldGFpbHM6IGBJc3N1ZSAjMzk6IFJlcGFpcmVkICR7cmVzdWx0LnJlcGFpcmVkfSBjb3JydXB0ZWQgbWVtb3J5IG5hbWVzYCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgc2Nhbm5lZDogcmVzdWx0LnNjYW5uZWQsXG4gICAgICAgICAgICByZXBhaXJlZDogcmVzdWx0LnJlcGFpcmVkLFxuICAgICAgICAgICAgZXJyb3JzOiByZXN1bHQuZXJyb3JzXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbTWVtb3J5TWFuYWdlcl0gSXNzdWUgIzM5OiBSZXBhaXIgc2NhbiBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICMzOTogQ2xlYW4gdXAgZXhjZXNzaXZlIGJhY2t1cCBmaWxlcyBpbiBhIGRpcmVjdG9yeVxuICAgKiBSZW1vdmVzIHZlcnNpb25lZCBiYWNrdXAgZmlsZXMgKGUuZy4sIG5hbWUuYmFja3VwLS4uLi12Mi55YW1sLCAtdjMueWFtbCwgZXRjLilcbiAgICoga2VlcGluZyBvbmx5IHRoZSBtb3N0IHJlY2VudCBiYWNrdXAgKHdpdGhvdXQgdmVyc2lvbiBzdWZmaXgpXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXREaXIgRGlyZWN0b3J5IHRvIGNsZWFuIHVwIChkZWZhdWx0cyB0byBzeXN0ZW0vIGZvbGRlcilcbiAgICogQHBhcmFtIGRyeVJ1biBJZiB0cnVlLCBvbmx5IHJlcG9ydHMgd2hhdCB3b3VsZCBiZSBkZWxldGVkIHdpdGhvdXQgYWN0dWFsbHkgZGVsZXRpbmdcbiAgICogQHBhcmFtIG9uUHJvZ3Jlc3MgT3B0aW9uYWwgY2FsbGJhY2sgZm9yIHByb2dyZXNzIHVwZGF0ZXMgZHVyaW5nIGxvbmcgb3BlcmF0aW9uc1xuICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBjbGVhbnVwIHN0YXRpc3RpY3NcbiAgICovXG4gIGFzeW5jIGNsZWFudXBFeGNlc3NpdmVCYWNrdXBzKFxuICAgIHRhcmdldERpcj86IHN0cmluZyxcbiAgICBkcnlSdW46IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBvblByb2dyZXNzPzogKHByb2Nlc3NlZDogbnVtYmVyLCB0b3RhbDogbnVtYmVyLCBjdXJyZW50Pzogc3RyaW5nKSA9PiB2b2lkXG4gICk6IFByb21pc2U8e1xuICAgIHNjYW5uZWQ6IG51bWJlcjtcbiAgICBkZWxldGVkOiBudW1iZXI7XG4gICAgZXJyb3JzOiBudW1iZXI7XG4gICAgZGVsZXRlZEZpbGVzOiBzdHJpbmdbXTtcbiAgICBrZXB0RmlsZXM6IHN0cmluZ1tdO1xuICAgIGVycm9yRGV0YWlsczogQXJyYXk8eyBmaWxlOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT47XG4gIH0+IHtcbiAgICBjb25zdCBkaXIgPSB0YXJnZXREaXIgfHwgcGF0aC5qb2luKHRoaXMubWVtb3JpZXNEaXIsICdzeXN0ZW0nKTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBzY2FubmVkOiAwLFxuICAgICAgZGVsZXRlZDogMCxcbiAgICAgIGVycm9yczogMCxcbiAgICAgIGRlbGV0ZWRGaWxlczogW10gYXMgc3RyaW5nW10sXG4gICAgICBrZXB0RmlsZXM6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgZXJyb3JEZXRhaWxzOiBbXSBhcyBBcnJheTx7IGZpbGU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PlxuICAgIH07XG5cbiAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogU3RhcnRpbmcgYmFja3VwIGNsZWFudXAgaW4gJHtkaXJ9JHtkcnlSdW4gPyAnIChEUlkgUlVOKScgOiAnJ30uLi5gKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShkaXIpO1xuICAgICAgcmVzdWx0LnNjYW5uZWQgPSBmaWxlcy5sZW5ndGg7XG5cbiAgICAgIC8vIEdyb3VwIGJhY2t1cCBmaWxlcyBieSBiYXNlIG5hbWVcbiAgICAgIGNvbnN0IGJhY2t1cEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIC8vIE1hdGNoIHZlcnNpb25lZCBiYWNrdXAgZmlsZXM6IG5hbWUuYmFja3VwLVlZWVktTU0tREQtSEgtbW0tc3MtU1NTLXZOLnlhbWxcbiAgICAgICAgY29uc3QgdmVyc2lvbmVkTWF0Y2ggPSBmaWxlLm1hdGNoKC9eKC4rXFwuYmFja3VwLVxcZHs0fS1cXGR7Mn0tXFxkezJ9LVxcZHsyfS1cXGR7Mn0tXFxkezJ9LVxcZHszfSktdihcXGQrKVxcLnlhbWwkLyk7XG4gICAgICAgIGlmICh2ZXJzaW9uZWRNYXRjaCkge1xuICAgICAgICAgIGNvbnN0IGJhc2VOYW1lID0gdmVyc2lvbmVkTWF0Y2hbMV07XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBiYWNrdXBHcm91cHMuZ2V0KGJhc2VOYW1lKSB8fCBbXTtcbiAgICAgICAgICBleGlzdGluZy5wdXNoKGZpbGUpO1xuICAgICAgICAgIGJhY2t1cEdyb3Vwcy5zZXQoYmFzZU5hbWUsIGV4aXN0aW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgYWxsIHZlcnNpb25lZCBiYWNrdXAgZmlsZXNcbiAgICAgIGxldCBwcm9jZXNzZWQgPSAwO1xuICAgICAgY29uc3QgdG90YWxWZXJzaW9uZWRGaWxlcyA9IEFycmF5LmZyb20oYmFja3VwR3JvdXBzLnZhbHVlcygpKS5yZWR1Y2UoKHN1bSwgZmlsZXMpID0+IHN1bSArIGZpbGVzLmxlbmd0aCwgMCk7XG5cbiAgICAgIGZvciAoY29uc3QgW2Jhc2VOYW1lLCB2ZXJzaW9uZWRGaWxlc10gb2YgYmFja3VwR3JvdXBzKSB7XG4gICAgICAgIC8vIEtlZXAgdGhlIGJhc2UgYmFja3VwIGZpbGUgKHdpdGhvdXQgLXZOKSwgZGVsZXRlIGFsbCB2ZXJzaW9uZWQgb25lc1xuICAgICAgICBjb25zdCBiYXNlQmFja3VwRmlsZSA9IGAke2Jhc2VOYW1lfS55YW1sYDtcbiAgICAgICAgaWYgKGZpbGVzLmluY2x1ZGVzKGJhc2VCYWNrdXBGaWxlKSkge1xuICAgICAgICAgIHJlc3VsdC5rZXB0RmlsZXMucHVzaChiYXNlQmFja3VwRmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHZlcnNpb25lZEZpbGUgb2YgdmVyc2lvbmVkRmlsZXMpIHtcbiAgICAgICAgICBwcm9jZXNzZWQrKztcblxuICAgICAgICAgIC8vIFJlcG9ydCBwcm9ncmVzc1xuICAgICAgICAgIGlmIChvblByb2dyZXNzKSB7XG4gICAgICAgICAgICBvblByb2dyZXNzKHByb2Nlc3NlZCwgdG90YWxWZXJzaW9uZWRGaWxlcywgdmVyc2lvbmVkRmlsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oZGlyLCB2ZXJzaW9uZWRGaWxlKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFkcnlSdW4pIHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKGZ1bGxQYXRoLCBFbGVtZW50VHlwZS5NRU1PUlksIHtcbiAgICAgICAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmNsZWFudXBFeGNlc3NpdmVCYWNrdXBzJ1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5kZWxldGVkKys7XG4gICAgICAgICAgICByZXN1bHQuZGVsZXRlZEZpbGVzLnB1c2godmVyc2lvbmVkRmlsZSk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6ICR7ZHJ5UnVuID8gJ1dvdWxkIGRlbGV0ZScgOiAnRGVsZXRlZCd9ICR7dmVyc2lvbmVkRmlsZX1gKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmVzdWx0LmVycm9ycysrO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yRGV0YWlscy5wdXNoKHtcbiAgICAgICAgICAgICAgZmlsZTogdmVyc2lvbmVkRmlsZSxcbiAgICAgICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFtNZW1vcnlNYW5hZ2VyXSBJc3N1ZSAjMzk6IEZhaWxlZCB0byBkZWxldGUgJHt2ZXJzaW9uZWRGaWxlfTpgLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogQmFja3VwIGNsZWFudXAgY29tcGxldGUke2RyeVJ1biA/ICcgKERSWSBSVU4pJyA6ICcnfS4gYCArXG4gICAgICAgIGBTY2FubmVkOiAke3Jlc3VsdC5zY2FubmVkfSwgJHtkcnlSdW4gPyAnV291bGQgZGVsZXRlJyA6ICdEZWxldGVkJ306ICR7cmVzdWx0LmRlbGV0ZWR9LCBFcnJvcnM6ICR7cmVzdWx0LmVycm9yc31gXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0LmRlbGV0ZWQgPiAwICYmICFkcnlSdW4pIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0NMRUFSRUQsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuY2xlYW51cEV4Y2Vzc2l2ZUJhY2t1cHMnLFxuICAgICAgICAgIGRldGFpbHM6IGBJc3N1ZSAjMzk6IENsZWFuZWQgdXAgJHtyZXN1bHQuZGVsZXRlZH0gZXhjZXNzaXZlIGJhY2t1cCBmaWxlc2AsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIGRpcmVjdG9yeTogZGlyLFxuICAgICAgICAgICAgc2Nhbm5lZDogcmVzdWx0LnNjYW5uZWQsXG4gICAgICAgICAgICBkZWxldGVkOiByZXN1bHQuZGVsZXRlZCxcbiAgICAgICAgICAgIGVycm9yczogcmVzdWx0LmVycm9yc1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW01lbW9yeU1hbmFnZXJdIElzc3VlICMzOTogQmFja3VwIGNsZWFudXAgZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhY3RpdmUgc2V0IGNsZWFudXAgaXMgbmVlZGVkIGFuZCBwZXJmb3JtIGNsZWFudXAgaWYgbmVjZXNzYXJ5XG4gICAqIElzc3VlICMyNCAoTE9XIFBSSU9SSVRZKTogTWVtb3J5IGxlYWsgcHJldmVudGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0FuZENsZWFudXBBY3RpdmVTZXQoKTogdm9pZCB7XG4gICAgY29uc3QgeyBtYXgsIGNsZWFudXBUaHJlc2hvbGQgfSA9IGdldEFjdGl2ZUVsZW1lbnRMaW1pdENvbmZpZygnbWVtb3JpZXMnKTtcblxuICAgIC8vIEJlbG93IHRocmVzaG9sZCDigJQgbm8gYWN0aW9uIG5lZWRlZFxuICAgIGlmICh0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLnNpemUgPCBjbGVhbnVwVGhyZXNob2xkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQXQgb3IgYWJvdmUgbWF4IOKAlCB3YXJuIGJlZm9yZSBjbGVhbnVwXG4gICAgaWYgKHRoaXMuYWN0aXZlTWVtb3J5TmFtZXMuc2l6ZSA+PSBtYXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgQWN0aXZlIG1lbW9yaWVzIGxpbWl0IHJlYWNoZWQgKCR7bWF4fSkuIGAgK1xuICAgICAgICBgQ29uc2lkZXIgZGVhY3RpdmF0aW5nIHVudXNlZCBtZW1vcmllcyBvciBzZXR0aW5nIERPTExIT1VTRV9NQVhfQUNUSVZFX01FTU9SSUVTIHRvIGEgaGlnaGVyIHZhbHVlLmBcbiAgICAgICk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ01FTU9SWV9MT0FERUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuY2hlY2tBbmRDbGVhbnVwQWN0aXZlU2V0JyxcbiAgICAgICAgZGV0YWlsczogYEFjdGl2ZSBtZW1vcmllcyBsaW1pdCByZWFjaGVkOiAke3RoaXMuYWN0aXZlTWVtb3J5TmFtZXMuc2l6ZX0vJHttYXh9YFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXQgb3IgYWJvdmUgdGhyZXNob2xkIOKAlCBwcm9hY3RpdmVseSBjbGVhbiBzdGFsZSBlbnRyaWVzXG4gICAgdm9pZCB0aGlzLmNsZWFudXBTdGFsZUFjdGl2ZU1lbW9yaWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgc3RhbGUgZW50cmllcyBmcm9tIGFjdGl2ZSBtZW1vcmllcyBzZXRcbiAgICogSXNzdWUgIzI0IChMT1cgUFJJT1JJVFkpOiBNZW1vcnkgbGVhayBwcmV2ZW50aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNsZWFudXBTdGFsZUFjdGl2ZU1lbW9yaWVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydFNpemUgPSB0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLnNpemU7XG4gICAgICBjb25zdCBtZW1vcmllcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgICAgY29uc3QgZXhpc3RpbmdNZW1vcnlOYW1lcyA9IG5ldyBTZXQobWVtb3JpZXMubWFwKG0gPT4gbS5tZXRhZGF0YS5uYW1lKSk7XG5cbiAgICAgIGNvbnN0IHN0YWxlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGFjdGl2ZU5hbWUgb2YgdGhpcy5hY3RpdmVNZW1vcnlOYW1lcykge1xuICAgICAgICBpZiAoIWV4aXN0aW5nTWVtb3J5TmFtZXMuaGFzKGFjdGl2ZU5hbWUpKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVNZW1vcnlOYW1lcy5kZWxldGUoYWN0aXZlTmFtZSk7XG4gICAgICAgICAgc3RhbGVOYW1lcy5wdXNoKGFjdGl2ZU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVuZFNpemUgPSB0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLnNpemU7XG4gICAgICBjb25zdCByZW1vdmVkID0gc3RhcnRTaXplIC0gZW5kU2l6ZTtcblxuICAgICAgaWYgKHJlbW92ZWQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBDbGVhbmVkIHVwICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIG1lbW9yeSByZWZlcmVuY2UocykuIGAgK1xuICAgICAgICAgIGBBY3RpdmUgbWVtb3JpZXM6ICR7ZW5kU2l6ZX0vJHtnZXRNYXhBY3RpdmVMaW1pdCgnbWVtb3JpZXMnKX1gXG4gICAgICAgICk7XG5cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdNRU1PUllfREVMRVRFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuY2xlYW51cFN0YWxlQWN0aXZlTWVtb3JpZXMnLFxuICAgICAgICAgIGRldGFpbHM6IGBSZW1vdmVkICR7cmVtb3ZlZH0gc3RhbGUgYWN0aXZlIG1lbW9yeSByZWZlcmVuY2VzYCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50OiByZW1vdmVkLFxuICAgICAgICAgICAgYWN0aXZlQ291bnQ6IGVuZFNpemUsXG4gICAgICAgICAgICBzdGFsZU5hbWVzOiBzdGFsZU5hbWVzLmpvaW4oJywgJylcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjbGVhbnVwIHN0YWxlIGFjdGl2ZSBtZW1vcmllczonLCBlcnJvcik7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ01FTU9SWV9ERUxFVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmNsZWFudXBTdGFsZUFjdGl2ZU1lbW9yaWVzJyxcbiAgICAgICAgZGV0YWlsczogYENsZWFudXAgZmFpbGVkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayByb290IGZpbGVzIGZvciBsb2FkIGZhaWx1cmVzXG4gICAqIEZJWCAoU29uYXJDbG91ZCBTMzc3Nik6IEV4dHJhY3QgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrUm9vdEZpbGVzKFxuICAgIGZhaWx1cmVzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHJvb3RGaWxlcyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeSh0aGlzLm1lbW9yaWVzRGlyKVxuICAgICAgLnRoZW4oZmlsZXMgPT4gZmlsZXMuZmlsdGVyKGYgPT4gZi5lbmRzV2l0aCgnLnlhbWwnKSkpXG4gICAgICAuY2F0Y2goKCkgPT4gW10pO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHJvb3RGaWxlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkKGZpbGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goeyBmaWxlLCBlcnJvcjogZXJyb3JNc2cgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvb3RGaWxlcy5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZGF0ZSBmb2xkZXIgZmlsZXMgZm9yIGxvYWQgZmFpbHVyZXNcbiAgICogRklYIChTb25hckNsb3VkIFMzNzc2KTogRXh0cmFjdCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tEYXRlRm9sZGVyRmlsZXMoXG4gICAgZGF0ZUZvbGRlcjogc3RyaW5nLFxuICAgIGZhaWx1cmVzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PlxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5saXN0RGlyZWN0b3J5KHBhdGguam9pbih0aGlzLm1lbW9yaWVzRGlyLCBkYXRlRm9sZGVyKSlcbiAgICAgIC50aGVuKGZpbGVzID0+IGZpbGVzLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy55YW1sJykpKVxuICAgICAgLmNhdGNoKCgpID0+IFtdKTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkKHBhdGguam9pbihkYXRlRm9sZGVyLCBmaWxlKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1zZyA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgZmFpbHVyZXMucHVzaCh7IGZpbGU6IGAke2RhdGVGb2xkZXJ9LyR7ZmlsZX1gLCBlcnJvcjogZXJyb3JNc2cgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbGVzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBhYm91dCBtZW1vcnkgbG9hZGluZyBzdGF0dXNcbiAgICogRklYICgjMTIwNik6IE5ldyBtZXRob2QgdG8gZXhwb3NlIGZhaWxlZCBsb2FkcyB0byB1c2Vyc1xuICAgKi9cbiAgYXN5bmMgZ2V0TG9hZFN0YXR1cygpOiBQcm9taXNlPHtcbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIGxvYWRlZDogbnVtYmVyO1xuICAgIGZhaWxlZDogbnVtYmVyO1xuICAgIGZhaWx1cmVzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PjtcbiAgfT4ge1xuICAgIGNvbnN0IGZhaWx1cmVzOiBBcnJheTx7IGZpbGU6IHN0cmluZzsgZXJyb3I6IHN0cmluZyB9PiA9IFtdO1xuICAgIGxldCB0b3RhbEZpbGVzID0gMDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRlRm9sZGVycyA9IGF3YWl0IHRoaXMuZ2V0RGF0ZUZvbGRlcnMoKTtcblxuICAgICAgLy8gQ2hlY2sgcm9vdCBmaWxlc1xuICAgICAgdG90YWxGaWxlcyArPSBhd2FpdCB0aGlzLmNoZWNrUm9vdEZpbGVzKGZhaWx1cmVzKTtcblxuICAgICAgLy8gQ2hlY2sgZGF0ZSBmb2xkZXJzXG4gICAgICBmb3IgKGNvbnN0IGRhdGVGb2xkZXIgb2YgZGF0ZUZvbGRlcnMpIHtcbiAgICAgICAgdG90YWxGaWxlcyArPSBhd2FpdCB0aGlzLmNoZWNrRGF0ZUZvbGRlckZpbGVzKGRhdGVGb2xkZXIsIGZhaWx1cmVzKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG90YWw6IHRvdGFsRmlsZXMsXG4gICAgICAgIGxvYWRlZDogdG90YWxGaWxlcyAtIGZhaWx1cmVzLmxlbmd0aCxcbiAgICAgICAgZmFpbGVkOiBmYWlsdXJlcy5sZW5ndGgsXG4gICAgICAgIGZhaWx1cmVzXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBnZXQgbG9hZCBzdGF0dXM6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZW1vcmllcyBtYXJrZWQgZm9yIGF1dG8tbG9hZGluZyBvbiBzZXJ2ZXIgaW5pdGlhbGl6YXRpb24uXG4gICAqIFBoYXNlIDI6IFF1ZXJpZXMgaW5kZXggZm9yIGF1dG9Mb2FkIGVudHJpZXMgaW5zdGVhZCBvZiBsb2FkaW5nIGFsbCBtZW1vcmllcy5cbiAgICogRHJvcHMgZnJvbSB+NzBzIHRvIDwzMG1zIGZvciB0eXBpY2FsIHBvcnRmb2xpb3Mgd2l0aCAxNGsgbWVtb3JpZXMuXG4gICAqIElzc3VlICMxNDMwOiBBdXRvLWxvYWQgYmFzZWxpbmUgbWVtb3JpZXMgZmVhdHVyZVxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBhcnJheSBvZiBhdXRvLWxvYWQgbWVtb3JpZXMgc29ydGVkIGJ5IHByaW9yaXR5XG4gICAqL1xuICBhc3luYyBnZXRBdXRvTG9hZE1lbW9yaWVzKCk6IFByb21pc2U8TWVtb3J5W10+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGluZGV4IGlzIHBvcHVsYXRlZFxuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlTGF5ZXIuc2NhbigpO1xuXG4gICAgICAvLyBQaGFzZSAyOiBRdWVyeSBpbmRleCBmb3IgYXV0b0xvYWQgZW50cmllcyDigJQgZG9lcyBOT1QgbG9hZCBhbGwgZmlsZXNcbiAgICAgIGNvbnN0IG1lbVN0b3JhZ2VMYXllciA9IHRoaXMuc3RvcmFnZUxheWVyIGFzIE1lbW9yeVN0b3JhZ2VMYXllcjtcbiAgICAgIGNvbnN0IGF1dG9Mb2FkRW50cmllcyA9IG1lbVN0b3JhZ2VMYXllci5nZXRBdXRvTG9hZEVudHJpZXMoKTtcblxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBnZXRBdXRvTG9hZE1lbW9yaWVzOiBGb3VuZCAke2F1dG9Mb2FkRW50cmllcy5sZW5ndGh9IGF1dG8tbG9hZCBlbnRyaWVzIGluIGluZGV4YCk7XG5cbiAgICAgIC8vIExvYWQgb25seSBtYXRjaGluZyBtZW1vcmllcyAodHlwaWNhbGx5IDMtNSlcbiAgICAgIGNvbnN0IGF1dG9Mb2FkTWVtb3JpZXM6IE1lbW9yeVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGF1dG9Mb2FkRW50cmllcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IHRoaXMubG9hZChlbnRyeS5maWxlUGF0aCk7XG4gICAgICAgICAgYXV0b0xvYWRNZW1vcmllcy5wdXNoKG1lbW9yeSk7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5TWFuYWdlcl0gICAtICR7ZW50cnkubmFtZX06IHByaW9yaXR5PSR7ZW50cnkucHJpb3JpdHkgPz8gOTk5fSAoTE9BREVEKWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbTWVtb3J5TWFuYWdlcl0gRmFpbGVkIHRvIGxvYWQgYXV0by1sb2FkIG1lbW9yeSAke2VudHJ5LmZpbGVQYXRofTogJHtlcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTb3J0IGJ5IHByaW9yaXR5IChhbHJlYWR5IHNvcnRlZCBmcm9tIGdldEF1dG9Mb2FkRW50cmllcywgYnV0IGVuc3VyZSBjb25zaXN0ZW5jeSlcbiAgICAgIGF1dG9Mb2FkTWVtb3JpZXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBwYSA9IChhLm1ldGFkYXRhIGFzIE1lbW9yeU1ldGFkYXRhKS5wcmlvcml0eSA/PyA5OTk7XG4gICAgICAgIGNvbnN0IHBiID0gKGIubWV0YWRhdGEgYXMgTWVtb3J5TWV0YWRhdGEpLnByaW9yaXR5ID8/IDk5OTtcbiAgICAgICAgcmV0dXJuIHBhIC0gcGI7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGF1dG9Mb2FkTWVtb3JpZXM7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW01lbW9yeU1hbmFnZXJdIEZhaWxlZCB0byBnZXQgYXV0by1sb2FkIG1lbW9yaWVzOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBzZWVkIG1lbW9yaWVzIGZyb20gdGhlIHNlZWQtZWxlbWVudHMgZGlyZWN0b3J5XG4gICAqIElzc3VlICMxNDMwOiBDb3B5IGJhc2VsaW5lIG1lbW9yeSB0byB1c2VyIHBvcnRmb2xpbyBvbiBmaXJzdCBydW5cbiAgICpcbiAgICogQ29waWVzIHNlZWQgZmlsZXMgZnJvbSBzcmMvc2VlZC1lbGVtZW50cy9tZW1vcmllcy8gdG8gdGhlIHVzZXIncyBwb3J0Zm9saW9cbiAgICogaWYgdGhleSBkb24ndCBhbHJlYWR5IGV4aXN0LiBUaGlzIGFsbG93cyB1c2VycyB0byBoYXZlIGJhc2VsaW5lIGtub3dsZWRnZVxuICAgKiBhdmFpbGFibGUgaW1tZWRpYXRlbHkgd2l0aG91dCBtYW51YWwgaW5zdGFsbGF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB3aGVuIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYXN5bmMgaW5zdGFsbFNlZWRNZW1vcmllcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuaW5mbygnW01lbW9yeU1hbmFnZXJdIPCfjLEgU3RhcnRpbmcgc2VlZCBtZW1vcnkgaW5zdGFsbGF0aW9uLi4uJyk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIERlZmluZSB0aGUgc2VlZCBmaWxlXG4gICAgICBjb25zdCBzZWVkRmlsZU5hbWUgPSAnZG9sbGhvdXNlbWNwLWJhc2VsaW5lLWtub3dsZWRnZS55YW1sJztcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIFN0ZXAgMTogVGFyZ2V0IHNlZWQgZmlsZTogJHtzZWVkRmlsZU5hbWV9YCk7XG5cbiAgICAgIC8vIENvbnN0cnVjdCBwYXRoc1xuICAgICAgLy8gV2hlbiBydW5uaW5nIGZyb20gZGlzdC9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLmpzOlxuICAgICAgLy8gICBHbyB1cCB0byBkaXN0LyB0aGVuIGludG8gc2VlZC1lbGVtZW50cy9tZW1vcmllcy9cbiAgICAgIC8vIFdoZW4gcnVubmluZyBmcm9tIHNyYy9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLnRzOlxuICAgICAgLy8gICBHbyB1cCB0byBzcmMvIHRoZW4gaW50byBzZWVkLWVsZW1lbnRzL21lbW9yaWVzL1xuICAgICAgLy8gRklYOiBVc2UgZmlsZVVSTFRvUGF0aCBmb3IgY3Jvc3MtcGxhdGZvcm0gV2luZG93cyBjb21wYXRpYmlsaXR5XG4gICAgICAvLyBPbiBXaW5kb3dzLCBVUkwucGF0aG5hbWUgcmV0dXJucyAvQzovVXNlcnMvLi4uIHdoaWNoIGlzIGludmFsaWRcbiAgICAgIC8vIGZpbGVVUkxUb1BhdGggY29ycmVjdGx5IGNvbnZlcnRzIGZpbGU6Ly8gVVJMcyB0byBuYXRpdmUgcGF0aHNcbiAgICAgIGNvbnN0IGN1cnJlbnRNb2R1bGVEaXIgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIFN0ZXAgMjogQ3VycmVudCBtb2R1bGUgZGlyZWN0b3J5OiAke2N1cnJlbnRNb2R1bGVEaXJ9YCk7XG5cbiAgICAgIC8vIFRyeSBkaXN0IGxvY2F0aW9uIGZpcnN0IChwcm9kdWN0aW9uL2J1aWx0IGNvZGUpXG4gICAgICBsZXQgc2VlZFNvdXJjZVBhdGggPSBwYXRoLnJlc29sdmUoY3VycmVudE1vZHVsZURpciwgJy4uLy4uL3NlZWQtZWxlbWVudHMvbWVtb3JpZXMnLCBzZWVkRmlsZU5hbWUpO1xuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDM6IFRyeWluZyBzZWVkIHBhdGggKGRpc3QpOiAke3NlZWRTb3VyY2VQYXRofWApO1xuXG4gICAgICAvLyBDaGVjayBpZiBpdCBleGlzdHMsIGlmIG5vdCB0cnkgc3JjIGxvY2F0aW9uIChkZXZlbG9wbWVudC90ZXN0KVxuICAgICAgaWYgKGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHNlZWRTb3VyY2VQYXRoKSkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBTdGVwIDQ6IEZvdW5kIHNlZWQgZmlsZSBpbiBkaXN0IGxvY2F0aW9uYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybihgW01lbW9yeU1hbmFnZXJdIOKaoO+4jyAgU3RlcCA0OiBTZWVkIGZpbGUgbm90IGluIGRpc3QgbG9jYXRpb24sIHRyeWluZyBzcmMuLi5gKTtcbiAgICAgICAgLy8gVHJ5IHNyYyBsb2NhdGlvblxuICAgICAgICBzZWVkU291cmNlUGF0aCA9IHBhdGgucmVzb2x2ZShjdXJyZW50TW9kdWxlRGlyLCAnLi4vLi4vLi4vc3JjL3NlZWQtZWxlbWVudHMvbWVtb3JpZXMnLCBzZWVkRmlsZU5hbWUpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIFN0ZXAgNGI6IFRyeWluZyBzZWVkIHBhdGggKHNyYyk6ICR7c2VlZFNvdXJjZVBhdGh9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBzZWVkIGZpbGUgZXhpc3RzXG4gICAgICBpZiAoIWF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHNlZWRTb3VyY2VQYXRoKSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNZW1vcnlNYW5hZ2VyXSDinYwgU3RlcCA1OiBTZWVkIGZpbGUgbm90IGZvdW5kIGF0ICR7c2VlZFNvdXJjZVBhdGh9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0g4pyFIFN0ZXAgNTogVmVyaWZpZWQgc2VlZCBmaWxlIGV4aXN0cyBhdDogJHtzZWVkU291cmNlUGF0aH1gKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB1c2VyIHBvcnRmb2xpb1xuICAgICAgLy8gSVNTVUUgIzU6IFNlZWQgZmlsZXMgYXJlIHN5c3RlbSBmaWxlcyAtIEFMV0FZUyB1c2UgbGF0ZXN0IHZlcnNpb25cbiAgICAgIC8vIEJhY2t1cCBleGlzdGluZyBpZiBpdCBoYXMgdXNlciBjb250ZW50LCB0aGVuIGluc3RhbGwgZnJlc2ggc2VlZFxuXG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIFN0ZXAgNjogQ2hlY2tpbmcgZm9yIGV4aXN0aW5nIHNlZWQgbWVtb3J5IGluIHBvcnRmb2xpby4uLmApO1xuICAgICAgbGV0IGV4aXN0aW5nTWVtb3J5OiBNZW1vcnkgfCB1bmRlZmluZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRyeSB0byBsb2FkIGV4aXN0aW5nIG1lbW9yeVxuICAgICAgICBleGlzdGluZ01lbW9yeSA9IGF3YWl0IHRoaXMubG9hZChzZWVkRmlsZU5hbWUpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBTdGVwIDc6IEZvdW5kIGV4aXN0aW5nIHNlZWQgbWVtb3J5ICcke3NlZWRGaWxlTmFtZX0nYCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUGF0aCA9IGV4aXN0aW5nTWVtb3J5LmdldEZpbGVQYXRoKCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gRXhpc3RpbmcgZmlsZSBsb2NhdGlvbjogJHtleGlzdGluZ1BhdGh9YCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTWVtb3J5IGRvZXNuJ3QgZXhpc3QgLSBwcm9jZWVkIHdpdGggZnJlc2ggaW5zdGFsbGF0aW9uXG4gICAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0g4oS577iPICBTdGVwIDc6IFNlZWQgbWVtb3J5ICcke3NlZWRGaWxlTmFtZX0nIG5vdCBmb3VuZCBpbiBwb3J0Zm9saW8sIHdpbGwgaW5zdGFsbCBmcmVzaGApO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBleGlzdGluZyBtZW1vcnkgZm91bmQsIGNoZWNrIGlmIHdlIG5lZWQgdG8gcmVpbnN0YWxsXG4gICAgICBpZiAoZXhpc3RpbmdNZW1vcnkpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDg6IEFuYWx5emluZyBleGlzdGluZyBzZWVkIG1lbW9yeSBjb250ZW50Li4uYCk7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBleGlzdGluZ01lbW9yeS5nZXRBbGxFbnRyaWVzKCk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIEZvdW5kICR7ZW50cmllcy5sZW5ndGh9IGVudHJpZXMgaW4gZXhpc3RpbmcgbWVtb3J5YCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgbWVtb3J5IGhhcyBtZWFuaW5nZnVsIGNvbnRlbnQgKG5vdCBqdXN0IFwiZW50cmllczogW11cIilcbiAgICAgICAgLy8gRW1wdHkgZmlsZXMgb2Z0ZW4gaGF2ZSBqdXN0IHRoZSBcImVudHJpZXM6IFtdXCIgWUFNTCBmaWVsZCBhcyBjb250ZW50XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gZW50cmllcy5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmIChoYXNDb250ZW50ICYmIGVudHJpZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RFbnRyeSA9IGVudHJpZXNbMF07XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGZpcnN0RW50cnkuY29udGVudD8udHJpbSgpIHx8ICcnO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIFNpbmdsZSBlbnRyeSBjb250ZW50IGxlbmd0aDogJHtjb250ZW50Lmxlbmd0aH0gY2hhcnNgKTtcbiAgICAgICAgICAvLyBJZiBvbmx5IGNvbnRlbnQgaXMgXCJlbnRyaWVzOiBbXVwiLCBjb25zaWRlciBpdCBlbXB0eVxuICAgICAgICAgIGlmIChjb250ZW50ID09PSAnZW50cmllczogW10nIHx8IGNvbnRlbnQgPT09ICcnKSB7XG4gICAgICAgICAgICBoYXNDb250ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIEVudHJ5IGFwcGVhcnMgZW1wdHkgKGVudHJpZXM6IFtdIG9yIGJsYW5rKWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNDb250ZW50KSB7XG4gICAgICAgICAgLy8gRklYICMxNDMwOiBTa2lwIHJlaW5zdGFsbGF0aW9uIGlmIHNlZWQgYWxyZWFkeSBleGlzdHMgd2l0aCBjb250ZW50XG4gICAgICAgICAgLy8gUmVpbnN0YWxsaW5nIGRlbGV0ZXMgdGhlIG1lbW9yeSBmcm9tIGNhY2hlLCBsb3NpbmcgYWN0aXZhdGlvbiBzdGF0dXNcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBTZWVkIG1lbW9yeSBhbHJlYWR5IGluc3RhbGxlZCB3aXRoIGNvbnRlbnQgLSBza2lwcGluZyByZWluc3RhbGxhdGlvbmApO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0g8J+OiSBTZWVkIG1lbW9yeSBpbnN0YWxsYXRpb24gY2hlY2sgY29tcGxldGUgKGFscmVhZHkgaW5zdGFsbGVkKWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIFN0ZXAgOTogRXhpc3Rpbmcgc2VlZCBtZW1vcnkgaXMgZW1wdHkgKCR7ZW50cmllcy5sZW5ndGh9IGVudHJpZXMpLCB3aWxsIHJlaW5zdGFsbGApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVsZXRlIGV4aXN0aW5nICh3aWxsIGJlIHJlcGxhY2VkIHdpdGggbGF0ZXN0KVxuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIFN0ZXAgMTA6IFJlbW92aW5nIGV4aXN0aW5nIHNlZWQgbWVtb3J5Li4uYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGUoc2VlZEZpbGVOYW1lKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBSZW1vdmVkIGV4aXN0aW5nIHNlZWQgbWVtb3J5LCB3aWxsIGluc3RhbGwgbGF0ZXN0IHZlcnNpb25gKTtcbiAgICAgICAgfSBjYXRjaCAoZGVsZXRlRXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYFtNZW1vcnlNYW5hZ2VyXSDinYwgRmFpbGVkIHRvIGRlbGV0ZSBleGlzdGluZyBzZWVkIG1lbW9yeTpgLCBkZWxldGVFcnJvcik7XG4gICAgICAgICAgdGhyb3cgZGVsZXRlRXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCB0aGUgc2VlZCBmaWxlXG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIFN0ZXAgMTE6IFJlYWRpbmcgc2VlZCBmaWxlIGNvbnRlbnQuLi5gKTtcbiAgICAgIGNvbnN0IHNlZWRDb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZShzZWVkU291cmNlUGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KTtcbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0g4pyFIFJlYWQgc2VlZCBmaWxlOiAke3NlZWRDb250ZW50Lmxlbmd0aH0gY2hhcmFjdGVyc2ApO1xuXG4gICAgICAvLyBQYXJzZSBhbmQgY3JlYXRlIG1lbW9yeSBpbnN0YW5jZVxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDEyOiBQYXJzaW5nIHNlZWQgY29udGVudCBhbmQgY3JlYXRpbmcgbWVtb3J5IGluc3RhbmNlLi4uYCk7XG4gICAgICBsZXQgbWVtb3J5OiBNZW1vcnk7XG4gICAgICB0cnkge1xuICAgICAgICBtZW1vcnkgPSBhd2FpdCB0aGlzLmltcG9ydEVsZW1lbnQoc2VlZENvbnRlbnQsICd5YW1sJyk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0g4pyFIFN1Y2Nlc3NmdWxseSBwYXJzZWQgc2VlZCBtZW1vcnlgKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5TWFuYWdlcl0gTWVtb3J5IG5hbWU6ICR7bWVtb3J5Lm1ldGFkYXRhLm5hbWV9YCk7XG4gICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgW01lbW9yeU1hbmFnZXJdIOKdjCBGYWlsZWQgdG8gcGFyc2Ugc2VlZCBjb250ZW50OmAsIHBhcnNlRXJyb3IpO1xuICAgICAgICB0aHJvdyBwYXJzZUVycm9yO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgbWVtb3J5IHR5cGUgdG8gU1lTVEVNIGFuZCBlbnN1cmUgYXV0b0xvYWQgaXMgZW5hYmxlZFxuICAgICAgbG9nZ2VyLmluZm8oYFtNZW1vcnlNYW5hZ2VyXSBTdGVwIDEzOiBTZXR0aW5nIG1lbW9yeSB0eXBlIHRvIFNZU1RFTSBhbmQgYXV0b0xvYWQuLi5gKTtcbiAgICAgIGNvbnN0IG1lbW9yeU1ldGEgPSBtZW1vcnkubWV0YWRhdGEgYXMgTWVtb3J5TWV0YWRhdGE7XG4gICAgICBtZW1vcnlNZXRhLm1lbW9yeVR5cGUgPSBNZW1vcnlUeXBlLlNZU1RFTTtcbiAgICAgIG1lbW9yeU1ldGEuYXV0b0xvYWQgPSB0cnVlOyAvLyBFbnN1cmUgc2VlZCBtZW1vcmllcyBhdXRvLWxvYWRcbiAgICAgIG1lbW9yeU1ldGEucHJpb3JpdHkgPSAxOyAgIC8vIEhpZ2ggcHJpb3JpdHkgZm9yIGJhc2VsaW5lIGtub3dsZWRnZVxuICAgICAgbG9nZ2VyLmRlYnVnKGBbTWVtb3J5TWFuYWdlcl0gTWVtb3J5IHR5cGU6ICR7bWVtb3J5TWV0YS5tZW1vcnlUeXBlfSwgYXV0b0xvYWQ6ICR7bWVtb3J5TWV0YS5hdXRvTG9hZH0sIHByaW9yaXR5OiAke21lbW9yeU1ldGEucHJpb3JpdHl9YCk7XG5cbiAgICAgIC8vIFNhdmUgdG8gcG9ydGZvbGlvICh0aGlzIHdpbGwgdXNlIHN5c3RlbS8gZm9sZGVyIGJhc2VkIG9uIG1lbW9yeVR5cGUpXG4gICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIFN0ZXAgMTQ6IFNhdmluZyBzZWVkIG1lbW9yeSB0byBwb3J0Zm9saW8gKHNob3VsZCBnbyB0byBzeXN0ZW0vIGZvbGRlcikuLi5gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZShtZW1vcnkpO1xuICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIOKchSBTdWNjZXNzZnVsbHkgc2F2ZWQgc2VlZCBtZW1vcnlgKTtcbiAgICAgICAgY29uc3Qgc2F2ZWRQYXRoID0gbWVtb3J5LmdldEZpbGVQYXRoKCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gU2F2ZWQgdG86ICR7c2F2ZWRQYXRofWApO1xuICAgICAgfSBjYXRjaCAoc2F2ZUVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgW01lbW9yeU1hbmFnZXJdIOKdjCBGYWlsZWQgdG8gc2F2ZSBzZWVkIG1lbW9yeTpgLCBzYXZlRXJyb3IpO1xuICAgICAgICB0aHJvdyBzYXZlRXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0g8J+OiSBTdGVwIDE1OiBTZWVkIG1lbW9yeSBpbnN0YWxsYXRpb24gQ09NUExFVEUhYCk7XG5cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIEluc3RhbGxlZCBzZWVkIG1lbW9yeTogJHtzZWVkRmlsZU5hbWV9YCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGVycm9yIGJ1dCBkb24ndCB0aHJvdyAtIHNlZWQgaW5zdGFsbGF0aW9uIHNob3VsZCBub3QgYnJlYWsgc2VydmVyIHN0YXJ0dXBcbiAgICAgIGxvZ2dlci5lcnJvcignW01lbW9yeU1hbmFnZXJdIEZhaWxlZCB0byBpbnN0YWxsIHNlZWQgbWVtb3JpZXM6JywgZXJyb3IpO1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnTUVNT1JZX0xPQURfRkFJTEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmluc3RhbGxTZWVkTWVtb3JpZXMnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGluc3RhbGwgc2VlZCBtZW1vcmllczogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBGaW5kIG1lbW9yaWVzIG1hdGNoaW5nIGEgcHJlZGljYXRlXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBmaW5kKHByZWRpY2F0ZTogKGVsZW1lbnQ6IE1lbW9yeSkgPT4gYm9vbGVhbik6IFByb21pc2U8TWVtb3J5IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbWVtb3JpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gbWVtb3JpZXMuZmluZChwcmVkaWNhdGUpO1xuICB9XG4gIFxuICAvKipcbiAgICogRmluZCBtdWx0aXBsZSBtZW1vcmllcyBtYXRjaGluZyBhIHByZWRpY2F0ZVxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgZmluZE1hbnkocHJlZGljYXRlOiAoZWxlbWVudDogTWVtb3J5KSA9PiBib29sZWFuKTogUHJvbWlzZTxNZW1vcnlbXT4ge1xuICAgIGNvbnN0IG1lbW9yaWVzID0gYXdhaXQgdGhpcy5saXN0KCk7XG4gICAgcmV0dXJuIG1lbW9yaWVzLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG4gIFxuICAvKipcbiAgICogRGVsZXRlIGEgbWVtb3J5IGZpbGVcbiAgICogU0VDVVJJVFk6IFZhbGlkYXRlcyBwYXRoIGFuZCBsb2dzIGRlbGV0aW9uXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IGF3YWl0IHRoaXMudmFsaWRhdGVBbmRSZXNvbHZlUGF0aChmaWxlUGF0aCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gICAgICBpZiAoIWF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGZ1bGxQYXRoKSkge1xuICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIG5vdCBhbiBlcnJvciBmb3IgZGVsZXRlIG9wZXJhdGlvblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgZmlsZVxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKGZ1bGxQYXRoLCBFbGVtZW50VHlwZS5NRU1PUlksIHtcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5kZWxldGUnXG4gICAgICB9KTtcblxuICAgICAgLy8gUmVtb3ZlIGZyb20gY2FjaGVzXG4gICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHRoaXMubWVtb3JpZXNEaXIsIGZ1bGxQYXRoKTtcbiAgICAgIHRoaXMudW5jYWNoZUJ5UGF0aChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBQaGFzZSAyOiBOb3RpZnkgc3RvcmFnZSBsYXllciBvZiBkZWxldGlvblxuICAgICAgdGhpcy5zdG9yYWdlTGF5ZXIubm90aWZ5RGVsZXRlZChyZWxhdGl2ZVBhdGgpO1xuXG4gICAgICAvLyBQaGFzZSAyOiBVc2UgcmV2ZXJzZSBtYXAgZm9yIE8oMSkgaGFzaCBjbGVhbnVwXG4gICAgICBjb25zdCBoYXNoID0gdGhpcy5jb250ZW50SGFzaEJ5UGF0aC5nZXQoZnVsbFBhdGgpO1xuICAgICAgaWYgKGhhc2gpIHtcbiAgICAgICAgdGhpcy5jb250ZW50SGFzaEluZGV4LmRlbGV0ZShoYXNoKTtcbiAgICAgICAgdGhpcy5jb250ZW50SGFzaEJ5UGF0aC5kZWxldGUoZnVsbFBhdGgpO1xuICAgICAgfVxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0RFTEVURUQsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5kZWxldGUnLFxuICAgICAgICBkZXRhaWxzOiBgRGVsZXRlZCBtZW1vcnkgZmlsZTogJHtwYXRoLmJhc2VuYW1lKGZ1bGxQYXRoKX1gXG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBub3QgYW4gZXJyb3IgZm9yIGRlbGV0ZSBvcGVyYXRpb25cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBtZW1vcnkgZmlsZSBleGlzdHNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gYXdhaXQgdGhpcy52YWxpZGF0ZUFuZFJlc29sdmVQYXRoKGZpbGVQYXRoKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhmdWxsUGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IG1lbW9yeSB3aXRoIG1ldGFkYXRhXG4gICAqL1xuICBhc3luYyBjcmVhdGUobWV0YWRhdGE6IFBhcnRpYWw8TWVtb3J5TWV0YWRhdGE+ICYgeyBjb250ZW50Pzogc3RyaW5nOyBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfSk6IFByb21pc2U8TWVtb3J5PiB7XG4gICAgLy8gVXNlIHNwZWNpYWxpemVkIHZhbGlkYXRvciBmb3IgaW5wdXQgdmFsaWRhdGlvblxuICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRvci52YWxpZGF0ZUNyZWF0ZSh7XG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uXG4gICAgfSk7XG5cbiAgICBpZiAoIXZhbGlkYXRpb25SZXN1bHQuaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBWYWxpZGF0aW9uIGZhaWxlZDogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIExvZyB3YXJuaW5ncyBpZiBhbnlcbiAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci53YXJuKGBNZW1vcnkgY3JlYXRpb24gd2FybmluZ3M6ICR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGUgKG1vdmVkIGZyb20gY3JlYXRlRWxlbWVudCBoYW5kbGVyKVxuICAgIGNvbnN0IGV4aXN0aW5nTWVtb3JpZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBkdXBsaWNhdGUgPSBleGlzdGluZ01lbW9yaWVzLmZpbmQobSA9PlxuICAgICAgbS5tZXRhZGF0YS5uYW1lPy50b0xvd2VyQ2FzZSgpID09PSBtZXRhZGF0YS5uYW1lPy50b0xvd2VyQ2FzZSgpXG4gICAgKTtcbiAgICBpZiAoZHVwbGljYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgbWVtb3J5IG5hbWVkIFwiJHttZXRhZGF0YS5uYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuXG4gICAgLy8gU2VwYXJhdGUgY29udGVudCBhbmQgaW5zdHJ1Y3Rpb25zIGZyb20gbWV0YWRhdGEgZmllbGRzXG4gICAgLy8gTm90ZTogQmFzZUVsZW1lbnQuY29uc3RydWN0b3IgZ2VuZXJhdGVzIHRoZSBlbGVtZW50IGlkIGZyb20gdGhlIG5hbWUsXG4gICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBzZXQgaWQgaGVyZSDigJQgaXQgd291bGQgYmUgaWdub3JlZC5cbiAgICBjb25zdCB7IGNvbnRlbnQsIGluc3RydWN0aW9ucywgLi4ubWV0YWRhdGFGaWVsZHMgfSA9IG1ldGFkYXRhO1xuXG4gICAgLy8gQ3JlYXRlIGluc3RhbmNlXG4gICAgY29uc3QgbWVtb3J5ID0gbmV3IE1lbW9yeShtZXRhZGF0YUZpZWxkcywgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgLy8gU2V0IGluc3RydWN0aW9ucyBpZiBwcm92aWRlZCAodjIuMCBkdWFsLWZpZWxkOiBtZW1vcnktbGV2ZWwgZGlyZWN0aXZlcylcbiAgICBpZiAoaW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBtZW1vcnkuaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zO1xuICAgIH1cblxuICAgIC8vIEFkZCBpbml0aWFsIGVudHJ5IGlmIGNvbnRlbnQgcHJvdmlkZWQgKG1vdmVkIGZyb20gY3JlYXRlRWxlbWVudCBoYW5kbGVyKVxuICAgIGlmIChjb250ZW50KSB7XG4gICAgICBhd2FpdCBtZW1vcnkuYWRkRW50cnkoY29udGVudCk7XG4gICAgfVxuXG4gICAgLy8gU2F2ZSAobW92ZWQgZnJvbSBjcmVhdGVFbGVtZW50IGhhbmRsZXIpXG4gICAgYXdhaXQgdGhpcy5zYXZlKG1lbW9yeSk7XG4gICAgLy8gTm90ZTogTm8gcmVsb2FkKCkgaGVyZSDigJQgc2F2ZSgpIGNhY2hlcyB0aGUgZWxlbWVudCBjb3JyZWN0bHkuXG4gICAgLy8gU2VlIElzc3VlICM0OTEgZm9yIHdoeSBQZXJzb25hTWFuYWdlcidzIHJlbG9hZC1hZnRlci1jcmVhdGUgd2FzIHJlbW92ZWQuXG5cbiAgICBsb2dnZXIuaW5mbyhgTWVtb3J5IGNyZWF0ZWQ6ICR7bWVtb3J5Lm1ldGFkYXRhLm5hbWV9YCk7XG4gICAgcmV0dXJuIG1lbW9yeTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFBhcnNlIFlBTUwgZGF0YSBmb3IgaW1wb3J0XG4gICAqIEV4dHJhY3RlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHkgKFNvbmFyQ2xvdWQpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHBhcnNlWWFtbEZvckltcG9ydChkYXRhOiBzdHJpbmcpOiB7IHBhcnNlZDogYW55OyBtYXJrZG93bkNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCB9IHtcbiAgICAvLyBVc2UgU2VyaWFsaXphdGlvblNlcnZpY2UgZm9yIGNvbnNpc3RlbnQgcGFyc2luZ1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsaXphdGlvblNlcnZpY2UucGFyc2VGcm9udG1hdHRlcihkYXRhLCB7XG4gICAgICBtYXhZYW1sU2l6ZTogTUVNT1JZX0NPTlNUQU5UUy5NQVhfWUFNTF9TSVpFLFxuICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlLFxuICAgICAgc291cmNlOiAnTWVtb3J5TWFuYWdlci5wYXJzZVlhbWxGb3JJbXBvcnQnLFxuICAgICAgc2NoZW1hOiAnanNvbicgIC8vIEZJWCAjMTQzMDogUHJlc2VydmUgYm9vbGVhbnMgKGF1dG9Mb2FkKSBhbmQgbnVtYmVycyAocHJpb3JpdHkpXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFyc2VkOiByZXN1bHQuZGF0YSxcbiAgICAgIG1hcmtkb3duQ29udGVudDogcmVzdWx0LmNvbnRlbnRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBtZW1vcnkgZnJvbSBwYXJzZWQgZGF0YVxuICAgKiBFeHRyYWN0ZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5IChTb25hckNsb3VkKVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVNZW1vcnlGcm9tUGFyc2VkKFxuICAgIHBhcnNlZDogYW55LFxuICAgIG1hcmtkb3duQ29udGVudDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICk6IFByb21pc2U8TWVtb3J5PiB7XG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBzdHJ1Y3R1cmVzIGZyb20gWUFNTCBwYXJzaW5nXG4gICAgLy8gU3VwcG9ydCBib3RoIGZvcm1hdHMgKHNlZSBjb21taXQgZmViNWNlMCBvbiBtYWluKTpcbiAgICAvLyAxLiBGcm9udG1hdHRlci1zdHlsZSAoc2VlZCBmaWxlcyk6IG1ldGFkYXRhIGZpZWxkcyBhdCB0b3AgbGV2ZWxcbiAgICAvLyAyLiBTYXZlZCBtZW1vcnkgZmlsZXM6IG5lc3RlZCB1bmRlciAnbWV0YWRhdGEnIGtleVxuICAgIC8vIFRoaXMgbWF0Y2hlcyBtYWluJ3MgcGFyc2VNZW1vcnlGaWxlIGxvZ2ljOiB5YW1sRGF0YS5tZXRhZGF0YSB8fCB5YW1sRGF0YVxuICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyc2VkLm1ldGFkYXRhIHx8IHBhcnNlZDtcbiAgICBjb25zdCBlbnRyaWVzID0gcGFyc2VkLmVudHJpZXMgfHwgcGFyc2VkLmRhdGE/LmVudHJpZXM7XG5cbiAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBmaWVsZHNcbiAgICBpZiAoIW1ldGFkYXRhPy5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBtdXN0IGhhdmUgbWV0YWRhdGEgd2l0aCBuYW1lJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIG1lbW9yeSBpbnN0YW5jZVxuICAgIGNvbnN0IG1lbW9yeSA9IG5ldyBNZW1vcnkobWV0YWRhdGEsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgIC8vIExvYWQgZW50cmllcyBpZiBwcmVzZW50XG4gICAgaWYgKGVudHJpZXMpIHtcbiAgICAgIG1lbW9yeS5kZXNlcmlhbGl6ZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGlkOiBtZW1vcnkuaWQsXG4gICAgICAgIHR5cGU6IG1lbW9yeS50eXBlLFxuICAgICAgICB2ZXJzaW9uOiBtZW1vcnkudmVyc2lvbixcbiAgICAgICAgbWV0YWRhdGE6IG1lbW9yeS5tZXRhZGF0YSxcbiAgICAgICAgZXh0ZW5zaW9uczogbWVtb3J5LmV4dGVuc2lvbnMsXG4gICAgICAgIGVudHJpZXM6IGVudHJpZXNcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvLyBJZiBtYXJrZG93biBjb250ZW50IGV4aXN0cyBhZnRlciB0aGUgZnJvbnRtYXR0ZXIsIGFkZCBpdCBhcyBhIG1lbW9yeSBlbnRyeVxuICAgIC8vIFRoaXMgcHJlc2VydmVzIGNvbnRlbnQgZnJvbSBzZWVkIG1lbW9yaWVzIGFuZCBpbXBvcnRlZCBZQU1MIGZpbGVzIHdpdGggbWFya2Rvd24gc2VjdGlvbnNcbiAgICBpZiAobWFya2Rvd25Db250ZW50Py50cmltKCkpIHtcbiAgICAgIGF3YWl0IG1lbW9yeS5hZGRFbnRyeShcbiAgICAgICAgbWFya2Rvd25Db250ZW50LnRyaW0oKSxcbiAgICAgICAgW10sICAvLyB0YWdzXG4gICAgICAgIHsgaW1wb3J0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0sICAvLyBtZXRhZGF0YVxuICAgICAgICAnaW1wb3J0JyAgLy8gc291cmNlXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBtZW1vcnk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgbWVtb3J5IGZyb20gSlNPTi9ZQU1MIHN0cmluZ1xuICAgKiBTRUNVUklUWTogRnVsbCB2YWxpZGF0aW9uIG9mIGltcG9ydGVkIGNvbnRlbnRcbiAgICogQHBhcmFtIGRhdGEgSlNPTiBvciBZQU1MIHN0cmluZyBjb250YWluaW5nIG1lbW9yeSBkYXRhXG4gICAqIEBwYXJhbSBmb3JtYXQgRm9ybWF0IG9mIHRoZSBpbnB1dCBkYXRhICgnanNvbicgb3IgJ3lhbWwnKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgaW1wb3J0ZWQgTWVtb3J5IGluc3RhbmNlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIEpTT04vWUFNTCBwYXJzaW5nIGZhaWxzXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGltcG9ydGVkIGRhdGEgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHNcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gWUFNTCBjb250ZW50IGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIHNpemVcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gaW1wb3J0ZWQgbWVtb3J5IGZhaWxzIHZhbGlkYXRpb25cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIGltcG9ydEVsZW1lbnQoXG4gICAgZGF0YTogc3RyaW5nLFxuICAgIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnIHwgJ21hcmtkb3duJyA9ICd5YW1sJ1xuICApOiBQcm9taXNlPE1lbW9yeT4ge1xuICAgIHRyeSB7XG4gICAgICBsZXQgcGFyc2VkOiBhbnk7XG4gICAgICBsZXQgbWFya2Rvd25Db250ZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChmb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSElHSCBTRVZFUklUWSBGSVg6IFVzZSBzZWN1cmUgWUFNTCBwYXJzaW5nXG4gICAgICAgIC8vIE1lbW9yeSBpbXBvcnQgZXhwZWN0cyBwdXJlIFlBTUwgKG5vdCBmcm9udG1hdHRlciksIHNvIHdlIHBhcnNlIGl0IHNlY3VyZWx5XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXJzZVlhbWxGb3JJbXBvcnQoZGF0YSk7XG4gICAgICAgICAgcGFyc2VkID0gcmVzdWx0LnBhcnNlZDtcbiAgICAgICAgICBtYXJrZG93bkNvbnRlbnQgPSByZXN1bHQubWFya2Rvd25Db250ZW50O1xuICAgICAgICB9IGNhdGNoICh5YW1sRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgWUFNTDogJHt5YW1sRXJyb3J9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBpdCdzIGFuIG9iamVjdFxuICAgICAgICBpZiAoIXBhcnNlZCB8fCB0eXBlb2YgcGFyc2VkICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWUFNTCBtdXN0IGNvbnRhaW4gYW4gb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlTWVtb3J5RnJvbVBhcnNlZChwYXJzZWQsIG1hcmtkb3duQ29udGVudCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9JTVBPUlRfRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIuaW1wb3J0RWxlbWVudCcsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gaW1wb3J0IG1lbW9yeTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGltcG9ydCBtZW1vcnk6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogRXhwb3J0IGEgbWVtb3J5IHRvIFlBTUwgc3RyaW5nXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBleHBvcnRFbGVtZW50KFxuICAgIGVsZW1lbnQ6IE1lbW9yeSxcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyB8ICdtYXJrZG93bicgPSAneWFtbCdcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LnNlcmlhbGl6ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRzID0gZWxlbWVudC5nZXRTdGF0cygpO1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBtZXRhZGF0YTogZWxlbWVudC5tZXRhZGF0YSxcbiAgICAgIGV4dGVuc2lvbnM6IGVsZW1lbnQuZXh0ZW5zaW9ucyxcbiAgICAgIHN0YXRzOiB7XG4gICAgICAgIHRvdGFsRW50cmllczogc3RhdHMudG90YWxFbnRyaWVzLFxuICAgICAgICB0b3RhbFNpemU6IHN0YXRzLnRvdGFsU2l6ZSxcbiAgICAgICAgb2xkZXN0RW50cnk6IHN0YXRzLm9sZGVzdEVudHJ5Py50b0lTT1N0cmluZygpLFxuICAgICAgICBuZXdlc3RFbnRyeTogc3RhdHMubmV3ZXN0RW50cnk/LnRvSVNPU3RyaW5nKClcbiAgICAgIH0sXG4gICAgICBlbnRyaWVzOiBKU09OLnBhcnNlKGVsZW1lbnQuc2VyaWFsaXplKCkpLmVudHJpZXNcbiAgICB9O1xuXG4gICAgLy8gU0VDVVJJVFkgRklYOiBVc2Ugc2VjdXJlIFlBTUwgZHVtcGluZ1xuICAgIC8vIEZJWCAjMTQzMDogVXNlIEpTT05fU0NIRU1BIHRvIHByZXNlcnZlIGJvb2xlYW5zIChhdXRvTG9hZCkgYW5kIG51bWJlcnMgKHByaW9yaXR5KVxuICAgIC8vIEpTT05fU0NIRU1BID0gRkFJTFNBRkUgKyBib29sL2ludC9mbG9hdC9udWxsIChzYWZlciB0aGFuIERFRkFVTFQgd2hpY2ggYWRkcyB0aW1lc3RhbXBzKVxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6YXRpb25TZXJ2aWNlLmR1bXBZYW1sKGRhdGEsIHtcbiAgICAgIHNjaGVtYTogJ2pzb24nLFxuICAgICAgbm9SZWZzOiB0cnVlLFxuICAgICAgc2tpcEludmFsaWQ6IHRydWUsXG4gICAgICBzb3J0S2V5czogdHJ1ZVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHBhcnNlTWV0YWRhdGEoZGF0YTogYW55KTogUHJvbWlzZTxNZW1vcnlNZXRhZGF0YT4ge1xuICAgIGNvbnN0IHsgbWV0YWRhdGEgfSA9IHRoaXMucGFyc2VNZW1vcnlGaWxlKHsgZGF0YSwgY29udGVudDogJycgfSk7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGNyZWF0ZUVsZW1lbnQobWV0YWRhdGE6IE1lbW9yeU1ldGFkYXRhLCBfY29udGVudDogc3RyaW5nKTogTWVtb3J5IHtcbiAgICBjb25zdCBtZW1vcnkgPSBuZXcgTWVtb3J5KG1ldGFkYXRhLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgLy8gRXh0cmFjdCBpbnN0cnVjdGlvbnMgZnJvbSBtZXRhZGF0YSBpZiBwcmVzZW50ICh2MiBkdWFsLWZpZWxkKVxuICAgIGlmIChtZXRhZGF0YS5pbnN0cnVjdGlvbnMpIHtcbiAgICAgIG1lbW9yeS5pbnN0cnVjdGlvbnMgPSBtZXRhZGF0YS5pbnN0cnVjdGlvbnM7XG4gICAgICBkZWxldGUgbWV0YWRhdGEuaW5zdHJ1Y3Rpb25zO1xuICAgIH1cbiAgICByZXR1cm4gbWVtb3J5O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudDogTWVtb3J5KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBzdGF0cyA9IGVsZW1lbnQuZ2V0U3RhdHMoKTtcbiAgICAvLyBJc3N1ZSAjNzU1OiBTZXJpYWxpemUgdHlwZSBhcyBzaW5ndWxhciBhbmQgcGVyc2lzdCB1bmlxdWVfaWRcbiAgICBjb25zdCBtZXRhZGF0YSA9IHsgLi4uZWxlbWVudC5tZXRhZGF0YSB9O1xuICAgIG1ldGFkYXRhLnR5cGUgPSB0b1Npbmd1bGFyTGFiZWwoRWxlbWVudFR5cGUuTUVNT1JZKSBhcyBhbnk7XG4gICAgKG1ldGFkYXRhIGFzIGFueSkuZm9ybWF0X3ZlcnNpb24gPSAndjInOyAgLy8gRml4ICM5MTIvIzkxODogRXhwbGljaXQgZm9ybWF0IG1hcmtlclxuICAgIChtZXRhZGF0YSBhcyBhbnkpLnVuaXF1ZV9pZCA9IGVsZW1lbnQuaWQ7XG4gICAgY29uc3QgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBtZXRhZGF0YSxcbiAgICAgIC4uLihlbGVtZW50Lmluc3RydWN0aW9ucyA/IHsgaW5zdHJ1Y3Rpb25zOiBlbGVtZW50Lmluc3RydWN0aW9ucyB9IDoge30pLFxuICAgICAgZXh0ZW5zaW9uczogZWxlbWVudC5leHRlbnNpb25zLFxuICAgICAgc3RhdHM6IHtcbiAgICAgICAgdG90YWxFbnRyaWVzOiBzdGF0cy50b3RhbEVudHJpZXMsXG4gICAgICAgIHRvdGFsU2l6ZTogc3RhdHMudG90YWxTaXplLFxuICAgICAgICBvbGRlc3RFbnRyeTogc3RhdHMub2xkZXN0RW50cnk/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIG5ld2VzdEVudHJ5OiBzdGF0cy5uZXdlc3RFbnRyeT8udG9JU09TdHJpbmcoKSxcbiAgICAgICAgdG9wVGFnczogQXJyYXkuZnJvbShzdGF0cy50YWdGcmVxdWVuY3kuZW50cmllcygpKVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiWzFdIC0gYVsxXSlcbiAgICAgICAgICAuc2xpY2UoMCwgMTApXG4gICAgICAgICAgLm1hcCgoW3RhZywgY291bnRdKSA9PiAoeyB0YWcsIGNvdW50IH0pKVxuICAgICAgfSxcbiAgICAgIGVudHJpZXM6IEpTT04ucGFyc2UoZWxlbWVudC5zZXJpYWxpemUoKSkuZW50cmllc1xuICAgIH07XG5cbiAgICAvLyBGSVggIzE0MzA6IFVzZSBKU09OX1NDSEVNQSB0byBwcmVzZXJ2ZSBib29sZWFucyAoYXV0b0xvYWQpIGFuZCBudW1iZXJzIChwcmlvcml0eSlcbiAgICAvLyBKU09OX1NDSEVNQSA9IEZBSUxTQUZFICsgYm9vbC9pbnQvZmxvYXQvbnVsbCAoc2FmZXIgdGhhbiBERUZBVUxUIHdoaWNoIGFkZHMgdGltZXN0YW1wcylcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemF0aW9uU2VydmljZS5kdW1wWWFtbChwYXlsb2FkLCB7XG4gICAgICBzY2hlbWE6ICdqc29uJyxcbiAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIHNraXBJbnZhbGlkOiB0cnVlLFxuICAgICAgc29ydEtleXM6IHRydWVcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgbWVtb3J5IGVsZW1lbnRcbiAgICovXG4gIG92ZXJyaWRlIHZhbGlkYXRlKGVsZW1lbnQ6IE1lbW9yeSk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICByZXR1cm4gZWxlbWVudC52YWxpZGF0ZSgpO1xuICB9XG4gIFxuICAvKipcbiAgICogVmFsaWRhdGUgYW5kIHJlc29sdmUgYSBmaWxlIHBhdGhcbiAgICogU0VDVVJJVFk6IFByZXZlbnRzIGRpcmVjdG9yeSB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKi9cbiAgb3ZlcnJpZGUgdmFsaWRhdGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgLy8gUGVyZm9ybSBzeW5jaHJvbm91cyB2YWxpZGF0aW9uIGNoZWNrc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgubm9ybWFsaXplKGZpbGVQYXRoKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIHBhdGggdHJhdmVyc2FsIGF0dGVtcHRzXG4gICAgICBpZiAobm9ybWFsaXplZC5pbmNsdWRlcygnLi4nKSB8fCBwYXRoLmlzQWJzb2x1dGUobm9ybWFsaXplZCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbnN1cmUgcHJvcGVyIGV4dGVuc2lvblxuICAgICAgaWYgKCFub3JtYWxpemVkLmVuZHNXaXRoKCcubWQnKSAmJiAhbm9ybWFsaXplZC5lbmRzV2l0aCgnLnlhbWwnKSAmJiAhbm9ybWFsaXplZC5lbmRzV2l0aCgnLnltbCcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHRoZSBlbGVtZW50IHR5cGUgdGhpcyBtYW5hZ2VyIGhhbmRsZXNcbiAgICovXG4gIG92ZXJyaWRlIGdldEVsZW1lbnRUeXBlKCk6IEVsZW1lbnRUeXBlIHtcbiAgICByZXR1cm4gRWxlbWVudFR5cGUuTUVNT1JZO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlsZSBleHRlbnNpb24gZm9yIG1lbW9yeSBmaWxlc1xuICAgKi9cbiAgb3ZlcnJpZGUgZ2V0RmlsZUV4dGVuc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnLnlhbWwnO1xuICB9XG4gIFxuICAvLyBQcml2YXRlIGhlbHBlciBtZXRob2RzXG4gIFxuICAvKipcbiAgICogVmFsaWRhdGUgYW5kIHJlc29sdmUgYSBmaWxlIHBhdGggdG8gcHJldmVudCBzZWN1cml0eSBpc3N1ZXNcbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdmFsaWRhdGUgYW5kIHJlc29sdmVcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHZhbGlkYXRlZCBmdWxsIHBhdGhcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gcGF0aCBjb250YWlucyB0cmF2ZXJzYWwgYXR0ZW1wdHMgKC4uLylcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gcGF0aCBpcyBhYnNvbHV0ZSBvciBpbnZhbGlkXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGZpbGUgZXh0ZW5zaW9uIGlzIG5vdCBhbGxvd2VkICgubWQsIC55YW1sLCAueW1sKVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiByZXNvbHZlZCBwYXRoIHdvdWxkIGJlIG91dHNpZGUgbWVtb3JpZXMgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBDb21wcmVoZW5zaXZlIHBhdGggdmFsaWRhdGlvblxuICAgIC8vIEVuaGFuY2VkIHZhbGlkYXRpb24gaW5zcGlyZWQgYnkgSmVldCBTaW5naCAoQGplZXRzaW5naDAwOCkgLSBQUiAjMTAzNVxuXG4gICAgLy8gRmlyc3Qgbm9ybWFsaXplIHRoZSBwYXRoIHRvIHJlc29sdmUgYW55IC4vIG9yIC4uLyBzZXF1ZW5jZXNcbiAgICBjb25zdCBub3JtYWxpemVkID0gcGF0aC5ub3JtYWxpemUoZmlsZVBhdGgpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIHBhdGggdHJhdmVyc2FsIGF0dGVtcHRzIC0gYm90aCBpbiBvcmlnaW5hbCBhbmQgbm9ybWFsaXplZFxuICAgIC8vIENoZWNrIGJvdGggdGhlIG5vcm1hbGl6ZWQgcGF0aCBhbmQgdGhlIG9yaWdpbmFsIGZvciBhbnkgdHJhdmVyc2FsIHBhdHRlcm5zXG4gICAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoJy4uJykgfHxcbiAgICAgICAgZmlsZVBhdGguaW5jbHVkZXMoJy4uJykgfHxcbiAgICAgICAgcGF0aC5pc0Fic29sdXRlKG5vcm1hbGl6ZWQpIHx8XG4gICAgICAgIHBhdGguaXNBYnNvbHV0ZShmaWxlUGF0aCkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BBVEhfVFJBVkVSU0FMX0FUVEVNUFQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLnZhbGlkYXRlQW5kUmVzb2x2ZVBhdGgnLFxuICAgICAgICBkZXRhaWxzOiBgQmxvY2tlZCBwYXRoIHRyYXZlcnNhbCBhdHRlbXB0OiAke2ZpbGVQYXRofWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZpbGUgcGF0aDogUGF0aCB0cmF2ZXJzYWwgZGV0ZWN0ZWQnKTtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIHByb3BlciBleHRlbnNpb24gLSBtZW1vcmllcyBzaG91bGQgb25seSBiZSAueWFtbCBvciAueW1sXG4gICAgaWYgKCFub3JtYWxpemVkLmVuZHNXaXRoKCcueWFtbCcpICYmICFub3JtYWxpemVkLmVuZHNXaXRoKCcueW1sJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IGZpbGVzIG11c3QgaGF2ZSAueWFtbCBvciAueW1sIGV4dGVuc2lvbicpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb25zdHJ1Y3QgZnVsbCBwYXRoXG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4odGhpcy5tZW1vcmllc0Rpciwgbm9ybWFsaXplZCk7XG4gICAgXG4gICAgLy8gVmVyaWZ5IGl0J3Mgd2l0aGluIG1lbW9yaWVzIGRpcmVjdG9yeVxuICAgIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm1lbW9yaWVzRGlyLCBmdWxsUGF0aCk7XG4gICAgaWYgKHJlbGF0aXZlLnN0YXJ0c1dpdGgoJy4uJykgfHwgcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIHBhdGggbXVzdCBiZSB3aXRoaW4gbWVtb3JpZXMgZGlyZWN0b3J5Jyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBmdWxsUGF0aDtcbiAgfVxuICBcbiAgcHJpdmF0ZSBwYXJzZU1lbW9yeUZpbGUocGFyc2VkOiBQYXJzZWRNZW1vcnlEYXRhKTogeyBtZXRhZGF0YTogTWVtb3J5TWV0YWRhdGE7IGNvbnRlbnQ6IHN0cmluZyB9IHtcbiAgICAvLyBGSVg6IFNlY3VyZVlhbWxQYXJzZXIgcmV0dXJucyBkYXRhIGluICdkYXRhJyBwcm9wZXJ0eSwgbm90ICdtZXRhZGF0YSdcbiAgICAvLyBGb3IgbWFya2Rvd24gZmlsZXMgd2l0aCBZQU1MIGZyb250bWF0dGVyLCB0aGUgc3RydWN0dXJlIGlzOlxuICAgIC8vIHBhcnNlZC5kYXRhID0gWUFNTCBmcm9udG1hdHRlciB2YWx1ZXNcbiAgICAvLyBwYXJzZWQuY29udGVudCA9IG1hcmtkb3duIGNvbnRlbnQgYWZ0ZXIgZnJvbnRtYXR0ZXJcblxuICAgIC8vIEZvciBwdXJlIFlBTUwgbWVtb3J5IGZpbGVzLCB3ZSBuZWVkIHRvIGNoZWNrIGlmIG1ldGFkYXRhIGlzIGRpcmVjdGx5IGluIGRhdGFcbiAgICBjb25zdCB5YW1sRGF0YSA9IHBhcnNlZC5kYXRhIHx8IHt9O1xuXG4gICAgLy8gTWVtb3J5IGZpbGVzIHNhdmVkIGJ5IHRoZSBzeXN0ZW0gaGF2ZSBtZXRhZGF0YSBhcyBhIHRvcC1sZXZlbCBrZXlcbiAgICBjb25zdCBtZXRhZGF0YVNvdXJjZSA9IHlhbWxEYXRhLm1ldGFkYXRhIHx8IHlhbWxEYXRhO1xuXG4gICAgLy8gRXh0cmFjdCBtZXRhZGF0YSB3aXRoIHZhbGlkYXRpb25cbiAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIEJFRk9SRSBzYW5pdGl6YXRpb24gdG8gcHJldmVudCBieXBhc3MgYXR0YWNrc1xuICAgIGNvbnN0IG5hbWVJbnB1dCA9IG1ldGFkYXRhU291cmNlLm5hbWUgfHwgJ1VubmFtZWQgTWVtb3J5JztcbiAgICBjb25zdCBuYW1lUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQobmFtZUlucHV0LCB7XG4gICAgICBtYXhMZW5ndGg6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfTkFNRV9MRU5HVEgsXG4gICAgICBhbGxvd1NwYWNlczogdHJ1ZVxuICAgIH0pO1xuICAgIGlmICghbmFtZVJlc3VsdC5pc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbWVtb3J5IG5hbWU6ICR7bmFtZVJlc3VsdC5lcnJvcnM/LmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gRklYOiBNdXN0IHNwZWNpZnkgZmllbGRUeXBlOiAnZGVzY3JpcHRpb24nIHRvIGFsbG93IHB1bmN0dWF0aW9uIGxpa2UgY29sb25zLCBzZW1pY29sb25zLCBldGMuXG4gICAgbGV0IHNhbml0aXplZERlc2NyaXB0aW9uID0gJyc7XG4gICAgaWYgKG1ldGFkYXRhU291cmNlLmRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCBkZXNjUmVzdWx0ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZUFuZFNhbml0aXplSW5wdXQobWV0YWRhdGFTb3VyY2UuZGVzY3JpcHRpb24sIHtcbiAgICAgICAgbWF4TGVuZ3RoOiBTRUNVUklUWV9MSU1JVFMuTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCxcbiAgICAgICAgYWxsb3dTcGFjZXM6IHRydWUsXG4gICAgICAgIGZpZWxkVHlwZTogJ2Rlc2NyaXB0aW9uJ1xuICAgICAgfSk7XG4gICAgICBpZiAoIWRlc2NSZXN1bHQuaXNWYWxpZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbWVtb3J5IGRlc2NyaXB0aW9uOiAke2Rlc2NSZXN1bHQuZXJyb3JzPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgc2FuaXRpemVkRGVzY3JpcHRpb24gPSBkZXNjUmVzdWx0LnNhbml0aXplZFZhbHVlITtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhZGF0YTogTWVtb3J5TWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiBuYW1lUmVzdWx0LnNhbml0aXplZFZhbHVlISxcbiAgICAgIGRlc2NyaXB0aW9uOiBzYW5pdGl6ZWREZXNjcmlwdGlvbixcbiAgICAgIHZlcnNpb246IG1ldGFkYXRhU291cmNlLnZlcnNpb24gfHwgJzEuMC4wJyxcbiAgICAgIGF1dGhvcjogbWV0YWRhdGFTb3VyY2UuYXV0aG9yLFxuICAgICAgY3JlYXRlZDogbWV0YWRhdGFTb3VyY2UuY3JlYXRlZCxcbiAgICAgIG1vZGlmaWVkOiBtZXRhZGF0YVNvdXJjZS5tb2RpZmllZCB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB0YWdzOiBBcnJheS5pc0FycmF5KG1ldGFkYXRhU291cmNlLnRhZ3MpID9cbiAgICAgICAgbWV0YWRhdGFTb3VyY2UudGFncy5tYXAoKHRhZzogc3RyaW5nKSA9PiBzYW5pdGl6ZUlucHV0KHRhZywgTUVNT1JZX0NPTlNUQU5UUy5NQVhfVEFHX0xFTkdUSCkpIDpcbiAgICAgICAgW10sXG4gICAgICAvLyBGSVggIzExMjQ6IEV4dHJhY3QgdHJpZ2dlcnMgZm9yIEVuaGFuY2VkIEluZGV4IHN1cHBvcnRcbiAgICAgIC8vIEVuaGFuY2VkIHRyaWdnZXIgdmFsaWRhdGlvbiBsb2dnaW5nIGZvciBJc3N1ZSAjMTEzOVxuICAgICAgdHJpZ2dlcnM6IFtdLCAgLy8gV2lsbCBiZSBzZXQgYmVsb3cgd2l0aCBlbmhhbmNlZCBsb2dnaW5nXG4gICAgICBzdG9yYWdlQmFja2VuZDogbWV0YWRhdGFTb3VyY2Uuc3RvcmFnZV9iYWNrZW5kIHx8IG1ldGFkYXRhU291cmNlLnN0b3JhZ2VCYWNrZW5kIHx8IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9TVE9SQUdFX0JBQ0tFTkQsXG4gICAgICByZXRlbnRpb25EYXlzOiBtZXRhZGF0YVNvdXJjZS5yZXRlbnRpb25fcG9saWN5Py5kZWZhdWx0ID9cbiAgICAgICAgdGhpcy5wYXJzZVJldGVudGlvbkRheXMobWV0YWRhdGFTb3VyY2UucmV0ZW50aW9uX3BvbGljeS5kZWZhdWx0KSA6XG4gICAgICAgIChtZXRhZGF0YVNvdXJjZS5yZXRlbnRpb25EYXlzIHx8IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9SRVRFTlRJT05fREFZUyksXG4gICAgICBwcml2YWN5TGV2ZWw6IG1ldGFkYXRhU291cmNlLnByaXZhY3lfbGV2ZWwgfHwgbWV0YWRhdGFTb3VyY2UucHJpdmFjeUxldmVsIHx8IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9QUklWQUNZX0xFVkVMLFxuICAgICAgc2VhcmNoYWJsZTogbWV0YWRhdGFTb3VyY2Uuc2VhcmNoYWJsZSAhPT0gZmFsc2UsXG4gICAgICBtYXhFbnRyaWVzOiBtZXRhZGF0YVNvdXJjZS5tYXhFbnRyaWVzIHx8IE1FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJJRVNfREVGQVVMVCxcbiAgICAgIC8vIEZJWCAjMTQzMDogRXh0cmFjdCBhdXRvLWxvYWQgY29uZmlndXJhdGlvblxuICAgICAgYXV0b0xvYWQ6IG1ldGFkYXRhU291cmNlLmF1dG9Mb2FkLFxuICAgICAgcHJpb3JpdHk6IG1ldGFkYXRhU291cmNlLnByaW9yaXR5LFxuICAgICAgLy8gTWVtb3J5IHR5cGUgY2xhc3NpZmljYXRpb25cbiAgICAgIG1lbW9yeVR5cGU6IG1ldGFkYXRhU291cmNlLm1lbW9yeVR5cGUsXG4gICAgICAvLyBJc3N1ZSAjNTI0IOKAlCBHYXRla2VlcGVyIHBvbGljeSAoYWxsIGVsZW1lbnQgdHlwZXMpXG4gICAgICBnYXRla2VlcGVyOiBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3kobWV0YWRhdGFTb3VyY2UuZ2F0ZWtlZXBlciwgbmFtZVJlc3VsdC5zYW5pdGl6ZWRWYWx1ZSB8fCAndW5rbm93bicsICdtZW1vcnknKSxcbiAgICB9O1xuXG4gICAgLy8gRW5oYW5jZWQgdHJpZ2dlciB2YWxpZGF0aW9uIGFuZCBsb2dnaW5nXG4gICAgLy8gTk9URTogTWVtb3J5IHRyaWdnZXJzIG1heSBldm9sdmUgdG8gc3VwcG9ydCBkYXRlIHBhdHRlcm5zICgyMDI0LVEzKSxcbiAgICAvLyBzZW1hbnRpYyBtYXJrZXJzIChyZWNhbGwtY29udGV4dCksIG9yIG5hdHVyYWwgbGFuZ3VhZ2UgcGhyYXNlcy5cbiAgICAvLyBLZXB0IHNlcGFyYXRlIGZyb20gU2tpbGxzICh0ZWNobmljYWwpIGFuZCBQZXJzb25hcyAoY2hhcmFjdGVyIG5hbWVzKS5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YVNvdXJjZS50cmlnZ2VycykpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZS52YWxpZGF0ZVRyaWdnZXJzKFxuICAgICAgICBtZXRhZGF0YVNvdXJjZS50cmlnZ2VycyxcbiAgICAgICAgRWxlbWVudFR5cGUuTUVNT1JZLFxuICAgICAgICBtZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJ1xuICAgICAgKTtcbiAgICAgIG1ldGFkYXRhLnRyaWdnZXJzID0gdmFsaWRhdGlvblJlc3VsdC52YWxpZFRyaWdnZXJzO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgY29udGVudCAoaWYgYW55KVxuICAgIGNvbnN0IGNvbnRlbnQgPSBwYXJzZWQuY29udGVudCB8fCAnJztcblxuICAgIHJldHVybiB7IG1ldGFkYXRhLCBjb250ZW50IH07XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIHBhcnNlIHJldGVudGlvbiBkYXlzIGZyb20gdmFyaW91cyBmb3JtYXRzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlUmV0ZW50aW9uRGF5cyhyZXRlbnRpb246IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiByZXRlbnRpb24gPT09ICdudW1iZXInKSByZXR1cm4gcmV0ZW50aW9uO1xuICAgIGlmIChyZXRlbnRpb24gPT09ICdwZXJtYW5lbnQnIHx8IHJldGVudGlvbiA9PT0gJ3BlcnBldHVhbCcpIHJldHVybiA5OTk5OTk7XG4gICAgY29uc3QgcmVnZXggPSAvKFxcZCspXFxzKmRheXM/L2k7XG4gICAgY29uc3QgbWF0Y2ggPSByZWdleC5leGVjKHJldGVudGlvbik7XG4gICAgcmV0dXJuIG1hdGNoID8gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdKSA6IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9SRVRFTlRJT05fREFZUztcbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RpbWF0ZSB0b2tlbnMgaW4gbWVtb3J5IGNvbnRlbnQgKHJvdWdoIGFwcHJveGltYXRpb24pXG4gICAqIFVzZXMgMSB0b2tlbiDiiYggMC43NSB3b3JkcyBmb3IgRW5nbGlzaCB0ZXh0XG4gICAqIEBwYXJhbSBjb250ZW50IE1lbW9yeSBjb250ZW50IHRvIGVzdGltYXRlXG4gICAqIEByZXR1cm5zIEVzdGltYXRlZCB0b2tlbiBjb3VudFxuICAgKi9cbiAgcHVibGljIGVzdGltYXRlVG9rZW5zKGNvbnRlbnQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKCFjb250ZW50IHx8IHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykgcmV0dXJuIDA7XG5cbiAgICAvLyBTaW1wbGUgd29yZCBjb3VudCBhcHByb3hpbWF0aW9uXG4gICAgY29uc3Qgd29yZHMgPSBjb250ZW50LnRyaW0oKS5zcGxpdCgvXFxzKy8pLmxlbmd0aDtcblxuICAgIC8vIDEgdG9rZW4g4omIIDAuNzUgd29yZHMgKGNvbnNlcnZhdGl2ZSBlc3RpbWF0ZSlcbiAgICByZXR1cm4gTWF0aC5jZWlsKHdvcmRzIC8gMC43NSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhbmQgYWN0aXZhdGUgYXV0by1sb2FkIG1lbW9yaWVzIGR1cmluZyBzZXJ2ZXIgaW5pdGlhbGl6YXRpb25cbiAgICogSXNzdWUgIzE0MzA6IEF1dG8tbG9hZCBiYXNlbGluZSBtZW1vcmllcyBmZWF0dXJlXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBDb250YWluZXIucHJlcGFyZVBvcnRmb2xpbygpIGR1cmluZyBzZXJ2ZXIgc3RhcnR1cFxuICAgKiB0byBhdXRvbWF0aWNhbGx5IGxvYWQgbWVtb3JpZXMgbWFya2VkIHdpdGggYXV0b0xvYWQ6IHRydWVcbiAgICpcbiAgICogQXJjaGl0ZWN0dXJlIE5vdGU6XG4gICAqIFRoaXMgaW1wbGVtZW50YXRpb24gZm9sbG93cyB0aGUgREktYWxpZ25lZCBwYXR0ZXJuIHdoZXJlIG1hbmFnZXJzIG93biBhbGwgb3BlcmF0aW9uc1xuICAgKiBmb3IgdGhlaXIgZWxlbWVudCB0eXBlLiBBdXRvLWxvYWQgbG9naWMgbGl2ZXMgaW4gTWVtb3J5TWFuYWdlciAobm90IFNlcnZlclN0YXJ0dXApXG4gICAqIGJlY2F1c2UgTWVtb3J5TWFuYWdlciBhbHJlYWR5IG93bnMgYWxsIG1lbW9yeSBvcGVyYXRpb25zIChDUlVELCBhY3RpdmF0aW9uLCBldGMuKVxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBhdXRvLWxvYWQgc3RhdGlzdGljc1xuICAgKi9cbiAgYXN5bmMgbG9hZEFuZEFjdGl2YXRlQXV0b0xvYWRNZW1vcmllcygpOiBQcm9taXNlPHtcbiAgICBsb2FkZWQ6IG51bWJlcjtcbiAgICBza2lwcGVkOiBudW1iZXI7XG4gICAgdG90YWxUb2tlbnM6IG51bWJlcjtcbiAgICBlcnJvcnM6IHN0cmluZ1tdO1xuICB9PiB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgbG9hZGVkID0gMDtcbiAgICBsZXQgc2tpcHBlZCA9IDA7XG4gICAgbGV0IHRvdGFsVG9rZW5zID0gMDtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgZm9yIGVtZXJnZW5jeSBkaXNhYmxlXG4gICAgICBjb25zdCBlbWVyZ2VuY3lEaXNhYmxlZCA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9ESVNBQkxFX0FVVE9MT0FEID09PSAndHJ1ZSc7XG4gICAgICBpZiAoZW1lcmdlbmN5RGlzYWJsZWQpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tNZW1vcnlNYW5hZ2VyXSBBdXRvLWxvYWQgZGlzYWJsZWQgdmlhIERPTExIT1VTRV9ESVNBQkxFX0FVVE9MT0FEJyk7XG4gICAgICAgIC8vIEtlZXAgYXMgc2VjdXJpdHkgZXZlbnQg4oCUIGVtZXJnZW5jeSBkaXNhYmxlIGlzIGEgbm90YWJsZSBvcGVyYXRpb25hbCBkZWNpc2lvblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ01FTU9SWV9MT0FERUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxvYWRBbmRBY3RpdmF0ZUF1dG9Mb2FkTWVtb3JpZXMnLFxuICAgICAgICAgIGRldGFpbHM6ICdBdXRvLWxvYWQgbWVtb3JpZXMgZGlzYWJsZWQgdmlhIGVtZXJnZW5jeSBlbnZpcm9ubWVudCB2YXJpYWJsZScsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgcmVhc29uOiAnRE9MTEhPVVNFX0RJU0FCTEVfQVVUT0xPQUQ9dHJ1ZScgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgbG9hZGVkOiAwLCBza2lwcGVkOiAwLCB0b3RhbFRva2VuczogMCwgZXJyb3JzOiBbXSB9O1xuICAgICAgfVxuXG4gICAgICAvLyBJbnN0YWxsIHNlZWQgbWVtb3JpZXMgZmlyc3RcbiAgICAgIGF3YWl0IHRoaXMuaW5zdGFsbFNlZWRNZW1vcmllcygpO1xuXG4gICAgICAvLyBHZXQgYXV0by1sb2FkIG1lbW9yaWVzXG4gICAgICBjb25zdCBhdXRvTG9hZE1lbW9yaWVzID0gYXdhaXQgdGhpcy5nZXRBdXRvTG9hZE1lbW9yaWVzKCk7XG5cbiAgICAgIGlmIChhdXRvTG9hZE1lbW9yaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1tNZW1vcnlNYW5hZ2VyXSBObyBhdXRvLWxvYWQgbWVtb3JpZXMgY29uZmlndXJlZCcpO1xuICAgICAgICByZXR1cm4geyBsb2FkZWQ6IDAsIHNraXBwZWQ6IDAsIHRvdGFsVG9rZW5zOiAwLCBlcnJvcnM6IFtdIH07XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKGBbTWVtb3J5TWFuYWdlcl0gRm91bmQgJHthdXRvTG9hZE1lbW9yaWVzLmxlbmd0aH0gYXV0by1sb2FkIG1lbW9yaWVzYCk7XG5cbiAgICAgIC8vIFByb2Nlc3MgZWFjaCBhdXRvLWxvYWQgbWVtb3J5XG4gICAgICBmb3IgKGNvbnN0IG1lbW9yeSBvZiBhdXRvTG9hZE1lbW9yaWVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbWVtb3J5TmFtZSA9IG1lbW9yeS5tZXRhZGF0YS5uYW1lIHx8ICd1bmtub3duJztcblxuICAgICAgICAgIC8vIFZhbGlkYXRlIG1lbW9yeSBiZWZvcmUgbG9hZGluZ1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSBtZW1vcnkudmFsaWRhdGUoKTtcbiAgICAgICAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gYFZhbGlkYXRpb24gZmFpbGVkIGZvciAnJHttZW1vcnlOYW1lfSc6ICR7dmFsaWRhdGlvbi5lcnJvcnM/Lm1hcChlID0+IGUubWVzc2FnZSkuam9pbignLCAnKX1gO1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goZXJyb3JNc2cpO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFtNZW1vcnlNYW5hZ2VyXSAke2Vycm9yTXNnfWApO1xuICAgICAgICAgICAgc2tpcHBlZCsrO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRXN0aW1hdGUgdG9rZW5zXG4gICAgICAgICAgY29uc3QgZXN0aW1hdGVkVG9rZW5zID0gdGhpcy5lc3RpbWF0ZVRva2VucyhtZW1vcnkuY29udGVudCB8fCAnJyk7XG5cbiAgICAgICAgICAvLyBBY3RpdmF0ZSB0aGUgbWVtb3J5XG4gICAgICAgICAgLy8gRklYIElzc3VlICMzNTogQWRkIHRvIGFjdGl2ZU1lbW9yeU5hbWVzIHNldCBzbyBnZXRBY3RpdmVNZW1vcmllcygpIHJldHVybnMgaXRcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1lbW9yeU5hbWVzLmFkZChtZW1vcnlOYW1lKTtcbiAgICAgICAgICBhd2FpdCBtZW1vcnkuYWN0aXZhdGUoKTtcbiAgICAgICAgICBsb2FkZWQrKztcbiAgICAgICAgICB0b3RhbFRva2VucyArPSBlc3RpbWF0ZWRUb2tlbnM7XG5cbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW01lbW9yeU1hbmFnZXJdIEF1dG8tbG9hZGVkOiAke21lbW9yeU5hbWV9ICh+JHtlc3RpbWF0ZWRUb2tlbnN9IHRva2VucylgKTtcblxuICAgICAgICAgIC8vIFJvdXRpbmUgYXV0by1sb2FkIOKAlCBkZWJ1ZyBvbmx5ICh3YXMgZmxvb2Rpbmcgc2VjdXJpdHkgYnVmZmVyKVxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeU1hbmFnZXJdIEF1dG8tbG9hZGVkOiAke21lbW9yeU5hbWV9ICh+JHtlc3RpbWF0ZWRUb2tlbnN9IHRva2VucywgcHJpb3JpdHk6ICR7KG1lbW9yeS5tZXRhZGF0YSBhcyBhbnkpLnByaW9yaXR5fSlgKTtcblxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IG1lbW9yeU5hbWUgPSBtZW1vcnkubWV0YWRhdGEubmFtZSB8fCAndW5rbm93bic7XG4gICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBgRmFpbGVkIHRvIGxvYWQgJyR7bWVtb3J5TmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gO1xuICAgICAgICAgIGVycm9ycy5wdXNoKGVycm9yTXNnKTtcbiAgICAgICAgICBsb2dnZXIud2FybihgW01lbW9yeU1hbmFnZXJdICR7ZXJyb3JNc2d9YCk7XG4gICAgICAgICAgc2tpcHBlZCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW01lbW9yeU1hbmFnZXJdIEF1dG8tbG9hZCBjb21wbGV0ZTogJHtsb2FkZWR9IG1lbW9yaWVzIGFjdGl2YXRlZCBgICtcbiAgICAgICAgYCh+JHt0b3RhbFRva2Vuc30gdG9rZW5zKSwgJHtza2lwcGVkfSBza2lwcGVkLCAke2Vycm9ycy5sZW5ndGh9IGVycm9ycywgJHtlbGFwc2VkVGltZX1tc2BcbiAgICAgICk7XG5cbiAgICAgIC8vIFN1bW1hcnkgZXZlbnQg4oCUIGZpcmVzIG9uY2UgcGVyIHN0YXJ0dXAsIGtlZXAgYXMgc2VjdXJpdHkgZXZlbnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ01FTU9SWV9MT0FERUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeU1hbmFnZXIubG9hZEFuZEFjdGl2YXRlQXV0b0xvYWRNZW1vcmllcycsXG4gICAgICAgIGRldGFpbHM6IGBBdXRvLWxvYWQgY29tcGxldGU6ICR7bG9hZGVkfSBsb2FkZWQsICR7c2tpcHBlZH0gc2tpcHBlZCwgJHtlcnJvcnMubGVuZ3RofSBlcnJvcnNgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGxvYWRlZENvdW50OiBsb2FkZWQsXG4gICAgICAgICAgc2tpcHBlZENvdW50OiBza2lwcGVkLFxuICAgICAgICAgIGVycm9yQ291bnQ6IGVycm9ycy5sZW5ndGgsXG4gICAgICAgICAgdG90YWxUb2tlbnMsXG4gICAgICAgICAgbG9hZFRpbWVNczogZWxhcHNlZFRpbWVcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7IGxvYWRlZCwgc2tpcHBlZCwgdG90YWxUb2tlbnMsIGVycm9ycyB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvbid0IGZhaWwgc3RhcnR1cCBpZiBhdXRvLWxvYWQgZmFpbHMsIGJ1dCBwcm92aWRlIGRldGFpbGVkIGRpYWdub3N0aWNzXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBjb25zdCBlcnJvclR5cGUgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IuY29uc3RydWN0b3IubmFtZSA6ICdVbmtub3duJztcblxuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBbTWVtb3J5TWFuYWdlcl0gRmFpbGVkIHRvIGxvYWQgYXV0by1sb2FkIG1lbW9yaWVzICgke2Vycm9yVHlwZX0pOiAke2Vycm9yTWVzc2FnZX1gXG4gICAgICApO1xuXG4gICAgICAvLyBMb2cgZmFpbHVyZVxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnTUVNT1JZX0xPQURfRkFJTEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnlNYW5hZ2VyLmxvYWRBbmRBY3RpdmF0ZUF1dG9Mb2FkTWVtb3JpZXMnLFxuICAgICAgICBkZXRhaWxzOiBgQXV0by1sb2FkIG1lbW9yaWVzIGZhaWxlZDogJHtlcnJvclR5cGV9IC0gJHtlcnJvck1lc3NhZ2V9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBlcnJvclR5cGUsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICAgIGxvYWRUaW1lTXM6IERhdGUubm93KCkgLSBzdGFydFRpbWVcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7IGxvYWRlZDogMCwgc2tpcHBlZDogMCwgdG90YWxUb2tlbnM6IDAsIGVycm9yczogW2Vycm9yTWVzc2FnZV0gfTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==