@dollhousemcp/mcp-server 2.0.11 → 2.0.12-rc.2
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 +33 -0
- package/dist/config/ConfigManager.d.ts +34 -0
- package/dist/config/ConfigManager.d.ts.map +1 -1
- package/dist/config/ConfigManager.js +46 -1
- package/dist/config/env.d.ts +18 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +89 -2
- package/dist/di/Container.d.ts +1 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +38 -2
- package/dist/elements/agents/AgentManager.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/handlers/mcp-aql/GatekeeperSession.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/GatekeeperSession.js +3 -2
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +11 -3
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +11 -6
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.js +8 -1
- package/dist/index.js +53 -3
- package/dist/security/InputNormalizer.d.ts +4 -6
- package/dist/security/InputNormalizer.d.ts.map +1 -1
- package/dist/security/InputNormalizer.js +10 -16
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +26 -1
- package/dist/security/constants.d.ts +7 -0
- package/dist/security/constants.d.ts.map +1 -1
- package/dist/security/constants.js +10 -1
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +14 -6
- package/dist/security/encryption/PatternEncryptor.d.ts.map +1 -1
- package/dist/security/encryption/PatternEncryptor.js +18 -10
- 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 +18 -2
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +47 -15
- package/dist/security/validators/unicodeValidator.d.ts +4 -5
- package/dist/security/validators/unicodeValidator.d.ts.map +1 -1
- package/dist/security/validators/unicodeValidator.js +19 -20
- package/dist/services/VerificationNotifier.d.ts.map +1 -1
- package/dist/services/VerificationNotifier.js +15 -13
- package/dist/services/validation/GenericElementValidator.js +5 -5
- package/dist/web/console/IngestRoutes.d.ts +14 -2
- package/dist/web/console/IngestRoutes.d.ts.map +1 -1
- package/dist/web/console/IngestRoutes.js +69 -5
- package/dist/web/console/LeaderElection.d.ts +37 -3
- package/dist/web/console/LeaderElection.d.ts.map +1 -1
- package/dist/web/console/LeaderElection.js +67 -7
- package/dist/web/console/LeaderForwardingSink.d.ts +19 -3
- package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -1
- package/dist/web/console/LeaderForwardingSink.js +44 -9
- package/dist/web/console/PromotionManager.d.ts +29 -0
- package/dist/web/console/PromotionManager.d.ts.map +1 -0
- package/dist/web/console/PromotionManager.js +94 -0
- package/dist/web/console/SessionNames.d.ts +7 -0
- package/dist/web/console/SessionNames.d.ts.map +1 -1
- package/dist/web/console/SessionNames.js +10 -1
- package/dist/web/console/UnifiedConsole.d.ts +26 -1
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
- package/dist/web/console/UnifiedConsole.js +143 -20
- package/dist/web/portDiscovery.d.ts +4 -3
- package/dist/web/portDiscovery.d.ts.map +1 -1
- package/dist/web/portDiscovery.js +7 -5
- package/dist/web/public/app.js +35 -18
- package/dist/web/public/consoleAuth.js +152 -0
- package/dist/web/public/index.html +243 -9
- package/dist/web/public/logs.js +1 -1
- package/dist/web/public/metrics.js +3 -3
- package/dist/web/public/permissions.js +1 -1
- package/dist/web/public/security.css +396 -0
- package/dist/web/public/security.js +393 -0
- package/dist/web/public/sessions.css +54 -4
- package/dist/web/public/sessions.js +46 -6
- package/dist/web/public/setup.css +439 -0
- package/dist/web/public/setup.js +490 -18
- package/dist/web/public/styles.css +10 -0
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +8 -3
- package/dist/web/routes/setupRoutes.d.ts +4 -0
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +418 -7
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +9 -5
- package/dist/web/server.d.ts +49 -3
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +282 -82
- package/package.json +11 -2
- package/server.json +2 -2
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* Security: SEC-001 - Unicode attack prevention
|
|
12
12
|
*/
|
|
13
13
|
import { SecurityMonitor } from '../securityMonitor.js';
|
|
14
|
+
import { escalateSeverity } from '../constants.js';
|
|
14
15
|
export class UnicodeValidator {
|
|
15
16
|
/**
|
|
16
17
|
* Unicode attack patterns and confusable characters
|
|
@@ -39,18 +40,25 @@ export class UnicodeValidator {
|
|
|
39
40
|
static NON_PRINTABLE_CHARS = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F\uFFFE\uFFFF]/g; // NOSONAR - Intentionally matching control characters for security sanitization
|
|
40
41
|
/**
|
|
41
42
|
* Common homograph/confusable character mappings
|
|
42
|
-
* Maps visually similar Unicode characters to their ASCII equivalents
|
|
43
|
+
* Maps visually similar Unicode characters to their ASCII equivalents.
|
|
44
|
+
* Performance: ~110 entries; replaceConfusables() iterates the full map
|
|
45
|
+
* per call but uses Map.has() lookups (O(1) per char). Negligible at
|
|
46
|
+
* current size — profile before optimizing if the map grows beyond ~500.
|
|
43
47
|
*/
|
|
44
48
|
static CONFUSABLE_MAPPINGS = new Map([
|
|
45
49
|
// Cyrillic to Latin
|
|
46
50
|
['а', 'a'], ['е', 'e'], ['о', 'o'], ['р', 'p'], ['с', 'c'], ['х', 'x'], ['у', 'y'],
|
|
47
51
|
['А', 'A'], ['В', 'B'], ['Е', 'E'], ['К', 'K'], ['М', 'M'], ['Н', 'H'], ['О', 'O'],
|
|
48
52
|
['Р', 'P'], ['С', 'C'], ['Т', 'T'], ['У', 'Y'], ['Х', 'X'],
|
|
49
|
-
// Greek to Latin
|
|
53
|
+
// Greek lowercase to Latin
|
|
50
54
|
['α', 'a'], ['β', 'b'], ['γ', 'g'], ['δ', 'd'], ['ε', 'e'], ['ζ', 'z'], ['η', 'h'],
|
|
51
55
|
['θ', 'th'], ['ι', 'i'], ['κ', 'k'], ['λ', 'l'], ['μ', 'm'], ['ν', 'n'], ['ξ', 'x'],
|
|
52
56
|
['ο', 'o'], ['π', 'p'], ['ρ', 'r'], ['σ', 's'], ['τ', 't'], ['υ', 'u'], ['φ', 'f'],
|
|
53
57
|
['χ', 'ch'], ['ψ', 'ps'], ['ω', 'w'],
|
|
58
|
+
// Greek uppercase to Latin — visually identical to Latin capitals (#1782)
|
|
59
|
+
['\u0391', 'A'], ['\u0392', 'B'], ['\u0395', 'E'], ['\u0397', 'H'], ['\u0399', 'I'],
|
|
60
|
+
['\u039A', 'K'], ['\u039C', 'M'], ['\u039D', 'N'], ['\u039F', 'O'], ['\u03A1', 'P'],
|
|
61
|
+
['\u03A4', 'T'], ['\u03A5', 'Y'], ['\u03A7', 'X'],
|
|
54
62
|
// Mathematical symbols to ASCII (various styles)
|
|
55
63
|
['𝒂', 'a'], ['𝒃', 'b'], ['𝒄', 'c'], ['𝒅', 'd'], ['𝒆', 'e'], ['𝒇', 'f'], ['𝒈', 'g'], ['𝒉', 'h'], ['𝒊', 'i'], ['𝒋', 'j'], ['𝒌', 'k'], ['𝒍', 'l'], ['𝒎', 'm'], ['𝒏', 'n'], ['𝒐', 'o'], ['𝒑', 'p'], ['𝒒', 'q'], ['𝒓', 'r'], ['𝒔', 's'], ['𝒕', 't'], ['𝒖', 'u'], ['𝒗', 'v'], ['𝒘', 'w'], ['𝒙', 'x'], ['𝒚', 'y'], ['𝒛', 'z'],
|
|
56
64
|
['𝐚', 'a'], ['𝐛', 'b'], ['𝐜', 'c'], ['𝐝', 'd'], ['𝐞', 'e'], ['𝐟', 'f'], ['𝐠', 'g'], ['𝐡', 'h'], ['𝐢', 'i'], ['𝐣', 'j'], ['𝐤', 'k'], ['𝐥', 'l'], ['𝐦', 'm'], ['𝐧', 'n'], ['𝐨', 'o'], ['𝐩', 'p'], ['𝐪', 'q'], ['𝐫', 'r'], ['𝐬', 's'], ['𝐭', 't'], ['𝐮', 'u'], ['𝐯', 'v'], ['𝐰', 'w'], ['𝐱', 'x'], ['𝐲', 'y'], ['𝐳', 'z'],
|
|
@@ -90,12 +98,12 @@ export class UnicodeValidator {
|
|
|
90
98
|
const suspiciousPatterns = this.detectSuspiciousPatterns(content);
|
|
91
99
|
issues.push(...suspiciousPatterns.issues);
|
|
92
100
|
if (suspiciousPatterns.severity) {
|
|
93
|
-
severity =
|
|
101
|
+
severity = escalateSeverity(severity, suspiciousPatterns.severity);
|
|
94
102
|
}
|
|
95
103
|
// 2. Remove direction override characters (prevents RLO/LRO attacks)
|
|
96
104
|
if (this.DIRECTION_OVERRIDE_CHARS.test(normalized)) {
|
|
97
105
|
issues.push('Direction override characters detected');
|
|
98
|
-
severity =
|
|
106
|
+
severity = escalateSeverity(severity, 'high');
|
|
99
107
|
normalized = normalized.replace(this.DIRECTION_OVERRIDE_CHARS, '');
|
|
100
108
|
SecurityMonitor.logSecurityEvent({
|
|
101
109
|
type: 'UNICODE_DIRECTION_OVERRIDE',
|
|
@@ -110,11 +118,11 @@ export class UnicodeValidator {
|
|
|
110
118
|
const hasDirectionMarks = /[\u200E\u200F]/.test(normalized);
|
|
111
119
|
if (hasDirectionMarks) {
|
|
112
120
|
issues.push('Direction marks (LRM/RLM) detected');
|
|
113
|
-
severity =
|
|
121
|
+
severity = escalateSeverity(severity, 'high');
|
|
114
122
|
}
|
|
115
123
|
else {
|
|
116
124
|
issues.push('Zero-width or non-printable characters detected');
|
|
117
|
-
severity =
|
|
125
|
+
severity = escalateSeverity(severity, 'medium');
|
|
118
126
|
}
|
|
119
127
|
normalized = normalized
|
|
120
128
|
.replace(this.ZERO_WIDTH_CHARS, '')
|
|
@@ -126,7 +134,7 @@ export class UnicodeValidator {
|
|
|
126
134
|
const mixedScriptResult = this.detectMixedScripts(normalized);
|
|
127
135
|
if (mixedScriptResult.isSuspicious) {
|
|
128
136
|
issues.push(`Mixed script usage detected: ${mixedScriptResult.scripts.join(', ')}`);
|
|
129
|
-
severity =
|
|
137
|
+
severity = escalateSeverity(severity, 'high');
|
|
130
138
|
SecurityMonitor.logSecurityEvent({
|
|
131
139
|
type: 'UNICODE_MIXED_SCRIPT',
|
|
132
140
|
severity: 'HIGH',
|
|
@@ -140,7 +148,7 @@ export class UnicodeValidator {
|
|
|
140
148
|
if (confusableResult.hasConfusables) {
|
|
141
149
|
normalized = confusableResult.normalized;
|
|
142
150
|
issues.push('Confusable Unicode characters detected and normalized');
|
|
143
|
-
severity =
|
|
151
|
+
severity = escalateSeverity(severity, 'medium');
|
|
144
152
|
// Log if this happens in legitimate multilingual context
|
|
145
153
|
if (!mixedScriptResult.isSuspicious) {
|
|
146
154
|
SecurityMonitor.logSecurityEvent({
|
|
@@ -203,14 +211,14 @@ export class UnicodeValidator {
|
|
|
203
211
|
for (const { range, name } of suspiciousRanges) {
|
|
204
212
|
if (range.test(content)) {
|
|
205
213
|
issues.push(`Suspicious Unicode range detected: ${name}`);
|
|
206
|
-
severity =
|
|
214
|
+
severity = escalateSeverity(severity, 'medium');
|
|
207
215
|
}
|
|
208
216
|
}
|
|
209
217
|
// Check for malformed surrogate pairs using safe character-by-character validation
|
|
210
218
|
// This avoids ReDoS vulnerabilities from complex regex patterns
|
|
211
219
|
if (this.hasMalformedSurrogates(content)) {
|
|
212
220
|
issues.push('Malformed surrogate pairs detected');
|
|
213
|
-
severity =
|
|
221
|
+
severity = escalateSeverity(severity, 'high');
|
|
214
222
|
}
|
|
215
223
|
return { issues, severity };
|
|
216
224
|
}
|
|
@@ -248,15 +256,6 @@ export class UnicodeValidator {
|
|
|
248
256
|
detectedScripts.includes('CYRILLIC'));
|
|
249
257
|
return { isSuspicious, scripts: detectedScripts };
|
|
250
258
|
}
|
|
251
|
-
/**
|
|
252
|
-
* Escalate severity level (higher severity takes precedence)
|
|
253
|
-
*/
|
|
254
|
-
static escalateSeverity(current, newSeverity) {
|
|
255
|
-
const severityLevels = { low: 1, medium: 2, high: 3, critical: 4 };
|
|
256
|
-
const currentLevel = current ? severityLevels[current] : 0;
|
|
257
|
-
const newLevel = severityLevels[newSeverity];
|
|
258
|
-
return newLevel > currentLevel ? newSeverity : (current || 'low');
|
|
259
|
-
}
|
|
260
259
|
/**
|
|
261
260
|
* Escape special regex characters for safe replacement
|
|
262
261
|
*/
|
|
@@ -324,4 +323,4 @@ export class UnicodeValidator {
|
|
|
324
323
|
cleaned;
|
|
325
324
|
}
|
|
326
325
|
}
|
|
327
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pY29kZVZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFTeEQsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQjs7T0FFRztJQUVIOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFVLHdCQUF3QixHQUFHLCtCQUErQixDQUFDO0lBRW5GOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFVLGdCQUFnQixHQUFHLHFDQUFxQyxDQUFDO0lBRWpGOzs7OztPQUtHO0lBQ0gsOEdBQThHO0lBQ3RHLE1BQU0sQ0FBVSxtQkFBbUIsR0FBRyxvRUFBb0UsQ0FBQyxDQUFDLGdGQUFnRjtJQUVwTTs7O09BR0c7SUFDSyxNQUFNLENBQVUsbUJBQW1CLEdBQXdCLElBQUksR0FBRyxDQUFDO1FBQ3pFLG9CQUFvQjtRQUNwQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDbEYsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ2xGLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUUxRCxpQkFBaUI7UUFDakIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ2xGLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNuRixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDbEYsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBRXBDLGlEQUFpRDtRQUNqRCxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7UUFDaFYsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1FBRWhWLHFDQUFxQztRQUNyQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFFOUMsMkJBQTJCO1FBQzNCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUN0RSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFFNUQsdUJBQXVCO1FBQ3ZCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUN0VCxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxH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QUFDLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxRQUFRLEdBQUcsTUFBTSxJQUFJLFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQztvQkFDM0MsT0FBTyxJQUFJLENBQUMsQ0FBQywrQ0FBK0M7Z0JBQzlELENBQUM7Z0JBQ0QsQ0FBQyxFQUFFLENBQUMsQ0FBQywrQkFBK0I7WUFDdEMsQ0FBQztZQUNELGlFQUFpRTtpQkFDNUQsSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxJQUFJLENBQUMsQ0FBQyx5QkFBeUI7WUFDeEMsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBZSxFQUFFLFlBQW9CLEdBQUc7UUFDNUQsb0VBQW9FO1FBQ3BFLE1BQU0sT0FBTyxHQUFHLE9BQU87YUFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUM7YUFDL0MsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUM7YUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU3QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDakMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDekMsT0FBTyxDQUFDO0lBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVW5pY29kZSBWYWxpZGF0b3IgZm9yIERvbGxob3VzZU1DUFxuICogXG4gKiBQcmV2ZW50cyBVbmljb2RlLWJhc2VkIGJ5cGFzcyBhdHRhY2tzIGluY2x1ZGluZzpcbiAqIC0gSG9tb2dyYXBoIGF0dGFja3MgKHZpc3VhbGx5IHNpbWlsYXIgY2hhcmFjdGVycylcbiAqIC0gRGlyZWN0aW9uIG92ZXJyaWRlIGF0dGFja3MgKFJMTy9MUk8pXG4gKiAtIE1peGVkIHNjcmlwdCBhdHRhY2tzXG4gKiAtIFplcm8td2lkdGggY2hhcmFjdGVyIGluamVjdGlvblxuICogLSBVbmljb2RlIG5vcm1hbGl6YXRpb24gYnlwYXNzZXNcbiAqIFxuICogU2VjdXJpdHk6IFNFQy0wMDEgLSBVbmljb2RlIGF0dGFjayBwcmV2ZW50aW9uXG4gKi9cblxuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHlNb25pdG9yLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBVbmljb2RlVmFsaWRhdGlvblJlc3VsdCB7XG4gIGlzVmFsaWQ6IGJvb2xlYW47XG4gIG5vcm1hbGl6ZWRDb250ZW50OiBzdHJpbmc7XG4gIGRldGVjdGVkSXNzdWVzPzogc3RyaW5nW107XG4gIHNldmVyaXR5PzogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCc7XG59XG5cbmV4cG9ydCBjbGFzcyBVbmljb2RlVmFsaWRhdG9yIHtcbiAgLyoqXG4gICAqIFVuaWNvZGUgYXR0YWNrIHBhdHRlcm5zIGFuZCBjb25mdXNhYmxlIGNoYXJhY3RlcnNcbiAgICovXG4gIFxuICAvKipcbiAgICogRGlyZWN0aW9uIG92ZXJyaWRlIGNoYXJhY3RlcnMgdGhhdCBjYW4gaGlkZSBvciByZXZlcnNlIHRleHQgZGlzcGxheVxuICAgKiBAc2VlIGh0dHBzOi8vdW5pY29kZS5vcmcvcmVwb3J0cy90cjkvI0RpcmVjdGlvbmFsX0Zvcm1hdHRpbmdfQ2hhcmFjdGVyc1xuICAgKiBVKzIwMkEtVSsyMDJFOiBMZWZ0L1JpZ2h0IGVtYmVkZGluZyBhbmQgb3ZlcnJpZGUgbWFya3MgKExSRSwgUkxFLCBQREYsIExSTywgUkxPKVxuICAgKiBVKzIwNjYtVSsyMDY5OiBJc29sYXRlIGZvcm1hdHRpbmcgY2hhcmFjdGVycyAoTFJJLCBSTEksIEZTSSwgUERJKVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRElSRUNUSU9OX09WRVJSSURFX0NIQVJTID0gL1tcXHUyMDJBLVxcdTIwMkVcXHUyMDY2LVxcdTIwNjldL2c7XG4gIFxuICAvKipcbiAgICogWmVyby13aWR0aCBhbmQgaW52aXNpYmxlIGZvcm1hdHRpbmcgY2hhcmFjdGVycyBvZnRlbiB1c2VkIHRvIGhpZGUgcGF5bG9hZHNcbiAgICogVSsyMDBCLVUrMjAwRjogWmVyby13aWR0aCBzcGFjZXMgYW5kIGRpcmVjdGlvbmFsIG1hcmtzXG4gICAqIFUrMjAyOC1VKzIwMkY6IExpbmUvcGFyYWdyYXBoIHNlcGFyYXRvcnMgYW5kIGZvcm1hdHRpbmcgY2hhcmFjdGVyc1xuICAgKiBVK0ZFRkY6IFplcm8td2lkdGggbm8tYnJlYWsgc3BhY2UgKEJ5dGUgT3JkZXIgTWFyaylcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFpFUk9fV0lEVEhfQ0hBUlMgPSAvW1xcdTIwMEItXFx1MjAwRlxcdTIwMjgtXFx1MjAyRlxcdUZFRkZdL2c7XG4gIFxuICAvKipcbiAgICogTm9uLXByaW50YWJsZSBjb250cm9sIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgbm90IGFwcGVhciBpbiBub3JtYWwgdGV4dFxuICAgKiBVKzAwMDAtVSswMDA4LCBVKzAwMEItVSswMDBDLCBVKzAwMEUtVSswMDFGOiBDMCBjb250cm9sIGNvZGVzIChleGNlcHQgVEFCLCBMRiwgQ1IpXG4gICAqIFUrMDA3Ri1VKzAwOUY6IERlbGV0ZSBhbmQgQzEgY29udHJvbCBjb2Rlc1xuICAgKiBVK0ZGRkUtVStGRkZGOiBOb24tY2hhcmFjdGVycyB0aGF0IHNob3VsZCBuZXZlciBhcHBlYXIgaW4gdmFsaWQgdGV4dFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gSW50ZW50aW9uYWxseSBtYXRjaGluZyBjb250cm9sIGNoYXJzIGZvciBzZWN1cml0eSBzYW5pdGl6YXRpb25cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTk9OX1BSSU5UQUJMRV9DSEFSUyA9IC9bXFx1MDAwMC1cXHUwMDA4XFx1MDAwQlxcdTAwMENcXHUwMDBFLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHVGRkZFXFx1RkZGRl0vZzsgLy8gTk9TT05BUiAtIEludGVudGlvbmFsbHkgbWF0Y2hpbmcgY29udHJvbCBjaGFyYWN0ZXJzIGZvciBzZWN1cml0eSBzYW5pdGl6YXRpb25cbiAgXG4gIC8qKlxuICAgKiBDb21tb24gaG9tb2dyYXBoL2NvbmZ1c2FibGUgY2hhcmFjdGVyIG1hcHBpbmdzXG4gICAqIE1hcHMgdmlzdWFsbHkgc2ltaWxhciBVbmljb2RlIGNoYXJhY3RlcnMgdG8gdGhlaXIgQVNDSUkgZXF1aXZhbGVudHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENPTkZVU0FCTEVfTUFQUElOR1M6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBuZXcgTWFwKFtcbiAgICAvLyBDeXJpbGxpYyB0byBMYXRpblxuICAgIFsn0LAnLCAnYSddLCBbJ9C1JywgJ2UnXSwgWyfQvicsICdvJ10sIFsn0YAnLCAncCddLCBbJ9GBJywgJ2MnXSwgWyfRhScsICd4J10sIFsn0YMnLCAneSddLFxuICAgIFsn0JAnLCAnQSddLCBbJ9CSJywgJ0InXSwgWyfQlScsICdFJ10sIFsn0JonLCAnSyddLCBbJ9CcJywgJ00nXSwgWyfQnScsICdIJ10sIFsn0J4nLCAnTyddLCBcbiAgICBbJ9CgJywgJ1AnXSwgWyfQoScsICdDJ10sIFsn0KInLCAnVCddLCBbJ9CjJywgJ1knXSwgWyfQpScsICdYJ10sXG4gICAgXG4gICAgLy8gR3JlZWsgdG8gTGF0aW5cbiAgICBbJ86xJywgJ2EnXSwgWyfOsicsICdiJ10sIFsnzrMnLCAnZyddLCBbJ860JywgJ2QnXSwgWyfOtScsICdlJ10sIFsnzrYnLCAneiddLCBbJ863JywgJ2gnXSxcbiAgICBbJ864JywgJ3RoJ10sIFsnzrknLCAnaSddLCBbJ866JywgJ2snXSwgWyfOuycsICdsJ10sIFsnzrwnLCAnbSddLCBbJ869JywgJ24nXSwgWyfOvicsICd4J10sXG4gICAgWyfOvycsICdvJ10sIFsnz4AnLCAncCddLCBbJ8+BJywgJ3InXSwgWyfPgycsICdzJ10sIFsnz4QnLCAndCddLCBbJ8+FJywgJ3UnXSwgWyfPhicsICdmJ10sXG4gICAgWyfPhycsICdjaCddLCBbJ8+IJywgJ3BzJ10sIFsnz4knLCAndyddLFxuICAgIFxuICAgIC8vIE1hdGhlbWF0aWNhbCBzeW1ib2xzIHRvIEFTQ0lJICh2YXJpb3VzIHN0eWxlcylcbiAgICBbJ/CdkoInLCAnYSddLCBbJ/CdkoMnLCAnYiddLCBbJ/CdkoQnLCAnYyddLCBbJ/CdkoUnLCAnZCddLCBbJ/CdkoYnLCAnZSddLCBbJ/CdkocnLCAnZiddLCBbJ/CdkognLCAnZyddLCBbJ/CdkoknLCAnaCddLCBbJ/CdkoonLCAnaSddLCBbJ/CdkosnLCAnaiddLCBbJ/CdkownLCAnayddLCBbJ/Cdko0nLCAnbCddLCBbJ/Cdko4nLCAnbSddLCBbJ/Cdko8nLCAnbiddLCBbJ/CdkpAnLCAnbyddLCBbJ/CdkpEnLCAncCddLCBbJ/CdkpInLCAncSddLCBbJ/CdkpMnLCAnciddLCBbJ/CdkpQnLCAncyddLCBbJ/CdkpUnLCAndCddLCBbJ/CdkpYnLCAndSddLCBbJ/CdkpcnLCAndiddLCBbJ/CdkpgnLCAndyddLCBbJ/CdkpknLCAneCddLCBbJ/CdkponLCAneSddLCBbJ/CdkpsnLCAneiddLFxuICAgIFsn8J2QmicsICdhJ10sIFsn8J2QmycsICdiJ10sIFsn8J2QnCcsICdjJ10sIFsn8J2QnScsICdkJ10sIFsn8J2QnicsICdlJ10sIFsn8J2QnycsICdmJ10sIFsn8J2QoCcsICdnJ10sIFsn8J2QoScsICdoJ10sIFsn8J2QoicsICdpJ10sIFsn8J2QoycsICdqJ10sIFsn8J2QpCcsICdrJ10sIFsn8J2QpScsICdsJ10sIFsn8J2QpicsICdtJ10sIFsn8J2QpycsICduJ10sIFsn8J2QqCcsICdvJ10sIFsn8J2QqScsICdwJ10sIFsn8J2QqicsICdxJ10sIFsn8J2QqycsICdyJ10sIFsn8J2QrCcsICdzJ10sIFsn8J2QrScsICd0J10sIFsn8J2QricsICd1J10sIFsn8J2QrycsICd2J10sIFsn8J2QsCcsICd3J10sIFsn8J2QsScsICd4J10sIFsn8J2QsicsICd5J10sIFsn8J2QsycsICd6J10sXG4gICAgXG4gICAgLy8gU3BlY2lhbCBpIHZhcmlhbnRzIChUdXJraXNoLCBldGMuKVxuICAgIFsnxLEnLCAnaSddLCBbJ8SwJywgJ0knXSwgWyfRlicsICdpJ10sIFsn04AnLCAnSSddLFxuICAgIFxuICAgIC8vIE90aGVyIGNvbW1vbiBjb25mdXNhYmxlc1xuICAgIFsnx50nLCAnZSddLCBbJ8mQJywgJ2EnXSwgWyfJlCcsICdvJ10sIFsnyocnLCAndCddLCBbJ8qMJywgJ3YnXSwgWyfKjScsICd3J10sXG4gICAgWyfihIMnLCAnQyddLCBbJ+KEiScsICdGJ10sIFsn4oSWJywgJ05vJ10sIFsn4oSiJywgJ1RNJ10sIFsnwq4nLCAnUiddLFxuICAgIFxuICAgIC8vIEZ1bGx3aWR0aCBjaGFyYWN0ZXJzXG4gICAgWyfvvKEnLCAnQSddLCBbJ++8oicsICdCJ10sIFsn77yjJywgJ0MnXSwgWyfvvKQnLCAnRCddLCBbJ++8pScsICdFJ10sIFsn77ymJywgJ0YnXSwgWyfvvKcnLCAnRyddLCBbJ++8qCcsICdIJ10sIFsn77ypJywgJ0knXSwgWyfvvKonLCAnSiddLCBbJ++8qycsICdLJ10sIFsn77ysJywgJ0wnXSwgWyfvvK0nLCAnTSddLCBbJ++8ricsICdOJ10sIFsn77yvJywgJ08nXSwgWyfvvLAnLCAnUCddLCBbJ++8sScsICdRJ10sIFsn77yyJywgJ1InXSwgWyfvvLMnLCAnUyddLCBbJ++8tCcsICdUJ10sIFsn77y1JywgJ1UnXSwgWyfvvLYnLCAnViddLCBbJ++8tycsICdXJ10sIFsn77y4JywgJ1gnXSwgWyfvvLknLCAnWSddLCBbJ++8uicsICdaJ10sXG4gICAgWyfvvYEnLCAnYSddLCBbJ++9gicsICdiJ10sIFsn772DJywgJ2MnXSwgWyfvvYQnLCAnZCddLCBbJ++9hScsICdlJ10sIFsn772GJywgJ2YnXSwgWyfvvYcnLCAnZyddLCBbJ++9iCcsICdoJ10sIFsn772JJywgJ2knXSwgWyfvvYonLCAnaiddLCBbJ++9iycsICdrJ10sIFsn772MJywgJ2wnXSwgWyfvvY0nLCAnbSddLCBbJ++9jicsICduJ10sIFsn772PJywgJ28nXSwgWyfvvZAnLCAncCddLCBbJ++9kScsICdxJ10sIFsn772SJywgJ3InXSwgWyfvvZMnLCAncyddLCBbJ++9lCcsICd0J10sIFsn772VJywgJ3UnXSwgWyfvvZYnLCAndiddLCBbJ++9lycsICd3J10sIFsn772YJywgJ3gnXSwgWyfvvZknLCAneSddLCBbJ++9micsICd6J10sXG4gICAgWyfvvJAnLCAnMCddLCBbJ++8kScsICcxJ10sIFsn77ySJywgJzInXSwgWyfvvJMnLCAnMyddLCBbJ++8lCcsICc0J10sIFsn77yVJywgJzUnXSwgWyfvvJYnLCAnNiddLCBbJ++8lycsICc3J10sIFsn77yYJywgJzgnXSwgWyfvvJknLCAnOSddLFxuICBdKTtcblxuICAvKipcbiAgICogU2NyaXB0IG1peGluZyBkZXRlY3Rpb24gcGF0dGVybnNcbiAgICogRGV0ZWN0cyBzdXNwaWNpb3VzIG1peGluZyBvZiBkaWZmZXJlbnQgVW5pY29kZSBzY3JpcHRzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTQ1JJUFRfUEFUVEVSTlMgPSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gSW50ZW50aW9uYWxseSBpbmNsdWRlcyBjb250cm9sIGNoYXJzIGZvciBjb21wcmVoZW5zaXZlIExhdGluIHNjcmlwdCBkZXRlY3Rpb25cbiAgICBMQVRJTjogL1tcXHUwMDAwLVxcdTAwN0ZcXHUwMEEwLVxcdTAwRkZcXHUwMTAwLVxcdTAxN0ZcXHUwMTgwLVxcdTAyNEZdLywgLy8gTk9TT05BUiAtIEludGVudGlvbmFsbHkgaW5jbHVkZXMgY29udHJvbCBjaGFyYWN0ZXJzIGZvciBjb21wcmVoZW5zaXZlIExhdGluIHNjcmlwdCBkZXRlY3Rpb25cbiAgICAvLyBVc2UgYWx0ZXJuYXRpb24gdG8gYXZvaWQgU29uYXJDbG91ZCB0aGlua2luZyBcXHUwNTJGXFx1MkRFMCBpcyBhIGNvbWJpbmVkIGNoYXJhY3RlclxuICAgIENZUklMTElDOiAvKD86W1xcdTA0MDAtXFx1MDRGRl18W1xcdTA1MDAtXFx1MDUyRl18W1xcdTJERTAtXFx1MkRGRl18W1xcdUE2NDAtXFx1QTY5Rl0pLyxcbiAgICBHUkVFSzogL1tcXHUwMzcwLVxcdTAzRkZcXHUxRjAwLVxcdTFGRkZdLyxcbiAgICBBUkFCSUM6IC9bXFx1MDYwMC1cXHUwNkZGXFx1MDc1MC1cXHUwNzdGXFx1MDhBMC1cXHUwOEZGXFx1RkI1MC1cXHVGREZGXFx1RkU3MC1cXHVGRUZGXS8sXG4gICAgSEVCUkVXOiAvW1xcdTA1OTAtXFx1MDVGRlxcdUZCMUQtXFx1RkI0Rl0vLFxuICAgIENKSzogL1tcXHUyRTgwLVxcdTJFRkZcXHUyRjAwLVxcdTJGREZcXHUzMDAwLVxcdTMwM0ZcXHUzMDQwLVxcdTMwOUZcXHUzMEEwLVxcdTMwRkZcXHUzMTAwLVxcdTMxMkZcXHUzMTMwLVxcdTMxOEZcXHUzMTkwLVxcdTMxOUZcXHUzMUEwLVxcdTMxQkZcXHUzMUMwLVxcdTMxRUZcXHUzMUYwLVxcdTMxRkZcXHUzMjAwLVxcdTMyRkZcXHUzMzAwLVxcdTMzRkZcXHUzNDAwLVxcdTREQkZcXHU0REMwLVxcdTRERkZcXHU0RTAwLVxcdTlGRkZdLyxcbiAgfTtcblxuICAvKipcbiAgICogTm9ybWFsaXplIFVuaWNvZGUgY29udGVudCB0byBwcmV2ZW50IGJ5cGFzcyBhdHRhY2tzXG4gICAqL1xuICBzdGF0aWMgbm9ybWFsaXplKGNvbnRlbnQ6IHN0cmluZyk6IFVuaWNvZGVWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IG5vcm1hbGl6ZWQgPSBjb250ZW50O1xuICAgIGxldCBzZXZlcml0eTogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCcgPSAnbG93JztcblxuICAgIHRyeSB7XG4gICAgICAvLyAxLiBEZXRlY3QgYW5kIGxvZyBzdXNwaWNpb3VzIFVuaWNvZGUgcGF0dGVybnMgYmVmb3JlIG5vcm1hbGl6YXRpb25cbiAgICAgIGNvbnN0IHN1c3BpY2lvdXNQYXR0ZXJucyA9IHRoaXMuZGV0ZWN0U3VzcGljaW91c1BhdHRlcm5zKGNvbnRlbnQpO1xuICAgICAgaXNzdWVzLnB1c2goLi4uc3VzcGljaW91c1BhdHRlcm5zLmlzc3Vlcyk7XG4gICAgICBpZiAoc3VzcGljaW91c1BhdHRlcm5zLnNldmVyaXR5KSB7XG4gICAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCBzdXNwaWNpb3VzUGF0dGVybnMuc2V2ZXJpdHkpO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBSZW1vdmUgZGlyZWN0aW9uIG92ZXJyaWRlIGNoYXJhY3RlcnMgKHByZXZlbnRzIFJMTy9MUk8gYXR0YWNrcylcbiAgICAgIGlmICh0aGlzLkRJUkVDVElPTl9PVkVSUklERV9DSEFSUy50ZXN0KG5vcm1hbGl6ZWQpKSB7XG4gICAgICAgIGlzc3Vlcy5wdXNoKCdEaXJlY3Rpb24gb3ZlcnJpZGUgY2hhcmFjdGVycyBkZXRlY3RlZCcpO1xuICAgICAgICBzZXZlcml0eSA9IHRoaXMuZXNjYWxhdGVTZXZlcml0eShzZXZlcml0eSwgJ2hpZ2gnKTtcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSh0aGlzLkRJUkVDVElPTl9PVkVSUklERV9DSEFSUywgJycpO1xuICAgICAgICBcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdVTklDT0RFX0RJUkVDVElPTl9PVkVSUklERScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICdVbmljb2RlVmFsaWRhdG9yJyxcbiAgICAgICAgICBkZXRhaWxzOiAnRGlyZWN0aW9uIG92ZXJyaWRlIGNoYXJhY3RlcnMgcmVtb3ZlZCBmcm9tIGNvbnRlbnQnXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiBSZW1vdmUgemVyby13aWR0aCBhbmQgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzXG4gICAgICBpZiAodGhpcy5aRVJPX1dJRFRIX0NIQVJTLnRlc3Qobm9ybWFsaXplZCkgfHwgdGhpcy5OT05fUFJJTlRBQkxFX0NIQVJTLnRlc3Qobm9ybWFsaXplZCkpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHplcm8td2lkdGggY2hhcnMgaW5jbHVkZSBkaXJlY3Rpb24gbWFya3MgKFUrMjAwRSwgVSsyMDBGKVxuICAgICAgICBjb25zdCBoYXNEaXJlY3Rpb25NYXJrcyA9IC9bXFx1MjAwRVxcdTIwMEZdLy50ZXN0KG5vcm1hbGl6ZWQpO1xuICAgICAgICBpZiAoaGFzRGlyZWN0aW9uTWFya3MpIHtcbiAgICAgICAgICBpc3N1ZXMucHVzaCgnRGlyZWN0aW9uIG1hcmtzIChMUk0vUkxNKSBkZXRlY3RlZCcpO1xuICAgICAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCAnaGlnaCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzc3Vlcy5wdXNoKCdaZXJvLXdpZHRoIG9yIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyBkZXRlY3RlZCcpO1xuICAgICAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCAnbWVkaXVtJyk7XG4gICAgICAgIH1cbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWRcbiAgICAgICAgICAucmVwbGFjZSh0aGlzLlpFUk9fV0lEVEhfQ0hBUlMsICcnKVxuICAgICAgICAgIC5yZXBsYWNlKHRoaXMuTk9OX1BSSU5UQUJMRV9DSEFSUywgJycpO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBBcHBseSBVbmljb2RlIG5vcm1hbGl6YXRpb24gKE5GQyAtIENhbm9uaWNhbCBEZWNvbXBvc2l0aW9uICsgQ29tcG9zaXRpb24pXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZC5ub3JtYWxpemUoJ05GQycpO1xuXG4gICAgICAvLyA1LiBEZXRlY3QgbWl4ZWQgc2NyaXB0IGF0dGFja3MgQkVGT1JFIGNvbmZ1c2FibGUgcmVwbGFjZW1lbnRcbiAgICAgIGNvbnN0IG1peGVkU2NyaXB0UmVzdWx0ID0gdGhpcy5kZXRlY3RNaXhlZFNjcmlwdHMobm9ybWFsaXplZCk7XG4gICAgICBpZiAobWl4ZWRTY3JpcHRSZXN1bHQuaXNTdXNwaWNpb3VzKSB7XG4gICAgICAgIGlzc3Vlcy5wdXNoKGBNaXhlZCBzY3JpcHQgdXNhZ2UgZGV0ZWN0ZWQ6ICR7bWl4ZWRTY3JpcHRSZXN1bHQuc2NyaXB0cy5qb2luKCcsICcpfWApO1xuICAgICAgICBzZXZlcml0eSA9IHRoaXMuZXNjYWxhdGVTZXZlcml0eShzZXZlcml0eSwgJ2hpZ2gnKTtcbiAgICAgICAgXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVU5JQ09ERV9NSVhFRF9TQ1JJUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgc291cmNlOiAnVW5pY29kZVZhbGlkYXRvcicsXG4gICAgICAgICAgZGV0YWlsczogYE1peGVkIHNjcmlwdHMgZGV0ZWN0ZWQ6ICR7bWl4ZWRTY3JpcHRSZXN1bHQuc2NyaXB0cy5qb2luKCcsICcpfWBcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIEFsd2F5cyByZXBsYWNlIGNvbmZ1c2FibGUgY2hhcmFjdGVycyB3aXRoIEFTQ0lJIGVxdWl2YWxlbnRzIGZvciBzZWN1cml0eVxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBob21vZ3JhcGggYXR0YWNrcyByZWdhcmRsZXNzIG9mIHNjcmlwdCBtaXhpbmdcbiAgICAgIGNvbnN0IGNvbmZ1c2FibGVSZXN1bHQgPSB0aGlzLnJlcGxhY2VDb25mdXNhYmxlcyhub3JtYWxpemVkKTtcbiAgICAgIGlmIChjb25mdXNhYmxlUmVzdWx0Lmhhc0NvbmZ1c2FibGVzKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQgPSBjb25mdXNhYmxlUmVzdWx0Lm5vcm1hbGl6ZWQ7XG4gICAgICAgIGlzc3Vlcy5wdXNoKCdDb25mdXNhYmxlIFVuaWNvZGUgY2hhcmFjdGVycyBkZXRlY3RlZCBhbmQgbm9ybWFsaXplZCcpO1xuICAgICAgICBzZXZlcml0eSA9IHRoaXMuZXNjYWxhdGVTZXZlcml0eShzZXZlcml0eSwgJ21lZGl1bScpO1xuICAgICAgICBcbiAgICAgICAgLy8gTG9nIGlmIHRoaXMgaGFwcGVucyBpbiBsZWdpdGltYXRlIG11bHRpbGluZ3VhbCBjb250ZXh0XG4gICAgICAgIGlmICghbWl4ZWRTY3JpcHRSZXN1bHQuaXNTdXNwaWNpb3VzKSB7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1VOSUNPREVfVkFMSURBVElPTl9FUlJPUicsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdVbmljb2RlVmFsaWRhdG9yJyxcbiAgICAgICAgICAgIGRldGFpbHM6ICdDb25mdXNhYmxlIGNoYXJhY3RlcnMgbm9ybWFsaXplZCBpbiBsZWdpdGltYXRlIG11bHRpbGluZ3VhbCBjb250ZW50J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGlzc3Vlcy5sZW5ndGggPT09IDAsXG4gICAgICAgIG5vcm1hbGl6ZWRDb250ZW50OiBub3JtYWxpemVkLFxuICAgICAgICBkZXRlY3RlZElzc3VlczogaXNzdWVzLmxlbmd0aCA+IDAgPyBpc3N1ZXMgOiB1bmRlZmluZWQsXG4gICAgICAgIHNldmVyaXR5OiBpc3N1ZXMubGVuZ3RoID4gMCA/IHNldmVyaXR5IDogdW5kZWZpbmVkXG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1VOSUNPREVfVkFMSURBVElPTl9FUlJPUicsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ1VuaWNvZGVWYWxpZGF0b3InLFxuICAgICAgICBkZXRhaWxzOiBgVW5pY29kZSB2YWxpZGF0aW9uIGZhaWxlZDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZhbGxiYWNrOiByZXR1cm4gb3JpZ2luYWwgY29udGVudCBpZiBub3JtYWxpemF0aW9uIGZhaWxzXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgbm9ybWFsaXplZENvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgIGRldGVjdGVkSXNzdWVzOiBbJ1VuaWNvZGUgdmFsaWRhdGlvbiBmYWlsZWQnXSxcbiAgICAgICAgc2V2ZXJpdHk6ICdoaWdoJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHN1c3BpY2lvdXMgVW5pY29kZSBwYXR0ZXJucyB0aGF0IG1pZ2h0IGluZGljYXRlIGF0dGFja3NcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRldGVjdFN1c3BpY2lvdXNQYXR0ZXJucyhjb250ZW50OiBzdHJpbmcpOiB7IGlzc3Vlczogc3RyaW5nW107IHNldmVyaXR5PzogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCcgfSB7XG4gICAgY29uc3QgaXNzdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBzZXZlcml0eTogJ2xvdycgfCAnbWVkaXVtJyB8ICdoaWdoJyB8ICdjcml0aWNhbCcgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBDaGVjayBmb3IgZXhjZXNzaXZlIFVuaWNvZGUgZXNjYXBlcyAocG9zc2libGUgZW5jb2RpbmcgYnlwYXNzKVxuICAgIC8qKlxuICAgICAqIFBhdHRlcm4gdG8gbWF0Y2ggVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzXG4gICAgICogXFxcXHU6IExpdGVyYWwgYmFja3NsYXNoIGZvbGxvd2VkIGJ5ICd1J1xuICAgICAqIFswLTlhLWZBLUZdezR9OiBFeGFjdGx5IDQgaGV4YWRlY2ltYWwgZGlnaXRzXG4gICAgICogVXNlZCB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gYnlwYXNzIGZpbHRlcnMgdXNpbmcgXFx1MDA2MWRtaW4gc3R5bGUgZW5jb2RpbmdcbiAgICAgKi9cbiAgICBjb25zdCB1bmljb2RlRXNjYXBlUGF0dGVybiA9IC9cXFxcdVswLTlhLWZBLUZdezR9L2c7XG4gICAgY29uc3QgdW5pY29kZUVzY2FwZXMgPSBjb250ZW50Lm1hdGNoKHVuaWNvZGVFc2NhcGVQYXR0ZXJuKTtcbiAgICBpZiAodW5pY29kZUVzY2FwZXMgJiYgdW5pY29kZUVzY2FwZXMubGVuZ3RoID4gMTApIHtcbiAgICAgIGlzc3Vlcy5wdXNoKGBFeGNlc3NpdmUgVW5pY29kZSBlc2NhcGVzIGRldGVjdGVkICgke3VuaWNvZGVFc2NhcGVzLmxlbmd0aH0pYCk7XG4gICAgICBzZXZlcml0eSA9ICdoaWdoJztcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3Igc3VzcGljaW91cyBVbmljb2RlIHJhbmdlcyB0aGF0IG1pZ2h0IGhpZGUgY29udGVudFxuICAgIGNvbnN0IHN1c3BpY2lvdXNSYW5nZXMgPSBbXG4gICAgICB7IHJhbmdlOiAvW1xcdUUwMDAtXFx1RjhGRl0vZywgbmFtZTogJ1ByaXZhdGUgVXNlIEFyZWEnIH0sXG4gICAgICAvLyBOb3RlOiBQcm9wZXJseSBwYWlyZWQgc3Vycm9nYXRlIHBhaXJzIFtcXHVEODAwLVxcdURGRkZdIGFyZSBub3JtYWwgZm9yIGVtb2ppc1xuICAgICAgeyByYW5nZTogL1tcXHVGREQwLVxcdUZERUZdL2csIG5hbWU6ICdOb24tY2hhcmFjdGVycycgfSxcbiAgICAgIHsgcmFuZ2U6IC9bXFx1RkZGRVxcdUZGRkZdL2csIG5hbWU6ICdOb24tY2hhcmFjdGVycycgfVxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHsgcmFuZ2UsIG5hbWUgfSBvZiBzdXNwaWNpb3VzUmFuZ2VzKSB7XG4gICAgICBpZiAocmFuZ2UudGVzdChjb250ZW50KSkge1xuICAgICAgICBpc3N1ZXMucHVzaChgU3VzcGljaW91cyBVbmljb2RlIHJhbmdlIGRldGVjdGVkOiAke25hbWV9YCk7XG4gICAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCAnbWVkaXVtJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIG1hbGZvcm1lZCBzdXJyb2dhdGUgcGFpcnMgdXNpbmcgc2FmZSBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIHZhbGlkYXRpb25cbiAgICAvLyBUaGlzIGF2b2lkcyBSZURvUyB2dWxuZXJhYmlsaXRpZXMgZnJvbSBjb21wbGV4IHJlZ2V4IHBhdHRlcm5zXG4gICAgaWYgKHRoaXMuaGFzTWFsZm9ybWVkU3Vycm9nYXRlcyhjb250ZW50KSkge1xuICAgICAgaXNzdWVzLnB1c2goJ01hbGZvcm1lZCBzdXJyb2dhdGUgcGFpcnMgZGV0ZWN0ZWQnKTtcbiAgICAgIHNldmVyaXR5ID0gdGhpcy5lc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCAnaGlnaCcpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGlzc3Vlcywgc2V2ZXJpdHkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGNvbmZ1c2FibGUgVW5pY29kZSBjaGFyYWN0ZXJzIHdpdGggQVNDSUkgZXF1aXZhbGVudHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlcGxhY2VDb25mdXNhYmxlcyhjb250ZW50OiBzdHJpbmcpOiB7IG5vcm1hbGl6ZWQ6IHN0cmluZzsgaGFzQ29uZnVzYWJsZXM6IGJvb2xlYW4gfSB7XG4gICAgbGV0IG5vcm1hbGl6ZWQgPSBjb250ZW50O1xuICAgIGxldCBoYXNDb25mdXNhYmxlcyA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBbY29uZnVzYWJsZSwgcmVwbGFjZW1lbnRdIG9mIHRoaXMuQ09ORlVTQUJMRV9NQVBQSU5HUykge1xuICAgICAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoY29uZnVzYWJsZSkpIHtcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZShuZXcgUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXgoY29uZnVzYWJsZSksICdnJyksIHJlcGxhY2VtZW50KTtcbiAgICAgICAgaGFzQ29uZnVzYWJsZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IG5vcm1hbGl6ZWQsIGhhc0NvbmZ1c2FibGVzIH07XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHN1c3BpY2lvdXMgbWl4aW5nIG9mIGRpZmZlcmVudCBVbmljb2RlIHNjcmlwdHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRldGVjdE1peGVkU2NyaXB0cyhjb250ZW50OiBzdHJpbmcpOiB7IGlzU3VzcGljaW91czogYm9vbGVhbjsgc2NyaXB0czogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgZGV0ZWN0ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbc2NyaXB0TmFtZSwgcGF0dGVybl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5TQ1JJUFRfUEFUVEVSTlMpKSB7XG4gICAgICBpZiAocGF0dGVybi50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIGRldGVjdGVkU2NyaXB0cy5wdXNoKHNjcmlwdE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnNpZGVyIGl0IHN1c3BpY2lvdXMgaWY6XG4gICAgLy8gMS4gTW9yZSB0aGFuIDMgc2NyaXB0cyBhcmUgbWl4ZWQgKGxlZ2l0aW1hdGUgdGV4dCByYXJlbHkgbWl4ZXMgPjMgc2NyaXB0cylcbiAgICAvLyAyLiBDb250ZW50IGNvbnRhaW5zIExhdGluICsgQ3lyaWxsaWMgKGhvbW9nbHlwaCBhdHRhY2sg4oCUIEN5cmlsbGljINCwL9C+L9GAIGxvb2sgaWRlbnRpY2FsIHRvIExhdGluKVxuICAgIC8vIE5vdGU6IExhdGluICsgQ0pLIGlzIGNvbW1vbiBhbmQgbGVnaXRpbWF0ZSAoZS5nLiwgQ2hpbmVzZSB3aXRoIEVuZ2xpc2gpXG4gICAgLy8gTm90ZTogTGF0aW4gKyBHcmVlayBpcyBjb21tb24gYW5kIGxlZ2l0aW1hdGUgKGUuZy4sIM6xLCDOsiwgzrMsIM+ALCDOoywgzpQgaW4gbWF0aC9zY2llbmNlKVxuICAgIGNvbnN0IGlzU3VzcGljaW91cyA9IGRldGVjdGVkU2NyaXB0cy5sZW5ndGggPiAzIHx8XG4gICAgICAoZGV0ZWN0ZWRTY3JpcHRzLmluY2x1ZGVzKCdMQVRJTicpICYmIGRldGVjdGVkU2NyaXB0cy5sZW5ndGggPiAxICYmXG4gICAgICAgZGV0ZWN0ZWRTY3JpcHRzLmluY2x1ZGVzKCdDWVJJTExJQycpKTtcblxuICAgIHJldHVybiB7IGlzU3VzcGljaW91cywgc2NyaXB0czogZGV0ZWN0ZWRTY3JpcHRzIH07XG4gIH1cblxuICAvKipcbiAgICogRXNjYWxhdGUgc2V2ZXJpdHkgbGV2ZWwgKGhpZ2hlciBzZXZlcml0eSB0YWtlcyBwcmVjZWRlbmNlKVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXNjYWxhdGVTZXZlcml0eShcbiAgICBjdXJyZW50OiAnbG93JyB8ICdtZWRpdW0nIHwgJ2hpZ2gnIHwgJ2NyaXRpY2FsJyB8IHVuZGVmaW5lZCwgXG4gICAgbmV3U2V2ZXJpdHk6ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnXG4gICk6ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnIHtcbiAgICBjb25zdCBzZXZlcml0eUxldmVscyA9IHsgbG93OiAxLCBtZWRpdW06IDIsIGhpZ2g6IDMsIGNyaXRpY2FsOiA0IH07XG4gICAgY29uc3QgY3VycmVudExldmVsID0gY3VycmVudCA/IHNldmVyaXR5TGV2ZWxzW2N1cnJlbnRdIDogMDtcbiAgICBjb25zdCBuZXdMZXZlbCA9IHNldmVyaXR5TGV2ZWxzW25ld1NldmVyaXR5XTtcbiAgICBcbiAgICByZXR1cm4gbmV3TGV2ZWwgPiBjdXJyZW50TGV2ZWwgPyBuZXdTZXZlcml0eSA6IChjdXJyZW50IHx8ICdsb3cnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc2NhcGUgc3BlY2lhbCByZWdleCBjaGFyYWN0ZXJzIGZvciBzYWZlIHJlcGxhY2VtZW50XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBlc2NhcGVSZWdleChzdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNvbnRlbnQgY29udGFpbnMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIFVuaWNvZGUgcGF0dGVybnNcbiAgICovXG4gIHN0YXRpYyBjb250YWluc0Rhbmdlcm91c1VuaWNvZGUoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gUXVpY2sgY2hlY2sgZm9yIG9idmlvdXNseSBkYW5nZXJvdXMgcGF0dGVybnNcbiAgICByZXR1cm4gdGhpcy5ESVJFQ1RJT05fT1ZFUlJJREVfQ0hBUlMudGVzdChjb250ZW50KSB8fFxuICAgICAgICAgICB0aGlzLlpFUk9fV0lEVEhfQ0hBUlMudGVzdChjb250ZW50KSB8fFxuICAgICAgICAgICB0aGlzLk5PTl9QUklOVEFCTEVfQ0hBUlMudGVzdChjb250ZW50KSB8fFxuICAgICAgICAgICB0aGlzLmhhc0V4Y2Vzc2l2ZVVuaWNvZGVFc2NhcGVzKGNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGNvbnRlbnQgaGFzIGV4Y2Vzc2l2ZSBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXNcbiAgICogUHJldmVudHMgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBieSBzYWZlbHkgY2hlY2tpbmcgbWF0Y2ggcmVzdWx0c1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaGFzRXhjZXNzaXZlVW5pY29kZUVzY2FwZXMoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2goL1xcXFx1WzAtOWEtZkEtRl17NH0vZyk7XG4gICAgcmV0dXJuIG1hdGNoZXMgIT09IG51bGwgJiYgbWF0Y2hlcy5sZW5ndGggPiAxMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYWZlbHkgY2hlY2sgZm9yIG1hbGZvcm1lZCBzdXJyb2dhdGUgcGFpcnMgd2l0aG91dCBSZURvUyB2dWxuZXJhYmlsaXR5XG4gICAqIFVzZXMgY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciB2YWxpZGF0aW9uIGluc3RlYWQgb2YgY29tcGxleCByZWdleFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaGFzTWFsZm9ybWVkU3Vycm9nYXRlcyhjb250ZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIFNPTkFSQ0xPVUQgRkFMU0UgUE9TSVRJVkUgKFM3NzU4KTogTXVzdCB1c2UgY2hhckNvZGVBdCBoZXJlLCBub3QgY29kZVBvaW50QXRcbiAgICAgIC8vIFRoaXMgY29kZSBzcGVjaWZpY2FsbHkgY2hlY2tzIGZvciBtYWxmb3JtZWQgc3Vycm9nYXRlIHBhaXJzIGF0IHRoZSAxNi1iaXQgY29kZSB1bml0IGxldmVsLlxuICAgICAgLy8gY29kZVBvaW50QXQoKSB3b3VsZCBhdXRvbWF0aWNhbGx5IGNvbWJpbmUgdmFsaWQgcGFpcnMsIG1ha2luZyBtYWxmb3JtZWQgZGV0ZWN0aW9uIGltcG9zc2libGUuXG4gICAgICBjb25zdCBjaGFyID0gY29udGVudC5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAvLyBIaWdoIHN1cnJvZ2F0ZSAoVStEODAwLVUrREJGRilcbiAgICAgIGlmIChjaGFyID49IDB4RDgwMCAmJiBjaGFyIDw9IDB4REJGRikge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGZvbGxvd2VkIGJ5IGEgbG93IHN1cnJvZ2F0ZVxuICAgICAgICBpZiAoaSArIDEgPj0gY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gSGlnaCBzdXJyb2dhdGUgYXQgZW5kIG9mIHN0cmluZ1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gY29udGVudC5jaGFyQ29kZUF0KGkgKyAxKTtcbiAgICAgICAgaWYgKG5leHRDaGFyIDwgMHhEQzAwIHx8IG5leHRDaGFyID4gMHhERkZGKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEhpZ2ggc3Vycm9nYXRlIG5vdCBmb2xsb3dlZCBieSBsb3cgc3Vycm9nYXRlXG4gICAgICAgIH1cbiAgICAgICAgaSsrOyAvLyBTa2lwIHRoZSB2YWxpZCBsb3cgc3Vycm9nYXRlXG4gICAgICB9XG4gICAgICAvLyBMb3cgc3Vycm9nYXRlIChVK0RDMDAtVStERkZGKSB3aXRob3V0IHByZWNlZGluZyBoaWdoIHN1cnJvZ2F0ZVxuICAgICAgZWxzZSBpZiAoY2hhciA+PSAweERDMDAgJiYgY2hhciA8PSAweERGRkYpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIFVucGFpcmVkIGxvdyBzdXJyb2dhdGVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzYWZlIHByZXZpZXcgb2YgVW5pY29kZSBjb250ZW50IGZvciBsb2dnaW5nXG4gICAqL1xuICBzdGF0aWMgZ2V0U2FmZVByZXZpZXcoY29udGVudDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlciA9IDEwMCk6IHN0cmluZyB7XG4gICAgLy8gUmVtb3ZlIGRhbmdlcm91cyBVbmljb2RlIGNoYXJhY3RlcnMgYW5kIHRydW5jYXRlIGZvciBzYWZlIGxvZ2dpbmdcbiAgICBjb25zdCBjbGVhbmVkID0gY29udGVudFxuICAgICAgLnJlcGxhY2UodGhpcy5ESVJFQ1RJT05fT1ZFUlJJREVfQ0hBUlMsICdbRElSXScpXG4gICAgICAucmVwbGFjZSh0aGlzLlpFUk9fV0lEVEhfQ0hBUlMsICdbWlddJylcbiAgICAgIC5yZXBsYWNlKHRoaXMuTk9OX1BSSU5UQUJMRV9DSEFSUywgJ1tOUF0nKTtcbiAgICBcbiAgICByZXR1cm4gY2xlYW5lZC5sZW5ndGggPiBtYXhMZW5ndGggPyBcbiAgICAgIGNsZWFuZWQuc3Vic3RyaW5nKDAsIG1heExlbmd0aCkgKyAnLi4uJyA6IFxuICAgICAgY2xlYW5lZDtcbiAgfVxufVxuIl19
|
|
326
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pY29kZVZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFTbkQsTUFBTSxPQUFPLGdCQUFnQjtJQUMzQjs7T0FFRztJQUVIOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFVLHdCQUF3QixHQUFHLCtCQUErQixDQUFDO0lBRW5GOzs7OztPQUtHO0lBQ0ssTUFBTSxDQUFVLGdCQUFnQixHQUFHLHFDQUFxQyxDQUFDO0lBRWpGOzs7OztPQUtHO0lBQ0gsOEdBQThHO0lBQ3RHLE1BQU0sQ0FBVSxtQkFBbUIsR0FBRyxvRUFBb0UsQ0FBQyxDQUFDLGdGQUFnRjtJQUVwTTs7Ozs7O09BTUc7SUFDSyxNQUFNLENBQVUsbUJBQW1CLEdBQXdCLElBQUksR0FBRyxDQUFDO1FBQ3pFLG9CQUFvQjtRQUNwQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDbEYsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ2xGLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUUxRCwyQkFBMkI7UUFDM0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ2xGLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNuRixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDbEYsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ3BDLDBFQUEwRTtRQUMxRSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUM7UUFDbkYsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1FBQ25GLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQztRQUVqRCxpREFBaUQ7UUFDakQsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1FBQ2hWLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztRQUVoVixxQ0FBcUM7UUFDckMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBRTlDLDJCQUEyQjtRQUMzQixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDdEUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBRTVELHVCQUF1QjtRQUN2QixDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDdFQsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO1FBQ3RULENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztLQUN2SCxDQUFDLENBQUM7SUFFSDs7O09BR0c7SUFDSyxNQUFNLENBQVUsZUFBZSxHQUFHO1FBQ3hDLDZIQUE2SDtRQUM3SCxLQUFLLEVBQUUsd0RBQXdELEVBQUUsK0ZBQStGO1FBQ2hL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QVEsR0FBRyxNQUFNLElBQUksUUFBUSxHQUFHLE1BQU0sRUFBRSxDQUFDO29CQUMzQyxPQUFPLElBQUksQ0FBQyxDQUFDLCtDQUErQztnQkFDOUQsQ0FBQztnQkFDRCxDQUFDLEVBQUUsQ0FBQyxDQUFDLCtCQUErQjtZQUN0QyxDQUFDO1lBQ0QsaUVBQWlFO2lCQUM1RCxJQUFJLElBQUksSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUMxQyxPQUFPLElBQUksQ0FBQyxDQUFDLHlCQUF5QjtZQUN4QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFlLEVBQUUsWUFBb0IsR0FBRztRQUM1RCxvRUFBb0U7UUFDcEUsTUFBTSxPQUFPLEdBQUcsT0FBTzthQUNwQixPQUFPLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQzthQUMvQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQzthQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTdDLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQztZQUNqQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUN6QyxPQUFPLENBQUM7SUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVbmljb2RlIFZhbGlkYXRvciBmb3IgRG9sbGhvdXNlTUNQXG4gKiBcbiAqIFByZXZlbnRzIFVuaWNvZGUtYmFzZWQgYnlwYXNzIGF0dGFja3MgaW5jbHVkaW5nOlxuICogLSBIb21vZ3JhcGggYXR0YWNrcyAodmlzdWFsbHkgc2ltaWxhciBjaGFyYWN0ZXJzKVxuICogLSBEaXJlY3Rpb24gb3ZlcnJpZGUgYXR0YWNrcyAoUkxPL0xSTylcbiAqIC0gTWl4ZWQgc2NyaXB0IGF0dGFja3NcbiAqIC0gWmVyby13aWR0aCBjaGFyYWN0ZXIgaW5qZWN0aW9uXG4gKiAtIFVuaWNvZGUgbm9ybWFsaXphdGlvbiBieXBhc3Nlc1xuICogXG4gKiBTZWN1cml0eTogU0VDLTAwMSAtIFVuaWNvZGUgYXR0YWNrIHByZXZlbnRpb25cbiAqL1xuXG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgZXNjYWxhdGVTZXZlcml0eSB9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVW5pY29kZVZhbGlkYXRpb25SZXN1bHQge1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICBub3JtYWxpemVkQ29udGVudDogc3RyaW5nO1xuICBkZXRlY3RlZElzc3Vlcz86IHN0cmluZ1tdO1xuICBzZXZlcml0eT86ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnO1xufVxuXG5leHBvcnQgY2xhc3MgVW5pY29kZVZhbGlkYXRvciB7XG4gIC8qKlxuICAgKiBVbmljb2RlIGF0dGFjayBwYXR0ZXJucyBhbmQgY29uZnVzYWJsZSBjaGFyYWN0ZXJzXG4gICAqL1xuICBcbiAgLyoqXG4gICAqIERpcmVjdGlvbiBvdmVycmlkZSBjaGFyYWN0ZXJzIHRoYXQgY2FuIGhpZGUgb3IgcmV2ZXJzZSB0ZXh0IGRpc3BsYXlcbiAgICogQHNlZSBodHRwczovL3VuaWNvZGUub3JnL3JlcG9ydHMvdHI5LyNEaXJlY3Rpb25hbF9Gb3JtYXR0aW5nX0NoYXJhY3RlcnNcbiAgICogVSsyMDJBLVUrMjAyRTogTGVmdC9SaWdodCBlbWJlZGRpbmcgYW5kIG92ZXJyaWRlIG1hcmtzIChMUkUsIFJMRSwgUERGLCBMUk8sIFJMTylcbiAgICogVSsyMDY2LVUrMjA2OTogSXNvbGF0ZSBmb3JtYXR0aW5nIGNoYXJhY3RlcnMgKExSSSwgUkxJLCBGU0ksIFBESSlcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERJUkVDVElPTl9PVkVSUklERV9DSEFSUyA9IC9bXFx1MjAyQS1cXHUyMDJFXFx1MjA2Ni1cXHUyMDY5XS9nO1xuICBcbiAgLyoqXG4gICAqIFplcm8td2lkdGggYW5kIGludmlzaWJsZSBmb3JtYXR0aW5nIGNoYXJhY3RlcnMgb2Z0ZW4gdXNlZCB0byBoaWRlIHBheWxvYWRzXG4gICAqIFUrMjAwQi1VKzIwMEY6IFplcm8td2lkdGggc3BhY2VzIGFuZCBkaXJlY3Rpb25hbCBtYXJrc1xuICAgKiBVKzIwMjgtVSsyMDJGOiBMaW5lL3BhcmFncmFwaCBzZXBhcmF0b3JzIGFuZCBmb3JtYXR0aW5nIGNoYXJhY3RlcnNcbiAgICogVStGRUZGOiBaZXJvLXdpZHRoIG5vLWJyZWFrIHNwYWNlIChCeXRlIE9yZGVyIE1hcmspXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBaRVJPX1dJRFRIX0NIQVJTID0gL1tcXHUyMDBCLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHVGRUZGXS9nO1xuICBcbiAgLyoqXG4gICAqIE5vbi1wcmludGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIG5vdCBhcHBlYXIgaW4gbm9ybWFsIHRleHRcbiAgICogVSswMDAwLVUrMDAwOCwgVSswMDBCLVUrMDAwQywgVSswMDBFLVUrMDAxRjogQzAgY29udHJvbCBjb2RlcyAoZXhjZXB0IFRBQiwgTEYsIENSKVxuICAgKiBVKzAwN0YtVSswMDlGOiBEZWxldGUgYW5kIEMxIGNvbnRyb2wgY29kZXNcbiAgICogVStGRkZFLVUrRkZGRjogTm9uLWNoYXJhY3RlcnMgdGhhdCBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIHZhbGlkIHRleHRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIEludGVudGlvbmFsbHkgbWF0Y2hpbmcgY29udHJvbCBjaGFycyBmb3Igc2VjdXJpdHkgc2FuaXRpemF0aW9uXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE5PTl9QUklOVEFCTEVfQ0hBUlMgPSAvW1xcdTAwMDAtXFx1MDAwOFxcdTAwMEJcXHUwMDBDXFx1MDAwRS1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1RkZGRVxcdUZGRkZdL2c7IC8vIE5PU09OQVIgLSBJbnRlbnRpb25hbGx5IG1hdGNoaW5nIGNvbnRyb2wgY2hhcmFjdGVycyBmb3Igc2VjdXJpdHkgc2FuaXRpemF0aW9uXG4gIFxuICAvKipcbiAgICogQ29tbW9uIGhvbW9ncmFwaC9jb25mdXNhYmxlIGNoYXJhY3RlciBtYXBwaW5nc1xuICAgKiBNYXBzIHZpc3VhbGx5IHNpbWlsYXIgVW5pY29kZSBjaGFyYWN0ZXJzIHRvIHRoZWlyIEFTQ0lJIGVxdWl2YWxlbnRzLlxuICAgKiBQZXJmb3JtYW5jZTogfjExMCBlbnRyaWVzOyByZXBsYWNlQ29uZnVzYWJsZXMoKSBpdGVyYXRlcyB0aGUgZnVsbCBtYXBcbiAgICogcGVyIGNhbGwgYnV0IHVzZXMgTWFwLmhhcygpIGxvb2t1cHMgKE8oMSkgcGVyIGNoYXIpLiBOZWdsaWdpYmxlIGF0XG4gICAqIGN1cnJlbnQgc2l6ZSDigJQgcHJvZmlsZSBiZWZvcmUgb3B0aW1pemluZyBpZiB0aGUgbWFwIGdyb3dzIGJleW9uZCB+NTAwLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQ09ORlVTQUJMRV9NQVBQSU5HUzogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoW1xuICAgIC8vIEN5cmlsbGljIHRvIExhdGluXG4gICAgWyfQsCcsICdhJ10sIFsn0LUnLCAnZSddLCBbJ9C+JywgJ28nXSwgWyfRgCcsICdwJ10sIFsn0YEnLCAnYyddLCBbJ9GFJywgJ3gnXSwgWyfRgycsICd5J10sXG4gICAgWyfQkCcsICdBJ10sIFsn0JInLCAnQiddLCBbJ9CVJywgJ0UnXSwgWyfQmicsICdLJ10sIFsn0JwnLCAnTSddLCBbJ9CdJywgJ0gnXSwgWyfQnicsICdPJ10sIFxuICAgIFsn0KAnLCAnUCddLCBbJ9ChJywgJ0MnXSwgWyfQoicsICdUJ10sIFsn0KMnLCAnWSddLCBbJ9ClJywgJ1gnXSxcbiAgICBcbiAgICAvLyBHcmVlayBsb3dlcmNhc2UgdG8gTGF0aW5cbiAgICBbJ86xJywgJ2EnXSwgWyfOsicsICdiJ10sIFsnzrMnLCAnZyddLCBbJ860JywgJ2QnXSwgWyfOtScsICdlJ10sIFsnzrYnLCAneiddLCBbJ863JywgJ2gnXSxcbiAgICBbJ864JywgJ3RoJ10sIFsnzrknLCAnaSddLCBbJ866JywgJ2snXSwgWyfOuycsICdsJ10sIFsnzrwnLCAnbSddLCBbJ869JywgJ24nXSwgWyfOvicsICd4J10sXG4gICAgWyfOvycsICdvJ10sIFsnz4AnLCAncCddLCBbJ8+BJywgJ3InXSwgWyfPgycsICdzJ10sIFsnz4QnLCAndCddLCBbJ8+FJywgJ3UnXSwgWyfPhicsICdmJ10sXG4gICAgWyfPhycsICdjaCddLCBbJ8+IJywgJ3BzJ10sIFsnz4knLCAndyddLFxuICAgIC8vIEdyZWVrIHVwcGVyY2FzZSB0byBMYXRpbiDigJQgdmlzdWFsbHkgaWRlbnRpY2FsIHRvIExhdGluIGNhcGl0YWxzICgjMTc4MilcbiAgICBbJ1xcdTAzOTEnLCAnQSddLCBbJ1xcdTAzOTInLCAnQiddLCBbJ1xcdTAzOTUnLCAnRSddLCBbJ1xcdTAzOTcnLCAnSCddLCBbJ1xcdTAzOTknLCAnSSddLFxuICAgIFsnXFx1MDM5QScsICdLJ10sIFsnXFx1MDM5QycsICdNJ10sIFsnXFx1MDM5RCcsICdOJ10sIFsnXFx1MDM5RicsICdPJ10sIFsnXFx1MDNBMScsICdQJ10sXG4gICAgWydcXHUwM0E0JywgJ1QnXSwgWydcXHUwM0E1JywgJ1knXSwgWydcXHUwM0E3JywgJ1gnXSxcbiAgICBcbiAgICAvLyBNYXRoZW1hdGljYWwgc3ltYm9scyB0byBBU0NJSSAodmFyaW91cyBzdHlsZXMpXG4gICAgWyfwnZKCJywgJ2EnXSwgWyfwnZKDJywgJ2InXSwgWyfwnZKEJywgJ2MnXSwgWyfwnZKFJywgJ2QnXSwgWyfwnZKGJywgJ2UnXSwgWyfwnZKHJywgJ2YnXSwgWyfwnZKIJywgJ2cnXSwgWyfwnZKJJywgJ2gnXSwgWyfwnZKKJywgJ2knXSwgWyfwnZKLJywgJ2onXSwgWyfwnZKMJywgJ2snXSwgWyfwnZKNJywgJ2wnXSwgWyfwnZKOJywgJ20nXSwgWyfwnZKPJywgJ24nXSwgWyfwnZKQJywgJ28nXSwgWyfwnZKRJywgJ3AnXSwgWyfwnZKSJywgJ3EnXSwgWyfwnZKTJywgJ3InXSwgWyfwnZKUJywgJ3MnXSwgWyfwnZKVJywgJ3QnXSwgWyfwnZKWJywgJ3UnXSwgWyfwnZKXJywgJ3YnXSwgWyfwnZKYJywgJ3cnXSwgWyfwnZKZJywgJ3gnXSwgWyfwnZKaJywgJ3knXSwgWyfwnZKbJywgJ3onXSxcbiAgICBbJ/CdkJonLCAnYSddLCBbJ/CdkJsnLCAnYiddLCBbJ/CdkJwnLCAnYyddLCBbJ/CdkJ0nLCAnZCddLCBbJ/CdkJ4nLCAnZSddLCBbJ/CdkJ8nLCAnZiddLCBbJ/CdkKAnLCAnZyddLCBbJ/CdkKEnLCAnaCddLCBbJ/CdkKInLCAnaSddLCBbJ/CdkKMnLCAnaiddLCBbJ/CdkKQnLCAnayddLCBbJ/CdkKUnLCAnbCddLCBbJ/CdkKYnLCAnbSddLCBbJ/CdkKcnLCAnbiddLCBbJ/CdkKgnLCAnbyddLCBbJ/CdkKknLCAncCddLCBbJ/CdkKonLCAncSddLCBbJ/CdkKsnLCAnciddLCBbJ/CdkKwnLCAncyddLCBbJ/CdkK0nLCAndCddLCBbJ/CdkK4nLCAndSddLCBbJ/CdkK8nLCAndiddLCBbJ/CdkLAnLCAndyddLCBbJ/CdkLEnLCAneCddLCBbJ/CdkLInLCAneSddLCBbJ/CdkLMnLCAneiddLFxuICAgIFxuICAgIC8vIFNwZWNpYWwgaSB2YXJpYW50cyAoVHVya2lzaCwgZXRjLilcbiAgICBbJ8SxJywgJ2knXSwgWyfEsCcsICdJJ10sIFsn0ZYnLCAnaSddLCBbJ9OAJywgJ0knXSxcbiAgICBcbiAgICAvLyBPdGhlciBjb21tb24gY29uZnVzYWJsZXNcbiAgICBbJ8edJywgJ2UnXSwgWyfJkCcsICdhJ10sIFsnyZQnLCAnbyddLCBbJ8qHJywgJ3QnXSwgWyfKjCcsICd2J10sIFsnyo0nLCAndyddLFxuICAgIFsn4oSDJywgJ0MnXSwgWyfihIknLCAnRiddLCBbJ+KElicsICdObyddLCBbJ+KEoicsICdUTSddLCBbJ8KuJywgJ1InXSxcbiAgICBcbiAgICAvLyBGdWxsd2lkdGggY2hhcmFjdGVyc1xuICAgIFsn77yhJywgJ0EnXSwgWyfvvKInLCAnQiddLCBbJ++8oycsICdDJ10sIFsn77ykJywgJ0QnXSwgWyfvvKUnLCAnRSddLCBbJ++8picsICdGJ10sIFsn77ynJywgJ0cnXSwgWyfvvKgnLCAnSCddLCBbJ++8qScsICdJJ10sIFsn77yqJywgJ0onXSwgWyfvvKsnLCAnSyddLCBbJ++8rCcsICdMJ10sIFsn77ytJywgJ00nXSwgWyfvvK4nLCAnTiddLCBbJ++8rycsICdPJ10sIFsn77ywJywgJ1AnXSwgWyfvvLEnLCAnUSddLCBbJ++8sicsICdSJ10sIFsn77yzJywgJ1MnXSwgWyfvvLQnLCAnVCddLCBbJ++8tScsICdVJ10sIFsn77y2JywgJ1YnXSwgWyfvvLcnLCAnVyddLCBbJ++8uCcsICdYJ10sIFsn77y5JywgJ1knXSwgWyfvvLonLCAnWiddLFxuICAgIFsn772BJywgJ2EnXSwgWyfvvYInLCAnYiddLCBbJ++9gycsICdjJ10sIFsn772EJywgJ2QnXSwgWyfvvYUnLCAnZSddLCBbJ++9hicsICdmJ10sIFsn772HJywgJ2cnXSwgWyfvvYgnLCAnaCddLCBbJ++9iScsICdpJ10sIFsn772KJywgJ2onXSwgWyfvvYsnLCAnayddLCBbJ++9jCcsICdsJ10sIFsn772NJywgJ20nXSwgWyfvvY4nLCAnbiddLCBbJ++9jycsICdvJ10sIFsn772QJywgJ3AnXSwgWyfvvZEnLCAncSddLCBbJ++9kicsICdyJ10sIFsn772TJywgJ3MnXSwgWyfvvZQnLCAndCddLCBbJ++9lScsICd1J10sIFsn772WJywgJ3YnXSwgWyfvvZcnLCAndyddLCBbJ++9mCcsICd4J10sIFsn772ZJywgJ3knXSwgWyfvvZonLCAneiddLFxuICAgIFsn77yQJywgJzAnXSwgWyfvvJEnLCAnMSddLCBbJ++8kicsICcyJ10sIFsn77yTJywgJzMnXSwgWyfvvJQnLCAnNCddLCBbJ++8lScsICc1J10sIFsn77yWJywgJzYnXSwgWyfvvJcnLCAnNyddLCBbJ++8mCcsICc4J10sIFsn77yZJywgJzknXSxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIFNjcmlwdCBtaXhpbmcgZGV0ZWN0aW9uIHBhdHRlcm5zXG4gICAqIERldGVjdHMgc3VzcGljaW91cyBtaXhpbmcgb2YgZGlmZmVyZW50IFVuaWNvZGUgc2NyaXB0c1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0NSSVBUX1BBVFRFUk5TID0ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIEludGVudGlvbmFsbHkgaW5jbHVkZXMgY29udHJvbCBjaGFycyBmb3IgY29tcHJlaGVuc2l2ZSBMYXRpbiBzY3JpcHQgZGV0ZWN0aW9uXG4gICAgTEFUSU46IC9bXFx1MDAwMC1cXHUwMDdGXFx1MDBBMC1cXHUwMEZGXFx1MDEwMC1cXHUwMTdGXFx1MDE4MC1cXHUwMjRGXS8sIC8vIE5PU09OQVIgLSBJbnRlbnRpb25hbGx5IGluY2x1ZGVzIGNvbnRyb2wgY2hhcmFjdGVycyBmb3IgY29tcHJlaGVuc2l2ZSBMYXRpbiBzY3JpcHQgZGV0ZWN0aW9uXG4gICAgLy8gVXNlIGFsdGVybmF0aW9uIHRvIGF2b2lkIFNvbmFyQ2xvdWQgdGhpbmtpbmcgXFx1MDUyRlxcdTJERTAgaXMgYSBjb21iaW5lZCBjaGFyYWN0ZXJcbiAgICBDWVJJTExJQzogLyg/OltcXHUwNDAwLVxcdTA0RkZdfFtcXHUwNTAwLVxcdTA1MkZdfFtcXHUyREUwLVxcdTJERkZdfFtcXHVBNjQwLVxcdUE2OUZdKS8sXG4gICAgR1JFRUs6IC9bXFx1MDM3MC1cXHUwM0ZGXFx1MUYwMC1cXHUxRkZGXS8sXG4gICAgQVJBQklDOiAvW1xcdTA2MDAtXFx1MDZGRlxcdTA3NTAtXFx1MDc3RlxcdTA4QTAtXFx1MDhGRlxcdUZCNTAtXFx1RkRGRlxcdUZFNzAtXFx1RkVGRl0vLFxuICAgIEhFQlJFVzogL1tcXHUwNTkwLVxcdTA1RkZcXHVGQjFELVxcdUZCNEZdLyxcbiAgICBDSks6IC9bXFx1MkU4MC1cXHUyRUZGXFx1MkYwMC1cXHUyRkRGXFx1MzAwMC1cXHUzMDNGXFx1MzA0MC1cXHUzMDlGXFx1MzBBMC1cXHUzMEZGXFx1MzEwMC1cXHUzMTJGXFx1MzEzMC1cXHUzMThGXFx1MzE5MC1cXHUzMTlGXFx1MzFBMC1cXHUzMUJGXFx1MzFDMC1cXHUzMUVGXFx1MzFGMC1cXHUzMUZGXFx1MzIwMC1cXHUzMkZGXFx1MzMwMC1cXHUzM0ZGXFx1MzQwMC1cXHU0REJGXFx1NERDMC1cXHU0REZGXFx1NEUwMC1cXHU5RkZGXS8sXG4gIH07XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSBVbmljb2RlIGNvbnRlbnQgdG8gcHJldmVudCBieXBhc3MgYXR0YWNrc1xuICAgKi9cbiAgc3RhdGljIG5vcm1hbGl6ZShjb250ZW50OiBzdHJpbmcpOiBVbmljb2RlVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgaXNzdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBub3JtYWxpemVkID0gY29udGVudDtcbiAgICBsZXQgc2V2ZXJpdHk6ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnID0gJ2xvdyc7XG5cbiAgICB0cnkge1xuICAgICAgLy8gMS4gRGV0ZWN0IGFuZCBsb2cgc3VzcGljaW91cyBVbmljb2RlIHBhdHRlcm5zIGJlZm9yZSBub3JtYWxpemF0aW9uXG4gICAgICBjb25zdCBzdXNwaWNpb3VzUGF0dGVybnMgPSB0aGlzLmRldGVjdFN1c3BpY2lvdXNQYXR0ZXJucyhjb250ZW50KTtcbiAgICAgIGlzc3Vlcy5wdXNoKC4uLnN1c3BpY2lvdXNQYXR0ZXJucy5pc3N1ZXMpO1xuICAgICAgaWYgKHN1c3BpY2lvdXNQYXR0ZXJucy5zZXZlcml0eSkge1xuICAgICAgICBzZXZlcml0eSA9IGVzY2FsYXRlU2V2ZXJpdHkoc2V2ZXJpdHksIHN1c3BpY2lvdXNQYXR0ZXJucy5zZXZlcml0eSk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIFJlbW92ZSBkaXJlY3Rpb24gb3ZlcnJpZGUgY2hhcmFjdGVycyAocHJldmVudHMgUkxPL0xSTyBhdHRhY2tzKVxuICAgICAgaWYgKHRoaXMuRElSRUNUSU9OX09WRVJSSURFX0NIQVJTLnRlc3Qobm9ybWFsaXplZCkpIHtcbiAgICAgICAgaXNzdWVzLnB1c2goJ0RpcmVjdGlvbiBvdmVycmlkZSBjaGFyYWN0ZXJzIGRldGVjdGVkJyk7XG4gICAgICAgIHNldmVyaXR5ID0gZXNjYWxhdGVTZXZlcml0eShzZXZlcml0eSwgJ2hpZ2gnKTtcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSh0aGlzLkRJUkVDVElPTl9PVkVSUklERV9DSEFSUywgJycpO1xuICAgICAgICBcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdVTklDT0RFX0RJUkVDVElPTl9PVkVSUklERScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICdVbmljb2RlVmFsaWRhdG9yJyxcbiAgICAgICAgICBkZXRhaWxzOiAnRGlyZWN0aW9uIG92ZXJyaWRlIGNoYXJhY3RlcnMgcmVtb3ZlZCBmcm9tIGNvbnRlbnQnXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiBSZW1vdmUgemVyby13aWR0aCBhbmQgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzXG4gICAgICBpZiAodGhpcy5aRVJPX1dJRFRIX0NIQVJTLnRlc3Qobm9ybWFsaXplZCkgfHwgdGhpcy5OT05fUFJJTlRBQkxFX0NIQVJTLnRlc3Qobm9ybWFsaXplZCkpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHplcm8td2lkdGggY2hhcnMgaW5jbHVkZSBkaXJlY3Rpb24gbWFya3MgKFUrMjAwRSwgVSsyMDBGKVxuICAgICAgICBjb25zdCBoYXNEaXJlY3Rpb25NYXJrcyA9IC9bXFx1MjAwRVxcdTIwMEZdLy50ZXN0KG5vcm1hbGl6ZWQpO1xuICAgICAgICBpZiAoaGFzRGlyZWN0aW9uTWFya3MpIHtcbiAgICAgICAgICBpc3N1ZXMucHVzaCgnRGlyZWN0aW9uIG1hcmtzIChMUk0vUkxNKSBkZXRlY3RlZCcpO1xuICAgICAgICAgIHNldmVyaXR5ID0gZXNjYWxhdGVTZXZlcml0eShzZXZlcml0eSwgJ2hpZ2gnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpc3N1ZXMucHVzaCgnWmVyby13aWR0aCBvciBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgZGV0ZWN0ZWQnKTtcbiAgICAgICAgICBzZXZlcml0eSA9IGVzY2FsYXRlU2V2ZXJpdHkoc2V2ZXJpdHksICdtZWRpdW0nKTtcbiAgICAgICAgfVxuICAgICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZFxuICAgICAgICAgIC5yZXBsYWNlKHRoaXMuWkVST19XSURUSF9DSEFSUywgJycpXG4gICAgICAgICAgLnJlcGxhY2UodGhpcy5OT05fUFJJTlRBQkxFX0NIQVJTLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIEFwcGx5IFVuaWNvZGUgbm9ybWFsaXphdGlvbiAoTkZDIC0gQ2Fub25pY2FsIERlY29tcG9zaXRpb24gKyBDb21wb3NpdGlvbilcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLm5vcm1hbGl6ZSgnTkZDJyk7XG5cbiAgICAgIC8vIDUuIERldGVjdCBtaXhlZCBzY3JpcHQgYXR0YWNrcyBCRUZPUkUgY29uZnVzYWJsZSByZXBsYWNlbWVudFxuICAgICAgY29uc3QgbWl4ZWRTY3JpcHRSZXN1bHQgPSB0aGlzLmRldGVjdE1peGVkU2NyaXB0cyhub3JtYWxpemVkKTtcbiAgICAgIGlmIChtaXhlZFNjcmlwdFJlc3VsdC5pc1N1c3BpY2lvdXMpIHtcbiAgICAgICAgaXNzdWVzLnB1c2goYE1peGVkIHNjcmlwdCB1c2FnZSBkZXRlY3RlZDogJHttaXhlZFNjcmlwdFJlc3VsdC5zY3JpcHRzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIHNldmVyaXR5ID0gZXNjYWxhdGVTZXZlcml0eShzZXZlcml0eSwgJ2hpZ2gnKTtcbiAgICAgICAgXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVU5JQ09ERV9NSVhFRF9TQ1JJUFQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgc291cmNlOiAnVW5pY29kZVZhbGlkYXRvcicsXG4gICAgICAgICAgZGV0YWlsczogYE1peGVkIHNjcmlwdHMgZGV0ZWN0ZWQ6ICR7bWl4ZWRTY3JpcHRSZXN1bHQuc2NyaXB0cy5qb2luKCcsICcpfWBcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIDYuIEFsd2F5cyByZXBsYWNlIGNvbmZ1c2FibGUgY2hhcmFjdGVycyB3aXRoIEFTQ0lJIGVxdWl2YWxlbnRzIGZvciBzZWN1cml0eVxuICAgICAgLy8gVGhpcyBwcmV2ZW50cyBob21vZ3JhcGggYXR0YWNrcyByZWdhcmRsZXNzIG9mIHNjcmlwdCBtaXhpbmdcbiAgICAgIGNvbnN0IGNvbmZ1c2FibGVSZXN1bHQgPSB0aGlzLnJlcGxhY2VDb25mdXNhYmxlcyhub3JtYWxpemVkKTtcbiAgICAgIGlmIChjb25mdXNhYmxlUmVzdWx0Lmhhc0NvbmZ1c2FibGVzKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQgPSBjb25mdXNhYmxlUmVzdWx0Lm5vcm1hbGl6ZWQ7XG4gICAgICAgIGlzc3Vlcy5wdXNoKCdDb25mdXNhYmxlIFVuaWNvZGUgY2hhcmFjdGVycyBkZXRlY3RlZCBhbmQgbm9ybWFsaXplZCcpO1xuICAgICAgICBzZXZlcml0eSA9IGVzY2FsYXRlU2V2ZXJpdHkoc2V2ZXJpdHksICdtZWRpdW0nKTtcbiAgICAgICAgXG4gICAgICAgIC8vIExvZyBpZiB0aGlzIGhhcHBlbnMgaW4gbGVnaXRpbWF0ZSBtdWx0aWxpbmd1YWwgY29udGV4dFxuICAgICAgICBpZiAoIW1peGVkU2NyaXB0UmVzdWx0LmlzU3VzcGljaW91cykge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnVW5pY29kZVZhbGlkYXRvcicsXG4gICAgICAgICAgICBkZXRhaWxzOiAnQ29uZnVzYWJsZSBjaGFyYWN0ZXJzIG5vcm1hbGl6ZWQgaW4gbGVnaXRpbWF0ZSBtdWx0aWxpbmd1YWwgY29udGVudCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBpc3N1ZXMubGVuZ3RoID09PSAwLFxuICAgICAgICBub3JtYWxpemVkQ29udGVudDogbm9ybWFsaXplZCxcbiAgICAgICAgZGV0ZWN0ZWRJc3N1ZXM6IGlzc3Vlcy5sZW5ndGggPiAwID8gaXNzdWVzIDogdW5kZWZpbmVkLFxuICAgICAgICBzZXZlcml0eTogaXNzdWVzLmxlbmd0aCA+IDAgPyBzZXZlcml0eSA6IHVuZGVmaW5lZFxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdVbmljb2RlVmFsaWRhdG9yJyxcbiAgICAgICAgZGV0YWlsczogYFVuaWNvZGUgdmFsaWRhdGlvbiBmYWlsZWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWBcbiAgICAgIH0pO1xuXG4gICAgICAvLyBGYWxsYmFjazogcmV0dXJuIG9yaWdpbmFsIGNvbnRlbnQgaWYgbm9ybWFsaXphdGlvbiBmYWlsc1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIG5vcm1hbGl6ZWRDb250ZW50OiBjb250ZW50LFxuICAgICAgICBkZXRlY3RlZElzc3VlczogWydVbmljb2RlIHZhbGlkYXRpb24gZmFpbGVkJ10sXG4gICAgICAgIHNldmVyaXR5OiAnaGlnaCdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBzdXNwaWNpb3VzIFVuaWNvZGUgcGF0dGVybnMgdGhhdCBtaWdodCBpbmRpY2F0ZSBhdHRhY2tzXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBkZXRlY3RTdXNwaWNpb3VzUGF0dGVybnMoY29udGVudDogc3RyaW5nKTogeyBpc3N1ZXM6IHN0cmluZ1tdOyBzZXZlcml0eT86ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnIH0ge1xuICAgIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgc2V2ZXJpdHk6ICdsb3cnIHwgJ21lZGl1bScgfCAnaGlnaCcgfCAnY3JpdGljYWwnIHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGV4Y2Vzc2l2ZSBVbmljb2RlIGVzY2FwZXMgKHBvc3NpYmxlIGVuY29kaW5nIGJ5cGFzcylcbiAgICAvKipcbiAgICAgKiBQYXR0ZXJuIHRvIG1hdGNoIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlc1xuICAgICAqIFxcXFx1OiBMaXRlcmFsIGJhY2tzbGFzaCBmb2xsb3dlZCBieSAndSdcbiAgICAgKiBbMC05YS1mQS1GXXs0fTogRXhhY3RseSA0IGhleGFkZWNpbWFsIGRpZ2l0c1xuICAgICAqIFVzZWQgdG8gZGV0ZWN0IGF0dGVtcHRzIHRvIGJ5cGFzcyBmaWx0ZXJzIHVzaW5nIFxcdTAwNjFkbWluIHN0eWxlIGVuY29kaW5nXG4gICAgICovXG4gICAgY29uc3QgdW5pY29kZUVzY2FwZVBhdHRlcm4gPSAvXFxcXHVbMC05YS1mQS1GXXs0fS9nO1xuICAgIGNvbnN0IHVuaWNvZGVFc2NhcGVzID0gY29udGVudC5tYXRjaCh1bmljb2RlRXNjYXBlUGF0dGVybik7XG4gICAgaWYgKHVuaWNvZGVFc2NhcGVzICYmIHVuaWNvZGVFc2NhcGVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICBpc3N1ZXMucHVzaChgRXhjZXNzaXZlIFVuaWNvZGUgZXNjYXBlcyBkZXRlY3RlZCAoJHt1bmljb2RlRXNjYXBlcy5sZW5ndGh9KWApO1xuICAgICAgc2V2ZXJpdHkgPSAnaGlnaCc7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHN1c3BpY2lvdXMgVW5pY29kZSByYW5nZXMgdGhhdCBtaWdodCBoaWRlIGNvbnRlbnRcbiAgICBjb25zdCBzdXNwaWNpb3VzUmFuZ2VzID0gW1xuICAgICAgeyByYW5nZTogL1tcXHVFMDAwLVxcdUY4RkZdL2csIG5hbWU6ICdQcml2YXRlIFVzZSBBcmVhJyB9LFxuICAgICAgLy8gTm90ZTogUHJvcGVybHkgcGFpcmVkIHN1cnJvZ2F0ZSBwYWlycyBbXFx1RDgwMC1cXHVERkZGXSBhcmUgbm9ybWFsIGZvciBlbW9qaXNcbiAgICAgIHsgcmFuZ2U6IC9bXFx1RkREMC1cXHVGREVGXS9nLCBuYW1lOiAnTm9uLWNoYXJhY3RlcnMnIH0sXG4gICAgICB7IHJhbmdlOiAvW1xcdUZGRkVcXHVGRkZGXS9nLCBuYW1lOiAnTm9uLWNoYXJhY3RlcnMnIH1cbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCB7IHJhbmdlLCBuYW1lIH0gb2Ygc3VzcGljaW91c1Jhbmdlcykge1xuICAgICAgaWYgKHJhbmdlLnRlc3QoY29udGVudCkpIHtcbiAgICAgICAgaXNzdWVzLnB1c2goYFN1c3BpY2lvdXMgVW5pY29kZSByYW5nZSBkZXRlY3RlZDogJHtuYW1lfWApO1xuICAgICAgICBzZXZlcml0eSA9IGVzY2FsYXRlU2V2ZXJpdHkoc2V2ZXJpdHksICdtZWRpdW0nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbWFsZm9ybWVkIHN1cnJvZ2F0ZSBwYWlycyB1c2luZyBzYWZlIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgdmFsaWRhdGlvblxuICAgIC8vIFRoaXMgYXZvaWRzIFJlRG9TIHZ1bG5lcmFiaWxpdGllcyBmcm9tIGNvbXBsZXggcmVnZXggcGF0dGVybnNcbiAgICBpZiAodGhpcy5oYXNNYWxmb3JtZWRTdXJyb2dhdGVzKGNvbnRlbnQpKSB7XG4gICAgICBpc3N1ZXMucHVzaCgnTWFsZm9ybWVkIHN1cnJvZ2F0ZSBwYWlycyBkZXRlY3RlZCcpO1xuICAgICAgc2V2ZXJpdHkgPSBlc2NhbGF0ZVNldmVyaXR5KHNldmVyaXR5LCAnaGlnaCcpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGlzc3Vlcywgc2V2ZXJpdHkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIGNvbmZ1c2FibGUgVW5pY29kZSBjaGFyYWN0ZXJzIHdpdGggQVNDSUkgZXF1aXZhbGVudHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlcGxhY2VDb25mdXNhYmxlcyhjb250ZW50OiBzdHJpbmcpOiB7IG5vcm1hbGl6ZWQ6IHN0cmluZzsgaGFzQ29uZnVzYWJsZXM6IGJvb2xlYW4gfSB7XG4gICAgbGV0IG5vcm1hbGl6ZWQgPSBjb250ZW50O1xuICAgIGxldCBoYXNDb25mdXNhYmxlcyA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBbY29uZnVzYWJsZSwgcmVwbGFjZW1lbnRdIG9mIHRoaXMuQ09ORlVTQUJMRV9NQVBQSU5HUykge1xuICAgICAgaWYgKG5vcm1hbGl6ZWQuaW5jbHVkZXMoY29uZnVzYWJsZSkpIHtcbiAgICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZShuZXcgUmVnRXhwKHRoaXMuZXNjYXBlUmVnZXgoY29uZnVzYWJsZSksICdnJyksIHJlcGxhY2VtZW50KTtcbiAgICAgICAgaGFzQ29uZnVzYWJsZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IG5vcm1hbGl6ZWQsIGhhc0NvbmZ1c2FibGVzIH07XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHN1c3BpY2lvdXMgbWl4aW5nIG9mIGRpZmZlcmVudCBVbmljb2RlIHNjcmlwdHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGRldGVjdE1peGVkU2NyaXB0cyhjb250ZW50OiBzdHJpbmcpOiB7IGlzU3VzcGljaW91czogYm9vbGVhbjsgc2NyaXB0czogc3RyaW5nW10gfSB7XG4gICAgY29uc3QgZGV0ZWN0ZWRTY3JpcHRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbc2NyaXB0TmFtZSwgcGF0dGVybl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5TQ1JJUFRfUEFUVEVSTlMpKSB7XG4gICAgICBpZiAocGF0dGVybi50ZXN0KGNvbnRlbnQpKSB7XG4gICAgICAgIGRldGVjdGVkU2NyaXB0cy5wdXNoKHNjcmlwdE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbnNpZGVyIGl0IHN1c3BpY2lvdXMgaWY6XG4gICAgLy8gMS4gTW9yZSB0aGFuIDMgc2NyaXB0cyBhcmUgbWl4ZWQgKGxlZ2l0aW1hdGUgdGV4dCByYXJlbHkgbWl4ZXMgPjMgc2NyaXB0cylcbiAgICAvLyAyLiBDb250ZW50IGNvbnRhaW5zIExhdGluICsgQ3lyaWxsaWMgKGhvbW9nbHlwaCBhdHRhY2sg4oCUIEN5cmlsbGljINCwL9C+L9GAIGxvb2sgaWRlbnRpY2FsIHRvIExhdGluKVxuICAgIC8vIE5vdGU6IExhdGluICsgQ0pLIGlzIGNvbW1vbiBhbmQgbGVnaXRpbWF0ZSAoZS5nLiwgQ2hpbmVzZSB3aXRoIEVuZ2xpc2gpXG4gICAgLy8gTm90ZTogTGF0aW4gKyBHcmVlayBpcyBjb21tb24gYW5kIGxlZ2l0aW1hdGUgKGUuZy4sIM6xLCDOsiwgzrMsIM+ALCDOoywgzpQgaW4gbWF0aC9zY2llbmNlKVxuICAgIGNvbnN0IGlzU3VzcGljaW91cyA9IGRldGVjdGVkU2NyaXB0cy5sZW5ndGggPiAzIHx8XG4gICAgICAoZGV0ZWN0ZWRTY3JpcHRzLmluY2x1ZGVzKCdMQVRJTicpICYmIGRldGVjdGVkU2NyaXB0cy5sZW5ndGggPiAxICYmXG4gICAgICAgZGV0ZWN0ZWRTY3JpcHRzLmluY2x1ZGVzKCdDWVJJTExJQycpKTtcblxuICAgIHJldHVybiB7IGlzU3VzcGljaW91cywgc2NyaXB0czogZGV0ZWN0ZWRTY3JpcHRzIH07XG4gIH1cblxuICAvKipcbiAgICogRXNjYXBlIHNwZWNpYWwgcmVnZXggY2hhcmFjdGVycyBmb3Igc2FmZSByZXBsYWNlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXNjYXBlUmVnZXgoc3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHJpbmcucmVwbGFjZUFsbCgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csICdcXFxcJCYnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjb250ZW50IGNvbnRhaW5zIHBvdGVudGlhbGx5IGRhbmdlcm91cyBVbmljb2RlIHBhdHRlcm5zXG4gICAqL1xuICBzdGF0aWMgY29udGFpbnNEYW5nZXJvdXNVbmljb2RlKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFF1aWNrIGNoZWNrIGZvciBvYnZpb3VzbHkgZGFuZ2Vyb3VzIHBhdHRlcm5zXG4gICAgcmV0dXJuIHRoaXMuRElSRUNUSU9OX09WRVJSSURFX0NIQVJTLnRlc3QoY29udGVudCkgfHxcbiAgICAgICAgICAgdGhpcy5aRVJPX1dJRFRIX0NIQVJTLnRlc3QoY29udGVudCkgfHxcbiAgICAgICAgICAgdGhpcy5OT05fUFJJTlRBQkxFX0NIQVJTLnRlc3QoY29udGVudCkgfHxcbiAgICAgICAgICAgdGhpcy5oYXNFeGNlc3NpdmVVbmljb2RlRXNjYXBlcyhjb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjb250ZW50IGhhcyBleGNlc3NpdmUgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzXG4gICAqIFByZXZlbnRzIG51bGwgcG9pbnRlciBleGNlcHRpb24gYnkgc2FmZWx5IGNoZWNraW5nIG1hdGNoIHJlc3VsdHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGhhc0V4Y2Vzc2l2ZVVuaWNvZGVFc2NhcGVzKGNvbnRlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBjb250ZW50Lm1hdGNoKC9cXFxcdVswLTlhLWZBLUZdezR9L2cpO1xuICAgIHJldHVybiBtYXRjaGVzICE9PSBudWxsICYmIG1hdGNoZXMubGVuZ3RoID4gMTA7XG4gIH1cblxuICAvKipcbiAgICogU2FmZWx5IGNoZWNrIGZvciBtYWxmb3JtZWQgc3Vycm9nYXRlIHBhaXJzIHdpdGhvdXQgUmVEb1MgdnVsbmVyYWJpbGl0eVxuICAgKiBVc2VzIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgdmFsaWRhdGlvbiBpbnN0ZWFkIG9mIGNvbXBsZXggcmVnZXhcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGhhc01hbGZvcm1lZFN1cnJvZ2F0ZXMoY29udGVudDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBTT05BUkNMT1VEIEZBTFNFIFBPU0lUSVZFIChTNzc1OCk6IE11c3QgdXNlIGNoYXJDb2RlQXQgaGVyZSwgbm90IGNvZGVQb2ludEF0XG4gICAgICAvLyBUaGlzIGNvZGUgc3BlY2lmaWNhbGx5IGNoZWNrcyBmb3IgbWFsZm9ybWVkIHN1cnJvZ2F0ZSBwYWlycyBhdCB0aGUgMTYtYml0IGNvZGUgdW5pdCBsZXZlbC5cbiAgICAgIC8vIGNvZGVQb2ludEF0KCkgd291bGQgYXV0b21hdGljYWxseSBjb21iaW5lIHZhbGlkIHBhaXJzLCBtYWtpbmcgbWFsZm9ybWVkIGRldGVjdGlvbiBpbXBvc3NpYmxlLlxuICAgICAgY29uc3QgY2hhciA9IGNvbnRlbnQuY2hhckNvZGVBdChpKTtcblxuICAgICAgLy8gSGlnaCBzdXJyb2dhdGUgKFUrRDgwMC1VK0RCRkYpXG4gICAgICBpZiAoY2hhciA+PSAweEQ4MDAgJiYgY2hhciA8PSAweERCRkYpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBmb2xsb3dlZCBieSBhIGxvdyBzdXJyb2dhdGVcbiAgICAgICAgaWYgKGkgKyAxID49IGNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7IC8vIEhpZ2ggc3Vycm9nYXRlIGF0IGVuZCBvZiBzdHJpbmdcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0Q2hhciA9IGNvbnRlbnQuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICAgIGlmIChuZXh0Q2hhciA8IDB4REMwMCB8fCBuZXh0Q2hhciA+IDB4REZGRikge1xuICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBIaWdoIHN1cnJvZ2F0ZSBub3QgZm9sbG93ZWQgYnkgbG93IHN1cnJvZ2F0ZVxuICAgICAgICB9XG4gICAgICAgIGkrKzsgLy8gU2tpcCB0aGUgdmFsaWQgbG93IHN1cnJvZ2F0ZVxuICAgICAgfVxuICAgICAgLy8gTG93IHN1cnJvZ2F0ZSAoVStEQzAwLVUrREZGRikgd2l0aG91dCBwcmVjZWRpbmcgaGlnaCBzdXJyb2dhdGVcbiAgICAgIGVsc2UgaWYgKGNoYXIgPj0gMHhEQzAwICYmIGNoYXIgPD0gMHhERkZGKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBVbnBhaXJlZCBsb3cgc3Vycm9nYXRlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2FmZSBwcmV2aWV3IG9mIFVuaWNvZGUgY29udGVudCBmb3IgbG9nZ2luZ1xuICAgKi9cbiAgc3RhdGljIGdldFNhZmVQcmV2aWV3KGNvbnRlbnQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIgPSAxMDApOiBzdHJpbmcge1xuICAgIC8vIFJlbW92ZSBkYW5nZXJvdXMgVW5pY29kZSBjaGFyYWN0ZXJzIGFuZCB0cnVuY2F0ZSBmb3Igc2FmZSBsb2dnaW5nXG4gICAgY29uc3QgY2xlYW5lZCA9IGNvbnRlbnRcbiAgICAgIC5yZXBsYWNlKHRoaXMuRElSRUNUSU9OX09WRVJSSURFX0NIQVJTLCAnW0RJUl0nKVxuICAgICAgLnJlcGxhY2UodGhpcy5aRVJPX1dJRFRIX0NIQVJTLCAnW1pXXScpXG4gICAgICAucmVwbGFjZSh0aGlzLk5PTl9QUklOVEFCTEVfQ0hBUlMsICdbTlBdJyk7XG4gICAgXG4gICAgcmV0dXJuIGNsZWFuZWQubGVuZ3RoID4gbWF4TGVuZ3RoID8gXG4gICAgICBjbGVhbmVkLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpICsgJy4uLicgOiBcbiAgICAgIGNsZWFuZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VerificationNotifier.d.ts","sourceRoot":"","sources":["../../src/services/VerificationNotifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,wDAAwD;IACxD,WAAW,IAAI,OAAO,CAAC;CACxB;AAED,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAoC5C,WAAW,IAAI,OAAO;IAoBtB,OAAO,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"VerificationNotifier.d.ts","sourceRoot":"","sources":["../../src/services/VerificationNotifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,wDAAwD;IACxD,WAAW,IAAI,OAAO,CAAC;CACxB;AAED,qBAAa,oBAAqB,YAAW,qBAAqB;IAChE;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAoC5C,WAAW,IAAI,OAAO;IAoBtB,OAAO,CAAC,UAAU;IAmBlB,OAAO,CAAC,UAAU;IAqDlB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,kBAAkB;CAgB3B"}
|
|
@@ -30,7 +30,7 @@ export class VerificationNotifier {
|
|
|
30
30
|
currentPlatform = platform();
|
|
31
31
|
const title = 'DollhouseMCP Verification Required';
|
|
32
32
|
// The message shown to the human in the dialog
|
|
33
|
-
const message = `${reason}
|
|
33
|
+
const message = `${reason}\n\nVerification Code: ${code}\n\nType this code in your chat to proceed.`;
|
|
34
34
|
if (currentPlatform === 'darwin') {
|
|
35
35
|
this.spawnMacOS(title, message);
|
|
36
36
|
}
|
|
@@ -82,11 +82,14 @@ export class VerificationNotifier {
|
|
|
82
82
|
}
|
|
83
83
|
// ---- Platform-specific spawners ----
|
|
84
84
|
spawnMacOS(title, message) {
|
|
85
|
-
// Escape for AppleScript
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
const escapedTitle = title.
|
|
89
|
-
const
|
|
85
|
+
// Escape for AppleScript: backslashes, then double quotes. Newlines are
|
|
86
|
+
// replaced with AppleScript `return` character concatenation so they render
|
|
87
|
+
// as real line breaks in the dialog instead of literal "\n" text.
|
|
88
|
+
const escapedTitle = title.replaceAll('\\', String.raw `\\`).replaceAll('"', String.raw `\"`).replaceAll(/[\n\r]/g, ' ');
|
|
89
|
+
const escapedMessage = message.replaceAll('\\', String.raw `\\`).replaceAll('"', String.raw `\"`);
|
|
90
|
+
// Split on newlines and join with AppleScript return concatenation
|
|
91
|
+
const messageParts = escapedMessage.split(/\r?\n/).map(part => `"${part}"`).join(' & return & ');
|
|
92
|
+
const script = `display dialog (${messageParts}) with title "${escapedTitle}" with icon caution buttons {"OK"} default button "OK"`;
|
|
90
93
|
// NOSONAR - Intentional: OS dialog via AppleScript, input escaped with escapeShellArg
|
|
91
94
|
const child = spawn('osascript', ['-e', script], {
|
|
92
95
|
detached: true,
|
|
@@ -95,8 +98,7 @@ export class VerificationNotifier {
|
|
|
95
98
|
child.unref();
|
|
96
99
|
}
|
|
97
100
|
spawnLinux(title, message) {
|
|
98
|
-
|
|
99
|
-
const realMessage = message.replace(/\\n/g, '\n');
|
|
101
|
+
const realMessage = message;
|
|
100
102
|
try {
|
|
101
103
|
execSync('which zenity', { stdio: 'pipe' }); // NOSONAR - Tool detection, no user input
|
|
102
104
|
const child = spawn('zenity', [
|
|
@@ -147,10 +149,10 @@ export class VerificationNotifier {
|
|
|
147
149
|
});
|
|
148
150
|
}
|
|
149
151
|
spawnWindows(title, message) {
|
|
150
|
-
//
|
|
151
|
-
const realMessage = message.
|
|
152
|
-
const escapedMessage = realMessage.
|
|
153
|
-
const escapedTitle = title.
|
|
152
|
+
// Convert real newlines to PowerShell backtick-n for MessageBox rendering
|
|
153
|
+
const realMessage = message.replaceAll('\n', '`n');
|
|
154
|
+
const escapedMessage = realMessage.replaceAll("'", "''");
|
|
155
|
+
const escapedTitle = title.replaceAll("'", "''");
|
|
154
156
|
const script = `Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show('${escapedMessage}', '${escapedTitle}', 'OK', 'Warning')`;
|
|
155
157
|
// SECURITY: Use -EncodedCommand for safe execution (Base64 encoding prevents injection)
|
|
156
158
|
// NOSONAR - Intentional: OS dialog via PowerShell, input Base64-encoded
|
|
@@ -181,4 +183,4 @@ export class VerificationNotifier {
|
|
|
181
183
|
return false;
|
|
182
184
|
}
|
|
183
185
|
}
|
|
184
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVyaWZpY2F0aW9uTm90aWZpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvVmVyaWZpY2F0aW9uTm90aWZpZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQWFqRSxNQUFNLE9BQU8sb0JBQW9CO0lBQy9COzs7Ozs7T0FNRztJQUNILFFBQVEsQ0FBQyxJQUFZLEVBQUUsTUFBYztRQUNuQyxJQUFJLGVBQWUsR0FBRyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDO1lBQ0gsZUFBZSxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQzdCLE1BQU0sS0FBSyxHQUFHLG9DQUFvQyxDQUFDO1lBQ25ELCtDQUErQztZQUMvQyxNQUFNLE9BQU8sR0FBRyxHQUFHLE1BQU0sNEJBQTRCLElBQUksK0NBQStDLENBQUM7WUFFekcsSUFBSSxlQUFlLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLENBQUM7aUJBQU0sSUFBSSxlQUFlLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLENBQUM7aUJBQU0sSUFBSSxlQUFlLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sQ0FBQztnQkFDTix3REFBd0Q7Z0JBQ3hELGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFD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Q0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQztZQUNILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWZXJpZmljYXRpb25Ob3RpZmllciAtIE5vbi1ibG9ja2luZyBPUyBkaWFsb2cgZm9yIHZlcmlmaWNhdGlvbiBjb2RlcyAoSXNzdWUgIzUyMilcbiAqXG4gKiBTcGF3bnMgbmF0aXZlIE9TIGRpYWxvZ3MgdG8gZGlzcGxheSB2ZXJpZmljYXRpb24gY29kZXMgZGlyZWN0bHkgdG8gdGhlIGh1bWFuLlxuICogVGhlIGNvZGUgaXMgTkVWRVIgcmV0dXJuZWQgdG8gdGhlIExMTSB2aWEgTUNQIHRvb2wgcmVzcG9uc2VzLlxuICpcbiAqIFdoeSBhIHNlcGFyYXRlIHNlcnZpY2UgaW5zdGVhZCBvZiByZXVzaW5nIERpc3BsYXlTZXJ2aWNlP1xuICogLSBEaXNwbGF5U2VydmljZSB1c2VzIGV4ZWNTeW5jIChibG9ja2luZykuIFdlIG5lZWQgbm9uLWJsb2NraW5nIHNwYXduIHNvXG4gKiAgIHRoZSBNQ1AgcmVzcG9uc2UgcmV0dXJucyBpbW1lZGlhdGVseS5cbiAqIC0gREktaW5qZWN0YWJsZSBmb3IgdGVzdGFiaWxpdHkgKGludGVncmF0aW9uIHRlc3RzIHJ1biBoZWFkbGVzcywgY2FuIG1vY2svc3B5KS5cbiAqIC0gQ2xlYW4gc2VwYXJhdGlvbjogRGlzcGxheVNlcnZpY2Ugb3ducyBjcm9zcy1wbGF0Zm9ybSBkaWFsb2cgbWVjaGFuaWNzLFxuICogICBWZXJpZmljYXRpb25Ob3RpZmllciBvd25zIHRoZSBcImZpcmUtYW5kLWZvcmdldCwgbmV2ZXIgYmxvY2sgdGhlIHNlcnZlclwiIGNvbmNlcm4uXG4gKlxuICogQHNpbmNlIHYxLjEuMFxuICovXG5cbmltcG9ydCB7IHNwYXduLCBleGVjU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcGxhdGZvcm0gfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgdmVyaWZpY2F0aW9uIGNvZGUgZGlzcGxheS5cbiAqIEltcGxlbWVudGF0aW9ucyBtdXN0IE5FVkVSIHJldHVybiBvciBsb2cgdGhlIGNvZGUgaXRzZWxmLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElWZXJpZmljYXRpb25Ob3RpZmllciB7XG4gIC8qKiBGaXJlLWFuZC1mb3JnZXQ6IHNob3cgdGhlIGNvZGUgaW4gYW4gT1MgZGlhbG9nLiBOZXZlciB0aHJvd3MuICovXG4gIHNob3dDb2RlKGNvZGU6IHN0cmluZywgcmVhc29uOiBzdHJpbmcpOiB2b2lkO1xuICAvKiogV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBzdXBwb3J0cyBPUyBkaWFsb2dzLiAqL1xuICBpc0F2YWlsYWJsZSgpOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgVmVyaWZpY2F0aW9uTm90aWZpZXIgaW1wbGVtZW50cyBJVmVyaWZpY2F0aW9uTm90aWZpZXIge1xuICAvKipcbiAgICogRGlzcGxheSB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgdmlhIGEgbmF0aXZlIE9TIGRpYWxvZy5cbiAgICpcbiAgICogLSBVc2VzIGNoaWxkX3Byb2Nlc3Muc3Bhd24gd2l0aCBkZXRhY2hlZCArIHVucmVmIGZvciB0cnVlIGZpcmUtYW5kLWZvcmdldFxuICAgKiAtIE5ldmVyIHRocm93cyAoY2F0Y2hlcyBhbGwgZXJyb3JzIGludGVybmFsbHkpXG4gICAqIC0gTmV2ZXIgbG9ncyB0aGUgY29kZSBpdHNlbGZcbiAgICovXG4gIHNob3dDb2RlKGNvZGU6IHN0cmluZywgcmVhc29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsZXQgY3VycmVudFBsYXRmb3JtID0gJ3Vua25vd24nO1xuICAgIHRyeSB7XG4gICAgICBjdXJyZW50UGxhdGZvcm0gPSBwbGF0Zm9ybSgpO1xuICAgICAgY29uc3QgdGl0bGUgPSAnRG9sbGhvdXNlTUNQIFZlcmlmaWNhdGlvbiBSZXF1aXJlZCc7XG4gICAgICAvLyBUaGUgbWVzc2FnZSBzaG93biB0byB0aGUgaHVtYW4gaW4gdGhlIGRpYWxvZ1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGAke3JlYXNvbn1cXFxcblxcXFxuVmVyaWZpY2F0aW9uIENvZGU6ICR7Y29kZX1cXFxcblxcXFxuVHlwZSB0aGlzIGNvZGUgaW4geW91ciBjaGF0IHRvIHByb2NlZWQuYDtcblxuICAgICAgaWYgKGN1cnJlbnRQbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgdGhpcy5zcGF3bk1hY09TKHRpdGxlLCBtZXNzYWdlKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBsYXRmb3JtID09PSAnbGludXgnKSB7XG4gICAgICAgIHRoaXMuc3Bhd25MaW51eCh0aXRsZSwgbWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgICB0aGlzLnNwYXduV2luZG93cyh0aXRsZSwgbWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTRUNVUklUWTogTmV2ZXIgbG9nIHRoZSBjb2RlIG9uIHVuc3VwcG9ydGVkIHBsYXRmb3Jtc1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0RBTkdFUl9aT05FX1RSSUdHRVJFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgIHNvdXJjZTogJ1ZlcmlmaWNhdGlvbk5vdGlmaWVyLnNob3dDb2RlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgVW5zdXBwb3J0ZWQgcGxhdGZvcm0gZm9yIHZlcmlmaWNhdGlvbiBkaWFsb2c6ICR7Y3VycmVudFBsYXRmb3JtfWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgcGxhdGZvcm06IGN1cnJlbnRQbGF0Zm9ybSB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBOZXZlciBsb2cgdGhlIGNvZGUgaW4gZXJyb3IgcGF0aHNcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0RBTkdFUl9aT05FX1RSSUdHRVJFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnVmVyaWZpY2F0aW9uTm90aWZpZXIuc2hvd0NvZGUnLFxuICAgICAgICBkZXRhaWxzOiAnRmFpbGVkIHRvIHNwYXduIHZlcmlmaWNhdGlvbiBkaWFsb2cnLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBwbGF0Zm9ybTogY3VycmVudFBsYXRmb3JtIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc0F2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3VycmVudFBsYXRmb3JtID0gcGxhdGZvcm0oKTtcblxuICAgICAgaWYgKGN1cnJlbnRQbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIG1hY09TIGFsd2F5cyBoYXMgb3Nhc2NyaXB0XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXNMaW51eERpYWxvZ1Rvb2woKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBXaW5kb3dzIGFsd2F5cyBoYXMgUG93ZXJTaGVsbFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLSBQbGF0Zm9ybS1zcGVjaWZpYyBzcGF3bmVycyAtLS0tXG5cbiAgcHJpdmF0ZSBzcGF3bk1hY09TKHRpdGxlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIEVzY2FwZSBmb3IgQXBwbGVTY3JpcHQgc3RyaW5nOiBiYWNrc2xhc2hlcyBmaXJzdCwgdGhlbiBkb3VibGUgcXVvdGVzLFxuICAgIC8vIHRoZW4gc3RyaXAgYWN0dWFsIG5ld2xpbmVzL0NScyB3aGljaCB3b3VsZCBicmVhayB0aGUgc3RyaW5nIHN5bnRheFxuICAgIGNvbnN0IGVzY2FwZWRNZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9bXFxuXFxyXS9nLCAnICcpO1xuICAgIGNvbnN0IGVzY2FwZWRUaXRsZSA9IHRpdGxlLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJykucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpLnJlcGxhY2UoL1tcXG5cXHJdL2csICcgJyk7XG5cbiAgICBjb25zdCBzY3JpcHQgPSBgZGlzcGxheSBkaWFsb2cgXCIke2VzY2FwZWRNZXNzYWdlfVwiIHdpdGggdGl0bGUgXCIke2VzY2FwZWRUaXRsZX1cIiB3aXRoIGljb24gY2F1dGlvbiBidXR0b25zIHtcIk9LXCJ9IGRlZmF1bHQgYnV0dG9uIFwiT0tcImA7XG5cbiAgICAvLyBOT1NPTkFSIC0gSW50ZW50aW9uYWw6IE9TIGRpYWxvZyB2aWEgQXBwbGVTY3JpcHQsIGlucHV0IGVzY2FwZWQgd2l0aCBlc2NhcGVTaGVsbEFyZ1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oJ29zYXNjcmlwdCcsIFsnLWUnLCBzY3JpcHRdLCB7XG4gICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICB9KTtcbiAgICBjaGlsZC51bnJlZigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzcGF3bkxpbnV4KHRpdGxlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIFVuZXNjYXBlIHRoZSBcXFxcbiBzZXF1ZW5jZXMgdG8gcmVhbCBuZXdsaW5lcyBmb3IgTGludXggdG9vbHNcbiAgICBjb25zdCByZWFsTWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgvXFxcXG4vZywgJ1xcbicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKCd3aGljaCB6ZW5pdHknLCB7IHN0ZGlvOiAncGlwZScgfSk7IC8vIE5PU09OQVIgLSBUb29sIGRldGVjdGlvbiwgbm8gdXNlciBpbnB1dFxuICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bignemVuaXR5JywgW1xuICAgICAgICAnLS1pbmZvJyxcbiAgICAgICAgYC0tdGl0bGU9JHt0aXRsZX1gLFxuICAgICAgICBgLS10ZXh0PSR7cmVhbE1lc3NhZ2V9YCxcbiAgICAgICAgJy0tbm8td3JhcCcsXG4gICAgICBdLCB7XG4gICAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgICB9KTtcbiAgICAgIGNoaWxkLnVucmVmKCk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCB7IC8qIHplbml0eSBub3QgZm91bmQgKi8gfVxuXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKCd3aGljaCBrZGlhbG9nJywgeyBzdGRpbzogJ3BpcGUnIH0pOyAvLyBOT1NPTkFSIC0gVG9vbCBkZXRlY3Rpb24sIG5vIHVzZXIgaW5wdXRcbiAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oJ2tkaWFsb2cnLCBbXG4gICAgICAgICctLW1zZ2JveCcsIHJlYWxNZXNzYWdlLFxuICAgICAgICAnLS10aXRsZScsIHRpdGxlLFxuICAgICAgXSwge1xuICAgICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgICAgfSk7XG4gICAgICBjaGlsZC51bnJlZigpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggeyAvKiBrZGlhbG9nIG5vdCBmb3VuZCAqLyB9XG5cbiAgICB0cnkge1xuICAgICAgZXhlY1N5bmMoJ3doaWNoIHhtZXNzYWdlJywgeyBzdGRpbzogJ3BpcGUnIH0pOyAvLyBOT1NPTkFSIC0gVG9vbCBkZXRlY3Rpb24sIG5vIHVzZXIgaW5wdXRcbiAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oJ3htZXNzYWdlJywgW1xuICAgICAgICAnLWNlbnRlcicsIGAke3RpdGxlfVxcblxcbiR7cmVhbE1lc3NhZ2V9YCxcbiAgICAgIF0sIHtcbiAgICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICAgIH0pO1xuICAgICAgY2hpbGQudW5yZWYoKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIHsgLyogeG1lc3NhZ2Ugbm90IGZvdW5kICovIH1cblxuICAgIC8vIE5vIGRpYWxvZyB0b29sIGF2YWlsYWJsZVxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdEQU5HRVJfWk9ORV9UUklHR0VSRUQnLFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiAnVmVyaWZpY2F0aW9uTm90aWZpZXIuc3Bhd25MaW51eCcsXG4gICAgICBkZXRhaWxzOiAnTm8gR1VJIGRpYWxvZyB0b29sIGF2YWlsYWJsZSBvbiBMaW51eCAodHJpZWQgemVuaXR5LCBrZGlhbG9nLCB4bWVzc2FnZSknLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHsgcGxhdGZvcm06ICdsaW51eCcsIGRpYWxvZ1Rvb2xzVHJpZWQ6IFsnemVuaXR5JywgJ2tkaWFsb2cnLCAneG1lc3NhZ2UnXSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzcGF3bldpbmRvd3ModGl0bGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gVW5lc2NhcGUgXFxcXG4gdG8gcmVhbCBuZXdsaW5lcyBmb3IgUG93ZXJTaGVsbFxuICAgIGNvbnN0IHJlYWxNZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKC9cXFxcbi9nLCAnYG4nKTtcbiAgICBjb25zdCBlc2NhcGVkTWVzc2FnZSA9IHJlYWxNZXNzYWdlLnJlcGxhY2UoLycvZywgXCInJ1wiKTtcbiAgICBjb25zdCBlc2NhcGVkVGl0bGUgPSB0aXRsZS5yZXBsYWNlKC8nL2csIFwiJydcIik7XG5cbiAgICBjb25zdCBzY3JpcHQgPSBgQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uV2luZG93cy5Gb3JtczsgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KCcke2VzY2FwZWRNZXNzYWdlfScsICcke2VzY2FwZWRUaXRsZX0nLCAnT0snLCAnV2FybmluZycpYDtcblxuICAgIC8vIFNFQ1VSSVRZOiBVc2UgLUVuY29kZWRDb21tYW5kIGZvciBzYWZlIGV4ZWN1dGlvbiAoQmFzZTY0IGVuY29kaW5nIHByZXZlbnRzIGluamVjdGlvbilcbiAgICAvLyBOT1NPTkFSIC0gSW50ZW50aW9uYWw6IE9TIGRpYWxvZyB2aWEgUG93ZXJTaGVsbCwgaW5wdXQgQmFzZTY0LWVuY29kZWRcbiAgICBjb25zdCBlbmNvZGVkU2NyaXB0ID0gQnVmZmVyLmZyb20oc2NyaXB0LCAndXRmMTZsZScpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKCdwb3dlcnNoZWxsJywgWyctRW5jb2RlZENvbW1hbmQnLCBlbmNvZGVkU2NyaXB0XSwge1xuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgfSk7XG4gICAgY2hpbGQudW5yZWYoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzTGludXhEaWFsb2dUb29sKCk6IGJvb2xlYW4ge1xuICAgIC8vIE5PU09OQVIgLSBBbGwgZXhlY1N5bmMgY2FsbHMgYmVsb3cgYXJlIHRvb2wgZGV0ZWN0aW9uIHdpdGggbm8gdXNlciBpbnB1dFxuICAgIHRyeSB7XG4gICAgICBleGVjU3luYygnd2hpY2ggemVuaXR5JywgeyBzdGRpbzogJ3BpcGUnIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCBmb3VuZCAqLyB9XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKCd3aGljaCBrZGlhbG9nJywgeyBzdGRpbzogJ3BpcGUnIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCBmb3VuZCAqLyB9XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKCd3aGljaCB4bWVzc2FnZScsIHsgc3RkaW86ICdwaXBlJyB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggeyAvKiBub3QgZm91bmQgKi8gfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmVyaWZpY2F0aW9uTm90aWZpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvVmVyaWZpY2F0aW9uTm90aWZpZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQWFqRSxNQUFNLE9BQU8sb0JBQW9CO0lBQy9COzs7Ozs7T0FNRztJQUNILFFBQVEsQ0FBQyxJQUFZLEVBQUUsTUFBYztRQUNuQyxJQUFJLGVBQWUsR0FBRyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDO1lBQ0gsZUFBZSxHQUFHLFFBQVEsRUFBRSxDQUFDO1lBQzdCLE1BQU0sS0FBSyxHQUFHLG9DQUFvQyxDQUFDO1lBQ25ELCtDQUErQztZQUMvQyxNQUFNLE9BQU8sR0FBRyxHQUFHLE1BQU0sMEJBQTBCLElBQUksNkNBQTZDLENBQUM7WUFFckcsSUFBSSxlQUFlLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLENBQUM7aUJBQU0sSUFBSSxlQUFlLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLENBQUM7aUJBQU0sSUFBSSxlQUFlLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLENBQUM7aUJBQU0sQ0FBQztnQkFDTix3REFBd0Q7Z0JBQ3hELGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFD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TyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDO1lBQ0gsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQztZQUNILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWZXJpZmljYXRpb25Ob3RpZmllciAtIE5vbi1ibG9ja2luZyBPUyBkaWFsb2cgZm9yIHZlcmlmaWNhdGlvbiBjb2RlcyAoSXNzdWUgIzUyMilcbiAqXG4gKiBTcGF3bnMgbmF0aXZlIE9TIGRpYWxvZ3MgdG8gZGlzcGxheSB2ZXJpZmljYXRpb24gY29kZXMgZGlyZWN0bHkgdG8gdGhlIGh1bWFuLlxuICogVGhlIGNvZGUgaXMgTkVWRVIgcmV0dXJuZWQgdG8gdGhlIExMTSB2aWEgTUNQIHRvb2wgcmVzcG9uc2VzLlxuICpcbiAqIFdoeSBhIHNlcGFyYXRlIHNlcnZpY2UgaW5zdGVhZCBvZiByZXVzaW5nIERpc3BsYXlTZXJ2aWNlP1xuICogLSBEaXNwbGF5U2VydmljZSB1c2VzIGV4ZWNTeW5jIChibG9ja2luZykuIFdlIG5lZWQgbm9uLWJsb2NraW5nIHNwYXduIHNvXG4gKiAgIHRoZSBNQ1AgcmVzcG9uc2UgcmV0dXJucyBpbW1lZGlhdGVseS5cbiAqIC0gREktaW5qZWN0YWJsZSBmb3IgdGVzdGFiaWxpdHkgKGludGVncmF0aW9uIHRlc3RzIHJ1biBoZWFkbGVzcywgY2FuIG1vY2svc3B5KS5cbiAqIC0gQ2xlYW4gc2VwYXJhdGlvbjogRGlzcGxheVNlcnZpY2Ugb3ducyBjcm9zcy1wbGF0Zm9ybSBkaWFsb2cgbWVjaGFuaWNzLFxuICogICBWZXJpZmljYXRpb25Ob3RpZmllciBvd25zIHRoZSBcImZpcmUtYW5kLWZvcmdldCwgbmV2ZXIgYmxvY2sgdGhlIHNlcnZlclwiIGNvbmNlcm4uXG4gKlxuICogQHNpbmNlIHYxLjEuMFxuICovXG5cbmltcG9ydCB7IHNwYXduLCBleGVjU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcGxhdGZvcm0gfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgdmVyaWZpY2F0aW9uIGNvZGUgZGlzcGxheS5cbiAqIEltcGxlbWVudGF0aW9ucyBtdXN0IE5FVkVSIHJldHVybiBvciBsb2cgdGhlIGNvZGUgaXRzZWxmLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElWZXJpZmljYXRpb25Ob3RpZmllciB7XG4gIC8qKiBGaXJlLWFuZC1mb3JnZXQ6IHNob3cgdGhlIGNvZGUgaW4gYW4gT1MgZGlhbG9nLiBOZXZlciB0aHJvd3MuICovXG4gIHNob3dDb2RlKGNvZGU6IHN0cmluZywgcmVhc29uOiBzdHJpbmcpOiB2b2lkO1xuICAvKiogV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBzdXBwb3J0cyBPUyBkaWFsb2dzLiAqL1xuICBpc0F2YWlsYWJsZSgpOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgVmVyaWZpY2F0aW9uTm90aWZpZXIgaW1wbGVtZW50cyBJVmVyaWZpY2F0aW9uTm90aWZpZXIge1xuICAvKipcbiAgICogRGlzcGxheSB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgdmlhIGEgbmF0aXZlIE9TIGRpYWxvZy5cbiAgICpcbiAgICogLSBVc2VzIGNoaWxkX3Byb2Nlc3Muc3Bhd24gd2l0aCBkZXRhY2hlZCArIHVucmVmIGZvciB0cnVlIGZpcmUtYW5kLWZvcmdldFxuICAgKiAtIE5ldmVyIHRocm93cyAoY2F0Y2hlcyBhbGwgZXJyb3JzIGludGVybmFsbHkpXG4gICAqIC0gTmV2ZXIgbG9ncyB0aGUgY29kZSBpdHNlbGZcbiAgICovXG4gIHNob3dDb2RlKGNvZGU6IHN0cmluZywgcmVhc29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsZXQgY3VycmVudFBsYXRmb3JtID0gJ3Vua25vd24nO1xuICAgIHRyeSB7XG4gICAgICBjdXJyZW50UGxhdGZvcm0gPSBwbGF0Zm9ybSgpO1xuICAgICAgY29uc3QgdGl0bGUgPSAnRG9sbGhvdXNlTUNQIFZlcmlmaWNhdGlvbiBSZXF1aXJlZCc7XG4gICAgICAvLyBUaGUgbWVzc2FnZSBzaG93biB0byB0aGUgaHVtYW4gaW4gdGhlIGRpYWxvZ1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGAke3JlYXNvbn1cXG5cXG5WZXJpZmljYXRpb24gQ29kZTogJHtjb2RlfVxcblxcblR5cGUgdGhpcyBjb2RlIGluIHlvdXIgY2hhdCB0byBwcm9jZWVkLmA7XG5cbiAgICAgIGlmIChjdXJyZW50UGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIHRoaXMuc3Bhd25NYWNPUyh0aXRsZSwgbWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xuICAgICAgICB0aGlzLnNwYXduTGludXgodGl0bGUsIG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgICAgdGhpcy5zcGF3bldpbmRvd3ModGl0bGUsIG1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU0VDVVJJVFk6IE5ldmVyIGxvZyB0aGUgY29kZSBvbiB1bnN1cHBvcnRlZCBwbGF0Zm9ybXNcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdEQU5HRVJfWk9ORV9UUklHR0VSRUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdWZXJpZmljYXRpb25Ob3RpZmllci5zaG93Q29kZScsXG4gICAgICAgICAgZGV0YWlsczogYFVuc3VwcG9ydGVkIHBsYXRmb3JtIGZvciB2ZXJpZmljYXRpb24gZGlhbG9nOiAke2N1cnJlbnRQbGF0Zm9ybX1gLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IHBsYXRmb3JtOiBjdXJyZW50UGxhdGZvcm0gfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTRUNVUklUWTogTmV2ZXIgbG9nIHRoZSBjb2RlIGluIGVycm9yIHBhdGhzXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdEQU5HRVJfWk9ORV9UUklHR0VSRUQnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1ZlcmlmaWNhdGlvbk5vdGlmaWVyLnNob3dDb2RlJyxcbiAgICAgICAgZGV0YWlsczogJ0ZhaWxlZCB0byBzcGF3biB2ZXJpZmljYXRpb24gZGlhbG9nJyxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgcGxhdGZvcm06IGN1cnJlbnRQbGF0Zm9ybSB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRQbGF0Zm9ybSA9IHBsYXRmb3JtKCk7XG5cbiAgICAgIGlmIChjdXJyZW50UGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBtYWNPUyBhbHdheXMgaGFzIG9zYXNjcmlwdFxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UGxhdGZvcm0gPT09ICdsaW51eCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzTGludXhEaWFsb2dUb29sKCk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gV2luZG93cyBhbHdheXMgaGFzIFBvd2VyU2hlbGxcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0gUGxhdGZvcm0tc3BlY2lmaWMgc3Bhd25lcnMgLS0tLVxuXG4gIHByaXZhdGUgc3Bhd25NYWNPUyh0aXRsZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBFc2NhcGUgZm9yIEFwcGxlU2NyaXB0OiBiYWNrc2xhc2hlcywgdGhlbiBkb3VibGUgcXVvdGVzLiBOZXdsaW5lcyBhcmVcbiAgICAvLyByZXBsYWNlZCB3aXRoIEFwcGxlU2NyaXB0IGByZXR1cm5gIGNoYXJhY3RlciBjb25jYXRlbmF0aW9uIHNvIHRoZXkgcmVuZGVyXG4gICAgLy8gYXMgcmVhbCBsaW5lIGJyZWFrcyBpbiB0aGUgZGlhbG9nIGluc3RlYWQgb2YgbGl0ZXJhbCBcIlxcblwiIHRleHQuXG4gICAgY29uc3QgZXNjYXBlZFRpdGxlID0gdGl0bGUucmVwbGFjZUFsbCgnXFxcXCcsIFN0cmluZy5yYXdgXFxcXGApLnJlcGxhY2VBbGwoJ1wiJywgU3RyaW5nLnJhd2BcXFwiYCkucmVwbGFjZUFsbCgvW1xcblxccl0vZywgJyAnKTtcbiAgICBjb25zdCBlc2NhcGVkTWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZUFsbCgnXFxcXCcsIFN0cmluZy5yYXdgXFxcXGApLnJlcGxhY2VBbGwoJ1wiJywgU3RyaW5nLnJhd2BcXFwiYCk7XG4gICAgLy8gU3BsaXQgb24gbmV3bGluZXMgYW5kIGpvaW4gd2l0aCBBcHBsZVNjcmlwdCByZXR1cm4gY29uY2F0ZW5hdGlvblxuICAgIGNvbnN0IG1lc3NhZ2VQYXJ0cyA9IGVzY2FwZWRNZXNzYWdlLnNwbGl0KC9cXHI/XFxuLykubWFwKHBhcnQgPT4gYFwiJHtwYXJ0fVwiYCkuam9pbignICYgcmV0dXJuICYgJyk7XG5cbiAgICBjb25zdCBzY3JpcHQgPSBgZGlzcGxheSBkaWFsb2cgKCR7bWVzc2FnZVBhcnRzfSkgd2l0aCB0aXRsZSBcIiR7ZXNjYXBlZFRpdGxlfVwiIHdpdGggaWNvbiBjYXV0aW9uIGJ1dHRvbnMge1wiT0tcIn0gZGVmYXVsdCBidXR0b24gXCJPS1wiYDtcblxuICAgIC8vIE5PU09OQVIgLSBJbnRlbnRpb25hbDogT1MgZGlhbG9nIHZpYSBBcHBsZVNjcmlwdCwgaW5wdXQgZXNjYXBlZCB3aXRoIGVzY2FwZVNoZWxsQXJnXG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bignb3Nhc2NyaXB0JywgWyctZScsIHNjcmlwdF0sIHtcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgIH0pO1xuICAgIGNoaWxkLnVucmVmKCk7XG4gIH1cblxuICBwcml2YXRlIHNwYXduTGludXgodGl0bGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcmVhbE1lc3NhZ2UgPSBtZXNzYWdlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKCd3aGljaCB6ZW5pdHknLCB7IHN0ZGlvOiAncGlwZScgfSk7IC8vIE5PU09OQVIgLSBUb29sIGRldGVjdGlvbiwgbm8gdXNlciBpbnB1dFxuICAgICAgY29uc3QgY2hpbGQgPSBzcGF3bignemVuaXR5JywgW1xuICAgICAgICAnLS1pbmZvJyxcbiAgICAgICAgYC0tdGl0bGU9JHt0aXRsZX1gLFxuICAgICAgICBgLS10ZXh0PSR7cmVhbE1lc3NhZ2V9YCxcbiAgICAgICAgJy0tbm8td3JhcCcsXG4gICAgICBdLCB7XG4gICAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgICB9KTtcbiAgICAgIGNoaWxkLnVucmVmKCk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCB7IC8qIHplbml0eSBub3QgZm91bmQgKi8gfVxuXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKCd3aGljaCBrZGlhbG9nJywgeyBzdGRpbzogJ3BpcGUnIH0pOyAvLyBOT1NPTkFSIC0gVG9vbCBkZXRlY3Rpb24sIG5vIHVzZXIgaW5wdXRcbiAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oJ2tkaWFsb2cnLCBbXG4gICAgICAgICctLW1zZ2JveCcsIHJlYWxNZXNzYWdlLFxuICAgICAgICAnLS10aXRsZScsIHRpdGxlLFxuICAgICAgXSwge1xuICAgICAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgICAgICAgc3RkaW86ICdpZ25vcmUnLFxuICAgICAgfSk7XG4gICAgICBjaGlsZC51bnJlZigpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggeyAvKiBrZGlhbG9nIG5vdCBmb3VuZCAqLyB9XG5cbiAgICB0cnkge1xuICAgICAgZXhlY1N5bmMoJ3doaWNoIHhtZXNzYWdlJywgeyBzdGRpbzogJ3BpcGUnIH0pOyAvLyBOT1NPTkFSIC0gVG9vbCBkZXRlY3Rpb24sIG5vIHVzZXIgaW5wdXRcbiAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oJ3htZXNzYWdlJywgW1xuICAgICAgICAnLWNlbnRlcicsIGAke3RpdGxlfVxcblxcbiR7cmVhbE1lc3NhZ2V9YCxcbiAgICAgIF0sIHtcbiAgICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICAgIHN0ZGlvOiAnaWdub3JlJyxcbiAgICAgIH0pO1xuICAgICAgY2hpbGQudW5yZWYoKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIHsgLyogeG1lc3NhZ2Ugbm90IGZvdW5kICovIH1cblxuICAgIC8vIE5vIGRpYWxvZyB0b29sIGF2YWlsYWJsZVxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdEQU5HRVJfWk9ORV9UUklHR0VSRUQnLFxuICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgc291cmNlOiAnVmVyaWZpY2F0aW9uTm90aWZpZXIuc3Bhd25MaW51eCcsXG4gICAgICBkZXRhaWxzOiAnTm8gR1VJIGRpYWxvZyB0b29sIGF2YWlsYWJsZSBvbiBMaW51eCAodHJpZWQgemVuaXR5LCBrZGlhbG9nLCB4bWVzc2FnZSknLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHsgcGxhdGZvcm06ICdsaW51eCcsIGRpYWxvZ1Rvb2xzVHJpZWQ6IFsnemVuaXR5JywgJ2tkaWFsb2cnLCAneG1lc3NhZ2UnXSB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzcGF3bldpbmRvd3ModGl0bGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQ29udmVydCByZWFsIG5ld2xpbmVzIHRvIFBvd2VyU2hlbGwgYmFja3RpY2stbiBmb3IgTWVzc2FnZUJveCByZW5kZXJpbmdcbiAgICBjb25zdCByZWFsTWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZUFsbCgnXFxuJywgJ2BuJyk7XG4gICAgY29uc3QgZXNjYXBlZE1lc3NhZ2UgPSByZWFsTWVzc2FnZS5yZXBsYWNlQWxsKFwiJ1wiLCBcIicnXCIpO1xuICAgIGNvbnN0IGVzY2FwZWRUaXRsZSA9IHRpdGxlLnJlcGxhY2VBbGwoXCInXCIsIFwiJydcIik7XG5cbiAgICBjb25zdCBzY3JpcHQgPSBgQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uV2luZG93cy5Gb3JtczsgW1N5c3RlbS5XaW5kb3dzLkZvcm1zLk1lc3NhZ2VCb3hdOjpTaG93KCcke2VzY2FwZWRNZXNzYWdlfScsICcke2VzY2FwZWRUaXRsZX0nLCAnT0snLCAnV2FybmluZycpYDtcblxuICAgIC8vIFNFQ1VSSVRZOiBVc2UgLUVuY29kZWRDb21tYW5kIGZvciBzYWZlIGV4ZWN1dGlvbiAoQmFzZTY0IGVuY29kaW5nIHByZXZlbnRzIGluamVjdGlvbilcbiAgICAvLyBOT1NPTkFSIC0gSW50ZW50aW9uYWw6IE9TIGRpYWxvZyB2aWEgUG93ZXJTaGVsbCwgaW5wdXQgQmFzZTY0LWVuY29kZWRcbiAgICBjb25zdCBlbmNvZGVkU2NyaXB0ID0gQnVmZmVyLmZyb20oc2NyaXB0LCAndXRmMTZsZScpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKCdwb3dlcnNoZWxsJywgWyctRW5jb2RlZENvbW1hbmQnLCBlbmNvZGVkU2NyaXB0XSwge1xuICAgICAgZGV0YWNoZWQ6IHRydWUsXG4gICAgICBzdGRpbzogJ2lnbm9yZScsXG4gICAgfSk7XG4gICAgY2hpbGQudW5yZWYoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzTGludXhEaWFsb2dUb29sKCk6IGJvb2xlYW4ge1xuICAgIC8vIE5PU09OQVIgLSBBbGwgZXhlY1N5bmMgY2FsbHMgYmVsb3cgYXJlIHRvb2wgZGV0ZWN0aW9uIHdpdGggbm8gdXNlciBpbnB1dFxuICAgIHRyeSB7XG4gICAgICBleGVjU3luYygnd2hpY2ggemVuaXR5JywgeyBzdGRpbzogJ3BpcGUnIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCBmb3VuZCAqLyB9XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKCd3aGljaCBrZGlhbG9nJywgeyBzdGRpbzogJ3BpcGUnIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCBmb3VuZCAqLyB9XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKCd3aGljaCB4bWVzc2FnZScsIHsgc3RkaW86ICdwaXBlJyB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggeyAvKiBub3QgZm91bmQgKi8gfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|