@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
|
@@ -353,11 +353,25 @@ export class TokenManager {
|
|
|
353
353
|
return crypto.pbkdf2Sync(passphrase, salt, TokenManager.ITERATIONS, TokenManager.KEY_LENGTH, 'sha256');
|
|
354
354
|
}
|
|
355
355
|
/**
|
|
356
|
-
* Get
|
|
357
|
-
*
|
|
356
|
+
* Get passphrase for token encryption.
|
|
357
|
+
*
|
|
358
|
+
* Priority: DOLLHOUSE_TOKEN_SECRET env var → machine-derived passphrase (fallback).
|
|
359
|
+
* The machine-derived passphrase uses homedir + USER which is predictable (#1735).
|
|
360
|
+
* Set DOLLHOUSE_TOKEN_SECRET for stronger protection.
|
|
361
|
+
*/
|
|
362
|
+
getPassphrase() {
|
|
363
|
+
if (process.env.DOLLHOUSE_TOKEN_SECRET) {
|
|
364
|
+
return process.env.DOLLHOUSE_TOKEN_SECRET;
|
|
365
|
+
}
|
|
366
|
+
return this.getMachinePassphrase();
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Machine-derived passphrase — fallback when DOLLHOUSE_TOKEN_SECRET is not
|
|
370
|
+
* set, and migration path for tokens encrypted before that env var existed.
|
|
371
|
+
* Not deprecated; still the default for installations that haven't opted in
|
|
372
|
+
* to an explicit secret.
|
|
358
373
|
*/
|
|
359
374
|
getMachinePassphrase() {
|
|
360
|
-
// Use a combination of hostname, username, and a fixed app identifier.
|
|
361
375
|
// codeql[js/insufficient-password-hashing] — These are NOT password hashes.
|
|
362
376
|
// SHA-256 is used to derive a stable machine fingerprint from system identifiers
|
|
363
377
|
// (home directory path, OS username). The actual token encryption uses pbkdf2Sync
|
|
@@ -367,6 +381,31 @@ export class TokenManager {
|
|
|
367
381
|
const appId = 'DollhouseMCP-TokenStore-v1';
|
|
368
382
|
return `${appId}-${hostname}-${username}`;
|
|
369
383
|
}
|
|
384
|
+
/**
|
|
385
|
+
* Attempt decryption with the primary passphrase, then fall back to the
|
|
386
|
+
* machine-derived passphrase for backward compatibility (#1735).
|
|
387
|
+
*/
|
|
388
|
+
decryptWithFallback(salt, iv, tag, encrypted) {
|
|
389
|
+
const primaryPassphrase = this.getPassphrase();
|
|
390
|
+
try {
|
|
391
|
+
return this.decryptToken(primaryPassphrase, salt, iv, tag, encrypted);
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
// If primary passphrase differs from machine passphrase, try fallback
|
|
395
|
+
const machinePassphrase = this.getMachinePassphrase();
|
|
396
|
+
if (machinePassphrase !== primaryPassphrase) {
|
|
397
|
+
logger.info('Primary passphrase failed, trying machine passphrase migration path');
|
|
398
|
+
return this.decryptToken(machinePassphrase, salt, iv, tag, encrypted);
|
|
399
|
+
}
|
|
400
|
+
throw new SecurityError('Token decryption failed');
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
decryptToken(passphrase, salt, iv, tag, encrypted) {
|
|
404
|
+
const key = this.deriveKey(passphrase, salt);
|
|
405
|
+
const decipher = crypto.createDecipheriv(TokenManager.ALGORITHM, key, iv);
|
|
406
|
+
decipher.setAuthTag(tag);
|
|
407
|
+
return Buffer.concat([decipher.update(encrypted), decipher.final()]).toString('utf8');
|
|
408
|
+
}
|
|
370
409
|
/**
|
|
371
410
|
* Store GitHub token securely to file
|
|
372
411
|
*/
|
|
@@ -389,7 +428,7 @@ export class TokenManager {
|
|
|
389
428
|
// Generate encryption components
|
|
390
429
|
const salt = crypto.randomBytes(TokenManager.SALT_LENGTH);
|
|
391
430
|
const iv = crypto.randomBytes(TokenManager.IV_LENGTH);
|
|
392
|
-
const passphrase = this.
|
|
431
|
+
const passphrase = this.getPassphrase();
|
|
393
432
|
const key = this.deriveKey(passphrase, salt);
|
|
394
433
|
// Encrypt token
|
|
395
434
|
const cipher = crypto.createCipheriv(TokenManager.ALGORITHM, key, iv);
|
|
@@ -455,16 +494,9 @@ export class TokenManager {
|
|
|
455
494
|
const iv = stored.subarray(TokenManager.SALT_LENGTH, TokenManager.SALT_LENGTH + TokenManager.IV_LENGTH);
|
|
456
495
|
const tag = stored.subarray(TokenManager.SALT_LENGTH + TokenManager.IV_LENGTH, TokenManager.SALT_LENGTH + TokenManager.IV_LENGTH + TokenManager.TAG_LENGTH);
|
|
457
496
|
const encrypted = stored.subarray(TokenManager.SALT_LENGTH + TokenManager.IV_LENGTH + TokenManager.TAG_LENGTH);
|
|
458
|
-
//
|
|
459
|
-
|
|
460
|
-
const
|
|
461
|
-
// Decrypt token
|
|
462
|
-
const decipher = crypto.createDecipheriv(TokenManager.ALGORITHM, key, iv);
|
|
463
|
-
decipher.setAuthTag(tag);
|
|
464
|
-
const decrypted = Buffer.concat([
|
|
465
|
-
decipher.update(encrypted),
|
|
466
|
-
decipher.final()
|
|
467
|
-
]).toString('utf8');
|
|
497
|
+
// Decrypt with primary passphrase; fall back to machine passphrase for
|
|
498
|
+
// backward compatibility with tokens stored before DOLLHOUSE_TOKEN_SECRET (#1735)
|
|
499
|
+
const decrypted = this.decryptWithFallback(salt, iv, tag, encrypted);
|
|
468
500
|
// Validate decrypted token
|
|
469
501
|
if (!this.validateTokenFormat(decrypted)) {
|
|
470
502
|
SecurityMonitor.logSecurityEvent({
|
|
@@ -547,4 +579,4 @@ export class TokenManager {
|
|
|
547
579
|
return this.retrieveGitHubToken();
|
|
548
580
|
}
|
|
549
581
|
}
|
|
550
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5NYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlY3VyaXR5L3Rva2VuTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQW9CcEU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNmLE1BQU0sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRXZDLDZDQUE2QztJQUM3QyxNQUFNLENBQUMsZ0JBQWdCO1FBQ3JCLFlBQVksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxNQUFNLENBQVUscUJBQXFCLEdBQUc7UUFDOUMsK0RBQStEO1FBQy9ELHFCQUFxQixFQUFFLFVBQVUsRUFBTyx5QkFBeUI7UUFDakUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUssc0NBQXNDO1FBQzlFLGtCQUFrQixFQUFFLFVBQVUsRUFBVSxpQ0FBaUM7UUFDekUsaUJBQWlCLEVBQUUsVUFBVSxFQUFXLG1DQUFtQztRQUMzRSxhQUFhLEVBQUUsVUFBVSxFQUFlLGlCQUFpQjtRQUN6RCxrQkFBa0IsRUFBRSxVQUFVLEVBQVUsMkJBQTJCO1FBQ25FLHVGQUF1RjtRQUN2RixvQkFBb0IsRUFBRSxlQUFlLENBQUcsaUNBQWlDO0tBQzFFLENBQUM7SUFFRiwrQkFBK0I7SUFDdkIsTUFBTSxDQUFVLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RSxNQUFNLENBQVUsVUFBVSxHQUFHLGtCQUFrQixDQUFDO0lBQ2hELE1BQU0sQ0FBVSxTQUFTLEdBQUcsYUFBYSxDQUFDO0lBQzFDLE1BQU0sQ0FBVSxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sQ0FBVSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQy9CLE1BQU0sQ0FBVSxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sQ0FBVSxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLE1BQU0sQ0FBVSxVQUFVLEdBQUcsTUFBTSxDQUFDO0lBRTVDLDhFQUE4RTtJQUN0RSxzQkFBc0IsR0FBdUIsSUFBSSxDQUFDO0lBRTFELDRFQUE0RTtJQUNwRSxjQUFjLENBQXlCO0lBRS9DLFlBQVksY0FBc0M7UUFDaEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHlCQUF5QjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsNEJBQTRCO1FBQzFCLE9BQU8sSUFBSSxXQUFXLENBQUM7WUFDckIsV0FBVyxFQUFFLEVBQUUsRUFBVyx5QkFBeUI7WUFDbkQsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFdBQVc7WUFDckMsVUFBVSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQU0scUNBQXFDO1NBQ2hFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCwyQkFBMkI7UUFDekIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQixDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxnREFBZ0Q7UUFDaEQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUN0RSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxjQUFjO1FBQ1osMkJBQTJCO1FBQzNCLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO1FBRXJDLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLDhHQUE4RyxDQUFDLENBQUM7WUFDNUgsS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7UUFDeEMsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0hBQW9ILENBQUMsQ0FBQztZQUNsSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztRQUN4QyxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxtSEFBbUg7WUFDbkgsTUFBTSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsRUFBRTtnQkFDbEQsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2dCQUN2QyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07YUFDckIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsd0hBQXdIO1FBQ3hILElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbEMsTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRTtnQkFDdkMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO2dCQUNuQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7YUFDeEMsQ0FBQyxDQUFDO1lBQ0gsWUFBWSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDdEMsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLEtBQWE7UUFDeEIsd0RBQXdEO1FBQ3hELElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE9BQU8sb0NBQW9DLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pFLE9BQU8sdUJBQXVCLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE9BQU8sb0JBQW9CLENBQUM7UUFDOUIsQ0FBQztRQUNELElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JFLE9BQU8sbUJBQW1CLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxPQUFPLGVBQWUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxZQUFZLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxvQkFBb0IsQ0FBQztRQUM5QixDQUFDO1FBQ0QsNkJBQTZCO1FBQzdCLElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hFLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUMsS0FBYTtRQUMxQixJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FDdkIsS0FBYSxFQUNiLGNBQTJCO1FBRTNCLG9EQUFvRDtRQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxLQUFLLEVBQUUsc0JBQXNCO2FBQzlCLENBQUM7UUFDSixDQUFDO1FBRUQsMENBQTBDO1FBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3JELE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVqRCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLEVBQUU7Z0JBQ2xELFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztnQkFDdkMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxZQUFZO2dCQUMxQyxlQUFlLEVBQUUsZUFBZSxDQUFDLGVBQWU7YUFDakQsQ0FBQyxDQUFDO1lBRUgsTUFBTSxJQUFJLGFBQWEsQ0FDckIseURBQXlELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQ3pILHFCQUFxQixDQUN0QixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQztZQUNILHVEQUF1RDtZQUN2RCxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDM0IsMERBQTBEO1lBQzFELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLDZCQUE2QixFQUFFO2dCQUMxRCxPQUFPLEVBQUU7b0JBQ1AsZUFBZSxFQUFFLFVBQVUsS0FBSyxFQUFFO29CQUNsQyxRQUFRLEVBQUUsZ0NBQWdDO29CQUMxQyxZQUFZLEVBQUUsa0JBQWtCO2lCQUNqQzthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2pHLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUV6RixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNqQixNQUFNLEtBQUssR0FBRyxxQkFBcUIsUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzVFLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUU7b0JBQ3JDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtvQkFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2lCQUN4QyxDQUFDLENBQUM7Z0JBRUgsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxLQUFLLEVBQUUsS0FBSztpQkFDYixDQUFDO1lBQ0osQ0FBQztZQUVELHVDQUF1QztZQUN2QyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRSxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTlFLHVDQUF1QztZQUN2QyxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQzlELFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQzVCLENBQUM7WUFFRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDM0QsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUM3QixDQUFDO2dCQUVGLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUU7b0JBQzNDLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztvQkFDdkMsYUFBYSxFQUFFLGFBQWE7b0JBQzVCLGFBQWEsRUFBRSxXQUFXO2lCQUMzQixDQUFDLENBQUM7Z0JBRUgsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxNQUFNLEVBQUUsV0FBVztvQkFDbkIsS0FBSyxFQUFFLDRCQUE0QixhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2lCQUM5RCxDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7Z0JBQ3pDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztnQkFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2dCQUN2QyxNQUFNLEVBQUUsV0FBVztnQkFDbkIsa0JBQWtCLEVBQUUsa0JBQWtCO2FBQ3ZDLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0wsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLFNBQVMsRUFBRTtvQkFDVCxTQUFTLEVBQUUsa0JBQWtCO29CQUM3QixTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztpQkFDM0M7YUFDRixDQUFDO1FBRUosQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixnRUFBZ0U7WUFDaEUsSUFBSSxLQUFLLFlBQVksYUFBYSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztnQkFDM0UsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMvQyxPQUFPO29CQUNMLE9BQU8sRUFBRSxLQUFLO29CQUNkLGlCQUFpQixFQUFFLElBQUk7b0JBQ3ZCLFlBQVksRUFBRSxhQUFhLENBQUMsWUFBWTtvQkFDeEMsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPO2lCQUNyQixDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztZQUM5RSxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFO2dCQUNyQyxLQUFLLEVBQUUsWUFBWTtnQkFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2FBQ3hDLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLHFCQUFxQixZQUFZLEVBQUU7YUFDM0MsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxzQkFBc0IsQ0FBQyxLQUFhLEVBQUUsS0FBYztRQUNsRCxzREFBc0Q7UUFDdEQsK0NBQStDO1FBQy9DLElBQUksV0FBVyxHQUFHLEtBQUs7YUFDcEIsVUFBVSxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQzthQUMxQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCLENBQUM7YUFDdEQsVUFBVSxDQUFDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQzthQUM5QyxVQUFVLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO2FBQzNDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsb0JBQW9CLENBQUM7YUFDOUMsVUFBVSxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQzthQUM1QyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFFLCtCQUErQjtRQUV0RixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxXQUFXLElBQUksWUFBWSxXQUFXLEdBQUcsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGlCQUFpQixDQUFDLFNBQW1FO1FBQ25GLFFBQVEsU0FBUyxFQUFFLENBQUM7WUFDbEIsS0FBSyxNQUFNO2dCQUNULE9BQU87b0JBQ0wsUUFBUSxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUcsNENBQTRDO29CQUN4RSxRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7aUJBQ3pCLENBQUM7WUFFSixLQUFLLE9BQU87Z0JBQ1YsT0FBTztvQkFDTCxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRyw0Q0FBNEM7b0JBQ3hFLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztpQkFDekIsQ0FBQztZQUVKLEtBQUssYUFBYSxDQUFDLENBQUMsdURBQXVEO1lBQzNFLEtBQUssWUFBWSxFQUFFLHFCQUFxQjtnQkFDdEMsT0FBTztvQkFDTCxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRyw0Q0FBNEM7b0JBQ3hFLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztpQkFDekIsQ0FBQztZQUVKLEtBQUssTUFBTTtnQkFDVCxPQUFPO29CQUNMLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQztvQkFDbEIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN6QixDQUFDO1lBRUo7Z0JBQ0UsT0FBTztvQkFDTCxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBRSw0Q0FBNEM7aUJBQ3hFLENBQUM7UUFDTixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUMxQixTQUFtRTtRQUVuRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFcEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxLQUFLLEVBQUUsMkJBQTJCO2FBQ25DLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxTQUFTLENBQUMsVUFBa0IsRUFBRSxJQUFZO1FBQ2hELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssb0JBQW9CO1FBQzFCLHVFQUF1RTtRQUN2RSw0RUFBNEU7UUFDNUUsaUZBQWlGO1FBQ2pGLGtGQUFrRjtRQUNsRix1REFBdUQ7UUFDdkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM5RixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsSCxNQUFNLEtBQUssR0FBRyw0QkFBNEIsQ0FBQztRQUUzQyxPQUFPLEdBQUcsS0FBSyxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBYTtRQUNsQyxJQUFJLENBQUM7WUFDSCw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLElBQUksYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUVELCtCQUErQjtZQUMvQixNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLGFBQWEsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQy9ELENBQUM7WUFFRCwwQkFBMEI7WUFDMUIsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEUsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRTtnQkFDN0QsTUFBTSxFQUFFLCtCQUErQjthQUN4QyxDQUFDLENBQUM7WUFFSCxpQ0FBaUM7WUFDakMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDL0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFN0MsZ0JBQWdCO1lBQ2hCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDOUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO2dCQUNuRCxNQUFNLENBQUMsS0FBSyxFQUFFO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBRWhDLHFEQUFxRDtZQUNyRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUV6RCw0Q0FBNEM7WUFDNUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM3RSxvR0FBb0c7WUFDcEcsMEVBQTBFO1lBQzFFLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3hFLE1BQU0sRUFBRSwrQkFBK0I7YUFDeEMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFO2dCQUNoRCxNQUFNLEVBQUUsK0JBQStCO2FBQ3hDLENBQUMsQ0FBQztZQUVILHFCQUFxQjtZQUNyQixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSwwQkFBMEI7Z0JBQ2hDLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSwrQkFBK0I7Z0JBQ3ZDLE9BQU8sRUFBRSw4QkFBOEI7Z0JBQ3ZDLFFBQVEsRUFBRTtvQkFDUixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7b0JBQ25DLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztpQkFDeEM7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSwwQkFBMEI7Z0JBQ2hDLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsK0JBQStCO2dCQUN2QyxPQUFPLEVBQUUsaUNBQWlDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRTthQUNyRyxDQUFDLENBQUM7WUFFSCxNQUFNLElBQUksYUFBYSxDQUFDLDBCQUEwQixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ2hILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsbUJBQW1CO1FBQ3ZCLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFN0UsdUJBQXVCO1lBQ3ZCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLGtCQUFrQjtnQkFDbEIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQseUNBQXlDO1lBQ3pDLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFO2dCQUNsRSxNQUFNLEVBQUUsa0NBQWtDO2FBQzNDLENBQUMsQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBRXBELHFCQUFxQjtZQUNyQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3hHLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUosTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRS9HLHdCQUF3QjtZQUN4QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMvQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUU3QyxnQkFBZ0I7WUFDaEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFekIsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDOUIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7Z0JBQzFCLFFBQVEsQ0FBQyxLQUFLLEVBQUU7YUFDakIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVwQiwyQkFBMkI7WUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSwwQkFBMEI7b0JBQ2hDLFFBQVEsRUFBRSxNQUFNO29CQUNoQixNQUFNLEVBQUUsa0NBQWtDO29CQUMxQyxPQUFPLEVBQUUsb0NBQW9DO2lCQUM5QyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsMEJBQTBCO2dCQUNoQyxRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsa0NBQWtDO2dCQUMxQyxPQUFPLEVBQUUsNENBQTRDO2dCQUNyRCxRQUFRLEVBQUU7b0JBQ1IsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO29CQUN2QyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7aUJBQzVDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSwwQkFBMEI7Z0JBQ2hDLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsa0NBQWtDO2dCQUMxQyxPQUFPLEVBQUUsb0NBQW9DLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRTthQUN4RyxDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMzRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLElBQUksQ0FBQztZQUNILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFN0Usa0RBQWtEO1lBQ2xELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0QsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUU7b0JBQ3pELE1BQU0sRUFBRSxnQ0FBZ0M7aUJBQ3pDLENBQUMsQ0FBQztnQkFFSCxlQUFlLENBQUMsZ0JBQWdCLENBQUM7b0JBQy9CLElBQUksRUFBRSxxQkFBcUI7b0JBQzNCLFFBQVEsRUFBRSxLQUFLO29CQUNmLE1BQU0sRUFBRSxnQ0FBZ0M7b0JBQ3hDLE9BQU8sRUFBRSwwQ0FBMEM7aUJBQ3BELENBQUMsQ0FBQztnQkFFSCxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDN0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHFCQUFxQjtnQkFDckIsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHFCQUFxQjtnQkFDM0IsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLGdDQUFnQztnQkFDeEMsT0FBTyxFQUFFLGtDQUFrQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUU7YUFDdEcsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsbUJBQW1CO1FBQ3ZCLG1DQUFtQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFRCw4QkFBOEI7UUFDOUIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWN1cmUgR2l0SHViIHRva2VuIG1hbmFnZW1lbnQgYW5kIHZhbGlkYXRpb25cbiAqL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi91dGlscy9SYXRlTGltaXRlci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eUVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4vc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuL3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvRmlsZU9wZXJhdGlvbnNTZXJ2aWNlLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblNjb3BlcyB7XG4gIHJlcXVpcmVkOiBzdHJpbmdbXTtcbiAgb3B0aW9uYWw/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblZhbGlkYXRpb25SZXN1bHQge1xuICBpc1ZhbGlkOiBib29sZWFuO1xuICBzY29wZXM/OiBzdHJpbmdbXTtcbiAgcmF0ZUxpbWl0Pzoge1xuICAgIHJlbWFpbmluZzogbnVtYmVyO1xuICAgIHJlc2V0VGltZTogRGF0ZTtcbiAgfTtcbiAgcmF0ZUxpbWl0RXhjZWVkZWQ/OiBib29sZWFuO1xuICByZXRyeUFmdGVyTXM/OiBudW1iZXI7XG4gIGVycm9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNlY3VyZSBHaXRIdWIgdG9rZW4gbWFuYWdlciB3aXRoIHZhbGlkYXRpb24gYW5kIHByb3RlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFRva2VuTWFuYWdlciB7XG4gIHByaXZhdGUgc3RhdGljIHRva2VuTG9nZ2VkT25jZSA9IGZhbHNlO1xuXG4gIC8qKiBSZXNldCBzdGF0aWMgZmxhZ3MgZm9yIHRlc3QgaXNvbGF0aW9uLiAqL1xuICBzdGF0aWMgcmVzZXRTdGF0aWNTdGF0ZSgpOiB2b2lkIHtcbiAgICBUb2tlbk1hbmFnZXIudG9rZW5Mb2dnZWRPbmNlID0gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBHSVRIVUJfVE9LRU5fUEFUVEVSTlMgPSB7XG4gICAgLy8gTW9yZSBmbGV4aWJsZSBwYXR0ZXJucyAtIGFjY2VwdCBhbnkgY29udGVudCBhZnRlciB0aGUgcHJlZml4XG4gICAgUEVSU09OQUxfQUNDRVNTX1RPS0VOOiAvXmdocF8uKyQvLCAgICAgIC8vIFBlcnNvbmFsIGFjY2VzcyB0b2tlbnNcbiAgICBGSU5FX0dSQUlORURfUEFUOiAvXmdpdGh1Yl9wYXRfLiskLywgICAgLy8gRmluZS1ncmFpbmVkIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnNcbiAgICBJTlNUQUxMQVRJT05fVE9LRU46IC9eZ2hzXy4rJC8sICAgICAgICAgLy8gR2l0SHViIEFwcCBpbnN0YWxsYXRpb24gdG9rZW5zXG4gICAgVVNFUl9BQ0NFU1NfVE9LRU46IC9eZ2h1Xy4rJC8sICAgICAgICAgIC8vIEdpdEh1YiBBcHAgdXNlci10by1zZXJ2ZXIgdG9rZW5zXG4gICAgUkVGUkVTSF9UT0tFTjogL15naHJfLiskLywgICAgICAgICAgICAgIC8vIFJlZnJlc2ggdG9rZW5zXG4gICAgT0FVVEhfQUNDRVNTX1RPS0VOOiAvXmdob18uKyQvLCAgICAgICAgIC8vIE9BdXRoIGRldmljZSBmbG93IHRva2Vuc1xuICAgIC8vIEdlbmVyaWMgcGF0dGVybiB0byBjYXRjaCBBTEwgR2l0SHViIHRva2VucyAoZ2ggKyBhbnkgbGV0dGVyICsgdW5kZXJzY29yZSArIGFueXRoaW5nKVxuICAgIEdFTkVSSUNfR0lUSFVCX1RPS0VOOiAvXmdoW2Etel1fLiskL2kgICAvLyBDYXRjaC1hbGwgZm9yIGFueSBnaCpfIHBhdHRlcm5cbiAgfTtcblxuICAvLyBTZWN1cmUgc3RvcmFnZSBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPS0VOX0RJUiA9IHBhdGguam9pbihob21lZGlyKCksICcuZG9sbGhvdXNlJywgJy5hdXRoJyk7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPS0VOX0ZJTEUgPSAnZ2l0aHViX3Rva2VuLmVuYyc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFMR09SSVRITSA9ICdhZXMtMjU2LWdjbSc7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEtFWV9MRU5HVEggPSAzMjtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSVZfTEVOR1RIID0gMTY7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19MRU5HVEggPSAxNjtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU0FMVF9MRU5HVEggPSAzMjtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSVRFUkFUSU9OUyA9IDEwMDAwMDtcblxuICAvLyBSYXRlIGxpbWl0ZXIgZm9yIHRva2VuIHZhbGlkYXRpb24gb3BlcmF0aW9ucyAtIHByZXZlbnRzIGJydXRlIGZvcmNlIGF0dGFja3NcbiAgcHJpdmF0ZSB0b2tlblZhbGlkYXRpb25MaW1pdGVyOiBSYXRlTGltaXRlciB8IG51bGwgPSBudWxsO1xuXG4gIC8vIEZpbGUgb3BlcmF0aW9ucyBzZXJ2aWNlIGZvciBzZWN1cmUgZmlsZSBhY2Nlc3MgKGluamVjdGVkIHZpYSBjb25zdHJ1Y3RvcilcbiAgcHJpdmF0ZSBmaWxlT3BlcmF0aW9uczogSUZpbGVPcGVyYXRpb25zU2VydmljZTtcblxuICBjb25zdHJ1Y3RvcihmaWxlT3BlcmF0aW9uczogSUZpbGVPcGVyYXRpb25zU2VydmljZSkge1xuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBmaWxlT3BlcmF0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3IgY3JlYXRlIHRoZSB0b2tlbiB2YWxpZGF0aW9uIHJhdGUgbGltaXRlclxuICAgKiBQcmV2ZW50cyBicnV0ZSBmb3JjZSB0b2tlbiB2YWxpZGF0aW9uIGF0dGFja3NcbiAgICovXG4gIHByaXZhdGUgZ2V0VG9rZW5WYWxpZGF0aW9uTGltaXRlcigpOiBSYXRlTGltaXRlciB7XG4gICAgaWYgKCF0aGlzLnRva2VuVmFsaWRhdGlvbkxpbWl0ZXIpIHtcbiAgICAgIHRoaXMudG9rZW5WYWxpZGF0aW9uTGltaXRlciA9IHRoaXMuY3JlYXRlVG9rZW5WYWxpZGF0aW9uTGltaXRlcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b2tlblZhbGlkYXRpb25MaW1pdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJhdGUgbGltaXRlciBzcGVjaWZpY2FsbHkgZm9yIHRva2VuIHZhbGlkYXRpb25cbiAgICogQ29uc2VydmF0aXZlIGxpbWl0cyB0byBwcmV2ZW50IGFidXNlIHdoaWxlIGFsbG93aW5nIGxlZ2l0aW1hdGUgdXNhZ2VcbiAgICovXG4gIGNyZWF0ZVRva2VuVmFsaWRhdGlvbkxpbWl0ZXIoKTogUmF0ZUxpbWl0ZXIge1xuICAgIHJldHVybiBuZXcgUmF0ZUxpbWl0ZXIoe1xuICAgICAgbWF4UmVxdWVzdHM6IDEwLCAgICAgICAgICAvLyAxMCB2YWxpZGF0aW9uIGF0dGVtcHRzXG4gICAgICB3aW5kb3dNczogNjAgKiA2MCAqIDEwMDAsIC8vIHBlciBob3VyXG4gICAgICBtaW5EZWxheU1zOiA1ICogMTAwMCAgICAgIC8vIDUgc2Vjb25kcyBtaW5pbXVtIGJldHdlZW4gYXR0ZW1wdHNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgdG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0ZXJcbiAgICogVXNlZnVsIGZvciB0ZXN0aW5nIG9yIG1hbnVhbCBpbnRlcnZlbnRpb25cbiAgICovXG4gIHJlc2V0VG9rZW5WYWxpZGF0aW9uTGltaXRlcigpOiB2b2lkIHtcbiAgICB0aGlzLnRva2VuVmFsaWRhdGlvbkxpbWl0ZXI/LnJlc2V0KCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgR2l0SHViIHRva2VuIGZvcm1hdFxuICAgKi9cbiAgdmFsaWRhdGVUb2tlbkZvcm1hdCh0b2tlbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0b2tlbiB8fCB0eXBlb2YgdG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYWdhaW5zdCBhbGwga25vd24gR2l0SHViIHRva2VuIHBhdHRlcm5zXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoVG9rZW5NYW5hZ2VyLkdJVEhVQl9UT0tFTl9QQVRURVJOUykuc29tZShwYXR0ZXJuID0+XG4gICAgICBwYXR0ZXJuLnRlc3QodG9rZW4pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgR2l0SHViIHRva2VuIGZyb20gZW52aXJvbm1lbnQgd2l0aCB2YWxpZGF0aW9uXG4gICAqXG4gICAqIFN1cHBvcnRzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgdmFyaWFibGUgbmFtZXM6XG4gICAqIC0gR0lUSFVCX1RPS0VOIChjYW5vbmljYWwpXG4gICAqIC0gVEVTVF9HSVRIVUJfVE9LRU4gKGRlcHJlY2F0ZWQpXG4gICAqIC0gR0lUSFVCX1RFU1RfVE9LRU4gKGRlcHJlY2F0ZWQpXG4gICAqL1xuICBnZXRHaXRIdWJUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUcnkgY2Fub25pY2FsIG5hbWUgZmlyc3RcbiAgICBsZXQgdG9rZW4gPSBwcm9jZXNzLmVudi5HSVRIVUJfVE9LRU47XG5cbiAgICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBDaGVjayBmb3Igb2xkIHZhcmlhYmxlIG5hbWVzXG4gICAgaWYgKCF0b2tlbiAmJiBwcm9jZXNzLmVudi5URVNUX0dJVEhVQl9UT0tFTikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0RFUFJFQ0FURUQ6IFRFU1RfR0lUSFVCX1RPS0VOIGlzIGRlcHJlY2F0ZWQuIFVzZSBHSVRIVUJfVE9LRU4gd2l0aCAuZW52IGZpbGUgb3IgR0lUSFVCX1RFU1RfVE9LRU4gZm9yIHRlc3RzLicpO1xuICAgICAgdG9rZW4gPSBwcm9jZXNzLmVudi5URVNUX0dJVEhVQl9UT0tFTjtcbiAgICB9XG5cbiAgICBpZiAoIXRva2VuICYmIHByb2Nlc3MuZW52LkdJVEhVQl9URVNUX1RPS0VOKSB7XG4gICAgICBsb2dnZXIud2FybignREVQUkVDQVRFRDogR0lUSFVCX1RFU1RfVE9LRU4gZm91bmQgYnV0IHNob3VsZCBiZSB1c2VkIGJ5IHRlc3QgY29kZSBvbmx5LiBQcm9kdWN0aW9uIGNvZGUgc2hvdWxkIHVzZSBHSVRIVUJfVE9LRU4uJyk7XG4gICAgICB0b2tlbiA9IHByb2Nlc3MuZW52LkdJVEhVQl9URVNUX1RPS0VOO1xuICAgIH1cblxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnTm8gR2l0SHViIHRva2VuIGZvdW5kIGluIGVudmlyb25tZW50Jyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmFsaWRhdGVUb2tlbkZvcm1hdCh0b2tlbikpIHtcbiAgICAgIC8vIGNvZGVxbFtqcy9jbGVhci10ZXh0LWxvZ2dpbmddIOKAlCBPbmx5IHRoZSBmaXJzdCA0IGNoYXJzICh0b2tlblByZWZpeCkgYW5kIGxlbmd0aCBhcmUgbG9nZ2VkLCBuZXZlciB0aGUgZnVsbCB0b2tlblxuICAgICAgbG9nZ2VyLndhcm4oJ0ludmFsaWQgR2l0SHViIHRva2VuIGZvcm1hdCBkZXRlY3RlZCcsIHtcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICBsZW5ndGg6IHRva2VuLmxlbmd0aFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjb2RlcWxbanMvY2xlYXItdGV4dC1sb2dnaW5nXSDigJQgT25seSB0b2tlbiB0eXBlIG5hbWUgYW5kIGZpcnN0IDQgY2hhcnMgKHRva2VuUHJlZml4KSBhcmUgbG9nZ2VkLCBuZXZlciB0aGUgZnVsbCB0b2tlblxuICAgIGlmICghVG9rZW5NYW5hZ2VyLnRva2VuTG9nZ2VkT25jZSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdWYWxpZCBHaXRIdWIgdG9rZW4gZm91bmQnLCB7XG4gICAgICAgIHRva2VuVHlwZTogdGhpcy5nZXRUb2tlblR5cGUodG9rZW4pLFxuICAgICAgICB0b2tlblByZWZpeDogdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbilcbiAgICAgIH0pO1xuICAgICAgVG9rZW5NYW5hZ2VyLnRva2VuTG9nZ2VkT25jZSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZGFjdCB0b2tlbiBmb3Igc2FmZSBsb2dnaW5nXG4gICAqL1xuICByZWRhY3RUb2tlbih0b2tlbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuLmxlbmd0aCA8IDgpIHtcbiAgICAgIHJldHVybiAnW1JFREFDVEVEXSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRva2VuLnN1YnN0cmluZygwLCA0KSArICcuLi4nICsgdG9rZW4uc3Vic3RyaW5nKHRva2VuLmxlbmd0aCAtIDQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0b2tlbiB0eXBlIGZyb20gZm9ybWF0XG4gICAqL1xuICBnZXRUb2tlblR5cGUodG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gQ2hlY2sgZmluZS1ncmFpbmVkIFBBVCBmaXJzdCBzaW5jZSBpdCdzIG1vcmUgc3BlY2lmaWNcbiAgICBpZiAoVG9rZW5NYW5hZ2VyLkdJVEhVQl9UT0tFTl9QQVRURVJOUy5GSU5FX0dSQUlORURfUEFULnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0ZpbmUtZ3JhaW5lZCBQZXJzb25hbCBBY2Nlc3MgVG9rZW4nO1xuICAgIH1cbiAgICBpZiAoVG9rZW5NYW5hZ2VyLkdJVEhVQl9UT0tFTl9QQVRURVJOUy5QRVJTT05BTF9BQ0NFU1NfVE9LRU4udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiAnUGVyc29uYWwgQWNjZXNzIFRva2VuJztcbiAgICB9XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuSU5TVEFMTEFUSU9OX1RPS0VOLnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0luc3RhbGxhdGlvbiBUb2tlbic7XG4gICAgfVxuICAgIGlmIChUb2tlbk1hbmFnZXIuR0lUSFVCX1RPS0VOX1BBVFRFUk5TLlVTRVJfQUNDRVNTX1RPS0VOLnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ1VzZXIgQWNjZXNzIFRva2VuJztcbiAgICB9XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuUkVGUkVTSF9UT0tFTi50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuICdSZWZyZXNoIFRva2VuJztcbiAgICB9XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuT0FVVEhfQUNDRVNTX1RPS0VOLnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ09BdXRoIEFjY2VzcyBUb2tlbic7XG4gICAgfVxuICAgIC8vIENoZWNrIGdlbmVyaWMgcGF0dGVybiBsYXN0XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuR0VORVJJQ19HSVRIVUJfVE9LRU4udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiAnR2l0SHViIFRva2VuJztcbiAgICB9XG4gICAgcmV0dXJuICdVbmtub3duJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2FmZSB0b2tlbiBwcmVmaXggZm9yIGxvZ2dpbmdcbiAgICovXG4gIGdldFRva2VuUHJlZml4KHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdG9rZW4gfHwgdG9rZW4ubGVuZ3RoIDwgNCkge1xuICAgICAgcmV0dXJuICdbSU5WQUxJRF0nO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW4uc3Vic3RyaW5nKDAsIDQpICsgJy4uLic7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgdG9rZW4gc2NvcGVzIHZpYSBHaXRIdWIgQVBJXG4gICAqL1xuICBhc3luYyB2YWxpZGF0ZVRva2VuU2NvcGVzKFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgcmVxdWlyZWRTY29wZXM6IFRva2VuU2NvcGVzXG4gICk6IFByb21pc2U8VG9rZW5WYWxpZGF0aW9uUmVzdWx0PiB7XG4gICAgLy8gVmFsaWRhdGUgdG9rZW4gZm9ybWF0IGJlZm9yZSBjb25zdW1pbmcgcmF0ZSBsaW1pdFxuICAgIGlmICghdGhpcy52YWxpZGF0ZVRva2VuRm9ybWF0KHRva2VuKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiAnSW52YWxpZCB0b2tlbiBmb3JtYXQnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIHJhdGUgbGltaXQgYmVmb3JlIG1ha2luZyBBUEkgY2FsbFxuICAgIGNvbnN0IHJhdGVMaW1pdGVyID0gdGhpcy5nZXRUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk7XG4gICAgY29uc3QgcmF0ZUxpbWl0U3RhdHVzID0gcmF0ZUxpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuXG4gICAgaWYgKCFyYXRlTGltaXRTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1Rva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdCBleGNlZWRlZCcsIHtcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICByZXRyeUFmdGVyTXM6IHJhdGVMaW1pdFN0YXR1cy5yZXRyeUFmdGVyTXMsXG4gICAgICAgIHJlbWFpbmluZ1Rva2VuczogcmF0ZUxpbWl0U3RhdHVzLnJlbWFpbmluZ1Rva2Vuc1xuICAgICAgfSk7XG5cbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKFxuICAgICAgICBgVG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0IGV4Y2VlZGVkLiBQbGVhc2UgcmV0cnkgaW4gJHtNYXRoLmNlaWwoKHJhdGVMaW1pdFN0YXR1cy5yZXRyeUFmdGVyTXMgfHwgMCkgLyAxMDAwKX0gc2Vjb25kcy5gLFxuICAgICAgICAnUkFURV9MSU1JVF9FWENFRURFRCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENvbnN1bWUgcmF0ZSBsaW1pdCB0b2tlbiBmb3IgdGhpcyB2YWxpZGF0aW9uIGF0dGVtcHRcbiAgICAgIHJhdGVMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuICAgICAgLy8gTWFrZSBhIHRlc3QgQVBJIGNhbGwgdG8gY2hlY2sgdG9rZW4gdmFsaWRpdHkgYW5kIHNjb3Blc1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS91c2VyJywge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIudjMranNvbicsXG4gICAgICAgICAgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLzEuMCdcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJhdGVMaW1pdFJlbWFpbmluZyA9IE51bWJlci5wYXJzZUludChyZXNwb25zZS5oZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVtYWluaW5nJykgfHwgJzAnKTtcbiAgICAgIGNvbnN0IHJhdGVMaW1pdFJlc2V0ID0gTnVtYmVyLnBhcnNlSW50KHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZXNldCcpIHx8ICcwJyk7XG5cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBgR2l0SHViIEFQSSBlcnJvcjogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gO1xuICAgICAgICBsb2dnZXIud2FybignVG9rZW4gdmFsaWRhdGlvbiBmYWlsZWQnLCB7XG4gICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBzY29wZXMgZnJvbSByZXNwb25zZSBoZWFkZXJzXG4gICAgICBjb25zdCBzY29wZXNIZWFkZXIgPSByZXNwb25zZS5oZWFkZXJzLmdldCgneC1vYXV0aC1zY29wZXMnKSB8fCAnJztcbiAgICAgIGNvbnN0IHRva2VuU2NvcGVzID0gc2NvcGVzSGVhZGVyLnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpLmZpbHRlcihzID0+IHMpO1xuXG4gICAgICAvLyBDaGVjayBpZiByZXF1aXJlZCBzY29wZXMgYXJlIHByZXNlbnRcbiAgICAgIGNvbnN0IGhhc1JlcXVpcmVkU2NvcGVzID0gcmVxdWlyZWRTY29wZXMucmVxdWlyZWQuZXZlcnkoc2NvcGUgPT4gXG4gICAgICAgIHRva2VuU2NvcGVzLmluY2x1ZGVzKHNjb3BlKVxuICAgICAgKTtcblxuICAgICAgaWYgKCFoYXNSZXF1aXJlZFNjb3Blcykge1xuICAgICAgICBjb25zdCBtaXNzaW5nU2NvcGVzID0gcmVxdWlyZWRTY29wZXMucmVxdWlyZWQuZmlsdGVyKHNjb3BlID0+IFxuICAgICAgICAgICF0b2tlblNjb3Blcy5pbmNsdWRlcyhzY29wZSlcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci53YXJuKCdUb2tlbiBtaXNzaW5nIHJlcXVpcmVkIHNjb3BlcycsIHtcbiAgICAgICAgICB0b2tlblByZWZpeDogdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbiksXG4gICAgICAgICAgbWlzc2luZ1Njb3BlczogbWlzc2luZ1Njb3BlcyxcbiAgICAgICAgICBjdXJyZW50U2NvcGVzOiB0b2tlblNjb3Blc1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIHNjb3BlczogdG9rZW5TY29wZXMsXG4gICAgICAgICAgZXJyb3I6IGBNaXNzaW5nIHJlcXVpcmVkIHNjb3BlczogJHttaXNzaW5nU2NvcGVzLmpvaW4oJywgJyl9YFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbygnVG9rZW4gdmFsaWRhdGlvbiBzdWNjZXNzZnVsJywge1xuICAgICAgICB0b2tlblR5cGU6IHRoaXMuZ2V0VG9rZW5UeXBlKHRva2VuKSxcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICBzY29wZXM6IHRva2VuU2NvcGVzLFxuICAgICAgICByYXRlTGltaXRSZW1haW5pbmc6IHJhdGVMaW1pdFJlbWFpbmluZ1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgIHNjb3BlczogdG9rZW5TY29wZXMsXG4gICAgICAgIHJhdGVMaW1pdDoge1xuICAgICAgICAgIHJlbWFpbmluZzogcmF0ZUxpbWl0UmVtYWluaW5nLFxuICAgICAgICAgIHJlc2V0VGltZTogbmV3IERhdGUocmF0ZUxpbWl0UmVzZXQgKiAxMDAwKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEhhbmRsZSBTZWN1cml0eUVycm9yIChpbmNsdWRpbmcgcmF0ZSBsaW1pdCBlcnJvcnMpIHNlcGFyYXRlbHlcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlY3VyaXR5RXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gJ1JBVEVfTElNSVRfRVhDRUVERUQnKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0dXMgPSByYXRlTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgcmF0ZUxpbWl0RXhjZWVkZWQ6IHRydWUsXG4gICAgICAgICAgcmV0cnlBZnRlck1zOiBjdXJyZW50U3RhdHVzLnJldHJ5QWZ0ZXJNcyxcbiAgICAgICAgICBlcnJvcjogZXJyb3IubWVzc2FnZVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJztcbiAgICAgIGxvZ2dlci5lcnJvcignVG9rZW4gdmFsaWRhdGlvbiBlcnJvcicsIHtcbiAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiBgVmFsaWRhdGlvbiBlcnJvcjogJHtlcnJvck1lc3NhZ2V9YFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHNhZmUgZXJyb3IgbWVzc2FnZSB3aXRob3V0IHRva2VuIGV4cG9zdXJlXG4gICAqL1xuICBjcmVhdGVTYWZlRXJyb3JNZXNzYWdlKGVycm9yOiBzdHJpbmcsIHRva2VuPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBSZW1vdmUgYW55IHBvdGVudGlhbCB0b2tlbiBkYXRhIGZyb20gZXJyb3IgbWVzc2FnZXNcbiAgICAvLyBVc2luZyB3b3JkIGJvdW5kYXJpZXMgdG8gYXZvaWQgb3Zlci1tYXRjaGluZ1xuICAgIGxldCBzYWZlTWVzc2FnZSA9IGVycm9yXG4gICAgICAucmVwbGFjZUFsbCgvXFxiZ2hwX1xcUysvZywgJ1tSRURBQ1RFRF9QQVRdJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXGJnaXRodWJfcGF0X1xcUysvZywgJ1tSRURBQ1RFRF9GSU5FX1BBVF0nKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdoc19cXFMrL2csICdbUkVEQUNURURfSU5TVEFMTF0nKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdodV9cXFMrL2csICdbUkVEQUNURURfVVNFUl0nKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdocl9cXFMrL2csICdbUkVEQUNURURfUkVGUkVTSF0nKVxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdob19cXFMrL2csICdbUkVEQUNURURfT0FVVEhdJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXGJnaFthLXpdX1xcUysvZ2ksICdbUkVEQUNURURfVE9LRU5dJyk7ICAvLyBDYXRjaCBhbnkgb3RoZXIgZ2gqXyBwYXR0ZXJuXG5cbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IHRva2VuUHJlZml4ID0gdGhpcy5nZXRUb2tlblByZWZpeCh0b2tlbik7XG4gICAgICBzYWZlTWVzc2FnZSArPSBgIChUb2tlbjogJHt0b2tlblByZWZpeH0pYDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2FmZU1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1pbmltdW0gcmVxdWlyZWQgc2NvcGVzIGZvciBkaWZmZXJlbnQgb3BlcmF0aW9uc1xuICAgKlxuICAgKiBOT1RFOiBUaGUgJ21hcmtldHBsYWNlJyBzY29wZSBpZGVudGlmaWVyIGlzIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICogd2l0aCBleGlzdGluZyB0b2tlbiB2YWxpZGF0aW9ucy4gVGhpcyBpcyBhbiBpbnRlcm5hbCBzY29wZSBuYW1lIGFuZCBkb2VzIG5vdFxuICAgKiBhZmZlY3QgdXNlci1mYWNpbmcgZnVuY3Rpb25hbGl0eS4gKFBSICMyODApXG4gICAqL1xuICBnZXRSZXF1aXJlZFNjb3BlcyhvcGVyYXRpb246ICdyZWFkJyB8ICd3cml0ZScgfCAnbWFya2V0cGxhY2UnIHwgJ2NvbGxlY3Rpb24nIHwgJ2dpc3QnKTogVG9rZW5TY29wZXMge1xuICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICdyZWFkJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXF1aXJlZDogWydwdWJsaWNfcmVwbyddLCAgLy8gT0F1dGggdG9rZW5zIHVzZSAncHVibGljX3JlcG8nIG5vdCAncmVwbydcbiAgICAgICAgICBvcHRpb25hbDogWyd1c2VyOmVtYWlsJ11cbiAgICAgICAgfTtcbiAgICAgIFxuICAgICAgY2FzZSAnd3JpdGUnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlcXVpcmVkOiBbJ3B1YmxpY19yZXBvJ10sICAvLyBPQXV0aCB0b2tlbnMgdXNlICdwdWJsaWNfcmVwbycgbm90ICdyZXBvJ1xuICAgICAgICAgIG9wdGlvbmFsOiBbJ3VzZXI6ZW1haWwnXVxuICAgICAgICB9O1xuICAgICAgXG4gICAgICBjYXNlICdtYXJrZXRwbGFjZSc6IC8vIEludGVybmFsIHNjb3BlIG5hbWUga2VwdCBmb3IgY29tcGF0aWJpbGl0eSAoUFIgIzI4MClcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOiAvLyBOZXcgcHJlZmVycmVkIG5hbWVcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXF1aXJlZDogWydwdWJsaWNfcmVwbyddLCAgLy8gT0F1dGggdG9rZW5zIHVzZSAncHVibGljX3JlcG8nIG5vdCAncmVwbydcbiAgICAgICAgICBvcHRpb25hbDogWyd1c2VyOmVtYWlsJ11cbiAgICAgICAgfTtcbiAgICAgIFxuICAgICAgY2FzZSAnZ2lzdCc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVxdWlyZWQ6IFsnZ2lzdCddLFxuICAgICAgICAgIG9wdGlvbmFsOiBbJ3VzZXI6ZW1haWwnXVxuICAgICAgICB9O1xuICAgICAgXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlcXVpcmVkOiBbJ3B1YmxpY19yZXBvJ10gIC8vIE9BdXRoIHRva2VucyB1c2UgJ3B1YmxpY19yZXBvJyBub3QgJ3JlcG8nXG4gICAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRva2VuIGhhcyBzdWZmaWNpZW50IHBlcm1pc3Npb25zIGZvciBvcGVyYXRpb25cbiAgICpcbiAgICogTk9URTogVGhlICdtYXJrZXRwbGFjZScgb3BlcmF0aW9uIHR5cGUgaXMga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAgICogVGhpcyBpcyBjYWxsZWQgaW50ZXJuYWxseSB3aGVuIGFjY2Vzc2luZyBjb2xsZWN0aW9uIGZlYXR1cmVzLiAoUFIgIzI4MClcbiAgICovXG4gIGFzeW5jIGVuc3VyZVRva2VuUGVybWlzc2lvbnMoXG4gICAgb3BlcmF0aW9uOiAncmVhZCcgfCAnd3JpdGUnIHwgJ21hcmtldHBsYWNlJyB8ICdjb2xsZWN0aW9uJyB8ICdnaXN0J1xuICApOiBQcm9taXNlPFRva2VuVmFsaWRhdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy5nZXRHaXRIdWJUb2tlbigpO1xuICAgIFxuICAgIGlmICghdG9rZW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogJ05vIEdpdEh1YiB0b2tlbiBhdmFpbGFibGUnXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVpcmVkU2NvcGVzID0gdGhpcy5nZXRSZXF1aXJlZFNjb3BlcyhvcGVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlVG9rZW5TY29wZXModG9rZW4sIHJlcXVpcmVkU2NvcGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmUgZW5jcnlwdGlvbiBrZXkgZnJvbSBhIHBhc3NwaHJhc2VcbiAgICovXG4gIHByaXZhdGUgZGVyaXZlS2V5KHBhc3NwaHJhc2U6IHN0cmluZywgc2FsdDogQnVmZmVyKTogQnVmZmVyIHtcbiAgICByZXR1cm4gY3J5cHRvLnBia2RmMlN5bmMocGFzc3BocmFzZSwgc2FsdCwgVG9rZW5NYW5hZ2VyLklURVJBVElPTlMsIFRva2VuTWFuYWdlci5LRVlfTEVOR1RILCAnc2hhMjU2Jyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1hY2hpbmUtc3BlY2lmaWMgcGFzc3BocmFzZSBmb3IgZW5jcnlwdGlvblxuICAgKiBVc2VzIGEgY29tYmluYXRpb24gb2YgbWFjaGluZSBJRCBhbmQgdXNlciBpbmZvIGZvciB1bmlxdWVuZXNzXG4gICAqL1xuICBwcml2YXRlIGdldE1hY2hpbmVQYXNzcGhyYXNlKCk6IHN0cmluZyB7XG4gICAgLy8gVXNlIGEgY29tYmluYXRpb24gb2YgaG9zdG5hbWUsIHVzZXJuYW1lLCBhbmQgYSBmaXhlZCBhcHAgaWRlbnRpZmllci5cbiAgICAvLyBjb2RlcWxbanMvaW5zdWZmaWNpZW50LXBhc3N3b3JkLWhhc2hpbmddIOKAlCBUaGVzZSBhcmUgTk9UIHBhc3N3b3JkIGhhc2hlcy5cbiAgICAvLyBTSEEtMjU2IGlzIHVzZWQgdG8gZGVyaXZlIGEgc3RhYmxlIG1hY2hpbmUgZmluZ2VycHJpbnQgZnJvbSBzeXN0ZW0gaWRlbnRpZmllcnNcbiAgICAvLyAoaG9tZSBkaXJlY3RvcnkgcGF0aCwgT1MgdXNlcm5hbWUpLiBUaGUgYWN0dWFsIHRva2VuIGVuY3J5cHRpb24gdXNlcyBwYmtkZjJTeW5jXG4gICAgLy8gd2l0aCBJVEVSQVRJT05TIHJvdW5kcyAoc2VlIGRlcml2ZUtleSBtZXRob2QgYWJvdmUpLlxuICAgIGNvbnN0IGhvc3RuYW1lID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShob21lZGlyKCkpLmRpZ2VzdCgnaGV4Jykuc3Vic3RyaW5nKDAsIDE2KTtcbiAgICBjb25zdCB1c2VybmFtZSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUocHJvY2Vzcy5lbnYuVVNFUiB8fCAnZGVmYXVsdCcpLmRpZ2VzdCgnaGV4Jykuc3Vic3RyaW5nKDAsIDE2KTtcbiAgICBjb25zdCBhcHBJZCA9ICdEb2xsaG91c2VNQ1AtVG9rZW5TdG9yZS12MSc7XG5cbiAgICByZXR1cm4gYCR7YXBwSWR9LSR7aG9zdG5hbWV9LSR7dXNlcm5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBHaXRIdWIgdG9rZW4gc2VjdXJlbHkgdG8gZmlsZVxuICAgKi9cbiAgYXN5bmMgc3RvcmVHaXRIdWJUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIHRva2VuIGZvcm1hdCBmaXJzdFxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlVG9rZW5Gb3JtYXQodG9rZW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKCdJbnZhbGlkIHRva2VuIGZvcm1hdCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3JtYWxpemUgYW5kIHZhbGlkYXRlIHRva2VuXG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodG9rZW4pO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoJ1Rva2VuIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycycpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkoVG9rZW5NYW5hZ2VyLlRPS0VOX0RJUik7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNobW9kKFRva2VuTWFuYWdlci5UT0tFTl9ESVIsIDBvNzAwLCB7XG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5zdG9yZUdpdEh1YlRva2VuJ1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEdlbmVyYXRlIGVuY3J5cHRpb24gY29tcG9uZW50c1xuICAgICAgY29uc3Qgc2FsdCA9IGNyeXB0by5yYW5kb21CeXRlcyhUb2tlbk1hbmFnZXIuU0FMVF9MRU5HVEgpO1xuICAgICAgY29uc3QgaXYgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoVG9rZW5NYW5hZ2VyLklWX0xFTkdUSCk7XG4gICAgICBjb25zdCBwYXNzcGhyYXNlID0gdGhpcy5nZXRNYWNoaW5lUGFzc3BocmFzZSgpO1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5kZXJpdmVLZXkocGFzc3BocmFzZSwgc2FsdCk7XG5cbiAgICAgIC8vIEVuY3J5cHQgdG9rZW5cbiAgICAgIGNvbnN0IGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdihUb2tlbk1hbmFnZXIuQUxHT1JJVEhNLCBrZXksIGl2KTtcbiAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBjaXBoZXIudXBkYXRlKHZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQsICd1dGY4JyksXG4gICAgICAgIGNpcGhlci5maW5hbCgpXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHRhZyA9IGNpcGhlci5nZXRBdXRoVGFnKCk7XG5cbiAgICAgIC8vIENyZWF0ZSBzdG9yYWdlIGZvcm1hdDogc2FsdCArIGl2ICsgdGFnICsgZW5jcnlwdGVkXG4gICAgICBjb25zdCBzdG9yZWQgPSBCdWZmZXIuY29uY2F0KFtzYWx0LCBpdiwgdGFnLCBlbmNyeXB0ZWRdKTtcblxuICAgICAgLy8gV3JpdGUgdG8gZmlsZSB3aXRoIHJlc3RyaWN0ZWQgcGVybWlzc2lvbnNcbiAgICAgIGNvbnN0IHRva2VuUGF0aCA9IHBhdGguam9pbihUb2tlbk1hbmFnZXIuVE9LRU5fRElSLCBUb2tlbk1hbmFnZXIuVE9LRU5fRklMRSk7XG4gICAgICAvLyBXcml0ZSB0aGUgYmluYXJ5IGNvbnRlbnQgdG8gdGhlIGZpbGUgKG5lZWQgdG8gY29udmVydCBCdWZmZXIgdG8gc3RyaW5nIGZvciBGaWxlT3BlcmF0aW9uc1NlcnZpY2UpXG4gICAgICAvLyBTaW5jZSB3ZSdyZSB3cml0aW5nIGJpbmFyeSBkYXRhLCB3ZSdsbCB3cml0ZSBhcyBiYXNlNjQgZm9yIHNhZmUgc3RvcmFnZVxuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy53cml0ZUZpbGUodG9rZW5QYXRoLCBzdG9yZWQudG9TdHJpbmcoJ2Jhc2U2NCcpLCB7XG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5zdG9yZUdpdEh1YlRva2VuJ1xuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNobW9kKHRva2VuUGF0aCwgMG82MDAsIHtcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnN0b3JlR2l0SHViVG9rZW4nXG4gICAgICB9KTtcblxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5zdG9yZUdpdEh1YlRva2VuJyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiBzdG9yZWQgc2VjdXJlbHknLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHRva2VuVHlwZTogdGhpcy5nZXRUb2tlblR5cGUodG9rZW4pLFxuICAgICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmluZm8oJ0dpdEh1YiB0b2tlbiBzdG9yZWQgc2VjdXJlbHknKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdUb2tlbk1hbmFnZXIuc3RvcmVHaXRIdWJUb2tlbicsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gc3RvcmUgR2l0SHViIHRva2VuOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihgRmFpbGVkIHRvIHN0b3JlIHRva2VuOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBHaXRIdWIgdG9rZW4gZnJvbSBzZWN1cmUgc3RvcmFnZVxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVHaXRIdWJUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW5QYXRoID0gcGF0aC5qb2luKFRva2VuTWFuYWdlci5UT0tFTl9ESVIsIFRva2VuTWFuYWdlci5UT0tFTl9GSUxFKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgZmlsZSBleGlzdHNcbiAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKHRva2VuUGF0aCk7XG4gICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAvLyBObyBzdG9yZWQgdG9rZW5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWQgZW5jcnlwdGVkIGRhdGEgKHN0b3JlZCBhcyBiYXNlNjQpXG4gICAgICBjb25zdCBiYXNlNjRDb250ZW50ID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5yZWFkRmlsZSh0b2tlblBhdGgsIHtcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnJldHJpZXZlR2l0SHViVG9rZW4nXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IEJ1ZmZlci5mcm9tKGJhc2U2NENvbnRlbnQsICdiYXNlNjQnKTtcblxuICAgICAgLy8gRXh0cmFjdCBjb21wb25lbnRzXG4gICAgICBjb25zdCBzYWx0ID0gc3RvcmVkLnN1YmFycmF5KDAsIFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCk7XG4gICAgICBjb25zdCBpdiA9IHN0b3JlZC5zdWJhcnJheShUb2tlbk1hbmFnZXIuU0FMVF9MRU5HVEgsIFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCArIFRva2VuTWFuYWdlci5JVl9MRU5HVEgpO1xuICAgICAgY29uc3QgdGFnID0gc3RvcmVkLnN1YmFycmF5KFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCArIFRva2VuTWFuYWdlci5JVl9MRU5HVEgsIFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCArIFRva2VuTWFuYWdlci5JVl9MRU5HVEggKyBUb2tlbk1hbmFnZXIuVEFHX0xFTkdUSCk7XG4gICAgICBjb25zdCBlbmNyeXB0ZWQgPSBzdG9yZWQuc3ViYXJyYXkoVG9rZW5NYW5hZ2VyLlNBTFRfTEVOR1RIICsgVG9rZW5NYW5hZ2VyLklWX0xFTkdUSCArIFRva2VuTWFuYWdlci5UQUdfTEVOR1RIKTtcblxuICAgICAgLy8gRGVyaXZlIGRlY3J5cHRpb24ga2V5XG4gICAgICBjb25zdCBwYXNzcGhyYXNlID0gdGhpcy5nZXRNYWNoaW5lUGFzc3BocmFzZSgpO1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5kZXJpdmVLZXkocGFzc3BocmFzZSwgc2FsdCk7XG5cbiAgICAgIC8vIERlY3J5cHQgdG9rZW5cbiAgICAgIGNvbnN0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoVG9rZW5NYW5hZ2VyLkFMR09SSVRITSwga2V5LCBpdik7XG4gICAgICBkZWNpcGhlci5zZXRBdXRoVGFnKHRhZyk7XG4gICAgICBcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW1xuICAgICAgICBkZWNpcGhlci51cGRhdGUoZW5jcnlwdGVkKSxcbiAgICAgICAgZGVjaXBoZXIuZmluYWwoKVxuICAgICAgXSkudG9TdHJpbmcoJ3V0ZjgnKTtcblxuICAgICAgLy8gVmFsaWRhdGUgZGVjcnlwdGVkIHRva2VuXG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVUb2tlbkZvcm1hdChkZWNyeXB0ZWQpKSB7XG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9GQUlMVVJFJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5yZXRyaWV2ZUdpdEh1YlRva2VuJyxcbiAgICAgICAgICBkZXRhaWxzOiAnRGVjcnlwdGVkIHRva2VuIGhhcyBpbnZhbGlkIGZvcm1hdCdcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5yZXRyaWV2ZUdpdEh1YlRva2VuJyxcbiAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiByZXRyaWV2ZWQgZnJvbSBzZWN1cmUgc3RvcmFnZScsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdG9rZW5UeXBlOiB0aGlzLmdldFRva2VuVHlwZShkZWNyeXB0ZWQpLFxuICAgICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KGRlY3J5cHRlZClcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBkZWNyeXB0ZWQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnJldHJpZXZlR2l0SHViVG9rZW4nLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIHJldHJpZXZlIEdpdEh1YiB0b2tlbjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gcmV0cmlldmUgc3RvcmVkIHRva2VuJywgeyBlcnJvciB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgc3RvcmVkIEdpdEh1YiB0b2tlblxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlU3RvcmVkVG9rZW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VuUGF0aCA9IHBhdGguam9pbihUb2tlbk1hbmFnZXIuVE9LRU5fRElSLCBUb2tlbk1hbmFnZXIuVE9LRU5fRklMRSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGZpbGUgZXhpc3RzIGJlZm9yZSBhdHRlbXB0aW5nIGRlbGV0aW9uXG4gICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyh0b2tlblBhdGgpO1xuICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUodG9rZW5QYXRoLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICBzb3VyY2U6ICdUb2tlbk1hbmFnZXIucmVtb3ZlU3RvcmVkVG9rZW4nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5yZW1vdmVTdG9yZWRUb2tlbicsXG4gICAgICAgICAgZGV0YWlsczogJ0dpdEh1YiB0b2tlbiByZW1vdmVkIGZyb20gc2VjdXJlIHN0b3JhZ2UnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxvZ2dlci5pbmZvKCdTdG9yZWQgR2l0SHViIHRva2VuIHJlbW92ZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdFxuICAgICAgICBsb2dnZXIuZGVidWcoJ05vIHN0b3JlZCB0b2tlbiB0byByZW1vdmUnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnJlbW92ZVN0b3JlZFRva2VuJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byByZW1vdmUgc3RvcmVkIHRva2VuOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWBcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHJlbW92ZSBzdG9yZWQgdG9rZW4nLCB7IGVycm9yIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgR2l0SHViIHRva2VuIGZyb20gZW52aXJvbm1lbnQgb3Igc2VjdXJlIHN0b3JhZ2VcbiAgICogVXBkYXRlZCB0byBjaGVjayBzZWN1cmUgc3RvcmFnZSBpZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3Qgc2V0XG4gICAqL1xuICBhc3luYyBnZXRHaXRIdWJUb2tlbkFzeW5jKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIC8vIEZpcnN0IGNoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlXG4gICAgY29uc3QgZW52VG9rZW4gPSB0aGlzLmdldEdpdEh1YlRva2VuKCk7XG4gICAgaWYgKGVudlRva2VuKSB7XG4gICAgICByZXR1cm4gZW52VG9rZW47XG4gICAgfVxuXG4gICAgLy8gRmFsbCBiYWNrIHRvIHNlY3VyZSBzdG9yYWdlXG4gICAgcmV0dXJuIHRoaXMucmV0cmlldmVHaXRIdWJUb2tlbigpO1xuICB9XG59Il19
|
|
582
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5NYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlY3VyaXR5L3Rva2VuTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQW9CcEU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUNmLE1BQU0sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRXZDLDZDQUE2QztJQUM3QyxNQUFNLENBQUMsZ0JBQWdCO1FBQ3JCLFlBQVksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxNQUFNLENBQVUscUJBQXFCLEdBQUc7UUFDOUMsK0RBQStEO1FBQy9ELHFCQUFxQixFQUFFLFVBQVUsRUFBTyx5QkFBeUI7UUFDakUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUssc0NBQXNDO1FBQzlFLGtCQUFrQixFQUFFLFVBQVUsRUFBVSxpQ0FBaUM7UUFDekUsaUJBQWlCLEVBQUUsVUFBVSxFQUFXLG1DQUFtQztRQUMzRSxhQUFhLEVBQUUsVUFBVSxFQUFlLGlCQUFpQjtRQUN6RCxrQkFBa0IsRUFBRSxVQUFVLEVBQVUsMkJBQTJCO1FBQ25FLHVGQUF1RjtRQUN2RixvQkFBb0IsRUFBRSxlQUFlLENBQUcsaUNBQWlDO0tBQzFFLENBQUM7SUFFRiwrQkFBK0I7SUFDdkIsTUFBTSxDQUFVLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RSxNQUFNLENBQVUsVUFBVSxHQUFHLGtCQUFrQixDQUFDO0lBQ2hELE1BQU0sQ0FBVSxTQUFTLEdBQUcsYUFBYSxDQUFDO0lBQzFDLE1BQU0sQ0FBVSxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sQ0FBVSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQy9CLE1BQU0sQ0FBVSxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sQ0FBVSxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLE1BQU0sQ0FBVSxVQUFVLEdBQUcsTUFBTSxDQUFDO0lBRTVDLDhFQUE4RTtJQUN0RSxzQkFBc0IsR0FBdUIsSUFBSSxDQUFDO0lBRTFELDRFQUE0RTtJQUNwRSxjQUFjLENBQXlCO0lBRS9DLFlBQVksY0FBc0M7UUFDaEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHlCQUF5QjtRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsNEJBQTRCO1FBQzFCLE9BQU8sSUFBSSxXQUFXLENBQUM7WUFDckIsV0FBVyxFQUFFLEVBQUUsRUFBVyx5QkFBeUI7WUFDbkQsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFdBQVc7WUFDckMsVUFBVSxFQUFFLENBQUMsR0FBRyxJQUFJLENBQU0scUNBQXFDO1NBQ2hFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCwyQkFBMkI7UUFDekIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQixDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxnREFBZ0Q7UUFDaEQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUN0RSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUNwQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxjQUFjO1FBQ1osMkJBQTJCO1FBQzNCLElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO1FBRXJDLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLDhHQUE4RyxDQUFDLENBQUM7WUFDNUgsS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7UUFDeEMsQ0FBQztRQUVELElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0hBQW9ILENBQUMsQ0FBQztZQUNsSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztRQUN4QyxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQ3JELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxtSEFBbUg7WUFDbkgsTUFBTSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsRUFBRTtnQkFDbEQsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2dCQUN2QyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07YUFDckIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsd0hBQXdIO1FBQ3hILElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbEMsTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRTtnQkFDdkMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO2dCQUNuQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7YUFDeEMsQ0FBQyxDQUFDO1lBQ0gsWUFBWSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDdEMsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLEtBQWE7UUFDdkIsSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9CLE9BQU8sWUFBWSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxDQUFDLEtBQWE7UUFDeEIsd0RBQXdEO1FBQ3hELElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3BFLE9BQU8sb0NBQW9DLENBQUM7UUFDOUMsQ0FBQztRQUNELElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pFLE9BQU8sdUJBQXVCLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE9BQU8sb0JBQW9CLENBQUM7UUFDOUIsQ0FBQztRQUNELElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JFLE9BQU8sbUJBQW1CLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxPQUFPLGVBQWUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxZQUFZLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxvQkFBb0IsQ0FBQztRQUM5QixDQUFDO1FBQ0QsNkJBQTZCO1FBQzdCLElBQUksWUFBWSxDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hFLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUMsS0FBYTtRQUMxQixJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FDdkIsS0FBYSxFQUNiLGNBQTJCO1FBRTNCLG9EQUFvRDtRQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxLQUFLLEVBQUUsc0JBQXNCO2FBQzlCLENBQUM7UUFDSixDQUFDO1FBRUQsMENBQTBDO1FBQzFDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3JELE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVqRCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLEVBQUU7Z0JBQ2xELFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztnQkFDdkMsWUFBWSxFQUFFLGVBQWUsQ0FBQyxZQUFZO2dCQUMxQyxlQUFlLEVBQUUsZUFBZSxDQUFDLGVBQWU7YUFDakQsQ0FBQyxDQUFDO1lBRUgsTUFBTSxJQUFJLGFBQWEsQ0FDckIseURBQXlELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQ3pILHFCQUFxQixDQUN0QixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQztZQUNILHVEQUF1RDtZQUN2RCxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDM0IsMERBQTBEO1lBQzFELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLDZCQUE2QixFQUFFO2dCQUMxRCxPQUFPLEVBQUU7b0JBQ1AsZUFBZSxFQUFFLFVBQVUsS0FBSyxFQUFFO29CQUNsQyxRQUFRLEVBQUUsZ0NBQWdDO29CQUMxQyxZQUFZLEVBQUUsa0JBQWtCO2lCQUNqQzthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2pHLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUV6RixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNqQixNQUFNLEtBQUssR0FBRyxxQkFBcUIsUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQzVFLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUU7b0JBQ3JDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtvQkFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2lCQUN4QyxDQUFDLENBQUM7Z0JBRUgsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxLQUFLLEVBQUUsS0FBSztpQkFDYixDQUFDO1lBQ0osQ0FBQztZQUVELHVDQUF1QztZQUN2QyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRSxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTlFLHVDQUF1QztZQUN2QyxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQzlELFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQzVCLENBQUM7WUFFRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDM0QsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUM3QixDQUFDO2dCQUVGLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUU7b0JBQzNDLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztvQkFDdkMsYUFBYSxFQUFFLGFBQWE7b0JBQzVCLGFBQWEsRUFBRSxXQUFXO2lCQUMzQixDQUFDLENBQUM7Z0JBRUgsT0FBTztvQkFDTCxPQUFPLEVBQUUsS0FBSztvQkFDZCxNQUFNLEVBQUUsV0FBVztvQkFDbkIsS0FBSyxFQUFFLDRCQUE0QixhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2lCQUM5RCxDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7Z0JBQ3pDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztnQkFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2dCQUN2QyxNQUFNLEVBQUUsV0FBVztnQkFDbkIsa0JBQWtCLEVBQUUsa0JBQWtCO2FBQ3ZDLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0wsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLFNBQVMsRUFBRTtvQkFDVCxTQUFTLEVBQUUsa0JBQWtCO29CQUM3QixTQUFTLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztpQkFDM0M7YUFDRixDQUFDO1FBRUosQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixnRUFBZ0U7WUFDaEUsSUFBSSxLQUFLLFlBQVksYUFBYSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztnQkFDM0UsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUMvQyxPQUFPO29CQUNMLE9BQU8sRUFBRSxLQUFLO29CQUNkLGlCQUFpQixFQUFFLElBQUk7b0JBQ3ZCLFlBQVksRUFBRSxhQUFhLENBQUMsWUFBWTtvQkFDeEMsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPO2lCQUNyQixDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztZQUM5RSxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFO2dCQUNyQyxLQUFLLEVBQUUsWUFBWTtnQkFDbkIsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2FBQ3hDLENBQUMsQ0FBQztZQUVILE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLHFCQUFxQixZQUFZLEVBQUU7YUFDM0MsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxzQkFBc0IsQ0FBQyxLQUFhLEVBQUUsS0FBYztRQUNsRCxzREFBc0Q7UUFDdEQsK0NBQStDO1FBQy9DLElBQUksV0FBVyxHQUFHLEtBQUs7YUFDcEIsVUFBVSxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQzthQUMxQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCLENBQUM7YUFDdEQsVUFBVSxDQUFDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQzthQUM5QyxVQUFVLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO2FBQzNDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsb0JBQW9CLENBQUM7YUFDOUMsVUFBVSxDQUFDLFlBQVksRUFBRSxrQkFBa0IsQ0FBQzthQUM1QyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFFLCtCQUErQjtRQUV0RixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxXQUFXLElBQUksWUFBWSxXQUFXLEdBQUcsQ0FBQztRQUM1QyxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGlCQUFpQixDQUFDLFNBQW1FO1FBQ25GLFFBQVEsU0FBUyxFQUFFLENBQUM7WUFDbEIsS0FBSyxNQUFNO2dCQUNULE9BQU87b0JBQ0wsUUFBUSxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUcsNENBQTRDO29CQUN4RSxRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7aUJBQ3pCLENBQUM7WUFFSixLQUFLLE9BQU87Z0JBQ1YsT0FBTztvQkFDTCxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRyw0Q0FBNEM7b0JBQ3hFLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztpQkFDekIsQ0FBQztZQUVKLEtBQUssYUFBYSxDQUFDLENBQUMsdURBQXVEO1lBQzNFLEtBQUssWUFBWSxFQUFFLHFCQUFxQjtnQkFDdEMsT0FBTztvQkFDTCxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRyw0Q0FBNEM7b0JBQ3hFLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztpQkFDekIsQ0FBQztZQUVKLEtBQUssTUFBTTtnQkFDVCxPQUFPO29CQUNMLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQztvQkFDbEIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN6QixDQUFDO1lBRUo7Z0JBQ0UsT0FBTztvQkFDTCxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBRSw0Q0FBNEM7aUJBQ3hFLENBQUM7UUFDTixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUMxQixTQUFtRTtRQUVuRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFcEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxLQUFLLEVBQUUsMkJBQTJCO2FBQ25DLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxTQUFTLENBQUMsVUFBa0IsRUFBRSxJQUFZO1FBQ2hELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssYUFBYTtRQUNuQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUN2QyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUM7UUFDNUMsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssb0JBQW9CO1FBQzFCLDRFQUE0RTtRQUM1RSxpRkFBaUY7UUFDakYsa0ZBQWtGO1FBQ2xGLHVEQUF1RDtRQUN2RCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xILE1BQU0sS0FBSyxHQUFHLDRCQUE0QixDQUFDO1FBRTNDLE9BQU8sR0FBRyxLQUFLLElBQUksUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsRUFBVSxFQUFFLEdBQVcsRUFBRSxTQUFpQjtRQUNsRixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHNFQUFzRTtZQUN0RSxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3RELElBQUksaUJBQWlCLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO2dCQUNuRixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDeEUsQ0FBQztZQUNELE1BQU0sSUFBSSxhQUFhLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFlBQVksQ0FBQyxVQUFrQixFQUFFLElBQVksRUFBRSxFQUFVLEVBQUUsR0FBVyxFQUFFLFNBQWlCO1FBQy9GLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxRSxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQWE7UUFDbEMsSUFBSSxDQUFDO1lBQ0gsOEJBQThCO1lBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxJQUFJLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFFRCwrQkFBK0I7WUFDL0IsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLE1BQU0sSUFBSSxhQUFhLENBQUMsbUNBQW1DLENBQUMsQ0FBQztZQUMvRCxDQUFDO1lBRUQsMEJBQTBCO1lBQzFCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUU7Z0JBQzdELE1BQU0sRUFBRSwrQkFBK0I7YUFDeEMsQ0FBQyxDQUFDO1lBRUgsaUNBQWlDO1lBQ2pDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUU3QyxnQkFBZ0I7WUFDaEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0RSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUM5QixNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxLQUFLLEVBQUU7YUFDZixDQUFDLENBQUM7WUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFaEMscURBQXFEO1lBQ3JELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBRXpELDRDQUE0QztZQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzdFLG9HQUFvRztZQUNwRywwRUFBMEU7WUFDMUUsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDeEUsTUFBTSxFQUFFLCtCQUErQjthQUN4QyxDQUFDLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUU7Z0JBQ2hELE1BQU0sRUFBRSwrQkFBK0I7YUFDeEMsQ0FBQyxDQUFDO1lBRUgscUJBQXFCO1lBQ3JCLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLCtCQUErQjtnQkFDdkMsT0FBTyxFQUFFLDhCQUE4QjtnQkFDdkMsUUFBUSxFQUFFO29CQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztvQkFDbkMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO2lCQUN4QzthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSwrQkFBK0I7Z0JBQ3ZDLE9BQU8sRUFBRSxpQ0FBaUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFO2FBQ3JHLENBQUMsQ0FBQztZQUVILE1BQU0sSUFBSSxhQUFhLENBQUMsMEJBQTBCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDaEgsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxtQkFBbUI7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUU3RSx1QkFBdUI7WUFDdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1osa0JBQWtCO2dCQUNsQixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCx5Q0FBeUM7WUFDekMsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xFLE1BQU0sRUFBRSxrQ0FBa0M7YUFDM0MsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFcEQscUJBQXFCO1lBQ3JCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEcsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM1SixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFL0csdUVBQXVFO1lBQ3ZFLGtGQUFrRjtZQUNsRixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFckUsMkJBQTJCO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDekMsZUFBZSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQixJQUFJLEVBQUUsMEJBQTBCO29CQUNoQyxRQUFRLEVBQUUsTUFBTTtvQkFDaEIsTUFBTSxFQUFFLGtDQUFrQztvQkFDMUMsT0FBTyxFQUFFLG9DQUFvQztpQkFDOUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLGtDQUFrQztnQkFDMUMsT0FBTyxFQUFFLDRDQUE0QztnQkFDckQsUUFBUSxFQUFFO29CQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztvQkFDdkMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO2lCQUM1QzthQUNGLENBQUMsQ0FBQztZQUVILE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsZUFBZSxDQUFDLGdCQUFnQixDQUFDO2dCQUMvQixJQUFJLEVBQUUsMEJBQTBCO2dCQUNoQyxRQUFRLEVBQUUsUUFBUTtnQkFDbEIsTUFBTSxFQUFFLGtDQUFrQztnQkFDMUMsT0FBTyxFQUFFLG9DQUFvQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUU7YUFDeEcsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDM0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQjtRQUNyQixJQUFJLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTdFLGtEQUFrRDtZQUNsRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNELElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFO29CQUN6RCxNQUFNLEVBQUUsZ0NBQWdDO2lCQUN6QyxDQUFDLENBQUM7Z0JBRUgsZUFBZSxDQUFDLGdCQUFnQixDQUFDO29CQUMvQixJQUFJLEVBQUUscUJBQXFCO29CQUMzQixRQUFRLEVBQUUsS0FBSztvQkFDZixNQUFNLEVBQUUsZ0NBQWdDO29CQUN4QyxPQUFPLEVBQUUsMENBQTBDO2lCQUNwRCxDQUFDLENBQUM7Z0JBRUgsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1lBQzdDLENBQUM7aUJBQU0sQ0FBQztnQkFDTixxQkFBcUI7Z0JBQ3JCLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixlQUFlLENBQUMsZ0JBQWdCLENBQUM7Z0JBQy9CLElBQUksRUFBRSxxQkFBcUI7Z0JBQzNCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLE1BQU0sRUFBRSxnQ0FBZ0M7Z0JBQ3hDLE9BQU8sRUFBRSxrQ0FBa0MsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFO2FBQ3RHLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQjtRQUN2QixtQ0FBbUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZDLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO1FBRUQsOEJBQThCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VjdXJlIEdpdEh1YiB0b2tlbiBtYW5hZ2VtZW50IGFuZCB2YWxpZGF0aW9uXG4gKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFJhdGVMaW1pdGVyIH0gZnJvbSAnLi4vdXRpbHMvUmF0ZUxpbWl0ZXIuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuL3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgSUZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5TY29wZXMge1xuICByZXF1aXJlZDogc3RyaW5nW107XG4gIG9wdGlvbmFsPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5WYWxpZGF0aW9uUmVzdWx0IHtcbiAgaXNWYWxpZDogYm9vbGVhbjtcbiAgc2NvcGVzPzogc3RyaW5nW107XG4gIHJhdGVMaW1pdD86IHtcbiAgICByZW1haW5pbmc6IG51bWJlcjtcbiAgICByZXNldFRpbWU6IERhdGU7XG4gIH07XG4gIHJhdGVMaW1pdEV4Y2VlZGVkPzogYm9vbGVhbjtcbiAgcmV0cnlBZnRlck1zPzogbnVtYmVyO1xuICBlcnJvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZWN1cmUgR2l0SHViIHRva2VuIG1hbmFnZXIgd2l0aCB2YWxpZGF0aW9uIGFuZCBwcm90ZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBUb2tlbk1hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyB0b2tlbkxvZ2dlZE9uY2UgPSBmYWxzZTtcblxuICAvKiogUmVzZXQgc3RhdGljIGZsYWdzIGZvciB0ZXN0IGlzb2xhdGlvbi4gKi9cbiAgc3RhdGljIHJlc2V0U3RhdGljU3RhdGUoKTogdm9pZCB7XG4gICAgVG9rZW5NYW5hZ2VyLnRva2VuTG9nZ2VkT25jZSA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgR0lUSFVCX1RPS0VOX1BBVFRFUk5TID0ge1xuICAgIC8vIE1vcmUgZmxleGlibGUgcGF0dGVybnMgLSBhY2NlcHQgYW55IGNvbnRlbnQgYWZ0ZXIgdGhlIHByZWZpeFxuICAgIFBFUlNPTkFMX0FDQ0VTU19UT0tFTjogL15naHBfLiskLywgICAgICAvLyBQZXJzb25hbCBhY2Nlc3MgdG9rZW5zXG4gICAgRklORV9HUkFJTkVEX1BBVDogL15naXRodWJfcGF0Xy4rJC8sICAgIC8vIEZpbmUtZ3JhaW5lZCBwZXJzb25hbCBhY2Nlc3MgdG9rZW5zXG4gICAgSU5TVEFMTEFUSU9OX1RPS0VOOiAvXmdoc18uKyQvLCAgICAgICAgIC8vIEdpdEh1YiBBcHAgaW5zdGFsbGF0aW9uIHRva2Vuc1xuICAgIFVTRVJfQUNDRVNTX1RPS0VOOiAvXmdodV8uKyQvLCAgICAgICAgICAvLyBHaXRIdWIgQXBwIHVzZXItdG8tc2VydmVyIHRva2Vuc1xuICAgIFJFRlJFU0hfVE9LRU46IC9eZ2hyXy4rJC8sICAgICAgICAgICAgICAvLyBSZWZyZXNoIHRva2Vuc1xuICAgIE9BVVRIX0FDQ0VTU19UT0tFTjogL15naG9fLiskLywgICAgICAgICAvLyBPQXV0aCBkZXZpY2UgZmxvdyB0b2tlbnNcbiAgICAvLyBHZW5lcmljIHBhdHRlcm4gdG8gY2F0Y2ggQUxMIEdpdEh1YiB0b2tlbnMgKGdoICsgYW55IGxldHRlciArIHVuZGVyc2NvcmUgKyBhbnl0aGluZylcbiAgICBHRU5FUklDX0dJVEhVQl9UT0tFTjogL15naFthLXpdXy4rJC9pICAgLy8gQ2F0Y2gtYWxsIGZvciBhbnkgZ2gqXyBwYXR0ZXJuXG4gIH07XG5cbiAgLy8gU2VjdXJlIHN0b3JhZ2UgY29uZmlndXJhdGlvblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUT0tFTl9ESVIgPSBwYXRoLmpvaW4oaG9tZWRpcigpLCAnLmRvbGxob3VzZScsICcuYXV0aCcpO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUT0tFTl9GSUxFID0gJ2dpdGh1Yl90b2tlbi5lbmMnO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBTEdPUklUSE0gPSAnYWVzLTI1Ni1nY20nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBLRVlfTEVOR1RIID0gMzI7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElWX0xFTkdUSCA9IDE2O1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUQUdfTEVOR1RIID0gMTY7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNBTFRfTEVOR1RIID0gMzI7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElURVJBVElPTlMgPSAxMDAwMDA7XG5cbiAgLy8gUmF0ZSBsaW1pdGVyIGZvciB0b2tlbiB2YWxpZGF0aW9uIG9wZXJhdGlvbnMgLSBwcmV2ZW50cyBicnV0ZSBmb3JjZSBhdHRhY2tzXG4gIHByaXZhdGUgdG9rZW5WYWxpZGF0aW9uTGltaXRlcjogUmF0ZUxpbWl0ZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBGaWxlIG9wZXJhdGlvbnMgc2VydmljZSBmb3Igc2VjdXJlIGZpbGUgYWNjZXNzIChpbmplY3RlZCB2aWEgY29uc3RydWN0b3IpXG4gIHByaXZhdGUgZmlsZU9wZXJhdGlvbnM6IElGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG5cbiAgY29uc3RydWN0b3IoZmlsZU9wZXJhdGlvbnM6IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UpIHtcbiAgICB0aGlzLmZpbGVPcGVyYXRpb25zID0gZmlsZU9wZXJhdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG9yIGNyZWF0ZSB0aGUgdG9rZW4gdmFsaWRhdGlvbiByYXRlIGxpbWl0ZXJcbiAgICogUHJldmVudHMgYnJ1dGUgZm9yY2UgdG9rZW4gdmFsaWRhdGlvbiBhdHRhY2tzXG4gICAqL1xuICBwcml2YXRlIGdldFRva2VuVmFsaWRhdGlvbkxpbWl0ZXIoKTogUmF0ZUxpbWl0ZXIge1xuICAgIGlmICghdGhpcy50b2tlblZhbGlkYXRpb25MaW1pdGVyKSB7XG4gICAgICB0aGlzLnRva2VuVmFsaWRhdGlvbkxpbWl0ZXIgPSB0aGlzLmNyZWF0ZVRva2VuVmFsaWRhdGlvbkxpbWl0ZXIoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudG9rZW5WYWxpZGF0aW9uTGltaXRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSByYXRlIGxpbWl0ZXIgc3BlY2lmaWNhbGx5IGZvciB0b2tlbiB2YWxpZGF0aW9uXG4gICAqIENvbnNlcnZhdGl2ZSBsaW1pdHMgdG8gcHJldmVudCBhYnVzZSB3aGlsZSBhbGxvd2luZyBsZWdpdGltYXRlIHVzYWdlXG4gICAqL1xuICBjcmVhdGVUb2tlblZhbGlkYXRpb25MaW1pdGVyKCk6IFJhdGVMaW1pdGVyIHtcbiAgICByZXR1cm4gbmV3IFJhdGVMaW1pdGVyKHtcbiAgICAgIG1heFJlcXVlc3RzOiAxMCwgICAgICAgICAgLy8gMTAgdmFsaWRhdGlvbiBhdHRlbXB0c1xuICAgICAgd2luZG93TXM6IDYwICogNjAgKiAxMDAwLCAvLyBwZXIgaG91clxuICAgICAgbWluRGVsYXlNczogNSAqIDEwMDAgICAgICAvLyA1IHNlY29uZHMgbWluaW11bSBiZXR3ZWVuIGF0dGVtcHRzXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHRva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdGVyXG4gICAqIFVzZWZ1bCBmb3IgdGVzdGluZyBvciBtYW51YWwgaW50ZXJ2ZW50aW9uXG4gICAqL1xuICByZXNldFRva2VuVmFsaWRhdGlvbkxpbWl0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblZhbGlkYXRpb25MaW1pdGVyPy5yZXNldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIEdpdEh1YiB0b2tlbiBmb3JtYXRcbiAgICovXG4gIHZhbGlkYXRlVG9rZW5Gb3JtYXQodG9rZW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICghdG9rZW4gfHwgdHlwZW9mIHRva2VuICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGFnYWluc3QgYWxsIGtub3duIEdpdEh1YiB0b2tlbiBwYXR0ZXJuc1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMpLnNvbWUocGF0dGVybiA9PlxuICAgICAgcGF0dGVybi50ZXN0KHRva2VuKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEdpdEh1YiB0b2tlbiBmcm9tIGVudmlyb25tZW50IHdpdGggdmFsaWRhdGlvblxuICAgKlxuICAgKiBTdXBwb3J0cyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHZhcmlhYmxlIG5hbWVzOlxuICAgKiAtIEdJVEhVQl9UT0tFTiAoY2Fub25pY2FsKVxuICAgKiAtIFRFU1RfR0lUSFVCX1RPS0VOIChkZXByZWNhdGVkKVxuICAgKiAtIEdJVEhVQl9URVNUX1RPS0VOIChkZXByZWNhdGVkKVxuICAgKi9cbiAgZ2V0R2l0SHViVG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVHJ5IGNhbm9uaWNhbCBuYW1lIGZpcnN0XG4gICAgbGV0IHRva2VuID0gcHJvY2Vzcy5lbnYuR0lUSFVCX1RPS0VOO1xuXG4gICAgLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eTogQ2hlY2sgZm9yIG9sZCB2YXJpYWJsZSBuYW1lc1xuICAgIGlmICghdG9rZW4gJiYgcHJvY2Vzcy5lbnYuVEVTVF9HSVRIVUJfVE9LRU4pIHtcbiAgICAgIGxvZ2dlci53YXJuKCdERVBSRUNBVEVEOiBURVNUX0dJVEhVQl9UT0tFTiBpcyBkZXByZWNhdGVkLiBVc2UgR0lUSFVCX1RPS0VOIHdpdGggLmVudiBmaWxlIG9yIEdJVEhVQl9URVNUX1RPS0VOIGZvciB0ZXN0cy4nKTtcbiAgICAgIHRva2VuID0gcHJvY2Vzcy5lbnYuVEVTVF9HSVRIVUJfVE9LRU47XG4gICAgfVxuXG4gICAgaWYgKCF0b2tlbiAmJiBwcm9jZXNzLmVudi5HSVRIVUJfVEVTVF9UT0tFTikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0RFUFJFQ0FURUQ6IEdJVEhVQl9URVNUX1RPS0VOIGZvdW5kIGJ1dCBzaG91bGQgYmUgdXNlZCBieSB0ZXN0IGNvZGUgb25seS4gUHJvZHVjdGlvbiBjb2RlIHNob3VsZCB1c2UgR0lUSFVCX1RPS0VOLicpO1xuICAgICAgdG9rZW4gPSBwcm9jZXNzLmVudi5HSVRIVUJfVEVTVF9UT0tFTjtcbiAgICB9XG5cbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIEdpdEh1YiB0b2tlbiBmb3VuZCBpbiBlbnZpcm9ubWVudCcpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlVG9rZW5Gb3JtYXQodG9rZW4pKSB7XG4gICAgICAvLyBjb2RlcWxbanMvY2xlYXItdGV4dC1sb2dnaW5nXSDigJQgT25seSB0aGUgZmlyc3QgNCBjaGFycyAodG9rZW5QcmVmaXgpIGFuZCBsZW5ndGggYXJlIGxvZ2dlZCwgbmV2ZXIgdGhlIGZ1bGwgdG9rZW5cbiAgICAgIGxvZ2dlci53YXJuKCdJbnZhbGlkIEdpdEh1YiB0b2tlbiBmb3JtYXQgZGV0ZWN0ZWQnLCB7XG4gICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKSxcbiAgICAgICAgbGVuZ3RoOiB0b2tlbi5sZW5ndGhcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY29kZXFsW2pzL2NsZWFyLXRleHQtbG9nZ2luZ10g4oCUIE9ubHkgdG9rZW4gdHlwZSBuYW1lIGFuZCBmaXJzdCA0IGNoYXJzICh0b2tlblByZWZpeCkgYXJlIGxvZ2dlZCwgbmV2ZXIgdGhlIGZ1bGwgdG9rZW5cbiAgICBpZiAoIVRva2VuTWFuYWdlci50b2tlbkxvZ2dlZE9uY2UpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnVmFsaWQgR2l0SHViIHRva2VuIGZvdW5kJywge1xuICAgICAgICB0b2tlblR5cGU6IHRoaXMuZ2V0VG9rZW5UeXBlKHRva2VuKSxcbiAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pXG4gICAgICB9KTtcbiAgICAgIFRva2VuTWFuYWdlci50b2tlbkxvZ2dlZE9uY2UgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRhY3QgdG9rZW4gZm9yIHNhZmUgbG9nZ2luZ1xuICAgKi9cbiAgcmVkYWN0VG9rZW4odG9rZW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCF0b2tlbiB8fCB0b2tlbi5sZW5ndGggPCA4KSB7XG4gICAgICByZXR1cm4gJ1tSRURBQ1RFRF0nO1xuICAgIH1cblxuICAgIHJldHVybiB0b2tlbi5zdWJzdHJpbmcoMCwgNCkgKyAnLi4uJyArIHRva2VuLnN1YnN0cmluZyh0b2tlbi5sZW5ndGggLSA0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdG9rZW4gdHlwZSBmcm9tIGZvcm1hdFxuICAgKi9cbiAgZ2V0VG9rZW5UeXBlKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIENoZWNrIGZpbmUtZ3JhaW5lZCBQQVQgZmlyc3Qgc2luY2UgaXQncyBtb3JlIHNwZWNpZmljXG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuRklORV9HUkFJTkVEX1BBVC50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuICdGaW5lLWdyYWluZWQgUGVyc29uYWwgQWNjZXNzIFRva2VuJztcbiAgICB9XG4gICAgaWYgKFRva2VuTWFuYWdlci5HSVRIVUJfVE9LRU5fUEFUVEVSTlMuUEVSU09OQUxfQUNDRVNTX1RPS0VOLnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ1BlcnNvbmFsIEFjY2VzcyBUb2tlbic7XG4gICAgfVxuICAgIGlmIChUb2tlbk1hbmFnZXIuR0lUSFVCX1RPS0VOX1BBVFRFUk5TLklOU1RBTExBVElPTl9UT0tFTi50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuICdJbnN0YWxsYXRpb24gVG9rZW4nO1xuICAgIH1cbiAgICBpZiAoVG9rZW5NYW5hZ2VyLkdJVEhVQl9UT0tFTl9QQVRURVJOUy5VU0VSX0FDQ0VTU19UT0tFTi50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuICdVc2VyIEFjY2VzcyBUb2tlbic7XG4gICAgfVxuICAgIGlmIChUb2tlbk1hbmFnZXIuR0lUSFVCX1RPS0VOX1BBVFRFUk5TLlJFRlJFU0hfVE9LRU4udGVzdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiAnUmVmcmVzaCBUb2tlbic7XG4gICAgfVxuICAgIGlmIChUb2tlbk1hbmFnZXIuR0lUSFVCX1RPS0VOX1BBVFRFUk5TLk9BVVRIX0FDQ0VTU19UT0tFTi50ZXN0KHRva2VuKSkge1xuICAgICAgcmV0dXJuICdPQXV0aCBBY2Nlc3MgVG9rZW4nO1xuICAgIH1cbiAgICAvLyBDaGVjayBnZW5lcmljIHBhdHRlcm4gbGFzdFxuICAgIGlmIChUb2tlbk1hbmFnZXIuR0lUSFVCX1RPS0VOX1BBVFRFUk5TLkdFTkVSSUNfR0lUSFVCX1RPS0VOLnRlc3QodG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0dpdEh1YiBUb2tlbic7XG4gICAgfVxuICAgIHJldHVybiAnVW5rbm93bic7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNhZmUgdG9rZW4gcHJlZml4IGZvciBsb2dnaW5nXG4gICAqL1xuICBnZXRUb2tlblByZWZpeCh0b2tlbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRva2VuIHx8IHRva2VuLmxlbmd0aCA8IDQpIHtcbiAgICAgIHJldHVybiAnW0lOVkFMSURdJztcbiAgICB9XG4gICAgcmV0dXJuIHRva2VuLnN1YnN0cmluZygwLCA0KSArICcuLi4nO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRva2VuIHNjb3BlcyB2aWEgR2l0SHViIEFQSVxuICAgKi9cbiAgYXN5bmMgdmFsaWRhdGVUb2tlblNjb3BlcyhcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIHJlcXVpcmVkU2NvcGVzOiBUb2tlblNjb3Blc1xuICApOiBQcm9taXNlPFRva2VuVmFsaWRhdGlvblJlc3VsdD4ge1xuICAgIC8vIFZhbGlkYXRlIHRva2VuIGZvcm1hdCBiZWZvcmUgY29uc3VtaW5nIHJhdGUgbGltaXRcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVUb2tlbkZvcm1hdCh0b2tlbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogJ0ludmFsaWQgdG9rZW4gZm9ybWF0J1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayByYXRlIGxpbWl0IGJlZm9yZSBtYWtpbmcgQVBJIGNhbGxcbiAgICBjb25zdCByYXRlTGltaXRlciA9IHRoaXMuZ2V0VG9rZW5WYWxpZGF0aW9uTGltaXRlcigpO1xuICAgIGNvbnN0IHJhdGVMaW1pdFN0YXR1cyA9IHJhdGVMaW1pdGVyLmNoZWNrTGltaXQoKTtcblxuICAgIGlmICghcmF0ZUxpbWl0U3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdUb2tlbiB2YWxpZGF0aW9uIHJhdGUgbGltaXQgZXhjZWVkZWQnLCB7XG4gICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKSxcbiAgICAgICAgcmV0cnlBZnRlck1zOiByYXRlTGltaXRTdGF0dXMucmV0cnlBZnRlck1zLFxuICAgICAgICByZW1haW5pbmdUb2tlbnM6IHJhdGVMaW1pdFN0YXR1cy5yZW1haW5pbmdUb2tlbnNcbiAgICAgIH0pO1xuXG4gICAgICB0aHJvdyBuZXcgU2VjdXJpdHlFcnJvcihcbiAgICAgICAgYFRva2VuIHZhbGlkYXRpb24gcmF0ZSBsaW1pdCBleGNlZWRlZC4gUGxlYXNlIHJldHJ5IGluICR7TWF0aC5jZWlsKChyYXRlTGltaXRTdGF0dXMucmV0cnlBZnRlck1zIHx8IDApIC8gMTAwMCl9IHNlY29uZHMuYCxcbiAgICAgICAgJ1JBVEVfTElNSVRfRVhDRUVERUQnXG4gICAgICApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBDb25zdW1lIHJhdGUgbGltaXQgdG9rZW4gZm9yIHRoaXMgdmFsaWRhdGlvbiBhdHRlbXB0XG4gICAgICByYXRlTGltaXRlci5jb25zdW1lVG9rZW4oKTtcbiAgICAgIC8vIE1ha2UgYSB0ZXN0IEFQSSBjYWxsIHRvIGNoZWNrIHRva2VuIHZhbGlkaXR5IGFuZCBzY29wZXNcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcicsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAsXG4gICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nLFxuICAgICAgICAgICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC8xLjAnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByYXRlTGltaXRSZW1haW5pbmcgPSBOdW1iZXIucGFyc2VJbnQocmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtcmF0ZWxpbWl0LXJlbWFpbmluZycpIHx8ICcwJyk7XG4gICAgICBjb25zdCByYXRlTGltaXRSZXNldCA9IE51bWJlci5wYXJzZUludChyZXNwb25zZS5oZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVzZXQnKSB8fCAnMCcpO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gYEdpdEh1YiBBUEkgZXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YDtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ1Rva2VuIHZhbGlkYXRpb24gZmFpbGVkJywge1xuICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IGVycm9yXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3Qgc2NvcGVzIGZyb20gcmVzcG9uc2UgaGVhZGVyc1xuICAgICAgY29uc3Qgc2NvcGVzSGVhZGVyID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtb2F1dGgtc2NvcGVzJykgfHwgJyc7XG4gICAgICBjb25zdCB0b2tlblNjb3BlcyA9IHNjb3Blc0hlYWRlci5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIocyA9PiBzKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgcmVxdWlyZWQgc2NvcGVzIGFyZSBwcmVzZW50XG4gICAgICBjb25zdCBoYXNSZXF1aXJlZFNjb3BlcyA9IHJlcXVpcmVkU2NvcGVzLnJlcXVpcmVkLmV2ZXJ5KHNjb3BlID0+IFxuICAgICAgICB0b2tlblNjb3Blcy5pbmNsdWRlcyhzY29wZSlcbiAgICAgICk7XG5cbiAgICAgIGlmICghaGFzUmVxdWlyZWRTY29wZXMpIHtcbiAgICAgICAgY29uc3QgbWlzc2luZ1Njb3BlcyA9IHJlcXVpcmVkU2NvcGVzLnJlcXVpcmVkLmZpbHRlcihzY29wZSA9PiBcbiAgICAgICAgICAhdG9rZW5TY29wZXMuaW5jbHVkZXMoc2NvcGUpXG4gICAgICAgICk7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIud2FybignVG9rZW4gbWlzc2luZyByZXF1aXJlZCBzY29wZXMnLCB7XG4gICAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pLFxuICAgICAgICAgIG1pc3NpbmdTY29wZXM6IG1pc3NpbmdTY29wZXMsXG4gICAgICAgICAgY3VycmVudFNjb3BlczogdG9rZW5TY29wZXNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICBzY29wZXM6IHRva2VuU2NvcGVzLFxuICAgICAgICAgIGVycm9yOiBgTWlzc2luZyByZXF1aXJlZCBzY29wZXM6ICR7bWlzc2luZ1Njb3Blcy5qb2luKCcsICcpfWBcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oJ1Rva2VuIHZhbGlkYXRpb24gc3VjY2Vzc2Z1bCcsIHtcbiAgICAgICAgdG9rZW5UeXBlOiB0aGlzLmdldFRva2VuVHlwZSh0b2tlbiksXG4gICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKSxcbiAgICAgICAgc2NvcGVzOiB0b2tlblNjb3BlcyxcbiAgICAgICAgcmF0ZUxpbWl0UmVtYWluaW5nOiByYXRlTGltaXRSZW1haW5pbmdcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICBzY29wZXM6IHRva2VuU2NvcGVzLFxuICAgICAgICByYXRlTGltaXQ6IHtcbiAgICAgICAgICByZW1haW5pbmc6IHJhdGVMaW1pdFJlbWFpbmluZyxcbiAgICAgICAgICByZXNldFRpbWU6IG5ldyBEYXRlKHJhdGVMaW1pdFJlc2V0ICogMTAwMClcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBIYW5kbGUgU2VjdXJpdHlFcnJvciAoaW5jbHVkaW5nIHJhdGUgbGltaXQgZXJyb3JzKSBzZXBhcmF0ZWx5XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZWN1cml0eUVycm9yICYmIGVycm9yLmNvZGUgPT09ICdSQVRFX0xJTUlUX0VYQ0VFREVEJykge1xuICAgICAgICBjb25zdCBjdXJyZW50U3RhdHVzID0gcmF0ZUxpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgIHJhdGVMaW1pdEV4Y2VlZGVkOiB0cnVlLFxuICAgICAgICAgIHJldHJ5QWZ0ZXJNczogY3VycmVudFN0YXR1cy5yZXRyeUFmdGVyTXMsXG4gICAgICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcic7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1Rva2VuIHZhbGlkYXRpb24gZXJyb3InLCB7XG4gICAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgIHRva2VuUHJlZml4OiB0aGlzLmdldFRva2VuUHJlZml4KHRva2VuKVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcjogYFZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3JNZXNzYWdlfWBcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBzYWZlIGVycm9yIG1lc3NhZ2Ugd2l0aG91dCB0b2tlbiBleHBvc3VyZVxuICAgKi9cbiAgY3JlYXRlU2FmZUVycm9yTWVzc2FnZShlcnJvcjogc3RyaW5nLCB0b2tlbj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gUmVtb3ZlIGFueSBwb3RlbnRpYWwgdG9rZW4gZGF0YSBmcm9tIGVycm9yIG1lc3NhZ2VzXG4gICAgLy8gVXNpbmcgd29yZCBib3VuZGFyaWVzIHRvIGF2b2lkIG92ZXItbWF0Y2hpbmdcbiAgICBsZXQgc2FmZU1lc3NhZ2UgPSBlcnJvclxuICAgICAgLnJlcGxhY2VBbGwoL1xcYmdocF9cXFMrL2csICdbUkVEQUNURURfUEFUXScpXG4gICAgICAucmVwbGFjZUFsbCgvXFxiZ2l0aHViX3BhdF9cXFMrL2csICdbUkVEQUNURURfRklORV9QQVRdJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXGJnaHNfXFxTKy9nLCAnW1JFREFDVEVEX0lOU1RBTExdJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXGJnaHVfXFxTKy9nLCAnW1JFREFDVEVEX1VTRVJdJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXGJnaHJfXFxTKy9nLCAnW1JFREFDVEVEX1JFRlJFU0hdJylcbiAgICAgIC5yZXBsYWNlQWxsKC9cXGJnaG9fXFxTKy9nLCAnW1JFREFDVEVEX09BVVRIXScpXG4gICAgICAucmVwbGFjZUFsbCgvXFxiZ2hbYS16XV9cXFMrL2dpLCAnW1JFREFDVEVEX1RPS0VOXScpOyAgLy8gQ2F0Y2ggYW55IG90aGVyIGdoKl8gcGF0dGVyblxuXG4gICAgaWYgKHRva2VuKSB7XG4gICAgICBjb25zdCB0b2tlblByZWZpeCA9IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pO1xuICAgICAgc2FmZU1lc3NhZ2UgKz0gYCAoVG9rZW46ICR7dG9rZW5QcmVmaXh9KWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNhZmVNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtaW5pbXVtIHJlcXVpcmVkIHNjb3BlcyBmb3IgZGlmZmVyZW50IG9wZXJhdGlvbnNcbiAgICpcbiAgICogTk9URTogVGhlICdtYXJrZXRwbGFjZScgc2NvcGUgaWRlbnRpZmllciBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAqIHdpdGggZXhpc3RpbmcgdG9rZW4gdmFsaWRhdGlvbnMuIFRoaXMgaXMgYW4gaW50ZXJuYWwgc2NvcGUgbmFtZSBhbmQgZG9lcyBub3RcbiAgICogYWZmZWN0IHVzZXItZmFjaW5nIGZ1bmN0aW9uYWxpdHkuIChQUiAjMjgwKVxuICAgKi9cbiAgZ2V0UmVxdWlyZWRTY29wZXMob3BlcmF0aW9uOiAncmVhZCcgfCAnd3JpdGUnIHwgJ21hcmtldHBsYWNlJyB8ICdjb2xsZWN0aW9uJyB8ICdnaXN0Jyk6IFRva2VuU2NvcGVzIHtcbiAgICBzd2l0Y2ggKG9wZXJhdGlvbikge1xuICAgICAgY2FzZSAncmVhZCc6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVxdWlyZWQ6IFsncHVibGljX3JlcG8nXSwgIC8vIE9BdXRoIHRva2VucyB1c2UgJ3B1YmxpY19yZXBvJyBub3QgJ3JlcG8nXG4gICAgICAgICAgb3B0aW9uYWw6IFsndXNlcjplbWFpbCddXG4gICAgICAgIH07XG4gICAgICBcbiAgICAgIGNhc2UgJ3dyaXRlJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXF1aXJlZDogWydwdWJsaWNfcmVwbyddLCAgLy8gT0F1dGggdG9rZW5zIHVzZSAncHVibGljX3JlcG8nIG5vdCAncmVwbydcbiAgICAgICAgICBvcHRpb25hbDogWyd1c2VyOmVtYWlsJ11cbiAgICAgICAgfTtcbiAgICAgIFxuICAgICAgY2FzZSAnbWFya2V0cGxhY2UnOiAvLyBJbnRlcm5hbCBzY29wZSBuYW1lIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgKFBSICMyODApXG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzogLy8gTmV3IHByZWZlcnJlZCBuYW1lXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVxdWlyZWQ6IFsncHVibGljX3JlcG8nXSwgIC8vIE9BdXRoIHRva2VucyB1c2UgJ3B1YmxpY19yZXBvJyBub3QgJ3JlcG8nXG4gICAgICAgICAgb3B0aW9uYWw6IFsndXNlcjplbWFpbCddXG4gICAgICAgIH07XG4gICAgICBcbiAgICAgIGNhc2UgJ2dpc3QnOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHJlcXVpcmVkOiBbJ2dpc3QnXSxcbiAgICAgICAgICBvcHRpb25hbDogWyd1c2VyOmVtYWlsJ11cbiAgICAgICAgfTtcbiAgICAgIFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByZXF1aXJlZDogWydwdWJsaWNfcmVwbyddICAvLyBPQXV0aCB0b2tlbnMgdXNlICdwdWJsaWNfcmVwbycgbm90ICdyZXBvJ1xuICAgICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0b2tlbiBoYXMgc3VmZmljaWVudCBwZXJtaXNzaW9ucyBmb3Igb3BlcmF0aW9uXG4gICAqXG4gICAqIE5PVEU6IFRoZSAnbWFya2V0cGxhY2UnIG9wZXJhdGlvbiB0eXBlIGlzIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAqIFRoaXMgaXMgY2FsbGVkIGludGVybmFsbHkgd2hlbiBhY2Nlc3NpbmcgY29sbGVjdGlvbiBmZWF0dXJlcy4gKFBSICMyODApXG4gICAqL1xuICBhc3luYyBlbnN1cmVUb2tlblBlcm1pc3Npb25zKFxuICAgIG9wZXJhdGlvbjogJ3JlYWQnIHwgJ3dyaXRlJyB8ICdtYXJrZXRwbGFjZScgfCAnY29sbGVjdGlvbicgfCAnZ2lzdCdcbiAgKTogUHJvbWlzZTxUb2tlblZhbGlkYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuZ2V0R2l0SHViVG9rZW4oKTtcbiAgICBcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6ICdObyBHaXRIdWIgdG9rZW4gYXZhaWxhYmxlJ1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1aXJlZFNjb3BlcyA9IHRoaXMuZ2V0UmVxdWlyZWRTY29wZXMob3BlcmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVRva2VuU2NvcGVzKHRva2VuLCByZXF1aXJlZFNjb3Blcyk7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlIGVuY3J5cHRpb24ga2V5IGZyb20gYSBwYXNzcGhyYXNlXG4gICAqL1xuICBwcml2YXRlIGRlcml2ZUtleShwYXNzcGhyYXNlOiBzdHJpbmcsIHNhbHQ6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIGNyeXB0by5wYmtkZjJTeW5jKHBhc3NwaHJhc2UsIHNhbHQsIFRva2VuTWFuYWdlci5JVEVSQVRJT05TLCBUb2tlbk1hbmFnZXIuS0VZX0xFTkdUSCwgJ3NoYTI1NicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYXNzcGhyYXNlIGZvciB0b2tlbiBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiBQcmlvcml0eTogRE9MTEhPVVNFX1RPS0VOX1NFQ1JFVCBlbnYgdmFyIOKGkiBtYWNoaW5lLWRlcml2ZWQgcGFzc3BocmFzZSAoZmFsbGJhY2spLlxuICAgKiBUaGUgbWFjaGluZS1kZXJpdmVkIHBhc3NwaHJhc2UgdXNlcyBob21lZGlyICsgVVNFUiB3aGljaCBpcyBwcmVkaWN0YWJsZSAoIzE3MzUpLlxuICAgKiBTZXQgRE9MTEhPVVNFX1RPS0VOX1NFQ1JFVCBmb3Igc3Ryb25nZXIgcHJvdGVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgZ2V0UGFzc3BocmFzZSgpOiBzdHJpbmcge1xuICAgIGlmIChwcm9jZXNzLmVudi5ET0xMSE9VU0VfVE9LRU5fU0VDUkVUKSB7XG4gICAgICByZXR1cm4gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX1RPS0VOX1NFQ1JFVDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0TWFjaGluZVBhc3NwaHJhc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWNoaW5lLWRlcml2ZWQgcGFzc3BocmFzZSDigJQgZmFsbGJhY2sgd2hlbiBET0xMSE9VU0VfVE9LRU5fU0VDUkVUIGlzIG5vdFxuICAgKiBzZXQsIGFuZCBtaWdyYXRpb24gcGF0aCBmb3IgdG9rZW5zIGVuY3J5cHRlZCBiZWZvcmUgdGhhdCBlbnYgdmFyIGV4aXN0ZWQuXG4gICAqIE5vdCBkZXByZWNhdGVkOyBzdGlsbCB0aGUgZGVmYXVsdCBmb3IgaW5zdGFsbGF0aW9ucyB0aGF0IGhhdmVuJ3Qgb3B0ZWQgaW5cbiAgICogdG8gYW4gZXhwbGljaXQgc2VjcmV0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRNYWNoaW5lUGFzc3BocmFzZSgpOiBzdHJpbmcge1xuICAgIC8vIGNvZGVxbFtqcy9pbnN1ZmZpY2llbnQtcGFzc3dvcmQtaGFzaGluZ10g4oCUIFRoZXNlIGFyZSBOT1QgcGFzc3dvcmQgaGFzaGVzLlxuICAgIC8vIFNIQS0yNTYgaXMgdXNlZCB0byBkZXJpdmUgYSBzdGFibGUgbWFjaGluZSBmaW5nZXJwcmludCBmcm9tIHN5c3RlbSBpZGVudGlmaWVyc1xuICAgIC8vIChob21lIGRpcmVjdG9yeSBwYXRoLCBPUyB1c2VybmFtZSkuIFRoZSBhY3R1YWwgdG9rZW4gZW5jcnlwdGlvbiB1c2VzIHBia2RmMlN5bmNcbiAgICAvLyB3aXRoIElURVJBVElPTlMgcm91bmRzIChzZWUgZGVyaXZlS2V5IG1ldGhvZCBhYm92ZSkuXG4gICAgY29uc3QgaG9zdG5hbWUgPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGhvbWVkaXIoKSkuZGlnZXN0KCdoZXgnKS5zdWJzdHJpbmcoMCwgMTYpO1xuICAgIGNvbnN0IHVzZXJuYW1lID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShwcm9jZXNzLmVudi5VU0VSIHx8ICdkZWZhdWx0JykuZGlnZXN0KCdoZXgnKS5zdWJzdHJpbmcoMCwgMTYpO1xuICAgIGNvbnN0IGFwcElkID0gJ0RvbGxob3VzZU1DUC1Ub2tlblN0b3JlLXYxJztcblxuICAgIHJldHVybiBgJHthcHBJZH0tJHtob3N0bmFtZX0tJHt1c2VybmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgZGVjcnlwdGlvbiB3aXRoIHRoZSBwcmltYXJ5IHBhc3NwaHJhc2UsIHRoZW4gZmFsbCBiYWNrIHRvIHRoZVxuICAgKiBtYWNoaW5lLWRlcml2ZWQgcGFzc3BocmFzZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAoIzE3MzUpLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWNyeXB0V2l0aEZhbGxiYWNrKHNhbHQ6IEJ1ZmZlciwgaXY6IEJ1ZmZlciwgdGFnOiBCdWZmZXIsIGVuY3J5cHRlZDogQnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmltYXJ5UGFzc3BocmFzZSA9IHRoaXMuZ2V0UGFzc3BocmFzZSgpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWNyeXB0VG9rZW4ocHJpbWFyeVBhc3NwaHJhc2UsIHNhbHQsIGl2LCB0YWcsIGVuY3J5cHRlZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZiBwcmltYXJ5IHBhc3NwaHJhc2UgZGlmZmVycyBmcm9tIG1hY2hpbmUgcGFzc3BocmFzZSwgdHJ5IGZhbGxiYWNrXG4gICAgICBjb25zdCBtYWNoaW5lUGFzc3BocmFzZSA9IHRoaXMuZ2V0TWFjaGluZVBhc3NwaHJhc2UoKTtcbiAgICAgIGlmIChtYWNoaW5lUGFzc3BocmFzZSAhPT0gcHJpbWFyeVBhc3NwaHJhc2UpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByaW1hcnkgcGFzc3BocmFzZSBmYWlsZWQsIHRyeWluZyBtYWNoaW5lIHBhc3NwaHJhc2UgbWlncmF0aW9uIHBhdGgnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjcnlwdFRva2VuKG1hY2hpbmVQYXNzcGhyYXNlLCBzYWx0LCBpdiwgdGFnLCBlbmNyeXB0ZWQpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoJ1Rva2VuIGRlY3J5cHRpb24gZmFpbGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZWNyeXB0VG9rZW4ocGFzc3BocmFzZTogc3RyaW5nLCBzYWx0OiBCdWZmZXIsIGl2OiBCdWZmZXIsIHRhZzogQnVmZmVyLCBlbmNyeXB0ZWQ6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5kZXJpdmVLZXkocGFzc3BocmFzZSwgc2FsdCk7XG4gICAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdihUb2tlbk1hbmFnZXIuQUxHT1JJVEhNLCBrZXksIGl2KTtcbiAgICBkZWNpcGhlci5zZXRBdXRoVGFnKHRhZyk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW2RlY2lwaGVyLnVwZGF0ZShlbmNyeXB0ZWQpLCBkZWNpcGhlci5maW5hbCgpXSkudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBHaXRIdWIgdG9rZW4gc2VjdXJlbHkgdG8gZmlsZVxuICAgKi9cbiAgYXN5bmMgc3RvcmVHaXRIdWJUb2tlbih0b2tlbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIHRva2VuIGZvcm1hdCBmaXJzdFxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlVG9rZW5Gb3JtYXQodG9rZW4pKSB7XG4gICAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKCdJbnZhbGlkIHRva2VuIGZvcm1hdCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBOb3JtYWxpemUgYW5kIHZhbGlkYXRlIHRva2VuXG4gICAgICBjb25zdCB2YWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodG9rZW4pO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlY3VyaXR5RXJyb3IoJ1Rva2VuIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycycpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5jcmVhdGVEaXJlY3RvcnkoVG9rZW5NYW5hZ2VyLlRPS0VOX0RJUik7XG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLmNobW9kKFRva2VuTWFuYWdlci5UT0tFTl9ESVIsIDBvNzAwLCB7XG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5zdG9yZUdpdEh1YlRva2VuJ1xuICAgICAgfSk7XG5cbiAgICAgIC8vIEdlbmVyYXRlIGVuY3J5cHRpb24gY29tcG9uZW50c1xuICAgICAgY29uc3Qgc2FsdCA9IGNyeXB0by5yYW5kb21CeXRlcyhUb2tlbk1hbmFnZXIuU0FMVF9MRU5HVEgpO1xuICAgICAgY29uc3QgaXYgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoVG9rZW5NYW5hZ2VyLklWX0xFTkdUSCk7XG4gICAgICBjb25zdCBwYXNzcGhyYXNlID0gdGhpcy5nZXRQYXNzcGhyYXNlKCk7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmRlcml2ZUtleShwYXNzcGhyYXNlLCBzYWx0KTtcblxuICAgICAgLy8gRW5jcnlwdCB0b2tlblxuICAgICAgY29uc3QgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KFRva2VuTWFuYWdlci5BTEdPUklUSE0sIGtleSwgaXYpO1xuICAgICAgY29uc3QgZW5jcnlwdGVkID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICAgIGNpcGhlci51cGRhdGUodmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudCwgJ3V0ZjgnKSxcbiAgICAgICAgY2lwaGVyLmZpbmFsKClcbiAgICAgIF0pO1xuICAgICAgY29uc3QgdGFnID0gY2lwaGVyLmdldEF1dGhUYWcoKTtcblxuICAgICAgLy8gQ3JlYXRlIHN0b3JhZ2UgZm9ybWF0OiBzYWx0ICsgaXYgKyB0YWcgKyBlbmNyeXB0ZWRcbiAgICAgIGNvbnN0IHN0b3JlZCA9IEJ1ZmZlci5jb25jYXQoW3NhbHQsIGl2LCB0YWcsIGVuY3J5cHRlZF0pO1xuXG4gICAgICAvLyBXcml0ZSB0byBmaWxlIHdpdGggcmVzdHJpY3RlZCBwZXJtaXNzaW9uc1xuICAgICAgY29uc3QgdG9rZW5QYXRoID0gcGF0aC5qb2luKFRva2VuTWFuYWdlci5UT0tFTl9ESVIsIFRva2VuTWFuYWdlci5UT0tFTl9GSUxFKTtcbiAgICAgIC8vIFdyaXRlIHRoZSBiaW5hcnkgY29udGVudCB0byB0aGUgZmlsZSAobmVlZCB0byBjb252ZXJ0IEJ1ZmZlciB0byBzdHJpbmcgZm9yIEZpbGVPcGVyYXRpb25zU2VydmljZSlcbiAgICAgIC8vIFNpbmNlIHdlJ3JlIHdyaXRpbmcgYmluYXJ5IGRhdGEsIHdlJ2xsIHdyaXRlIGFzIGJhc2U2NCBmb3Igc2FmZSBzdG9yYWdlXG4gICAgICBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLndyaXRlRmlsZSh0b2tlblBhdGgsIHN0b3JlZC50b1N0cmluZygnYmFzZTY0JyksIHtcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnN0b3JlR2l0SHViVG9rZW4nXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMuZmlsZU9wZXJhdGlvbnMuY2htb2QodG9rZW5QYXRoLCAwbzYwMCwge1xuICAgICAgICBzb3VyY2U6ICdUb2tlbk1hbmFnZXIuc3RvcmVHaXRIdWJUb2tlbidcbiAgICAgIH0pO1xuXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnRcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnN0b3JlR2l0SHViVG9rZW4nLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIHRva2VuIHN0b3JlZCBzZWN1cmVseScsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgdG9rZW5UeXBlOiB0aGlzLmdldFRva2VuVHlwZSh0b2tlbiksXG4gICAgICAgICAgdG9rZW5QcmVmaXg6IHRoaXMuZ2V0VG9rZW5QcmVmaXgodG9rZW4pXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuaW5mbygnR2l0SHViIHRva2VuIHN0b3JlZCBzZWN1cmVseScpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5zdG9yZUdpdEh1YlRva2VuJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byBzdG9yZSBHaXRIdWIgdG9rZW46ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIHRocm93IG5ldyBTZWN1cml0eUVycm9yKGBGYWlsZWQgdG8gc3RvcmUgdG9rZW46ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIEdpdEh1YiB0b2tlbiBmcm9tIHNlY3VyZSBzdG9yYWdlXG4gICAqL1xuICBhc3luYyByZXRyaWV2ZUdpdEh1YlRva2VuKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlblBhdGggPSBwYXRoLmpvaW4oVG9rZW5NYW5hZ2VyLlRPS0VOX0RJUiwgVG9rZW5NYW5hZ2VyLlRPS0VOX0ZJTEUpO1xuXG4gICAgICAvLyBDaGVjayBpZiBmaWxlIGV4aXN0c1xuICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHModG9rZW5QYXRoKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIC8vIE5vIHN0b3JlZCB0b2tlblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCBlbmNyeXB0ZWQgZGF0YSAoc3RvcmVkIGFzIGJhc2U2NClcbiAgICAgIGNvbnN0IGJhc2U2NENvbnRlbnQgPSBhd2FpdCB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKHRva2VuUGF0aCwge1xuICAgICAgICBzb3VyY2U6ICdUb2tlbk1hbmFnZXIucmV0cmlldmVHaXRIdWJUb2tlbidcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3RvcmVkID0gQnVmZmVyLmZyb20oYmFzZTY0Q29udGVudCwgJ2Jhc2U2NCcpO1xuXG4gICAgICAvLyBFeHRyYWN0IGNvbXBvbmVudHNcbiAgICAgIGNvbnN0IHNhbHQgPSBzdG9yZWQuc3ViYXJyYXkoMCwgVG9rZW5NYW5hZ2VyLlNBTFRfTEVOR1RIKTtcbiAgICAgIGNvbnN0IGl2ID0gc3RvcmVkLnN1YmFycmF5KFRva2VuTWFuYWdlci5TQUxUX0xFTkdUSCwgVG9rZW5NYW5hZ2VyLlNBTFRfTEVOR1RIICsgVG9rZW5NYW5hZ2VyLklWX0xFTkdUSCk7XG4gICAgICBjb25zdCB0YWcgPSBzdG9yZWQuc3ViYXJyYXkoVG9rZW5NYW5hZ2VyLlNBTFRfTEVOR1RIICsgVG9rZW5NYW5hZ2VyLklWX0xFTkdUSCwgVG9rZW5NYW5hZ2VyLlNBTFRfTEVOR1RIICsgVG9rZW5NYW5hZ2VyLklWX0xFTkdUSCArIFRva2VuTWFuYWdlci5UQUdfTEVOR1RIKTtcbiAgICAgIGNvbnN0IGVuY3J5cHRlZCA9IHN0b3JlZC5zdWJhcnJheShUb2tlbk1hbmFnZXIuU0FMVF9MRU5HVEggKyBUb2tlbk1hbmFnZXIuSVZfTEVOR1RIICsgVG9rZW5NYW5hZ2VyLlRBR19MRU5HVEgpO1xuXG4gICAgICAvLyBEZWNyeXB0IHdpdGggcHJpbWFyeSBwYXNzcGhyYXNlOyBmYWxsIGJhY2sgdG8gbWFjaGluZSBwYXNzcGhyYXNlIGZvclxuICAgICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHRva2VucyBzdG9yZWQgYmVmb3JlIERPTExIT1VTRV9UT0tFTl9TRUNSRVQgKCMxNzM1KVxuICAgICAgY29uc3QgZGVjcnlwdGVkID0gdGhpcy5kZWNyeXB0V2l0aEZhbGxiYWNrKHNhbHQsIGl2LCB0YWcsIGVuY3J5cHRlZCk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIGRlY3J5cHRlZCB0b2tlblxuICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlVG9rZW5Gb3JtYXQoZGVjcnlwdGVkKSkge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fRkFJTFVSRScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICBzb3VyY2U6ICdUb2tlbk1hbmFnZXIucmV0cmlldmVHaXRIdWJUb2tlbicsXG4gICAgICAgICAgZGV0YWlsczogJ0RlY3J5cHRlZCB0b2tlbiBoYXMgaW52YWxpZCBmb3JtYXQnXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdUb2tlbk1hbmFnZXIucmV0cmlldmVHaXRIdWJUb2tlbicsXG4gICAgICAgIGRldGFpbHM6ICdHaXRIdWIgdG9rZW4gcmV0cmlldmVkIGZyb20gc2VjdXJlIHN0b3JhZ2UnLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHRva2VuVHlwZTogdGhpcy5nZXRUb2tlblR5cGUoZGVjcnlwdGVkKSxcbiAgICAgICAgICB0b2tlblByZWZpeDogdGhpcy5nZXRUb2tlblByZWZpeChkZWNyeXB0ZWQpXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZGVjcnlwdGVkO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX0ZBSUxVUkUnLFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5yZXRyaWV2ZUdpdEh1YlRva2VuJyxcbiAgICAgICAgZGV0YWlsczogYEZhaWxlZCB0byByZXRyaWV2ZSBHaXRIdWIgdG9rZW46ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YFxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGxvZ2dlci5kZWJ1ZygnRmFpbGVkIHRvIHJldHJpZXZlIHN0b3JlZCB0b2tlbicsIHsgZXJyb3IgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHN0b3JlZCBHaXRIdWIgdG9rZW5cbiAgICovXG4gIGFzeW5jIHJlbW92ZVN0b3JlZFRva2VuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlblBhdGggPSBwYXRoLmpvaW4oVG9rZW5NYW5hZ2VyLlRPS0VOX0RJUiwgVG9rZW5NYW5hZ2VyLlRPS0VOX0ZJTEUpO1xuXG4gICAgICAvLyBDaGVjayBpZiBmaWxlIGV4aXN0cyBiZWZvcmUgYXR0ZW1wdGluZyBkZWxldGlvblxuICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5leGlzdHModG9rZW5QYXRoKTtcbiAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKHRva2VuUGF0aCwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgc291cmNlOiAnVG9rZW5NYW5hZ2VyLnJlbW92ZVN0b3JlZFRva2VuJ1xuICAgICAgICB9KTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1RPS0VOX0NBQ0hFX0NMRUFSRUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdUb2tlbk1hbmFnZXIucmVtb3ZlU3RvcmVkVG9rZW4nLFxuICAgICAgICAgIGRldGFpbHM6ICdHaXRIdWIgdG9rZW4gcmVtb3ZlZCBmcm9tIHNlY3VyZSBzdG9yYWdlJ1xuICAgICAgICB9KTtcblxuICAgICAgICBsb2dnZXIuaW5mbygnU3RvcmVkIEdpdEh1YiB0b2tlbiByZW1vdmVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdObyBzdG9yZWQgdG9rZW4gdG8gcmVtb3ZlJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX0NBQ0hFX0NMRUFSRUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ1Rva2VuTWFuYWdlci5yZW1vdmVTdG9yZWRUb2tlbicsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gcmVtb3ZlIHN0b3JlZCB0b2tlbjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gXG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byByZW1vdmUgc3RvcmVkIHRva2VuJywgeyBlcnJvciB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IEdpdEh1YiB0b2tlbiBmcm9tIGVudmlyb25tZW50IG9yIHNlY3VyZSBzdG9yYWdlXG4gICAqIFVwZGF0ZWQgdG8gY2hlY2sgc2VjdXJlIHN0b3JhZ2UgaWYgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldFxuICAgKi9cbiAgYXN5bmMgZ2V0R2l0SHViVG9rZW5Bc3luYygpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICAvLyBGaXJzdCBjaGVjayBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICAgIGNvbnN0IGVudlRva2VuID0gdGhpcy5nZXRHaXRIdWJUb2tlbigpO1xuICAgIGlmIChlbnZUb2tlbikge1xuICAgICAgcmV0dXJuIGVudlRva2VuO1xuICAgIH1cblxuICAgIC8vIEZhbGwgYmFjayB0byBzZWN1cmUgc3RvcmFnZVxuICAgIHJldHVybiB0aGlzLnJldHJpZXZlR2l0SHViVG9rZW4oKTtcbiAgfVxufSJdfQ==
|
|
@@ -43,7 +43,10 @@ export declare class UnicodeValidator {
|
|
|
43
43
|
private static readonly NON_PRINTABLE_CHARS;
|
|
44
44
|
/**
|
|
45
45
|
* Common homograph/confusable character mappings
|
|
46
|
-
* Maps visually similar Unicode characters to their ASCII equivalents
|
|
46
|
+
* Maps visually similar Unicode characters to their ASCII equivalents.
|
|
47
|
+
* Performance: ~110 entries; replaceConfusables() iterates the full map
|
|
48
|
+
* per call but uses Map.has() lookups (O(1) per char). Negligible at
|
|
49
|
+
* current size — profile before optimizing if the map grows beyond ~500.
|
|
47
50
|
*/
|
|
48
51
|
private static readonly CONFUSABLE_MAPPINGS;
|
|
49
52
|
/**
|
|
@@ -67,10 +70,6 @@ export declare class UnicodeValidator {
|
|
|
67
70
|
* Detect suspicious mixing of different Unicode scripts
|
|
68
71
|
*/
|
|
69
72
|
private static detectMixedScripts;
|
|
70
|
-
/**
|
|
71
|
-
* Escalate severity level (higher severity takes precedence)
|
|
72
|
-
*/
|
|
73
|
-
private static escalateSeverity;
|
|
74
73
|
/**
|
|
75
74
|
* Escape special regex characters for safe replacement
|
|
76
75
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unicodeValidator.d.ts","sourceRoot":"","sources":["../../../src/security/validators/unicodeValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"unicodeValidator.d.ts","sourceRoot":"","sources":["../../../src/security/validators/unicodeValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;CACnD;AAED,qBAAa,gBAAgB;IAC3B;;OAEG;IAEH;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAmC;IAEnF;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAyC;IAEjF;;;;;OAKG;IAEH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAwE;IAEnH;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CA+BxC;IAEH;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CASrC;IAEF;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IAwG1D;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IA2CvC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAcjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAqBjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAI1B;;OAEG;IACH,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQzD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAKzC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IA2BrC;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM;CAWxE"}
|