@dollhousemcp/mcp-server 1.5.2 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/README.md +494 -111
- package/data/agents/code-reviewer.md +8 -1
- package/data/agents/research-assistant.md +8 -1
- package/data/agents/task-manager.md +8 -1
- package/data/ensembles/business-advisor.md +8 -1
- package/data/ensembles/creative-studio.md +8 -1
- package/data/ensembles/development-team.md +8 -1
- package/data/ensembles/security-analysis-team.md +8 -1
- package/data/memories/conversation-history.md +8 -1
- package/data/memories/learning-progress.md +8 -1
- package/data/memories/project-context.md +8 -1
- package/data/personas/business-consultant.md +8 -1
- package/data/personas/creative-writer.md +8 -1
- package/data/personas/debug-detective.md +8 -1
- package/data/personas/eli5-explainer.md +8 -1
- package/data/personas/security-analyst.md +8 -1
- package/data/personas/technical-analyst.md +8 -1
- package/data/skills/code-review.md +8 -1
- package/data/skills/creative-writing.md +8 -1
- package/data/skills/data-analysis.md +8 -1
- package/data/skills/penetration-testing.md +8 -1
- package/data/skills/research.md +8 -1
- package/data/skills/threat-modeling.md +8 -1
- package/data/skills/translation.md +8 -1
- package/data/templates/code-documentation.md +8 -1
- package/data/templates/email-professional.md +8 -1
- package/data/templates/meeting-notes.md +8 -1
- package/data/templates/penetration-test-report.md +8 -1
- package/data/templates/project-brief.md +8 -1
- package/data/templates/report-executive.md +8 -1
- package/data/templates/security-vulnerability-report.md +8 -1
- package/data/templates/threat-assessment-report.md +8 -1
- package/dist/auth/GitHubAuthManager.d.ts +6 -1
- package/dist/auth/GitHubAuthManager.d.ts.map +1 -1
- package/dist/auth/GitHubAuthManager.js +45 -18
- package/dist/benchmarks/IndexPerformanceBenchmark.d.ts +98 -0
- package/dist/benchmarks/IndexPerformanceBenchmark.d.ts.map +1 -0
- package/dist/benchmarks/IndexPerformanceBenchmark.js +531 -0
- package/dist/cache/CollectionCache.d.ts.map +1 -1
- package/dist/cache/CollectionCache.js +13 -3
- package/dist/cache/CollectionIndexCache.d.ts +77 -0
- package/dist/cache/CollectionIndexCache.d.ts.map +1 -0
- package/dist/cache/CollectionIndexCache.js +349 -0
- package/dist/cache/LRUCache.d.ts +93 -0
- package/dist/cache/LRUCache.d.ts.map +1 -0
- package/dist/cache/LRUCache.js +299 -0
- package/dist/cache/index.d.ts +1 -0
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +2 -1
- package/dist/collection/CollectionBrowser.d.ts +21 -1
- package/dist/collection/CollectionBrowser.d.ts.map +1 -1
- package/dist/collection/CollectionBrowser.js +130 -10
- package/dist/collection/CollectionIndexManager.d.ts +151 -0
- package/dist/collection/CollectionIndexManager.d.ts.map +1 -0
- package/dist/collection/CollectionIndexManager.js +499 -0
- package/dist/collection/CollectionSearch.d.ts +55 -0
- package/dist/collection/CollectionSearch.d.ts.map +1 -1
- package/dist/collection/CollectionSearch.js +338 -13
- package/dist/collection/CollectionSeeder.d.ts.map +1 -1
- package/dist/collection/CollectionSeeder.js +38 -1
- package/dist/collection/ElementInstaller.d.ts +31 -0
- package/dist/collection/ElementInstaller.d.ts.map +1 -1
- package/dist/collection/ElementInstaller.js +77 -15
- package/dist/collection/PersonaSubmitter.d.ts +1 -1
- package/dist/collection/PersonaSubmitter.d.ts.map +1 -1
- package/dist/collection/PersonaSubmitter.js +2 -2
- package/dist/collection/index.d.ts +1 -0
- package/dist/collection/index.d.ts.map +1 -1
- package/dist/collection/index.js +2 -1
- package/dist/config/ConfigManager.d.ts +78 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +216 -0
- package/dist/config/element-types.d.ts +135 -0
- package/dist/config/element-types.d.ts.map +1 -0
- package/dist/config/element-types.js +108 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -1
- package/dist/config/portfolio-constants.d.ts +83 -0
- package/dist/config/portfolio-constants.d.ts.map +1 -0
- package/dist/config/portfolio-constants.js +99 -0
- package/dist/elements/BaseElement.d.ts +14 -2
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +88 -6
- package/dist/elements/agents/Agent.d.ts +10 -1
- package/dist/elements/agents/Agent.d.ts.map +1 -1
- package/dist/elements/agents/Agent.js +66 -19
- package/dist/elements/agents/AgentManager.d.ts +2 -0
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +12 -10
- package/dist/elements/skills/Skill.d.ts +10 -1
- package/dist/elements/skills/Skill.d.ts.map +1 -1
- package/dist/elements/skills/Skill.js +40 -3
- package/dist/elements/skills/SkillManager.d.ts +1 -0
- package/dist/elements/skills/SkillManager.d.ts.map +1 -1
- package/dist/elements/skills/SkillManager.js +10 -4
- package/dist/elements/templates/Template.d.ts +10 -1
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +35 -18
- package/dist/elements/templates/TemplateManager.d.ts +1 -1
- package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
- package/dist/elements/templates/TemplateManager.js +6 -5
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/index.barrel.d.ts +1 -2
- package/dist/index.barrel.d.ts.map +1 -1
- package/dist/index.barrel.js +2 -4
- package/dist/index.d.ts +143 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1883 -310
- package/dist/persona/PersonaElement.d.ts +10 -0
- package/dist/persona/PersonaElement.d.ts.map +1 -1
- package/dist/persona/PersonaElement.js +55 -32
- package/dist/persona/PersonaElementManager.d.ts.map +1 -1
- package/dist/persona/PersonaElementManager.js +13 -11
- package/dist/persona/PersonaLoader.d.ts.map +1 -1
- package/dist/persona/PersonaLoader.js +8 -2
- package/dist/persona/export-import/PersonaImporter.d.ts.map +1 -1
- package/dist/persona/export-import/PersonaImporter.js +24 -5
- package/dist/persona/export-import/PersonaSharer.d.ts +21 -0
- package/dist/persona/export-import/PersonaSharer.d.ts.map +1 -1
- package/dist/persona/export-import/PersonaSharer.js +198 -22
- package/dist/portfolio/DefaultElementProvider.d.ts +90 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +499 -7
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts +129 -0
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -0
- package/dist/portfolio/GitHubPortfolioIndexer.js +475 -0
- package/dist/portfolio/MigrationManager.d.ts.map +1 -1
- package/dist/portfolio/MigrationManager.js +136 -3
- package/dist/portfolio/PortfolioIndexManager.d.ts +130 -0
- package/dist/portfolio/PortfolioIndexManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioIndexManager.js +478 -0
- package/dist/portfolio/PortfolioManager.d.ts +5 -0
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioManager.js +61 -20
- package/dist/portfolio/PortfolioRepoManager.d.ts +75 -0
- package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioRepoManager.js +337 -0
- package/dist/portfolio/UnifiedIndexManager.d.ts +388 -0
- package/dist/portfolio/UnifiedIndexManager.d.ts.map +1 -0
- package/dist/portfolio/UnifiedIndexManager.js +1434 -0
- package/dist/portfolio/index.d.ts +15 -0
- package/dist/portfolio/index.d.ts.map +1 -0
- package/dist/portfolio/index.js +15 -0
- package/dist/portfolio/types.d.ts +7 -0
- package/dist/portfolio/types.d.ts.map +1 -1
- package/dist/portfolio/types.js +6 -1
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +50 -48
- package/dist/security/audit/SecurityAuditor.d.ts.map +1 -1
- package/dist/security/audit/SecurityAuditor.js +17 -9
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +19 -3
- package/dist/security/contentValidator.d.ts +2 -0
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +115 -4
- package/dist/security/secureYamlParser.d.ts +1 -0
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +29 -7
- package/dist/security/securityMonitor.d.ts +1 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +1 -1
- package/dist/security/tokenManager.d.ts +1 -1
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +30 -10
- package/dist/server/ServerSetup.d.ts +22 -2
- package/dist/server/ServerSetup.d.ts.map +1 -1
- package/dist/server/ServerSetup.js +77 -12
- package/dist/server/tools/AuthTools.d.ts.map +1 -1
- package/dist/server/tools/AuthTools.js +33 -1
- package/dist/server/tools/BuildInfoTools.d.ts +25 -0
- package/dist/server/tools/BuildInfoTools.d.ts.map +1 -0
- package/dist/server/tools/BuildInfoTools.js +36 -0
- package/dist/server/tools/CollectionTools.d.ts.map +1 -1
- package/dist/server/tools/CollectionTools.js +55 -46
- package/dist/server/tools/ConfigTools.d.ts.map +1 -1
- package/dist/server/tools/ConfigTools.js +29 -1
- package/dist/server/tools/PersonaTools.d.ts +4 -2
- package/dist/server/tools/PersonaTools.d.ts.map +1 -1
- package/dist/server/tools/PersonaTools.js +5 -152
- package/dist/server/tools/PortfolioTools.d.ts +12 -0
- package/dist/server/tools/PortfolioTools.d.ts.map +1 -0
- package/dist/server/tools/PortfolioTools.js +221 -0
- package/dist/server/tools/index.d.ts +3 -1
- package/dist/server/tools/index.d.ts.map +1 -1
- package/dist/server/tools/index.js +4 -2
- package/dist/server/types.d.ts +40 -5
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +1 -1
- package/dist/services/BuildInfoService.d.ts +84 -0
- package/dist/services/BuildInfoService.d.ts.map +1 -0
- package/dist/services/BuildInfoService.js +271 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts +54 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.d.ts.map +1 -0
- package/dist/tools/portfolio/PortfolioElementAdapter.js +229 -0
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts +164 -0
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -0
- package/dist/tools/portfolio/submitToPortfolioTool.js +1523 -0
- package/dist/tools/portfolio/types.d.ts +41 -0
- package/dist/tools/portfolio/types.d.ts.map +1 -0
- package/dist/tools/portfolio/types.js +15 -0
- package/dist/types/collection.d.ts +51 -0
- package/dist/types/collection.d.ts.map +1 -1
- package/dist/types/collection.js +1 -1
- package/dist/utils/EarlyTerminationSearch.d.ts +41 -0
- package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -0
- package/dist/utils/EarlyTerminationSearch.js +164 -0
- package/dist/utils/ErrorHandler.d.ts +86 -0
- package/dist/utils/ErrorHandler.d.ts.map +1 -0
- package/dist/utils/ErrorHandler.js +201 -0
- package/dist/utils/FileDiscoveryUtil.d.ts +53 -0
- package/dist/utils/FileDiscoveryUtil.d.ts.map +1 -0
- package/dist/utils/FileDiscoveryUtil.js +169 -0
- package/dist/utils/GitHubRateLimiter.d.ts +88 -0
- package/dist/utils/GitHubRateLimiter.d.ts.map +1 -0
- package/dist/utils/GitHubRateLimiter.js +315 -0
- package/dist/utils/PerformanceMonitor.d.ts +134 -0
- package/dist/utils/PerformanceMonitor.d.ts.map +1 -0
- package/dist/utils/PerformanceMonitor.js +347 -0
- package/dist/utils/RateLimiter.d.ts.map +1 -0
- package/dist/utils/RateLimiter.js +172 -0
- package/dist/utils/SecureDownloader.d.ts +241 -0
- package/dist/utils/SecureDownloader.d.ts.map +1 -0
- package/dist/utils/SecureDownloader.js +759 -0
- package/dist/utils/ToolCache.d.ts +82 -0
- package/dist/utils/ToolCache.d.ts.map +1 -0
- package/dist/utils/ToolCache.js +196 -0
- package/dist/utils/errorCodes.d.ts +136 -0
- package/dist/utils/errorCodes.d.ts.map +1 -0
- package/dist/utils/errorCodes.js +87 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -1
- package/dist/utils/installation.d.ts +1 -1
- package/dist/utils/installation.d.ts.map +1 -1
- package/dist/utils/installation.js +9 -8
- package/dist/utils/searchUtils.d.ts +31 -0
- package/dist/utils/searchUtils.d.ts.map +1 -1
- package/dist/utils/searchUtils.js +62 -1
- package/package.json +17 -7
- package/dist/config/updateConfig.d.ts +0 -84
- package/dist/config/updateConfig.d.ts.map +0 -1
- package/dist/config/updateConfig.js +0 -148
- package/dist/server/tools/UpdateTools.d.ts +0 -10
- package/dist/server/tools/UpdateTools.d.ts.map +0 -1
- package/dist/server/tools/UpdateTools.js +0 -85
- package/dist/update/BackupManager.d.ts +0 -63
- package/dist/update/BackupManager.d.ts.map +0 -1
- package/dist/update/BackupManager.js +0 -370
- package/dist/update/DependencyChecker.d.ts +0 -41
- package/dist/update/DependencyChecker.d.ts.map +0 -1
- package/dist/update/DependencyChecker.js +0 -132
- package/dist/update/RateLimiter.d.ts.map +0 -1
- package/dist/update/RateLimiter.js +0 -172
- package/dist/update/SignatureVerifier.d.ts +0 -71
- package/dist/update/SignatureVerifier.d.ts.map +0 -1
- package/dist/update/SignatureVerifier.js +0 -214
- package/dist/update/UpdateChecker.d.ts +0 -132
- package/dist/update/UpdateChecker.d.ts.map +0 -1
- package/dist/update/UpdateChecker.js +0 -506
- package/dist/update/UpdateManager.d.ts +0 -60
- package/dist/update/UpdateManager.d.ts.map +0 -1
- package/dist/update/UpdateManager.js +0 -730
- package/dist/update/VersionManager.d.ts +0 -31
- package/dist/update/VersionManager.d.ts.map +0 -1
- package/dist/update/VersionManager.js +0 -181
- package/dist/update/index.d.ts +0 -9
- package/dist/update/index.d.ts.map +0 -1
- package/dist/update/index.js +0 -9
- /package/dist/{update → utils}/RateLimiter.d.ts +0 -0
package/dist/index.js
CHANGED
|
@@ -17,6 +17,7 @@ import { loadIndicatorConfig, formatIndicator, validateCustomFormat } from './co
|
|
|
17
17
|
import { SecureYamlParser } from './security/secureYamlParser.js';
|
|
18
18
|
import { SecurityError } from './errors/SecurityError.js';
|
|
19
19
|
import { SecureErrorHandler } from './security/errorHandler.js';
|
|
20
|
+
import { ErrorHandler } from './utils/ErrorHandler.js';
|
|
20
21
|
import { APICache, CollectionCache } from './cache/index.js';
|
|
21
22
|
import { validateFilename, sanitizeInput, validateContentSize, validateUsername, MCPInputValidator } from './security/InputValidator.js';
|
|
22
23
|
import { SECURITY_LIMITS, VALIDATION_PATTERNS } from './security/constants.js';
|
|
@@ -24,8 +25,7 @@ import { ContentValidator } from './security/contentValidator.js';
|
|
|
24
25
|
import { PathValidator } from './security/pathValidator.js';
|
|
25
26
|
import { FileLockManager } from './security/fileLockManager.js';
|
|
26
27
|
import { generateAnonymousId, generateUniqueId, slugify } from './utils/filesystem.js';
|
|
27
|
-
import { GitHubClient, CollectionBrowser, CollectionSearch, PersonaDetails, PersonaSubmitter, ElementInstaller } from './collection/index.js';
|
|
28
|
-
import { UpdateManager } from './update/index.js';
|
|
28
|
+
import { GitHubClient, CollectionBrowser, CollectionIndexManager, CollectionSearch, PersonaDetails, PersonaSubmitter, ElementInstaller } from './collection/index.js';
|
|
29
29
|
import { ServerSetup } from './server/index.js';
|
|
30
30
|
import { GitHubAuthManager } from './auth/GitHubAuthManager.js';
|
|
31
31
|
import { logger } from './utils/logger.js';
|
|
@@ -36,6 +36,10 @@ import { MigrationManager } from './portfolio/MigrationManager.js';
|
|
|
36
36
|
import { SkillManager } from './elements/skills/index.js';
|
|
37
37
|
import { TemplateManager } from './elements/templates/TemplateManager.js';
|
|
38
38
|
import { AgentManager } from './elements/agents/AgentManager.js';
|
|
39
|
+
import { ConfigManager } from './config/ConfigManager.js';
|
|
40
|
+
import { spawn } from 'child_process';
|
|
41
|
+
import { fileURLToPath } from 'url';
|
|
42
|
+
import { homedir } from 'os';
|
|
39
43
|
// Detect execution environment
|
|
40
44
|
const EXECUTION_ENV = {
|
|
41
45
|
isNpx: process.env.npm_execpath?.includes('npx') || false,
|
|
@@ -54,18 +58,20 @@ export class DollhouseMCPServer {
|
|
|
54
58
|
personas = new Map();
|
|
55
59
|
activePersona = null;
|
|
56
60
|
currentUser = null;
|
|
61
|
+
isInitialized = false;
|
|
62
|
+
initializationPromise = null;
|
|
57
63
|
apiCache = new APICache();
|
|
58
64
|
collectionCache = new CollectionCache();
|
|
59
65
|
rateLimitTracker = new Map();
|
|
60
66
|
indicatorConfig;
|
|
61
67
|
githubClient;
|
|
62
68
|
githubAuthManager;
|
|
69
|
+
collectionIndexManager;
|
|
63
70
|
collectionBrowser;
|
|
64
71
|
collectionSearch;
|
|
65
72
|
personaDetails;
|
|
66
73
|
elementInstaller;
|
|
67
74
|
personaSubmitter;
|
|
68
|
-
updateManager;
|
|
69
75
|
serverSetup;
|
|
70
76
|
personaExporter;
|
|
71
77
|
personaImporter;
|
|
@@ -78,7 +84,7 @@ export class DollhouseMCPServer {
|
|
|
78
84
|
constructor() {
|
|
79
85
|
this.server = new Server({
|
|
80
86
|
name: "dollhousemcp",
|
|
81
|
-
version: "1.0.0",
|
|
87
|
+
version: "1.0.0-build-20250817-1630-pr606",
|
|
82
88
|
}, {
|
|
83
89
|
capabilities: {
|
|
84
90
|
tools: {},
|
|
@@ -90,7 +96,8 @@ export class DollhouseMCPServer {
|
|
|
90
96
|
// CRITICAL FIX: Don't access directories until after migration runs
|
|
91
97
|
// Previously: this.personasDir was set here, creating directories before migration could fix them
|
|
92
98
|
// Now: We delay directory access until initializePortfolio() completes
|
|
93
|
-
|
|
99
|
+
// Using null to make the uninitialized state explicit (per PR review feedback)
|
|
100
|
+
this.personasDir = null; // Will be properly initialized in completeInitialization()
|
|
94
101
|
// Initialize element managers
|
|
95
102
|
this.skillManager = new SkillManager();
|
|
96
103
|
this.templateManager = new TemplateManager();
|
|
@@ -106,7 +113,8 @@ export class DollhouseMCPServer {
|
|
|
106
113
|
// Initialize collection modules
|
|
107
114
|
this.githubClient = new GitHubClient(this.apiCache, this.rateLimitTracker);
|
|
108
115
|
this.githubAuthManager = new GitHubAuthManager(this.apiCache);
|
|
109
|
-
this.
|
|
116
|
+
this.collectionIndexManager = new CollectionIndexManager();
|
|
117
|
+
this.collectionBrowser = new CollectionBrowser(this.githubClient, this.collectionCache, this.collectionIndexManager);
|
|
110
118
|
this.collectionSearch = new CollectionSearch(this.githubClient, this.collectionCache);
|
|
111
119
|
this.personaDetails = new PersonaDetails(this.githubClient);
|
|
112
120
|
this.elementInstaller = new ElementInstaller(this.githubClient);
|
|
@@ -119,33 +127,9 @@ export class DollhouseMCPServer {
|
|
|
119
127
|
// Initialize server setup
|
|
120
128
|
this.serverSetup = new ServerSetup();
|
|
121
129
|
this.serverSetup.setupServer(this.server, this);
|
|
122
|
-
//
|
|
123
|
-
this.initializePortfolio().then(
|
|
124
|
-
|
|
125
|
-
this.personasDir = this.portfolioManager.getElementDir(ElementType.PERSONA);
|
|
126
|
-
// Log resolved path for debugging
|
|
127
|
-
logger.info(`Personas directory resolved to: ${this.personasDir}`);
|
|
128
|
-
// Initialize PathValidator with the personas directory
|
|
129
|
-
PathValidator.initialize(this.personasDir);
|
|
130
|
-
// Initialize update manager with safe directory
|
|
131
|
-
// Use the parent of personas directory to avoid production check
|
|
132
|
-
const safeDir = path.dirname(this.personasDir);
|
|
133
|
-
try {
|
|
134
|
-
this.updateManager = new UpdateManager(safeDir);
|
|
135
|
-
}
|
|
136
|
-
catch (error) {
|
|
137
|
-
console.error('[DollhouseMCP] Failed to initialize UpdateManager:', error);
|
|
138
|
-
logger.error(`Failed to initialize UpdateManager: ${error}`);
|
|
139
|
-
// Continue without update functionality
|
|
140
|
-
}
|
|
141
|
-
// Initialize import module that depends on personasDir
|
|
142
|
-
this.personaImporter = new PersonaImporter(this.personasDir, this.currentUser);
|
|
143
|
-
this.loadPersonas();
|
|
144
|
-
}).catch(error => {
|
|
145
|
-
// Don't use CRITICAL in the error message as it triggers Docker test failures
|
|
146
|
-
console.error('[DollhouseMCP] Failed to initialize portfolio:', error);
|
|
147
|
-
logger.error(`Failed to initialize portfolio: ${error}`);
|
|
148
|
-
});
|
|
130
|
+
// FIX #610: Portfolio initialization moved to run() method to prevent race condition
|
|
131
|
+
// Previously: this.initializePortfolio().then() ran async in constructor
|
|
132
|
+
// Now: Initialization happens synchronously in run() before MCP connection
|
|
149
133
|
}
|
|
150
134
|
async initializePortfolio() {
|
|
151
135
|
// Check if migration is needed
|
|
@@ -173,6 +157,52 @@ export class DollhouseMCPServer {
|
|
|
173
157
|
// Initialize collection cache for anonymous access
|
|
174
158
|
await this.initializeCollectionCache();
|
|
175
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* Complete initialization after portfolio is ready
|
|
162
|
+
* FIX #610: This was previously in a .then() callback in the constructor
|
|
163
|
+
* Now called synchronously from run() to prevent race condition
|
|
164
|
+
*/
|
|
165
|
+
async completeInitialization() {
|
|
166
|
+
// NOW safe to access directories after migration
|
|
167
|
+
this.personasDir = this.portfolioManager.getElementDir(ElementType.PERSONA);
|
|
168
|
+
// Log resolved path for debugging
|
|
169
|
+
logger.info(`Personas directory resolved to: ${this.personasDir}`);
|
|
170
|
+
// Initialize PathValidator with the personas directory
|
|
171
|
+
PathValidator.initialize(this.personasDir);
|
|
172
|
+
// Initialize update manager with safe directory
|
|
173
|
+
// Initialize import module that depends on personasDir
|
|
174
|
+
this.personaImporter = new PersonaImporter(this.personasDir, this.currentUser);
|
|
175
|
+
this.loadPersonas();
|
|
176
|
+
// Mark initialization as complete
|
|
177
|
+
this.isInitialized = true;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Ensure server is initialized before any operation
|
|
181
|
+
* FIX #610: Added for test compatibility - tests don't call run()
|
|
182
|
+
*/
|
|
183
|
+
async ensureInitialized() {
|
|
184
|
+
if (this.isInitialized) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
// If initialization is already in progress, wait for it
|
|
188
|
+
if (this.initializationPromise) {
|
|
189
|
+
await this.initializationPromise;
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
// Start initialization
|
|
193
|
+
this.initializationPromise = (async () => {
|
|
194
|
+
try {
|
|
195
|
+
await this.initializePortfolio();
|
|
196
|
+
await this.completeInitialization();
|
|
197
|
+
logger.info("Portfolio and personas initialized successfully (lazy)");
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
ErrorHandler.logError('DollhouseMCPServer.ensureInitialized', error);
|
|
201
|
+
throw error;
|
|
202
|
+
}
|
|
203
|
+
})();
|
|
204
|
+
await this.initializationPromise;
|
|
205
|
+
}
|
|
176
206
|
/**
|
|
177
207
|
* Initialize collection cache with seed data for anonymous browsing
|
|
178
208
|
*/
|
|
@@ -192,7 +222,7 @@ export class DollhouseMCPServer {
|
|
|
192
222
|
}
|
|
193
223
|
}
|
|
194
224
|
catch (error) {
|
|
195
|
-
|
|
225
|
+
ErrorHandler.logError('DollhouseMCPServer.initializeCollectionCache', error);
|
|
196
226
|
// Don't throw - cache failures shouldn't prevent server startup
|
|
197
227
|
}
|
|
198
228
|
}
|
|
@@ -264,6 +294,7 @@ export class DollhouseMCPServer {
|
|
|
264
294
|
}
|
|
265
295
|
async loadPersonas() {
|
|
266
296
|
// Validate the personas directory path
|
|
297
|
+
// personasDir is guaranteed to be set by completeInitialization before this is called
|
|
267
298
|
if (!path.isAbsolute(this.personasDir)) {
|
|
268
299
|
logger.warn(`Personas directory path is not absolute: ${this.personasDir}`);
|
|
269
300
|
}
|
|
@@ -278,15 +309,18 @@ export class DollhouseMCPServer {
|
|
|
278
309
|
// Continue to try loading (directory will be empty)
|
|
279
310
|
}
|
|
280
311
|
catch (mkdirError) {
|
|
281
|
-
|
|
312
|
+
ErrorHandler.logError('DollhouseMCPServer.loadPersonas.mkdir', mkdirError, { personasDir: this.personasDir });
|
|
282
313
|
// Don't throw - empty portfolio is valid
|
|
283
314
|
this.personas.clear();
|
|
284
315
|
return;
|
|
285
316
|
}
|
|
286
317
|
}
|
|
287
318
|
try {
|
|
319
|
+
// personasDir is guaranteed to be set by completeInitialization before this is called
|
|
288
320
|
const files = await fs.readdir(this.personasDir);
|
|
289
|
-
const markdownFiles = files
|
|
321
|
+
const markdownFiles = files
|
|
322
|
+
.filter(file => file.endsWith('.md'))
|
|
323
|
+
.filter(file => !this.portfolioManager.isTestElement(file));
|
|
290
324
|
this.personas.clear();
|
|
291
325
|
if (markdownFiles.length === 0) {
|
|
292
326
|
logger.info('[DollhouseMCP] No personas found in portfolio. Use browse_collection to install some!');
|
|
@@ -344,7 +378,7 @@ export class DollhouseMCPServer {
|
|
|
344
378
|
logger.debug(`Loaded persona: ${metadata.name} (${uniqueId}`);
|
|
345
379
|
}
|
|
346
380
|
catch (error) {
|
|
347
|
-
|
|
381
|
+
ErrorHandler.logError('DollhouseMCPServer.loadPersonas.loadFile', error, { file });
|
|
348
382
|
}
|
|
349
383
|
}
|
|
350
384
|
}
|
|
@@ -355,7 +389,7 @@ export class DollhouseMCPServer {
|
|
|
355
389
|
this.personas.clear();
|
|
356
390
|
return;
|
|
357
391
|
}
|
|
358
|
-
|
|
392
|
+
ErrorHandler.logError('DollhouseMCPServer.loadPersonas', error);
|
|
359
393
|
this.personas.clear();
|
|
360
394
|
}
|
|
361
395
|
}
|
|
@@ -530,7 +564,8 @@ export class DollhouseMCPServer {
|
|
|
530
564
|
const skillList = skills.map(skill => {
|
|
531
565
|
const complexity = skill.metadata.complexity || 'beginner';
|
|
532
566
|
const domains = skill.metadata.domains?.join(', ') || 'general';
|
|
533
|
-
|
|
567
|
+
const version = skill.version || skill.metadata.version || '1.0.0';
|
|
568
|
+
return `🛠️ ${skill.metadata.name} (v${version}) - ${skill.metadata.description}\n Complexity: ${complexity} | Domains: ${domains}`;
|
|
534
569
|
}).join('\n\n');
|
|
535
570
|
return {
|
|
536
571
|
content: [{
|
|
@@ -551,7 +586,8 @@ export class DollhouseMCPServer {
|
|
|
551
586
|
}
|
|
552
587
|
const templateList = templates.map(template => {
|
|
553
588
|
const variables = template.metadata.variables?.map(v => v.name).join(', ') || 'none';
|
|
554
|
-
|
|
589
|
+
const version = template.version || template.metadata.version || '1.0.0';
|
|
590
|
+
return `📄 ${template.metadata.name} (v${version}) - ${template.metadata.description}\n Variables: ${variables}`;
|
|
555
591
|
}).join('\n\n');
|
|
556
592
|
return {
|
|
557
593
|
content: [{
|
|
@@ -573,7 +609,8 @@ export class DollhouseMCPServer {
|
|
|
573
609
|
const agentList = agents.map(agent => {
|
|
574
610
|
const specializations = agent.metadata.specializations?.join(', ') || 'general';
|
|
575
611
|
const status = agent.getStatus();
|
|
576
|
-
|
|
612
|
+
const version = agent.version || agent.metadata.version || '1.0.0';
|
|
613
|
+
return `🤖 ${agent.metadata.name} (v${version}) - ${agent.metadata.description}\n Status: ${status} | Specializations: ${specializations}`;
|
|
577
614
|
}).join('\n\n');
|
|
578
615
|
return {
|
|
579
616
|
content: [{
|
|
@@ -592,11 +629,11 @@ export class DollhouseMCPServer {
|
|
|
592
629
|
}
|
|
593
630
|
}
|
|
594
631
|
catch (error) {
|
|
595
|
-
|
|
632
|
+
ErrorHandler.logError('DollhouseMCPServer.handleListElements', error, { type });
|
|
596
633
|
return {
|
|
597
634
|
content: [{
|
|
598
635
|
type: "text",
|
|
599
|
-
text: `❌ Failed to list ${type}: ${
|
|
636
|
+
text: `❌ Failed to list ${type}: ${ErrorHandler.getUserMessage(error)}`
|
|
600
637
|
}]
|
|
601
638
|
};
|
|
602
639
|
}
|
|
@@ -674,11 +711,11 @@ export class DollhouseMCPServer {
|
|
|
674
711
|
}
|
|
675
712
|
}
|
|
676
713
|
catch (error) {
|
|
677
|
-
|
|
714
|
+
ErrorHandler.logError('DollhouseMCPServer.handleActivateElement', error, { type, name });
|
|
678
715
|
return {
|
|
679
716
|
content: [{
|
|
680
717
|
type: "text",
|
|
681
|
-
text: `❌ Failed to activate ${type} '${name}': ${
|
|
718
|
+
text: `❌ Failed to activate ${type} '${name}': ${ErrorHandler.getUserMessage(error)}`
|
|
682
719
|
}]
|
|
683
720
|
};
|
|
684
721
|
}
|
|
@@ -1084,6 +1121,8 @@ export class DollhouseMCPServer {
|
|
|
1084
1121
|
}
|
|
1085
1122
|
}
|
|
1086
1123
|
async createElement(args) {
|
|
1124
|
+
// Ensure initialization for test compatibility
|
|
1125
|
+
await this.ensureInitialized();
|
|
1087
1126
|
try {
|
|
1088
1127
|
const { name, type, description, content, metadata } = args;
|
|
1089
1128
|
// Validate element type
|
|
@@ -1098,6 +1137,21 @@ export class DollhouseMCPServer {
|
|
|
1098
1137
|
// Validate inputs
|
|
1099
1138
|
const validatedName = validateFilename(name);
|
|
1100
1139
|
const validatedDescription = sanitizeInput(description, SECURITY_LIMITS.MAX_METADATA_FIELD_LENGTH);
|
|
1140
|
+
// CRITICAL FIX: Validate content size BEFORE processing to prevent memory exhaustion
|
|
1141
|
+
// This prevents Claude from trying to output massive content in responses
|
|
1142
|
+
if (content) {
|
|
1143
|
+
try {
|
|
1144
|
+
validateContentSize(content, SECURITY_LIMITS.MAX_CONTENT_LENGTH);
|
|
1145
|
+
}
|
|
1146
|
+
catch (error) {
|
|
1147
|
+
return {
|
|
1148
|
+
content: [{
|
|
1149
|
+
type: "text",
|
|
1150
|
+
text: `❌ Content too large: ${error.message}. Maximum allowed size is ${SECURITY_LIMITS.MAX_CONTENT_LENGTH} characters (${Math.floor(SECURITY_LIMITS.MAX_CONTENT_LENGTH / 1024)}KB).`
|
|
1151
|
+
}]
|
|
1152
|
+
};
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1101
1155
|
// SECURITY FIX: Sanitize metadata to prevent prototype pollution
|
|
1102
1156
|
const sanitizedMetadata = this.sanitizeMetadata(metadata || {});
|
|
1103
1157
|
// Create element based on type
|
|
@@ -1182,17 +1236,21 @@ export class DollhouseMCPServer {
|
|
|
1182
1236
|
if (type === ElementType.PERSONA) {
|
|
1183
1237
|
return this.editPersona(name, field, String(value));
|
|
1184
1238
|
}
|
|
1185
|
-
// Get the appropriate manager based on type
|
|
1239
|
+
// Get the appropriate manager based on type with proper typing
|
|
1186
1240
|
let manager = null;
|
|
1241
|
+
let element;
|
|
1187
1242
|
switch (type) {
|
|
1188
1243
|
case ElementType.SKILL:
|
|
1189
1244
|
manager = this.skillManager;
|
|
1245
|
+
element = await this.skillManager.find((e) => e.metadata.name === name);
|
|
1190
1246
|
break;
|
|
1191
1247
|
case ElementType.TEMPLATE:
|
|
1192
1248
|
manager = this.templateManager;
|
|
1249
|
+
element = await this.templateManager.find((e) => e.metadata.name === name);
|
|
1193
1250
|
break;
|
|
1194
1251
|
case ElementType.AGENT:
|
|
1195
1252
|
manager = this.agentManager;
|
|
1253
|
+
element = await this.agentManager.find((e) => e.metadata.name === name);
|
|
1196
1254
|
break;
|
|
1197
1255
|
default:
|
|
1198
1256
|
return {
|
|
@@ -1202,8 +1260,7 @@ export class DollhouseMCPServer {
|
|
|
1202
1260
|
}]
|
|
1203
1261
|
};
|
|
1204
1262
|
}
|
|
1205
|
-
//
|
|
1206
|
-
const element = await manager.find((e) => e.metadata.name === name);
|
|
1263
|
+
// Check if element was found
|
|
1207
1264
|
if (!element) {
|
|
1208
1265
|
return {
|
|
1209
1266
|
content: [{
|
|
@@ -1257,34 +1314,115 @@ export class DollhouseMCPServer {
|
|
|
1257
1314
|
enumerable: true,
|
|
1258
1315
|
configurable: true
|
|
1259
1316
|
});
|
|
1260
|
-
//
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
element.version = `${element.version}.0.1`;
|
|
1317
|
+
// VERSION FIX: Handle version field updates differently
|
|
1318
|
+
// If user is directly editing version field, don't auto-increment
|
|
1319
|
+
if (field === 'version' || field === 'metadata.version') {
|
|
1320
|
+
const versionString = String(value);
|
|
1321
|
+
// VERSION VALIDATION: Validate version format
|
|
1322
|
+
// Accept semver (1.0.0), two-part (1.0), or single digit (1)
|
|
1323
|
+
// Also accepts pre-release versions (1.0.0-beta, 1.0.0-alpha.1)
|
|
1324
|
+
const isValidVersion = /^(\d+)(\.\d+)?(\.\d+)?(-[a-zA-Z0-9.-]+)?$/.test(versionString);
|
|
1325
|
+
if (!isValidVersion) {
|
|
1326
|
+
return {
|
|
1327
|
+
content: [{
|
|
1328
|
+
type: "text",
|
|
1329
|
+
text: `❌ Invalid version format: '${versionString}'. Please use format like 1.0.0, 1.0, or 1`
|
|
1330
|
+
}]
|
|
1331
|
+
};
|
|
1276
1332
|
}
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1333
|
+
// ERROR HANDLING: Wrap version update in try-catch
|
|
1334
|
+
try {
|
|
1335
|
+
// Update both locations to ensure consistency
|
|
1336
|
+
element.version = versionString;
|
|
1337
|
+
if (element.metadata) {
|
|
1338
|
+
element.metadata.version = versionString;
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
catch (error) {
|
|
1342
|
+
logger.error(`Failed to update version for ${name}:`, error);
|
|
1343
|
+
return {
|
|
1344
|
+
content: [{
|
|
1345
|
+
type: "text",
|
|
1346
|
+
text: `❌ Failed to update version: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
1347
|
+
}]
|
|
1348
|
+
};
|
|
1280
1349
|
}
|
|
1281
1350
|
}
|
|
1282
1351
|
else {
|
|
1283
|
-
//
|
|
1284
|
-
element.version
|
|
1352
|
+
// For other field edits, auto-increment version
|
|
1353
|
+
// VERSION FIX: Update both element.version AND element.metadata.version
|
|
1354
|
+
// Previously: Only element.version was updated, but some managers read from metadata.version
|
|
1355
|
+
// Now: Keep both in sync to ensure version persists correctly
|
|
1356
|
+
// ERROR HANDLING: Wrap auto-increment in try-catch
|
|
1357
|
+
try {
|
|
1358
|
+
if (element.version) {
|
|
1359
|
+
// PRE-RELEASE HANDLING: Check for pre-release versions
|
|
1360
|
+
const preReleaseMatch = element.version.match(/^(\d+\.\d+\.\d+)(-([a-zA-Z0-9.-]+))?$/);
|
|
1361
|
+
if (preReleaseMatch) {
|
|
1362
|
+
// Handle pre-release versions (e.g., 1.0.0-beta.1)
|
|
1363
|
+
const baseVersion = preReleaseMatch[1];
|
|
1364
|
+
const preReleaseTag = preReleaseMatch[3];
|
|
1365
|
+
if (preReleaseTag) {
|
|
1366
|
+
// If it has a pre-release tag, increment the pre-release number
|
|
1367
|
+
const preReleaseNumberMatch = preReleaseTag.match(/^([a-zA-Z]+)\.?(\d+)?$/);
|
|
1368
|
+
if (preReleaseNumberMatch) {
|
|
1369
|
+
const preReleaseType = preReleaseNumberMatch[1];
|
|
1370
|
+
const preReleaseNumber = parseInt(preReleaseNumberMatch[2] || '0') + 1;
|
|
1371
|
+
element.version = `${baseVersion}-${preReleaseType}.${preReleaseNumber}`;
|
|
1372
|
+
}
|
|
1373
|
+
else {
|
|
1374
|
+
// Complex pre-release, just increment patch
|
|
1375
|
+
const [major, minor, patch] = baseVersion.split('.').map(Number);
|
|
1376
|
+
element.version = `${major}.${minor}.${patch + 1}`;
|
|
1377
|
+
}
|
|
1378
|
+
}
|
|
1379
|
+
else {
|
|
1380
|
+
// Regular semver, increment patch
|
|
1381
|
+
const [major, minor, patch] = baseVersion.split('.').map(Number);
|
|
1382
|
+
element.version = `${major}.${minor}.${patch + 1}`;
|
|
1383
|
+
}
|
|
1384
|
+
}
|
|
1385
|
+
else {
|
|
1386
|
+
// Handle non-semver versions
|
|
1387
|
+
const versionParts = element.version.split('.');
|
|
1388
|
+
if (versionParts.length >= 3) {
|
|
1389
|
+
// Standard semver format (e.g., 1.0.0)
|
|
1390
|
+
const patch = parseInt(versionParts[2]) || 0;
|
|
1391
|
+
versionParts[2] = String(patch + 1);
|
|
1392
|
+
element.version = versionParts.join('.');
|
|
1393
|
+
}
|
|
1394
|
+
else if (versionParts.length === 2) {
|
|
1395
|
+
// Two-part version (e.g., 1.0) - add patch version
|
|
1396
|
+
element.version = `${element.version}.1`;
|
|
1397
|
+
}
|
|
1398
|
+
else if (versionParts.length === 1 && /^\d+$/.test(versionParts[0])) {
|
|
1399
|
+
// Single number version (e.g., 1) - convert to semver
|
|
1400
|
+
element.version = `${element.version}.0.1`;
|
|
1401
|
+
}
|
|
1402
|
+
else {
|
|
1403
|
+
// Non-standard version - append or replace with standard format
|
|
1404
|
+
element.version = '1.0.1';
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
}
|
|
1408
|
+
else {
|
|
1409
|
+
// No version - set initial version
|
|
1410
|
+
element.version = '1.0.0';
|
|
1411
|
+
}
|
|
1412
|
+
// Ensure metadata.version is also updated for managers that use it
|
|
1413
|
+
if (element.metadata) {
|
|
1414
|
+
element.metadata.version = element.version;
|
|
1415
|
+
}
|
|
1416
|
+
}
|
|
1417
|
+
catch (error) {
|
|
1418
|
+
logger.error(`Failed to auto-increment version for ${name}:`, error);
|
|
1419
|
+
// Don't fail the entire operation, just log the error
|
|
1420
|
+
// Version will remain unchanged
|
|
1421
|
+
}
|
|
1285
1422
|
}
|
|
1286
1423
|
// Save the element - need to determine filename
|
|
1287
1424
|
const filename = `${element.metadata.name.toLowerCase().replace(/[^a-z0-9-]/g, '-')}.md`;
|
|
1425
|
+
// TYPE SAFETY: No need for 'as any' cast anymore with proper typing
|
|
1288
1426
|
await manager.save(element, filename);
|
|
1289
1427
|
return {
|
|
1290
1428
|
content: [{
|
|
@@ -1402,6 +1540,8 @@ export class DollhouseMCPServer {
|
|
|
1402
1540
|
}
|
|
1403
1541
|
}
|
|
1404
1542
|
async deleteElement(args) {
|
|
1543
|
+
// Ensure initialization for test compatibility
|
|
1544
|
+
await this.ensureInitialized();
|
|
1405
1545
|
try {
|
|
1406
1546
|
const { name, type, deleteData } = args;
|
|
1407
1547
|
// Validate element type
|
|
@@ -1427,6 +1567,7 @@ export class DollhouseMCPServer {
|
|
|
1427
1567
|
break;
|
|
1428
1568
|
case ElementType.PERSONA:
|
|
1429
1569
|
// For personas, use a different approach
|
|
1570
|
+
// personasDir is guaranteed to be set after ensureInitialized()
|
|
1430
1571
|
const personaPath = path.join(this.personasDir, `${name}.md`);
|
|
1431
1572
|
try {
|
|
1432
1573
|
await fs.access(personaPath);
|
|
@@ -1445,7 +1586,7 @@ export class DollhouseMCPServer {
|
|
|
1445
1586
|
return {
|
|
1446
1587
|
content: [{
|
|
1447
1588
|
type: "text",
|
|
1448
|
-
text: `❌
|
|
1589
|
+
text: `❌ ${type.charAt(0).toUpperCase() + type.slice(1)} '${name}' not found`
|
|
1449
1590
|
}]
|
|
1450
1591
|
};
|
|
1451
1592
|
}
|
|
@@ -1615,9 +1756,13 @@ export class DollhouseMCPServer {
|
|
|
1615
1756
|
try {
|
|
1616
1757
|
// FIX #471: Replace legacy category validation with proper section/type validation
|
|
1617
1758
|
// Valid sections: library, showcase, catalog
|
|
1618
|
-
// Valid types: personas, skills, agents,
|
|
1759
|
+
// Valid types for MCP: personas, skills, agents, templates (others filtered per Issue #144)
|
|
1760
|
+
// Note: tools, prompts, ensembles, memories exist in collection but are filtered from MCP
|
|
1619
1761
|
const validSections = ['library', 'showcase', 'catalog'];
|
|
1620
|
-
|
|
1762
|
+
// ⚠️ CRITICAL: When adding new element types, you MUST update this array!
|
|
1763
|
+
// See docs/development/ADDING_NEW_ELEMENT_TYPES_CHECKLIST.md for complete checklist
|
|
1764
|
+
// This array is often forgotten and causes validation failures for new types
|
|
1765
|
+
const validTypes = ['personas', 'skills', 'agents', 'templates']; // Only MCP-supported types
|
|
1621
1766
|
// Validate section if provided
|
|
1622
1767
|
const validatedSection = section ? sanitizeInput(section.toLowerCase()) : undefined;
|
|
1623
1768
|
if (validatedSection && !validSections.includes(validatedSection)) {
|
|
@@ -1684,6 +1829,41 @@ export class DollhouseMCPServer {
|
|
|
1684
1829
|
};
|
|
1685
1830
|
}
|
|
1686
1831
|
}
|
|
1832
|
+
async searchCollectionEnhanced(query, options = {}) {
|
|
1833
|
+
try {
|
|
1834
|
+
// Enhanced input validation for search query
|
|
1835
|
+
const validatedQuery = MCPInputValidator.validateSearchQuery(query);
|
|
1836
|
+
// Validate and sanitize options
|
|
1837
|
+
const validatedOptions = {
|
|
1838
|
+
elementType: options.elementType ? String(options.elementType) : undefined,
|
|
1839
|
+
category: options.category ? String(options.category) : undefined,
|
|
1840
|
+
page: options.page ? Math.max(1, parseInt(options.page) || 1) : 1,
|
|
1841
|
+
pageSize: options.pageSize ? Math.min(100, Math.max(1, parseInt(options.pageSize) || 25)) : 25,
|
|
1842
|
+
sortBy: options.sortBy && ['relevance', 'name', 'date'].includes(options.sortBy) ? options.sortBy : 'relevance'
|
|
1843
|
+
};
|
|
1844
|
+
const results = await this.collectionSearch.searchCollectionWithOptions(validatedQuery, validatedOptions);
|
|
1845
|
+
const text = this.collectionSearch.formatSearchResultsWithPagination(results, this.getPersonaIndicator());
|
|
1846
|
+
return {
|
|
1847
|
+
content: [
|
|
1848
|
+
{
|
|
1849
|
+
type: "text",
|
|
1850
|
+
text: text,
|
|
1851
|
+
},
|
|
1852
|
+
],
|
|
1853
|
+
};
|
|
1854
|
+
}
|
|
1855
|
+
catch (error) {
|
|
1856
|
+
const sanitized = SecureErrorHandler.sanitizeError(error);
|
|
1857
|
+
return {
|
|
1858
|
+
content: [
|
|
1859
|
+
{
|
|
1860
|
+
type: "text",
|
|
1861
|
+
text: `${this.getPersonaIndicator()}❌ Error searching collection: ${sanitized.message}`,
|
|
1862
|
+
},
|
|
1863
|
+
],
|
|
1864
|
+
};
|
|
1865
|
+
}
|
|
1866
|
+
}
|
|
1687
1867
|
async getCollectionContent(path) {
|
|
1688
1868
|
try {
|
|
1689
1869
|
const { metadata, content } = await this.personaDetails.getCollectionContent(path);
|
|
@@ -1749,117 +1929,250 @@ export class DollhouseMCPServer {
|
|
|
1749
1929
|
}
|
|
1750
1930
|
}
|
|
1751
1931
|
async submitContent(contentIdentifier) {
|
|
1752
|
-
// Check GitHub authentication first
|
|
1753
|
-
const authStatus = await this.githubAuthManager.getAuthStatus();
|
|
1754
|
-
const isAuthenticated = authStatus.isAuthenticated;
|
|
1755
|
-
// Find the content in local collection
|
|
1756
|
-
let persona = this.personas.get(contentIdentifier);
|
|
1757
|
-
if (!persona) {
|
|
1758
|
-
// Search by name
|
|
1759
|
-
persona = Array.from(this.personas.values()).find(p => p.metadata.name.toLowerCase() === contentIdentifier.toLowerCase());
|
|
1760
|
-
}
|
|
1761
|
-
if (!persona) {
|
|
1762
|
-
return {
|
|
1763
|
-
content: [
|
|
1764
|
-
{
|
|
1765
|
-
type: "text",
|
|
1766
|
-
text: `${this.getPersonaIndicator()}❌ Content not found: ${contentIdentifier}`,
|
|
1767
|
-
},
|
|
1768
|
-
],
|
|
1769
|
-
};
|
|
1770
|
-
}
|
|
1771
|
-
// Validate persona content before submission
|
|
1772
1932
|
try {
|
|
1773
|
-
//
|
|
1774
|
-
const
|
|
1775
|
-
const
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1933
|
+
// Use the new portfolio-based submission tool
|
|
1934
|
+
const { SubmitToPortfolioTool } = await import('./tools/portfolio/submitToPortfolioTool.js');
|
|
1935
|
+
const { FileDiscoveryUtil } = await import('./utils/FileDiscoveryUtil.js');
|
|
1936
|
+
const submitTool = new SubmitToPortfolioTool(this.apiCache);
|
|
1937
|
+
// Try to find the content across all element types
|
|
1938
|
+
const portfolioManager = PortfolioManager.getInstance();
|
|
1939
|
+
let elementType;
|
|
1940
|
+
let foundPath = null;
|
|
1941
|
+
// PERFORMANCE OPTIMIZATION: Search all element directories in parallel
|
|
1942
|
+
// NOTE: This dynamically handles ALL element types from the ElementType enum
|
|
1943
|
+
// No hardcoded count - if you add 10 more element types tomorrow, this code
|
|
1944
|
+
// will automatically search all 16 types without any changes needed here
|
|
1945
|
+
const searchPromises = Object.values(ElementType).map(async (type) => {
|
|
1946
|
+
const dir = portfolioManager.getElementDir(type);
|
|
1947
|
+
try {
|
|
1948
|
+
const file = await FileDiscoveryUtil.findFile(dir, contentIdentifier, {
|
|
1949
|
+
extensions: ['.md', '.json', '.yaml', '.yml'],
|
|
1950
|
+
partialMatch: true,
|
|
1951
|
+
cacheResults: true
|
|
1952
|
+
});
|
|
1953
|
+
return file ? { type: type, file } : null;
|
|
1954
|
+
}
|
|
1955
|
+
catch (error) {
|
|
1956
|
+
// IMPROVED ERROR HANDLING: Log warnings for unexpected errors
|
|
1957
|
+
if (error?.code !== 'ENOENT' && error?.code !== 'ENOTDIR') {
|
|
1958
|
+
// Not just a missing directory - this could be a permission issue or other problem
|
|
1959
|
+
logger.warn(`Unexpected error searching ${type} directory`, {
|
|
1960
|
+
contentIdentifier,
|
|
1961
|
+
type,
|
|
1962
|
+
error: error?.message || String(error),
|
|
1963
|
+
code: error?.code
|
|
1964
|
+
});
|
|
1965
|
+
}
|
|
1966
|
+
else {
|
|
1967
|
+
// Directory doesn't exist - this is expected for unused element types
|
|
1968
|
+
logger.debug(`${type} directory does not exist, skipping`, { type });
|
|
1969
|
+
}
|
|
1970
|
+
return null;
|
|
1971
|
+
}
|
|
1972
|
+
});
|
|
1973
|
+
// Wait for all searches to complete and find the first match
|
|
1974
|
+
const searchResults = await Promise.allSettled(searchPromises);
|
|
1975
|
+
// NOTE: File validation - we rely on the portfolio directory structure to ensure
|
|
1976
|
+
// files are in the correct element type directory. Additional schema validation
|
|
1977
|
+
// could be added here if needed, but the current approach is sufficient as:
|
|
1978
|
+
// 1. FileDiscoveryUtil already validates file extensions
|
|
1979
|
+
// 2. Portfolio structure enforces proper organization
|
|
1980
|
+
// 3. submitToPortfolioTool performs additional validation downstream
|
|
1981
|
+
for (const result of searchResults) {
|
|
1982
|
+
if (result.status === 'fulfilled' && result.value) {
|
|
1983
|
+
foundPath = result.value.file;
|
|
1984
|
+
elementType = result.value.type;
|
|
1985
|
+
logger.debug(`Found content in ${elementType} directory`, {
|
|
1986
|
+
contentIdentifier,
|
|
1987
|
+
type: elementType,
|
|
1988
|
+
file: foundPath
|
|
1989
|
+
});
|
|
1990
|
+
break;
|
|
1991
|
+
}
|
|
1790
1992
|
}
|
|
1791
|
-
//
|
|
1792
|
-
|
|
1793
|
-
if (!
|
|
1993
|
+
// CRITICAL FIX: Never default to any element type when content is not found
|
|
1994
|
+
// This prevents incorrect submissions and forces proper type detection or user specification
|
|
1995
|
+
if (!elementType) {
|
|
1996
|
+
// Content not found in any element directory - provide helpful error with suggestions
|
|
1997
|
+
const availableTypes = Object.values(ElementType).join(', ');
|
|
1998
|
+
logger.warn(`Content "${contentIdentifier}" not found in any portfolio directory`, {
|
|
1999
|
+
contentIdentifier,
|
|
2000
|
+
searchedTypes: Object.values(ElementType)
|
|
2001
|
+
});
|
|
2002
|
+
// UX IMPROVEMENT: Enhanced error message with smart suggestions
|
|
2003
|
+
let errorMessage = `❌ Content "${contentIdentifier}" not found in portfolio.\n\n`;
|
|
2004
|
+
errorMessage += `🔍 **Searched across all element types**: ${availableTypes}\n\n`;
|
|
2005
|
+
// Try to provide smart suggestions based on partial matches
|
|
2006
|
+
try {
|
|
2007
|
+
const { FileDiscoveryUtil } = await import('./utils/FileDiscoveryUtil.js');
|
|
2008
|
+
const suggestions = [];
|
|
2009
|
+
// Search for similar names across all element types
|
|
2010
|
+
for (const elementType of Object.values(ElementType)) {
|
|
2011
|
+
const dir = portfolioManager.getElementDir(elementType);
|
|
2012
|
+
try {
|
|
2013
|
+
const partialMatches = await FileDiscoveryUtil.findFile(dir, contentIdentifier, {
|
|
2014
|
+
extensions: ['.md', '.json', '.yaml', '.yml'],
|
|
2015
|
+
partialMatch: true,
|
|
2016
|
+
cacheResults: false
|
|
2017
|
+
});
|
|
2018
|
+
if (Array.isArray(partialMatches) && partialMatches.length > 0) {
|
|
2019
|
+
for (const match of partialMatches.slice(0, 2)) {
|
|
2020
|
+
const basename = path.basename(match, path.extname(match));
|
|
2021
|
+
suggestions.push(`"${basename}" (${elementType})`);
|
|
2022
|
+
}
|
|
2023
|
+
}
|
|
2024
|
+
else if (partialMatches) {
|
|
2025
|
+
const basename = path.basename(partialMatches, path.extname(partialMatches));
|
|
2026
|
+
suggestions.push(`"${basename}" (${elementType})`);
|
|
2027
|
+
}
|
|
2028
|
+
}
|
|
2029
|
+
catch (error) {
|
|
2030
|
+
// Skip this type if there's an error
|
|
2031
|
+
continue;
|
|
2032
|
+
}
|
|
2033
|
+
}
|
|
2034
|
+
if (suggestions.length > 0) {
|
|
2035
|
+
errorMessage += `💡 **Did you mean one of these?**\n`;
|
|
2036
|
+
for (const suggestion of suggestions.slice(0, 5)) {
|
|
2037
|
+
errorMessage += ` • ${suggestion}\n`;
|
|
2038
|
+
}
|
|
2039
|
+
errorMessage += `\n`;
|
|
2040
|
+
}
|
|
2041
|
+
}
|
|
2042
|
+
catch (suggestionError) {
|
|
2043
|
+
// If suggestions fail, continue without them
|
|
2044
|
+
logger.debug('Failed to generate suggestions', { suggestionError });
|
|
2045
|
+
}
|
|
2046
|
+
errorMessage += `🛠️ **Step-by-step troubleshooting**:\n`;
|
|
2047
|
+
errorMessage += `1. 📝 **List all content**: Use \`list_portfolio\` to see what's available\n`;
|
|
2048
|
+
errorMessage += `2. 🔍 **Check spelling**: Verify the exact name and try variations\n`;
|
|
2049
|
+
errorMessage += `3. 🎯 **Specify type**: Try \`submit_content "${contentIdentifier}" --type=personas\`\n`;
|
|
2050
|
+
errorMessage += `4. 📁 **Browse files**: Check your portfolio directory manually\n\n`;
|
|
2051
|
+
errorMessage += `📝 **Tip**: The system searches both filenames and display names with fuzzy matching.`;
|
|
1794
2052
|
return {
|
|
1795
2053
|
content: [
|
|
1796
2054
|
{
|
|
1797
2055
|
type: "text",
|
|
1798
|
-
text:
|
|
1799
|
-
`The persona metadata contains potentially problematic content:\n` +
|
|
1800
|
-
`• ${metadataValidation.detectedPatterns?.join('\n• ')}\n\n` +
|
|
1801
|
-
`Please fix these issues before submitting.`,
|
|
2056
|
+
text: errorMessage,
|
|
1802
2057
|
},
|
|
1803
2058
|
],
|
|
1804
2059
|
};
|
|
1805
2060
|
}
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
2061
|
+
// Check for duplicates across all sources before submission
|
|
2062
|
+
try {
|
|
2063
|
+
const { UnifiedIndexManager } = await import('./portfolio/UnifiedIndexManager.js');
|
|
2064
|
+
const unifiedManager = UnifiedIndexManager.getInstance();
|
|
2065
|
+
// Extract the actual element name from the content path
|
|
2066
|
+
const basename = path.basename(foundPath, path.extname(foundPath));
|
|
2067
|
+
const duplicates = await unifiedManager.checkDuplicates(basename);
|
|
2068
|
+
if (duplicates.length > 0) {
|
|
2069
|
+
const duplicate = duplicates[0];
|
|
2070
|
+
let warningText = `⚠️ **Duplicate Detection Alert**\n\n`;
|
|
2071
|
+
warningText += `Found "${duplicate.name}" in multiple sources:\n\n`;
|
|
2072
|
+
for (const source of duplicate.sources) {
|
|
2073
|
+
const sourceIcon = this.getSourceIcon(source.source);
|
|
2074
|
+
warningText += `${sourceIcon} **${source.source}**: ${source.version || 'unknown version'} (${source.lastModified.toLocaleDateString()})\n`;
|
|
2075
|
+
}
|
|
2076
|
+
warningText += `\n`;
|
|
2077
|
+
if (duplicate.hasVersionConflict && duplicate.versionConflict) {
|
|
2078
|
+
warningText += `🔄 **Version Conflict Detected**\n`;
|
|
2079
|
+
warningText += `Recommended source: **${duplicate.versionConflict.recommended}**\n`;
|
|
2080
|
+
warningText += `Reason: ${duplicate.versionConflict.reason}\n\n`;
|
|
2081
|
+
}
|
|
2082
|
+
warningText += `**Recommendations:**\n`;
|
|
2083
|
+
warningText += `• Review existing versions before submitting\n`;
|
|
2084
|
+
warningText += `• Consider updating local version instead of creating duplicate\n`;
|
|
2085
|
+
warningText += `• Ensure your version adds meaningful improvements\n`;
|
|
2086
|
+
warningText += `• Update version number in metadata if submitting enhancement\n\n`;
|
|
2087
|
+
warningText += `**Proceeding with submission anyway...**\n\n`;
|
|
2088
|
+
// Log the duplicate detection for monitoring
|
|
2089
|
+
logger.warn('Duplicate content detected during submission', {
|
|
2090
|
+
contentIdentifier,
|
|
2091
|
+
elementType,
|
|
2092
|
+
duplicateInfo: duplicate
|
|
2093
|
+
});
|
|
2094
|
+
// Continue with submission but show warning
|
|
2095
|
+
const result = await submitTool.execute({
|
|
2096
|
+
name: contentIdentifier,
|
|
2097
|
+
type: elementType
|
|
2098
|
+
});
|
|
2099
|
+
// Combine warning with submission result
|
|
2100
|
+
const responseText = `${this.getPersonaIndicator()}${result.success ? '⚠️' : '❌'} ${warningText}${result.message}`;
|
|
2101
|
+
return {
|
|
2102
|
+
content: [{
|
|
2103
|
+
type: "text",
|
|
2104
|
+
text: responseText,
|
|
2105
|
+
}],
|
|
2106
|
+
};
|
|
2107
|
+
}
|
|
2108
|
+
}
|
|
2109
|
+
catch (duplicateError) {
|
|
2110
|
+
// If duplicate checking fails, log but continue with submission
|
|
2111
|
+
logger.warn('Duplicate checking failed during submission', {
|
|
2112
|
+
contentIdentifier,
|
|
2113
|
+
error: duplicateError instanceof Error ? duplicateError.message : String(duplicateError)
|
|
2114
|
+
});
|
|
2115
|
+
}
|
|
2116
|
+
// Execute the submission with the detected element type
|
|
2117
|
+
const result = await submitTool.execute({
|
|
2118
|
+
name: contentIdentifier,
|
|
2119
|
+
type: elementType
|
|
2120
|
+
});
|
|
2121
|
+
// Format the response - the message already contains all details
|
|
2122
|
+
let responseText = result.message;
|
|
2123
|
+
// Add persona indicator for consistency
|
|
2124
|
+
responseText = `${this.getPersonaIndicator()}${result.success ? '✅' : '❌'} ${responseText}`;
|
|
1809
2125
|
return {
|
|
1810
2126
|
content: [
|
|
1811
2127
|
{
|
|
1812
2128
|
type: "text",
|
|
1813
|
-
text:
|
|
2129
|
+
text: responseText,
|
|
1814
2130
|
},
|
|
1815
2131
|
],
|
|
1816
2132
|
};
|
|
1817
2133
|
}
|
|
1818
|
-
// Generate submission issue with rate limiting
|
|
1819
|
-
let githubIssueUrl;
|
|
1820
|
-
let rateLimitStatus;
|
|
1821
|
-
try {
|
|
1822
|
-
const submissionResult = this.personaSubmitter.generateSubmissionIssue(persona);
|
|
1823
|
-
githubIssueUrl = submissionResult.githubIssueUrl;
|
|
1824
|
-
rateLimitStatus = submissionResult.rateLimitStatus;
|
|
1825
|
-
}
|
|
1826
2134
|
catch (error) {
|
|
1827
|
-
//
|
|
1828
|
-
|
|
1829
|
-
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
2135
|
+
// UX IMPROVEMENT: Comprehensive error handling with fallback suggestions
|
|
2136
|
+
logger.error('Unexpected error in submitContent', {
|
|
2137
|
+
contentIdentifier,
|
|
2138
|
+
error: error.message,
|
|
2139
|
+
stack: error.stack
|
|
2140
|
+
});
|
|
2141
|
+
let errorMessage = `${this.getPersonaIndicator()}❌ **Submission Failed**\n\n`;
|
|
2142
|
+
errorMessage += `🚨 **Error**: ${error.message || 'Unknown error occurred'}\n\n`;
|
|
2143
|
+
// Provide contextual troubleshooting based on error type
|
|
2144
|
+
if (error.message?.includes('auth') || error.message?.includes('token')) {
|
|
2145
|
+
errorMessage += `🔐 **Authentication Issue**:\n`;
|
|
2146
|
+
errorMessage += `• Run: \`setup_github_auth\` to re-authenticate\n`;
|
|
2147
|
+
errorMessage += `• Check: \`gh auth status\` if you have GitHub CLI\n\n`;
|
|
2148
|
+
}
|
|
2149
|
+
if (error.message?.includes('network') || error.message?.includes('connection')) {
|
|
2150
|
+
errorMessage += `🌐 **Network Issue**:\n`;
|
|
2151
|
+
errorMessage += `• Check your internet connection\n`;
|
|
2152
|
+
errorMessage += `• Try again in a few minutes\n`;
|
|
2153
|
+
errorMessage += `• Check GitHub status: https://status.github.com\n\n`;
|
|
1839
2154
|
}
|
|
1840
|
-
|
|
2155
|
+
errorMessage += `🚑 **Emergency Alternatives**:\n`;
|
|
2156
|
+
errorMessage += `1. 🔄 **Retry**: Try the same command again\n`;
|
|
2157
|
+
errorMessage += `2. 📝 **Check content**: Use \`list_portfolio\` to verify the element exists\n`;
|
|
2158
|
+
errorMessage += `3. 🎯 **Specify type**: Add \`--type=personas\` if you know the element type\n`;
|
|
2159
|
+
errorMessage += `4. 🚑 **Manual upload**: Copy content directly to GitHub via web interface\n\n`;
|
|
2160
|
+
errorMessage += `📞 **Need help?** This looks like a system issue. Please report it with the error details above.`;
|
|
2161
|
+
return {
|
|
2162
|
+
content: [
|
|
2163
|
+
{
|
|
2164
|
+
type: "text",
|
|
2165
|
+
text: errorMessage,
|
|
2166
|
+
},
|
|
2167
|
+
],
|
|
2168
|
+
};
|
|
1841
2169
|
}
|
|
1842
|
-
// Choose response format based on authentication status
|
|
1843
|
-
const text = isAuthenticated
|
|
1844
|
-
? this.personaSubmitter.formatSubmissionResponse(persona, githubIssueUrl, this.getPersonaIndicator())
|
|
1845
|
-
: this.personaSubmitter.formatAnonymousSubmissionResponse(persona, githubIssueUrl, this.getPersonaIndicator());
|
|
1846
|
-
// Add rate limit info if available
|
|
1847
|
-
const rateLimitInfo = rateLimitStatus
|
|
1848
|
-
? `\n\n📊 **Rate Limit Status:** ${rateLimitStatus.remainingTokens} submissions remaining this hour`
|
|
1849
|
-
: '';
|
|
1850
|
-
return {
|
|
1851
|
-
content: [
|
|
1852
|
-
{
|
|
1853
|
-
type: "text",
|
|
1854
|
-
text: text + rateLimitInfo,
|
|
1855
|
-
},
|
|
1856
|
-
],
|
|
1857
|
-
};
|
|
1858
2170
|
}
|
|
1859
2171
|
async getCollectionCacheHealth() {
|
|
1860
2172
|
try {
|
|
1861
|
-
// Get cache statistics
|
|
1862
|
-
const
|
|
2173
|
+
// Get cache statistics from both caches
|
|
2174
|
+
const collectionStats = await this.collectionCache.getCacheStats();
|
|
2175
|
+
const searchStats = await this.collectionSearch.getCacheStats();
|
|
1863
2176
|
// Check if cache directory exists
|
|
1864
2177
|
const cacheDir = path.join(process.cwd(), '.dollhousemcp', 'cache');
|
|
1865
2178
|
let cacheFileExists = false;
|
|
@@ -1884,36 +2197,52 @@ export class DollhouseMCPServer {
|
|
|
1884
2197
|
}
|
|
1885
2198
|
return `${minutes}m old`;
|
|
1886
2199
|
};
|
|
1887
|
-
// Build health report
|
|
2200
|
+
// Build health report with both cache systems
|
|
1888
2201
|
const healthReport = {
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
2202
|
+
collection: {
|
|
2203
|
+
status: collectionStats.isValid ? 'healthy' : (cacheFileExists ? 'expired' : 'empty'),
|
|
2204
|
+
cacheExists: cacheFileExists,
|
|
2205
|
+
itemCount: collectionStats.itemCount,
|
|
2206
|
+
cacheAge: formatAge(collectionStats.cacheAge),
|
|
2207
|
+
cacheAgeMs: collectionStats.cacheAge,
|
|
2208
|
+
isValid: collectionStats.isValid,
|
|
2209
|
+
cacheFileSize: cacheFileSize,
|
|
2210
|
+
cacheFileSizeFormatted: cacheFileSize > 0 ? `${(cacheFileSize / 1024).toFixed(2)} KB` : '0 KB',
|
|
2211
|
+
ttlRemaining: collectionStats.isValid ? formatAge(24 * 60 * 60 * 1000 - collectionStats.cacheAge) : 'Expired'
|
|
2212
|
+
},
|
|
2213
|
+
index: {
|
|
2214
|
+
status: searchStats.index.isValid ? 'healthy' : (searchStats.index.hasCache ? 'expired' : 'empty'),
|
|
2215
|
+
hasCache: searchStats.index.hasCache,
|
|
2216
|
+
elements: searchStats.index.elements,
|
|
2217
|
+
cacheAge: formatAge(searchStats.index.age),
|
|
2218
|
+
isValid: searchStats.index.isValid,
|
|
2219
|
+
ttlRemaining: searchStats.index.isValid ? formatAge(15 * 60 * 1000 - searchStats.index.age) : 'Expired'
|
|
2220
|
+
},
|
|
2221
|
+
overall: {
|
|
2222
|
+
recommendation: (collectionStats.isValid || searchStats.index.isValid)
|
|
2223
|
+
? 'Cache system is operational and serving content efficiently'
|
|
2224
|
+
: 'Cache system will refresh on next access for optimal performance'
|
|
2225
|
+
}
|
|
1903
2226
|
};
|
|
1904
2227
|
return {
|
|
1905
2228
|
content: [
|
|
1906
2229
|
{
|
|
1907
2230
|
type: "text",
|
|
1908
2231
|
text: `${this.getPersonaIndicator()}📊 **Collection Cache Health Check**\n\n` +
|
|
1909
|
-
|
|
1910
|
-
`**
|
|
1911
|
-
`**
|
|
1912
|
-
`**Cache
|
|
1913
|
-
`**
|
|
1914
|
-
`**TTL Remaining**: ${healthReport.ttlRemaining}\n\n` +
|
|
1915
|
-
|
|
1916
|
-
|
|
2232
|
+
`## 🗄️ Collection Cache (Legacy)\n` +
|
|
2233
|
+
`**Status**: ${healthReport.collection.status === 'healthy' ? '✅' : healthReport.collection.status === 'expired' ? '⚠️' : '📦'} ${healthReport.collection.status.toUpperCase()}\n` +
|
|
2234
|
+
`**Items Cached**: ${healthReport.collection.itemCount}\n` +
|
|
2235
|
+
`**Cache Age**: ${healthReport.collection.cacheAge}\n` +
|
|
2236
|
+
`**Cache Size**: ${healthReport.collection.cacheFileSizeFormatted}\n` +
|
|
2237
|
+
`**TTL Remaining**: ${healthReport.collection.ttlRemaining}\n\n` +
|
|
2238
|
+
`## 🚀 Index Cache (Enhanced Search)\n` +
|
|
2239
|
+
`**Status**: ${healthReport.index.status === 'healthy' ? '✅' : healthReport.index.status === 'expired' ? '⚠️' : '📦'} ${healthReport.index.status.toUpperCase()}\n` +
|
|
2240
|
+
`**Elements Indexed**: ${healthReport.index.elements}\n` +
|
|
2241
|
+
`**Cache Age**: ${healthReport.index.cacheAge}\n` +
|
|
2242
|
+
`**TTL Remaining**: ${healthReport.index.ttlRemaining}\n\n` +
|
|
2243
|
+
`**Overall Status**: ${healthReport.overall.recommendation}\n\n` +
|
|
2244
|
+
`The enhanced index cache provides fast search with pagination, filtering, and sorting. ` +
|
|
2245
|
+
`The collection cache serves as a fallback for offline browsing.`,
|
|
1917
2246
|
},
|
|
1918
2247
|
],
|
|
1919
2248
|
};
|
|
@@ -2073,13 +2402,108 @@ export class DollhouseMCPServer {
|
|
|
2073
2402
|
}
|
|
2074
2403
|
// Initiate device flow
|
|
2075
2404
|
const deviceResponse = await this.githubAuthManager.initiateDeviceFlow();
|
|
2076
|
-
//
|
|
2077
|
-
|
|
2405
|
+
// CRITICAL FIX: Use helper process approach from PR #518
|
|
2406
|
+
// MCP servers are stateless and terminate after returning response
|
|
2407
|
+
// The helper process survives MCP termination and can complete OAuth polling
|
|
2408
|
+
// Get the OAuth client ID
|
|
2409
|
+
const configManager = ConfigManager.getInstance();
|
|
2410
|
+
const clientId = await configManager.getGitHubClientId();
|
|
2411
|
+
if (!clientId) {
|
|
2412
|
+
return {
|
|
2413
|
+
content: [{
|
|
2414
|
+
type: "text",
|
|
2415
|
+
text: `${this.getPersonaIndicator()}❌ **GitHub OAuth Not Configured**\n\n` +
|
|
2416
|
+
`The server administrator needs to configure GitHub OAuth.\n\n` +
|
|
2417
|
+
`**Administrator Setup:**\n` +
|
|
2418
|
+
`1. Create OAuth app at: https://github.com/settings/applications/new\n` +
|
|
2419
|
+
`2. Set environment variable: DOLLHOUSE_GITHUB_CLIENT_ID\n` +
|
|
2420
|
+
`3. Restart the MCP server\n\n` +
|
|
2421
|
+
`For details, see: /docs/setup/OAUTH_SETUP.md`
|
|
2422
|
+
}]
|
|
2423
|
+
};
|
|
2424
|
+
}
|
|
2425
|
+
// Spawn the OAuth helper process
|
|
2426
|
+
// The helper runs independently and survives MCP server termination
|
|
2427
|
+
try {
|
|
2428
|
+
// Get the directory where the compiled JS file is
|
|
2429
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
2430
|
+
const __dirname = path.dirname(__filename);
|
|
2431
|
+
// Find the oauth-helper.mjs file
|
|
2432
|
+
// It should be in the root directory (one level up from dist/)
|
|
2433
|
+
const possiblePaths = [
|
|
2434
|
+
path.join(__dirname, '..', 'oauth-helper.mjs'), // From dist/index.js
|
|
2435
|
+
path.join(process.cwd(), 'oauth-helper.mjs'), // From CWD
|
|
2436
|
+
path.join(__dirname, 'oauth-helper.mjs') // Same directory
|
|
2437
|
+
];
|
|
2438
|
+
let helperPath = null;
|
|
2439
|
+
for (const testPath of possiblePaths) {
|
|
2440
|
+
try {
|
|
2441
|
+
await fs.access(testPath);
|
|
2442
|
+
helperPath = testPath;
|
|
2443
|
+
break;
|
|
2444
|
+
}
|
|
2445
|
+
catch {
|
|
2446
|
+
// Try next path
|
|
2447
|
+
}
|
|
2448
|
+
}
|
|
2449
|
+
if (!helperPath) {
|
|
2450
|
+
throw new Error('OAuth helper script not found. Please ensure oauth-helper.mjs is in the project root.');
|
|
2451
|
+
}
|
|
2452
|
+
// Spawn the helper as a detached process
|
|
2453
|
+
const helper = spawn('node', [
|
|
2454
|
+
helperPath,
|
|
2455
|
+
deviceResponse.device_code,
|
|
2456
|
+
(deviceResponse.interval || 5).toString(),
|
|
2457
|
+
deviceResponse.expires_in.toString(),
|
|
2458
|
+
clientId
|
|
2459
|
+
], {
|
|
2460
|
+
detached: true,
|
|
2461
|
+
stdio: 'ignore', // Completely detach I/O
|
|
2462
|
+
windowsHide: true // Hide console on Windows
|
|
2463
|
+
});
|
|
2464
|
+
// Allow the parent process to exit without waiting for the helper
|
|
2465
|
+
helper.unref();
|
|
2466
|
+
logger.info('OAuth helper process spawned', {
|
|
2467
|
+
pid: helper.pid,
|
|
2468
|
+
expiresIn: deviceResponse.expires_in,
|
|
2469
|
+
userCode: deviceResponse.user_code
|
|
2470
|
+
});
|
|
2471
|
+
// Write state file for monitoring
|
|
2472
|
+
const stateFile = path.join(homedir(), '.dollhouse', '.auth', 'oauth-helper-state.json');
|
|
2473
|
+
const stateDir = path.dirname(stateFile);
|
|
2474
|
+
await fs.mkdir(stateDir, { recursive: true });
|
|
2475
|
+
const state = {
|
|
2476
|
+
pid: helper.pid,
|
|
2477
|
+
deviceCode: deviceResponse.device_code,
|
|
2478
|
+
userCode: deviceResponse.user_code,
|
|
2479
|
+
startTime: new Date().toISOString(),
|
|
2480
|
+
expiresAt: new Date(Date.now() + deviceResponse.expires_in * 1000).toISOString()
|
|
2481
|
+
};
|
|
2482
|
+
await fs.writeFile(stateFile, JSON.stringify(state, null, 2));
|
|
2483
|
+
}
|
|
2484
|
+
catch (spawnError) {
|
|
2485
|
+
logger.error('Failed to spawn OAuth helper', { error: spawnError });
|
|
2486
|
+
// Fall back to informing user about the issue
|
|
2487
|
+
return {
|
|
2488
|
+
content: [{
|
|
2489
|
+
type: "text",
|
|
2490
|
+
text: `${this.getPersonaIndicator()}⚠️ **OAuth Helper Launch Failed**\n\n` +
|
|
2491
|
+
`Could not start background authentication process.\n\n` +
|
|
2492
|
+
`**Alternative Options:**\n` +
|
|
2493
|
+
`1. Try again: Run setup_github_auth again\n` +
|
|
2494
|
+
`2. Use GitHub CLI: gh auth login --web\n` +
|
|
2495
|
+
`3. Set token manually: export GITHUB_TOKEN=your_token\n\n` +
|
|
2496
|
+
`Error: ${spawnError instanceof Error ? spawnError.message : 'Unknown error'}`
|
|
2497
|
+
}]
|
|
2498
|
+
};
|
|
2499
|
+
}
|
|
2078
2500
|
// Return instructions to user
|
|
2079
2501
|
return {
|
|
2080
2502
|
content: [{
|
|
2081
2503
|
type: "text",
|
|
2082
|
-
text: this.githubAuthManager.formatAuthInstructions(deviceResponse)
|
|
2504
|
+
text: this.githubAuthManager.formatAuthInstructions(deviceResponse) +
|
|
2505
|
+
'\n\n📝 **Note**: Authentication will complete automatically once you authorize. ' +
|
|
2506
|
+
'Your token will be stored securely for future use!'
|
|
2083
2507
|
}]
|
|
2084
2508
|
};
|
|
2085
2509
|
}
|
|
@@ -2097,8 +2521,15 @@ export class DollhouseMCPServer {
|
|
|
2097
2521
|
}
|
|
2098
2522
|
async checkGitHubAuth() {
|
|
2099
2523
|
try {
|
|
2524
|
+
// First check for OAuth helper process health
|
|
2525
|
+
const helperHealth = await this.checkOAuthHelperHealth();
|
|
2100
2526
|
const status = await this.githubAuthManager.getAuthStatus();
|
|
2101
2527
|
if (status.isAuthenticated) {
|
|
2528
|
+
// Clean up helper state file if auth is successful
|
|
2529
|
+
if (helperHealth.exists) {
|
|
2530
|
+
const stateFile = path.join(homedir(), '.dollhouse', '.auth', 'oauth-helper-state.json');
|
|
2531
|
+
await fs.unlink(stateFile).catch(() => { });
|
|
2532
|
+
}
|
|
2102
2533
|
return {
|
|
2103
2534
|
content: [{
|
|
2104
2535
|
type: "text",
|
|
@@ -2113,6 +2544,39 @@ export class DollhouseMCPServer {
|
|
|
2113
2544
|
}]
|
|
2114
2545
|
};
|
|
2115
2546
|
}
|
|
2547
|
+
else if (helperHealth.isActive) {
|
|
2548
|
+
// OAuth helper is actively polling
|
|
2549
|
+
return {
|
|
2550
|
+
content: [{
|
|
2551
|
+
type: "text",
|
|
2552
|
+
text: `${this.getPersonaIndicator()}⏳ **GitHub Authentication In Progress**\n\n` +
|
|
2553
|
+
`🔑 **User Code:** ${helperHealth.userCode}\n` +
|
|
2554
|
+
`⏱️ **Time Remaining:** ${Math.floor(helperHealth.timeRemaining / 60)}m ${helperHealth.timeRemaining % 60}s\n` +
|
|
2555
|
+
`🔄 **Process Status:** ${helperHealth.processAlive ? '✅ Running' : '⚠️ May have stopped'}\n` +
|
|
2556
|
+
`📁 **Log Available:** ${helperHealth.hasLog ? 'Yes' : 'No'}\n\n` +
|
|
2557
|
+
`**Waiting for you to:**\n` +
|
|
2558
|
+
`1. Go to: https://github.com/login/device\n` +
|
|
2559
|
+
`2. Enter code: **${helperHealth.userCode}**\n` +
|
|
2560
|
+
`3. Authorize the application\n\n` +
|
|
2561
|
+
`The authentication will complete automatically once you authorize.\n` +
|
|
2562
|
+
`Run this command again to check status.`
|
|
2563
|
+
}]
|
|
2564
|
+
};
|
|
2565
|
+
}
|
|
2566
|
+
else if (helperHealth.exists && helperHealth.expired) {
|
|
2567
|
+
// Helper state exists but expired
|
|
2568
|
+
return {
|
|
2569
|
+
content: [{
|
|
2570
|
+
type: "text",
|
|
2571
|
+
text: `${this.getPersonaIndicator()}⏱️ **Authentication Expired**\n\n` +
|
|
2572
|
+
`The GitHub authentication request has expired.\n` +
|
|
2573
|
+
`User code: ${helperHealth.userCode} (expired)\n\n` +
|
|
2574
|
+
`**To try again:**\n` +
|
|
2575
|
+
`Run: \`setup_github_auth\` to get a new code\n\n` +
|
|
2576
|
+
`${helperHealth.errorLog ? `**Error Log:**\n\`\`\`\n${helperHealth.errorLog}\n\`\`\`\n` : ''}`
|
|
2577
|
+
}]
|
|
2578
|
+
};
|
|
2579
|
+
}
|
|
2116
2580
|
else if (status.hasToken) {
|
|
2117
2581
|
return {
|
|
2118
2582
|
content: [{
|
|
@@ -2152,54 +2616,307 @@ export class DollhouseMCPServer {
|
|
|
2152
2616
|
};
|
|
2153
2617
|
}
|
|
2154
2618
|
}
|
|
2155
|
-
|
|
2619
|
+
// Public method for oauth_helper_status tool
|
|
2620
|
+
async getOAuthHelperStatus(verbose = false) {
|
|
2156
2621
|
try {
|
|
2157
|
-
await this.
|
|
2622
|
+
const health = await this.checkOAuthHelperHealth();
|
|
2623
|
+
const stateFile = path.join(homedir(), '.dollhouse', '.auth', 'oauth-helper-state.json');
|
|
2624
|
+
const logFile = path.join(homedir(), '.dollhouse', 'oauth-helper.log');
|
|
2625
|
+
const pidFile = path.join(homedir(), '.dollhouse', '.auth', 'oauth-helper.pid');
|
|
2626
|
+
let statusText = `${this.getPersonaIndicator()}📊 **OAuth Helper Process Diagnostics**\n\n`;
|
|
2627
|
+
// Basic status
|
|
2628
|
+
if (!health.exists) {
|
|
2629
|
+
statusText += `**Status:** No OAuth process detected\n`;
|
|
2630
|
+
statusText += `**State File:** Not found\n\n`;
|
|
2631
|
+
statusText += `No active authentication process. Run \`setup_github_auth\` to start one.\n`;
|
|
2632
|
+
}
|
|
2633
|
+
else if (health.isActive) {
|
|
2634
|
+
statusText += `**Status:** 🟢 ACTIVE - Authentication in progress\n`;
|
|
2635
|
+
statusText += `**User Code:** ${health.userCode}\n`;
|
|
2636
|
+
statusText += `**Process ID:** ${health.pid}\n`;
|
|
2637
|
+
statusText += `**Process Alive:** ${health.processAlive ? '✅ Yes' : '❌ No (may have crashed)'}\n`;
|
|
2638
|
+
statusText += `**Started:** ${health.startTime?.toLocaleString()}\n`;
|
|
2639
|
+
statusText += `**Expires:** ${health.expiresAt?.toLocaleString()}\n`;
|
|
2640
|
+
statusText += `**Time Remaining:** ${Math.floor(health.timeRemaining / 60)}m ${health.timeRemaining % 60}s\n\n`;
|
|
2641
|
+
if (!health.processAlive) {
|
|
2642
|
+
statusText += `⚠️ **WARNING:** Process appears to have stopped!\n`;
|
|
2643
|
+
statusText += `The helper process (PID ${health.pid}) is not responding.\n`;
|
|
2644
|
+
statusText += `You may need to run \`setup_github_auth\` again.\n\n`;
|
|
2645
|
+
}
|
|
2646
|
+
}
|
|
2647
|
+
else if (health.expired) {
|
|
2648
|
+
statusText += `**Status:** 🔴 EXPIRED\n`;
|
|
2649
|
+
statusText += `**User Code:** ${health.userCode} (expired)\n`;
|
|
2650
|
+
statusText += `**Process ID:** ${health.pid}\n`;
|
|
2651
|
+
statusText += `**Started:** ${health.startTime?.toLocaleString()}\n`;
|
|
2652
|
+
statusText += `**Expired:** ${health.expiresAt?.toLocaleString()}\n\n`;
|
|
2653
|
+
statusText += `The authentication request has expired. Run \`setup_github_auth\` to try again.\n\n`;
|
|
2654
|
+
}
|
|
2655
|
+
// File locations
|
|
2656
|
+
statusText += `**📁 File Locations:**\n`;
|
|
2657
|
+
statusText += `• State: ${stateFile}\n`;
|
|
2658
|
+
statusText += `• Log: ${logFile} ${health.hasLog ? '(exists)' : '(not found)'}\n`;
|
|
2659
|
+
statusText += `• PID: ${pidFile}\n\n`;
|
|
2660
|
+
// Error log if available
|
|
2661
|
+
if (health.errorLog) {
|
|
2662
|
+
statusText += `**⚠️ Recent Errors:**\n\`\`\`\n${health.errorLog}\n\`\`\`\n\n`;
|
|
2663
|
+
}
|
|
2664
|
+
// Verbose log output
|
|
2665
|
+
if (verbose && health.hasLog) {
|
|
2666
|
+
try {
|
|
2667
|
+
const fullLog = await fs.readFile(logFile, 'utf-8');
|
|
2668
|
+
const lines = fullLog.split('\n').filter(line => line.trim());
|
|
2669
|
+
const recentLines = lines.slice(-20); // Last 20 lines
|
|
2670
|
+
statusText += `**📜 Recent Log Output (last 20 lines):**\n\`\`\`\n`;
|
|
2671
|
+
statusText += recentLines.join('\n');
|
|
2672
|
+
statusText += `\n\`\`\`\n\n`;
|
|
2673
|
+
}
|
|
2674
|
+
catch (error) {
|
|
2675
|
+
statusText += `**📜 Log:** Unable to read log file\n\n`;
|
|
2676
|
+
}
|
|
2677
|
+
}
|
|
2678
|
+
// Troubleshooting tips
|
|
2679
|
+
if (health.exists && !health.processAlive && !health.expired) {
|
|
2680
|
+
statusText += `**🔧 Troubleshooting Tips:**\n`;
|
|
2681
|
+
statusText += `1. The helper process may have crashed\n`;
|
|
2682
|
+
statusText += `2. Check the log file for errors: ${logFile}\n`;
|
|
2683
|
+
statusText += `3. Try running \`setup_github_auth\` again\n`;
|
|
2684
|
+
statusText += `4. Ensure DOLLHOUSE_GITHUB_CLIENT_ID is set\n`;
|
|
2685
|
+
statusText += `5. Check your internet connection\n`;
|
|
2686
|
+
}
|
|
2687
|
+
// Manual cleanup instructions
|
|
2688
|
+
if (health.exists && (health.expired || !health.processAlive)) {
|
|
2689
|
+
statusText += `\n**🧹 Manual Cleanup (if needed):**\n`;
|
|
2690
|
+
statusText += `\`\`\`bash\n`;
|
|
2691
|
+
statusText += `rm "${stateFile}"\n`;
|
|
2692
|
+
statusText += `rm "${logFile}"\n`;
|
|
2693
|
+
statusText += `rm "${pidFile}"\n`;
|
|
2694
|
+
statusText += `\`\`\`\n`;
|
|
2695
|
+
}
|
|
2158
2696
|
return {
|
|
2159
2697
|
content: [{
|
|
2160
2698
|
type: "text",
|
|
2161
|
-
text:
|
|
2162
|
-
`Your GitHub connection has been cleared.\n\n` +
|
|
2163
|
-
`**What still works:**\n` +
|
|
2164
|
-
`✅ Browse the public collection\n` +
|
|
2165
|
-
`✅ Install community content\n` +
|
|
2166
|
-
`❌ Submit content (requires reconnection)\n\n` +
|
|
2167
|
-
`To reconnect later, just say "connect to GitHub"\n\n` +
|
|
2168
|
-
`⚠️ **Note:** To fully remove authentication, also unset the GITHUB_TOKEN environment variable.`
|
|
2699
|
+
text: statusText
|
|
2169
2700
|
}]
|
|
2170
2701
|
};
|
|
2171
2702
|
}
|
|
2172
2703
|
catch (error) {
|
|
2173
|
-
logger.error('Failed to
|
|
2704
|
+
logger.error('Failed to get OAuth helper status', { error });
|
|
2174
2705
|
return {
|
|
2175
2706
|
content: [{
|
|
2176
2707
|
type: "text",
|
|
2177
|
-
text: `${this.getPersonaIndicator()}❌ **Failed to
|
|
2708
|
+
text: `${this.getPersonaIndicator()}❌ **Failed to Get OAuth Helper Status**\n\n` +
|
|
2178
2709
|
`Error: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
2179
2710
|
}]
|
|
2180
2711
|
};
|
|
2181
2712
|
}
|
|
2182
2713
|
}
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
2714
|
+
// Helper method to check OAuth helper process health
|
|
2715
|
+
async checkOAuthHelperHealth() {
|
|
2716
|
+
const stateFile = path.join(homedir(), '.dollhouse', '.auth', 'oauth-helper-state.json');
|
|
2717
|
+
const logFile = path.join(homedir(), '.dollhouse', 'oauth-helper.log');
|
|
2718
|
+
const health = {
|
|
2719
|
+
exists: false,
|
|
2720
|
+
isActive: false,
|
|
2721
|
+
expired: false,
|
|
2722
|
+
processAlive: false,
|
|
2723
|
+
hasLog: false,
|
|
2724
|
+
userCode: '',
|
|
2725
|
+
timeRemaining: 0,
|
|
2726
|
+
pid: 0,
|
|
2727
|
+
startTime: null,
|
|
2728
|
+
expiresAt: null,
|
|
2729
|
+
errorLog: ''
|
|
2730
|
+
};
|
|
2187
2731
|
try {
|
|
2188
|
-
|
|
2189
|
-
const
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2732
|
+
// Check if state file exists
|
|
2733
|
+
const stateData = await fs.readFile(stateFile, 'utf-8');
|
|
2734
|
+
const state = JSON.parse(stateData);
|
|
2735
|
+
health.exists = true;
|
|
2736
|
+
health.pid = state.pid;
|
|
2737
|
+
health.userCode = state.userCode;
|
|
2738
|
+
health.startTime = new Date(state.startTime);
|
|
2739
|
+
health.expiresAt = new Date(state.expiresAt);
|
|
2740
|
+
const now = new Date();
|
|
2741
|
+
if (health.expiresAt > now) {
|
|
2742
|
+
health.isActive = true;
|
|
2743
|
+
health.timeRemaining = Math.ceil((health.expiresAt.getTime() - now.getTime()) / 1000);
|
|
2744
|
+
// Check if process is still alive (Unix/Linux/Mac)
|
|
2745
|
+
if (process.platform !== 'win32') {
|
|
2746
|
+
try {
|
|
2747
|
+
// Send signal 0 to check if process exists
|
|
2748
|
+
process.kill(health.pid, 0);
|
|
2749
|
+
health.processAlive = true;
|
|
2750
|
+
}
|
|
2751
|
+
catch {
|
|
2752
|
+
health.processAlive = false;
|
|
2753
|
+
}
|
|
2754
|
+
}
|
|
2755
|
+
else {
|
|
2756
|
+
// On Windows, we can't easily check, so assume it's alive if not expired
|
|
2757
|
+
health.processAlive = true;
|
|
2758
|
+
}
|
|
2759
|
+
}
|
|
2760
|
+
else {
|
|
2761
|
+
health.expired = true;
|
|
2762
|
+
}
|
|
2763
|
+
// Check for log file
|
|
2764
|
+
try {
|
|
2765
|
+
await fs.access(logFile);
|
|
2766
|
+
health.hasLog = true;
|
|
2767
|
+
// Read last few lines of log if there's an error
|
|
2768
|
+
if (!health.processAlive || health.expired) {
|
|
2769
|
+
const logContent = await fs.readFile(logFile, 'utf-8');
|
|
2770
|
+
const lines = logContent.split('\n');
|
|
2771
|
+
// Get last 10 lines that contain errors or important info
|
|
2772
|
+
const importantLines = lines.filter(line => line.includes('error') ||
|
|
2773
|
+
line.includes('Error') ||
|
|
2774
|
+
line.includes('failed') ||
|
|
2775
|
+
line.includes('Failed') ||
|
|
2776
|
+
line.includes('❌') ||
|
|
2777
|
+
line.includes('⏱️')).slice(-10);
|
|
2778
|
+
if (importantLines.length > 0) {
|
|
2779
|
+
health.errorLog = importantLines.join('\n');
|
|
2780
|
+
}
|
|
2781
|
+
}
|
|
2782
|
+
}
|
|
2783
|
+
catch {
|
|
2784
|
+
// Log file doesn't exist
|
|
2785
|
+
}
|
|
2195
2786
|
}
|
|
2196
2787
|
catch (error) {
|
|
2197
|
-
//
|
|
2198
|
-
|
|
2199
|
-
|
|
2788
|
+
// State file doesn't exist or is invalid
|
|
2789
|
+
if (error instanceof Error && error.message.includes('ENOENT')) {
|
|
2790
|
+
// File doesn't exist, that's ok
|
|
2791
|
+
}
|
|
2792
|
+
else {
|
|
2793
|
+
logger.debug('Error reading OAuth helper state', { error });
|
|
2794
|
+
}
|
|
2795
|
+
}
|
|
2796
|
+
return health;
|
|
2797
|
+
}
|
|
2798
|
+
async clearGitHubAuth() {
|
|
2799
|
+
try {
|
|
2800
|
+
await this.githubAuthManager.clearAuthentication();
|
|
2801
|
+
return {
|
|
2802
|
+
content: [{
|
|
2803
|
+
type: "text",
|
|
2804
|
+
text: `${this.getPersonaIndicator()}✅ **GitHub Disconnected**\n\n` +
|
|
2805
|
+
`Your GitHub connection has been cleared.\n\n` +
|
|
2806
|
+
`**What still works:**\n` +
|
|
2807
|
+
`✅ Browse the public collection\n` +
|
|
2808
|
+
`✅ Install community content\n` +
|
|
2809
|
+
`❌ Submit content (requires reconnection)\n\n` +
|
|
2810
|
+
`To reconnect later, just say "connect to GitHub"\n\n` +
|
|
2811
|
+
`⚠️ **Note:** To fully remove authentication, also unset the GITHUB_TOKEN environment variable.`
|
|
2812
|
+
}]
|
|
2813
|
+
};
|
|
2814
|
+
}
|
|
2815
|
+
catch (error) {
|
|
2816
|
+
logger.error('Failed to clear GitHub auth', { error });
|
|
2817
|
+
return {
|
|
2818
|
+
content: [{
|
|
2819
|
+
type: "text",
|
|
2820
|
+
text: `${this.getPersonaIndicator()}❌ **Failed to Clear Authentication**\n\n` +
|
|
2821
|
+
`Error: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
2822
|
+
}]
|
|
2823
|
+
};
|
|
2824
|
+
}
|
|
2825
|
+
}
|
|
2826
|
+
// OAuth configuration management
|
|
2827
|
+
async configureOAuth(client_id) {
|
|
2828
|
+
try {
|
|
2829
|
+
const configManager = ConfigManager.getInstance();
|
|
2830
|
+
await configManager.loadConfig();
|
|
2831
|
+
// If no client_id provided, show current configuration status
|
|
2832
|
+
if (!client_id) {
|
|
2833
|
+
const currentClientId = configManager.getGitHubClientId();
|
|
2834
|
+
if (currentClientId) {
|
|
2835
|
+
// Show first 10 characters for security
|
|
2836
|
+
const maskedClientId = currentClientId.substring(0, 10) + '...';
|
|
2837
|
+
return {
|
|
2838
|
+
content: [{
|
|
2839
|
+
type: "text",
|
|
2840
|
+
text: `${this.getPersonaIndicator()}✅ **GitHub OAuth Configuration**\n\n` +
|
|
2841
|
+
`**Current Status:** Configured\n` +
|
|
2842
|
+
`**Client ID:** ${maskedClientId}\n\n` +
|
|
2843
|
+
`Your GitHub OAuth is ready to use! You can now:\n` +
|
|
2844
|
+
`• Run setup_github_auth to connect\n` +
|
|
2845
|
+
`• Submit content to the collection\n` +
|
|
2846
|
+
`• Access authenticated features\n\n` +
|
|
2847
|
+
`To update the configuration, provide a new client_id parameter.`
|
|
2848
|
+
}]
|
|
2849
|
+
};
|
|
2850
|
+
}
|
|
2851
|
+
else {
|
|
2852
|
+
return {
|
|
2853
|
+
content: [{
|
|
2854
|
+
type: "text",
|
|
2855
|
+
text: `${this.getPersonaIndicator()}⚠️ **GitHub OAuth Not Configured**\n\n` +
|
|
2856
|
+
`No GitHub OAuth client ID is currently configured.\n\n` +
|
|
2857
|
+
`**To set up OAuth:**\n` +
|
|
2858
|
+
`1. Create a GitHub OAuth app at: https://github.com/settings/applications/new\n` +
|
|
2859
|
+
`2. Use these settings:\n` +
|
|
2860
|
+
` • Homepage URL: https://github.com/DollhouseMCP\n` +
|
|
2861
|
+
` • Authorization callback URL: http://localhost:3000/callback\n` +
|
|
2862
|
+
`3. Copy your Client ID (starts with "Ov23li")\n` +
|
|
2863
|
+
`4. Run: configure_oauth with your client_id parameter\n\n` +
|
|
2864
|
+
`**Need help?** Check the documentation for detailed setup instructions.`
|
|
2865
|
+
}]
|
|
2866
|
+
};
|
|
2867
|
+
}
|
|
2868
|
+
}
|
|
2869
|
+
// Validate client ID format
|
|
2870
|
+
if (!ConfigManager.validateClientId(client_id)) {
|
|
2871
|
+
return {
|
|
2872
|
+
content: [{
|
|
2873
|
+
type: "text",
|
|
2874
|
+
text: `${this.getPersonaIndicator()}❌ **Invalid Client ID Format**\n\n` +
|
|
2875
|
+
`GitHub OAuth Client IDs must:\n` +
|
|
2876
|
+
`• Start with "Ov23li"\n` +
|
|
2877
|
+
`• Be followed by at least 14 alphanumeric characters\n\n` +
|
|
2878
|
+
`**Example:** Ov23liABCDEFGHIJKLMN\n\n` +
|
|
2879
|
+
`Please check your client ID and try again.`
|
|
2880
|
+
}]
|
|
2881
|
+
};
|
|
2882
|
+
}
|
|
2883
|
+
// Save the client ID
|
|
2884
|
+
await configManager.setGitHubClientId(client_id);
|
|
2885
|
+
// Show success message with masked ID
|
|
2886
|
+
const maskedClientId = client_id.substring(0, 10) + '...';
|
|
2887
|
+
return {
|
|
2888
|
+
content: [{
|
|
2889
|
+
type: "text",
|
|
2890
|
+
text: `${this.getPersonaIndicator()}✅ **GitHub OAuth Configured Successfully**\n\n` +
|
|
2891
|
+
`**Client ID:** ${maskedClientId}\n` +
|
|
2892
|
+
`**Saved to:** ~/.dollhouse/config.json\n\n` +
|
|
2893
|
+
`Your GitHub OAuth is now ready! Next steps:\n` +
|
|
2894
|
+
`• Run setup_github_auth to connect your account\n` +
|
|
2895
|
+
`• Start submitting content to the collection\n` +
|
|
2896
|
+
`• Access all authenticated features\n\n` +
|
|
2897
|
+
`**Note:** Your client ID is securely stored in your local config file.`
|
|
2898
|
+
}]
|
|
2899
|
+
};
|
|
2900
|
+
}
|
|
2901
|
+
catch (error) {
|
|
2902
|
+
logger.error('Failed to configure OAuth', { error });
|
|
2903
|
+
return {
|
|
2904
|
+
content: [{
|
|
2905
|
+
type: "text",
|
|
2906
|
+
text: `${this.getPersonaIndicator()}❌ **OAuth Configuration Failed**\n\n` +
|
|
2907
|
+
`Error: ${error instanceof Error ? error.message : 'Unknown error'}\n\n` +
|
|
2908
|
+
`Please check:\n` +
|
|
2909
|
+
`• File permissions for ~/.dollhouse/config.json\n` +
|
|
2910
|
+
`• Valid client ID format (starts with "Ov23li")\n` +
|
|
2911
|
+
`• Available disk space`
|
|
2912
|
+
}]
|
|
2913
|
+
};
|
|
2914
|
+
}
|
|
2200
2915
|
}
|
|
2201
2916
|
// Chat-based persona management tools
|
|
2202
2917
|
async createPersona(name, description, instructions, triggers) {
|
|
2918
|
+
// Ensure initialization for test compatibility
|
|
2919
|
+
await this.ensureInitialized();
|
|
2203
2920
|
try {
|
|
2204
2921
|
// Validate required fields
|
|
2205
2922
|
if (!name || !description || !instructions) {
|
|
@@ -2248,6 +2965,7 @@ export class DollhouseMCPServer {
|
|
|
2248
2965
|
const author = this.getCurrentUserForAttribution();
|
|
2249
2966
|
const uniqueId = generateUniqueId(sanitizedName, this.currentUser || undefined);
|
|
2250
2967
|
const filename = validateFilename(`${slugify(sanitizedName)}.md`);
|
|
2968
|
+
// personasDir is guaranteed to be set after ensureInitialized()
|
|
2251
2969
|
const filePath = path.join(this.personasDir, filename);
|
|
2252
2970
|
// Check if file already exists
|
|
2253
2971
|
try {
|
|
@@ -2424,6 +3142,7 @@ ${sanitizedInstructions}
|
|
|
2424
3142
|
],
|
|
2425
3143
|
};
|
|
2426
3144
|
}
|
|
3145
|
+
// personasDir is guaranteed to be set after initialization
|
|
2427
3146
|
let filePath = path.join(this.personasDir, persona.filename);
|
|
2428
3147
|
let isDefault = isDefaultPersona(persona.filename);
|
|
2429
3148
|
try {
|
|
@@ -2678,99 +3397,7 @@ ${sanitizedInstructions}
|
|
|
2678
3397
|
],
|
|
2679
3398
|
};
|
|
2680
3399
|
}
|
|
2681
|
-
// retryNetworkOperation
|
|
2682
|
-
// Auto-update management tools
|
|
2683
|
-
async checkForUpdates() {
|
|
2684
|
-
if (!this.updateManager) {
|
|
2685
|
-
return {
|
|
2686
|
-
content: [{ type: "text", text: this.getPersonaIndicator() + "❌ Update functionality not available (initialization failed)" }]
|
|
2687
|
-
};
|
|
2688
|
-
}
|
|
2689
|
-
const { text } = await this.updateManager.checkForUpdates();
|
|
2690
|
-
return {
|
|
2691
|
-
content: [{ type: "text", text: this.getPersonaIndicator() + text }]
|
|
2692
|
-
};
|
|
2693
|
-
}
|
|
2694
|
-
// Update helper methods are now handled by UpdateManager
|
|
2695
|
-
async updateServer(confirm) {
|
|
2696
|
-
if (!confirm) {
|
|
2697
|
-
return {
|
|
2698
|
-
content: [{
|
|
2699
|
-
type: "text",
|
|
2700
|
-
text: this.getPersonaIndicator() +
|
|
2701
|
-
'⚠️ **Update Confirmation Required**\n\n' +
|
|
2702
|
-
'To proceed with the update, you must confirm:\n' +
|
|
2703
|
-
'`update_server true`\n\n' +
|
|
2704
|
-
'**What will happen:**\n' +
|
|
2705
|
-
'• Backup current version\n' +
|
|
2706
|
-
'• Pull latest changes from GitHub\n' +
|
|
2707
|
-
'• Update dependencies\n' +
|
|
2708
|
-
'• Rebuild TypeScript\n' +
|
|
2709
|
-
'• Restart server (will disconnect temporarily)\n\n' +
|
|
2710
|
-
'**Prerequisites:**\n' +
|
|
2711
|
-
'• Git repository must be clean (no uncommitted changes)\n' +
|
|
2712
|
-
'• Network connection required\n' +
|
|
2713
|
-
'• Sufficient disk space for backup'
|
|
2714
|
-
}]
|
|
2715
|
-
};
|
|
2716
|
-
}
|
|
2717
|
-
if (!this.updateManager) {
|
|
2718
|
-
return {
|
|
2719
|
-
content: [{ type: "text", text: this.getPersonaIndicator() + "❌ Update functionality not available (initialization failed)" }]
|
|
2720
|
-
};
|
|
2721
|
-
}
|
|
2722
|
-
const { text } = await this.updateManager.updateServer(confirm, this.getPersonaIndicator());
|
|
2723
|
-
return {
|
|
2724
|
-
content: [{ type: "text", text }]
|
|
2725
|
-
};
|
|
2726
|
-
}
|
|
2727
|
-
// Rollback helper methods are now handled by UpdateManager
|
|
2728
|
-
async rollbackUpdate(confirm) {
|
|
2729
|
-
if (!this.updateManager) {
|
|
2730
|
-
return {
|
|
2731
|
-
content: [{ type: "text", text: this.getPersonaIndicator() + "❌ Update functionality not available (initialization failed)" }]
|
|
2732
|
-
};
|
|
2733
|
-
}
|
|
2734
|
-
const { text } = await this.updateManager.rollbackUpdate(confirm, this.getPersonaIndicator());
|
|
2735
|
-
return {
|
|
2736
|
-
content: [{ type: "text", text }]
|
|
2737
|
-
};
|
|
2738
|
-
}
|
|
2739
|
-
// Version and git info methods are now handled by UpdateManager
|
|
2740
|
-
// Status helper methods are now handled by UpdateManager
|
|
2741
|
-
async getServerStatus() {
|
|
2742
|
-
// Add persona information to the status
|
|
2743
|
-
const personaInfo = `
|
|
2744
|
-
**🎭 Persona Information:**
|
|
2745
|
-
• **Total Personas:** ${this.personas.size}
|
|
2746
|
-
• **Active Persona:** ${this.activePersona || 'None'}
|
|
2747
|
-
• **User Identity:** ${this.currentUser || 'Anonymous'}
|
|
2748
|
-
• **Personas Directory:** ${this.personasDir}`;
|
|
2749
|
-
if (!this.updateManager) {
|
|
2750
|
-
const errorMessage = `${this.getPersonaIndicator()}❌ Update functionality not available (initialization failed)\n\n${personaInfo}`;
|
|
2751
|
-
return {
|
|
2752
|
-
content: [{ type: "text", text: errorMessage }]
|
|
2753
|
-
};
|
|
2754
|
-
}
|
|
2755
|
-
const { text } = await this.updateManager.getServerStatus(this.getPersonaIndicator());
|
|
2756
|
-
// Insert persona info into the status text
|
|
2757
|
-
const updatedText = text.replace('**Available Commands:**', personaInfo + '\n\n**Available Commands:**');
|
|
2758
|
-
return {
|
|
2759
|
-
content: [{ type: "text", text: updatedText }]
|
|
2760
|
-
};
|
|
2761
|
-
}
|
|
2762
|
-
async convertToGitInstallation(targetDir, confirm = false) {
|
|
2763
|
-
if (!this.updateManager) {
|
|
2764
|
-
return {
|
|
2765
|
-
content: [{ type: "text", text: this.getPersonaIndicator() + "❌ Update functionality not available (initialization failed)" }]
|
|
2766
|
-
};
|
|
2767
|
-
}
|
|
2768
|
-
const result = await this.updateManager.convertToGitInstallation(targetDir, confirm, this.getPersonaIndicator());
|
|
2769
|
-
return {
|
|
2770
|
-
content: [{ type: "text", text: result.text }]
|
|
2771
|
-
};
|
|
2772
|
-
}
|
|
2773
|
-
// Version and dependency methods are now handled by UpdateManager
|
|
3400
|
+
// retryNetworkOperation has been removed with UpdateTools
|
|
2774
3401
|
/**
|
|
2775
3402
|
* Configure indicator settings
|
|
2776
3403
|
*/
|
|
@@ -2880,6 +3507,57 @@ Note: Configuration is temporary for this session. To make permanent, set enviro
|
|
|
2880
3507
|
/**
|
|
2881
3508
|
* Get current indicator configuration
|
|
2882
3509
|
*/
|
|
3510
|
+
async configureCollectionSubmission(autoSubmit) {
|
|
3511
|
+
try {
|
|
3512
|
+
// Store the configuration in environment variable
|
|
3513
|
+
if (autoSubmit) {
|
|
3514
|
+
process.env.DOLLHOUSE_AUTO_SUBMIT_TO_COLLECTION = 'true';
|
|
3515
|
+
}
|
|
3516
|
+
else {
|
|
3517
|
+
delete process.env.DOLLHOUSE_AUTO_SUBMIT_TO_COLLECTION;
|
|
3518
|
+
}
|
|
3519
|
+
const message = autoSubmit
|
|
3520
|
+
? "✅ Collection submission enabled! Content will automatically be submitted to the DollhouseMCP collection after portfolio upload."
|
|
3521
|
+
: "✅ Collection submission disabled. Content will only be uploaded to your personal portfolio.";
|
|
3522
|
+
return {
|
|
3523
|
+
content: [
|
|
3524
|
+
{
|
|
3525
|
+
type: "text",
|
|
3526
|
+
text: `${this.getPersonaIndicator()}${message}`
|
|
3527
|
+
}
|
|
3528
|
+
]
|
|
3529
|
+
};
|
|
3530
|
+
}
|
|
3531
|
+
catch (error) {
|
|
3532
|
+
logger.error('Error configuring collection submission', { error });
|
|
3533
|
+
return {
|
|
3534
|
+
content: [
|
|
3535
|
+
{
|
|
3536
|
+
type: "text",
|
|
3537
|
+
text: `${this.getPersonaIndicator()}❌ Failed to configure collection submission: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
3538
|
+
}
|
|
3539
|
+
]
|
|
3540
|
+
};
|
|
3541
|
+
}
|
|
3542
|
+
}
|
|
3543
|
+
async getCollectionSubmissionConfig() {
|
|
3544
|
+
const autoSubmitEnabled = process.env.DOLLHOUSE_AUTO_SUBMIT_TO_COLLECTION === 'true';
|
|
3545
|
+
const message = `**Collection Submission Configuration**\n\n` +
|
|
3546
|
+
`• **Auto-submit**: ${autoSubmitEnabled ? '✅ Enabled' : '❌ Disabled'}\n\n` +
|
|
3547
|
+
`When auto-submit is enabled, the \`submit_content\` tool will:\n` +
|
|
3548
|
+
`1. Upload content to your GitHub portfolio\n` +
|
|
3549
|
+
`2. Automatically create a submission issue in DollhouseMCP/collection\n\n` +
|
|
3550
|
+
`To change this setting, use:\n` +
|
|
3551
|
+
`\`\`\`\nconfigure_collection_submission autoSubmit: true/false\n\`\`\``;
|
|
3552
|
+
return {
|
|
3553
|
+
content: [
|
|
3554
|
+
{
|
|
3555
|
+
type: "text",
|
|
3556
|
+
text: `${this.getPersonaIndicator()}${message}`
|
|
3557
|
+
}
|
|
3558
|
+
]
|
|
3559
|
+
};
|
|
3560
|
+
}
|
|
2883
3561
|
async getIndicatorConfig() {
|
|
2884
3562
|
// Show current configuration and example
|
|
2885
3563
|
let exampleIndicator = "";
|
|
@@ -3136,9 +3814,906 @@ Placeholders for custom format:
|
|
|
3136
3814
|
};
|
|
3137
3815
|
}
|
|
3138
3816
|
}
|
|
3817
|
+
/**
|
|
3818
|
+
* Portfolio management methods
|
|
3819
|
+
*/
|
|
3820
|
+
/**
|
|
3821
|
+
* Check portfolio status including repository existence and sync information
|
|
3822
|
+
*/
|
|
3823
|
+
async portfolioStatus(username) {
|
|
3824
|
+
try {
|
|
3825
|
+
// Validate username parameter if provided
|
|
3826
|
+
if (username && typeof username === 'string') {
|
|
3827
|
+
try {
|
|
3828
|
+
validateUsername(username);
|
|
3829
|
+
}
|
|
3830
|
+
catch (error) {
|
|
3831
|
+
return {
|
|
3832
|
+
content: [{
|
|
3833
|
+
type: "text",
|
|
3834
|
+
text: `${this.getPersonaIndicator()}❌ Invalid username: ${error instanceof Error ? error.message : 'Validation failed'}`
|
|
3835
|
+
}]
|
|
3836
|
+
};
|
|
3837
|
+
}
|
|
3838
|
+
}
|
|
3839
|
+
// Get current user if username not provided
|
|
3840
|
+
let targetUsername = username;
|
|
3841
|
+
if (!targetUsername) {
|
|
3842
|
+
const authStatus = await this.githubAuthManager.getAuthStatus();
|
|
3843
|
+
if (!authStatus.isAuthenticated || !authStatus.username) {
|
|
3844
|
+
return {
|
|
3845
|
+
content: [{
|
|
3846
|
+
type: "text",
|
|
3847
|
+
text: `${this.getPersonaIndicator()}❌ **GitHub Authentication Required**\n\n` +
|
|
3848
|
+
`🔐 **Quick Setup**:\n` +
|
|
3849
|
+
`1. Run: \`setup_github_auth\` to authenticate\n` +
|
|
3850
|
+
`2. Or use: \`gh auth login --web\` if you have GitHub CLI\n\n` +
|
|
3851
|
+
`📝 **What this enables**:\n` +
|
|
3852
|
+
`• Upload elements to your GitHub portfolio\n` +
|
|
3853
|
+
`• Sync your local portfolio with GitHub\n` +
|
|
3854
|
+
`• Share elements with the community\n\n` +
|
|
3855
|
+
`🌐 **Need help?** Visit: https://docs.anthropic.com/en/docs/claude-code/oauth-setup`
|
|
3856
|
+
}]
|
|
3857
|
+
};
|
|
3858
|
+
}
|
|
3859
|
+
targetUsername = authStatus.username;
|
|
3860
|
+
}
|
|
3861
|
+
// Check if portfolio exists
|
|
3862
|
+
const { PortfolioRepoManager } = await import('./portfolio/PortfolioRepoManager.js');
|
|
3863
|
+
const portfolioManager = new PortfolioRepoManager();
|
|
3864
|
+
const portfolioExists = await portfolioManager.checkPortfolioExists(targetUsername);
|
|
3865
|
+
let statusText = `${this.getPersonaIndicator()}📊 **Portfolio Status for ${targetUsername}**\n\n`;
|
|
3866
|
+
if (portfolioExists) {
|
|
3867
|
+
statusText += `✅ **Repository**: dollhouse-portfolio exists\n`;
|
|
3868
|
+
statusText += `🔗 **URL**: https://github.com/${targetUsername}/dollhouse-portfolio\n\n`;
|
|
3869
|
+
// Get local elements count
|
|
3870
|
+
const localPortfolioManager = PortfolioManager.getInstance();
|
|
3871
|
+
const personasPath = localPortfolioManager.getElementDir(ElementType.PERSONA);
|
|
3872
|
+
const skillsPath = localPortfolioManager.getElementDir(ElementType.SKILL);
|
|
3873
|
+
const templatesPath = localPortfolioManager.getElementDir(ElementType.TEMPLATE);
|
|
3874
|
+
const agentsPath = localPortfolioManager.getElementDir(ElementType.AGENT);
|
|
3875
|
+
const memoriesPath = localPortfolioManager.getElementDir(ElementType.MEMORY);
|
|
3876
|
+
const ensemblesPath = localPortfolioManager.getElementDir(ElementType.ENSEMBLE);
|
|
3877
|
+
const [personas, skills, templates, agents, memories, ensembles] = await Promise.all([
|
|
3878
|
+
this.countElementsInDir(personasPath),
|
|
3879
|
+
this.countElementsInDir(skillsPath),
|
|
3880
|
+
this.countElementsInDir(templatesPath),
|
|
3881
|
+
this.countElementsInDir(agentsPath),
|
|
3882
|
+
this.countElementsInDir(memoriesPath),
|
|
3883
|
+
this.countElementsInDir(ensemblesPath)
|
|
3884
|
+
]);
|
|
3885
|
+
const totalElements = personas + skills + templates + agents + memories + ensembles;
|
|
3886
|
+
statusText += `📈 **Local Elements**:\n`;
|
|
3887
|
+
statusText += ` • Personas: ${personas}\n`;
|
|
3888
|
+
statusText += ` • Skills: ${skills}\n`;
|
|
3889
|
+
statusText += ` • Templates: ${templates}\n`;
|
|
3890
|
+
statusText += ` • Agents: ${agents}\n`;
|
|
3891
|
+
statusText += ` • Memories: ${memories}\n`;
|
|
3892
|
+
statusText += ` • Ensembles: ${ensembles}\n`;
|
|
3893
|
+
statusText += ` • **Total**: ${totalElements}\n\n`;
|
|
3894
|
+
statusText += `🔄 **Sync Status**: Use sync_portfolio to update GitHub\n`;
|
|
3895
|
+
}
|
|
3896
|
+
else {
|
|
3897
|
+
statusText += `❌ **Repository**: No portfolio found\n`;
|
|
3898
|
+
statusText += `💡 **Next Step**: Use init_portfolio to create one\n\n`;
|
|
3899
|
+
statusText += `📝 **What you'll get**:\n`;
|
|
3900
|
+
statusText += ` • GitHub repository for your elements\n`;
|
|
3901
|
+
statusText += ` • Organized folder structure\n`;
|
|
3902
|
+
statusText += ` • README with usage instructions\n`;
|
|
3903
|
+
statusText += ` • Easy sharing and backup\n`;
|
|
3904
|
+
}
|
|
3905
|
+
return {
|
|
3906
|
+
content: [{
|
|
3907
|
+
type: "text",
|
|
3908
|
+
text: statusText
|
|
3909
|
+
}]
|
|
3910
|
+
};
|
|
3911
|
+
}
|
|
3912
|
+
catch (error) {
|
|
3913
|
+
return {
|
|
3914
|
+
content: [{
|
|
3915
|
+
type: "text",
|
|
3916
|
+
text: `${this.getPersonaIndicator()}❌ Failed to check portfolio status: ${SecureErrorHandler.sanitizeError(error).message}`
|
|
3917
|
+
}]
|
|
3918
|
+
};
|
|
3919
|
+
}
|
|
3920
|
+
}
|
|
3921
|
+
/**
|
|
3922
|
+
* Initialize a new GitHub portfolio repository
|
|
3923
|
+
*/
|
|
3924
|
+
async initPortfolio(options) {
|
|
3925
|
+
try {
|
|
3926
|
+
// Check authentication
|
|
3927
|
+
const authStatus = await this.githubAuthManager.getAuthStatus();
|
|
3928
|
+
if (!authStatus.isAuthenticated || !authStatus.username) {
|
|
3929
|
+
return {
|
|
3930
|
+
content: [{
|
|
3931
|
+
type: "text",
|
|
3932
|
+
text: `${this.getPersonaIndicator()}❌ **GitHub Authentication Required**\n\n` +
|
|
3933
|
+
`🔐 **Quick Setup**:\n` +
|
|
3934
|
+
`1. Run: \`setup_github_auth\` to authenticate\n` +
|
|
3935
|
+
`2. Or use: \`gh auth login --web\` if you have GitHub CLI\n\n` +
|
|
3936
|
+
`📝 **What this enables**:\n` +
|
|
3937
|
+
`• Upload elements to your GitHub portfolio\n` +
|
|
3938
|
+
`• Sync your local portfolio with GitHub\n` +
|
|
3939
|
+
`• Share elements with the community\n\n` +
|
|
3940
|
+
`🌐 **Need help?** Visit: https://docs.anthropic.com/en/docs/claude-code/oauth-setup`
|
|
3941
|
+
}]
|
|
3942
|
+
};
|
|
3943
|
+
}
|
|
3944
|
+
const username = authStatus.username;
|
|
3945
|
+
// Check if portfolio already exists
|
|
3946
|
+
const { PortfolioRepoManager } = await import('./portfolio/PortfolioRepoManager.js');
|
|
3947
|
+
const portfolioManager = new PortfolioRepoManager();
|
|
3948
|
+
const portfolioExists = await portfolioManager.checkPortfolioExists(username);
|
|
3949
|
+
if (portfolioExists) {
|
|
3950
|
+
return {
|
|
3951
|
+
content: [{
|
|
3952
|
+
type: "text",
|
|
3953
|
+
text: `${this.getPersonaIndicator()}✅ Portfolio already exists at https://github.com/${username}/dollhouse-portfolio\n\nUse portfolio_status to see details or sync_portfolio to update it.`
|
|
3954
|
+
}]
|
|
3955
|
+
};
|
|
3956
|
+
}
|
|
3957
|
+
// Create portfolio with explicit consent
|
|
3958
|
+
const portfolioUrl = await portfolioManager.createPortfolio(username, true);
|
|
3959
|
+
return {
|
|
3960
|
+
content: [{
|
|
3961
|
+
type: "text",
|
|
3962
|
+
text: `${this.getPersonaIndicator()}🎉 **Portfolio Created Successfully!**\n\n` +
|
|
3963
|
+
`✅ **Repository**: https://github.com/${username}/dollhouse-portfolio\n` +
|
|
3964
|
+
`📁 **Structure**: Organized folders for all element types\n` +
|
|
3965
|
+
`📝 **README**: Usage instructions included\n` +
|
|
3966
|
+
`🔄 **Next Step**: Use sync_portfolio to upload your elements\n\n` +
|
|
3967
|
+
`Your portfolio is ready for sharing your DollhouseMCP creations!`
|
|
3968
|
+
}]
|
|
3969
|
+
};
|
|
3970
|
+
}
|
|
3971
|
+
catch (error) {
|
|
3972
|
+
return {
|
|
3973
|
+
content: [{
|
|
3974
|
+
type: "text",
|
|
3975
|
+
text: `${this.getPersonaIndicator()}❌ Failed to initialize portfolio: ${SecureErrorHandler.sanitizeError(error).message}`
|
|
3976
|
+
}]
|
|
3977
|
+
};
|
|
3978
|
+
}
|
|
3979
|
+
}
|
|
3980
|
+
/**
|
|
3981
|
+
* Configure portfolio settings
|
|
3982
|
+
*/
|
|
3983
|
+
async portfolioConfig(options) {
|
|
3984
|
+
try {
|
|
3985
|
+
const configManager = ConfigManager.getInstance();
|
|
3986
|
+
await configManager.loadConfig();
|
|
3987
|
+
let statusText = `${this.getPersonaIndicator()}⚙️ **Portfolio Configuration**\n\n`;
|
|
3988
|
+
// Update settings if provided
|
|
3989
|
+
if (options.autoSync !== undefined) {
|
|
3990
|
+
// This would be implemented when auto-sync feature is added
|
|
3991
|
+
statusText += `🔄 Auto-sync: ${options.autoSync ? 'Enabled' : 'Disabled'} (Coming soon)\n`;
|
|
3992
|
+
}
|
|
3993
|
+
if (options.defaultVisibility) {
|
|
3994
|
+
statusText += `🔒 Default visibility: ${options.defaultVisibility}\n`;
|
|
3995
|
+
}
|
|
3996
|
+
if (options.autoSubmit !== undefined) {
|
|
3997
|
+
// Note: Auto-submit configuration would be implemented here
|
|
3998
|
+
// For now, we'll just show the status
|
|
3999
|
+
statusText += `📤 Auto-submit to collection: ${options.autoSubmit ? 'Enabled' : 'Disabled'} (Coming soon)\n`;
|
|
4000
|
+
}
|
|
4001
|
+
if (options.repositoryName) {
|
|
4002
|
+
statusText += `📁 Repository name: ${options.repositoryName} (Custom names coming soon)\n`;
|
|
4003
|
+
}
|
|
4004
|
+
// Show current configuration
|
|
4005
|
+
statusText += `\n📋 **Current Settings**:\n`;
|
|
4006
|
+
statusText += ` • Auto-submit: Disabled (Coming soon)\n`;
|
|
4007
|
+
statusText += ` • Repository name: dollhouse-portfolio (default)\n`;
|
|
4008
|
+
statusText += ` • Default visibility: public\n`;
|
|
4009
|
+
return {
|
|
4010
|
+
content: [{
|
|
4011
|
+
type: "text",
|
|
4012
|
+
text: statusText
|
|
4013
|
+
}]
|
|
4014
|
+
};
|
|
4015
|
+
}
|
|
4016
|
+
catch (error) {
|
|
4017
|
+
return {
|
|
4018
|
+
content: [{
|
|
4019
|
+
type: "text",
|
|
4020
|
+
text: `${this.getPersonaIndicator()}❌ Failed to configure portfolio: ${SecureErrorHandler.sanitizeError(error).message}`
|
|
4021
|
+
}]
|
|
4022
|
+
};
|
|
4023
|
+
}
|
|
4024
|
+
}
|
|
4025
|
+
/**
|
|
4026
|
+
* Sync portfolio with GitHub
|
|
4027
|
+
*/
|
|
4028
|
+
async syncPortfolio(options) {
|
|
4029
|
+
try {
|
|
4030
|
+
// Check authentication
|
|
4031
|
+
const authStatus = await this.githubAuthManager.getAuthStatus();
|
|
4032
|
+
if (!authStatus.isAuthenticated || !authStatus.username) {
|
|
4033
|
+
return {
|
|
4034
|
+
content: [{
|
|
4035
|
+
type: "text",
|
|
4036
|
+
text: `${this.getPersonaIndicator()}❌ **GitHub Authentication Required**\n\n` +
|
|
4037
|
+
`🔐 **Quick Setup**:\n` +
|
|
4038
|
+
`1. Run: \`setup_github_auth\` to authenticate\n` +
|
|
4039
|
+
`2. Or use: \`gh auth login --web\` if you have GitHub CLI\n\n` +
|
|
4040
|
+
`📝 **What this enables**:\n` +
|
|
4041
|
+
`• Upload elements to your GitHub portfolio\n` +
|
|
4042
|
+
`• Sync your local portfolio with GitHub\n` +
|
|
4043
|
+
`• Share elements with the community\n\n` +
|
|
4044
|
+
`🌐 **Need help?** Visit: https://docs.anthropic.com/en/docs/claude-code/oauth-setup`
|
|
4045
|
+
}]
|
|
4046
|
+
};
|
|
4047
|
+
}
|
|
4048
|
+
const username = authStatus.username;
|
|
4049
|
+
// Check if portfolio exists
|
|
4050
|
+
const { PortfolioRepoManager } = await import('./portfolio/PortfolioRepoManager.js');
|
|
4051
|
+
const portfolioManager = new PortfolioRepoManager();
|
|
4052
|
+
// CRITICAL FIX: Set GitHub token like submit_content does
|
|
4053
|
+
// Without this, checkPortfolioExists fails because it can't authenticate to GitHub
|
|
4054
|
+
const { TokenManager } = await import('./security/tokenManager.js');
|
|
4055
|
+
const token = await TokenManager.getGitHubTokenAsync();
|
|
4056
|
+
if (!token) {
|
|
4057
|
+
return {
|
|
4058
|
+
content: [{
|
|
4059
|
+
type: "text",
|
|
4060
|
+
text: `${this.getPersonaIndicator()}❌ GitHub authentication required. Please authenticate first using setup_github_auth.`
|
|
4061
|
+
}]
|
|
4062
|
+
};
|
|
4063
|
+
}
|
|
4064
|
+
portfolioManager.setToken(token);
|
|
4065
|
+
const portfolioExists = await portfolioManager.checkPortfolioExists(username);
|
|
4066
|
+
if (!portfolioExists) {
|
|
4067
|
+
return {
|
|
4068
|
+
content: [{
|
|
4069
|
+
type: "text",
|
|
4070
|
+
text: `${this.getPersonaIndicator()}❌ **No Portfolio Repository Found**\n\n` +
|
|
4071
|
+
`🏠 **Quick Setup**:\n` +
|
|
4072
|
+
`1. Run: \`init_portfolio\` to create your GitHub portfolio\n` +
|
|
4073
|
+
`2. This creates: https://github.com/[username]/dollhouse-portfolio\n\n` +
|
|
4074
|
+
`📝 **What you'll get**:\n` +
|
|
4075
|
+
`• Public repository to showcase your AI elements\n` +
|
|
4076
|
+
`• Organized structure for personas, skills, templates, and agents\n` +
|
|
4077
|
+
`• Automatic syncing of your local portfolio\n` +
|
|
4078
|
+
`• Community sharing capabilities\n\n` +
|
|
4079
|
+
`🚀 **After setup**: Use \`sync_portfolio\` to upload your content!`
|
|
4080
|
+
}]
|
|
4081
|
+
};
|
|
4082
|
+
}
|
|
4083
|
+
if (options.dryRun) {
|
|
4084
|
+
// Show what would be synced
|
|
4085
|
+
const localPortfolioManager = PortfolioManager.getInstance();
|
|
4086
|
+
const elementTypeCounts = {};
|
|
4087
|
+
const elementTypeErrors = [];
|
|
4088
|
+
// Get element counts with better error handling
|
|
4089
|
+
for (const elementType of ['personas', 'skills', 'templates', 'agents']) {
|
|
4090
|
+
try {
|
|
4091
|
+
const elements = await this.getElementsList(elementType);
|
|
4092
|
+
elementTypeCounts[elementType] = elements.length;
|
|
4093
|
+
}
|
|
4094
|
+
catch (error) {
|
|
4095
|
+
elementTypeCounts[elementType] = 'ERROR';
|
|
4096
|
+
elementTypeErrors.push(`${elementType}: ${error.message || 'Unknown error'}`);
|
|
4097
|
+
}
|
|
4098
|
+
}
|
|
4099
|
+
let dryRunText = `${this.getPersonaIndicator()}🔍 **Dry Run - Portfolio Sync Preview**\n\n`;
|
|
4100
|
+
dryRunText += `📤 **Elements to sync** (${options.direction}):\n`;
|
|
4101
|
+
dryRunText += ` • Personas: ${elementTypeCounts.personas}\n`;
|
|
4102
|
+
dryRunText += ` • Skills: ${elementTypeCounts.skills}\n`;
|
|
4103
|
+
dryRunText += ` • Templates: ${elementTypeCounts.templates}\n`;
|
|
4104
|
+
dryRunText += ` • Agents: ${elementTypeCounts.agents}\n\n`;
|
|
4105
|
+
// Include any errors encountered during dry run
|
|
4106
|
+
if (elementTypeErrors.length > 0) {
|
|
4107
|
+
dryRunText += `⚠️ **Errors found during preview:**\n`;
|
|
4108
|
+
for (const error of elementTypeErrors) {
|
|
4109
|
+
dryRunText += ` • ${error}\n`;
|
|
4110
|
+
}
|
|
4111
|
+
dryRunText += `\n`;
|
|
4112
|
+
}
|
|
4113
|
+
dryRunText += `🎯 **Target**: https://github.com/${username}/dollhouse-portfolio\n`;
|
|
4114
|
+
dryRunText += `⚠️ **Note**: This is a preview. Remove dry_run=true to perform actual sync.`;
|
|
4115
|
+
return {
|
|
4116
|
+
content: [{
|
|
4117
|
+
type: "text",
|
|
4118
|
+
text: dryRunText
|
|
4119
|
+
}]
|
|
4120
|
+
};
|
|
4121
|
+
}
|
|
4122
|
+
// For now, implement basic push functionality
|
|
4123
|
+
if (options.direction === 'push' || options.direction === 'both') {
|
|
4124
|
+
let syncCount = 0;
|
|
4125
|
+
let totalElements = 0;
|
|
4126
|
+
let syncText = `${this.getPersonaIndicator()}🔄 **Syncing Portfolio...**\n\n`;
|
|
4127
|
+
// UX IMPROVEMENT: Calculate total elements for progress tracking
|
|
4128
|
+
const elementTypes = ['personas', 'skills', 'templates', 'agents'];
|
|
4129
|
+
const elementCounts = {};
|
|
4130
|
+
const failedElements = [];
|
|
4131
|
+
// Pre-calculate totals for better progress indicators
|
|
4132
|
+
try {
|
|
4133
|
+
syncText += `📊 **Calculating sync scope...**\n`;
|
|
4134
|
+
for (const elementType of elementTypes) {
|
|
4135
|
+
try {
|
|
4136
|
+
const elements = await this.getElementsList(elementType);
|
|
4137
|
+
elementCounts[elementType] = elements.length;
|
|
4138
|
+
totalElements += elements.length;
|
|
4139
|
+
}
|
|
4140
|
+
catch (error) {
|
|
4141
|
+
elementCounts[elementType] = 0;
|
|
4142
|
+
logger.warn(`Failed to count ${elementType}`, { error: error.message });
|
|
4143
|
+
}
|
|
4144
|
+
}
|
|
4145
|
+
syncText += `\n🎯 **Ready to sync ${totalElements} elements:**\n`;
|
|
4146
|
+
for (const [type, count] of Object.entries(elementCounts)) {
|
|
4147
|
+
const icon = count > 0 ? '✅' : '⚪';
|
|
4148
|
+
syncText += ` ${icon} ${type}: ${count} elements\n`;
|
|
4149
|
+
}
|
|
4150
|
+
syncText += `\n🚀 **Starting sync process...**\n\n`;
|
|
4151
|
+
}
|
|
4152
|
+
catch (error) {
|
|
4153
|
+
syncText += `\n⚠️ **Warning**: Could not calculate sync scope: ${error.message}\n\n`;
|
|
4154
|
+
}
|
|
4155
|
+
// UX IMPROVEMENT: Process each element type with progress tracking
|
|
4156
|
+
for (const elementType of elementTypes) {
|
|
4157
|
+
const typeCount = elementCounts[elementType] || 0;
|
|
4158
|
+
if (typeCount === 0) {
|
|
4159
|
+
syncText += `⏩ **Skipping ${elementType}** (no elements found)\n`;
|
|
4160
|
+
continue;
|
|
4161
|
+
}
|
|
4162
|
+
syncText += `📁 **Processing ${elementType}** (${typeCount} elements):\n`;
|
|
4163
|
+
let typeSuccessCount = 0;
|
|
4164
|
+
try {
|
|
4165
|
+
const elements = await this.getElementsList(elementType);
|
|
4166
|
+
for (let i = 0; i < elements.length; i++) {
|
|
4167
|
+
const elementName = elements[i];
|
|
4168
|
+
const progress = `[${i + 1}/${elements.length}]`;
|
|
4169
|
+
try {
|
|
4170
|
+
// UX IMPROVEMENT: Show individual element progress
|
|
4171
|
+
syncText += ` ${progress} 🔄 Syncing "${elementName}"...`;
|
|
4172
|
+
// Load element and save to portfolio
|
|
4173
|
+
const element = await this.loadElementByType(elementName, elementType);
|
|
4174
|
+
if (element) {
|
|
4175
|
+
await portfolioManager.saveElement(element, true); // Explicit consent
|
|
4176
|
+
syncCount++;
|
|
4177
|
+
typeSuccessCount++;
|
|
4178
|
+
syncText += ` ✅\n`;
|
|
4179
|
+
logger.debug(`Successfully synced ${elementType}/${elementName}`);
|
|
4180
|
+
}
|
|
4181
|
+
else {
|
|
4182
|
+
syncText += ` ❌ (null element)\n`;
|
|
4183
|
+
failedElements.push({
|
|
4184
|
+
type: elementType,
|
|
4185
|
+
name: elementName,
|
|
4186
|
+
error: 'Element loaded as null/undefined'
|
|
4187
|
+
});
|
|
4188
|
+
}
|
|
4189
|
+
}
|
|
4190
|
+
catch (elementError) {
|
|
4191
|
+
const errorMessage = elementError.message || 'Unknown error during element sync';
|
|
4192
|
+
syncText += ` ❌ (${errorMessage})\n`;
|
|
4193
|
+
failedElements.push({
|
|
4194
|
+
type: elementType,
|
|
4195
|
+
name: elementName,
|
|
4196
|
+
error: errorMessage
|
|
4197
|
+
});
|
|
4198
|
+
logger.warn(`Failed to sync ${elementType}/${elementName}`, { error: errorMessage });
|
|
4199
|
+
}
|
|
4200
|
+
}
|
|
4201
|
+
// UX IMPROVEMENT: Show completion summary for each type
|
|
4202
|
+
const successRate = elements.length > 0 ? Math.round((typeSuccessCount / elements.length) * 100) : 0;
|
|
4203
|
+
const statusIcon = successRate === 100 ? '🎉' : successRate > 50 ? '⚠️' : '❌';
|
|
4204
|
+
syncText += ` ${statusIcon} **${elementType} complete**: ${typeSuccessCount}/${elements.length} synced (${successRate}%)\n\n`;
|
|
4205
|
+
}
|
|
4206
|
+
catch (listError) {
|
|
4207
|
+
// UX IMPROVEMENT: Better error reporting for list failures
|
|
4208
|
+
const errorMessage = listError.message || 'Failed to get elements list';
|
|
4209
|
+
syncText += ` ❌ **Failed to list ${elementType}**: ${errorMessage}\n\n`;
|
|
4210
|
+
failedElements.push({
|
|
4211
|
+
type: elementType,
|
|
4212
|
+
name: 'ALL',
|
|
4213
|
+
error: `Failed to list ${elementType}: ${errorMessage}`
|
|
4214
|
+
});
|
|
4215
|
+
logger.warn(`Failed to get ${elementType} list`, { error: errorMessage });
|
|
4216
|
+
}
|
|
4217
|
+
}
|
|
4218
|
+
// UX IMPROVEMENT: Enhanced final summary with actionable insights
|
|
4219
|
+
const successRate = totalElements > 0 ? Math.round((syncCount / totalElements) * 100) : 0;
|
|
4220
|
+
const summaryIcon = successRate === 100 ? '🎉' : successRate >= 80 ? '✅' : successRate >= 50 ? '⚠️' : '❌';
|
|
4221
|
+
syncText += `${summaryIcon} **Sync Complete!**\n`;
|
|
4222
|
+
syncText += `📊 **Overall Results**: ${syncCount}/${totalElements} elements synced (${successRate}%)\n`;
|
|
4223
|
+
syncText += `🏠 **Portfolio**: https://github.com/${username}/dollhouse-portfolio\n\n`;
|
|
4224
|
+
// Include failed elements information with actionable suggestions
|
|
4225
|
+
if (failedElements.length > 0) {
|
|
4226
|
+
syncText += `⚠️ **Issues Encountered** (${failedElements.length} problems):\n\n`;
|
|
4227
|
+
// Group failures by type for better organization
|
|
4228
|
+
const failuresByType = {};
|
|
4229
|
+
for (const failed of failedElements) {
|
|
4230
|
+
if (!failuresByType[failed.type]) {
|
|
4231
|
+
failuresByType[failed.type] = [];
|
|
4232
|
+
}
|
|
4233
|
+
failuresByType[failed.type].push({ name: failed.name, error: failed.error });
|
|
4234
|
+
}
|
|
4235
|
+
for (const [type, failures] of Object.entries(failuresByType)) {
|
|
4236
|
+
syncText += `📁 **${type}** (${failures.length} issues):\n`;
|
|
4237
|
+
for (const failure of failures) {
|
|
4238
|
+
if (failure.name === 'ALL') {
|
|
4239
|
+
syncText += ` ❌ ${failure.error}\n`;
|
|
4240
|
+
}
|
|
4241
|
+
else {
|
|
4242
|
+
syncText += ` ❌ "${failure.name}": ${failure.error}\n`;
|
|
4243
|
+
}
|
|
4244
|
+
}
|
|
4245
|
+
syncText += `\n`;
|
|
4246
|
+
}
|
|
4247
|
+
// UX IMPROVEMENT: Add helpful suggestions for common issues
|
|
4248
|
+
syncText += `💡 **Troubleshooting Tips**:\n`;
|
|
4249
|
+
syncText += ` • Check element file formats and metadata\n`;
|
|
4250
|
+
syncText += ` • Verify GitHub authentication is still valid\n`;
|
|
4251
|
+
syncText += ` • Try syncing individual elements with \`submit_content\`\n`;
|
|
4252
|
+
syncText += ` • Use \`sync_portfolio\` with \`dry_run=true\` to preview issues\n\n`;
|
|
4253
|
+
}
|
|
4254
|
+
else {
|
|
4255
|
+
syncText += `🎉 **Perfect Sync!** All elements uploaded successfully!\n\n`;
|
|
4256
|
+
}
|
|
4257
|
+
// UX IMPROVEMENT: Add next steps and helpful links
|
|
4258
|
+
if (syncCount > 0) {
|
|
4259
|
+
syncText += `🚀 **Next Steps**:\n`;
|
|
4260
|
+
syncText += ` • View your portfolio: https://github.com/${username}/dollhouse-portfolio\n`;
|
|
4261
|
+
syncText += ` • Share individual elements using \`submit_content <name>\`\n`;
|
|
4262
|
+
syncText += ` • Keep portfolio updated with \`sync_portfolio\` regularly\n\n`;
|
|
4263
|
+
}
|
|
4264
|
+
syncText += `Your elements are now available on GitHub!`;
|
|
4265
|
+
return {
|
|
4266
|
+
content: [{
|
|
4267
|
+
type: "text",
|
|
4268
|
+
text: syncText
|
|
4269
|
+
}]
|
|
4270
|
+
};
|
|
4271
|
+
}
|
|
4272
|
+
if (options.direction === 'pull') {
|
|
4273
|
+
return {
|
|
4274
|
+
content: [{
|
|
4275
|
+
type: "text",
|
|
4276
|
+
text: `${this.getPersonaIndicator()}⚠️ Pull sync is coming soon. Currently only push sync is supported.`
|
|
4277
|
+
}]
|
|
4278
|
+
};
|
|
4279
|
+
}
|
|
4280
|
+
return {
|
|
4281
|
+
content: [{
|
|
4282
|
+
type: "text",
|
|
4283
|
+
text: `${this.getPersonaIndicator()}❌ Invalid sync direction. Use 'push', 'pull', or 'both'.`
|
|
4284
|
+
}]
|
|
4285
|
+
};
|
|
4286
|
+
}
|
|
4287
|
+
catch (error) {
|
|
4288
|
+
// IMPROVED ERROR HANDLING: Ensure we always have a meaningful error message
|
|
4289
|
+
const sanitizedError = SecureErrorHandler.sanitizeError(error);
|
|
4290
|
+
const errorMessage = sanitizedError?.message || error?.message || String(error) || 'Unknown error occurred';
|
|
4291
|
+
return {
|
|
4292
|
+
content: [{
|
|
4293
|
+
type: "text",
|
|
4294
|
+
text: `${this.getPersonaIndicator()}❌ Failed to sync portfolio: ${errorMessage}`
|
|
4295
|
+
}]
|
|
4296
|
+
};
|
|
4297
|
+
}
|
|
4298
|
+
}
|
|
4299
|
+
/**
|
|
4300
|
+
* Search local portfolio using the metadata index system
|
|
4301
|
+
* This provides fast, comprehensive search across all element types
|
|
4302
|
+
*/
|
|
4303
|
+
async searchPortfolio(options) {
|
|
4304
|
+
try {
|
|
4305
|
+
// Validate the query parameter
|
|
4306
|
+
if (!options.query || typeof options.query !== 'string' || options.query.trim().length === 0) {
|
|
4307
|
+
return {
|
|
4308
|
+
content: [{
|
|
4309
|
+
type: "text",
|
|
4310
|
+
text: `${this.getPersonaIndicator()}❌ Search query is required and must be a non-empty string.`
|
|
4311
|
+
}]
|
|
4312
|
+
};
|
|
4313
|
+
}
|
|
4314
|
+
// Import portfolio index manager
|
|
4315
|
+
const { PortfolioIndexManager } = await import('./portfolio/PortfolioIndexManager.js');
|
|
4316
|
+
const indexManager = PortfolioIndexManager.getInstance();
|
|
4317
|
+
// Parse element type if provided
|
|
4318
|
+
let elementType;
|
|
4319
|
+
if (options.elementType) {
|
|
4320
|
+
const validTypes = ['personas', 'skills', 'templates', 'agents', 'memories', 'ensembles'];
|
|
4321
|
+
if (!validTypes.includes(options.elementType)) {
|
|
4322
|
+
return {
|
|
4323
|
+
content: [{
|
|
4324
|
+
type: "text",
|
|
4325
|
+
text: `${this.getPersonaIndicator()}❌ Invalid element type. Valid types: ${validTypes.join(', ')}`
|
|
4326
|
+
}]
|
|
4327
|
+
};
|
|
4328
|
+
}
|
|
4329
|
+
elementType = options.elementType;
|
|
4330
|
+
}
|
|
4331
|
+
// Build search options
|
|
4332
|
+
const searchOptions = {
|
|
4333
|
+
elementType,
|
|
4334
|
+
fuzzyMatch: options.fuzzyMatch !== false, // Default to true
|
|
4335
|
+
maxResults: options.maxResults || 20,
|
|
4336
|
+
includeKeywords: options.includeKeywords !== false,
|
|
4337
|
+
includeTags: options.includeTags !== false,
|
|
4338
|
+
includeTriggers: options.includeTriggers !== false,
|
|
4339
|
+
includeDescriptions: options.includeDescriptions !== false
|
|
4340
|
+
};
|
|
4341
|
+
// Perform the search
|
|
4342
|
+
const results = await indexManager.search(options.query, searchOptions);
|
|
4343
|
+
// Format the results
|
|
4344
|
+
let text = `${this.getPersonaIndicator()}🔍 **Portfolio Search Results**\n\n`;
|
|
4345
|
+
text += `**Query**: "${options.query}"\n`;
|
|
4346
|
+
if (elementType) {
|
|
4347
|
+
text += `**Type Filter**: ${elementType}\n`;
|
|
4348
|
+
}
|
|
4349
|
+
text += `**Found**: ${results.length} element${results.length === 1 ? '' : 's'}\n\n`;
|
|
4350
|
+
if (results.length === 0) {
|
|
4351
|
+
text += `No elements found matching your search criteria.\n\n`;
|
|
4352
|
+
text += `**Tips for better results:**\n`;
|
|
4353
|
+
text += `• Try different keywords or partial names\n`;
|
|
4354
|
+
text += `• Remove the type filter to search all element types\n`;
|
|
4355
|
+
text += `• Check spelling and try synonyms\n`;
|
|
4356
|
+
text += `• Use the list_elements tool to see all available content`;
|
|
4357
|
+
}
|
|
4358
|
+
else {
|
|
4359
|
+
text += `**Results:**\n\n`;
|
|
4360
|
+
for (const result of results) {
|
|
4361
|
+
const { entry, matchType } = result;
|
|
4362
|
+
const icon = this.getElementIcon(entry.elementType);
|
|
4363
|
+
text += `${icon} **${entry.metadata.name}**\n`;
|
|
4364
|
+
text += ` 📁 Type: ${entry.elementType}\n`;
|
|
4365
|
+
text += ` 🎯 Match: ${matchType}\n`;
|
|
4366
|
+
if (entry.metadata.description) {
|
|
4367
|
+
const desc = entry.metadata.description.length > 100
|
|
4368
|
+
? entry.metadata.description.substring(0, 100) + '...'
|
|
4369
|
+
: entry.metadata.description;
|
|
4370
|
+
text += ` 📝 ${desc}\n`;
|
|
4371
|
+
}
|
|
4372
|
+
if (entry.metadata.tags && entry.metadata.tags.length > 0) {
|
|
4373
|
+
text += ` 🏷️ Tags: ${entry.metadata.tags.slice(0, 5).join(', ')}${entry.metadata.tags.length > 5 ? '...' : ''}\n`;
|
|
4374
|
+
}
|
|
4375
|
+
text += ` 📄 File: ${entry.filename}.md\n\n`;
|
|
4376
|
+
}
|
|
4377
|
+
if (results.length >= searchOptions.maxResults) {
|
|
4378
|
+
text += `⚠️ Results limited to ${searchOptions.maxResults}. Refine your search for more specific results.\n\n`;
|
|
4379
|
+
}
|
|
4380
|
+
text += `💡 **Next steps:**\n`;
|
|
4381
|
+
text += `• Use get_element_details to see full content\n`;
|
|
4382
|
+
text += `• Use activate_element to activate elements\n`;
|
|
4383
|
+
text += `• Use submit_content to share with the community`;
|
|
4384
|
+
}
|
|
4385
|
+
return {
|
|
4386
|
+
content: [{
|
|
4387
|
+
type: "text",
|
|
4388
|
+
text
|
|
4389
|
+
}]
|
|
4390
|
+
};
|
|
4391
|
+
}
|
|
4392
|
+
catch (error) {
|
|
4393
|
+
ErrorHandler.logError('DollhouseMCPServer.searchPortfolio', error, {
|
|
4394
|
+
query: options.query,
|
|
4395
|
+
elementType: options.elementType
|
|
4396
|
+
});
|
|
4397
|
+
return {
|
|
4398
|
+
content: [{
|
|
4399
|
+
type: "text",
|
|
4400
|
+
text: `${this.getPersonaIndicator()}❌ Search failed: ${SecureErrorHandler.sanitizeError(error).message}`
|
|
4401
|
+
}]
|
|
4402
|
+
};
|
|
4403
|
+
}
|
|
4404
|
+
}
|
|
4405
|
+
/**
|
|
4406
|
+
* Search across all sources (local, GitHub, collection) using UnifiedIndexManager
|
|
4407
|
+
* This provides comprehensive search with duplicate detection and version comparison
|
|
4408
|
+
*/
|
|
4409
|
+
async searchAll(options) {
|
|
4410
|
+
try {
|
|
4411
|
+
// Validate the query parameter
|
|
4412
|
+
if (!options.query || typeof options.query !== 'string' || options.query.trim().length === 0) {
|
|
4413
|
+
return {
|
|
4414
|
+
content: [{
|
|
4415
|
+
type: "text",
|
|
4416
|
+
text: `${this.getPersonaIndicator()}❌ Search query is required and must be a non-empty string.`
|
|
4417
|
+
}]
|
|
4418
|
+
};
|
|
4419
|
+
}
|
|
4420
|
+
// Import unified index manager
|
|
4421
|
+
const { UnifiedIndexManager } = await import('./portfolio/UnifiedIndexManager.js');
|
|
4422
|
+
const { ElementType } = await import('./portfolio/types.js');
|
|
4423
|
+
const unifiedManager = UnifiedIndexManager.getInstance();
|
|
4424
|
+
// Parse element type if provided
|
|
4425
|
+
let elementType;
|
|
4426
|
+
if (options.elementType) {
|
|
4427
|
+
const validTypes = ['personas', 'skills', 'templates', 'agents', 'memories', 'ensembles'];
|
|
4428
|
+
if (!validTypes.includes(options.elementType)) {
|
|
4429
|
+
return {
|
|
4430
|
+
content: [{
|
|
4431
|
+
type: "text",
|
|
4432
|
+
text: `${this.getPersonaIndicator()}❌ Invalid element type. Valid types: ${validTypes.join(', ')}`
|
|
4433
|
+
}]
|
|
4434
|
+
};
|
|
4435
|
+
}
|
|
4436
|
+
elementType = options.elementType;
|
|
4437
|
+
}
|
|
4438
|
+
// Parse sources (default to local and github)
|
|
4439
|
+
const sources = options.sources || ['local', 'github'];
|
|
4440
|
+
const includeLocal = sources.includes('local');
|
|
4441
|
+
const includeGitHub = sources.includes('github');
|
|
4442
|
+
const includeCollection = sources.includes('collection');
|
|
4443
|
+
// Build search options
|
|
4444
|
+
const searchOptions = {
|
|
4445
|
+
query: options.query,
|
|
4446
|
+
includeLocal,
|
|
4447
|
+
includeGitHub,
|
|
4448
|
+
includeCollection,
|
|
4449
|
+
elementType,
|
|
4450
|
+
page: options.page || 1,
|
|
4451
|
+
pageSize: options.pageSize || 20,
|
|
4452
|
+
sortBy: options.sortBy || 'relevance'
|
|
4453
|
+
};
|
|
4454
|
+
// Perform the unified search
|
|
4455
|
+
const results = await unifiedManager.search(searchOptions);
|
|
4456
|
+
// Format the results
|
|
4457
|
+
let text = `${this.getPersonaIndicator()}🔍 **Unified Search Results**\n\n`;
|
|
4458
|
+
text += `**Query**: "${options.query}"\n`;
|
|
4459
|
+
text += `**Sources**: ${sources.join(', ')}\n`;
|
|
4460
|
+
if (elementType) {
|
|
4461
|
+
text += `**Type Filter**: ${elementType}\n`;
|
|
4462
|
+
}
|
|
4463
|
+
text += `**Found**: ${results.length} element${results.length === 1 ? '' : 's'}\n\n`;
|
|
4464
|
+
if (results.length === 0) {
|
|
4465
|
+
text += `No elements found matching your search criteria.\n\n`;
|
|
4466
|
+
text += `**Tips for better results:**\n`;
|
|
4467
|
+
text += `• Try different keywords or partial names\n`;
|
|
4468
|
+
text += `• Remove the type filter to search all element types\n`;
|
|
4469
|
+
text += `• Include more sources: local, github, collection\n`;
|
|
4470
|
+
text += `• Check spelling and try synonyms\n`;
|
|
4471
|
+
text += `• Use browse_collection to explore available content`;
|
|
4472
|
+
}
|
|
4473
|
+
else {
|
|
4474
|
+
text += `**Results:**\n\n`;
|
|
4475
|
+
for (const result of results) {
|
|
4476
|
+
const { entry, source, matchType, score, isDuplicate, versionConflict } = result;
|
|
4477
|
+
const icon = this.getElementIcon(entry.elementType);
|
|
4478
|
+
const sourceIcon = this.getSourceIcon(source);
|
|
4479
|
+
text += `${icon} **${entry.name}** ${sourceIcon}\n`;
|
|
4480
|
+
text += ` 📁 Type: ${entry.elementType} | Source: ${source}\n`;
|
|
4481
|
+
text += ` 🎯 Match: ${matchType} | Score: ${score.toFixed(2)}\n`;
|
|
4482
|
+
if (entry.description) {
|
|
4483
|
+
const desc = entry.description.length > 100
|
|
4484
|
+
? entry.description.substring(0, 100) + '...'
|
|
4485
|
+
: entry.description;
|
|
4486
|
+
text += ` 📝 ${desc}\n`;
|
|
4487
|
+
}
|
|
4488
|
+
if (entry.version) {
|
|
4489
|
+
text += ` 🏷️ Version: ${entry.version}\n`;
|
|
4490
|
+
}
|
|
4491
|
+
// Show duplicate information
|
|
4492
|
+
if (isDuplicate) {
|
|
4493
|
+
text += ` ⚠️ **Duplicate detected across sources**\n`;
|
|
4494
|
+
if (versionConflict) {
|
|
4495
|
+
text += ` 🔄 Version conflict - Recommended: ${versionConflict.recommended} (${versionConflict.reason})\n`;
|
|
4496
|
+
}
|
|
4497
|
+
}
|
|
4498
|
+
text += `\n`;
|
|
4499
|
+
}
|
|
4500
|
+
const hasMore = results.length >= searchOptions.pageSize;
|
|
4501
|
+
if (hasMore) {
|
|
4502
|
+
const nextPage = searchOptions.page + 1;
|
|
4503
|
+
text += `⚠️ Results limited to ${searchOptions.pageSize}. Use page=${nextPage} for more results.\n\n`;
|
|
4504
|
+
}
|
|
4505
|
+
text += `💡 **Next steps:**\n`;
|
|
4506
|
+
text += `• Use get_element_details to see full content\n`;
|
|
4507
|
+
text += `• Use install_content for collection items\n`;
|
|
4508
|
+
text += `• Use activate_element for local elements\n`;
|
|
4509
|
+
text += `• Check for duplicates before submitting new content`;
|
|
4510
|
+
}
|
|
4511
|
+
return {
|
|
4512
|
+
content: [{
|
|
4513
|
+
type: "text",
|
|
4514
|
+
text
|
|
4515
|
+
}]
|
|
4516
|
+
};
|
|
4517
|
+
}
|
|
4518
|
+
catch (error) {
|
|
4519
|
+
const { ErrorHandler } = await import('./utils/ErrorHandler.js');
|
|
4520
|
+
const { SecureErrorHandler } = await import('./security/errorHandler.js');
|
|
4521
|
+
ErrorHandler.logError('DollhouseMCPServer.searchAll', error, {
|
|
4522
|
+
query: options.query,
|
|
4523
|
+
sources: options.sources,
|
|
4524
|
+
elementType: options.elementType
|
|
4525
|
+
});
|
|
4526
|
+
return {
|
|
4527
|
+
content: [{
|
|
4528
|
+
type: "text",
|
|
4529
|
+
text: `${this.getPersonaIndicator()}❌ Unified search failed: ${SecureErrorHandler.sanitizeError(error).message}`
|
|
4530
|
+
}]
|
|
4531
|
+
};
|
|
4532
|
+
}
|
|
4533
|
+
}
|
|
4534
|
+
/**
|
|
4535
|
+
* Get icon for source type
|
|
4536
|
+
*/
|
|
4537
|
+
getSourceIcon(source) {
|
|
4538
|
+
const icons = {
|
|
4539
|
+
local: '💻',
|
|
4540
|
+
github: '🐙',
|
|
4541
|
+
collection: '🌐'
|
|
4542
|
+
};
|
|
4543
|
+
return icons[source] || '📁';
|
|
4544
|
+
}
|
|
4545
|
+
/**
|
|
4546
|
+
* Get icon for element type
|
|
4547
|
+
*/
|
|
4548
|
+
getElementIcon(elementType) {
|
|
4549
|
+
const icons = {
|
|
4550
|
+
personas: '🎭',
|
|
4551
|
+
skills: '🎯',
|
|
4552
|
+
templates: '📄',
|
|
4553
|
+
agents: '🤖',
|
|
4554
|
+
memories: '🧠',
|
|
4555
|
+
ensembles: '🎼'
|
|
4556
|
+
};
|
|
4557
|
+
return icons[elementType] || '📁';
|
|
4558
|
+
}
|
|
4559
|
+
/**
|
|
4560
|
+
* Helper method to count elements in a directory
|
|
4561
|
+
*/
|
|
4562
|
+
async countElementsInDir(dirPath) {
|
|
4563
|
+
try {
|
|
4564
|
+
// Check if directory exists and is accessible
|
|
4565
|
+
await fs.access(dirPath);
|
|
4566
|
+
const files = await fs.readdir(dirPath);
|
|
4567
|
+
// Count all element files (.md, .json, .yaml) to support all element types
|
|
4568
|
+
// - Personas: .md files
|
|
4569
|
+
// - Skills: .md files
|
|
4570
|
+
// - Templates: .md or .yaml files
|
|
4571
|
+
// - Agents: .md files
|
|
4572
|
+
return files.filter(file => file.endsWith('.md') ||
|
|
4573
|
+
file.endsWith('.json') ||
|
|
4574
|
+
file.endsWith('.yaml')).length;
|
|
4575
|
+
}
|
|
4576
|
+
catch (error) {
|
|
4577
|
+
return 0;
|
|
4578
|
+
}
|
|
4579
|
+
}
|
|
4580
|
+
/**
|
|
4581
|
+
* Helper method to get list of elements by type
|
|
4582
|
+
*/
|
|
4583
|
+
async getElementsList(elementType) {
|
|
4584
|
+
try {
|
|
4585
|
+
const localPortfolioManager = PortfolioManager.getInstance();
|
|
4586
|
+
let elementTypeEnum;
|
|
4587
|
+
switch (elementType) {
|
|
4588
|
+
case 'personas':
|
|
4589
|
+
elementTypeEnum = ElementType.PERSONA;
|
|
4590
|
+
break;
|
|
4591
|
+
case 'skills':
|
|
4592
|
+
elementTypeEnum = ElementType.SKILL;
|
|
4593
|
+
break;
|
|
4594
|
+
case 'templates':
|
|
4595
|
+
elementTypeEnum = ElementType.TEMPLATE;
|
|
4596
|
+
break;
|
|
4597
|
+
case 'agents':
|
|
4598
|
+
elementTypeEnum = ElementType.AGENT;
|
|
4599
|
+
break;
|
|
4600
|
+
default:
|
|
4601
|
+
// Instead of silently returning empty array, throw descriptive error
|
|
4602
|
+
const validTypes = ['personas', 'skills', 'templates', 'agents'];
|
|
4603
|
+
throw new Error(`Invalid element type: '${elementType}'. Valid types are: ${validTypes.join(', ')}`);
|
|
4604
|
+
}
|
|
4605
|
+
const dirPath = localPortfolioManager.getElementDir(elementTypeEnum);
|
|
4606
|
+
// Check if directory exists and is accessible
|
|
4607
|
+
await fs.access(dirPath);
|
|
4608
|
+
const files = await fs.readdir(dirPath);
|
|
4609
|
+
// Filter and extract names for all element file types
|
|
4610
|
+
// - Personas: .md files
|
|
4611
|
+
// - Skills: .md files
|
|
4612
|
+
// - Templates: .md or .yaml files
|
|
4613
|
+
// - Agents: .md files
|
|
4614
|
+
return files
|
|
4615
|
+
.filter(file => file.endsWith('.md') || file.endsWith('.json') || file.endsWith('.yaml'))
|
|
4616
|
+
.map(file => {
|
|
4617
|
+
// Remove file extension to get element name
|
|
4618
|
+
if (file.endsWith('.md'))
|
|
4619
|
+
return file.replace('.md', '');
|
|
4620
|
+
if (file.endsWith('.json'))
|
|
4621
|
+
return file.replace('.json', '');
|
|
4622
|
+
if (file.endsWith('.yaml'))
|
|
4623
|
+
return file.replace('.yaml', '');
|
|
4624
|
+
return file;
|
|
4625
|
+
});
|
|
4626
|
+
}
|
|
4627
|
+
catch (error) {
|
|
4628
|
+
// Check if this is our validation error for invalid element types
|
|
4629
|
+
if (error.message && error.message.includes('Invalid element type:')) {
|
|
4630
|
+
throw error; // Re-throw validation errors for debugging
|
|
4631
|
+
}
|
|
4632
|
+
// For file system errors, provide context about the operation
|
|
4633
|
+
const errorMessage = error.code === 'ENOENT'
|
|
4634
|
+
? `Element directory not found for type '${elementType}'. Directory may not exist yet.`
|
|
4635
|
+
: `Failed to read elements directory for type '${elementType}': ${error.message || 'Unknown file system error'}`;
|
|
4636
|
+
logger.warn('Error in getElementsList', {
|
|
4637
|
+
elementType,
|
|
4638
|
+
error: error.message,
|
|
4639
|
+
code: error.code
|
|
4640
|
+
});
|
|
4641
|
+
throw new Error(errorMessage);
|
|
4642
|
+
}
|
|
4643
|
+
}
|
|
4644
|
+
/**
|
|
4645
|
+
* Helper method to load element by type
|
|
4646
|
+
*/
|
|
4647
|
+
async loadElementByType(elementName, elementType) {
|
|
4648
|
+
try {
|
|
4649
|
+
const localPortfolioManager = PortfolioManager.getInstance();
|
|
4650
|
+
let elementTypeEnum;
|
|
4651
|
+
switch (elementType) {
|
|
4652
|
+
case 'personas':
|
|
4653
|
+
elementTypeEnum = ElementType.PERSONA;
|
|
4654
|
+
break;
|
|
4655
|
+
case 'skills':
|
|
4656
|
+
elementTypeEnum = ElementType.SKILL;
|
|
4657
|
+
break;
|
|
4658
|
+
case 'templates':
|
|
4659
|
+
elementTypeEnum = ElementType.TEMPLATE;
|
|
4660
|
+
break;
|
|
4661
|
+
case 'agents':
|
|
4662
|
+
elementTypeEnum = ElementType.AGENT;
|
|
4663
|
+
break;
|
|
4664
|
+
default:
|
|
4665
|
+
// Instead of silently returning null, throw descriptive error
|
|
4666
|
+
const validTypes = ['personas', 'skills', 'templates', 'agents'];
|
|
4667
|
+
throw new Error(`Invalid element type: '${elementType}'. Valid types are: ${validTypes.join(', ')}`);
|
|
4668
|
+
}
|
|
4669
|
+
const dirPath = localPortfolioManager.getElementDir(elementTypeEnum);
|
|
4670
|
+
const filePath = path.join(dirPath, `${elementName}.json`);
|
|
4671
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
4672
|
+
return JSON.parse(content);
|
|
4673
|
+
}
|
|
4674
|
+
catch (error) {
|
|
4675
|
+
// Check if this is our validation error for invalid element types
|
|
4676
|
+
if (error.message && error.message.includes('Invalid element type:')) {
|
|
4677
|
+
throw error; // Re-throw validation errors for debugging
|
|
4678
|
+
}
|
|
4679
|
+
// Provide specific error messages for common file system errors
|
|
4680
|
+
let errorMessage;
|
|
4681
|
+
if (error.code === 'ENOENT') {
|
|
4682
|
+
errorMessage = `Element '${elementName}' not found in ${elementType}. File does not exist.`;
|
|
4683
|
+
}
|
|
4684
|
+
else if (error instanceof SyntaxError) {
|
|
4685
|
+
errorMessage = `Element '${elementName}' in ${elementType} contains invalid JSON: ${error.message}`;
|
|
4686
|
+
}
|
|
4687
|
+
else {
|
|
4688
|
+
errorMessage = `Failed to load element '${elementName}' from ${elementType}: ${error.message || 'Unknown error'}`;
|
|
4689
|
+
}
|
|
4690
|
+
logger.warn('Error in loadElementByType', {
|
|
4691
|
+
elementName,
|
|
4692
|
+
elementType,
|
|
4693
|
+
error: error.message,
|
|
4694
|
+
code: error.code
|
|
4695
|
+
});
|
|
4696
|
+
throw new Error(errorMessage);
|
|
4697
|
+
}
|
|
4698
|
+
}
|
|
3139
4699
|
async run() {
|
|
3140
|
-
const transport = new StdioServerTransport();
|
|
3141
4700
|
logger.info("Starting DollhouseMCP server...");
|
|
4701
|
+
// Docker build verification - proves we're running fresh code
|
|
4702
|
+
logger.info("BUILD VERIFICATION: Running build from 2025-08-17 16:30 UTC - PR606 ARM64 fix");
|
|
4703
|
+
// FIX #610: Initialize portfolio and complete setup BEFORE connecting to MCP
|
|
4704
|
+
// This ensures personas and portfolio are ready when MCP commands arrive
|
|
4705
|
+
try {
|
|
4706
|
+
await this.initializePortfolio();
|
|
4707
|
+
await this.completeInitialization();
|
|
4708
|
+
logger.info("Portfolio and personas initialized successfully");
|
|
4709
|
+
// Output message that Docker tests can detect
|
|
4710
|
+
logger.info("DollhouseMCP server ready - waiting for MCP connection on stdio");
|
|
4711
|
+
}
|
|
4712
|
+
catch (error) {
|
|
4713
|
+
ErrorHandler.logError('DollhouseMCPServer.run.initialization', error);
|
|
4714
|
+
throw error; // Re-throw to prevent server from starting with incomplete initialization
|
|
4715
|
+
}
|
|
4716
|
+
const transport = new StdioServerTransport();
|
|
3142
4717
|
// Set up graceful shutdown handlers
|
|
3143
4718
|
const cleanup = async () => {
|
|
3144
4719
|
logger.info("Shutting down DollhouseMCP server...");
|
|
@@ -3148,10 +4723,6 @@ Placeholders for custom format:
|
|
|
3148
4723
|
await this.githubAuthManager.cleanup();
|
|
3149
4724
|
}
|
|
3150
4725
|
// Clean up any other resources
|
|
3151
|
-
if (this.updateManager) {
|
|
3152
|
-
// UpdateManager might have active operations too
|
|
3153
|
-
logger.debug("Cleaning up update manager...");
|
|
3154
|
-
}
|
|
3155
4726
|
logger.info("Cleanup completed");
|
|
3156
4727
|
}
|
|
3157
4728
|
catch (error) {
|
|
@@ -3192,14 +4763,16 @@ async function startServerWithRetry(retriesLeft = STARTUP_DELAYS.length) {
|
|
|
3192
4763
|
return startServerWithRetry(retriesLeft - 1);
|
|
3193
4764
|
}
|
|
3194
4765
|
// Final failure - minimal error message for security
|
|
4766
|
+
// Note: Using console.error here is intentional as it's the final error before exit
|
|
3195
4767
|
console.error("[DollhouseMCP] Server startup failed");
|
|
3196
4768
|
process.exit(1);
|
|
3197
4769
|
}
|
|
3198
4770
|
}
|
|
3199
4771
|
if ((isDirectExecution || isNpxExecution || isCliExecution) && !isTest) {
|
|
3200
4772
|
startServerWithRetry().catch(() => {
|
|
4773
|
+
// Note: Using console.error here is intentional as it's the final error before exit
|
|
3201
4774
|
console.error("[DollhouseMCP] Server startup failed");
|
|
3202
4775
|
process.exit(1);
|
|
3203
4776
|
});
|
|
3204
4777
|
}
|
|
3205
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLGlEQUFpRDtBQUNqRCxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDeEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFFSCxPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ25ELE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBd0IsTUFBTSw4QkFBOEIsQ0FBQztBQUNoSSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFJaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFB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QyxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUksV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQzFELGdDQUFnQztZQUNoQyxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztZQUN2RCxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN6RCxPQUFPLG9CQUFvQixDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QscURBQXFEO1FBQ3JELE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBSSxDQUFDLGlCQUFpQixJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3ZFLG9CQUFvQixFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtRQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDdEQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbi8vIERlZmVuc2l2ZSBlcnJvciBoYW5kbGluZyBmb3IgbnB4L0NMSSBleGVjdXRpb25cbnByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgKGVycm9yKSA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoJ1tEb2xsaG91c2VNQ1BdIFNlcnZlciBzdGFydHVwIGZhaWxlZCcpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59KTtcblxucHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKHJlYXNvbiwgcHJvbWlzZSkgPT4ge1xuICBjb25zb2xlLmVycm9yKCdbRG9sbGhvdXNlTUNQXSBTZXJ2ZXIgc3RhcnR1cCBmYWlsZWQnKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG5cbmltcG9ydCB7IFNlcnZlciB9IGZyb20gXCJAbW9kZWxjb250ZXh0cHJvdG9jb2wvc2RrL3NlcnZlci9pbmRleC5qc1wiO1xuaW1wb3J0IHsgU3RkaW9TZXJ2ZXJUcmFuc3BvcnQgfSBmcm9tIFwiQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay9zZXJ2ZXIvc3RkaW8uanNcIjtcbmltcG9ydCB7IE1jcEVycm9yLCBFcnJvckNvZGUgfSBmcm9tIFwiQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay90eXBlcy5qc1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBsb2FkSW5kaWNhdG9yQ29uZmlnLCBmb3JtYXRJbmRpY2F0b3IsIHZhbGlkYXRlQ3VzdG9tRm9ybWF0LCB0eXBlIEluZGljYXRvckNvbmZpZyB9IGZyb20gJy4vY29uZmlnL2luZGljYXRvci1jb25maWcuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4vc2VjdXJpdHkvc2VjdXJlWWFtbFBhcnNlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi9lcnJvcnMvU2VjdXJpdHlFcnJvci5qcyc7XG5pbXBvcnQgeyBTZWN1cmVFcnJvckhhbmRsZXIgfSBmcm9tICcuL3NlY3VyaXR5L2Vycm9ySGFuZGxlci5qcyc7XG5cbi8vIEltcG9ydCBtb2R1bGFyaXplZCBjb21wb25lbnRzXG5pbXBvcnQgeyBQZXJzb25hLCBQZXJzb25hTWV0YWRhdGEgfSBmcm9tICcuL3R5cGVzL3BlcnNvbmEuanMnO1xuaW1wb3J0IHsgQVBJQ2FjaGUsIENvbGxlY3Rpb25DYWNoZSB9IGZyb20gJy4vY2FjaGUvaW5kZXguanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVGaWxlbmFtZSwgc2FuaXRpemVJbnB1dCwgdmFsaWRhdGVDb250ZW50U2l6ZSwgdmFsaWRhdGVVc2VybmFtZSwgTUNQSW5wdXRWYWxpZGF0b3IgfSBmcm9tICcuL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUywgVkFMSURBVElPTl9QQVRURVJOUyB9IGZyb20gJy4vc2VjdXJpdHkvY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IENvbnRlbnRWYWxpZGF0b3IgfSBmcm9tICcuL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgUGF0aFZhbGlkYXRvciB9IGZyb20gJy4vc2VjdXJpdHkvcGF0aFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBGaWxlTG9ja01hbmFnZXIgfSBmcm9tICcuL3NlY3VyaXR5L2ZpbGVMb2NrTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUFub255bW91c0lkLCBnZW5lcmF0ZVVuaXF1ZUlkLCBzbHVnaWZ5IH0gZnJvbSAnLi91dGlscy9maWxlc3lzdGVtLmpzJztcbmltcG9ydCB7IEdpdEh1YkNsaWVudCwgQ29sbGVjdGlvbkJyb3dzZXIsIENvbGxlY3Rpb25TZWFyY2gsIFBlcnNvbmFEZXRhaWxzLCBQZXJzb25hU3VibWl0dGVyLCBFbGVtZW50SW5zdGFsbGVyIH0gZnJvbSAnLi9jb2xsZWN0aW9uL2luZGV4LmpzJztcbmltcG9ydCB7IFVwZGF0ZU1hbmFnZXIgfSBmcm9tICcuL3VwZGF0ZS9pbmRleC5qcyc7XG5pbXBvcnQgeyBTZXJ2ZXJTZXR1cCwgSVRvb2xIYW5kbGVyIH0gZnJvbSAnLi9zZXJ2ZXIvaW5kZXguanMnO1xuaW1wb3J0IHsgR2l0SHViQXV0aE1hbmFnZXIgfSBmcm9tICcuL2F1dGgvR2l0SHViQXV0aE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUGVyc29uYUV4cG9ydGVyLCBQZXJzb25hSW1wb3J0ZXIsIFBlcnNvbmFTaGFyZXIgfSBmcm9tICcuL3BlcnNvbmEvZXhwb3J0LWltcG9ydC9pbmRleC5qcyc7XG5pbXBvcnQgeyBpc0RlZmF1bHRQZXJzb25hIH0gZnJvbSAnLi9jb25zdGFudHMvZGVmYXVsdFBlcnNvbmFzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIsIEVsZW1lbnRUeXBlIH0gZnJvbSAnLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBNaWdyYXRpb25NYW5hZ2VyIH0gZnJvbSAnLi9wb3J0Zm9saW8vTWlncmF0aW9uTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTa2lsbE1hbmFnZXIgfSBmcm9tICcuL2VsZW1lbnRzL3NraWxscy9pbmRleC5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tICcuL2VsZW1lbnRzL3RlbXBsYXRlcy9UZW1wbGF0ZU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgQWdlbnRNYW5hZ2VyIH0gZnJvbSAnLi9lbGVtZW50cy9hZ2VudHMvQWdlbnRNYW5hZ2VyLmpzJztcblxuXG5cbi8vIERldGVjdCBleGVjdXRpb24gZW52aXJvbm1lbnRcbmNvbnN0IEVYRUNVVElPTl9FTlYgPSB7XG4gIGlzTnB4OiBwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGg/LmluY2x1ZGVzKCducHgnKSB8fCBmYWxzZSxcbiAgaXNDbGk6IHByb2Nlc3MuYXJndlsxXT8uZW5kc1dpdGgoJy9kb2xsaG91c2VtY3AnKSB8fCBmYWxzZSxcbiAgaXNEaXJlY3Q6ICFwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGgsXG4gIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgc2NyaXB0UGF0aDogcHJvY2Vzcy5hcmd2WzFdLFxufTtcblxuLy8gT25seSBsb2cgZXhlY3V0aW9uIGVudmlyb25tZW50IGluIGRlYnVnIG1vZGVcbmlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfREVCVUcpIHtcbiAgY29uc29sZS5lcnJvcignW0RvbGxob3VzZU1DUF0gRGVidWcgbW9kZSBlbmFibGVkJyk7XG59XG5cbmV4cG9ydCBjbGFzcyBEb2xsaG91c2VNQ1BTZXJ2ZXIgaW1wbGVtZW50cyBJVG9vbEhhbmRsZXIge1xuICBwcml2YXRlIHNlcnZlcjogU2VydmVyO1xuICBwcml2YXRlIHBlcnNvbmFzRGlyOiBzdHJpbmc7XG4gIHByaXZhdGUgcGVyc29uYXM6IE1hcDxzdHJpbmcsIFBlcnNvbmE+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGFjdGl2ZVBlcnNvbmE6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGN1cnJlbnRVc2VyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhcGlDYWNoZTogQVBJQ2FjaGUgPSBuZXcgQVBJQ2FjaGUoKTtcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uQ2FjaGU6IENvbGxlY3Rpb25DYWNoZSA9IG5ldyBDb2xsZWN0aW9uQ2FjaGUoKTtcbiAgcHJpdmF0ZSByYXRlTGltaXRUcmFja2VyID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICBwcml2YXRlIGluZGljYXRvckNvbmZpZzogSW5kaWNhdG9yQ29uZmlnO1xuICBwcml2YXRlIGdpdGh1YkNsaWVudDogR2l0SHViQ2xpZW50O1xuICBwcml2YXRlIGdpdGh1YkF1dGhNYW5hZ2VyOiBHaXRIdWJBdXRoTWFuYWdlcjtcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uQnJvd3NlcjogQ29sbGVjdGlvbkJyb3dzZXI7XG4gIHByaXZhdGUgY29sbGVjdGlvblNlYXJjaDogQ29sbGVjdGlvblNlYXJjaDtcbiAgcHJpdmF0ZSBwZXJzb25hRGV0YWlsczogUGVyc29uYURldGFpbHM7XG4gIHByaXZhdGUgZWxlbWVudEluc3RhbGxlcjogRWxlbWVudEluc3RhbGxlcjtcbiAgcHJpdmF0ZSBwZXJzb25hU3VibWl0dGVyOiBQZXJzb25hU3VibWl0dGVyO1xuICBwcml2YXRlIHVwZGF0ZU1hbmFnZXI/OiBVcGRhdGVNYW5hZ2VyO1xuICBwcml2YXRlIHNlcnZlclNldHVwOiBTZXJ2ZXJTZXR1cDtcbiAgcHJpdmF0ZSBwZXJzb25hRXhwb3J0ZXI6IFBlcnNvbmFFeHBvcnRlcjtcbiAgcHJpdmF0ZSBwZXJzb25hSW1wb3J0ZXI/OiBQZXJzb25hSW1wb3J0ZXI7XG4gIHByaXZhdGUgcGVyc29uYVNoYXJlcjogUGVyc29uYVNoYXJlcjtcbiAgcHJpdmF0ZSBwb3J0Zm9saW9NYW5hZ2VyOiBQb3J0Zm9saW9NYW5hZ2VyO1xuICBwcml2YXRlIG1pZ3JhdGlvbk1hbmFnZXI6IE1pZ3JhdGlvbk1hbmFnZXI7XG4gIHByaXZhdGUgc2tpbGxNYW5hZ2VyOiBTa2lsbE1hbmFnZXI7XG4gIHByaXZhdGUgdGVtcGxhdGVNYW5hZ2VyOiBUZW1wbGF0ZU1hbmFnZXI7XG4gIHByaXZhdGUgYWdlbnRNYW5hZ2VyOiBBZ2VudE1hbmFnZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zZXJ2ZXIgPSBuZXcgU2VydmVyKFxuICAgICAge1xuICAgICAgICBuYW1lOiBcImRvbGxob3VzZW1jcFwiLFxuICAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICB0b29sczoge30sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEluaXRpYWxpemUgcG9ydGZvbGlvIHN5c3RlbVxuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIgPSBuZXcgTWlncmF0aW9uTWFuYWdlcih0aGlzLnBvcnRmb2xpb01hbmFnZXIpO1xuICAgIFxuICAgIC8vIENSSVRJQ0FMIEZJWDogRG9uJ3QgYWNjZXNzIGRpcmVjdG9yaWVzIHVudGlsIGFmdGVyIG1pZ3JhdGlvbiBydW5zXG4gICAgLy8gUHJldmlvdXNseTogdGhpcy5wZXJzb25hc0RpciB3YXMgc2V0IGhlcmUsIGNyZWF0aW5nIGRpcmVjdG9yaWVzIGJlZm9yZSBtaWdyYXRpb24gY291bGQgZml4IHRoZW1cbiAgICAvLyBOb3c6IFdlIGRlbGF5IGRpcmVjdG9yeSBhY2Nlc3MgdW50aWwgaW5pdGlhbGl6ZVBvcnRmb2xpbygpIGNvbXBsZXRlc1xuICAgIHRoaXMucGVyc29uYXNEaXIgPSAnJzsgLy8gVGVtcG9yYXJ5IC0gd2lsbCBiZSBzZXQgYWZ0ZXIgbWlncmF0aW9uXG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBlbGVtZW50IG1hbmFnZXJzXG4gICAgdGhpcy5za2lsbE1hbmFnZXIgPSBuZXcgU2tpbGxNYW5hZ2VyKCk7XG4gICAgdGhpcy50ZW1wbGF0ZU1hbmFnZXIgPSBuZXcgVGVtcGxhdGVNYW5hZ2VyKCk7XG4gICAgdGhpcy5hZ2VudE1hbmFnZXIgPSBuZXcgQWdlbnRNYW5hZ2VyKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRCYXNlRGlyKCkpO1xuICAgIFxuICAgIC8vIExvZyByZXNvbHZlZCBwYXRoIGZvciBkZWJ1Z2dpbmdcbiAgICBsb2dnZXIuaW5mbyhgUGVyc29uYXMgZGlyZWN0b3J5IHJlc29sdmVkIHRvOiAke3RoaXMucGVyc29uYXNEaXJ9YCk7XG4gICAgXG4gICAgLy8gUGF0aFZhbGlkYXRvciB3aWxsIGJlIGluaXRpYWxpemVkIGFmdGVyIG1pZ3JhdGlvbiBjb21wbGV0ZXNcbiAgICBcbiAgICAvLyBMb2FkIHVzZXIgaWRlbnRpdHkgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1VTRVIgfHwgbnVsbDtcbiAgICBcbiAgICAvLyBMb2FkIGluZGljYXRvciBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5pbmRpY2F0b3JDb25maWcgPSBsb2FkSW5kaWNhdG9yQ29uZmlnKCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBwZXJzb25hIG1hbmFnZXJcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGNvbGxlY3Rpb24gbW9kdWxlc1xuICAgIHRoaXMuZ2l0aHViQ2xpZW50ID0gbmV3IEdpdEh1YkNsaWVudCh0aGlzLmFwaUNhY2hlLCB0aGlzLnJhdGVMaW1pdFRyYWNrZXIpO1xuICAgIHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIgPSBuZXcgR2l0SHViQXV0aE1hbmFnZXIodGhpcy5hcGlDYWNoZSk7XG4gICAgdGhpcy5jb2xsZWN0aW9uQnJvd3NlciA9IG5ldyBDb2xsZWN0aW9uQnJvd3Nlcih0aGlzLmdpdGh1YkNsaWVudCwgdGhpcy5jb2xsZWN0aW9uQ2FjaGUpO1xuICAgIHRoaXMuY29sbGVjdGlvblNlYXJjaCA9IG5ldyBDb2xsZWN0aW9uU2VhcmNoKHRoaXMuZ2l0aHViQ2xpZW50LCB0aGlzLmNvbGxlY3Rpb25DYWNoZSk7XG4gICAgdGhpcy5wZXJzb25hRGV0YWlscyA9IG5ldyBQZXJzb25hRGV0YWlscyh0aGlzLmdpdGh1YkNsaWVudCk7XG4gICAgdGhpcy5lbGVtZW50SW5zdGFsbGVyID0gbmV3IEVsZW1lbnRJbnN0YWxsZXIodGhpcy5naXRodWJDbGllbnQpO1xuICAgIHRoaXMucGVyc29uYVN1Ym1pdHRlciA9IG5ldyBQZXJzb25hU3VibWl0dGVyKCk7XG4gICAgXG4gICAgLy8gVXBkYXRlIG1hbmFnZXIgd2lsbCBiZSBpbml0aWFsaXplZCBhZnRlciBtaWdyYXRpb24gY29tcGxldGVzIHRvIGF2b2lkIGpzZG9tIGNyYXNoXG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBleHBvcnQvaW1wb3J0L3NoYXJlIG1vZHVsZXNcbiAgICB0aGlzLnBlcnNvbmFFeHBvcnRlciA9IG5ldyBQZXJzb25hRXhwb3J0ZXIodGhpcy5jdXJyZW50VXNlcik7XG4gICAgLy8gUGVyc29uYUltcG9ydGVyIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgbWlncmF0aW9uIGNvbXBsZXRlc1xuICAgIHRoaXMucGVyc29uYVNoYXJlciA9IG5ldyBQZXJzb25hU2hhcmVyKHRoaXMuZ2l0aHViQ2xpZW50LCB0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHNlcnZlciBzZXR1cFxuICAgIHRoaXMuc2VydmVyU2V0dXAgPSBuZXcgU2VydmVyU2V0dXAoKTtcbiAgICB0aGlzLnNlcnZlclNldHVwLnNldHVwU2VydmVyKHRoaXMuc2VydmVyLCB0aGlzKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHBvcnRmb2xpbyBhbmQgcGVyZm9ybSBtaWdyYXRpb24gaWYgbmVlZGVkXG4gICAgdGhpcy5pbml0aWFsaXplUG9ydGZvbGlvKCkudGhlbigoKSA9PiB7XG4gICAgICAvLyBOT1cgc2FmZSB0byBhY2Nlc3MgZGlyZWN0b3JpZXMgYWZ0ZXIgbWlncmF0aW9uXG4gICAgICB0aGlzLnBlcnNvbmFzRGlyID0gdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuUEVSU09OQSk7XG4gICAgICBcbiAgICAgIC8vIExvZyByZXNvbHZlZCBwYXRoIGZvciBkZWJ1Z2dpbmdcbiAgICAgIGxvZ2dlci5pbmZvKGBQZXJzb25hcyBkaXJlY3RvcnkgcmVzb2x2ZWQgdG86ICR7dGhpcy5wZXJzb25hc0Rpcn1gKTtcbiAgICAgIFxuICAgICAgLy8gSW5pdGlhbGl6ZSBQYXRoVmFsaWRhdG9yIHdpdGggdGhlIHBlcnNvbmFzIGRpcmVjdG9yeVxuICAgICAgUGF0aFZhbGlkYXRvci5pbml0aWFsaXplKHRoaXMucGVyc29uYXNEaXIpO1xuICAgICAgXG4gICAgICAvLyBJbml0aWFsaXplIHVwZGF0ZSBtYW5hZ2VyIHdpdGggc2FmZSBkaXJlY3RvcnlcbiAgICAgIC8vIFVzZSB0aGUgcGFyZW50IG9mIHBlcnNvbmFzIGRpcmVjdG9yeSB0byBhdm9pZCBwcm9kdWN0aW9uIGNoZWNrXG4gICAgICBjb25zdCBzYWZlRGlyID0gcGF0aC5kaXJuYW1lKHRoaXMucGVyc29uYXNEaXIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy51cGRhdGVNYW5hZ2VyID0gbmV3IFVwZGF0ZU1hbmFnZXIoc2FmZURpcik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbRG9sbGhvdXNlTUNQXSBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBVcGRhdGVNYW5hZ2VyOicsIGVycm9yKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBVcGRhdGVNYW5hZ2VyOiAke2Vycm9yfWApO1xuICAgICAgICAvLyBDb250aW51ZSB3aXRob3V0IHVwZGF0ZSBmdW5jdGlvbmFsaXR5XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEluaXRpYWxpemUgaW1wb3J0IG1vZHVsZSB0aGF0IGRlcGVuZHMgb24gcGVyc29uYXNEaXJcbiAgICAgIHRoaXMucGVyc29uYUltcG9ydGVyID0gbmV3IFBlcnNvbmFJbXBvcnRlcih0aGlzLnBlcnNvbmFzRGlyLCB0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICAgIFxuICAgICAgdGhpcy5sb2FkUGVyc29uYXMoKTtcbiAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAvLyBEb24ndCB1c2UgQ1JJVElDQUwgaW4gdGhlIGVycm9yIG1lc3NhZ2UgYXMgaXQgdHJpZ2dlcnMgRG9ja2VyIHRlc3QgZmFpbHVyZXNcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tEb2xsaG91c2VNQ1BdIEZhaWxlZCB0byBpbml0aWFsaXplIHBvcnRmb2xpbzonLCBlcnJvcik7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIHBvcnRmb2xpbzogJHtlcnJvcn1gKTtcbiAgICB9KTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplUG9ydGZvbGlvKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIG1pZ3JhdGlvbiBpcyBuZWVkZWRcbiAgICBjb25zdCBuZWVkc01pZ3JhdGlvbiA9IGF3YWl0IHRoaXMubWlncmF0aW9uTWFuYWdlci5uZWVkc01pZ3JhdGlvbigpO1xuICAgIFxuICAgIGlmIChuZWVkc01pZ3JhdGlvbikge1xuICAgICAgbG9nZ2VyLmluZm8oJ0xlZ2FjeSBwZXJzb25hcyBkZXRlY3RlZC4gU3RhcnRpbmcgbWlncmF0aW9uLi4uJyk7XG4gICAgICBcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubWlncmF0aW9uTWFuYWdlci5taWdyYXRlKHsgYmFja3VwOiB0cnVlIH0pO1xuICAgICAgXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFN1Y2Nlc3NmdWxseSBtaWdyYXRlZCAke3Jlc3VsdC5taWdyYXRlZENvdW50fSBwZXJzb25hc2ApO1xuICAgICAgICBpZiAocmVzdWx0LmJhY2tlZFVwICYmIHJlc3VsdC5iYWNrdXBQYXRoKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYEJhY2t1cCBjcmVhdGVkIGF0OiAke3Jlc3VsdC5iYWNrdXBQYXRofWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ01pZ3JhdGlvbiBjb21wbGV0ZWQgd2l0aCBlcnJvcnM6Jyk7XG4gICAgICAgIHJlc3VsdC5lcnJvcnMuZm9yRWFjaChlcnIgPT4gbG9nZ2VyLmVycm9yKGAgIC0gJHtlcnJ9YCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBFbnN1cmUgcG9ydGZvbGlvIHN0cnVjdHVyZSBleGlzdHNcbiAgICBjb25zdCBwb3J0Zm9saW9FeGlzdHMgPSBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuZXhpc3RzKCk7XG4gICAgaWYgKCFwb3J0Zm9saW9FeGlzdHMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdDcmVhdGluZyBwb3J0Zm9saW8gZGlyZWN0b3J5IHN0cnVjdHVyZS4uLicpO1xuICAgICAgYXdhaXQgdGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmluaXRpYWxpemUoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBjb2xsZWN0aW9uIGNhY2hlIGZvciBhbm9ueW1vdXMgYWNjZXNzXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQ29sbGVjdGlvbkNhY2hlKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGNvbGxlY3Rpb24gY2FjaGUgd2l0aCBzZWVkIGRhdGEgZm9yIGFub255bW91cyBicm93c2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ29sbGVjdGlvbkNhY2hlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpc0NhY2hlVmFsaWQgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25DYWNoZS5pc0NhY2hlVmFsaWQoKTtcbiAgICAgIGlmICghaXNDYWNoZVZhbGlkKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdJbml0aWFsaXppbmcgY29sbGVjdGlvbiBjYWNoZSB3aXRoIHNlZWQgZGF0YS4uLicpO1xuICAgICAgICBjb25zdCB7IENvbGxlY3Rpb25TZWVkZXIgfSA9IGF3YWl0IGltcG9ydCgnLi9jb2xsZWN0aW9uL0NvbGxlY3Rpb25TZWVkZXIuanMnKTtcbiAgICAgICAgY29uc3Qgc2VlZERhdGEgPSBDb2xsZWN0aW9uU2VlZGVyLmdldFNlZWREYXRhKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbkNhY2hlLnNhdmVDYWNoZShzZWVkRGF0YSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBDb2xsZWN0aW9uIGNhY2hlIGluaXRpYWxpemVkIHdpdGggJHtzZWVkRGF0YS5sZW5ndGh9IGl0ZW1zYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuY29sbGVjdGlvbkNhY2hlLmdldENhY2hlU3RhdHMoKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDb2xsZWN0aW9uIGNhY2hlIGFscmVhZHkgdmFsaWQgd2l0aCAke3N0YXRzLml0ZW1Db3VudH0gaXRlbXNgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb2xsZWN0aW9uIGNhY2hlOiAke2Vycm9yfWApO1xuICAgICAgLy8gRG9uJ3QgdGhyb3cgLSBjYWNoZSBmYWlsdXJlcyBzaG91bGRuJ3QgcHJldmVudCBzZXJ2ZXIgc3RhcnR1cFxuICAgIH1cbiAgfVxuXG4gIC8vIFRvb2wgaGFuZGxlciBtZXRob2RzIC0gbm93IHB1YmxpYyBmb3IgYWNjZXNzIGZyb20gdG9vbCBtb2R1bGVzXG4gIFxuICBwcml2YXRlIGdldFBlcnNvbmFJbmRpY2F0b3IoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuYWN0aXZlUGVyc29uYSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgY29uc3QgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHRoaXMuYWN0aXZlUGVyc29uYSk7XG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0SW5kaWNhdG9yKHRoaXMuaW5kaWNhdG9yQ29uZmlnLCB7XG4gICAgICBuYW1lOiBwZXJzb25hLm1ldGFkYXRhLm5hbWUsXG4gICAgICB2ZXJzaW9uOiBwZXJzb25hLm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICBhdXRob3I6IHBlcnNvbmEubWV0YWRhdGEuYXV0aG9yLFxuICAgICAgY2F0ZWdvcnk6IHBlcnNvbmEubWV0YWRhdGEuY2F0ZWdvcnlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemUgZWxlbWVudCB0eXBlIHRvIGhhbmRsZSBib3RoIHNpbmd1bGFyIChuZXcpIGFuZCBwbHVyYWwgKGxlZ2FjeSkgZm9ybXNcbiAgICogVGhpcyBwcm92aWRlcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGR1cmluZyB0aGUgdHJhbnNpdGlvbiB0byB2MS40LjBcbiAgICovXG4gIHByaXZhdGUgbm9ybWFsaXplRWxlbWVudFR5cGUodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBNYXAgcGx1cmFsIGZvcm1zIHRvIHNpbmd1bGFyIEVsZW1lbnRUeXBlIHZhbHVlc1xuICAgIGNvbnN0IHBsdXJhbFRvU2luZ3VsYXJNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAncGVyc29uYXMnOiBFbGVtZW50VHlwZS5QRVJTT05BLFxuICAgICAgJ3NraWxscyc6IEVsZW1lbnRUeXBlLlNLSUxMLFxuICAgICAgJ3RlbXBsYXRlcyc6IEVsZW1lbnRUeXBlLlRFTVBMQVRFLFxuICAgICAgJ2FnZW50cyc6IEVsZW1lbnRUeXBlLkFHRU5ULFxuICAgICAgJ21lbW9yaWVzJzogRWxlbWVudFR5cGUuTUVNT1JZLFxuICAgICAgJ2Vuc2VtYmxlcyc6IEVsZW1lbnRUeXBlLkVOU0VNQkxFXG4gICAgfTtcbiAgICBcbiAgICAvLyBJZiBpdCdzIGFscmVhZHkgYSB2YWxpZCBFbGVtZW50VHlwZSB2YWx1ZSwgcmV0dXJuIGFzLWlzXG4gICAgaWYgKE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmluY2x1ZGVzKHR5cGUgYXMgRWxlbWVudFR5cGUpKSB7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gICAgXG4gICAgLy8gSWYgaXQncyBhIHBsdXJhbCBmb3JtLCBjb252ZXJ0IHRvIHNpbmd1bGFyXG4gICAgaWYgKHBsdXJhbFRvU2luZ3VsYXJNYXBbdHlwZV0pIHtcbiAgICAgIC8vIExvZyBkZXByZWNhdGlvbiB3YXJuaW5nXG4gICAgICBsb2dnZXIud2FybihgVXNpbmcgcGx1cmFsIGVsZW1lbnQgdHlwZSAnJHt0eXBlfScgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBzaW5ndWxhciBmb3JtICcke3BsdXJhbFRvU2luZ3VsYXJNYXBbdHlwZV19JyBpbnN0ZWFkLmApO1xuICAgICAgcmV0dXJuIHBsdXJhbFRvU2luZ3VsYXJNYXBbdHlwZV07XG4gICAgfVxuICAgIFxuICAgIC8vIFVua25vd24gdHlwZSAtIHJldHVybiBhcy1pcyBhbmQgbGV0IHZhbGlkYXRpb24gaGFuZGxlIGl0XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogU2FuaXRpemUgbWV0YWRhdGEgb2JqZWN0IHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgKiBSZW1vdmVzIGFueSBkYW5nZXJvdXMgcHJvcGVydGllcyB0aGF0IGNvdWxkIGFmZmVjdCBPYmplY3QucHJvdG90eXBlXG4gICAqL1xuICBwcml2YXRlIHNhbml0aXplTWV0YWRhdGEobWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBpZiAoIW1ldGFkYXRhIHx8IHR5cGVvZiBtZXRhZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZGFuZ2Vyb3VzUHJvcGVydGllcyA9IFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddO1xuICAgIGNvbnN0IHNhbml0aXplZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIFxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKSkge1xuICAgICAgaWYgKCFkYW5nZXJvdXNQcm9wZXJ0aWVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgc2FuaXRpemUgbmVzdGVkIG9iamVjdHNcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgc2FuaXRpemVkW2tleV0gPSB0aGlzLnNhbml0aXplTWV0YWRhdGEodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNhbml0aXplZFtrZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFBlcnNvbmFzKCkge1xuICAgIC8vIFZhbGlkYXRlIHRoZSBwZXJzb25hcyBkaXJlY3RvcnkgcGF0aFxuICAgIGlmICghcGF0aC5pc0Fic29sdXRlKHRoaXMucGVyc29uYXNEaXIpKSB7XG4gICAgICBsb2dnZXIud2FybihgUGVyc29uYXMgZGlyZWN0b3J5IHBhdGggaXMgbm90IGFic29sdXRlOiAke3RoaXMucGVyc29uYXNEaXJ9YCk7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3ModGhpcy5wZXJzb25hc0Rpcik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIENyZWF0ZSBwZXJzb25hcyBkaXJlY3RvcnkgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMubWtkaXIodGhpcy5wZXJzb25hc0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBDcmVhdGVkIHBlcnNvbmFzIGRpcmVjdG9yeSBhdDogJHt0aGlzLnBlcnNvbmFzRGlyfWApO1xuICAgICAgICAvLyBDb250aW51ZSB0byB0cnkgbG9hZGluZyAoZGlyZWN0b3J5IHdpbGwgYmUgZW1wdHkpXG4gICAgICB9IGNhdGNoIChta2RpckVycm9yOiBhbnkpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHBlcnNvbmFzIGRpcmVjdG9yeSBhdCAke3RoaXMucGVyc29uYXNEaXJ9OiAke21rZGlyRXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgLy8gRG9uJ3QgdGhyb3cgLSBlbXB0eSBwb3J0Zm9saW8gaXMgdmFsaWRcbiAgICAgICAgdGhpcy5wZXJzb25hcy5jbGVhcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcih0aGlzLnBlcnNvbmFzRGlyKTtcbiAgICAgIGNvbnN0IG1hcmtkb3duRmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKCcubWQnKSk7XG5cbiAgICAgIHRoaXMucGVyc29uYXMuY2xlYXIoKTtcbiAgICAgIFxuICAgICAgaWYgKG1hcmtkb3duRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbRG9sbGhvdXNlTUNQXSBObyBwZXJzb25hcyBmb3VuZCBpbiBwb3J0Zm9saW8uIFVzZSBicm93c2VfY29sbGVjdGlvbiB0byBpbnN0YWxsIHNvbWUhJyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBtYXJrZG93bkZpbGVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciwgZmlsZSk7XG4gICAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBQYXRoVmFsaWRhdG9yLnNhZmVSZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gVXNlIHNlY3VyZSBZQU1MIHBhcnNlclxuICAgICAgICAgIGxldCBwYXJzZWQ7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHBhcnNlZCA9IFNlY3VyZVlhbWxQYXJzZXIuc2FmZU1hdHRlcihmaWxlQ29udGVudCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFNlY3VyaXR5IHRocmVhdCBkZXRlY3RlZCBpbiBwZXJzb25hICR7ZmlsZX06ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZWQuZGF0YSBhcyBQZXJzb25hTWV0YWRhdGE7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IHBhcnNlZC5jb250ZW50O1xuXG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5uYW1lKSB7XG4gICAgICAgICAgICBtZXRhZGF0YS5uYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlLCAnLm1kJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gR2VuZXJhdGUgdW5pcXVlIElEIGlmIG5vdCBwcmVzZW50XG4gICAgICAgICAgbGV0IHVuaXF1ZUlkID0gbWV0YWRhdGEudW5pcXVlX2lkO1xuICAgICAgICAgIGlmICghdW5pcXVlSWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGF1dGhvckZvcklkID0gbWV0YWRhdGEuYXV0aG9yIHx8IHRoaXMuZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpO1xuICAgICAgICAgICAgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKG1ldGFkYXRhLm5hbWUsIGF1dGhvckZvcklkKTtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgR2VuZXJhdGVkIHVuaXF1ZSBJRCBmb3IgJHttZXRhZGF0YS5uYW1lfTogJHt1bmlxdWVJZH1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIG5ldyBtZXRhZGF0YSBmaWVsZHNcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLmNhdGVnb3J5KSBtZXRhZGF0YS5jYXRlZ29yeSA9ICdnZW5lcmFsJztcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLmFnZV9yYXRpbmcpIG1ldGFkYXRhLmFnZV9yYXRpbmcgPSAnYWxsJztcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLmNvbnRlbnRfZmxhZ3MpIG1ldGFkYXRhLmNvbnRlbnRfZmxhZ3MgPSBbXTtcbiAgICAgICAgICBpZiAobWV0YWRhdGEuYWlfZ2VuZXJhdGVkID09PSB1bmRlZmluZWQpIG1ldGFkYXRhLmFpX2dlbmVyYXRlZCA9IGZhbHNlO1xuICAgICAgICAgIGlmICghbWV0YWRhdGEuZ2VuZXJhdGlvbl9tZXRob2QpIG1ldGFkYXRhLmdlbmVyYXRpb25fbWV0aG9kID0gJ2h1bWFuJztcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLnByaWNlKSBtZXRhZGF0YS5wcmljZSA9ICdmcmVlJztcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLmxpY2Vuc2UpIG1ldGFkYXRhLmxpY2Vuc2UgPSAnQ0MtQlktU0EtNC4wJztcblxuICAgICAgICAgIGNvbnN0IHBlcnNvbmE6IFBlcnNvbmEgPSB7XG4gICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgICBmaWxlbmFtZTogZmlsZSxcbiAgICAgICAgICAgIHVuaXF1ZV9pZDogdW5pcXVlSWQsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRoaXMucGVyc29uYXMuc2V0KGZpbGUsIHBlcnNvbmEpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgTG9hZGVkIHBlcnNvbmE6ICR7bWV0YWRhdGEubmFtZX0gKCR7dW5pcXVlSWR9YCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciBsb2FkaW5nIHBlcnNvbmEgJHtmaWxlfTogJHtlcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBIYW5kbGUgRU5PRU5UIGdyYWNlZnVsbHkgLSBkaXJlY3RvcnkgbWlnaHQgbm90IGV4aXN0IHlldFxuICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbRG9sbGhvdXNlTUNQXSBQZXJzb25hcyBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgeWV0IC0gcG9ydGZvbGlvIGlzIGVtcHR5Jyk7XG4gICAgICAgIHRoaXMucGVyc29uYXMuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciByZWFkaW5nIHBlcnNvbmFzIGRpcmVjdG9yeTogJHtlcnJvcn1gKTtcbiAgICAgIHRoaXMucGVyc29uYXMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsaXN0UGVyc29uYXMoKSB7XG4gICAgY29uc3QgcGVyc29uYUxpc3QgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLm1hcChwZXJzb25hID0+ICh7XG4gICAgICBmaWxlbmFtZTogcGVyc29uYS5maWxlbmFtZSxcbiAgICAgIHVuaXF1ZV9pZDogcGVyc29uYS51bmlxdWVfaWQsXG4gICAgICBuYW1lOiBwZXJzb25hLm1ldGFkYXRhLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcGVyc29uYS5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIHRyaWdnZXJzOiBwZXJzb25hLm1ldGFkYXRhLnRyaWdnZXJzIHx8IFtdLFxuICAgICAgdmVyc2lvbjogcGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uIHx8IFwiMS4wXCIsXG4gICAgICBhdXRob3I6IHBlcnNvbmEubWV0YWRhdGEuYXV0aG9yIHx8IFwiVW5rbm93blwiLFxuICAgICAgY2F0ZWdvcnk6IHBlcnNvbmEubWV0YWRhdGEuY2F0ZWdvcnkgfHwgJ2dlbmVyYWwnLFxuICAgICAgYWdlX3JhdGluZzogcGVyc29uYS5tZXRhZGF0YS5hZ2VfcmF0aW5nIHx8ICdhbGwnLFxuICAgICAgcHJpY2U6IHBlcnNvbmEubWV0YWRhdGEucHJpY2UgfHwgJ2ZyZWUnLFxuICAgICAgYWlfZ2VuZXJhdGVkOiBwZXJzb25hLm1ldGFkYXRhLmFpX2dlbmVyYXRlZCB8fCBmYWxzZSxcbiAgICAgIGFjdGl2ZTogdGhpcy5hY3RpdmVQZXJzb25hID09PSBwZXJzb25hLmZpbGVuYW1lLFxuICAgIH0pKTtcblxuICAgIGlmIChwZXJzb25hTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfVlvdSBkb24ndCBoYXZlIGFueSBwZXJzb25hcyBpbnN0YWxsZWQgeWV0LiBXb3VsZCB5b3UgbGlrZSB0byBicm93c2UgdGhlIERvbGxob3VzZU1DUCBjb2xsZWN0aW9uIG9uIEdpdEh1YiB0byBzZWUgd2hhdCdzIGF2YWlsYWJsZT8gSSBjYW4gc2hvdyB5b3UgcGVyc29uYXMgZm9yIGNyZWF0aXZlIHdyaXRpbmcsIHRlY2huaWNhbCBhbmFseXNpcywgYW5kIG1vcmUuIEp1c3Qgc2F5IFwieWVzXCIgb3IgdXNlICdicm93c2VfY29sbGVjdGlvbicuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9QXZhaWxhYmxlIFBlcnNvbmFzICgke3BlcnNvbmFMaXN0Lmxlbmd0aH0pOlxcblxcbmAgK1xuICAgICAgICAgICAgcGVyc29uYUxpc3QubWFwKHAgPT4gXG4gICAgICAgICAgICAgIGAke3AuYWN0aXZlID8gJ/CflLkgJyA6ICfilqvvuI8gJ30qKiR7cC5uYW1lfSoqICgke3AudW5pcXVlX2lkfSlcXG5gICtcbiAgICAgICAgICAgICAgYCAgICR7cC5kZXNjcmlwdGlvbn1cXG5gICtcbiAgICAgICAgICAgICAgYCAgIPCfk4EgJHtwLmNhdGVnb3J5fSB8IPCfjq0gJHtwLmF1dGhvcn0gfCDwn5SWICR7cC5wcmljZX0gfCAke3AuYWlfZ2VuZXJhdGVkID8gJ/CfpJYgQUknIDogJ/CfkaQgSHVtYW4nfVxcbmAgK1xuICAgICAgICAgICAgICBgICAgQWdlOiAke3AuYWdlX3JhdGluZ30gfCBWZXJzaW9uOiAke3AudmVyc2lvbn1cXG5gICtcbiAgICAgICAgICAgICAgYCAgIFRyaWdnZXJzOiAke3AudHJpZ2dlcnMuam9pbignLCAnKSB8fCAnTm9uZSd9XFxuYFxuICAgICAgICAgICAgKS5qb2luKCdcXG4nKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGFjdGl2YXRlUGVyc29uYShwZXJzb25hSWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgLy8gRW5oYW5jZWQgaW5wdXQgdmFsaWRhdGlvbiBmb3IgcGVyc29uYSBpZGVudGlmaWVyXG4gICAgY29uc3QgdmFsaWRhdGVkSWRlbnRpZmllciA9IE1DUElucHV0VmFsaWRhdG9yLnZhbGlkYXRlUGVyc29uYUlkZW50aWZpZXIocGVyc29uYUlkZW50aWZpZXIpO1xuICAgIFxuICAgIC8vIFRyeSB0byBmaW5kIHBlcnNvbmEgYnkgZmlsZW5hbWUgZmlyc3QsIHRoZW4gYnkgbmFtZVxuICAgIGxldCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQodmFsaWRhdGVkSWRlbnRpZmllcik7XG4gICAgXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAvLyBTZWFyY2ggYnkgbmFtZVxuICAgICAgcGVyc29uYSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkuZmluZChwID0+IFxuICAgICAgICBwLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdmFsaWRhdGVkSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgdGhyb3cgbmV3IE1jcEVycm9yKFxuICAgICAgICBFcnJvckNvZGUuSW52YWxpZFBhcmFtcyxcbiAgICAgICAgYFBlcnNvbmEgbm90IGZvdW5kOiAke3BlcnNvbmFJZGVudGlmaWVyfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmVQZXJzb25hID0gcGVyc29uYS5maWxlbmFtZTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX1QZXJzb25hIEFjdGl2YXRlZDogKioke3BlcnNvbmEubWV0YWRhdGEubmFtZX0qKlxcblxcbmAgK1xuICAgICAgICAgICAgYCR7cGVyc29uYS5tZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG5cXG5gICtcbiAgICAgICAgICAgIGAqKkluc3RydWN0aW9uczoqKlxcbiR7cGVyc29uYS5jb250ZW50fWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRBY3RpdmVQZXJzb25hKCkge1xuICAgIGlmICghdGhpcy5hY3RpdmVQZXJzb25hKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX1ObyBwZXJzb25hIGlzIGN1cnJlbnRseSBhY3RpdmUuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQodGhpcy5hY3RpdmVQZXJzb25hKTtcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHRoaXMuYWN0aXZlUGVyc29uYSA9IG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX1BY3RpdmUgcGVyc29uYSBub3QgZm91bmQuIERlYWN0aXZhdGVkLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfUFjdGl2ZSBQZXJzb25hOiAqKiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfSoqXFxuXFxuYCArXG4gICAgICAgICAgICBgJHtwZXJzb25hLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcblxcbmAgK1xuICAgICAgICAgICAgYEZpbGU6ICR7cGVyc29uYS5maWxlbmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBWZXJzaW9uOiAke3BlcnNvbmEubWV0YWRhdGEudmVyc2lvbiB8fCAnMS4wJ31cXG5gICtcbiAgICAgICAgICAgIGBBdXRob3I6ICR7cGVyc29uYS5tZXRhZGF0YS5hdXRob3IgfHwgJ1Vua25vd24nfWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWFjdGl2YXRlUGVyc29uYSgpIHtcbiAgICBjb25zdCB3YXNBY3RpdmUgPSB0aGlzLmFjdGl2ZVBlcnNvbmEgIT09IG51bGw7XG4gICAgY29uc3QgaW5kaWNhdG9yID0gdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCk7XG4gICAgdGhpcy5hY3RpdmVQZXJzb25hID0gbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiB3YXNBY3RpdmUgXG4gICAgICAgICAgICA/IGAke2luZGljYXRvcn3inIUgUGVyc29uYSBkZWFjdGl2YXRlZC4gQmFjayB0byBkZWZhdWx0IG1vZGUuYFxuICAgICAgICAgICAgOiBcIk5vIHBlcnNvbmEgd2FzIGFjdGl2ZS5cIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldFBlcnNvbmFEZXRhaWxzKHBlcnNvbmFJZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAvLyBUcnkgdG8gZmluZCBwZXJzb25hIGJ5IGZpbGVuYW1lIGZpcnN0LCB0aGVuIGJ5IG5hbWVcbiAgICBsZXQgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHBlcnNvbmFJZGVudGlmaWVyKTtcbiAgICBcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNlYXJjaCBieSBuYW1lXG4gICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gXG4gICAgICAgIHAubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBwZXJzb25hSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgdGhyb3cgbmV3IE1jcEVycm9yKFxuICAgICAgICBFcnJvckNvZGUuSW52YWxpZFBhcmFtcyxcbiAgICAgICAgYFBlcnNvbmEgbm90IGZvdW5kOiAke3BlcnNvbmFJZGVudGlmaWVyfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCfk4sgKioke3BlcnNvbmEubWV0YWRhdGEubmFtZX0qKiBEZXRhaWxzXFxuXFxuYCArXG4gICAgICAgICAgICBgKipEZXNjcmlwdGlvbjoqKiAke3BlcnNvbmEubWV0YWRhdGEuZGVzY3JpcHRpb259XFxuYCArXG4gICAgICAgICAgICBgKipGaWxlOioqICR7cGVyc29uYS5maWxlbmFtZX1cXG5gICtcbiAgICAgICAgICAgIGAqKlZlcnNpb246KiogJHtwZXJzb25hLm1ldGFkYXRhLnZlcnNpb24gfHwgJzEuMCd9XFxuYCArXG4gICAgICAgICAgICBgKipBdXRob3I6KiogJHtwZXJzb25hLm1ldGFkYXRhLmF1dGhvciB8fCAnVW5rbm93bid9XFxuYCArXG4gICAgICAgICAgICBgKipUcmlnZ2VyczoqKiAke3BlcnNvbmEubWV0YWRhdGEudHJpZ2dlcnM/LmpvaW4oJywgJykgfHwgJ05vbmUnfVxcblxcbmAgK1xuICAgICAgICAgICAgYCoqRnVsbCBDb250ZW50OioqXFxuXFxgXFxgXFxgXFxuJHtwZXJzb25hLmNvbnRlbnR9XFxuXFxgXFxgXFxgYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHJlbG9hZFBlcnNvbmFzKCkge1xuICAgIGF3YWl0IHRoaXMubG9hZFBlcnNvbmFzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCflIQgUmVsb2FkZWQgJHt0aGlzLnBlcnNvbmFzLnNpemV9IHBlcnNvbmFzIGZyb20gJHt0aGlzLnBlcnNvbmFzRGlyfWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PSBFbGVtZW50IE1ldGhvZHMgKEdlbmVyaWMgZm9yIGFsbCBlbGVtZW50IHR5cGVzKSA9PT09PVxuICBcbiAgYXN5bmMgbGlzdEVsZW1lbnRzKHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3JtYWxpemUgdGhlIHR5cGUgdG8gaGFuZGxlIGJvdGggcGx1cmFsIGFuZCBzaW5ndWxhciBmb3Jtc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgXG4gICAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5saXN0UGVyc29uYXMoKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDoge1xuICAgICAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICBpZiAoc2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIk5vIHNraWxscyBhcmUgY3VycmVudGx5IGluc3RhbGxlZC4gVGhlIERvbGxob3VzZU1DUCBjb2xsZWN0aW9uIGhhcyBza2lsbHMgZm9yIGNvZGUgcmV2aWV3LCBkYXRhIGFuYWx5c2lzLCBjcmVhdGl2ZSB3cml0aW5nIGFuZCBtb3JlLiBXb3VsZCB5b3UgbGlrZSBtZSB0byBzaG93IHlvdSB3aGF0J3MgYXZhaWxhYmxlPyBKdXN0IHNheSBcXFwieWVzXFxcIiBvciBJIGNhbiBoZWxwIHlvdSBjcmVhdGUgYSBjdXN0b20gc2tpbGwuXCJcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHNraWxsTGlzdCA9IHNraWxscy5tYXAoc2tpbGwgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcGxleGl0eSA9IHNraWxsLm1ldGFkYXRhLmNvbXBsZXhpdHkgfHwgJ2JlZ2lubmVyJztcbiAgICAgICAgICAgIGNvbnN0IGRvbWFpbnMgPSBza2lsbC5tZXRhZGF0YS5kb21haW5zPy5qb2luKCcsICcpIHx8ICdnZW5lcmFsJztcbiAgICAgICAgICAgIHJldHVybiBg8J+boO+4jyAke3NraWxsLm1ldGFkYXRhLm5hbWV9IC0gJHtza2lsbC5tZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG4gICBDb21wbGV4aXR5OiAke2NvbXBsZXhpdHl9IHwgRG9tYWluczogJHtkb21haW5zfWA7XG4gICAgICAgICAgfSkuam9pbignXFxuXFxuJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+TmiBBdmFpbGFibGUgU2tpbGxzOlxcblxcbiR7c2tpbGxMaXN0fWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURToge1xuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlcyA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICBpZiAodGVtcGxhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIllvdSBoYXZlbid0IGluc3RhbGxlZCBhbnkgdGVtcGxhdGVzIHlldC4gV291bGQgeW91IGxpa2UgdG8gc2VlIGF2YWlsYWJsZSB0ZW1wbGF0ZXMgZm9yIGVtYWlscywgcmVwb3J0cywgYW5kIGRvY3VtZW50YXRpb24/IEkgY2FuIHNob3cgeW91IGV4YW1wbGVzIGZyb20gdGhlIGNvbGxlY3Rpb24gb3IgaGVscCB5b3UgY3JlYXRlIHlvdXIgb3duLiBXaGF0IHdvdWxkIHlvdSBwcmVmZXI/XCJcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlTGlzdCA9IHRlbXBsYXRlcy5tYXAodGVtcGxhdGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVzID0gdGVtcGxhdGUubWV0YWRhdGEudmFyaWFibGVzPy5tYXAodiA9PiB2Lm5hbWUpLmpvaW4oJywgJykgfHwgJ25vbmUnO1xuICAgICAgICAgICAgcmV0dXJuIGDwn5OEICR7dGVtcGxhdGUubWV0YWRhdGEubmFtZX0gLSAke3RlbXBsYXRlLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcbiAgIFZhcmlhYmxlczogJHt2YXJpYWJsZXN9YDtcbiAgICAgICAgICB9KS5qb2luKCdcXG5cXG4nKTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5OdIEF2YWlsYWJsZSBUZW1wbGF0ZXM6XFxuXFxuJHt0ZW1wbGF0ZUxpc3R9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOiB7XG4gICAgICAgICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIGlmIChhZ2VudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IFwiTm8gYWdlbnRzIGluc3RhbGxlZCB5ZXQuIEFnZW50cyBhcmUgYXV0b25vbW91cyBoZWxwZXJzIHRoYXQgY2FuIHdvcmsgb24gdGFza3MgaW5kZXBlbmRlbnRseS4gVGhlIERvbGxob3VzZU1DUCBjb2xsZWN0aW9uIGluY2x1ZGVzIHRhc2sgbWFuYWdlcnMsIHJlc2VhcmNoIGFzc2lzdGFudHMsIGFuZCBtb3JlLiBXb3VsZCB5b3UgbGlrZSB0byBicm93c2UgYXZhaWxhYmxlIGFnZW50cyBvciBsZWFybiBob3cgdG8gY3JlYXRlIHlvdXIgb3duP1wiXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBhZ2VudExpc3QgPSBhZ2VudHMubWFwKGFnZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNwZWNpYWxpemF0aW9ucyA9IChhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLnNwZWNpYWxpemF0aW9ucz8uam9pbignLCAnKSB8fCAnZ2VuZXJhbCc7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBhZ2VudC5nZXRTdGF0dXMoKTtcbiAgICAgICAgICAgIHJldHVybiBg8J+kliAke2FnZW50Lm1ldGFkYXRhLm5hbWV9IC0gJHthZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG4gICBTdGF0dXM6ICR7c3RhdHVzfSB8IFNwZWNpYWxpemF0aW9uczogJHtzcGVjaWFsaXphdGlvbnN9YDtcbiAgICAgICAgICB9KS5qb2luKCdcXG5cXG4nKTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn6SWIEF2YWlsYWJsZSBBZ2VudHM6XFxuXFxuJHthZ2VudExpc3R9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfScuIEF2YWlsYWJsZSB0eXBlczogJHtPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpfSAob3IgbGVnYWN5IHBsdXJhbCBmb3JtczogcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHMpYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBsaXN0ICR7dHlwZX0gZWxlbWVudHM6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBsaXN0ICR7dHlwZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGFjdGl2YXRlRWxlbWVudChuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3JtYWxpemUgdGhlIHR5cGUgdG8gaGFuZGxlIGJvdGggcGx1cmFsIGFuZCBzaW5ndWxhciBmb3Jtc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgXG4gICAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmF0ZVBlcnNvbmEobmFtZSk7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6IHtcbiAgICAgICAgICBjb25zdCBza2lsbCA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmZpbmQocyA9PiBzLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGlmICghc2tpbGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCBTa2lsbCAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQWN0aXZhdGUgdGhlIHNraWxsXG4gICAgICAgICAgYXdhaXQgc2tpbGwuYWN0aXZhdGU/LigpO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinIUgU2tpbGwgJyR7bmFtZX0nIGFjdGl2YXRlZFxcblxcbiR7c2tpbGwuaW5zdHJ1Y3Rpb25zfWBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOiB7XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnRlbXBsYXRlTWFuYWdlci5maW5kKHQgPT4gdC5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgVGVtcGxhdGUgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRlbXBsYXRlLm1ldGFkYXRhLnZhcmlhYmxlcz8ubWFwKHYgPT4gdi5uYW1lKS5qb2luKCcsICcpIHx8ICdub25lJztcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinIUgVGVtcGxhdGUgJyR7bmFtZX0nIHJlYWR5IHRvIHVzZVxcblZhcmlhYmxlczogJHt2YXJpYWJsZXN9XFxuXFxuVXNlICdyZW5kZXJfdGVtcGxhdGUnIHRvIGdlbmVyYXRlIGNvbnRlbnQgd2l0aCB0aGlzIHRlbXBsYXRlLmBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuZmluZChhID0+IGEubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIEFnZW50ICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBBY3RpdmF0ZSB0aGUgYWdlbnRcbiAgICAgICAgICBhd2FpdCBhZ2VudC5hY3RpdmF0ZSgpO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBBZ2VudCAnJHtuYW1lfScgYWN0aXZhdGVkIGFuZCByZWFkeVxcblNwZWNpYWxpemF0aW9uczogJHsoYWdlbnQubWV0YWRhdGEgYXMgYW55KS5zcGVjaWFsaXphdGlvbnM/LmpvaW4oJywgJykgfHwgJ2dlbmVyYWwnfVxcblxcblVzZSAnZXhlY3V0ZV9hZ2VudCcgdG8gZ2l2ZSB0aGlzIGFnZW50IGEgZ29hbC5gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHModHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZVBlcnNvbmEoKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDoge1xuICAgICAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICBjb25zdCBhY3RpdmVTa2lsbHMgPSBza2lsbHMuZmlsdGVyKHMgPT4gcy5nZXRTdGF0dXMoKSA9PT0gJ2FjdGl2ZScpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChhY3RpdmVTa2lsbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IFwi8J+TiyBObyBhY3RpdmUgc2tpbGxzXCJcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHNraWxsTGlzdCA9IGFjdGl2ZVNraWxscy5tYXAocyA9PiBg8J+boO+4jyAke3MubWV0YWRhdGEubmFtZX1gKS5qb2luKCcsICcpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYEFjdGl2ZSBza2lsbHM6ICR7c2tpbGxMaXN0fWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURToge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogXCLwn5OdIFRlbXBsYXRlcyBhcmUgc3RhdGVsZXNzIGFuZCBhY3RpdmF0ZWQgb24tZGVtYW5kIHdoZW4gcmVuZGVyaW5nXCJcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICBjb25zdCBhY3RpdmVBZ2VudHMgPSBhZ2VudHMuZmlsdGVyKGEgPT4gYS5nZXRTdGF0dXMoKSA9PT0gJ2FjdGl2ZScpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChhY3RpdmVBZ2VudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IFwi8J+kliBObyBhY3RpdmUgYWdlbnRzXCJcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IGFnZW50TGlzdCA9IGFjdGl2ZUFnZW50cy5tYXAoYSA9PiB7XG4gICAgICAgICAgICBjb25zdCBnb2FscyA9IChhIGFzIGFueSkuc3RhdGU/LmdvYWxzPy5sZW5ndGggfHwgMDtcbiAgICAgICAgICAgIHJldHVybiBg8J+kliAke2EubWV0YWRhdGEubmFtZX0gKCR7Z29hbHN9IGFjdGl2ZSBnb2FscylgO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYEFjdGl2ZSBhZ2VudHM6XFxuJHthZ2VudExpc3R9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGdldCBhY3RpdmUgJHt0eXBlfTpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGdldCBhY3RpdmUgJHt0eXBlfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZGVhY3RpdmF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIHRvIGhhbmRsZSBib3RoIHBsdXJhbCBhbmQgc2luZ3VsYXIgZm9ybXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIFxuICAgICAgc3dpdGNoIChub3JtYWxpemVkVHlwZSkge1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGVhY3RpdmF0ZVBlcnNvbmEoKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDoge1xuICAgICAgICAgIGNvbnN0IHNraWxsID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIuZmluZChzID0+IHMubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCFza2lsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFNraWxsICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBhd2FpdCBza2lsbC5kZWFjdGl2YXRlPy4oKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinIUgU2tpbGwgJyR7bmFtZX0nIGRlYWN0aXZhdGVkYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBcIvCfk50gVGVtcGxhdGVzIGFyZSBzdGF0ZWxlc3MgLSBub3RoaW5nIHRvIGRlYWN0aXZhdGVcIlxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOiB7XG4gICAgICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5maW5kKGEgPT4gYS5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgQWdlbnQgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGF3YWl0IGFnZW50LmRlYWN0aXZhdGUoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinIUgQWdlbnQgJyR7bmFtZX0nIGRlYWN0aXZhdGVkYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRlYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBkZWFjdGl2YXRlICR7dHlwZX0gJyR7bmFtZX0nOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBnZXRFbGVtZW50RGV0YWlscyhuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3JtYWxpemUgdGhlIHR5cGUgdG8gaGFuZGxlIGJvdGggcGx1cmFsIGFuZCBzaW5ndWxhciBmb3Jtc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgXG4gICAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRQZXJzb25hRGV0YWlscyhuYW1lKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDoge1xuICAgICAgICAgIGNvbnN0IHNraWxsID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIuZmluZChzID0+IHMubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCFza2lsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFNraWxsICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgICAgICAgYPCfm6DvuI8gKioke3NraWxsLm1ldGFkYXRhLm5hbWV9KipgLFxuICAgICAgICAgICAgYCR7c2tpbGwubWV0YWRhdGEuZGVzY3JpcHRpb259YCxcbiAgICAgICAgICAgIGBgLFxuICAgICAgICAgICAgYCoqQ29tcGxleGl0eSoqOiAke3NraWxsLm1ldGFkYXRhLmNvbXBsZXhpdHkgfHwgJ2JlZ2lubmVyJ31gLFxuICAgICAgICAgICAgYCoqRG9tYWlucyoqOiAke3NraWxsLm1ldGFkYXRhLmRvbWFpbnM/LmpvaW4oJywgJykgfHwgJ2dlbmVyYWwnfWAsXG4gICAgICAgICAgICBgKipMYW5ndWFnZXMqKjogJHtza2lsbC5tZXRhZGF0YS5sYW5ndWFnZXM/LmpvaW4oJywgJykgfHwgJ2FueSd9YCxcbiAgICAgICAgICAgIGAqKlByZXJlcXVpc2l0ZXMqKjogJHtza2lsbC5tZXRhZGF0YS5wcmVyZXF1aXNpdGVzPy5qb2luKCcsICcpIHx8ICdub25lJ31gLFxuICAgICAgICAgICAgYGAsXG4gICAgICAgICAgICBgKipJbnN0cnVjdGlvbnMqKjpgLFxuICAgICAgICAgICAgc2tpbGwuaW5zdHJ1Y3Rpb25zXG4gICAgICAgICAgXTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoc2tpbGwubWV0YWRhdGEucGFyYW1ldGVycyAmJiBza2lsbC5tZXRhZGF0YS5wYXJhbWV0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRldGFpbHMucHVzaCgnJywgJyoqUGFyYW1ldGVycyoqOicpO1xuICAgICAgICAgICAgc2tpbGwubWV0YWRhdGEucGFyYW1ldGVycy5mb3JFYWNoKHAgPT4ge1xuICAgICAgICAgICAgICBkZXRhaWxzLnB1c2goYC0gJHtwLm5hbWV9ICgke3AudHlwZX0pOiAke3AuZGVzY3JpcHRpb259YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBkZXRhaWxzLmpvaW4oJ1xcbicpXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmZpbmQodCA9PiB0Lm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCBUZW1wbGF0ZSAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgZGV0YWlscyA9IFtcbiAgICAgICAgICAgIGDwn5OEICoqJHt0ZW1wbGF0ZS5tZXRhZGF0YS5uYW1lfSoqYCxcbiAgICAgICAgICAgIGAke3RlbXBsYXRlLm1ldGFkYXRhLmRlc2NyaXB0aW9ufWAsXG4gICAgICAgICAgICBgYCxcbiAgICAgICAgICAgIGAqKk91dHB1dCBGb3JtYXQqKjogJHsodGVtcGxhdGUubWV0YWRhdGEgYXMgYW55KS5vdXRwdXRfZm9ybWF0IHx8ICd0ZXh0J31gLFxuICAgICAgICAgICAgYCoqVGVtcGxhdGUgQ29udGVudCoqOmAsXG4gICAgICAgICAgICAnYGBgJyxcbiAgICAgICAgICAgIHRlbXBsYXRlLmNvbnRlbnQsXG4gICAgICAgICAgICAnYGBgJ1xuICAgICAgICAgIF07XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHRlbXBsYXRlLm1ldGFkYXRhLnZhcmlhYmxlcyAmJiB0ZW1wbGF0ZS5tZXRhZGF0YS52YXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGV0YWlscy5wdXNoKCcnLCAnKipWYXJpYWJsZXMqKjonKTtcbiAgICAgICAgICAgIHRlbXBsYXRlLm1ldGFkYXRhLnZhcmlhYmxlcy5mb3JFYWNoKHYgPT4ge1xuICAgICAgICAgICAgICBkZXRhaWxzLnB1c2goYC0gJHt2Lm5hbWV9ICgke3YudHlwZX0pOiAke3YuZGVzY3JpcHRpb259YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBkZXRhaWxzLmpvaW4oJ1xcbicpXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHtcbiAgICAgICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmZpbmQoYSA9PiBhLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCBBZ2VudCAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgZGV0YWlscyA9IFtcbiAgICAgICAgICAgIGDwn6SWICoqJHthZ2VudC5tZXRhZGF0YS5uYW1lfSoqYCxcbiAgICAgICAgICAgIGAke2FnZW50Lm1ldGFkYXRhLmRlc2NyaXB0aW9ufWAsXG4gICAgICAgICAgICBgYCxcbiAgICAgICAgICAgIGAqKlN0YXR1cyoqOiAke2FnZW50LmdldFN0YXR1cygpfWAsXG4gICAgICAgICAgICBgKipTcGVjaWFsaXphdGlvbnMqKjogJHsoYWdlbnQubWV0YWRhdGEgYXMgYW55KS5zcGVjaWFsaXphdGlvbnM/LmpvaW4oJywgJykgfHwgJ2dlbmVyYWwnfWAsXG4gICAgICAgICAgICBgKipEZWNpc2lvbiBGcmFtZXdvcmsqKjogJHsoYWdlbnQubWV0YWRhdGEgYXMgYW55KS5kZWNpc2lvbkZyYW1ld29yayB8fCAncnVsZS1iYXNlZCd9YCxcbiAgICAgICAgICAgIGAqKlJpc2sgVG9sZXJhbmNlKio6ICR7KGFnZW50Lm1ldGFkYXRhIGFzIGFueSkucmlza1RvbGVyYW5jZSB8fCAnbG93J31gLFxuICAgICAgICAgICAgYGAsXG4gICAgICAgICAgICBgKipJbnN0cnVjdGlvbnMqKjpgLFxuICAgICAgICAgICAgKGFnZW50IGFzIGFueSkuaW5zdHJ1Y3Rpb25zIHx8ICdObyBpbnN0cnVjdGlvbnMgYXZhaWxhYmxlJ1xuICAgICAgICAgIF07XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgYWdlbnRTdGF0ZSA9IChhZ2VudCBhcyBhbnkpLnN0YXRlO1xuICAgICAgICAgIGlmIChhZ2VudFN0YXRlPy5nb2FscyAmJiBhZ2VudFN0YXRlLmdvYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRldGFpbHMucHVzaCgnJywgJyoqQ3VycmVudCBHb2FscyoqOicpO1xuICAgICAgICAgICAgYWdlbnRTdGF0ZS5nb2Fscy5mb3JFYWNoKChnOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgZGV0YWlscy5wdXNoKGAtICR7Zy5kZXNjcmlwdGlvbn0gKCR7Zy5zdGF0dXN9KWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogZGV0YWlscy5qb2luKCdcXG4nKVxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGdldCAke3R5cGV9IGRldGFpbHMgZm9yICcke25hbWV9JzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGdldCAke3R5cGV9IGRldGFpbHM6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIHJlbG9hZEVsZW1lbnRzKHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3JtYWxpemUgdGhlIHR5cGUgdG8gaGFuZGxlIGJvdGggcGx1cmFsIGFuZCBzaW5ndWxhciBmb3Jtc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgXG4gICAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWxvYWRQZXJzb25hcygpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgdGhpcy5za2lsbE1hbmFnZXIuY2xlYXJDYWNoZSgpO1xuICAgICAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7c2tpbGxzLmxlbmd0aH0gc2tpbGxzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOiB7XG4gICAgICAgICAgLy8gVGVtcGxhdGUgbWFuYWdlciBkb2Vzbid0IGhhdmUgY2xlYXJDYWNoZSwganVzdCBsaXN0XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHt0ZW1wbGF0ZXMubGVuZ3RofSB0ZW1wbGF0ZXMgZnJvbSBwb3J0Zm9saW9gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHtcbiAgICAgICAgICAvLyBBZ2VudCBtYW5hZ2VyIGRvZXNuJ3QgaGF2ZSBjbGVhckNhY2hlLCBqdXN0IGxpc3RcbiAgICAgICAgICBjb25zdCBhZ2VudHMgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+UhCBSZWxvYWRlZCAke2FnZW50cy5sZW5ndGh9IGFnZW50cyBmcm9tIHBvcnRmb2xpb2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byByZWxvYWQgJHt0eXBlfTpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIHJlbG9hZCAke3R5cGV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICAvLyBFbGVtZW50LXNwZWNpZmljIG1ldGhvZHNcbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGUobmFtZTogc3RyaW5nLCB2YXJpYWJsZXM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnRlbXBsYXRlTWFuYWdlci5maW5kKHQgPT4gdC5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIFRlbXBsYXRlICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2ltcGxlIHRlbXBsYXRlIHJlbmRlcmluZyAtIHJlcGxhY2UgdmFyaWFibGVzIGluIGNvbnRlbnRcbiAgICAgIGxldCByZW5kZXJlZCA9IHRlbXBsYXRlLmNvbnRlbnQ7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJpYWJsZXMpKSB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXFxcXHtcXFxce1xcXFxzKiR7a2V5fVxcXFxzKlxcXFx9XFxcXH1gLCAnZycpO1xuICAgICAgICByZW5kZXJlZCA9IHJlbmRlcmVkLnJlcGxhY2UocmVnZXgsIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg8J+ThCBSZW5kZXJlZCB0ZW1wbGF0ZSAnJHtuYW1lfSc6XFxuXFxuJHtyZW5kZXJlZH1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byByZW5kZXIgdGVtcGxhdGUgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gcmVuZGVyIHRlbXBsYXRlOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBleGVjdXRlQWdlbnQobmFtZTogc3RyaW5nLCBnb2FsOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5maW5kKGEgPT4gYS5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIEFnZW50ICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2ltcGxlIGFnZW50IGV4ZWN1dGlvbiBzaW11bGF0aW9uXG4gICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgIHN1bW1hcnk6IGBBZ2VudCAnJHtuYW1lfScgaXMgbm93IHdvcmtpbmcgb246ICR7Z29hbH1gLFxuICAgICAgICBzdGF0dXM6ICdpbi1wcm9ncmVzcycsXG4gICAgICAgIGFjdGlvbnNUYWtlbjogMVxuICAgICAgfTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg8J+kliBBZ2VudCAnJHtuYW1lfScgZXhlY3V0aW9uIHJlc3VsdDpcXG5cXG4ke3Jlc3VsdC5zdW1tYXJ5fVxcblxcblN0YXR1czogJHtyZXN1bHQuc3RhdHVzfVxcbkFjdGlvbnMgdGFrZW46ICR7cmVzdWx0LmFjdGlvbnNUYWtlbiB8fCAwfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgYWdlbnQgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZXhlY3V0ZSBhZ2VudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgY3JlYXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNvbnRlbnQ/OiBzdHJpbmc7IG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pn0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBuYW1lLCB0eXBlLCBkZXNjcmlwdGlvbiwgY29udGVudCwgbWV0YWRhdGEgfSA9IGFyZ3M7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgdHlwZVxuICAgICAgaWYgKCFPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5pbmNsdWRlcyh0eXBlIGFzIEVsZW1lbnRUeXBlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgSW52YWxpZCBlbGVtZW50IHR5cGUgJyR7dHlwZX0nLiBWYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpfSAob3IgbGVnYWN5IHBsdXJhbCBmb3JtczogcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHMpYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGlucHV0c1xuICAgICAgY29uc3QgdmFsaWRhdGVkTmFtZSA9IHZhbGlkYXRlRmlsZW5hbWUobmFtZSk7XG4gICAgICBjb25zdCB2YWxpZGF0ZWREZXNjcmlwdGlvbiA9IHNhbml0aXplSW5wdXQoZGVzY3JpcHRpb24sIFNFQ1VSSVRZX0xJTUlUUy5NQVhfTUVUQURBVEFfRklFTERfTEVOR1RIKTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYOiBTYW5pdGl6ZSBtZXRhZGF0YSB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICAgIGNvbnN0IHNhbml0aXplZE1ldGFkYXRhID0gdGhpcy5zYW5pdGl6ZU1ldGFkYXRhKG1ldGFkYXRhIHx8IHt9KTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIGVsZW1lbnQgYmFzZWQgb24gdHlwZVxuICAgICAgc3dpdGNoICh0eXBlIGFzIEVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgICAvLyBVc2UgZXhpc3RpbmcgcGVyc29uYSBjcmVhdGlvbiBsb2dpY1xuICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVBlcnNvbmEoXG4gICAgICAgICAgICB2YWxpZGF0ZWROYW1lLCBcbiAgICAgICAgICAgIHZhbGlkYXRlZERlc2NyaXB0aW9uLCBcbiAgICAgICAgICAgIGNvbnRlbnQgfHwgJycsXG4gICAgICAgICAgICBzYW5pdGl6ZWRNZXRhZGF0YT8udHJpZ2dlcnNcbiAgICAgICAgICApO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOlxuICAgICAgICAgIGNvbnN0IHNraWxsID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIG5hbWU6IHZhbGlkYXRlZE5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsaWRhdGVkRGVzY3JpcHRpb24sXG4gICAgICAgICAgICAuLi5zYW5pdGl6ZWRNZXRhZGF0YSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQgfHwgJydcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinIUgQ3JlYXRlZCBza2lsbCAnJHtza2lsbC5tZXRhZGF0YS5uYW1lfScgc3VjY2Vzc2Z1bGx5YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOlxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuY3JlYXRlKHtcbiAgICAgICAgICAgIG5hbWU6IHZhbGlkYXRlZE5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdmFsaWRhdGVkRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50IHx8ICcnLFxuICAgICAgICAgICAgLi4uc2FuaXRpemVkTWV0YWRhdGFcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinIUgQ3JlYXRlZCB0ZW1wbGF0ZSAnJHt0ZW1wbGF0ZS5tZXRhZGF0YS5uYW1lfScgc3VjY2Vzc2Z1bGx5YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICAgIGNvbnN0IGFnZW50UmVzdWx0ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuY3JlYXRlKFxuICAgICAgICAgICAgdmFsaWRhdGVkTmFtZSxcbiAgICAgICAgICAgIHZhbGlkYXRlZERlc2NyaXB0aW9uLFxuICAgICAgICAgICAgY29udGVudCB8fCAnJyxcbiAgICAgICAgICAgIHNhbml0aXplZE1ldGFkYXRhXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWFnZW50UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCAke2FnZW50UmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4pyFIENyZWF0ZWQgYWdlbnQgJyR7dmFsaWRhdGVkTmFtZX0nIHN1Y2Nlc3NmdWxseWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgRWxlbWVudCB0eXBlICcke3R5cGV9JyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgY3JlYXRpb25gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBlbGVtZW50OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gY3JlYXRlIGVsZW1lbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGVkaXRFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgYW55W119KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgdHlwZSwgZmllbGQsIHZhbHVlIH0gPSBhcmdzO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBlbGVtZW50IHR5cGVcbiAgICAgIGlmICghT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkuaW5jbHVkZXModHlwZSBhcyBFbGVtZW50VHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIEludmFsaWQgZWxlbWVudCB0eXBlICcke3R5cGV9Jy4gVmFsaWQgdHlwZXM6ICR7T2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkuam9pbignLCAnKX0gKG9yIGxlZ2FjeSBwbHVyYWwgZm9ybXM6IHBlcnNvbmFzLCBza2lsbHMsIHRlbXBsYXRlcywgYWdlbnRzKWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3IgcGVyc29uYXMsIHVzZSBleGlzdGluZyBlZGl0IGxvZ2ljXG4gICAgICBpZiAodHlwZSA9PT0gRWxlbWVudFR5cGUuUEVSU09OQSkge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0UGVyc29uYShuYW1lLCBmaWVsZCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCB0aGUgYXBwcm9wcmlhdGUgbWFuYWdlciBiYXNlZCBvbiB0eXBlXG4gICAgICBsZXQgbWFuYWdlcjogU2tpbGxNYW5hZ2VyIHwgVGVtcGxhdGVNYW5hZ2VyIHwgQWdlbnRNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gICAgICBzd2l0Y2ggKHR5cGUgYXMgRWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDpcbiAgICAgICAgICBtYW5hZ2VyID0gdGhpcy5za2lsbE1hbmFnZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICAgICAgbWFuYWdlciA9IHRoaXMudGVtcGxhdGVNYW5hZ2VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLmFnZW50TWFuYWdlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgRWxlbWVudCB0eXBlICcke3R5cGV9JyBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgZWRpdGluZ2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRmluZCB0aGUgZWxlbWVudFxuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IG1hbmFnZXIhLmZpbmQoKGU6IGFueSkgPT4gZS5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgJHt0eXBlfSAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEhhbmRsZSBuZXN0ZWQgZmllbGQgdXBkYXRlcyAoZS5nLiwgXCJtZXRhZGF0YS5hdXRob3JcIilcbiAgICAgIGNvbnN0IGZpZWxkUGFydHMgPSBmaWVsZC5zcGxpdCgnLicpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIGZpZWxkIG5hbWVzIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgICAgY29uc3QgZGFuZ2Vyb3VzUHJvcGVydGllcyA9IFsnX19wcm90b19fJywgJ2NvbnN0cnVjdG9yJywgJ3Byb3RvdHlwZSddO1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGZpZWxkUGFydHMpIHtcbiAgICAgICAgaWYgKGRhbmdlcm91c1Byb3BlcnRpZXMuaW5jbHVkZXMocGFydCkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgSW52YWxpZCBmaWVsZCBuYW1lOiAnJHtwYXJ0fScgaXMgbm90IGFsbG93ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnNgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgbGV0IHRhcmdldDogYW55ID0gZWxlbWVudDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmllbGRQYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgLy8gU0VDVVJJVFk6IEFkZGl0aW9uYWwgY2hlY2sgdG8gcHJldmVudCBwcm90b3R5cGUgcG9sbHV0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0JyB8fCB0YXJnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgQ2Fubm90IHNldCBwcm9wZXJ0eSAnJHtmaWVsZFBhcnRzW2ldfScgb24gbm9uLW9iamVjdGBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKCF0YXJnZXRbZmllbGRQYXJ0c1tpXV0pIHtcbiAgICAgICAgICAvLyBTRUNVUklUWTogVXNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB0byBhdm9pZCBwcm90b3R5cGUgY2hhaW4gcG9sbHV0aW9uXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZmllbGRQYXJ0c1tpXSwge1xuICAgICAgICAgICAgdmFsdWU6IHt9LFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W2ZpZWxkUGFydHNbaV1dO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgdGhlIGZpZWxkXG4gICAgICBjb25zdCBsYXN0RmllbGQgPSBmaWVsZFBhcnRzW2ZpZWxkUGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAvLyBTRUNVUklUWTogVXNlIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBmb3IgdGhlIGZpbmFsIGFzc2lnbm1lbnQgdG9vXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBsYXN0RmllbGQsIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHZlcnNpb24gLSBoYW5kbGUgdmFyaW91cyB2ZXJzaW9uIGZvcm1hdHNcbiAgICAgIGlmIChlbGVtZW50LnZlcnNpb24pIHtcbiAgICAgICAgY29uc3QgdmVyc2lvblBhcnRzID0gZWxlbWVudC52ZXJzaW9uLnNwbGl0KCcuJyk7XG4gICAgICAgIGlmICh2ZXJzaW9uUGFydHMubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAvLyBTdGFuZGFyZCBzZW12ZXIgZm9ybWF0IChlLmcuLCAxLjAuMClcbiAgICAgICAgICBjb25zdCBwYXRjaCA9IHBhcnNlSW50KHZlcnNpb25QYXJ0c1syXSkgfHwgMDtcbiAgICAgICAgICB2ZXJzaW9uUGFydHNbMl0gPSBTdHJpbmcocGF0Y2ggKyAxKTtcbiAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSB2ZXJzaW9uUGFydHMuam9pbignLicpO1xuICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25QYXJ0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAvLyBUd28tcGFydCB2ZXJzaW9uIChlLmcuLCAxLjApIC0gYWRkIHBhdGNoIHZlcnNpb25cbiAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSBgJHtlbGVtZW50LnZlcnNpb259LjFgO1xuICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25QYXJ0cy5sZW5ndGggPT09IDEgJiYgL15cXGQrJC8udGVzdCh2ZXJzaW9uUGFydHNbMF0pKSB7XG4gICAgICAgICAgLy8gU2luZ2xlIG51bWJlciB2ZXJzaW9uIChlLmcuLCAxKSAtIGNvbnZlcnQgdG8gc2VtdmVyXG4gICAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gYCR7ZWxlbWVudC52ZXJzaW9ufS4wLjFgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vbi1zdGFuZGFyZCB2ZXJzaW9uIC0gYXBwZW5kIG9yIHJlcGxhY2Ugd2l0aCBzdGFuZGFyZCBmb3JtYXRcbiAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSAnMS4wLjEnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyB2ZXJzaW9uIC0gc2V0IGluaXRpYWwgdmVyc2lvblxuICAgICAgICBlbGVtZW50LnZlcnNpb24gPSAnMS4wLjAnO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTYXZlIHRoZSBlbGVtZW50IC0gbmVlZCB0byBkZXRlcm1pbmUgZmlsZW5hbWVcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7ZWxlbWVudC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTktXS9nLCAnLScpfS5tZGA7XG4gICAgICBhd2FpdCBtYW5hZ2VyIS5zYXZlKGVsZW1lbnQgYXMgYW55LCBmaWxlbmFtZSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKchSBVcGRhdGVkICR7dHlwZX0gJyR7bmFtZX0nIC0gJHtmaWVsZH0gc2V0IHRvOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBlZGl0IGVsZW1lbnQ6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBlZGl0IGVsZW1lbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIHZhbGlkYXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHN0cmljdD86IGJvb2xlYW59KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgdHlwZSwgc3RyaWN0ID0gZmFsc2UgfSA9IGFyZ3M7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgdHlwZVxuICAgICAgaWYgKCFPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5pbmNsdWRlcyh0eXBlIGFzIEVsZW1lbnRUeXBlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgSW52YWxpZCBlbGVtZW50IHR5cGUgJyR7dHlwZX0nLiBWYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpfSAob3IgbGVnYWN5IHBsdXJhbCBmb3JtczogcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHMpYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZvciBwZXJzb25hcywgdXNlIGV4aXN0aW5nIHZhbGlkYXRpb24gbG9naWNcbiAgICAgIGlmICh0eXBlID09PSBFbGVtZW50VHlwZS5QRVJTT05BKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUGVyc29uYShuYW1lKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gR2V0IHRoZSBhcHByb3ByaWF0ZSBtYW5hZ2VyIGJhc2VkIG9uIHR5cGVcbiAgICAgIGxldCBtYW5hZ2VyOiBTa2lsbE1hbmFnZXIgfCBUZW1wbGF0ZU1hbmFnZXIgfCBBZ2VudE1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIHN3aXRjaCAodHlwZSBhcyBFbGVtZW50VHlwZSkge1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOlxuICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnNraWxsTWFuYWdlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURTpcbiAgICAgICAgICBtYW5hZ2VyID0gdGhpcy50ZW1wbGF0ZU1hbmFnZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6XG4gICAgICAgICAgbWFuYWdlciA9IHRoaXMuYWdlbnRNYW5hZ2VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBFbGVtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciB2YWxpZGF0aW9uYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGaW5kIHRoZSBlbGVtZW50XG4gICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgbWFuYWdlciEuZmluZCgoZTogYW55KSA9PiBlLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCAke3R5cGV9ICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUGVyZm9ybSB2YWxpZGF0aW9uXG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gZWxlbWVudC52YWxpZGF0ZSgpO1xuICAgICAgXG4gICAgICAvLyBGb3JtYXQgdmFsaWRhdGlvbiByZXBvcnRcbiAgICAgIGxldCByZXBvcnQgPSBg8J+UjSBWYWxpZGF0aW9uIFJlcG9ydCBmb3IgJHt0eXBlfSAnJHtuYW1lfSc6XFxuYDtcbiAgICAgIHJlcG9ydCArPSBgJHt2YWxpZGF0aW9uUmVzdWx0LnZhbGlkID8gJ+KchScgOiAn4p2MJ30gU3RhdHVzOiAke3ZhbGlkYXRpb25SZXN1bHQudmFsaWQgPyAnVmFsaWQnIDogJ0ludmFsaWQnfVxcblxcbmA7XG4gICAgICBcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0LmVycm9ycyAmJiB2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcG9ydCArPSBg4p2MIEVycm9ycyAoJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5sZW5ndGh9KTpcXG5gO1xuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5mb3JFYWNoKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgcmVwb3J0ICs9IGAgICDigKIgJHtlcnJvci5maWVsZCB8fCAnR2VuZXJhbCd9OiAke2Vycm9yLm1lc3NhZ2V9XFxuYDtcbiAgICAgICAgICBpZiAoZXJyb3IuZml4KSB7XG4gICAgICAgICAgICByZXBvcnQgKz0gYCAgICAg8J+SoSBGaXg6ICR7ZXJyb3IuZml4fVxcbmA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncyAmJiB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGDimqDvuI8gIFdhcm5pbmdzICgke3ZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RofSk6XFxuYDtcbiAgICAgICAgdmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKCh3YXJuaW5nOiBhbnkpID0+IHtcbiAgICAgICAgICByZXBvcnQgKz0gYCAgIOKAoiAke3dhcm5pbmcuZmllbGQgfHwgJ0dlbmVyYWwnfTogJHt3YXJuaW5nLm1lc3NhZ2V9XFxuYDtcbiAgICAgICAgICBpZiAod2FybmluZy5zdWdnZXN0aW9uKSB7XG4gICAgICAgICAgICByZXBvcnQgKz0gYCAgICAg8J+SoSBTdWdnZXN0aW9uOiAke3dhcm5pbmcuc3VnZ2VzdGlvbn1cXG5gO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJlcG9ydCArPSAnXFxuJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuc3VnZ2VzdGlvbnMgJiYgdmFsaWRhdGlvblJlc3VsdC5zdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcG9ydCArPSBg8J+SoSBTdWdnZXN0aW9uczpcXG5gO1xuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnN1Z2dlc3Rpb25zLmZvckVhY2goKHN1Z2dlc3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJlcG9ydCArPSBgICAg4oCiICR7c3VnZ2VzdGlvbn1cXG5gO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWRkIHN0cmljdCBtb2RlIGFkZGl0aW9uYWwgY2hlY2tzIGlmIHJlcXVlc3RlZFxuICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICByZXBvcnQgKz0gJ1xcbvCfk4sgU3RyaWN0IE1vZGU6IEFkZGl0aW9uYWwgcXVhbGl0eSBjaGVja3MgYXBwbGllZCc7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogcmVwb3J0XG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byB2YWxpZGF0ZSBlbGVtZW50OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gdmFsaWRhdGUgZWxlbWVudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZGVsZXRlRWxlbWVudChhcmdzOiB7bmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IGRlbGV0ZURhdGE/OiBib29sZWFufSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHR5cGUsIGRlbGV0ZURhdGEgfSA9IGFyZ3M7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgdHlwZVxuICAgICAgaWYgKCFPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5pbmNsdWRlcyh0eXBlIGFzIEVsZW1lbnRUeXBlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgSW52YWxpZCBlbGVtZW50IHR5cGU6ICR7dHlwZX1cXG5WYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpfSAob3IgbGVnYWN5IHBsdXJhbCBmb3JtczogcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHMpYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdldCB0aGUgYXBwcm9wcmlhdGUgbWFuYWdlciBiYXNlZCBvbiB0eXBlXG4gICAgICBsZXQgbWFuYWdlcjogU2tpbGxNYW5hZ2VyIHwgVGVtcGxhdGVNYW5hZ2VyIHwgQWdlbnRNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gICAgICBzd2l0Y2ggKHR5cGUgYXMgRWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDpcbiAgICAgICAgICBtYW5hZ2VyID0gdGhpcy5za2lsbE1hbmFnZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICAgICAgbWFuYWdlciA9IHRoaXMudGVtcGxhdGVNYW5hZ2VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOlxuICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLmFnZW50TWFuYWdlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIC8vIEZvciBwZXJzb25hcywgdXNlIGEgZGlmZmVyZW50IGFwcHJvYWNoXG4gICAgICAgICAgY29uc3QgcGVyc29uYVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciwgYCR7bmFtZX0ubWRgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMuYWNjZXNzKHBlcnNvbmFQYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IGZzLnVubGluayhwZXJzb25hUGF0aCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFJlbG9hZCBwZXJzb25hcyB0byB1cGRhdGUgdGhlIGNhY2hlXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinIUgU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgcGVyc29uYSAnJHtuYW1lfSdgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFBlcnNvbmEgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBFbGVtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBkZWxldGlvbmBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW5zdXJlIG1hbmFnZXIgd2FzIGFzc2lnbmVkIChUeXBlU2NyaXB0IHR5cGUgc2FmZXR5KVxuICAgICAgaWYgKCFtYW5hZ2VyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBFbGVtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRlbGV0aW9uYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZpbmQgdGhlIGVsZW1lbnQgZmlyc3QgdG8gY2hlY2sgaWYgaXQgZXhpc3RzXG4gICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgbWFuYWdlciEuZmluZCgoZTogYW55KSA9PiBlLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCAke3R5cGV9ICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgZm9yIGFzc29jaWF0ZWQgZGF0YSBmaWxlc1xuICAgICAgbGV0IGRhdGFGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgIFxuICAgICAgLy8gQWdlbnQtc3BlY2lmaWM6IENoZWNrIGZvciBzdGF0ZSBmaWxlc1xuICAgICAgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLkFHRU5UKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlRGlyID0gcGF0aC5qb2luKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLkFHRU5UKSwgJy5zdGF0ZScpO1xuICAgICAgICBjb25zdCBzdGF0ZUZpbGUgPSBwYXRoLmpvaW4oc3RhdGVEaXIsIGAke25hbWV9LXN0YXRlLmpzb25gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChzdGF0ZUZpbGUpO1xuICAgICAgICAgIGRhdGFGaWxlcy5wdXNoKGAtIC5zdGF0ZS8ke25hbWV9LXN0YXRlLmpzb24gKCR7KHN0YXQuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9IEtCKWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIE5vIHN0YXRlIGZpbGUgZXhpc3RzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTWVtb3J5LXNwZWNpZmljOiBDaGVjayBmb3Igc3RvcmFnZSBmaWxlc1xuICAgICAgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLk1FTU9SWSkge1xuICAgICAgICBjb25zdCBzdG9yYWdlRGlyID0gcGF0aC5qb2luKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLk1FTU9SWSksICcuc3RvcmFnZScpO1xuICAgICAgICBjb25zdCBzdG9yYWdlRmlsZSA9IHBhdGguam9pbihzdG9yYWdlRGlyLCBgJHtuYW1lfS1tZW1vcnkuanNvbmApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KHN0b3JhZ2VGaWxlKTtcbiAgICAgICAgICBkYXRhRmlsZXMucHVzaChgLSAuc3RvcmFnZS8ke25hbWV9LW1lbW9yeS5qc29uICgkeyhzdGF0LnNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfSBLQilgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBObyBzdG9yYWdlIGZpbGUgZXhpc3RzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW5zZW1ibGUtc3BlY2lmaWM6IENoZWNrIGZvciBjb25maWcgZmlsZXNcbiAgICAgIGlmICh0eXBlID09PSBFbGVtZW50VHlwZS5FTlNFTUJMRSkge1xuICAgICAgICBjb25zdCBjb25maWdEaXIgPSBwYXRoLmpvaW4odGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuRU5TRU1CTEUpLCAnLmNvbmZpZ3MnKTtcbiAgICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbihjb25maWdEaXIsIGAke25hbWV9LWNvbmZpZy5qc29uYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoY29uZmlnRmlsZSk7XG4gICAgICAgICAgZGF0YUZpbGVzLnB1c2goYC0gLmNvbmZpZ3MvJHtuYW1lfS1jb25maWcuanNvbiAoJHsoc3RhdC5zaXplIC8gMTAyNCkudG9GaXhlZCgyKX0gS0IpYCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gTm8gY29uZmlnIGZpbGUgZXhpc3RzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgZGF0YSBmaWxlcyBleGlzdCBhbmQgZGVsZXRlRGF0YSBpcyBub3Qgc3BlY2lmaWVkLCB3ZSBuZWVkIHRvIGluZm9ybSB0aGUgdXNlclxuICAgICAgaWYgKGRhdGFGaWxlcy5sZW5ndGggPiAwICYmIGRlbGV0ZURhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDimqDvuI8gIFRoaXMgJHt0eXBlfSBoYXMgYXNzb2NpYXRlZCBkYXRhIGZpbGVzOlxcbiR7ZGF0YUZpbGVzLmpvaW4oJ1xcbicpfVxcblxcbldvdWxkIHlvdSBsaWtlIHRvIGRlbGV0ZSB0aGVzZSBkYXRhIGZpbGVzIGFzIHdlbGw/XFxuXFxu4oCiIFRvIGRlbGV0ZSBldmVyeXRoaW5nIChlbGVtZW50ICsgZGF0YSksIHNheTogXCJZZXMsIGRlbGV0ZSBhbGwgZGF0YVwiXFxu4oCiIFRvIGtlZXAgdGhlIGRhdGEgZmlsZXMsIHNheTogXCJObywga2VlcCB0aGUgZGF0YVwiXFxu4oCiIFRvIGNhbmNlbCwgc2F5OiBcIkNhbmNlbFwiYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERlbGV0ZSB0aGUgbWFpbiBlbGVtZW50IGZpbGVcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7c2x1Z2lmeShuYW1lKX0ubWRgO1xuICAgICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIodHlwZSBhcyBFbGVtZW50VHlwZSksIGZpbGVuYW1lKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKGZpbGVwYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCAke3R5cGV9IGZpbGUgJyR7ZmlsZW5hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERlbGV0ZSBhc3NvY2lhdGVkIGRhdGEgZmlsZXMgaWYgcmVxdWVzdGVkXG4gICAgICBpZiAoZGVsZXRlRGF0YSAmJiBkYXRhRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB1cGRhdGVkRGF0YUZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLkFHRU5UKSB7XG4gICAgICAgICAgY29uc3Qgc3RhdGVGaWxlID0gcGF0aC5qb2luKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLkFHRU5UKSwgJy5zdGF0ZScsIGAke25hbWV9LXN0YXRlLmpzb25gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKHN0YXRlRmlsZSk7XG4gICAgICAgICAgICB1cGRhdGVkRGF0YUZpbGVzLnB1c2goYCR7ZGF0YUZpbGVzWzBdfSDinJMgZGVsZXRlZGApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBMb2cgYnV0IGRvbid0IGZhaWwgaWYgc3RhdGUgZmlsZSBkZWxldGlvbiBmYWlsc1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkZWxldGUgYWdlbnQgc3RhdGUgZmlsZTogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgIHVwZGF0ZWREYXRhRmlsZXMucHVzaChgJHtkYXRhRmlsZXNbMF19IOKaoO+4jyBkZWxldGlvbiBmYWlsZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICAgICAgY29uc3Qgc3RvcmFnZUZpbGUgPSBwYXRoLmpvaW4odGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuTUVNT1JZKSwgJy5zdG9yYWdlJywgYCR7bmFtZX0tbWVtb3J5Lmpzb25gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKHN0b3JhZ2VGaWxlKTtcbiAgICAgICAgICAgIHVwZGF0ZWREYXRhRmlsZXMucHVzaChgJHtkYXRhRmlsZXNbMF19IOKckyBkZWxldGVkYCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIExvZyBidXQgZG9uJ3QgZmFpbCBpZiBzdG9yYWdlIGZpbGUgZGVsZXRpb24gZmFpbHNcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gZGVsZXRlIG1lbW9yeSBzdG9yYWdlIGZpbGU6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICB1cGRhdGVkRGF0YUZpbGVzLnB1c2goYCR7ZGF0YUZpbGVzWzBdfSDimqDvuI8gZGVsZXRpb24gZmFpbGVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFKSB7XG4gICAgICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbih0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5FTlNFTUJMRSksICcuY29uZmlncycsIGAke25hbWV9LWNvbmZpZy5qc29uYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLnVubGluayhjb25maWdGaWxlKTtcbiAgICAgICAgICAgIHVwZGF0ZWREYXRhRmlsZXMucHVzaChgJHtkYXRhRmlsZXNbMF19IOKckyBkZWxldGVkYCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIExvZyBidXQgZG9uJ3QgZmFpbCBpZiBjb25maWcgZmlsZSBkZWxldGlvbiBmYWlsc1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkZWxldGUgZW5zZW1ibGUgY29uZmlnIGZpbGU6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICB1cGRhdGVkRGF0YUZpbGVzLnB1c2goYCR7ZGF0YUZpbGVzWzBdfSDimqDvuI8gZGVsZXRpb24gZmFpbGVkYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkYXRhRmlsZXMgPSB1cGRhdGVkRGF0YUZpbGVzO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBCdWlsZCBzdWNjZXNzIG1lc3NhZ2VcbiAgICAgIGxldCBtZXNzYWdlID0gYOKchSBTdWNjZXNzZnVsbHkgZGVsZXRlZCAke3R5cGV9ICcke25hbWV9J2A7XG4gICAgICBpZiAoZGF0YUZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGRlbGV0ZURhdGEpIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGBcXG5cXG5Bc3NvY2lhdGVkIGRhdGEgZmlsZXM6XFxuJHtkYXRhRmlsZXMuam9pbignXFxuJyl9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXNzYWdlICs9IGBcXG5cXG7imqDvuI8gQXNzb2NpYXRlZCBkYXRhIGZpbGVzIHdlcmUgcHJlc2VydmVkOlxcbiR7ZGF0YUZpbGVzLmpvaW4oJ1xcbicpfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBtZXNzYWdlXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBlbGVtZW50OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZGVsZXRlIGVsZW1lbnQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBjaGVja1JhdGVMaW1pdCBhbmQgZmV0Y2hGcm9tR2l0SHViIGFyZSBub3cgaGFuZGxlZCBieSBHaXRIdWJDbGllbnRcblxuICBhc3luYyBicm93c2VDb2xsZWN0aW9uKHNlY3Rpb24/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRklYICM0NzE6IFJlcGxhY2UgbGVnYWN5IGNhdGVnb3J5IHZhbGlkYXRpb24gd2l0aCBwcm9wZXIgc2VjdGlvbi90eXBlIHZhbGlkYXRpb25cbiAgICAgIC8vIFZhbGlkIHNlY3Rpb25zOiBsaWJyYXJ5LCBzaG93Y2FzZSwgY2F0YWxvZ1xuICAgICAgLy8gVmFsaWQgdHlwZXM6IHBlcnNvbmFzLCBza2lsbHMsIGFnZW50cywgcHJvbXB0cywgdGVtcGxhdGVzLCB0b29scywgZW5zZW1ibGVzLCBtZW1vcmllc1xuICAgICAgY29uc3QgdmFsaWRTZWN0aW9ucyA9IFsnbGlicmFyeScsICdzaG93Y2FzZScsICdjYXRhbG9nJ107XG4gICAgICBjb25zdCB2YWxpZFR5cGVzID0gWydwZXJzb25hcycsICdza2lsbHMnLCAnYWdlbnRzJywgJ3Byb21wdHMnLCAndGVtcGxhdGVzJywgJ3Rvb2xzJywgJ2Vuc2VtYmxlcycsICdtZW1vcmllcyddO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBzZWN0aW9uIGlmIHByb3ZpZGVkXG4gICAgICBjb25zdCB2YWxpZGF0ZWRTZWN0aW9uID0gc2VjdGlvbiA/IHNhbml0aXplSW5wdXQoc2VjdGlvbi50b0xvd2VyQ2FzZSgpKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICh2YWxpZGF0ZWRTZWN0aW9uICYmICF2YWxpZFNlY3Rpb25zLmluY2x1ZGVzKHZhbGlkYXRlZFNlY3Rpb24pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzZWN0aW9uICcke3ZhbGlkYXRlZFNlY3Rpb259Jy4gTXVzdCBiZSBvbmUgb2Y6ICR7dmFsaWRTZWN0aW9ucy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSB0eXBlIGlmIHByb3ZpZGVkIChvbmx5IHZhbGlkIHdoZW4gc2VjdGlvbiBpcyAnbGlicmFyeScpXG4gICAgICBjb25zdCB2YWxpZGF0ZWRUeXBlID0gdHlwZSA/IHNhbml0aXplSW5wdXQodHlwZS50b0xvd2VyQ2FzZSgpKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICh2YWxpZGF0ZWRUeXBlICYmIHZhbGlkYXRlZFNlY3Rpb24gPT09ICdsaWJyYXJ5JyAmJiAhdmFsaWRUeXBlcy5pbmNsdWRlcyh2YWxpZGF0ZWRUeXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHlwZSAnJHt2YWxpZGF0ZWRUeXBlfScuIE11c3QgYmUgb25lIG9mOiAke3ZhbGlkVHlwZXMuam9pbignLCAnKX1gKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZGF0ZWRUeXBlICYmIHZhbGlkYXRlZFNlY3Rpb24gIT09ICdsaWJyYXJ5Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R5cGUgcGFyYW1ldGVyIGlzIG9ubHkgdmFsaWQgd2hlbiBzZWN0aW9uIGlzIFwibGlicmFyeVwiJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29sbGVjdGlvbkJyb3dzZXIuYnJvd3NlQ29sbGVjdGlvbih2YWxpZGF0ZWRTZWN0aW9uLCB2YWxpZGF0ZWRUeXBlKTtcbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIHNlY3Rpb25zIHZpZXdcbiAgICAgIGNvbnN0IGl0ZW1zID0gcmVzdWx0Lml0ZW1zO1xuICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IHJlc3VsdC5zZWN0aW9ucyB8fCByZXN1bHQuY2F0ZWdvcmllcztcbiAgICAgIFxuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuY29sbGVjdGlvbkJyb3dzZXIuZm9ybWF0QnJvd3NlUmVzdWx0cyhcbiAgICAgICAgaXRlbXMsIFxuICAgICAgICBjYXRlZ29yaWVzLCBcbiAgICAgICAgdmFsaWRhdGVkU2VjdGlvbiwgXG4gICAgICAgIHZhbGlkYXRlZFR5cGUsIFxuICAgICAgICB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIENvbGxlY3Rpb24gYnJvd3NpbmcgZmFpbGVkOiAke3Nhbml0aXplZC5tZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2VhcmNoQ29sbGVjdGlvbihxdWVyeTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb24gZm9yIHNlYXJjaCBxdWVyeVxuICAgICAgY29uc3QgdmFsaWRhdGVkUXVlcnkgPSBNQ1BJbnB1dFZhbGlkYXRvci52YWxpZGF0ZVNlYXJjaFF1ZXJ5KHF1ZXJ5KTtcbiAgICAgIFxuICAgICAgY29uc3QgaXRlbXMgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25TZWFyY2guc2VhcmNoQ29sbGVjdGlvbih2YWxpZGF0ZWRRdWVyeSk7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5jb2xsZWN0aW9uU2VhcmNoLmZvcm1hdFNlYXJjaFJlc3VsdHMoaXRlbXMsIHZhbGlkYXRlZFF1ZXJ5LCB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBFcnJvciBzZWFyY2hpbmcgY29sbGVjdGlvbjogJHtzYW5pdGl6ZWQubWVzc2FnZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldENvbGxlY3Rpb25Db250ZW50KHBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IG1ldGFkYXRhLCBjb250ZW50IH0gPSBhd2FpdCB0aGlzLnBlcnNvbmFEZXRhaWxzLmdldENvbGxlY3Rpb25Db250ZW50KHBhdGgpO1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucGVyc29uYURldGFpbHMuZm9ybWF0UGVyc29uYURldGFpbHMobWV0YWRhdGEsIGNvbnRlbnQsIHBhdGgsIHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEVycm9yIGZldGNoaW5nIGNvbnRlbnQ6ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpbnN0YWxsQ29udGVudChpbnB1dFBhdGg6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmVsZW1lbnRJbnN0YWxsZXIuaW5zdGFsbENvbnRlbnQoaW5wdXRQYXRoKTtcbiAgICAgIFxuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDimqDvuI8gJHtyZXN1bHQubWVzc2FnZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBpdCdzIGEgcGVyc29uYSwgcmVsb2FkIHBlcnNvbmFzXG4gICAgICBpZiAocmVzdWx0LmVsZW1lbnRUeXBlID09PSBFbGVtZW50VHlwZS5QRVJTT05BKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFBlcnNvbmFzKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmVsZW1lbnRJbnN0YWxsZXIuZm9ybWF0SW5zdGFsbFN1Y2Nlc3MoXG4gICAgICAgIHJlc3VsdC5tZXRhZGF0YSEsIFxuICAgICAgICByZXN1bHQuZmlsZW5hbWUhLFxuICAgICAgICByZXN1bHQuZWxlbWVudFR5cGUhXG4gICAgICApO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXJyb3IgaW5zdGFsbGluZyBBSSBjdXN0b21pemF0aW9uIGVsZW1lbnQ6ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzdWJtaXRDb250ZW50KGNvbnRlbnRJZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAvLyBDaGVjayBHaXRIdWIgYXV0aGVudGljYXRpb24gZmlyc3RcbiAgICBjb25zdCBhdXRoU3RhdHVzID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5nZXRBdXRoU3RhdHVzKCk7XG4gICAgY29uc3QgaXNBdXRoZW50aWNhdGVkID0gYXV0aFN0YXR1cy5pc0F1dGhlbnRpY2F0ZWQ7XG4gICAgXG4gICAgLy8gRmluZCB0aGUgY29udGVudCBpbiBsb2NhbCBjb2xsZWN0aW9uXG4gICAgbGV0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldChjb250ZW50SWRlbnRpZmllcik7XG4gICAgXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAvLyBTZWFyY2ggYnkgbmFtZVxuICAgICAgcGVyc29uYSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkuZmluZChwID0+IFxuICAgICAgICBwLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gY29udGVudElkZW50aWZpZXIudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBDb250ZW50IG5vdCBmb3VuZDogJHtjb250ZW50SWRlbnRpZmllcn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHBlcnNvbmEgY29udGVudCBiZWZvcmUgc3VibWlzc2lvblxuICAgIHRyeSB7XG4gICAgICAvLyBSZWFkIHRoZSBmdWxsIHBlcnNvbmEgZmlsZSBjb250ZW50XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBwZXJzb25hLmZpbGVuYW1lKTtcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgUGF0aFZhbGlkYXRvci5zYWZlUmVhZEZpbGUoZnVsbFBhdGgpO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBjb250ZW50IGZvciBzZWN1cml0eSB0aHJlYXRzXG4gICAgICBjb25zdCBjb250ZW50VmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShmaWxlQ29udGVudCk7XG4gICAgICBpZiAoIWNvbnRlbnRWYWxpZGF0aW9uLmlzVmFsaWQgJiYgY29udGVudFZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipTZWN1cml0eSBWYWxpZGF0aW9uIEZhaWxlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBUaGlzIHBlcnNvbmEgY29udGFpbnMgY29udGVudCB0aGF0IGNvdWxkIGJlIHVzZWQgZm9yIHByb21wdCBpbmplY3Rpb24gYXR0YWNrczpcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAke2NvbnRlbnRWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJ1xcbuKAoiAnKX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSByZW1vdmUgdGhlc2UgcGF0dGVybnMgYmVmb3JlIHN1Ym1pdHRpbmcgdG8gdGhlIGNvbGxlY3Rpb24uYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgbWV0YWRhdGFcbiAgICAgIGNvbnN0IG1ldGFkYXRhVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVNZXRhZGF0YShwZXJzb25hLm1ldGFkYXRhKTtcbiAgICAgIGlmICghbWV0YWRhdGFWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3imqDvuI8gKipNZXRhZGF0YSBTZWN1cml0eSBXYXJuaW5nKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFRoZSBwZXJzb25hIG1ldGFkYXRhIGNvbnRhaW5zIHBvdGVudGlhbGx5IHByb2JsZW1hdGljIGNvbnRlbnQ6XFxuYCArXG4gICAgICAgICAgICAgIGDigKIgJHttZXRhZGF0YVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignXFxu4oCiICcpfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIGZpeCB0aGVzZSBpc3N1ZXMgYmVmb3JlIHN1Ym1pdHRpbmcuYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEVycm9yIHZhbGlkYXRpbmcgcGVyc29uYTogJHtzYW5pdGl6ZWQubWVzc2FnZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIHN1Ym1pc3Npb24gaXNzdWUgd2l0aCByYXRlIGxpbWl0aW5nXG4gICAgbGV0IGdpdGh1Yklzc3VlVXJsOiBzdHJpbmc7XG4gICAgbGV0IHJhdGVMaW1pdFN0YXR1czogYW55O1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdWJtaXNzaW9uUmVzdWx0ID0gdGhpcy5wZXJzb25hU3VibWl0dGVyLmdlbmVyYXRlU3VibWlzc2lvbklzc3VlKHBlcnNvbmEpO1xuICAgICAgZ2l0aHViSXNzdWVVcmwgPSBzdWJtaXNzaW9uUmVzdWx0LmdpdGh1Yklzc3VlVXJsO1xuICAgICAgcmF0ZUxpbWl0U3RhdHVzID0gc3VibWlzc2lvblJlc3VsdC5yYXRlTGltaXRTdGF0dXM7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gSGFuZGxlIHJhdGUgbGltaXRpbmcgZXJyb3Igc3BlY2lmaWNhbGx5XG4gICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygncmF0ZSBsaW1pdCcpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94o+zICoqUmF0ZSBMaW1pdCBSZWFjaGVkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgJHtlcnJvci5tZXNzYWdlfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGBUaGlzIHByb3RlY3Rpb24gZW5zdXJlcyB0aGUgcXVhbGl0eSBhbmQgaW50ZWdyaXR5IG9mIG91ciBjb2xsZWN0aW9uLmAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgb3RoZXIgZXJyb3JzXG4gICAgfVxuICAgIFxuICAgIC8vIENob29zZSByZXNwb25zZSBmb3JtYXQgYmFzZWQgb24gYXV0aGVudGljYXRpb24gc3RhdHVzXG4gICAgY29uc3QgdGV4dCA9IGlzQXV0aGVudGljYXRlZCBcbiAgICAgID8gdGhpcy5wZXJzb25hU3VibWl0dGVyLmZvcm1hdFN1Ym1pc3Npb25SZXNwb25zZShwZXJzb25hLCBnaXRodWJJc3N1ZVVybCwgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpXG4gICAgICA6IHRoaXMucGVyc29uYVN1Ym1pdHRlci5mb3JtYXRBbm9ueW1vdXNTdWJtaXNzaW9uUmVzcG9uc2UocGVyc29uYSwgZ2l0aHViSXNzdWVVcmwsIHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICBcbiAgICAvLyBBZGQgcmF0ZSBsaW1pdCBpbmZvIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IHJhdGVMaW1pdEluZm8gPSByYXRlTGltaXRTdGF0dXMgXG4gICAgICA/IGBcXG5cXG7wn5OKICoqUmF0ZSBMaW1pdCBTdGF0dXM6KiogJHtyYXRlTGltaXRTdGF0dXMucmVtYWluaW5nVG9rZW5zfSBzdWJtaXNzaW9ucyByZW1haW5pbmcgdGhpcyBob3VyYFxuICAgICAgOiAnJztcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiB0ZXh0ICsgcmF0ZUxpbWl0SW5mbyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldENvbGxlY3Rpb25DYWNoZUhlYWx0aCgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gR2V0IGNhY2hlIHN0YXRpc3RpY3NcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uQ2FjaGUuZ2V0Q2FjaGVTdGF0cygpO1xuICAgICAgXG4gICAgICAvLyBDaGVjayBpZiBjYWNoZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBjb25zdCBjYWNoZURpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLmRvbGxob3VzZW1jcCcsICdjYWNoZScpO1xuICAgICAgbGV0IGNhY2hlRmlsZUV4aXN0cyA9IGZhbHNlO1xuICAgICAgbGV0IGNhY2hlRmlsZVNpemUgPSAwO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjYWNoZUZpbGUgPSBwYXRoLmpvaW4oY2FjaGVEaXIsICdjb2xsZWN0aW9uLWNhY2hlLmpzb24nKTtcbiAgICAgICAgY29uc3QgZmlsZVN0YXRzID0gYXdhaXQgZnMuc3RhdChjYWNoZUZpbGUpO1xuICAgICAgICBjYWNoZUZpbGVFeGlzdHMgPSB0cnVlO1xuICAgICAgICBjYWNoZUZpbGVTaXplID0gZmlsZVN0YXRzLnNpemU7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBDYWNoZSBmaWxlIGRvZXNuJ3QgZXhpc3QgeWV0XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZvcm1hdCBjYWNoZSBhZ2VcbiAgICAgIGNvbnN0IGZvcm1hdEFnZSA9IChhZ2VNczogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICAgICAgaWYgKGFnZU1zID09PSAwKSByZXR1cm4gJ05vdCBjYWNoZWQnO1xuICAgICAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoYWdlTXMgLyAoMTAwMCAqIDYwICogNjApKTtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKGFnZU1zICUgKDEwMDAgKiA2MCAqIDYwKSkgLyAoMTAwMCAqIDYwKSk7XG4gICAgICAgIGlmIChob3VycyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gYCR7aG91cnN9aCAke21pbnV0ZXN9bSBvbGRgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHttaW51dGVzfW0gb2xkYDtcbiAgICAgIH07XG4gICAgICBcbiAgICAgIC8vIEJ1aWxkIGhlYWx0aCByZXBvcnRcbiAgICAgIGNvbnN0IGhlYWx0aFJlcG9ydCA9IHtcbiAgICAgICAgc3RhdHVzOiBzdGF0cy5pc1ZhbGlkID8gJ2hlYWx0aHknIDogKGNhY2hlRmlsZUV4aXN0cyA/ICdleHBpcmVkJyA6ICdlbXB0eScpLFxuICAgICAgICBjYWNoZUV4aXN0czogY2FjaGVGaWxlRXhpc3RzLFxuICAgICAgICBpdGVtQ291bnQ6IHN0YXRzLml0ZW1Db3VudCxcbiAgICAgICAgY2FjaGVBZ2U6IGZvcm1hdEFnZShzdGF0cy5jYWNoZUFnZSksXG4gICAgICAgIGNhY2hlQWdlTXM6IHN0YXRzLmNhY2hlQWdlLFxuICAgICAgICBpc1ZhbGlkOiBzdGF0cy5pc1ZhbGlkLFxuICAgICAgICBjYWNoZUZpbGVTaXplOiBjYWNoZUZpbGVTaXplLFxuICAgICAgICBjYWNoZUZpbGVTaXplRm9ybWF0dGVkOiBjYWNoZUZpbGVTaXplID4gMCA/IGAkeyhjYWNoZUZpbGVTaXplIC8gMTAyNCkudG9GaXhlZCgyKX0gS0JgIDogJzAgS0InLFxuICAgICAgICB0dGxSZW1haW5pbmc6IHN0YXRzLmlzVmFsaWQgPyBmb3JtYXRBZ2UoMjQgKiA2MCAqIDYwICogMTAwMCAtIHN0YXRzLmNhY2hlQWdlKSA6ICdFeHBpcmVkJyxcbiAgICAgICAgcmVjb21tZW5kYXRpb246IHN0YXRzLmlzVmFsaWQgXG4gICAgICAgICAgPyAnQ2FjaGUgaXMgaGVhbHRoeSBhbmQgc2VydmluZyBjb250ZW50JyBcbiAgICAgICAgICA6IGNhY2hlRmlsZUV4aXN0cyBcbiAgICAgICAgICAgID8gJ0NhY2hlIGhhcyBleHBpcmVkLiBXaWxsIHJlZnJlc2ggb24gbmV4dCBjb2xsZWN0aW9uIGFjY2Vzcy4nXG4gICAgICAgICAgICA6ICdObyBjYWNoZSBwcmVzZW50LiBXaWxsIGJlIGNyZWF0ZWQgb24gZmlyc3QgY29sbGVjdGlvbiBhY2Nlc3MuJ1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+TiiAqKkNvbGxlY3Rpb24gQ2FjaGUgSGVhbHRoIENoZWNrKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYCoqU3RhdHVzKio6ICR7aGVhbHRoUmVwb3J0LnN0YXR1cyA9PT0gJ2hlYWx0aHknID8gJ+KchScgOiBoZWFsdGhSZXBvcnQuc3RhdHVzID09PSAnZXhwaXJlZCcgPyAn4pqg77iPJyA6ICfwn5OmJ30gJHtoZWFsdGhSZXBvcnQuc3RhdHVzLnRvVXBwZXJDYXNlKCl9XFxuYCArXG4gICAgICAgICAgICAgIGAqKkl0ZW1zIENhY2hlZCoqOiAke2hlYWx0aFJlcG9ydC5pdGVtQ291bnR9XFxuYCArXG4gICAgICAgICAgICAgIGAqKkNhY2hlIEFnZSoqOiAke2hlYWx0aFJlcG9ydC5jYWNoZUFnZX1cXG5gICtcbiAgICAgICAgICAgICAgYCoqQ2FjaGUgU2l6ZSoqOiAke2hlYWx0aFJlcG9ydC5jYWNoZUZpbGVTaXplRm9ybWF0dGVkfVxcbmAgK1xuICAgICAgICAgICAgICBgKipWYWxpZCoqOiAke2hlYWx0aFJlcG9ydC5pc1ZhbGlkID8gJ1llcyDinJMnIDogJ05vIOKclyd9XFxuYCArXG4gICAgICAgICAgICAgIGAqKlRUTCBSZW1haW5pbmcqKjogJHtoZWFsdGhSZXBvcnQudHRsUmVtYWluaW5nfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgKipSZWNvbW1lbmRhdGlvbioqOiAke2hlYWx0aFJlcG9ydC5yZWNvbW1lbmRhdGlvbn1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYENhY2hlIGVuYWJsZXMgb2ZmbGluZSBicm93c2luZyBhbmQgZmFzdGVyIGNvbGxlY3Rpb24gYWNjZXNzLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGdldCBjYWNoZSBoZWFsdGg6ICR7ZXJyb3JNZXNzYWdlfWApO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRmFpbGVkIHRvIGdldCBjYWNoZSBoZWFsdGg6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlciBpZGVudGl0eSBtYW5hZ2VtZW50XG4gIGFzeW5jIHNldFVzZXJJZGVudGl0eSh1c2VybmFtZTogc3RyaW5nLCBlbWFpbD86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXVzZXJuYW1lIHx8IHVzZXJuYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgVXNlcm5hbWUgY2Fubm90IGJlIGVtcHR5YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgYW5kIHNhbml0aXplIHVzZXJuYW1lXG4gICAgICBjb25zdCB2YWxpZGF0ZWRVc2VybmFtZSA9IHZhbGlkYXRlVXNlcm5hbWUodXNlcm5hbWUpO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBlbWFpbCBpZiBwcm92aWRlZFxuICAgICAgbGV0IHZhbGlkYXRlZEVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZW1haWwpIHtcbiAgICAgICAgY29uc3Qgc2FuaXRpemVkRW1haWwgPSBzYW5pdGl6ZUlucHV0KGVtYWlsLCAxMDApO1xuICAgICAgICBpZiAoIVZBTElEQVRJT05fUEFUVEVSTlMuU0FGRV9FTUFJTC50ZXN0KHNhbml0aXplZEVtYWlsKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbWFpbCBmb3JtYXQnKTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZGF0ZWRFbWFpbCA9IHNhbml0aXplZEVtYWlsO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHZhbGlkYXRlZCB1c2VyIGlkZW50aXR5XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyID0gdmFsaWRhdGVkVXNlcm5hbWU7XG4gICAgICBpZiAodmFsaWRhdGVkRW1haWwpIHtcbiAgICAgICAgcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VNQUlMID0gdmFsaWRhdGVkRW1haWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAqKlVzZXIgSWRlbnRpdHkgU2V0KipcXG5cXG5gICtcbiAgICAgICAgICAgIGDwn5GkICoqVXNlcm5hbWU6KiogJHt2YWxpZGF0ZWRVc2VybmFtZX1cXG5gICtcbiAgICAgICAgICAgIGAke3ZhbGlkYXRlZEVtYWlsID8gYPCfk6cgKipFbWFpbDoqKiAke3ZhbGlkYXRlZEVtYWlsfVxcbmAgOiAnJ31gICtcbiAgICAgICAgICAgIGBcXG7wn46vICoqTmV4dCBTdGVwczoqKlxcbmAgK1xuICAgICAgICAgICAgYOKAoiBOZXcgcGVyc29uYXMgeW91IGNyZWF0ZSB3aWxsIGJlIGF0dHJpYnV0ZWQgdG8gXCIke3ZhbGlkYXRlZFVzZXJuYW1lfVwiXFxuYCArXG4gICAgICAgICAgICBg4oCiIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSBcXGBET0xMSE9VU0VfVVNFUj0ke3ZhbGlkYXRlZFVzZXJuYW1lfVxcYCB0byBwZXJzaXN0IHRoaXMgc2V0dGluZ1xcbmAgK1xuICAgICAgICAgICAgYCR7dmFsaWRhdGVkRW1haWwgPyBg4oCiIFNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSBcXGBET0xMSE9VU0VfRU1BSUw9JHt2YWxpZGF0ZWRFbWFpbH1cXGAgZm9yIGNvbnRhY3QgaW5mb1xcbmAgOiAnJ31gICtcbiAgICAgICAgICAgIGDigKIgVXNlIFxcYGNsZWFyX3VzZXJfaWRlbnRpdHlcXGAgdG8gcmV0dXJuIHRvIGFub255bW91cyBtb2RlYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqVmFsaWRhdGlvbiBFcnJvcioqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGAke3Nhbml0aXplZC5tZXNzYWdlfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCB1c2VybmFtZSAoYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBkb3RzIG9ubHkpLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0VXNlcklkZW50aXR5KCkge1xuICAgIGNvbnN0IGVtYWlsID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0VNQUlMO1xuICAgIFxuICAgIGlmICghdGhpcy5jdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+RpCAqKlVzZXIgSWRlbnRpdHk6IEFub255bW91cyoqXFxuXFxuYCArXG4gICAgICAgICAgICBg8J+UkiAqKlN0YXR1czoqKiBBbm9ueW1vdXMgbW9kZVxcbmAgK1xuICAgICAgICAgICAgYPCfk50gKipBdHRyaWJ1dGlvbjoqKiBQZXJzb25hcyB3aWxsIHVzZSBhbm9ueW1vdXMgSURzXFxuXFxuYCArXG4gICAgICAgICAgICBgKipUbyBzZXQgeW91ciBpZGVudGl0eToqKlxcbmAgK1xuICAgICAgICAgICAgYOKAoiBVc2U6IFxcYHNldF91c2VyX2lkZW50aXR5IFwieW91ci11c2VybmFtZVwiXFxgXFxuYCArXG4gICAgICAgICAgICBg4oCiIE9yIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZTogXFxgRE9MTEhPVVNFX1VTRVI9eW91ci11c2VybmFtZVxcYGAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCfkaQgKipVc2VyIElkZW50aXR5OiAke3RoaXMuY3VycmVudFVzZXJ9KipcXG5cXG5gICtcbiAgICAgICAgICBg4pyFICoqU3RhdHVzOioqIEF1dGhlbnRpY2F0ZWRcXG5gICtcbiAgICAgICAgICBg8J+RpCAqKlVzZXJuYW1lOioqICR7dGhpcy5jdXJyZW50VXNlcn1cXG5gICtcbiAgICAgICAgICBgJHtlbWFpbCA/IGDwn5OnICoqRW1haWw6KiogJHtlbWFpbH1cXG5gIDogJyd9YCArXG4gICAgICAgICAgYPCfk50gKipBdHRyaWJ1dGlvbjoqKiBOZXcgcGVyc29uYXMgd2lsbCBiZSBjcmVkaXRlZCB0byBcIiR7dGhpcy5jdXJyZW50VXNlcn1cIlxcblxcbmAgK1xuICAgICAgICAgIGAqKkVudmlyb25tZW50IFZhcmlhYmxlczoqKlxcbmAgK1xuICAgICAgICAgIGDigKIgXFxgRE9MTEhPVVNFX1VTRVI9JHt0aGlzLmN1cnJlbnRVc2VyfVxcYFxcbmAgK1xuICAgICAgICAgIGAke2VtYWlsID8gYOKAoiBcXGBET0xMSE9VU0VfRU1BSUw9JHtlbWFpbH1cXGBcXG5gIDogJyd9YCArXG4gICAgICAgICAgYFxcbioqTWFuYWdlbWVudDoqKlxcbmAgK1xuICAgICAgICAgIGDigKIgVXNlIFxcYGNsZWFyX3VzZXJfaWRlbnRpdHlcXGAgdG8gcmV0dXJuIHRvIGFub255bW91cyBtb2RlXFxuYCArXG4gICAgICAgICAgYOKAoiBVc2UgXFxgc2V0X3VzZXJfaWRlbnRpdHkgXCJuZXctdXNlcm5hbWVcIlxcYCB0byBjaGFuZ2UgdXNlcm5hbWVgLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgY2xlYXJVc2VySWRlbnRpdHkoKSB7XG4gICAgY29uc3Qgd2FzU2V0ID0gdGhpcy5jdXJyZW50VXNlciAhPT0gbnVsbDtcbiAgICBjb25zdCBwcmV2aW91c1VzZXIgPSB0aGlzLmN1cnJlbnRVc2VyO1xuICAgIHRoaXMuY3VycmVudFVzZXIgPSBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHdhc1NldCBcbiAgICAgICAgICAgID8gYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqVXNlciBJZGVudGl0eSBDbGVhcmVkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYPCfkaQgKipQcmV2aW91czoqKiAke3ByZXZpb3VzVXNlcn1cXG5gICtcbiAgICAgICAgICAgICAgYPCflJIgKipDdXJyZW50OioqIEFub255bW91cyBtb2RlXFxuXFxuYCArXG4gICAgICAgICAgICAgIGDwn5OdICoqRWZmZWN0OioqIE5ldyBwZXJzb25hcyB3aWxsIHVzZSBhbm9ueW1vdXMgSURzXFxuXFxuYCArXG4gICAgICAgICAgICAgIGDimqDvuI8gKipOb3RlOioqIFRoaXMgb25seSBhZmZlY3RzIHRoZSBjdXJyZW50IHNlc3Npb24uXFxuYCArXG4gICAgICAgICAgICAgIGBUbyBwZXJzaXN0IHRoaXMgY2hhbmdlLCB1bnNldCB0aGUgXFxgRE9MTEhPVVNFX1VTRVJcXGAgZW52aXJvbm1lbnQgdmFyaWFibGUuYFxuICAgICAgICAgICAgOiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3ihLnvuI8gKipBbHJlYWR5IGluIEFub255bW91cyBNb2RlKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYPCfkaQgTm8gdXNlciBpZGVudGl0eSB3YXMgc2V0LlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVXNlIFxcYHNldF91c2VyX2lkZW50aXR5IFwidXNlcm5hbWVcIlxcYCB0byBzZXQgeW91ciBpZGVudGl0eS5gLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXIgfHwgZ2VuZXJhdGVBbm9ueW1vdXNJZCgpO1xuICB9XG5cbiAgLy8gR2l0SHViIGF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnRcbiAgYXN5bmMgc2V0dXBHaXRIdWJBdXRoKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBjdXJyZW50IGF1dGggc3RhdHVzIGZpcnN0XG4gICAgICBjb25zdCBjdXJyZW50U3RhdHVzID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5nZXRBdXRoU3RhdHVzKCk7XG4gICAgICBcbiAgICAgIGlmIChjdXJyZW50U3RhdHVzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAqKkFscmVhZHkgQ29ubmVjdGVkIHRvIEdpdEh1YioqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBg8J+RpCAqKlVzZXJuYW1lOioqICR7Y3VycmVudFN0YXR1cy51c2VybmFtZX1cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDwn5SRICoqUGVybWlzc2lvbnM6KiogJHtjdXJyZW50U3RhdHVzLnNjb3Blcz8uam9pbignLCAnKSB8fCAnYmFzaWMgYWNjZXNzJ31cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBZb3UncmUgYWxsIHNldCEgWW91IGNhbjpcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDigKIgQnJvd3NlIHRoZSBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgICBg4oCiIEluc3RhbGwgY29udGVudFxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKAoiBTdWJtaXQgeW91ciBjcmVhdGlvbnNcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBUbyBkaXNjb25uZWN0LCBzYXkgXCJkaXNjb25uZWN0IGZyb20gR2l0SHViXCJgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSW5pdGlhdGUgZGV2aWNlIGZsb3dcbiAgICAgIGNvbnN0IGRldmljZVJlc3BvbnNlID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5pbml0aWF0ZURldmljZUZsb3coKTtcbiAgICAgIFxuICAgICAgLy8gU3RhcnQgcG9sbGluZyBpbiBiYWNrZ3JvdW5kXG4gICAgICB0aGlzLnBvbGxGb3JBdXRoQ29tcGxldGlvbihkZXZpY2VSZXNwb25zZS5kZXZpY2VfY29kZSwgZGV2aWNlUmVzcG9uc2UuaW50ZXJ2YWwpO1xuICAgICAgXG4gICAgICAvLyBSZXR1cm4gaW5zdHJ1Y3Rpb25zIHRvIHVzZXJcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogdGhpcy5naXRodWJBdXRoTWFuYWdlci5mb3JtYXRBdXRoSW5zdHJ1Y3Rpb25zKGRldmljZVJlc3BvbnNlKVxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gc2V0dXAgR2l0SHViIGF1dGgnLCB7IGVycm9yIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipBdXRoZW50aWNhdGlvbiBTZXR1cCBGYWlsZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGBVbmFibGUgdG8gc3RhcnQgR2l0SHViIGF1dGhlbnRpY2F0aW9uOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uIGFuZCB0cnkgYWdhaW4uYFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGNoZWNrR2l0SHViQXV0aCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5nZXRBdXRoU3RhdHVzKCk7XG4gICAgICBcbiAgICAgIGlmIChzdGF0dXMuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqR2l0SHViIENvbm5lY3RlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBg8J+RpCAqKlVzZXJuYW1lOioqICR7c3RhdHVzLnVzZXJuYW1lfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgYPCflJEgKipQZXJtaXNzaW9uczoqKiAke3N0YXR1cy5zY29wZXM/LmpvaW4oJywgJykgfHwgJ2Jhc2ljIGFjY2Vzcyd9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgKipBdmFpbGFibGUgQWN0aW9uczoqKlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKchSBCcm93c2UgY29sbGVjdGlvblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKchSBJbnN0YWxsIGNvbnRlbnRcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDinIUgU3VibWl0IGNvbnRlbnRcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBFdmVyeXRoaW5nIGlzIHdvcmtpbmcgcHJvcGVybHkhYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cy5oYXNUb2tlbikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKaoO+4jyAqKkdpdEh1YiBUb2tlbiBJbnZhbGlkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBBIEdpdEh1YiB0b2tlbiB3YXMgZm91bmQgYnV0IGl0IGFwcGVhcnMgdG8gYmUgaW52YWxpZCBvciBleHBpcmVkLlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYCoqVG8gZml4IHRoaXM6KipcXG5gICtcbiAgICAgICAgICAgICAgICAgIGAxLiBTYXkgXCJzZXQgdXAgR2l0SHViXCIgdG8gYXV0aGVudGljYXRlIGFnYWluXFxuYCArXG4gICAgICAgICAgICAgICAgICBgMi4gT3IgY2hlY2sgeW91ciBHSVRIVUJfVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGVcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBOb3RlOiBCcm93c2UgYW5kIGluc3RhbGwgc3RpbGwgd29yayB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5SSICoqTm90IENvbm5lY3RlZCB0byBHaXRIdWIqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYFlvdSdyZSBub3QgY3VycmVudGx5IGF1dGhlbnRpY2F0ZWQgd2l0aCBHaXRIdWIuXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgKipXaGF0IHdvcmtzIHdpdGhvdXQgYXV0aDoqKlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKchSBCcm93c2UgdGhlIHB1YmxpYyBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgICBg4pyFIEluc3RhbGwgY29tbXVuaXR5IGNvbnRlbnRcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDinYwgU3VibWl0IHlvdXIgb3duIGNvbnRlbnQgKHJlcXVpcmVzIGF1dGgpXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgVG8gY29ubmVjdCwganVzdCBzYXkgXCJzZXQgdXAgR2l0SHViXCIgb3IgXCJjb25uZWN0IHRvIEdpdEh1YlwiYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNoZWNrIEdpdEh1YiBhdXRoJywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqVW5hYmxlIHRvIENoZWNrIEF1dGhlbnRpY2F0aW9uKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgRXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGNsZWFyR2l0SHViQXV0aCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5jbGVhckF1dGhlbnRpY2F0aW9uKCk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqR2l0SHViIERpc2Nvbm5lY3RlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYFlvdXIgR2l0SHViIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xlYXJlZC5cXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgKipXaGF0IHN0aWxsIHdvcmtzOioqXFxuYCArXG4gICAgICAgICAgICAgICAgYOKchSBCcm93c2UgdGhlIHB1YmxpYyBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgYOKchSBJbnN0YWxsIGNvbW11bml0eSBjb250ZW50XFxuYCArXG4gICAgICAgICAgICAgICAgYOKdjCBTdWJtaXQgY29udGVudCAocmVxdWlyZXMgcmVjb25uZWN0aW9uKVxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGBUbyByZWNvbm5lY3QgbGF0ZXIsIGp1c3Qgc2F5IFwiY29ubmVjdCB0byBHaXRIdWJcIlxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGDimqDvuI8gKipOb3RlOioqIFRvIGZ1bGx5IHJlbW92ZSBhdXRoZW50aWNhdGlvbiwgYWxzbyB1bnNldCB0aGUgR0lUSFVCX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlLmBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFyIEdpdEh1YiBhdXRoJywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqRmFpbGVkIHRvIENsZWFyIEF1dGhlbnRpY2F0aW9uKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgRXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQb2xsIGZvciBhdXRoIGNvbXBsZXRpb24gaW4gdGhlIGJhY2tncm91bmRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcG9sbEZvckF1dGhDb21wbGV0aW9uKGRldmljZUNvZGU6IHN0cmluZywgaW50ZXJ2YWw6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlblJlc3BvbnNlID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5wb2xsRm9yVG9rZW4oZGV2aWNlQ29kZSwgaW50ZXJ2YWwpO1xuICAgICAgY29uc3QgYXV0aFN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIuY29tcGxldGVBdXRoZW50aWNhdGlvbih0b2tlblJlc3BvbnNlKTtcbiAgICAgIFxuICAgICAgLy8gTG9nIHN1Y2Nlc3MgKHVzZXIgd2lsbCBzZWUgdGhpcyBpbiB0aGVpciBuZXh0IGludGVyYWN0aW9uKVxuICAgICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5JywgeyBcbiAgICAgICAgdXNlcm5hbWU6IGF1dGhTdGF0dXMudXNlcm5hbWUsXG4gICAgICAgIHNjb3BlczogYXV0aFN0YXR1cy5zY29wZXMgXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gTG9nIGVycm9yIGJ1dCBkb24ndCB0aHJvdyAtIHRoaXMgcnVucyBpbiBiYWNrZ3JvdW5kXG4gICAgICBsb2dnZXIuZXJyb3IoJ0dpdEh1YiBhdXRoZW50aWNhdGlvbiBwb2xsaW5nIGZhaWxlZCcsIHsgZXJyb3IgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hhdC1iYXNlZCBwZXJzb25hIG1hbmFnZW1lbnQgdG9vbHNcbiAgYXN5bmMgY3JlYXRlUGVyc29uYShuYW1lOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcsIGluc3RydWN0aW9uczogc3RyaW5nLCB0cmlnZ2Vycz86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBmaWVsZHNcbiAgICAgIGlmICghbmFtZSB8fCAhZGVzY3JpcHRpb24gfHwgIWluc3RydWN0aW9ucykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKk1pc3NpbmcgUmVxdWlyZWQgRmllbGRzKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgUGxlYXNlIHByb3ZpZGUgYWxsIHJlcXVpcmVkIGZpZWxkczpcXG5gICtcbiAgICAgICAgICAgICAgICBg4oCiICoqbmFtZSoqOiBEaXNwbGF5IG5hbWUgZm9yIHRoZSBwZXJzb25hXFxuYCArXG4gICAgICAgICAgICAgICAgYOKAoiAqKmRlc2NyaXB0aW9uKio6IEJyaWVmIGRlc2NyaXB0aW9uIG9mIHdoYXQgaXQgZG9lc1xcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgKippbnN0cnVjdGlvbnMqKjogVGhlIHBlcnNvbmEncyBiZWhhdmlvcmFsIGd1aWRlbGluZXNcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgKipPcHRpb25hbDoqKlxcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgKip0cmlnZ2VycyoqOiBDb21tYS1zZXBhcmF0ZWQga2V5d29yZHMgZm9yIGFjdGl2YXRpb25gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBTYW5pdGl6ZSBhbmQgdmFsaWRhdGUgaW5wdXRzXG4gICAgICBjb25zdCBzYW5pdGl6ZWROYW1lID0gc2FuaXRpemVJbnB1dChuYW1lLCAxMDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkRGVzY3JpcHRpb24gPSBzYW5pdGl6ZUlucHV0KGRlc2NyaXB0aW9uLCA1MDApO1xuICAgICAgY29uc3Qgc2FuaXRpemVkSW5zdHJ1Y3Rpb25zID0gc2FuaXRpemVJbnB1dChpbnN0cnVjdGlvbnMpO1xuICAgICAgY29uc3Qgc2FuaXRpemVkVHJpZ2dlcnMgPSB0cmlnZ2VycyA/IHNhbml0aXplSW5wdXQodHJpZ2dlcnMsIDIwMCkgOiAnJztcblxuICAgICAgLy8gVmFsaWRhdGUgbmFtZSBsZW5ndGggYW5kIGZvcm1hdFxuICAgICAgaWYgKHNhbml0aXplZE5hbWUubGVuZ3RoIDwgMikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BlcnNvbmEgbmFtZSBtdXN0IGJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyBsb25nJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIE5vIGNhdGVnb3J5IHZhbGlkYXRpb24gbmVlZGVkIC0gY2F0ZWdvcmllcyBhcmUgZGVwcmVjYXRlZFxuXG4gICAgICAvLyBWYWxpZGF0ZSBjb250ZW50IHNpemVzXG4gICAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKHNhbml0aXplZEluc3RydWN0aW9ucywgU0VDVVJJVFlfTElNSVRTLk1BWF9DT05URU5UX0xFTkdUSCk7XG4gICAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKHNhbml0aXplZERlc2NyaXB0aW9uLCAyMDAwKTsgLy8gMktCIG1heCBmb3IgZGVzY3JpcHRpb25cblxuICAgICAgLy8gVmFsaWRhdGUgY29udGVudCBmb3Igc2VjdXJpdHkgdGhyZWF0c1xuICAgICAgY29uc3QgbmFtZVZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoc2FuaXRpemVkTmFtZSk7XG4gICAgICBpZiAoIW5hbWVWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOYW1lIGNvbnRhaW5zIHByb2hpYml0ZWQgY29udGVudDogJHtuYW1lVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXNjVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShzYW5pdGl6ZWREZXNjcmlwdGlvbik7XG4gICAgICBpZiAoIWRlc2NWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEZXNjcmlwdGlvbiBjb250YWlucyBwcm9oaWJpdGVkIGNvbnRlbnQ6ICR7ZGVzY1ZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZShzYW5pdGl6ZWRJbnN0cnVjdGlvbnMpO1xuICAgICAgaWYgKCFpbnN0cnVjdGlvbnNWYWxpZGF0aW9uLmlzVmFsaWQgJiYgaW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3RydWN0aW9ucyBjb250YWluIHNlY3VyaXR5IHRocmVhdHM6ICR7aW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5kZXRlY3RlZFBhdHRlcm5zPy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZSBtZXRhZGF0YVxuICAgICAgY29uc3QgYXV0aG9yID0gdGhpcy5nZXRDdXJyZW50VXNlckZvckF0dHJpYnV0aW9uKCk7XG4gICAgICBjb25zdCB1bmlxdWVJZCA9IGdlbmVyYXRlVW5pcXVlSWQoc2FuaXRpemVkTmFtZSwgdGhpcy5jdXJyZW50VXNlciB8fCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSB2YWxpZGF0ZUZpbGVuYW1lKGAke3NsdWdpZnkoc2FuaXRpemVkTmFtZSl9Lm1kYCk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLnBlcnNvbmFzRGlyLCBmaWxlbmFtZSk7XG5cbiAgICAvLyBDaGVjayBpZiBmaWxlIGFscmVhZHkgZXhpc3RzXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFBhdGhWYWxpZGF0b3IudmFsaWRhdGVQZXJzb25hUGF0aChmaWxlUGF0aCk7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pqg77iPICoqUGVyc29uYSBBbHJlYWR5IEV4aXN0cyoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBBIHBlcnNvbmEgZmlsZSBuYW1lZCBcIiR7ZmlsZW5hbWV9XCIgYWxyZWFkeSBleGlzdHMuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgZWRpdF9wZXJzb25hXFxgIHRvIG1vZGlmeSBpdCwgb3IgY2hvb3NlIGEgZGlmZmVyZW50IG5hbWUuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgcHJvY2VlZCB3aXRoIGNyZWF0aW9uXG4gICAgfVxuXG4gICAgICAvLyBQYXJzZSBhbmQgc2FuaXRpemUgdHJpZ2dlcnNcbiAgICAgIGNvbnN0IHRyaWdnZXJMaXN0ID0gc2FuaXRpemVkVHJpZ2dlcnMgPyBcbiAgICAgICAgc2FuaXRpemVkVHJpZ2dlcnMuc3BsaXQoJywnKS5tYXAodCA9PiBzYW5pdGl6ZUlucHV0KHQudHJpbSgpLCA1MCkpLmZpbHRlcih0ID0+IHQubGVuZ3RoID4gMCkgOiBcbiAgICAgICAgW107XG5cbiAgICAgIC8vIENyZWF0ZSBwZXJzb25hIG1ldGFkYXRhIHdpdGggc2FuaXRpemVkIHZhbHVlc1xuICAgICAgY29uc3QgbWV0YWRhdGE6IFBlcnNvbmFNZXRhZGF0YSA9IHtcbiAgICAgICAgbmFtZTogc2FuaXRpemVkTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHNhbml0aXplZERlc2NyaXB0aW9uLFxuICAgICAgICB1bmlxdWVfaWQ6IHVuaXF1ZUlkLFxuICAgICAgICBhdXRob3IsXG4gICAgICAgIHRyaWdnZXJzOiB0cmlnZ2VyTGlzdCxcbiAgICAgICAgdmVyc2lvbjogXCIxLjBcIixcbiAgICAgICAgYWdlX3JhdGluZzogXCJhbGxcIixcbiAgICAgICAgY29udGVudF9mbGFnczogW1widXNlci1jcmVhdGVkXCJdLFxuICAgICAgICBhaV9nZW5lcmF0ZWQ6IHRydWUsXG4gICAgICAgIGdlbmVyYXRpb25fbWV0aG9kOiBcIkNsYXVkZVwiLFxuICAgICAgICBwcmljZTogXCJmcmVlXCIsXG4gICAgICAgIHJldmVudWVfc3BsaXQ6IFwiODAvMjBcIixcbiAgICAgICAgbGljZW5zZTogXCJDQy1CWS1TQS00LjBcIixcbiAgICAgICAgY3JlYXRlZF9kYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApXG4gICAgICB9O1xuXG4gICAgICAvLyBDcmVhdGUgZnVsbCBwZXJzb25hIGNvbnRlbnQgd2l0aCBzYW5pdGl6ZWQgdmFsdWVzXG4gICAgICBjb25zdCBmcm9udG1hdHRlciA9IE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IGAke2tleX06ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWApXG4gICAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgICAgY29uc3QgcGVyc29uYUNvbnRlbnQgPSBgLS0tXG4ke2Zyb250bWF0dGVyfVxuLS0tXG5cbiMgJHtzYW5pdGl6ZWROYW1lfVxuXG4ke3Nhbml0aXplZEluc3RydWN0aW9uc31cblxuIyMgUmVzcG9uc2UgU3R5bGVcbi0gRm9sbG93IHRoZSBiZWhhdmlvcmFsIGd1aWRlbGluZXMgYWJvdmVcbi0gTWFpbnRhaW4gY29uc2lzdGVuY3kgd2l0aCB0aGUgcGVyc29uYSdzIGNoYXJhY3RlclxuLSBBZGFwdCByZXNwb25zZXMgdG8gbWF0Y2ggdGhlIGludGVuZGVkIHB1cnBvc2VcblxuIyMgVXNhZ2UgTm90ZXNcbi0gQ3JlYXRlZCB2aWEgRG9sbGhvdXNlTUNQIGNoYXQgaW50ZXJmYWNlXG4tIEF1dGhvcjogJHthdXRob3J9XG4tIFZlcnNpb246IDEuMGA7XG5cbiAgICAgIC8vIFZhbGlkYXRlIGZpbmFsIGNvbnRlbnQgc2l6ZVxuICAgICAgdmFsaWRhdGVDb250ZW50U2l6ZShwZXJzb25hQ29udGVudCwgU0VDVVJJVFlfTElNSVRTLk1BWF9QRVJTT05BX1NJWkVfQllURVMpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBmaWxlIGxvY2tpbmcgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIGF3YWl0IEZpbGVMb2NrTWFuYWdlci53aXRoTG9jayhgcGVyc29uYToke3Nhbml0aXplZE5hbWV9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBEb3VibGUtY2hlY2sgZmlsZSBkb2Vzbid0IGV4aXN0IChpbiBjYXNlIG9mIHJhY2UgY29uZGl0aW9uKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQZXJzb25hIGZpbGUgXCIke2ZpbGVuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAvLyBJZiBlcnJvciBpcyBub3QgRU5PRU5UIChmaWxlIG5vdCBmb3VuZCksIHJlLXRocm93IGl0XG4gICAgICAgICAgaWYgKGVycm9yLmNvZGUgIT09ICdFTk9FTlQnICYmIGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBwcm9jZWVkXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFdyaXRlIHRoZSBmaWxlIGF0b21pY2FsbHlcbiAgICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShmaWxlUGF0aCwgcGVyc29uYUNvbnRlbnQpO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlbG9hZCBwZXJzb25hcyB0byBpbmNsdWRlIHRoZSBuZXcgb25lXG4gICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgKipQZXJzb25hIENyZWF0ZWQgU3VjY2Vzc2Z1bGx5ISoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGDwn46tICoqJHtzYW5pdGl6ZWROYW1lfSoqIGJ5ICR7YXV0aG9yfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+GlCBVbmlxdWUgSUQ6ICR7dW5pcXVlSWR9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5OEIFNhdmVkIGFzOiAke2ZpbGVuYW1lfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+TiiBUb3RhbCBwZXJzb25hczogJHt0aGlzLnBlcnNvbmFzLnNpemV9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGDwn46vICoqUmVhZHkgdG8gdXNlOioqIFxcYGFjdGl2YXRlX3BlcnNvbmEgXCIke3Nhbml0aXplZE5hbWV9XCJcXGBcXG5gICtcbiAgICAgICAgICAgICAgYPCfk6QgKipTaGFyZSBpdDoqKiBcXGBzdWJtaXRfY29udGVudCBcIiR7c2FuaXRpemVkTmFtZX1cIlxcYFxcbmAgK1xuICAgICAgICAgICAgICBg4pyP77iPICoqRWRpdCBpdDoqKiBcXGBlZGl0X3BlcnNvbmEgXCIke3Nhbml0aXplZE5hbWV9XCIgXCJmaWVsZFwiIFwibmV3IHZhbHVlXCJcXGBgLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipFcnJvciBDcmVhdGluZyBQZXJzb25hKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byB3cml0ZSBwZXJzb25hIGZpbGU6ICR7c2FuaXRpemVkLm1lc3NhZ2V9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgcGVybWlzc2lvbnMgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqVmFsaWRhdGlvbiBFcnJvcioqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGAke3Nhbml0aXplZC5tZXNzYWdlfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIGZpeCB0aGUgaXNzdWUgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGVkaXRQZXJzb25hKHBlcnNvbmFJZGVudGlmaWVyOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXBlcnNvbmFJZGVudGlmaWVyIHx8ICFmaWVsZCB8fCAhdmFsdWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKk1pc3NpbmcgUGFyYW1ldGVycyoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2FnZTogXFxgZWRpdF9wZXJzb25hIFwicGVyc29uYV9uYW1lXCIgXCJmaWVsZFwiIFwibmV3X3ZhbHVlXCJcXGBcXG5cXG5gICtcbiAgICAgICAgICAgICAgYCoqRWRpdGFibGUgZmllbGRzOioqXFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKipuYW1lKiogLSBEaXNwbGF5IG5hbWVcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAqKmRlc2NyaXB0aW9uKiogLSBCcmllZiBkZXNjcmlwdGlvblxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICoqaW5zdHJ1Y3Rpb25zKiogLSBNYWluIHBlcnNvbmEgY29udGVudFxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICoqdHJpZ2dlcnMqKiAtIENvbW1hLXNlcGFyYXRlZCBrZXl3b3Jkc1xcbmAgK1xuICAgICAgICAgICAgICBg4oCiICoqdmVyc2lvbioqIC0gVmVyc2lvbiBudW1iZXJgLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHBlcnNvbmFcbiAgICBsZXQgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHBlcnNvbmFJZGVudGlmaWVyKTtcbiAgICBcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNlYXJjaCBieSBuYW1lXG4gICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gXG4gICAgICAgIHAubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBwZXJzb25hSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqUGVyc29uYSBOb3QgRm91bmQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgcGVyc29uYTogXCIke3BlcnNvbmFJZGVudGlmaWVyfVwiXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgbGlzdF9wZXJzb25hc1xcYCB0byBzZWUgYXZhaWxhYmxlIHBlcnNvbmFzLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRGaWVsZHMgPSBbJ25hbWUnLCAnZGVzY3JpcHRpb24nLCAnaW5zdHJ1Y3Rpb25zJywgJ3RyaWdnZXJzJywgJ3ZlcnNpb24nXTtcbiAgICBpZiAoIXZhbGlkRmllbGRzLmluY2x1ZGVzKGZpZWxkLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipJbnZhbGlkIEZpZWxkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYEZpZWxkIFwiJHtmaWVsZH1cIiBpcyBub3QgZWRpdGFibGUuXFxuXFxuYCArXG4gICAgICAgICAgICAgIGAqKlZhbGlkIGZpZWxkczoqKiAke3ZhbGlkRmllbGRzLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciwgcGVyc29uYS5maWxlbmFtZSk7XG4gICAgbGV0IGlzRGVmYXVsdCA9IGlzRGVmYXVsdFBlcnNvbmEocGVyc29uYS5maWxlbmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gUmVhZCBjdXJyZW50IGZpbGVcbiAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgUGF0aFZhbGlkYXRvci5zYWZlUmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgXG4gICAgICAvLyBVc2Ugc2VjdXJlIFlBTUwgcGFyc2VyXG4gICAgICBsZXQgcGFyc2VkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkID0gU2VjdXJlWWFtbFBhcnNlci5zYWZlTWF0dGVyKGZpbGVDb250ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqU2VjdXJpdHkgRXJyb3IqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYENhbm5vdCBlZGl0IHBlcnNvbmEgZHVlIHRvIHNlY3VyaXR5IHRocmVhdDogJHtlcnJvci5tZXNzYWdlfWAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIElmIGVkaXRpbmcgYSBkZWZhdWx0IHBlcnNvbmEsIGNyZWF0ZSBhIGNvcHkgaW5zdGVhZFxuICAgICAgaWYgKGlzRGVmYXVsdCkge1xuICAgICAgICAvLyBHZW5lcmF0ZSB1bmlxdWUgSUQgZm9yIHRoZSBjb3B5XG4gICAgICAgIGNvbnN0IGF1dGhvciA9IHRoaXMuY3VycmVudFVzZXIgfHwgZ2VuZXJhdGVBbm9ueW1vdXNJZCgpO1xuICAgICAgICBjb25zdCB1bmlxdWVJZCA9IGdlbmVyYXRlVW5pcXVlSWQocGVyc29uYS5tZXRhZGF0YS5uYW1lLCBhdXRob3IpO1xuICAgICAgICBjb25zdCBuZXdGaWxlbmFtZSA9IGAke3VuaXF1ZUlkfS5tZGA7XG4gICAgICAgIGNvbnN0IG5ld0ZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMucGVyc29uYXNEaXIsIG5ld0ZpbGVuYW1lKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBjb3B5IG9mIHRoZSBkZWZhdWx0IHBlcnNvbmFcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IFBhdGhWYWxpZGF0b3Iuc2FmZVJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVzZSBmaWxlIGxvY2tpbmcgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2hlbiBjcmVhdGluZyB0aGUgY29weVxuICAgICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIud2l0aExvY2soYHBlcnNvbmE6JHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9LWNvcHlgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShuZXdGaWxlUGF0aCwgY29udGVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZpbGUgcGF0aCB0byBwb2ludCB0byB0aGUgY29weVxuICAgICAgICBmaWxlUGF0aCA9IG5ld0ZpbGVQYXRoO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHRoZSB1bmlxdWVfaWQgaW4gdGhlIG1ldGFkYXRhXG4gICAgICAgIHBhcnNlZC5kYXRhLnVuaXF1ZV9pZCA9IHVuaXF1ZUlkO1xuICAgICAgICBwYXJzZWQuZGF0YS5hdXRob3IgPSBhdXRob3I7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWVsZCA9IGZpZWxkLnRvTG93ZXJDYXNlKCk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBuZXcgdmFsdWUgZm9yIHNlY3VyaXR5IHRocmVhdHNcbiAgICAgIGNvbnN0IHZhbHVlVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZSh2YWx1ZSk7XG4gICAgICBpZiAoIXZhbHVlVmFsaWRhdGlvbi5pc1ZhbGlkICYmIHZhbHVlVmFsaWRhdGlvbi5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKlNlY3VyaXR5IFZhbGlkYXRpb24gRmFpbGVkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFRoZSBuZXcgdmFsdWUgY29udGFpbnMgcHJvaGliaXRlZCBjb250ZW50OlxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICR7dmFsdWVWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJ1xcbuKAoiAnKX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSByZW1vdmUgdGhlc2UgcGF0dGVybnMgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVc2Ugc2FuaXRpemVkIHZhbHVlIGlmIG5lZWRlZFxuICAgICAgbGV0IHNhbml0aXplZFZhbHVlID0gdmFsdWVWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgdmFsdWU7XG4gICAgICBcbiAgICAgIC8vIEFsd2F5cyByZW1vdmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMgZnJvbSBkaXNwbGF5IG91dHB1dFxuICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gc2FuaXRpemVkVmFsdWUucmVwbGFjZSgvWzsmfGAkKCldL2csICcnKTtcbiAgICAgIFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ2luc3RydWN0aW9ucycpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBtYWluIGNvbnRlbnRcbiAgICAgICAgcGFyc2VkLmNvbnRlbnQgPSBzYW5pdGl6ZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZEZpZWxkID09PSAndHJpZ2dlcnMnKSB7XG4gICAgICAgIC8vIFBhcnNlIHRyaWdnZXJzIGFzIGNvbW1hLXNlcGFyYXRlZCBsaXN0XG4gICAgICAgIHBhcnNlZC5kYXRhW25vcm1hbGl6ZWRGaWVsZF0gPSBzYW5pdGl6ZWRWYWx1ZS5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKS5maWx0ZXIodCA9PiB0Lmxlbmd0aCA+IDApO1xuICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkRmllbGQgPT09ICdjYXRlZ29yeScpIHtcbiAgICAgICAgLy8gQ2F0ZWdvcnkgZmllbGQgaXMgZGVwcmVjYXRlZCBidXQgc3RpbGwgZWRpdGFibGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgcGFyc2VkLmRhdGFbbm9ybWFsaXplZEZpZWxkXSA9IHNhbml0aXplZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlIG1ldGFkYXRhIGZpZWxkXG4gICAgICAgIC8vIEZvciBuYW1lIGZpZWxkLCBhcHBseSBhZGRpdGlvbmFsIHNhbml0aXphdGlvbiB0byByZW1vdmUgc2hlbGwgbWV0YWNoYXJhY3RlcnNcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ25hbWUnKSB7XG4gICAgICAgICAgcGFyc2VkLmRhdGFbbm9ybWFsaXplZEZpZWxkXSA9IHNhbml0aXplSW5wdXQoc2FuaXRpemVkVmFsdWUsIDEwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyc2VkLmRhdGFbbm9ybWFsaXplZEZpZWxkXSA9IHNhbml0aXplZFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB2ZXJzaW9uIGFuZCBtb2RpZmljYXRpb24gaW5mb1xuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWVsZCAhPT0gJ3ZlcnNpb24nKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gcGFyc2VkLmRhdGEudmVyc2lvbiB8fCAnMS4wJztcbiAgICAgICAgY29uc3QgdmVyc2lvblBhcnRzID0gY3VycmVudFZlcnNpb24uc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgdmVyc2lvblBhcnRzWzFdID0gKHZlcnNpb25QYXJ0c1sxXSB8fCAwKSArIDE7XG4gICAgICAgIHBhcnNlZC5kYXRhLnZlcnNpb24gPSB2ZXJzaW9uUGFydHMuam9pbignLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWdlbmVyYXRlIGZpbGUgY29udGVudFxuICAgICAgLy8gVXNlIHNlY3VyZSBZQU1MIHN0cmluZ2lmaWNhdGlvblxuICAgICAgY29uc3Qgc2VjdXJlUGFyc2VyID0gU2VjdXJlWWFtbFBhcnNlci5jcmVhdGVTZWN1cmVNYXR0ZXJQYXJzZXIoKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gc2VjdXJlUGFyc2VyLnN0cmluZ2lmeShwYXJzZWQuY29udGVudCwgcGFyc2VkLmRhdGEpO1xuICAgICAgXG4gICAgICAvLyBVc2UgZmlsZSBsb2NraW5nIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIud2l0aExvY2soYHBlcnNvbmE6JHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBXcml0ZSB1cGRhdGVkIGZpbGUgYXRvbWljYWxseVxuICAgICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKGZpbGVQYXRoLCB1cGRhdGVkQ29udGVudCk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmVsb2FkIHBlcnNvbmFzXG4gICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgKipQZXJzb25hIFVwZGF0ZWQgU3VjY2Vzc2Z1bGx5ISoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIChpc0RlZmF1bHQgPyBg8J+TiyAqKk5vdGU6KiogQ3JlYXRlZCBhIGNvcHkgb2YgdGhlIGRlZmF1bHQgcGVyc29uYSB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwuXFxuXFxuYCA6ICcnKSArXG4gICAgICAgICAgICAgIGDwn46tICoqJHsocGFyc2VkLmRhdGEubmFtZSB8fCBwZXJzb25hLm1ldGFkYXRhLm5hbWUgfHwgJycpLnJlcGxhY2UoL1s7JnxgJCgpXS9nLCAnJyl9KipcXG5gICtcbiAgICAgICAgICAgICAgYPCfk50gKipGaWVsZCBVcGRhdGVkOioqICR7ZmllbGR9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5SEICoqTmV3IFZhbHVlOioqICR7bm9ybWFsaXplZEZpZWxkID09PSAnaW5zdHJ1Y3Rpb25zJyA/ICdDb250ZW50IHVwZGF0ZWQnIDogZGlzcGxheVZhbHVlfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+TiiAqKlZlcnNpb246KiogJHtwYXJzZWQuZGF0YS52ZXJzaW9ufVxcbmAgK1xuICAgICAgICAgICAgICAoaXNEZWZhdWx0ID8gYPCfhpQgKipOZXcgSUQ6KiogJHtwYXJzZWQuZGF0YS51bmlxdWVfaWR9XFxuYCA6ICcnKSArXG4gICAgICAgICAgICAgIGBcXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBnZXRfcGVyc29uYV9kZXRhaWxzIFwiJHsocGFyc2VkLmRhdGEubmFtZSB8fCBwZXJzb25hLm1ldGFkYXRhLm5hbWUgfHwgJycpLnJlcGxhY2UoL1s7JnxgJCgpXS9nLCAnJyl9XCJcXGAgdG8gc2VlIGFsbCBjaGFuZ2VzLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKkVycm9yIFVwZGF0aW5nIFBlcnNvbmEqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBwZXJzb25hOiAke3Nhbml0aXplZC5tZXNzYWdlfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIGNoZWNrIGZpbGUgcGVybWlzc2lvbnMgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlUGVyc29uYShwZXJzb25hSWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgaWYgKCFwZXJzb25hSWRlbnRpZmllcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqTWlzc2luZyBQZXJzb25hIElkZW50aWZpZXIqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVXNhZ2U6IFxcYHZhbGlkYXRlX3BlcnNvbmEgXCJwZXJzb25hX25hbWVcIlxcYFxcblxcbmAgK1xuICAgICAgICAgICAgICBgVXNlIFxcYGxpc3RfcGVyc29uYXNcXGAgdG8gc2VlIGF2YWlsYWJsZSBwZXJzb25hcy5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHBlcnNvbmFcbiAgICBsZXQgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHBlcnNvbmFJZGVudGlmaWVyKTtcbiAgICBcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNlYXJjaCBieSBuYW1lXG4gICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gXG4gICAgICAgIHAubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBwZXJzb25hSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqUGVyc29uYSBOb3QgRm91bmQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgcGVyc29uYTogXCIke3BlcnNvbmFJZGVudGlmaWVyfVwiXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgbGlzdF9wZXJzb25hc1xcYCB0byBzZWUgYXZhaWxhYmxlIHBlcnNvbmFzLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGlvbiBjaGVja3NcbiAgICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbWV0YWRhdGEgPSBwZXJzb25hLm1ldGFkYXRhO1xuXG4gICAgLy8gUmVxdWlyZWQgZmllbGQgY2hlY2tzXG4gICAgaWYgKCFtZXRhZGF0YS5uYW1lIHx8IG1ldGFkYXRhLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaXNzdWVzLnB1c2goXCJNaXNzaW5nIG9yIGVtcHR5ICduYW1lJyBmaWVsZFwiKTtcbiAgICB9XG4gICAgaWYgKCFtZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCBtZXRhZGF0YS5kZXNjcmlwdGlvbi50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICBpc3N1ZXMucHVzaChcIk1pc3Npbmcgb3IgZW1wdHkgJ2Rlc2NyaXB0aW9uJyBmaWVsZFwiKTtcbiAgICB9XG4gICAgaWYgKCFwZXJzb25hLmNvbnRlbnQgfHwgcGVyc29uYS5jb250ZW50LnRyaW0oKS5sZW5ndGggPCA1MCkge1xuICAgICAgaXNzdWVzLnB1c2goXCJQZXJzb25hIGNvbnRlbnQgaXMgdG9vIHNob3J0IChtaW5pbXVtIDUwIGNoYXJhY3RlcnMpXCIpO1xuICAgIH1cblxuICAgIC8vIENhdGVnb3J5IHZhbGlkYXRpb25cbiAgICBjb25zdCB2YWxpZENhdGVnb3JpZXMgPSBbJ2NyZWF0aXZlJywgJ3Byb2Zlc3Npb25hbCcsICdlZHVjYXRpb25hbCcsICdnYW1pbmcnLCAncGVyc29uYWwnLCAnZ2VuZXJhbCddO1xuICAgIGlmIChtZXRhZGF0YS5jYXRlZ29yeSAmJiAhdmFsaWRDYXRlZ29yaWVzLmluY2x1ZGVzKG1ldGFkYXRhLmNhdGVnb3J5KSkge1xuICAgICAgaXNzdWVzLnB1c2goYEludmFsaWQgY2F0ZWdvcnkgJyR7bWV0YWRhdGEuY2F0ZWdvcnl9Jy4gTXVzdCBiZSBvbmUgb2Y6ICR7dmFsaWRDYXRlZ29yaWVzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gQWdlIHJhdGluZyB2YWxpZGF0aW9uXG4gICAgY29uc3QgdmFsaWRBZ2VSYXRpbmdzID0gWydhbGwnLCAnMTMrJywgJzE4KyddO1xuICAgIGlmIChtZXRhZGF0YS5hZ2VfcmF0aW5nICYmICF2YWxpZEFnZVJhdGluZ3MuaW5jbHVkZXMobWV0YWRhdGEuYWdlX3JhdGluZykpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgYWdlX3JhdGluZyAnJHttZXRhZGF0YS5hZ2VfcmF0aW5nfScuIFNob3VsZCBiZSBvbmUgb2Y6ICR7dmFsaWRBZ2VSYXRpbmdzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gT3B0aW9uYWwgZmllbGQgd2FybmluZ3NcbiAgICBpZiAoIW1ldGFkYXRhLnRyaWdnZXJzIHx8IG1ldGFkYXRhLnRyaWdnZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2FybmluZ3MucHVzaChcIk5vIHRyaWdnZXIga2V5d29yZHMgZGVmaW5lZCAtIHVzZXJzIG1heSBoYXZlIGRpZmZpY3VsdHkgZmluZGluZyB0aGlzIHBlcnNvbmFcIik7XG4gICAgfVxuICAgIGlmICghbWV0YWRhdGEudmVyc2lvbikge1xuICAgICAgd2FybmluZ3MucHVzaChcIk5vIHZlcnNpb24gc3BlY2lmaWVkIC0gZGVmYXVsdGluZyB0byAnMS4wJ1wiKTtcbiAgICB9XG4gICAgaWYgKCFtZXRhZGF0YS51bmlxdWVfaWQpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJObyB1bmlxdWVfaWQgLSBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseVwiKTtcbiAgICB9XG5cbiAgICAvLyBDb250ZW50IHF1YWxpdHkgY2hlY2tzXG4gICAgaWYgKHBlcnNvbmEuY29udGVudC5sZW5ndGggPiA1MDAwKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKFwiUGVyc29uYSBjb250ZW50IGlzIHZlcnkgbG9uZyAtIGNvbnNpZGVyIGJyZWFraW5nIGl0IGludG8gc2VjdGlvbnNcIik7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YS5uYW1lICYmIG1ldGFkYXRhLm5hbWUubGVuZ3RoID4gNTApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJQZXJzb25hIG5hbWUgaXMgdmVyeSBsb25nIC0gY29uc2lkZXIgc2hvcnRlbmluZyBmb3IgYmV0dGVyIGRpc3BsYXlcIik7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YS5kZXNjcmlwdGlvbiAmJiBtZXRhZGF0YS5kZXNjcmlwdGlvbi5sZW5ndGggPiAyMDApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJEZXNjcmlwdGlvbiBpcyB2ZXJ5IGxvbmcgLSBjb25zaWRlciBrZWVwaW5nIGl0IHVuZGVyIDIwMCBjaGFyYWN0ZXJzXCIpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIHZhbGlkYXRpb24gcmVwb3J0XG4gICAgbGV0IHJlcG9ydCA9IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCfk4sgKipWYWxpZGF0aW9uIFJlcG9ydDogJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9KipcXG5cXG5gO1xuICAgIFxuICAgIGlmIChpc3N1ZXMubGVuZ3RoID09PSAwICYmIHdhcm5pbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmVwb3J0ICs9IGDinIUgKipBbGwgQ2hlY2tzIFBhc3NlZCEqKlxcblxcbmAgK1xuICAgICAgICBg8J+OrSAqKlBlcnNvbmE6KiogJHttZXRhZGF0YS5uYW1lfVxcbmAgK1xuICAgICAgICBg8J+TgSAqKkNhdGVnb3J5OioqICR7bWV0YWRhdGEuY2F0ZWdvcnkgfHwgJ2dlbmVyYWwnfVxcbmAgK1xuICAgICAgICBg8J+TiiAqKlZlcnNpb246KiogJHttZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAnfVxcbmAgK1xuICAgICAgICBg8J+TnSAqKkNvbnRlbnQgTGVuZ3RoOioqICR7cGVyc29uYS5jb250ZW50Lmxlbmd0aH0gY2hhcmFjdGVyc1xcbmAgK1xuICAgICAgICBg8J+UlyAqKlRyaWdnZXJzOioqICR7bWV0YWRhdGEudHJpZ2dlcnM/Lmxlbmd0aCB8fCAwfSBrZXl3b3Jkc1xcblxcbmAgK1xuICAgICAgICBgVGhpcyBwZXJzb25hIG1lZXRzIGFsbCB2YWxpZGF0aW9uIHJlcXVpcmVtZW50cyBhbmQgaXMgcmVhZHkgZm9yIHVzZSFgO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGDinYwgKipJc3N1ZXMgRm91bmQgKCR7aXNzdWVzLmxlbmd0aH0pOioqXFxuYDtcbiAgICAgICAgaXNzdWVzLmZvckVhY2goKGlzc3VlLCBpKSA9PiB7XG4gICAgICAgICAgcmVwb3J0ICs9IGAgICAke2kgKyAxfS4gJHtpc3N1ZX1cXG5gO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuXG4gICAgICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXBvcnQgKz0gYOKaoO+4jyAqKldhcm5pbmdzICgke3dhcm5pbmdzLmxlbmd0aH0pOioqXFxuYDtcbiAgICAgICAgd2FybmluZ3MuZm9yRWFjaCgod2FybmluZywgaSkgPT4ge1xuICAgICAgICAgIHJlcG9ydCArPSBgICAgJHtpICsgMX0uICR7d2FybmluZ31cXG5gO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGAqKlJlY29tbWVuZGF0aW9uOioqIEZpeCB0aGUgaXNzdWVzIGFib3ZlIGJlZm9yZSB1c2luZyB0aGlzIHBlcnNvbmEuXFxuYDtcbiAgICAgICAgcmVwb3J0ICs9IGBVc2UgXFxgZWRpdF9wZXJzb25hIFwiJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9XCIgXCJmaWVsZFwiIFwidmFsdWVcIlxcYCB0byBtYWtlIGNvcnJlY3Rpb25zLmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXBvcnQgKz0gYCoqU3RhdHVzOioqIFBlcnNvbmEgaXMgZnVuY3Rpb25hbCBidXQgY291bGQgYmUgaW1wcm92ZWQuXFxuYDtcbiAgICAgICAgcmVwb3J0ICs9IGBBZGRyZXNzIHdhcm5pbmdzIGFib3ZlIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlLmA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHJlcG9ydCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIHJldHJ5TmV0d29ya09wZXJhdGlvbiBpcyBub3cgaGFuZGxlZCBieSBVcGRhdGVDaGVja2VyXG5cbiAgLy8gQXV0by11cGRhdGUgbWFuYWdlbWVudCB0b29sc1xuICBhc3luYyBjaGVja0ZvclVwZGF0ZXMoKSB7XG4gICAgaWYgKCF0aGlzLnVwZGF0ZU1hbmFnZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSArIFwi4p2MIFVwZGF0ZSBmdW5jdGlvbmFsaXR5IG5vdCBhdmFpbGFibGUgKGluaXRpYWxpemF0aW9uIGZhaWxlZClcIiB9XVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgeyB0ZXh0IH0gPSBhd2FpdCB0aGlzLnVwZGF0ZU1hbmFnZXIuY2hlY2tGb3JVcGRhdGVzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSArIHRleHQgfV1cbiAgICB9O1xuICB9XG5cbiAgLy8gVXBkYXRlIGhlbHBlciBtZXRob2RzIGFyZSBub3cgaGFuZGxlZCBieSBVcGRhdGVNYW5hZ2VyXG5cbiAgYXN5bmMgdXBkYXRlU2VydmVyKGNvbmZpcm06IGJvb2xlYW4pIHtcbiAgICBpZiAoIWNvbmZpcm0pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkgKyBcbiAgICAgICAgICAgICfimqDvuI8gKipVcGRhdGUgQ29uZmlybWF0aW9uIFJlcXVpcmVkKipcXG5cXG4nICtcbiAgICAgICAgICAgICdUbyBwcm9jZWVkIHdpdGggdGhlIHVwZGF0ZSwgeW91IG11c3QgY29uZmlybTpcXG4nICtcbiAgICAgICAgICAgICdgdXBkYXRlX3NlcnZlciB0cnVlYFxcblxcbicgK1xuICAgICAgICAgICAgJyoqV2hhdCB3aWxsIGhhcHBlbjoqKlxcbicgK1xuICAgICAgICAgICAgJ+KAoiBCYWNrdXAgY3VycmVudCB2ZXJzaW9uXFxuJyArXG4gICAgICAgICAgICAn4oCiIFB1bGwgbGF0ZXN0IGNoYW5nZXMgZnJvbSBHaXRIdWJcXG4nICtcbiAgICAgICAgICAgICfigKIgVXBkYXRlIGRlcGVuZGVuY2llc1xcbicgK1xuICAgICAgICAgICAgJ+KAoiBSZWJ1aWxkIFR5cGVTY3JpcHRcXG4nICtcbiAgICAgICAgICAgICfigKIgUmVzdGFydCBzZXJ2ZXIgKHdpbGwgZGlzY29ubmVjdCB0ZW1wb3JhcmlseSlcXG5cXG4nICtcbiAgICAgICAgICAgICcqKlByZXJlcXVpc2l0ZXM6KipcXG4nICtcbiAgICAgICAgICAgICfigKIgR2l0IHJlcG9zaXRvcnkgbXVzdCBiZSBjbGVhbiAobm8gdW5jb21taXR0ZWQgY2hhbmdlcylcXG4nICtcbiAgICAgICAgICAgICfigKIgTmV0d29yayBjb25uZWN0aW9uIHJlcXVpcmVkXFxuJyArXG4gICAgICAgICAgICAn4oCiIFN1ZmZpY2llbnQgZGlzayBzcGFjZSBmb3IgYmFja3VwJ1xuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudXBkYXRlTWFuYWdlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpICsgXCLinYwgVXBkYXRlIGZ1bmN0aW9uYWxpdHkgbm90IGF2YWlsYWJsZSAoaW5pdGlhbGl6YXRpb24gZmFpbGVkKVwiIH1dXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB7IHRleHQgfSA9IGF3YWl0IHRoaXMudXBkYXRlTWFuYWdlci51cGRhdGVTZXJ2ZXIoY29uZmlybSwgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dCB9XVxuICAgIH07XG4gIH1cblxuICAvLyBSb2xsYmFjayBoZWxwZXIgbWV0aG9kcyBhcmUgbm93IGhhbmRsZWQgYnkgVXBkYXRlTWFuYWdlclxuXG4gIGFzeW5jIHJvbGxiYWNrVXBkYXRlKGNvbmZpcm06IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMudXBkYXRlTWFuYWdlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpICsgXCLinYwgVXBkYXRlIGZ1bmN0aW9uYWxpdHkgbm90IGF2YWlsYWJsZSAoaW5pdGlhbGl6YXRpb24gZmFpbGVkKVwiIH1dXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCB7IHRleHQgfSA9IGF3YWl0IHRoaXMudXBkYXRlTWFuYWdlci5yb2xsYmFja1VwZGF0ZShjb25maXJtLCB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dXG4gICAgfTtcbiAgfVxuXG4gIC8vIFZlcnNpb24gYW5kIGdpdCBpbmZvIG1ldGhvZHMgYXJlIG5vdyBoYW5kbGVkIGJ5IFVwZGF0ZU1hbmFnZXJcblxuICAvLyBTdGF0dXMgaGVscGVyIG1ldGhvZHMgYXJlIG5vdyBoYW5kbGVkIGJ5IFVwZGF0ZU1hbmFnZXJcblxuICBhc3luYyBnZXRTZXJ2ZXJTdGF0dXMoKSB7XG4gICAgLy8gQWRkIHBlcnNvbmEgaW5mb3JtYXRpb24gdG8gdGhlIHN0YXR1c1xuICAgIGNvbnN0IHBlcnNvbmFJbmZvID0gYFxuKirwn46tIFBlcnNvbmEgSW5mb3JtYXRpb246KipcbuKAoiAqKlRvdGFsIFBlcnNvbmFzOioqICR7dGhpcy5wZXJzb25hcy5zaXplfVxu4oCiICoqQWN0aXZlIFBlcnNvbmE6KiogJHt0aGlzLmFjdGl2ZVBlcnNvbmEgfHwgJ05vbmUnfVxu4oCiICoqVXNlciBJZGVudGl0eToqKiAke3RoaXMuY3VycmVudFVzZXIgfHwgJ0Fub255bW91cyd9XG7igKIgKipQZXJzb25hcyBEaXJlY3Rvcnk6KiogJHt0aGlzLnBlcnNvbmFzRGlyfWA7XG4gICAgXG4gICAgaWYgKCF0aGlzLnVwZGF0ZU1hbmFnZXIpIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBVcGRhdGUgZnVuY3Rpb25hbGl0eSBub3QgYXZhaWxhYmxlIChpbml0aWFsaXphdGlvbiBmYWlsZWQpXFxuXFxuJHtwZXJzb25hSW5mb31gO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGVycm9yTWVzc2FnZSB9XVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgeyB0ZXh0IH0gPSBhd2FpdCB0aGlzLnVwZGF0ZU1hbmFnZXIuZ2V0U2VydmVyU3RhdHVzKHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICAvLyBJbnNlcnQgcGVyc29uYSBpbmZvIGludG8gdGhlIHN0YXR1cyB0ZXh0XG4gICAgY29uc3QgdXBkYXRlZFRleHQgPSB0ZXh0LnJlcGxhY2UoJyoqQXZhaWxhYmxlIENvbW1hbmRzOioqJywgcGVyc29uYUluZm8gKyAnXFxuXFxuKipBdmFpbGFibGUgQ29tbWFuZHM6KionKTtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IHVwZGF0ZWRUZXh0IH1dXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNvbnZlcnRUb0dpdEluc3RhbGxhdGlvbih0YXJnZXREaXI/OiBzdHJpbmcsIGNvbmZpcm06IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICghdGhpcy51cGRhdGVNYW5hZ2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dDogdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkgKyBcIuKdjCBVcGRhdGUgZnVuY3Rpb25hbGl0eSBub3QgYXZhaWxhYmxlIChpbml0aWFsaXphdGlvbiBmYWlsZWQpXCIgfV1cbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudXBkYXRlTWFuYWdlci5jb252ZXJ0VG9HaXRJbnN0YWxsYXRpb24odGFyZ2V0RGlyLCBjb25maXJtLCB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiByZXN1bHQudGV4dCB9XVxuICAgIH07XG4gIH1cblxuICAvLyBWZXJzaW9uIGFuZCBkZXBlbmRlbmN5IG1ldGhvZHMgYXJlIG5vdyBoYW5kbGVkIGJ5IFVwZGF0ZU1hbmFnZXJcblxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgaW5kaWNhdG9yIHNldHRpbmdzXG4gICAqL1xuICBhc3luYyBjb25maWd1cmVJbmRpY2F0b3IoY29uZmlnOiBQYXJ0aWFsPEluZGljYXRvckNvbmZpZz4pIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXBkYXRlIHRoZSBjb25maWd1cmF0aW9uXG4gICAgICBpZiAoY29uZmlnLmVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5lbmFibGVkID0gY29uZmlnLmVuYWJsZWQ7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnN0eWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuc3R5bGUgPSBjb25maWcuc3R5bGU7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmN1c3RvbUZvcm1hdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIGN1c3RvbSBmb3JtYXQgYmVmb3JlIGFwcGx5aW5nXG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZUN1c3RvbUZvcm1hdChjb25maWcuY3VzdG9tRm9ybWF0KTtcbiAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbnZhbGlkIGN1c3RvbSBmb3JtYXQ6ICR7dmFsaWRhdGlvbi5lcnJvcn1gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLmN1c3RvbUZvcm1hdCA9IGNvbmZpZy5jdXN0b21Gb3JtYXQ7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnNob3dWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd1ZlcnNpb24gPSBjb25maWcuc2hvd1ZlcnNpb247XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnNob3dBdXRob3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5zaG93QXV0aG9yID0gY29uZmlnLnNob3dBdXRob3I7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLnNob3dDYXRlZ29yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dDYXRlZ29yeSA9IGNvbmZpZy5zaG93Q2F0ZWdvcnk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmVtb2ppICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuZW1vamkgPSBjb25maWcuZW1vamk7XG4gICAgICB9XG4gICAgICBpZiAoY29uZmlnLmJyYWNrZXRTdHlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLmJyYWNrZXRTdHlsZSA9IGNvbmZpZy5icmFja2V0U3R5bGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3cgZXhhbXBsZSBvZiB3aGF0IHRoZSBpbmRpY2F0b3Igd291bGQgbG9vayBsaWtlXG4gICAgICBsZXQgZXhhbXBsZUluZGljYXRvciA9IFwiXCI7XG4gICAgICBpZiAodGhpcy5hY3RpdmVQZXJzb25hKSB7XG4gICAgICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh0aGlzLmFjdGl2ZVBlcnNvbmEpO1xuICAgICAgICBpZiAocGVyc29uYSkge1xuICAgICAgICAgIGV4YW1wbGVJbmRpY2F0b3IgPSBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgICAgICAgIG5hbWU6IHBlcnNvbmEubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICAgIHZlcnNpb246IHBlcnNvbmEubWV0YWRhdGEudmVyc2lvbixcbiAgICAgICAgICAgIGF1dGhvcjogcGVyc29uYS5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgICAgICBjYXRlZ29yeTogcGVyc29uYS5tZXRhZGF0YS5jYXRlZ29yeVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTaG93IGV4YW1wbGUgd2l0aCBzYW1wbGUgZGF0YVxuICAgICAgICBleGFtcGxlSW5kaWNhdG9yID0gZm9ybWF0SW5kaWNhdG9yKHRoaXMuaW5kaWNhdG9yQ29uZmlnLCB7XG4gICAgICAgICAgbmFtZTogXCJFeGFtcGxlIFBlcnNvbmFcIixcbiAgICAgICAgICB2ZXJzaW9uOiBcIjEuMFwiLFxuICAgICAgICAgIGF1dGhvcjogXCJAdXNlcm5hbWVcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJjcmVhdGl2ZVwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgSW5kaWNhdG9yIGNvbmZpZ3VyYXRpb24gdXBkYXRlZCBzdWNjZXNzZnVsbHkhXG5cbkN1cnJlbnQgc2V0dGluZ3M6XG4tIEVuYWJsZWQ6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuZW5hYmxlZH1cbi0gU3R5bGU6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc3R5bGV9XG4tIFNob3cgVmVyc2lvbjogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93VmVyc2lvbn1cbi0gU2hvdyBBdXRob3I6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd0F1dGhvcn1cbi0gU2hvdyBDYXRlZ29yeTogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93Q2F0ZWdvcnl9XG4tIEVtb2ppOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmVtb2ppfVxuLSBCcmFja2V0czogJHt0aGlzLmluZGljYXRvckNvbmZpZy5icmFja2V0U3R5bGV9XG4ke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmN1c3RvbUZvcm1hdCA/IGAtIEN1c3RvbSBGb3JtYXQ6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuY3VzdG9tRm9ybWF0fWAgOiAnJ31cblxuRXhhbXBsZSBpbmRpY2F0b3I6ICR7ZXhhbXBsZUluZGljYXRvciB8fCBcIihub25lIC0gaW5kaWNhdG9ycyBkaXNhYmxlZClcIn1cblxuTm90ZTogQ29uZmlndXJhdGlvbiBpcyB0ZW1wb3JhcnkgZm9yIHRoaXMgc2Vzc2lvbi4gVG8gbWFrZSBwZXJtYW5lbnQsIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfRU5BQkxFRD10cnVlL2ZhbHNlXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfU1RZTEU9ZnVsbC9taW5pbWFsL2NvbXBhY3QvY3VzdG9tXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfRk9STUFUPVwiY3VzdG9tIGZvcm1hdCB0ZW1wbGF0ZVwiXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfU0hPV19WRVJTSU9OPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX0FVVEhPUj10cnVlL2ZhbHNlXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfU0hPV19DQVRFR09SWT10cnVlL2ZhbHNlXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfRU1PSkk98J+OrVxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX0JSQUNLRVRTPXNxdWFyZS9yb3VuZC9jdXJseS9hbmdsZS9ub25lYFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEVycm9yIGNvbmZpZ3VyaW5nIGluZGljYXRvcjogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBpbmRpY2F0b3IgY29uZmlndXJhdGlvblxuICAgKi9cbiAgYXN5bmMgZ2V0SW5kaWNhdG9yQ29uZmlnKCkge1xuICAgIC8vIFNob3cgY3VycmVudCBjb25maWd1cmF0aW9uIGFuZCBleGFtcGxlXG4gICAgbGV0IGV4YW1wbGVJbmRpY2F0b3IgPSBcIlwiO1xuICAgIGlmICh0aGlzLmFjdGl2ZVBlcnNvbmEpIHtcbiAgICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh0aGlzLmFjdGl2ZVBlcnNvbmEpO1xuICAgICAgaWYgKHBlcnNvbmEpIHtcbiAgICAgICAgZXhhbXBsZUluZGljYXRvciA9IGZvcm1hdEluZGljYXRvcih0aGlzLmluZGljYXRvckNvbmZpZywge1xuICAgICAgICAgIG5hbWU6IHBlcnNvbmEubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB2ZXJzaW9uOiBwZXJzb25hLm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgICAgYXV0aG9yOiBwZXJzb25hLm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgICBjYXRlZ29yeTogcGVyc29uYS5tZXRhZGF0YS5jYXRlZ29yeVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2hvdyBleGFtcGxlIHdpdGggc2FtcGxlIGRhdGFcbiAgICAgIGV4YW1wbGVJbmRpY2F0b3IgPSBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgICAgbmFtZTogXCJFeGFtcGxlIFBlcnNvbmFcIixcbiAgICAgICAgdmVyc2lvbjogXCIxLjBcIixcbiAgICAgICAgYXV0aG9yOiBcIkB1c2VybmFtZVwiLFxuICAgICAgICBjYXRlZ29yeTogXCJjcmVhdGl2ZVwiXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+TiiBDdXJyZW50IEluZGljYXRvciBDb25maWd1cmF0aW9uOlxuXG5TZXR0aW5nczpcbi0gRW5hYmxlZDogJHt0aGlzLmluZGljYXRvckNvbmZpZy5lbmFibGVkfVxuLSBTdHlsZTogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zdHlsZX1cbi0gU2hvdyBWZXJzaW9uOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dWZXJzaW9ufVxuLSBTaG93IEF1dGhvcjogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93QXV0aG9yfVxuLSBTaG93IENhdGVnb3J5OiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dDYXRlZ29yeX1cbi0gRW1vamk6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuZW1vaml9XG4tIEJyYWNrZXRzOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmJyYWNrZXRTdHlsZX1cbi0gU2VwYXJhdG9yOiBcIiR7dGhpcy5pbmRpY2F0b3JDb25maWcuc2VwYXJhdG9yfVwiXG4ke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmN1c3RvbUZvcm1hdCA/IGAtIEN1c3RvbSBGb3JtYXQ6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuY3VzdG9tRm9ybWF0fWAgOiAnJ31cblxuQXZhaWxhYmxlIHN0eWxlczpcbi0gZnVsbDogW/Cfjq0gUGVyc29uYSBOYW1lIHYxLjAgYnkgQGF1dGhvcl1cbi0gbWluaW1hbDog8J+OrSBQZXJzb25hIE5hbWVcbi0gY29tcGFjdDogW1BlcnNvbmEgTmFtZSB2MS4wXVxuLSBjdXN0b206IFVzZSB5b3VyIG93biBmb3JtYXQgd2l0aCBwbGFjZWhvbGRlcnNcblxuRXhhbXBsZSB3aXRoIGN1cnJlbnQgc2V0dGluZ3M6ICR7ZXhhbXBsZUluZGljYXRvciB8fCBcIihub25lIC0gaW5kaWNhdG9ycyBkaXNhYmxlZClcIn1cblxuUGxhY2Vob2xkZXJzIGZvciBjdXN0b20gZm9ybWF0OlxuLSB7ZW1vaml9IC0gVGhlIGNvbmZpZ3VyZWQgZW1vamlcbi0ge25hbWV9IC0gUGVyc29uYSBuYW1lXG4tIHt2ZXJzaW9ufSAtIFBlcnNvbmEgdmVyc2lvblxuLSB7YXV0aG9yfSAtIFBlcnNvbmEgYXV0aG9yXG4tIHtjYXRlZ29yeX0gLSBQZXJzb25hIGNhdGVnb3J5YFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhIHNpbmdsZSBwZXJzb25hXG4gICAqL1xuICBhc3luYyBleHBvcnRQZXJzb25hKHBlcnNvbmFOYW1lOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIGEgc2luZ2xlIGxvb2t1cCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnNcbiAgICAgIGxldCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQocGVyc29uYU5hbWUpO1xuICAgICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAgIC8vIFRyeSBieSBmaWxlbmFtZVxuICAgICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PT0gcGVyc29uYU5hbWUpO1xuICAgICAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBQZXJzb25hIG5vdCBmb3VuZDogJHtwZXJzb25hTmFtZX1gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhwb3J0RGF0YSA9IHRoaXMucGVyc29uYUV4cG9ydGVyLmV4cG9ydFBlcnNvbmEocGVyc29uYSk7XG4gICAgICBjb25zdCBiYXNlNjQgPSB0aGlzLnBlcnNvbmFFeHBvcnRlci50b0Jhc2U2NChleHBvcnREYXRhKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGVyc29uYUV4cG9ydGVyLmZvcm1hdEV4cG9ydFJlc3VsdChwZXJzb25hLCBiYXNlNjQpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfSR7cmVzdWx0fWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEV4cG9ydCBmYWlsZWQ6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGFsbCBwZXJzb25hc1xuICAgKi9cbiAgYXN5bmMgZXhwb3J0QWxsUGVyc29uYXMoaW5jbHVkZURlZmF1bHRzID0gdHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwZXJzb25hc0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKTtcbiAgICAgIGNvbnN0IGJ1bmRsZSA9IHRoaXMucGVyc29uYUV4cG9ydGVyLmV4cG9ydEJ1bmRsZShwZXJzb25hc0FycmF5LCBpbmNsdWRlRGVmYXVsdHMpO1xuICAgICAgY29uc3QgYmFzZTY0ID0gdGhpcy5wZXJzb25hRXhwb3J0ZXIudG9CYXNlNjQoYnVuZGxlKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGVyc29uYUV4cG9ydGVyLmZvcm1hdEJ1bmRsZVJlc3VsdChidW5kbGUsIGJhc2U2NCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9JHtyZXN1bHR9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXhwb3J0IGZhaWxlZDogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYSBwZXJzb25hXG4gICAqL1xuICBhc3luYyBpbXBvcnRQZXJzb25hKHNvdXJjZTogc3RyaW5nLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMucGVyc29uYUltcG9ydGVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEltcG9ydCBmdW5jdGlvbmFsaXR5IG5vdCBhdmFpbGFibGUgKGluaXRpYWxpemF0aW9uIGluIHByb2dyZXNzKWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzb25hSW1wb3J0ZXIuaW1wb3J0UGVyc29uYShzb3VyY2UsIHRoaXMucGVyc29uYXMsIG92ZXJ3cml0ZSk7XG4gICAgICBcbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAvLyBSZWxvYWQgcGVyc29uYXMgdG8gaW5jbHVkZSB0aGUgbmV3IG9uZVxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgJHtyZXN1bHQubWVzc2FnZX1cXG5cXG5QZXJzb25hIFwiJHtyZXN1bHQucGVyc29uYT8ubWV0YWRhdGEubmFtZX1cIiBpcyBub3cgYXZhaWxhYmxlLlxcblRvdGFsIHBlcnNvbmFzOiAke3RoaXMucGVyc29uYXMuc2l6ZX1gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICR7cmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEltcG9ydCBmYWlsZWQ6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgYSBwZXJzb25hIHZpYSBVUkxcbiAgICovXG4gIGFzeW5jIHNoYXJlUGVyc29uYShwZXJzb25hTmFtZTogc3RyaW5nLCBleHBpcnlEYXlzID0gNykge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbmhhbmNlZCBpbnB1dCB2YWxpZGF0aW9uXG4gICAgICBjb25zdCB2YWxpZGF0ZWRQZXJzb25hTmFtZSA9IE1DUElucHV0VmFsaWRhdG9yLnZhbGlkYXRlUGVyc29uYUlkZW50aWZpZXIocGVyc29uYU5hbWUpO1xuICAgICAgY29uc3QgdmFsaWRhdGVkRXhwaXJ5RGF5cyA9IE1DUElucHV0VmFsaWRhdG9yLnZhbGlkYXRlRXhwaXJ5RGF5cyhleHBpcnlEYXlzKTtcbiAgICAgIFxuICAgICAgY29uc3QgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHZhbGlkYXRlZFBlcnNvbmFOYW1lKTtcbiAgICAgIGlmICghcGVyc29uYSkge1xuICAgICAgICAvLyBUcnkgYnkgZmlsZW5hbWVcbiAgICAgICAgY29uc3QgYnlGaWxlbmFtZSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkuZmluZChwID0+IHAuZmlsZW5hbWUgPT09IHZhbGlkYXRlZFBlcnNvbmFOYW1lKTtcbiAgICAgICAgaWYgKCFieUZpbGVuYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgUGVyc29uYSBub3QgZm91bmQ6ICR7dmFsaWRhdGVkUGVyc29uYU5hbWV9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHBlcnNvbmFOYW1lID0gYnlGaWxlbmFtZS5tZXRhZGF0YS5uYW1lO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBlcnNvbmFTaGFyZXIuc2hhcmVQZXJzb25hKHRoaXMucGVyc29uYXMuZ2V0KHBlcnNvbmFOYW1lKSEsIHZhbGlkYXRlZEV4cGlyeURheXMpO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfSR7cmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgU2hhcmUgZmFpbGVkOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEltcG9ydCBmcm9tIGEgc2hhcmVkIFVSTFxuICAgKi9cbiAgYXN5bmMgaW1wb3J0RnJvbVVybCh1cmw6IHN0cmluZywgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5oYW5jZWQgaW5wdXQgdmFsaWRhdGlvbiBmb3IgVVJMXG4gICAgICBjb25zdCB2YWxpZGF0ZWRVcmwgPSBNQ1BJbnB1dFZhbGlkYXRvci52YWxpZGF0ZUltcG9ydFVybCh1cmwpO1xuICAgICAgXG4gICAgICBjb25zdCBmZXRjaFJlc3VsdCA9IGF3YWl0IHRoaXMucGVyc29uYVNoYXJlci5pbXBvcnRGcm9tVXJsKHZhbGlkYXRlZFVybCk7XG4gICAgICBcbiAgICAgIGlmICghZmV0Y2hSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAke2ZldGNoUmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEltcG9ydCB0aGUgZmV0Y2hlZCBkYXRhXG4gICAgICBpZiAoIXRoaXMucGVyc29uYUltcG9ydGVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEltcG9ydCBmdW5jdGlvbmFsaXR5IG5vdCBhdmFpbGFibGUgKGluaXRpYWxpemF0aW9uIGluIHByb2dyZXNzKWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgaW1wb3J0UmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzb25hSW1wb3J0ZXIuaW1wb3J0UGVyc29uYShcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZmV0Y2hSZXN1bHQuZGF0YSksXG4gICAgICAgIHRoaXMucGVyc29uYXMsXG4gICAgICAgIG92ZXJ3cml0ZVxuICAgICAgKTtcblxuICAgICAgaWYgKGltcG9ydFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIC8vIFJlbG9hZCBwZXJzb25hc1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgU3VjY2Vzc2Z1bGx5IGltcG9ydGVkIGZyb20gVVJMIVxcblxcbiR7aW1wb3J0UmVzdWx0Lm1lc3NhZ2V9XFxuVG90YWwgcGVyc29uYXM6ICR7dGhpcy5wZXJzb25hcy5zaXplfWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgJHtpbXBvcnRSZXN1bHQubWVzc2FnZX1gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgSW1wb3J0IGZyb20gVVJMIGZhaWxlZDogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJ1bigpIHtcbiAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgU3RkaW9TZXJ2ZXJUcmFuc3BvcnQoKTtcbiAgICBsb2dnZXIuaW5mbyhcIlN0YXJ0aW5nIERvbGxob3VzZU1DUCBzZXJ2ZXIuLi5cIik7XG4gICAgXG4gICAgLy8gU2V0IHVwIGdyYWNlZnVsIHNodXRkb3duIGhhbmRsZXJzXG4gICAgY29uc3QgY2xlYW51cCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxvZ2dlci5pbmZvKFwiU2h1dHRpbmcgZG93biBEb2xsaG91c2VNQ1Agc2VydmVyLi4uXCIpO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICAvLyBDbGVhbiB1cCBHaXRIdWIgYXV0aCBtYW5hZ2VyXG4gICAgICAgIGlmICh0aGlzLmdpdGh1YkF1dGhNYW5hZ2VyKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5jbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIENsZWFuIHVwIGFueSBvdGhlciByZXNvdXJjZXNcbiAgICAgICAgaWYgKHRoaXMudXBkYXRlTWFuYWdlcikge1xuICAgICAgICAgIC8vIFVwZGF0ZU1hbmFnZXIgbWlnaHQgaGF2ZSBhY3RpdmUgb3BlcmF0aW9ucyB0b29cbiAgICAgICAgICBsb2dnZXIuZGVidWcoXCJDbGVhbmluZyB1cCB1cGRhdGUgbWFuYWdlci4uLlwiKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJDbGVhbnVwIGNvbXBsZXRlZFwiKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcIkVycm9yIGR1cmluZyBjbGVhbnVwXCIsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9O1xuICAgIFxuICAgIC8vIFJlZ2lzdGVyIHNodXRkb3duIGhhbmRsZXJzXG4gICAgcHJvY2Vzcy5vbignU0lHSU5UJywgY2xlYW51cCk7XG4gICAgcHJvY2Vzcy5vbignU0lHVEVSTScsIGNsZWFudXApO1xuICAgIHByb2Nlc3Mub24oJ1NJR0hVUCcsIGNsZWFudXApO1xuICAgIFxuICAgIGF3YWl0IHRoaXMuc2VydmVyLmNvbm5lY3QodHJhbnNwb3J0KTtcbiAgICAvLyBNYXJrIHRoYXQgTUNQIGlzIG5vdyBjb25uZWN0ZWQgLSBubyBtb3JlIGNvbnNvbGUgb3V0cHV0IGFsbG93ZWRcbiAgICBsb2dnZXIuc2V0TUNQQ29ubmVjdGVkKCk7XG4gICAgbG9nZ2VyLmluZm8oXCJEb2xsaG91c2VNQ1Agc2VydmVyIHJ1bm5pbmcgb24gc3RkaW9cIik7XG4gIH1cbn1cblxuLy8gRXhwb3J0IGlzIGFscmVhZHkgYXQgY2xhc3MgZGVjbGFyYXRpb25cblxuLy8gT25seSBzdGFydCB0aGUgc2VydmVyIGlmIHRoaXMgZmlsZSBpcyBiZWluZyBydW4gZGlyZWN0bHkgKG5vdCBpbXBvcnRlZCBieSB0ZXN0cylcbi8vIEhhbmRsZSBkaWZmZXJlbnQgZXhlY3V0aW9uIG1ldGhvZHMgKGRpcmVjdCwgbnB4LCBDTEkpXG5jb25zdCBpc0RpcmVjdEV4ZWN1dGlvbiA9IGltcG9ydC5tZXRhLnVybCA9PT0gYGZpbGU6Ly8ke3Byb2Nlc3MuYXJndlsxXX1gO1xuY29uc3QgaXNOcHhFeGVjdXRpb24gPSBwcm9jZXNzLmVudi5ucG1fZXhlY3BhdGg/LmluY2x1ZGVzKCducHgnKTtcbmNvbnN0IGlzQ2xpRXhlY3V0aW9uID0gcHJvY2Vzcy5hcmd2WzFdPy5lbmRzV2l0aCgnL2RvbGxob3VzZW1jcCcpIHx8IHByb2Nlc3MuYXJndlsxXT8uZW5kc1dpdGgoJ1xcXFxkb2xsaG91c2VtY3AnKTtcbmNvbnN0IGlzVGVzdCA9IHByb2Nlc3MuZW52LkpFU1RfV09SS0VSX0lEO1xuXG4vLyBQcm9ncmVzc2l2ZSBzdGFydHVwIHdpdGggcmV0cmllcyBmb3IgbnB4L0NMSSBleGVjdXRpb25cbmNvbnN0IFNUQVJUVVBfREVMQVlTID0gWzEwLCA1MCwgMTAwLCAyMDBdOyAvLyBQcm9ncmVzc2l2ZSBkZWxheXMgaW4gbXNcblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRTZXJ2ZXJXaXRoUmV0cnkocmV0cmllc0xlZnQgPSBTVEFSVFVQX0RFTEFZUy5sZW5ndGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBuZXcgRG9sbGhvdXNlTUNQU2VydmVyKCk7XG4gICAgYXdhaXQgc2VydmVyLnJ1bigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChyZXRyaWVzTGVmdCA+IDAgJiYgKGlzTnB4RXhlY3V0aW9uIHx8IGlzQ2xpRXhlY3V0aW9uKSkge1xuICAgICAgLy8gVHJ5IGFnYWluIHdpdGggYSBsb25nZXIgZGVsYXlcbiAgICAgIGNvbnN0IGRlbGF5SW5kZXggPSBTVEFSVFVQX0RFTEFZUy5sZW5ndGggLSByZXRyaWVzTGVmdDtcbiAgICAgIGNvbnN0IGRlbGF5ID0gU1RBUlRVUF9ERUxBWVNbZGVsYXlJbmRleF07XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgIHJldHVybiBzdGFydFNlcnZlcldpdGhSZXRyeShyZXRyaWVzTGVmdCAtIDEpO1xuICAgIH1cbiAgICAvLyBGaW5hbCBmYWlsdXJlIC0gbWluaW1hbCBlcnJvciBtZXNzYWdlIGZvciBzZWN1cml0eVxuICAgIGNvbnNvbGUuZXJyb3IoXCJbRG9sbGhvdXNlTUNQXSBTZXJ2ZXIgc3RhcnR1cCBmYWlsZWRcIik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbmlmICgoaXNEaXJlY3RFeGVjdXRpb24gfHwgaXNOcHhFeGVjdXRpb24gfHwgaXNDbGlFeGVjdXRpb24pICYmICFpc1Rlc3QpIHtcbiAgc3RhcnRTZXJ2ZXJXaXRoUmV0cnkoKS5jYXRjaCgoKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcIltEb2xsaG91c2VNQ1BdIFNlcnZlciBzdGFydHVwIGZhaWxlZFwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH0pO1xufSJdfQ==
|
|
4778
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLGlEQUFpRDtBQUNqRCxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDeEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFFSCxPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ25ELE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDekUsT0FBTyxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBd0IsTUFBTSw4QkFBOEIsQ0FBQztBQUNoSSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBaUIsTUFBTSx5QkFBeUIs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Q0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLGNBQWMsQ0FBQyxFQUFFLENBQUM7WUFDMUQsZ0NBQWdDO1lBQ2hDLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQ3ZELE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6QyxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pELE9BQU8sb0JBQW9CLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxxREFBcUQ7UUFDckQsb0ZBQW9GO1FBQ3BGLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUN0RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBSSxDQUFDLGlCQUFpQixJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3ZFLG9CQUFvQixFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtRQUNoQyxvRkFBb0Y7UUFDcEYsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG4vLyBEZWZlbnNpdmUgZXJyb3IgaGFuZGxpbmcgZm9yIG5weC9DTEkgZXhlY3V0aW9uXG5wcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnJvcikgPT4ge1xuICBjb25zb2xlLmVycm9yKCdbRG9sbGhvdXNlTUNQXSBTZXJ2ZXIgc3RhcnR1cCBmYWlsZWQnKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG5cbnByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChyZWFzb24sIHByb21pc2UpID0+IHtcbiAgY29uc29sZS5lcnJvcignW0RvbGxob3VzZU1DUF0gU2VydmVyIHN0YXJ0dXAgZmFpbGVkJyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuXG5pbXBvcnQgeyBTZXJ2ZXIgfSBmcm9tIFwiQG1vZGVsY29udGV4dHByb3RvY29sL3Nkay9zZXJ2ZXIvaW5kZXguanNcIjtcbmltcG9ydCB7IFN0ZGlvU2VydmVyVHJhbnNwb3J0IH0gZnJvbSBcIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvc2VydmVyL3N0ZGlvLmpzXCI7XG5pbXBvcnQgeyBNY3BFcnJvciwgRXJyb3JDb2RlIH0gZnJvbSBcIkBtb2RlbGNvbnRleHRwcm90b2NvbC9zZGsvdHlwZXMuanNcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgbG9hZEluZGljYXRvckNvbmZpZywgZm9ybWF0SW5kaWNhdG9yLCB2YWxpZGF0ZUN1c3RvbUZvcm1hdCwgdHlwZSBJbmRpY2F0b3JDb25maWcgfSBmcm9tICcuL2NvbmZpZy9pbmRpY2F0b3ItY29uZmlnLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlFcnJvciB9IGZyb20gJy4vZXJyb3JzL1NlY3VyaXR5RXJyb3IuanMnO1xuaW1wb3J0IHsgU2VjdXJlRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi9zZWN1cml0eS9lcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVyLCBFcnJvckNhdGVnb3J5IH0gZnJvbSAnLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuXG4vLyBJbXBvcnQgbW9kdWxhcml6ZWQgY29tcG9uZW50c1xuaW1wb3J0IHsgUGVyc29uYSwgUGVyc29uYU1ldGFkYXRhIH0gZnJvbSAnLi90eXBlcy9wZXJzb25hLmpzJztcbmltcG9ydCB7IEFQSUNhY2hlLCBDb2xsZWN0aW9uQ2FjaGUgfSBmcm9tICcuL2NhY2hlL2luZGV4LmpzJztcbmltcG9ydCB7IHZhbGlkYXRlRmlsZW5hbWUsIHNhbml0aXplSW5wdXQsIHZhbGlkYXRlQ29udGVudFNpemUsIHZhbGlkYXRlVXNlcm5hbWUsIE1DUElucHV0VmFsaWRhdG9yIH0gZnJvbSAnLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMsIFZBTElEQVRJT05fUEFUVEVSTlMgfSBmcm9tICcuL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBDb250ZW50VmFsaWRhdG9yIH0gZnJvbSAnLi9zZWN1cml0eS9jb250ZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFBhdGhWYWxpZGF0b3IgfSBmcm9tICcuL3NlY3VyaXR5L3BhdGhWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgRmlsZUxvY2tNYW5hZ2VyIH0gZnJvbSAnLi9zZWN1cml0eS9maWxlTG9ja01hbmFnZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVBbm9ueW1vdXNJZCwgZ2VuZXJhdGVVbmlxdWVJZCwgc2x1Z2lmeSB9IGZyb20gJy4vdXRpbHMvZmlsZXN5c3RlbS5qcyc7XG5pbXBvcnQgeyBHaXRIdWJDbGllbnQsIENvbGxlY3Rpb25Ccm93c2VyLCBDb2xsZWN0aW9uSW5kZXhNYW5hZ2VyLCBDb2xsZWN0aW9uU2VhcmNoLCBQZXJzb25hRGV0YWlscywgUGVyc29uYVN1Ym1pdHRlciwgRWxlbWVudEluc3RhbGxlciB9IGZyb20gJy4vY29sbGVjdGlvbi9pbmRleC5qcyc7XG5pbXBvcnQgeyBTZXJ2ZXJTZXR1cCwgSVRvb2xIYW5kbGVyIH0gZnJvbSAnLi9zZXJ2ZXIvaW5kZXguanMnO1xuaW1wb3J0IHsgR2l0SHViQXV0aE1hbmFnZXIgfSBmcm9tICcuL2F1dGgvR2l0SHViQXV0aE1hbmFnZXIuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUGVyc29uYUV4cG9ydGVyLCBQZXJzb25hSW1wb3J0ZXIsIFBlcnNvbmFTaGFyZXIgfSBmcm9tICcuL3BlcnNvbmEvZXhwb3J0LWltcG9ydC9pbmRleC5qcyc7XG5pbXBvcnQgeyBpc0RlZmF1bHRQZXJzb25hIH0gZnJvbSAnLi9jb25zdGFudHMvZGVmYXVsdFBlcnNvbmFzLmpzJztcbmltcG9ydCB7IFBvcnRmb2xpb01hbmFnZXIsIEVsZW1lbnRUeXBlIH0gZnJvbSAnLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBNaWdyYXRpb25NYW5hZ2VyIH0gZnJvbSAnLi9wb3J0Zm9saW8vTWlncmF0aW9uTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBTa2lsbE1hbmFnZXIgfSBmcm9tICcuL2VsZW1lbnRzL3NraWxscy9pbmRleC5qcyc7XG5pbXBvcnQgeyBTa2lsbCB9IGZyb20gJy4vZWxlbWVudHMvc2tpbGxzL1NraWxsLmpzJztcbmltcG9ydCB7IFRlbXBsYXRlTWFuYWdlciB9IGZyb20gJy4vZWxlbWVudHMvdGVtcGxhdGVzL1RlbXBsYXRlTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJy4vZWxlbWVudHMvdGVtcGxhdGVzL1RlbXBsYXRlLmpzJztcbmltcG9ydCB7IEFnZW50TWFuYWdlciB9IGZyb20gJy4vZWxlbWVudHMvYWdlbnRzL0FnZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4vZWxlbWVudHMvYWdlbnRzL0FnZW50LmpzJztcbmltcG9ydCB7IENvbmZpZ01hbmFnZXIgfSBmcm9tICcuL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcyc7XG5cblxuXG4vLyBEZXRlY3QgZXhlY3V0aW9uIGVudmlyb25tZW50XG5jb25zdCBFWEVDVVRJT05fRU5WID0ge1xuICBpc05weDogcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoPy5pbmNsdWRlcygnbnB4JykgfHwgZmFsc2UsXG4gIGlzQ2xpOiBwcm9jZXNzLmFyZ3ZbMV0/LmVuZHNXaXRoKCcvZG9sbGhvdXNlbWNwJykgfHwgZmFsc2UsXG4gIGlzRGlyZWN0OiAhcHJvY2Vzcy5lbnYubnBtX2V4ZWNwYXRoLFxuICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gIHNjcmlwdFBhdGg6IHByb2Nlc3MuYXJndlsxXSxcbn07XG5cbi8vIE9ubHkgbG9nIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCBpbiBkZWJ1ZyBtb2RlXG5pZiAocHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0RFQlVHKSB7XG4gIGNvbnNvbGUuZXJyb3IoJ1tEb2xsaG91c2VNQ1BdIERlYnVnIG1vZGUgZW5hYmxlZCcpO1xufVxuXG5leHBvcnQgY2xhc3MgRG9sbGhvdXNlTUNQU2VydmVyIGltcGxlbWVudHMgSVRvb2xIYW5kbGVyIHtcbiAgcHJpdmF0ZSBzZXJ2ZXI6IFNlcnZlcjtcbiAgcHVibGljIHBlcnNvbmFzRGlyOiBzdHJpbmcgfCBudWxsO1xuICBwcml2YXRlIHBlcnNvbmFzOiBNYXA8c3RyaW5nLCBQZXJzb25hPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBhY3RpdmVQZXJzb25hOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjdXJyZW50VXNlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaXNJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGluaXRpYWxpemF0aW9uUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFwaUNhY2hlOiBBUElDYWNoZSA9IG5ldyBBUElDYWNoZSgpO1xuICBwcml2YXRlIGNvbGxlY3Rpb25DYWNoZTogQ29sbGVjdGlvbkNhY2hlID0gbmV3IENvbGxlY3Rpb25DYWNoZSgpO1xuICBwcml2YXRlIHJhdGVMaW1pdFRyYWNrZXIgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG4gIHByaXZhdGUgaW5kaWNhdG9yQ29uZmlnOiBJbmRpY2F0b3JDb25maWc7XG4gIHByaXZhdGUgZ2l0aHViQ2xpZW50OiBHaXRIdWJDbGllbnQ7XG4gIHByaXZhdGUgZ2l0aHViQXV0aE1hbmFnZXI6IEdpdEh1YkF1dGhNYW5hZ2VyO1xuICBwcml2YXRlIGNvbGxlY3Rpb25JbmRleE1hbmFnZXI6IENvbGxlY3Rpb25JbmRleE1hbmFnZXI7XG4gIHByaXZhdGUgY29sbGVjdGlvbkJyb3dzZXI6IENvbGxlY3Rpb25Ccm93c2VyO1xuICBwcml2YXRlIGNvbGxlY3Rpb25TZWFyY2g6IENvbGxlY3Rpb25TZWFyY2g7XG4gIHByaXZhdGUgcGVyc29uYURldGFpbHM6IFBlcnNvbmFEZXRhaWxzO1xuICBwcml2YXRlIGVsZW1lbnRJbnN0YWxsZXI6IEVsZW1lbnRJbnN0YWxsZXI7XG4gIHByaXZhdGUgcGVyc29uYVN1Ym1pdHRlcjogUGVyc29uYVN1Ym1pdHRlcjtcbiAgcHJpdmF0ZSBzZXJ2ZXJTZXR1cDogU2VydmVyU2V0dXA7XG4gIHByaXZhdGUgcGVyc29uYUV4cG9ydGVyOiBQZXJzb25hRXhwb3J0ZXI7XG4gIHByaXZhdGUgcGVyc29uYUltcG9ydGVyPzogUGVyc29uYUltcG9ydGVyO1xuICBwcml2YXRlIHBlcnNvbmFTaGFyZXI6IFBlcnNvbmFTaGFyZXI7XG4gIHByaXZhdGUgcG9ydGZvbGlvTWFuYWdlcjogUG9ydGZvbGlvTWFuYWdlcjtcbiAgcHJpdmF0ZSBtaWdyYXRpb25NYW5hZ2VyOiBNaWdyYXRpb25NYW5hZ2VyO1xuICBwcml2YXRlIHNraWxsTWFuYWdlcjogU2tpbGxNYW5hZ2VyO1xuICBwcml2YXRlIHRlbXBsYXRlTWFuYWdlcjogVGVtcGxhdGVNYW5hZ2VyO1xuICBwcml2YXRlIGFnZW50TWFuYWdlcjogQWdlbnRNYW5hZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc2VydmVyID0gbmV3IFNlcnZlcihcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJkb2xsaG91c2VtY3BcIixcbiAgICAgICAgdmVyc2lvbjogXCIxLjAuMC1idWlsZC0yMDI1MDgxNy0xNjMwLXByNjA2XCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICB0b29sczoge30sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcblxuICAgIC8vIEluaXRpYWxpemUgcG9ydGZvbGlvIHN5c3RlbVxuICAgIHRoaXMucG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICB0aGlzLm1pZ3JhdGlvbk1hbmFnZXIgPSBuZXcgTWlncmF0aW9uTWFuYWdlcih0aGlzLnBvcnRmb2xpb01hbmFnZXIpO1xuICAgIFxuICAgIC8vIENSSVRJQ0FMIEZJWDogRG9uJ3QgYWNjZXNzIGRpcmVjdG9yaWVzIHVudGlsIGFmdGVyIG1pZ3JhdGlvbiBydW5zXG4gICAgLy8gUHJldmlvdXNseTogdGhpcy5wZXJzb25hc0RpciB3YXMgc2V0IGhlcmUsIGNyZWF0aW5nIGRpcmVjdG9yaWVzIGJlZm9yZSBtaWdyYXRpb24gY291bGQgZml4IHRoZW1cbiAgICAvLyBOb3c6IFdlIGRlbGF5IGRpcmVjdG9yeSBhY2Nlc3MgdW50aWwgaW5pdGlhbGl6ZVBvcnRmb2xpbygpIGNvbXBsZXRlc1xuICAgIC8vIFVzaW5nIG51bGwgdG8gbWFrZSB0aGUgdW5pbml0aWFsaXplZCBzdGF0ZSBleHBsaWNpdCAocGVyIFBSIHJldmlldyBmZWVkYmFjaylcbiAgICB0aGlzLnBlcnNvbmFzRGlyID0gbnVsbDsgLy8gV2lsbCBiZSBwcm9wZXJseSBpbml0aWFsaXplZCBpbiBjb21wbGV0ZUluaXRpYWxpemF0aW9uKClcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGVsZW1lbnQgbWFuYWdlcnNcbiAgICB0aGlzLnNraWxsTWFuYWdlciA9IG5ldyBTa2lsbE1hbmFnZXIoKTtcbiAgICB0aGlzLnRlbXBsYXRlTWFuYWdlciA9IG5ldyBUZW1wbGF0ZU1hbmFnZXIoKTtcbiAgICB0aGlzLmFnZW50TWFuYWdlciA9IG5ldyBBZ2VudE1hbmFnZXIodGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEJhc2VEaXIoKSk7XG4gICAgXG4gICAgLy8gTG9nIHJlc29sdmVkIHBhdGggZm9yIGRlYnVnZ2luZ1xuICAgIGxvZ2dlci5pbmZvKGBQZXJzb25hcyBkaXJlY3RvcnkgcmVzb2x2ZWQgdG86ICR7dGhpcy5wZXJzb25hc0Rpcn1gKTtcbiAgICBcbiAgICAvLyBQYXRoVmFsaWRhdG9yIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgbWlncmF0aW9uIGNvbXBsZXRlc1xuICAgIFxuICAgIC8vIExvYWQgdXNlciBpZGVudGl0eSBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgIHRoaXMuY3VycmVudFVzZXIgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfVVNFUiB8fCBudWxsO1xuICAgIFxuICAgIC8vIExvYWQgaW5kaWNhdG9yIGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLmluZGljYXRvckNvbmZpZyA9IGxvYWRJbmRpY2F0b3JDb25maWcoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHBlcnNvbmEgbWFuYWdlclxuICAgIFxuICAgIC8vIEluaXRpYWxpemUgY29sbGVjdGlvbiBtb2R1bGVzXG4gICAgdGhpcy5naXRodWJDbGllbnQgPSBuZXcgR2l0SHViQ2xpZW50KHRoaXMuYXBpQ2FjaGUsIHRoaXMucmF0ZUxpbWl0VHJhY2tlcik7XG4gICAgdGhpcy5naXRodWJBdXRoTWFuYWdlciA9IG5ldyBHaXRIdWJBdXRoTWFuYWdlcih0aGlzLmFwaUNhY2hlKTtcbiAgICB0aGlzLmNvbGxlY3Rpb25JbmRleE1hbmFnZXIgPSBuZXcgQ29sbGVjdGlvbkluZGV4TWFuYWdlcigpO1xuICAgIHRoaXMuY29sbGVjdGlvbkJyb3dzZXIgPSBuZXcgQ29sbGVjdGlvbkJyb3dzZXIodGhpcy5naXRodWJDbGllbnQsIHRoaXMuY29sbGVjdGlvbkNhY2hlLCB0aGlzLmNvbGxlY3Rpb25JbmRleE1hbmFnZXIpO1xuICAgIHRoaXMuY29sbGVjdGlvblNlYXJjaCA9IG5ldyBDb2xsZWN0aW9uU2VhcmNoKHRoaXMuZ2l0aHViQ2xpZW50LCB0aGlzLmNvbGxlY3Rpb25DYWNoZSk7XG4gICAgdGhpcy5wZXJzb25hRGV0YWlscyA9IG5ldyBQZXJzb25hRGV0YWlscyh0aGlzLmdpdGh1YkNsaWVudCk7XG4gICAgdGhpcy5lbGVtZW50SW5zdGFsbGVyID0gbmV3IEVsZW1lbnRJbnN0YWxsZXIodGhpcy5naXRodWJDbGllbnQpO1xuICAgIHRoaXMucGVyc29uYVN1Ym1pdHRlciA9IG5ldyBQZXJzb25hU3VibWl0dGVyKCk7XG4gICAgXG4gICAgLy8gVXBkYXRlIG1hbmFnZXIgd2lsbCBiZSBpbml0aWFsaXplZCBhZnRlciBtaWdyYXRpb24gY29tcGxldGVzIHRvIGF2b2lkIGpzZG9tIGNyYXNoXG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBleHBvcnQvaW1wb3J0L3NoYXJlIG1vZHVsZXNcbiAgICB0aGlzLnBlcnNvbmFFeHBvcnRlciA9IG5ldyBQZXJzb25hRXhwb3J0ZXIodGhpcy5jdXJyZW50VXNlcik7XG4gICAgLy8gUGVyc29uYUltcG9ydGVyIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgbWlncmF0aW9uIGNvbXBsZXRlc1xuICAgIHRoaXMucGVyc29uYVNoYXJlciA9IG5ldyBQZXJzb25hU2hhcmVyKHRoaXMuZ2l0aHViQ2xpZW50LCB0aGlzLmN1cnJlbnRVc2VyKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHNlcnZlciBzZXR1cFxuICAgIHRoaXMuc2VydmVyU2V0dXAgPSBuZXcgU2VydmVyU2V0dXAoKTtcbiAgICB0aGlzLnNlcnZlclNldHVwLnNldHVwU2VydmVyKHRoaXMuc2VydmVyLCB0aGlzKTtcbiAgICBcbiAgICAvLyBGSVggIzYxMDogUG9ydGZvbGlvIGluaXRpYWxpemF0aW9uIG1vdmVkIHRvIHJ1bigpIG1ldGhvZCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uXG4gICAgLy8gUHJldmlvdXNseTogdGhpcy5pbml0aWFsaXplUG9ydGZvbGlvKCkudGhlbigpIHJhbiBhc3luYyBpbiBjb25zdHJ1Y3RvclxuICAgIC8vIE5vdzogSW5pdGlhbGl6YXRpb24gaGFwcGVucyBzeW5jaHJvbm91c2x5IGluIHJ1bigpIGJlZm9yZSBNQ1AgY29ubmVjdGlvblxuICB9XG4gIFxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVQb3J0Zm9saW8oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgaWYgbWlncmF0aW9uIGlzIG5lZWRlZFxuICAgIGNvbnN0IG5lZWRzTWlncmF0aW9uID0gYXdhaXQgdGhpcy5taWdyYXRpb25NYW5hZ2VyLm5lZWRzTWlncmF0aW9uKCk7XG4gICAgXG4gICAgaWYgKG5lZWRzTWlncmF0aW9uKSB7XG4gICAgICBsb2dnZXIuaW5mbygnTGVnYWN5IHBlcnNvbmFzIGRldGVjdGVkLiBTdGFydGluZyBtaWdyYXRpb24uLi4nKTtcbiAgICAgIFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5taWdyYXRpb25NYW5hZ2VyLm1pZ3JhdGUoeyBiYWNrdXA6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBsb2dnZXIuaW5mbyhgU3VjY2Vzc2Z1bGx5IG1pZ3JhdGVkICR7cmVzdWx0Lm1pZ3JhdGVkQ291bnR9IHBlcnNvbmFzYCk7XG4gICAgICAgIGlmIChyZXN1bHQuYmFja2VkVXAgJiYgcmVzdWx0LmJhY2t1cFBhdGgpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgQmFja3VwIGNyZWF0ZWQgYXQ6ICR7cmVzdWx0LmJhY2t1cFBhdGh9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignTWlncmF0aW9uIGNvbXBsZXRlZCB3aXRoIGVycm9yczonKTtcbiAgICAgICAgcmVzdWx0LmVycm9ycy5mb3JFYWNoKGVyciA9PiBsb2dnZXIuZXJyb3IoYCAgLSAke2Vycn1gKSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBwb3J0Zm9saW8gc3RydWN0dXJlIGV4aXN0c1xuICAgIGNvbnN0IHBvcnRmb2xpb0V4aXN0cyA9IGF3YWl0IHRoaXMucG9ydGZvbGlvTWFuYWdlci5leGlzdHMoKTtcbiAgICBpZiAoIXBvcnRmb2xpb0V4aXN0cykge1xuICAgICAgbG9nZ2VyLmluZm8oJ0NyZWF0aW5nIHBvcnRmb2xpbyBkaXJlY3Rvcnkgc3RydWN0dXJlLi4uJyk7XG4gICAgICBhd2FpdCB0aGlzLnBvcnRmb2xpb01hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuICAgIH1cbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGNvbGxlY3Rpb24gY2FjaGUgZm9yIGFub255bW91cyBhY2Nlc3NcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVDb2xsZWN0aW9uQ2FjaGUoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENvbXBsZXRlIGluaXRpYWxpemF0aW9uIGFmdGVyIHBvcnRmb2xpbyBpcyByZWFkeVxuICAgKiBGSVggIzYxMDogVGhpcyB3YXMgcHJldmlvdXNseSBpbiBhIC50aGVuKCkgY2FsbGJhY2sgaW4gdGhlIGNvbnN0cnVjdG9yXG4gICAqIE5vdyBjYWxsZWQgc3luY2hyb25vdXNseSBmcm9tIHJ1bigpIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29tcGxldGVJbml0aWFsaXphdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBOT1cgc2FmZSB0byBhY2Nlc3MgZGlyZWN0b3JpZXMgYWZ0ZXIgbWlncmF0aW9uXG4gICAgdGhpcy5wZXJzb25hc0RpciA9IHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLlBFUlNPTkEpO1xuICAgIFxuICAgIC8vIExvZyByZXNvbHZlZCBwYXRoIGZvciBkZWJ1Z2dpbmdcbiAgICBsb2dnZXIuaW5mbyhgUGVyc29uYXMgZGlyZWN0b3J5IHJlc29sdmVkIHRvOiAke3RoaXMucGVyc29uYXNEaXJ9YCk7XG4gICAgXG4gICAgLy8gSW5pdGlhbGl6ZSBQYXRoVmFsaWRhdG9yIHdpdGggdGhlIHBlcnNvbmFzIGRpcmVjdG9yeVxuICAgIFBhdGhWYWxpZGF0b3IuaW5pdGlhbGl6ZSh0aGlzLnBlcnNvbmFzRGlyKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIHVwZGF0ZSBtYW5hZ2VyIHdpdGggc2FmZSBkaXJlY3RvcnlcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGltcG9ydCBtb2R1bGUgdGhhdCBkZXBlbmRzIG9uIHBlcnNvbmFzRGlyXG4gICAgdGhpcy5wZXJzb25hSW1wb3J0ZXIgPSBuZXcgUGVyc29uYUltcG9ydGVyKHRoaXMucGVyc29uYXNEaXIsIHRoaXMuY3VycmVudFVzZXIpO1xuICAgIFxuICAgIHRoaXMubG9hZFBlcnNvbmFzKCk7XG4gICAgXG4gICAgLy8gTWFyayBpbml0aWFsaXphdGlvbiBhcyBjb21wbGV0ZVxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBFbnN1cmUgc2VydmVyIGlzIGluaXRpYWxpemVkIGJlZm9yZSBhbnkgb3BlcmF0aW9uXG4gICAqIEZJWCAjNjEwOiBBZGRlZCBmb3IgdGVzdCBjb21wYXRpYmlsaXR5IC0gdGVzdHMgZG9uJ3QgY2FsbCBydW4oKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbml0aWFsaXplZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIElmIGluaXRpYWxpemF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdhaXQgZm9yIGl0XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6YXRpb25Qcm9taXNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gU3RhcnQgaW5pdGlhbGl6YXRpb25cbiAgICB0aGlzLmluaXRpYWxpemF0aW9uUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVQb3J0Zm9saW8oKTtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21wbGV0ZUluaXRpYWxpemF0aW9uKCk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiUG9ydGZvbGlvIGFuZCBwZXJzb25hcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkgKGxhenkpXCIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdEb2xsaG91c2VNQ1BTZXJ2ZXIuZW5zdXJlSW5pdGlhbGl6ZWQnLCBlcnJvcik7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pKCk7XG4gICAgXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGNvbGxlY3Rpb24gY2FjaGUgd2l0aCBzZWVkIGRhdGEgZm9yIGFub255bW91cyBicm93c2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ29sbGVjdGlvbkNhY2hlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpc0NhY2hlVmFsaWQgPSBhd2FpdCB0aGlzLmNvbGxlY3Rpb25DYWNoZS5pc0NhY2hlVmFsaWQoKTtcbiAgICAgIGlmICghaXNDYWNoZVZhbGlkKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdJbml0aWFsaXppbmcgY29sbGVjdGlvbiBjYWNoZSB3aXRoIHNlZWQgZGF0YS4uLicpO1xuICAgICAgICBjb25zdCB7IENvbGxlY3Rpb25TZWVkZXIgfSA9IGF3YWl0IGltcG9ydCgnLi9jb2xsZWN0aW9uL0NvbGxlY3Rpb25TZWVkZXIuanMnKTtcbiAgICAgICAgY29uc3Qgc2VlZERhdGEgPSBDb2xsZWN0aW9uU2VlZGVyLmdldFNlZWREYXRhKCk7XG4gICAgICAgIGF3YWl0IHRoaXMuY29sbGVjdGlvbkNhY2hlLnNhdmVDYWNoZShzZWVkRGF0YSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBDb2xsZWN0aW9uIGNhY2hlIGluaXRpYWxpemVkIHdpdGggJHtzZWVkRGF0YS5sZW5ndGh9IGl0ZW1zYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuY29sbGVjdGlvbkNhY2hlLmdldENhY2hlU3RhdHMoKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDb2xsZWN0aW9uIGNhY2hlIGFscmVhZHkgdmFsaWQgd2l0aCAke3N0YXRzLml0ZW1Db3VudH0gaXRlbXNgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdEb2xsaG91c2VNQ1BTZXJ2ZXIuaW5pdGlhbGl6ZUNvbGxlY3Rpb25DYWNoZScsIGVycm9yKTtcbiAgICAgIC8vIERvbid0IHRocm93IC0gY2FjaGUgZmFpbHVyZXMgc2hvdWxkbid0IHByZXZlbnQgc2VydmVyIHN0YXJ0dXBcbiAgICB9XG4gIH1cblxuICAvLyBUb29sIGhhbmRsZXIgbWV0aG9kcyAtIG5vdyBwdWJsaWMgZm9yIGFjY2VzcyBmcm9tIHRvb2wgbW9kdWxlc1xuICBcbiAgcHJpdmF0ZSBnZXRQZXJzb25hSW5kaWNhdG9yKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZVBlcnNvbmEpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh0aGlzLmFjdGl2ZVBlcnNvbmEpO1xuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdEluZGljYXRvcih0aGlzLmluZGljYXRvckNvbmZpZywge1xuICAgICAgbmFtZTogcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgICAgdmVyc2lvbjogcGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgYXV0aG9yOiBwZXJzb25hLm1ldGFkYXRhLmF1dGhvcixcbiAgICAgIGNhdGVnb3J5OiBwZXJzb25hLm1ldGFkYXRhLmNhdGVnb3J5XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplIGVsZW1lbnQgdHlwZSB0byBoYW5kbGUgYm90aCBzaW5ndWxhciAobmV3KSBhbmQgcGx1cmFsIChsZWdhY3kpIGZvcm1zXG4gICAqIFRoaXMgcHJvdmlkZXMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBkdXJpbmcgdGhlIHRyYW5zaXRpb24gdG8gdjEuNC4wXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gTWFwIHBsdXJhbCBmb3JtcyB0byBzaW5ndWxhciBFbGVtZW50VHlwZSB2YWx1ZXNcbiAgICBjb25zdCBwbHVyYWxUb1Npbmd1bGFyTWFwOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgJ3BlcnNvbmFzJzogRWxlbWVudFR5cGUuUEVSU09OQSxcbiAgICAgICdza2lsbHMnOiBFbGVtZW50VHlwZS5TS0lMTCxcbiAgICAgICd0ZW1wbGF0ZXMnOiBFbGVtZW50VHlwZS5URU1QTEFURSxcbiAgICAgICdhZ2VudHMnOiBFbGVtZW50VHlwZS5BR0VOVCxcbiAgICAgICdtZW1vcmllcyc6IEVsZW1lbnRUeXBlLk1FTU9SWSxcbiAgICAgICdlbnNlbWJsZXMnOiBFbGVtZW50VHlwZS5FTlNFTUJMRVxuICAgIH07XG4gICAgXG4gICAgLy8gSWYgaXQncyBhbHJlYWR5IGEgdmFsaWQgRWxlbWVudFR5cGUgdmFsdWUsIHJldHVybiBhcy1pc1xuICAgIGlmIChPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5pbmNsdWRlcyh0eXBlIGFzIEVsZW1lbnRUeXBlKSkge1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICAgIFxuICAgIC8vIElmIGl0J3MgYSBwbHVyYWwgZm9ybSwgY29udmVydCB0byBzaW5ndWxhclxuICAgIGlmIChwbHVyYWxUb1Npbmd1bGFyTWFwW3R5cGVdKSB7XG4gICAgICAvLyBMb2cgZGVwcmVjYXRpb24gd2FybmluZ1xuICAgICAgbG9nZ2VyLndhcm4oYFVzaW5nIHBsdXJhbCBlbGVtZW50IHR5cGUgJyR7dHlwZX0nIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2Ugc2luZ3VsYXIgZm9ybSAnJHtwbHVyYWxUb1Npbmd1bGFyTWFwW3R5cGVdfScgaW5zdGVhZC5gKTtcbiAgICAgIHJldHVybiBwbHVyYWxUb1Npbmd1bGFyTWFwW3R5cGVdO1xuICAgIH1cbiAgICBcbiAgICAvLyBVbmtub3duIHR5cGUgLSByZXR1cm4gYXMtaXMgYW5kIGxldCB2YWxpZGF0aW9uIGhhbmRsZSBpdFxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbml0aXplIG1ldGFkYXRhIG9iamVjdCB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICogUmVtb3ZlcyBhbnkgZGFuZ2Vyb3VzIHByb3BlcnRpZXMgdGhhdCBjb3VsZCBhZmZlY3QgT2JqZWN0LnByb3RvdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBzYW5pdGl6ZU1ldGFkYXRhKG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgaWYgKCFtZXRhZGF0YSB8fCB0eXBlb2YgbWV0YWRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGRhbmdlcm91c1Byb3BlcnRpZXMgPSBbJ19fcHJvdG9fXycsICdjb25zdHJ1Y3RvcicsICdwcm90b3R5cGUnXTtcbiAgICBjb25zdCBzYW5pdGl6ZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YSkpIHtcbiAgICAgIGlmICghZGFuZ2Vyb3VzUHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNhbml0aXplIG5lc3RlZCBvYmplY3RzXG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHNhbml0aXplZFtrZXldID0gdGhpcy5zYW5pdGl6ZU1ldGFkYXRhKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzYW5pdGl6ZWRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFBlcnNvbmFzKCkge1xuICAgIC8vIFZhbGlkYXRlIHRoZSBwZXJzb25hcyBkaXJlY3RvcnkgcGF0aFxuICAgIC8vIHBlcnNvbmFzRGlyIGlzIGd1YXJhbnRlZWQgdG8gYmUgc2V0IGJ5IGNvbXBsZXRlSW5pdGlhbGl6YXRpb24gYmVmb3JlIHRoaXMgaXMgY2FsbGVkXG4gICAgaWYgKCFwYXRoLmlzQWJzb2x1dGUodGhpcy5wZXJzb25hc0RpciEpKSB7XG4gICAgICBsb2dnZXIud2FybihgUGVyc29uYXMgZGlyZWN0b3J5IHBhdGggaXMgbm90IGFic29sdXRlOiAke3RoaXMucGVyc29uYXNEaXJ9YCk7XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5hY2Nlc3ModGhpcy5wZXJzb25hc0RpciEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBDcmVhdGUgcGVyc29uYXMgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHRoaXMucGVyc29uYXNEaXIhLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYENyZWF0ZWQgcGVyc29uYXMgZGlyZWN0b3J5IGF0OiAke3RoaXMucGVyc29uYXNEaXJ9YCk7XG4gICAgICAgIC8vIENvbnRpbnVlIHRvIHRyeSBsb2FkaW5nIChkaXJlY3Rvcnkgd2lsbCBiZSBlbXB0eSlcbiAgICAgIH0gY2F0Y2ggKG1rZGlyRXJyb3IpIHtcbiAgICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdEb2xsaG91c2VNQ1BTZXJ2ZXIubG9hZFBlcnNvbmFzLm1rZGlyJywgbWtkaXJFcnJvciwgeyBwZXJzb25hc0RpcjogdGhpcy5wZXJzb25hc0RpciB9KTtcbiAgICAgICAgLy8gRG9uJ3QgdGhyb3cgLSBlbXB0eSBwb3J0Zm9saW8gaXMgdmFsaWRcbiAgICAgICAgdGhpcy5wZXJzb25hcy5jbGVhcigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIHBlcnNvbmFzRGlyIGlzIGd1YXJhbnRlZWQgdG8gYmUgc2V0IGJ5IGNvbXBsZXRlSW5pdGlhbGl6YXRpb24gYmVmb3JlIHRoaXMgaXMgY2FsbGVkXG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IGZzLnJlYWRkaXIodGhpcy5wZXJzb25hc0RpciEpO1xuICAgICAgY29uc3QgbWFya2Rvd25GaWxlcyA9IGZpbGVzXG4gICAgICAgIC5maWx0ZXIoZmlsZSA9PiBmaWxlLmVuZHNXaXRoKCcubWQnKSlcbiAgICAgICAgLmZpbHRlcihmaWxlID0+ICF0aGlzLnBvcnRmb2xpb01hbmFnZXIuaXNUZXN0RWxlbWVudChmaWxlKSk7XG5cbiAgICAgIHRoaXMucGVyc29uYXMuY2xlYXIoKTtcbiAgICAgIFxuICAgICAgaWYgKG1hcmtkb3duRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbRG9sbGhvdXNlTUNQXSBObyBwZXJzb25hcyBmb3VuZCBpbiBwb3J0Zm9saW8uIFVzZSBicm93c2VfY29sbGVjdGlvbiB0byBpbnN0YWxsIHNvbWUhJyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBtYXJrZG93bkZpbGVzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciEsIGZpbGUpO1xuICAgICAgICAgIGNvbnN0IGZpbGVDb250ZW50ID0gYXdhaXQgUGF0aFZhbGlkYXRvci5zYWZlUmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVzZSBzZWN1cmUgWUFNTCBwYXJzZXJcbiAgICAgICAgICBsZXQgcGFyc2VkO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnNhZmVNYXR0ZXIoZmlsZUNvbnRlbnQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZWN1cml0eUVycm9yKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBTZWN1cml0eSB0aHJlYXQgZGV0ZWN0ZWQgaW4gcGVyc29uYSAke2ZpbGV9OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyc2VkLmRhdGEgYXMgUGVyc29uYU1ldGFkYXRhO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBwYXJzZWQuY29udGVudDtcblxuICAgICAgICAgIGlmICghbWV0YWRhdGEubmFtZSkge1xuICAgICAgICAgICAgbWV0YWRhdGEubmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZSwgJy5tZCcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBJRCBpZiBub3QgcHJlc2VudFxuICAgICAgICAgIGxldCB1bmlxdWVJZCA9IG1ldGFkYXRhLnVuaXF1ZV9pZDtcbiAgICAgICAgICBpZiAoIXVuaXF1ZUlkKSB7XG4gICAgICAgICAgICBjb25zdCBhdXRob3JGb3JJZCA9IG1ldGFkYXRhLmF1dGhvciB8fCB0aGlzLmdldEN1cnJlbnRVc2VyRm9yQXR0cmlidXRpb24oKTtcbiAgICAgICAgICAgIHVuaXF1ZUlkID0gZ2VuZXJhdGVVbmlxdWVJZChtZXRhZGF0YS5uYW1lLCBhdXRob3JGb3JJZCk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoYEdlbmVyYXRlZCB1bmlxdWUgSUQgZm9yICR7bWV0YWRhdGEubmFtZX06ICR7dW5pcXVlSWR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IGRlZmF1bHQgdmFsdWVzIGZvciBuZXcgbWV0YWRhdGEgZmllbGRzXG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5jYXRlZ29yeSkgbWV0YWRhdGEuY2F0ZWdvcnkgPSAnZ2VuZXJhbCc7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5hZ2VfcmF0aW5nKSBtZXRhZGF0YS5hZ2VfcmF0aW5nID0gJ2FsbCc7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5jb250ZW50X2ZsYWdzKSBtZXRhZGF0YS5jb250ZW50X2ZsYWdzID0gW107XG4gICAgICAgICAgaWYgKG1ldGFkYXRhLmFpX2dlbmVyYXRlZCA9PT0gdW5kZWZpbmVkKSBtZXRhZGF0YS5haV9nZW5lcmF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoIW1ldGFkYXRhLmdlbmVyYXRpb25fbWV0aG9kKSBtZXRhZGF0YS5nZW5lcmF0aW9uX21ldGhvZCA9ICdodW1hbic7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5wcmljZSkgbWV0YWRhdGEucHJpY2UgPSAnZnJlZSc7XG4gICAgICAgICAgaWYgKCFtZXRhZGF0YS5saWNlbnNlKSBtZXRhZGF0YS5saWNlbnNlID0gJ0NDLUJZLVNBLTQuMCc7XG5cbiAgICAgICAgICBjb25zdCBwZXJzb25hOiBQZXJzb25hID0ge1xuICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgICAgZmlsZW5hbWU6IGZpbGUsXG4gICAgICAgICAgICB1bmlxdWVfaWQ6IHVuaXF1ZUlkLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0aGlzLnBlcnNvbmFzLnNldChmaWxlLCBwZXJzb25hKTtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYExvYWRlZCBwZXJzb25hOiAke21ldGFkYXRhLm5hbWV9ICgke3VuaXF1ZUlkfWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmxvYWRQZXJzb25hcy5sb2FkRmlsZScsIGVycm9yLCB7IGZpbGUgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIEVOT0VOVCBncmFjZWZ1bGx5IC0gZGlyZWN0b3J5IG1pZ2h0IG5vdCBleGlzdCB5ZXRcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgICBsb2dnZXIuaW5mbygnW0RvbGxob3VzZU1DUF0gUGVyc29uYXMgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0IHlldCAtIHBvcnRmb2xpbyBpcyBlbXB0eScpO1xuICAgICAgICB0aGlzLnBlcnNvbmFzLmNsZWFyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignRG9sbGhvdXNlTUNQU2VydmVyLmxvYWRQZXJzb25hcycsIGVycm9yKTtcbiAgICAgIHRoaXMucGVyc29uYXMuY2xlYXIoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsaXN0UGVyc29uYXMoKSB7XG4gICAgY29uc3QgcGVyc29uYUxpc3QgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLm1hcChwZXJzb25hID0+ICh7XG4gICAgICBmaWxlbmFtZTogcGVyc29uYS5maWxlbmFtZSxcbiAgICAgIHVuaXF1ZV9pZDogcGVyc29uYS51bmlxdWVfaWQsXG4gICAgICBuYW1lOiBwZXJzb25hLm1ldGFkYXRhLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogcGVyc29uYS5tZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgIHRyaWdnZXJzOiBwZXJzb25hLm1ldGFkYXRhLnRyaWdnZXJzIHx8IFtdLFxuICAgICAgdmVyc2lvbjogcGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uIHx8IFwiMS4wXCIsXG4gICAgICBhdXRob3I6IHBlcnNvbmEubWV0YWRhdGEuYXV0aG9yIHx8IFwiVW5rbm93blwiLFxuICAgICAgY2F0ZWdvcnk6IHBlcnNvbmEubWV0YWRhdGEuY2F0ZWdvcnkgfHwgJ2dlbmVyYWwnLFxuICAgICAgYWdlX3JhdGluZzogcGVyc29uYS5tZXRhZGF0YS5hZ2VfcmF0aW5nIHx8ICdhbGwnLFxuICAgICAgcHJpY2U6IHBlcnNvbmEubWV0YWRhdGEucHJpY2UgfHwgJ2ZyZWUnLFxuICAgICAgYWlfZ2VuZXJhdGVkOiBwZXJzb25hLm1ldGFkYXRhLmFpX2dlbmVyYXRlZCB8fCBmYWxzZSxcbiAgICAgIGFjdGl2ZTogdGhpcy5hY3RpdmVQZXJzb25hID09PSBwZXJzb25hLmZpbGVuYW1lLFxuICAgIH0pKTtcblxuICAgIGlmIChwZXJzb25hTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfVlvdSBkb24ndCBoYXZlIGFueSBwZXJzb25hcyBpbnN0YWxsZWQgeWV0LiBXb3VsZCB5b3UgbGlrZSB0byBicm93c2UgdGhlIERvbGxob3VzZU1DUCBjb2xsZWN0aW9uIG9uIEdpdEh1YiB0byBzZWUgd2hhdCdzIGF2YWlsYWJsZT8gSSBjYW4gc2hvdyB5b3UgcGVyc29uYXMgZm9yIGNyZWF0aXZlIHdyaXRpbmcsIHRlY2huaWNhbCBhbmFseXNpcywgYW5kIG1vcmUuIEp1c3Qgc2F5IFwieWVzXCIgb3IgdXNlICdicm93c2VfY29sbGVjdGlvbicuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl9QXZhaWxhYmxlIFBlcnNvbmFzICgke3BlcnNvbmFMaXN0Lmxlbmd0aH0pOlxcblxcbmAgK1xuICAgICAgICAgICAgcGVyc29uYUxpc3QubWFwKHAgPT4gXG4gICAgICAgICAgICAgIGAke3AuYWN0aXZlID8gJ/CflLkgJyA6ICfilqvvuI8gJ30qKiR7cC5uYW1lfSoqICgke3AudW5pcXVlX2lkfSlcXG5gICtcbiAgICAgICAgICAgICAgYCAgICR7cC5kZXNjcmlwdGlvbn1cXG5gICtcbiAgICAgICAgICAgICAgYCAgIPCfk4EgJHtwLmNhdGVnb3J5fSB8IPCfjq0gJHtwLmF1dGhvcn0gfCDwn5SWICR7cC5wcmljZX0gfCAke3AuYWlfZ2VuZXJhdGVkID8gJ/CfpJYgQUknIDogJ/CfkaQgSHVtYW4nfVxcbmAgK1xuICAgICAgICAgICAgICBgICAgQWdlOiAke3AuYWdlX3JhdGluZ30gfCBWZXJzaW9uOiAke3AudmVyc2lvbn1cXG5gICtcbiAgICAgICAgICAgICAgYCAgIFRyaWdnZXJzOiAke3AudHJpZ2dlcnMuam9pbignLCAnKSB8fCAnTm9uZSd9XFxuYFxuICAgICAgICAgICAgKS5qb2luKCdcXG4nKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGFjdGl2YXRlUGVyc29uYShwZXJzb25hSWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgLy8gRW5oYW5jZWQgaW5wdXQgdmFsaWRhdGlvbiBmb3IgcGVyc29uYSBpZGVudGlmaWVyXG4gICAgY29uc3QgdmFsaWRhdGVkSWRlbnRpZmllciA9IE1DUElucHV0VmFsaWRhdG9yLnZhbGlkYXRlUGVyc29uYUlkZW50aWZpZXIocGVyc29uYUlkZW50aWZpZXIpO1xuICAgIFxuICAgIC8vIFRyeSB0byBmaW5kIHBlcnNvbmEgYnkgZmlsZW5hbWUgZmlyc3QsIHRoZW4gYnkgbmFtZVxuICAgIGxldCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQodmFsaWRhdGVkSWRlbnRpZmllcik7XG4gICAgXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAvLyBTZWFyY2ggYnkgbmFtZVxuICAgICAgcGVyc29uYSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkuZmluZChwID0+IFxuICAgICAgICBwLm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdmFsaWRhdGVkSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgdGhyb3cgbmV3IE1jcEVycm9yKFxuICAgICAgICBFcnJvckNvZGUuSW52YWxpZFBhcmFtcyxcbiAgICAgICAgYFBlcnNvbmEgbm90IGZvdW5kOiAke3BlcnNvbmFJZGVudGlmaWVyfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5hY3RpdmVQZXJzb25hID0gcGVyc29uYS5maWxlbmFtZTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX1QZXJzb25hIEFjdGl2YXRlZDogKioke3BlcnNvbmEubWV0YWRhdGEubmFtZX0qKlxcblxcbmAgK1xuICAgICAgICAgICAgYCR7cGVyc29uYS5tZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG5cXG5gICtcbiAgICAgICAgICAgIGAqKkluc3RydWN0aW9uczoqKlxcbiR7cGVyc29uYS5jb250ZW50fWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRBY3RpdmVQZXJzb25hKCkge1xuICAgIGlmICghdGhpcy5hY3RpdmVQZXJzb25hKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX1ObyBwZXJzb25hIGlzIGN1cnJlbnRseSBhY3RpdmUuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQodGhpcy5hY3RpdmVQZXJzb25hKTtcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIHRoaXMuYWN0aXZlUGVyc29uYSA9IG51bGw7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX1BY3RpdmUgcGVyc29uYSBub3QgZm91bmQuIERlYWN0aXZhdGVkLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfUFjdGl2ZSBQZXJzb25hOiAqKiR7cGVyc29uYS5tZXRhZGF0YS5uYW1lfSoqXFxuXFxuYCArXG4gICAgICAgICAgICBgJHtwZXJzb25hLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcblxcbmAgK1xuICAgICAgICAgICAgYEZpbGU6ICR7cGVyc29uYS5maWxlbmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBWZXJzaW9uOiAke3BlcnNvbmEubWV0YWRhdGEudmVyc2lvbiB8fCAnMS4wJ31cXG5gICtcbiAgICAgICAgICAgIGBBdXRob3I6ICR7cGVyc29uYS5tZXRhZGF0YS5hdXRob3IgfHwgJ1Vua25vd24nfWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBkZWFjdGl2YXRlUGVyc29uYSgpIHtcbiAgICBjb25zdCB3YXNBY3RpdmUgPSB0aGlzLmFjdGl2ZVBlcnNvbmEgIT09IG51bGw7XG4gICAgY29uc3QgaW5kaWNhdG9yID0gdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCk7XG4gICAgdGhpcy5hY3RpdmVQZXJzb25hID0gbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiB3YXNBY3RpdmUgXG4gICAgICAgICAgICA/IGAke2luZGljYXRvcn3inIUgUGVyc29uYSBkZWFjdGl2YXRlZC4gQmFjayB0byBkZWZhdWx0IG1vZGUuYFxuICAgICAgICAgICAgOiBcIk5vIHBlcnNvbmEgd2FzIGFjdGl2ZS5cIixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldFBlcnNvbmFEZXRhaWxzKHBlcnNvbmFJZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICAvLyBUcnkgdG8gZmluZCBwZXJzb25hIGJ5IGZpbGVuYW1lIGZpcnN0LCB0aGVuIGJ5IG5hbWVcbiAgICBsZXQgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHBlcnNvbmFJZGVudGlmaWVyKTtcbiAgICBcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNlYXJjaCBieSBuYW1lXG4gICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gXG4gICAgICAgIHAubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBwZXJzb25hSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgdGhyb3cgbmV3IE1jcEVycm9yKFxuICAgICAgICBFcnJvckNvZGUuSW52YWxpZFBhcmFtcyxcbiAgICAgICAgYFBlcnNvbmEgbm90IGZvdW5kOiAke3BlcnNvbmFJZGVudGlmaWVyfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCfk4sgKioke3BlcnNvbmEubWV0YWRhdGEubmFtZX0qKiBEZXRhaWxzXFxuXFxuYCArXG4gICAgICAgICAgICBgKipEZXNjcmlwdGlvbjoqKiAke3BlcnNvbmEubWV0YWRhdGEuZGVzY3JpcHRpb259XFxuYCArXG4gICAgICAgICAgICBgKipGaWxlOioqICR7cGVyc29uYS5maWxlbmFtZX1cXG5gICtcbiAgICAgICAgICAgIGAqKlZlcnNpb246KiogJHtwZXJzb25hLm1ldGFkYXRhLnZlcnNpb24gfHwgJzEuMCd9XFxuYCArXG4gICAgICAgICAgICBgKipBdXRob3I6KiogJHtwZXJzb25hLm1ldGFkYXRhLmF1dGhvciB8fCAnVW5rbm93bid9XFxuYCArXG4gICAgICAgICAgICBgKipUcmlnZ2VyczoqKiAke3BlcnNvbmEubWV0YWRhdGEudHJpZ2dlcnM/LmpvaW4oJywgJykgfHwgJ05vbmUnfVxcblxcbmAgK1xuICAgICAgICAgICAgYCoqRnVsbCBDb250ZW50OioqXFxuXFxgXFxgXFxgXFxuJHtwZXJzb25hLmNvbnRlbnR9XFxuXFxgXFxgXFxgYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHJlbG9hZFBlcnNvbmFzKCkge1xuICAgIGF3YWl0IHRoaXMubG9hZFBlcnNvbmFzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCflIQgUmVsb2FkZWQgJHt0aGlzLnBlcnNvbmFzLnNpemV9IHBlcnNvbmFzIGZyb20gJHt0aGlzLnBlcnNvbmFzRGlyfWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PSBFbGVtZW50IE1ldGhvZHMgKEdlbmVyaWMgZm9yIGFsbCBlbGVtZW50IHR5cGVzKSA9PT09PVxuICBcbiAgYXN5bmMgbGlzdEVsZW1lbnRzKHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3JtYWxpemUgdGhlIHR5cGUgdG8gaGFuZGxlIGJvdGggcGx1cmFsIGFuZCBzaW5ndWxhciBmb3Jtc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgXG4gICAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5saXN0UGVyc29uYXMoKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDoge1xuICAgICAgICAgIGNvbnN0IHNraWxscyA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICBpZiAoc2tpbGxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIk5vIHNraWxscyBhcmUgY3VycmVudGx5IGluc3RhbGxlZC4gVGhlIERvbGxob3VzZU1DUCBjb2xsZWN0aW9uIGhhcyBza2lsbHMgZm9yIGNvZGUgcmV2aWV3LCBkYXRhIGFuYWx5c2lzLCBjcmVhdGl2ZSB3cml0aW5nIGFuZCBtb3JlLiBXb3VsZCB5b3UgbGlrZSBtZSB0byBzaG93IHlvdSB3aGF0J3MgYXZhaWxhYmxlPyBKdXN0IHNheSBcXFwieWVzXFxcIiBvciBJIGNhbiBoZWxwIHlvdSBjcmVhdGUgYSBjdXN0b20gc2tpbGwuXCJcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHNraWxsTGlzdCA9IHNraWxscy5tYXAoc2tpbGwgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tcGxleGl0eSA9IHNraWxsLm1ldGFkYXRhLmNvbXBsZXhpdHkgfHwgJ2JlZ2lubmVyJztcbiAgICAgICAgICAgIGNvbnN0IGRvbWFpbnMgPSBza2lsbC5tZXRhZGF0YS5kb21haW5zPy5qb2luKCcsICcpIHx8ICdnZW5lcmFsJztcbiAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSBza2lsbC52ZXJzaW9uIHx8IHNraWxsLm1ldGFkYXRhLnZlcnNpb24gfHwgJzEuMC4wJztcbiAgICAgICAgICAgIHJldHVybiBg8J+boO+4jyAke3NraWxsLm1ldGFkYXRhLm5hbWV9ICh2JHt2ZXJzaW9ufSkgLSAke3NraWxsLm1ldGFkYXRhLmRlc2NyaXB0aW9ufVxcbiAgIENvbXBsZXhpdHk6ICR7Y29tcGxleGl0eX0gfCBEb21haW5zOiAke2RvbWFpbnN9YDtcbiAgICAgICAgICB9KS5qb2luKCdcXG5cXG4nKTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5OaIEF2YWlsYWJsZSBTa2lsbHM6XFxuXFxuJHtza2lsbExpc3R9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOiB7XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVzID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIGlmICh0ZW1wbGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IFwiWW91IGhhdmVuJ3QgaW5zdGFsbGVkIGFueSB0ZW1wbGF0ZXMgeWV0LiBXb3VsZCB5b3UgbGlrZSB0byBzZWUgYXZhaWxhYmxlIHRlbXBsYXRlcyBmb3IgZW1haWxzLCByZXBvcnRzLCBhbmQgZG9jdW1lbnRhdGlvbj8gSSBjYW4gc2hvdyB5b3UgZXhhbXBsZXMgZnJvbSB0aGUgY29sbGVjdGlvbiBvciBoZWxwIHlvdSBjcmVhdGUgeW91ciBvd24uIFdoYXQgd291bGQgeW91IHByZWZlcj9cIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVMaXN0ID0gdGVtcGxhdGVzLm1hcCh0ZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YXJpYWJsZXMgPSB0ZW1wbGF0ZS5tZXRhZGF0YS52YXJpYWJsZXM/Lm1hcCh2ID0+IHYubmFtZSkuam9pbignLCAnKSB8fCAnbm9uZSc7XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gdGVtcGxhdGUudmVyc2lvbiB8fCB0ZW1wbGF0ZS5tZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAuMCc7XG4gICAgICAgICAgICByZXR1cm4gYPCfk4QgJHt0ZW1wbGF0ZS5tZXRhZGF0YS5uYW1lfSAodiR7dmVyc2lvbn0pIC0gJHt0ZW1wbGF0ZS5tZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG4gICBWYXJpYWJsZXM6ICR7dmFyaWFibGVzfWA7XG4gICAgICAgICAgfSkuam9pbignXFxuXFxuJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+TnSBBdmFpbGFibGUgVGVtcGxhdGVzOlxcblxcbiR7dGVtcGxhdGVMaXN0fWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICBpZiAoYWdlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIk5vIGFnZW50cyBpbnN0YWxsZWQgeWV0LiBBZ2VudHMgYXJlIGF1dG9ub21vdXMgaGVscGVycyB0aGF0IGNhbiB3b3JrIG9uIHRhc2tzIGluZGVwZW5kZW50bHkuIFRoZSBEb2xsaG91c2VNQ1AgY29sbGVjdGlvbiBpbmNsdWRlcyB0YXNrIG1hbmFnZXJzLCByZXNlYXJjaCBhc3Npc3RhbnRzLCBhbmQgbW9yZS4gV291bGQgeW91IGxpa2UgdG8gYnJvd3NlIGF2YWlsYWJsZSBhZ2VudHMgb3IgbGVhcm4gaG93IHRvIGNyZWF0ZSB5b3VyIG93bj9cIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgYWdlbnRMaXN0ID0gYWdlbnRzLm1hcChhZ2VudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzcGVjaWFsaXphdGlvbnMgPSAoYWdlbnQubWV0YWRhdGEgYXMgYW55KS5zcGVjaWFsaXphdGlvbnM/LmpvaW4oJywgJykgfHwgJ2dlbmVyYWwnO1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gYWdlbnQuZ2V0U3RhdHVzKCk7XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gYWdlbnQudmVyc2lvbiB8fCBhZ2VudC5tZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAuMCc7XG4gICAgICAgICAgICByZXR1cm4gYPCfpJYgJHthZ2VudC5tZXRhZGF0YS5uYW1lfSAodiR7dmVyc2lvbn0pIC0gJHthZ2VudC5tZXRhZGF0YS5kZXNjcmlwdGlvbn1cXG4gICBTdGF0dXM6ICR7c3RhdHVzfSB8IFNwZWNpYWxpemF0aW9uczogJHtzcGVjaWFsaXphdGlvbnN9YDtcbiAgICAgICAgICB9KS5qb2luKCdcXG5cXG4nKTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn6SWIEF2YWlsYWJsZSBBZ2VudHM6XFxuXFxuJHthZ2VudExpc3R9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfScuIEF2YWlsYWJsZSB0eXBlczogJHtPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpfSAob3IgbGVnYWN5IHBsdXJhbCBmb3JtczogcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHMpYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0RvbGxob3VzZU1DUFNlcnZlci5oYW5kbGVMaXN0RWxlbWVudHMnLCBlcnJvciwgeyB0eXBlIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBsaXN0ICR7dHlwZX06ICR7RXJyb3JIYW5kbGVyLmdldFVzZXJNZXNzYWdlKGVycm9yKX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgYWN0aXZhdGVFbGVtZW50KG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlUGVyc29uYShuYW1lKTtcbiAgICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5TS0lMTDoge1xuICAgICAgICAgIGNvbnN0IHNraWxsID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIuZmluZChzID0+IHMubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCFza2lsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFNraWxsICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBBY3RpdmF0ZSB0aGUgc2tpbGxcbiAgICAgICAgICBhd2FpdCBza2lsbC5hY3RpdmF0ZT8uKCk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKchSBTa2lsbCAnJHtuYW1lfScgYWN0aXZhdGVkXFxuXFxuJHtza2lsbC5pbnN0cnVjdGlvbnN9YFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHtcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmZpbmQodCA9PiB0Lm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGlmICghdGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCBUZW1wbGF0ZSAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgdmFyaWFibGVzID0gdGVtcGxhdGUubWV0YWRhdGEudmFyaWFibGVzPy5tYXAodiA9PiB2Lm5hbWUpLmpvaW4oJywgJykgfHwgJ25vbmUnO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBUZW1wbGF0ZSAnJHtuYW1lfScgcmVhZHkgdG8gdXNlXFxuVmFyaWFibGVzOiAke3ZhcmlhYmxlc31cXG5cXG5Vc2UgJ3JlbmRlcl90ZW1wbGF0ZScgdG8gZ2VuZXJhdGUgY29udGVudCB3aXRoIHRoaXMgdGVtcGxhdGUuYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOiB7XG4gICAgICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5maW5kKGEgPT4gYS5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIWFnZW50KSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgQWdlbnQgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEFjdGl2YXRlIHRoZSBhZ2VudFxuICAgICAgICAgIGF3YWl0IGFnZW50LmFjdGl2YXRlKCk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4pyFIEFnZW50ICcke25hbWV9JyBhY3RpdmF0ZWQgYW5kIHJlYWR5XFxuU3BlY2lhbGl6YXRpb25zOiAkeyhhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLnNwZWNpYWxpemF0aW9ucz8uam9pbignLCAnKSB8fCAnZ2VuZXJhbCd9XFxuXFxuVXNlICdleGVjdXRlX2FnZW50JyB0byBnaXZlIHRoaXMgYWdlbnQgYSBnb2FsLmBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinYwgVW5rbm93biBlbGVtZW50IHR5cGUgJyR7dHlwZX0nYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0RvbGxob3VzZU1DUFNlcnZlci5oYW5kbGVBY3RpdmF0ZUVsZW1lbnQnLCBlcnJvciwgeyB0eXBlLCBuYW1lIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzogJHtFcnJvckhhbmRsZXIuZ2V0VXNlck1lc3NhZ2UoZXJyb3IpfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBnZXRBY3RpdmVFbGVtZW50cyh0eXBlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIHRvIGhhbmRsZSBib3RoIHBsdXJhbCBhbmQgc2luZ3VsYXIgZm9ybXNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUeXBlID0gdGhpcy5ub3JtYWxpemVFbGVtZW50VHlwZSh0eXBlKTtcbiAgICAgIFxuICAgICAgc3dpdGNoIChub3JtYWxpemVkVHlwZSkge1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlUGVyc29uYSgpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZVNraWxscyA9IHNraWxscy5maWx0ZXIocyA9PiBzLmdldFN0YXR1cygpID09PSAnYWN0aXZlJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGFjdGl2ZVNraWxscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogXCLwn5OLIE5vIGFjdGl2ZSBza2lsbHNcIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3Qgc2tpbGxMaXN0ID0gYWN0aXZlU2tpbGxzLm1hcChzID0+IGDwn5ug77iPICR7cy5tZXRhZGF0YS5uYW1lfWApLmpvaW4oJywgJyk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgQWN0aXZlIHNraWxsczogJHtza2lsbExpc3R9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBcIvCfk50gVGVtcGxhdGVzIGFyZSBzdGF0ZWxlc3MgYW5kIGFjdGl2YXRlZCBvbi1kZW1hbmQgd2hlbiByZW5kZXJpbmdcIlxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLkFHRU5UOiB7XG4gICAgICAgICAgY29uc3QgYWdlbnRzID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZUFnZW50cyA9IGFnZW50cy5maWx0ZXIoYSA9PiBhLmdldFN0YXR1cygpID09PSAnYWN0aXZlJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGFjdGl2ZUFnZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogXCLwn6SWIE5vIGFjdGl2ZSBhZ2VudHNcIlxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgYWdlbnRMaXN0ID0gYWN0aXZlQWdlbnRzLm1hcChhID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGdvYWxzID0gKGEgYXMgYW55KS5zdGF0ZT8uZ29hbHM/Lmxlbmd0aCB8fCAwO1xuICAgICAgICAgICAgcmV0dXJuIGDwn6SWICR7YS5tZXRhZGF0YS5uYW1lfSAoJHtnb2Fsc30gYWN0aXZlIGdvYWxzKWA7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgQWN0aXZlIGFnZW50czpcXG4ke2FnZW50TGlzdH1gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSAke3R5cGV9OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0IGFjdGl2ZSAke3R5cGV9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBkZWFjdGl2YXRlRWxlbWVudChuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBOb3JtYWxpemUgdGhlIHR5cGUgdG8gaGFuZGxlIGJvdGggcGx1cmFsIGFuZCBzaW5ndWxhciBmb3Jtc1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZUVsZW1lbnRUeXBlKHR5cGUpO1xuICAgICAgXG4gICAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuUEVSU09OQTpcbiAgICAgICAgICByZXR1cm4gdGhpcy5kZWFjdGl2YXRlUGVyc29uYSgpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGwgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5maW5kKHMgPT4gcy5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIXNraWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgU2tpbGwgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGF3YWl0IHNraWxsLmRlYWN0aXZhdGU/LigpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBTa2lsbCAnJHtuYW1lfScgZGVhY3RpdmF0ZWRgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IFwi8J+TnSBUZW1wbGF0ZXMgYXJlIHN0YXRlbGVzcyAtIG5vdGhpbmcgdG8gZGVhY3RpdmF0ZVwiXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6IHtcbiAgICAgICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmZpbmQoYSA9PiBhLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGlmICghYWdlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYOKdjCBBZ2VudCAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgYXdhaXQgYWdlbnQuZGVhY3RpdmF0ZSgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBBZ2VudCAnJHtuYW1lfScgZGVhY3RpdmF0ZWRgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGVhY3RpdmF0ZSAke3R5cGV9ICcke25hbWV9JzpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGRlYWN0aXZhdGUgJHt0eXBlfSAnJHtuYW1lfSc6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGdldEVsZW1lbnREZXRhaWxzKG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFBlcnNvbmFEZXRhaWxzKG5hbWUpO1xuICAgICAgICAgIFxuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOiB7XG4gICAgICAgICAgY29uc3Qgc2tpbGwgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5maW5kKHMgPT4gcy5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBpZiAoIXNraWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIHRleHQ6IGDinYwgU2tpbGwgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBbXG4gICAgICAgICAgICBg8J+boO+4jyAqKiR7c2tpbGwubWV0YWRhdGEubmFtZX0qKmAsXG4gICAgICAgICAgICBgJHtza2lsbC5tZXRhZGF0YS5kZXNjcmlwdGlvbn1gLFxuICAgICAgICAgICAgYGAsXG4gICAgICAgICAgICBgKipDb21wbGV4aXR5Kio6ICR7c2tpbGwubWV0YWRhdGEuY29tcGxleGl0eSB8fCAnYmVnaW5uZXInfWAsXG4gICAgICAgICAgICBgKipEb21haW5zKio6ICR7c2tpbGwubWV0YWRhdGEuZG9tYWlucz8uam9pbignLCAnKSB8fCAnZ2VuZXJhbCd9YCxcbiAgICAgICAgICAgIGAqKkxhbmd1YWdlcyoqOiAke3NraWxsLm1ldGFkYXRhLmxhbmd1YWdlcz8uam9pbignLCAnKSB8fCAnYW55J31gLFxuICAgICAgICAgICAgYCoqUHJlcmVxdWlzaXRlcyoqOiAke3NraWxsLm1ldGFkYXRhLnByZXJlcXVpc2l0ZXM/LmpvaW4oJywgJykgfHwgJ25vbmUnfWAsXG4gICAgICAgICAgICBgYCxcbiAgICAgICAgICAgIGAqKkluc3RydWN0aW9ucyoqOmAsXG4gICAgICAgICAgICBza2lsbC5pbnN0cnVjdGlvbnNcbiAgICAgICAgICBdO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChza2lsbC5tZXRhZGF0YS5wYXJhbWV0ZXJzICYmIHNraWxsLm1ldGFkYXRhLnBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGV0YWlscy5wdXNoKCcnLCAnKipQYXJhbWV0ZXJzKio6Jyk7XG4gICAgICAgICAgICBza2lsbC5tZXRhZGF0YS5wYXJhbWV0ZXJzLmZvckVhY2gocCA9PiB7XG4gICAgICAgICAgICAgIGRldGFpbHMucHVzaChgLSAke3AubmFtZX0gKCR7cC50eXBlfSk6ICR7cC5kZXNjcmlwdGlvbn1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGRldGFpbHMuam9pbignXFxuJylcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURToge1xuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgdGhpcy50ZW1wbGF0ZU1hbmFnZXIuZmluZCh0ID0+IHQubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFRlbXBsYXRlICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgICAgICAgYPCfk4QgKioke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9KipgLFxuICAgICAgICAgICAgYCR7dGVtcGxhdGUubWV0YWRhdGEuZGVzY3JpcHRpb259YCxcbiAgICAgICAgICAgIGBgLFxuICAgICAgICAgICAgYCoqT3V0cHV0IEZvcm1hdCoqOiAkeyh0ZW1wbGF0ZS5tZXRhZGF0YSBhcyBhbnkpLm91dHB1dF9mb3JtYXQgfHwgJ3RleHQnfWAsXG4gICAgICAgICAgICBgKipUZW1wbGF0ZSBDb250ZW50Kio6YCxcbiAgICAgICAgICAgICdgYGAnLFxuICAgICAgICAgICAgdGVtcGxhdGUuY29udGVudCxcbiAgICAgICAgICAgICdgYGAnXG4gICAgICAgICAgXTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAodGVtcGxhdGUubWV0YWRhdGEudmFyaWFibGVzICYmIHRlbXBsYXRlLm1ldGFkYXRhLnZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXRhaWxzLnB1c2goJycsICcqKlZhcmlhYmxlcyoqOicpO1xuICAgICAgICAgICAgdGVtcGxhdGUubWV0YWRhdGEudmFyaWFibGVzLmZvckVhY2godiA9PiB7XG4gICAgICAgICAgICAgIGRldGFpbHMucHVzaChgLSAke3YubmFtZX0gKCR7di50eXBlfSk6ICR7di5kZXNjcmlwdGlvbn1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGRldGFpbHMuam9pbignXFxuJylcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIGNvbnN0IGFnZW50ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuZmluZChhID0+IGEubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MIEFnZW50ICcke25hbWV9JyBub3QgZm91bmRgXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBkZXRhaWxzID0gW1xuICAgICAgICAgICAgYPCfpJYgKioke2FnZW50Lm1ldGFkYXRhLm5hbWV9KipgLFxuICAgICAgICAgICAgYCR7YWdlbnQubWV0YWRhdGEuZGVzY3JpcHRpb259YCxcbiAgICAgICAgICAgIGBgLFxuICAgICAgICAgICAgYCoqU3RhdHVzKio6ICR7YWdlbnQuZ2V0U3RhdHVzKCl9YCxcbiAgICAgICAgICAgIGAqKlNwZWNpYWxpemF0aW9ucyoqOiAkeyhhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLnNwZWNpYWxpemF0aW9ucz8uam9pbignLCAnKSB8fCAnZ2VuZXJhbCd9YCxcbiAgICAgICAgICAgIGAqKkRlY2lzaW9uIEZyYW1ld29yayoqOiAkeyhhZ2VudC5tZXRhZGF0YSBhcyBhbnkpLmRlY2lzaW9uRnJhbWV3b3JrIHx8ICdydWxlLWJhc2VkJ31gLFxuICAgICAgICAgICAgYCoqUmlzayBUb2xlcmFuY2UqKjogJHsoYWdlbnQubWV0YWRhdGEgYXMgYW55KS5yaXNrVG9sZXJhbmNlIHx8ICdsb3cnfWAsXG4gICAgICAgICAgICBgYCxcbiAgICAgICAgICAgIGAqKkluc3RydWN0aW9ucyoqOmAsXG4gICAgICAgICAgICAoYWdlbnQgYXMgYW55KS5pbnN0cnVjdGlvbnMgfHwgJ05vIGluc3RydWN0aW9ucyBhdmFpbGFibGUnXG4gICAgICAgICAgXTtcbiAgICAgICAgICBcbiAgICAgICAgICBjb25zdCBhZ2VudFN0YXRlID0gKGFnZW50IGFzIGFueSkuc3RhdGU7XG4gICAgICAgICAgaWYgKGFnZW50U3RhdGU/LmdvYWxzICYmIGFnZW50U3RhdGUuZ29hbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGV0YWlscy5wdXNoKCcnLCAnKipDdXJyZW50IEdvYWxzKio6Jyk7XG4gICAgICAgICAgICBhZ2VudFN0YXRlLmdvYWxzLmZvckVhY2goKGc6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBkZXRhaWxzLnB1c2goYC0gJHtnLmRlc2NyaXB0aW9ufSAoJHtnLnN0YXR1c30pYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBkZXRhaWxzLmpvaW4oJ1xcbicpXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIFVua25vd24gZWxlbWVudCB0eXBlICcke3R5cGV9J2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZ2V0ICR7dHlwZX0gZGV0YWlscyBmb3IgJyR7bmFtZX0nOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gZ2V0ICR7dHlwZX0gZGV0YWlsczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgcmVsb2FkRWxlbWVudHModHlwZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgdHlwZSB0byBoYW5kbGUgYm90aCBwbHVyYWwgYW5kIHNpbmd1bGFyIGZvcm1zXG4gICAgICBjb25zdCBub3JtYWxpemVkVHlwZSA9IHRoaXMubm9ybWFsaXplRWxlbWVudFR5cGUodHlwZSk7XG4gICAgICBcbiAgICAgIHN3aXRjaCAobm9ybWFsaXplZFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIHJldHVybiB0aGlzLnJlbG9hZFBlcnNvbmFzKCk7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6IHtcbiAgICAgICAgICB0aGlzLnNraWxsTWFuYWdlci5jbGVhckNhY2hlKCk7XG4gICAgICAgICAgY29uc3Qgc2tpbGxzID0gYXdhaXQgdGhpcy5za2lsbE1hbmFnZXIubGlzdCgpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYPCflIQgUmVsb2FkZWQgJHtza2lsbHMubGVuZ3RofSBza2lsbHMgZnJvbSBwb3J0Zm9saW9gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6IHtcbiAgICAgICAgICAvLyBUZW1wbGF0ZSBtYW5hZ2VyIGRvZXNuJ3QgaGF2ZSBjbGVhckNhY2hlLCBqdXN0IGxpc3RcbiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLnRlbXBsYXRlTWFuYWdlci5saXN0KCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg8J+UhCBSZWxvYWRlZCAke3RlbXBsYXRlcy5sZW5ndGh9IHRlbXBsYXRlcyBmcm9tIHBvcnRmb2xpb2BcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDoge1xuICAgICAgICAgIC8vIEFnZW50IG1hbmFnZXIgZG9lc24ndCBoYXZlIGNsZWFyQ2FjaGUsIGp1c3QgbGlzdFxuICAgICAgICAgIGNvbnN0IGFnZW50cyA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmxpc3QoKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDwn5SEIFJlbG9hZGVkICR7YWdlbnRzLmxlbmd0aH0gYWdlbnRzIGZyb20gcG9ydGZvbGlvYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBVbmtub3duIGVsZW1lbnQgdHlwZSAnJHt0eXBlfSdgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlbG9hZCAke3R5cGV9OmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gcmVsb2FkICR7dHlwZX06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIC8vIEVsZW1lbnQtc3BlY2lmaWMgbWV0aG9kc1xuICBhc3luYyByZW5kZXJUZW1wbGF0ZShuYW1lOiBzdHJpbmcsIHZhcmlhYmxlczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudGVtcGxhdGVNYW5hZ2VyLmZpbmQodCA9PiB0Lm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKCF0ZW1wbGF0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgVGVtcGxhdGUgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTaW1wbGUgdGVtcGxhdGUgcmVuZGVyaW5nIC0gcmVwbGFjZSB2YXJpYWJsZXMgaW4gY29udGVudFxuICAgICAgbGV0IHJlbmRlcmVkID0gdGVtcGxhdGUuY29udGVudDtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhcmlhYmxlcykpIHtcbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBcXFxce1xcXFx7XFxcXHMqJHtrZXl9XFxcXHMqXFxcXH1cXFxcfWAsICdnJyk7XG4gICAgICAgIHJlbmRlcmVkID0gcmVuZGVyZWQucmVwbGFjZShyZWdleCwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDwn5OEIFJlbmRlcmVkIHRlbXBsYXRlICcke25hbWV9JzpcXG5cXG4ke3JlbmRlcmVkfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHJlbmRlciB0ZW1wbGF0ZSAnJHtuYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byByZW5kZXIgdGVtcGxhdGU6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudChuYW1lOiBzdHJpbmcsIGdvYWw6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhZ2VudCA9IGF3YWl0IHRoaXMuYWdlbnRNYW5hZ2VyLmZpbmQoYSA9PiBhLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgaWYgKCFhZ2VudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgQWdlbnQgJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTaW1wbGUgYWdlbnQgZXhlY3V0aW9uIHNpbXVsYXRpb25cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgc3VtbWFyeTogYEFnZW50ICcke25hbWV9JyBpcyBub3cgd29ya2luZyBvbjogJHtnb2FsfWAsXG4gICAgICAgIHN0YXR1czogJ2luLXByb2dyZXNzJyxcbiAgICAgICAgYWN0aW9uc1Rha2VuOiAxXG4gICAgICB9O1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDwn6SWIEFnZW50ICcke25hbWV9JyBleGVjdXRpb24gcmVzdWx0OlxcblxcbiR7cmVzdWx0LnN1bW1hcnl9XFxuXFxuU3RhdHVzOiAke3Jlc3VsdC5zdGF0dXN9XFxuQWN0aW9ucyB0YWtlbjogJHtyZXN1bHQuYWN0aW9uc1Rha2VuIHx8IDB9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZXhlY3V0ZSBhZ2VudCAnJHtuYW1lfSc6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBleGVjdXRlIGFnZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBjcmVhdGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZzsgY29udGVudD86IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+fSkge1xuICAgIC8vIEVuc3VyZSBpbml0aWFsaXphdGlvbiBmb3IgdGVzdCBjb21wYXRpYmlsaXR5XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVJbml0aWFsaXplZCgpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHR5cGUsIGRlc2NyaXB0aW9uLCBjb250ZW50LCBtZXRhZGF0YSB9ID0gYXJncztcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgZWxlbWVudCB0eXBlXG4gICAgICBpZiAoIU9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmluY2x1ZGVzKHR5cGUgYXMgRWxlbWVudFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBJbnZhbGlkIGVsZW1lbnQgdHlwZSAnJHt0eXBlfScuIFZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyl9IChvciBsZWdhY3kgcGx1cmFsIGZvcm1zOiBwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cylgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgaW5wdXRzXG4gICAgICBjb25zdCB2YWxpZGF0ZWROYW1lID0gdmFsaWRhdGVGaWxlbmFtZShuYW1lKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChkZXNjcmlwdGlvbiwgU0VDVVJJVFlfTElNSVRTLk1BWF9NRVRBREFUQV9GSUVMRF9MRU5HVEgpO1xuICAgICAgXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFZhbGlkYXRlIGNvbnRlbnQgc2l6ZSBCRUZPUkUgcHJvY2Vzc2luZyB0byBwcmV2ZW50IG1lbW9yeSBleGhhdXN0aW9uXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIENsYXVkZSBmcm9tIHRyeWluZyB0byBvdXRwdXQgbWFzc2l2ZSBjb250ZW50IGluIHJlc3BvbnNlc1xuICAgICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKGNvbnRlbnQsIFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIENvbnRlbnQgdG9vIGxhcmdlOiAke2Vycm9yLm1lc3NhZ2V9LiBNYXhpbXVtIGFsbG93ZWQgc2l6ZSBpcyAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEh9IGNoYXJhY3RlcnMgKCR7TWF0aC5mbG9vcihTRUNVUklUWV9MSU1JVFMuTUFYX0NPTlRFTlRfTEVOR1RIIC8gMTAyNCl9S0IpLmBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWSBGSVg6IFNhbml0aXplIG1ldGFkYXRhIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgICAgY29uc3Qgc2FuaXRpemVkTWV0YWRhdGEgPSB0aGlzLnNhbml0aXplTWV0YWRhdGEobWV0YWRhdGEgfHwge30pO1xuICAgICAgXG4gICAgICAvLyBDcmVhdGUgZWxlbWVudCBiYXNlZCBvbiB0eXBlXG4gICAgICBzd2l0Y2ggKHR5cGUgYXMgRWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5QRVJTT05BOlxuICAgICAgICAgIC8vIFVzZSBleGlzdGluZyBwZXJzb25hIGNyZWF0aW9uIGxvZ2ljXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUGVyc29uYShcbiAgICAgICAgICAgIHZhbGlkYXRlZE5hbWUsIFxuICAgICAgICAgICAgdmFsaWRhdGVkRGVzY3JpcHRpb24sIFxuICAgICAgICAgICAgY29udGVudCB8fCAnJyxcbiAgICAgICAgICAgIHNhbml0aXplZE1ldGFkYXRhPy50cmlnZ2Vyc1xuICAgICAgICAgICk7XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6XG4gICAgICAgICAgY29uc3Qgc2tpbGwgPSBhd2FpdCB0aGlzLnNraWxsTWFuYWdlci5jcmVhdGUoe1xuICAgICAgICAgICAgbmFtZTogdmFsaWRhdGVkTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZGF0ZWREZXNjcmlwdGlvbixcbiAgICAgICAgICAgIC4uLnNhbml0aXplZE1ldGFkYXRhLFxuICAgICAgICAgICAgY29udGVudDogY29udGVudCB8fCAnJ1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBDcmVhdGVkIHNraWxsICcke3NraWxsLm1ldGFkYXRhLm5hbWV9JyBzdWNjZXNzZnVsbHlgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuVEVNUExBVEU6XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnRlbXBsYXRlTWFuYWdlci5jcmVhdGUoe1xuICAgICAgICAgICAgbmFtZTogdmFsaWRhdGVkTmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB2YWxpZGF0ZWREZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQgfHwgJycsXG4gICAgICAgICAgICAuLi5zYW5pdGl6ZWRNZXRhZGF0YVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKchSBDcmVhdGVkIHRlbXBsYXRlICcke3RlbXBsYXRlLm1ldGFkYXRhLm5hbWV9JyBzdWNjZXNzZnVsbHlgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgICAgXG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6XG4gICAgICAgICAgY29uc3QgYWdlbnRSZXN1bHQgPSBhd2FpdCB0aGlzLmFnZW50TWFuYWdlci5jcmVhdGUoXG4gICAgICAgICAgICB2YWxpZGF0ZWROYW1lLFxuICAgICAgICAgICAgdmFsaWRhdGVkRGVzY3JpcHRpb24sXG4gICAgICAgICAgICBjb250ZW50IHx8ICcnLFxuICAgICAgICAgICAgc2FuaXRpemVkTWV0YWRhdGFcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghYWdlbnRSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4p2MICR7YWdlbnRSZXN1bHQubWVzc2FnZX1gXG4gICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGDinIUgQ3JlYXRlZCBhZ2VudCAnJHt2YWxpZGF0ZWROYW1lfScgc3VjY2Vzc2Z1bGx5YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICAgIFxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBFbGVtZW50IHR5cGUgJyR7dHlwZX0nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBjcmVhdGlvbmBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGVsZW1lbnQ6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBjcmVhdGUgZWxlbWVudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZWRpdEVsZW1lbnQoYXJnczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBmaWVsZDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBhbnlbXX0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBuYW1lLCB0eXBlLCBmaWVsZCwgdmFsdWUgfSA9IGFyZ3M7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGVsZW1lbnQgdHlwZVxuICAgICAgaWYgKCFPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5pbmNsdWRlcyh0eXBlIGFzIEVsZW1lbnRUeXBlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGDinYwgSW52YWxpZCBlbGVtZW50IHR5cGUgJyR7dHlwZX0nLiBWYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpfSAob3IgbGVnYWN5IHBsdXJhbCBmb3JtczogcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhZ2VudHMpYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZvciBwZXJzb25hcywgdXNlIGV4aXN0aW5nIGVkaXQgbG9naWNcbiAgICAgIGlmICh0eXBlID09PSBFbGVtZW50VHlwZS5QRVJTT05BKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRQZXJzb25hKG5hbWUsIGZpZWxkLCBTdHJpbmcodmFsdWUpKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVFlQRSBTQUZFVFk6IERlZmluZSBhIGNvbW1vbiBpbnRlcmZhY2UgZm9yIGVsZW1lbnQgbWFuYWdlcnNcbiAgICAgIGludGVyZmFjZSBFbGVtZW50TWFuYWdlckJhc2U8VD4ge1xuICAgICAgICBmaW5kKHByZWRpY2F0ZTogKGVsZW1lbnQ6IFQpID0+IGJvb2xlYW4pOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+O1xuICAgICAgICBzYXZlKGVsZW1lbnQ6IFQsIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBHZXQgdGhlIGFwcHJvcHJpYXRlIG1hbmFnZXIgYmFzZWQgb24gdHlwZSB3aXRoIHByb3BlciB0eXBpbmdcbiAgICAgIGxldCBtYW5hZ2VyOiBFbGVtZW50TWFuYWdlckJhc2U8U2tpbGwgfCBUZW1wbGF0ZSB8IEFnZW50PiB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IGVsZW1lbnQ6IFNraWxsIHwgVGVtcGxhdGUgfCBBZ2VudCB8IHVuZGVmaW5lZDtcbiAgICAgIFxuICAgICAgc3dpdGNoICh0eXBlIGFzIEVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6XG4gICAgICAgICAgbWFuYWdlciA9IHRoaXMuc2tpbGxNYW5hZ2VyIGFzIEVsZW1lbnRNYW5hZ2VyQmFzZTxTa2lsbD47XG4gICAgICAgICAgZWxlbWVudCA9IGF3YWl0IHRoaXMuc2tpbGxNYW5hZ2VyLmZpbmQoKGU6IFNraWxsKSA9PiBlLm1ldGFkYXRhLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOlxuICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnRlbXBsYXRlTWFuYWdlciBhcyBFbGVtZW50TWFuYWdlckJhc2U8VGVtcGxhdGU+O1xuICAgICAgICAgIGVsZW1lbnQgPSBhd2FpdCB0aGlzLnRlbXBsYXRlTWFuYWdlci5maW5kKChlOiBUZW1wbGF0ZSkgPT4gZS5tZXRhZGF0YS5uYW1lID09PSBuYW1lKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDpcbiAgICAgICAgICBtYW5hZ2VyID0gdGhpcy5hZ2VudE1hbmFnZXIgYXMgRWxlbWVudE1hbmFnZXJCYXNlPEFnZW50PjtcbiAgICAgICAgICBlbGVtZW50ID0gYXdhaXQgdGhpcy5hZ2VudE1hbmFnZXIuZmluZCgoZTogQWdlbnQpID0+IGUubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIEVsZW1lbnQgdHlwZSAnJHt0eXBlfScgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIGVkaXRpbmdgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGVsZW1lbnQgd2FzIGZvdW5kXG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MICR7dHlwZX0gJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBIYW5kbGUgbmVzdGVkIGZpZWxkIHVwZGF0ZXMgKGUuZy4sIFwibWV0YWRhdGEuYXV0aG9yXCIpXG4gICAgICBjb25zdCBmaWVsZFBhcnRzID0gZmllbGQuc3BsaXQoJy4nKTtcbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFkgRklYOiBWYWxpZGF0ZSBmaWVsZCBuYW1lcyB0byBwcmV2ZW50IHByb3RvdHlwZSBwb2xsdXRpb25cbiAgICAgIGNvbnN0IGRhbmdlcm91c1Byb3BlcnRpZXMgPSBbJ19fcHJvdG9fXycsICdjb25zdHJ1Y3RvcicsICdwcm90b3R5cGUnXTtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBmaWVsZFBhcnRzKSB7XG4gICAgICAgIGlmIChkYW5nZXJvdXNQcm9wZXJ0aWVzLmluY2x1ZGVzKHBhcnQpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIEludmFsaWQgZmllbGQgbmFtZTogJyR7cGFydH0nIGlzIG5vdCBhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxldCB0YXJnZXQ6IGFueSA9IGVsZW1lbnQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkUGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIC8vIFNFQ1VSSVRZOiBBZGRpdGlvbmFsIGNoZWNrIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldCAhPT0gJ29iamVjdCcgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIENhbm5vdCBzZXQgcHJvcGVydHkgJyR7ZmllbGRQYXJ0c1tpXX0nIG9uIG5vbi1vYmplY3RgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICghdGFyZ2V0W2ZpZWxkUGFydHNbaV1dKSB7XG4gICAgICAgICAgLy8gU0VDVVJJVFk6IFVzZSBPYmplY3QuZGVmaW5lUHJvcGVydHkgdG8gYXZvaWQgcHJvdG90eXBlIGNoYWluIHBvbGx1dGlvblxuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGZpZWxkUGFydHNbaV0sIHtcbiAgICAgICAgICAgIHZhbHVlOiB7fSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldCA9IHRhcmdldFtmaWVsZFBhcnRzW2ldXTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHRoZSBmaWVsZFxuICAgICAgY29uc3QgbGFzdEZpZWxkID0gZmllbGRQYXJ0c1tmaWVsZFBhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgLy8gU0VDVVJJVFk6IFVzZSBPYmplY3QuZGVmaW5lUHJvcGVydHkgZm9yIHRoZSBmaW5hbCBhc3NpZ25tZW50IHRvb1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgbGFzdEZpZWxkLCB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFZFUlNJT04gRklYOiBIYW5kbGUgdmVyc2lvbiBmaWVsZCB1cGRhdGVzIGRpZmZlcmVudGx5XG4gICAgICAvLyBJZiB1c2VyIGlzIGRpcmVjdGx5IGVkaXRpbmcgdmVyc2lvbiBmaWVsZCwgZG9uJ3QgYXV0by1pbmNyZW1lbnRcbiAgICAgIGlmIChmaWVsZCA9PT0gJ3ZlcnNpb24nIHx8IGZpZWxkID09PSAnbWV0YWRhdGEudmVyc2lvbicpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvblN0cmluZyA9IFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIFxuICAgICAgICAvLyBWRVJTSU9OIFZBTElEQVRJT046IFZhbGlkYXRlIHZlcnNpb24gZm9ybWF0XG4gICAgICAgIC8vIEFjY2VwdCBzZW12ZXIgKDEuMC4wKSwgdHdvLXBhcnQgKDEuMCksIG9yIHNpbmdsZSBkaWdpdCAoMSlcbiAgICAgICAgLy8gQWxzbyBhY2NlcHRzIHByZS1yZWxlYXNlIHZlcnNpb25zICgxLjAuMC1iZXRhLCAxLjAuMC1hbHBoYS4xKVxuICAgICAgICBjb25zdCBpc1ZhbGlkVmVyc2lvbiA9IC9eKFxcZCspKFxcLlxcZCspPyhcXC5cXGQrKT8oLVthLXpBLVowLTkuLV0rKT8kLy50ZXN0KHZlcnNpb25TdHJpbmcpO1xuICAgICAgICBpZiAoIWlzVmFsaWRWZXJzaW9uKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIEludmFsaWQgdmVyc2lvbiBmb3JtYXQ6ICcke3ZlcnNpb25TdHJpbmd9Jy4gUGxlYXNlIHVzZSBmb3JtYXQgbGlrZSAxLjAuMCwgMS4wLCBvciAxYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBFUlJPUiBIQU5ETElORzogV3JhcCB2ZXJzaW9uIHVwZGF0ZSBpbiB0cnktY2F0Y2hcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBVcGRhdGUgYm90aCBsb2NhdGlvbnMgdG8gZW5zdXJlIGNvbnNpc3RlbmN5XG4gICAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gdmVyc2lvblN0cmluZztcbiAgICAgICAgICBpZiAoZWxlbWVudC5tZXRhZGF0YSkge1xuICAgICAgICAgICAgZWxlbWVudC5tZXRhZGF0YS52ZXJzaW9uID0gdmVyc2lvblN0cmluZztcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gdXBkYXRlIHZlcnNpb24gZm9yICR7bmFtZX06YCwgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYOKdjCBGYWlsZWQgdG8gdXBkYXRlIHZlcnNpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igb3RoZXIgZmllbGQgZWRpdHMsIGF1dG8taW5jcmVtZW50IHZlcnNpb25cbiAgICAgICAgLy8gVkVSU0lPTiBGSVg6IFVwZGF0ZSBib3RoIGVsZW1lbnQudmVyc2lvbiBBTkQgZWxlbWVudC5tZXRhZGF0YS52ZXJzaW9uXG4gICAgICAgIC8vIFByZXZpb3VzbHk6IE9ubHkgZWxlbWVudC52ZXJzaW9uIHdhcyB1cGRhdGVkLCBidXQgc29tZSBtYW5hZ2VycyByZWFkIGZyb20gbWV0YWRhdGEudmVyc2lvblxuICAgICAgICAvLyBOb3c6IEtlZXAgYm90aCBpbiBzeW5jIHRvIGVuc3VyZSB2ZXJzaW9uIHBlcnNpc3RzIGNvcnJlY3RseVxuICAgICAgICBcbiAgICAgICAgLy8gRVJST1IgSEFORExJTkc6IFdyYXAgYXV0by1pbmNyZW1lbnQgaW4gdHJ5LWNhdGNoXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQudmVyc2lvbikge1xuICAgICAgICAgICAgLy8gUFJFLVJFTEVBU0UgSEFORExJTkc6IENoZWNrIGZvciBwcmUtcmVsZWFzZSB2ZXJzaW9uc1xuICAgICAgICAgICAgY29uc3QgcHJlUmVsZWFzZU1hdGNoID0gZWxlbWVudC52ZXJzaW9uLm1hdGNoKC9eKFxcZCtcXC5cXGQrXFwuXFxkKykoLShbYS16QS1aMC05Li1dKykpPyQvKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHByZVJlbGVhc2VNYXRjaCkge1xuICAgICAgICAgICAgICAvLyBIYW5kbGUgcHJlLXJlbGVhc2UgdmVyc2lvbnMgKGUuZy4sIDEuMC4wLWJldGEuMSlcbiAgICAgICAgICAgICAgY29uc3QgYmFzZVZlcnNpb24gPSBwcmVSZWxlYXNlTWF0Y2hbMV07XG4gICAgICAgICAgICAgIGNvbnN0IHByZVJlbGVhc2VUYWcgPSBwcmVSZWxlYXNlTWF0Y2hbM107XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBpZiAocHJlUmVsZWFzZVRhZykge1xuICAgICAgICAgICAgICAgIC8vIElmIGl0IGhhcyBhIHByZS1yZWxlYXNlIHRhZywgaW5jcmVtZW50IHRoZSBwcmUtcmVsZWFzZSBudW1iZXJcbiAgICAgICAgICAgICAgICBjb25zdCBwcmVSZWxlYXNlTnVtYmVyTWF0Y2ggPSBwcmVSZWxlYXNlVGFnLm1hdGNoKC9eKFthLXpBLVpdKylcXC4/KFxcZCspPyQvKTtcbiAgICAgICAgICAgICAgICBpZiAocHJlUmVsZWFzZU51bWJlck1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBwcmVSZWxlYXNlVHlwZSA9IHByZVJlbGVhc2VOdW1iZXJNYXRjaFsxXTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByZVJlbGVhc2VOdW1iZXIgPSBwYXJzZUludChwcmVSZWxlYXNlTnVtYmVyTWF0Y2hbMl0gfHwgJzAnKSArIDE7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSBgJHtiYXNlVmVyc2lvbn0tJHtwcmVSZWxlYXNlVHlwZX0uJHtwcmVSZWxlYXNlTnVtYmVyfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXggcHJlLXJlbGVhc2UsIGp1c3QgaW5jcmVtZW50IHBhdGNoXG4gICAgICAgICAgICAgICAgICBjb25zdCBbbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSBiYXNlVmVyc2lvbi5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgZWxlbWVudC52ZXJzaW9uID0gYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2ggKyAxfWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFJlZ3VsYXIgc2VtdmVyLCBpbmNyZW1lbnQgcGF0Y2hcbiAgICAgICAgICAgICAgICBjb25zdCBbbWFqb3IsIG1pbm9yLCBwYXRjaF0gPSBiYXNlVmVyc2lvbi5zcGxpdCgnLicpLm1hcChOdW1iZXIpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQudmVyc2lvbiA9IGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNoICsgMX1gO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBIYW5kbGUgbm9uLXNlbXZlciB2ZXJzaW9uc1xuICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uUGFydHMgPSBlbGVtZW50LnZlcnNpb24uc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgaWYgKHZlcnNpb25QYXJ0cy5sZW5ndGggPj0gMykge1xuICAgICAgICAgICAgICAgIC8vIFN0YW5kYXJkIHNlbXZlciBmb3JtYXQgKGUuZy4sIDEuMC4wKVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGNoID0gcGFyc2VJbnQodmVyc2lvblBhcnRzWzJdKSB8fCAwO1xuICAgICAgICAgICAgICAgIHZlcnNpb25QYXJ0c1syXSA9IFN0cmluZyhwYXRjaCArIDEpO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQudmVyc2lvbiA9IHZlcnNpb25QYXJ0cy5qb2luKCcuJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvblBhcnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIC8vIFR3by1wYXJ0IHZlcnNpb24gKGUuZy4sIDEuMCkgLSBhZGQgcGF0Y2ggdmVyc2lvblxuICAgICAgICAgICAgICAgIGVsZW1lbnQudmVyc2lvbiA9IGAke2VsZW1lbnQudmVyc2lvbn0uMWA7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvblBhcnRzLmxlbmd0aCA9PT0gMSAmJiAvXlxcZCskLy50ZXN0KHZlcnNpb25QYXJ0c1swXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5nbGUgbnVtYmVyIHZlcnNpb24gKGUuZy4sIDEpIC0gY29udmVydCB0byBzZW12ZXJcbiAgICAgICAgICAgICAgICBlbGVtZW50LnZlcnNpb24gPSBgJHtlbGVtZW50LnZlcnNpb259LjAuMWA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTm9uLXN0YW5kYXJkIHZlcnNpb24gLSBhcHBlbmQgb3IgcmVwbGFjZSB3aXRoIHN0YW5kYXJkIGZvcm1hdFxuICAgICAgICAgICAgICAgIGVsZW1lbnQudmVyc2lvbiA9ICcxLjAuMSc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm8gdmVyc2lvbiAtIHNldCBpbml0aWFsIHZlcnNpb25cbiAgICAgICAgICAgIGVsZW1lbnQudmVyc2lvbiA9ICcxLjAuMCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIC8vIEVuc3VyZSBtZXRhZGF0YS52ZXJzaW9uIGlzIGFsc28gdXBkYXRlZCBmb3IgbWFuYWdlcnMgdGhhdCB1c2UgaXRcbiAgICAgICAgICBpZiAoZWxlbWVudC5tZXRhZGF0YSkge1xuICAgICAgICAgICAgZWxlbWVudC5tZXRhZGF0YS52ZXJzaW9uID0gZWxlbWVudC52ZXJzaW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBhdXRvLWluY3JlbWVudCB2ZXJzaW9uIGZvciAke25hbWV9OmAsIGVycm9yKTtcbiAgICAgICAgICAvLyBEb24ndCBmYWlsIHRoZSBlbnRpcmUgb3BlcmF0aW9uLCBqdXN0IGxvZyB0aGUgZXJyb3JcbiAgICAgICAgICAvLyBWZXJzaW9uIHdpbGwgcmVtYWluIHVuY2hhbmdlZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNhdmUgdGhlIGVsZW1lbnQgLSBuZWVkIHRvIGRldGVybWluZSBmaWxlbmFtZVxuICAgICAgY29uc3QgZmlsZW5hbWUgPSBgJHtlbGVtZW50Lm1ldGFkYXRhLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOS1dL2csICctJyl9Lm1kYDtcbiAgICAgIC8vIFRZUEUgU0FGRVRZOiBObyBuZWVkIGZvciAnYXMgYW55JyBjYXN0IGFueW1vcmUgd2l0aCBwcm9wZXIgdHlwaW5nXG4gICAgICBhd2FpdCBtYW5hZ2VyIS5zYXZlKGVsZW1lbnQsIGZpbGVuYW1lKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4pyFIFVwZGF0ZWQgJHt0eXBlfSAnJHtuYW1lfScgLSAke2ZpZWxkfSBzZXQgdG86ICR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIGVkaXQgZWxlbWVudDpgLCBlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGDinYwgRmFpbGVkIHRvIGVkaXQgZWxlbWVudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgdmFsaWRhdGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgc3RyaWN0PzogYm9vbGVhbn0pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBuYW1lLCB0eXBlLCBzdHJpY3QgPSBmYWxzZSB9ID0gYXJncztcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgZWxlbWVudCB0eXBlXG4gICAgICBpZiAoIU9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmluY2x1ZGVzKHR5cGUgYXMgRWxlbWVudFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBJbnZhbGlkIGVsZW1lbnQgdHlwZSAnJHt0eXBlfScuIFZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyl9IChvciBsZWdhY3kgcGx1cmFsIGZvcm1zOiBwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cylgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRm9yIHBlcnNvbmFzLCB1c2UgZXhpc3RpbmcgdmFsaWRhdGlvbiBsb2dpY1xuICAgICAgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLlBFUlNPTkEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVQZXJzb25hKG5hbWUpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBHZXQgdGhlIGFwcHJvcHJpYXRlIG1hbmFnZXIgYmFzZWQgb24gdHlwZVxuICAgICAgbGV0IG1hbmFnZXI6IFNraWxsTWFuYWdlciB8IFRlbXBsYXRlTWFuYWdlciB8IEFnZW50TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAgICAgc3dpdGNoICh0eXBlIGFzIEVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuU0tJTEw6XG4gICAgICAgICAgbWFuYWdlciA9IHRoaXMuc2tpbGxNYW5hZ2VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlRFTVBMQVRFOlxuICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnRlbXBsYXRlTWFuYWdlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5BR0VOVDpcbiAgICAgICAgICBtYW5hZ2VyID0gdGhpcy5hZ2VudE1hbmFnZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIEVsZW1lbnQgdHlwZSAnJHt0eXBlfScgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHZhbGlkYXRpb25gXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEZpbmQgdGhlIGVsZW1lbnRcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCBtYW5hZ2VyIS5maW5kKChlOiBhbnkpID0+IGUubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MICR7dHlwZX0gJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQZXJmb3JtIHZhbGlkYXRpb25cbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBlbGVtZW50LnZhbGlkYXRlKCk7XG4gICAgICBcbiAgICAgIC8vIEZvcm1hdCB2YWxpZGF0aW9uIHJlcG9ydFxuICAgICAgbGV0IHJlcG9ydCA9IGDwn5SNIFZhbGlkYXRpb24gUmVwb3J0IGZvciAke3R5cGV9ICcke25hbWV9JzpcXG5gO1xuICAgICAgcmVwb3J0ICs9IGAke3ZhbGlkYXRpb25SZXN1bHQudmFsaWQgPyAn4pyFJyA6ICfinYwnfSBTdGF0dXM6ICR7dmFsaWRhdGlvblJlc3VsdC52YWxpZCA/ICdWYWxpZCcgOiAnSW52YWxpZCd9XFxuXFxuYDtcbiAgICAgIFxuICAgICAgaWYgKHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzICYmIHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGDinYwgRXJyb3JzICgke3ZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmxlbmd0aH0pOlxcbmA7XG4gICAgICAgIHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLmZvckVhY2goKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICByZXBvcnQgKz0gYCAgIOKAoiAke2Vycm9yLmZpZWxkIHx8ICdHZW5lcmFsJ306ICR7ZXJyb3IubWVzc2FnZX1cXG5gO1xuICAgICAgICAgIGlmIChlcnJvci5maXgpIHtcbiAgICAgICAgICAgIHJlcG9ydCArPSBgICAgICDwn5KhIEZpeDogJHtlcnJvci5maXh9XFxuYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXBvcnQgKz0gJ1xcbic7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzICYmIHZhbGlkYXRpb25SZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXBvcnQgKz0gYOKaoO+4jyAgV2FybmluZ3MgKCR7dmFsaWRhdGlvblJlc3VsdC53YXJuaW5ncy5sZW5ndGh9KTpcXG5gO1xuICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Lndhcm5pbmdzLmZvckVhY2goKHdhcm5pbmc6IGFueSkgPT4ge1xuICAgICAgICAgIHJlcG9ydCArPSBgICAg4oCiICR7d2FybmluZy5maWVsZCB8fCAnR2VuZXJhbCd9OiAke3dhcm5pbmcubWVzc2FnZX1cXG5gO1xuICAgICAgICAgIGlmICh3YXJuaW5nLnN1Z2dlc3Rpb24pIHtcbiAgICAgICAgICAgIHJlcG9ydCArPSBgICAgICDwn5KhIFN1Z2dlc3Rpb246ICR7d2FybmluZy5zdWdnZXN0aW9ufVxcbmA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdC5zdWdnZXN0aW9ucyAmJiB2YWxpZGF0aW9uUmVzdWx0LnN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGDwn5KhIFN1Z2dlc3Rpb25zOlxcbmA7XG4gICAgICAgIHZhbGlkYXRpb25SZXN1bHQuc3VnZ2VzdGlvbnMuZm9yRWFjaCgoc3VnZ2VzdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmVwb3J0ICs9IGAgICDigKIgJHtzdWdnZXN0aW9ufVxcbmA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBBZGQgc3RyaWN0IG1vZGUgYWRkaXRpb25hbCBjaGVja3MgaWYgcmVxdWVzdGVkXG4gICAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgIHJlcG9ydCArPSAnXFxu8J+TiyBTdHJpY3QgTW9kZTogQWRkaXRpb25hbCBxdWFsaXR5IGNoZWNrcyBhcHBsaWVkJztcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiByZXBvcnRcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHZhbGlkYXRlIGVsZW1lbnQ6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byB2YWxpZGF0ZSBlbGVtZW50OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICBhc3luYyBkZWxldGVFbGVtZW50KGFyZ3M6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgZGVsZXRlRGF0YT86IGJvb2xlYW59KSB7XG4gICAgLy8gRW5zdXJlIGluaXRpYWxpemF0aW9uIGZvciB0ZXN0IGNvbXBhdGliaWxpdHlcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbmFtZSwgdHlwZSwgZGVsZXRlRGF0YSB9ID0gYXJncztcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgZWxlbWVudCB0eXBlXG4gICAgICBpZiAoIU9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmluY2x1ZGVzKHR5cGUgYXMgRWxlbWVudFR5cGUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKdjCBJbnZhbGlkIGVsZW1lbnQgdHlwZTogJHt0eXBlfVxcblZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpLmpvaW4oJywgJyl9IChvciBsZWdhY3kgcGx1cmFsIGZvcm1zOiBwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIGFnZW50cylgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gR2V0IHRoZSBhcHByb3ByaWF0ZSBtYW5hZ2VyIGJhc2VkIG9uIHR5cGVcbiAgICAgIGxldCBtYW5hZ2VyOiBTa2lsbE1hbmFnZXIgfCBUZW1wbGF0ZU1hbmFnZXIgfCBBZ2VudE1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgICAgIHN3aXRjaCAodHlwZSBhcyBFbGVtZW50VHlwZSkge1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlNLSUxMOlxuICAgICAgICAgIG1hbmFnZXIgPSB0aGlzLnNraWxsTWFuYWdlcjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBFbGVtZW50VHlwZS5URU1QTEFURTpcbiAgICAgICAgICBtYW5hZ2VyID0gdGhpcy50ZW1wbGF0ZU1hbmFnZXI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgRWxlbWVudFR5cGUuQUdFTlQ6XG4gICAgICAgICAgbWFuYWdlciA9IHRoaXMuYWdlbnRNYW5hZ2VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIEVsZW1lbnRUeXBlLlBFUlNPTkE6XG4gICAgICAgICAgLy8gRm9yIHBlcnNvbmFzLCB1c2UgYSBkaWZmZXJlbnQgYXBwcm9hY2hcbiAgICAgICAgICAvLyBwZXJzb25hc0RpciBpcyBndWFyYW50ZWVkIHRvIGJlIHNldCBhZnRlciBlbnN1cmVJbml0aWFsaXplZCgpXG4gICAgICAgICAgY29uc3QgcGVyc29uYVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciEsIGAke25hbWV9Lm1kYCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGZzLmFjY2VzcyhwZXJzb25hUGF0aCk7XG4gICAgICAgICAgICBhd2FpdCBmcy51bmxpbmsocGVyc29uYVBhdGgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBSZWxvYWQgcGVyc29uYXMgdG8gdXBkYXRlIHRoZSBjYWNoZVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBg4pyFIFN1Y2Nlc3NmdWxseSBkZWxldGVkIHBlcnNvbmEgJyR7bmFtZX0nYFxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgICAgdGV4dDogYOKdjCAke3R5cGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eXBlLnNsaWNlKDEpfSAnJHtuYW1lfScgbm90IGZvdW5kYFxuICAgICAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MIEVsZW1lbnQgdHlwZSAnJHt0eXBlfScgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIGRlbGV0aW9uYFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbnN1cmUgbWFuYWdlciB3YXMgYXNzaWduZWQgKFR5cGVTY3JpcHQgdHlwZSBzYWZldHkpXG4gICAgICBpZiAoIW1hbmFnZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MIEVsZW1lbnQgdHlwZSAnJHt0eXBlfScgaXMgbm90IHN1cHBvcnRlZCBmb3IgZGVsZXRpb25gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRmluZCB0aGUgZWxlbWVudCBmaXJzdCB0byBjaGVjayBpZiBpdCBleGlzdHNcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCBtYW5hZ2VyIS5maW5kKChlOiBhbnkpID0+IGUubWV0YWRhdGEubmFtZSA9PT0gbmFtZSk7XG4gICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBg4p2MICR7dHlwZX0gJyR7bmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBmb3IgYXNzb2NpYXRlZCBkYXRhIGZpbGVzXG4gICAgICBsZXQgZGF0YUZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgXG4gICAgICAvLyBBZ2VudC1zcGVjaWZpYzogQ2hlY2sgZm9yIHN0YXRlIGZpbGVzXG4gICAgICBpZiAodHlwZSA9PT0gRWxlbWVudFR5cGUuQUdFTlQpIHtcbiAgICAgICAgY29uc3Qgc3RhdGVEaXIgPSBwYXRoLmpvaW4odGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuQUdFTlQpLCAnLnN0YXRlJyk7XG4gICAgICAgIGNvbnN0IHN0YXRlRmlsZSA9IHBhdGguam9pbihzdGF0ZURpciwgYCR7bmFtZX0tc3RhdGUuanNvbmApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHN0YXQgPSBhd2FpdCBmcy5zdGF0KHN0YXRlRmlsZSk7XG4gICAgICAgICAgZGF0YUZpbGVzLnB1c2goYC0gLnN0YXRlLyR7bmFtZX0tc3RhdGUuanNvbiAoJHsoc3RhdC5zaXplIC8gMTAyNCkudG9GaXhlZCgyKX0gS0IpYCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gTm8gc3RhdGUgZmlsZSBleGlzdHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBNZW1vcnktc3BlY2lmaWM6IENoZWNrIGZvciBzdG9yYWdlIGZpbGVzXG4gICAgICBpZiAodHlwZSA9PT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2VEaXIgPSBwYXRoLmpvaW4odGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuTUVNT1JZKSwgJy5zdG9yYWdlJyk7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2VGaWxlID0gcGF0aC5qb2luKHN0b3JhZ2VEaXIsIGAke25hbWV9LW1lbW9yeS5qc29uYCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc3RhdCA9IGF3YWl0IGZzLnN0YXQoc3RvcmFnZUZpbGUpO1xuICAgICAgICAgIGRhdGFGaWxlcy5wdXNoKGAtIC5zdG9yYWdlLyR7bmFtZX0tbWVtb3J5Lmpzb24gKCR7KHN0YXQuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9IEtCKWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIE5vIHN0b3JhZ2UgZmlsZSBleGlzdHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbnNlbWJsZS1zcGVjaWZpYzogQ2hlY2sgZm9yIGNvbmZpZyBmaWxlc1xuICAgICAgaWYgKHR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZ0RpciA9IHBhdGguam9pbih0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5FTlNFTUJMRSksICcuY29uZmlncycpO1xuICAgICAgICBjb25zdCBjb25maWdGaWxlID0gcGF0aC5qb2luKGNvbmZpZ0RpciwgYCR7bmFtZX0tY29uZmlnLmpzb25gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChjb25maWdGaWxlKTtcbiAgICAgICAgICBkYXRhRmlsZXMucHVzaChgLSAuY29uZmlncy8ke25hbWV9LWNvbmZpZy5qc29uICgkeyhzdGF0LnNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfSBLQilgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBObyBjb25maWcgZmlsZSBleGlzdHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBJZiBkYXRhIGZpbGVzIGV4aXN0IGFuZCBkZWxldGVEYXRhIGlzIG5vdCBzcGVjaWZpZWQsIHdlIG5lZWQgdG8gaW5mb3JtIHRoZSB1c2VyXG4gICAgICBpZiAoZGF0YUZpbGVzLmxlbmd0aCA+IDAgJiYgZGVsZXRlRGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYOKaoO+4jyAgVGhpcyAke3R5cGV9IGhhcyBhc3NvY2lhdGVkIGRhdGEgZmlsZXM6XFxuJHtkYXRhRmlsZXMuam9pbignXFxuJyl9XFxuXFxuV291bGQgeW91IGxpa2UgdG8gZGVsZXRlIHRoZXNlIGRhdGEgZmlsZXMgYXMgd2VsbD9cXG5cXG7igKIgVG8gZGVsZXRlIGV2ZXJ5dGhpbmcgKGVsZW1lbnQgKyBkYXRhKSwgc2F5OiBcIlllcywgZGVsZXRlIGFsbCBkYXRhXCJcXG7igKIgVG8ga2VlcCB0aGUgZGF0YSBmaWxlcywgc2F5OiBcIk5vLCBrZWVwIHRoZSBkYXRhXCJcXG7igKIgVG8gY2FuY2VsLCBzYXk6IFwiQ2FuY2VsXCJgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGVsZXRlIHRoZSBtYWluIGVsZW1lbnQgZmlsZVxuICAgICAgY29uc3QgZmlsZW5hbWUgPSBgJHtzbHVnaWZ5KG5hbWUpfS5tZGA7XG4gICAgICBjb25zdCBmaWxlcGF0aCA9IHBhdGguam9pbih0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcih0eXBlIGFzIEVsZW1lbnRUeXBlKSwgZmlsZW5hbWUpO1xuICAgICAgXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsoZmlsZXBhdGgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4p2MICR7dHlwZX0gZmlsZSAnJHtmaWxlbmFtZX0nIG5vdCBmb3VuZGBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGVsZXRlIGFzc29jaWF0ZWQgZGF0YSBmaWxlcyBpZiByZXF1ZXN0ZWRcbiAgICAgIGlmIChkZWxldGVEYXRhICYmIGRhdGFGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWREYXRhRmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZSA9PT0gRWxlbWVudFR5cGUuQUdFTlQpIHtcbiAgICAgICAgICBjb25zdCBzdGF0ZUZpbGUgPSBwYXRoLmpvaW4odGhpcy5wb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuQUdFTlQpLCAnLnN0YXRlJywgYCR7bmFtZX0tc3RhdGUuanNvbmApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy51bmxpbmsoc3RhdGVGaWxlKTtcbiAgICAgICAgICAgIHVwZGF0ZWREYXRhRmlsZXMucHVzaChgJHtkYXRhRmlsZXNbMF19IOKckyBkZWxldGVkYCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIExvZyBidXQgZG9uJ3QgZmFpbCBpZiBzdGF0ZSBmaWxlIGRlbGV0aW9uIGZhaWxzXG4gICAgICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGRlbGV0ZSBhZ2VudCBzdGF0ZSBmaWxlOiAke2Vycm9yfWApO1xuICAgICAgICAgICAgdXBkYXRlZERhdGFGaWxlcy5wdXNoKGAke2RhdGFGaWxlc1swXX0g4pqg77iPIGRlbGV0aW9uIGZhaWxlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBFbGVtZW50VHlwZS5NRU1PUlkpIHtcbiAgICAgICAgICBjb25zdCBzdG9yYWdlRmlsZSA9IHBhdGguam9pbih0aGlzLnBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5NRU1PUlkpLCAnLnN0b3JhZ2UnLCBgJHtuYW1lfS1tZW1vcnkuanNvbmApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy51bmxpbmsoc3RvcmFnZUZpbGUpO1xuICAgICAgICAgICAgdXBkYXRlZERhdGFGaWxlcy5wdXNoKGAke2RhdGFGaWxlc1swXX0g4pyTIGRlbGV0ZWRgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gTG9nIGJ1dCBkb24ndCBmYWlsIGlmIHN0b3JhZ2UgZmlsZSBkZWxldGlvbiBmYWlsc1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBkZWxldGUgbWVtb3J5IHN0b3JhZ2UgZmlsZTogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgIHVwZGF0ZWREYXRhRmlsZXMucHVzaChgJHtkYXRhRmlsZXNbMF19IOKaoO+4jyBkZWxldGlvbiBmYWlsZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRWxlbWVudFR5cGUuRU5TRU1CTEUpIHtcbiAgICAgICAgICBjb25zdCBjb25maWdGaWxlID0gcGF0aC5qb2luKHRoaXMucG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLkVOU0VNQkxFKSwgJy5jb25maWdzJywgYCR7bmFtZX0tY29uZmlnLmpzb25gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnMudW5saW5rKGNvbmZpZ0ZpbGUpO1xuICAgICAgICAgICAgdXBkYXRlZERhdGFGaWxlcy5wdXNoKGAke2RhdGFGaWxlc1swXX0g4pyTIGRlbGV0ZWRgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gTG9nIGJ1dCBkb24ndCBmYWlsIGlmIGNvbmZpZyBmaWxlIGRlbGV0aW9uIGZhaWxzXG4gICAgICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGRlbGV0ZSBlbnNlbWJsZSBjb25maWcgZmlsZTogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgIHVwZGF0ZWREYXRhRmlsZXMucHVzaChgJHtkYXRhRmlsZXNbMF19IOKaoO+4jyBkZWxldGlvbiBmYWlsZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGRhdGFGaWxlcyA9IHVwZGF0ZWREYXRhRmlsZXM7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEJ1aWxkIHN1Y2Nlc3MgbWVzc2FnZVxuICAgICAgbGV0IG1lc3NhZ2UgPSBg4pyFIFN1Y2Nlc3NmdWxseSBkZWxldGVkICR7dHlwZX0gJyR7bmFtZX0nYDtcbiAgICAgIGlmIChkYXRhRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoZGVsZXRlRGF0YSkge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYFxcblxcbkFzc29jaWF0ZWQgZGF0YSBmaWxlczpcXG4ke2RhdGFGaWxlcy5qb2luKCdcXG4nKX1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYFxcblxcbuKaoO+4jyBBc3NvY2lhdGVkIGRhdGEgZmlsZXMgd2VyZSBwcmVzZXJ2ZWQ6XFxuJHtkYXRhRmlsZXMuam9pbignXFxuJyl9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IG1lc3NhZ2VcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIGVsZW1lbnQ6YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBg4p2MIEZhaWxlZCB0byBkZWxldGUgZWxlbWVudDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIGNoZWNrUmF0ZUxpbWl0IGFuZCBmZXRjaEZyb21HaXRIdWIgYXJlIG5vdyBoYW5kbGVkIGJ5IEdpdEh1YkNsaWVudFxuXG4gIGFzeW5jIGJyb3dzZUNvbGxlY3Rpb24oc2VjdGlvbj86IHN0cmluZywgdHlwZT86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBGSVggIzQ3MTogUmVwbGFjZSBsZWdhY3kgY2F0ZWdvcnkgdmFsaWRhdGlvbiB3aXRoIHByb3BlciBzZWN0aW9uL3R5cGUgdmFsaWRhdGlvblxuICAgICAgLy8gVmFsaWQgc2VjdGlvbnM6IGxpYnJhcnksIHNob3djYXNlLCBjYXRhbG9nXG4gICAgICAvLyBWYWxpZCB0eXBlcyBmb3IgTUNQOiBwZXJzb25hcywgc2tpbGxzLCBhZ2VudHMsIHRlbXBsYXRlcyAob3RoZXJzIGZpbHRlcmVkIHBlciBJc3N1ZSAjMTQ0KVxuICAgICAgLy8gTm90ZTogdG9vbHMsIHByb21wdHMsIGVuc2VtYmxlcywgbWVtb3JpZXMgZXhpc3QgaW4gY29sbGVjdGlvbiBidXQgYXJlIGZpbHRlcmVkIGZyb20gTUNQXG4gICAgICBjb25zdCB2YWxpZFNlY3Rpb25zID0gWydsaWJyYXJ5JywgJ3Nob3djYXNlJywgJ2NhdGFsb2cnXTtcbiAgICAgIFxuICAgICAgLy8g4pqg77iPIENSSVRJQ0FMOiBXaGVuIGFkZGluZyBuZXcgZWxlbWVudCB0eXBlcywgeW91IE1VU1QgdXBkYXRlIHRoaXMgYXJyYXkhXG4gICAgICAvLyBTZWUgZG9jcy9kZXZlbG9wbWVudC9BRERJTkdfTkVXX0VMRU1FTlRfVFlQRVNfQ0hFQ0tMSVNULm1kIGZvciBjb21wbGV0ZSBjaGVja2xpc3RcbiAgICAgIC8vIFRoaXMgYXJyYXkgaXMgb2Z0ZW4gZm9yZ290dGVuIGFuZCBjYXVzZXMgdmFsaWRhdGlvbiBmYWlsdXJlcyBmb3IgbmV3IHR5cGVzXG4gICAgICBjb25zdCB2YWxpZFR5cGVzID0gWydwZXJzb25hcycsICdza2lsbHMnLCAnYWdlbnRzJywgJ3RlbXBsYXRlcyddOyAgLy8gT25seSBNQ1Atc3VwcG9ydGVkIHR5cGVzXG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIHNlY3Rpb24gaWYgcHJvdmlkZWRcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFNlY3Rpb24gPSBzZWN0aW9uID8gc2FuaXRpemVJbnB1dChzZWN0aW9uLnRvTG93ZXJDYXNlKCkpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHZhbGlkYXRlZFNlY3Rpb24gJiYgIXZhbGlkU2VjdGlvbnMuaW5jbHVkZXModmFsaWRhdGVkU2VjdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNlY3Rpb24gJyR7dmFsaWRhdGVkU2VjdGlvbn0nLiBNdXN0IGJlIG9uZSBvZjogJHt2YWxpZFNlY3Rpb25zLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIHR5cGUgaWYgcHJvdmlkZWQgKG9ubHkgdmFsaWQgd2hlbiBzZWN0aW9uIGlzICdsaWJyYXJ5JylcbiAgICAgIGNvbnN0IHZhbGlkYXRlZFR5cGUgPSB0eXBlID8gc2FuaXRpemVJbnB1dCh0eXBlLnRvTG93ZXJDYXNlKCkpIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHZhbGlkYXRlZFR5cGUgJiYgdmFsaWRhdGVkU2VjdGlvbiA9PT0gJ2xpYnJhcnknICYmICF2YWxpZFR5cGVzLmluY2x1ZGVzKHZhbGlkYXRlZFR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0eXBlICcke3ZhbGlkYXRlZFR5cGV9Jy4gTXVzdCBiZSBvbmUgb2Y6ICR7dmFsaWRUeXBlcy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuICAgICAgaWYgKHZhbGlkYXRlZFR5cGUgJiYgdmFsaWRhdGVkU2VjdGlvbiAhPT0gJ2xpYnJhcnknKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHlwZSBwYXJhbWV0ZXIgaXMgb25seSB2YWxpZCB3aGVuIHNlY3Rpb24gaXMgXCJsaWJyYXJ5XCInKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uQnJvd3Nlci5icm93c2VDb2xsZWN0aW9uKHZhbGlkYXRlZFNlY3Rpb24sIHZhbGlkYXRlZFR5cGUpO1xuICAgICAgXG4gICAgICAvLyBIYW5kbGUgc2VjdGlvbnMgdmlld1xuICAgICAgY29uc3QgaXRlbXMgPSByZXN1bHQuaXRlbXM7XG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gcmVzdWx0LnNlY3Rpb25zIHx8IHJlc3VsdC5jYXRlZ29yaWVzO1xuICAgICAgXG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5jb2xsZWN0aW9uQnJvd3Nlci5mb3JtYXRCcm93c2VSZXN1bHRzKFxuICAgICAgICBpdGVtcywgXG4gICAgICAgIGNhdGVnb3JpZXMsIFxuICAgICAgICB2YWxpZGF0ZWRTZWN0aW9uLCBcbiAgICAgICAgdmFsaWRhdGVkVHlwZSwgXG4gICAgICAgIHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpXG4gICAgICApO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgQ29sbGVjdGlvbiBicm93c2luZyBmYWlsZWQ6ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZWFyY2hDb2xsZWN0aW9uKHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5oYW5jZWQgaW5wdXQgdmFsaWRhdGlvbiBmb3Igc2VhcmNoIHF1ZXJ5XG4gICAgICBjb25zdCB2YWxpZGF0ZWRRdWVyeSA9IE1DUElucHV0VmFsaWRhdG9yLnZhbGlkYXRlU2VhcmNoUXVlcnkocXVlcnkpO1xuICAgICAgXG4gICAgICBjb25zdCBpdGVtcyA9IGF3YWl0IHRoaXMuY29sbGVjdGlvblNlYXJjaC5zZWFyY2hDb2xsZWN0aW9uKHZhbGlkYXRlZFF1ZXJ5KTtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmNvbGxlY3Rpb25TZWFyY2guZm9ybWF0U2VhcmNoUmVzdWx0cyhpdGVtcywgdmFsaWRhdGVkUXVlcnksIHRoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEVycm9yIHNlYXJjaGluZyBjb2xsZWN0aW9uOiAke3Nhbml0aXplZC5tZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2VhcmNoQ29sbGVjdGlvbkVuaGFuY2VkKHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM6IGFueSA9IHt9KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb24gZm9yIHNlYXJjaCBxdWVyeVxuICAgICAgY29uc3QgdmFsaWRhdGVkUXVlcnkgPSBNQ1BJbnB1dFZhbGlkYXRvci52YWxpZGF0ZVNlYXJjaFF1ZXJ5KHF1ZXJ5KTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgYW5kIHNhbml0aXplIG9wdGlvbnNcbiAgICAgIGNvbnN0IHZhbGlkYXRlZE9wdGlvbnMgPSB7XG4gICAgICAgIGVsZW1lbnRUeXBlOiBvcHRpb25zLmVsZW1lbnRUeXBlID8gU3RyaW5nKG9wdGlvbnMuZWxlbWVudFR5cGUpIDogdW5kZWZpbmVkLFxuICAgICAgICBjYXRlZ29yeTogb3B0aW9ucy5jYXRlZ29yeSA/IFN0cmluZyhvcHRpb25zLmNhdGVnb3J5KSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcGFnZTogb3B0aW9ucy5wYWdlID8gTWF0aC5tYXgoMSwgcGFyc2VJbnQob3B0aW9ucy5wYWdlKSB8fCAxKSA6IDEsXG4gICAgICAgIHBhZ2VTaXplOiBvcHRpb25zLnBhZ2VTaXplID8gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgxLCBwYXJzZUludChvcHRpb25zLnBhZ2VTaXplKSB8fCAyNSkpIDogMjUsXG4gICAgICAgIHNvcnRCeTogb3B0aW9ucy5zb3J0QnkgJiYgWydyZWxldmFuY2UnLCAnbmFtZScsICdkYXRlJ10uaW5jbHVkZXMob3B0aW9ucy5zb3J0QnkpID8gb3B0aW9ucy5zb3J0QnkgOiAncmVsZXZhbmNlJ1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuY29sbGVjdGlvblNlYXJjaC5zZWFyY2hDb2xsZWN0aW9uV2l0aE9wdGlvbnModmFsaWRhdGVkUXVlcnksIHZhbGlkYXRlZE9wdGlvbnMpO1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuY29sbGVjdGlvblNlYXJjaC5mb3JtYXRTZWFyY2hSZXN1bHRzV2l0aFBhZ2luYXRpb24ocmVzdWx0cywgdGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCkpO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiB0ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXJyb3Igc2VhcmNoaW5nIGNvbGxlY3Rpb246ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDb2xsZWN0aW9uQ29udGVudChwYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBtZXRhZGF0YSwgY29udGVudCB9ID0gYXdhaXQgdGhpcy5wZXJzb25hRGV0YWlscy5nZXRDb2xsZWN0aW9uQ29udGVudChwYXRoKTtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnBlcnNvbmFEZXRhaWxzLmZvcm1hdFBlcnNvbmFEZXRhaWxzKG1ldGFkYXRhLCBjb250ZW50LCBwYXRoLCB0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IHRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBFcnJvciBmZXRjaGluZyBjb250ZW50OiAke3Nhbml0aXplZC5tZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5zdGFsbENvbnRlbnQoaW5wdXRQYXRoOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5lbGVtZW50SW5zdGFsbGVyLmluc3RhbGxDb250ZW50KGlucHV0UGF0aCk7XG4gICAgICBcbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBg4pqg77iPICR7cmVzdWx0Lm1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgaXQncyBhIHBlcnNvbmEsIHJlbG9hZCBwZXJzb25hc1xuICAgICAgaWYgKHJlc3VsdC5lbGVtZW50VHlwZSA9PT0gRWxlbWVudFR5cGUuUEVSU09OQSkge1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5lbGVtZW50SW5zdGFsbGVyLmZvcm1hdEluc3RhbGxTdWNjZXNzKFxuICAgICAgICByZXN1bHQubWV0YWRhdGEhLCBcbiAgICAgICAgcmVzdWx0LmZpbGVuYW1lISxcbiAgICAgICAgcmVzdWx0LmVsZW1lbnRUeXBlIVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogdGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEVycm9yIGluc3RhbGxpbmcgQUkgY3VzdG9taXphdGlvbiBlbGVtZW50OiAke3Nhbml0aXplZC5tZXNzYWdlfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3VibWl0Q29udGVudChjb250ZW50SWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSB0aGUgbmV3IHBvcnRmb2xpby1iYXNlZCBzdWJtaXNzaW9uIHRvb2xcbiAgICAgIGNvbnN0IHsgU3VibWl0VG9Qb3J0Zm9saW9Ub29sIH0gPSBhd2FpdCBpbXBvcnQoJy4vdG9vbHMvcG9ydGZvbGlvL3N1Ym1pdFRvUG9ydGZvbGlvVG9vbC5qcycpO1xuICAgICAgY29uc3QgeyBGaWxlRGlzY292ZXJ5VXRpbCB9ID0gYXdhaXQgaW1wb3J0KCcuL3V0aWxzL0ZpbGVEaXNjb3ZlcnlVdGlsLmpzJyk7XG4gICAgICBjb25zdCBzdWJtaXRUb29sID0gbmV3IFN1Ym1pdFRvUG9ydGZvbGlvVG9vbCh0aGlzLmFwaUNhY2hlKTtcbiAgICBcbiAgICAvLyBUcnkgdG8gZmluZCB0aGUgY29udGVudCBhY3Jvc3MgYWxsIGVsZW1lbnQgdHlwZXNcbiAgICBjb25zdCBwb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIGxldCBlbGVtZW50VHlwZTogRWxlbWVudFR5cGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGZvdW5kUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OOiBTZWFyY2ggYWxsIGVsZW1lbnQgZGlyZWN0b3JpZXMgaW4gcGFyYWxsZWxcbiAgICAvLyBOT1RFOiBUaGlzIGR5bmFtaWNhbGx5IGhhbmRsZXMgQUxMIGVsZW1lbnQgdHlwZXMgZnJvbSB0aGUgRWxlbWVudFR5cGUgZW51bVxuICAgIC8vIE5vIGhhcmRjb2RlZCBjb3VudCAtIGlmIHlvdSBhZGQgMTAgbW9yZSBlbGVtZW50IHR5cGVzIHRvbW9ycm93LCB0aGlzIGNvZGVcbiAgICAvLyB3aWxsIGF1dG9tYXRpY2FsbHkgc2VhcmNoIGFsbCAxNiB0eXBlcyB3aXRob3V0IGFueSBjaGFuZ2VzIG5lZWRlZCBoZXJlXG4gICAgY29uc3Qgc2VhcmNoUHJvbWlzZXMgPSBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5tYXAoYXN5bmMgKHR5cGUpID0+IHtcbiAgICAgIGNvbnN0IGRpciA9IHBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcih0eXBlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBGaWxlRGlzY292ZXJ5VXRpbC5maW5kRmlsZShkaXIsIGNvbnRlbnRJZGVudGlmaWVyLCB7XG4gICAgICAgICAgZXh0ZW5zaW9uczogWycubWQnLCAnLmpzb24nLCAnLnlhbWwnLCAnLnltbCddLFxuICAgICAgICAgIHBhcnRpYWxNYXRjaDogdHJ1ZSxcbiAgICAgICAgICBjYWNoZVJlc3VsdHM6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZmlsZSA/IHsgdHlwZTogdHlwZSBhcyBFbGVtZW50VHlwZSwgZmlsZSB9IDogbnVsbDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgLy8gSU1QUk9WRUQgRVJST1IgSEFORExJTkc6IExvZyB3YXJuaW5ncyBmb3IgdW5leHBlY3RlZCBlcnJvcnNcbiAgICAgICAgaWYgKGVycm9yPy5jb2RlICE9PSAnRU5PRU5UJyAmJiBlcnJvcj8uY29kZSAhPT0gJ0VOT1RESVInKSB7XG4gICAgICAgICAgLy8gTm90IGp1c3QgYSBtaXNzaW5nIGRpcmVjdG9yeSAtIHRoaXMgY291bGQgYmUgYSBwZXJtaXNzaW9uIGlzc3VlIG9yIG90aGVyIHByb2JsZW1cbiAgICAgICAgICBsb2dnZXIud2FybihgVW5leHBlY3RlZCBlcnJvciBzZWFyY2hpbmcgJHt0eXBlfSBkaXJlY3RvcnlgLCB7IFxuICAgICAgICAgICAgY29udGVudElkZW50aWZpZXIsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yPy5tZXNzYWdlIHx8IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICBjb2RlOiBlcnJvcj8uY29kZSBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBEaXJlY3RvcnkgZG9lc24ndCBleGlzdCAtIHRoaXMgaXMgZXhwZWN0ZWQgZm9yIHVudXNlZCBlbGVtZW50IHR5cGVzXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGAke3R5cGV9IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCwgc2tpcHBpbmdgLCB7IHR5cGUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgLy8gV2FpdCBmb3IgYWxsIHNlYXJjaGVzIHRvIGNvbXBsZXRlIGFuZCBmaW5kIHRoZSBmaXJzdCBtYXRjaFxuICAgIGNvbnN0IHNlYXJjaFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoc2VhcmNoUHJvbWlzZXMpO1xuICAgIFxuICAgIC8vIE5PVEU6IEZpbGUgdmFsaWRhdGlvbiAtIHdlIHJlbHkgb24gdGhlIHBvcnRmb2xpbyBkaXJlY3Rvcnkgc3RydWN0dXJlIHRvIGVuc3VyZVxuICAgIC8vIGZpbGVzIGFyZSBpbiB0aGUgY29ycmVjdCBlbGVtZW50IHR5cGUgZGlyZWN0b3J5LiBBZGRpdGlvbmFsIHNjaGVtYSB2YWxpZGF0aW9uXG4gICAgLy8gY291bGQgYmUgYWRkZWQgaGVyZSBpZiBuZWVkZWQsIGJ1dCB0aGUgY3VycmVudCBhcHByb2FjaCBpcyBzdWZmaWNpZW50IGFzOlxuICAgIC8vIDEuIEZpbGVEaXNjb3ZlcnlVdGlsIGFscmVhZHkgdmFsaWRhdGVzIGZpbGUgZXh0ZW5zaW9uc1xuICAgIC8vIDIuIFBvcnRmb2xpbyBzdHJ1Y3R1cmUgZW5mb3JjZXMgcHJvcGVyIG9yZ2FuaXphdGlvblxuICAgIC8vIDMuIHN1Ym1pdFRvUG9ydGZvbGlvVG9vbCBwZXJmb3JtcyBhZGRpdGlvbmFsIHZhbGlkYXRpb24gZG93bnN0cmVhbVxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHNlYXJjaFJlc3VsdHMpIHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByZXN1bHQudmFsdWUpIHtcbiAgICAgICAgZm91bmRQYXRoID0gcmVzdWx0LnZhbHVlLmZpbGU7XG4gICAgICAgIGVsZW1lbnRUeXBlID0gcmVzdWx0LnZhbHVlLnR5cGU7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRm91bmQgY29udGVudCBpbiAke2VsZW1lbnRUeXBlfSBkaXJlY3RvcnlgLCB7IFxuICAgICAgICAgIGNvbnRlbnRJZGVudGlmaWVyLCBcbiAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSwgXG4gICAgICAgICAgZmlsZTogZm91bmRQYXRoIFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIENSSVRJQ0FMIEZJWDogTmV2ZXIgZGVmYXVsdCB0byBhbnkgZWxlbWVudCB0eXBlIHdoZW4gY29udGVudCBpcyBub3QgZm91bmRcbiAgICAvLyBUaGlzIHByZXZlbnRzIGluY29ycmVjdCBzdWJtaXNzaW9ucyBhbmQgZm9yY2VzIHByb3BlciB0eXBlIGRldGVjdGlvbiBvciB1c2VyIHNwZWNpZmljYXRpb25cbiAgICBpZiAoIWVsZW1lbnRUeXBlKSB7XG4gICAgICAvLyBDb250ZW50IG5vdCBmb3VuZCBpbiBhbnkgZWxlbWVudCBkaXJlY3RvcnkgLSBwcm92aWRlIGhlbHBmdWwgZXJyb3Igd2l0aCBzdWdnZXN0aW9uc1xuICAgICAgY29uc3QgYXZhaWxhYmxlVHlwZXMgPSBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKS5qb2luKCcsICcpO1xuICAgICAgbG9nZ2VyLndhcm4oYENvbnRlbnQgXCIke2NvbnRlbnRJZGVudGlmaWVyfVwiIG5vdCBmb3VuZCBpbiBhbnkgcG9ydGZvbGlvIGRpcmVjdG9yeWAsIHsgXG4gICAgICAgIGNvbnRlbnRJZGVudGlmaWVyLFxuICAgICAgICBzZWFyY2hlZFR5cGVzOiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBVWCBJTVBST1ZFTUVOVDogRW5oYW5jZWQgZXJyb3IgbWVzc2FnZSB3aXRoIHNtYXJ0IHN1Z2dlc3Rpb25zXG4gICAgICBsZXQgZXJyb3JNZXNzYWdlID0gYOKdjCBDb250ZW50IFwiJHtjb250ZW50SWRlbnRpZmllcn1cIiBub3QgZm91bmQgaW4gcG9ydGZvbGlvLlxcblxcbmA7XG4gICAgICBlcnJvck1lc3NhZ2UgKz0gYPCflI0gKipTZWFyY2hlZCBhY3Jvc3MgYWxsIGVsZW1lbnQgdHlwZXMqKjogJHthdmFpbGFibGVUeXBlc31cXG5cXG5gO1xuICAgICAgXG4gICAgICAvLyBUcnkgdG8gcHJvdmlkZSBzbWFydCBzdWdnZXN0aW9ucyBiYXNlZCBvbiBwYXJ0aWFsIG1hdGNoZXNcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgRmlsZURpc2NvdmVyeVV0aWwgfSA9IGF3YWl0IGltcG9ydCgnLi91dGlscy9GaWxlRGlzY292ZXJ5VXRpbC5qcycpO1xuICAgICAgICBjb25zdCBzdWdnZXN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNlYXJjaCBmb3Igc2ltaWxhciBuYW1lcyBhY3Jvc3MgYWxsIGVsZW1lbnQgdHlwZXNcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBPYmplY3QudmFsdWVzKEVsZW1lbnRUeXBlKSkge1xuICAgICAgICAgIGNvbnN0IGRpciA9IHBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihlbGVtZW50VHlwZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRpYWxNYXRjaGVzID0gYXdhaXQgRmlsZURpc2NvdmVyeVV0aWwuZmluZEZpbGUoZGlyLCBjb250ZW50SWRlbnRpZmllciwge1xuICAgICAgICAgICAgICBleHRlbnNpb25zOiBbJy5tZCcsICcuanNvbicsICcueWFtbCcsICcueW1sJ10sXG4gICAgICAgICAgICAgIHBhcnRpYWxNYXRjaDogdHJ1ZSxcbiAgICAgICAgICAgICAgY2FjaGVSZXN1bHRzOiBmYWxzZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcnRpYWxNYXRjaGVzKSAmJiBwYXJ0aWFsTWF0Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgcGFydGlhbE1hdGNoZXMuc2xpY2UoMCwgMikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWUobWF0Y2gsIHBhdGguZXh0bmFtZShtYXRjaCkpO1xuICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zLnB1c2goYFwiJHtiYXNlbmFtZX1cIiAoJHtlbGVtZW50VHlwZX0pYCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydGlhbE1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKHBhcnRpYWxNYXRjaGVzLCBwYXRoLmV4dG5hbWUocGFydGlhbE1hdGNoZXMpKTtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnMucHVzaChgXCIke2Jhc2VuYW1lfVwiICgke2VsZW1lbnRUeXBlfSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gU2tpcCB0aGlzIHR5cGUgaWYgdGhlcmUncyBhbiBlcnJvclxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVycm9yTWVzc2FnZSArPSBg8J+SoSAqKkRpZCB5b3UgbWVhbiBvbmUgb2YgdGhlc2U/KipcXG5gO1xuICAgICAgICAgIGZvciAoY29uc3Qgc3VnZ2VzdGlvbiBvZiBzdWdnZXN0aW9ucy5zbGljZSgwLCA1KSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGAgIOKAoiAke3N1Z2dlc3Rpb259XFxuYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5gO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChzdWdnZXN0aW9uRXJyb3IpIHtcbiAgICAgICAgLy8gSWYgc3VnZ2VzdGlvbnMgZmFpbCwgY29udGludWUgd2l0aG91dCB0aGVtXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnRmFpbGVkIHRvIGdlbmVyYXRlIHN1Z2dlc3Rpb25zJywgeyBzdWdnZXN0aW9uRXJyb3IgfSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGVycm9yTWVzc2FnZSArPSBg8J+boO+4jyAqKlN0ZXAtYnktc3RlcCB0cm91Ymxlc2hvb3RpbmcqKjpcXG5gO1xuICAgICAgZXJyb3JNZXNzYWdlICs9IGAxLiDwn5OdICoqTGlzdCBhbGwgY29udGVudCoqOiBVc2UgXFxgbGlzdF9wb3J0Zm9saW9cXGAgdG8gc2VlIHdoYXQncyBhdmFpbGFibGVcXG5gO1xuICAgICAgZXJyb3JNZXNzYWdlICs9IGAyLiDwn5SNICoqQ2hlY2sgc3BlbGxpbmcqKjogVmVyaWZ5IHRoZSBleGFjdCBuYW1lIGFuZCB0cnkgdmFyaWF0aW9uc1xcbmA7XG4gICAgICBlcnJvck1lc3NhZ2UgKz0gYDMuIPCfjq8gKipTcGVjaWZ5IHR5cGUqKjogVHJ5IFxcYHN1Ym1pdF9jb250ZW50IFwiJHtjb250ZW50SWRlbnRpZmllcn1cIiAtLXR5cGU9cGVyc29uYXNcXGBcXG5gO1xuICAgICAgZXJyb3JNZXNzYWdlICs9IGA0LiDwn5OBICoqQnJvd3NlIGZpbGVzKio6IENoZWNrIHlvdXIgcG9ydGZvbGlvIGRpcmVjdG9yeSBtYW51YWxseVxcblxcbmA7XG4gICAgICBlcnJvck1lc3NhZ2UgKz0gYPCfk50gKipUaXAqKjogVGhlIHN5c3RlbSBzZWFyY2hlcyBib3RoIGZpbGVuYW1lcyBhbmQgZGlzcGxheSBuYW1lcyB3aXRoIGZ1enp5IG1hdGNoaW5nLmA7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZXMgYWNyb3NzIGFsbCBzb3VyY2VzIGJlZm9yZSBzdWJtaXNzaW9uXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgVW5pZmllZEluZGV4TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KCcuL3BvcnRmb2xpby9VbmlmaWVkSW5kZXhNYW5hZ2VyLmpzJyk7XG4gICAgICBjb25zdCB1bmlmaWVkTWFuYWdlciA9IFVuaWZpZWRJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIFxuICAgICAgLy8gRXh0cmFjdCB0aGUgYWN0dWFsIGVsZW1lbnQgbmFtZSBmcm9tIHRoZSBjb250ZW50IHBhdGhcbiAgICAgIGNvbnN0IGJhc2VuYW1lID0gcGF0aC5iYXNlbmFtZShmb3VuZFBhdGghLCBwYXRoLmV4dG5hbWUoZm91bmRQYXRoISkpO1xuICAgICAgY29uc3QgZHVwbGljYXRlcyA9IGF3YWl0IHVuaWZpZWRNYW5hZ2VyLmNoZWNrRHVwbGljYXRlcyhiYXNlbmFtZSk7XG4gICAgICBcbiAgICAgIGlmIChkdXBsaWNhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlID0gZHVwbGljYXRlc1swXTtcbiAgICAgICAgbGV0IHdhcm5pbmdUZXh0ID0gYOKaoO+4jyAqKkR1cGxpY2F0ZSBEZXRlY3Rpb24gQWxlcnQqKlxcblxcbmA7XG4gICAgICAgIHdhcm5pbmdUZXh0ICs9IGBGb3VuZCBcIiR7ZHVwbGljYXRlLm5hbWV9XCIgaW4gbXVsdGlwbGUgc291cmNlczpcXG5cXG5gO1xuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgZHVwbGljYXRlLnNvdXJjZXMpIHtcbiAgICAgICAgICBjb25zdCBzb3VyY2VJY29uID0gdGhpcy5nZXRTb3VyY2VJY29uKHNvdXJjZS5zb3VyY2UpO1xuICAgICAgICAgIHdhcm5pbmdUZXh0ICs9IGAke3NvdXJjZUljb259ICoqJHtzb3VyY2Uuc291cmNlfSoqOiAke3NvdXJjZS52ZXJzaW9uIHx8ICd1bmtub3duIHZlcnNpb24nfSAoJHtzb3VyY2UubGFzdE1vZGlmaWVkLnRvTG9jYWxlRGF0ZVN0cmluZygpfSlcXG5gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB3YXJuaW5nVGV4dCArPSBgXFxuYDtcbiAgICAgICAgXG4gICAgICAgIGlmIChkdXBsaWNhdGUuaGFzVmVyc2lvbkNvbmZsaWN0ICYmIGR1cGxpY2F0ZS52ZXJzaW9uQ29uZmxpY3QpIHtcbiAgICAgICAgICB3YXJuaW5nVGV4dCArPSBg8J+UhCAqKlZlcnNpb24gQ29uZmxpY3QgRGV0ZWN0ZWQqKlxcbmA7XG4gICAgICAgICAgd2FybmluZ1RleHQgKz0gYFJlY29tbWVuZGVkIHNvdXJjZTogKioke2R1cGxpY2F0ZS52ZXJzaW9uQ29uZmxpY3QucmVjb21tZW5kZWR9KipcXG5gO1xuICAgICAgICAgIHdhcm5pbmdUZXh0ICs9IGBSZWFzb246ICR7ZHVwbGljYXRlLnZlcnNpb25Db25mbGljdC5yZWFzb259XFxuXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgd2FybmluZ1RleHQgKz0gYCoqUmVjb21tZW5kYXRpb25zOioqXFxuYDtcbiAgICAgICAgd2FybmluZ1RleHQgKz0gYOKAoiBSZXZpZXcgZXhpc3RpbmcgdmVyc2lvbnMgYmVmb3JlIHN1Ym1pdHRpbmdcXG5gO1xuICAgICAgICB3YXJuaW5nVGV4dCArPSBg4oCiIENvbnNpZGVyIHVwZGF0aW5nIGxvY2FsIHZlcnNpb24gaW5zdGVhZCBvZiBjcmVhdGluZyBkdXBsaWNhdGVcXG5gO1xuICAgICAgICB3YXJuaW5nVGV4dCArPSBg4oCiIEVuc3VyZSB5b3VyIHZlcnNpb24gYWRkcyBtZWFuaW5nZnVsIGltcHJvdmVtZW50c1xcbmA7XG4gICAgICAgIHdhcm5pbmdUZXh0ICs9IGDigKIgVXBkYXRlIHZlcnNpb24gbnVtYmVyIGluIG1ldGFkYXRhIGlmIHN1Ym1pdHRpbmcgZW5oYW5jZW1lbnRcXG5cXG5gO1xuICAgICAgICB3YXJuaW5nVGV4dCArPSBgKipQcm9jZWVkaW5nIHdpdGggc3VibWlzc2lvbiBhbnl3YXkuLi4qKlxcblxcbmA7XG4gICAgICAgIFxuICAgICAgICAvLyBMb2cgdGhlIGR1cGxpY2F0ZSBkZXRlY3Rpb24gZm9yIG1vbml0b3JpbmdcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0R1cGxpY2F0ZSBjb250ZW50IGRldGVjdGVkIGR1cmluZyBzdWJtaXNzaW9uJywge1xuICAgICAgICAgIGNvbnRlbnRJZGVudGlmaWVyLFxuICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgIGR1cGxpY2F0ZUluZm86IGR1cGxpY2F0ZVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIENvbnRpbnVlIHdpdGggc3VibWlzc2lvbiBidXQgc2hvdyB3YXJuaW5nXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN1Ym1pdFRvb2wuZXhlY3V0ZSh7XG4gICAgICAgICAgbmFtZTogY29udGVudElkZW50aWZpZXIsXG4gICAgICAgICAgdHlwZTogZWxlbWVudFR5cGVcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBDb21iaW5lIHdhcm5pbmcgd2l0aCBzdWJtaXNzaW9uIHJlc3VsdFxuICAgICAgICBjb25zdCByZXNwb25zZVRleHQgPSBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3Jlc3VsdC5zdWNjZXNzID8gJ+KaoO+4jycgOiAn4p2MJ30gJHt3YXJuaW5nVGV4dH0ke3Jlc3VsdC5tZXNzYWdlfWA7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IHJlc3BvbnNlVGV4dCxcbiAgICAgICAgICB9XSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChkdXBsaWNhdGVFcnJvcikge1xuICAgICAgLy8gSWYgZHVwbGljYXRlIGNoZWNraW5nIGZhaWxzLCBsb2cgYnV0IGNvbnRpbnVlIHdpdGggc3VibWlzc2lvblxuICAgICAgbG9nZ2VyLndhcm4oJ0R1cGxpY2F0ZSBjaGVja2luZyBmYWlsZWQgZHVyaW5nIHN1Ym1pc3Npb24nLCB7XG4gICAgICAgIGNvbnRlbnRJZGVudGlmaWVyLFxuICAgICAgICBlcnJvcjogZHVwbGljYXRlRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGR1cGxpY2F0ZUVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZHVwbGljYXRlRXJyb3IpXG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gRXhlY3V0ZSB0aGUgc3VibWlzc2lvbiB3aXRoIHRoZSBkZXRlY3RlZCBlbGVtZW50IHR5cGVcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdWJtaXRUb29sLmV4ZWN1dGUoe1xuICAgICAgbmFtZTogY29udGVudElkZW50aWZpZXIsXG4gICAgICB0eXBlOiBlbGVtZW50VHlwZVxuICAgIH0pO1xuICAgIFxuICAgIC8vIEZvcm1hdCB0aGUgcmVzcG9uc2UgLSB0aGUgbWVzc2FnZSBhbHJlYWR5IGNvbnRhaW5zIGFsbCBkZXRhaWxzXG4gICAgbGV0IHJlc3BvbnNlVGV4dCA9IHJlc3VsdC5tZXNzYWdlO1xuICAgIFxuICAgIC8vIEFkZCBwZXJzb25hIGluZGljYXRvciBmb3IgY29uc2lzdGVuY3lcbiAgICByZXNwb25zZVRleHQgPSBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3Jlc3VsdC5zdWNjZXNzID8gJ+KchScgOiAn4p2MJ30gJHtyZXNwb25zZVRleHR9YDtcbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogcmVzcG9uc2VUZXh0LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBDb21wcmVoZW5zaXZlIGVycm9yIGhhbmRsaW5nIHdpdGggZmFsbGJhY2sgc3VnZ2VzdGlvbnNcbiAgICAgIGxvZ2dlci5lcnJvcignVW5leHBlY3RlZCBlcnJvciBpbiBzdWJtaXRDb250ZW50Jywge1xuICAgICAgICBjb250ZW50SWRlbnRpZmllcixcbiAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiBlcnJvci5zdGFja1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipTdWJtaXNzaW9uIEZhaWxlZCoqXFxuXFxuYDtcbiAgICAgIGVycm9yTWVzc2FnZSArPSBg8J+aqCAqKkVycm9yKio6ICR7ZXJyb3IubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvciBvY2N1cnJlZCd9XFxuXFxuYDtcbiAgICAgIFxuICAgICAgLy8gUHJvdmlkZSBjb250ZXh0dWFsIHRyb3VibGVzaG9vdGluZyBiYXNlZCBvbiBlcnJvciB0eXBlXG4gICAgICBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ2F1dGgnKSB8fCBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygndG9rZW4nKSkge1xuICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYPCflJAgKipBdXRoZW50aWNhdGlvbiBJc3N1ZSoqOlxcbmA7XG4gICAgICAgIGVycm9yTWVzc2FnZSArPSBg4oCiIFJ1bjogXFxgc2V0dXBfZ2l0aHViX2F1dGhcXGAgdG8gcmUtYXV0aGVudGljYXRlXFxuYDtcbiAgICAgICAgZXJyb3JNZXNzYWdlICs9IGDigKIgQ2hlY2s6IFxcYGdoIGF1dGggc3RhdHVzXFxgIGlmIHlvdSBoYXZlIEdpdEh1YiBDTElcXG5cXG5gO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ25ldHdvcmsnKSB8fCBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnY29ubmVjdGlvbicpKSB7XG4gICAgICAgIGVycm9yTWVzc2FnZSArPSBg8J+MkCAqKk5ldHdvcmsgSXNzdWUqKjpcXG5gO1xuICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYOKAoiBDaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb25cXG5gO1xuICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYOKAoiBUcnkgYWdhaW4gaW4gYSBmZXcgbWludXRlc1xcbmA7XG4gICAgICAgIGVycm9yTWVzc2FnZSArPSBg4oCiIENoZWNrIEdpdEh1YiBzdGF0dXM6IGh0dHBzOi8vc3RhdHVzLmdpdGh1Yi5jb21cXG5cXG5gO1xuICAgICAgfVxuICAgICAgXG4gICAgICBlcnJvck1lc3NhZ2UgKz0gYPCfmpEgKipFbWVyZ2VuY3kgQWx0ZXJuYXRpdmVzKio6XFxuYDtcbiAgICAgIGVycm9yTWVzc2FnZSArPSBgMS4g8J+UhCAqKlJldHJ5Kio6IFRyeSB0aGUgc2FtZSBjb21tYW5kIGFnYWluXFxuYDtcbiAgICAgIGVycm9yTWVzc2FnZSArPSBgMi4g8J+TnSAqKkNoZWNrIGNvbnRlbnQqKjogVXNlIFxcYGxpc3RfcG9ydGZvbGlvXFxgIHRvIHZlcmlmeSB0aGUgZWxlbWVudCBleGlzdHNcXG5gO1xuICAgICAgZXJyb3JNZXNzYWdlICs9IGAzLiDwn46vICoqU3BlY2lmeSB0eXBlKio6IEFkZCBcXGAtLXR5cGU9cGVyc29uYXNcXGAgaWYgeW91IGtub3cgdGhlIGVsZW1lbnQgdHlwZVxcbmA7XG4gICAgICBlcnJvck1lc3NhZ2UgKz0gYDQuIPCfmpEgKipNYW51YWwgdXBsb2FkKio6IENvcHkgY29udGVudCBkaXJlY3RseSB0byBHaXRIdWIgdmlhIHdlYiBpbnRlcmZhY2VcXG5cXG5gO1xuICAgICAgZXJyb3JNZXNzYWdlICs9IGDwn5OeICoqTmVlZCBoZWxwPyoqIFRoaXMgbG9va3MgbGlrZSBhIHN5c3RlbSBpc3N1ZS4gUGxlYXNlIHJlcG9ydCBpdCB3aXRoIHRoZSBlcnJvciBkZXRhaWxzIGFib3ZlLmA7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDb2xsZWN0aW9uQ2FjaGVIZWFsdGgoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEdldCBjYWNoZSBzdGF0aXN0aWNzIGZyb20gYm90aCBjYWNoZXNcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb25TdGF0cyA9IGF3YWl0IHRoaXMuY29sbGVjdGlvbkNhY2hlLmdldENhY2hlU3RhdHMoKTtcbiAgICAgIGNvbnN0IHNlYXJjaFN0YXRzID0gYXdhaXQgdGhpcy5jb2xsZWN0aW9uU2VhcmNoLmdldENhY2hlU3RhdHMoKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgY2FjaGUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgY29uc3QgY2FjaGVEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5kb2xsaG91c2VtY3AnLCAnY2FjaGUnKTtcbiAgICAgIGxldCBjYWNoZUZpbGVFeGlzdHMgPSBmYWxzZTtcbiAgICAgIGxldCBjYWNoZUZpbGVTaXplID0gMDtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2FjaGVGaWxlID0gcGF0aC5qb2luKGNhY2hlRGlyLCAnY29sbGVjdGlvbi1jYWNoZS5qc29uJyk7XG4gICAgICAgIGNvbnN0IGZpbGVTdGF0cyA9IGF3YWl0IGZzLnN0YXQoY2FjaGVGaWxlKTtcbiAgICAgICAgY2FjaGVGaWxlRXhpc3RzID0gdHJ1ZTtcbiAgICAgICAgY2FjaGVGaWxlU2l6ZSA9IGZpbGVTdGF0cy5zaXplO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gQ2FjaGUgZmlsZSBkb2Vzbid0IGV4aXN0IHlldFxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3JtYXQgY2FjaGUgYWdlXG4gICAgICBjb25zdCBmb3JtYXRBZ2UgPSAoYWdlTXM6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gICAgICAgIGlmIChhZ2VNcyA9PT0gMCkgcmV0dXJuICdOb3QgY2FjaGVkJztcbiAgICAgICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKGFnZU1zIC8gKDEwMDAgKiA2MCAqIDYwKSk7XG4gICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKChhZ2VNcyAlICgxMDAwICogNjAgKiA2MCkpIC8gKDEwMDAgKiA2MCkpO1xuICAgICAgICBpZiAoaG91cnMgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGAke2hvdXJzfWggJHttaW51dGVzfW0gb2xkYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7bWludXRlc31tIG9sZGA7XG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBCdWlsZCBoZWFsdGggcmVwb3J0IHdpdGggYm90aCBjYWNoZSBzeXN0ZW1zXG4gICAgICBjb25zdCBoZWFsdGhSZXBvcnQgPSB7XG4gICAgICAgIGNvbGxlY3Rpb246IHtcbiAgICAgICAgICBzdGF0dXM6IGNvbGxlY3Rpb25TdGF0cy5pc1ZhbGlkID8gJ2hlYWx0aHknIDogKGNhY2hlRmlsZUV4aXN0cyA/ICdleHBpcmVkJyA6ICdlbXB0eScpLFxuICAgICAgICAgIGNhY2hlRXhpc3RzOiBjYWNoZUZpbGVFeGlzdHMsXG4gICAgICAgICAgaXRlbUNvdW50OiBjb2xsZWN0aW9uU3RhdHMuaXRlbUNvdW50LFxuICAgICAgICAgIGNhY2hlQWdlOiBmb3JtYXRBZ2UoY29sbGVjdGlvblN0YXRzLmNhY2hlQWdlKSxcbiAgICAgICAgICBjYWNoZUFnZU1zOiBjb2xsZWN0aW9uU3RhdHMuY2FjaGVBZ2UsXG4gICAgICAgICAgaXNWYWxpZDogY29sbGVjdGlvblN0YXRzLmlzVmFsaWQsXG4gICAgICAgICAgY2FjaGVGaWxlU2l6ZTogY2FjaGVGaWxlU2l6ZSxcbiAgICAgICAgICBjYWNoZUZpbGVTaXplRm9ybWF0dGVkOiBjYWNoZUZpbGVTaXplID4gMCA/IGAkeyhjYWNoZUZpbGVTaXplIC8gMTAyNCkudG9GaXhlZCgyKX0gS0JgIDogJzAgS0InLFxuICAgICAgICAgIHR0bFJlbWFpbmluZzogY29sbGVjdGlvblN0YXRzLmlzVmFsaWQgPyBmb3JtYXRBZ2UoMjQgKiA2MCAqIDYwICogMTAwMCAtIGNvbGxlY3Rpb25TdGF0cy5jYWNoZUFnZSkgOiAnRXhwaXJlZCdcbiAgICAgICAgfSxcbiAgICAgICAgaW5kZXg6IHtcbiAgICAgICAgICBzdGF0dXM6IHNlYXJjaFN0YXRzLmluZGV4LmlzVmFsaWQgPyAnaGVhbHRoeScgOiAoc2VhcmNoU3RhdHMuaW5kZXguaGFzQ2FjaGUgPyAnZXhwaXJlZCcgOiAnZW1wdHknKSxcbiAgICAgICAgICBoYXNDYWNoZTogc2VhcmNoU3RhdHMuaW5kZXguaGFzQ2FjaGUsXG4gICAgICAgICAgZWxlbWVudHM6IHNlYXJjaFN0YXRzLmluZGV4LmVsZW1lbnRzLFxuICAgICAgICAgIGNhY2hlQWdlOiBmb3JtYXRBZ2Uoc2VhcmNoU3RhdHMuaW5kZXguYWdlKSxcbiAgICAgICAgICBpc1ZhbGlkOiBzZWFyY2hTdGF0cy5pbmRleC5pc1ZhbGlkLFxuICAgICAgICAgIHR0bFJlbWFpbmluZzogc2VhcmNoU3RhdHMuaW5kZXguaXNWYWxpZCA/IGZvcm1hdEFnZSgxNSAqIDYwICogMTAwMCAtIHNlYXJjaFN0YXRzLmluZGV4LmFnZSkgOiAnRXhwaXJlZCdcbiAgICAgICAgfSxcbiAgICAgICAgb3ZlcmFsbDoge1xuICAgICAgICAgIHJlY29tbWVuZGF0aW9uOiAoY29sbGVjdGlvblN0YXRzLmlzVmFsaWQgfHwgc2VhcmNoU3RhdHMuaW5kZXguaXNWYWxpZClcbiAgICAgICAgICAgID8gJ0NhY2hlIHN5c3RlbSBpcyBvcGVyYXRpb25hbCBhbmQgc2VydmluZyBjb250ZW50IGVmZmljaWVudGx5J1xuICAgICAgICAgICAgOiAnQ2FjaGUgc3lzdGVtIHdpbGwgcmVmcmVzaCBvbiBuZXh0IGFjY2VzcyBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+TiiAqKkNvbGxlY3Rpb24gQ2FjaGUgSGVhbHRoIENoZWNrKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYCMjIPCfl4TvuI8gQ29sbGVjdGlvbiBDYWNoZSAoTGVnYWN5KVxcbmAgK1xuICAgICAgICAgICAgICBgKipTdGF0dXMqKjogJHtoZWFsdGhSZXBvcnQuY29sbGVjdGlvbi5zdGF0dXMgPT09ICdoZWFsdGh5JyA/ICfinIUnIDogaGVhbHRoUmVwb3J0LmNvbGxlY3Rpb24uc3RhdHVzID09PSAnZXhwaXJlZCcgPyAn4pqg77iPJyA6ICfwn5OmJ30gJHtoZWFsdGhSZXBvcnQuY29sbGVjdGlvbi5zdGF0dXMudG9VcHBlckNhc2UoKX1cXG5gICtcbiAgICAgICAgICAgICAgYCoqSXRlbXMgQ2FjaGVkKio6ICR7aGVhbHRoUmVwb3J0LmNvbGxlY3Rpb24uaXRlbUNvdW50fVxcbmAgK1xuICAgICAgICAgICAgICBgKipDYWNoZSBBZ2UqKjogJHtoZWFsdGhSZXBvcnQuY29sbGVjdGlvbi5jYWNoZUFnZX1cXG5gICtcbiAgICAgICAgICAgICAgYCoqQ2FjaGUgU2l6ZSoqOiAke2hlYWx0aFJlcG9ydC5jb2xsZWN0aW9uLmNhY2hlRmlsZVNpemVGb3JtYXR0ZWR9XFxuYCArXG4gICAgICAgICAgICAgIGAqKlRUTCBSZW1haW5pbmcqKjogJHtoZWFsdGhSZXBvcnQuY29sbGVjdGlvbi50dGxSZW1haW5pbmd9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGAjIyDwn5qAIEluZGV4IENhY2hlIChFbmhhbmNlZCBTZWFyY2gpXFxuYCArXG4gICAgICAgICAgICAgIGAqKlN0YXR1cyoqOiAke2hlYWx0aFJlcG9ydC5pbmRleC5zdGF0dXMgPT09ICdoZWFsdGh5JyA/ICfinIUnIDogaGVhbHRoUmVwb3J0LmluZGV4LnN0YXR1cyA9PT0gJ2V4cGlyZWQnID8gJ+KaoO+4jycgOiAn8J+Tpid9ICR7aGVhbHRoUmVwb3J0LmluZGV4LnN0YXR1cy50b1VwcGVyQ2FzZSgpfVxcbmAgK1xuICAgICAgICAgICAgICBgKipFbGVtZW50cyBJbmRleGVkKio6ICR7aGVhbHRoUmVwb3J0LmluZGV4LmVsZW1lbnRzfVxcbmAgK1xuICAgICAgICAgICAgICBgKipDYWNoZSBBZ2UqKjogJHtoZWFsdGhSZXBvcnQuaW5kZXguY2FjaGVBZ2V9XFxuYCArXG4gICAgICAgICAgICAgIGAqKlRUTCBSZW1haW5pbmcqKjogJHtoZWFsdGhSZXBvcnQuaW5kZXgudHRsUmVtYWluaW5nfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgKipPdmVyYWxsIFN0YXR1cyoqOiAke2hlYWx0aFJlcG9ydC5vdmVyYWxsLnJlY29tbWVuZGF0aW9ufVxcblxcbmAgK1xuICAgICAgICAgICAgICBgVGhlIGVuaGFuY2VkIGluZGV4IGNhY2hlIHByb3ZpZGVzIGZhc3Qgc2VhcmNoIHdpdGggcGFnaW5hdGlvbiwgZmlsdGVyaW5nLCBhbmQgc29ydGluZy4gYCArXG4gICAgICAgICAgICAgIGBUaGUgY29sbGVjdGlvbiBjYWNoZSBzZXJ2ZXMgYXMgYSBmYWxsYmFjayBmb3Igb2ZmbGluZSBicm93c2luZy5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBnZXQgY2FjaGUgaGVhbHRoOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEZhaWxlZCB0byBnZXQgY2FjaGUgaGVhbHRoOiAke2Vycm9yTWVzc2FnZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIFVzZXIgaWRlbnRpdHkgbWFuYWdlbWVudFxuICBhc3luYyBzZXRVc2VySWRlbnRpdHkodXNlcm5hbWU6IHN0cmluZywgZW1haWw/OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF1c2VybmFtZSB8fCB1c2VybmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIFVzZXJuYW1lIGNhbm5vdCBiZSBlbXB0eWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSB1c2VybmFtZVxuICAgICAgY29uc3QgdmFsaWRhdGVkVXNlcm5hbWUgPSB2YWxpZGF0ZVVzZXJuYW1lKHVzZXJuYW1lKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgZW1haWwgaWYgcHJvdmlkZWRcbiAgICAgIGxldCB2YWxpZGF0ZWRFbWFpbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGVtYWlsKSB7XG4gICAgICAgIGNvbnN0IHNhbml0aXplZEVtYWlsID0gc2FuaXRpemVJbnB1dChlbWFpbCwgMTAwKTtcbiAgICAgICAgaWYgKCFWQUxJREFUSU9OX1BBVFRFUk5TLlNBRkVfRU1BSUwudGVzdChzYW5pdGl6ZWRFbWFpbCkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZW1haWwgZm9ybWF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRhdGVkRW1haWwgPSBzYW5pdGl6ZWRFbWFpbDtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSB2YWxpZGF0ZWQgdXNlciBpZGVudGl0eVxuICAgICAgdGhpcy5jdXJyZW50VXNlciA9IHZhbGlkYXRlZFVzZXJuYW1lO1xuICAgICAgaWYgKHZhbGlkYXRlZEVtYWlsKSB7XG4gICAgICAgIHByb2Nlc3MuZW52LkRPTExIT1VTRV9FTUFJTCA9IHZhbGlkYXRlZEVtYWlsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgKipVc2VyIElkZW50aXR5IFNldCoqXFxuXFxuYCArXG4gICAgICAgICAgICBg8J+RpCAqKlVzZXJuYW1lOioqICR7dmFsaWRhdGVkVXNlcm5hbWV9XFxuYCArXG4gICAgICAgICAgICBgJHt2YWxpZGF0ZWRFbWFpbCA/IGDwn5OnICoqRW1haWw6KiogJHt2YWxpZGF0ZWRFbWFpbH1cXG5gIDogJyd9YCArXG4gICAgICAgICAgICBgXFxu8J+OryAqKk5leHQgU3RlcHM6KipcXG5gICtcbiAgICAgICAgICAgIGDigKIgTmV3IHBlcnNvbmFzIHlvdSBjcmVhdGUgd2lsbCBiZSBhdHRyaWJ1dGVkIHRvIFwiJHt2YWxpZGF0ZWRVc2VybmFtZX1cIlxcbmAgK1xuICAgICAgICAgICAgYOKAoiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgXFxgRE9MTEhPVVNFX1VTRVI9JHt2YWxpZGF0ZWRVc2VybmFtZX1cXGAgdG8gcGVyc2lzdCB0aGlzIHNldHRpbmdcXG5gICtcbiAgICAgICAgICAgIGAke3ZhbGlkYXRlZEVtYWlsID8gYOKAoiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgXFxgRE9MTEhPVVNFX0VNQUlMPSR7dmFsaWRhdGVkRW1haWx9XFxgIGZvciBjb250YWN0IGluZm9cXG5gIDogJyd9YCArXG4gICAgICAgICAgICBg4oCiIFVzZSBcXGBjbGVhcl91c2VyX2lkZW50aXR5XFxgIHRvIHJldHVybiB0byBhbm9ueW1vdXMgbW9kZWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKlZhbGlkYXRpb24gRXJyb3IqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgJHtzYW5pdGl6ZWQubWVzc2FnZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSBwcm92aWRlIGEgdmFsaWQgdXNlcm5hbWUgKGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgZG90cyBvbmx5KS5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFVzZXJJZGVudGl0eSgpIHtcbiAgICBjb25zdCBlbWFpbCA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9FTUFJTDtcbiAgICBcbiAgICBpZiAoIXRoaXMuY3VycmVudFVzZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCfkaQgKipVc2VyIElkZW50aXR5OiBBbm9ueW1vdXMqKlxcblxcbmAgK1xuICAgICAgICAgICAgYPCflJIgKipTdGF0dXM6KiogQW5vbnltb3VzIG1vZGVcXG5gICtcbiAgICAgICAgICAgIGDwn5OdICoqQXR0cmlidXRpb246KiogUGVyc29uYXMgd2lsbCB1c2UgYW5vbnltb3VzIElEc1xcblxcbmAgK1xuICAgICAgICAgICAgYCoqVG8gc2V0IHlvdXIgaWRlbnRpdHk6KipcXG5gICtcbiAgICAgICAgICAgIGDigKIgVXNlOiBcXGBzZXRfdXNlcl9pZGVudGl0eSBcInlvdXItdXNlcm5hbWVcIlxcYFxcbmAgK1xuICAgICAgICAgICAgYOKAoiBPciBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGU6IFxcYERPTExIT1VTRV9VU0VSPXlvdXItdXNlcm5hbWVcXGBgLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5GkICoqVXNlciBJZGVudGl0eTogJHt0aGlzLmN1cnJlbnRVc2VyfSoqXFxuXFxuYCArXG4gICAgICAgICAgYOKchSAqKlN0YXR1czoqKiBBdXRoZW50aWNhdGVkXFxuYCArXG4gICAgICAgICAgYPCfkaQgKipVc2VybmFtZToqKiAke3RoaXMuY3VycmVudFVzZXJ9XFxuYCArXG4gICAgICAgICAgYCR7ZW1haWwgPyBg8J+TpyAqKkVtYWlsOioqICR7ZW1haWx9XFxuYCA6ICcnfWAgK1xuICAgICAgICAgIGDwn5OdICoqQXR0cmlidXRpb246KiogTmV3IHBlcnNvbmFzIHdpbGwgYmUgY3JlZGl0ZWQgdG8gXCIke3RoaXMuY3VycmVudFVzZXJ9XCJcXG5cXG5gICtcbiAgICAgICAgICBgKipFbnZpcm9ubWVudCBWYXJpYWJsZXM6KipcXG5gICtcbiAgICAgICAgICBg4oCiIFxcYERPTExIT1VTRV9VU0VSPSR7dGhpcy5jdXJyZW50VXNlcn1cXGBcXG5gICtcbiAgICAgICAgICBgJHtlbWFpbCA/IGDigKIgXFxgRE9MTEhPVVNFX0VNQUlMPSR7ZW1haWx9XFxgXFxuYCA6ICcnfWAgK1xuICAgICAgICAgIGBcXG4qKk1hbmFnZW1lbnQ6KipcXG5gICtcbiAgICAgICAgICBg4oCiIFVzZSBcXGBjbGVhcl91c2VyX2lkZW50aXR5XFxgIHRvIHJldHVybiB0byBhbm9ueW1vdXMgbW9kZVxcbmAgK1xuICAgICAgICAgIGDigKIgVXNlIFxcYHNldF91c2VyX2lkZW50aXR5IFwibmV3LXVzZXJuYW1lXCJcXGAgdG8gY2hhbmdlIHVzZXJuYW1lYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyVXNlcklkZW50aXR5KCkge1xuICAgIGNvbnN0IHdhc1NldCA9IHRoaXMuY3VycmVudFVzZXIgIT09IG51bGw7XG4gICAgY29uc3QgcHJldmlvdXNVc2VyID0gdGhpcy5jdXJyZW50VXNlcjtcbiAgICB0aGlzLmN1cnJlbnRVc2VyID0gbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiB3YXNTZXQgXG4gICAgICAgICAgICA/IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAqKlVzZXIgSWRlbnRpdHkgQ2xlYXJlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGDwn5GkICoqUHJldmlvdXM6KiogJHtwcmV2aW91c1VzZXJ9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5SSICoqQ3VycmVudDoqKiBBbm9ueW1vdXMgbW9kZVxcblxcbmAgK1xuICAgICAgICAgICAgICBg8J+TnSAqKkVmZmVjdDoqKiBOZXcgcGVyc29uYXMgd2lsbCB1c2UgYW5vbnltb3VzIElEc1xcblxcbmAgK1xuICAgICAgICAgICAgICBg4pqg77iPICoqTm90ZToqKiBUaGlzIG9ubHkgYWZmZWN0cyB0aGUgY3VycmVudCBzZXNzaW9uLlxcbmAgK1xuICAgICAgICAgICAgICBgVG8gcGVyc2lzdCB0aGlzIGNoYW5nZSwgdW5zZXQgdGhlIFxcYERPTExIT1VTRV9VU0VSXFxgIGVudmlyb25tZW50IHZhcmlhYmxlLmBcbiAgICAgICAgICAgIDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94oS577iPICoqQWxyZWFkeSBpbiBBbm9ueW1vdXMgTW9kZSoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGDwn5GkIE5vIHVzZXIgaWRlbnRpdHkgd2FzIHNldC5cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBzZXRfdXNlcl9pZGVudGl0eSBcInVzZXJuYW1lXCJcXGAgdG8gc2V0IHlvdXIgaWRlbnRpdHkuYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyIHx8IGdlbmVyYXRlQW5vbnltb3VzSWQoKTtcbiAgfVxuXG4gIC8vIEdpdEh1YiBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50XG4gIGFzeW5jIHNldHVwR2l0SHViQXV0aCgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgY3VycmVudCBhdXRoIHN0YXR1cyBmaXJzdFxuICAgICAgY29uc3QgY3VycmVudFN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIuZ2V0QXV0aFN0YXR1cygpO1xuICAgICAgXG4gICAgICBpZiAoY3VycmVudFN0YXR1cy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgKipBbHJlYWR5IENvbm5lY3RlZCB0byBHaXRIdWIqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYPCfkaQgKipVc2VybmFtZToqKiAke2N1cnJlbnRTdGF0dXMudXNlcm5hbWV9XFxuYCArXG4gICAgICAgICAgICAgICAgICBg8J+UkSAqKlBlcm1pc3Npb25zOioqICR7Y3VycmVudFN0YXR1cy5zY29wZXM/LmpvaW4oJywgJykgfHwgJ2Jhc2ljIGFjY2Vzcyd9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgWW91J3JlIGFsbCBzZXQhIFlvdSBjYW46XFxuYCArXG4gICAgICAgICAgICAgICAgICBg4oCiIEJyb3dzZSB0aGUgY29sbGVjdGlvblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKAoiBJbnN0YWxsIGNvbnRlbnRcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDigKIgU3VibWl0IHlvdXIgY3JlYXRpb25zXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgVG8gZGlzY29ubmVjdCwgc2F5IFwiZGlzY29ubmVjdCBmcm9tIEdpdEh1YlwiYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEluaXRpYXRlIGRldmljZSBmbG93XG4gICAgICBjb25zdCBkZXZpY2VSZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIuaW5pdGlhdGVEZXZpY2VGbG93KCk7XG4gICAgICBcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGhlbHBlciBwcm9jZXNzIGFwcHJvYWNoIGZyb20gUFIgIzUxOFxuICAgICAgLy8gTUNQIHNlcnZlcnMgYXJlIHN0YXRlbGVzcyBhbmQgdGVybWluYXRlIGFmdGVyIHJldHVybmluZyByZXNwb25zZVxuICAgICAgLy8gVGhlIGhlbHBlciBwcm9jZXNzIHN1cnZpdmVzIE1DUCB0ZXJtaW5hdGlvbiBhbmQgY2FuIGNvbXBsZXRlIE9BdXRoIHBvbGxpbmdcbiAgICAgIFxuICAgICAgLy8gR2V0IHRoZSBPQXV0aCBjbGllbnQgSURcbiAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSBDb25maWdNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBjb25zdCBjbGllbnRJZCA9IGF3YWl0IGNvbmZpZ01hbmFnZXIuZ2V0R2l0SHViQ2xpZW50SWQoKTtcbiAgICAgIFxuICAgICAgaWYgKCFjbGllbnRJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKkdpdEh1YiBPQXV0aCBOb3QgQ29uZmlndXJlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgVGhlIHNlcnZlciBhZG1pbmlzdHJhdG9yIG5lZWRzIHRvIGNvbmZpZ3VyZSBHaXRIdWIgT0F1dGguXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgKipBZG1pbmlzdHJhdG9yIFNldHVwOioqXFxuYCArXG4gICAgICAgICAgICAgICAgICBgMS4gQ3JlYXRlIE9BdXRoIGFwcCBhdDogaHR0cHM6Ly9naXRodWIuY29tL3NldHRpbmdzL2FwcGxpY2F0aW9ucy9uZXdcXG5gICtcbiAgICAgICAgICAgICAgICAgIGAyLiBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGU6IERPTExIT1VTRV9HSVRIVUJfQ0xJRU5UX0lEXFxuYCArXG4gICAgICAgICAgICAgICAgICBgMy4gUmVzdGFydCB0aGUgTUNQIHNlcnZlclxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYEZvciBkZXRhaWxzLCBzZWU6IC9kb2NzL3NldHVwL09BVVRIX1NFVFVQLm1kYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNwYXduIHRoZSBPQXV0aCBoZWxwZXIgcHJvY2Vzc1xuICAgICAgLy8gVGhlIGhlbHBlciBydW5zIGluZGVwZW5kZW50bHkgYW5kIHN1cnZpdmVzIE1DUCBzZXJ2ZXIgdGVybWluYXRpb25cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjb21waWxlZCBKUyBmaWxlIGlzXG4gICAgICAgIGNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG4gICAgICAgIGNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShfX2ZpbGVuYW1lKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEZpbmQgdGhlIG9hdXRoLWhlbHBlci5tanMgZmlsZVxuICAgICAgICAvLyBJdCBzaG91bGQgYmUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IChvbmUgbGV2ZWwgdXAgZnJvbSBkaXN0LylcbiAgICAgICAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4nLCAnb2F1dGgtaGVscGVyLm1qcycpLCAgLy8gRnJvbSBkaXN0L2luZGV4LmpzXG4gICAgICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdvYXV0aC1oZWxwZXIubWpzJyksICAgIC8vIEZyb20gQ1dEXG4gICAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJ29hdXRoLWhlbHBlci5tanMnKSAgICAgICAgIC8vIFNhbWUgZGlyZWN0b3J5XG4gICAgICAgIF07XG4gICAgICAgIFxuICAgICAgICBsZXQgaGVscGVyUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgdGVzdFBhdGggb2YgcG9zc2libGVQYXRocykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBmcy5hY2Nlc3ModGVzdFBhdGgpO1xuICAgICAgICAgICAgaGVscGVyUGF0aCA9IHRlc3RQYXRoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBUcnkgbmV4dCBwYXRoXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoIWhlbHBlclBhdGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09BdXRoIGhlbHBlciBzY3JpcHQgbm90IGZvdW5kLiBQbGVhc2UgZW5zdXJlIG9hdXRoLWhlbHBlci5tanMgaXMgaW4gdGhlIHByb2plY3Qgcm9vdC4nKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gU3Bhd24gdGhlIGhlbHBlciBhcyBhIGRldGFjaGVkIHByb2Nlc3NcbiAgICAgICAgY29uc3QgaGVscGVyID0gc3Bhd24oJ25vZGUnLCBbXG4gICAgICAgICAgaGVscGVyUGF0aCxcbiAgICAgICAgICBkZXZpY2VSZXNwb25zZS5kZXZpY2VfY29kZSxcbiAgICAgICAgICAoZGV2aWNlUmVzcG9uc2UuaW50ZXJ2YWwgfHwgNSkudG9TdHJpbmcoKSxcbiAgICAgICAgICBkZXZpY2VSZXNwb25zZS5leHBpcmVzX2luLnRvU3RyaW5nKCksXG4gICAgICAgICAgY2xpZW50SWRcbiAgICAgICAgXSwge1xuICAgICAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgICAgIHN0ZGlvOiAnaWdub3JlJywgLy8gQ29tcGxldGVseSBkZXRhY2ggSS9PXG4gICAgICAgICAgd2luZG93c0hpZGU6IHRydWUgLy8gSGlkZSBjb25zb2xlIG9uIFdpbmRvd3NcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBBbGxvdyB0aGUgcGFyZW50IHByb2Nlc3MgdG8gZXhpdCB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBoZWxwZXJcbiAgICAgICAgaGVscGVyLnVucmVmKCk7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIuaW5mbygnT0F1dGggaGVscGVyIHByb2Nlc3Mgc3Bhd25lZCcsIHtcbiAgICAgICAgICBwaWQ6IGhlbHBlci5waWQsXG4gICAgICAgICAgZXhwaXJlc0luOiBkZXZpY2VSZXNwb25zZS5leHBpcmVzX2luLFxuICAgICAgICAgIHVzZXJDb2RlOiBkZXZpY2VSZXNwb25zZS51c2VyX2NvZGVcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBXcml0ZSBzdGF0ZSBmaWxlIGZvciBtb25pdG9yaW5nXG4gICAgICAgIGNvbnN0IHN0YXRlRmlsZSA9IHBhdGguam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJy5hdXRoJywgJ29hdXRoLWhlbHBlci1zdGF0ZS5qc29uJyk7XG4gICAgICAgIGNvbnN0IHN0YXRlRGlyID0gcGF0aC5kaXJuYW1lKHN0YXRlRmlsZSk7XG4gICAgICAgIGF3YWl0IGZzLm1rZGlyKHN0YXRlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgICAgIHBpZDogaGVscGVyLnBpZCxcbiAgICAgICAgICBkZXZpY2VDb2RlOiBkZXZpY2VSZXNwb25zZS5kZXZpY2VfY29kZSxcbiAgICAgICAgICB1c2VyQ29kZTogZGV2aWNlUmVzcG9uc2UudXNlcl9jb2RlLFxuICAgICAgICAgIHN0YXJ0VGltZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIGV4cGlyZXNBdDogbmV3IERhdGUoRGF0ZS5ub3coKSArIGRldmljZVJlc3BvbnNlLmV4cGlyZXNfaW4gKiAxMDAwKS50b0lTT1N0cmluZygpXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoc3RhdGVGaWxlLCBKU09OLnN0cmluZ2lmeShzdGF0ZSwgbnVsbCwgMikpO1xuICAgICAgICBcbiAgICAgIH0gY2F0Y2ggKHNwYXduRXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gc3Bhd24gT0F1dGggaGVscGVyJywgeyBlcnJvcjogc3Bhd25FcnJvciB9KTtcbiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIGluZm9ybWluZyB1c2VyIGFib3V0IHRoZSBpc3N1ZVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKaoO+4jyAqKk9BdXRoIEhlbHBlciBMYXVuY2ggRmFpbGVkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBDb3VsZCBub3Qgc3RhcnQgYmFja2dyb3VuZCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYCoqQWx0ZXJuYXRpdmUgT3B0aW9uczoqKlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYDEuIFRyeSBhZ2FpbjogUnVuIHNldHVwX2dpdGh1Yl9hdXRoIGFnYWluXFxuYCArXG4gICAgICAgICAgICAgICAgICBgMi4gVXNlIEdpdEh1YiBDTEk6IGdoIGF1dGggbG9naW4gLS13ZWJcXG5gICtcbiAgICAgICAgICAgICAgICAgIGAzLiBTZXQgdG9rZW4gbWFudWFsbHk6IGV4cG9ydCBHSVRIVUJfVE9LRU49eW91cl90b2tlblxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYEVycm9yOiAke3NwYXduRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IHNwYXduRXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmV0dXJuIGluc3RydWN0aW9ucyB0byB1c2VyXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIuZm9ybWF0QXV0aEluc3RydWN0aW9ucyhkZXZpY2VSZXNwb25zZSkgK1xuICAgICAgICAgICAgICAgICdcXG5cXG7wn5OdICoqTm90ZSoqOiBBdXRoZW50aWNhdGlvbiB3aWxsIGNvbXBsZXRlIGF1dG9tYXRpY2FsbHkgb25jZSB5b3UgYXV0aG9yaXplLiAnICtcbiAgICAgICAgICAgICAgICAnWW91ciB0b2tlbiB3aWxsIGJlIHN0b3JlZCBzZWN1cmVseSBmb3IgZnV0dXJlIHVzZSEnXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBzZXR1cCBHaXRIdWIgYXV0aCcsIHsgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKkF1dGhlbnRpY2F0aW9uIFNldHVwIEZhaWxlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYFVuYWJsZSB0byBzdGFydCBHaXRIdWIgYXV0aGVudGljYXRpb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi5gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgY2hlY2tHaXRIdWJBdXRoKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBGaXJzdCBjaGVjayBmb3IgT0F1dGggaGVscGVyIHByb2Nlc3MgaGVhbHRoXG4gICAgICBjb25zdCBoZWxwZXJIZWFsdGggPSBhd2FpdCB0aGlzLmNoZWNrT0F1dGhIZWxwZXJIZWFsdGgoKTtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIuZ2V0QXV0aFN0YXR1cygpO1xuICAgICAgXG4gICAgICBpZiAoc3RhdHVzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgICAvLyBDbGVhbiB1cCBoZWxwZXIgc3RhdGUgZmlsZSBpZiBhdXRoIGlzIHN1Y2Nlc3NmdWxcbiAgICAgICAgaWYgKGhlbHBlckhlYWx0aC5leGlzdHMpIHtcbiAgICAgICAgICBjb25zdCBzdGF0ZUZpbGUgPSBwYXRoLmpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICcuYXV0aCcsICdvYXV0aC1oZWxwZXItc3RhdGUuanNvbicpO1xuICAgICAgICAgIGF3YWl0IGZzLnVubGluayhzdGF0ZUZpbGUpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgKipHaXRIdWIgQ29ubmVjdGVkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDwn5GkICoqVXNlcm5hbWU6KiogJHtzdGF0dXMudXNlcm5hbWV9XFxuYCArXG4gICAgICAgICAgICAgICAgICBg8J+UkSAqKlBlcm1pc3Npb25zOioqICR7c3RhdHVzLnNjb3Blcz8uam9pbignLCAnKSB8fCAnYmFzaWMgYWNjZXNzJ31cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGAqKkF2YWlsYWJsZSBBY3Rpb25zOioqXFxuYCArXG4gICAgICAgICAgICAgICAgICBg4pyFIEJyb3dzZSBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgICBg4pyFIEluc3RhbGwgY29udGVudFxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKchSBTdWJtaXQgY29udGVudFxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYEV2ZXJ5dGhpbmcgaXMgd29ya2luZyBwcm9wZXJseSFgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoaGVscGVySGVhbHRoLmlzQWN0aXZlKSB7XG4gICAgICAgIC8vIE9BdXRoIGhlbHBlciBpcyBhY3RpdmVseSBwb2xsaW5nXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94o+zICoqR2l0SHViIEF1dGhlbnRpY2F0aW9uIEluIFByb2dyZXNzKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDwn5SRICoqVXNlciBDb2RlOioqICR7aGVscGVySGVhbHRoLnVzZXJDb2RlfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKPse+4jyAqKlRpbWUgUmVtYWluaW5nOioqICR7TWF0aC5mbG9vcihoZWxwZXJIZWFsdGgudGltZVJlbWFpbmluZyAvIDYwKX1tICR7aGVscGVySGVhbHRoLnRpbWVSZW1haW5pbmcgJSA2MH1zXFxuYCArXG4gICAgICAgICAgICAgICAgICBg8J+UhCAqKlByb2Nlc3MgU3RhdHVzOioqICR7aGVscGVySGVhbHRoLnByb2Nlc3NBbGl2ZSA/ICfinIUgUnVubmluZycgOiAn4pqg77iPIE1heSBoYXZlIHN0b3BwZWQnfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgYPCfk4EgKipMb2cgQXZhaWxhYmxlOioqICR7aGVscGVySGVhbHRoLmhhc0xvZyA/ICdZZXMnIDogJ05vJ31cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGAqKldhaXRpbmcgZm9yIHlvdSB0bzoqKlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYDEuIEdvIHRvOiBodHRwczovL2dpdGh1Yi5jb20vbG9naW4vZGV2aWNlXFxuYCArXG4gICAgICAgICAgICAgICAgICBgMi4gRW50ZXIgY29kZTogKioke2hlbHBlckhlYWx0aC51c2VyQ29kZX0qKlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYDMuIEF1dGhvcml6ZSB0aGUgYXBwbGljYXRpb25cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBUaGUgYXV0aGVudGljYXRpb24gd2lsbCBjb21wbGV0ZSBhdXRvbWF0aWNhbGx5IG9uY2UgeW91IGF1dGhvcml6ZS5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBSdW4gdGhpcyBjb21tYW5kIGFnYWluIHRvIGNoZWNrIHN0YXR1cy5gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoaGVscGVySGVhbHRoLmV4aXN0cyAmJiBoZWxwZXJIZWFsdGguZXhwaXJlZCkge1xuICAgICAgICAvLyBIZWxwZXIgc3RhdGUgZXhpc3RzIGJ1dCBleHBpcmVkXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94o+x77iPICoqQXV0aGVudGljYXRpb24gRXhwaXJlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgVGhlIEdpdEh1YiBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGhhcyBleHBpcmVkLlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYFVzZXIgY29kZTogJHtoZWxwZXJIZWFsdGgudXNlckNvZGV9IChleHBpcmVkKVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYCoqVG8gdHJ5IGFnYWluOioqXFxuYCArXG4gICAgICAgICAgICAgICAgICBgUnVuOiBcXGBzZXR1cF9naXRodWJfYXV0aFxcYCB0byBnZXQgYSBuZXcgY29kZVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYCR7aGVscGVySGVhbHRoLmVycm9yTG9nID8gYCoqRXJyb3IgTG9nOioqXFxuXFxgXFxgXFxgXFxuJHtoZWxwZXJIZWFsdGguZXJyb3JMb2d9XFxuXFxgXFxgXFxgXFxuYCA6ICcnfWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChzdGF0dXMuaGFzVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3imqDvuI8gKipHaXRIdWIgVG9rZW4gSW52YWxpZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgQSBHaXRIdWIgdG9rZW4gd2FzIGZvdW5kIGJ1dCBpdCBhcHBlYXJzIHRvIGJlIGludmFsaWQgb3IgZXhwaXJlZC5cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGAqKlRvIGZpeCB0aGlzOioqXFxuYCArXG4gICAgICAgICAgICAgICAgICBgMS4gU2F5IFwic2V0IHVwIEdpdEh1YlwiIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYDIuIE9yIGNoZWNrIHlvdXIgR0lUSFVCX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgTm90ZTogQnJvd3NlIGFuZCBpbnN0YWxsIHN0aWxsIHdvcmsgd2l0aG91dCBhdXRoZW50aWNhdGlvbiFgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+UkiAqKk5vdCBDb25uZWN0ZWQgdG8gR2l0SHViKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBZb3UncmUgbm90IGN1cnJlbnRseSBhdXRoZW50aWNhdGVkIHdpdGggR2l0SHViLlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYCoqV2hhdCB3b3JrcyB3aXRob3V0IGF1dGg6KipcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDinIUgQnJvd3NlIHRoZSBwdWJsaWMgY29sbGVjdGlvblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKchSBJbnN0YWxsIGNvbW11bml0eSBjb250ZW50XFxuYCArXG4gICAgICAgICAgICAgICAgICBg4p2MIFN1Ym1pdCB5b3VyIG93biBjb250ZW50IChyZXF1aXJlcyBhdXRoKVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYFRvIGNvbm5lY3QsIGp1c3Qgc2F5IFwic2V0IHVwIEdpdEh1YlwiIG9yIFwiY29ubmVjdCB0byBHaXRIdWJcImBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjaGVjayBHaXRIdWIgYXV0aCcsIHsgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKlVuYWJsZSB0byBDaGVjayBBdXRoZW50aWNhdGlvbioqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYEVycm9yOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICAvLyBQdWJsaWMgbWV0aG9kIGZvciBvYXV0aF9oZWxwZXJfc3RhdHVzIHRvb2xcbiAgYXN5bmMgZ2V0T0F1dGhIZWxwZXJTdGF0dXModmVyYm9zZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhlYWx0aCA9IGF3YWl0IHRoaXMuY2hlY2tPQXV0aEhlbHBlckhlYWx0aCgpO1xuICAgICAgY29uc3Qgc3RhdGVGaWxlID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAnLmF1dGgnLCAnb2F1dGgtaGVscGVyLXN0YXRlLmpzb24nKTtcbiAgICAgIGNvbnN0IGxvZ0ZpbGUgPSBwYXRoLmpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICdvYXV0aC1oZWxwZXIubG9nJyk7XG4gICAgICBjb25zdCBwaWRGaWxlID0gcGF0aC5qb2luKGhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAnLmF1dGgnLCAnb2F1dGgtaGVscGVyLnBpZCcpO1xuICAgICAgXG4gICAgICBsZXQgc3RhdHVzVGV4dCA9IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCfk4ogKipPQXV0aCBIZWxwZXIgUHJvY2VzcyBEaWFnbm9zdGljcyoqXFxuXFxuYDtcbiAgICAgIFxuICAgICAgLy8gQmFzaWMgc3RhdHVzXG4gICAgICBpZiAoIWhlYWx0aC5leGlzdHMpIHtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgKipTdGF0dXM6KiogTm8gT0F1dGggcHJvY2VzcyBkZXRlY3RlZFxcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYCoqU3RhdGUgRmlsZToqKiBOb3QgZm91bmRcXG5cXG5gO1xuICAgICAgICBzdGF0dXNUZXh0ICs9IGBObyBhY3RpdmUgYXV0aGVudGljYXRpb24gcHJvY2Vzcy4gUnVuIFxcYHNldHVwX2dpdGh1Yl9hdXRoXFxgIHRvIHN0YXJ0IG9uZS5cXG5gO1xuICAgICAgfSBlbHNlIGlmIChoZWFsdGguaXNBY3RpdmUpIHtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgKipTdGF0dXM6Kiog8J+foiBBQ1RJVkUgLSBBdXRoZW50aWNhdGlvbiBpbiBwcm9ncmVzc1xcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYCoqVXNlciBDb2RlOioqICR7aGVhbHRoLnVzZXJDb2RlfVxcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYCoqUHJvY2VzcyBJRDoqKiAke2hlYWx0aC5waWR9XFxuYDtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgKipQcm9jZXNzIEFsaXZlOioqICR7aGVhbHRoLnByb2Nlc3NBbGl2ZSA/ICfinIUgWWVzJyA6ICfinYwgTm8gKG1heSBoYXZlIGNyYXNoZWQpJ31cXG5gO1xuICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlN0YXJ0ZWQ6KiogJHtoZWFsdGguc3RhcnRUaW1lPy50b0xvY2FsZVN0cmluZygpfVxcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYCoqRXhwaXJlczoqKiAke2hlYWx0aC5leHBpcmVzQXQ/LnRvTG9jYWxlU3RyaW5nKCl9XFxuYDtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgKipUaW1lIFJlbWFpbmluZzoqKiAke01hdGguZmxvb3IoaGVhbHRoLnRpbWVSZW1haW5pbmcgLyA2MCl9bSAke2hlYWx0aC50aW1lUmVtYWluaW5nICUgNjB9c1xcblxcbmA7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWhlYWx0aC5wcm9jZXNzQWxpdmUpIHtcbiAgICAgICAgICBzdGF0dXNUZXh0ICs9IGDimqDvuI8gKipXQVJOSU5HOioqIFByb2Nlc3MgYXBwZWFycyB0byBoYXZlIHN0b3BwZWQhXFxuYDtcbiAgICAgICAgICBzdGF0dXNUZXh0ICs9IGBUaGUgaGVscGVyIHByb2Nlc3MgKFBJRCAke2hlYWx0aC5waWR9KSBpcyBub3QgcmVzcG9uZGluZy5cXG5gO1xuICAgICAgICAgIHN0YXR1c1RleHQgKz0gYFlvdSBtYXkgbmVlZCB0byBydW4gXFxgc2V0dXBfZ2l0aHViX2F1dGhcXGAgYWdhaW4uXFxuXFxuYDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChoZWFsdGguZXhwaXJlZCkge1xuICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlN0YXR1czoqKiDwn5S0IEVYUElSRURcXG5gO1xuICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlVzZXIgQ29kZToqKiAke2hlYWx0aC51c2VyQ29kZX0gKGV4cGlyZWQpXFxuYDtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgKipQcm9jZXNzIElEOioqICR7aGVhbHRoLnBpZH1cXG5gO1xuICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKlN0YXJ0ZWQ6KiogJHtoZWFsdGguc3RhcnRUaW1lPy50b0xvY2FsZVN0cmluZygpfVxcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYCoqRXhwaXJlZDoqKiAke2hlYWx0aC5leHBpcmVzQXQ/LnRvTG9jYWxlU3RyaW5nKCl9XFxuXFxuYDtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgVGhlIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgaGFzIGV4cGlyZWQuIFJ1biBcXGBzZXR1cF9naXRodWJfYXV0aFxcYCB0byB0cnkgYWdhaW4uXFxuXFxuYDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRmlsZSBsb2NhdGlvbnNcbiAgICAgIHN0YXR1c1RleHQgKz0gYCoq8J+TgSBGaWxlIExvY2F0aW9uczoqKlxcbmA7XG4gICAgICBzdGF0dXNUZXh0ICs9IGDigKIgU3RhdGU6ICR7c3RhdGVGaWxlfVxcbmA7XG4gICAgICBzdGF0dXNUZXh0ICs9IGDigKIgTG9nOiAke2xvZ0ZpbGV9ICR7aGVhbHRoLmhhc0xvZyA/ICcoZXhpc3RzKScgOiAnKG5vdCBmb3VuZCknfVxcbmA7XG4gICAgICBzdGF0dXNUZXh0ICs9IGDigKIgUElEOiAke3BpZEZpbGV9XFxuXFxuYDtcbiAgICAgIFxuICAgICAgLy8gRXJyb3IgbG9nIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhlYWx0aC5lcnJvckxvZykge1xuICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKuKaoO+4jyBSZWNlbnQgRXJyb3JzOioqXFxuXFxgXFxgXFxgXFxuJHtoZWFsdGguZXJyb3JMb2d9XFxuXFxgXFxgXFxgXFxuXFxuYDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVmVyYm9zZSBsb2cgb3V0cHV0XG4gICAgICBpZiAodmVyYm9zZSAmJiBoZWFsdGguaGFzTG9nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZnVsbExvZyA9IGF3YWl0IGZzLnJlYWRGaWxlKGxvZ0ZpbGUsICd1dGYtOCcpO1xuICAgICAgICAgIGNvbnN0IGxpbmVzID0gZnVsbExvZy5zcGxpdCgnXFxuJykuZmlsdGVyKGxpbmUgPT4gbGluZS50cmltKCkpO1xuICAgICAgICAgIGNvbnN0IHJlY2VudExpbmVzID0gbGluZXMuc2xpY2UoLTIwKTsgLy8gTGFzdCAyMCBsaW5lc1xuICAgICAgICAgIFxuICAgICAgICAgIHN0YXR1c1RleHQgKz0gYCoq8J+TnCBSZWNlbnQgTG9nIE91dHB1dCAobGFzdCAyMCBsaW5lcyk6KipcXG5cXGBcXGBcXGBcXG5gO1xuICAgICAgICAgIHN0YXR1c1RleHQgKz0gcmVjZW50TGluZXMuam9pbignXFxuJyk7XG4gICAgICAgICAgc3RhdHVzVGV4dCArPSBgXFxuXFxgXFxgXFxgXFxuXFxuYDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBzdGF0dXNUZXh0ICs9IGAqKvCfk5wgTG9nOioqIFVuYWJsZSB0byByZWFkIGxvZyBmaWxlXFxuXFxuYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBUcm91Ymxlc2hvb3RpbmcgdGlwc1xuICAgICAgaWYgKGhlYWx0aC5leGlzdHMgJiYgIWhlYWx0aC5wcm9jZXNzQWxpdmUgJiYgIWhlYWx0aC5leHBpcmVkKSB7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYCoq8J+UpyBUcm91Ymxlc2hvb3RpbmcgVGlwczoqKlxcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYDEuIFRoZSBoZWxwZXIgcHJvY2VzcyBtYXkgaGF2ZSBjcmFzaGVkXFxuYDtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgMi4gQ2hlY2sgdGhlIGxvZyBmaWxlIGZvciBlcnJvcnM6ICR7bG9nRmlsZX1cXG5gO1xuICAgICAgICBzdGF0dXNUZXh0ICs9IGAzLiBUcnkgcnVubmluZyBcXGBzZXR1cF9naXRodWJfYXV0aFxcYCBhZ2FpblxcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYDQuIEVuc3VyZSBET0xMSE9VU0VfR0lUSFVCX0NMSUVOVF9JRCBpcyBzZXRcXG5gO1xuICAgICAgICBzdGF0dXNUZXh0ICs9IGA1LiBDaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb25cXG5gO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBNYW51YWwgY2xlYW51cCBpbnN0cnVjdGlvbnNcbiAgICAgIGlmIChoZWFsdGguZXhpc3RzICYmIChoZWFsdGguZXhwaXJlZCB8fCAhaGVhbHRoLnByb2Nlc3NBbGl2ZSkpIHtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgXFxuKirwn6e5IE1hbnVhbCBDbGVhbnVwIChpZiBuZWVkZWQpOioqXFxuYDtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgXFxgXFxgXFxgYmFzaFxcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYHJtIFwiJHtzdGF0ZUZpbGV9XCJcXG5gO1xuICAgICAgICBzdGF0dXNUZXh0ICs9IGBybSBcIiR7bG9nRmlsZX1cIlxcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYHJtIFwiJHtwaWRGaWxlfVwiXFxuYDtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgXFxgXFxgXFxgXFxuYDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBzdGF0dXNUZXh0XG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGdldCBPQXV0aCBoZWxwZXIgc3RhdHVzJywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqRmFpbGVkIHRvIEdldCBPQXV0aCBIZWxwZXIgU3RhdHVzKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgRXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgXG4gIC8vIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgT0F1dGggaGVscGVyIHByb2Nlc3MgaGVhbHRoXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tPQXV0aEhlbHBlckhlYWx0aCgpIHtcbiAgICBjb25zdCBzdGF0ZUZpbGUgPSBwYXRoLmpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICcuYXV0aCcsICdvYXV0aC1oZWxwZXItc3RhdGUuanNvbicpO1xuICAgIGNvbnN0IGxvZ0ZpbGUgPSBwYXRoLmpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICdvYXV0aC1oZWxwZXIubG9nJyk7XG4gICAgXG4gICAgY29uc3QgaGVhbHRoID0ge1xuICAgICAgZXhpc3RzOiBmYWxzZSxcbiAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgIGV4cGlyZWQ6IGZhbHNlLFxuICAgICAgcHJvY2Vzc0FsaXZlOiBmYWxzZSxcbiAgICAgIGhhc0xvZzogZmFsc2UsXG4gICAgICB1c2VyQ29kZTogJycsXG4gICAgICB0aW1lUmVtYWluaW5nOiAwLFxuICAgICAgcGlkOiAwLFxuICAgICAgc3RhcnRUaW1lOiBudWxsIGFzIERhdGUgfCBudWxsLFxuICAgICAgZXhwaXJlc0F0OiBudWxsIGFzIERhdGUgfCBudWxsLFxuICAgICAgZXJyb3JMb2c6ICcnXG4gICAgfTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgc3RhdGUgZmlsZSBleGlzdHNcbiAgICAgIGNvbnN0IHN0YXRlRGF0YSA9IGF3YWl0IGZzLnJlYWRGaWxlKHN0YXRlRmlsZSwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBzdGF0ZSA9IEpTT04ucGFyc2Uoc3RhdGVEYXRhKTtcbiAgICAgIGhlYWx0aC5leGlzdHMgPSB0cnVlO1xuICAgICAgaGVhbHRoLnBpZCA9IHN0YXRlLnBpZDtcbiAgICAgIGhlYWx0aC51c2VyQ29kZSA9IHN0YXRlLnVzZXJDb2RlO1xuICAgICAgaGVhbHRoLnN0YXJ0VGltZSA9IG5ldyBEYXRlKHN0YXRlLnN0YXJ0VGltZSk7XG4gICAgICBoZWFsdGguZXhwaXJlc0F0ID0gbmV3IERhdGUoc3RhdGUuZXhwaXJlc0F0KTtcbiAgICAgIFxuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgIGlmIChoZWFsdGguZXhwaXJlc0F0ID4gbm93KSB7XG4gICAgICAgIGhlYWx0aC5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgIGhlYWx0aC50aW1lUmVtYWluaW5nID0gTWF0aC5jZWlsKChoZWFsdGguZXhwaXJlc0F0LmdldFRpbWUoKSAtIG5vdy5nZXRUaW1lKCkpIC8gMTAwMCk7XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBpZiBwcm9jZXNzIGlzIHN0aWxsIGFsaXZlIChVbml4L0xpbnV4L01hYylcbiAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMicpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gU2VuZCBzaWduYWwgMCB0byBjaGVjayBpZiBwcm9jZXNzIGV4aXN0c1xuICAgICAgICAgICAgcHJvY2Vzcy5raWxsKGhlYWx0aC5waWQsIDApO1xuICAgICAgICAgICAgaGVhbHRoLnByb2Nlc3NBbGl2ZSA9IHRydWU7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBoZWFsdGgucHJvY2Vzc0FsaXZlID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE9uIFdpbmRvd3MsIHdlIGNhbid0IGVhc2lseSBjaGVjaywgc28gYXNzdW1lIGl0J3MgYWxpdmUgaWYgbm90IGV4cGlyZWRcbiAgICAgICAgICBoZWFsdGgucHJvY2Vzc0FsaXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhbHRoLmV4cGlyZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDaGVjayBmb3IgbG9nIGZpbGVcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLmFjY2Vzcyhsb2dGaWxlKTtcbiAgICAgICAgaGVhbHRoLmhhc0xvZyA9IHRydWU7XG4gICAgICAgIFxuICAgICAgICAvLyBSZWFkIGxhc3QgZmV3IGxpbmVzIG9mIGxvZyBpZiB0aGVyZSdzIGFuIGVycm9yXG4gICAgICAgIGlmICghaGVhbHRoLnByb2Nlc3NBbGl2ZSB8fCBoZWFsdGguZXhwaXJlZCkge1xuICAgICAgICAgIGNvbnN0IGxvZ0NvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShsb2dGaWxlLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IGxvZ0NvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgIC8vIEdldCBsYXN0IDEwIGxpbmVzIHRoYXQgY29udGFpbiBlcnJvcnMgb3IgaW1wb3J0YW50IGluZm9cbiAgICAgICAgICBjb25zdCBpbXBvcnRhbnRMaW5lcyA9IGxpbmVzLmZpbHRlcihsaW5lID0+IFxuICAgICAgICAgICAgbGluZS5pbmNsdWRlcygnZXJyb3InKSB8fCBcbiAgICAgICAgICAgIGxpbmUuaW5jbHVkZXMoJ0Vycm9yJykgfHwgXG4gICAgICAgICAgICBsaW5lLmluY2x1ZGVzKCdmYWlsZWQnKSB8fFxuICAgICAgICAgICAgbGluZS5pbmNsdWRlcygnRmFpbGVkJykgfHxcbiAgICAgICAgICAgIGxpbmUuaW5jbHVkZXMoJ+KdjCcpIHx8XG4gICAgICAgICAgICBsaW5lLmluY2x1ZGVzKCfij7HvuI8nKVxuICAgICAgICAgICkuc2xpY2UoLTEwKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaW1wb3J0YW50TGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaGVhbHRoLmVycm9yTG9nID0gaW1wb3J0YW50TGluZXMuam9pbignXFxuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTG9nIGZpbGUgZG9lc24ndCBleGlzdFxuICAgICAgfVxuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFN0YXRlIGZpbGUgZG9lc24ndCBleGlzdCBvciBpcyBpbnZhbGlkXG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFTk9FTlQnKSkge1xuICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIHRoYXQncyBva1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdFcnJvciByZWFkaW5nIE9BdXRoIGhlbHBlciBzdGF0ZScsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBoZWFsdGg7XG4gIH1cbiAgXG4gIGFzeW5jIGNsZWFyR2l0SHViQXV0aCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5jbGVhckF1dGhlbnRpY2F0aW9uKCk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqR2l0SHViIERpc2Nvbm5lY3RlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYFlvdXIgR2l0SHViIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xlYXJlZC5cXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgKipXaGF0IHN0aWxsIHdvcmtzOioqXFxuYCArXG4gICAgICAgICAgICAgICAgYOKchSBCcm93c2UgdGhlIHB1YmxpYyBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgYOKchSBJbnN0YWxsIGNvbW11bml0eSBjb250ZW50XFxuYCArXG4gICAgICAgICAgICAgICAgYOKdjCBTdWJtaXQgY29udGVudCAocmVxdWlyZXMgcmVjb25uZWN0aW9uKVxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGBUbyByZWNvbm5lY3QgbGF0ZXIsIGp1c3Qgc2F5IFwiY29ubmVjdCB0byBHaXRIdWJcIlxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGDimqDvuI8gKipOb3RlOioqIFRvIGZ1bGx5IHJlbW92ZSBhdXRoZW50aWNhdGlvbiwgYWxzbyB1bnNldCB0aGUgR0lUSFVCX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlLmBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGNsZWFyIEdpdEh1YiBhdXRoJywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqRmFpbGVkIHRvIENsZWFyIEF1dGhlbnRpY2F0aW9uKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgRXJyb3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBPQXV0aCBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnRcbiAgYXN5bmMgY29uZmlndXJlT0F1dGgoY2xpZW50X2lkPzogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ01hbmFnZXIgPSBDb25maWdNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBhd2FpdCBjb25maWdNYW5hZ2VyLmxvYWRDb25maWcoKTtcbiAgICAgIFxuICAgICAgLy8gSWYgbm8gY2xpZW50X2lkIHByb3ZpZGVkLCBzaG93IGN1cnJlbnQgY29uZmlndXJhdGlvbiBzdGF0dXNcbiAgICAgIGlmICghY2xpZW50X2lkKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDbGllbnRJZCA9IGNvbmZpZ01hbmFnZXIuZ2V0R2l0SHViQ2xpZW50SWQoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChjdXJyZW50Q2xpZW50SWQpIHtcbiAgICAgICAgICAvLyBTaG93IGZpcnN0IDEwIGNoYXJhY3RlcnMgZm9yIHNlY3VyaXR5XG4gICAgICAgICAgY29uc3QgbWFza2VkQ2xpZW50SWQgPSBjdXJyZW50Q2xpZW50SWQuc3Vic3RyaW5nKDAsIDEwKSArICcuLi4nO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICoqR2l0SHViIE9BdXRoIENvbmZpZ3VyYXRpb24qKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipDdXJyZW50IFN0YXR1czoqKiBDb25maWd1cmVkXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAqKkNsaWVudCBJRDoqKiAke21hc2tlZENsaWVudElkfVxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgWW91ciBHaXRIdWIgT0F1dGggaXMgcmVhZHkgdG8gdXNlISBZb3UgY2FuIG5vdzpcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYOKAoiBSdW4gc2V0dXBfZ2l0aHViX2F1dGggdG8gY29ubmVjdFxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBg4oCiIFN1Ym1pdCBjb250ZW50IHRvIHRoZSBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGDigKIgQWNjZXNzIGF1dGhlbnRpY2F0ZWQgZmVhdHVyZXNcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYFRvIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiwgcHJvdmlkZSBhIG5ldyBjbGllbnRfaWQgcGFyYW1ldGVyLmBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKaoO+4jyAqKkdpdEh1YiBPQXV0aCBOb3QgQ29uZmlndXJlZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBObyBHaXRIdWIgT0F1dGggY2xpZW50IElEIGlzIGN1cnJlbnRseSBjb25maWd1cmVkLlxcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgKipUbyBzZXQgdXAgT0F1dGg6KipcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYDEuIENyZWF0ZSBhIEdpdEh1YiBPQXV0aCBhcHAgYXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9zZXR0aW5ncy9hcHBsaWNhdGlvbnMvbmV3XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAyLiBVc2UgdGhlc2Ugc2V0dGluZ3M6XFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAgICDigKIgSG9tZXBhZ2UgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAgICDigKIgQXV0aG9yaXphdGlvbiBjYWxsYmFjayBVUkw6IGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9jYWxsYmFja1xcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgMy4gQ29weSB5b3VyIENsaWVudCBJRCAoc3RhcnRzIHdpdGggXCJPdjIzbGlcIilcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYDQuIFJ1bjogY29uZmlndXJlX29hdXRoIHdpdGggeW91ciBjbGllbnRfaWQgcGFyYW1ldGVyXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGAqKk5lZWQgaGVscD8qKiBDaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlsZWQgc2V0dXAgaW5zdHJ1Y3Rpb25zLmBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBjbGllbnQgSUQgZm9ybWF0XG4gICAgICBpZiAoIUNvbmZpZ01hbmFnZXIudmFsaWRhdGVDbGllbnRJZChjbGllbnRfaWQpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqSW52YWxpZCBDbGllbnQgSUQgRm9ybWF0KipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBHaXRIdWIgT0F1dGggQ2xpZW50IElEcyBtdXN0OlxcbmAgK1xuICAgICAgICAgICAgICAgICAgYOKAoiBTdGFydCB3aXRoIFwiT3YyM2xpXCJcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDigKIgQmUgZm9sbG93ZWQgYnkgYXQgbGVhc3QgMTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGAqKkV4YW1wbGU6KiogT3YyM2xpQUJDREVGR0hJSktMTU5cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgeW91ciBjbGllbnQgSUQgYW5kIHRyeSBhZ2Fpbi5gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU2F2ZSB0aGUgY2xpZW50IElEXG4gICAgICBhd2FpdCBjb25maWdNYW5hZ2VyLnNldEdpdEh1YkNsaWVudElkKGNsaWVudF9pZCk7XG4gICAgICBcbiAgICAgIC8vIFNob3cgc3VjY2VzcyBtZXNzYWdlIHdpdGggbWFza2VkIElEXG4gICAgICBjb25zdCBtYXNrZWRDbGllbnRJZCA9IGNsaWVudF9pZC5zdWJzdHJpbmcoMCwgMTApICsgJy4uLic7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAqKkdpdEh1YiBPQXV0aCBDb25maWd1cmVkIFN1Y2Nlc3NmdWxseSoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYCoqQ2xpZW50IElEOioqICR7bWFza2VkQ2xpZW50SWR9XFxuYCArXG4gICAgICAgICAgICAgICAgYCoqU2F2ZWQgdG86Kiogfi8uZG9sbGhvdXNlL2NvbmZpZy5qc29uXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYFlvdXIgR2l0SHViIE9BdXRoIGlzIG5vdyByZWFkeSEgTmV4dCBzdGVwczpcXG5gICtcbiAgICAgICAgICAgICAgICBg4oCiIFJ1biBzZXR1cF9naXRodWJfYXV0aCB0byBjb25uZWN0IHlvdXIgYWNjb3VudFxcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgU3RhcnQgc3VibWl0dGluZyBjb250ZW50IHRvIHRoZSBjb2xsZWN0aW9uXFxuYCArXG4gICAgICAgICAgICAgICAgYOKAoiBBY2Nlc3MgYWxsIGF1dGhlbnRpY2F0ZWQgZmVhdHVyZXNcXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgKipOb3RlOioqIFlvdXIgY2xpZW50IElEIGlzIHNlY3VyZWx5IHN0b3JlZCBpbiB5b3VyIGxvY2FsIGNvbmZpZyBmaWxlLmBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gY29uZmlndXJlIE9BdXRoJywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqT0F1dGggQ29uZmlndXJhdGlvbiBGYWlsZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGBFcnJvcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31cXG5cXG5gICtcbiAgICAgICAgICAgICAgICBgUGxlYXNlIGNoZWNrOlxcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgRmlsZSBwZXJtaXNzaW9ucyBmb3Igfi8uZG9sbGhvdXNlL2NvbmZpZy5qc29uXFxuYCArXG4gICAgICAgICAgICAgICAgYOKAoiBWYWxpZCBjbGllbnQgSUQgZm9ybWF0IChzdGFydHMgd2l0aCBcIk92MjNsaVwiKVxcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgQXZhaWxhYmxlIGRpc2sgc3BhY2VgXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIENoYXQtYmFzZWQgcGVyc29uYSBtYW5hZ2VtZW50IHRvb2xzXG4gIGFzeW5jIGNyZWF0ZVBlcnNvbmEobmFtZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBpbnN0cnVjdGlvbnM6IHN0cmluZywgdHJpZ2dlcnM/OiBzdHJpbmcpIHtcbiAgICAvLyBFbnN1cmUgaW5pdGlhbGl6YXRpb24gZm9yIHRlc3QgY29tcGF0aWJpbGl0eVxuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gICAgICBpZiAoIW5hbWUgfHwgIWRlc2NyaXB0aW9uIHx8ICFpbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipNaXNzaW5nIFJlcXVpcmVkIEZpZWxkcyoqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYFBsZWFzZSBwcm92aWRlIGFsbCByZXF1aXJlZCBmaWVsZHM6XFxuYCArXG4gICAgICAgICAgICAgICAgYOKAoiAqKm5hbWUqKjogRGlzcGxheSBuYW1lIGZvciB0aGUgcGVyc29uYVxcbmAgK1xuICAgICAgICAgICAgICAgIGDigKIgKipkZXNjcmlwdGlvbioqOiBCcmllZiBkZXNjcmlwdGlvbiBvZiB3aGF0IGl0IGRvZXNcXG5gICtcbiAgICAgICAgICAgICAgICBg4oCiICoqaW5zdHJ1Y3Rpb25zKio6IFRoZSBwZXJzb25hJ3MgYmVoYXZpb3JhbCBndWlkZWxpbmVzXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYCoqT3B0aW9uYWw6KipcXG5gICtcbiAgICAgICAgICAgICAgICBg4oCiICoqdHJpZ2dlcnMqKjogQ29tbWEtc2VwYXJhdGVkIGtleXdvcmRzIGZvciBhY3RpdmF0aW9uYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FuaXRpemUgYW5kIHZhbGlkYXRlIGlucHV0c1xuICAgICAgY29uc3Qgc2FuaXRpemVkTmFtZSA9IHNhbml0aXplSW5wdXQobmFtZSwgMTAwKTtcbiAgICAgIGNvbnN0IHNhbml0aXplZERlc2NyaXB0aW9uID0gc2FuaXRpemVJbnB1dChkZXNjcmlwdGlvbiwgNTAwKTtcbiAgICAgIGNvbnN0IHNhbml0aXplZEluc3RydWN0aW9ucyA9IHNhbml0aXplSW5wdXQoaW5zdHJ1Y3Rpb25zKTtcbiAgICAgIGNvbnN0IHNhbml0aXplZFRyaWdnZXJzID0gdHJpZ2dlcnMgPyBzYW5pdGl6ZUlucHV0KHRyaWdnZXJzLCAyMDApIDogJyc7XG5cbiAgICAgIC8vIFZhbGlkYXRlIG5hbWUgbGVuZ3RoIGFuZCBmb3JtYXRcbiAgICAgIGlmIChzYW5pdGl6ZWROYW1lLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQZXJzb25hIG5hbWUgbXVzdCBiZSBhdCBsZWFzdCAyIGNoYXJhY3RlcnMgbG9uZycpO1xuICAgICAgfVxuXG4gICAgICAvLyBObyBjYXRlZ29yeSB2YWxpZGF0aW9uIG5lZWRlZCAtIGNhdGVnb3JpZXMgYXJlIGRlcHJlY2F0ZWRcblxuICAgICAgLy8gVmFsaWRhdGUgY29udGVudCBzaXplc1xuICAgICAgdmFsaWRhdGVDb250ZW50U2l6ZShzYW5pdGl6ZWRJbnN0cnVjdGlvbnMsIFNFQ1VSSVRZX0xJTUlUUy5NQVhfQ09OVEVOVF9MRU5HVEgpO1xuICAgICAgdmFsaWRhdGVDb250ZW50U2l6ZShzYW5pdGl6ZWREZXNjcmlwdGlvbiwgMjAwMCk7IC8vIDJLQiBtYXggZm9yIGRlc2NyaXB0aW9uXG5cbiAgICAgIC8vIFZhbGlkYXRlIGNvbnRlbnQgZm9yIHNlY3VyaXR5IHRocmVhdHNcbiAgICAgIGNvbnN0IG5hbWVWYWxpZGF0aW9uID0gQ29udGVudFZhbGlkYXRvci52YWxpZGF0ZUFuZFNhbml0aXplKHNhbml0aXplZE5hbWUpO1xuICAgICAgaWYgKCFuYW1lVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTmFtZSBjb250YWlucyBwcm9oaWJpdGVkIGNvbnRlbnQ6ICR7bmFtZVZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVzY1ZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoc2FuaXRpemVkRGVzY3JpcHRpb24pO1xuICAgICAgaWYgKCFkZXNjVmFsaWRhdGlvbi5pc1ZhbGlkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVzY3JpcHRpb24gY29udGFpbnMgcHJvaGliaXRlZCBjb250ZW50OiAke2Rlc2NWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc3RydWN0aW9uc1ZhbGlkYXRpb24gPSBDb250ZW50VmFsaWRhdG9yLnZhbGlkYXRlQW5kU2FuaXRpemUoc2FuaXRpemVkSW5zdHJ1Y3Rpb25zKTtcbiAgICAgIGlmICghaW5zdHJ1Y3Rpb25zVmFsaWRhdGlvbi5pc1ZhbGlkICYmIGluc3RydWN0aW9uc1ZhbGlkYXRpb24uc2V2ZXJpdHkgPT09ICdjcml0aWNhbCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnN0cnVjdGlvbnMgY29udGFpbiBzZWN1cml0eSB0aHJlYXRzOiAke2luc3RydWN0aW9uc1ZhbGlkYXRpb24uZGV0ZWN0ZWRQYXR0ZXJucz8uam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgbWV0YWRhdGFcbiAgICAgIGNvbnN0IGF1dGhvciA9IHRoaXMuZ2V0Q3VycmVudFVzZXJGb3JBdHRyaWJ1dGlvbigpO1xuICAgICAgY29uc3QgdW5pcXVlSWQgPSBnZW5lcmF0ZVVuaXF1ZUlkKHNhbml0aXplZE5hbWUsIHRoaXMuY3VycmVudFVzZXIgfHwgdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gdmFsaWRhdGVGaWxlbmFtZShgJHtzbHVnaWZ5KHNhbml0aXplZE5hbWUpfS5tZGApO1xuICAgICAgLy8gcGVyc29uYXNEaXIgaXMgZ3VhcmFudGVlZCB0byBiZSBzZXQgYWZ0ZXIgZW5zdXJlSW5pdGlhbGl6ZWQoKVxuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciEsIGZpbGVuYW1lKTtcblxuICAgIC8vIENoZWNrIGlmIGZpbGUgYWxyZWFkeSBleGlzdHNcbiAgICB0cnkge1xuICAgICAgYXdhaXQgUGF0aFZhbGlkYXRvci52YWxpZGF0ZVBlcnNvbmFQYXRoKGZpbGVQYXRoKTtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3imqDvuI8gKipQZXJzb25hIEFscmVhZHkgRXhpc3RzKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYEEgcGVyc29uYSBmaWxlIG5hbWVkIFwiJHtmaWxlbmFtZX1cIiBhbHJlYWR5IGV4aXN0cy5cXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBlZGl0X3BlcnNvbmFcXGAgdG8gbW9kaWZ5IGl0LCBvciBjaG9vc2UgYSBkaWZmZXJlbnQgbmFtZS5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0LCBwcm9jZWVkIHdpdGggY3JlYXRpb25cbiAgICB9XG5cbiAgICAgIC8vIFBhcnNlIGFuZCBzYW5pdGl6ZSB0cmlnZ2Vyc1xuICAgICAgY29uc3QgdHJpZ2dlckxpc3QgPSBzYW5pdGl6ZWRUcmlnZ2VycyA/IFxuICAgICAgICBzYW5pdGl6ZWRUcmlnZ2Vycy5zcGxpdCgnLCcpLm1hcCh0ID0+IHNhbml0aXplSW5wdXQodC50cmltKCksIDUwKSkuZmlsdGVyKHQgPT4gdC5sZW5ndGggPiAwKSA6IFxuICAgICAgICBbXTtcblxuICAgICAgLy8gQ3JlYXRlIHBlcnNvbmEgbWV0YWRhdGEgd2l0aCBzYW5pdGl6ZWQgdmFsdWVzXG4gICAgICBjb25zdCBtZXRhZGF0YTogUGVyc29uYU1ldGFkYXRhID0ge1xuICAgICAgICBuYW1lOiBzYW5pdGl6ZWROYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogc2FuaXRpemVkRGVzY3JpcHRpb24sXG4gICAgICAgIHVuaXF1ZV9pZDogdW5pcXVlSWQsXG4gICAgICAgIGF1dGhvcixcbiAgICAgICAgdHJpZ2dlcnM6IHRyaWdnZXJMaXN0LFxuICAgICAgICB2ZXJzaW9uOiBcIjEuMFwiLFxuICAgICAgICBhZ2VfcmF0aW5nOiBcImFsbFwiLFxuICAgICAgICBjb250ZW50X2ZsYWdzOiBbXCJ1c2VyLWNyZWF0ZWRcIl0sXG4gICAgICAgIGFpX2dlbmVyYXRlZDogdHJ1ZSxcbiAgICAgICAgZ2VuZXJhdGlvbl9tZXRob2Q6IFwiQ2xhdWRlXCIsXG4gICAgICAgIHByaWNlOiBcImZyZWVcIixcbiAgICAgICAgcmV2ZW51ZV9zcGxpdDogXCI4MC8yMFwiLFxuICAgICAgICBsaWNlbnNlOiBcIkNDLUJZLVNBLTQuMFwiLFxuICAgICAgICBjcmVhdGVkX2RhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMClcbiAgICAgIH07XG5cbiAgICAgIC8vIENyZWF0ZSBmdWxsIHBlcnNvbmEgY29udGVudCB3aXRoIHNhbml0aXplZCB2YWx1ZXNcbiAgICAgIGNvbnN0IGZyb250bWF0dGVyID0gT2JqZWN0LmVudHJpZXMobWV0YWRhdGEpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCR7a2V5fTogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgICBjb25zdCBwZXJzb25hQ29udGVudCA9IGAtLS1cbiR7ZnJvbnRtYXR0ZXJ9XG4tLS1cblxuIyAke3Nhbml0aXplZE5hbWV9XG5cbiR7c2FuaXRpemVkSW5zdHJ1Y3Rpb25zfVxuXG4jIyBSZXNwb25zZSBTdHlsZVxuLSBGb2xsb3cgdGhlIGJlaGF2aW9yYWwgZ3VpZGVsaW5lcyBhYm92ZVxuLSBNYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoIHRoZSBwZXJzb25hJ3MgY2hhcmFjdGVyXG4tIEFkYXB0IHJlc3BvbnNlcyB0byBtYXRjaCB0aGUgaW50ZW5kZWQgcHVycG9zZVxuXG4jIyBVc2FnZSBOb3Rlc1xuLSBDcmVhdGVkIHZpYSBEb2xsaG91c2VNQ1AgY2hhdCBpbnRlcmZhY2Vcbi0gQXV0aG9yOiAke2F1dGhvcn1cbi0gVmVyc2lvbjogMS4wYDtcblxuICAgICAgLy8gVmFsaWRhdGUgZmluYWwgY29udGVudCBzaXplXG4gICAgICB2YWxpZGF0ZUNvbnRlbnRTaXplKHBlcnNvbmFDb250ZW50LCBTRUNVUklUWV9MSU1JVFMuTUFYX1BFUlNPTkFfU0laRV9CWVRFUyk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVXNlIGZpbGUgbG9ja2luZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLndpdGhMb2NrKGBwZXJzb25hOiR7c2FuaXRpemVkTmFtZX1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIERvdWJsZS1jaGVjayBmaWxlIGRvZXNuJ3QgZXhpc3QgKGluIGNhc2Ugb2YgcmFjZSBjb25kaXRpb24pXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBlcnNvbmEgZmlsZSBcIiR7ZmlsZW5hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIC8vIElmIGVycm9yIGlzIG5vdCBFTk9FTlQgKGZpbGUgbm90IGZvdW5kKSwgcmUtdGhyb3cgaXRcbiAgICAgICAgICBpZiAoZXJyb3IuY29kZSAhPT0gJ0VOT0VOVCcgJiYgZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIHByb2NlZWRcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gV3JpdGUgdGhlIGZpbGUgYXRvbWljYWxseVxuICAgICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKGZpbGVQYXRoLCBwZXJzb25hQ29udGVudCk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmVsb2FkIHBlcnNvbmFzIHRvIGluY2x1ZGUgdGhlIG5ldyBvbmVcbiAgICAgIGF3YWl0IHRoaXMubG9hZFBlcnNvbmFzKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSAqKlBlcnNvbmEgQ3JlYXRlZCBTdWNjZXNzZnVsbHkhKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYPCfjq0gKioke3Nhbml0aXplZE5hbWV9KiogYnkgJHthdXRob3J9XFxuYCArXG4gICAgICAgICAgICAgIGDwn4aUIFVuaXF1ZSBJRDogJHt1bmlxdWVJZH1cXG5gICtcbiAgICAgICAgICAgICAgYPCfk4QgU2F2ZWQgYXM6ICR7ZmlsZW5hbWV9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5OKIFRvdGFsIHBlcnNvbmFzOiAke3RoaXMucGVyc29uYXMuc2l6ZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYPCfjq8gKipSZWFkeSB0byB1c2U6KiogXFxgYWN0aXZhdGVfcGVyc29uYSBcIiR7c2FuaXRpemVkTmFtZX1cIlxcYFxcbmAgK1xuICAgICAgICAgICAgICBg8J+TpCAqKlNoYXJlIGl0OioqIFxcYHN1Ym1pdF9jb250ZW50IFwiJHtzYW5pdGl6ZWROYW1lfVwiXFxgXFxuYCArXG4gICAgICAgICAgICAgIGDinI/vuI8gKipFZGl0IGl0OioqIFxcYGVkaXRfcGVyc29uYSBcIiR7c2FuaXRpemVkTmFtZX1cIiBcImZpZWxkXCIgXCJuZXcgdmFsdWVcIlxcYGAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKkVycm9yIENyZWF0aW5nIFBlcnNvbmEqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHdyaXRlIHBlcnNvbmEgZmlsZTogJHtzYW5pdGl6ZWQubWVzc2FnZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSBjaGVjayBwZXJtaXNzaW9ucyBhbmQgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipWYWxpZGF0aW9uIEVycm9yKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYCR7c2FuaXRpemVkLm1lc3NhZ2V9XFxuXFxuYCArXG4gICAgICAgICAgICAgIGBQbGVhc2UgZml4IHRoZSBpc3N1ZSBhbmQgdHJ5IGFnYWluLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZWRpdFBlcnNvbmEocGVyc29uYUlkZW50aWZpZXI6IHN0cmluZywgZmllbGQ6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGlmICghcGVyc29uYUlkZW50aWZpZXIgfHwgIWZpZWxkIHx8ICF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqTWlzc2luZyBQYXJhbWV0ZXJzKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFVzYWdlOiBcXGBlZGl0X3BlcnNvbmEgXCJwZXJzb25hX25hbWVcIiBcImZpZWxkXCIgXCJuZXdfdmFsdWVcIlxcYFxcblxcbmAgK1xuICAgICAgICAgICAgICBgKipFZGl0YWJsZSBmaWVsZHM6KipcXG5gICtcbiAgICAgICAgICAgICAgYOKAoiAqKm5hbWUqKiAtIERpc3BsYXkgbmFtZVxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICoqZGVzY3JpcHRpb24qKiAtIEJyaWVmIGRlc2NyaXB0aW9uXFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKippbnN0cnVjdGlvbnMqKiAtIE1haW4gcGVyc29uYSBjb250ZW50XFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKip0cmlnZ2VycyoqIC0gQ29tbWEtc2VwYXJhdGVkIGtleXdvcmRzXFxuYCArXG4gICAgICAgICAgICAgIGDigKIgKip2ZXJzaW9uKiogLSBWZXJzaW9uIG51bWJlcmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgcGVyc29uYVxuICAgIGxldCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQocGVyc29uYUlkZW50aWZpZXIpO1xuICAgIFxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgLy8gU2VhcmNoIGJ5IG5hbWVcbiAgICAgIHBlcnNvbmEgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBcbiAgICAgICAgcC5tZXRhZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBlcnNvbmFJZGVudGlmaWVyLnRvTG93ZXJDYXNlKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipQZXJzb25hIE5vdCBGb3VuZCoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBDb3VsZCBub3QgZmluZCBwZXJzb25hOiBcIiR7cGVyc29uYUlkZW50aWZpZXJ9XCJcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBsaXN0X3BlcnNvbmFzXFxgIHRvIHNlZSBhdmFpbGFibGUgcGVyc29uYXMuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZEZpZWxkcyA9IFsnbmFtZScsICdkZXNjcmlwdGlvbicsICdpbnN0cnVjdGlvbnMnLCAndHJpZ2dlcnMnLCAndmVyc2lvbiddO1xuICAgIGlmICghdmFsaWRGaWVsZHMuaW5jbHVkZXMoZmllbGQudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKkludmFsaWQgRmllbGQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgRmllbGQgXCIke2ZpZWxkfVwiIGlzIG5vdCBlZGl0YWJsZS5cXG5cXG5gICtcbiAgICAgICAgICAgICAgYCoqVmFsaWQgZmllbGRzOioqICR7dmFsaWRGaWVsZHMuam9pbignLCAnKX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHBlcnNvbmFzRGlyIGlzIGd1YXJhbnRlZWQgdG8gYmUgc2V0IGFmdGVyIGluaXRpYWxpemF0aW9uXG4gICAgbGV0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMucGVyc29uYXNEaXIhLCBwZXJzb25hLmZpbGVuYW1lKTtcbiAgICBsZXQgaXNEZWZhdWx0ID0gaXNEZWZhdWx0UGVyc29uYShwZXJzb25hLmZpbGVuYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBSZWFkIGN1cnJlbnQgZmlsZVxuICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBQYXRoVmFsaWRhdG9yLnNhZmVSZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFVzZSBzZWN1cmUgWUFNTCBwYXJzZXJcbiAgICAgIGxldCBwYXJzZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBwYXJzZWQgPSBTZWN1cmVZYW1sUGFyc2VyLnNhZmVNYXR0ZXIoZmlsZUNvbnRlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VjdXJpdHlFcnJvcikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipTZWN1cml0eSBFcnJvcioqXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICBgQ2Fubm90IGVkaXQgcGVyc29uYSBkdWUgdG8gc2VjdXJpdHkgdGhyZWF0OiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gSWYgZWRpdGluZyBhIGRlZmF1bHQgcGVyc29uYSwgY3JlYXRlIGEgY29weSBpbnN0ZWFkXG4gICAgICBpZiAoaXNEZWZhdWx0KSB7XG4gICAgICAgIC8vIEdlbmVyYXRlIHVuaXF1ZSBJRCBmb3IgdGhlIGNvcHlcbiAgICAgICAgY29uc3QgYXV0aG9yID0gdGhpcy5jdXJyZW50VXNlciB8fCBnZW5lcmF0ZUFub255bW91c0lkKCk7XG4gICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gZ2VuZXJhdGVVbmlxdWVJZChwZXJzb25hLm1ldGFkYXRhLm5hbWUsIGF1dGhvcik7XG4gICAgICAgIGNvbnN0IG5ld0ZpbGVuYW1lID0gYCR7dW5pcXVlSWR9Lm1kYDtcbiAgICAgICAgY29uc3QgbmV3RmlsZVBhdGggPSBwYXRoLmpvaW4odGhpcy5wZXJzb25hc0RpciEsIG5ld0ZpbGVuYW1lKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBjb3B5IG9mIHRoZSBkZWZhdWx0IHBlcnNvbmFcbiAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IFBhdGhWYWxpZGF0b3Iuc2FmZVJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFVzZSBmaWxlIGxvY2tpbmcgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2hlbiBjcmVhdGluZyB0aGUgY29weVxuICAgICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIud2l0aExvY2soYHBlcnNvbmE6JHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9LWNvcHlgLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgRmlsZUxvY2tNYW5hZ2VyLmF0b21pY1dyaXRlRmlsZShuZXdGaWxlUGF0aCwgY29udGVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIGZpbGUgcGF0aCB0byBwb2ludCB0byB0aGUgY29weVxuICAgICAgICBmaWxlUGF0aCA9IG5ld0ZpbGVQYXRoO1xuICAgICAgICBcbiAgICAgICAgLy8gVXBkYXRlIHRoZSB1bmlxdWVfaWQgaW4gdGhlIG1ldGFkYXRhXG4gICAgICAgIHBhcnNlZC5kYXRhLnVuaXF1ZV9pZCA9IHVuaXF1ZUlkO1xuICAgICAgICBwYXJzZWQuZGF0YS5hdXRob3IgPSBhdXRob3I7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFVwZGF0ZSB0aGUgYXBwcm9wcmlhdGUgZmllbGRcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWVsZCA9IGZpZWxkLnRvTG93ZXJDYXNlKCk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIHRoZSBuZXcgdmFsdWUgZm9yIHNlY3VyaXR5IHRocmVhdHNcbiAgICAgIGNvbnN0IHZhbHVlVmFsaWRhdGlvbiA9IENvbnRlbnRWYWxpZGF0b3IudmFsaWRhdGVBbmRTYW5pdGl6ZSh2YWx1ZSk7XG4gICAgICBpZiAoIXZhbHVlVmFsaWRhdGlvbi5pc1ZhbGlkICYmIHZhbHVlVmFsaWRhdGlvbi5zZXZlcml0eSA9PT0gJ2NyaXRpY2FsJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKlNlY3VyaXR5IFZhbGlkYXRpb24gRmFpbGVkKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgYFRoZSBuZXcgdmFsdWUgY29udGFpbnMgcHJvaGliaXRlZCBjb250ZW50OlxcbmAgK1xuICAgICAgICAgICAgICBg4oCiICR7dmFsdWVWYWxpZGF0aW9uLmRldGVjdGVkUGF0dGVybnM/LmpvaW4oJ1xcbuKAoiAnKX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgYFBsZWFzZSByZW1vdmUgdGhlc2UgcGF0dGVybnMgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVc2Ugc2FuaXRpemVkIHZhbHVlIGlmIG5lZWRlZFxuICAgICAgbGV0IHNhbml0aXplZFZhbHVlID0gdmFsdWVWYWxpZGF0aW9uLnNhbml0aXplZENvbnRlbnQgfHwgdmFsdWU7XG4gICAgICBcbiAgICAgIC8vIEFsd2F5cyByZW1vdmUgc2hlbGwgbWV0YWNoYXJhY3RlcnMgZnJvbSBkaXNwbGF5IG91dHB1dFxuICAgICAgY29uc3QgZGlzcGxheVZhbHVlID0gc2FuaXRpemVkVmFsdWUucmVwbGFjZSgvWzsmfGAkKCldL2csICcnKTtcbiAgICAgIFxuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ2luc3RydWN0aW9ucycpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBtYWluIGNvbnRlbnRcbiAgICAgICAgcGFyc2VkLmNvbnRlbnQgPSBzYW5pdGl6ZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAobm9ybWFsaXplZEZpZWxkID09PSAndHJpZ2dlcnMnKSB7XG4gICAgICAgIC8vIFBhcnNlIHRyaWdnZXJzIGFzIGNvbW1hLXNlcGFyYXRlZCBsaXN0XG4gICAgICAgIHBhcnNlZC5kYXRhW25vcm1hbGl6ZWRGaWVsZF0gPSBzYW5pdGl6ZWRWYWx1ZS5zcGxpdCgnLCcpLm1hcCh0ID0+IHQudHJpbSgpKS5maWx0ZXIodCA9PiB0Lmxlbmd0aCA+IDApO1xuICAgICAgfSBlbHNlIGlmIChub3JtYWxpemVkRmllbGQgPT09ICdjYXRlZ29yeScpIHtcbiAgICAgICAgLy8gQ2F0ZWdvcnkgZmllbGQgaXMgZGVwcmVjYXRlZCBidXQgc3RpbGwgZWRpdGFibGUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgcGFyc2VkLmRhdGFbbm9ybWFsaXplZEZpZWxkXSA9IHNhbml0aXplZFZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXBkYXRlIG1ldGFkYXRhIGZpZWxkXG4gICAgICAgIC8vIEZvciBuYW1lIGZpZWxkLCBhcHBseSBhZGRpdGlvbmFsIHNhbml0aXphdGlvbiB0byByZW1vdmUgc2hlbGwgbWV0YWNoYXJhY3RlcnNcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRGaWVsZCA9PT0gJ25hbWUnKSB7XG4gICAgICAgICAgcGFyc2VkLmRhdGFbbm9ybWFsaXplZEZpZWxkXSA9IHNhbml0aXplSW5wdXQoc2FuaXRpemVkVmFsdWUsIDEwMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyc2VkLmRhdGFbbm9ybWFsaXplZEZpZWxkXSA9IHNhbml0aXplZFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB2ZXJzaW9uIGFuZCBtb2RpZmljYXRpb24gaW5mb1xuICAgICAgaWYgKG5vcm1hbGl6ZWRGaWVsZCAhPT0gJ3ZlcnNpb24nKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gcGFyc2VkLmRhdGEudmVyc2lvbiB8fCAnMS4wJztcbiAgICAgICAgY29uc3QgdmVyc2lvblBhcnRzID0gY3VycmVudFZlcnNpb24uc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcbiAgICAgICAgdmVyc2lvblBhcnRzWzFdID0gKHZlcnNpb25QYXJ0c1sxXSB8fCAwKSArIDE7XG4gICAgICAgIHBhcnNlZC5kYXRhLnZlcnNpb24gPSB2ZXJzaW9uUGFydHMuam9pbignLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWdlbmVyYXRlIGZpbGUgY29udGVudFxuICAgICAgLy8gVXNlIHNlY3VyZSBZQU1MIHN0cmluZ2lmaWNhdGlvblxuICAgICAgY29uc3Qgc2VjdXJlUGFyc2VyID0gU2VjdXJlWWFtbFBhcnNlci5jcmVhdGVTZWN1cmVNYXR0ZXJQYXJzZXIoKTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gc2VjdXJlUGFyc2VyLnN0cmluZ2lmeShwYXJzZWQuY29udGVudCwgcGFyc2VkLmRhdGEpO1xuICAgICAgXG4gICAgICAvLyBVc2UgZmlsZSBsb2NraW5nIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIud2l0aExvY2soYHBlcnNvbmE6JHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBXcml0ZSB1cGRhdGVkIGZpbGUgYXRvbWljYWxseVxuICAgICAgICBhd2FpdCBGaWxlTG9ja01hbmFnZXIuYXRvbWljV3JpdGVGaWxlKGZpbGVQYXRoLCB1cGRhdGVkQ29udGVudCk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmVsb2FkIHBlcnNvbmFzXG4gICAgICBhd2FpdCB0aGlzLmxvYWRQZXJzb25hcygpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inIUgKipQZXJzb25hIFVwZGF0ZWQgU3VjY2Vzc2Z1bGx5ISoqXFxuXFxuYCArXG4gICAgICAgICAgICAgIChpc0RlZmF1bHQgPyBg8J+TiyAqKk5vdGU6KiogQ3JlYXRlZCBhIGNvcHkgb2YgdGhlIGRlZmF1bHQgcGVyc29uYSB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwuXFxuXFxuYCA6ICcnKSArXG4gICAgICAgICAgICAgIGDwn46tICoqJHsocGFyc2VkLmRhdGEubmFtZSB8fCBwZXJzb25hLm1ldGFkYXRhLm5hbWUgfHwgJycpLnJlcGxhY2UoL1s7JnxgJCgpXS9nLCAnJyl9KipcXG5gICtcbiAgICAgICAgICAgICAgYPCfk50gKipGaWVsZCBVcGRhdGVkOioqICR7ZmllbGR9XFxuYCArXG4gICAgICAgICAgICAgIGDwn5SEICoqTmV3IFZhbHVlOioqICR7bm9ybWFsaXplZEZpZWxkID09PSAnaW5zdHJ1Y3Rpb25zJyA/ICdDb250ZW50IHVwZGF0ZWQnIDogZGlzcGxheVZhbHVlfVxcbmAgK1xuICAgICAgICAgICAgICBg8J+TiiAqKlZlcnNpb246KiogJHtwYXJzZWQuZGF0YS52ZXJzaW9ufVxcbmAgK1xuICAgICAgICAgICAgICAoaXNEZWZhdWx0ID8gYPCfhpQgKipOZXcgSUQ6KiogJHtwYXJzZWQuZGF0YS51bmlxdWVfaWR9XFxuYCA6ICcnKSArXG4gICAgICAgICAgICAgIGBcXG5gICtcbiAgICAgICAgICAgICAgYFVzZSBcXGBnZXRfcGVyc29uYV9kZXRhaWxzIFwiJHsocGFyc2VkLmRhdGEubmFtZSB8fCBwZXJzb25hLm1ldGFkYXRhLm5hbWUgfHwgJycpLnJlcGxhY2UoL1s7JnxgJCgpXS9nLCAnJyl9XCJcXGAgdG8gc2VlIGFsbCBjaGFuZ2VzLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHNhbml0aXplZCA9IFNlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKkVycm9yIFVwZGF0aW5nIFBlcnNvbmEqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBwZXJzb25hOiAke3Nhbml0aXplZC5tZXNzYWdlfVxcblxcbmAgK1xuICAgICAgICAgICAgICBgUGxlYXNlIGNoZWNrIGZpbGUgcGVybWlzc2lvbnMgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlUGVyc29uYShwZXJzb25hSWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgaWYgKCFwZXJzb25hSWRlbnRpZmllcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqTWlzc2luZyBQZXJzb25hIElkZW50aWZpZXIqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgVXNhZ2U6IFxcYHZhbGlkYXRlX3BlcnNvbmEgXCJwZXJzb25hX25hbWVcIlxcYFxcblxcbmAgK1xuICAgICAgICAgICAgICBgVXNlIFxcYGxpc3RfcGVyc29uYXNcXGAgdG8gc2VlIGF2YWlsYWJsZSBwZXJzb25hcy5gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHBlcnNvbmFcbiAgICBsZXQgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHBlcnNvbmFJZGVudGlmaWVyKTtcbiAgICBcbiAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgIC8vIFNlYXJjaCBieSBuYW1lXG4gICAgICBwZXJzb25hID0gQXJyYXkuZnJvbSh0aGlzLnBlcnNvbmFzLnZhbHVlcygpKS5maW5kKHAgPT4gXG4gICAgICAgIHAubWV0YWRhdGEubmFtZS50b0xvd2VyQ2FzZSgpID09PSBwZXJzb25hSWRlbnRpZmllci50b0xvd2VyQ2FzZSgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghcGVyc29uYSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqUGVyc29uYSBOb3QgRm91bmQqKlxcblxcbmAgK1xuICAgICAgICAgICAgICBgQ291bGQgbm90IGZpbmQgcGVyc29uYTogXCIke3BlcnNvbmFJZGVudGlmaWVyfVwiXFxuXFxuYCArXG4gICAgICAgICAgICAgIGBVc2UgXFxgbGlzdF9wZXJzb25hc1xcYCB0byBzZWUgYXZhaWxhYmxlIHBlcnNvbmFzLmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGlvbiBjaGVja3NcbiAgICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbWV0YWRhdGEgPSBwZXJzb25hLm1ldGFkYXRhO1xuXG4gICAgLy8gUmVxdWlyZWQgZmllbGQgY2hlY2tzXG4gICAgaWYgKCFtZXRhZGF0YS5uYW1lIHx8IG1ldGFkYXRhLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaXNzdWVzLnB1c2goXCJNaXNzaW5nIG9yIGVtcHR5ICduYW1lJyBmaWVsZFwiKTtcbiAgICB9XG4gICAgaWYgKCFtZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCBtZXRhZGF0YS5kZXNjcmlwdGlvbi50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICBpc3N1ZXMucHVzaChcIk1pc3Npbmcgb3IgZW1wdHkgJ2Rlc2NyaXB0aW9uJyBmaWVsZFwiKTtcbiAgICB9XG4gICAgaWYgKCFwZXJzb25hLmNvbnRlbnQgfHwgcGVyc29uYS5jb250ZW50LnRyaW0oKS5sZW5ndGggPCA1MCkge1xuICAgICAgaXNzdWVzLnB1c2goXCJQZXJzb25hIGNvbnRlbnQgaXMgdG9vIHNob3J0IChtaW5pbXVtIDUwIGNoYXJhY3RlcnMpXCIpO1xuICAgIH1cblxuICAgIC8vIENhdGVnb3J5IHZhbGlkYXRpb25cbiAgICBjb25zdCB2YWxpZENhdGVnb3JpZXMgPSBbJ2NyZWF0aXZlJywgJ3Byb2Zlc3Npb25hbCcsICdlZHVjYXRpb25hbCcsICdnYW1pbmcnLCAncGVyc29uYWwnLCAnZ2VuZXJhbCddO1xuICAgIGlmIChtZXRhZGF0YS5jYXRlZ29yeSAmJiAhdmFsaWRDYXRlZ29yaWVzLmluY2x1ZGVzKG1ldGFkYXRhLmNhdGVnb3J5KSkge1xuICAgICAgaXNzdWVzLnB1c2goYEludmFsaWQgY2F0ZWdvcnkgJyR7bWV0YWRhdGEuY2F0ZWdvcnl9Jy4gTXVzdCBiZSBvbmUgb2Y6ICR7dmFsaWRDYXRlZ29yaWVzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gQWdlIHJhdGluZyB2YWxpZGF0aW9uXG4gICAgY29uc3QgdmFsaWRBZ2VSYXRpbmdzID0gWydhbGwnLCAnMTMrJywgJzE4KyddO1xuICAgIGlmIChtZXRhZGF0YS5hZ2VfcmF0aW5nICYmICF2YWxpZEFnZVJhdGluZ3MuaW5jbHVkZXMobWV0YWRhdGEuYWdlX3JhdGluZykpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goYEludmFsaWQgYWdlX3JhdGluZyAnJHttZXRhZGF0YS5hZ2VfcmF0aW5nfScuIFNob3VsZCBiZSBvbmUgb2Y6ICR7dmFsaWRBZ2VSYXRpbmdzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gT3B0aW9uYWwgZmllbGQgd2FybmluZ3NcbiAgICBpZiAoIW1ldGFkYXRhLnRyaWdnZXJzIHx8IG1ldGFkYXRhLnRyaWdnZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgd2FybmluZ3MucHVzaChcIk5vIHRyaWdnZXIga2V5d29yZHMgZGVmaW5lZCAtIHVzZXJzIG1heSBoYXZlIGRpZmZpY3VsdHkgZmluZGluZyB0aGlzIHBlcnNvbmFcIik7XG4gICAgfVxuICAgIGlmICghbWV0YWRhdGEudmVyc2lvbikge1xuICAgICAgd2FybmluZ3MucHVzaChcIk5vIHZlcnNpb24gc3BlY2lmaWVkIC0gZGVmYXVsdGluZyB0byAnMS4wJ1wiKTtcbiAgICB9XG4gICAgaWYgKCFtZXRhZGF0YS51bmlxdWVfaWQpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJObyB1bmlxdWVfaWQgLSBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseVwiKTtcbiAgICB9XG5cbiAgICAvLyBDb250ZW50IHF1YWxpdHkgY2hlY2tzXG4gICAgaWYgKHBlcnNvbmEuY29udGVudC5sZW5ndGggPiA1MDAwKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKFwiUGVyc29uYSBjb250ZW50IGlzIHZlcnkgbG9uZyAtIGNvbnNpZGVyIGJyZWFraW5nIGl0IGludG8gc2VjdGlvbnNcIik7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YS5uYW1lICYmIG1ldGFkYXRhLm5hbWUubGVuZ3RoID4gNTApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJQZXJzb25hIG5hbWUgaXMgdmVyeSBsb25nIC0gY29uc2lkZXIgc2hvcnRlbmluZyBmb3IgYmV0dGVyIGRpc3BsYXlcIik7XG4gICAgfVxuICAgIGlmIChtZXRhZGF0YS5kZXNjcmlwdGlvbiAmJiBtZXRhZGF0YS5kZXNjcmlwdGlvbi5sZW5ndGggPiAyMDApIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goXCJEZXNjcmlwdGlvbiBpcyB2ZXJ5IGxvbmcgLSBjb25zaWRlciBrZWVwaW5nIGl0IHVuZGVyIDIwMCBjaGFyYWN0ZXJzXCIpO1xuICAgIH1cblxuICAgIC8vIEdlbmVyYXRlIHZhbGlkYXRpb24gcmVwb3J0XG4gICAgbGV0IHJlcG9ydCA9IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCfk4sgKipWYWxpZGF0aW9uIFJlcG9ydDogJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9KipcXG5cXG5gO1xuICAgIFxuICAgIGlmIChpc3N1ZXMubGVuZ3RoID09PSAwICYmIHdhcm5pbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmVwb3J0ICs9IGDinIUgKipBbGwgQ2hlY2tzIFBhc3NlZCEqKlxcblxcbmAgK1xuICAgICAgICBg8J+OrSAqKlBlcnNvbmE6KiogJHttZXRhZGF0YS5uYW1lfVxcbmAgK1xuICAgICAgICBg8J+TgSAqKkNhdGVnb3J5OioqICR7bWV0YWRhdGEuY2F0ZWdvcnkgfHwgJ2dlbmVyYWwnfVxcbmAgK1xuICAgICAgICBg8J+TiiAqKlZlcnNpb246KiogJHttZXRhZGF0YS52ZXJzaW9uIHx8ICcxLjAnfVxcbmAgK1xuICAgICAgICBg8J+TnSAqKkNvbnRlbnQgTGVuZ3RoOioqICR7cGVyc29uYS5jb250ZW50Lmxlbmd0aH0gY2hhcmFjdGVyc1xcbmAgK1xuICAgICAgICBg8J+UlyAqKlRyaWdnZXJzOioqICR7bWV0YWRhdGEudHJpZ2dlcnM/Lmxlbmd0aCB8fCAwfSBrZXl3b3Jkc1xcblxcbmAgK1xuICAgICAgICBgVGhpcyBwZXJzb25hIG1lZXRzIGFsbCB2YWxpZGF0aW9uIHJlcXVpcmVtZW50cyBhbmQgaXMgcmVhZHkgZm9yIHVzZSFgO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGDinYwgKipJc3N1ZXMgRm91bmQgKCR7aXNzdWVzLmxlbmd0aH0pOioqXFxuYDtcbiAgICAgICAgaXNzdWVzLmZvckVhY2goKGlzc3VlLCBpKSA9PiB7XG4gICAgICAgICAgcmVwb3J0ICs9IGAgICAke2kgKyAxfS4gJHtpc3N1ZX1cXG5gO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuXG4gICAgICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXBvcnQgKz0gYOKaoO+4jyAqKldhcm5pbmdzICgke3dhcm5pbmdzLmxlbmd0aH0pOioqXFxuYDtcbiAgICAgICAgd2FybmluZ3MuZm9yRWFjaCgod2FybmluZywgaSkgPT4ge1xuICAgICAgICAgIHJlcG9ydCArPSBgICAgJHtpICsgMX0uICR7d2FybmluZ31cXG5gO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVwb3J0ICs9ICdcXG4nO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVwb3J0ICs9IGAqKlJlY29tbWVuZGF0aW9uOioqIEZpeCB0aGUgaXNzdWVzIGFib3ZlIGJlZm9yZSB1c2luZyB0aGlzIHBlcnNvbmEuXFxuYDtcbiAgICAgICAgcmVwb3J0ICs9IGBVc2UgXFxgZWRpdF9wZXJzb25hIFwiJHtwZXJzb25hLm1ldGFkYXRhLm5hbWV9XCIgXCJmaWVsZFwiIFwidmFsdWVcIlxcYCB0byBtYWtlIGNvcnJlY3Rpb25zLmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXBvcnQgKz0gYCoqU3RhdHVzOioqIFBlcnNvbmEgaXMgZnVuY3Rpb25hbCBidXQgY291bGQgYmUgaW1wcm92ZWQuXFxuYDtcbiAgICAgICAgcmVwb3J0ICs9IGBBZGRyZXNzIHdhcm5pbmdzIGFib3ZlIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlLmA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHJlcG9ydCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIHJldHJ5TmV0d29ya09wZXJhdGlvbiBoYXMgYmVlbiByZW1vdmVkIHdpdGggVXBkYXRlVG9vbHNcblxuXG5cblxuXG5cblxuXG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBpbmRpY2F0b3Igc2V0dGluZ3NcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUluZGljYXRvcihjb25maWc6IFBhcnRpYWw8SW5kaWNhdG9yQ29uZmlnPikge1xuICAgIHRyeSB7XG4gICAgICAvLyBVcGRhdGUgdGhlIGNvbmZpZ3VyYXRpb25cbiAgICAgIGlmIChjb25maWcuZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLmVuYWJsZWQgPSBjb25maWcuZW5hYmxlZDtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuc3R5bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5zdHlsZSA9IGNvbmZpZy5zdHlsZTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuY3VzdG9tRm9ybWF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgY3VzdG9tIGZvcm1hdCBiZWZvcmUgYXBwbHlpbmdcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHZhbGlkYXRlQ3VzdG9tRm9ybWF0KGNvbmZpZy5jdXN0b21Gb3JtYXQpO1xuICAgICAgICBpZiAoIXZhbGlkYXRpb24udmFsaWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEludmFsaWQgY3VzdG9tIGZvcm1hdDogJHt2YWxpZGF0aW9uLmVycm9yfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuY3VzdG9tRm9ybWF0ID0gY29uZmlnLmN1c3RvbUZvcm1hdDtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuc2hvd1ZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5zaG93VmVyc2lvbiA9IGNvbmZpZy5zaG93VmVyc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuc2hvd0F1dGhvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dBdXRob3IgPSBjb25maWcuc2hvd0F1dGhvcjtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuc2hvd0NhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd0NhdGVnb3J5ID0gY29uZmlnLnNob3dDYXRlZ29yeTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuZW1vamkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmluZGljYXRvckNvbmZpZy5lbW9qaSA9IGNvbmZpZy5lbW9qaTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcuYnJhY2tldFN0eWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbmRpY2F0b3JDb25maWcuYnJhY2tldFN0eWxlID0gY29uZmlnLmJyYWNrZXRTdHlsZTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyBleGFtcGxlIG9mIHdoYXQgdGhlIGluZGljYXRvciB3b3VsZCBsb29rIGxpa2VcbiAgICAgIGxldCBleGFtcGxlSW5kaWNhdG9yID0gXCJcIjtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZVBlcnNvbmEpIHtcbiAgICAgICAgY29uc3QgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHRoaXMuYWN0aXZlUGVyc29uYSk7XG4gICAgICAgIGlmIChwZXJzb25hKSB7XG4gICAgICAgICAgZXhhbXBsZUluZGljYXRvciA9IGZvcm1hdEluZGljYXRvcih0aGlzLmluZGljYXRvckNvbmZpZywge1xuICAgICAgICAgICAgbmFtZTogcGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgdmVyc2lvbjogcGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgICAgYXV0aG9yOiBwZXJzb25hLm1ldGFkYXRhLmF1dGhvcixcbiAgICAgICAgICAgIGNhdGVnb3J5OiBwZXJzb25hLm1ldGFkYXRhLmNhdGVnb3J5XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNob3cgZXhhbXBsZSB3aXRoIHNhbXBsZSBkYXRhXG4gICAgICAgIGV4YW1wbGVJbmRpY2F0b3IgPSBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgICAgICBuYW1lOiBcIkV4YW1wbGUgUGVyc29uYVwiLFxuICAgICAgICAgIHZlcnNpb246IFwiMS4wXCIsXG4gICAgICAgICAgYXV0aG9yOiBcIkB1c2VybmFtZVwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImNyZWF0aXZlXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSBJbmRpY2F0b3IgY29uZmlndXJhdGlvbiB1cGRhdGVkIHN1Y2Nlc3NmdWxseSFcblxuQ3VycmVudCBzZXR0aW5nczpcbi0gRW5hYmxlZDogJHt0aGlzLmluZGljYXRvckNvbmZpZy5lbmFibGVkfVxuLSBTdHlsZTogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zdHlsZX1cbi0gU2hvdyBWZXJzaW9uOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dWZXJzaW9ufVxuLSBTaG93IEF1dGhvcjogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93QXV0aG9yfVxuLSBTaG93IENhdGVnb3J5OiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNob3dDYXRlZ29yeX1cbi0gRW1vamk6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuZW1vaml9XG4tIEJyYWNrZXRzOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmJyYWNrZXRTdHlsZX1cbiR7dGhpcy5pbmRpY2F0b3JDb25maWcuY3VzdG9tRm9ybWF0ID8gYC0gQ3VzdG9tIEZvcm1hdDogJHt0aGlzLmluZGljYXRvckNvbmZpZy5jdXN0b21Gb3JtYXR9YCA6ICcnfVxuXG5FeGFtcGxlIGluZGljYXRvcjogJHtleGFtcGxlSW5kaWNhdG9yIHx8IFwiKG5vbmUgLSBpbmRpY2F0b3JzIGRpc2FibGVkKVwifVxuXG5Ob3RlOiBDb25maWd1cmF0aW9uIGlzIHRlbXBvcmFyeSBmb3IgdGhpcyBzZXNzaW9uLiBUbyBtYWtlIHBlcm1hbmVudCwgc2V0IGVudmlyb25tZW50IHZhcmlhYmxlczpcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9FTkFCTEVEPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TVFlMRT1mdWxsL21pbmltYWwvY29tcGFjdC9jdXN0b21cbi0gRE9MTEhPVVNFX0lORElDQVRPUl9GT1JNQVQ9XCJjdXN0b20gZm9ybWF0IHRlbXBsYXRlXCJcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX1ZFUlNJT049dHJ1ZS9mYWxzZVxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX1NIT1dfQVVUSE9SPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX0NBVEVHT1JZPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9FTU9KST3wn46tXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfQlJBQ0tFVFM9c3F1YXJlL3JvdW5kL2N1cmx5L2FuZ2xlL25vbmVgXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRXJyb3IgY29uZmlndXJpbmcgaW5kaWNhdG9yOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGluZGljYXRvciBjb25maWd1cmF0aW9uXG4gICAqL1xuICBhc3luYyBjb25maWd1cmVDb2xsZWN0aW9uU3VibWlzc2lvbihhdXRvU3VibWl0OiBib29sZWFuKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFN0b3JlIHRoZSBjb25maWd1cmF0aW9uIGluIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAgICBpZiAoYXV0b1N1Ym1pdCkge1xuICAgICAgICBwcm9jZXNzLmVudi5ET0xMSE9VU0VfQVVUT19TVUJNSVRfVE9fQ09MTEVDVElPTiA9ICd0cnVlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfQVVUT19TVUJNSVRfVE9fQ09MTEVDVElPTjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVzc2FnZSA9IGF1dG9TdWJtaXQgXG4gICAgICAgID8gXCLinIUgQ29sbGVjdGlvbiBzdWJtaXNzaW9uIGVuYWJsZWQhIENvbnRlbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHN1Ym1pdHRlZCB0byB0aGUgRG9sbGhvdXNlTUNQIGNvbGxlY3Rpb24gYWZ0ZXIgcG9ydGZvbGlvIHVwbG9hZC5cIlxuICAgICAgICA6IFwi4pyFIENvbGxlY3Rpb24gc3VibWlzc2lvbiBkaXNhYmxlZC4gQ29udGVudCB3aWxsIG9ubHkgYmUgdXBsb2FkZWQgdG8geW91ciBwZXJzb25hbCBwb3J0Zm9saW8uXCI7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfSR7bWVzc2FnZX1gXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGNvbmZpZ3VyaW5nIGNvbGxlY3Rpb24gc3VibWlzc2lvbicsIHsgZXJyb3IgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRmFpbGVkIHRvIGNvbmZpZ3VyZSBjb2xsZWN0aW9uIHN1Ym1pc3Npb246ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRDb2xsZWN0aW9uU3VibWlzc2lvbkNvbmZpZygpIHtcbiAgICBjb25zdCBhdXRvU3VibWl0RW5hYmxlZCA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9BVVRPX1NVQk1JVF9UT19DT0xMRUNUSU9OID09PSAndHJ1ZSc7XG4gICAgXG4gICAgY29uc3QgbWVzc2FnZSA9IGAqKkNvbGxlY3Rpb24gU3VibWlzc2lvbiBDb25maWd1cmF0aW9uKipcXG5cXG5gICtcbiAgICAgIGDigKIgKipBdXRvLXN1Ym1pdCoqOiAke2F1dG9TdWJtaXRFbmFibGVkID8gJ+KchSBFbmFibGVkJyA6ICfinYwgRGlzYWJsZWQnfVxcblxcbmAgK1xuICAgICAgYFdoZW4gYXV0by1zdWJtaXQgaXMgZW5hYmxlZCwgdGhlIFxcYHN1Ym1pdF9jb250ZW50XFxgIHRvb2wgd2lsbDpcXG5gICtcbiAgICAgIGAxLiBVcGxvYWQgY29udGVudCB0byB5b3VyIEdpdEh1YiBwb3J0Zm9saW9cXG5gICtcbiAgICAgIGAyLiBBdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHN1Ym1pc3Npb24gaXNzdWUgaW4gRG9sbGhvdXNlTUNQL2NvbGxlY3Rpb25cXG5cXG5gICtcbiAgICAgIGBUbyBjaGFuZ2UgdGhpcyBzZXR0aW5nLCB1c2U6XFxuYCArXG4gICAgICBgXFxgXFxgXFxgXFxuY29uZmlndXJlX2NvbGxlY3Rpb25fc3VibWlzc2lvbiBhdXRvU3VibWl0OiB0cnVlL2ZhbHNlXFxuXFxgXFxgXFxgYDtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke21lc3NhZ2V9YFxuICAgICAgICB9XG4gICAgICBdXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGdldEluZGljYXRvckNvbmZpZygpIHtcbiAgICAvLyBTaG93IGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgZXhhbXBsZVxuICAgIGxldCBleGFtcGxlSW5kaWNhdG9yID0gXCJcIjtcbiAgICBpZiAodGhpcy5hY3RpdmVQZXJzb25hKSB7XG4gICAgICBjb25zdCBwZXJzb25hID0gdGhpcy5wZXJzb25hcy5nZXQodGhpcy5hY3RpdmVQZXJzb25hKTtcbiAgICAgIGlmIChwZXJzb25hKSB7XG4gICAgICAgIGV4YW1wbGVJbmRpY2F0b3IgPSBmb3JtYXRJbmRpY2F0b3IodGhpcy5pbmRpY2F0b3JDb25maWcsIHtcbiAgICAgICAgICBuYW1lOiBwZXJzb25hLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgdmVyc2lvbjogcGVyc29uYS5tZXRhZGF0YS52ZXJzaW9uLFxuICAgICAgICAgIGF1dGhvcjogcGVyc29uYS5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgICAgY2F0ZWdvcnk6IHBlcnNvbmEubWV0YWRhdGEuY2F0ZWdvcnlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNob3cgZXhhbXBsZSB3aXRoIHNhbXBsZSBkYXRhXG4gICAgICBleGFtcGxlSW5kaWNhdG9yID0gZm9ybWF0SW5kaWNhdG9yKHRoaXMuaW5kaWNhdG9yQ29uZmlnLCB7XG4gICAgICAgIG5hbWU6IFwiRXhhbXBsZSBQZXJzb25hXCIsXG4gICAgICAgIHZlcnNpb246IFwiMS4wXCIsXG4gICAgICAgIGF1dGhvcjogXCJAdXNlcm5hbWVcIixcbiAgICAgICAgY2F0ZWdvcnk6IFwiY3JlYXRpdmVcIlxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCfk4ogQ3VycmVudCBJbmRpY2F0b3IgQ29uZmlndXJhdGlvbjpcblxuU2V0dGluZ3M6XG4tIEVuYWJsZWQ6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuZW5hYmxlZH1cbi0gU3R5bGU6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc3R5bGV9XG4tIFNob3cgVmVyc2lvbjogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93VmVyc2lvbn1cbi0gU2hvdyBBdXRob3I6ICR7dGhpcy5pbmRpY2F0b3JDb25maWcuc2hvd0F1dGhvcn1cbi0gU2hvdyBDYXRlZ29yeTogJHt0aGlzLmluZGljYXRvckNvbmZpZy5zaG93Q2F0ZWdvcnl9XG4tIEVtb2ppOiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmVtb2ppfVxuLSBCcmFja2V0czogJHt0aGlzLmluZGljYXRvckNvbmZpZy5icmFja2V0U3R5bGV9XG4tIFNlcGFyYXRvcjogXCIke3RoaXMuaW5kaWNhdG9yQ29uZmlnLnNlcGFyYXRvcn1cIlxuJHt0aGlzLmluZGljYXRvckNvbmZpZy5jdXN0b21Gb3JtYXQgPyBgLSBDdXN0b20gRm9ybWF0OiAke3RoaXMuaW5kaWNhdG9yQ29uZmlnLmN1c3RvbUZvcm1hdH1gIDogJyd9XG5cbkF2YWlsYWJsZSBzdHlsZXM6XG4tIGZ1bGw6IFvwn46tIFBlcnNvbmEgTmFtZSB2MS4wIGJ5IEBhdXRob3JdXG4tIG1pbmltYWw6IPCfjq0gUGVyc29uYSBOYW1lXG4tIGNvbXBhY3Q6IFtQZXJzb25hIE5hbWUgdjEuMF1cbi0gY3VzdG9tOiBVc2UgeW91ciBvd24gZm9ybWF0IHdpdGggcGxhY2Vob2xkZXJzXG5cbkV4YW1wbGUgd2l0aCBjdXJyZW50IHNldHRpbmdzOiAke2V4YW1wbGVJbmRpY2F0b3IgfHwgXCIobm9uZSAtIGluZGljYXRvcnMgZGlzYWJsZWQpXCJ9XG5cblBsYWNlaG9sZGVycyBmb3IgY3VzdG9tIGZvcm1hdDpcbi0ge2Vtb2ppfSAtIFRoZSBjb25maWd1cmVkIGVtb2ppXG4tIHtuYW1lfSAtIFBlcnNvbmEgbmFtZVxuLSB7dmVyc2lvbn0gLSBQZXJzb25hIHZlcnNpb25cbi0ge2F1dGhvcn0gLSBQZXJzb25hIGF1dGhvclxuLSB7Y2F0ZWdvcnl9IC0gUGVyc29uYSBjYXRlZ29yeWBcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG4gIH1cblxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYSBzaW5nbGUgcGVyc29uYVxuICAgKi9cbiAgYXN5bmMgZXhwb3J0UGVyc29uYShwZXJzb25hTmFtZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSBhIHNpbmdsZSBsb29rdXAgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zXG4gICAgICBsZXQgcGVyc29uYSA9IHRoaXMucGVyc29uYXMuZ2V0KHBlcnNvbmFOYW1lKTtcbiAgICAgIGlmICghcGVyc29uYSkge1xuICAgICAgICAvLyBUcnkgYnkgZmlsZW5hbWVcbiAgICAgICAgcGVyc29uYSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSkuZmluZChwID0+IHAuZmlsZW5hbWUgPT09IHBlcnNvbmFOYW1lKTtcbiAgICAgICAgaWYgKCFwZXJzb25hKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgUGVyc29uYSBub3QgZm91bmQ6ICR7cGVyc29uYU5hbWV9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4cG9ydERhdGEgPSB0aGlzLnBlcnNvbmFFeHBvcnRlci5leHBvcnRQZXJzb25hKHBlcnNvbmEpO1xuICAgICAgY29uc3QgYmFzZTY0ID0gdGhpcy5wZXJzb25hRXhwb3J0ZXIudG9CYXNlNjQoZXhwb3J0RGF0YSk7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBlcnNvbmFFeHBvcnRlci5mb3JtYXRFeHBvcnRSZXN1bHQocGVyc29uYSwgYmFzZTY0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3Jlc3VsdH1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBFeHBvcnQgZmFpbGVkOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbGwgcGVyc29uYXNcbiAgICovXG4gIGFzeW5jIGV4cG9ydEFsbFBlcnNvbmFzKGluY2x1ZGVEZWZhdWx0cyA9IHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVyc29uYXNBcnJheSA9IEFycmF5LmZyb20odGhpcy5wZXJzb25hcy52YWx1ZXMoKSk7XG4gICAgICBjb25zdCBidW5kbGUgPSB0aGlzLnBlcnNvbmFFeHBvcnRlci5leHBvcnRCdW5kbGUocGVyc29uYXNBcnJheSwgaW5jbHVkZURlZmF1bHRzKTtcbiAgICAgIGNvbnN0IGJhc2U2NCA9IHRoaXMucGVyc29uYUV4cG9ydGVyLnRvQmFzZTY0KGJ1bmRsZSk7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBlcnNvbmFFeHBvcnRlci5mb3JtYXRCdW5kbGVSZXN1bHQoYnVuZGxlLCBiYXNlNjQpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfSR7cmVzdWx0fWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEV4cG9ydCBmYWlsZWQ6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgcGVyc29uYVxuICAgKi9cbiAgYXN5bmMgaW1wb3J0UGVyc29uYShzb3VyY2U6IHN0cmluZywgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLnBlcnNvbmFJbXBvcnRlcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbXBvcnQgZnVuY3Rpb25hbGl0eSBub3QgYXZhaWxhYmxlIChpbml0aWFsaXphdGlvbiBpbiBwcm9ncmVzcylgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGVyc29uYUltcG9ydGVyLmltcG9ydFBlcnNvbmEoc291cmNlLCB0aGlzLnBlcnNvbmFzLCBvdmVyd3JpdGUpO1xuICAgICAgXG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gUmVsb2FkIHBlcnNvbmFzIHRvIGluY2x1ZGUgdGhlIG5ldyBvbmVcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFICR7cmVzdWx0Lm1lc3NhZ2V9XFxuXFxuUGVyc29uYSBcIiR7cmVzdWx0LnBlcnNvbmE/Lm1ldGFkYXRhLm5hbWV9XCIgaXMgbm93IGF2YWlsYWJsZS5cXG5Ub3RhbCBwZXJzb25hczogJHt0aGlzLnBlcnNvbmFzLnNpemV9YFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAke3Jlc3VsdC5tZXNzYWdlfWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbXBvcnQgZmFpbGVkOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIGEgcGVyc29uYSB2aWEgVVJMXG4gICAqL1xuICBhc3luYyBzaGFyZVBlcnNvbmEocGVyc29uYU5hbWU6IHN0cmluZywgZXhwaXJ5RGF5cyA9IDcpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5oYW5jZWQgaW5wdXQgdmFsaWRhdGlvblxuICAgICAgY29uc3QgdmFsaWRhdGVkUGVyc29uYU5hbWUgPSBNQ1BJbnB1dFZhbGlkYXRvci52YWxpZGF0ZVBlcnNvbmFJZGVudGlmaWVyKHBlcnNvbmFOYW1lKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRlZEV4cGlyeURheXMgPSBNQ1BJbnB1dFZhbGlkYXRvci52YWxpZGF0ZUV4cGlyeURheXMoZXhwaXJ5RGF5cyk7XG4gICAgICBcbiAgICAgIGNvbnN0IHBlcnNvbmEgPSB0aGlzLnBlcnNvbmFzLmdldCh2YWxpZGF0ZWRQZXJzb25hTmFtZSk7XG4gICAgICBpZiAoIXBlcnNvbmEpIHtcbiAgICAgICAgLy8gVHJ5IGJ5IGZpbGVuYW1lXG4gICAgICAgIGNvbnN0IGJ5RmlsZW5hbWUgPSBBcnJheS5mcm9tKHRoaXMucGVyc29uYXMudmFsdWVzKCkpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09PSB2YWxpZGF0ZWRQZXJzb25hTmFtZSk7XG4gICAgICAgIGlmICghYnlGaWxlbmFtZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIFBlcnNvbmEgbm90IGZvdW5kOiAke3ZhbGlkYXRlZFBlcnNvbmFOYW1lfWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBwZXJzb25hTmFtZSA9IGJ5RmlsZW5hbWUubWV0YWRhdGEubmFtZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJzb25hU2hhcmVyLnNoYXJlUGVyc29uYSh0aGlzLnBlcnNvbmFzLmdldChwZXJzb25hTmFtZSkhLCB2YWxpZGF0ZWRFeHBpcnlEYXlzKTtcbiAgICAgIFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX0ke3Jlc3VsdC5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIFNoYXJlIGZhaWxlZDogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgZnJvbSBhIHNoYXJlZCBVUkxcbiAgICovXG4gIGFzeW5jIGltcG9ydEZyb21VcmwodXJsOiBzdHJpbmcsIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuaGFuY2VkIGlucHV0IHZhbGlkYXRpb24gZm9yIFVSTFxuICAgICAgY29uc3QgdmFsaWRhdGVkVXJsID0gTUNQSW5wdXRWYWxpZGF0b3IudmFsaWRhdGVJbXBvcnRVcmwodXJsKTtcbiAgICAgIFxuICAgICAgY29uc3QgZmV0Y2hSZXN1bHQgPSBhd2FpdCB0aGlzLnBlcnNvbmFTaGFyZXIuaW1wb3J0RnJvbVVybCh2YWxpZGF0ZWRVcmwpO1xuICAgICAgXG4gICAgICBpZiAoIWZldGNoUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgJHtmZXRjaFJlc3VsdC5tZXNzYWdlfWBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBJbXBvcnQgdGhlIGZldGNoZWQgZGF0YVxuICAgICAgaWYgKCF0aGlzLnBlcnNvbmFJbXBvcnRlcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbXBvcnQgZnVuY3Rpb25hbGl0eSBub3QgYXZhaWxhYmxlIChpbml0aWFsaXphdGlvbiBpbiBwcm9ncmVzcylgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGltcG9ydFJlc3VsdCA9IGF3YWl0IHRoaXMucGVyc29uYUltcG9ydGVyLmltcG9ydFBlcnNvbmEoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGZldGNoUmVzdWx0LmRhdGEpLFxuICAgICAgICB0aGlzLnBlcnNvbmFzLFxuICAgICAgICBvdmVyd3JpdGVcbiAgICAgICk7XG5cbiAgICAgIGlmIChpbXBvcnRSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAvLyBSZWxvYWQgcGVyc29uYXNcbiAgICAgICAgYXdhaXQgdGhpcy5sb2FkUGVyc29uYXMoKTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94pyFIFN1Y2Nlc3NmdWxseSBpbXBvcnRlZCBmcm9tIFVSTCFcXG5cXG4ke2ltcG9ydFJlc3VsdC5tZXNzYWdlfVxcblRvdGFsIHBlcnNvbmFzOiAke3RoaXMucGVyc29uYXMuc2l6ZX1gXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICR7aW1wb3J0UmVzdWx0Lm1lc3NhZ2V9YFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEltcG9ydCBmcm9tIFVSTCBmYWlsZWQ6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9ydGZvbGlvIG1hbmFnZW1lbnQgbWV0aG9kc1xuICAgKi9cblxuICAvKipcbiAgICogQ2hlY2sgcG9ydGZvbGlvIHN0YXR1cyBpbmNsdWRpbmcgcmVwb3NpdG9yeSBleGlzdGVuY2UgYW5kIHN5bmMgaW5mb3JtYXRpb25cbiAgICovXG4gIGFzeW5jIHBvcnRmb2xpb1N0YXR1cyh1c2VybmFtZT86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSB1c2VybmFtZSBwYXJhbWV0ZXIgaWYgcHJvdmlkZWRcbiAgICAgIGlmICh1c2VybmFtZSAmJiB0eXBlb2YgdXNlcm5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFsaWRhdGVVc2VybmFtZSh1c2VybmFtZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgSW52YWxpZCB1c2VybmFtZTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdWYWxpZGF0aW9uIGZhaWxlZCd9YFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCBjdXJyZW50IHVzZXIgaWYgdXNlcm5hbWUgbm90IHByb3ZpZGVkXG4gICAgICBsZXQgdGFyZ2V0VXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICAgIGlmICghdGFyZ2V0VXNlcm5hbWUpIHtcbiAgICAgICAgY29uc3QgYXV0aFN0YXR1cyA9IGF3YWl0IHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIuZ2V0QXV0aFN0YXR1cygpO1xuICAgICAgICBpZiAoIWF1dGhTdGF0dXMuaXNBdXRoZW50aWNhdGVkIHx8ICFhdXRoU3RhdHVzLnVzZXJuYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgKipHaXRIdWIgQXV0aGVudGljYXRpb24gUmVxdWlyZWQqKlxcblxcbmAgK1xuICAgICAgICAgICAgYPCflJAgKipRdWljayBTZXR1cCoqOlxcbmAgK1xuICAgICAgICAgICAgYDEuIFJ1bjogXFxgc2V0dXBfZ2l0aHViX2F1dGhcXGAgdG8gYXV0aGVudGljYXRlXFxuYCArXG4gICAgICAgICAgICBgMi4gT3IgdXNlOiBcXGBnaCBhdXRoIGxvZ2luIC0td2ViXFxgIGlmIHlvdSBoYXZlIEdpdEh1YiBDTElcXG5cXG5gICtcbiAgICAgICAgICAgIGDwn5OdICoqV2hhdCB0aGlzIGVuYWJsZXMqKjpcXG5gICtcbiAgICAgICAgICAgIGDigKIgVXBsb2FkIGVsZW1lbnRzIHRvIHlvdXIgR2l0SHViIHBvcnRmb2xpb1xcbmAgK1xuICAgICAgICAgICAgYOKAoiBTeW5jIHlvdXIgbG9jYWwgcG9ydGZvbGlvIHdpdGggR2l0SHViXFxuYCArXG4gICAgICAgICAgICBg4oCiIFNoYXJlIGVsZW1lbnRzIHdpdGggdGhlIGNvbW11bml0eVxcblxcbmAgK1xuICAgICAgICAgICAgYPCfjJAgKipOZWVkIGhlbHA/KiogVmlzaXQ6IGh0dHBzOi8vZG9jcy5hbnRocm9waWMuY29tL2VuL2RvY3MvY2xhdWRlLWNvZGUvb2F1dGgtc2V0dXBgXG4gICAgICAgICAgICB9XVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0VXNlcm5hbWUgPSBhdXRoU3RhdHVzLnVzZXJuYW1lO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBwb3J0Zm9saW8gZXhpc3RzXG4gICAgICBjb25zdCB7IFBvcnRmb2xpb1JlcG9NYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoJy4vcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmpzJyk7XG4gICAgICBjb25zdCBwb3J0Zm9saW9NYW5hZ2VyID0gbmV3IFBvcnRmb2xpb1JlcG9NYW5hZ2VyKCk7XG4gICAgICBjb25zdCBwb3J0Zm9saW9FeGlzdHMgPSBhd2FpdCBwb3J0Zm9saW9NYW5hZ2VyLmNoZWNrUG9ydGZvbGlvRXhpc3RzKHRhcmdldFVzZXJuYW1lKTtcblxuICAgICAgbGV0IHN0YXR1c1RleHQgPSBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5OKICoqUG9ydGZvbGlvIFN0YXR1cyBmb3IgJHt0YXJnZXRVc2VybmFtZX0qKlxcblxcbmA7XG5cbiAgICAgIGlmIChwb3J0Zm9saW9FeGlzdHMpIHtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBg4pyFICoqUmVwb3NpdG9yeSoqOiBkb2xsaG91c2UtcG9ydGZvbGlvIGV4aXN0c1xcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYPCflJcgKipVUkwqKjogaHR0cHM6Ly9naXRodWIuY29tLyR7dGFyZ2V0VXNlcm5hbWV9L2RvbGxob3VzZS1wb3J0Zm9saW9cXG5cXG5gO1xuICAgICAgICBcbiAgICAgICAgLy8gR2V0IGxvY2FsIGVsZW1lbnRzIGNvdW50XG4gICAgICAgIGNvbnN0IGxvY2FsUG9ydGZvbGlvTWFuYWdlciA9IFBvcnRmb2xpb01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgY29uc3QgcGVyc29uYXNQYXRoID0gbG9jYWxQb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoRWxlbWVudFR5cGUuUEVSU09OQSk7XG4gICAgICAgIGNvbnN0IHNraWxsc1BhdGggPSBsb2NhbFBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5TS0lMTCk7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlc1BhdGggPSBsb2NhbFBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5URU1QTEFURSk7XG4gICAgICAgIGNvbnN0IGFnZW50c1BhdGggPSBsb2NhbFBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5BR0VOVCk7XG4gICAgICAgIGNvbnN0IG1lbW9yaWVzUGF0aCA9IGxvY2FsUG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKEVsZW1lbnRUeXBlLk1FTU9SWSk7XG4gICAgICAgIGNvbnN0IGVuc2VtYmxlc1BhdGggPSBsb2NhbFBvcnRmb2xpb01hbmFnZXIuZ2V0RWxlbWVudERpcihFbGVtZW50VHlwZS5FTlNFTUJMRSk7XG5cbiAgICAgICAgY29uc3QgW3BlcnNvbmFzLCBza2lsbHMsIHRlbXBsYXRlcywgYWdlbnRzLCBtZW1vcmllcywgZW5zZW1ibGVzXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICB0aGlzLmNvdW50RWxlbWVudHNJbkRpcihwZXJzb25hc1BhdGgpLFxuICAgICAgICAgIHRoaXMuY291bnRFbGVtZW50c0luRGlyKHNraWxsc1BhdGgpLFxuICAgICAgICAgIHRoaXMuY291bnRFbGVtZW50c0luRGlyKHRlbXBsYXRlc1BhdGgpLFxuICAgICAgICAgIHRoaXMuY291bnRFbGVtZW50c0luRGlyKGFnZW50c1BhdGgpLFxuICAgICAgICAgIHRoaXMuY291bnRFbGVtZW50c0luRGlyKG1lbW9yaWVzUGF0aCksXG4gICAgICAgICAgdGhpcy5jb3VudEVsZW1lbnRzSW5EaXIoZW5zZW1ibGVzUGF0aClcbiAgICAgICAgXSk7XG5cbiAgICAgICAgY29uc3QgdG90YWxFbGVtZW50cyA9IHBlcnNvbmFzICsgc2tpbGxzICsgdGVtcGxhdGVzICsgYWdlbnRzICsgbWVtb3JpZXMgKyBlbnNlbWJsZXM7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYPCfk4ggKipMb2NhbCBFbGVtZW50cyoqOlxcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYCAg4oCiIFBlcnNvbmFzOiAke3BlcnNvbmFzfVxcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYCAg4oCiIFNraWxsczogJHtza2lsbHN9XFxuYDtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgICDigKIgVGVtcGxhdGVzOiAke3RlbXBsYXRlc31cXG5gO1xuICAgICAgICBzdGF0dXNUZXh0ICs9IGAgIOKAoiBBZ2VudHM6ICR7YWdlbnRzfVxcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYCAg4oCiIE1lbW9yaWVzOiAke21lbW9yaWVzfVxcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYCAg4oCiIEVuc2VtYmxlczogJHtlbnNlbWJsZXN9XFxuYDtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgICDigKIgKipUb3RhbCoqOiAke3RvdGFsRWxlbWVudHN9XFxuXFxuYDtcblxuICAgICAgICBzdGF0dXNUZXh0ICs9IGDwn5SEICoqU3luYyBTdGF0dXMqKjogVXNlIHN5bmNfcG9ydGZvbGlvIHRvIHVwZGF0ZSBHaXRIdWJcXG5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBg4p2MICoqUmVwb3NpdG9yeSoqOiBObyBwb3J0Zm9saW8gZm91bmRcXG5gO1xuICAgICAgICBzdGF0dXNUZXh0ICs9IGDwn5KhICoqTmV4dCBTdGVwKio6IFVzZSBpbml0X3BvcnRmb2xpbyB0byBjcmVhdGUgb25lXFxuXFxuYDtcbiAgICAgICAgXG4gICAgICAgIHN0YXR1c1RleHQgKz0gYPCfk50gKipXaGF0IHlvdSdsbCBnZXQqKjpcXG5gO1xuICAgICAgICBzdGF0dXNUZXh0ICs9IGAgIOKAoiBHaXRIdWIgcmVwb3NpdG9yeSBmb3IgeW91ciBlbGVtZW50c1xcbmA7XG4gICAgICAgIHN0YXR1c1RleHQgKz0gYCAg4oCiIE9yZ2FuaXplZCBmb2xkZXIgc3RydWN0dXJlXFxuYDtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgICDigKIgUkVBRE1FIHdpdGggdXNhZ2UgaW5zdHJ1Y3Rpb25zXFxuYDtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBgICDigKIgRWFzeSBzaGFyaW5nIGFuZCBiYWNrdXBcXG5gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IHN0YXR1c1RleHRcbiAgICAgICAgfV1cbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgRmFpbGVkIHRvIGNoZWNrIHBvcnRmb2xpbyBzdGF0dXM6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhIG5ldyBHaXRIdWIgcG9ydGZvbGlvIHJlcG9zaXRvcnlcbiAgICovXG4gIGFzeW5jIGluaXRQb3J0Zm9saW8ob3B0aW9uczoge3JlcG9zaXRvcnlOYW1lPzogc3RyaW5nOyBwcml2YXRlPzogYm9vbGVhbjsgZGVzY3JpcHRpb24/OiBzdHJpbmd9KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGF1dGhlbnRpY2F0aW9uXG4gICAgICBjb25zdCBhdXRoU3RhdHVzID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5nZXRBdXRoU3RhdHVzKCk7XG4gICAgICBpZiAoIWF1dGhTdGF0dXMuaXNBdXRoZW50aWNhdGVkIHx8ICFhdXRoU3RhdHVzLnVzZXJuYW1lKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqR2l0SHViIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkKipcXG5cXG5gICtcbiAgICAgICAgICAgIGDwn5SQICoqUXVpY2sgU2V0dXAqKjpcXG5gICtcbiAgICAgICAgICAgIGAxLiBSdW46IFxcYHNldHVwX2dpdGh1Yl9hdXRoXFxgIHRvIGF1dGhlbnRpY2F0ZVxcbmAgK1xuICAgICAgICAgICAgYDIuIE9yIHVzZTogXFxgZ2ggYXV0aCBsb2dpbiAtLXdlYlxcYCBpZiB5b3UgaGF2ZSBHaXRIdWIgQ0xJXFxuXFxuYCArXG4gICAgICAgICAgICBg8J+TnSAqKldoYXQgdGhpcyBlbmFibGVzKio6XFxuYCArXG4gICAgICAgICAgICBg4oCiIFVwbG9hZCBlbGVtZW50cyB0byB5b3VyIEdpdEh1YiBwb3J0Zm9saW9cXG5gICtcbiAgICAgICAgICAgIGDigKIgU3luYyB5b3VyIGxvY2FsIHBvcnRmb2xpbyB3aXRoIEdpdEh1YlxcbmAgK1xuICAgICAgICAgICAgYOKAoiBTaGFyZSBlbGVtZW50cyB3aXRoIHRoZSBjb21tdW5pdHlcXG5cXG5gICtcbiAgICAgICAgICAgIGDwn4yQICoqTmVlZCBoZWxwPyoqIFZpc2l0OiBodHRwczovL2RvY3MuYW50aHJvcGljLmNvbS9lbi9kb2NzL2NsYXVkZS1jb2RlL29hdXRoLXNldHVwYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXJuYW1lID0gYXV0aFN0YXR1cy51c2VybmFtZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgcG9ydGZvbGlvIGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCB7IFBvcnRmb2xpb1JlcG9NYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoJy4vcG9ydGZvbGlvL1BvcnRmb2xpb1JlcG9NYW5hZ2VyLmpzJyk7XG4gICAgICBjb25zdCBwb3J0Zm9saW9NYW5hZ2VyID0gbmV3IFBvcnRmb2xpb1JlcG9NYW5hZ2VyKCk7XG4gICAgICBjb25zdCBwb3J0Zm9saW9FeGlzdHMgPSBhd2FpdCBwb3J0Zm9saW9NYW5hZ2VyLmNoZWNrUG9ydGZvbGlvRXhpc3RzKHVzZXJuYW1lKTtcblxuICAgICAgaWYgKHBvcnRmb2xpb0V4aXN0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKchSBQb3J0Zm9saW8gYWxyZWFkeSBleGlzdHMgYXQgaHR0cHM6Ly9naXRodWIuY29tLyR7dXNlcm5hbWV9L2RvbGxob3VzZS1wb3J0Zm9saW9cXG5cXG5Vc2UgcG9ydGZvbGlvX3N0YXR1cyB0byBzZWUgZGV0YWlscyBvciBzeW5jX3BvcnRmb2xpbyB0byB1cGRhdGUgaXQuYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBwb3J0Zm9saW8gd2l0aCBleHBsaWNpdCBjb25zZW50XG4gICAgICBjb25zdCBwb3J0Zm9saW9VcmwgPSBhd2FpdCBwb3J0Zm9saW9NYW5hZ2VyLmNyZWF0ZVBvcnRmb2xpbyh1c2VybmFtZSwgdHJ1ZSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+OiSAqKlBvcnRmb2xpbyBDcmVhdGVkIFN1Y2Nlc3NmdWxseSEqKlxcblxcbmAgK1xuICAgICAgICAgICAgICAgIGDinIUgKipSZXBvc2l0b3J5Kio6IGh0dHBzOi8vZ2l0aHViLmNvbS8ke3VzZXJuYW1lfS9kb2xsaG91c2UtcG9ydGZvbGlvXFxuYCArXG4gICAgICAgICAgICAgICAgYPCfk4EgKipTdHJ1Y3R1cmUqKjogT3JnYW5pemVkIGZvbGRlcnMgZm9yIGFsbCBlbGVtZW50IHR5cGVzXFxuYCArXG4gICAgICAgICAgICAgICAgYPCfk50gKipSRUFETUUqKjogVXNhZ2UgaW5zdHJ1Y3Rpb25zIGluY2x1ZGVkXFxuYCArXG4gICAgICAgICAgICAgICAgYPCflIQgKipOZXh0IFN0ZXAqKjogVXNlIHN5bmNfcG9ydGZvbGlvIHRvIHVwbG9hZCB5b3VyIGVsZW1lbnRzXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgYFlvdXIgcG9ydGZvbGlvIGlzIHJlYWR5IGZvciBzaGFyaW5nIHlvdXIgRG9sbGhvdXNlTUNQIGNyZWF0aW9ucyFgXG4gICAgICAgIH1dXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEZhaWxlZCB0byBpbml0aWFsaXplIHBvcnRmb2xpbzogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgcG9ydGZvbGlvIHNldHRpbmdzXG4gICAqL1xuICBhc3luYyBwb3J0Zm9saW9Db25maWcob3B0aW9uczoge2F1dG9TeW5jPzogYm9vbGVhbjsgZGVmYXVsdFZpc2liaWxpdHk/OiBzdHJpbmc7IGF1dG9TdWJtaXQ/OiBib29sZWFuOyByZXBvc2l0b3J5TmFtZT86IHN0cmluZ30pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IENvbmZpZ01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIubG9hZENvbmZpZygpO1xuXG4gICAgICBsZXQgc3RhdHVzVGV4dCA9IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKame+4jyAqKlBvcnRmb2xpbyBDb25maWd1cmF0aW9uKipcXG5cXG5gO1xuXG4gICAgICAvLyBVcGRhdGUgc2V0dGluZ3MgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChvcHRpb25zLmF1dG9TeW5jICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gVGhpcyB3b3VsZCBiZSBpbXBsZW1lbnRlZCB3aGVuIGF1dG8tc3luYyBmZWF0dXJlIGlzIGFkZGVkXG4gICAgICAgIHN0YXR1c1RleHQgKz0gYPCflIQgQXV0by1zeW5jOiAke29wdGlvbnMuYXV0b1N5bmMgPyAnRW5hYmxlZCcgOiAnRGlzYWJsZWQnfSAoQ29taW5nIHNvb24pXFxuYDtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuZGVmYXVsdFZpc2liaWxpdHkpIHtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBg8J+UkiBEZWZhdWx0IHZpc2liaWxpdHk6ICR7b3B0aW9ucy5kZWZhdWx0VmlzaWJpbGl0eX1cXG5gO1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5hdXRvU3VibWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTm90ZTogQXV0by1zdWJtaXQgY29uZmlndXJhdGlvbiB3b3VsZCBiZSBpbXBsZW1lbnRlZCBoZXJlXG4gICAgICAgIC8vIEZvciBub3csIHdlJ2xsIGp1c3Qgc2hvdyB0aGUgc3RhdHVzXG4gICAgICAgIHN0YXR1c1RleHQgKz0gYPCfk6QgQXV0by1zdWJtaXQgdG8gY29sbGVjdGlvbjogJHtvcHRpb25zLmF1dG9TdWJtaXQgPyAnRW5hYmxlZCcgOiAnRGlzYWJsZWQnfSAoQ29taW5nIHNvb24pXFxuYDtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMucmVwb3NpdG9yeU5hbWUpIHtcbiAgICAgICAgc3RhdHVzVGV4dCArPSBg8J+TgSBSZXBvc2l0b3J5IG5hbWU6ICR7b3B0aW9ucy5yZXBvc2l0b3J5TmFtZX0gKEN1c3RvbSBuYW1lcyBjb21pbmcgc29vbilcXG5gO1xuICAgICAgfVxuXG4gICAgICAvLyBTaG93IGN1cnJlbnQgY29uZmlndXJhdGlvblxuICAgICAgc3RhdHVzVGV4dCArPSBgXFxu8J+TiyAqKkN1cnJlbnQgU2V0dGluZ3MqKjpcXG5gO1xuICAgICAgc3RhdHVzVGV4dCArPSBgICDigKIgQXV0by1zdWJtaXQ6IERpc2FibGVkIChDb21pbmcgc29vbilcXG5gO1xuICAgICAgc3RhdHVzVGV4dCArPSBgICDigKIgUmVwb3NpdG9yeSBuYW1lOiBkb2xsaG91c2UtcG9ydGZvbGlvIChkZWZhdWx0KVxcbmA7XG4gICAgICBzdGF0dXNUZXh0ICs9IGAgIOKAoiBEZWZhdWx0IHZpc2liaWxpdHk6IHB1YmxpY1xcbmA7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogc3RhdHVzVGV4dFxuICAgICAgICB9XVxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBGYWlsZWQgdG8gY29uZmlndXJlIHBvcnRmb2xpbzogJHtTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcikubWVzc2FnZX1gXG4gICAgICAgIH1dXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIHBvcnRmb2xpbyB3aXRoIEdpdEh1YlxuICAgKi9cbiAgYXN5bmMgc3luY1BvcnRmb2xpbyhvcHRpb25zOiB7ZGlyZWN0aW9uOiBzdHJpbmc7IGZvcmNlOiBib29sZWFuOyBkcnlSdW46IGJvb2xlYW59KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGF1dGhlbnRpY2F0aW9uXG4gICAgICBjb25zdCBhdXRoU3RhdHVzID0gYXdhaXQgdGhpcy5naXRodWJBdXRoTWFuYWdlci5nZXRBdXRoU3RhdHVzKCk7XG4gICAgICBpZiAoIWF1dGhTdGF0dXMuaXNBdXRoZW50aWNhdGVkIHx8ICFhdXRoU3RhdHVzLnVzZXJuYW1lKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MICoqR2l0SHViIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkKipcXG5cXG5gICtcbiAgICAgICAgICAgIGDwn5SQICoqUXVpY2sgU2V0dXAqKjpcXG5gICtcbiAgICAgICAgICAgIGAxLiBSdW46IFxcYHNldHVwX2dpdGh1Yl9hdXRoXFxgIHRvIGF1dGhlbnRpY2F0ZVxcbmAgK1xuICAgICAgICAgICAgYDIuIE9yIHVzZTogXFxgZ2ggYXV0aCBsb2dpbiAtLXdlYlxcYCBpZiB5b3UgaGF2ZSBHaXRIdWIgQ0xJXFxuXFxuYCArXG4gICAgICAgICAgICBg8J+TnSAqKldoYXQgdGhpcyBlbmFibGVzKio6XFxuYCArXG4gICAgICAgICAgICBg4oCiIFVwbG9hZCBlbGVtZW50cyB0byB5b3VyIEdpdEh1YiBwb3J0Zm9saW9cXG5gICtcbiAgICAgICAgICAgIGDigKIgU3luYyB5b3VyIGxvY2FsIHBvcnRmb2xpbyB3aXRoIEdpdEh1YlxcbmAgK1xuICAgICAgICAgICAgYOKAoiBTaGFyZSBlbGVtZW50cyB3aXRoIHRoZSBjb21tdW5pdHlcXG5cXG5gICtcbiAgICAgICAgICAgIGDwn4yQICoqTmVlZCBoZWxwPyoqIFZpc2l0OiBodHRwczovL2RvY3MuYW50aHJvcGljLmNvbS9lbi9kb2NzL2NsYXVkZS1jb2RlL29hdXRoLXNldHVwYFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXJuYW1lID0gYXV0aFN0YXR1cy51c2VybmFtZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgcG9ydGZvbGlvIGV4aXN0c1xuICAgICAgY29uc3QgeyBQb3J0Zm9saW9SZXBvTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KCcuL3BvcnRmb2xpby9Qb3J0Zm9saW9SZXBvTWFuYWdlci5qcycpO1xuICAgICAgY29uc3QgcG9ydGZvbGlvTWFuYWdlciA9IG5ldyBQb3J0Zm9saW9SZXBvTWFuYWdlcigpO1xuICAgICAgXG4gICAgICAvLyBDUklUSUNBTCBGSVg6IFNldCBHaXRIdWIgdG9rZW4gbGlrZSBzdWJtaXRfY29udGVudCBkb2VzXG4gICAgICAvLyBXaXRob3V0IHRoaXMsIGNoZWNrUG9ydGZvbGlvRXhpc3RzIGZhaWxzIGJlY2F1c2UgaXQgY2FuJ3QgYXV0aGVudGljYXRlIHRvIEdpdEh1YlxuICAgICAgY29uc3QgeyBUb2tlbk1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydCgnLi9zZWN1cml0eS90b2tlbk1hbmFnZXIuanMnKTtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3inYwgR2l0SHViIGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkLiBQbGVhc2UgYXV0aGVudGljYXRlIGZpcnN0IHVzaW5nIHNldHVwX2dpdGh1Yl9hdXRoLmBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcG9ydGZvbGlvTWFuYWdlci5zZXRUb2tlbih0b2tlbik7XG4gICAgICBcbiAgICAgIGNvbnN0IHBvcnRmb2xpb0V4aXN0cyA9IGF3YWl0IHBvcnRmb2xpb01hbmFnZXIuY2hlY2tQb3J0Zm9saW9FeGlzdHModXNlcm5hbWUpO1xuXG4gICAgICBpZiAoIXBvcnRmb2xpb0V4aXN0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCAqKk5vIFBvcnRmb2xpbyBSZXBvc2l0b3J5IEZvdW5kKipcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDwn4+gICoqUXVpY2sgU2V0dXAqKjpcXG5gICtcbiAgICAgICAgICAgICAgICAgIGAxLiBSdW46IFxcYGluaXRfcG9ydGZvbGlvXFxgIHRvIGNyZWF0ZSB5b3VyIEdpdEh1YiBwb3J0Zm9saW9cXG5gICtcbiAgICAgICAgICAgICAgICAgIGAyLiBUaGlzIGNyZWF0ZXM6IGh0dHBzOi8vZ2l0aHViLmNvbS9bdXNlcm5hbWVdL2RvbGxob3VzZS1wb3J0Zm9saW9cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgIGDwn5OdICoqV2hhdCB5b3UnbGwgZ2V0Kio6XFxuYCArXG4gICAgICAgICAgICAgICAgICBg4oCiIFB1YmxpYyByZXBvc2l0b3J5IHRvIHNob3djYXNlIHlvdXIgQUkgZWxlbWVudHNcXG5gICtcbiAgICAgICAgICAgICAgICAgIGDigKIgT3JnYW5pemVkIHN0cnVjdHVyZSBmb3IgcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhbmQgYWdlbnRzXFxuYCArXG4gICAgICAgICAgICAgICAgICBg4oCiIEF1dG9tYXRpYyBzeW5jaW5nIG9mIHlvdXIgbG9jYWwgcG9ydGZvbGlvXFxuYCArXG4gICAgICAgICAgICAgICAgICBg4oCiIENvbW11bml0eSBzaGFyaW5nIGNhcGFiaWxpdGllc1xcblxcbmAgK1xuICAgICAgICAgICAgICAgICAgYPCfmoAgKipBZnRlciBzZXR1cCoqOiBVc2UgXFxgc3luY19wb3J0Zm9saW9cXGAgdG8gdXBsb2FkIHlvdXIgY29udGVudCFgXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgIC8vIFNob3cgd2hhdCB3b3VsZCBiZSBzeW5jZWRcbiAgICAgICAgY29uc3QgbG9jYWxQb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZWxlbWVudFR5cGVDb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4gPSB7fTtcbiAgICAgICAgY29uc3QgZWxlbWVudFR5cGVFcnJvcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgZWxlbWVudCBjb3VudHMgd2l0aCBiZXR0ZXIgZXJyb3IgaGFuZGxpbmdcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50VHlwZSBvZiBbJ3BlcnNvbmFzJywgJ3NraWxscycsICd0ZW1wbGF0ZXMnLCAnYWdlbnRzJ10pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRzTGlzdChlbGVtZW50VHlwZSk7XG4gICAgICAgICAgICBlbGVtZW50VHlwZUNvdW50c1tlbGVtZW50VHlwZV0gPSBlbGVtZW50cy5sZW5ndGg7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgZWxlbWVudFR5cGVDb3VudHNbZWxlbWVudFR5cGVdID0gJ0VSUk9SJztcbiAgICAgICAgICAgIGVsZW1lbnRUeXBlRXJyb3JzLnB1c2goYCR7ZWxlbWVudFR5cGV9OiAke2Vycm9yLm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkcnlSdW5UZXh0ID0gYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+UjSAqKkRyeSBSdW4gLSBQb3J0Zm9saW8gU3luYyBQcmV2aWV3KipcXG5cXG5gO1xuICAgICAgICBkcnlSdW5UZXh0ICs9IGDwn5OkICoqRWxlbWVudHMgdG8gc3luYyoqICgke29wdGlvbnMuZGlyZWN0aW9ufSk6XFxuYDtcbiAgICAgICAgZHJ5UnVuVGV4dCArPSBgICDigKIgUGVyc29uYXM6ICR7ZWxlbWVudFR5cGVDb3VudHMucGVyc29uYXN9XFxuYDtcbiAgICAgICAgZHJ5UnVuVGV4dCArPSBgICDigKIgU2tpbGxzOiAke2VsZW1lbnRUeXBlQ291bnRzLnNraWxsc31cXG5gO1xuICAgICAgICBkcnlSdW5UZXh0ICs9IGAgIOKAoiBUZW1wbGF0ZXM6ICR7ZWxlbWVudFR5cGVDb3VudHMudGVtcGxhdGVzfVxcbmA7XG4gICAgICAgIGRyeVJ1blRleHQgKz0gYCAg4oCiIEFnZW50czogJHtlbGVtZW50VHlwZUNvdW50cy5hZ2VudHN9XFxuXFxuYDtcbiAgICAgICAgXG4gICAgICAgIC8vIEluY2x1ZGUgYW55IGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgZHJ5IHJ1blxuICAgICAgICBpZiAoZWxlbWVudFR5cGVFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRyeVJ1blRleHQgKz0gYOKaoO+4jyAqKkVycm9ycyBmb3VuZCBkdXJpbmcgcHJldmlldzoqKlxcbmA7XG4gICAgICAgICAgZm9yIChjb25zdCBlcnJvciBvZiBlbGVtZW50VHlwZUVycm9ycykge1xuICAgICAgICAgICAgZHJ5UnVuVGV4dCArPSBgICDigKIgJHtlcnJvcn1cXG5gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkcnlSdW5UZXh0ICs9IGBcXG5gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBkcnlSdW5UZXh0ICs9IGDwn46vICoqVGFyZ2V0Kio6IGh0dHBzOi8vZ2l0aHViLmNvbS8ke3VzZXJuYW1lfS9kb2xsaG91c2UtcG9ydGZvbGlvXFxuYDtcbiAgICAgICAgZHJ5UnVuVGV4dCArPSBg4pqg77iPICAqKk5vdGUqKjogVGhpcyBpcyBhIHByZXZpZXcuIFJlbW92ZSBkcnlfcnVuPXRydWUgdG8gcGVyZm9ybSBhY3R1YWwgc3luYy5gO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgdGV4dDogZHJ5UnVuVGV4dFxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBub3csIGltcGxlbWVudCBiYXNpYyBwdXNoIGZ1bmN0aW9uYWxpdHlcbiAgICAgIGlmIChvcHRpb25zLmRpcmVjdGlvbiA9PT0gJ3B1c2gnIHx8IG9wdGlvbnMuZGlyZWN0aW9uID09PSAnYm90aCcpIHtcbiAgICAgICAgbGV0IHN5bmNDb3VudCA9IDA7XG4gICAgICAgIGxldCB0b3RhbEVsZW1lbnRzID0gMDtcbiAgICAgICAgbGV0IHN5bmNUZXh0ID0gYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl98J+UhCAqKlN5bmNpbmcgUG9ydGZvbGlvLi4uKipcXG5cXG5gO1xuXG4gICAgICAgIC8vIFVYIElNUFJPVkVNRU5UOiBDYWxjdWxhdGUgdG90YWwgZWxlbWVudHMgZm9yIHByb2dyZXNzIHRyYWNraW5nXG4gICAgICAgIGNvbnN0IGVsZW1lbnRUeXBlcyA9IFsncGVyc29uYXMnLCAnc2tpbGxzJywgJ3RlbXBsYXRlcycsICdhZ2VudHMnXSBhcyBjb25zdDtcbiAgICAgICAgY29uc3QgZWxlbWVudENvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgICAgICBjb25zdCBmYWlsZWRFbGVtZW50czogQXJyYXk8e3R5cGU6IHN0cmluZywgbmFtZTogc3RyaW5nLCBlcnJvcjogc3RyaW5nfT4gPSBbXTtcbiAgICAgICAgXG4gICAgICAgIC8vIFByZS1jYWxjdWxhdGUgdG90YWxzIGZvciBiZXR0ZXIgcHJvZ3Jlc3MgaW5kaWNhdG9yc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN5bmNUZXh0ICs9IGDwn5OKICoqQ2FsY3VsYXRpbmcgc3luYyBzY29wZS4uLioqXFxuYDtcbiAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIGVsZW1lbnRUeXBlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRzTGlzdChlbGVtZW50VHlwZSk7XG4gICAgICAgICAgICAgIGVsZW1lbnRDb3VudHNbZWxlbWVudFR5cGVdID0gZWxlbWVudHMubGVuZ3RoO1xuICAgICAgICAgICAgICB0b3RhbEVsZW1lbnRzICs9IGVsZW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgZWxlbWVudENvdW50c1tlbGVtZW50VHlwZV0gPSAwO1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIGNvdW50ICR7ZWxlbWVudFR5cGV9YCwgeyBlcnJvcjogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgc3luY1RleHQgKz0gYFxcbvCfjq8gKipSZWFkeSB0byBzeW5jICR7dG90YWxFbGVtZW50c30gZWxlbWVudHM6KipcXG5gO1xuICAgICAgICAgIGZvciAoY29uc3QgW3R5cGUsIGNvdW50XSBvZiBPYmplY3QuZW50cmllcyhlbGVtZW50Q291bnRzKSkge1xuICAgICAgICAgICAgY29uc3QgaWNvbiA9IGNvdW50ID4gMCA/ICfinIUnIDogJ+Kaqic7XG4gICAgICAgICAgICBzeW5jVGV4dCArPSBgICAke2ljb259ICR7dHlwZX06ICR7Y291bnR9IGVsZW1lbnRzXFxuYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3luY1RleHQgKz0gYFxcbvCfmoAgKipTdGFydGluZyBzeW5jIHByb2Nlc3MuLi4qKlxcblxcbmA7XG4gICAgICAgICAgXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICBzeW5jVGV4dCArPSBgXFxu4pqg77iPICoqV2FybmluZyoqOiBDb3VsZCBub3QgY2FsY3VsYXRlIHN5bmMgc2NvcGU6ICR7ZXJyb3IubWVzc2FnZX1cXG5cXG5gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBVWCBJTVBST1ZFTUVOVDogUHJvY2VzcyBlYWNoIGVsZW1lbnQgdHlwZSB3aXRoIHByb2dyZXNzIHRyYWNraW5nXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgZWxlbWVudFR5cGVzKSB7XG4gICAgICAgICAgY29uc3QgdHlwZUNvdW50ID0gZWxlbWVudENvdW50c1tlbGVtZW50VHlwZV0gfHwgMDtcbiAgICAgICAgICBpZiAodHlwZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBzeW5jVGV4dCArPSBg4o+pICoqU2tpcHBpbmcgJHtlbGVtZW50VHlwZX0qKiAobm8gZWxlbWVudHMgZm91bmQpXFxuYDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICBzeW5jVGV4dCArPSBg8J+TgSAqKlByb2Nlc3NpbmcgJHtlbGVtZW50VHlwZX0qKiAoJHt0eXBlQ291bnR9IGVsZW1lbnRzKTpcXG5gO1xuICAgICAgICAgIGxldCB0eXBlU3VjY2Vzc0NvdW50ID0gMDtcbiAgICAgICAgICBcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEVsZW1lbnRzTGlzdChlbGVtZW50VHlwZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgZWxlbWVudE5hbWUgPSBlbGVtZW50c1tpXTtcbiAgICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBgWyR7aSArIDF9LyR7ZWxlbWVudHMubGVuZ3RofV1gO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBVWCBJTVBST1ZFTUVOVDogU2hvdyBpbmRpdmlkdWFsIGVsZW1lbnQgcHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICBzeW5jVGV4dCArPSBgICAke3Byb2dyZXNzfSDwn5SEIFN5bmNpbmcgXCIke2VsZW1lbnROYW1lfVwiLi4uYDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBMb2FkIGVsZW1lbnQgYW5kIHNhdmUgdG8gcG9ydGZvbGlvXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMubG9hZEVsZW1lbnRCeVR5cGUoZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgYXdhaXQgcG9ydGZvbGlvTWFuYWdlci5zYXZlRWxlbWVudChlbGVtZW50LCB0cnVlKTsgLy8gRXhwbGljaXQgY29uc2VudFxuICAgICAgICAgICAgICAgICAgc3luY0NvdW50Kys7XG4gICAgICAgICAgICAgICAgICB0eXBlU3VjY2Vzc0NvdW50Kys7XG4gICAgICAgICAgICAgICAgICBzeW5jVGV4dCArPSBgIOKchVxcbmA7XG4gICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFN1Y2Nlc3NmdWxseSBzeW5jZWQgJHtlbGVtZW50VHlwZX0vJHtlbGVtZW50TmFtZX1gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc3luY1RleHQgKz0gYCDinYwgKG51bGwgZWxlbWVudClcXG5gO1xuICAgICAgICAgICAgICAgICAgZmFpbGVkRWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICdFbGVtZW50IGxvYWRlZCBhcyBudWxsL3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCAoZWxlbWVudEVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlbGVtZW50RXJyb3IubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvciBkdXJpbmcgZWxlbWVudCBzeW5jJztcbiAgICAgICAgICAgICAgICBzeW5jVGV4dCArPSBgIOKdjCAoJHtlcnJvck1lc3NhZ2V9KVxcbmA7XG4gICAgICAgICAgICAgICAgZmFpbGVkRWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gc3luYyAke2VsZW1lbnRUeXBlfS8ke2VsZW1lbnROYW1lfWAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBVWCBJTVBST1ZFTUVOVDogU2hvdyBjb21wbGV0aW9uIHN1bW1hcnkgZm9yIGVhY2ggdHlwZVxuICAgICAgICAgICAgY29uc3Qgc3VjY2Vzc1JhdGUgPSBlbGVtZW50cy5sZW5ndGggPiAwID8gTWF0aC5yb3VuZCgodHlwZVN1Y2Nlc3NDb3VudCAvIGVsZW1lbnRzLmxlbmd0aCkgKiAxMDApIDogMDtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1c0ljb24gPSBzdWNjZXNzUmF0ZSA9PT0gMTAwID8gJ/CfjoknIDogc3VjY2Vzc1JhdGUgPiA1MCA/ICfimqDvuI8nIDogJ+KdjCc7XG4gICAgICAgICAgICBzeW5jVGV4dCArPSBgICAke3N0YXR1c0ljb259ICoqJHtlbGVtZW50VHlwZX0gY29tcGxldGUqKjogJHt0eXBlU3VjY2Vzc0NvdW50fS8ke2VsZW1lbnRzLmxlbmd0aH0gc3luY2VkICgke3N1Y2Nlc3NSYXRlfSUpXFxuXFxuYDtcbiAgICAgICAgICB9IGNhdGNoIChsaXN0RXJyb3I6IGFueSkge1xuICAgICAgICAgICAgLy8gVVggSU1QUk9WRU1FTlQ6IEJldHRlciBlcnJvciByZXBvcnRpbmcgZm9yIGxpc3QgZmFpbHVyZXNcbiAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGxpc3RFcnJvci5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZ2V0IGVsZW1lbnRzIGxpc3QnO1xuICAgICAgICAgICAgc3luY1RleHQgKz0gYCAg4p2MICoqRmFpbGVkIHRvIGxpc3QgJHtlbGVtZW50VHlwZX0qKjogJHtlcnJvck1lc3NhZ2V9XFxuXFxuYDtcbiAgICAgICAgICAgIGZhaWxlZEVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgbmFtZTogJ0FMTCcsXG4gICAgICAgICAgICAgIGVycm9yOiBgRmFpbGVkIHRvIGxpc3QgJHtlbGVtZW50VHlwZX06ICR7ZXJyb3JNZXNzYWdlfWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBnZXQgJHtlbGVtZW50VHlwZX0gbGlzdGAsIHsgZXJyb3I6IGVycm9yTWVzc2FnZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVWCBJTVBST1ZFTUVOVDogRW5oYW5jZWQgZmluYWwgc3VtbWFyeSB3aXRoIGFjdGlvbmFibGUgaW5zaWdodHNcbiAgICAgICAgY29uc3Qgc3VjY2Vzc1JhdGUgPSB0b3RhbEVsZW1lbnRzID4gMCA/IE1hdGgucm91bmQoKHN5bmNDb3VudCAvIHRvdGFsRWxlbWVudHMpICogMTAwKSA6IDA7XG4gICAgICAgIGNvbnN0IHN1bW1hcnlJY29uID0gc3VjY2Vzc1JhdGUgPT09IDEwMCA/ICfwn46JJyA6IHN1Y2Nlc3NSYXRlID49IDgwID8gJ+KchScgOiBzdWNjZXNzUmF0ZSA+PSA1MCA/ICfimqDvuI8nIDogJ+KdjCc7XG4gICAgICAgIFxuICAgICAgICBzeW5jVGV4dCArPSBgJHtzdW1tYXJ5SWNvbn0gKipTeW5jIENvbXBsZXRlISoqXFxuYDtcbiAgICAgICAgc3luY1RleHQgKz0gYPCfk4ogKipPdmVyYWxsIFJlc3VsdHMqKjogJHtzeW5jQ291bnR9LyR7dG90YWxFbGVtZW50c30gZWxlbWVudHMgc3luY2VkICgke3N1Y2Nlc3NSYXRlfSUpXFxuYDtcbiAgICAgICAgc3luY1RleHQgKz0gYPCfj6AgKipQb3J0Zm9saW8qKjogaHR0cHM6Ly9naXRodWIuY29tLyR7dXNlcm5hbWV9L2RvbGxob3VzZS1wb3J0Zm9saW9cXG5cXG5gO1xuICAgICAgICBcbiAgICAgICAgLy8gSW5jbHVkZSBmYWlsZWQgZWxlbWVudHMgaW5mb3JtYXRpb24gd2l0aCBhY3Rpb25hYmxlIHN1Z2dlc3Rpb25zXG4gICAgICAgIGlmIChmYWlsZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc3luY1RleHQgKz0gYOKaoO+4jyAqKklzc3VlcyBFbmNvdW50ZXJlZCoqICgke2ZhaWxlZEVsZW1lbnRzLmxlbmd0aH0gcHJvYmxlbXMpOlxcblxcbmA7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gR3JvdXAgZmFpbHVyZXMgYnkgdHlwZSBmb3IgYmV0dGVyIG9yZ2FuaXphdGlvblxuICAgICAgICAgIGNvbnN0IGZhaWx1cmVzQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBBcnJheTx7bmFtZTogc3RyaW5nLCBlcnJvcjogc3RyaW5nfT4+ID0ge307XG4gICAgICAgICAgZm9yIChjb25zdCBmYWlsZWQgb2YgZmFpbGVkRWxlbWVudHMpIHtcbiAgICAgICAgICAgIGlmICghZmFpbHVyZXNCeVR5cGVbZmFpbGVkLnR5cGVdKSB7XG4gICAgICAgICAgICAgIGZhaWx1cmVzQnlUeXBlW2ZhaWxlZC50eXBlXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmFpbHVyZXNCeVR5cGVbZmFpbGVkLnR5cGVdLnB1c2goeyBuYW1lOiBmYWlsZWQubmFtZSwgZXJyb3I6IGZhaWxlZC5lcnJvciB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgZm9yIChjb25zdCBbdHlwZSwgZmFpbHVyZXNdIG9mIE9iamVjdC5lbnRyaWVzKGZhaWx1cmVzQnlUeXBlKSkge1xuICAgICAgICAgICAgc3luY1RleHQgKz0gYPCfk4EgKioke3R5cGV9KiogKCR7ZmFpbHVyZXMubGVuZ3RofSBpc3N1ZXMpOlxcbmA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZhaWx1cmUgb2YgZmFpbHVyZXMpIHtcbiAgICAgICAgICAgICAgaWYgKGZhaWx1cmUubmFtZSA9PT0gJ0FMTCcpIHtcbiAgICAgICAgICAgICAgICBzeW5jVGV4dCArPSBgICDinYwgJHtmYWlsdXJlLmVycm9yfVxcbmA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3luY1RleHQgKz0gYCAg4p2MIFwiJHtmYWlsdXJlLm5hbWV9XCI6ICR7ZmFpbHVyZS5lcnJvcn1cXG5gO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzeW5jVGV4dCArPSBgXFxuYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gVVggSU1QUk9WRU1FTlQ6IEFkZCBoZWxwZnVsIHN1Z2dlc3Rpb25zIGZvciBjb21tb24gaXNzdWVzXG4gICAgICAgICAgc3luY1RleHQgKz0gYPCfkqEgKipUcm91Ymxlc2hvb3RpbmcgVGlwcyoqOlxcbmA7XG4gICAgICAgICAgc3luY1RleHQgKz0gYCAg4oCiIENoZWNrIGVsZW1lbnQgZmlsZSBmb3JtYXRzIGFuZCBtZXRhZGF0YVxcbmA7XG4gICAgICAgICAgc3luY1RleHQgKz0gYCAg4oCiIFZlcmlmeSBHaXRIdWIgYXV0aGVudGljYXRpb24gaXMgc3RpbGwgdmFsaWRcXG5gO1xuICAgICAgICAgIHN5bmNUZXh0ICs9IGAgIOKAoiBUcnkgc3luY2luZyBpbmRpdmlkdWFsIGVsZW1lbnRzIHdpdGggXFxgc3VibWl0X2NvbnRlbnRcXGBcXG5gO1xuICAgICAgICAgIHN5bmNUZXh0ICs9IGAgIOKAoiBVc2UgXFxgc3luY19wb3J0Zm9saW9cXGAgd2l0aCBcXGBkcnlfcnVuPXRydWVcXGAgdG8gcHJldmlldyBpc3N1ZXNcXG5cXG5gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN5bmNUZXh0ICs9IGDwn46JICoqUGVyZmVjdCBTeW5jISoqIEFsbCBlbGVtZW50cyB1cGxvYWRlZCBzdWNjZXNzZnVsbHkhXFxuXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gVVggSU1QUk9WRU1FTlQ6IEFkZCBuZXh0IHN0ZXBzIGFuZCBoZWxwZnVsIGxpbmtzXG4gICAgICAgIGlmIChzeW5jQ291bnQgPiAwKSB7XG4gICAgICAgICAgc3luY1RleHQgKz0gYPCfmoAgKipOZXh0IFN0ZXBzKio6XFxuYDtcbiAgICAgICAgICBzeW5jVGV4dCArPSBgICDigKIgVmlldyB5b3VyIHBvcnRmb2xpbzogaHR0cHM6Ly9naXRodWIuY29tLyR7dXNlcm5hbWV9L2RvbGxob3VzZS1wb3J0Zm9saW9cXG5gO1xuICAgICAgICAgIHN5bmNUZXh0ICs9IGAgIOKAoiBTaGFyZSBpbmRpdmlkdWFsIGVsZW1lbnRzIHVzaW5nIFxcYHN1Ym1pdF9jb250ZW50IDxuYW1lPlxcYFxcbmA7XG4gICAgICAgICAgc3luY1RleHQgKz0gYCAg4oCiIEtlZXAgcG9ydGZvbGlvIHVwZGF0ZWQgd2l0aCBcXGBzeW5jX3BvcnRmb2xpb1xcYCByZWd1bGFybHlcXG5cXG5gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBzeW5jVGV4dCArPSBgWW91ciBlbGVtZW50cyBhcmUgbm93IGF2YWlsYWJsZSBvbiBHaXRIdWIhYDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IHN5bmNUZXh0XG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuZGlyZWN0aW9uID09PSAncHVsbCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICB0ZXh0OiBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3imqDvuI8gUHVsbCBzeW5jIGlzIGNvbWluZyBzb29uLiBDdXJyZW50bHkgb25seSBwdXNoIHN5bmMgaXMgc3VwcG9ydGVkLmBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbnZhbGlkIHN5bmMgZGlyZWN0aW9uLiBVc2UgJ3B1c2gnLCAncHVsbCcsIG9yICdib3RoJy5gXG4gICAgICAgIH1dXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElNUFJPVkVEIEVSUk9SIEhBTkRMSU5HOiBFbnN1cmUgd2UgYWx3YXlzIGhhdmUgYSBtZWFuaW5nZnVsIGVycm9yIG1lc3NhZ2VcbiAgICAgIGNvbnN0IHNhbml0aXplZEVycm9yID0gU2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gc2FuaXRpemVkRXJyb3I/Lm1lc3NhZ2UgfHwgKGVycm9yIGFzIGFueSk/Lm1lc3NhZ2UgfHwgU3RyaW5nKGVycm9yKSB8fCAnVW5rbm93biBlcnJvciBvY2N1cnJlZCc7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgdGV4dDogYCR7dGhpcy5nZXRQZXJzb25hSW5kaWNhdG9yKCl94p2MIEZhaWxlZCB0byBzeW5jIHBvcnRmb2xpbzogJHtlcnJvck1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGxvY2FsIHBvcnRmb2xpbyB1c2luZyB0aGUgbWV0YWRhdGEgaW5kZXggc3lzdGVtXG4gICAqIFRoaXMgcHJvdmlkZXMgZmFzdCwgY29tcHJlaGVuc2l2ZSBzZWFyY2ggYWNyb3NzIGFsbCBlbGVtZW50IHR5cGVzXG4gICAqL1xuICBhc3luYyBzZWFyY2hQb3J0Zm9saW8ob3B0aW9uczoge1xuICAgIHF1ZXJ5OiBzdHJpbmc7IFxuICAgIGVsZW1lbnRUeXBlPzogc3RyaW5nOyBcbiAgICBmdXp6eU1hdGNoPzogYm9vbGVhbjsgXG4gICAgbWF4UmVzdWx0cz86IG51bWJlcjsgXG4gICAgaW5jbHVkZUtleXdvcmRzPzogYm9vbGVhbjsgXG4gICAgaW5jbHVkZVRhZ3M/OiBib29sZWFuOyBcbiAgICBpbmNsdWRlVHJpZ2dlcnM/OiBib29sZWFuOyBcbiAgICBpbmNsdWRlRGVzY3JpcHRpb25zPzogYm9vbGVhbjtcbiAgfSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgcXVlcnkgcGFyYW1ldGVyXG4gICAgICBpZiAoIW9wdGlvbnMucXVlcnkgfHwgdHlwZW9mIG9wdGlvbnMucXVlcnkgIT09ICdzdHJpbmcnIHx8IG9wdGlvbnMucXVlcnkudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBTZWFyY2ggcXVlcnkgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLmBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBJbXBvcnQgcG9ydGZvbGlvIGluZGV4IG1hbmFnZXJcbiAgICAgIGNvbnN0IHsgUG9ydGZvbGlvSW5kZXhNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoJy4vcG9ydGZvbGlvL1BvcnRmb2xpb0luZGV4TWFuYWdlci5qcycpO1xuICAgICAgY29uc3QgaW5kZXhNYW5hZ2VyID0gUG9ydGZvbGlvSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cbiAgICAgIC8vIFBhcnNlIGVsZW1lbnQgdHlwZSBpZiBwcm92aWRlZFxuICAgICAgbGV0IGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvcHRpb25zLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkVHlwZXMgPSBbJ3BlcnNvbmFzJywgJ3NraWxscycsICd0ZW1wbGF0ZXMnLCAnYWdlbnRzJywgJ21lbW9yaWVzJywgJ2Vuc2VtYmxlcyddO1xuICAgICAgICBpZiAoIXZhbGlkVHlwZXMuaW5jbHVkZXMob3B0aW9ucy5lbGVtZW50VHlwZSkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbnZhbGlkIGVsZW1lbnQgdHlwZS4gVmFsaWQgdHlwZXM6ICR7dmFsaWRUeXBlcy5qb2luKCcsICcpfWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50VHlwZSA9IG9wdGlvbnMuZWxlbWVudFR5cGUgYXMgRWxlbWVudFR5cGU7XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHNlYXJjaCBvcHRpb25zXG4gICAgICBjb25zdCBzZWFyY2hPcHRpb25zID0ge1xuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgZnV6enlNYXRjaDogb3B0aW9ucy5mdXp6eU1hdGNoICE9PSBmYWxzZSwgLy8gRGVmYXVsdCB0byB0cnVlXG4gICAgICAgIG1heFJlc3VsdHM6IG9wdGlvbnMubWF4UmVzdWx0cyB8fCAyMCxcbiAgICAgICAgaW5jbHVkZUtleXdvcmRzOiBvcHRpb25zLmluY2x1ZGVLZXl3b3JkcyAhPT0gZmFsc2UsXG4gICAgICAgIGluY2x1ZGVUYWdzOiBvcHRpb25zLmluY2x1ZGVUYWdzICE9PSBmYWxzZSxcbiAgICAgICAgaW5jbHVkZVRyaWdnZXJzOiBvcHRpb25zLmluY2x1ZGVUcmlnZ2VycyAhPT0gZmFsc2UsXG4gICAgICAgIGluY2x1ZGVEZXNjcmlwdGlvbnM6IG9wdGlvbnMuaW5jbHVkZURlc2NyaXB0aW9ucyAhPT0gZmFsc2VcbiAgICAgIH07XG5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIHNlYXJjaFxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IGluZGV4TWFuYWdlci5zZWFyY2gob3B0aW9ucy5xdWVyeSwgc2VhcmNoT3B0aW9ucyk7XG5cbiAgICAgIC8vIEZvcm1hdCB0aGUgcmVzdWx0c1xuICAgICAgbGV0IHRleHQgPSBgJHt0aGlzLmdldFBlcnNvbmFJbmRpY2F0b3IoKX3wn5SNICoqUG9ydGZvbGlvIFNlYXJjaCBSZXN1bHRzKipcXG5cXG5gO1xuICAgICAgdGV4dCArPSBgKipRdWVyeSoqOiBcIiR7b3B0aW9ucy5xdWVyeX1cIlxcbmA7XG4gICAgICBcbiAgICAgIGlmIChlbGVtZW50VHlwZSkge1xuICAgICAgICB0ZXh0ICs9IGAqKlR5cGUgRmlsdGVyKio6ICR7ZWxlbWVudFR5cGV9XFxuYDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgdGV4dCArPSBgKipGb3VuZCoqOiAke3Jlc3VsdHMubGVuZ3RofSBlbGVtZW50JHtyZXN1bHRzLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfVxcblxcbmA7XG5cbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0ZXh0ICs9IGBObyBlbGVtZW50cyBmb3VuZCBtYXRjaGluZyB5b3VyIHNlYXJjaCBjcml0ZXJpYS5cXG5cXG5gO1xuICAgICAgICB0ZXh0ICs9IGAqKlRpcHMgZm9yIGJldHRlciByZXN1bHRzOioqXFxuYDtcbiAgICAgICAgdGV4dCArPSBg4oCiIFRyeSBkaWZmZXJlbnQga2V5d29yZHMgb3IgcGFydGlhbCBuYW1lc1xcbmA7XG4gICAgICAgIHRleHQgKz0gYOKAoiBSZW1vdmUgdGhlIHR5cGUgZmlsdGVyIHRvIHNlYXJjaCBhbGwgZWxlbWVudCB0eXBlc1xcbmA7XG4gICAgICAgIHRleHQgKz0gYOKAoiBDaGVjayBzcGVsbGluZyBhbmQgdHJ5IHN5bm9ueW1zXFxuYDtcbiAgICAgICAgdGV4dCArPSBg4oCiIFVzZSB0aGUgbGlzdF9lbGVtZW50cyB0b29sIHRvIHNlZSBhbGwgYXZhaWxhYmxlIGNvbnRlbnRgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dCArPSBgKipSZXN1bHRzOioqXFxuXFxuYDtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICBjb25zdCB7IGVudHJ5LCBtYXRjaFR5cGUgfSA9IHJlc3VsdDtcbiAgICAgICAgICBjb25zdCBpY29uID0gdGhpcy5nZXRFbGVtZW50SWNvbihlbnRyeS5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgXG4gICAgICAgICAgdGV4dCArPSBgJHtpY29ufSAqKiR7ZW50cnkubWV0YWRhdGEubmFtZX0qKlxcbmA7XG4gICAgICAgICAgdGV4dCArPSBgICAg8J+TgSBUeXBlOiAke2VudHJ5LmVsZW1lbnRUeXBlfVxcbmA7XG4gICAgICAgICAgdGV4dCArPSBgICAg8J+OryBNYXRjaDogJHttYXRjaFR5cGV9XFxuYDtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoZW50cnkubWV0YWRhdGEuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc2MgPSBlbnRyeS5tZXRhZGF0YS5kZXNjcmlwdGlvbi5sZW5ndGggPiAxMDAgXG4gICAgICAgICAgICAgID8gZW50cnkubWV0YWRhdGEuZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIDEwMCkgKyAnLi4uJ1xuICAgICAgICAgICAgICA6IGVudHJ5Lm1ldGFkYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgdGV4dCArPSBgICAg8J+TnSAke2Rlc2N9XFxuYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGVudHJ5Lm1ldGFkYXRhLnRhZ3MgJiYgZW50cnkubWV0YWRhdGEudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0ZXh0ICs9IGAgICDwn4+377iPIFRhZ3M6ICR7ZW50cnkubWV0YWRhdGEudGFncy5zbGljZSgwLCA1KS5qb2luKCcsICcpfSR7ZW50cnkubWV0YWRhdGEudGFncy5sZW5ndGggPiA1ID8gJy4uLicgOiAnJ31cXG5gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICB0ZXh0ICs9IGAgICDwn5OEIEZpbGU6ICR7ZW50cnkuZmlsZW5hbWV9Lm1kXFxuXFxuYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID49IHNlYXJjaE9wdGlvbnMubWF4UmVzdWx0cykge1xuICAgICAgICAgIHRleHQgKz0gYOKaoO+4jyBSZXN1bHRzIGxpbWl0ZWQgdG8gJHtzZWFyY2hPcHRpb25zLm1heFJlc3VsdHN9LiBSZWZpbmUgeW91ciBzZWFyY2ggZm9yIG1vcmUgc3BlY2lmaWMgcmVzdWx0cy5cXG5cXG5gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB0ZXh0ICs9IGDwn5KhICoqTmV4dCBzdGVwczoqKlxcbmA7XG4gICAgICAgIHRleHQgKz0gYOKAoiBVc2UgZ2V0X2VsZW1lbnRfZGV0YWlscyB0byBzZWUgZnVsbCBjb250ZW50XFxuYDtcbiAgICAgICAgdGV4dCArPSBg4oCiIFVzZSBhY3RpdmF0ZV9lbGVtZW50IHRvIGFjdGl2YXRlIGVsZW1lbnRzXFxuYDtcbiAgICAgICAgdGV4dCArPSBg4oCiIFVzZSBzdWJtaXRfY29udGVudCB0byBzaGFyZSB3aXRoIHRoZSBjb21tdW5pdHlgO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHRcbiAgICAgICAgfV1cbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0RvbGxob3VzZU1DUFNlcnZlci5zZWFyY2hQb3J0Zm9saW8nLCBlcnJvciwgeyBcbiAgICAgICAgcXVlcnk6IG9wdGlvbnMucXVlcnksXG4gICAgICAgIGVsZW1lbnRUeXBlOiBvcHRpb25zLmVsZW1lbnRUeXBlIFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsIFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBTZWFyY2ggZmFpbGVkOiAke1NlY3VyZUVycm9ySGFuZGxlci5zYW5pdGl6ZUVycm9yKGVycm9yKS5tZXNzYWdlfWBcbiAgICAgICAgfV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBhY3Jvc3MgYWxsIHNvdXJjZXMgKGxvY2FsLCBHaXRIdWIsIGNvbGxlY3Rpb24pIHVzaW5nIFVuaWZpZWRJbmRleE1hbmFnZXJcbiAgICogVGhpcyBwcm92aWRlcyBjb21wcmVoZW5zaXZlIHNlYXJjaCB3aXRoIGR1cGxpY2F0ZSBkZXRlY3Rpb24gYW5kIHZlcnNpb24gY29tcGFyaXNvblxuICAgKi9cbiAgYXN5bmMgc2VhcmNoQWxsKG9wdGlvbnM6IHtcbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIHNvdXJjZXM/OiBzdHJpbmdbXTtcbiAgICBlbGVtZW50VHlwZT86IHN0cmluZztcbiAgICBwYWdlPzogbnVtYmVyO1xuICAgIHBhZ2VTaXplPzogbnVtYmVyO1xuICAgIHNvcnRCeT86IHN0cmluZztcbiAgfSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgcXVlcnkgcGFyYW1ldGVyXG4gICAgICBpZiAoIW9wdGlvbnMucXVlcnkgfHwgdHlwZW9mIG9wdGlvbnMucXVlcnkgIT09ICdzdHJpbmcnIHx8IG9wdGlvbnMucXVlcnkudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBTZWFyY2ggcXVlcnkgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLmBcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBJbXBvcnQgdW5pZmllZCBpbmRleCBtYW5hZ2VyXG4gICAgICBjb25zdCB7IFVuaWZpZWRJbmRleE1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydCgnLi9wb3J0Zm9saW8vVW5pZmllZEluZGV4TWFuYWdlci5qcycpO1xuICAgICAgY29uc3QgeyBFbGVtZW50VHlwZSB9ID0gYXdhaXQgaW1wb3J0KCcuL3BvcnRmb2xpby90eXBlcy5qcycpO1xuICAgICAgY29uc3QgdW5pZmllZE1hbmFnZXIgPSBVbmlmaWVkSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cbiAgICAgIC8vIFBhcnNlIGVsZW1lbnQgdHlwZSBpZiBwcm92aWRlZFxuICAgICAgbGV0IGVsZW1lbnRUeXBlOiBFbGVtZW50VHlwZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvcHRpb25zLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkVHlwZXMgPSBbJ3BlcnNvbmFzJywgJ3NraWxscycsICd0ZW1wbGF0ZXMnLCAnYWdlbnRzJywgJ21lbW9yaWVzJywgJ2Vuc2VtYmxlcyddO1xuICAgICAgICBpZiAoIXZhbGlkVHlwZXMuaW5jbHVkZXMob3B0aW9ucy5lbGVtZW50VHlwZSkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBJbnZhbGlkIGVsZW1lbnQgdHlwZS4gVmFsaWQgdHlwZXM6ICR7dmFsaWRUeXBlcy5qb2luKCcsICcpfWBcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50VHlwZSA9IG9wdGlvbnMuZWxlbWVudFR5cGUgYXMgRWxlbWVudFR5cGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhcnNlIHNvdXJjZXMgKGRlZmF1bHQgdG8gbG9jYWwgYW5kIGdpdGh1YilcbiAgICAgIGNvbnN0IHNvdXJjZXMgPSBvcHRpb25zLnNvdXJjZXMgfHwgWydsb2NhbCcsICdnaXRodWInXTtcbiAgICAgIGNvbnN0IGluY2x1ZGVMb2NhbCA9IHNvdXJjZXMuaW5jbHVkZXMoJ2xvY2FsJyk7XG4gICAgICBjb25zdCBpbmNsdWRlR2l0SHViID0gc291cmNlcy5pbmNsdWRlcygnZ2l0aHViJyk7XG4gICAgICBjb25zdCBpbmNsdWRlQ29sbGVjdGlvbiA9IHNvdXJjZXMuaW5jbHVkZXMoJ2NvbGxlY3Rpb24nKTtcblxuICAgICAgLy8gQnVpbGQgc2VhcmNoIG9wdGlvbnNcbiAgICAgIGNvbnN0IHNlYXJjaE9wdGlvbnMgPSB7XG4gICAgICAgIHF1ZXJ5OiBvcHRpb25zLnF1ZXJ5LFxuICAgICAgICBpbmNsdWRlTG9jYWwsXG4gICAgICAgIGluY2x1ZGVHaXRIdWIsXG4gICAgICAgIGluY2x1ZGVDb2xsZWN0aW9uLFxuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgcGFnZTogb3B0aW9ucy5wYWdlIHx8IDEsXG4gICAgICAgIHBhZ2VTaXplOiBvcHRpb25zLnBhZ2VTaXplIHx8IDIwLFxuICAgICAgICBzb3J0Qnk6IChvcHRpb25zLnNvcnRCeSBhcyBhbnkpIHx8ICdyZWxldmFuY2UnXG4gICAgICB9O1xuXG4gICAgICAvLyBQZXJmb3JtIHRoZSB1bmlmaWVkIHNlYXJjaFxuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHVuaWZpZWRNYW5hZ2VyLnNlYXJjaChzZWFyY2hPcHRpb25zKTtcblxuICAgICAgLy8gRm9ybWF0IHRoZSByZXN1bHRzXG4gICAgICBsZXQgdGV4dCA9IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpffCflI0gKipVbmlmaWVkIFNlYXJjaCBSZXN1bHRzKipcXG5cXG5gO1xuICAgICAgdGV4dCArPSBgKipRdWVyeSoqOiBcIiR7b3B0aW9ucy5xdWVyeX1cIlxcbmA7XG4gICAgICB0ZXh0ICs9IGAqKlNvdXJjZXMqKjogJHtzb3VyY2VzLmpvaW4oJywgJyl9XFxuYDtcbiAgICAgIFxuICAgICAgaWYgKGVsZW1lbnRUeXBlKSB7XG4gICAgICAgIHRleHQgKz0gYCoqVHlwZSBGaWx0ZXIqKjogJHtlbGVtZW50VHlwZX1cXG5gO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0ZXh0ICs9IGAqKkZvdW5kKio6ICR7cmVzdWx0cy5sZW5ndGh9IGVsZW1lbnQke3Jlc3VsdHMubGVuZ3RoID09PSAxID8gJycgOiAncyd9XFxuXFxuYDtcblxuICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRleHQgKz0gYE5vIGVsZW1lbnRzIGZvdW5kIG1hdGNoaW5nIHlvdXIgc2VhcmNoIGNyaXRlcmlhLlxcblxcbmA7XG4gICAgICAgIHRleHQgKz0gYCoqVGlwcyBmb3IgYmV0dGVyIHJlc3VsdHM6KipcXG5gO1xuICAgICAgICB0ZXh0ICs9IGDigKIgVHJ5IGRpZmZlcmVudCBrZXl3b3JkcyBvciBwYXJ0aWFsIG5hbWVzXFxuYDtcbiAgICAgICAgdGV4dCArPSBg4oCiIFJlbW92ZSB0aGUgdHlwZSBmaWx0ZXIgdG8gc2VhcmNoIGFsbCBlbGVtZW50IHR5cGVzXFxuYDtcbiAgICAgICAgdGV4dCArPSBg4oCiIEluY2x1ZGUgbW9yZSBzb3VyY2VzOiBsb2NhbCwgZ2l0aHViLCBjb2xsZWN0aW9uXFxuYDtcbiAgICAgICAgdGV4dCArPSBg4oCiIENoZWNrIHNwZWxsaW5nIGFuZCB0cnkgc3lub255bXNcXG5gO1xuICAgICAgICB0ZXh0ICs9IGDigKIgVXNlIGJyb3dzZV9jb2xsZWN0aW9uIHRvIGV4cGxvcmUgYXZhaWxhYmxlIGNvbnRlbnRgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGV4dCArPSBgKipSZXN1bHRzOioqXFxuXFxuYDtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICBjb25zdCB7IGVudHJ5LCBzb3VyY2UsIG1hdGNoVHlwZSwgc2NvcmUsIGlzRHVwbGljYXRlLCB2ZXJzaW9uQ29uZmxpY3QgfSA9IHJlc3VsdDtcbiAgICAgICAgICBjb25zdCBpY29uID0gdGhpcy5nZXRFbGVtZW50SWNvbihlbnRyeS5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlSWNvbiA9IHRoaXMuZ2V0U291cmNlSWNvbihzb3VyY2UpO1xuICAgICAgICAgIFxuICAgICAgICAgIHRleHQgKz0gYCR7aWNvbn0gKioke2VudHJ5Lm5hbWV9KiogJHtzb3VyY2VJY29ufVxcbmA7XG4gICAgICAgICAgdGV4dCArPSBgICAg8J+TgSBUeXBlOiAke2VudHJ5LmVsZW1lbnRUeXBlfSB8IFNvdXJjZTogJHtzb3VyY2V9XFxuYDtcbiAgICAgICAgICB0ZXh0ICs9IGAgICDwn46vIE1hdGNoOiAke21hdGNoVHlwZX0gfCBTY29yZTogJHtzY29yZS50b0ZpeGVkKDIpfVxcbmA7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGVudHJ5LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBkZXNjID0gZW50cnkuZGVzY3JpcHRpb24ubGVuZ3RoID4gMTAwIFxuICAgICAgICAgICAgICA/IGVudHJ5LmRlc2NyaXB0aW9uLnN1YnN0cmluZygwLCAxMDApICsgJy4uLidcbiAgICAgICAgICAgICAgOiBlbnRyeS5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIHRleHQgKz0gYCAgIPCfk50gJHtkZXNjfVxcbmA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGVudHJ5LnZlcnNpb24pIHtcbiAgICAgICAgICAgIHRleHQgKz0gYCAgIPCfj7fvuI8gVmVyc2lvbjogJHtlbnRyeS52ZXJzaW9ufVxcbmA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2hvdyBkdXBsaWNhdGUgaW5mb3JtYXRpb25cbiAgICAgICAgICBpZiAoaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgIHRleHQgKz0gYCAgIOKaoO+4jyAqKkR1cGxpY2F0ZSBkZXRlY3RlZCBhY3Jvc3Mgc291cmNlcyoqXFxuYDtcbiAgICAgICAgICAgIGlmICh2ZXJzaW9uQ29uZmxpY3QpIHtcbiAgICAgICAgICAgICAgdGV4dCArPSBgICAg8J+UhCBWZXJzaW9uIGNvbmZsaWN0IC0gUmVjb21tZW5kZWQ6ICR7dmVyc2lvbkNvbmZsaWN0LnJlY29tbWVuZGVkfSAoJHt2ZXJzaW9uQ29uZmxpY3QucmVhc29ufSlcXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICB0ZXh0ICs9IGBcXG5gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBoYXNNb3JlID0gcmVzdWx0cy5sZW5ndGggPj0gc2VhcmNoT3B0aW9ucy5wYWdlU2l6ZTtcbiAgICAgICAgaWYgKGhhc01vcmUpIHtcbiAgICAgICAgICBjb25zdCBuZXh0UGFnZSA9IHNlYXJjaE9wdGlvbnMucGFnZSArIDE7XG4gICAgICAgICAgdGV4dCArPSBg4pqg77iPIFJlc3VsdHMgbGltaXRlZCB0byAke3NlYXJjaE9wdGlvbnMucGFnZVNpemV9LiBVc2UgcGFnZT0ke25leHRQYWdlfSBmb3IgbW9yZSByZXN1bHRzLlxcblxcbmA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRleHQgKz0gYPCfkqEgKipOZXh0IHN0ZXBzOioqXFxuYDtcbiAgICAgICAgdGV4dCArPSBg4oCiIFVzZSBnZXRfZWxlbWVudF9kZXRhaWxzIHRvIHNlZSBmdWxsIGNvbnRlbnRcXG5gO1xuICAgICAgICB0ZXh0ICs9IGDigKIgVXNlIGluc3RhbGxfY29udGVudCBmb3IgY29sbGVjdGlvbiBpdGVtc1xcbmA7XG4gICAgICAgIHRleHQgKz0gYOKAoiBVc2UgYWN0aXZhdGVfZWxlbWVudCBmb3IgbG9jYWwgZWxlbWVudHNcXG5gO1xuICAgICAgICB0ZXh0ICs9IGDigKIgQ2hlY2sgZm9yIGR1cGxpY2F0ZXMgYmVmb3JlIHN1Ym1pdHRpbmcgbmV3IGNvbnRlbnRgO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgIHRleHRcbiAgICAgICAgfV1cbiAgICAgIH07XG5cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCB7IEVycm9ySGFuZGxlciB9ID0gYXdhaXQgaW1wb3J0KCcuL3V0aWxzL0Vycm9ySGFuZGxlci5qcycpO1xuICAgICAgY29uc3QgeyBTZWN1cmVFcnJvckhhbmRsZXIgfSA9IGF3YWl0IGltcG9ydCgnLi9zZWN1cml0eS9lcnJvckhhbmRsZXIuanMnKTtcbiAgICAgIFxuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdEb2xsaG91c2VNQ1BTZXJ2ZXIuc2VhcmNoQWxsJywgZXJyb3IsIHsgXG4gICAgICAgIHF1ZXJ5OiBvcHRpb25zLnF1ZXJ5LFxuICAgICAgICBzb3VyY2VzOiBvcHRpb25zLnNvdXJjZXMsXG4gICAgICAgIGVsZW1lbnRUeXBlOiBvcHRpb25zLmVsZW1lbnRUeXBlIFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsIFxuICAgICAgICAgIHRleHQ6IGAke3RoaXMuZ2V0UGVyc29uYUluZGljYXRvcigpfeKdjCBVbmlmaWVkIHNlYXJjaCBmYWlsZWQ6ICR7U2VjdXJlRXJyb3JIYW5kbGVyLnNhbml0aXplRXJyb3IoZXJyb3IpLm1lc3NhZ2V9YFxuICAgICAgICB9XVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGljb24gZm9yIHNvdXJjZSB0eXBlXG4gICAqL1xuICBwcml2YXRlIGdldFNvdXJjZUljb24oc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGljb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgbG9jYWw6ICfwn5K7JyxcbiAgICAgIGdpdGh1YjogJ/CfkJknLFxuICAgICAgY29sbGVjdGlvbjogJ/CfjJAnXG4gICAgfTtcbiAgICByZXR1cm4gaWNvbnNbc291cmNlXSB8fCAn8J+TgSc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGljb24gZm9yIGVsZW1lbnQgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFbGVtZW50SWNvbihlbGVtZW50VHlwZTogRWxlbWVudFR5cGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGljb25zID0ge1xuICAgICAgcGVyc29uYXM6ICfwn46tJyxcbiAgICAgIHNraWxsczogJ/Cfjq8nLFxuICAgICAgdGVtcGxhdGVzOiAn8J+ThCcsXG4gICAgICBhZ2VudHM6ICfwn6SWJyxcbiAgICAgIG1lbW9yaWVzOiAn8J+noCcsXG4gICAgICBlbnNlbWJsZXM6ICfwn468J1xuICAgIH07XG4gICAgcmV0dXJuIGljb25zW2VsZW1lbnRUeXBlXSB8fCAn8J+TgSc7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBjb3VudCBlbGVtZW50cyBpbiBhIGRpcmVjdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb3VudEVsZW1lbnRzSW5EaXIoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgZGlyZWN0b3J5IGV4aXN0cyBhbmQgaXMgYWNjZXNzaWJsZVxuICAgICAgYXdhaXQgZnMuYWNjZXNzKGRpclBhdGgpO1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgICAgXG4gICAgICAvLyBDb3VudCBhbGwgZWxlbWVudCBmaWxlcyAoLm1kLCAuanNvbiwgLnlhbWwpIHRvIHN1cHBvcnQgYWxsIGVsZW1lbnQgdHlwZXNcbiAgICAgIC8vIC0gUGVyc29uYXM6IC5tZCBmaWxlc1xuICAgICAgLy8gLSBTa2lsbHM6IC5tZCBmaWxlcyAgXG4gICAgICAvLyAtIFRlbXBsYXRlczogLm1kIG9yIC55YW1sIGZpbGVzXG4gICAgICAvLyAtIEFnZW50czogLm1kIGZpbGVzXG4gICAgICByZXR1cm4gZmlsZXMuZmlsdGVyKGZpbGUgPT4gXG4gICAgICAgIGZpbGUuZW5kc1dpdGgoJy5tZCcpIHx8IFxuICAgICAgICBmaWxlLmVuZHNXaXRoKCcuanNvbicpIHx8IFxuICAgICAgICBmaWxlLmVuZHNXaXRoKCcueWFtbCcpXG4gICAgICApLmxlbmd0aDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IGxpc3Qgb2YgZWxlbWVudHMgYnkgdHlwZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRFbGVtZW50c0xpc3QoZWxlbWVudFR5cGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9jYWxQb3J0Zm9saW9NYW5hZ2VyID0gUG9ydGZvbGlvTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgICAgbGV0IGVsZW1lbnRUeXBlRW51bTogRWxlbWVudFR5cGU7XG4gICAgICBcbiAgICAgIHN3aXRjaCAoZWxlbWVudFR5cGUpIHtcbiAgICAgICAgY2FzZSAncGVyc29uYXMnOlxuICAgICAgICAgIGVsZW1lbnRUeXBlRW51bSA9IEVsZW1lbnRUeXBlLlBFUlNPTkE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NraWxscyc6XG4gICAgICAgICAgZWxlbWVudFR5cGVFbnVtID0gRWxlbWVudFR5cGUuU0tJTEw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RlbXBsYXRlcyc6XG4gICAgICAgICAgZWxlbWVudFR5cGVFbnVtID0gRWxlbWVudFR5cGUuVEVNUExBVEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2FnZW50cyc6XG4gICAgICAgICAgZWxlbWVudFR5cGVFbnVtID0gRWxlbWVudFR5cGUuQUdFTlQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gSW5zdGVhZCBvZiBzaWxlbnRseSByZXR1cm5pbmcgZW1wdHkgYXJyYXksIHRocm93IGRlc2NyaXB0aXZlIGVycm9yXG4gICAgICAgICAgY29uc3QgdmFsaWRUeXBlcyA9IFsncGVyc29uYXMnLCAnc2tpbGxzJywgJ3RlbXBsYXRlcycsICdhZ2VudHMnXTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCB0eXBlOiAnJHtlbGVtZW50VHlwZX0nLiBWYWxpZCB0eXBlcyBhcmU6ICR7dmFsaWRUeXBlcy5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkaXJQYXRoID0gbG9jYWxQb3J0Zm9saW9NYW5hZ2VyLmdldEVsZW1lbnREaXIoZWxlbWVudFR5cGVFbnVtKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgZGlyZWN0b3J5IGV4aXN0cyBhbmQgaXMgYWNjZXNzaWJsZVxuICAgICAgYXdhaXQgZnMuYWNjZXNzKGRpclBhdGgpO1xuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICAgICAgXG4gICAgICAvLyBGaWx0ZXIgYW5kIGV4dHJhY3QgbmFtZXMgZm9yIGFsbCBlbGVtZW50IGZpbGUgdHlwZXNcbiAgICAgIC8vIC0gUGVyc29uYXM6IC5tZCBmaWxlc1xuICAgICAgLy8gLSBTa2lsbHM6IC5tZCBmaWxlcyAgXG4gICAgICAvLyAtIFRlbXBsYXRlczogLm1kIG9yIC55YW1sIGZpbGVzXG4gICAgICAvLyAtIEFnZW50czogLm1kIGZpbGVzXG4gICAgICByZXR1cm4gZmlsZXNcbiAgICAgICAgLmZpbHRlcihmaWxlID0+IGZpbGUuZW5kc1dpdGgoJy5tZCcpIHx8IGZpbGUuZW5kc1dpdGgoJy5qc29uJykgfHwgZmlsZS5lbmRzV2l0aCgnLnlhbWwnKSlcbiAgICAgICAgLm1hcChmaWxlID0+IHtcbiAgICAgICAgICAvLyBSZW1vdmUgZmlsZSBleHRlbnNpb24gdG8gZ2V0IGVsZW1lbnQgbmFtZVxuICAgICAgICAgIGlmIChmaWxlLmVuZHNXaXRoKCcubWQnKSkgcmV0dXJuIGZpbGUucmVwbGFjZSgnLm1kJywgJycpO1xuICAgICAgICAgIGlmIChmaWxlLmVuZHNXaXRoKCcuanNvbicpKSByZXR1cm4gZmlsZS5yZXBsYWNlKCcuanNvbicsICcnKTtcbiAgICAgICAgICBpZiAoZmlsZS5lbmRzV2l0aCgnLnlhbWwnKSkgcmV0dXJuIGZpbGUucmVwbGFjZSgnLnlhbWwnLCAnJyk7XG4gICAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgb3VyIHZhbGlkYXRpb24gZXJyb3IgZm9yIGludmFsaWQgZWxlbWVudCB0eXBlc1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnSW52YWxpZCBlbGVtZW50IHR5cGU6JykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IHZhbGlkYXRpb24gZXJyb3JzIGZvciBkZWJ1Z2dpbmdcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRm9yIGZpbGUgc3lzdGVtIGVycm9ycywgcHJvdmlkZSBjb250ZXh0IGFib3V0IHRoZSBvcGVyYXRpb25cbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yLmNvZGUgPT09ICdFTk9FTlQnIFxuICAgICAgICA/IGBFbGVtZW50IGRpcmVjdG9yeSBub3QgZm91bmQgZm9yIHR5cGUgJyR7ZWxlbWVudFR5cGV9Jy4gRGlyZWN0b3J5IG1heSBub3QgZXhpc3QgeWV0LmBcbiAgICAgICAgOiBgRmFpbGVkIHRvIHJlYWQgZWxlbWVudHMgZGlyZWN0b3J5IGZvciB0eXBlICcke2VsZW1lbnRUeXBlfSc6ICR7ZXJyb3IubWVzc2FnZSB8fCAnVW5rbm93biBmaWxlIHN5c3RlbSBlcnJvcid9YDtcbiAgICAgIFxuICAgICAgbG9nZ2VyLndhcm4oJ0Vycm9yIGluIGdldEVsZW1lbnRzTGlzdCcsIHsgXG4gICAgICAgIGVsZW1lbnRUeXBlLCBcbiAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsIFxuICAgICAgICBjb2RlOiBlcnJvci5jb2RlIFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIGxvYWQgZWxlbWVudCBieSB0eXBlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRFbGVtZW50QnlUeXBlKGVsZW1lbnROYW1lOiBzdHJpbmcsIGVsZW1lbnRUeXBlOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBsb2NhbFBvcnRmb2xpb01hbmFnZXIgPSBQb3J0Zm9saW9NYW5hZ2VyLmdldEluc3RhbmNlKCk7XG4gICAgICBsZXQgZWxlbWVudFR5cGVFbnVtOiBFbGVtZW50VHlwZTtcbiAgICAgIFxuICAgICAgc3dpdGNoIChlbGVtZW50VHlwZSkge1xuICAgICAgICBjYXNlICdwZXJzb25hcyc6XG4gICAgICAgICAgZWxlbWVudFR5cGVFbnVtID0gRWxlbWVudFR5cGUuUEVSU09OQTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2tpbGxzJzpcbiAgICAgICAgICBlbGVtZW50VHlwZUVudW0gPSBFbGVtZW50VHlwZS5TS0lMTDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndGVtcGxhdGVzJzpcbiAgICAgICAgICBlbGVtZW50VHlwZUVudW0gPSBFbGVtZW50VHlwZS5URU1QTEFURTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYWdlbnRzJzpcbiAgICAgICAgICBlbGVtZW50VHlwZUVudW0gPSBFbGVtZW50VHlwZS5BR0VOVDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHNpbGVudGx5IHJldHVybmluZyBudWxsLCB0aHJvdyBkZXNjcmlwdGl2ZSBlcnJvclxuICAgICAgICAgIGNvbnN0IHZhbGlkVHlwZXMgPSBbJ3BlcnNvbmFzJywgJ3NraWxscycsICd0ZW1wbGF0ZXMnLCAnYWdlbnRzJ107XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZTogJyR7ZWxlbWVudFR5cGV9Jy4gVmFsaWQgdHlwZXMgYXJlOiAke3ZhbGlkVHlwZXMuam9pbignLCAnKX1gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlyUGF0aCA9IGxvY2FsUG9ydGZvbGlvTWFuYWdlci5nZXRFbGVtZW50RGlyKGVsZW1lbnRUeXBlRW51bSk7XG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBgJHtlbGVtZW50TmFtZX0uanNvbmApO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgb3VyIHZhbGlkYXRpb24gZXJyb3IgZm9yIGludmFsaWQgZWxlbWVudCB0eXBlc1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgJiYgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnSW52YWxpZCBlbGVtZW50IHR5cGU6JykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IHZhbGlkYXRpb24gZXJyb3JzIGZvciBkZWJ1Z2dpbmdcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUHJvdmlkZSBzcGVjaWZpYyBlcnJvciBtZXNzYWdlcyBmb3IgY29tbW9uIGZpbGUgc3lzdGVtIGVycm9yc1xuICAgICAgbGV0IGVycm9yTWVzc2FnZTogc3RyaW5nO1xuICAgICAgXG4gICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gYEVsZW1lbnQgJyR7ZWxlbWVudE5hbWV9JyBub3QgZm91bmQgaW4gJHtlbGVtZW50VHlwZX0uIEZpbGUgZG9lcyBub3QgZXhpc3QuYDtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBgRWxlbWVudCAnJHtlbGVtZW50TmFtZX0nIGluICR7ZWxlbWVudFR5cGV9IGNvbnRhaW5zIGludmFsaWQgSlNPTjogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBgRmFpbGVkIHRvIGxvYWQgZWxlbWVudCAnJHtlbGVtZW50TmFtZX0nIGZyb20gJHtlbGVtZW50VHlwZX06ICR7ZXJyb3IubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLndhcm4oJ0Vycm9yIGluIGxvYWRFbGVtZW50QnlUeXBlJywgeyBcbiAgICAgICAgZWxlbWVudE5hbWUsIFxuICAgICAgICBlbGVtZW50VHlwZSwgXG4gICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlLCBcbiAgICAgICAgY29kZTogZXJyb3IuY29kZSBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBydW4oKSB7XG4gICAgbG9nZ2VyLmluZm8oXCJTdGFydGluZyBEb2xsaG91c2VNQ1Agc2VydmVyLi4uXCIpO1xuICAgIC8vIERvY2tlciBidWlsZCB2ZXJpZmljYXRpb24gLSBwcm92ZXMgd2UncmUgcnVubmluZyBmcmVzaCBjb2RlXG4gICAgbG9nZ2VyLmluZm8oXCJCVUlMRCBWRVJJRklDQVRJT046IFJ1bm5pbmcgYnVpbGQgZnJvbSAyMDI1LTA4LTE3IDE2OjMwIFVUQyAtIFBSNjA2IEFSTTY0IGZpeFwiKTtcbiAgICBcbiAgICAvLyBGSVggIzYxMDogSW5pdGlhbGl6ZSBwb3J0Zm9saW8gYW5kIGNvbXBsZXRlIHNldHVwIEJFRk9SRSBjb25uZWN0aW5nIHRvIE1DUFxuICAgIC8vIFRoaXMgZW5zdXJlcyBwZXJzb25hcyBhbmQgcG9ydGZvbGlvIGFyZSByZWFkeSB3aGVuIE1DUCBjb21tYW5kcyBhcnJpdmVcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplUG9ydGZvbGlvKCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbXBsZXRlSW5pdGlhbGl6YXRpb24oKTtcbiAgICAgIGxvZ2dlci5pbmZvKFwiUG9ydGZvbGlvIGFuZCBwZXJzb25hcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHlcIik7XG4gICAgICAvLyBPdXRwdXQgbWVzc2FnZSB0aGF0IERvY2tlciB0ZXN0cyBjYW4gZGV0ZWN0XG4gICAgICBsb2dnZXIuaW5mbyhcIkRvbGxob3VzZU1DUCBzZXJ2ZXIgcmVhZHkgLSB3YWl0aW5nIGZvciBNQ1AgY29ubmVjdGlvbiBvbiBzdGRpb1wiKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdEb2xsaG91c2VNQ1BTZXJ2ZXIucnVuLmluaXRpYWxpemF0aW9uJywgZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IHRvIHByZXZlbnQgc2VydmVyIGZyb20gc3RhcnRpbmcgd2l0aCBpbmNvbXBsZXRlIGluaXRpYWxpemF0aW9uXG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBTdGRpb1NlcnZlclRyYW5zcG9ydCgpO1xuICAgIFxuICAgIC8vIFNldCB1cCBncmFjZWZ1bCBzaHV0ZG93biBoYW5kbGVyc1xuICAgIGNvbnN0IGNsZWFudXAgPSBhc3luYyAoKSA9PiB7XG4gICAgICBsb2dnZXIuaW5mbyhcIlNodXR0aW5nIGRvd24gRG9sbGhvdXNlTUNQIHNlcnZlci4uLlwiKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgR2l0SHViIGF1dGggbWFuYWdlclxuICAgICAgICBpZiAodGhpcy5naXRodWJBdXRoTWFuYWdlcikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2l0aHViQXV0aE1hbmFnZXIuY2xlYW51cCgpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhbiB1cCBhbnkgb3RoZXIgcmVzb3VyY2VzXG4gICAgICAgIFxuICAgICAgICBsb2dnZXIuaW5mbyhcIkNsZWFudXAgY29tcGxldGVkXCIpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgZHVyaW5nIGNsZWFudXBcIiwgeyBlcnJvciB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH07XG4gICAgXG4gICAgLy8gUmVnaXN0ZXIgc2h1dGRvd24gaGFuZGxlcnNcbiAgICBwcm9jZXNzLm9uKCdTSUdJTlQnLCBjbGVhbnVwKTtcbiAgICBwcm9jZXNzLm9uKCdTSUdURVJNJywgY2xlYW51cCk7XG4gICAgcHJvY2Vzcy5vbignU0lHSFVQJywgY2xlYW51cCk7XG4gICAgXG4gICAgYXdhaXQgdGhpcy5zZXJ2ZXIuY29ubmVjdCh0cmFuc3BvcnQpO1xuICAgIC8vIE1hcmsgdGhhdCBNQ1AgaXMgbm93IGNvbm5lY3RlZCAtIG5vIG1vcmUgY29uc29sZSBvdXRwdXQgYWxsb3dlZFxuICAgIGxvZ2dlci5zZXRNQ1BDb25uZWN0ZWQoKTtcbiAgICBsb2dnZXIuaW5mbyhcIkRvbGxob3VzZU1DUCBzZXJ2ZXIgcnVubmluZyBvbiBzdGRpb1wiKTtcbiAgfVxufVxuXG4vLyBFeHBvcnQgaXMgYWxyZWFkeSBhdCBjbGFzcyBkZWNsYXJhdGlvblxuXG4vLyBPbmx5IHN0YXJ0IHRoZSBzZXJ2ZXIgaWYgdGhpcyBmaWxlIGlzIGJlaW5nIHJ1biBkaXJlY3RseSAobm90IGltcG9ydGVkIGJ5IHRlc3RzKVxuLy8gSGFuZGxlIGRpZmZlcmVudCBleGVjdXRpb24gbWV0aG9kcyAoZGlyZWN0LCBucHgsIENMSSlcbmNvbnN0IGlzRGlyZWN0RXhlY3V0aW9uID0gaW1wb3J0Lm1ldGEudXJsID09PSBgZmlsZTovLyR7cHJvY2Vzcy5hcmd2WzFdfWA7XG5jb25zdCBpc05weEV4ZWN1dGlvbiA9IHByb2Nlc3MuZW52Lm5wbV9leGVjcGF0aD8uaW5jbHVkZXMoJ25weCcpO1xuY29uc3QgaXNDbGlFeGVjdXRpb24gPSBwcm9jZXNzLmFyZ3ZbMV0/LmVuZHNXaXRoKCcvZG9sbGhvdXNlbWNwJykgfHwgcHJvY2Vzcy5hcmd2WzFdPy5lbmRzV2l0aCgnXFxcXGRvbGxob3VzZW1jcCcpO1xuY29uc3QgaXNUZXN0ID0gcHJvY2Vzcy5lbnYuSkVTVF9XT1JLRVJfSUQ7XG5cbi8vIFByb2dyZXNzaXZlIHN0YXJ0dXAgd2l0aCByZXRyaWVzIGZvciBucHgvQ0xJIGV4ZWN1dGlvblxuY29uc3QgU1RBUlRVUF9ERUxBWVMgPSBbMTAsIDUwLCAxMDAsIDIwMF07IC8vIFByb2dyZXNzaXZlIGRlbGF5cyBpbiBtc1xuXG5hc3luYyBmdW5jdGlvbiBzdGFydFNlcnZlcldpdGhSZXRyeShyZXRyaWVzTGVmdCA9IFNUQVJUVVBfREVMQVlTLmxlbmd0aCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNlcnZlciA9IG5ldyBEb2xsaG91c2VNQ1BTZXJ2ZXIoKTtcbiAgICBhd2FpdCBzZXJ2ZXIucnVuKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHJldHJpZXNMZWZ0ID4gMCAmJiAoaXNOcHhFeGVjdXRpb24gfHwgaXNDbGlFeGVjdXRpb24pKSB7XG4gICAgICAvLyBUcnkgYWdhaW4gd2l0aCBhIGxvbmdlciBkZWxheVxuICAgICAgY29uc3QgZGVsYXlJbmRleCA9IFNUQVJUVVBfREVMQVlTLmxlbmd0aCAtIHJldHJpZXNMZWZ0O1xuICAgICAgY29uc3QgZGVsYXkgPSBTVEFSVFVQX0RFTEFZU1tkZWxheUluZGV4XTtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgICAgcmV0dXJuIHN0YXJ0U2VydmVyV2l0aFJldHJ5KHJldHJpZXNMZWZ0IC0gMSk7XG4gICAgfVxuICAgIC8vIEZpbmFsIGZhaWx1cmUgLSBtaW5pbWFsIGVycm9yIG1lc3NhZ2UgZm9yIHNlY3VyaXR5XG4gICAgLy8gTm90ZTogVXNpbmcgY29uc29sZS5lcnJvciBoZXJlIGlzIGludGVudGlvbmFsIGFzIGl0J3MgdGhlIGZpbmFsIGVycm9yIGJlZm9yZSBleGl0XG4gICAgY29uc29sZS5lcnJvcihcIltEb2xsaG91c2VNQ1BdIFNlcnZlciBzdGFydHVwIGZhaWxlZFwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuaWYgKChpc0RpcmVjdEV4ZWN1dGlvbiB8fCBpc05weEV4ZWN1dGlvbiB8fCBpc0NsaUV4ZWN1dGlvbikgJiYgIWlzVGVzdCkge1xuICBzdGFydFNlcnZlcldpdGhSZXRyeSgpLmNhdGNoKCgpID0+IHtcbiAgICAvLyBOb3RlOiBVc2luZyBjb25zb2xlLmVycm9yIGhlcmUgaXMgaW50ZW50aW9uYWwgYXMgaXQncyB0aGUgZmluYWwgZXJyb3IgYmVmb3JlIGV4aXRcbiAgICBjb25zb2xlLmVycm9yKFwiW0RvbGxob3VzZU1DUF0gU2VydmVyIHN0YXJ0dXAgZmFpbGVkXCIpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG59Il19
|