@dollhousemcp/mcp-server 2.0.17 → 2.0.19
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 +10 -0
- package/dist/elements/BaseElement.d.ts +1 -0
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +7 -1
- package/dist/elements/agents/AgentManager.js +2 -2
- package/dist/elements/base/ElementFileOperations.js +2 -2
- package/dist/elements/ensembles/EnsembleManager.js +3 -3
- package/dist/elements/memories/MemoryManager.js +2 -2
- package/dist/elements/skills/SkillManager.js +2 -2
- package/dist/elements/templates/TemplateManager.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ElementCRUDHandler.d.ts +30 -0
- package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
- package/dist/handlers/ElementCRUDHandler.js +142 -2
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +4 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +132 -14
- package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationRouter.js +6 -1
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +17 -1
- package/dist/handlers/mcp-aql/policies/AgentToolPolicyTranslator.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/AgentToolPolicyTranslator.js +2 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts +9 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.js +64 -4
- package/dist/handlers/mcp-aql/policies/OperationPolicies.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/OperationPolicies.js +6 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
- package/dist/handlers/strategies/AgentActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/AgentActivationStrategy.js +5 -1
- package/dist/handlers/strategies/BaseActivationStrategy.d.ts +1 -0
- package/dist/handlers/strategies/BaseActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/BaseActivationStrategy.js +15 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.js +5 -1
- package/dist/handlers/strategies/MemoryActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/MemoryActivationStrategy.js +5 -1
- package/dist/handlers/strategies/PersonaActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/PersonaActivationStrategy.js +5 -1
- package/dist/handlers/strategies/SkillActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/SkillActivationStrategy.js +5 -1
- package/dist/handlers/strategies/TemplateActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/TemplateActivationStrategy.js +7 -2
- package/dist/persona/PersonaElement.js +2 -2
- package/dist/server/tools/MCPAQLTools.js +2 -1
- package/dist/services/SerializationService.d.ts.map +1 -1
- package/dist/services/SerializationService.js +7 -1
- package/dist/types/elements/IElement.d.ts +9 -0
- package/dist/types/elements/IElement.d.ts.map +1 -1
- package/dist/types/elements/IElement.js +1 -1
- package/dist/web/console/IngestRoutes.d.ts +6 -0
- package/dist/web/console/IngestRoutes.d.ts.map +1 -1
- package/dist/web/console/IngestRoutes.js +38 -9
- package/dist/web/console/LeaderElection.d.ts +39 -0
- package/dist/web/console/LeaderElection.d.ts.map +1 -1
- package/dist/web/console/LeaderElection.js +147 -29
- package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -1
- package/dist/web/console/LeaderForwardingSink.js +5 -1
- package/dist/web/console/PromotionManager.d.ts.map +1 -1
- package/dist/web/console/PromotionManager.js +3 -11
- package/dist/web/public/app.js +62 -1
- package/dist/web/public/index.html +19 -17
- package/dist/web/public/permissions.css +190 -2
- package/dist/web/public/permissions.js +171 -30
- package/dist/web/public/sessions.js +111 -0
- package/dist/web/public/setup.js +131 -60
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +77 -5
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +16 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +12 -10
- package/package.json +1 -1
- package/scripts/pretooluse-dollhouse.sh +39 -1
- package/server.json +2 -2
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import { Gatekeeper } from './Gatekeeper.js';
|
|
24
24
|
import { translateToolConfigToPolicy, canOperationBeElevated } from './policies/index.js';
|
|
25
|
-
import { isGatekeeperInfraOperation, findConfirmDenyingElement, findConfirmAdvisoryElements } from './policies/ElementPolicies.js';
|
|
25
|
+
import { isGatekeeperInfraOperation, findConfirmDenyingElement, findConfirmAdvisoryElements, getGatekeeperDiagnostics } from './policies/ElementPolicies.js';
|
|
26
26
|
import { PermissionLevel, GatekeeperErrorCode } from './GatekeeperTypes.js';
|
|
27
27
|
import { getRoute } from './OperationRouter.js';
|
|
28
28
|
import { ALL_OPERATION_SCHEMAS } from './OperationSchema.js';
|
|
@@ -213,6 +213,9 @@ class VerificationError extends Error {
|
|
|
213
213
|
this.name = 'VerificationError';
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
|
+
const DEADLOCK_RELIEF_REASON = 'Deadlock relief requested';
|
|
217
|
+
const DEADLOCK_RELIEF_TIMEOUT_MS = 5 * 60 * 1000;
|
|
218
|
+
const DEADLOCK_RELIEF_DIALOG_REASON = 'Deadlock relief requested.\n\nThis will deactivate all active elements for the current session and clear persisted activation state.';
|
|
216
219
|
/**
|
|
217
220
|
* Global rate limiter for verification attempts.
|
|
218
221
|
* Tracks failed attempts within a sliding window to prevent brute-force attacks.
|
|
@@ -434,6 +437,7 @@ export class MCPAQLHandler {
|
|
|
434
437
|
name: el.name,
|
|
435
438
|
description: el.metadata.description ?? undefined,
|
|
436
439
|
gatekeeper: el.metadata?.gatekeeper ?? undefined,
|
|
440
|
+
...this.copyGatekeeperDiagnostics(el.metadata),
|
|
437
441
|
},
|
|
438
442
|
}));
|
|
439
443
|
// Issue #449: Include executing agents with gatekeeper policies
|
|
@@ -468,6 +472,7 @@ export class MCPAQLHandler {
|
|
|
468
472
|
name: el.name,
|
|
469
473
|
description: el.metadata.description ?? undefined,
|
|
470
474
|
gatekeeper: el.metadata?.gatekeeper ?? undefined,
|
|
475
|
+
...this.copyGatekeeperDiagnostics(el.metadata),
|
|
471
476
|
...(Array.isArray(el.sessionIds)
|
|
472
477
|
? { sessionIds: el.sessionIds }
|
|
473
478
|
: {}),
|
|
@@ -479,6 +484,10 @@ export class MCPAQLHandler {
|
|
|
479
484
|
return sessionId ? [] : this.getActiveElements();
|
|
480
485
|
}
|
|
481
486
|
}
|
|
487
|
+
copyGatekeeperDiagnostics(metadata) {
|
|
488
|
+
const diagnostics = getGatekeeperDiagnostics(metadata);
|
|
489
|
+
return diagnostics ? { gatekeeperDiagnostics: diagnostics } : {};
|
|
490
|
+
}
|
|
482
491
|
/**
|
|
483
492
|
* Handle CREATE operations (additive, non-destructive)
|
|
484
493
|
*
|
|
@@ -1836,6 +1845,82 @@ export class MCPAQLHandler {
|
|
|
1836
1845
|
throw new Error(`Unknown Persona method: ${method}`);
|
|
1837
1846
|
}
|
|
1838
1847
|
}
|
|
1848
|
+
challengeIsForDeadlockRelief(challenge) {
|
|
1849
|
+
return typeof challenge?.reason === 'string' && challenge.reason.startsWith(DEADLOCK_RELIEF_REASON);
|
|
1850
|
+
}
|
|
1851
|
+
issueDeadlockReliefChallenge() {
|
|
1852
|
+
const store = this.handlers.verificationStore;
|
|
1853
|
+
if (!store) {
|
|
1854
|
+
throw new Error('Verification system not available. Ensure the server is properly configured.');
|
|
1855
|
+
}
|
|
1856
|
+
const challengeId = randomUUID();
|
|
1857
|
+
const code = generateDisplayCode();
|
|
1858
|
+
store.set(challengeId, {
|
|
1859
|
+
code,
|
|
1860
|
+
expiresAt: Date.now() + DEADLOCK_RELIEF_TIMEOUT_MS,
|
|
1861
|
+
reason: DEADLOCK_RELIEF_REASON,
|
|
1862
|
+
});
|
|
1863
|
+
this.handlers.verificationNotifier?.showCode(code, DEADLOCK_RELIEF_DIALOG_REASON);
|
|
1864
|
+
SecurityMonitor.logSecurityEvent({
|
|
1865
|
+
type: 'DANGER_ZONE_TRIGGERED',
|
|
1866
|
+
severity: 'MEDIUM',
|
|
1867
|
+
source: 'MCPAQLHandler.issueDeadlockReliefChallenge',
|
|
1868
|
+
details: `Deadlock relief challenge issued for session ${this.gatekeeper.sessionId}`,
|
|
1869
|
+
additionalData: {
|
|
1870
|
+
challengeId,
|
|
1871
|
+
sessionId: this.gatekeeper.sessionId,
|
|
1872
|
+
},
|
|
1873
|
+
});
|
|
1874
|
+
return {
|
|
1875
|
+
pending: true,
|
|
1876
|
+
challenge_id: challengeId,
|
|
1877
|
+
message: 'Deadlock relief requires human confirmation. A verification code has been displayed to the user.',
|
|
1878
|
+
warning: 'Completing this flow will deactivate all active elements for the current session and clear persisted activation state.',
|
|
1879
|
+
};
|
|
1880
|
+
}
|
|
1881
|
+
async completeDeadlockRelief(challengeId, code) {
|
|
1882
|
+
const store = this.handlers.verificationStore;
|
|
1883
|
+
if (!store) {
|
|
1884
|
+
throw new VerificationError(GatekeeperErrorCode.VERIFICATION_FAILED, 'Verification system not available. Ensure the server is properly configured.');
|
|
1885
|
+
}
|
|
1886
|
+
validateChallengeIdFormat(challengeId);
|
|
1887
|
+
const challenge = store.get(challengeId);
|
|
1888
|
+
if (!challenge) {
|
|
1889
|
+
throw new VerificationError(GatekeeperErrorCode.VERIFICATION_TIMEOUT, 'Deadlock relief challenge not found. It may have expired or already been used. Retry release_deadlock to receive a new code.');
|
|
1890
|
+
}
|
|
1891
|
+
if (!this.challengeIsForDeadlockRelief(challenge)) {
|
|
1892
|
+
throw new VerificationError(GatekeeperErrorCode.VERIFICATION_FAILED, 'This challenge is not for deadlock relief. Use the matching verification flow for the requested operation.');
|
|
1893
|
+
}
|
|
1894
|
+
const valid = store.verify(challengeId, code);
|
|
1895
|
+
if (!valid) {
|
|
1896
|
+
throw new VerificationError(GatekeeperErrorCode.VERIFICATION_FAILED, 'Verification failed: incorrect code. The code has been consumed (one-time use). Retry release_deadlock to receive a new code.');
|
|
1897
|
+
}
|
|
1898
|
+
const reset = await this.handlers.elementCRUD.releaseDeadlock();
|
|
1899
|
+
SecurityMonitor.logSecurityEvent({
|
|
1900
|
+
type: 'VERIFICATION_SUCCEEDED',
|
|
1901
|
+
severity: 'MEDIUM',
|
|
1902
|
+
source: 'MCPAQLHandler.completeDeadlockRelief',
|
|
1903
|
+
details: `Deadlock relief completed for session ${this.gatekeeper.sessionId}`,
|
|
1904
|
+
additionalData: {
|
|
1905
|
+
challengeId,
|
|
1906
|
+
sessionId: this.gatekeeper.sessionId,
|
|
1907
|
+
deactivatedCount: reset.deactivated.length,
|
|
1908
|
+
failedCount: reset.failed.length,
|
|
1909
|
+
},
|
|
1910
|
+
});
|
|
1911
|
+
const snapshotSuffix = reset.snapshotFile
|
|
1912
|
+
? ` A recovery snapshot was saved to ${reset.snapshotFile}.`
|
|
1913
|
+
: '';
|
|
1914
|
+
const message = reset.failed.length > 0
|
|
1915
|
+
? `Deadlock relief completed with ${reset.failed.length} deactivation failure(s). Review the failed list, likely deadlock cause, and recovery snapshot before reactivating elements.`
|
|
1916
|
+
: `Deadlock relief completed. All active elements for this session were deactivated and persisted activation state was cleared.${snapshotSuffix}`;
|
|
1917
|
+
return {
|
|
1918
|
+
released: true,
|
|
1919
|
+
challenge_id: challengeId,
|
|
1920
|
+
...reset,
|
|
1921
|
+
message,
|
|
1922
|
+
};
|
|
1923
|
+
}
|
|
1839
1924
|
/**
|
|
1840
1925
|
* Dispatch Gatekeeper operations for confirmation management.
|
|
1841
1926
|
*
|
|
@@ -1993,6 +2078,9 @@ export class MCPAQLHandler {
|
|
|
1993
2078
|
throw new VerificationError(GatekeeperErrorCode.VERIFICATION_TIMEOUT, 'Verification failed: challenge not found. It may have expired or already been used. ' +
|
|
1994
2079
|
'Retry the blocked operation to receive a new verification code.');
|
|
1995
2080
|
}
|
|
2081
|
+
if (this.challengeIsForDeadlockRelief(challengePreCheck)) {
|
|
2082
|
+
throw new VerificationError(GatekeeperErrorCode.VERIFICATION_FAILED, 'This verification code is reserved for deadlock relief. Use release_deadlock with challenge_id and code to complete the reset.');
|
|
2083
|
+
}
|
|
1996
2084
|
// Verify the code (one-time use — store deletes challenge after this call)
|
|
1997
2085
|
const valid = store.verify(challengeId, code);
|
|
1998
2086
|
if (!valid) {
|
|
@@ -2056,6 +2144,21 @@ export class MCPAQLHandler {
|
|
|
2056
2144
|
message: 'Verification successful. You may now retry the operation.',
|
|
2057
2145
|
};
|
|
2058
2146
|
}
|
|
2147
|
+
case 'releaseDeadlock': {
|
|
2148
|
+
const challengeIdValue = typeof params.challenge_id === 'string'
|
|
2149
|
+
? params.challenge_id.trim()
|
|
2150
|
+
: '';
|
|
2151
|
+
const codeValue = typeof params.code === 'string'
|
|
2152
|
+
? params.code.trim()
|
|
2153
|
+
: '';
|
|
2154
|
+
if ((challengeIdValue && !codeValue) || (!challengeIdValue && codeValue)) {
|
|
2155
|
+
throw new Error('release_deadlock requires both challenge_id and code together, or neither for the initial challenge request.');
|
|
2156
|
+
}
|
|
2157
|
+
if (!challengeIdValue && !codeValue) {
|
|
2158
|
+
return this.issueDeadlockReliefChallenge();
|
|
2159
|
+
}
|
|
2160
|
+
return this.completeDeadlockRelief(challengeIdValue, codeValue);
|
|
2161
|
+
}
|
|
2059
2162
|
case 'beetlejuice': {
|
|
2060
2163
|
// Issue #503: Safe-trigger the full danger zone verification pipeline.
|
|
2061
2164
|
// Creates a challenge, stores it, and blocks an agent — all in one call.
|
|
@@ -2316,18 +2419,23 @@ export class MCPAQLHandler {
|
|
|
2316
2419
|
? await this.getPolicyReportElements(reportSessionId)
|
|
2317
2420
|
: await this.getActiveElements();
|
|
2318
2421
|
// 2. Extract externalRestrictions from each element
|
|
2319
|
-
const elementPolicies = policyElements.map(el =>
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2422
|
+
const elementPolicies = policyElements.map(el => {
|
|
2423
|
+
const diagnostics = getGatekeeperDiagnostics(el.metadata);
|
|
2424
|
+
return {
|
|
2425
|
+
type: el.type,
|
|
2426
|
+
name: el.name,
|
|
2427
|
+
allowPatterns: el.metadata?.gatekeeper?.externalRestrictions?.allowPatterns ?? [],
|
|
2428
|
+
confirmPatterns: el.metadata?.gatekeeper?.externalRestrictions?.confirmPatterns ?? [],
|
|
2429
|
+
denyPatterns: el.metadata?.gatekeeper?.externalRestrictions?.denyPatterns ?? [],
|
|
2430
|
+
allowOperations: el.metadata?.gatekeeper?.allow ?? [],
|
|
2431
|
+
confirmOperations: el.metadata?.gatekeeper?.confirm ?? [],
|
|
2432
|
+
denyOperations: el.metadata?.gatekeeper?.deny ?? [],
|
|
2433
|
+
description: el.metadata?.gatekeeper?.externalRestrictions?.description ?? null,
|
|
2434
|
+
invalidGatekeeperPolicy: !!diagnostics,
|
|
2435
|
+
invalidGatekeeperMessage: diagnostics?.message,
|
|
2436
|
+
sessionIds: el.metadata?.sessionIds ?? undefined,
|
|
2437
|
+
};
|
|
2438
|
+
});
|
|
2331
2439
|
// 3. Build combined view
|
|
2332
2440
|
const combinedAllow = elementPolicies.flatMap(p => p.allowPatterns);
|
|
2333
2441
|
const combinedConfirm = elementPolicies.flatMap(p => p.confirmPatterns);
|
|
@@ -2369,6 +2477,7 @@ export class MCPAQLHandler {
|
|
|
2369
2477
|
const hasOperationRestrictions = combinedAllowOperations.length > 0
|
|
2370
2478
|
|| combinedDenyOperations.length > 0
|
|
2371
2479
|
|| combinedConfirmOperations.length > 0;
|
|
2480
|
+
const invalidPolicyElements = elementPolicies.filter(policy => policy.invalidGatekeeperPolicy);
|
|
2372
2481
|
let advisory;
|
|
2373
2482
|
if (hasCliRestrictions) {
|
|
2374
2483
|
if (!enforcementReady) {
|
|
@@ -2381,6 +2490,10 @@ export class MCPAQLHandler {
|
|
|
2381
2490
|
else if (hasOperationRestrictions) {
|
|
2382
2491
|
advisory = 'MCP-AQL operation policies are active for Dollhouse actions in this session.';
|
|
2383
2492
|
}
|
|
2493
|
+
if (invalidPolicyElements.length > 0) {
|
|
2494
|
+
const invalidAdvisory = buildInvalidPolicyAdvisory(invalidPolicyElements.length);
|
|
2495
|
+
advisory = advisory ? `${advisory} ${invalidAdvisory}` : invalidAdvisory;
|
|
2496
|
+
}
|
|
2384
2497
|
return {
|
|
2385
2498
|
activeElementCount: policyElements.length,
|
|
2386
2499
|
hasAllowlist,
|
|
@@ -2396,6 +2509,7 @@ export class MCPAQLHandler {
|
|
|
2396
2509
|
hookInstalled,
|
|
2397
2510
|
enforcementReady,
|
|
2398
2511
|
hookHost: hookStatus.host,
|
|
2512
|
+
invalidPolicyElementCount: invalidPolicyElements.length,
|
|
2399
2513
|
advisory,
|
|
2400
2514
|
};
|
|
2401
2515
|
}
|
|
@@ -3472,6 +3586,10 @@ export class MCPAQLHandler {
|
|
|
3472
3586
|
Array.isArray(result.content));
|
|
3473
3587
|
}
|
|
3474
3588
|
}
|
|
3589
|
+
function buildInvalidPolicyAdvisory(invalidPolicyCount) {
|
|
3590
|
+
const singular = invalidPolicyCount === 1;
|
|
3591
|
+
return `${invalidPolicyCount} active element${singular ? '' : 's'} ha${singular ? 's' : 've'} malformed gatekeeper policy. The element${singular ? ' remains' : 's remain'} active, but that policy is not enforceable until fixed.`;
|
|
3592
|
+
}
|
|
3475
3593
|
/**
|
|
3476
3594
|
* Resolve the effective CLI approval policy from all active elements.
|
|
3477
3595
|
*
|
|
@@ -3517,4 +3635,4 @@ function resolveCliApprovalPolicy(activeElements) {
|
|
|
3517
3635
|
ttlSeconds,
|
|
3518
3636
|
};
|
|
3519
3637
|
}
|
|
3520
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQVFMSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUdILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQXNCLDJCQUEyQixFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLDJCQUEyQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkksT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlGLE9BQU8sRUFNTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBSXBCLGNBQWMsRUFDZCwwQkFBMEIsR0FDM0IsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUM5RSxP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O1lBQ3pELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxlQUFlLEVBQUUsZUFBZSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbkYsWUFBWTtRQUNaLFVBQVU7S0FDWCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTUNQQVFMSGFuZGxlciAtIFVuaWZpZWQgaGFuZGxlciBmb3IgYWxsIE1DUC1BUUwgb3BlcmF0aW9uc1xuICpcbiAqIEFSQ0hJVEVDVFVSRTpcbiAqIC0gVGhpbiByZXNvbHZlciBwYXR0ZXJuOiB2YWxpZGF0ZXMg4oaSIHJvdXRlcyDihpIgZGlzcGF0Y2hlc1xuICogLSBTT0xJRCBwcmluY2lwbGVzOiBkZXBlbmRzIG9uIGFic3RyYWN0aW9ucyAoSGFuZGxlclJlZ2lzdHJ5IGludGVyZmFjZSlcbiAqIC0gRGVmZW5zZSBpbiBkZXB0aDogR2F0ZWtlZXBlciB2YWxpZGF0ZXMgZW5kcG9pbnQvb3BlcmF0aW9uIG1hdGNoaW5nIGFuZCBlbmZvcmNlcyBwb2xpY2llc1xuICogLSBEaXNwYXRjaCBwYXR0ZXJuOiByb3V0ZXMgaGFuZGxlciByZWZlcmVuY2VzIHRvIGFjdHVhbCBtZXRob2QgY2FsbHNcbiAqXG4gKiBPUEVSQVRJT04gRkxPVzpcbiAqIDEuIFZhbGlkYXRlIGlucHV0IHN0cnVjdHVyZSAodHlwZSBndWFyZHMpXG4gKiAyLiBWYWxpZGF0ZSBwZXJtaXNzaW9ucyAoR2F0ZWtlZXBlcilcbiAqIDMuIFJvdXRlIG9wZXJhdGlvbiAoT3BlcmF0aW9uUm91dGVyKVxuICogNC4gRGlzcGF0Y2ggdG8gaGFuZGxlciAocmVzb2x2ZUhhbmRsZXJSZWZlcmVuY2UpXG4gKiA1LiBSZXR1cm4gc3RhbmRhcmRpemVkIHJlc3VsdCAoT3BlcmF0aW9uUmVzdWx0KVxuICpcbiAqIEVSUk9SIEhBTkRMSU5HOlxuICogQWxsIGVycm9ycyBhcmUgY2F1Z2h0IGFuZCByZXR1cm5lZCBhcyBPcGVyYXRpb25GYWlsdXJlIHdpdGg6XG4gKiAtIHN1Y2Nlc3M6IGZhbHNlXG4gKiAtIGVycm9yOiBodW1hbi1yZWFkYWJsZSBtZXNzYWdlXG4gKiAtIGRhdGE6IG5ldmVyIChkaXNjcmltaW5hdGVkIHVuaW9uIGVuZm9yY2VzIHRoaXMpXG4gKi9cblxuaW1wb3J0IHsgQ1JVREVuZHBvaW50IH0gZnJvbSAnLi9PcGVyYXRpb25Sb3V0ZXIuanMnO1xuaW1wb3J0IHsgR2F0ZWtlZXBlciB9IGZyb20gJy4vR2F0ZWtlZXBlci5qcyc7XG5pbXBvcnQgeyB0eXBlIEFjdGl2ZUVsZW1lbnQsIHRyYW5zbGF0ZVRvb2xDb25maWdUb1BvbGljeSwgY2FuT3BlcmF0aW9uQmVFbGV2YXRlZCB9IGZyb20gJy4vcG9saWNpZXMvaW5kZXguanMnO1xuaW1wb3J0IHsgaXNHYXRla2VlcGVySW5mcmFPcGVyYXRpb24sIGZpbmRDb25maXJtRGVueWluZ0VsZW1lbnQsIGZpbmRDb25maXJtQWR2aXNvcnlFbGVtZW50cyB9IGZyb20gJy4vcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLmpzJztcbmltcG9ydCB7IFBlcm1pc3Npb25MZXZlbCwgR2F0ZWtlZXBlckVycm9yQ29kZSB9IGZyb20gJy4vR2F0ZWtlZXBlclR5cGVzLmpzJztcbmltcG9ydCB7IGdldFJvdXRlIH0gZnJvbSAnLi9PcGVyYXRpb25Sb3V0ZXIuanMnO1xuaW1wb3J0IHsgQUxMX09QRVJBVElPTl9TQ0hFTUFTIH0gZnJvbSAnLi9PcGVyYXRpb25TY2hlbWEuanMnO1xuaW1wb3J0IHsgSW50cm9zcGVjdGlvblJlc29sdmVyIH0gZnJvbSAnLi9JbnRyb3NwZWN0aW9uUmVzb2x2ZXIuanMnO1xuaW1wb3J0IHsgU2NoZW1hRGlzcGF0Y2hlciB9IGZyb20gJy4vU2NoZW1hRGlzcGF0Y2hlci5qcyc7XG5pbXBvcnQgeyBpbml0aWFsaXplTm9ybWFsaXplcnMgfSBmcm9tICcuL25vcm1hbGl6ZXJzL2luZGV4LmpzJztcbmltcG9ydCB7IGZpbHRlckZpZWxkcywgaXNWYWxpZFByZXNldCwgbm9ybWFsaXplRmllbGROYW1lcyB9IGZyb20gJy4uLy4uL3V0aWxzL0ZpZWxkRmlsdGVyLmpzJztcbmltcG9ydCB7XG4gIE9wZXJhdGlvbklucHV0LFxuICBPcGVyYXRpb25SZXN1bHQsXG4gIE9wZXJhdGlvblN1Y2Nlc3MsXG4gIE9wZXJhdGlvbkZhaWx1cmUsXG4gIFJlc3BvbnNlTWV0YSxcbiAgcGFyc2VPcGVyYXRpb25JbnB1dCxcbiAgZGVzY3JpYmVJbnZhbGlkSW5wdXQsXG4gIEJhdGNoUmVxdWVzdCxcbiAgQmF0Y2hSZXN1bHQsXG4gIEJhdGNoT3BlcmF0aW9uUmVzdWx0LFxuICBpc0JhdGNoUmVxdWVzdCxcbiAgbm9ybWFsaXplTUNQQVFMRWxlbWVudFR5cGUsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGlzU2VhcmNoTWF0Y2ggfSBmcm9tICcuLi8uLi91dGlscy9zZWFyY2hVdGlscy5qcyc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3F1ZXJ5L1BhZ2luYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IG5vcm1hbGl6ZUVsZW1lbnRUeXBlLCBBTExfRUxFTUVOVF9UWVBFUywgZm9ybWF0RWxlbWVudFR5cGVzTGlzdCB9IGZyb20gJy4uLy4uL3V0aWxzL2VsZW1lbnRUeXBlTm9ybWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFNFQ1VSSVRZX0xJTUlUUyB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBjbGFzc2lmeVRvb2wsIGV2YWx1YXRlQ2xpVG9vbFBvbGljeSwgYXNzZXNzUmlzayB9IGZyb20gJy4vcG9saWNpZXMvVG9vbENsYXNzaWZpY2F0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgQ2xpQXBwcm92YWxTY29wZSwgQ2xpQXBwcm92YWxQb2xpY3kgfSBmcm9tICcuL0dhdGVrZWVwZXJUeXBlcy5qcyc7XG5pbXBvcnQgeyBSYXRlTGltaXRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi91dGlscy9SYXRlTGltaXRlci5qcyc7XG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuLi8uLi9jb25maWcvZW52LmpzJztcbmltcG9ydCB7IFNUT1JBR0VfTEFZRVJfQ09ORklHIH0gZnJvbSAnLi4vLi4vY29uZmlnL3BlcmZvcm1hbmNlLWNvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IERhbmdlclpvbmVFbmZvcmNlciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0RhbmdlclpvbmVFbmZvcmNlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFZlcmlmaWNhdGlvblN0b3JlIH0gZnJvbSAnQGRvbGxob3VzZW1jcC9zYWZldHknO1xuaW1wb3J0IHR5cGUgeyBJVmVyaWZpY2F0aW9uTm90aWZpZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9WZXJpZmljYXRpb25Ob3RpZmllci5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURpc3BsYXlDb2RlIH0gZnJvbSAnQGRvbGxob3VzZW1jcC9zYWZldHknO1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB0eXBlIHsgRWxlbWVudENSVURIYW5kbGVyIH0gZnJvbSAnLi4vRWxlbWVudENSVURIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TWFuYWdlciB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeU1hbmFnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBBZ2VudE1hbmFnZXIgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvQWdlbnRNYW5hZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgQWdlbnRNZXRhZGF0YVYyLCBBZ2VudFJlc2lsaWVuY2VQb2xpY3ksIEFnZW50Tm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL3R5cGVzLmpzJztcbmltcG9ydCB7IGV2YWx1YXRlUmVzaWxpZW5jZVBvbGljeSwgY2lyY3VpdEJyZWFrZXIsIHR5cGUgUmVzaWxpZW5jZUNvbnRleHQgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvcmVzaWxpZW5jZUV2YWx1YXRvci5qcyc7XG5pbXBvcnQgeyByZXNpbGllbmNlTWV0cmljcyB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9yZXNpbGllbmNlTWV0cmljcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFRlbXBsYXRlUmVuZGVyZXIgfSBmcm9tICcuLi8uLi91dGlscy9UZW1wbGF0ZVJlbmRlcmVyLmpzJztcbmltcG9ydCB0eXBlIHsgRWxlbWVudFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3F1ZXJ5L0VsZW1lbnRRdWVyeVNlcnZpY2UuanMnO1xuaW1wb3J0IHsgYWdncmVnYXRlRWxlbWVudHMsIHZhbGlkYXRlQWdncmVnYXRpb25PcHRpb25zIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcXVlcnkvQWdncmVnYXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB0eXBlIHsgSUVsZW1lbnQgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9JRWxlbWVudC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSAnLi4vQ29sbGVjdGlvbkhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBQb3J0Zm9saW9IYW5kbGVyIH0gZnJvbSAnLi4vUG9ydGZvbGlvSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEdpdEh1YkF1dGhIYW5kbGVyIH0gZnJvbSAnLi4vR2l0SHViQXV0aEhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb25maWdIYW5kbGVyIH0gZnJvbSAnLi4vQ29uZmlnSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVuaGFuY2VkSW5kZXhIYW5kbGVyIH0gZnJvbSAnLi4vRW5oYW5jZWRJbmRleEhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZ2V0UGVybWlzc2lvbkhvb2tTdGF0dXMgfSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9uSG9va3MuanMnO1xuaW1wb3J0IHR5cGUgeyBQZXJzb25hSGFuZGxlciB9IGZyb20gJy4uL1BlcnNvbmFIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU3luY0hhbmRsZXIgfSBmcm9tICcuLi9TeW5jSGFuZGxlclYyLmpzJztcbmltcG9ydCB0eXBlIHsgQnVpbGRJbmZvU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL0J1aWxkSW5mb1NlcnZpY2UuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlMb2dTaW5rIH0gZnJvbSAnLi4vLi4vbG9nZ2luZy9zaW5rcy9NZW1vcnlMb2dTaW5rLmpzJztcbmltcG9ydCB0eXBlIHsgTG9nUXVlcnlPcHRpb25zIH0gZnJvbSAnLi4vLi4vbG9nZ2luZy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY1F1ZXJ5T3B0aW9ucywgTWV0cmljVHlwZSB9IGZyb20gJy4uLy4uL21ldHJpY3MvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBQZXJmb3JtYW5jZU1vbml0b3IgfSBmcm9tICcuLi8uLi91dGlscy9QZXJmb3JtYW5jZU1vbml0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBPcGVyYXRpb25NZXRyaWNzVHJhY2tlciB9IGZyb20gJy4uLy4uL21ldHJpY3MvT3BlcmF0aW9uTWV0cmljc1RyYWNrZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBHYXRla2VlcGVyTWV0cmljc1RyYWNrZXIgfSBmcm9tICcuLi8uLi9tZXRyaWNzL0dhdGVrZWVwZXJNZXRyaWNzVHJhY2tlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby9Qb3J0Zm9saW9NYW5hZ2VyLmpzJztcbmltcG9ydCB7IHByZXBhcmVIYW5kb2ZmU3RhdGUsIHBhcnNlSGFuZG9mZkJsb2NrLCBnZW5lcmF0ZUhhbmRvZmZCbG9jayB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9oYW5kb2ZmLmpzJztcbmltcG9ydCB7IGdldEF1dG9ub215TWV0cmljcyB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9hdXRvbm9teUV2YWx1YXRvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEF1dG9ub215TWV0cmljc1NuYXBzaG90IH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL2F1dG9ub215RXZhbHVhdG9yLmpzJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGFyYW1ldGVyIFZhbGlkYXRpb24gVXRpbGl0aWVzIChJc3N1ZSAjMzIzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBleHRyYWN0IGEgcmVxdWlyZWQgc3RyaW5nIHBhcmFtZXRlciBmcm9tIHBhcmFtcy5cbiAqIFRocm93cyBhIHVzZXItZnJpZW5kbHkgZXJyb3IgaWYgdGhlIHBhcmFtZXRlciBpcyBtaXNzaW5nIG9yIG5vdCBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0IHRvIGV4dHJhY3QgZnJvbVxuICogQHBhcmFtIHBhcmFtTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJcbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGUgZXJyb3IgbWVzc2FnZVxuICogQHJldHVybnMgVGhlIHZhbGlkYXRlZCBzdHJpbmcgdmFsdWVcbiAqIEB0aHJvd3MgRXJyb3Igd2l0aCB1c2VyLWZyaWVuZGx5IG1lc3NhZ2UgaWYgdmFsaWRhdGlvbiBmYWlsc1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBwYXJhbU5hbWU6IHN0cmluZyxcbiAgZGVzY3JpcHRpb246IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgdmFsdWUgPSBwYXJhbXNbcGFyYW1OYW1lXTtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCB2YWx1ZS50cmltKCkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICcke3BhcmFtTmFtZX0nLiBFeHBlY3RlZDogc3RyaW5nICgke2Rlc2NyaXB0aW9ufSlgXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGZsYXQgcGFnaW5hdGlvbiBwYXJhbXMgaW50byBhIHsgcGFnZSwgcGFnZVNpemUgfSBvYmplY3QuXG4gKlxuICogSXNzdWUgIzUwMDogcXVlcnlfZWxlbWVudHMgYW5kIHNlYXJjaF9lbGVtZW50cyBzaWxlbnRseSBpZ25vcmVkIGZsYXRcbiAqIHBhZ2VTaXplL3BhZ2UvbGltaXQvb2Zmc2V0IHBhcmFtcy4gVGhpcyBoZWxwZXIgZGV0ZWN0cyB0aGVzZSBhdCB0aGVcbiAqIHRvcCBsZXZlbCBhbmQgbm9ybWFsaXplcyB0aGVtLCBtYXRjaGluZyB0aGUgcGF0dGVybiB1c2VkIGJ5IGxpc3RFbGVtZW50cy5cbiAqXG4gKiBQcmlvcml0eTogbmVzdGVkIHBhZ2luYXRpb24gPiBsaW1pdC9vZmZzZXQgPiBmbGF0IHBhZ2UvcGFnZVNpemUgPiBkZWZhdWx0c1xuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYWdpbmF0aW9uUGFyYW1zKFxuICBwYXJhbXM6IHtcbiAgICBwYWdpbmF0aW9uPzogeyBwYWdlPzogbnVtYmVyOyBwYWdlU2l6ZT86IG51bWJlciB9O1xuICAgIHBhZ2U/OiBudW1iZXI7XG4gICAgcGFnZVNpemU/OiBudW1iZXI7XG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gIH1cbik6IHsgcGFnZTogbnVtYmVyOyBwYWdlU2l6ZTogbnVtYmVyIH0ge1xuICAvLyBJZiBuZXN0ZWQgcGFnaW5hdGlvbiBpcyBwcmVzZW50LCB1c2UgaXQgZGlyZWN0bHlcbiAgaWYgKHBhcmFtcy5wYWdpbmF0aW9uICYmIHR5cGVvZiBwYXJhbXMucGFnaW5hdGlvbiA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBwID0gcGFyYW1zLnBhZ2luYXRpb247XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2U6ICh0eXBlb2YgcC5wYWdlID09PSAnbnVtYmVyJyAmJiBwLnBhZ2UgPiAwKSA/IHAucGFnZSA6IDEsXG4gICAgICBwYWdlU2l6ZTogKHR5cGVvZiBwLnBhZ2VTaXplID09PSAnbnVtYmVyJyAmJiBwLnBhZ2VTaXplID4gMCkgPyBwLnBhZ2VTaXplIDogMjAsXG4gICAgfTtcbiAgfVxuXG4gIGxldCBwYWdlID0gMTtcbiAgbGV0IHBhZ2VTaXplID0gMjA7XG5cbiAgLy8gU3VwcG9ydCBsaW1pdC9vZmZzZXQgc3R5bGUgKGNvbnZlcnQgdG8gcGFnZS9wYWdlU2l6ZSlcbiAgaWYgKHR5cGVvZiBwYXJhbXMubGltaXQgPT09ICdudW1iZXInICYmIHBhcmFtcy5saW1pdCA+IDApIHtcbiAgICBwYWdlU2l6ZSA9IHBhcmFtcy5saW1pdDtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5vZmZzZXQgPT09ICdudW1iZXInICYmIHBhcmFtcy5vZmZzZXQgPj0gMCkge1xuICAgICAgcGFnZSA9IE1hdGguZmxvb3IocGFyYW1zLm9mZnNldCAvIHBhcmFtcy5saW1pdCkgKyAxO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN1cHBvcnQgZmxhdCBwYWdlL3BhZ2VTaXplIChvdmVycmlkZXMgbGltaXQvb2Zmc2V0IGlmIGJvdGggcHJlc2VudClcbiAgaWYgKHR5cGVvZiBwYXJhbXMucGFnZSA9PT0gJ251bWJlcicgJiYgcGFyYW1zLnBhZ2UgPiAwKSB7XG4gICAgcGFnZSA9IHBhcmFtcy5wYWdlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnBhZ2VTaXplID09PSAnbnVtYmVyJyAmJiBwYXJhbXMucGFnZVNpemUgPiAwKSB7XG4gICAgcGFnZVNpemUgPSBwYXJhbXMucGFnZVNpemU7XG4gIH1cblxuICByZXR1cm4geyBwYWdlLCBwYWdlU2l6ZSB9O1xufVxuXG4vKipcbiAqIFZhbGlkIGxvZyBjYXRlZ29yaWVzIGFjY2VwdGVkIGJ5IExvZ1F1ZXJ5T3B0aW9ucy5cbiAqIE1hdGNoZXMgdGhlIExvZ0NhdGVnb3J5IHVuaW9uIHR5cGUgcGx1cyB0aGUgJ2FsbCcgd2lsZGNhcmQuXG4gKi9cbmNvbnN0IFZBTElEX0xPR19DQVRFR09SSUVTID0gbmV3IFNldChbJ2FwcGxpY2F0aW9uJywgJ3NlY3VyaXR5JywgJ3BlcmZvcm1hbmNlJywgJ3RlbGVtZXRyeScsICdhbGwnXSk7XG5cbi8qKlxuICogVmFsaWQgbG9nIGxldmVscyBhY2NlcHRlZCBieSBMb2dRdWVyeU9wdGlvbnMuXG4gKiBNYXRjaGVzIHRoZSBMb2dMZXZlbCB1bmlvbiB0eXBlLlxuICovXG5jb25zdCBWQUxJRF9MT0dfTEVWRUxTID0gbmV3IFNldChbJ2RlYnVnJywgJ2luZm8nLCAnd2FybicsICdlcnJvciddKTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgcmF3IHBhcmFtcyBpbnRvIGEgc2FmZSBMb2dRdWVyeU9wdGlvbnMgb2JqZWN0LlxuICogU3RyaXBzIHVua25vd24ga2V5cywgdmFsaWRhdGVzIHR5cGVzIG9mIGtub3duIGZpZWxkcywgYW5kIHJldHVybnNcbiAqIG9ubHkgd2VsbC10eXBlZCB2YWx1ZXMuIEludmFsaWQgZmllbGRzIGFyZSBzaWxlbnRseSBkcm9wcGVkIHNpbmNlXG4gKiBhbGwgTG9nUXVlcnlPcHRpb25zIGZpZWxkcyBhcmUgb3B0aW9uYWwuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFJhdyBwYXJhbXMgZnJvbSB0aGUgTUNQIHJlcXVlc3RcbiAqIEByZXR1cm5zIFZhbGlkYXRlZCBMb2dRdWVyeU9wdGlvbnMgd2l0aCBvbmx5IHZhbGlkIGZpZWxkc1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUxvZ1F1ZXJ5UGFyYW1zKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBMb2dRdWVyeU9wdGlvbnMge1xuICBjb25zdCBvcHRpb25zOiBMb2dRdWVyeU9wdGlvbnMgPSB7fTtcblxuICBpZiAodHlwZW9mIHBhcmFtcy5jYXRlZ29yeSA9PT0gJ3N0cmluZycgJiYgVkFMSURfTE9HX0NBVEVHT1JJRVMuaGFzKHBhcmFtcy5jYXRlZ29yeSkpIHtcbiAgICBvcHRpb25zLmNhdGVnb3J5ID0gcGFyYW1zLmNhdGVnb3J5IGFzIExvZ1F1ZXJ5T3B0aW9uc1snY2F0ZWdvcnknXTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5sZXZlbCA9PT0gJ3N0cmluZycgJiYgVkFMSURfTE9HX0xFVkVMUy5oYXMocGFyYW1zLmxldmVsKSkge1xuICAgIG9wdGlvbnMubGV2ZWwgPSBwYXJhbXMubGV2ZWwgYXMgTG9nUXVlcnlPcHRpb25zWydsZXZlbCddO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLnNvdXJjZSA9IHBhcmFtcy5zb3VyY2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLm1lc3NhZ2UgPSBwYXJhbXMubWVzc2FnZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5zaW5jZSA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLnNpbmNlID0gcGFyYW1zLnNpbmNlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnVudGlsID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMudW50aWwgPSBwYXJhbXMudW50aWw7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMubGltaXQgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShwYXJhbXMubGltaXQpKSB7XG4gICAgb3B0aW9ucy5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5vZmZzZXQgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShwYXJhbXMub2Zmc2V0KSkge1xuICAgIG9wdGlvbnMub2Zmc2V0ID0gcGFyYW1zLm9mZnNldDtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5jb3JyZWxhdGlvbklkID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMuY29ycmVsYXRpb25JZCA9IHBhcmFtcy5jb3JyZWxhdGlvbklkO1xuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbmNvbnN0IFZBTElEX01FVFJJQ19UWVBFUyA9IG5ldyBTZXQ8TWV0cmljVHlwZT4oWydjb3VudGVyJywgJ2dhdWdlJywgJ2hpc3RvZ3JhbSddKTtcblxuZnVuY3Rpb24gdmFsaWRhdGVNZXRyaWNRdWVyeVBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogTWV0cmljUXVlcnlPcHRpb25zIHtcbiAgY29uc3Qgb3B0aW9uczogTWV0cmljUXVlcnlPcHRpb25zID0ge307XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW1zLm5hbWVzKSkge1xuICAgIG9wdGlvbnMubmFtZXMgPSBwYXJhbXMubmFtZXMuZmlsdGVyKChuKTogbiBpcyBzdHJpbmcgPT4gdHlwZW9mIG4gPT09ICdzdHJpbmcnKTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5zb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5zb3VyY2UgPSBwYXJhbXMuc291cmNlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnR5cGUgPT09ICdzdHJpbmcnICYmIFZBTElEX01FVFJJQ19UWVBFUy5oYXMocGFyYW1zLnR5cGUgYXMgTWV0cmljVHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBwYXJhbXMudHlwZSBhcyBNZXRyaWNUeXBlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnNpbmNlID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMuc2luY2UgPSBwYXJhbXMuc2luY2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMudW50aWwgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy51bnRpbCA9IHBhcmFtcy51bnRpbDtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5sYXRlc3QgPT09ICdib29sZWFuJykge1xuICAgIG9wdGlvbnMubGF0ZXN0ID0gcGFyYW1zLmxhdGVzdDtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5saW1pdCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHBhcmFtcy5saW1pdCkpIHtcbiAgICBvcHRpb25zLmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLm9mZnNldCA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHBhcmFtcy5vZmZzZXQpKSB7XG4gICAgb3B0aW9ucy5vZmZzZXQgPSBwYXJhbXMub2Zmc2V0O1xuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFZlcmlmaWNhdGlvbiBTZWN1cml0eSBVdGlsaXRpZXMgKElzc3VlICMxNDIg4oCUIFBSICM0NzggcmV2aWV3IGZvbGxvdy11cHMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBVVUlEIHY0IGZvcm1hdDogOC00LTQtNC0xMiBoZXggZGlnaXRzIHdpdGggdmVyc2lvbiA0IG1hcmtlciBhbmQgdmFyaWFudCBiaXRzICovXG5jb25zdCBVVUlEX1Y0X1JFR0VYID0gL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS00WzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9JC9pO1xuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBjaGFsbGVuZ2UgSUQgaXMgYSB2YWxpZCBVVUlEIHY0IGZvcm1hdC5cbiAqIENoYWxsZW5nZSBJRHMgYXJlIGdlbmVyYXRlZCBieSBjcnlwdG8ucmFuZG9tVVVJRCgpIGFuZCBtdXN0IGNvbmZvcm0uXG4gKiBSZWplY3RzIG9idmlvdXNseSBpbnZhbGlkIElEcyBiZWZvcmUgaGl0dGluZyB0aGUgc3RvcmUgdG8gcHJldmVudCBlbnVtZXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDaGFsbGVuZ2VJZEZvcm1hdChjaGFsbGVuZ2VJZDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghVVVJRF9WNF9SRUdFWC50ZXN0KGNoYWxsZW5nZUlkKSkge1xuICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgICAgIGBJbnZhbGlkIGNoYWxsZW5nZV9pZCBmb3JtYXQuIEV4cGVjdGVkIFVVSUQgdjQgKGUuZy4sIFwiNTUwZTg0MDAtZTI5Yi00MWQ0LWE3MTYtNDQ2NjU1NDQwMDAwXCIpLmBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogU3RydWN0dXJlZCB2ZXJpZmljYXRpb24gZXJyb3Igd2l0aCBHYXRla2VlcGVyIGVycm9yIGNvZGUuXG4gKiBFbmFibGVzIGNvbnNpc3RlbnQgZXJyb3IgaGFuZGxpbmcgYWxpZ25lZCB3aXRoIGV4aXN0aW5nIEdhdGVrZWVwZXIgcGF0dGVybnMuXG4gKi9cbmNsYXNzIFZlcmlmaWNhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JDb2RlOiBHYXRla2VlcGVyRXJyb3JDb2RlLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1ZlcmlmaWNhdGlvbkVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIEdsb2JhbCByYXRlIGxpbWl0ZXIgZm9yIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy5cbiAqIFRyYWNrcyBmYWlsZWQgYXR0ZW1wdHMgd2l0aGluIGEgc2xpZGluZyB3aW5kb3cgdG8gcHJldmVudCBicnV0ZS1mb3JjZSBhdHRhY2tzLlxuICpcbiAqIERlc2lnbjogU2luY2UgdmVyaWZpY2F0aW9uIGNvZGVzIGFyZSBvbmUtdGltZS11c2UgKGRlbGV0ZWQgb24gYW55IGF0dGVtcHQpLFxuICogdGhlIHJlYWwgYXR0YWNrIHZlY3RvciBpcyByZXBlYXRlZCBjaGFsbGVuZ2UgY3JlYXRpb24gKyBpbW1lZGlhdGUgYXR0ZW1wdC5cbiAqIFRoaXMgbGltaXRlciBjYXBzIHRvdGFsIGZhaWx1cmVzIGFjcm9zcyBhbGwgY2hhbGxlbmdlcyB3aXRoaW4gYSB0aW1lIHdpbmRvdy5cbiAqL1xuY2xhc3MgVmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIge1xuICBwcml2YXRlIGZhaWx1cmVzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4RmFpbHVyZXM6IG51bWJlciA9IDEwLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd2luZG93TXM6IG51bWJlciA9IDYwXzAwMCxcbiAgKSB7fVxuXG4gIC8qKiBSZWNvcmQgYSBmYWlsZWQgdmVyaWZpY2F0aW9uIGF0dGVtcHQuIFJldHVybnMgdHJ1ZSBpZiByYXRlIGxpbWl0IGlzIGV4Y2VlZGVkLiAqL1xuICByZWNvcmRGYWlsdXJlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgdGhpcy5mYWlsdXJlcy5wdXNoKG5vdyk7XG4gICAgdGhpcy5wcnVuZShub3cpO1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmVzLmxlbmd0aCA+IHRoaXMubWF4RmFpbHVyZXM7XG4gIH1cblxuICAvKiogQ2hlY2sgaWYgcmF0ZSBsaW1pdCBpcyBjdXJyZW50bHkgZXhjZWVkZWQgd2l0aG91dCByZWNvcmRpbmcuICovXG4gIGlzTGltaXRlZCgpOiBib29sZWFuIHtcbiAgICB0aGlzLnBydW5lKERhdGUubm93KCkpO1xuICAgIHJldHVybiB0aGlzLmZhaWx1cmVzLmxlbmd0aCA+IHRoaXMubWF4RmFpbHVyZXM7XG4gIH1cblxuICAvKiogUmVtb3ZlIGVudHJpZXMgb3V0c2lkZSB0aGUgc2xpZGluZyB3aW5kb3cuICovXG4gIHByaXZhdGUgcHJ1bmUobm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjdXRvZmYgPSBub3cgLSB0aGlzLndpbmRvd01zO1xuICAgIHdoaWxlICh0aGlzLmZhaWx1cmVzLmxlbmd0aCA+IDAgJiYgdGhpcy5mYWlsdXJlc1swXSA8IGN1dG9mZikge1xuICAgICAgdGhpcy5mYWlsdXJlcy5zaGlmdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDdXJyZW50IGZhaWx1cmUgY291bnQgaW4gd2luZG93IChmb3IgbWV0cmljcykuICovXG4gIGdldCBmYWlsdXJlc0luV2luZG93KCk6IG51bWJlciB7XG4gICAgdGhpcy5wcnVuZShEYXRlLm5vdygpKTtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlcy5sZW5ndGg7XG4gIH1cblxuICAvKiogUmVzZXQgKGZvciB0ZXN0aW5nKS4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5mYWlsdXJlcyA9IFtdO1xuICB9XG59XG5cbi8qKlxuICogVmVyaWZpY2F0aW9uIG1ldHJpY3MgdHJhY2tlciBmb2xsb3dpbmcgRGFuZ2VyWm9uZUVuZm9yY2VyLmdldE1ldHJpY3MoKSBwYXR0ZXJuLlxuICogVHJhY2tzIHN1Y2Nlc3MvZmFpbHVyZS9leHBpcnkgcmF0ZXMgYW5kIHRpbWUtdG8tdmVyaWZ5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWNhdGlvbk1ldHJpY3Mge1xuICAvKiogVG90YWwgdmVyaWZ5X2NoYWxsZW5nZSBjYWxscyBzaW5jZSBzdGFydHVwICovXG4gIHRvdGFsQXR0ZW1wdHM6IG51bWJlcjtcbiAgLyoqIFN1Y2Nlc3NmdWwgdmVyaWZpY2F0aW9ucyAqL1xuICB0b3RhbFN1Y2Nlc3NlczogbnVtYmVyO1xuICAvKiogRmFpbGVkIHZlcmlmaWNhdGlvbnMgKHdyb25nIGNvZGUpICovXG4gIHRvdGFsRmFpbHVyZXM6IG51bWJlcjtcbiAgLyoqIEV4cGlyZWQgY2hhbGxlbmdlIGF0dGVtcHRzICovXG4gIHRvdGFsRXhwaXJlZDogbnVtYmVyO1xuICAvKiogSW52YWxpZCBmb3JtYXQgYXR0ZW1wdHMgKHJlamVjdGVkIGJlZm9yZSBzdG9yZSBsb29rdXApICovXG4gIHRvdGFsSW52YWxpZEZvcm1hdDogbnVtYmVyO1xuICAvKiogUmF0ZS1saW1pdGVkIGF0dGVtcHRzICovXG4gIHRvdGFsUmF0ZUxpbWl0ZWQ6IG51bWJlcjtcbiAgLyoqIEF2ZXJhZ2UgdGltZSBmcm9tIGNoYWxsZW5nZSBjcmVhdGlvbiB0byBzdWNjZXNzZnVsIHZlcmlmeSAobXMpICovXG4gIGF2ZXJhZ2VUaW1lVG9WZXJpZnlNczogbnVtYmVyO1xuICAvKiogQ3VycmVudCBmYWlsdXJlcyBpbiByYXRlLWxpbWl0IHdpbmRvdyAqL1xuICBmYWlsdXJlc0luQ3VycmVudFdpbmRvdzogbnVtYmVyO1xufVxuXG5jbGFzcyBWZXJpZmljYXRpb25NZXRyaWNzVHJhY2tlciB7XG4gIHByaXZhdGUgX3RvdGFsQXR0ZW1wdHMgPSAwO1xuICBwcml2YXRlIF90b3RhbFN1Y2Nlc3NlcyA9IDA7XG4gIHByaXZhdGUgX3RvdGFsRmFpbHVyZXMgPSAwO1xuICBwcml2YXRlIF90b3RhbEV4cGlyZWQgPSAwO1xuICBwcml2YXRlIF90b3RhbEludmFsaWRGb3JtYXQgPSAwO1xuICBwcml2YXRlIF90b3RhbFJhdGVMaW1pdGVkID0gMDtcbiAgcHJpdmF0ZSB2ZXJpZnlEdXJhdGlvbnM6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9EVVJBVElPTlMgPSAxMDAwO1xuXG4gIHJlY29yZEF0dGVtcHQoKTogdm9pZCB7IHRoaXMuX3RvdGFsQXR0ZW1wdHMrKzsgfVxuICByZWNvcmRTdWNjZXNzKGR1cmF0aW9uTXM/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl90b3RhbFN1Y2Nlc3NlcysrO1xuICAgIGlmIChkdXJhdGlvbk1zICE9PSB1bmRlZmluZWQgJiYgZHVyYXRpb25NcyA+PSAwKSB7XG4gICAgICB0aGlzLnZlcmlmeUR1cmF0aW9ucy5wdXNoKGR1cmF0aW9uTXMpO1xuICAgICAgaWYgKHRoaXMudmVyaWZ5RHVyYXRpb25zLmxlbmd0aCA+IFZlcmlmaWNhdGlvbk1ldHJpY3NUcmFja2VyLk1BWF9EVVJBVElPTlMpIHtcbiAgICAgICAgdGhpcy52ZXJpZnlEdXJhdGlvbnMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVjb3JkRmFpbHVyZSgpOiB2b2lkIHsgdGhpcy5fdG90YWxGYWlsdXJlcysrOyB9XG4gIHJlY29yZEV4cGlyZWQoKTogdm9pZCB7IHRoaXMuX3RvdGFsRXhwaXJlZCsrOyB9XG4gIHJlY29yZEludmFsaWRGb3JtYXQoKTogdm9pZCB7IHRoaXMuX3RvdGFsSW52YWxpZEZvcm1hdCsrOyB9XG4gIHJlY29yZFJhdGVMaW1pdGVkKCk6IHZvaWQgeyB0aGlzLl90b3RhbFJhdGVMaW1pdGVkKys7IH1cblxuICBnZXRNZXRyaWNzKHJhdGVMaW1pdGVyOiBWZXJpZmljYXRpb25SYXRlTGltaXRlcik6IFZlcmlmaWNhdGlvbk1ldHJpY3Mge1xuICAgIGNvbnN0IGF2Z0R1cmF0aW9uID0gdGhpcy52ZXJpZnlEdXJhdGlvbnMubGVuZ3RoID4gMFxuICAgICAgPyBNYXRoLnJvdW5kKHRoaXMudmVyaWZ5RHVyYXRpb25zLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gdGhpcy52ZXJpZnlEdXJhdGlvbnMubGVuZ3RoKVxuICAgICAgOiAwO1xuICAgIHJldHVybiB7XG4gICAgICB0b3RhbEF0dGVtcHRzOiB0aGlzLl90b3RhbEF0dGVtcHRzLFxuICAgICAgdG90YWxTdWNjZXNzZXM6IHRoaXMuX3RvdGFsU3VjY2Vzc2VzLFxuICAgICAgdG90YWxGYWlsdXJlczogdGhpcy5fdG90YWxGYWlsdXJlcyxcbiAgICAgIHRvdGFsRXhwaXJlZDogdGhpcy5fdG90YWxFeHBpcmVkLFxuICAgICAgdG90YWxJbnZhbGlkRm9ybWF0OiB0aGlzLl90b3RhbEludmFsaWRGb3JtYXQsXG4gICAgICB0b3RhbFJhdGVMaW1pdGVkOiB0aGlzLl90b3RhbFJhdGVMaW1pdGVkLFxuICAgICAgYXZlcmFnZVRpbWVUb1ZlcmlmeU1zOiBhdmdEdXJhdGlvbixcbiAgICAgIGZhaWx1cmVzSW5DdXJyZW50V2luZG93OiByYXRlTGltaXRlci5mYWlsdXJlc0luV2luZG93LFxuICAgIH07XG4gIH1cblxuICAvKiogUmVzZXQgKGZvciB0ZXN0aW5nKS4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fdG90YWxBdHRlbXB0cyA9IDA7XG4gICAgdGhpcy5fdG90YWxTdWNjZXNzZXMgPSAwO1xuICAgIHRoaXMuX3RvdGFsRmFpbHVyZXMgPSAwO1xuICAgIHRoaXMuX3RvdGFsRXhwaXJlZCA9IDA7XG4gICAgdGhpcy5fdG90YWxJbnZhbGlkRm9ybWF0ID0gMDtcbiAgICB0aGlzLl90b3RhbFJhdGVMaW1pdGVkID0gMDtcbiAgICB0aGlzLnZlcmlmeUR1cmF0aW9ucyA9IFtdO1xuICB9XG59XG5cbi8qKlxuICogSGFuZGxlciByZWdpc3RyeSBpbnRlcmZhY2UgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQWJzdHJhY3RzIHRoZSBjb25jcmV0ZSBoYW5kbGVyIHR5cGVzIGZvciBiZXR0ZXIgdGVzdGFiaWxpdHkgYW5kIGRlY291cGxpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlclJlZ2lzdHJ5IHtcbiAgZWxlbWVudENSVUQ6IEVsZW1lbnRDUlVESGFuZGxlcjtcbiAgbWVtb3J5TWFuYWdlcjogTWVtb3J5TWFuYWdlcjtcbiAgYWdlbnRNYW5hZ2VyOiBBZ2VudE1hbmFnZXI7XG4gIHRlbXBsYXRlUmVuZGVyZXI6IFRlbXBsYXRlUmVuZGVyZXI7XG4gIGVsZW1lbnRRdWVyeVNlcnZpY2U6IEVsZW1lbnRRdWVyeVNlcnZpY2U7XG4gIC8vIE1DUC1BUUwgZXh0ZW5zaW9uIGhhbmRsZXJzIChJc3N1ZSAjMjQxKVxuICBjb2xsZWN0aW9uSGFuZGxlcj86IENvbGxlY3Rpb25IYW5kbGVyO1xuICBwb3J0Zm9saW9IYW5kbGVyPzogUG9ydGZvbGlvSGFuZGxlcjtcbiAgYXV0aEhhbmRsZXI/OiBHaXRIdWJBdXRoSGFuZGxlcjtcbiAgY29uZmlnSGFuZGxlcj86IENvbmZpZ0hhbmRsZXI7XG4gIGVuaGFuY2VkSW5kZXhIYW5kbGVyPzogRW5oYW5jZWRJbmRleEhhbmRsZXI7XG4gIHBlcnNvbmFIYW5kbGVyPzogUGVyc29uYUhhbmRsZXI7XG4gIHN5bmNIYW5kbGVyPzogU3luY0hhbmRsZXI7XG4gIGJ1aWxkSW5mb1NlcnZpY2U/OiBCdWlsZEluZm9TZXJ2aWNlO1xuICBjYWNoZU1lbW9yeUJ1ZGdldD86IGltcG9ydCgnLi4vLi4vY2FjaGUvQ2FjaGVNZW1vcnlCdWRnZXQuanMnKS5DYWNoZU1lbW9yeUJ1ZGdldDtcbiAgZ2F0ZWtlZXBlcjogR2F0ZWtlZXBlcjtcbiAgLy8gSXNzdWUgIzQwMjogREktaW5qZWN0ZWQgZGFuZ2VyIHpvbmUgZW5mb3JjZXIgKHJlcGxhY2VzIHNpbmdsZXRvbiBpbXBvcnQpXG4gIGRhbmdlclpvbmVFbmZvcmNlcj86IERhbmdlclpvbmVFbmZvcmNlcjtcbiAgLy8gSXNzdWUgIzE0MjogU2VydmVyLXNpZGUgdmVyaWZpY2F0aW9uIHN0b3JlIGZvciBjaGFsbGVuZ2UgY29kZXNcbiAgdmVyaWZpY2F0aW9uU3RvcmU/OiBWZXJpZmljYXRpb25TdG9yZTtcbiAgLy8gSXNzdWUgIzUyMjogTm9uLWJsb2NraW5nIE9TIGRpYWxvZyBmb3IgdmVyaWZpY2F0aW9uIGNvZGVzIChyZXBsYWNlcyByZXR1cm5pbmcgY29kZSB0byBMTE0pXG4gIHZlcmlmaWNhdGlvbk5vdGlmaWVyPzogSVZlcmlmaWNhdGlvbk5vdGlmaWVyO1xuICAvLyBJc3N1ZSAjNTI4OiBNZW1vcnlMb2dTaW5rIGZvciBDUlVERS1yb3V0ZWQgcXVlcnlfbG9nc1xuICBtZW1vcnlTaW5rPzogTWVtb3J5TG9nU2luaztcbiAgLy8gTWV0cmljczogTWVtb3J5TWV0cmljc1NpbmsgZm9yIENSVURFLXJvdXRlZCBxdWVyeV9tZXRyaWNzXG4gIG1ldHJpY3NTaW5rPzogaW1wb3J0KCcuLi8uLi9tZXRyaWNzL3NpbmtzL01lbW9yeU1ldHJpY3NTaW5rLmpzJykuTWVtb3J5TWV0cmljc1Npbms7XG4gIC8vIFNlYXJjaCBtZXRyaWNzOiBQZXJmb3JtYW5jZU1vbml0b3IgZm9yIHJlY29yZFNlYXJjaCgpXG4gIHBlcmZvcm1hbmNlTW9uaXRvcj86IFBlcmZvcm1hbmNlTW9uaXRvcjtcbiAgLy8gT3BlcmF0aW9uIG1ldHJpY3M6IE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyIGZvciBDUlVEIG9wZXJhdGlvbiBzdGF0c1xuICBvcGVyYXRpb25NZXRyaWNzVHJhY2tlcj86IE9wZXJhdGlvbk1ldHJpY3NUcmFja2VyO1xuICAvLyBHYXRla2VlcGVyIG1ldHJpY3M6IEdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlciBmb3IgcG9saWN5IGVuZm9yY2VtZW50IHN0YXRzXG4gIGdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlcj86IEdhdGVrZWVwZXJNZXRyaWNzVHJhY2tlcjtcbn1cblxuLyoqXG4gKiBFeHBvcnQgcGFja2FnZSBzdHJ1Y3R1cmUgZm9yIGVsZW1lbnQgaW1wb3J0L2V4cG9ydCBvcGVyYXRpb25zXG4gKi9cbmludGVyZmFjZSBFeHBvcnRQYWNrYWdlIHtcbiAgZXhwb3J0VmVyc2lvbjogc3RyaW5nO1xuICBleHBvcnRlZEF0OiBzdHJpbmc7XG4gIGVsZW1lbnRUeXBlOiBzdHJpbmc7XG4gIGVsZW1lbnROYW1lPzogc3RyaW5nO1xuICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJztcbiAgZGF0YTogc3RyaW5nO1xufVxuXG4vKipcbiAqIE1DUEFRTEhhbmRsZXIgLSBVbmlmaWVkIGVudHJ5IHBvaW50IGZvciBhbGwgTUNQLUFRTCBvcGVyYXRpb25zXG4gKlxuICogVGhpcyBoYW5kbGVyIGltcGxlbWVudHMgdGhlIHRoaW4gcmVzb2x2ZXIgcGF0dGVybjpcbiAqIDEuIFZhbGlkYXRlcyB0aGF0IG9wZXJhdGlvbnMgYXJlIGNhbGxlZCB2aWEgY29ycmVjdCBDUlVEIGVuZHBvaW50c1xuICogMi4gUm91dGVzIG9wZXJhdGlvbnMgdG8gdGhlaXIgaGFuZGxlciByZWZlcmVuY2VzXG4gKiAzLiBEaXNwYXRjaGVzIHRvIGFjdHVhbCBoYW5kbGVyIG1ldGhvZHNcbiAqIDQuIFJldHVybnMgc3RhbmRhcmRpemVkIE9wZXJhdGlvblJlc3VsdFxuICpcbiAqIERFU0lHTiBSQVRJT05BTEU6XG4gKiAtIFNpbmdsZSBSZXNwb25zaWJpbGl0eTogT25seSBvcmNoZXN0cmF0ZXMsIGRlbGVnYXRlcyBhY3R1YWwgd29ya1xuICogLSBEZXBlbmRlbmN5IEludmVyc2lvbjogRGVwZW5kcyBvbiBIYW5kbGVyUmVnaXN0cnkgaW50ZXJmYWNlXG4gKiAtIEludGVyZmFjZSBTZWdyZWdhdGlvbjogSGFuZGxlclJlZ2lzdHJ5IGV4cG9zZXMgb25seSB3aGF0J3MgbmVlZGVkXG4gKiAtIE9wZW4vQ2xvc2VkOiBOZXcgb3BlcmF0aW9ucyBhZGRlZCB0byByb3V0ZXIsIG5vdCB0aGlzIGNsYXNzXG4gKi9cbi8qKlxuICogTWluaW1hbCBpbnRlcmZhY2UgZm9yIGNvcnJlbGF0aW9uIElEIHJldHJpZXZhbC5cbiAqIEtlZXBzIGNvdXBsaW5nIGxvb3NlIOKAlCBvbmx5IHJlcXVpcmVzIHdoYXQgTUNQQVFMSGFuZGxlciBhY3R1YWxseSBuZWVkcy5cbiAqIElzc3VlICMzMDE6IFJlcXVlc3QgY29ycmVsYXRpb24gc3VwcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JyZWxhdGlvbklkUHJvdmlkZXIge1xuICBnZXRDb3JyZWxhdGlvbklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIE1DUEFRTEhhbmRsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGdhdGVrZWVwZXI6IEdhdGVrZWVwZXI7XG4gIC8qKlxuICAgKiBJc3N1ZSAjNjU2OiBQZXItbWVtb3J5IHNhdmUgZGVib3VuY2UgdGltZXJzLlxuICAgKiBXaGVuIGFkZEVudHJ5IGlzIGNhbGxlZCByYXBpZGx5LCB3ZSBjb2FsZXNjZSBzYXZlcyDigJQgb25seSB0aGUgbGF0ZXN0XG4gICAqIHN0YXRlIGlzIHdyaXR0ZW4gdG8gZGlzayBhZnRlciB0aGUgZGVib3VuY2Ugd2luZG93IGV4cGlyZXMuXG4gICAqIEtleTogbm9ybWFsaXplZCBtZW1vcnkgbmFtZSwgVmFsdWU6IHsgdGltZXIsIG1lbW9yeSwgbWFuYWdlciB9XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmdTYXZlcyA9IG5ldyBNYXA8c3RyaW5nLCB7XG4gICAgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICAgIG1lbW9yeTogaW1wb3J0KCcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnkuanMnKS5NZW1vcnk7XG4gICAgbWFuYWdlcjogTWVtb3J5TWFuYWdlcjtcbiAgfT4oKTtcbiAgLyoqIElzc3VlICM2NTY6IERlYm91bmNlIG1ldHJpY3Mg4oCUIHRyYWNrcyBzYXZlcyBjb2FsZXNjZWQgdnMgYWN0dWFsbHkgd3JpdHRlbi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkZWJvdW5jZU1ldHJpY3MgPSB7IGNvYWxlc2NlZDogMCwgd3JpdHRlbjogMCB9O1xuICAvKipcbiAgICogSXNzdWUgIzY1NzogUGVyLW1lbW9yeSBzYXZlIGZyZXF1ZW5jeSB0cmFja2VyLlxuICAgKiBTbGlkaW5nIHdpbmRvdyBjb3VudGVyOiB0cmFja3MgYWRkRW50cnkgY2FsbHMgcGVyIG1lbW9yeSB3aXRoaW4gdGhlIG1vbml0b3Igd2luZG93LlxuICAgKiBMb2dzIHdhcm5pbmdzIGF0IGNvbmZpZ3VyYWJsZSB0aHJlc2hvbGRzIHRvIGNhdGNoIHJ1bmF3YXkgbG9vcHMgZWFybHkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNhdmVGcmVxdWVuY3lDb3VudGVycyA9IG5ldyBNYXA8c3RyaW5nLCB7IHRpbWVzdGFtcHM6IG51bWJlcltdOyB3YXJuZWQ6IGJvb2xlYW47IGNyaXRpY2FsOiBib29sZWFuIH0+KCk7XG4gIC8qKiBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFJhdGUgbGltaXRlciBmb3IgcGVybWlzc2lvbl9wcm9tcHQgZXZhbHVhdGlvbnMgKGNvbmZpZ3VyYWJsZSB2aWEgZW52KSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyID0gUmF0ZUxpbWl0ZXJGYWN0b3J5LmNyZWF0ZVBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyKFxuICAgIGVudi5ET0xMSE9VU0VfUEVSTUlTU0lPTl9QUk9NUFRfUkFURV9MSU1JVCwgZW52LkRPTExIT1VTRV9QRVJNSVNTSU9OX1JBVEVfV0lORE9XX01TXG4gICk7XG4gIC8qKiBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFJhdGUgbGltaXRlciBmb3IgQ0xJIGFwcHJvdmFsIHJlY29yZCBjcmVhdGlvbiAoY29uZmlndXJhYmxlIHZpYSBlbnYpICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpQXBwcm92YWxMaW1pdGVyID0gUmF0ZUxpbWl0ZXJGYWN0b3J5LmNyZWF0ZUNsaUFwcHJvdmFsTGltaXRlcihcbiAgICBlbnYuRE9MTEhPVVNFX0NMSV9BUFBST1ZBTF9SQVRFX0xJTUlULCBlbnYuRE9MTEhPVVNFX1BFUk1JU1NJT05fUkFURV9XSU5ET1dfTVNcbiAgKTtcbiAgLyoqXG4gICAqIEJ1aWxkIGEgc3RhbmRhcmRpemVkIHJhdGUtbGltaXQgZGVueSByZXNwb25zZSBmb3IgcGVybWlzc2lvbl9wcm9tcHQuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUmF0ZUxpbWl0RGVueShcbiAgICBsaW1pdGVyTmFtZTogc3RyaW5nLFxuICAgIHRvb2xOYW1lOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBpbXBvcnQoJy4uLy4uL3V0aWxzL1JhdGVMaW1pdGVyLmpzJykuUmF0ZUxpbWl0U3RhdHVzLFxuICAgIHJpc2tMZXZlbCA9ICdibG9ja2VkJyxcbiAgICByZWFzb24gPSAnUmF0ZSBsaW1pdCBleGNlZWRlZCcsXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUkFURV9MSU1JVF9FWENFRURFRCcsXG4gICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIucGVybWlzc2lvblByb21wdCcsXG4gICAgICBkZXRhaWxzOiBgJHtsaW1pdGVyTmFtZX0gcmF0ZSBsaW1pdCBleGNlZWRlZCBmb3IgJHt0b29sTmFtZX1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgIGxpbWl0ZXI6IGxpbWl0ZXJOYW1lLFxuICAgICAgICByZXRyeUFmdGVyTXM6IHN0YXR1cy5yZXRyeUFmdGVyTXMsXG4gICAgICAgIHJlbWFpbmluZ1Rva2Vuczogc3RhdHVzLnJlbWFpbmluZ1Rva2VucyxcbiAgICAgICAgcmVzZXRUaW1lOiBzdGF0dXMucmVzZXRUaW1lLnRvSVNPU3RyaW5nKCksXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgbWVzc2FnZTogYFJhdGUgbGltaXQgZXhjZWVkZWQgZm9yICR7bGltaXRlck5hbWV9LiBSZXRyeSBhZnRlciAke3N0YXR1cy5yZXRyeUFmdGVyTXN9bXMuYCxcbiAgICAgIGNsYXNzaWZpY2F0aW9uOiB7IHJpc2tMZXZlbCwgcmVhc29uLCBzdGFnZTogJ3JhdGVfbGltaXQnIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBJc3N1ZSAjMTQyOiBSYXRlIGxpbWl0ZXIgZm9yIHZlcmlmeV9jaGFsbGVuZ2UgYXR0ZW1wdHMgKG1heCAxMCBmYWlsdXJlcyBwZXIgNjBzIHdpbmRvdykgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJpZmljYXRpb25SYXRlTGltaXRlciA9IG5ldyBWZXJpZmljYXRpb25SYXRlTGltaXRlcigpO1xuICAvKiogSXNzdWUgIzE0MjogTWV0cmljcyB0cmFja2VyIGZvciB2ZXJpZmljYXRpb24gb3BlcmF0aW9ucyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZlcmlmaWNhdGlvbk1ldHJpY3MgPSBuZXcgVmVyaWZpY2F0aW9uTWV0cmljc1RyYWNrZXIoKTtcbiAgLyoqXG4gICAqIFRyYWNrcyBhZ2VudHMgY3VycmVudGx5IGluIGFuIGV4ZWN1dGlvbiBsb29wIGZvciBHYXRla2VlcGVyIHBvbGljeSBlbmZvcmNlbWVudC5cbiAgICpcbiAgICogKipMaWZlY3ljbGU6KiogRW50cmllcyBhcmUgYWRkZWQgaW4gYGRpc3BhdGNoRXhlY3V0ZSgpYCBvbiBgZXhlY3V0ZV9hZ2VudGAgYW5kXG4gICAqIHJlbW92ZWQgb24gYGNvbXBsZXRlX2V4ZWN1dGlvbmAuIE9ubHkgYWdlbnRzIHdpdGggYSBnYXRla2VlcGVyIHBvbGljeSAoZXhwbGljaXRcbiAgICogb3Igc3ludGhlc2l6ZWQgZnJvbSBgdG9vbHNgIGNvbmZpZykgYXJlIHRyYWNrZWQuXG4gICAqXG4gICAqICoqUG9saWN5IHJlc29sdXRpb246KiogRW50cmllcyBhcmUgaW5jbHVkZWQgaW4gYGdldEFjdGl2ZUVsZW1lbnRzKClgIHNvIHRoZVxuICAgKiBHYXRla2VlcGVyIGV2YWx1YXRlcyBhZ2VudCBwb2xpY2llcyBhbG9uZ3NpZGUgcGVyc29uYS9za2lsbC9lbnNlbWJsZSBwb2xpY2llcy5cbiAgICogVGhlIHN0YW5kYXJkIHByaW9yaXR5IGFwcGxpZXM6IGRlbnkgPiBzY29wZV9yZXN0cmljdGlvbiA+IGNvbmZpcm0gPiBhbGxvdy5cbiAgICpcbiAgICogKipNZW1vcnkgc2FmZXR5OioqIFRoZSBNYXAgaXMgYm91bmRlZCBieSBjb25jdXJyZW50bHkgZXhlY3V0aW5nIGFnZW50cy4gSWYgYVxuICAgKiBzZXNzaW9uIGVuZHMgd2l0aG91dCBgY29tcGxldGVfZXhlY3V0aW9uYCwgdGhlIE1hcCBpcyBnYXJiYWdlIGNvbGxlY3RlZCB3aXRoXG4gICAqIHRoZSBNQ1BBUUxIYW5kbGVyIGluc3RhbmNlLlxuICAgKlxuICAgKiBJc3N1ZSAjNDQ5XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGV4ZWN1dGluZ0FnZW50cyA9IG5ldyBNYXA8c3RyaW5nLCB7XG4gICAgLyoqIEFnZW50IGVsZW1lbnQgbmFtZSAobWF0Y2hlcyB0aGUgTWFwIGtleSkgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqIE1ldGFkYXRhIGNvbnRhaW5pbmcgdGhlIHJlc29sdmVkIGdhdGVrZWVwZXIgcG9saWN5ICovXG4gICAgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIC8qKiBUaW1lc3RhbXAgd2hlbiBleGVjdXRpb24gc3RhcnRlZCAoZm9yIGRpYWdub3N0aWNzKSAqL1xuICAgIHN0YXJ0ZWRBdDogbnVtYmVyO1xuICAgIC8qKiBSZXNpbGllbmNlIHRyYWNraW5nOiBudW1iZXIgb2YgYXV0by1jb250aW51YXRpb25zIHBlcmZvcm1lZCAoSXNzdWUgIzUyNikgKi9cbiAgICBjb250aW51YXRpb25Db3VudDogbnVtYmVyO1xuICAgIC8qKiBSZXNpbGllbmNlIHRyYWNraW5nOiBudW1iZXIgb2YgcmV0cmllcyBmb3IgdGhlIGN1cnJlbnQgc3RlcCAoSXNzdWUgIzUyNikgKi9cbiAgICByZXRyeUNvdW50OiBudW1iZXI7XG4gICAgLyoqIFJlc2lsaWVuY2UgdHJhY2tpbmc6IG9yaWdpbmFsIHBhcmFtZXRlcnMgZnJvbSBleGVjdXRlX2FnZW50IChJc3N1ZSAjNTI2KSAqL1xuICAgIG9yaWdpbmFsUGFyYW1ldGVycz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIC8qKiBSZXNpbGllbmNlIHRyYWNraW5nOiByZXNvbHZlZCBwb2xpY3kgZnJvbSBhZ2VudCBtZXRhZGF0YSAoSXNzdWUgIzUyNikgKi9cbiAgICByZXNpbGllbmNlUG9saWN5PzogQWdlbnRSZXNpbGllbmNlUG9saWN5O1xuICAgIC8qKiBSZWNlbnQgZ2F0ZWtlZXBlciBibG9ja3MgZHVyaW5nIHRoaXMgYWdlbnQncyBleGVjdXRpb24gKEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW0pICovXG4gICAgcmVjZW50QmxvY2tzOiBBcnJheTx7XG4gICAgICBvcGVyYXRpb246IHN0cmluZztcbiAgICAgIGVsZW1lbnRUeXBlPzogc3RyaW5nO1xuICAgICAgcmVhc29uOiBzdHJpbmc7XG4gICAgICAvKiogUGVybWlzc2lvbiBsZXZlbCB0aGF0IGNhdXNlZCB0aGUgYmxvY2sgKERFTlksIENPTkZJUk1fU0VTU0lPTiwgQ09ORklSTV9TSU5HTEVfVVNFKSAqL1xuICAgICAgbGV2ZWw6IHN0cmluZztcbiAgICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgICAgLyoqIFdoZXRoZXIgdGhpcyBibG9jayBoYXMgYmVlbiByZXBvcnRlZCBpbiBhIG5vdGlmaWNhdGlvbiAqL1xuICAgICAgcmVwb3J0ZWQ6IGJvb2xlYW47XG4gICAgfT47XG4gIH0+KCk7XG5cbiAgLyoqXG4gICAqIFNldCBvZiBhYm9ydGVkIGdvYWxJZHMuIE9uY2UgYSBnb2FsSWQgaXMgYWJvcnRlZCwgYWxsIGZ1cnRoZXIgZXhlY3V0aW9uXG4gICAqIG9wZXJhdGlvbnMgKHJlY29yZF9leGVjdXRpb25fc3RlcCwgY29tcGxldGVfZXhlY3V0aW9uLCBjb250aW51ZV9leGVjdXRpb24pXG4gICAqIGZvciB0aGF0IGdvYWxJZCBhcmUgcmVqZWN0ZWQgYXQgdGhlIGRpc3BhdGNoIGxheWVyLlxuICAgKlxuICAgKiBJc3N1ZSAjMjQ5OiBBYm9ydC9jYW5jZWxsYXRpb24gaW5mcmFzdHJ1Y3R1cmUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFib3J0ZWRHb2FscyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6IEhhbmRsZXJSZWdpc3RyeSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRUcmFja2VyPzogQ29ycmVsYXRpb25JZFByb3ZpZGVyLFxuICApIHtcbiAgICAvLyBJbml0aWFsaXplIG5vcm1hbGl6ZXJzIGZvciBzY2hlbWEtZHJpdmVuIG9wZXJhdGlvbnMgKElzc3VlICMyNDMpXG4gICAgaW5pdGlhbGl6ZU5vcm1hbGl6ZXJzKCk7XG4gICAgLy8gSXNzdWUgIzQ1MjogU3RvcmUgR2F0ZWtlZXBlciBpbnN0YW5jZSBmb3IgcG9saWN5IGVuZm9yY2VtZW50XG4gICAgaWYgKCFoYW5kbGVycy5nYXRla2VlcGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dhdGVrZWVwZXIgaW5zdGFuY2UgaXMgcmVxdWlyZWQgaW4gSGFuZGxlclJlZ2lzdHJ5LiBQcm92aWRlIG9uZSB2aWEgdGhlIERJIGNvbnRhaW5lci4nKTtcbiAgICB9XG4gICAgdGhpcy5nYXRla2VlcGVyID0gaGFuZGxlcnMuZ2F0ZWtlZXBlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdmVyaWZpY2F0aW9uIG1ldHJpY3MgZm9yIG1vbml0b3JpbmcvZGlhZ25vc3RpY3MuXG4gICAqIEZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBEYW5nZXJab25lRW5mb3JjZXIuZ2V0TWV0cmljcygpLlxuICAgKi9cbiAgZ2V0VmVyaWZpY2F0aW9uTWV0cmljcygpOiBWZXJpZmljYXRpb25NZXRyaWNzIHtcbiAgICByZXR1cm4gdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLmdldE1ldHJpY3ModGhpcy52ZXJpZmljYXRpb25SYXRlTGltaXRlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGF1dG9ub215IGV2YWx1YXRpb24gbWV0cmljcyBmb3IgbW9uaXRvcmluZy9kaWFnbm9zdGljcy5cbiAgICogSXNzdWUgIzM5MTogRm9sbG93cyB0aGUgc2FtZSBwYXR0ZXJuIGFzIGdldFZlcmlmaWNhdGlvbk1ldHJpY3MoKS5cbiAgICovXG4gIGdldEF1dG9ub215TWV0cmljcygpOiBBdXRvbm9teU1ldHJpY3NTbmFwc2hvdCB7XG4gICAgcmV0dXJuIGdldEF1dG9ub215TWV0cmljcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdhdGhlciBjdXJyZW50bHkgYWN0aXZlIGVsZW1lbnRzIGZvciBHYXRla2VlcGVyIHBvbGljeSBldmFsdWF0aW9uLlxuICAgKlxuICAgKiBRdWVyaWVzIFBlcnNvbmFNYW5hZ2VyLCBTa2lsbE1hbmFnZXIsIGFuZCBFbnNlbWJsZU1hbmFnZXIgZm9yIGFjdGl2ZSBlbGVtZW50cyxcbiAgICogdGhlbiBhcHBlbmRzIGFueSBjdXJyZW50bHkgZXhlY3V0aW5nIGFnZW50cyB3aXRoIGdhdGVrZWVwZXIgcG9saWNpZXMuIEFsbFxuICAgKiBlbGVtZW50cyBhcmUgbWFwcGVkIHRvIHRoZSB7QGxpbmsgQWN0aXZlRWxlbWVudH0gaW50ZXJmYWNlIGV4cGVjdGVkIGJ5XG4gICAqIGBHYXRla2VlcGVyLmVuZm9yY2UoKWAuXG4gICAqXG4gICAqIElzc3VlICM0NTI6IFByb3ZpZGVzIGVsZW1lbnQgY29udGV4dCBmb3IgTGF5ZXIgMiAoZWxlbWVudCBwb2xpY3kgcmVzb2x1dGlvbikuXG4gICAqIElzc3VlICM0NDk6IEluY2x1ZGVzIGV4ZWN1dGluZyBhZ2VudHMgYWxvbmdzaWRlIHBlcnNvbmFzL3NraWxscy9lbnNlbWJsZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGFjdGl2ZSBlbGVtZW50cyB3aXRoIHRoZWlyIGdhdGVrZWVwZXIgcG9saWNpZXMsIG9yIGVtcHR5XG4gICAqICAgICAgICAgIGFycmF5IGlmIGdhdGhlcmluZyBmYWlscyAoZmFpbC1vcGVuOiBvbmx5IHJvdXRlIHBvbGljaWVzIGFwcGx5KS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWN0aXZlRWxlbWVudHMoc2Vzc2lvbklkPzogc3RyaW5nKTogUHJvbWlzZTxBY3RpdmVFbGVtZW50W10+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3RWxlbWVudHMgPSBzZXNzaW9uSWRcbiAgICAgICAgPyBhd2FpdCB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmdldFBvbGljeUVsZW1lbnRzRm9yUmVwb3J0KHNlc3Npb25JZClcbiAgICAgICAgOiBhd2FpdCB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmdldEFjdGl2ZUVsZW1lbnRzRm9yUG9saWN5KCk7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50czogQWN0aXZlRWxlbWVudFtdID0gcmF3RWxlbWVudHMubWFwKChlbCkgPT4gKHtcbiAgICAgICAgdHlwZTogZWwudHlwZSxcbiAgICAgICAgbmFtZTogZWwubmFtZSxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAoZWwubWV0YWRhdGEuZGVzY3JpcHRpb24gYXMgc3RyaW5nKSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZ2F0ZWtlZXBlcjogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXIgYXMgQWN0aXZlRWxlbWVudFsnbWV0YWRhdGEnXVsnZ2F0ZWtlZXBlciddID8/IHVuZGVmaW5lZCxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgLy8gSXNzdWUgIzQ0OTogSW5jbHVkZSBleGVjdXRpbmcgYWdlbnRzIHdpdGggZ2F0ZWtlZXBlciBwb2xpY2llc1xuICAgICAgaWYgKCFzZXNzaW9uSWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbLCBhZ2VudEVudHJ5XSBvZiB0aGlzLmV4ZWN1dGluZ0FnZW50cykge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2FnZW50JyxcbiAgICAgICAgICAgIG5hbWU6IGFnZW50RW50cnkubmFtZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIG5hbWU6IGFnZW50RW50cnkubmFtZSxcbiAgICAgICAgICAgICAgZ2F0ZWtlZXBlcjogYWdlbnRFbnRyeS5tZXRhZGF0YS5nYXRla2VlcGVyIGFzIEFjdGl2ZUVsZW1lbnRbJ21ldGFkYXRhJ11bJ2dhdGVrZWVwZXInXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWlsIG9wZW4g4oCUIGlmIHdlIGNhbid0IGdhdGhlciBhY3RpdmUgZWxlbWVudHMsIGVuZm9yY2Ugd2l0aG91dCB0aGVtXG4gICAgICAvLyBUaGlzIG1lYW5zIG9ubHkgcm91dGUgdmFsaWRhdGlvbiBhbmQgZGVmYXVsdCBwb2xpY2llcyB3aWxsIGFwcGx5XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGdhdGhlciBhY3RpdmUgZWxlbWVudHMgZm9yIEdhdGVrZWVwZXIgcG9saWN5IGV2YWx1YXRpb24nLCB7IGVycm9yLCBzZXNzaW9uSWQgfSk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRQb2xpY3lSZXBvcnRFbGVtZW50cyhzZXNzaW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPEFjdGl2ZUVsZW1lbnRbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdFbGVtZW50cyA9IGF3YWl0IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQuZ2V0UG9saWN5RWxlbWVudHNGb3JSZXBvcnQoc2Vzc2lvbklkKTtcbiAgICAgIHJldHVybiByYXdFbGVtZW50cy5tYXAoKGVsKSA9PiAoe1xuICAgICAgICB0eXBlOiBlbC50eXBlLFxuICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIG5hbWU6IGVsLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IChlbC5tZXRhZGF0YS5kZXNjcmlwdGlvbiBhcyBzdHJpbmcpID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBnYXRla2VlcGVyOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlciBhcyBBY3RpdmVFbGVtZW50WydtZXRhZGF0YSddWydnYXRla2VlcGVyJ10gPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KChlbCBhcyB7IHNlc3Npb25JZHM/OiBzdHJpbmdbXSB9KS5zZXNzaW9uSWRzKVxuICAgICAgICAgICAgPyB7IHNlc3Npb25JZHM6IChlbCBhcyB7IHNlc3Npb25JZHM/OiBzdHJpbmdbXSB9KS5zZXNzaW9uSWRzIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGdhdGhlciBwb2xpY3kgZWxlbWVudHMgZm9yIGRhc2hib2FyZCByZXBvcnRpbmcnLCB7IGVycm9yLCBzZXNzaW9uSWQgfSk7XG4gICAgICByZXR1cm4gc2Vzc2lvbklkID8gW10gOiB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBDUkVBVEUgb3BlcmF0aW9ucyAoYWRkaXRpdmUsIG5vbi1kZXN0cnVjdGl2ZSlcbiAgICpcbiAgICogQ1JFQVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6XG4gICAqIC0gY3JlYXRlX2VsZW1lbnQ6IENyZWF0ZSBuZXcgZWxlbWVudHNcbiAgICogLSBpbXBvcnRfZWxlbWVudDogSW1wb3J0IGVsZW1lbnRzIGZyb20gZXhwb3J0ZWQgZGF0YVxuICAgKiAtIGFkZEVudHJ5OiBBZGQgZW50cmllcyB0byBtZW1vcnkgZWxlbWVudHNcbiAgICpcbiAgICogU3VwcG9ydHMgYmF0Y2ggb3BlcmF0aW9ucyB3aGVuIGlucHV0IGNvbnRhaW5zIGBvcGVyYXRpb25zYCBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gT3BlcmF0aW9uIGlucHV0IHdpdGggb3BlcmF0aW9uIG5hbWUgYW5kIHBhcmFtcywgb3IgQmF0Y2hSZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9wZXJhdGlvblJlc3VsdCB3aXRoIHN1Y2Nlc3MvZmFpbHVyZSBzdGF0dXMsIG9yIEJhdGNoUmVzdWx0IGZvciBiYXRjaCBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBoYW5kbGVDcmVhdGUoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdCB8IEJhdGNoUmVzdWx0PiB7XG4gICAgaWYgKGlzQmF0Y2hSZXF1ZXN0KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUJhdGNoKGlucHV0LCAnQ1JFQVRFJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVPcGVyYXRpb24oaW5wdXQsICdDUkVBVEUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgUkVBRCBvcGVyYXRpb25zIChyZWFkLW9ubHksIHNhZmUpXG4gICAqXG4gICAqIFJFQUQgZW5kcG9pbnQgb3BlcmF0aW9uczpcbiAgICogLSBsaXN0X2VsZW1lbnRzOiBMaXN0IGVsZW1lbnRzIHdpdGggZmlsdGVyaW5nXG4gICAqIC0gZ2V0X2VsZW1lbnQ6IEdldCBlbGVtZW50IGJ5IG5hbWVcbiAgICogLSBnZXRfZWxlbWVudF9kZXRhaWxzOiBHZXQgZGV0YWlsZWQgZWxlbWVudCBpbmZvcm1hdGlvblxuICAgKiAtIHNlYXJjaF9lbGVtZW50czogRnVsbC10ZXh0IHNlYXJjaFxuICAgKiAtIHF1ZXJ5X2VsZW1lbnRzOiBRdWVyeSB3aXRoIHBhZ2luYXRpb25cbiAgICogLSBnZXRfYWN0aXZlX2VsZW1lbnRzOiBHZXQgYWN0aXZlIGVsZW1lbnRzXG4gICAqIC0gdmFsaWRhdGVfZWxlbWVudDogVmFsaWRhdGUgZWxlbWVudFxuICAgKiAtIHJlbmRlcjogUmVuZGVyIHRlbXBsYXRlXG4gICAqIC0gZXhwb3J0X2VsZW1lbnQ6IEV4cG9ydCBlbGVtZW50XG4gICAqIC0gYWN0aXZhdGVfZWxlbWVudDogQWN0aXZhdGUgZWxlbWVudHMgZm9yIHVzZVxuICAgKiAtIGRlYWN0aXZhdGVfZWxlbWVudDogRGVhY3RpdmF0ZSBlbGVtZW50XG4gICAqXG4gICAqIFN1cHBvcnRzIGJhdGNoIG9wZXJhdGlvbnMgd2hlbiBpbnB1dCBjb250YWlucyBgb3BlcmF0aW9uc2AgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wZXJhdGlvbiBuYW1lIGFuZCBwYXJhbXMsIG9yIEJhdGNoUmVxdWVzdFxuICAgKiBAcmV0dXJucyBPcGVyYXRpb25SZXN1bHQgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgc3RhdHVzLCBvciBCYXRjaFJlc3VsdCBmb3IgYmF0Y2ggb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgaGFuZGxlUmVhZChpbnB1dDogdW5rbm93bik6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0IHwgQmF0Y2hSZXN1bHQ+IHtcbiAgICBpZiAoaXNCYXRjaFJlcXVlc3QoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQmF0Y2goaW5wdXQsICdSRUFEJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVPcGVyYXRpb24oaW5wdXQsICdSRUFEJyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIFVQREFURSBvcGVyYXRpb25zIChtb2RpZnlpbmcgZXhpc3Rpbmcgc3RhdGUpXG4gICAqXG4gICAqIFVQREFURSBlbmRwb2ludCBvcGVyYXRpb25zOlxuICAgKiAtIGVkaXRfZWxlbWVudDogTW9kaWZ5IGV4aXN0aW5nIGVsZW1lbnRzXG4gICAqXG4gICAqIFN1cHBvcnRzIGJhdGNoIG9wZXJhdGlvbnMgd2hlbiBpbnB1dCBjb250YWlucyBgb3BlcmF0aW9uc2AgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wZXJhdGlvbiBuYW1lIGFuZCBwYXJhbXMsIG9yIEJhdGNoUmVxdWVzdFxuICAgKiBAcmV0dXJucyBPcGVyYXRpb25SZXN1bHQgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgc3RhdHVzLCBvciBCYXRjaFJlc3VsdCBmb3IgYmF0Y2ggb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgaGFuZGxlVXBkYXRlKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQgfCBCYXRjaFJlc3VsdD4ge1xuICAgIGlmIChpc0JhdGNoUmVxdWVzdChpbnB1dCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVCYXRjaChpbnB1dCwgJ1VQREFURScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlT3BlcmF0aW9uKGlucHV0LCAnVVBEQVRFJyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIERFTEVURSBvcGVyYXRpb25zIChkZXN0cnVjdGl2ZSBhY3Rpb25zKVxuICAgKlxuICAgKiBERUxFVEUgZW5kcG9pbnQgb3BlcmF0aW9uczpcbiAgICogLSBkZWxldGVfZWxlbWVudDogRGVsZXRlIGVsZW1lbnRzXG4gICAqIC0gY2xlYXI6IENsZWFyIG1lbW9yeSBlbnRyaWVzXG4gICAqIC0gY2xlYXJfZ2l0aHViX2F1dGg6IFJlbW92ZSBHaXRIdWIgYXV0aGVudGljYXRpb25cbiAgICpcbiAgICogU3VwcG9ydHMgYmF0Y2ggb3BlcmF0aW9ucyB3aGVuIGlucHV0IGNvbnRhaW5zIGBvcGVyYXRpb25zYCBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gT3BlcmF0aW9uIGlucHV0IHdpdGggb3BlcmF0aW9uIG5hbWUgYW5kIHBhcmFtcywgb3IgQmF0Y2hSZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9wZXJhdGlvblJlc3VsdCB3aXRoIHN1Y2Nlc3MvZmFpbHVyZSBzdGF0dXMsIG9yIEJhdGNoUmVzdWx0IGZvciBiYXRjaCBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBoYW5kbGVEZWxldGUoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdCB8IEJhdGNoUmVzdWx0PiB7XG4gICAgaWYgKGlzQmF0Y2hSZXF1ZXN0KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUJhdGNoKGlucHV0LCAnREVMRVRFJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVPcGVyYXRpb24oaW5wdXQsICdERUxFVEUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgRVhFQ1VURSBvcGVyYXRpb25zIChydW50aW1lIGV4ZWN1dGlvbiBsaWZlY3ljbGUpXG4gICAqXG4gICAqIEVYRUNVVEUgZW5kcG9pbnQgb3BlcmF0aW9uczpcbiAgICogLSBleGVjdXRlX2FnZW50OiBTdGFydCBleGVjdXRpb24gb2YgYW4gYWdlbnQgb3IgZXhlY3V0YWJsZSBlbGVtZW50XG4gICAqIC0gZ2V0X2V4ZWN1dGlvbl9zdGF0ZTogUXVlcnkgY3VycmVudCBleGVjdXRpb24gc3RhdGVcbiAgICogLSByZWNvcmRfZXhlY3V0aW9uX3N0ZXA6IFJlY29yZCBleGVjdXRpb24gcHJvZ3Jlc3Mgb3IgZmluZGluZ3NcbiAgICogLSBjb21wbGV0ZV9leGVjdXRpb246IFNpZ25hbCBleGVjdXRpb24gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5XG4gICAqIC0gY29udGludWVfZXhlY3V0aW9uOiBSZXN1bWUgZXhlY3V0aW9uIGZyb20gc2F2ZWQgc3RhdGVcbiAgICogLSBhYm9ydF9leGVjdXRpb246IENhbmNlbCBhbiBvbmdvaW5nIGV4ZWN1dGlvblxuICAgKlxuICAgKiBVbmxpa2UgQ1JVRCBvcGVyYXRpb25zICh3aGljaCBhcmUgaWRlbXBvdGVudCksIEVYRUNVVEUgb3BlcmF0aW9ucyBtYW5hZ2VcbiAgICogcnVudGltZSBzdGF0ZSBhbmQgYXJlIGluaGVyZW50bHkgbm9uLWlkZW1wb3RlbnQuIENhbGxpbmcgZXhlY3V0ZSB0d2ljZVxuICAgKiBjcmVhdGVzIHR3byBzZXBhcmF0ZSBleGVjdXRpb25zLlxuICAgKlxuICAgKiBTdXBwb3J0cyBiYXRjaCBvcGVyYXRpb25zIHdoZW4gaW5wdXQgY29udGFpbnMgYG9wZXJhdGlvbnNgIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBPcGVyYXRpb24gaW5wdXQgd2l0aCBvcGVyYXRpb24gbmFtZSBhbmQgcGFyYW1zLCBvciBCYXRjaFJlcXVlc3RcbiAgICogQHJldHVybnMgT3BlcmF0aW9uUmVzdWx0IHdpdGggc3VjY2Vzcy9mYWlsdXJlIHN0YXR1cywgb3IgQmF0Y2hSZXN1bHQgZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIGhhbmRsZUV4ZWN1dGUoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdCB8IEJhdGNoUmVzdWx0PiB7XG4gICAgaWYgKGlzQmF0Y2hSZXF1ZXN0KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUJhdGNoKGlucHV0LCAnRVhFQ1VURScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlT3BlcmF0aW9uKGlucHV0LCAnRVhFQ1VURScpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcmUgZXhlY3V0aW9uIGxvZ2ljIHNoYXJlZCBieSBhbGwgQ1JVRCBlbmRwb2ludHMuXG4gICAqIEltcGxlbWVudHMgdGhlIHRoaW4gcmVzb2x2ZXIgcGF0dGVybjogdmFsaWRhdGUg4oaSIHJvdXRlIOKGkiBkaXNwYXRjaCDihpIgcmV0dXJuLlxuICAgKlxuICAgKiBPUEVSQVRJT04gRkxPVzpcbiAgICogMS4gVmFsaWRhdGUgaW5wdXQgc3RydWN0dXJlXG4gICAqIDIuIFZhbGlkYXRlIHBlcm1pc3Npb25zIChQZXJtaXNzaW9uR3VhcmQpXG4gICAqIDMuIFJvdXRlIG9wZXJhdGlvbiAoT3BlcmF0aW9uUm91dGVyKVxuICAgKiA0LiBEaXNwYXRjaCB0byBoYW5kbGVyXG4gICAqIDUuIFJldHVybiBzdGFuZGFyZGl6ZWQgcmVzdWx0XG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIFJhdyBpbnB1dCB0byB2YWxpZGF0ZSBhbmQgcHJvY2Vzc1xuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBDUlVEIGVuZHBvaW50IGJlaW5nIGNhbGxlZFxuICAgKiBAcmV0dXJucyBTdGFuZGFyZGl6ZWQgT3BlcmF0aW9uUmVzdWx0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVPcGVyYXRpb24oXG4gICAgaW5wdXQ6IHVua25vd24sXG4gICAgZW5kcG9pbnQ6IENSVURFbmRwb2ludFxuICApOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdD4ge1xuICAgIC8vIElzc3VlICMzMDE6IENhcHR1cmUgc3RhcnQgdGltZSBmb3IgcmVzcG9uc2UgdGltaW5nIG1ldGFkYXRhXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAvLyBTdGVwIDE6IFBhcnNlIGFuZCBub3JtYWxpemUgaW5wdXQgKGhhbmRsZXMgYm90aCBwcm9wZXIgYW5kIGxlZ2FjeSBmb3JtYXRzKVxuICAgIC8vIElzc3VlICMyMDU6IFNpbGVudCBKU09OIGZhbGxiYWNrIGZvciBlZGdlIGNhc2VzXG4gICAgY29uc3QgcGFyc2VkSW5wdXQgPSBwYXJzZU9wZXJhdGlvbklucHV0KGlucHV0KTtcblxuICAgIC8vIEV4dHJhY3Qgb3BlcmF0aW9uIG5hbWUgZm9yIGxvZ2dpbmdcbiAgICBjb25zdCBvcGVyYXRpb25OYW1lID0gcGFyc2VkSW5wdXQ/Lm9wZXJhdGlvbiA/PyAndW5rbm93bic7XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ2hlY2sgaWYgcGFyc2luZyBzdWNjZWVkZWRcbiAgICAgIGlmICghcGFyc2VkSW5wdXQpIHtcbiAgICAgICAgLy8gUHJvdmlkZSBzcGVjaWZpYyBkaWFnbm9zdGljcyBkZXBlbmRpbmcgb24gd2hhdCB3ZW50IHdyb25nXG4gICAgICAgIGNvbnN0IGRpYWdub3N0aWMgPSBkZXNjcmliZUludmFsaWRJbnB1dChpbnB1dCk7XG4gICAgICAgIGNvbnN0IGhhc09wZXJhdGlvbiA9IGlucHV0ICYmIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIChpbnB1dCBhcyBhbnkpLm9wZXJhdGlvbiA9PT0gJ3N0cmluZyc7XG4gICAgICAgIGNvbnN0IGhpbnQgPSBoYXNPcGVyYXRpb25cbiAgICAgICAgICA/ICdUaGUgaW5wdXQgc3RydWN0dXJlIGxvb2tzIGNvcnJlY3QgYnV0IHZhbGlkYXRpb24gZmFpbGVkLiBJZiBjb250ZW50IGNvbnRhaW5zIG1hcmtkb3duIG9yIHNwZWNpYWwgY2hhcmFjdGVycywgZW5zdXJlIHRoZSBKU09OIGlzIHByb3Blcmx5IGVzY2FwZWQuJ1xuICAgICAgICAgIDogJ1VzZSBmb3JtYXQ6IHsgb3BlcmF0aW9uOiBcImxpc3RfZWxlbWVudHNcIiwgcGFyYW1zOiB7IHR5cGU6IFwicGVyc29uYXNcIiB9IH0nO1xuICAgICAgICByZXR1cm4gdGhpcy5mYWlsdXJlKFxuICAgICAgICAgIGBJbnZhbGlkIGlucHV0OiBleHBlY3RlZCBPcGVyYXRpb25JbnB1dCB3aXRoIFwib3BlcmF0aW9uXCIgYW5kIG9wdGlvbmFsIFwicGFyYW1zXCIuICR7ZGlhZ25vc3RpY30uICR7aGludH1gLFxuICAgICAgICAgIHN0YXJ0VGltZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IG9wZXJhdGlvbiwgZWxlbWVudFR5cGUsIHBhcmFtcyB9ID0gcGFyc2VkSW5wdXQ7XG5cbiAgICAgIC8vIFN0ZXAgMjogRW5mb3JjZSBHYXRla2VlcGVyIHBvbGljeSAoSXNzdWUgIzQ1MilcbiAgICAgIGlmIChlbnYuRE9MTEhPVVNFX0dBVEVLRUVQRVJfRU5BQkxFRCkge1xuICAgICAgICAvLyBGdWxsIDQtbGF5ZXIgY2hlY2s6IHJvdXRlIHZhbGlkYXRpb24g4oaSIGVsZW1lbnQgcG9saWNpZXMg4oaSIHNlc3Npb24gY29uZmlybWF0aW9ucyDihpIgZGVmYXVsdHNcbiAgICAgICAgLy8gSXNzdWUgIzc1ODogR2F0ZWtlZXBlciBpbmZyYXN0cnVjdHVyZSBvcGVyYXRpb25zIChjb25maXJtX29wZXJhdGlvbiwgdmVyaWZ5X2NoYWxsZW5nZSwgZXRjLilcbiAgICAgICAgLy8gc2tpcCBlbGVtZW50IHBvbGljeSBldmFsdWF0aW9uIGluIHRoZSBwcmltYXJ5IGVuZm9yY2VtZW50IHBhdGggdG8gcHJldmVudCBjYXNjYWRpbmdcbiAgICAgICAgLy8gY29uZmlybWF0aW9uIGxvb3BzLiBFbGVtZW50IHBvbGljaWVzIGZvciB0aGUgVEFSR0VUIG9wZXJhdGlvbiBhcmUgZXZhbHVhdGVkIHNlcGFyYXRlbHlcbiAgICAgICAgLy8gaW5zaWRlIHRoZSBjb25maXJtIGhhbmRsZXIsIGFuZCBkZW55OiBbJ2NvbmZpcm1fb3BlcmF0aW9uJ10gaXMgZW5mb3JjZWQgYXMgYSBzYW5kYm94LlxuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSB0aGlzLmdhdGVrZWVwZXIuZW5mb3JjZSh7XG4gICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgIGVuZHBvaW50LFxuICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgICAgIHNraXBFbGVtZW50UG9saWNpZXM6IGlzR2F0ZWtlZXBlckluZnJhT3BlcmF0aW9uKG9wZXJhdGlvbiksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlY29yZCBHYXRla2VlcGVyIGRlY2lzaW9uIGZvciBtZXRyaWNzXG4gICAgICAgIHRoaXMuaGFuZGxlcnMuZ2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyPy5yZWNvcmQoe1xuICAgICAgICAgIGFsbG93ZWQ6IGRlY2lzaW9uLmFsbG93ZWQsXG4gICAgICAgICAgcGVybWlzc2lvbkxldmVsOiBkZWNpc2lvbi5wZXJtaXNzaW9uTGV2ZWwsXG4gICAgICAgICAgcG9saWN5U291cmNlOiBkZWNpc2lvbi5wb2xpY3lTb3VyY2UsXG4gICAgICAgICAgY29uZmlybWF0aW9uUGVuZGluZzogZGVjaXNpb24uY29uZmlybWF0aW9uUGVuZGluZyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFkZWNpc2lvbi5hbGxvd2VkKSB7XG4gICAgICAgICAgaWYgKGRlY2lzaW9uLmNvbmZpcm1hdGlvblBlbmRpbmcpIHtcbiAgICAgICAgICAgIC8vIElzc3VlICMxNjUzOiBBdXRvLWNvbmZpcm0gd2hlbiB0aGUgaG9zdCAoQ2xhdWRlIENvZGUsIGV0Yy4pIGhhcyBhbHJlYWR5XG4gICAgICAgICAgICAvLyBhcHByb3ZlZCB0aGlzIE1DUCB0b29sIGNhbGwuIFRoZSBob3N0J3MgdG9vbC1sZXZlbCBhcHByb3ZhbCBpcyB0aGUgcHJpbWFyeVxuICAgICAgICAgICAgLy8gaHVtYW4gZ2F0ZTsgdGhlIGdhdGVrZWVwZXIncyBjb25maXJtX29wZXJhdGlvbiByb3VuZC10cmlwIGlzIHJlZHVuZGFudCB3aGVuXG4gICAgICAgICAgICAvLyB0aGUgaG9zdCBnYXRlcyBldmVyeSBjYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFNhZmV0eSBsYXllcnMgdGhhdCByZW1haW4gYWN0aXZlIChwcm92ZW4gYnkgcGVybWlzc2lvbi1mbG93LWhhcm5lc3MgdGVzdHMpOlxuICAgICAgICAgICAgLy8gLSBFbGVtZW50IGRlbnkgcG9saWNpZXMgKGhhcmQgZGVueSwgbm8gY29uZmlybWF0aW9uUGVuZGluZyBmbGFnKVxuICAgICAgICAgICAgLy8gLSBjYW5CZUVsZXZhdGVkOiBmYWxzZSBjb25zdHJhaW50c1xuICAgICAgICAgICAgLy8gLSBTYWZldHkgdGllciBldmFsdWF0aW9uIChydW5zIGJlZm9yZSBjb25maXJtYXRpb24gY2hlY2spXG4gICAgICAgICAgICAvLyAtIERhbmdlclpvbmUgdmVyaWZpY2F0aW9uIChzZXBhcmF0ZSBmbG93KVxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFRoZSBjb25maXJtYXRpb24gaXMgcmVjb3JkZWQgaW4gdGhlIHNlc3Npb24gc28gc3Vic2VxdWVudCBlbmZvcmNlKCkgY2FsbHNcbiAgICAgICAgICAgIC8vIGZvciB0aGUgc2FtZSBvcGVyYXRpb24gcGFzcyB3aXRob3V0IHJlLWNvbmZpcm1pbmcuXG4gICAgICAgICAgICBjb25zdCBjb25maXJtTGV2ZWwgPSBkZWNpc2lvbi5wZXJtaXNzaW9uTGV2ZWwgYXNcbiAgICAgICAgICAgICAgUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0VTU0lPTiB8IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0U7XG5cbiAgICAgICAgICAgIC8vIFJpc2sgc2NvcmluZyBmb3IgZGVzdHJ1Y3RpdmUvaGlnaC1pbXBhY3Qgb3BlcmF0aW9ucy5cbiAgICAgICAgICAgIC8vIEFzc2lnbnMgYSByaXNrIHNjb3JlICgwLTEwMCkgYmFzZWQgb24gb3BlcmF0aW9uIGNoYXJhY3RlcmlzdGljcy5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIE1DUC1BUUwgZXF1aXZhbGVudCBvZiBhc3Nlc3NSaXNrKCkgZm9yIENMSSB0b29scy5cbiAgICAgICAgICAgIGNvbnN0IHJpc2tTY29yZSA9IHRoaXMuc2NvcmVPcGVyYXRpb25SaXNrKG9wZXJhdGlvbiwgZW5kcG9pbnQsIHBhcmFtcyk7XG5cbiAgICAgICAgICAgIHRoaXMuZ2F0ZWtlZXBlci5yZWNvcmRDb25maXJtYXRpb24ob3BlcmF0aW9uLCBjb25maXJtTGV2ZWwsIGVsZW1lbnRUeXBlKTtcblxuICAgICAgICAgICAgLy8gQnVpbGQgYW5kIGxvZyBhIGRldGFpbGVkIHN1bW1hcnkgZm9yIHNlc3Npb24gcmV2aWV3LlxuICAgICAgICAgICAgLy8gRXZlbiB0aG91Z2ggbm8gaHVtYW4gaXMgcHJvbXB0ZWQsIHRoaXMgYXBwZWFycyBpbiBxdWVyeV9sb2dzXG4gICAgICAgICAgICAvLyBzbyBvcGVyYXRvcnMgY2FuIHRyYWNlIHdoYXQgd2FzIGF1dG8tY29uZmlybWVkIGFuZCB3aHkuXG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5idWlsZE9wZXJhdGlvblN1bW1hcnkob3BlcmF0aW9uLCBlbGVtZW50VHlwZSwgcGFyYW1zKTtcbiAgICAgICAgICAgIGNvbnN0IHNjb3BlID0gZWxlbWVudFR5cGUgPyAnIFsnLmNvbmNhdChlbGVtZW50VHlwZSwgJ10nKSA6ICcnO1xuICAgICAgICAgICAgbGV0IHJpc2tMYWJlbCA9ICdMT1cnO1xuICAgICAgICAgICAgaWYgKHJpc2tTY29yZSA+PSA4MCkgcmlza0xhYmVsID0gJ0hJR0gnO1xuICAgICAgICAgICAgZWxzZSBpZiAocmlza1Njb3JlID49IDQwKSByaXNrTGFiZWwgPSAnTU9ERVJBVEUnO1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBbJ1tHYXRla2VlcGVyXSBBdXRvLWNvbmZpcm1lZCAoJywgcmlza0xhYmVsLCAnIHJpc2s9JywgU3RyaW5nKHJpc2tTY29yZSksXG4gICAgICAgICAgICAgICcpOiAnLCBzdW1tYXJ5LCBzY29wZSwgJy4gUmVhc29uOiAnLCBkZWNpc2lvbi5yZWFzb25dO1xuICAgICAgICAgICAgY29uc3QgbG9nTWVzc2FnZSA9IHBhcnRzLmpvaW4oJycpO1xuXG4gICAgICAgICAgICAvLyBDT05GSVJNX1NJTkdMRV9VU0Ugb3BlcmF0aW9ucyAoZGVsZXRlLCBleGVjdXRlX2FnZW50LCBlZGl0LCBhYm9ydClcbiAgICAgICAgICAgIC8vIGFyZSBoaWdoZXItcmlzayDigJQgbG9nIGF0IHdhcm4gbGV2ZWwgZm9yIHZpc2liaWxpdHkgaW4gYXVkaXQgdHJhaWxzLlxuICAgICAgICAgICAgaWYgKGNvbmZpcm1MZXZlbCA9PT0gUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0lOR0xFX1VTRSkge1xuICAgICAgICAgICAgICBsb2dnZXIud2Fybihsb2dNZXNzYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zyhsb2dNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSGFyZCBkZW55IOKAlCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBwb2xpY3ksIG5vIGNvbmZpcm1hdGlvbiBjYW4gaGVscFxuICAgICAgICAgICAgdGhpcy5yZWNvcmRHYXRla2VlcGVyQmxvY2tGb3JBZ2VudHMob3BlcmF0aW9uLCBlbGVtZW50VHlwZSwgZGVjaXNpb24ucmVhc29uID8/ICdPcGVyYXRpb24gYmxvY2tlZCBieSBwb2xpY3knLCBkZWNpc2lvbi5wZXJtaXNzaW9uTGV2ZWwpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbR2F0ZWtlZXBlcl0gJHtkZWNpc2lvbi5yZWFzb259YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzY3MzogUHJvdGVjdCBnYXRla2VlcGVyIHBvbGljeSBmaWVsZHMgZnJvbSBlbGVtZW50LXBvbGljeSBlbGV2YXRpb24uXG4gICAgICAgIC8vIGVkaXRfZWxlbWVudCBpcyBlbGV2YXRhYmxlIGZvciBub3JtYWwgZmllbGRzIChkZXNjcmlwdGlvbiwgdGFncywgZXRjLiksIGJ1dFxuICAgICAgICAvLyBlZGl0aW5nIGdhdGVrZWVwZXIgcG9saWNpZXMgYWx3YXlzIHJlcXVpcmVzIGV4cGxpY2l0IHVzZXIgY29uZmlybWF0aW9uLlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGFuIGVsZW1lbnQgZnJvbSBhdXRvLWFwcHJvdmluZyBjaGFuZ2VzIHRvIHNlY3VyaXR5IHBvbGljaWVzXG4gICAgICAgIC8vIG9uIG90aGVyIGVsZW1lbnRzICh0aGUgcHJpbWFyeSBwcml2aWxlZ2UgZXNjYWxhdGlvbiB2ZWN0b3IpLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgb3BlcmF0aW9uID09PSAnZWRpdF9lbGVtZW50JyAmJlxuICAgICAgICAgIGRlY2lzaW9uLnBvbGljeVNvdXJjZSA9PT0gJ2VsZW1lbnRfcG9saWN5JyAmJlxuICAgICAgICAgIGRlY2lzaW9uLnBlcm1pc3Npb25MZXZlbCA9PT0gUGVybWlzc2lvbkxldmVsLkFVVE9fQVBQUk9WRSAmJlxuICAgICAgICAgIHBhcmFtc1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBpbnB1dE9iaiA9IChwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmlucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IGhhc0dhdGVrZWVwZXJGaWVsZCA9XG4gICAgICAgICAgICBpbnB1dE9iaj8uZ2F0ZWtlZXBlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoaW5wdXRPYmo/Lm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkKT8uZ2F0ZWtlZXBlciAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKGhhc0dhdGVrZWVwZXJGaWVsZCkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYFtNQ1BBUUxIYW5kbGVyXSBHYXRla2VlcGVyIHBvbGljeSBlZGl0IGJsb2NrZWQgZnJvbSBlbGVtZW50LXBvbGljeSBlbGV2YXRpb24g4oCUIHJlcXVpcmVzIGV4cGxpY2l0IGNvbmZpcm1hdGlvbmAsIHtcbiAgICAgICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgcG9saWN5U291cmNlOiBkZWNpc2lvbi5wb2xpY3lTb3VyY2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZhaWx1cmUoXG4gICAgICAgICAgICAgIGBFZGl0aW5nIGdhdGVrZWVwZXIgcG9saWNpZXMgcmVxdWlyZXMgZXhwbGljaXQgdXNlciBjb25maXJtYXRpb24gYW5kIGNhbm5vdCBiZSBhdXRvLWFwcHJvdmVkIGJ5IGVsZW1lbnQgcG9saWNpZXMuIGAgK1xuICAgICAgICAgICAgICBgVXNlIGNvbmZpcm1fb3BlcmF0aW9uIHdpdGggcGFyYW1zIHsgb3BlcmF0aW9uOiBcImVkaXRfZWxlbWVudFwiJHtlbGVtZW50VHlwZSA/IGAsIGVsZW1lbnRfdHlwZTogXCIke2VsZW1lbnRUeXBlfVwiYCA6ICcnfSB9IHRvIGFwcHJvdmUsIHRoZW4gcmV0cnkuYCxcbiAgICAgICAgICAgICAgc3RhcnRUaW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gR2F0ZWtlZXBlciBkaXNhYmxlZCDigJQgZmFsbCBiYWNrIHRvIHJvdXRlIHZhbGlkYXRpb24gb25seVxuICAgICAgICBHYXRla2VlcGVyLnZhbGlkYXRlKG9wZXJhdGlvbiwgZW5kcG9pbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGVwIDM6IFJvdXRlIG9wZXJhdGlvbiB0byBoYW5kbGVyIHJlZmVyZW5jZVxuICAgICAgY29uc3Qgcm91dGUgPSBnZXRSb3V0ZShvcGVyYXRpb24pO1xuICAgICAgaWYgKCFyb3V0ZSkge1xuICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gYWZ0ZXIgUGVybWlzc2lvbkd1YXJkLnZhbGlkYXRlLCBidXQgZ3VhcmQgZGVmZW5zaXZlbHlcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZShgVW5rbm93biBvcGVyYXRpb246ICR7b3BlcmF0aW9ufWAsIHN0YXJ0VGltZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0ZXAgNDogRGlzcGF0Y2ggdG8gaGFuZGxlciAobWVyZ2UgaW1wbGljaXRQYXJhbXMgZnJvbSByb3V0ZSwgdXNlciBwYXJhbXMgdGFrZSBwcmVjZWRlbmNlKVxuICAgICAgY29uc3QgbWVyZ2VkUGFyYW1zID0gcm91dGUuaW1wbGljaXRQYXJhbXNcbiAgICAgICAgPyB7IC4uLnJvdXRlLmltcGxpY2l0UGFyYW1zLCAuLi5wYXJhbXMgfVxuICAgICAgICA6IHBhcmFtcyA/PyB7fTtcbiAgICAgIGNvbnN0IHJhd0RhdGEgPSBhd2FpdCB0aGlzLmRpc3BhdGNoKHJvdXRlLmhhbmRsZXIsIHtcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgcGFyYW1zOiBtZXJnZWRQYXJhbXMsXG4gICAgICB9KTtcblxuICAgICAgLy8gU3RlcCA1OiBBcHBseSBmaWVsZCBzZWxlY3Rpb24gKElzc3VlICMyMDIpXG4gICAgICAvLyBUcmFuc2Zvcm0gbmFtZSDihpIgZWxlbWVudF9uYW1lIGZvciBMTE0gY29uc2lzdGVuY3lcbiAgICAgIC8vIEFwcGx5IGZpZWxkIGZpbHRlcmluZyBpZiBmaWVsZHMgcGFyYW0gcHJvdmlkZWRcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmFwcGx5RmllbGRTZWxlY3Rpb24ocmF3RGF0YSwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAgICAgLy8gU3RlcCA2OiBMb2cgc3VjY2Vzc2Z1bCBvcGVyYXRpb24g4oCUIG9ubHkgbXV0YXRpb25zIGFyZSBzZWN1cml0eS1yZWxldmFudFxuICAgICAgaWYgKGVuZHBvaW50ICE9PSAnUkVBRCcpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdPUEVSQVRJT05fQ09NUExFVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgc291cmNlOiBgTUNQQVFMSGFuZGxlci4ke2VuZHBvaW50LnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgICAgICBkZXRhaWxzOiBlbGVtZW50VHlwZVxuICAgICAgICAgICAgPyBgJHtlbmRwb2ludH0gJyR7b3BlcmF0aW9ufScgY29tcGxldGVkIG9uICR7ZWxlbWVudFR5cGV9YFxuICAgICAgICAgICAgOiBgJHtlbmRwb2ludH0gJyR7b3BlcmF0aW9ufScgY29tcGxldGVkYCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcktleXM6IHBhcmFtcyA/IE9iamVjdC5rZXlzKHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiBbXSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgdGhpcy5oYW5kbGVycy5vcGVyYXRpb25NZXRyaWNzVHJhY2tlcj8ucmVjb3JkKG9wZXJhdGlvbk5hbWUsIGVuZHBvaW50LCBkdXJhdGlvbk1zLCB0cnVlKTtcbiAgICAgIGNvbnN0IHR5cGVTdWZmaXggPSBlbGVtZW50VHlwZSA/ICc6JyArIGVsZW1lbnRUeXBlIDogJyc7XG4gICAgICBsb2dnZXIuZGVidWcoYFtNQ1AtQVFMXSAke2VuZHBvaW50fSAke29wZXJhdGlvbn0ke3R5cGVTdWZmaXh9ICgke2R1cmF0aW9uTXMudG9GaXhlZCgxKX1tcylgKTtcbiAgICAgIHJldHVybiB0aGlzLnN1Y2Nlc3MoZGF0YSwgc3RhcnRUaW1lKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQ2F0Y2ggYWxsIGVycm9ycyBhbmQgcmV0dXJuIGFzIE9wZXJhdGlvbkZhaWx1cmVcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBjb25zdCBpc1NlY3VyaXR5VmlvbGF0aW9uID0gbWVzc2FnZS5pbmNsdWRlcygnU2VjdXJpdHkgdmlvbGF0aW9uJyk7XG5cbiAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICAgIHRoaXMuaGFuZGxlcnMub3BlcmF0aW9uTWV0cmljc1RyYWNrZXI/LnJlY29yZChvcGVyYXRpb25OYW1lLCBlbmRwb2ludCwgZHVyYXRpb25NcywgZmFsc2UpO1xuXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnRzIHdpdGggYXBwcm9wcmlhdGUgc2V2ZXJpdHlcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogaXNTZWN1cml0eVZpb2xhdGlvbiA/ICdVUERBVEVfU0VDVVJJVFlfVklPTEFUSU9OJyA6ICdPUEVSQVRJT05fRkFJTEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6IGlzU2VjdXJpdHlWaW9sYXRpb24gPyAnSElHSCcgOiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiBgTUNQQVFMSGFuZGxlci4ke2VuZHBvaW50LnRvTG93ZXJDYXNlKCl9YCxcbiAgICAgICAgZGV0YWlsczogYCR7ZW5kcG9pbnR9ICcke29wZXJhdGlvbk5hbWV9JyBmYWlsZWQ6ICR7bWVzc2FnZX1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbmRwb2ludCwgb3BlcmF0aW9uOiBvcGVyYXRpb25OYW1lLCBlcnJvcjogbWVzc2FnZSB9XG4gICAgICB9KTtcblxuICAgICAgbG9nZ2VyLmVycm9yKGAke2VuZHBvaW50fSAnJHtvcGVyYXRpb25OYW1lfScgZmFpbGVkOiAke21lc3NhZ2V9YCwge1xuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25OYW1lLFxuICAgICAgICBlcnJvcjogbWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZShtZXNzYWdlLCBzdGFydFRpbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgYmF0Y2ggb2Ygb3BlcmF0aW9ucyBzZXF1ZW50aWFsbHkuXG4gICAqIE9wZXJhdGlvbnMgYXJlIGV4ZWN1dGVkIGluIG9yZGVyLCBhbmQgZmFpbHVyZXMgZG8gbm90IHN0b3AgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBFWEVDVVRJT04gU0VNQU5USUNTOlxuICAgKiAtIE9wZXJhdGlvbnMgcnVuIHNlcXVlbnRpYWxseSAoaW4gb3JkZXIpXG4gICAqIC0gRWFjaCBvcGVyYXRpb24gaXMgdmFsaWRhdGVkIGluZGVwZW5kZW50bHlcbiAgICogLSBGYWlsZWQgb3BlcmF0aW9ucyBkb24ndCBzdG9wIHRoZSBiYXRjaFxuICAgKiAtIEFsbCByZXN1bHRzIGFyZSBjb2xsZWN0ZWQgYW5kIHJldHVybmVkXG4gICAqXG4gICAqIEBwYXJhbSBiYXRjaCAtIEJhdGNoUmVxdWVzdCB3aXRoIGFycmF5IG9mIG9wZXJhdGlvbnNcbiAgICogQHBhcmFtIGVuZHBvaW50IC0gQ1JVRCBlbmRwb2ludCBiZWluZyBjYWxsZWRcbiAgICogQHJldHVybnMgQmF0Y2hSZXN1bHQgd2l0aCBhbGwgb3BlcmF0aW9uIHJlc3VsdHMgYW5kIHN1bW1hcnlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUJhdGNoKFxuICAgIGJhdGNoOiBCYXRjaFJlcXVlc3QsXG4gICAgZW5kcG9pbnQ6IENSVURFbmRwb2ludFxuICApOiBQcm9taXNlPEJhdGNoUmVzdWx0PiB7XG4gICAgLy8gSXNzdWUgIzIyMS8jNTQzOiBSZWplY3Qgb3ZlcnNpemVkIGJhdGNoZXMgdG8gcHJldmVudCByZXNvdXJjZSBleGhhdXN0aW9uXG4gICAgaWYgKGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoID4gU0VDVVJJVFlfTElNSVRTLk1BWF9CQVRDSF9PUEVSQVRJT05TKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdCQVRDSF9SRUpFQ1RFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiBgTUNQQVFMSGFuZGxlci4ke2VuZHBvaW50LnRvTG93ZXJDYXNlKCl9LmJhdGNoYCxcbiAgICAgICAgZGV0YWlsczogYEJhdGNoIG9mICR7YmF0Y2gub3BlcmF0aW9ucy5sZW5ndGh9IG9wcyByZWplY3RlZCDigJQgZXhjZWVkcyBsaW1pdCBvZiAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfQkFUQ0hfT1BFUkFUSU9OU31gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBlbmRwb2ludCwgcmVxdWVzdGVkOiBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCwgbGltaXQ6IFNFQ1VSSVRZX0xJTUlUUy5NQVhfQkFUQ0hfT1BFUkFUSU9OUyB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgcmVzdWx0czogW10sXG4gICAgICAgIHN1bW1hcnk6IHsgdG90YWw6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoLCBzdWNjZWVkZWQ6IDAsIGZhaWxlZDogYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGggfSxcbiAgICAgICAgZXJyb3I6IGBCYXRjaCBzaXplICR7YmF0Y2gub3BlcmF0aW9ucy5sZW5ndGh9IGV4Y2VlZHMgbWF4aW11bSBvZiAke1NFQ1VSSVRZX0xJTUlUUy5NQVhfQkFUQ0hfT1BFUkFUSU9OU30gb3BlcmF0aW9uc2AsXG4gICAgICAgIF9tZXRhOiB0aGlzLmJ1aWxkTWV0YShwZXJmb3JtYW5jZS5ub3coKSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIElzc3VlICMzMDE6IENhcHR1cmUgc3RhcnQgdGltZSBmb3IgYmF0Y2gtbGV2ZWwgdGltaW5nIG1ldGFkYXRhXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgcmVzdWx0czogQmF0Y2hPcGVyYXRpb25SZXN1bHRbXSA9IFtdO1xuICAgIGxldCBzdWNjZWVkZWQgPSAwO1xuICAgIGxldCBmYWlsZWQgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvcCA9IGJhdGNoLm9wZXJhdGlvbnNbaV07XG5cbiAgICAgIC8vIFBhc3MgcmF3IG9wZXJhdGlvbiB0aHJvdWdoIOKAlCBwYXJzZU9wZXJhdGlvbklucHV0KCkgaW4gZXhlY3V0ZU9wZXJhdGlvbigpXG4gICAgICAvLyBoYW5kbGVzIGFsbCBub3JtYWxpemF0aW9uIChlbGVtZW50X3R5cGUgdnMgZWxlbWVudFR5cGUsIGxlZ2FjeSBmb3JtYXRzLCBldGMuKVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlT3BlcmF0aW9uKG9wLCBlbmRwb2ludCk7XG5cbiAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgIGluZGV4OiBpLFxuICAgICAgICBvcGVyYXRpb246IG9wLm9wZXJhdGlvbixcbiAgICAgICAgcmVzdWx0LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBzdWNjZWVkZWQrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWxlZCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvZyBiYXRjaCBjb21wbGV0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0JBVENIX0NPTVBMRVRFRCcsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6IGBNQ1BBUUxIYW5kbGVyLiR7ZW5kcG9pbnQudG9Mb3dlckNhc2UoKX0uYmF0Y2hgLFxuICAgICAgZGV0YWlsczogYEJhdGNoIG9mICR7YmF0Y2gub3BlcmF0aW9ucy5sZW5ndGh9IG9wczogJHtzdWNjZWVkZWR9IHN1Y2NlZWRlZCwgJHtmYWlsZWR9IGZhaWxlZGAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgdG90YWw6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoLFxuICAgICAgICBzdWNjZWVkZWQsXG4gICAgICAgIGZhaWxlZCxcbiAgICAgICAgb3BlcmF0aW9uczogYmF0Y2gub3BlcmF0aW9ucy5tYXAob3AgPT4gb3Aub3BlcmF0aW9uKSxcbiAgICAgICAgZmFpbHVyZVJhdGU6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoID4gMCA/IE1hdGgucm91bmQoKGZhaWxlZCAvIGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoKSAqIDEwMCkgOiAwLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgcmVzdWx0cyxcbiAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgdG90YWw6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoLFxuICAgICAgICBzdWNjZWVkZWQsXG4gICAgICAgIGZhaWxlZCxcbiAgICAgIH0sXG4gICAgICBfbWV0YTogdGhpcy5idWlsZE1ldGEoc3RhcnRUaW1lKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIGEgaGFuZGxlciByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCBoYW5kbGVyIG1ldGhvZC5cbiAgICpcbiAgICogSGFuZGxlciByZWZlcmVuY2UgZm9ybWF0OiBcIk1vZHVsZS5tZXRob2RcIlxuICAgKiBFeGFtcGxlczpcbiAgICogLSBcIkVsZW1lbnRDUlVELmNyZWF0ZVwiIOKGkiB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmNyZWF0ZUVsZW1lbnQoLi4uKVxuICAgKiAtIFwiTWVtb3J5LmFkZEVudHJ5XCIg4oaSIHRoaXMuaGFuZGxlcnMubWVtb3J5TWFuYWdlci5hZGRFbnRyeSguLi4pXG4gICAqIC0gXCJBZ2VudC5leGVjdXRlXCIg4oaSIHRoaXMuaGFuZGxlcnMuYWdlbnRNYW5hZ2VyLmV4ZWN1dGVBZ2VudCguLi4pXG4gICAqXG4gICAqIERJU1BBVENIIFNUUkFURUdZIChJc3N1ZSAjMjQ3KTpcbiAgICogMS4gQ2hlY2sgaWYgb3BlcmF0aW9uIGlzIHNjaGVtYS1kcml2ZW4g4oaSIHVzZSBTY2hlbWFEaXNwYXRjaGVyXG4gICAqIDIuIE90aGVyd2lzZSBmYWxsIHRocm91Z2ggdG8gbGVnYWN5IG1vZHVsZS1iYXNlZCBkaXNwYXRjaFxuICAgKlxuICAgKiBTY2hlbWEtZHJpdmVuIG9wZXJhdGlvbnMgYmVuZWZpdCBmcm9tOlxuICAgKiAtIERlY2xhcmF0aXZlIGNvbmZpZ3VyYXRpb24gKG5vIHN3aXRjaCBzdGF0ZW1lbnRzKVxuICAgKiAtIEF1dG8tZ2VuZXJhdGVkIHBhcmFtZXRlciB2YWxpZGF0aW9uXG4gICAqIC0gU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3Igb3BlcmF0aW9uIG1ldGFkYXRhXG4gICAqXG4gICAqIEBwYXJhbSBoYW5kbGVyUmVmIC0gSGFuZGxlciByZWZlcmVuY2UgaW4gXCJNb2R1bGUubWV0aG9kXCIgZm9ybWF0XG4gICAqIEBwYXJhbSBpbnB1dCAtIFZhbGlkYXRlZCBvcGVyYXRpb24gaW5wdXRcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gb3BlcmF0aW9uLXNwZWNpZmljIGRhdGFcbiAgICogQHRocm93cyBFcnJvciBpZiBoYW5kbGVyIHJlZmVyZW5jZSBpcyB1bmtub3duIG9yIG1ldGhvZCBmYWlsc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaChcbiAgICBoYW5kbGVyUmVmOiBzdHJpbmcsXG4gICAgaW5wdXQ6IE9wZXJhdGlvbklucHV0XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHsgb3BlcmF0aW9uLCBwYXJhbXMgfSA9IGlucHV0O1xuXG4gICAgLy8gSXNzdWUgIzI0NzogU2NoZW1hLWRyaXZlbiBkaXNwYXRjaCBmb3IgY29uZmlndXJlZCBvcGVyYXRpb25zXG4gICAgLy8gVGhpcyBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciBtYW51YWwgc3dpdGNoIHN0YXRlbWVudHNcbiAgICAvLyBJc3N1ZSAjMjUxOiBQYXNzIGZ1bGwgaW5wdXQgZm9yIG9wZXJhdGlvbnMgbmVlZGluZyBlbGVtZW50VHlwZSByZXNvbHV0aW9uXG4gICAgaWYgKFNjaGVtYURpc3BhdGNoZXIuY2FuRGlzcGF0Y2gob3BlcmF0aW9uKSkge1xuICAgICAgcmV0dXJuIFNjaGVtYURpc3BhdGNoZXIuZGlzcGF0Y2goXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgKHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfHwge30sXG4gICAgICAgIHRoaXMuaGFuZGxlcnMsXG4gICAgICAgIGlucHV0XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBtb2R1bGUtYmFzZWQgZGlzcGF0Y2ggZm9yIGNvbXBsZXggb3BlcmF0aW9uc1xuICAgIGNvbnN0IFttb2R1bGUsIG1ldGhvZF0gPSBoYW5kbGVyUmVmLnNwbGl0KCcuJyk7XG5cbiAgICAvLyBFbGVtZW50Q1JVRCBvcGVyYXRpb25zXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0VsZW1lbnRDUlVEJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hFbGVtZW50Q1JVRChtZXRob2QsIGlucHV0KTtcbiAgICB9XG5cbiAgICAvLyBNZW1vcnkgb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdNZW1vcnknKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaE1lbW9yeShtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQWdlbnQgb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdBZ2VudCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQWdlbnQobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIFRlbXBsYXRlIG9wZXJhdGlvbnNcbiAgICBpZiAobW9kdWxlID09PSAnVGVtcGxhdGUnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaFRlbXBsYXRlKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBBY3RpdmF0aW9uIG9wZXJhdGlvbnMgKGNyb3NzLWN1dHRpbmcgY29uY2VybilcbiAgICBpZiAobW9kdWxlID09PSAnQWN0aXZhdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQWN0aXZhdGlvbihtZXRob2QsIGlucHV0KTtcbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdTZWFyY2gnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaFNlYXJjaChtZXRob2QsIGlucHV0KTtcbiAgICB9XG5cbiAgICAvLyBOT1RFOiBVbmlmaWVkU2VhcmNoIG9wZXJhdGlvbnMgKElzc3VlICMyNDMpIGFyZSBub3cgc2NoZW1hLWRyaXZlblxuICAgIC8vIHZpYSBTY2hlbWFEaXNwYXRjaGVyIHdpdGggdGhlICdzZWFyY2hQYXJhbXMnIG5vcm1hbGl6ZXIuXG4gICAgLy8gU2VlIFBPUlRGT0xJT19PUEVSQVRJT05TLnNlYXJjaCBpbiBPcGVyYXRpb25TY2hlbWEudHNcblxuICAgIC8vIEludHJvc3BlY3Rpb24gb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdJbnRyb3NwZWN0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hJbnRyb3NwZWN0aW9uKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0aW9uIG9wZXJhdGlvbnMgKElzc3VlICMyNDEpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0NvbGxlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaENvbGxlY3Rpb24obWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIFBvcnRmb2xpbyBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdQb3J0Zm9saW8nKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaFBvcnRmb2xpbyhtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQXV0aCBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdBdXRoJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hBdXRoKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBDb25maWcgb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnQ29uZmlnJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hDb25maWcobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEVuaGFuY2VkSW5kZXggb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnRW5oYW5jZWRJbmRleCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRW5oYW5jZWRJbmRleChtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gUGVyc29uYSBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdQZXJzb25hJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hQZXJzb25hKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIG9wZXJhdGlvbnMgKElzc3VlICMyNDQgLSBDUlVERSlcbiAgICBpZiAobW9kdWxlID09PSAnRXhlY3V0ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoRXhlY3V0ZShtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gR2F0ZWtlZXBlciBvcGVyYXRpb25zIChJc3N1ZSAjNDUyIC0gY29uZmlybWF0aW9uIGZsb3cpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0dhdGVrZWVwZXInKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEdhdGVrZWVwZXIobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIExvZ2dpbmcgb3BlcmF0aW9ucyAoSXNzdWUgIzUyOCAtIENSVURFIG1pZ3JhdGlvbilcbiAgICBpZiAobW9kdWxlID09PSAnTG9nZ2luZycpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoTG9nZ2luZyhtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gTWV0cmljcyBvcGVyYXRpb25zIChDUlVERS1yb3V0ZWQgcXVlcnlfbWV0cmljcylcbiAgICBpZiAobW9kdWxlID09PSAnTWV0cmljcycpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoTWV0cmljcyhtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gQnJvd3NlciBvcGVyYXRpb25zIChJc3N1ZSAjNzc0OiBvcGVuIHBvcnRmb2xpbyBicm93c2VyKVxuICAgIGlmIChtb2R1bGUgPT09ICdCcm93c2VyJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hCcm93c2VyKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gaGFuZGxlciBtb2R1bGU6ICR7bW9kdWxlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEVsZW1lbnRDUlVEIG9wZXJhdGlvbnMgdG8gRWxlbWVudENSVURIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoRWxlbWVudENSVUQoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgaW5wdXQ6IE9wZXJhdGlvbklucHV0XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHsgZWxlbWVudFR5cGUsIHBhcmFtcyB9ID0gaW5wdXQ7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQ7XG4gICAgY29uc3QgcCA9IHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdjcmVhdGUnOiB7XG4gICAgICAgIC8vIElzc3VlICMyNzg6IEZvciBlbnNlbWJsZXMsIG1lcmdlIHRvcC1sZXZlbCBlbGVtZW50cyBpbnRvIG1ldGFkYXRhXG4gICAgICAgIC8vIExMTXMgb2Z0ZW4gcGFzcyBlbGVtZW50cyBhdCBwYXJhbXMgbGV2ZWwsIG5vdCBpbnNpZGUgbWV0YWRhdGFcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRUeXBlID0gZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpO1xuICAgICAgICBsZXQgbWV0YWRhdGEgPSBwLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBlbnNlbWJsZSB0eXBlIChoYW5kbGVzIGJvdGggcGx1cmFsIGNvbnN0YW50IGFuZCBzaW5ndWxhciBmb3JtKVxuICAgICAgICBjb25zdCBpc0Vuc2VtYmxlID0gcmVzb2x2ZWRUeXBlID09PSBFbGVtZW50VHlwZS5FTlNFTUJMRSB8fCByZXNvbHZlZFR5cGUgPT09ICdlbnNlbWJsZSc7XG4gICAgICAgIGlmIChpc0Vuc2VtYmxlKSB7XG4gICAgICAgICAgLy8gSXNzdWUgIzM2NTogUmVjb2duaXplIGNvbW1vbiBzeW5vbnltcyBmb3IgJ2VsZW1lbnRzJyAobWVtYmVycywgY29tcG9uZW50cywgaXRlbXMpXG4gICAgICAgICAgY29uc3Qgc3lub255bXMgPSBbJ21lbWJlcnMnLCAnY29tcG9uZW50cycsICdpdGVtcyddIGFzIGNvbnN0O1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRzU291cmNlID0gcC5lbGVtZW50cyB8fCBzeW5vbnltcy5yZWR1Y2U8dW5rbm93bj4oXG4gICAgICAgICAgICAoZm91bmQsIHN5bikgPT4gZm91bmQgfHwgcFtzeW5dLCB1bmRlZmluZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChlbGVtZW50c1NvdXJjZSAmJiAoIW1ldGFkYXRhIHx8ICFtZXRhZGF0YS5lbGVtZW50cykpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhID0geyAuLi5tZXRhZGF0YSwgZWxlbWVudHM6IGVsZW1lbnRzU291cmNlIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzYwMjogJ2luc3RydWN0aW9ucycgaXMgbm8gbG9uZ2VyIGFuIEFQSSBmaWVsZC4gVXNlICdjb250ZW50JyBmb3IgYWxsIHR5cGVzLlxuICAgICAgICAvLyBJZiBhbiBMTE0gc2VuZHMgJ2luc3RydWN0aW9ucycsIHBhc3MgaXQgdGhyb3VnaCBzbyBjcmVhdGVFbGVtZW50IGNhbiByZWplY3Qgd2l0aCBndWlkYW5jZS5cbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuY3JlYXRlRWxlbWVudCh7XG4gICAgICAgICAgbmFtZTogcC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICB0eXBlOiByZXNvbHZlZFR5cGUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24gYXMgc3RyaW5nLFxuICAgICAgICAgIGNvbnRlbnQ6IHAuY29udGVudCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBwLmluc3RydWN0aW9ucyBhcyBzdHJpbmcgfCB1bmRlZmluZWQsICAvLyBSZWplY3RlZCB3aXRoIGd1aWRhbmNlIGluIGNyZWF0ZUVsZW1lbnRcbiAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2xpc3QnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5saXN0RWxlbWVudHMoXG4gICAgICAgICAgZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIHAgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgKTtcblxuICAgICAgY2FzZSAnZ2V0JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0RWxlbWVudERldGFpbHMoXG4gICAgICAgICAgcC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZylcbiAgICAgICAgKTtcblxuICAgICAgLy8gSXNzdWUgIzczODogQ3VycmVudGx5IHNoYXJlcyBjb2RlIHBhdGggd2l0aCAnZ2V0Jy4gRnV0dXJlIGRpdmVyZ2VuY2UgcG9pbnQg4oCUXG4gICAgICAvLyAnZ2V0RGV0YWlscycgd2lsbCByZXR1cm4gZXh0ZW5kZWQgbWV0YWRhdGEgKHJlbGF0aW9uc2hpcCBncmFwaCwgc3RhY2sgbWVtYmVyc2hpcCxcbiAgICAgIC8vIHBvbGljeSByZXNvbHV0aW9uLCBhY3RpdmF0aW9uIHN0YXRlLCByZXZlcnNlIGRlcGVuZGVuY2llcykuXG4gICAgICBjYXNlICdnZXREZXRhaWxzJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0RWxlbWVudERldGFpbHMoXG4gICAgICAgICAgcC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZylcbiAgICAgICAgKTtcblxuICAgICAgY2FzZSAnZWRpdCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmVkaXRFbGVtZW50KHtcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBpbnB1dDogcC5pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ3ZhbGlkYXRlJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIudmFsaWRhdGVFbGVtZW50KHtcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBzdHJpY3Q6IHAuc3RyaWN0IGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5kZWxldGVFbGVtZW50KHtcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICBkZWxldGVEYXRhOiBwLmRlbGV0ZURhdGEgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2ltcG9ydCc6XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUltcG9ydEVsZW1lbnQocCk7XG5cbiAgICAgIGNhc2UgJ2V4cG9ydCc6XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUV4cG9ydEVsZW1lbnQoXG4gICAgICAgICAgcC5uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZyksXG4gICAgICAgICAgKHAuZm9ybWF0IGFzICdqc29uJyB8ICd5YW1sJykgfHwgJ2pzb24nXG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBFbGVtZW50Q1JVRCBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgZWxlbWVudCBpbXBvcnQgb3BlcmF0aW9uLlxuICAgKiBQYXJzZXMgZXhwb3J0IHBhY2thZ2UsIGRlc2VyaWFsaXplcyBlbGVtZW50IGRhdGEsIGFuZCBjcmVhdGVzIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3BlcmF0aW9uIHBhcmFtZXRlcnMgY29udGFpbmluZyBkYXRhIGFuZCBvcHRpb25hbCBvdmVyd3JpdGUgZmxhZ1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBjcmVhdGVkIGVsZW1lbnRcbiAgICogQHRocm93cyBFcnJvciBpZiBleHBvcnQgcGFja2FnZSBpcyBpbnZhbGlkIG9yIGVsZW1lbnQgYWxyZWFkeSBleGlzdHMgKHdoZW4gb3ZlcndyaXRlIGlzIGZhbHNlKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbXBvcnRFbGVtZW50KHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRDtcblxuICAgIC8vIFBhcnNlIGV4cG9ydCBwYWNrYWdlIChjYW4gYmUgc3RyaW5nIG9yIGFscmVhZHktcGFyc2VkIG9iamVjdClcbiAgICBsZXQgZXhwb3J0UGFja2FnZTogRXhwb3J0UGFja2FnZTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhwb3J0UGFja2FnZSA9IEpTT04ucGFyc2UocGFyYW1zLmRhdGEpIGFzIEV4cG9ydFBhY2thZ2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZXhwb3J0IHBhY2thZ2U6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtcy5kYXRhID09PSAnb2JqZWN0JyAmJiBwYXJhbXMuZGF0YSAhPT0gbnVsbCkge1xuICAgICAgZXhwb3J0UGFja2FnZSA9IHBhcmFtcy5kYXRhIGFzIEV4cG9ydFBhY2thZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBleHBvcnQgcGFja2FnZTogZGF0YSBwYXJhbWV0ZXIgbXVzdCBiZSBhIHN0cmluZyBvciBvYmplY3QnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBleHBvcnQgcGFja2FnZSBzdHJ1Y3R1cmUgd2l0aCBkZXRhaWxlZCBtaXNzaW5nIGZpZWxkIHJlcG9ydGluZ1xuICAgIGNvbnN0IHJlcXVpcmVkRmllbGRzID0gWydleHBvcnRWZXJzaW9uJywgJ2VsZW1lbnRUeXBlJywgJ2Zvcm1hdCcsICdkYXRhJ10gYXMgY29uc3Q7XG4gICAgY29uc3QgbWlzc2luZ0ZpZWxkcyA9IHJlcXVpcmVkRmllbGRzLmZpbHRlcihcbiAgICAgIChmaWVsZCkgPT4gIWV4cG9ydFBhY2thZ2VbZmllbGQgYXMga2V5b2YgRXhwb3J0UGFja2FnZV1cbiAgICApO1xuICAgIGlmIChtaXNzaW5nRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBleHBvcnQgcGFja2FnZTogbWlzc2luZyBmaWVsZHM6ICR7bWlzc2luZ0ZpZWxkcy5qb2luKCcsICcpfWApO1xuICAgIH1cblxuICAgIC8vIERlc2VyaWFsaXplIGVsZW1lbnQgZGF0YSBiYXNlZCBvbiBmb3JtYXRcbiAgICBsZXQgZWxlbWVudERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHRyeSB7XG4gICAgICBpZiAoZXhwb3J0UGFja2FnZS5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBlbGVtZW50RGF0YSA9IEpTT04ucGFyc2UoZXhwb3J0UGFja2FnZS5kYXRhKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIH0gZWxzZSBpZiAoZXhwb3J0UGFja2FnZS5mb3JtYXQgPT09ICd5YW1sJykge1xuICAgICAgICAvLyBTRUNVUklUWTogVXNlIEpTT05fU0NIRU1BIGZvciBwdXJlIFlBTUwgcGFyc2luZyAocHJldmVudHMgY29kZSBleGVjdXRpb24pXG4gICAgICAgIC8vIEpTT05fU0NIRU1BID0gRkFJTFNBRkUgKyBib29sL2ludC9mbG9hdC9udWxsIChzYWZlciB0aGFuIERFRkFVTFQgd2hpY2ggYWRkcyB0aW1lc3RhbXBzKVxuICAgICAgICBjb25zdCBwYXJzZWQgPSB5YW1sLmxvYWQoZXhwb3J0UGFja2FnZS5kYXRhLCB7IHNjaGVtYTogeWFtbC5KU09OX1NDSEVNQSB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWQgIT09ICdvYmplY3QnIHx8IHBhcnNlZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBZQU1MIGRhdGE6IGV4cGVjdGVkIG9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnREYXRhID0gcGFyc2VkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBmb3JtYXQ6ICR7ZXhwb3J0UGFja2FnZS5mb3JtYXR9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlc2VyaWFsaXplIGVsZW1lbnQgZGF0YTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCBlbGVtZW50IGZpZWxkc1xuICAgIGNvbnN0IG5hbWUgPSBlbGVtZW50RGF0YS5uYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGVsZW1lbnREYXRhLmRlc2NyaXB0aW9uIGFzIHN0cmluZztcbiAgICBjb25zdCBjb250ZW50ID0gZWxlbWVudERhdGEuY29udGVudCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBlbGVtZW50RGF0YS5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAgIGlmICghbmFtZSB8fCAhZGVzY3JpcHRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbGVtZW50IGRhdGE6IG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzIChuYW1lLCBkZXNjcmlwdGlvbiknKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBvdmVyd3JpdGUgaXMgYWxsb3dlZFxuICAgIGNvbnN0IG92ZXJ3cml0ZSA9IHBhcmFtcy5vdmVyd3JpdGUgPT09IHRydWU7XG5cbiAgICAvLyBJZiBub3Qgb3ZlcndyaXRpbmcsIGNoZWNrIGlmIGVsZW1lbnQgZXhpc3RzXG4gICAgaWYgKCFvdmVyd3JpdGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZXIuZ2V0RWxlbWVudERldGFpbHMobmFtZSwgZXhwb3J0UGFja2FnZS5lbGVtZW50VHlwZSk7XG4gICAgICAgIC8vIElmIHdlIHJlYWNoIGhlcmUsIGVsZW1lbnQgZXhpc3RzXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBhbHJlYWR5IGV4aXN0czogJHtuYW1lfS4gVXNlIG92ZXJ3cml0ZTp0cnVlIHRvIHJlcGxhY2UgaXQuYCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBFbGVtZW50IGRvZXNuJ3QgZXhpc3QsIG9yIGVycm9yIGdldHRpbmcgZGV0YWlscyAtIHByb2NlZWQgd2l0aCBjcmVhdGlvblxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdhbHJlYWR5IGV4aXN0cycpKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7IC8vIFJlLXRocm93IG91ciBvd24gXCJhbHJlYWR5IGV4aXN0c1wiIGVycm9yXG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBlbGVtZW50IGRvZXNuJ3QgZXhpc3QgLSBjb250aW51ZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgZWxlbWVudCAod2lsbCBvdmVyd3JpdGUgaWYgaXQgZXhpc3RzKVxuICAgIHJldHVybiBoYW5kbGVyLmNyZWF0ZUVsZW1lbnQoe1xuICAgICAgbmFtZSxcbiAgICAgIHR5cGU6IGV4cG9ydFBhY2thZ2UuZWxlbWVudFR5cGUsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGNvbnRlbnQsXG4gICAgICBtZXRhZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBvcnQgYW4gZWxlbWVudCB0byBKU09OIG9yIFlBTUwgZm9ybWF0XG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gRWxlbWVudCBuYW1lIHRvIGV4cG9ydFxuICAgKiBAcGFyYW0gdHlwZSAtIEVsZW1lbnQgdHlwZSAocGVyc29uYSwgc2tpbGwsIHRlbXBsYXRlLCBhZ2VudCwgbWVtb3J5LCBlbnNlbWJsZSlcbiAgICogQHBhcmFtIGZvcm1hdCAtIEV4cG9ydCBmb3JtYXQ6ICdqc29uJyBvciAneWFtbCcgKGRlZmF1bHQ6ICdqc29uJylcbiAgICogQHJldHVybnMgRXhwb3J0UGFja2FnZSB3aXRoIHNlcmlhbGl6ZWQgZWxlbWVudCBkYXRhXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUV4cG9ydEVsZW1lbnQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHR5cGU6IHN0cmluZyxcbiAgICBmb3JtYXQ6ICdqc29uJyB8ICd5YW1sJyA9ICdqc29uJ1xuICApOiBQcm9taXNlPEV4cG9ydFBhY2thZ2U+IHtcbiAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBwYXJhbWV0ZXJzXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cG9ydCBvcGVyYXRpb24gcmVxdWlyZXMgbmFtZSBwYXJhbWV0ZXInKTtcbiAgICB9XG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cG9ydCBvcGVyYXRpb24gcmVxdWlyZXMgdHlwZSBwYXJhbWV0ZXIgKHZpYSBlbGVtZW50VHlwZSBvciBwYXJhbXMudHlwZSknKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZWxlbWVudCBkZXRhaWxzIHVzaW5nIGV4aXN0aW5nIGhhbmRsZXJcbiAgICBjb25zdCBlbGVtZW50RGV0YWlscyA9IGF3YWl0IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQuZ2V0RWxlbWVudERldGFpbHMobmFtZSwgdHlwZSk7XG5cbiAgICAvLyBCdWlsZCBleHBvcnQgcGFja2FnZVxuICAgIGNvbnN0IGV4cG9ydFBhY2thZ2U6IEV4cG9ydFBhY2thZ2UgPSB7XG4gICAgICBleHBvcnRWZXJzaW9uOiAnMS4wJyxcbiAgICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGVsZW1lbnRUeXBlOiB0eXBlLFxuICAgICAgZWxlbWVudE5hbWU6IG5hbWUsXG4gICAgICBmb3JtYXQsXG4gICAgICBkYXRhOiAnJyxcbiAgICB9O1xuXG4gICAgLy8gU2VyaWFsaXplIHRvIHJlcXVlc3RlZCBmb3JtYXRcbiAgICBpZiAoZm9ybWF0ID09PSAneWFtbCcpIHtcbiAgICAgIGV4cG9ydFBhY2thZ2UuZGF0YSA9IHlhbWwuZHVtcChlbGVtZW50RGV0YWlscywge1xuICAgICAgICBpbmRlbnQ6IDIsXG4gICAgICAgIGxpbmVXaWR0aDogMTIwLFxuICAgICAgICBub1JlZnM6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwb3J0UGFja2FnZS5kYXRhID0gSlNPTi5zdHJpbmdpZnkoZWxlbWVudERldGFpbHMsIG51bGwsIDIpO1xuICAgIH1cblxuICAgIHJldHVybiBleHBvcnRQYWNrYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIE1lbW9yeSBvcGVyYXRpb25zIHRvIE1lbW9yeU1hbmFnZXJcbiAgICpcbiAgICogTWVtb3J5IG9wZXJhdGlvbnMgd29yayBvbiBpbmRpdmlkdWFsIE1lbW9yeSBpbnN0YW5jZXM6XG4gICAqIDEuIEdldCB0aGUgTWVtb3J5IGJ5IG5hbWUgZnJvbSBNZW1vcnlNYW5hZ2VyXG4gICAqIDIuIENhbGwgdGhlIG9wZXJhdGlvbiBvbiB0aGUgTWVtb3J5IGluc3RhbmNlXG4gICAqL1xuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNjU2OiBEZWJvdW5jZSBtZW1vcnkgc2F2ZXMgdG8gcHJldmVudCBmaWxlIGRlc2NyaXB0b3IgZXhoYXVzdGlvbi5cbiAgICogQ29hbGVzY2VzIHJhcGlkIGFkZEVudHJ5IGNhbGxzIOKAlCBvbmx5IHdyaXRlcyB0aGUgbGF0ZXN0IHN0YXRlIGFmdGVyIHRoZSB3aW5kb3cgZXhwaXJlcy5cbiAgICovXG4gIHByaXZhdGUgZGVib3VuY2VkTWVtb3J5U2F2ZShcbiAgICBtZW1vcnlOYW1lOiBzdHJpbmcsXG4gICAgbWVtb3J5OiBpbXBvcnQoJy4uLy4uL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS5qcycpLk1lbW9yeSxcbiAgICBtYW5hZ2VyOiBNZW1vcnlNYW5hZ2VyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBtZW1vcnlOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnBlbmRpbmdTYXZlcy5nZXQoa2V5KTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGNsZWFyVGltZW91dChleGlzdGluZy50aW1lcik7XG4gICAgICB0aGlzLmRlYm91bmNlTWV0cmljcy5jb2FsZXNjZWQrKztcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW01DUEFRTEhhbmRsZXJdIENvYWxlc2NlZCBzYXZlIGZvciBtZW1vcnkgJyR7bWVtb3J5TmFtZX0nIChwZW5kaW5nOiAke3RoaXMucGVuZGluZ1NhdmVzLnNpemV9LCBjb2FsZXNjZWQ6ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3MuY29hbGVzY2VkfSwgd3JpdHRlbjogJHt0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVufSlgKTtcbiAgICB9XG4gICAgY29uc3QgZGVib3VuY2VNcyA9IFNUT1JBR0VfTEFZRVJfQ09ORklHLk1FTU9SWV9TQVZFX0RFQk9VTkNFX01TO1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdTYXZlcy5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuZGVib3VuY2VNZXRyaWNzLndyaXR0ZW4rKztcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW01DUEFRTEhhbmRsZXJdIEZsdXNoaW5nIGRlYm91bmNlZCBzYXZlIGZvciBtZW1vcnkgJyR7bWVtb3J5TmFtZX0nIChjb2FsZXNjZWQ6ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3MuY29hbGVzY2VkfSwgd3JpdHRlbjogJHt0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVufSlgKTtcbiAgICAgIG1hbmFnZXIuc2F2ZShtZW1vcnkpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbTUNQQVFMSGFuZGxlcl0gRGVib3VuY2VkIHNhdmUgZmFpbGVkIGZvciBtZW1vcnkgJyR7bWVtb3J5TmFtZX0nIChwZW5kaW5nOiAke3RoaXMucGVuZGluZ1NhdmVzLnNpemV9LCBjb2FsZXNjZWQ6ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3MuY29hbGVzY2VkfSwgd3JpdHRlbjogJHt0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVufSk6ICR7ZXJyfWApO1xuICAgICAgfSk7XG4gICAgfSwgZGVib3VuY2VNcyk7XG4gICAgLy8gRW5zdXJlIHRpbWVyIGRvZXNuJ3Qga2VlcCBOb2RlIHByb2Nlc3MgYWxpdmUgKGltcG9ydGFudCBmb3IgdGVzdHMvc2h1dGRvd24pXG4gICAgaWYgKHR5cGVvZiB0aW1lciA9PT0gJ29iamVjdCcgJiYgJ3VucmVmJyBpbiB0aW1lcikge1xuICAgICAgdGltZXIudW5yZWYoKTtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nU2F2ZXMuc2V0KGtleSwgeyB0aW1lciwgbWVtb3J5LCBtYW5hZ2VyIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM2NTc6IFRyYWNrIGFkZEVudHJ5IGNhbGwgZnJlcXVlbmN5IHBlciBtZW1vcnkgYW5kIGxvZyB3YXJuaW5ncyBhdCB0aHJlc2hvbGRzLlxuICAgKlxuICAgKiBVc2VzIGEgc2xpZGluZyB3aW5kb3cgY291bnRlciB0byBkZXRlY3QgcnVuYXdheSBzYXZlIGxvb3BzIGJlZm9yZSB0aGV5IGV4aGF1c3QgcmVzb3VyY2VzLlxuICAgKiBDb3VudGVycyBhcmUgYm91bmRlZDogbWF4IDUwMCB0cmFja2VkIG1lbW9yaWVzLCBvbGRlc3QtZmlyc3QgZXZpY3Rpb24gd2hlbiBleGNlZWRlZC5cbiAgICogV2FybmluZy9jcml0aWNhbCBmbGFncyBhdXRvLXJlc2V0IHdoZW4gZnJlcXVlbmN5IGRyb3BzIGJlbG93IHRocmVzaG9sZHMuXG4gICAqXG4gICAqIEBwYXJhbSBtZW1vcnlOYW1lIC0gTmFtZSBvZiB0aGUgbWVtb3J5IGJlaW5nIHdyaXR0ZW4gdG9cbiAgICovXG4gIHByaXZhdGUgdHJhY2tTYXZlRnJlcXVlbmN5KG1lbW9yeU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG1lbW9yeU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHdpbmRvd01zID0gU1RPUkFHRV9MQVlFUl9DT05GSUcuTUVNT1JZX1NBVkVfTU9OSVRPUl9XSU5ET1dfTVM7XG4gICAgY29uc3Qgd2FyblRocmVzaG9sZCA9IFNUT1JBR0VfTEFZRVJfQ09ORklHLk1FTU9SWV9TQVZFX0ZSRVFVRU5DWV9XQVJOX1RIUkVTSE9MRDtcbiAgICBjb25zdCBjcml0aWNhbFRocmVzaG9sZCA9IFNUT1JBR0VfTEFZRVJfQ09ORklHLk1FTU9SWV9TQVZFX0ZSRVFVRU5DWV9DUklUSUNBTF9USFJFU0hPTEQ7XG5cbiAgICBsZXQgY291bnRlciA9IHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLmdldChrZXkpO1xuICAgIGlmICghY291bnRlcikge1xuICAgICAgLy8gRXZpY3Qgb2xkZXN0IGVudHJ5IGlmIG1hcCBleGNlZWRzIHNpemUgbGltaXQgKHByZXZlbnRzIHVuYm91bmRlZCBncm93dGgpXG4gICAgICBpZiAodGhpcy5zYXZlRnJlcXVlbmN5Q291bnRlcnMuc2l6ZSA+PSA1MDApIHtcbiAgICAgICAgY29uc3Qgb2xkZXN0S2V5ID0gdGhpcy5zYXZlRnJlcXVlbmN5Q291bnRlcnMua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgaWYgKG9sZGVzdEtleSkgdGhpcy5zYXZlRnJlcXVlbmN5Q291bnRlcnMuZGVsZXRlKG9sZGVzdEtleSk7XG4gICAgICB9XG4gICAgICBjb3VudGVyID0geyB0aW1lc3RhbXBzOiBbXSwgd2FybmVkOiBmYWxzZSwgY3JpdGljYWw6IGZhbHNlIH07XG4gICAgICB0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5zZXQoa2V5LCBjb3VudGVyKTtcbiAgICB9XG5cbiAgICAvLyBQcnVuZSB0aW1lc3RhbXBzIG91dHNpZGUgdGhlIHdpbmRvd1xuICAgIGNvbnN0IGN1dG9mZiA9IG5vdyAtIHdpbmRvd01zO1xuICAgIGNvdW50ZXIudGltZXN0YW1wcyA9IGNvdW50ZXIudGltZXN0YW1wcy5maWx0ZXIodCA9PiB0ID4gY3V0b2ZmKTtcbiAgICBjb3VudGVyLnRpbWVzdGFtcHMucHVzaChub3cpO1xuXG4gICAgY29uc3QgY291bnQgPSBjb3VudGVyLnRpbWVzdGFtcHMubGVuZ3RoO1xuXG4gICAgaWYgKGNvdW50ID49IGNyaXRpY2FsVGhyZXNob2xkICYmICFjb3VudGVyLmNyaXRpY2FsKSB7XG4gICAgICBjb3VudGVyLmNyaXRpY2FsID0gdHJ1ZTtcbiAgICAgIGxvZ2dlci5lcnJvcignW01DUEFRTEhhbmRsZXJdIFNhdmUgZnJlcXVlbmN5IGNyaXRpY2FsIHRocmVzaG9sZCBleGNlZWRlZCcsIHtcbiAgICAgICAgbWVtb3J5TmFtZSxcbiAgICAgICAgY291bnQsXG4gICAgICAgIHRocmVzaG9sZDogY3JpdGljYWxUaHJlc2hvbGQsXG4gICAgICAgIHdpbmRvd1NlY29uZHM6IHdpbmRvd01zIC8gMTAwMCxcbiAgICAgICAgdHJhY2tlZE1lbW9yaWVzOiB0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5zaXplLFxuICAgICAgfSk7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdSQVRFX0xJTUlUX0VYQ0VFREVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci50cmFja1NhdmVGcmVxdWVuY3knLFxuICAgICAgICBkZXRhaWxzOiBgTWVtb3J5ICcke21lbW9yeU5hbWV9JyBleGNlZWRzIGNyaXRpY2FsIHNhdmUgZnJlcXVlbmN5OiAke2NvdW50fSBjYWxscyBpbiAke3dpbmRvd01zIC8gMTAwMH1zYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgbWVtb3J5TmFtZSwgY291bnQsIHRocmVzaG9sZDogY3JpdGljYWxUaHJlc2hvbGQsIHdpbmRvd01zIH0sXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGNvdW50ID49IHdhcm5UaHJlc2hvbGQgJiYgIWNvdW50ZXIud2FybmVkKSB7XG4gICAgICBjb3VudGVyLndhcm5lZCA9IHRydWU7XG4gICAgICBsb2dnZXIud2FybignW01DUEFRTEhhbmRsZXJdIFNhdmUgZnJlcXVlbmN5IHdhcm4gdGhyZXNob2xkIGV4Y2VlZGVkJywge1xuICAgICAgICBtZW1vcnlOYW1lLFxuICAgICAgICBjb3VudCxcbiAgICAgICAgdGhyZXNob2xkOiB3YXJuVGhyZXNob2xkLFxuICAgICAgICB3aW5kb3dTZWNvbmRzOiB3aW5kb3dNcyAvIDEwMDAsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCB3YXJuaW5nIGZsYWdzIHdoZW4gY291bnQgZHJvcHMgYmFjayBiZWxvdyB0aHJlc2hvbGRzXG4gICAgaWYgKGNvdW50IDwgd2FyblRocmVzaG9sZCkge1xuICAgICAgY291bnRlci53YXJuZWQgPSBmYWxzZTtcbiAgICAgIGNvdW50ZXIuY3JpdGljYWwgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY1NjogRmx1c2ggYWxsIHBlbmRpbmcgZGVib3VuY2VkIHNhdmVzIG9uIHNodXRkb3duLlxuICAgKiBDYWxsZWQgYnkgREkgY29udGFpbmVyIGRpc3Bvc2UgY2hhaW4gdG8gZW5zdXJlIG5vIGRhdGEgaXMgbG9zdC5cbiAgICovXG4gIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5mbHVzaFBlbmRpbmdTYXZlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlICM2NTY6IEZsdXNoIGFsbCBwZW5kaW5nIGRlYm91bmNlZCBzYXZlcyBpbW1lZGlhdGVseS5cbiAgICovXG4gIGFzeW5jIGZsdXNoUGVuZGluZ1NhdmVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBlbmRpbmcgPSBbLi4udGhpcy5wZW5kaW5nU2F2ZXMuZW50cmllcygpXTtcbiAgICB0aGlzLnBlbmRpbmdTYXZlcy5jbGVhcigpO1xuICAgIGlmIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBbTUNQQVFMSGFuZGxlcl0gRmx1c2hpbmcgJHtwZW5kaW5nLmxlbmd0aH0gcGVuZGluZyBtZW1vcnkgc2F2ZShzKSBvbiBzaHV0ZG93biAodG90YWwgY29hbGVzY2VkOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLmNvYWxlc2NlZH0sIHRvdGFsIHdyaXR0ZW46ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3Mud3JpdHRlbn0pYCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2tleSwgeyB0aW1lciwgbWVtb3J5LCBtYW5hZ2VyIH1dIG9mIHBlbmRpbmcpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBtYW5hZ2VyLnNhdmUobWVtb3J5KTtcbiAgICAgICAgdGhpcy5kZWJvdW5jZU1ldHJpY3Mud3JpdHRlbisrO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5Q291bnQgPSB0eXBlb2YgbWVtb3J5LmdldEVudHJpZXMgPT09ICdmdW5jdGlvbicgPyBtZW1vcnkuZ2V0RW50cmllcygpLnNpemUgOiAndW5rbm93bic7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgW01DUEFRTEhhbmRsZXJdIEZsdXNoIHNhdmUgZmFpbGVkIGZvciBtZW1vcnkgJyR7a2V5fScgKGVudHJpZXM6ICR7ZW50cnlDb3VudH0sIHBlbmRpbmcgcmVtYWluaW5nOiAke3BlbmRpbmcubGVuZ3RofSk6ICR7ZXJyfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hNZW1vcnkoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5oYW5kbGVycy5tZW1vcnlNYW5hZ2VyO1xuICAgIC8vIElzc3VlICMyOTA6IFVzZSBlbGVtZW50X25hbWUgcGFyYW1ldGVyXG4gICAgLy8gSXNzdWUgIzMyMzogVXNlIHNoYXJlZCB2YWxpZGF0aW9uIHV0aWxpdHlcbiAgICBjb25zdCBtZW1vcnlOYW1lID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgIHBhcmFtcyxcbiAgICAgICdlbGVtZW50X25hbWUnLFxuICAgICAgJ3RoZSBuYW1lIG9mIHRoZSBtZW1vcnkgdG8gb3BlcmF0ZSBvbidcbiAgICApO1xuXG4gICAgLy8gR2V0IHRoZSBtZW1vcnkgaW5zdGFuY2UgYnkgbmFtZSB1c2luZyBmaW5kKClcbiAgICAvLyBNZW1vcnkgbmFtZSBpcyBzdG9yZWQgaW4gbWV0YWRhdGEubmFtZVxuICAgIGNvbnN0IG1lbW9yeSA9IGF3YWl0IG1hbmFnZXIuZmluZChtID0+IG0ubWV0YWRhdGEubmFtZSA9PT0gbWVtb3J5TmFtZSk7XG4gICAgaWYgKCFtZW1vcnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWVtb3J5ICcke21lbW9yeU5hbWV9JyBub3QgZm91bmQuIFVzZSBsaXN0X2VsZW1lbnRzIHRvIHNlZSBhdmFpbGFibGUgbWVtb3JpZXMuYCk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2FkZEVudHJ5Jzoge1xuICAgICAgICAvLyBGaXggIzM4NzogQWNjZXB0ICdlbnRyeScgYXMgYWxpYXMgZm9yICdjb250ZW50J1xuICAgICAgICBpZiAocGFyYW1zLmVudHJ5ICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zLmNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBhcmFtcy5jb250ZW50ID0gcGFyYW1zLmVudHJ5O1xuICAgICAgICB9XG4gICAgICAgIC8vIE1lbW9yeS5hZGRFbnRyeShjb250ZW50LCB0YWdzPywgbWV0YWRhdGE/KVxuICAgICAgICAvLyBGaXggIzM4NyBPcHRpb24gRDogQ29udGV4dHVhbCBlcnJvciBtZXNzYWdlIGd1aWRpbmcgdG93YXJkIGNvcnJlY3QgcGFyYW1ldGVyXG4gICAgICAgIGlmIChwYXJhbXMuY29udGVudCA9PT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5jb250ZW50ID09PSBudWxsIHx8IHR5cGVvZiBwYXJhbXMuY29udGVudCAhPT0gJ3N0cmluZycgfHwgKHBhcmFtcy5jb250ZW50IGFzIHN0cmluZykudHJpbSgpID09PSAnJykge1xuICAgICAgICAgIGNvbnN0IGhpbnQgPSBwYXJhbXMuZW50cnkgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBgWW91IHBhc3NlZCAnZW50cnknLCBidXQgYW4gZW50cnkgaXMgdGhlIGZ1bGwgb2JqZWN0IChjb250ZW50ICsgdGFncyArIG1ldGFkYXRhICsgdGltZXN0YW1wKS4gYCArXG4gICAgICAgICAgICAgIGBVc2UgJ2NvbnRlbnQnIHRvIHByb3ZpZGUgdGhlIHRleHQgcG9ydGlvbiBvZiB0aGUgZW50cnkuYFxuICAgICAgICAgICAgOiBgVGhlICdjb250ZW50JyBwYXJhbWV0ZXIgaXMgdGhlIHRleHQgcG9ydGlvbiBvZiB0aGUgbWVtb3J5IGVudHJ5LmA7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICdjb250ZW50Jy4gJHtoaW50fSBgICtcbiAgICAgICAgICAgIGBFeGFtcGxlOiB7IG9wZXJhdGlvbjogXCJhZGRFbnRyeVwiLCBwYXJhbXM6IHsgZWxlbWVudF9uYW1lOiBcIiR7bWVtb3J5TmFtZX1cIiwgY29udGVudDogXCJ5b3VyIHRleHQgaGVyZVwiLCB0YWdzOiBbXCJvcHRpb25hbFwiXSB9IH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250ZW50ID0gcGFyYW1zLmNvbnRlbnQgYXMgc3RyaW5nO1xuICAgICAgICBjb25zdCB0YWdzID0gcGFyYW1zLnRhZ3MgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyYW1zLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBlbnRyeVJlc3VsdCA9IG1lbW9yeS5hZGRFbnRyeShjb250ZW50LCB0YWdzLCBtZXRhZGF0YSk7XG4gICAgICAgIC8vIElzc3VlICM2NTc6IFRyYWNrIHNhdmUgZnJlcXVlbmN5IGFuZCBhbGVydCBvbiBhbm9tYWxvdXMgcGF0dGVybnMuXG4gICAgICAgIHRoaXMudHJhY2tTYXZlRnJlcXVlbmN5KG1lbW9yeU5hbWUpO1xuICAgICAgICAvLyBJc3N1ZSAjNjU2OiBEZWJvdW5jZSBzYXZlcyB0byBwcmV2ZW50IEZEIGV4aGF1c3Rpb24gZnJvbSByYXBpZCBhZGRFbnRyeSBjYWxscy5cbiAgICAgICAgLy8gVGhlIGVudHJ5IGlzIGFscmVhZHkgaW4gbWVtb3J5IOKAlCBkaXNrIHdyaXRlIGlzIGRlZmVycmVkIGFuZCBjb2FsZXNjZWQuXG4gICAgICAgIHRoaXMuZGVib3VuY2VkTWVtb3J5U2F2ZShtZW1vcnlOYW1lLCBtZW1vcnksIG1hbmFnZXIpO1xuICAgICAgICByZXR1cm4gZW50cnlSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2NsZWFyJzoge1xuICAgICAgICAvLyBNZW1vcnkuY2xlYXJBbGwoY29uZmlybSkgLSByZXF1aXJlcyBleHBsaWNpdCBjb25maXJtYXRpb25cbiAgICAgICAgY29uc3QgY2xlYXJSZXN1bHQgPSBtZW1vcnkuY2xlYXJBbGwodHJ1ZSk7XG4gICAgICAgIC8vIEZpeCAjNDM4OiBQZXJzaXN0IHRvIGRpc2sgc28gY2xlYXJlZCBzdGF0ZSBzdXJ2aXZlcyByZXN0YXJ0XG4gICAgICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShtZW1vcnkpO1xuICAgICAgICByZXR1cm4gY2xlYXJSZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBNZW1vcnkgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQWdlbnQgb3BlcmF0aW9ucyB0byBBZ2VudE1hbmFnZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hBZ2VudChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmhhbmRsZXJzLmFnZW50TWFuYWdlcjtcbiAgICAvLyBJc3N1ZSAjMjkwOiBVc2UgZWxlbWVudF9uYW1lIHBhcmFtZXRlclxuICAgIC8vIElzc3VlICMzMjM6IFZhbGlkYXRlIHBhcmFtZXRlciBiZWZvcmUgdXNlXG4gICAgY29uc3QgYWdlbnROYW1lID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgIHBhcmFtcyxcbiAgICAgICdlbGVtZW50X25hbWUnLFxuICAgICAgJ3RoZSBuYW1lIG9mIHRoZSBhZ2VudCB0byBleGVjdXRlJ1xuICAgICk7XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnZXhlY3V0ZSc6XG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmV4ZWN1dGVBZ2VudChcbiAgICAgICAgICBhZ2VudE5hbWUsXG4gICAgICAgICAgcGFyYW1zLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEFnZW50IG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIFRlbXBsYXRlIG9wZXJhdGlvbnMgdG8gVGVtcGxhdGVSZW5kZXJlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFRlbXBsYXRlKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgcmVuZGVyZXIgPSB0aGlzLmhhbmRsZXJzLnRlbXBsYXRlUmVuZGVyZXI7XG4gICAgLy8gSXNzdWUgIzI5MDogVXNlIGVsZW1lbnRfbmFtZSBwYXJhbWV0ZXJcbiAgICAvLyBJc3N1ZSAjMzIzOiBWYWxpZGF0ZSBwYXJhbWV0ZXIgYmVmb3JlIHVzZVxuICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICBwYXJhbXMsXG4gICAgICAnZWxlbWVudF9uYW1lJyxcbiAgICAgICd0aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgdG8gcmVuZGVyJ1xuICAgICk7XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAncmVuZGVyJzpcbiAgICAgICAgcmV0dXJuIHJlbmRlcmVyLnJlbmRlcihcbiAgICAgICAgICB0ZW1wbGF0ZU5hbWUsXG4gICAgICAgICAgcGFyYW1zLnZhcmlhYmxlcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgICBwYXJhbXMuc2VjdGlvbiBhcyAndGVtcGxhdGUnIHwgJ3N0eWxlJyB8ICdzY3JpcHQnIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHBhcmFtcy5hbGxfc2VjdGlvbnMgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZFxuICAgICAgICApO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gVGVtcGxhdGUgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQWN0aXZhdGlvbiBvcGVyYXRpb25zIChjcm9zcy1jdXR0aW5nIGNvbmNlcm4pXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQWN0aXZhdGlvbihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBpbnB1dDogT3BlcmF0aW9uSW5wdXRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgeyBlbGVtZW50VHlwZSwgcGFyYW1zIH0gPSBpbnB1dDtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRDtcbiAgICBjb25zdCBwID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgLy8gSXNzdWUgIzI5MDogVXNlIGVsZW1lbnRfbmFtZS9lbGVtZW50X3R5cGUgcGFyYW1ldGVyIG5hbWVzXG4gICAgLy8gSXNzdWUgIzMyMzogVmFsaWRhdGUgcGFyYW1ldGVycyBiZWZvcmUgdXNlXG4gICAgLy8gRm9yIGdldEFjdGl2ZSwgZWxlbWVudF9uYW1lIGlzIG5vdCByZXF1aXJlZFxuICAgIGlmIChtZXRob2QgIT09ICdnZXRBY3RpdmUnKSB7XG4gICAgICBjb25zdCBuYW1lID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgcCxcbiAgICAgICAgJ2VsZW1lbnRfbmFtZScsXG4gICAgICAgICd0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlJ1xuICAgICAgKTtcblxuICAgICAgLy8gZWxlbWVudF90eXBlIGNhbiBjb21lIGZyb20gaW5wdXQuZWxlbWVudFR5cGUgb3IgcGFyYW1zLmVsZW1lbnRfdHlwZVxuICAgICAgY29uc3QgdHlwZSA9IGVsZW1lbnRUeXBlIHx8IChwLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuICAgICAgaWYgKCF0eXBlIHx8IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJyB8fCB0eXBlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAnZWxlbWVudF90eXBlJy4gRXhwZWN0ZWQ6IHN0cmluZyAocGVyc29uYSwgc2tpbGwsIHRlbXBsYXRlLCBhZ2VudCwgbWVtb3J5LCBvciBlbnNlbWJsZSlgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICAgIGNhc2UgJ2FjdGl2YXRlJzpcbiAgICAgICAgICByZXR1cm4gaGFuZGxlci5hY3RpdmF0ZUVsZW1lbnQoXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIHAuY29udGV4dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZFxuICAgICAgICAgICk7XG5cbiAgICAgICAgY2FzZSAnZGVhY3RpdmF0ZSc6XG4gICAgICAgICAgcmV0dXJuIGhhbmRsZXIuZGVhY3RpdmF0ZUVsZW1lbnQobmFtZSwgdHlwZSk7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQWN0aXZhdGlvbiBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGdldEFjdGl2ZTogZWxlbWVudF90eXBlIGlzIG9wdGlvbmFsIC0gaWYgbm90IHByb3ZpZGVkLCByZXR1cm5zIGFsbCBhY3RpdmUgZWxlbWVudHNcbiAgICAvLyBJc3N1ZSAjNTAxOiBQYXNzIHR5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkIOKAlCBnZXRBY3RpdmVFbGVtZW50cyBoYW5kbGVzIGJvdGggY2FzZXNcbiAgICBjb25zdCB0eXBlID0gZWxlbWVudFR5cGUgfHwgKHAuZWxlbWVudF90eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIGhhbmRsZXIuZ2V0QWN0aXZlRWxlbWVudHModHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggU2VhcmNoIG9wZXJhdGlvbnMgdG8gRWxlbWVudFF1ZXJ5U2VydmljZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFNlYXJjaChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBpbnB1dDogT3BlcmF0aW9uSW5wdXRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgeyBlbGVtZW50VHlwZSwgcGFyYW1zIH0gPSBpbnB1dDtcbiAgICBjb25zdCBxdWVyeVNlcnZpY2UgPSB0aGlzLmhhbmRsZXJzLmVsZW1lbnRRdWVyeVNlcnZpY2U7XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnc2VhcmNoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlU2VhcmNoRWxlbWVudHMoaW5wdXQpO1xuXG4gICAgICBjYXNlICdxdWVyeSc6IHtcbiAgICAgICAgLy8gVmFsaWRhdGUgZWxlbWVudFR5cGUgaXMgcmVxdWlyZWQgZm9yIHF1ZXJ5XG4gICAgICAgIGlmICghZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VsZW1lbnRUeXBlIGlzIHJlcXVpcmVkIGZvciBxdWVyeV9lbGVtZW50cyBvcGVyYXRpb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCByYXcgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIChjYXN0IHRvIElFbGVtZW50W10gZm9yIHF1ZXJ5IHNlcnZpY2UpXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gKGF3YWl0IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQuZ2V0RWxlbWVudHMoZWxlbWVudFR5cGUpKSBhcyBJRWxlbWVudFtdO1xuXG4gICAgICAgIC8vIEJ1aWxkIFF1ZXJ5T3B0aW9ucyBmcm9tIHBhcmFtc1xuICAgICAgICBjb25zdCBwID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBjb25zdCBxdWVyeU9wdGlvbnM6IHtcbiAgICAgICAgICBmaWx0ZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgc29ydD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIHBhZ2luYXRpb24/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICBhZ2dyZWdhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgfSA9IHt9O1xuXG4gICAgICAgIGlmIChwLmZpbHRlcnMpIHtcbiAgICAgICAgICBxdWVyeU9wdGlvbnMuZmlsdGVycyA9IHAuZmlsdGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC5zb3J0KSB7XG4gICAgICAgICAgcXVlcnlPcHRpb25zLnNvcnQgPSBwLnNvcnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHAucGFnaW5hdGlvbikge1xuICAgICAgICAgIHF1ZXJ5T3B0aW9ucy5wYWdpbmF0aW9uID0gcC5wYWdpbmF0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGFnZ3JlZ2F0aW9uIHJlcXVlc3RzIChJc3N1ZSAjMzA5KSDigJQgZGVsZWdhdGVzIHRvIHNoYXJlZCBBZ2dyZWdhdGlvblNlcnZpY2VcbiAgICAgICAgaWYgKHAuYWdncmVnYXRlKSB7XG4gICAgICAgICAgY29uc3QgYWdncmVnYXRlID0gcC5hZ2dyZWdhdGUgYXMgeyBjb3VudD86IGJvb2xlYW47IGdyb3VwX2J5Pzogc3RyaW5nIH07XG5cbiAgICAgICAgICAvLyBWYWxpZGF0ZSBhZ2dyZWdhdGlvbiBvcHRpb25zXG4gICAgICAgICAgY29uc3QgYWdnRXJyb3IgPSB2YWxpZGF0ZUFnZ3JlZ2F0aW9uT3B0aW9ucyhhZ2dyZWdhdGUpO1xuICAgICAgICAgIGlmIChhZ2dFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGFnZ0Vycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYWdncmVnYXRlRWxlbWVudHMoXG4gICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgYWdncmVnYXRlLFxuICAgICAgICAgICAgcXVlcnlPcHRpb25zLmZpbHRlcnMgYXMgYW55XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzc3VlICM1MDA6IE5vcm1hbGl6ZSBmbGF0IHBhZ2luYXRpb24gcGFyYW1zIChwYWdlU2l6ZSwgcGFnZSwgbGltaXQsIG9mZnNldClcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGZsYXQgcGFyYW1zIGxpa2UgeyBwYWdlU2l6ZTogNSB9IHdvcmsgdGhlIHNhbWUgYXMgeyBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiA1IH0gfVxuICAgICAgICBjb25zdCBub3JtYWxpemVkUGFnaW5hdGlvbiA9IG5vcm1hbGl6ZVBhZ2luYXRpb25QYXJhbXMocCk7XG4gICAgICAgIHF1ZXJ5T3B0aW9ucy5wYWdpbmF0aW9uID0gbm9ybWFsaXplZFBhZ2luYXRpb247XG5cbiAgICAgICAgLy8gRXhlY3V0ZSBxdWVyeSB3aXRoIEVsZW1lbnRRdWVyeVNlcnZpY2VcbiAgICAgICAgY29uc3QgcXVlcnlSZXN1bHQgPSBxdWVyeVNlcnZpY2UucXVlcnkoZWxlbWVudHMsIHF1ZXJ5T3B0aW9ucyk7XG5cbiAgICAgICAgLy8gUmV0dXJuIGNvbmNpc2Ugc3RydWN0dXJlZCByZXNwb25zZSAoSXNzdWUgIzI5OSlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpdGVtczogcXVlcnlSZXN1bHQuaXRlbXMubWFwKChpdGVtOiBJRWxlbWVudCkgPT4gKHtcbiAgICAgICAgICAgIG5hbWU6IGl0ZW0ubWV0YWRhdGE/Lm5hbWUgfHwgJ1Vua25vd24nLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGl0ZW0ubWV0YWRhdGE/LmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgICAgICB2ZXJzaW9uOiBpdGVtLm1ldGFkYXRhPy52ZXJzaW9uIHx8IGl0ZW0udmVyc2lvbixcbiAgICAgICAgICAgIHRhZ3M6IGl0ZW0ubWV0YWRhdGE/LnRhZ3MsXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIHBhZ2luYXRpb246IHF1ZXJ5UmVzdWx0LnBhZ2luYXRpb24sXG4gICAgICAgICAgc29ydGluZzogcXVlcnlSZXN1bHQuc29ydGluZyxcbiAgICAgICAgICBmaWx0ZXJzOiBxdWVyeVJlc3VsdC5maWx0ZXJzLmFwcGxpZWQuY291bnQgPiAwID8geyBhcHBsaWVkOiBxdWVyeVJlc3VsdC5maWx0ZXJzLmFwcGxpZWQgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gU2VhcmNoIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTk9URTogVW5pZmllZCBTZWFyY2ggb3BlcmF0aW9ucyAoSXNzdWUgIzI0MykgYXJlIG5vdyBzY2hlbWEtZHJpdmVuLlxuICAvLyBUaGUgJ3NlYXJjaCcgb3BlcmF0aW9uIHVzZXMgdGhlICdzZWFyY2hQYXJhbXMnIG5vcm1hbGl6ZXIgaW4gT3BlcmF0aW9uU2NoZW1hLnRzLlxuICAvLyBTZWU6IFNlYXJjaFBhcmFtc05vcm1hbGl6ZXIgZm9yIHNjb3BlL3BhZ2luYXRpb24vc29ydC9maWx0ZXIgdHJhbnNmb3JtYXRpb24uXG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEludHJvc3BlY3Rpb24gb3BlcmF0aW9ucyB0byBJbnRyb3NwZWN0aW9uUmVzb2x2ZXJcbiAgICovXG4gIHByaXZhdGUgZGlzcGF0Y2hJbnRyb3NwZWN0aW9uKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdW5rbm93biB7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3Jlc29sdmUnOlxuICAgICAgICByZXR1cm4gSW50cm9zcGVjdGlvblJlc29sdmVyLnJlc29sdmUocGFyYW1zKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEludHJvc3BlY3Rpb24gbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGVsZW1lbnRzIGFjcm9zcyBvbmUgb3IgYWxsIGVsZW1lbnQgdHlwZXNcbiAgICpcbiAgICogSW1wbGVtZW50cyBzaW1wbGUgY2FzZS1pbnNlbnNpdGl2ZSBzdWJzdHJpbmcgbWF0Y2hpbmcgb246XG4gICAqIC0gbWV0YWRhdGEubmFtZVxuICAgKiAtIG1ldGFkYXRhLmRlc2NyaXB0aW9uXG4gICAqIC0gY29udGVudCAoaWYgYXZhaWxhYmxlKVxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBPcGVyYXRpb24gaW5wdXQgd2l0aCBvcHRpb25hbCBlbGVtZW50VHlwZSBhbmQgc2VhcmNoIHBhcmFtc1xuICAgKiBAcmV0dXJucyBTZWFyY2ggcmVzdWx0cyB3aXRoIG1hdGNoZWQgZWxlbWVudHMgYW5kIHJlbGV2YW5jZSBpbmZvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlYXJjaEVsZW1lbnRzKGlucHV0OiBPcGVyYXRpb25JbnB1dCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IHNlYXJjaFN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgY29uc3QgbWVtb3J5QmVmb3JlID0gcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLmhlYXBVc2VkO1xuICAgIGNvbnN0IHsgZWxlbWVudFR5cGUsIHBhcmFtcyB9ID0gaW5wdXQ7XG4gICAgY29uc3QgcCA9IHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBxdWVyeSA9IChwLnF1ZXJ5IGFzIHN0cmluZyk/LnRyaW0oKTtcblxuICAgIC8vIElzc3VlICM1MDA6IE5vcm1hbGl6ZSBmbGF0IHBhZ2luYXRpb24gcGFyYW1zIChwYWdlU2l6ZSwgcGFnZSwgbGltaXQsIG9mZnNldClcbiAgICBjb25zdCB7IHBhZ2UsIHBhZ2VTaXplIH0gPSBub3JtYWxpemVQYWdpbmF0aW9uUGFyYW1zKHApO1xuXG4gICAgLy8gRXh0cmFjdCBzb3J0IHBhcmFtc1xuICAgIGNvbnN0IHNvcnRQYXJhbSA9IHAuc29ydCBhcyB7IHNvcnRCeT86IHN0cmluZzsgc29ydE9yZGVyPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc29ydEJ5ID0gc29ydFBhcmFtPy5zb3J0QnkgPz8gJ25hbWUnO1xuICAgIGNvbnN0IHNvcnRPcmRlciA9IChzb3J0UGFyYW0/LnNvcnRPcmRlciA/PyAnYXNjJykgYXMgJ2FzYycgfCAnZGVzYyc7XG5cbiAgICAvLyBJbnB1dCB2YWxpZGF0aW9uIHdpdGggbGVuZ3RoIGxpbWl0XG4gICAgaWYgKCFxdWVyeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWFyY2ggcXVlcnkgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA+IDEwMDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VhcmNoIHF1ZXJ5IG11c3QgYmUgdW5kZXIgMTAwMCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGVsZW1lbnQgdHlwZXMgdG8gc2VhcmNoIChJc3N1ZSAjNDMzOiBhY2NlcHQgc2luZ3VsYXIgZm9ybXMpXG4gICAgbGV0IGVsZW1lbnRUeXBlczogc3RyaW5nW107XG4gICAgaWYgKGVsZW1lbnRUeXBlKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpO1xuICAgICAgaWYgKCFub3JtYWxpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBlbGVtZW50IHR5cGUgJyR7ZWxlbWVudFR5cGV9Jy4gVmFsaWQgdHlwZXM6ICR7Zm9ybWF0RWxlbWVudFR5cGVzTGlzdCgpfWApO1xuICAgICAgfVxuICAgICAgZWxlbWVudFR5cGVzID0gW25vcm1hbGl6ZWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50VHlwZXMgPSBbLi4uQUxMX0VMRU1FTlRfVFlQRVNdO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFJlc3VsdHM6IEFycmF5PHtcbiAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICBtYXRjaGVkSW46IHN0cmluZ1tdO1xuICAgIH0+ID0gW107XG5cbiAgICAvLyBDb2xsZWN0IEFMTCBtYXRjaGVzIChubyBlYXJseSB0ZXJtaW5hdGlvbiDigJQgcGFnaW5hdGlvbiBoYW5kbGVzIGxpbWl0aW5nKVxuICAgIGZvciAoY29uc3QgdHlwZSBvZiBlbGVtZW50VHlwZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRFbGVtZW50cyh0eXBlKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSB7XG4gICAgICAgICAgY29uc3QgbWF0Y2hlZEluOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gKGVsZW1lbnQubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt9O1xuXG4gICAgICAgICAgLy8gQ2hlY2sgbmFtZSBtYXRjaFxuICAgICAgICAgIGNvbnN0IG5hbWUgPSAobWV0YWRhdGEubmFtZSBhcyBzdHJpbmcpIHx8ICcnO1xuICAgICAgICAgIGlmIChuYW1lICYmIGlzU2VhcmNoTWF0Y2gocXVlcnksIG5hbWUpKSB7XG4gICAgICAgICAgICBtYXRjaGVkSW4ucHVzaCgnbmFtZScpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGRlc2NyaXB0aW9uIG1hdGNoXG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSAobWV0YWRhdGEuZGVzY3JpcHRpb24gYXMgc3RyaW5nKSB8fCAnJztcbiAgICAgICAgICBpZiAoZGVzY3JpcHRpb24gJiYgaXNTZWFyY2hNYXRjaChxdWVyeSwgZGVzY3JpcHRpb24pKSB7XG4gICAgICAgICAgICBtYXRjaGVkSW4ucHVzaCgnZGVzY3JpcHRpb24nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBjb250ZW50IG1hdGNoIChpZiBhdmFpbGFibGUpXG4gICAgICAgICAgaWYgKGVsZW1lbnQuY29udGVudCAmJiB0eXBlb2YgZWxlbWVudC5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGlzU2VhcmNoTWF0Y2gocXVlcnksIGVsZW1lbnQuY29udGVudCBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgICAgIG1hdGNoZWRJbi5wdXNoKCdjb250ZW50Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgYW55IG1hdGNoZXMgZm91bmQsIGFkZCB0byByZXN1bHRzXG4gICAgICAgICAgLy8gVXNlICduYW1lJyBoZXJlIOKAlCBGSUVMRF9UUkFOU0ZPUk1TIHdpbGwgcmVuYW1lIHRvICdlbGVtZW50X25hbWUnIGluIGFwcGx5RmllbGRTZWxlY3Rpb25cbiAgICAgICAgICBpZiAobWF0Y2hlZEluLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFsbFJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBtYXRjaGVkSW4sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIFNraXAgZWxlbWVudCB0eXBlcyB0aGF0IGZhaWwgdG8gbG9hZFxuICAgICAgICBsb2dnZXIuZGVidWcoYEZhaWxlZCB0byBsb2FkIGVsZW1lbnRzIGZvciBzZWFyY2g6ICR7dHlwZX1gLCB7IGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlY29yZCBzZWFyY2ggbWV0cmljcyB2aWEgUGVyZm9ybWFuY2VNb25pdG9yXG4gICAgdGhpcy5oYW5kbGVycy5wZXJmb3JtYW5jZU1vbml0b3I/LnJlY29yZFNlYXJjaCh7XG4gICAgICBxdWVyeSxcbiAgICAgIGR1cmF0aW9uOiBwZXJmb3JtYW5jZS5ub3coKSAtIHNlYXJjaFN0YXJ0LFxuICAgICAgcmVzdWx0Q291bnQ6IGFsbFJlc3VsdHMubGVuZ3RoLFxuICAgICAgc291cmNlczogZWxlbWVudFR5cGVzLFxuICAgICAgY2FjaGVIaXQ6IGZhbHNlLFxuICAgICAgbWVtb3J5QmVmb3JlLFxuICAgICAgbWVtb3J5QWZ0ZXI6IHByb2Nlc3MubWVtb3J5VXNhZ2UoKS5oZWFwVXNlZCxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICB9KTtcblxuICAgIC8vIFNvcnQgcmVzdWx0cyAoY3VycmVudGx5IG9ubHkgJ25hbWUnIGlzIHN1cHBvcnRlZCBhcyBhIHNvcnQgZmllbGQpXG4gICAgY29uc3Qgc29ydGVkUmVzdWx0cyA9IFsuLi5hbGxSZXN1bHRzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBjbXAgPSBhLm5hbWUudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIubmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09ICdkZXNjJyA/IC1jbXAgOiBjbXA7XG4gICAgfSk7XG5cbiAgICAvLyBQYWdpbmF0ZSB2aWEgUGFnaW5hdGlvblNlcnZpY2VcbiAgICBjb25zdCBwYWdpbmF0b3IgPSBuZXcgUGFnaW5hdGlvblNlcnZpY2UoKTtcbiAgICBjb25zdCBwYWdpbmF0ZWQgPSBwYWdpbmF0b3IucGFnaW5hdGUoc29ydGVkUmVzdWx0cywgeyBwYWdlLCBwYWdlU2l6ZSB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBpdGVtczogcGFnaW5hdGVkLml0ZW1zLFxuICAgICAgcGFnaW5hdGlvbjogcGFnaW5hdGVkLnBhZ2luYXRpb24sXG4gICAgICBzb3J0aW5nOiB7IHNvcnRCeSwgc29ydE9yZGVyIH0sXG4gICAgICBxdWVyeSxcbiAgICB9O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNQ1AtQVFMIEV4dGVuc2lvbiBEaXNwYXRjaCBNZXRob2RzIChJc3N1ZSAjMjQxKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIENvbGxlY3Rpb24gb3BlcmF0aW9ucyB0byBDb2xsZWN0aW9uSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaENvbGxlY3Rpb24oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5jb2xsZWN0aW9uSGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29sbGVjdGlvbiBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IENvbGxlY3Rpb25IYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2Jyb3dzZSc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmJyb3dzZUNvbGxlY3Rpb24oXG4gICAgICAgICAgcGFyYW1zLnNlY3Rpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHBhcmFtcy50eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgICApO1xuXG4gICAgICBjYXNlICdzZWFyY2gnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZWFyY2hDb2xsZWN0aW9uKHBhcmFtcy5xdWVyeSBhcyBzdHJpbmcpO1xuXG4gICAgICBjYXNlICdzZWFyY2hFbmhhbmNlZCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnNlYXJjaENvbGxlY3Rpb25FbmhhbmNlZChwYXJhbXMucXVlcnkgYXMgc3RyaW5nLCBwYXJhbXMpO1xuXG4gICAgICBjYXNlICdnZXRDb250ZW50JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0Q29sbGVjdGlvbkNvbnRlbnQocGFyYW1zLnBhdGggYXMgc3RyaW5nKTtcblxuICAgICAgY2FzZSAnZ2V0Q2FjaGVIZWFsdGgnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRDb2xsZWN0aW9uQ2FjaGVIZWFsdGgoKTtcblxuICAgICAgY2FzZSAnaW5zdGFsbCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmluc3RhbGxDb250ZW50KHBhcmFtcy5wYXRoIGFzIHN0cmluZyk7XG5cbiAgICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnN1Ym1pdENvbnRlbnQocGFyYW1zLmNvbnRlbnQgYXMgc3RyaW5nKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIENvbGxlY3Rpb24gbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggUG9ydGZvbGlvIG9wZXJhdGlvbnMgdG8gUG9ydGZvbGlvSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFBvcnRmb2xpbyhcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLnBvcnRmb2xpb0hhbmRsZXI7XG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvcnRmb2xpbyBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IFBvcnRmb2xpb0hhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnc3RhdHVzJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIucG9ydGZvbGlvU3RhdHVzKHBhcmFtcy51c2VybmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuXG4gICAgICBjYXNlICdpbml0JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuaW5pdFBvcnRmb2xpbyh7XG4gICAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHBhcmFtcy5yZXBvc2l0b3J5X25hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHByaXZhdGU6IHBhcmFtcy5wcml2YXRlIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHBhcmFtcy5kZXNjcmlwdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdjb25maWcnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5wb3J0Zm9saW9Db25maWcoe1xuICAgICAgICAgIGF1dG9TeW5jOiBwYXJhbXMuYXV0b19zeW5jIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgZGVmYXVsdFZpc2liaWxpdHk6IHBhcmFtcy5kZWZhdWx0X3Zpc2liaWxpdHkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGF1dG9TdWJtaXQ6IHBhcmFtcy5hdXRvX3N1Ym1pdCBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiBwYXJhbXMucmVwb3NpdG9yeV9uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ3N5bmMnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zeW5jUG9ydGZvbGlvKHtcbiAgICAgICAgICBkaXJlY3Rpb246IChwYXJhbXMuZGlyZWN0aW9uIGFzIHN0cmluZykgfHwgJ3B1c2gnLFxuICAgICAgICAgIG1vZGU6IHBhcmFtcy5tb2RlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBmb3JjZTogcGFyYW1zLmZvcmNlIGFzIGJvb2xlYW4gfHwgZmFsc2UsXG4gICAgICAgICAgZHJ5UnVuOiBwYXJhbXMuZHJ5X3J1biBhcyBib29sZWFuIHx8IGZhbHNlLFxuICAgICAgICAgIGNvbmZpcm1EZWxldGlvbnM6IHBhcmFtcy5jb25maXJtX2RlbGV0aW9ucyBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnc2VhcmNoJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VhcmNoUG9ydGZvbGlvKHtcbiAgICAgICAgICBxdWVyeTogcGFyYW1zLnF1ZXJ5IGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZTogcGFyYW1zLnR5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGZ1enp5TWF0Y2g6IHBhcmFtcy5mdXp6eV9tYXRjaCBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIG1heFJlc3VsdHM6IHBhcmFtcy5tYXhfcmVzdWx0cyBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZUtleXdvcmRzOiBwYXJhbXMuaW5jbHVkZV9rZXl3b3JkcyBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGluY2x1ZGVUYWdzOiBwYXJhbXMuaW5jbHVkZV90YWdzIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZVRyaWdnZXJzOiBwYXJhbXMuaW5jbHVkZV90cmlnZ2VycyBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGluY2x1ZGVEZXNjcmlwdGlvbnM6IHBhcmFtcy5pbmNsdWRlX2Rlc2NyaXB0aW9ucyBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnc2VhcmNoQWxsJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VhcmNoQWxsKHtcbiAgICAgICAgICBxdWVyeTogcGFyYW1zLnF1ZXJ5IGFzIHN0cmluZyxcbiAgICAgICAgICBzb3VyY2VzOiBwYXJhbXMuc291cmNlcyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbGVtZW50VHlwZTogcGFyYW1zLnR5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHBhZ2U6IHBhcmFtcy5wYWdlIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBwYWdlU2l6ZTogcGFyYW1zLnBhZ2Vfc2l6ZSBhcyBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgICAgICAgc29ydEJ5OiBwYXJhbXMuc29ydF9ieSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdlbGVtZW50TWFuYWdlcic6IHtcbiAgICAgICAgY29uc3Qgc3luY0hhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLnN5bmNIYW5kbGVyO1xuICAgICAgICBpZiAoIXN5bmNIYW5kbGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQb3J0Zm9saW8gZWxlbWVudCBtYW5hZ2VyIG5vdCBhdmFpbGFibGU6IFN5bmNIYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN5bmNIYW5kbGVyLmhhbmRsZVN5bmNPcGVyYXRpb24oe1xuICAgICAgICAgIG9wZXJhdGlvbjogcGFyYW1zLm9wZXJhdGlvbiBhcyAnbGlzdC1yZW1vdGUnIHwgJ2Rvd25sb2FkJyB8ICd1cGxvYWQnIHwgJ2NvbXBhcmUnLFxuICAgICAgICAgIGVsZW1lbnRfbmFtZTogcGFyYW1zLmVsZW1lbnRfbmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZWxlbWVudF90eXBlOiBwYXJhbXMuZWxlbWVudF90eXBlIGFzIEVsZW1lbnRUeXBlIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGZpbHRlcjogcGFyYW1zLmZpbHRlciBhcyB7IHR5cGU/OiBFbGVtZW50VHlwZTsgYXV0aG9yPzogc3RyaW5nOyB1cGRhdGVkX2FmdGVyPzogc3RyaW5nIH0gfCB1bmRlZmluZWQsXG4gICAgICAgICAgb3B0aW9uczogcGFyYW1zLm9wdGlvbnMgYXMgeyBmb3JjZT86IGJvb2xlYW47IGRyeV9ydW4/OiBib29sZWFuOyBpbmNsdWRlX3ByaXZhdGU/OiBib29sZWFuIH0gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gUG9ydGZvbGlvIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEF1dGggb3BlcmF0aW9ucyB0byBHaXRIdWJBdXRoSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEF1dGgoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5hdXRoSGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXV0aCBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IEdpdEh1YkF1dGhIYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ3NldHVwJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2V0dXBHaXRIdWJBdXRoKCk7XG5cbiAgICAgIGNhc2UgJ2NoZWNrJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuY2hlY2tHaXRIdWJBdXRoKCk7XG5cbiAgICAgIGNhc2UgJ2NsZWFyJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuY2xlYXJHaXRIdWJBdXRoKCk7XG5cbiAgICAgIGNhc2UgJ2NvbmZpZ3VyZU9BdXRoJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuY29uZmlndXJlT0F1dGgocGFyYW1zLmNsaWVudF9pZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQpO1xuXG4gICAgICBjYXNlICdvYXV0aEhlbHBlclN0YXR1cyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmdldE9BdXRoSGVscGVyU3RhdHVzKHBhcmFtcy52ZXJib3NlIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQXV0aCBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBDb25maWcgb3BlcmF0aW9ucyB0byBDb25maWdIYW5kbGVyIGFuZCBCdWlsZEluZm9TZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQ29uZmlnKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ21hbmFnZSc6IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuY29uZmlnSGFuZGxlcjtcbiAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25maWcgb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBDb25maWdIYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuaGFuZGxlQ29uZmlnT3BlcmF0aW9uKHtcbiAgICAgICAgICBhY3Rpb246IHBhcmFtcy5hY3Rpb24gYXMgJ2dldCcgfCAnc2V0JyB8ICdyZXNldCcgfCAnZXhwb3J0JyB8ICdpbXBvcnQnIHwgJ3dpemFyZCcsXG4gICAgICAgICAgc2V0dGluZzogcGFyYW1zLnNldHRpbmcgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHZhbHVlOiBwYXJhbXMudmFsdWUsXG4gICAgICAgICAgc2VjdGlvbjogcGFyYW1zLnNlY3Rpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGZvcm1hdDogcGFyYW1zLmZvcm1hdCBhcyAneWFtbCcgfCAnanNvbicgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZGF0YTogcGFyYW1zLmRhdGEgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZ2V0QnVpbGRJbmZvJzoge1xuICAgICAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5oYW5kbGVycy5idWlsZEluZm9TZXJ2aWNlO1xuICAgICAgICBpZiAoIXNlcnZpY2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1aWxkSW5mbyBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IEJ1aWxkSW5mb1NlcnZpY2Ugbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmZvID0gYXdhaXQgc2VydmljZS5nZXRCdWlsZEluZm8oKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb250ZW50OiBbe1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgdGV4dDogc2VydmljZS5mb3JtYXRCdWlsZEluZm8oaW5mbylcbiAgICAgICAgICB9XVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRDYWNoZUJ1ZGdldFJlcG9ydCc6IHtcbiAgICAgICAgY29uc3QgYnVkZ2V0ID0gdGhpcy5oYW5kbGVycy5jYWNoZU1lbW9yeUJ1ZGdldDtcbiAgICAgICAgaWYgKCFidWRnZXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhY2hlIGJ1ZGdldCBub3QgYXZhaWxhYmxlOiBDYWNoZU1lbW9yeUJ1ZGdldCBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcG9ydCA9IGJ1ZGdldC5nZXRSZXBvcnQoKTtcbiAgICAgICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICcjIENhY2hlIE1lbW9yeSBCdWRnZXQgUmVwb3J0JyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBgKipCdWRnZXQ6KiogJHtyZXBvcnQuYnVkZ2V0TUJ9IE1CYCxcbiAgICAgICAgICBgKipVc2VkOioqICR7cmVwb3J0LnRvdGFsTWVtb3J5TUJ9IE1CICgke3JlcG9ydC51dGlsaXphdGlvblBlcmNlbnR9JSlgLFxuICAgICAgICAgIGAqKlJlZ2lzdGVyZWQgQ2FjaGVzOioqICR7cmVwb3J0LmNhY2hlcy5sZW5ndGh9YCxcbiAgICAgICAgICAnJyxcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKHJlcG9ydC5jYWNoZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxpbmVzLnB1c2goJ3wgQ2FjaGUgfCBFbnRyaWVzIHwgTWVtb3J5IChNQikgfCBIaXQgUmF0ZSB8IExhc3QgQWN0aXZpdHkgfCcpO1xuICAgICAgICAgIGxpbmVzLnB1c2goJ3wtLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfCcpO1xuICAgICAgICAgIGZvciAoY29uc3QgYyBvZiByZXBvcnQuY2FjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpdml0eSA9IGMubGFzdEFjdGl2aXR5TXMgPiAwXG4gICAgICAgICAgICAgID8gYCR7KChEYXRlLm5vdygpIC0gYy5sYXN0QWN0aXZpdHlNcykgLyAxMDAwKS50b0ZpeGVkKDApfXMgYWdvYFxuICAgICAgICAgICAgICA6ICduZXZlcic7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGB8ICR7Yy5uYW1lfSB8ICR7Yy5lbnRyaWVzfSB8ICR7Yy5tZW1vcnlNQn0gfCAkeyhjLmhpdFJhdGUgKiAxMDApLnRvRml4ZWQoMSl9JSB8ICR7YWN0aXZpdHl9IHxgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGluZXMucHVzaCgnX05vIGNhY2hlcyByZWdpc3RlcmVkLl8nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICB0ZXh0OiBsaW5lcy5qb2luKCdcXG4nKVxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBDb25maWcgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggRW5oYW5jZWRJbmRleCBvcGVyYXRpb25zIHRvIEVuaGFuY2VkSW5kZXhIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoRW5oYW5jZWRJbmRleChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmVuaGFuY2VkSW5kZXhIYW5kbGVyO1xuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmhhbmNlZEluZGV4IG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogRW5oYW5jZWRJbmRleEhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnZmluZFNpbWlsYXInOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5maW5kU2ltaWxhckVsZW1lbnRzKHtcbiAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnRfbmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IHBhcmFtcy5lbGVtZW50X3R5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGxpbWl0OiAocGFyYW1zLmxpbWl0IGFzIG51bWJlcikgPz8gMTAsXG4gICAgICAgICAgdGhyZXNob2xkOiAocGFyYW1zLnRocmVzaG9sZCBhcyBudW1iZXIpID8/IDAuNSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2dldFJlbGF0aW9uc2hpcHMnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRFbGVtZW50UmVsYXRpb25zaGlwcyh7XG4gICAgICAgICAgZWxlbWVudE5hbWU6IHBhcmFtcy5lbGVtZW50X25hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBwYXJhbXMuZWxlbWVudF90eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICByZWxhdGlvbnNoaXBUeXBlczogcGFyYW1zLnJlbGF0aW9uc2hpcF90eXBlcyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ3NlYXJjaEJ5VmVyYic6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnNlYXJjaEJ5VmVyYih7XG4gICAgICAgICAgdmVyYjogcGFyYW1zLnZlcmIgYXMgc3RyaW5nLFxuICAgICAgICAgIGxpbWl0OiAocGFyYW1zLmxpbWl0IGFzIG51bWJlcikgPz8gMjAsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdnZXRTdGF0cyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmdldFJlbGF0aW9uc2hpcFN0YXRzKCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBFbmhhbmNlZEluZGV4IG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIFBlcnNvbmEgb3BlcmF0aW9ucyB0byBQZXJzb25hSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaFBlcnNvbmEoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5wZXJzb25hSGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGVyc29uYSBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IFBlcnNvbmFIYW5kbGVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2ltcG9ydCc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzMyMzogVmFsaWRhdGUgc291cmNlIHBhcmFtZXRlciBiZWZvcmUgdXNlXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICdzb3VyY2UnLFxuICAgICAgICAgICdVUkwgb3IgZmlsZSBwYXRoIHRvIGltcG9ydCBwZXJzb25hIGZyb20nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmltcG9ydFBlcnNvbmEoc291cmNlLCBwYXJhbXMub3ZlcndyaXRlIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQpO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gUGVyc29uYSBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBHYXRla2VlcGVyIG9wZXJhdGlvbnMgZm9yIGNvbmZpcm1hdGlvbiBtYW5hZ2VtZW50LlxuICAgKlxuICAgKiBJc3N1ZSAjNDUyOiBIYW5kbGVzIHRoZSBjb25maXJtX29wZXJhdGlvbiBmbG93IHdoZXJlIHVzZXJzIGFwcHJvdmVcbiAgICogb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUgY29uZmlybWF0aW9uIHBlciBHYXRla2VlcGVyIHBvbGljeS5cbiAgICpcbiAgICogRmxvdzpcbiAgICogMS4gR2F0ZWtlZXBlci5lbmZvcmNlKCkgcmV0dXJucyBjb25maXJtYXRpb25QZW5kaW5nOiB0cnVlXG4gICAqIDIuIExMTSBjYWxscyBjb25maXJtX29wZXJhdGlvbiB3aXRoIHRoZSBvcGVyYXRpb24gbmFtZVxuICAgKiAzLiBUaGlzIG1ldGhvZCByZWNvcmRzIHRoZSBjb25maXJtYXRpb24gaW4gdGhlIHNlc3Npb25cbiAgICogNC4gTExNIHJldHJpZXMgdGhlIG9yaWdpbmFsIG9wZXJhdGlvbiwgd2hpY2ggbm93IHBhc3NlcyB2aWEgTGF5ZXIgM1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEdhdGVrZWVwZXIoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnY29uZmlybSc6IHtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ29wZXJhdGlvbicsXG4gICAgICAgICAgJ3RoZSBvcGVyYXRpb24gbmFtZSB0byBjb25maXJtIChlLmcuIFwiY3JlYXRlX2VsZW1lbnRcIiknXG4gICAgICAgICk7XG4gICAgICAgIC8vIElzc3VlICMxNjM2OiBOb3JtYWxpemUgZWxlbWVudF90eXBlIHRvIG1hdGNoIHRoZSBNQ1AtQVFMIHNpbmd1bGFyIGZvcm1cbiAgICAgICAgLy8gdXNlZCBieSB0aGUgZW5mb3JjZSBwYXRoLiBXaXRob3V0IHRoaXMsIHNjb3BlZCBjb25maXJtYXRpb25zIHN0b3JlZCBhc1xuICAgICAgICAvLyBcImNyZWF0ZV9lbGVtZW50OnNraWxsc1wiIG5ldmVyIG1hdGNoIGVuZm9yY2UgbG9va3VwcyBmb3IgXCJjcmVhdGVfZWxlbWVudDpza2lsbFwiLlxuICAgICAgICBjb25zdCByYXdFbGVtZW50VHlwZSA9IHBhcmFtcy5lbGVtZW50X3R5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBlbGVtZW50VHlwZSA9IHJhd0VsZW1lbnRUeXBlXG4gICAgICAgICAgPyBub3JtYWxpemVNQ1BBUUxFbGVtZW50VHlwZShyYXdFbGVtZW50VHlwZSkgPz8gcmF3RWxlbWVudFR5cGVcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBJc3N1ZSAjNzQ4OiBCdWlsZCBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IG9mIHdoYXQncyBiZWluZyBjb25maXJtZWRcbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHRoaXMuYnVpbGRPcGVyYXRpb25TdW1tYXJ5KG9wZXJhdGlvbiwgZWxlbWVudFR5cGUsIHBhcmFtcyk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRBY3RpdmVFbGVtZW50cygpO1xuXG4gICAgICAgIC8vIElzc3VlICM3NTg6IENoZWNrIGZvciBudWNsZWFyIHNhbmRib3gg4oCUIGRlbnk6IFsnY29uZmlybV9vcGVyYXRpb24nXSBvbiBhbnkgYWN0aXZlIGVsZW1lbnQuXG4gICAgICAgIC8vIFRoaXMgaXMgYSBoYXJkIGJsb2NrOiB0aGUgTExNIGNhbm5vdCBjb25maXJtIEFOWSBvcGVyYXRpb24gd2hpbGUgdGhlIGRlbnlpbmcgZWxlbWVudFxuICAgICAgICAvLyBpcyBhY3RpdmUuIFRoZSBodW1hbiBtdXN0IGRlYWN0aXZhdGUgdGhlIGVsZW1lbnQgdG8gcmVzdG9yZSBjb25maXJtYXRpb24gY2FwYWJpbGl0eS5cbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBhdXRvbWF0ZWQgY29uZmlybeKGkmV4ZWN1dGUgbG9vcHMgdGhhdCBieXBhc3MgaHVtYW4gcmV2aWV3LlxuICAgICAgICBjb25zdCBkZW55aW5nRWxlbWVudCA9IGZpbmRDb25maXJtRGVueWluZ0VsZW1lbnQoYWN0aXZlRWxlbWVudHMpO1xuICAgICAgICBpZiAoZGVueWluZ0VsZW1lbnQpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW0dhdGVrZWVwZXJdIFNhbmRib3ggYWN0aXZlOiAke2RlbnlpbmdFbGVtZW50LnR5cGV9IFwiJHtkZW55aW5nRWxlbWVudC5uYW1lfVwiIGRlbmllcyBjb25maXJtX29wZXJhdGlvbmAsIHtcbiAgICAgICAgICAgIGJsb2NrZWRPcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBPcGVyYXRpb24gY2Fubm90IGJlIGNvbmZpcm1lZCDigJQgJHtkZW55aW5nRWxlbWVudC50eXBlfSBcIiR7ZGVueWluZ0VsZW1lbnQubmFtZX1cIiBoYXMgc2FuZGJveGVkIHRoaXMgc2Vzc2lvbi4gYCArXG4gICAgICAgICAgICBgQWxsIGNvbmZpcm1hdGlvbnMgYXJlIGJsb2NrZWQgd2hpbGUgdGhpcyBlbGVtZW50IGlzIGFjdGl2ZS4gYCArXG4gICAgICAgICAgICBgRGVhY3RpdmF0ZSB0aGUgZWxlbWVudCB0byByZXN0b3JlIGNvbmZpcm1hdGlvbiBjYXBhYmlsaXR5LmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzc1ODogQ2hlY2sgZm9yIGFkdmlzb3J5IOKAlCBjb25maXJtOiBbJ2NvbmZpcm1fb3BlcmF0aW9uJ10gb24gYWN0aXZlIGVsZW1lbnRzLlxuICAgICAgICAvLyBOb3QgZW5mb3JjZWQgYXMgYSBnYXRlLCBidXQgc3VyZmFjZWQgdG8gdGhlIGh1bWFuIGZvciBhd2FyZW5lc3MuXG4gICAgICAgIGNvbnN0IGFkdmlzb3J5RWxlbWVudHMgPSBmaW5kQ29uZmlybUFkdmlzb3J5RWxlbWVudHMoYWN0aXZlRWxlbWVudHMpO1xuICAgICAgICBjb25zdCBhZHZpc29yeU5vdGUgPSBhZHZpc29yeUVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGAgTm90ZTogJHthZHZpc29yeUVsZW1lbnRzLm1hcChlID0+IGAke2UudHlwZX0gXCIke2UubmFtZX1cImApLmpvaW4oJywgJyl9IHJlcXVlc3QgYWRkaXRpb25hbCBzY3J1dGlueSBmb3IgY29uZmlybWF0aW9ucy5gXG4gICAgICAgICAgOiAnJztcblxuICAgICAgICAvLyBFdmFsdWF0ZSB0aGUgVEFSR0VUIG9wZXJhdGlvbidzIHBlcm1pc3Npb24gbGV2ZWwgd2l0aCBmdWxsIGVsZW1lbnQgcG9saWNpZXMuXG4gICAgICAgIC8vIFRoaXMgaXMgTk9UIGNoZWNraW5nIGNvbmZpcm1fb3BlcmF0aW9uIGl0c2VsZiAodGhhdCB3YXMgaGFuZGxlZCBpbiB0aGUgcHJpbWFyeVxuICAgICAgICAvLyBlbmZvcmNlbWVudCBwYXRoIHdpdGggc2tpcEVsZW1lbnRQb2xpY2llcykuIFRoaXMgY2hlY2tzIHdoYXQgdGhlIHRhcmdldCBvcGVyYXRpb25cbiAgICAgICAgLy8gbmVlZHMgc28gd2UgcmVjb3JkIHRoZSByaWdodCBjb25maXJtYXRpb24gbGV2ZWwuXG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gdGhpcy5nYXRla2VlcGVyLmVuZm9yY2Uoe1xuICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICBlbmRwb2ludDogdGhpcy5nZXRFbmRwb2ludEZvck9wZXJhdGlvbihvcGVyYXRpb24pLFxuICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJZiB0aGUgb3BlcmF0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgbmVlZCBjb25maXJtYXRpb24sIGluZm9ybSB0aGUgY2FsbGVyXG4gICAgICAgIGlmIChkZWNpc2lvbi5hbGxvd2VkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmZpcm1lZDogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBPcGVyYXRpb24gXCIke29wZXJhdGlvbn1cIiBpcyBhbHJlYWR5IGFwcHJvdmVkICgke2RlY2lzaW9uLnBvbGljeVNvdXJjZSA/PyAnYXV0b19hcHByb3ZlJ30pLiBObyBjb25maXJtYXRpb24gbmVlZGVkLmAsXG4gICAgICAgICAgICBzdW1tYXJ5LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRlY2lzaW9uLmNvbmZpcm1hdGlvblBlbmRpbmcpIHtcbiAgICAgICAgICAvLyBIYXJkIGRlbnkgb24gdGhlIHRhcmdldCBvcGVyYXRpb24g4oCUIGNvbmZpcm1hdGlvbiB3b24ndCBoZWxwXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGlzIGRlbmllZCBieSBwb2xpY3kgYW5kIGNhbm5vdCBiZSBjb25maXJtZWQuICR7ZGVjaXNpb24ucmVhc29ufWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVjb3JkIHRoZSBjb25maXJtYXRpb24gaW4gdGhlIHNlc3Npb25cbiAgICAgICAgY29uc3QgbGV2ZWwgPSBkZWNpc2lvbi5wZXJtaXNzaW9uTGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0VcbiAgICAgICAgICA/IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0VcbiAgICAgICAgICA6IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NFU1NJT047XG5cbiAgICAgICAgdGhpcy5nYXRla2VlcGVyLnJlY29yZENvbmZpcm1hdGlvbihvcGVyYXRpb24sIGxldmVsLCBlbGVtZW50VHlwZSk7XG5cbiAgICAgICAgLy8gQWdlbnQgTm90aWZpY2F0aW9uIFN5c3RlbTogY2xlYXIgbWF0Y2hpbmcgYmxvY2tzIGZyb20gZXhlY3V0aW5nIGFnZW50c1xuICAgICAgICBmb3IgKGNvbnN0IFssIGFnZW50RW50cnldIG9mIHRoaXMuZXhlY3V0aW5nQWdlbnRzKSB7XG4gICAgICAgICAgYWdlbnRFbnRyeS5yZWNlbnRCbG9ja3MgPSBhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5maWx0ZXIoXG4gICAgICAgICAgICBiID0+IGIub3BlcmF0aW9uICE9PSBvcGVyYXRpb24gfHwgKGVsZW1lbnRUeXBlICYmIGIuZWxlbWVudFR5cGUgIT09IGVsZW1lbnRUeXBlKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbmZpcm1lZDogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQ29uZmlybWVkOiAke3N1bW1hcnl9LiR7YWR2aXNvcnlOb3RlfWAsXG4gICAgICAgICAgcmF0aW9uYWxlOiBkZWNpc2lvbi5yZWFzb24sXG4gICAgICAgICAgc2NvcGU6IGVsZW1lbnRUeXBlID8gYFNjb3BlZCB0byBlbGVtZW50IHR5cGU6ICR7ZWxlbWVudFR5cGV9YCA6ICdBbGwgZWxlbWVudCB0eXBlcycsXG4gICAgICAgICAgbGV2ZWw6IGxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFID8gJ3NpbmdsZV91c2UnIDogJ3Nlc3Npb24nLFxuICAgICAgICAgIHN1bW1hcnksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3ZlcmlmeSc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzE0MjogVmVyaWZ5IGEgZGFuZ2VyIHpvbmUgY2hhbGxlbmdlIGNvZGUgdG8gdW5ibG9jayBhbiBhZ2VudC5cbiAgICAgICAgLy8gVGhpcyBpcyBzdGVwIDkgb2YgdGhlIHZlcmlmaWNhdGlvbiBmbG93IChzZWUgYXV0b25vbXlFdmFsdWF0b3IudHMgaGVhZGVyKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUGlwZWxpbmU6IHZhbGlkYXRlIHBhcmFtcyDihpIgcmF0ZSBsaW1pdCBjaGVjayDihpIgVVVJRCB2NCBmb3JtYXQgY2hlY2sg4oaSXG4gICAgICAgIC8vICAgICAgICAgICBwcmUtY2hlY2sgc3RvcmUgKGV4cGlyZWQ/KSDihpIgdmVyaWZ5IGNvZGUgKHdyb25nPykg4oaSIHVuYmxvY2sgYWdlbnRcbiAgICAgICAgLy9cbiAgICAgICAgLy8gRWFjaCBzdGFnZSBsb2dzIGEgZGlzdGluY3Qgc2VjdXJpdHkgZXZlbnQgdHlwZTpcbiAgICAgICAgLy8gICBWRVJJRklDQVRJT05fQVRURU1QVEVEIOKGkiBWRVJJRklDQVRJT05fRkFJTEVEIChmb3JtYXQvcmF0ZS93cm9uZykgb3JcbiAgICAgICAgLy8gICBWRVJJRklDQVRJT05fRVhQSVJFRCAobm90IGZvdW5kKSBvciBWRVJJRklDQVRJT05fU1VDQ0VFREVEXG4gICAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5yZWNvcmRBdHRlbXB0KCk7XG4gICAgICAgIGNvbnN0IGF0dGVtcHRUaW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZUlkID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ2NoYWxsZW5nZV9pZCcsXG4gICAgICAgICAgJ3RoZSB2ZXJpZmljYXRpb24gY2hhbGxlbmdlIElEJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBjb2RlID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ2NvZGUnLFxuICAgICAgICAgICd0aGUgdmVyaWZpY2F0aW9uIGNvZGUgZGlzcGxheWVkIG9uIHlvdXIgc2NyZWVuJ1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIExvZyBldmVyeSB2ZXJpZmljYXRpb24gYXR0ZW1wdCBmb3IgYXVkaXQgdHJhaWxcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fQVRURU1QVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIGF0dGVtcHRlZCBmb3IgY2hhbGxlbmdlICR7Y2hhbGxlbmdlSWR9YCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSYXRlIGxpbWl0aW5nOiByZWplY3QgaWYgdG9vIG1hbnkgcmVjZW50IGZhaWx1cmVzXG4gICAgICAgIGlmICh0aGlzLnZlcmlmaWNhdGlvblJhdGVMaW1pdGVyLmlzTGltaXRlZCgpKSB7XG4gICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZFJhdGVMaW1pdGVkKCk7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9GQUlMRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIHJhdGUtbGltaXRlZDogdG9vIG1hbnkgZmFpbGVkIGF0dGVtcHRzIChjaGFsbGVuZ2U6ICR7Y2hhbGxlbmdlSWR9KWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgcmVhc29uOiAncmF0ZV9saW1pdGVkJyB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgICAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX0ZBSUxFRCxcbiAgICAgICAgICAgICdUb28gbWFueSBmYWlsZWQgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBQbGVhc2Ugd2FpdCBiZWZvcmUgdHJ5aW5nIGFnYWluLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVVVJRCB2NCBmb3JtYXQgdmFsaWRhdGlvbjogcmVqZWN0IGludmFsaWQgSURzIGJlZm9yZSBzdG9yZSBsb29rdXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWxpZGF0ZUNoYWxsZW5nZUlkRm9ybWF0KGNoYWxsZW5nZUlkKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbk1ldHJpY3MucmVjb3JkSW52YWxpZEZvcm1hdCgpO1xuICAgICAgICAgIHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fRkFJTEVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci52ZXJpZnknLFxuICAgICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiByZWplY3RlZDogaW52YWxpZCBjaGFsbGVuZ2VfaWQgZm9ybWF0ICgke2NoYWxsZW5nZUlkfSlgLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQsIHJlYXNvbjogJ2ludmFsaWRfZm9ybWF0JyB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLmhhbmRsZXJzLnZlcmlmaWNhdGlvblN0b3JlO1xuICAgICAgICBpZiAoIXN0b3JlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fRkFJTEVELFxuICAgICAgICAgICAgJ1ZlcmlmaWNhdGlvbiBzeXN0ZW0gbm90IGF2YWlsYWJsZS4gRW5zdXJlIHRoZSBzZXJ2ZXIgaXMgcHJvcGVybHkgY29uZmlndXJlZC4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGNoYWxsZW5nZSBleGlzdHMgYW5kIGlzIG5vdCBleHBpcmVkIGJlZm9yZSBhdHRlbXB0aW5nIHZlcmlmeVxuICAgICAgICAvLyBUaGlzIGxldHMgdXMgZGlzdGluZ3Vpc2ggXCJ3cm9uZyBjb2RlXCIgZnJvbSBcImV4cGlyZWRcIiBmb3IgZ3JhbnVsYXIgbG9nZ2luZ1xuICAgICAgICBjb25zdCBjaGFsbGVuZ2VQcmVDaGVjayA9IHN0b3JlLmdldChjaGFsbGVuZ2VJZCk7XG4gICAgICAgIGlmICghY2hhbGxlbmdlUHJlQ2hlY2spIHtcbiAgICAgICAgICAvLyBDaGFsbGVuZ2Ugbm90IGZvdW5kIOKAlCBlaXRoZXIgZXhwaXJlZCwgYWxyZWFkeSB1c2VkLCBvciBuZXZlciBleGlzdGVkXG4gICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZEV4cGlyZWQoKTtcbiAgICAgICAgICB0aGlzLnZlcmlmaWNhdGlvblJhdGVMaW1pdGVyLnJlY29yZEZhaWx1cmUoKTtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX0VYUElSRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIGZhaWxlZDogY2hhbGxlbmdlICR7Y2hhbGxlbmdlSWR9IG5vdCBmb3VuZCAoZXhwaXJlZCwgYWxyZWFkeSB1c2VkLCBvciBpbnZhbGlkKWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgcmVhc29uOiAnZXhwaXJlZF9vcl9ub3RfZm91bmQnIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fVElNRU9VVCxcbiAgICAgICAgICAgICdWZXJpZmljYXRpb24gZmFpbGVkOiBjaGFsbGVuZ2Ugbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBleHBpcmVkIG9yIGFscmVhZHkgYmVlbiB1c2VkLiAnICtcbiAgICAgICAgICAgICdSZXRyeSB0aGUgYmxvY2tlZCBvcGVyYXRpb24gdG8gcmVjZWl2ZSBhIG5ldyB2ZXJpZmljYXRpb24gY29kZS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZlcmlmeSB0aGUgY29kZSAob25lLXRpbWUgdXNlIOKAlCBzdG9yZSBkZWxldGVzIGNoYWxsZW5nZSBhZnRlciB0aGlzIGNhbGwpXG4gICAgICAgIGNvbnN0IHZhbGlkID0gc3RvcmUudmVyaWZ5KGNoYWxsZW5nZUlkLCBjb2RlKTtcbiAgICAgICAgaWYgKCF2YWxpZCkge1xuICAgICAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5yZWNvcmRGYWlsdXJlKCk7XG4gICAgICAgICAgY29uc3QgcmF0ZUxpbWl0RXhjZWVkZWQgPSB0aGlzLnZlcmlmaWNhdGlvblJhdGVMaW1pdGVyLnJlY29yZEZhaWx1cmUoKTtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX0ZBSUxFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gZmFpbGVkIGZvciBjaGFsbGVuZ2UgJHtjaGFsbGVuZ2VJZH06IGluY29ycmVjdCBjb2RlYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCByZWFzb246ICd3cm9uZ19jb2RlJywgcmF0ZUxpbWl0RXhjZWVkZWQgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICAgICAgICAnVmVyaWZpY2F0aW9uIGZhaWxlZDogaW5jb3JyZWN0IGNvZGUuICcgK1xuICAgICAgICAgICAgJ1RoZSBjb2RlIGhhcyBiZWVuIGNvbnN1bWVkIChvbmUtdGltZSB1c2UpLiAnICtcbiAgICAgICAgICAgICdSZXRyeSB0aGUgYmxvY2tlZCBvcGVyYXRpb24gdG8gcmVjZWl2ZSBhIG5ldyB2ZXJpZmljYXRpb24gY29kZS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1Y2Nlc3Mg4oCUIGNhbGN1bGF0ZSB0aW1lLXRvLXZlcmlmeSBhbmQgcmVjb3JkIG1ldHJpY3NcbiAgICAgICAgY29uc3QgdmVyaWZ5RHVyYXRpb25NcyA9IGF0dGVtcHRUaW1lc3RhbXAgLSAoY2hhbGxlbmdlUHJlQ2hlY2suZXhwaXJlc0F0IC0gNSAqIDYwICogMTAwMCk7XG4gICAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5yZWNvcmRTdWNjZXNzKHZlcmlmeUR1cmF0aW9uTXMgPiAwID8gdmVyaWZ5RHVyYXRpb25NcyA6IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgLy8gRmluZCB3aGljaCBhZ2VudCBpcyBibG9ja2VkIHdpdGggdGhpcyBjaGFsbGVuZ2VJZCBhbmQgdW5ibG9jayBpdFxuICAgICAgICBjb25zdCBlbmZvcmNlciA9IHRoaXMuaGFuZGxlcnMuZGFuZ2VyWm9uZUVuZm9yY2VyO1xuICAgICAgICBpZiAoZW5mb3JjZXIpIHtcbiAgICAgICAgICBjb25zdCBibG9ja2VkQWdlbnRzID0gZW5mb3JjZXIuZ2V0QmxvY2tlZEFnZW50cygpO1xuICAgICAgICAgIGxldCB1bmJsb2NrZWRBZ2VudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGZvciAoY29uc3QgYWdlbnROYW1lIG9mIGJsb2NrZWRBZ2VudHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrSW5mbyA9IGVuZm9yY2VyLmNoZWNrKGFnZW50TmFtZSk7XG4gICAgICAgICAgICBpZiAoYmxvY2tJbmZvLnZlcmlmaWNhdGlvbklkID09PSBjaGFsbGVuZ2VJZCkge1xuICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzID0gZW5mb3JjZXIudW5ibG9jayhhZ2VudE5hbWUsIGNoYWxsZW5nZUlkKTtcbiAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB1bmJsb2NrZWRBZ2VudCA9IGFnZW50TmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodW5ibG9ja2VkQWdlbnQpIHtcbiAgICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9TVUNDRUVERUQnLFxuICAgICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gc3VjY2VlZGVkOiBhZ2VudCAnJHt1bmJsb2NrZWRBZ2VudH0nIHVuYmxvY2tlZCAoY2hhbGxlbmdlOiAke2NoYWxsZW5nZUlkfSlgLFxuICAgICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgdW5ibG9ja2VkQWdlbnQgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdmVyaWZpZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHVuYmxvY2tlZEFnZW50LFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgVmVyaWZpY2F0aW9uIHN1Y2Nlc3NmdWwuIEFnZW50ICcke3VuYmxvY2tlZEFnZW50fScgaGFzIGJlZW4gdW5ibG9ja2VkLiBZb3UgbWF5IG5vdyByZXRyeSB0aGUgb3BlcmF0aW9uLmAsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvZGUgd2FzIHZhbGlkIGJ1dCBubyBhZ2VudCB3YXMgZm91bmQgYmxvY2tlZCB3aXRoIHRoaXMgY2hhbGxlbmdlSWRcbiAgICAgICAgLy8gKGNvdWxkIGJlIGEgc3RhbmRhbG9uZSB2ZXJpZmljYXRpb24sIG9yIGJsb2NrIHdhcyBhbHJlYWR5IGNsZWFyZWQpXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX1NVQ0NFRURFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgZGV0YWlsczogYFZlcmlmaWNhdGlvbiBzdWNjZWVkZWQgYnV0IG5vIGJsb2NrZWQgYWdlbnQgZm91bmQgZm9yIGNoYWxsZW5nZSAke2NoYWxsZW5nZUlkfWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdmVyaWZpZWQ6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogJ1ZlcmlmaWNhdGlvbiBzdWNjZXNzZnVsLiBZb3UgbWF5IG5vdyByZXRyeSB0aGUgb3BlcmF0aW9uLicsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2JlZXRsZWp1aWNlJzoge1xuICAgICAgICAvLyBJc3N1ZSAjNTAzOiBTYWZlLXRyaWdnZXIgdGhlIGZ1bGwgZGFuZ2VyIHpvbmUgdmVyaWZpY2F0aW9uIHBpcGVsaW5lLlxuICAgICAgICAvLyBDcmVhdGVzIGEgY2hhbGxlbmdlLCBzdG9yZXMgaXQsIGFuZCBibG9ja3MgYW4gYWdlbnQg4oCUIGFsbCBpbiBvbmUgY2FsbC5cbiAgICAgICAgLy8gSXNzdWUgIzUyMjogQ29kZSBpcyBzaG93biB2aWEgT1MgZGlhbG9nLCBORVZFUiByZXR1cm5lZCB0byB0aGUgTExNLlxuICAgICAgICBjb25zdCBhZ2VudE5hbWUgPSB0eXBlb2YgcGFyYW1zLmFnZW50X25hbWUgPT09ICdzdHJpbmcnICYmIHBhcmFtcy5hZ2VudF9uYW1lLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IHBhcmFtcy5hZ2VudF9uYW1lXG4gICAgICAgICAgOiAnYmVldGxlanVpY2UtdGVzdC1hZ2VudCc7XG5cbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLmhhbmRsZXJzLnZlcmlmaWNhdGlvblN0b3JlO1xuICAgICAgICBpZiAoIXN0b3JlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWZXJpZmljYXRpb25TdG9yZSBub3QgYXZhaWxhYmxlLiBFbnN1cmUgdGhlIHNlcnZlciBpcyBwcm9wZXJseSBjb25maWd1cmVkLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVuZm9yY2VyID0gdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXI7XG4gICAgICAgIGlmICghZW5mb3JjZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhbmdlclpvbmVFbmZvcmNlciBub3QgYXZhaWxhYmxlLiBFbnN1cmUgdGhlIHNlcnZlciBpcyBwcm9wZXJseSBjb25maWd1cmVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgQkVFVExFSlVJQ0VfQ0hBTExFTkdFX1RJTUVPVVRfTVMgPSA1ICogNjAgKiAxMDAwOyAvLyA1IG1pbnV0ZXMsIG1hdGNoZXMgZGVmYXVsdCB2ZXJpZmljYXRpb25UaW1lb3V0TWludXRlc1xuICAgICAgICBjb25zdCBjaGFsbGVuZ2VJZCA9IHJhbmRvbVVVSUQoKTtcbiAgICAgICAgY29uc3QgY29kZSA9IGdlbmVyYXRlRGlzcGxheUNvZGUoKTtcbiAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIEJFRVRMRUpVSUNFX0NIQUxMRU5HRV9USU1FT1VUX01TO1xuXG4gICAgICAgIHN0b3JlLnNldChjaGFsbGVuZ2VJZCwgeyBjb2RlLCBleHBpcmVzQXQsIHJlYXNvbjogJ0JlZXRsZWp1aWNlIHRlc3QgdHJpZ2dlciAoSXNzdWUgIzUwMyknIH0pO1xuICAgICAgICBlbmZvcmNlci5ibG9jayhhZ2VudE5hbWUsICdCZWV0bGVqdWljZSB0ZXN0IHRyaWdnZXInLCBbJ2JlZXRsZWp1aWNlX2JlZXRsZWp1aWNlX2JlZXRsZWp1aWNlJ10sIGNoYWxsZW5nZUlkKTtcblxuICAgICAgICAvLyBJc3N1ZSAjNTIyOiBTaG93IGNvZGUgdmlhIE9TIGRpYWxvZyAoZmlyZS1hbmQtZm9yZ2V0LCBub24tYmxvY2tpbmcpXG4gICAgICAgIC8vIFRoZSBjb2RlIGlzIE5FVkVSIGluY2x1ZGVkIGluIHRoZSBNQ1AgcmVzcG9uc2Ug4oCUIG9ubHkgdGhlIGh1bWFuIHNlZXMgaXQuXG4gICAgICAgIHRoaXMuaGFuZGxlcnMudmVyaWZpY2F0aW9uTm90aWZpZXI/LnNob3dDb2RlKGNvZGUsIGBBZ2VudCAnJHthZ2VudE5hbWV9JyByZXF1aXJlcyB2ZXJpZmljYXRpb24gKEJlZXRsZWp1aWNlIHRyaWdnZXIpYCk7XG5cbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdEQU5HRVJfWk9ORV9UUklHR0VSRUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci5iZWV0bGVqdWljZScsXG4gICAgICAgICAgZGV0YWlsczogYEJlZXRsZWp1aWNlIHRlc3QgdHJpZ2dlcjogYWdlbnQgJyR7YWdlbnROYW1lfScgYmxvY2tlZCB3aXRoIGNoYWxsZW5nZSAke2NoYWxsZW5nZUlkfWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQsIGFnZW50TmFtZSwgdGVzdFRyaWdnZXI6IHRydWUgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzUyMjogUmVzcG9uc2UgZGVsaWJlcmF0ZWx5IG9taXRzIGNvZGUgYW5kIGluc3RydWN0aW9ucy5cbiAgICAgICAgLy8gVGhlIGh1bWFuIHJlYWRzIHRoZSBjb2RlIGZyb20gdGhlIE9TIGRpYWxvZyBhbmQgdHlwZXMgaXQgaW50byBjaGF0LlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRyaWdnZXJlZDogdHJ1ZSxcbiAgICAgICAgICBjaGFsbGVuZ2VfaWQ6IGNoYWxsZW5nZUlkLFxuICAgICAgICAgIGFnZW50X25hbWU6IGFnZW50TmFtZSxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgaXMgbm93IGJsb2NrZWQuIEEgdmVyaWZpY2F0aW9uIGNvZGUgaGFzIGJlZW4gZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBUaGV5IG11c3QgdHlwZSBpdCB0byBwcm9jZWVkIHZpYSB2ZXJpZnlfY2hhbGxlbmdlLmAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3Blcm1pc3Npb25Qcm9tcHQnOiB7XG4gICAgICAgIC8vIElzc3VlICM2MjU6IEV2YWx1YXRlIENMSS1sZXZlbCBwZXJtaXNzaW9uIHByb21wdHMgZm9yIC0tcGVybWlzc2lvbi1wcm9tcHQtdG9vbFxuICAgICAgICAvLyBTZWU6IGRvY3MvYXJjaGl0ZWN0dXJlL1BFUk1JU1NJT05fUFJPTVBUX0FSQ0hJVEVDVFVSRS5tZCBmb3IgcHJvdG9jb2wgZGV0YWlsc1xuICAgICAgICBjb25zdCB0b29sTmFtZSA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICd0b29sX25hbWUnLFxuICAgICAgICAgICd0aGUgdG9vbCByZXF1ZXN0aW5nIHBlcm1pc3Npb24gKGUuZy4sIFwiQmFzaFwiLCBcIkVkaXRcIiwgXCJXcml0ZVwiKSdcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdG9vbElucHV0UmF3ID0gcGFyYW1zLmlucHV0O1xuICAgICAgICBpZiAoIXRvb2xJbnB1dFJhdyB8fCB0eXBlb2YgdG9vbElucHV0UmF3ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgbWVzc2FnZTogYE1pc3NpbmcgcmVxdWlyZWQgXCJpbnB1dFwiIHBhcmFtZXRlciBmb3IgJHt0b29sTmFtZX0gdG9vbCBldmFsdWF0aW9uLmAsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6ICdkYW5nZXJvdXMnLFxuICAgICAgICAgICAgICByZWFzb246ICdDYW5ub3QgZXZhbHVhdGUgcGVybWlzc2lvbiB3aXRob3V0IHRvb2wgaW5wdXQnLFxuICAgICAgICAgICAgICBzdGFnZTogJ2lucHV0X3ZhbGlkYXRpb24nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvb2xJbnB1dCA9IHRvb2xJbnB1dFJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgICAvLyBJc3N1ZSAjNjY1OiBWYWxpZGF0ZSBCYXNoIGNvbW1hbmRzIGhhdmUgYSBub24tZW1wdHkgY29tbWFuZCBzdHJpbmdcbiAgICAgICAgaWYgKHRvb2xOYW1lID09PSAnQmFzaCcpIHtcbiAgICAgICAgICBjb25zdCBjb21tYW5kID0gdHlwZW9mIHRvb2xJbnB1dC5jb21tYW5kID09PSAnc3RyaW5nJyA/IHRvb2xJbnB1dC5jb21tYW5kLnRyaW0oKSA6ICcnO1xuICAgICAgICAgIGlmICghY29tbWFuZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYE1pc3NpbmcgcmVxdWlyZWQgXCJjb21tYW5kXCIgaW4gaW5wdXQgZm9yIEJhc2ggdG9vbC4gQ2Fubm90IGV2YWx1YXRlIGFuIGVtcHR5IGNvbW1hbmQuYCxcbiAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgICByaXNrTGV2ZWw6ICdkYW5nZXJvdXMnLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogJ0VtcHR5IEJhc2ggY29tbWFuZCDigJQgZGVuaWVkIGJ5IGRlZmF1bHQgZm9yIHNhZmV0eScsXG4gICAgICAgICAgICAgICAgc3RhZ2U6ICdpbnB1dF92YWxpZGF0aW9uJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzY0NzogQ2FwdHVyZSBhZ2VudF9pZGVudGl0eSBmcm9tIENsYXVkZSBDb2RlIC0tcGVybWlzc2lvbi1wcm9tcHQtdG9vbFxuICAgICAgICBjb25zdCBhZ2VudElkZW50aXR5ID0gdHlwZW9mIHBhcmFtcy5hZ2VudF9pZGVudGl0eSA9PT0gJ3N0cmluZycgPyBwYXJhbXMuYWdlbnRfaWRlbnRpdHkgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSA0OiBSYXRlIGxpbWl0IGNoZWNrXG4gICAgICAgIGNvbnN0IHByb21wdFJhdGVTdGF0dXMgPSB0aGlzLnBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICAgICAgaWYgKCFwcm9tcHRSYXRlU3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFJhdGVMaW1pdERlbnkoJ3Blcm1pc3Npb25fcHJvbXB0JywgdG9vbE5hbWUsIHByb21wdFJhdGVTdGF0dXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGVybWlzc2lvblByb21wdExpbWl0ZXIuY29uc3VtZVRva2VuKCk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSA0OiBUcmFjayB0aGF0IHBlcm1pc3Npb25fcHJvbXB0IGlzIGFjdGl2ZSAoZmFpbC1zYWZlIGRldGVjdGlvbilcbiAgICAgICAgaWYgKCF0aGlzLmdhdGVrZWVwZXIuaXNQZXJtaXNzaW9uUHJvbXB0QWN0aXZlKSB7XG4gICAgICAgICAgdGhpcy5nYXRla2VlcGVyLm1hcmtQZXJtaXNzaW9uUHJvbXB0QWN0aXZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFnZSAxOiBTdGF0aWMgY2xhc3NpZmljYXRpb24gKGZhc3QgcGF0aClcbiAgICAgICAgY29uc3QgY2xhc3NpZmljYXRpb24gPSBjbGFzc2lmeVRvb2wodG9vbE5hbWUsIHRvb2xJbnB1dCk7XG5cbiAgICAgICAgaWYgKGNsYXNzaWZpY2F0aW9uLmJlaGF2aW9yID09PSAnYWxsb3cnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnYWxsb3cnLFxuICAgICAgICAgICAgdXBkYXRlZElucHV0OiB0b29sSW5wdXQsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAgIHN0YWdlOiAnc3RhdGljX2NsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xhc3NpZmljYXRpb24uYmVoYXZpb3IgPT09ICdkZW55Jykge1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdQRVJNSVNTSU9OX1BST01QVF9ERU5JRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIucGVybWlzc2lvblByb21wdCcsXG4gICAgICAgICAgICBkZXRhaWxzOiBgUGVybWlzc2lvbiBkZW5pZWQgZm9yICR7dG9vbE5hbWV9OiAke2NsYXNzaWZpY2F0aW9uLnJlYXNvbn1gLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgdG9vbE5hbWUsIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLCBhZ2VudElkZW50aXR5IH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnZGVueScsXG4gICAgICAgICAgICBtZXNzYWdlOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAuLi4oYWdlbnRJZGVudGl0eSAmJiB7IGFnZW50X2lkZW50aXR5OiBhZ2VudElkZW50aXR5IH0pLFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgICBzdGFnZTogJ3N0YXRpY19jbGFzc2lmaWNhdGlvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFnZSAyOiBBY3RpdmUgZWxlbWVudCBwb2xpY3kgY2hlY2tcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKCk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnREZWNpc2lvbiA9IGV2YWx1YXRlQ2xpVG9vbFBvbGljeSh0b29sTmFtZSwgdG9vbElucHV0LCBhY3RpdmVFbGVtZW50cyk7XG5cbiAgICAgICAgaWYgKGVsZW1lbnREZWNpc2lvbi5iZWhhdmlvciA9PT0gJ2RlbnknKSB7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1BFUk1JU1NJT05fUFJPTVBUX0RFTklFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci5wZXJtaXNzaW9uUHJvbXB0JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBQZXJtaXNzaW9uIGRlbmllZCBieSBlbGVtZW50IHBvbGljeSBmb3IgJHt0b29sTmFtZX1gLFxuICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgdG9vbE5hbWUsIG1lc3NhZ2U6IGVsZW1lbnREZWNpc2lvbi5tZXNzYWdlLCBhZ2VudElkZW50aXR5IH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnZGVueScsXG4gICAgICAgICAgICBtZXNzYWdlOiBlbGVtZW50RGVjaXNpb24ubWVzc2FnZSxcbiAgICAgICAgICAgIC4uLihhZ2VudElkZW50aXR5ICYmIHsgYWdlbnRfaWRlbnRpdHk6IGFnZW50SWRlbnRpdHkgfSksXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAgIHN0YWdlOiAnZWxlbWVudF9wb2xpY3knLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvbGljeUNvbnRleHQ6IGVsZW1lbnREZWNpc2lvbi5wb2xpY3lDb250ZXh0LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFnZSAyLjE6IFBhdHRlcm4tYmFzZWQgYXBwcm92YWwgKGNvbmZpcm1QYXR0ZXJucyDigJQgSXNzdWUgIzE2NjApXG4gICAgICAgIGlmIChlbGVtZW50RGVjaXNpb24uYmVoYXZpb3IgPT09ICdjb25maXJtJykge1xuICAgICAgICAgIGNvbnN0IHJpc2sgPSBhc3Nlc3NSaXNrKHRvb2xOYW1lLCB0b29sSW5wdXQsIGNsYXNzaWZpY2F0aW9uKTtcbiAgICAgICAgICBjb25zdCBwb2xpY3lTb3VyY2UgPSBlbGVtZW50RGVjaXNpb24uY29uZmlybVNvdXJjZSB8fCAndW5rbm93bic7XG5cbiAgICAgICAgICBjb25zdCBhcHByb3ZhbFJhdGVTdGF0dXMgPSB0aGlzLmNsaUFwcHJvdmFsTGltaXRlci5jaGVja0xpbWl0KCk7XG4gICAgICAgICAgaWYgKCFhcHByb3ZhbFJhdGVTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRSYXRlTGltaXREZW55KFxuICAgICAgICAgICAgICAnY2xpX2FwcHJvdmFsJywgdG9vbE5hbWUsIGFwcHJvdmFsUmF0ZVN0YXR1cyxcbiAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb24ucmlza0xldmVsLCBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNsaUFwcHJvdmFsTGltaXRlci5jb25zdW1lVG9rZW4oKTtcblxuICAgICAgICAgIGNvbnN0IGFwcHJvdmFsUG9saWN5ID0gcmVzb2x2ZUNsaUFwcHJvdmFsUG9saWN5KGFjdGl2ZUVsZW1lbnRzKTtcbiAgICAgICAgICBjb25zdCB0dGxNcyA9IGFwcHJvdmFsUG9saWN5LnR0bFNlY29uZHMgPyBhcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzICogMTAwMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLmdhdGVrZWVwZXIuY3JlYXRlQ2xpQXBwcm92YWxSZXF1ZXN0KFxuICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICB0b29sSW5wdXQsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICByaXNrLnNjb3JlLFxuICAgICAgICAgICAgcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICBlbGVtZW50RGVjaXNpb24ubWVzc2FnZSB8fCBgQ29uZmlybWF0aW9uIHJlcXVpcmVkIGJ5IGVsZW1lbnQgcG9saWN5YCxcbiAgICAgICAgICAgIHBvbGljeVNvdXJjZSxcbiAgICAgICAgICAgIHR0bE1zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBSZXF1aXJlcyBodW1hbiBhcHByb3ZhbC4gUmVxdWVzdCBJRDogJHtyZXF1ZXN0SWR9LiBDYWxsIGFwcHJvdmVfY2xpX3Blcm1pc3Npb24gdG8gYXV0aG9yaXplLmAsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAgIHN0YWdlOiAnYXBwcm92YWxfcmVxdWlyZWQnLFxuICAgICAgICAgICAgICByaXNrU2NvcmU6IHJpc2suc2NvcmUsXG4gICAgICAgICAgICAgIGlycmV2ZXJzaWJsZTogcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwcm92YWxSZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByaXNrU2NvcmU6IHJpc2suc2NvcmUsXG4gICAgICAgICAgICAgIGlycmV2ZXJzaWJsZTogcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICAgIHJlYXNvbjogZWxlbWVudERlY2lzaW9uLm1lc3NhZ2UgfHwgJ0NvbmZpcm1hdGlvbiByZXF1aXJlZCBieSBlbGVtZW50IHBvbGljeScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9saWN5Q29udGV4dDogZWxlbWVudERlY2lzaW9uLnBvbGljeUNvbnRleHQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDIuNTogQ2hlY2sgZXhpc3RpbmcgQ0xJIGFwcHJvdmFsIChJc3N1ZSAjNjI1IFBoYXNlIDMpXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQXBwcm92YWwgPSB0aGlzLmdhdGVrZWVwZXIuY2hlY2tDbGlBcHByb3ZhbCh0b29sTmFtZSwgdG9vbElucHV0KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQXBwcm92YWwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdhbGxvdycsXG4gICAgICAgICAgICB1cGRhdGVkSW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdjbGlfYXBwcm92YWwnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcHJvdmFsQ29udGV4dDoge1xuICAgICAgICAgICAgICByZXF1ZXN0SWQ6IGV4aXN0aW5nQXBwcm92YWwucmVxdWVzdElkLFxuICAgICAgICAgICAgICBzY29wZTogZXhpc3RpbmdBcHByb3ZhbC5zY29wZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb2xpY3lDb250ZXh0OiBlbGVtZW50RGVjaXNpb24ucG9saWN5Q29udGV4dCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhZ2UgMi43NTogQXBwcm92YWwtcmVxdWlyZWQgcm91dGluZyAoSXNzdWUgIzYyNSBQaGFzZSAzKVxuICAgICAgICBjb25zdCBhcHByb3ZhbFBvbGljeSA9IHJlc29sdmVDbGlBcHByb3ZhbFBvbGljeShhY3RpdmVFbGVtZW50cyk7XG4gICAgICAgIGlmIChhcHByb3ZhbFBvbGljeS5yZXF1aXJlQXBwcm92YWw/LmluY2x1ZGVzKGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCBhcyAnbW9kZXJhdGUnIHwgJ2Rhbmdlcm91cycpKSB7XG4gICAgICAgICAgY29uc3QgcmlzayA9IGFzc2Vzc1Jpc2sodG9vbE5hbWUsIHRvb2xJbnB1dCwgY2xhc3NpZmljYXRpb24pO1xuICAgICAgICAgIGNvbnN0IHBvbGljeVNvdXJjZSA9IGFjdGl2ZUVsZW1lbnRzXG4gICAgICAgICAgICAuZmlsdGVyKGVsID0+IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyPy5leHRlcm5hbFJlc3RyaWN0aW9ucz8uYXBwcm92YWxQb2xpY3k/LnJlcXVpcmVBcHByb3ZhbD8ubGVuZ3RoKVxuICAgICAgICAgICAgLm1hcChlbCA9PiBgJHtlbC50eXBlfToke2VsLm5hbWV9YClcbiAgICAgICAgICAgIC5qb2luKCcsICcpIHx8ICdlbnY6RE9MTEhPVVNFX0NMSV9BUFBST1ZBTF9QT0xJQ1knO1xuXG4gICAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSA0OiBSYXRlIGxpbWl0IENMSSBhcHByb3ZhbCBjcmVhdGlvblxuICAgICAgICAgIGNvbnN0IGFwcHJvdmFsUmF0ZVN0YXR1cyA9IHRoaXMuY2xpQXBwcm92YWxMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICAgICAgICBpZiAoIWFwcHJvdmFsUmF0ZVN0YXR1cy5hbGxvd2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFJhdGVMaW1pdERlbnkoXG4gICAgICAgICAgICAgICdjbGlfYXBwcm92YWwnLCB0b29sTmFtZSwgYXBwcm92YWxSYXRlU3RhdHVzLFxuICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsIGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2xpQXBwcm92YWxMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuXG4gICAgICAgICAgY29uc3QgdHRsTXMgPSBhcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzID8gYXBwcm92YWxQb2xpY3kudHRsU2Vjb25kcyAqIDEwMDAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5nYXRla2VlcGVyLmNyZWF0ZUNsaUFwcHJvdmFsUmVxdWVzdChcbiAgICAgICAgICAgIHRvb2xOYW1lLFxuICAgICAgICAgICAgdG9vbElucHV0LFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgcmlzay5zY29yZSxcbiAgICAgICAgICAgIHJpc2suaXJyZXZlcnNpYmxlLFxuICAgICAgICAgICAgYFRvb2wgJyR7dG9vbE5hbWV9JyBjbGFzc2lmaWVkIGFzICR7Y2xhc3NpZmljYXRpb24ucmlza0xldmVsfTogJHtjbGFzc2lmaWNhdGlvbi5yZWFzb259YCxcbiAgICAgICAgICAgIHBvbGljeVNvdXJjZSxcbiAgICAgICAgICAgIHR0bE1zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGBSZXF1aXJlcyBodW1hbiBhcHByb3ZhbC4gUmVxdWVzdCBJRDogJHtyZXF1ZXN0SWR9LiBDYWxsIGFwcHJvdmVfY2xpX3Blcm1pc3Npb24gdG8gYXV0aG9yaXplLmAsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAgIHN0YWdlOiAnYXBwcm92YWxfcmVxdWlyZWQnLFxuICAgICAgICAgICAgICByaXNrU2NvcmU6IHJpc2suc2NvcmUsXG4gICAgICAgICAgICAgIGlycmV2ZXJzaWJsZTogcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwcm92YWxSZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByaXNrU2NvcmU6IHJpc2suc2NvcmUsXG4gICAgICAgICAgICAgIGlycmV2ZXJzaWJsZTogcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvbGljeUNvbnRleHQ6IGVsZW1lbnREZWNpc2lvbi5wb2xpY3lDb250ZXh0LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFnZSAzOiBEZWZhdWx0IOKAlCBhbGxvdyAocGVybWlzc2l2ZSlcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBiZWhhdmlvcjogJ2FsbG93JyxcbiAgICAgICAgICB1cGRhdGVkSW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgIHN0YWdlOiAnZGVmYXVsdCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwb2xpY3lDb250ZXh0OiBlbGVtZW50RGVjaXNpb24ucG9saWN5Q29udGV4dCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZXZhbHVhdGVQZXJtaXNzaW9uJzoge1xuICAgICAgICAvLyBFdmFsdWF0ZSBDTEkgcGVybWlzc2lvbiBmb3IgUHJlVG9vbFVzZSBob29rcyAoYWxsIHBsYXRmb3JtcylcbiAgICAgICAgY29uc3QgeyBldmFsdWF0ZVBlcm1pc3Npb24gfSA9IGF3YWl0IGltcG9ydCgnLi9ldmFsdWF0ZVBlcm1pc3Npb24uanMnKTtcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlUGVybWlzc2lvbihwYXJhbXMsIHtcbiAgICAgICAgICBwZXJtaXNzaW9uUHJvbXB0TGltaXRlcjogdGhpcy5wZXJtaXNzaW9uUHJvbXB0TGltaXRlcixcbiAgICAgICAgICBjbGFzc2lmeVRvb2wsXG4gICAgICAgICAgZXZhbHVhdGVDbGlUb29sUG9saWN5LFxuICAgICAgICAgIGdldEFjdGl2ZUVsZW1lbnRzOiAoc2Vzc2lvbklkPzogc3RyaW5nKSA9PiB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKHNlc3Npb25JZCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRFZmZlY3RpdmVDbGlQb2xpY2llcyc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSAyOiBHZXQgZWZmZWN0aXZlIENMSSBwZXJtaXNzaW9uIHBvbGljaWVzXG4gICAgICAgIGNvbnN0IHRvb2xOYW1lID0gcGFyYW1zLnRvb2xfbmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHRvb2xJbnB1dCA9IChwYXJhbXMudG9vbF9pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPz8ge307XG4gICAgICAgIGNvbnN0IHJlcG9ydFNlc3Npb25JZCA9IHR5cGVvZiBwYXJhbXMuc2Vzc2lvbl9pZCA9PT0gJ3N0cmluZycgPyBwYXJhbXMuc2Vzc2lvbl9pZCA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcmVwb3J0aW5nU2NvcGUgPSBwYXJhbXMucmVwb3J0aW5nX3Njb3BlID09PSAnZGFzaGJvYXJkJztcblxuICAgICAgICAvLyAxLiBHZXQgYWxsIGFjdGl2ZSBlbGVtZW50c1xuICAgICAgICBjb25zdCBwb2xpY3lFbGVtZW50cyA9IHJlcG9ydGluZ1Njb3BlICYmICF0b29sTmFtZVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5nZXRQb2xpY3lSZXBvcnRFbGVtZW50cyhyZXBvcnRTZXNzaW9uSWQpXG4gICAgICAgICAgOiBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKCk7XG5cbiAgICAgICAgLy8gMi4gRXh0cmFjdCBleHRlcm5hbFJlc3RyaWN0aW9ucyBmcm9tIGVhY2ggZWxlbWVudFxuICAgICAgICBjb25zdCBlbGVtZW50UG9saWNpZXMgPSBwb2xpY3lFbGVtZW50cy5tYXAoZWwgPT4gKHtcbiAgICAgICAgICB0eXBlOiBlbC50eXBlLFxuICAgICAgICAgIG5hbWU6IGVsLm5hbWUsXG4gICAgICAgICAgYWxsb3dQYXR0ZXJuczogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5hbGxvd1BhdHRlcm5zID8/IFtdLFxuICAgICAgICAgIGNvbmZpcm1QYXR0ZXJuczogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5jb25maXJtUGF0dGVybnMgPz8gW10sXG4gICAgICAgICAgZGVueVBhdHRlcm5zOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uZXh0ZXJuYWxSZXN0cmljdGlvbnM/LmRlbnlQYXR0ZXJucyA/PyBbXSxcbiAgICAgICAgICBhbGxvd09wZXJhdGlvbnM6IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyPy5hbGxvdyA/PyBbXSxcbiAgICAgICAgICBjb25maXJtT3BlcmF0aW9uczogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmNvbmZpcm0gPz8gW10sXG4gICAgICAgICAgZGVueU9wZXJhdGlvbnM6IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyPy5kZW55ID8/IFtdLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uZXh0ZXJuYWxSZXN0cmljdGlvbnM/LmRlc2NyaXB0aW9uID8/IG51bGwsXG4gICAgICAgICAgc2Vzc2lvbklkczogKGVsLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uc2Vzc2lvbklkcyA/PyB1bmRlZmluZWQsXG4gICAgICAgIH0pKTtcblxuICAgICAgICAvLyAzLiBCdWlsZCBjb21iaW5lZCB2aWV3XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkQWxsb3cgPSBlbGVtZW50UG9saWNpZXMuZmxhdE1hcChwID0+IHAuYWxsb3dQYXR0ZXJucyk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkQ29uZmlybSA9IGVsZW1lbnRQb2xpY2llcy5mbGF0TWFwKHAgPT4gcC5jb25maXJtUGF0dGVybnMpO1xuICAgICAgICBjb25zdCBjb21iaW5lZERlbnkgPSBlbGVtZW50UG9saWNpZXMuZmxhdE1hcChwID0+IHAuZGVueVBhdHRlcm5zKTtcbiAgICAgICAgY29uc3QgY29tYmluZWRBbGxvd09wZXJhdGlvbnMgPSBlbGVtZW50UG9saWNpZXMuZmxhdE1hcChwID0+IHAuYWxsb3dPcGVyYXRpb25zKTtcbiAgICAgICAgY29uc3QgY29tYmluZWRDb25maXJtT3BlcmF0aW9ucyA9IGVsZW1lbnRQb2xpY2llcy5mbGF0TWFwKHAgPT4gcC5jb25maXJtT3BlcmF0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkRGVueU9wZXJhdGlvbnMgPSBlbGVtZW50UG9saWNpZXMuZmxhdE1hcChwID0+IHAuZGVueU9wZXJhdGlvbnMpO1xuICAgICAgICBjb25zdCBoYXNBbGxvd2xpc3QgPSBjb21iaW5lZEFsbG93Lmxlbmd0aCA+IDAgfHwgY29tYmluZWRBbGxvd09wZXJhdGlvbnMubGVuZ3RoID4gMDtcblxuICAgICAgICAvLyA0LiBJZiB0b29sX25hbWUgcHJvdmlkZWQsIGV2YWx1YXRlIGl0IGFnYWluc3QgY3VycmVudCBwb2xpY2llc1xuICAgICAgICBsZXQgZXZhbHVhdGlvbjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0b29sTmFtZSkge1xuICAgICAgICAgIGNvbnN0IHRvb2xDbGFzc2lmaWNhdGlvbiA9IGNsYXNzaWZ5VG9vbCh0b29sTmFtZSwgdG9vbElucHV0KTtcbiAgICAgICAgICBjb25zdCBwb2xpY3lSZXN1bHQgPSB0b29sQ2xhc3NpZmljYXRpb24uYmVoYXZpb3IgPT09ICdldmFsdWF0ZSdcbiAgICAgICAgICAgID8gZXZhbHVhdGVDbGlUb29sUG9saWN5KHRvb2xOYW1lLCB0b29sSW5wdXQsIHBvbGljeUVsZW1lbnRzKVxuICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgICAgZXZhbHVhdGlvbiA9IHtcbiAgICAgICAgICAgIHRvb2xfbmFtZTogdG9vbE5hbWUsXG4gICAgICAgICAgICB0b29sX2lucHV0OiBPYmplY3Qua2V5cyh0b29sSW5wdXQpLmxlbmd0aCA+IDAgPyB0b29sSW5wdXQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBzdGF0aWNDbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IHRvb2xDbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIGJlaGF2aW9yOiB0b29sQ2xhc3NpZmljYXRpb24uYmVoYXZpb3IsXG4gICAgICAgICAgICAgIHJlYXNvbjogdG9vbENsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbGVtZW50UG9saWN5UmVzdWx0OiBwb2xpY3lSZXN1bHQgPyB7XG4gICAgICAgICAgICAgIGJlaGF2aW9yOiBwb2xpY3lSZXN1bHQuYmVoYXZpb3IsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHBvbGljeVJlc3VsdC5tZXNzYWdlLFxuICAgICAgICAgICAgICBwb2xpY3lDb250ZXh0OiBwb2xpY3lSZXN1bHQucG9saWN5Q29udGV4dCxcbiAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBmaW5hbEJlaGF2aW9yOiBwb2xpY3lSZXN1bHQ/LmJlaGF2aW9yID09PSAnZGVueScgPyAnZGVueSdcbiAgICAgICAgICAgICAgOiB0b29sQ2xhc3NpZmljYXRpb24uYmVoYXZpb3IgPT09ICdkZW55JyA/ICdkZW55JyA6ICdhbGxvdycsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIEZhaWwtc2FmZSBkZXRlY3Rpb24gKElzc3VlICM2MjUgUGhhc2UgNClcbiAgICAgICAgY29uc3QgcGVybWlzc2lvblByb21wdEFjdGl2ZSA9IHRoaXMuZ2F0ZWtlZXBlci5pc1Blcm1pc3Npb25Qcm9tcHRBY3RpdmU7XG4gICAgICAgIGNvbnN0IGhvb2tTdGF0dXMgPSBnZXRQZXJtaXNzaW9uSG9va1N0YXR1cygpO1xuICAgICAgICBjb25zdCBob29rSW5zdGFsbGVkID0gaG9va1N0YXR1cy5pbnN0YWxsZWQ7XG4gICAgICAgIGNvbnN0IGVuZm9yY2VtZW50UmVhZHkgPSBwZXJtaXNzaW9uUHJvbXB0QWN0aXZlIHx8IGhvb2tJbnN0YWxsZWQ7XG4gICAgICAgIGNvbnN0IGhhc0NsaVJlc3RyaWN0aW9ucyA9IGNvbWJpbmVkQWxsb3cubGVuZ3RoID4gMCB8fCBjb21iaW5lZERlbnkubGVuZ3RoID4gMCB8fCBjb21iaW5lZENvbmZpcm0ubGVuZ3RoID4gMDtcbiAgICAgICAgY29uc3QgaGFzT3BlcmF0aW9uUmVzdHJpY3Rpb25zID0gY29tYmluZWRBbGxvd09wZXJhdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgIHx8IGNvbWJpbmVkRGVueU9wZXJhdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgIHx8IGNvbWJpbmVkQ29uZmlybU9wZXJhdGlvbnMubGVuZ3RoID4gMDtcbiAgICAgICAgbGV0IGFkdmlzb3J5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChoYXNDbGlSZXN0cmljdGlvbnMpIHtcbiAgICAgICAgICBpZiAoIWVuZm9yY2VtZW50UmVhZHkpIHtcbiAgICAgICAgICAgIGFkdmlzb3J5ID0gJ1BvbGljaWVzIGFyZSBsb2FkZWQgYnV0IE5PVCBlbmZvcmNlZC4gTm8gcGVybWlzc2lvbiBob29rIGRldGVjdGVkIGFuZCBwZXJtaXNzaW9uX3Byb21wdCBoYXMgbm90IGJlZW4gY2FsbGVkLiBSdW4gb3Blbl9zZXR1cCBhbmQgcmVpbnN0YWxsLCBvciBsYXVuY2ggdGhlIENMSSBjbGllbnQgd2l0aCAtLXBlcm1pc3Npb24tcHJvbXB0LXRvb2wuJztcbiAgICAgICAgICB9IGVsc2UgaWYgKGhvb2tJbnN0YWxsZWQgJiYgIXBlcm1pc3Npb25Qcm9tcHRBY3RpdmUpIHtcbiAgICAgICAgICAgIGFkdmlzb3J5ID0gYFBvbGljaWVzIGFyZSBsb2FkZWQuIFBlcm1pc3Npb24gaG9vayBkZXRlY3RlZCBmb3IgJHtob29rU3RhdHVzLmhvc3QgPz8gJ2Egc3VwcG9ydGVkIGNsaWVudCd9LCBzbyBlbmZvcmNlbWVudCBkZXBlbmRzIG9uIHVzaW5nIHRoYXQgY2xpZW50IGNvbmZpZ3VyYXRpb24uYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzT3BlcmF0aW9uUmVzdHJpY3Rpb25zKSB7XG4gICAgICAgICAgYWR2aXNvcnkgPSAnTUNQLUFRTCBvcGVyYXRpb24gcG9saWNpZXMgYXJlIGFjdGl2ZSBmb3IgRG9sbGhvdXNlIGFjdGlvbnMgaW4gdGhpcyBzZXNzaW9uLic7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRDb3VudDogcG9saWN5RWxlbWVudHMubGVuZ3RoLFxuICAgICAgICAgIGhhc0FsbG93bGlzdCxcbiAgICAgICAgICBlbGVtZW50czogZWxlbWVudFBvbGljaWVzLFxuICAgICAgICAgIGNvbWJpbmVkQWxsb3dQYXR0ZXJuczogY29tYmluZWRBbGxvdyxcbiAgICAgICAgICBjb21iaW5lZENvbmZpcm1QYXR0ZXJuczogY29tYmluZWRDb25maXJtLFxuICAgICAgICAgIGNvbWJpbmVkRGVueVBhdHRlcm5zOiBjb21iaW5lZERlbnksXG4gICAgICAgICAgY29tYmluZWRBbGxvd09wZXJhdGlvbnMsXG4gICAgICAgICAgY29tYmluZWRDb25maXJtT3BlcmF0aW9ucyxcbiAgICAgICAgICBjb21iaW5lZERlbnlPcGVyYXRpb25zLFxuICAgICAgICAgIGV2YWx1YXRpb24sXG4gICAgICAgICAgcGVybWlzc2lvblByb21wdEFjdGl2ZSxcbiAgICAgICAgICBob29rSW5zdGFsbGVkLFxuICAgICAgICAgIGVuZm9yY2VtZW50UmVhZHksXG4gICAgICAgICAgaG9va0hvc3Q6IGhvb2tTdGF0dXMuaG9zdCxcbiAgICAgICAgICBhZHZpc29yeSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnYXBwcm92ZUNsaVBlcm1pc3Npb24nOiB7XG4gICAgICAgIC8vIElzc3VlICM2MjUgUGhhc2UgMzogQXBwcm92ZSBhIHBlbmRpbmcgQ0xJIHRvb2wgcGVybWlzc2lvbiByZXF1ZXN0XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICdyZXF1ZXN0X2lkJyxcbiAgICAgICAgICAndGhlIGFwcHJvdmFsIHJlcXVlc3QgSUQgZnJvbSBwZXJtaXNzaW9uX3Byb21wdCBkZW55IHJlc3BvbnNlIChmb3JtYXQ6IGNsaS08VVVJRD4pJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBzY29wZSA9IChwYXJhbXMuc2NvcGUgYXMgQ2xpQXBwcm92YWxTY29wZSkgPz8gJ3NpbmdsZSc7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgc2NvcGVcbiAgICAgICAgaWYgKHNjb3BlICE9PSAnc2luZ2xlJyAmJiBzY29wZSAhPT0gJ3Rvb2xfc2Vzc2lvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2NvcGUgXCIke3Njb3BlfVwiLiBNdXN0IGJlIFwic2luZ2xlXCIgb3IgXCJ0b29sX3Nlc3Npb25cIi5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuZ2F0ZWtlZXBlci5hcHByb3ZlQ2xpUmVxdWVzdChyZXF1ZXN0SWQsIHNjb3BlKTtcbiAgICAgICAgaWYgKCFyZWNvcmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBlbmRpbmcgYXBwcm92YWwgZm9yIFwiJHtyZXF1ZXN0SWR9XCIuIEl0IG1heSBoYXZlIGV4cGlyZWQgb3IgYWxyZWFkeSBiZWVuIGFwcHJvdmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhcHByb3ZlZDogdHJ1ZSxcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgdG9vbE5hbWU6IHJlY29yZC50b29sTmFtZSxcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICBtZXNzYWdlOiBzY29wZSA9PT0gJ3Rvb2xfc2Vzc2lvbidcbiAgICAgICAgICAgID8gYEFwcHJvdmVkIGZvciBhbGwgdXNlcyBvZiAnJHtyZWNvcmQudG9vbE5hbWV9JyB0aGlzIHNlc3Npb24uYFxuICAgICAgICAgICAgOiBgQXBwcm92ZWQgc2luZ2xlIHVzZSBvZiAnJHtyZWNvcmQudG9vbE5hbWV9Jy4gUmV0cnkgdGhlIHRvb2wgY2FsbCBub3cuYCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZ2V0UGVuZGluZ0NsaUFwcHJvdmFscyc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSAzOiBHZXQgYWxsIHBlbmRpbmcgQ0xJIHRvb2wgYXBwcm92YWwgcmVxdWVzdHNcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMuZ2F0ZWtlZXBlci5nZXRQZW5kaW5nQ2xpQXBwcm92YWxzKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGVuZGluZyxcbiAgICAgICAgICBjb3VudDogcGVuZGluZy5sZW5ndGgsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBHYXRla2VlcGVyIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIExvZ2dpbmcgb3BlcmF0aW9ucyAoSXNzdWUgIzUyOCAtIENSVURFIG1pZ3JhdGlvbilcbiAgICpcbiAgICogUm91dGVzIHF1ZXJ5X2xvZ3MgdGhyb3VnaCB0aGUgdW5pZmllZCBDUlVERSBwaXBlbGluZSBpbnN0ZWFkIG9mXG4gICAqIGEgc3RhbmRhbG9uZSBNQ1AgdG9vbCwgcHJvdmlkaW5nIG9wZXJhdGlvbiByb3V0aW5nLCBnYXRla2VlcGVyXG4gICAqIHBvbGljeSBlbmZvcmNlbWVudCwgYW5kIHN0cnVjdHVyZWQgcmVzcG9uc2UgZm9ybWF0LlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaExvZ2dpbmcoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB1bmtub3duIHtcbiAgICBpZiAoIXRoaXMuaGFuZGxlcnMubWVtb3J5U2luaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnlMb2dTaW5rIG5vdCBhdmFpbGFibGUg4oCUIGxvZ2dpbmcgcXVlcnkgcmVxdWlyZXMgbWVtb3J5IHNpbmsnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAncXVlcnknOiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB2YWxpZGF0ZUxvZ1F1ZXJ5UGFyYW1zKHBhcmFtcyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaGFuZGxlcnMubWVtb3J5U2luay5xdWVyeShvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHsgX3R5cGU6ICdMb2dRdWVyeVJlc3VsdCcsIC4uLnJlc3VsdCB9O1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIExvZ2dpbmcgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggTWV0cmljcyBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBSb3V0ZXMgcXVlcnlfbWV0cmljcyB0aHJvdWdoIHRoZSB1bmlmaWVkIENSVURFIHBpcGVsaW5lLCBwcm92aWRpbmdcbiAgICogb3BlcmF0aW9uIHJvdXRpbmcsIGdhdGVrZWVwZXIgcG9saWN5IGVuZm9yY2VtZW50LCBhbmQgc3RydWN0dXJlZCByZXNwb25zZSBmb3JtYXQuXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoTWV0cmljcyhcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHVua25vd24ge1xuICAgIGlmICghdGhpcy5oYW5kbGVycy5tZXRyaWNzU2luaykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX3R5cGU6ICdNZXRyaWNRdWVyeVJlc3VsdCcsXG4gICAgICAgIHNuYXBzaG90czogW10sXG4gICAgICAgIHRvdGFsOiAwLFxuICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogJ01ldHJpY3MgY29sbGVjdGlvbiBpcyBub3QgZW5hYmxlZC4gU2V0IERPTExIT1VTRV9NRVRSSUNTX0VOQUJMRUQ9dHJ1ZSB0byBhY3RpdmF0ZS4nLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSAncXVlcnknKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdmFsaWRhdGVNZXRyaWNRdWVyeVBhcmFtcyhwYXJhbXMpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oYW5kbGVycy5tZXRyaWNzU2luay5xdWVyeShvcHRpb25zKTtcbiAgICAgIHJldHVybiB7IF90eXBlOiAnTWV0cmljUXVlcnlSZXN1bHQnLCAuLi5yZXN1bHQgfTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIE1ldHJpY3MgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBCcm93c2VyIG9wZXJhdGlvbnMgKElzc3VlICM3NzQ6IG9wZW4gcG9ydGZvbGlvIGJyb3dzZXIpXG4gICAqL1xuICAvKipcbiAgICogRGlzcGF0Y2ggQnJvd3NlciBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBTdGFydHMgdGhlIHBvcnRmb2xpbyB3ZWIgc2VydmVyIChpZiBub3QgcnVubmluZykgYW5kIG9wZW5zIHRoZVxuICAgKiBzeXN0ZW0gYnJvd3Nlci4gUmV0dXJucyB0aGUgVVJMIGFuZCBhbnkgd2FybmluZ3MgaWYgdGhlIGJyb3dzZXJcbiAgICogY291bGQgbm90IGJlIG9wZW5lZCBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIGJyb3dzZXIgbWV0aG9kIHRvIGRpc3BhdGNoICgnb3BlbicpXG4gICAqIEByZXR1cm5zIE1DUCByZXNwb25zZSB3aXRoIFVSTCBhbmQgb3B0aW9uYWwgd2FybmluZ1xuICAgKiBAc2VlIElzc3VlICM3NzRcbiAgICovXG4gIC8qKlxuICAgKiBFeHRyYWN0IFVSTCBxdWVyeSBwYXJhbWV0ZXJzIGZyb20gb3BlcmF0aW9uIHBhcmFtcy5cbiAgICogU2VyaWFsaXplcyBhbGwgcGFyYW1zIGV4Y2VwdCAndGFiJyBhcyBzdHJpbmcga2V5LXZhbHVlIHBhaXJzLlxuICAgKiBAc2VlIElzc3VlICMxNzY1IC0gVVJMIHBhcmFtZXRlciBzdXBwb3J0IGZvciBwb3J0Zm9saW8gYnJvd3NlclxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdFVybFBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdXJsUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1zKSkge1xuICAgICAgaWYgKGtleSA9PT0gJ3RhYicgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycpIGNvbnRpbnVlO1xuICAgICAgdXJsUGFyYW1zW2tleV0gPSBNQ1BBUUxIYW5kbGVyLnNlcmlhbGl6ZVBhcmFtVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXModXJsUGFyYW1zKS5sZW5ndGggPiAwID8gdXJsUGFyYW1zIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFNlcmlhbGl6ZSBhIHBhcmFtIHZhbHVlIHRvIGEgVVJMLXNhZmUgc3RyaW5nLiAqL1xuICBwcml2YXRlIHN0YXRpYyBzZXJpYWxpemVQYXJhbVZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEJyb3dzZXIobWV0aG9kOiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKG1ldGhvZCAhPT0gJ29wZW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQnJvd3NlciBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgb3BlblBvcnRmb2xpb0Jyb3dzZXIgfSA9IGF3YWl0IGltcG9ydCgnLi4vLi4vd2ViL3NlcnZlci5qcycpO1xuICAgIGNvbnN0IHsgaG9tZWRpciB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOm9zJyk7XG4gICAgY29uc3QgcG9ydGZvbGlvRGlyID0gaG9tZWRpcigpICsgJy8uZG9sbGhvdXNlL3BvcnRmb2xpbyc7XG5cbiAgICBjb25zdCB0YWIgPSB0eXBlb2YgcGFyYW1zPy50YWIgPT09ICdzdHJpbmcnID8gcGFyYW1zLnRhYiA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB1cmxQYXJhbXMgPSBwYXJhbXMgPyBNQ1BBUUxIYW5kbGVyLmV4dHJhY3RVcmxQYXJhbXMocGFyYW1zKSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIElzc3VlICM3OTY6IFBhc3MgTUNQQVFMSGFuZGxlciB0byB3ZWIgc2VydmVyIGZvciBnYXRld2F5IHJvdXRpbmcuXG4gICAgLy8gSXNzdWUgIzE4NTA6IFBhc3Mgc2lua3Mgc28gZmFsbGJhY2sgc2VydmVyIGhhcyBmdWxsIGNvbnNvbGUgZnVuY3Rpb25hbGl0eS5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcGVuUG9ydGZvbGlvQnJvd3Nlcih7XG4gICAgICBwb3J0Zm9saW9EaXIsXG4gICAgICBtY3BBcWxIYW5kbGVyOiB0aGlzLFxuICAgICAgdGFiLFxuICAgICAgdXJsUGFyYW1zLFxuICAgICAgbWVtb3J5U2luazogdGhpcy5oYW5kbGVycy5tZW1vcnlTaW5rLFxuICAgICAgbWV0cmljc1Npbms6IHRoaXMuaGFuZGxlcnMubWV0cmljc1NpbmssXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGF0dXMgPSByZXN1bHQuYWxyZWFkeVJ1bm5pbmcgPyAnYWxyZWFkeSBydW5uaW5nJyA6ICdzdGFydGVkJztcbiAgICBjb25zdCBicm93c2VyU3RhdHVzID0gcmVzdWx0LmJyb3dzZXJPcGVuZWQgPyAnb3BlbmVkJyA6ICdjb3VsZCBub3Qgb3BlbiBhdXRvbWF0aWNhbGx5JztcbiAgICBjb25zdCB3YXJuaW5nID0gcmVzdWx0Lndhcm5pbmcgPyBgXFxuXFxu4pqg77iPICR7cmVzdWx0Lndhcm5pbmd9YCA6ICcnO1xuICAgIGNvbnN0IHRhYk5vdGUgPSB0YWIgPyBgICgke3RhYn0gdGFiKWAgOiAnJztcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIHRleHQ6IGBQb3J0Zm9saW8gYnJvd3NlciAke3N0YXR1c30gYXQgJHtyZXN1bHQudXJsfSR7dGFiTm90ZX0g4oCUIGJyb3dzZXIgJHticm93c2VyU3RhdHVzfSR7d2FybmluZ31gLFxuICAgICAgfV0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rIHVwIHRoZSBDUlVERSBlbmRwb2ludCBmb3IgYSBnaXZlbiBvcGVyYXRpb24gbmFtZS5cbiAgICogVXNlZCBieSBkaXNwYXRjaEdhdGVrZWVwZXIgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGVuZHBvaW50IGNvbnRleHQuXG4gICAqL1xuICBwcml2YXRlIGdldEVuZHBvaW50Rm9yT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nKTogQ1JVREVuZHBvaW50IHtcbiAgICBjb25zdCByb3V0ZSA9IGdldFJvdXRlKG9wZXJhdGlvbik7XG4gICAgaWYgKCFyb3V0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG9wZXJhdGlvbjogJHtvcGVyYXRpb259YCk7XG4gICAgfVxuICAgIHJldHVybiByb3V0ZS5lbmRwb2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgb2YgYW4gb3BlcmF0aW9uIGZvciBjb25maXJtYXRpb24gcHJvbXB0cy5cbiAgICogSXNzdWUgIzc0ODogTmF0dXJhbCBsYW5ndWFnZSBjb25maXJtYXRpb24gc3VtbWFyaWVzLlxuICAgKlxuICAgKiBUcmFuc2xhdGVzIHJhdyBvcGVyYXRpb24gbmFtZXMgYW5kIHBhcmFtcyBpbnRvIHBsYWluIGxhbmd1YWdlIHNvIHVzZXJzXG4gICAqIHVuZGVyc3RhbmQgd2hhdCB0aGV5J3JlIGFwcHJvdmluZyB3aXRob3V0IHBhcnNpbmcgbWFjaGluZS1yZWFkYWJsZSBwYXlsb2Fkcy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRPcGVyYXRpb25TdW1tYXJ5KFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlPzogc3RyaW5nLFxuICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgcCA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb25zdCBuYW1lID0gKHAuZWxlbWVudF9uYW1lIHx8IHAubmFtZSB8fCAnJykgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHR5cGVMYWJlbCA9IGVsZW1lbnRUeXBlIHx8IChwLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcpIHx8ICdlbGVtZW50JztcblxuICAgIC8vIE9wZXJhdGlvbi1zcGVjaWZpYyBuYXR1cmFsIGxhbmd1YWdlIHRlbXBsYXRlc1xuICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICdjcmVhdGVfZWxlbWVudCc6XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgQ3JlYXRlIGEgbmV3ICR7dHlwZUxhYmVsfSBjYWxsZWQgXCIke25hbWV9XCJgXG4gICAgICAgICAgOiBgQ3JlYXRlIGEgbmV3ICR7dHlwZUxhYmVsfWA7XG4gICAgICBjYXNlICdlZGl0X2VsZW1lbnQnOlxuICAgICAgICByZXR1cm4gbmFtZVxuICAgICAgICAgID8gYEVkaXQgdGhlICR7dHlwZUxhYmVsfSBcIiR7bmFtZX1cImBcbiAgICAgICAgICA6IGBFZGl0IGEgJHt0eXBlTGFiZWx9YDtcbiAgICAgIGNhc2UgJ2RlbGV0ZV9lbGVtZW50JzpcbiAgICAgICAgcmV0dXJuIG5hbWVcbiAgICAgICAgICA/IGBQZXJtYW5lbnRseSBkZWxldGUgdGhlICR7dHlwZUxhYmVsfSBcIiR7bmFtZX1cImBcbiAgICAgICAgICA6IGBQZXJtYW5lbnRseSBkZWxldGUgYSAke3R5cGVMYWJlbH1gO1xuICAgICAgY2FzZSAnYWN0aXZhdGVfZWxlbWVudCc6XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgQWN0aXZhdGUgdGhlICR7dHlwZUxhYmVsfSBcIiR7bmFtZX1cIiAoY2hhbmdlcyBhY3RpdmUgcGVybWlzc2lvbiBzdXJmYWNlKWBcbiAgICAgICAgICA6IGBBY3RpdmF0ZSBhICR7dHlwZUxhYmVsfWA7XG4gICAgICBjYXNlICdkZWFjdGl2YXRlX2VsZW1lbnQnOlxuICAgICAgICByZXR1cm4gbmFtZVxuICAgICAgICAgID8gYERlYWN0aXZhdGUgdGhlICR7dHlwZUxhYmVsfSBcIiR7bmFtZX1cImBcbiAgICAgICAgICA6IGBEZWFjdGl2YXRlIGEgJHt0eXBlTGFiZWx9YDtcbiAgICAgIGNhc2UgJ2V4ZWN1dGVfYWdlbnQnOiB7XG4gICAgICAgIGNvbnN0IGdvYWwgPSAocC5nb2FsIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IGdvYWxTdWZmaXggPSBnb2FsID8gYCB3aXRoIGdvYWw6ICR7Z29hbH1gIDogJyc7XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgUnVuIHRoZSBhZ2VudCBcIiR7bmFtZX1cIiR7Z29hbFN1ZmZpeH1gXG4gICAgICAgICAgOiBgRXhlY3V0ZSBhbiBhZ2VudCR7Z29hbFN1ZmZpeH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnaW5zdGFsbF9jb2xsZWN0aW9uX2NvbnRlbnQnOiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSAocC5wYXRoIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiBwYXRoXG4gICAgICAgICAgPyBgSW5zdGFsbCBcIiR7cGF0aH1cIiBmcm9tIHRoZSBjb21tdW5pdHkgY29sbGVjdGlvbiB0byB5b3VyIHBvcnRmb2xpb2BcbiAgICAgICAgICA6ICdJbnN0YWxsIGFuIGVsZW1lbnQgZnJvbSB0aGUgY29tbXVuaXR5IGNvbGxlY3Rpb24nO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3VibWl0X2NvbGxlY3Rpb25fY29udGVudCc6XG4gICAgICAgIHJldHVybiAnU3VibWl0IGEgbG9jYWwgZWxlbWVudCB0byB0aGUgY29tbXVuaXR5IGNvbGxlY3Rpb24nO1xuICAgICAgY2FzZSAnY2xlYXInOlxuICAgICAgICByZXR1cm4gdHlwZUxhYmVsICE9PSAnZWxlbWVudCdcbiAgICAgICAgICA/IGBDbGVhciBhbGwgJHt0eXBlTGFiZWx9IGRhdGFgXG4gICAgICAgICAgOiAnQ2xlYXIgZGF0YSc7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBvcGVyYXRpb24gZGVzY3JpcHRpb24gZnJvbSBzY2hlbWEsIG9yIGZvcm1hdHRlZCBvcGVyYXRpb24gbmFtZVxuICAgICAgICAvLyBJbmNsdWRlIHBhcmFtZXRlciBrZXlzIHNvIHVuY29tbW9uIG9wZXJhdGlvbnMgc3RpbGwgcHJvdmlkZSB1c2VmdWwgY29udGV4dFxuICAgICAgICBjb25zdCBzY2hlbWEgPSBBTExfT1BFUkFUSU9OX1NDSEVNQVNbb3BlcmF0aW9uXTtcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzID0gT2JqZWN0LmtleXMocCkuZmlsdGVyKGsgPT4gayAhPT0gJ29wZXJhdGlvbicpO1xuICAgICAgICBjb25zdCBwYXJhbUhpbnQgPSBwYXJhbUtleXMubGVuZ3RoID4gMCA/IGAgKCR7cGFyYW1LZXlzLmpvaW4oJywgJyl9KWAgOiAnJztcbiAgICAgICAgaWYgKHNjaGVtYT8uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gYCR7c2NoZW1hLmRlc2NyaXB0aW9ufSR7cGFyYW1IaW50fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBQZXJmb3JtIG9wZXJhdGlvbjogJHtvcGVyYXRpb24ucmVwbGFjZSgvXy9nLCAnICcpfSR7cGFyYW1IaW50fSR7ZWxlbWVudFR5cGUgPyBgIG9uICR7ZWxlbWVudFR5cGV9YCA6ICcnfWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjb3JlIHRoZSByaXNrIG9mIGFuIE1DUC1BUUwgb3BlcmF0aW9uIGZvciBhdXRvLWNvbmZpcm0gYXVkaXQgdHJhaWxzLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgc2NvcmUgZnJvbSAwLTEwMCBiYXNlZCBvbiBvcGVyYXRpb24gY2hhcmFjdGVyaXN0aWNzOlxuICAgKiAtIERFTEVURSBlbmRwb2ludCBvcGVyYXRpb25zOiBiYXNlIDgwIChkZXN0cnVjdGl2ZSwgZGF0YSBsb3NzKVxuICAgKiAtIEVYRUNVVEUgZW5kcG9pbnQgb3BlcmF0aW9uczogYmFzZSA2MCAodW5wcmVkaWN0YWJsZSBzaWRlIGVmZmVjdHMpXG4gICAqIC0gVVBEQVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6IGJhc2UgNDAgKG1vZGlmaWVzIGV4aXN0aW5nIGRhdGEpXG4gICAqIC0gQ1JFQVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6IGJhc2UgMjAgKGFkZGl0aXZlLCBsb3cgcmlzaylcbiAgICpcbiAgICogTW9kaWZpZXJzOlxuICAgKiAtIE9wZXJhdGlvbnMgd2l0aCBjYW5CZUVsZXZhdGVkOiBmYWxzZSBnZXQgKzEwIChzdHJ1Y3R1cmFsbHkgZGFuZ2Vyb3VzKVxuICAgKiAtIE9wZXJhdGlvbnMgdGFyZ2V0aW5nIGdhdGVrZWVwZXIgZmllbGRzIGdldCArMTAgKHByaXZpbGVnZSBlc2NhbGF0aW9uIHZlY3RvcilcbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gbmFtZVxuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBUaGUgQ1JVREUgZW5kcG9pbnRcbiAgICogQHBhcmFtIHBhcmFtcyAtIE9wZXJhdGlvbiBwYXJhbWV0ZXJzIChmb3IgZmllbGQgaW5zcGVjdGlvbilcbiAgICogQHJldHVybnMgUmlzayBzY29yZSAwLTEwMFxuICAgKi9cbiAgcHJpdmF0ZSBzY29yZU9wZXJhdGlvblJpc2soXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBudW1iZXIge1xuICAgIC8vIEJhc2Ugc2NvcmUgYnkgZW5kcG9pbnQgdHlwZVxuICAgIGNvbnN0IGJhc2VTY29yZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gICAgICBERUxFVEU6IDgwLFxuICAgICAgRVhFQ1VURTogNjAsXG4gICAgICBVUERBVEU6IDQwLFxuICAgICAgQ1JFQVRFOiAyMCxcbiAgICAgIFJFQUQ6IDAsXG4gICAgfTtcbiAgICBsZXQgc2NvcmUgPSBiYXNlU2NvcmVzW2VuZHBvaW50XSA/PyA0MDtcblxuICAgIC8vIE1vZGlmaWVyOiBub24tZWxldmF0YWJsZSBvcGVyYXRpb25zIGFyZSBzdHJ1Y3R1cmFsbHkgbW9yZSBkYW5nZXJvdXNcbiAgICBpZiAoIWNhbk9wZXJhdGlvbkJlRWxldmF0ZWQob3BlcmF0aW9uKSkge1xuICAgICAgc2NvcmUgKz0gMTA7XG4gICAgfVxuXG4gICAgLy8gTW9kaWZpZXI6IG9wZXJhdGlvbnMgdGFyZ2V0aW5nIGdhdGVrZWVwZXIgZmllbGRzIChwcml2aWxlZ2UgZXNjYWxhdGlvbiB2ZWN0b3IpXG4gICAgaWYgKHBhcmFtcyAmJiBvcGVyYXRpb24gPT09ICdlZGl0X2VsZW1lbnQnKSB7XG4gICAgICBjb25zdCBpbnB1dE9iaiA9IHBhcmFtcy5pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChpbnB1dE9iaj8uZ2F0ZWtlZXBlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGlucHV0T2JqPy5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmdhdGVrZWVwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzY29yZSArPSAxMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5taW4oc2NvcmUsIDEwMCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggRXhlY3V0ZSBvcGVyYXRpb25zIGZvciBleGVjdXRpb24gbGlmZWN5Y2xlIG1hbmFnZW1lbnQgKElzc3VlICMyNDQpXG4gICAqXG4gICAqIEV4ZWN1dGUgb3BlcmF0aW9ucyBoYW5kbGUgcnVudGltZSBzdGF0ZSBvZiBleGVjdXRhYmxlIGVsZW1lbnRzOlxuICAgKiAtIGV4ZWN1dGU6IFN0YXJ0IGEgbmV3IGV4ZWN1dGlvblxuICAgKiAtIGdldFN0YXRlOiBRdWVyeSBjdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZVxuICAgKiAtIHVwZGF0ZVN0YXRlOiBSZWNvcmQgcHJvZ3Jlc3MsIGZpbmRpbmdzLCBzdGVwIGNvbXBsZXRpb25cbiAgICogLSBjb21wbGV0ZTogU2lnbmFsIHN1Y2Nlc3NmdWwgY29tcGxldGlvblxuICAgKiAtIGNvbnRpbnVlOiBSZXN1bWUgZnJvbSBzYXZlZCBzdGF0ZVxuICAgKiAtIGFib3J0OiBDYW5jZWwgYW4gb25nb2luZyBleGVjdXRpb25cbiAgICpcbiAgICogVGhlc2Ugb3BlcmF0aW9ucyBhcmUgbm9uLWlkZW1wb3RlbnQgYnkgbmF0dXJlICh1bmxpa2UgQ1JVRCBvcGVyYXRpb25zKS5cbiAgICogQ3VycmVudGx5IHJvdXRlcyB0byBBZ2VudE1hbmFnZXIsIGJ1dCBkZXNpZ25lZCBmb3IgZnV0dXJlIGV4dGVuc2liaWxpdHlcbiAgICogdG8gd29ya2Zsb3dzLCBwaXBlbGluZXMsIGFuZCBvdGhlciBleGVjdXRhYmxlIGVsZW1lbnQgdHlwZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoRXhlY3V0ZShcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmhhbmRsZXJzLmFnZW50TWFuYWdlcjtcblxuICAgIC8vIElzc3VlICMzMjM6IFZhbGlkYXRlIGVsZW1lbnRfbmFtZSBwYXJhbWV0ZXIgKHdhcyBpbmNvcnJlY3RseSB1c2luZyAnbmFtZScpXG4gICAgLy8gQWxsIGV4ZWN1dGUgb3BlcmF0aW9ucyByZXF1aXJlIGVsZW1lbnRfbmFtZSB0byBpZGVudGlmeSB0aGUgdGFyZ2V0XG4gICAgY29uc3QgZWxlbWVudE5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgcGFyYW1zLFxuICAgICAgJ2VsZW1lbnRfbmFtZScsXG4gICAgICAndGhlIG5hbWUgb2YgdGhlIGFnZW50L2VsZW1lbnQgdG8gZXhlY3V0ZSdcbiAgICApO1xuXG4gICAgLy8gSXNzdWUgIzExMDogUHJvZ3JhbW1hdGljIGVuZm9yY2VtZW50IGZvciBEQU5HRVJfWk9ORSB0aWVyXG4gICAgLy8gSXNzdWUgIzQwMjogVXNlIERJLWluamVjdGVkIGVuZm9yY2VyIGluc3RlYWQgb2Ygc2luZ2xldG9uXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGFnZW50IGlzIGJsb2NrZWQgZHVlIHRvIGRhbmdlciB6b25lIHRyaWdnZXJcbiAgICAvLyBPbmx5IGFsbG93ICdnZXRTdGF0ZScgb3BlcmF0aW9uIGZvciBibG9ja2VkIGFnZW50cyAocmVhZC1vbmx5LCBuZWVkZWQgZm9yIGRpYWdub3N0aWNzKVxuICAgIGlmIChtZXRob2QgIT09ICdnZXRTdGF0ZScgJiYgdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIpIHtcbiAgICAgIGNvbnN0IGJsb2NrQ2hlY2sgPSB0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlci5jaGVjayhlbGVtZW50TmFtZSk7XG4gICAgICBpZiAoYmxvY2tDaGVjay5ibG9ja2VkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBZ2VudCAnJHtlbGVtZW50TmFtZX0nIGJsb2NrZWQgZnJvbSBleGVjdXRpbmcgJyR7bWV0aG9kfSc6ICR7YmxvY2tDaGVjay5yZWFzb259YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgcmVhc29uOiBibG9ja0NoZWNrLnJlYXNvbixcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIC8vIElzc3VlICM0MDU6IEFjdGlvbmFibGUgZ3VpZGFuY2Ugd2l0aCB2ZXJpZnlfY2hhbGxlbmdlIGluc3RydWN0aW9uc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFnZW50ICcke2VsZW1lbnROYW1lfScgaXMgYmxvY2tlZCBkdWUgdG8gZGFuZ2VyIHpvbmUgdHJpZ2dlcjogJHtibG9ja0NoZWNrLnJlYXNvbn0uIGAgK1xuICAgICAgICAgIGAke2Jsb2NrQ2hlY2sucmVzb2x1dGlvbn1gICtcbiAgICAgICAgICAoYmxvY2tDaGVjay52ZXJpZmljYXRpb25JZFxuICAgICAgICAgICAgPyAnIEFzayB0aGUgaHVtYW4gb3BlcmF0b3IgdG8gcmVhZCB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgZnJvbSB0aGUgZGlhbG9nIG9uIHRoZWlyIHNjcmVlbi4nXG4gICAgICAgICAgICA6ICcnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElzc3VlICMyNDk6IFJlamVjdCBleGVjdXRpb24gb3BlcmF0aW9ucyBmb3IgYWJvcnRlZCBnb2Fscy5cbiAgICAvLyBPcGVyYXRpb25zIHRoYXQgbW9kaWZ5IGV4ZWN1dGlvbiBzdGF0ZSBhcmUgYmxvY2tlZDsgZ2V0U3RhdGUgYW5kIGFib3J0IGFyZSBhbGxvd2VkLlxuICAgIGlmIChtZXRob2QgIT09ICdleGVjdXRlJyAmJiBtZXRob2QgIT09ICdnZXRTdGF0ZScgJiYgbWV0aG9kICE9PSAnYWJvcnQnKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgYWdlbnQncyBhY3RpdmUgZ29hbCBoYXMgYmVlbiBhYm9ydGVkXG4gICAgICBjb25zdCBhZ2VudEdvYWxJZHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUdvYWxJZHMobWFuYWdlciwgZWxlbWVudE5hbWUpO1xuICAgICAgZm9yIChjb25zdCBnb2FsSWQgb2YgYWdlbnRHb2FsSWRzKSB7XG4gICAgICAgIGlmICh0aGlzLmFib3J0ZWRHb2Fscy5oYXMoZ29hbElkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBZ2VudCAnJHtlbGVtZW50TmFtZX0nIGV4ZWN1dGlvbiB3YXMgYWJvcnRlZCAoZ29hbElkOiAke2dvYWxJZH0pLiBgICtcbiAgICAgICAgICAgIGBGdXJ0aGVyIGV4ZWN1dGlvbiBvcGVyYXRpb25zIGFyZSByZWplY3RlZC4gVXNlIGV4ZWN1dGVfYWdlbnQgdG8gc3RhcnQgYSBuZXcgZXhlY3V0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2V4ZWN1dGUnOiB7XG4gICAgICAgIC8vIFN0YXJ0IGV4ZWN1dGlvbiBvZiBhbiBhZ2VudCBvciBleGVjdXRhYmxlIGVsZW1lbnRcbiAgICAgICAgY29uc3QgZXhlY3V0ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuZXhlY3V0ZUFnZW50KFxuICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgIHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzQ0NzogVmFsaWRhdGUgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGVcbiAgICAgICAgY29uc3QgcnVudGltZU1heFN0ZXBzID0gcGFyYW1zLm1heEF1dG9ub21vdXNTdGVwcztcbiAgICAgICAgaWYgKHJ1bnRpbWVNYXhTdGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBydW50aW1lTWF4U3RlcHMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHJ1bnRpbWVNYXhTdGVwcykgfHwgcnVudGltZU1heFN0ZXBzIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXhBdXRvbm9tb3VzU3RlcHMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzQ0OTogVHJhY2sgZXhlY3V0aW5nIGFnZW50IGZvciBHYXRla2VlcGVyIHBvbGljeSBlbmZvcmNlbWVudFxuICAgICAgICAvLyBJc3N1ZSAjNDQ3OiBBbHNvIHN0b3JlIHJ1bnRpbWUgbWF4QXV0b25vbW91c1N0ZXBzIG92ZXJyaWRlXG4gICAgICAgIC8vIElzc3VlICM1MjY6IEFsc28gc3RvcmUgcmVzaWxpZW5jZSBwb2xpY3kgYW5kIG9yaWdpbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhZ2VudEVsZW1lbnQgPSBhd2FpdCBtYW5hZ2VyLnJlYWQoZWxlbWVudE5hbWUpO1xuICAgICAgICAgIGlmIChhZ2VudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFnZW50TWV0YSA9IGFnZW50RWxlbWVudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG4gICAgICAgICAgICBsZXQgZ2F0ZWtlZXBlclBvbGljeSA9IGFnZW50TWV0YS5nYXRla2VlcGVyO1xuXG4gICAgICAgICAgICAvLyBTeW50aGVzaXplIHBvbGljeSBmcm9tIHRvb2xzIGNvbmZpZyBpZiBubyBleHBsaWNpdCBnYXRla2VlcGVyIHBvbGljeVxuICAgICAgICAgICAgaWYgKCFnYXRla2VlcGVyUG9saWN5ICYmIGFnZW50TWV0YS50b29scykge1xuICAgICAgICAgICAgICBnYXRla2VlcGVyUG9saWN5ID0gdHJhbnNsYXRlVG9vbENvbmZpZ1RvUG9saWN5KGFnZW50TWV0YS50b29scykgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJc3N1ZSAjNTI2OiBFeHRyYWN0IHJlc2lsaWVuY2UgcG9saWN5IGZyb20gYWdlbnQgbWV0YWRhdGFcbiAgICAgICAgICAgIGNvbnN0IHJlc2lsaWVuY2VQb2xpY3kgPSBhZ2VudE1ldGEucmVzaWxpZW5jZTtcblxuICAgICAgICAgICAgLy8gQWx3YXlzIHRyYWNrIGlmIHRoZXJlJ3MgYSBnYXRla2VlcGVyIHBvbGljeSwgcnVudGltZSBvdmVycmlkZSwgb3IgcmVzaWxpZW5jZSBwb2xpY3lcbiAgICAgICAgICAgIGlmIChnYXRla2VlcGVyUG9saWN5IHx8IHJ1bnRpbWVNYXhTdGVwcyAhPT0gdW5kZWZpbmVkIHx8IHJlc2lsaWVuY2VQb2xpY3kpIHtcbiAgICAgICAgICAgICAgdGhpcy5leGVjdXRpbmdBZ2VudHMuc2V0KGVsZW1lbnROYW1lLCB7XG4gICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgIC4uLihnYXRla2VlcGVyUG9saWN5ID8geyBnYXRla2VlcGVyOiBnYXRla2VlcGVyUG9saWN5IH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAuLi4ocnVudGltZU1heFN0ZXBzICE9PSB1bmRlZmluZWQgPyB7IG1heEF1dG9ub21vdXNTdGVwczogcnVudGltZU1heFN0ZXBzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgY29udGludWF0aW9uQ291bnQ6IDAsXG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFBhcmFtZXRlcnM6IHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlc2lsaWVuY2VQb2xpY3ksXG4gICAgICAgICAgICAgICAgcmVjZW50QmxvY2tzOiBbXSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChydW50aW1lTWF4U3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gTm8gYWdlbnQgZWxlbWVudCB0byByZWFkLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBzdG9yZSB0aGUgb3ZlcnJpZGVcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLnNldChlbGVtZW50TmFtZSwge1xuICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHsgbWF4QXV0b25vbW91c1N0ZXBzOiBydW50aW1lTWF4U3RlcHMgfSxcbiAgICAgICAgICAgICAgc3RhcnRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICBjb250aW51YXRpb25Db3VudDogMCxcbiAgICAgICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxQYXJhbWV0ZXJzOiBwYXJhbXMucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmVjZW50QmxvY2tzOiBbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gTm9uLWZhdGFsOiBhZ2VudCBleGVjdXRlcyBldmVuIGlmIHRyYWNraW5nIGZhaWxzXG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byB0cmFjayBleGVjdXRpbmcgYWdlbnQgZm9yIEdhdGVrZWVwZXIgcG9saWN5JywgeyBhZ2VudE5hbWU6IGVsZW1lbnROYW1lIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0V4ZWN1dGVBZ2VudFJlc3VsdCcsIC4uLmV4ZWN1dGVSZXN1bHQgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZ2V0U3RhdGUnOiB7XG4gICAgICAgIC8vIFF1ZXJ5IGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlXG4gICAgICAgIGNvbnN0IHN0YXRlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5nZXRBZ2VudFN0YXRlKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGluY2x1ZGVEZWNpc2lvbkhpc3Rvcnk6IHBhcmFtcy5pbmNsdWRlRGVjaXNpb25IaXN0b3J5IGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZUNvbnRleHQ6IHBhcmFtcy5pbmNsdWRlQ29udGV4dCBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0V4ZWN1dGlvblN0YXRlJywgLi4uc3RhdGVSZXN1bHQgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAndXBkYXRlU3RhdGUnOiB7XG4gICAgICAgIC8vIFJlY29yZCBleGVjdXRpb24gcHJvZ3Jlc3MsIHN0ZXAgY29tcGxldGlvbiwgb3IgZmluZGluZ3NcbiAgICAgICAgLy8gUmV0dXJucyBhdXRvbm9teSBkaXJlY3RpdmUgaW5kaWNhdGluZyBjb250aW51ZS9wYXVzZVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIG9wdGlvbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgY29uc3QgbmV4dEFjdGlvbkhpbnQgPSBwYXJhbXMubmV4dEFjdGlvbkhpbnQ7XG4gICAgICAgIGlmIChuZXh0QWN0aW9uSGludCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBuZXh0QWN0aW9uSGludCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25leHRBY3Rpb25IaW50IG11c3QgYmUgYSBzdHJpbmcgaWYgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJpc2tTY29yZSA9IHBhcmFtcy5yaXNrU2NvcmU7XG4gICAgICAgIGlmIChyaXNrU2NvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygcmlza1Njb3JlICE9PSAnbnVtYmVyJyB8fCBpc05hTihyaXNrU2NvcmUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jpc2tTY29yZSBtdXN0IGJlIGEgbnVtYmVyIGlmIHByb3ZpZGVkJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyaXNrU2NvcmUgPCAwIHx8IHJpc2tTY29yZSA+IDEwMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyaXNrU2NvcmUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzc3VlICM0NDc6IEFwcGx5IHJ1bnRpbWUgbWF4QXV0b25vbW91c1N0ZXBzIG92ZXJyaWRlIGlmIHN0b3JlZCBmb3IgdGhpcyBhZ2VudFxuICAgICAgICBjb25zdCBleGVjdXRpbmdBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChlbGVtZW50TmFtZSk7XG4gICAgICAgIGNvbnN0IG1heFN0ZXBzT3ZlcnJpZGUgPSBleGVjdXRpbmdBZ2VudD8ubWV0YWRhdGE/Lm1heEF1dG9ub21vdXNTdGVwcyBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5yZWNvcmRBZ2VudFN0ZXAoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgc3RlcERlc2NyaXB0aW9uOiBwYXJhbXMuc3RlcERlc2NyaXB0aW9uIGFzIHN0cmluZyxcbiAgICAgICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZSBhcyAnc3VjY2VzcycgfCAnZmFpbHVyZScgfCAncGFydGlhbCcsXG4gICAgICAgICAgZmluZGluZ3M6IHBhcmFtcy5maW5kaW5ncyBhcyBzdHJpbmcsXG4gICAgICAgICAgY29uZmlkZW5jZTogcGFyYW1zLmNvbmZpZGVuY2UgYXMgbnVtYmVyLFxuICAgICAgICAgIG5leHRBY3Rpb25IaW50OiBuZXh0QWN0aW9uSGludCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcmlza1Njb3JlOiByaXNrU2NvcmUgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIG1heFN0ZXBzT3ZlcnJpZGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElzc3VlICM1MjY6IEV2YWx1YXRlIHJlc2lsaWVuY2UgcG9saWN5IHdoZW4gYXV0b25vbXkgc2F5cyBwYXVzZVxuICAgICAgICBjb25zdCByZXNpbGllbmNlUmVzdWx0ID0gdGhpcy5ldmFsdWF0ZVJlc2lsaWVuY2UoXG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgdXBkYXRlUmVzdWx0LFxuICAgICAgICAgIHBhcmFtcy5vdXRjb21lIGFzIHN0cmluZ1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW06IGNvbGxlY3QgYW5kIGF0dGFjaCBub3RpZmljYXRpb25zXG4gICAgICAgIGNvbnN0IGZpbmFsUmVzdWx0ID0gcmVzaWxpZW5jZVJlc3VsdCA/PyB1cGRhdGVSZXN1bHQ7XG4gICAgICAgIGNvbnN0IGF1dG9ub215ID0gZmluYWxSZXN1bHQuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChhdXRvbm9teSkge1xuICAgICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSB0aGlzLmNvbGxlY3ROb3RpZmljYXRpb25zKGVsZW1lbnROYW1lLCBhdXRvbm9teSk7XG4gICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXV0b25vbXkubm90aWZpY2F0aW9ucyA9IG5vdGlmaWNhdGlvbnM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ1N0ZXBSZXN1bHQnLCAuLi5maW5hbFJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdjb21wbGV0ZSc6IHtcbiAgICAgICAgLy8gU2lnbmFsIGV4ZWN1dGlvbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgY29uc3QgY29tcGxldGVSZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLmNvbXBsZXRlQWdlbnRHb2FsKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lIGFzICdzdWNjZXNzJyB8ICdmYWlsdXJlJyB8ICdwYXJ0aWFsJyxcbiAgICAgICAgICBzdW1tYXJ5OiBwYXJhbXMuc3VtbWFyeSBhcyBzdHJpbmcsXG4gICAgICAgICAgZ29hbElkOiBwYXJhbXMuZ29hbElkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzUyNjogVHJhY2sgcmVzaWxpZW5jZSBvdXRjb21lIGFuZCByZXNldCBjaXJjdWl0IGJyZWFrZXIgb24gc3VjY2Vzc1xuICAgICAgICBjb25zdCBjb21wbGV0ZWRBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChlbGVtZW50TmFtZSk7XG4gICAgICAgIGlmIChjb21wbGV0ZWRBZ2VudD8ucmVzaWxpZW5jZVBvbGljeSAmJiAoY29tcGxldGVkQWdlbnQuY29udGludWF0aW9uQ291bnQgPiAwIHx8IGNvbXBsZXRlZEFnZW50LnJldHJ5Q291bnQgPiAwKSkge1xuICAgICAgICAgIGNvbnN0IGlzU3VjY2VzcyA9IHBhcmFtcy5vdXRjb21lID09PSAnc3VjY2Vzcyc7XG4gICAgICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkQ29tcGxldGlvbkFmdGVyUmVzaWxpZW5jZShpc1N1Y2Nlc3MpO1xuICAgICAgICAgIGlmIChpc1N1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNpcmN1aXRCcmVha2VyLnJlc2V0KGVsZW1lbnROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNDQ5OiBSZW1vdmUgYWdlbnQgZnJvbSBleGVjdXRpbmcgc2V0IHNvIGl0cyBwb2xpY2llcyBzdG9wIGFwcGx5aW5nXG4gICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLmRlbGV0ZShlbGVtZW50TmFtZSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0NvbXBsZXRpb25SZXN1bHQnLCAuLi5jb21wbGV0ZVJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdjb250aW51ZSc6IHtcbiAgICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBmcm9tIHNhdmVkIHN0YXRlXG4gICAgICAgIGNvbnN0IGNvbnRpbnVlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5jb250aW51ZUFnZW50RXhlY3V0aW9uKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIHByZXZpb3VzU3RlcFJlc3VsdDogcGFyYW1zLnByZXZpb3VzU3RlcFJlc3VsdCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1zLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnQ29udGludWVSZXN1bHQnLCAuLi5jb250aW51ZVJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdhYm9ydCc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzI0OTogQWJvcnQgYSBydW5uaW5nIGFnZW50IGV4ZWN1dGlvblxuICAgICAgICBjb25zdCByZWFzb24gPSAocGFyYW1zLnJlYXNvbiBhcyBzdHJpbmcpIHx8ICdBYm9ydGVkIGJ5IHVzZXInO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIGFjdGl2ZSBnb2FsIGZvciB0aGlzIGFnZW50XG4gICAgICAgIGNvbnN0IGFjdGl2ZUdvYWxJZHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUdvYWxJZHMobWFuYWdlciwgZWxlbWVudE5hbWUpO1xuICAgICAgICBpZiAoYWN0aXZlR29hbElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgTm8gYWN0aXZlIGV4ZWN1dGlvbiBmb3VuZCBmb3IgYWdlbnQgJyR7ZWxlbWVudE5hbWV9Jy4gYCArXG4gICAgICAgICAgICBgTm90aGluZyB0byBhYm9ydC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYWxsIGFjdGl2ZSBnb2FscyBhcyBhYm9ydGVkXG4gICAgICAgIGZvciAoY29uc3QgZ29hbElkIG9mIGFjdGl2ZUdvYWxJZHMpIHtcbiAgICAgICAgICB0aGlzLmFib3J0ZWRHb2Fscy5hZGQoZ29hbElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXBsZXRlIHRoZSBhZ2VudCBnb2FsIHdpdGggJ2ZhaWx1cmUnIG91dGNvbWUgdG8gcGVyc2lzdCB0aGUgYWJvcnRlZCBzdGF0ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG1hbmFnZXIuY29tcGxldGVBZ2VudEdvYWwoe1xuICAgICAgICAgICAgYWdlbnROYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgIG91dGNvbWU6ICdmYWlsdXJlJyxcbiAgICAgICAgICAgIHN1bW1hcnk6IGBFeGVjdXRpb24gYWJvcnRlZDogJHtyZWFzb259YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gTm9uLWZhdGFsOiBnb2FsIG1heSBhbHJlYWR5IGJlIGNvbXBsZXRlZCBvciBhZ2VudCBzdGF0ZSBtYXkgYmUgaW5jb25zaXN0ZW50XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBtYXJrIGFib3J0ZWQgYWdlbnQgZ29hbCBhcyBmYWlsZWQnLCB7IGFnZW50TmFtZTogZWxlbWVudE5hbWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNTI2OiBUcmFjayByZXNpbGllbmNlIG91dGNvbWUgKGFib3J0ID0gZmFpbHVyZSBhZnRlciByZXNpbGllbmNlKVxuICAgICAgICBjb25zdCBhYm9ydGVkQWdlbnQgPSB0aGlzLmV4ZWN1dGluZ0FnZW50cy5nZXQoZWxlbWVudE5hbWUpO1xuICAgICAgICBpZiAoYWJvcnRlZEFnZW50Py5yZXNpbGllbmNlUG9saWN5ICYmIChhYm9ydGVkQWdlbnQuY29udGludWF0aW9uQ291bnQgPiAwIHx8IGFib3J0ZWRBZ2VudC5yZXRyeUNvdW50ID4gMCkpIHtcbiAgICAgICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRDb21wbGV0aW9uQWZ0ZXJSZXNpbGllbmNlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFuIHVwIGV4ZWN1dGluZ0FnZW50cyBNYXAgKHN0b3AgR2F0ZWtlZXBlciBwb2xpY3kgZW5mb3JjZW1lbnQpXG4gICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLmRlbGV0ZShlbGVtZW50TmFtZSk7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgRGFuZ2VyWm9uZUVuZm9yY2VyIGJsb2NrcyBmb3IgdGhpcyBhZ2VudFxuICAgICAgICBpZiAodGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIudW5ibG9jayhlbGVtZW50TmFtZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBOb24tZmF0YWw6IGFnZW50IG1heSBub3QgaGF2ZSBiZWVuIGJsb2NrZWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0FHRU5UX0VYRUNVVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEV4ZWN1dGUuYWJvcnQnLFxuICAgICAgICAgIGRldGFpbHM6IGBBZ2VudCBleGVjdXRpb24gYWJvcnRlZDogJHtlbGVtZW50TmFtZX0g4oCUICR7cmVhc29ufWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICBhYm9ydGVkR29hbElkczogYWN0aXZlR29hbElkcyxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX3R5cGU6ICdBYm9ydFJlc3VsdCcsXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGFib3J0ZWRHb2FsSWRzOiBhY3RpdmVHb2FsSWRzLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7ZWxlbWVudE5hbWV9JyBleGVjdXRpb24gYWJvcnRlZC4gJHthY3RpdmVHb2FsSWRzLmxlbmd0aH0gZ29hbChzKSB0ZXJtaW5hdGVkLmAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldEdhdGhlcmVkRGF0YSc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzY4OiBHZXQgYWdncmVnYXRlZCBleGVjdXRpb24gZGF0YSBmb3IgYSBzcGVjaWZpYyBnb2FsXG4gICAgICAgIGNvbnN0IGdvYWxJZCA9IHBhcmFtcy5nb2FsSWQ7XG4gICAgICAgIGlmICh0eXBlb2YgZ29hbElkICE9PSAnc3RyaW5nJyB8fCAhZ29hbElkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnb2FsSWQgaXMgcmVxdWlyZWQgZm9yIGdldF9nYXRoZXJlZF9kYXRhJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2F0aGVyZWREYXRhID0gYXdhaXQgbWFuYWdlci5nZXRHYXRoZXJlZERhdGEoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgZ29hbElkOiBnb2FsSWQgYXMgc3RyaW5nLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgX3R5cGU6ICdHYXRoZXJlZERhdGEnLCAuLi5nYXRoZXJlZERhdGEgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncHJlcGFyZUhhbmRvZmYnOiB7XG4gICAgICAgIC8vIElzc3VlICM2OTogUHJlcGFyZSBhIGhhbmRvZmYgc3RhdGUgZm9yIHNlc3Npb24gdHJhbnNmZXJcbiAgICAgICAgY29uc3QgaGFuZG9mZkdvYWxJZCA9IHBhcmFtcy5nb2FsSWQ7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZG9mZkdvYWxJZCAhPT0gJ3N0cmluZycgfHwgIWhhbmRvZmZHb2FsSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvYWxJZCBpcyByZXF1aXJlZCBmb3IgcHJlcGFyZV9oYW5kb2ZmJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZ2F0aGVyZWQgZGF0YSBmb3IgdGhlIGdvYWxcbiAgICAgICAgY29uc3QgaGFuZG9mZkdhdGhlcmVkRGF0YSA9IGF3YWl0IG1hbmFnZXIuZ2V0R2F0aGVyZWREYXRhKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGdvYWxJZDogaGFuZG9mZkdvYWxJZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVhZCBhZ2VudCBtZXRhZGF0YSBmb3IgYWN0aXZlIGVsZW1lbnRzIGFuZCBzdWNjZXNzIGNyaXRlcmlhXG4gICAgICAgIGxldCBhY3RpdmVFbGVtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gICAgICAgIGxldCBzdWNjZXNzQ3JpdGVyaWE6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYWdlbnRFbGVtZW50ID0gYXdhaXQgbWFuYWdlci5yZWFkKGVsZW1lbnROYW1lKTtcbiAgICAgICAgICBpZiAoYWdlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gYWdlbnRFbGVtZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcbiAgICAgICAgICAgIGlmIChtZXRhLmFjdGl2YXRlcykge1xuICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50cyA9IHsgLi4ubWV0YS5hY3RpdmF0ZXMgfSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWNjZXNzQ3JpdGVyaWEgPSBtZXRhLmdvYWw/LnN1Y2Nlc3NDcml0ZXJpYSB8fCBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIE5vbi1mYXRhbDogcHJvY2VlZCB3aXRoIGRlZmF1bHRzXG4gICAgICAgIH1cbiAgICAgICAgLy8gQWx3YXlzIGluY2x1ZGUgdGhlIGFnZW50IGl0c2VsZlxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXSkge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYWN0aXZlRWxlbWVudHNbJ2FnZW50cyddLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXS5wdXNoKGVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBoYW5kb2ZmIHN0YXRlXG4gICAgICAgIGNvbnN0IGhhbmRvZmZTdGF0ZSA9IHByZXBhcmVIYW5kb2ZmU3RhdGUoXG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgaGFuZG9mZkdhdGhlcmVkRGF0YSxcbiAgICAgICAgICBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgICBzdWNjZXNzQ3JpdGVyaWFcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgY29weS1wYXN0ZWFibGUgYmxvY2tcbiAgICAgICAgY29uc3QgaGFuZG9mZkJsb2NrID0gZ2VuZXJhdGVIYW5kb2ZmQmxvY2soaGFuZG9mZlN0YXRlKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF90eXBlOiAnSGFuZG9mZlJlc3VsdCcsXG4gICAgICAgICAgaGFuZG9mZlN0YXRlLFxuICAgICAgICAgIGhhbmRvZmZCbG9jayxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncmVzdW1lRnJvbUhhbmRvZmYnOiB7XG4gICAgICAgIC8vIElzc3VlICM2OTogUmVzdW1lIGV4ZWN1dGlvbiBmcm9tIGEgaGFuZG9mZiBibG9ja1xuICAgICAgICBjb25zdCBoYW5kb2ZmQmxvY2tQYXJhbSA9IHBhcmFtcy5oYW5kb2ZmQmxvY2s7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZG9mZkJsb2NrUGFyYW0gIT09ICdzdHJpbmcnIHx8ICFoYW5kb2ZmQmxvY2tQYXJhbSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGFuZG9mZkJsb2NrIGlzIHJlcXVpcmVkIGZvciByZXN1bWVfZnJvbV9oYW5kb2ZmICh0aGUgZnVsbCBoYW5kb2ZmIGJsb2NrIHRleHQpJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSBhbmQgdmFsaWRhdGUgdGhlIGhhbmRvZmYgYmxvY2sgKGNoZWNrc3VtIHZhbGlkYXRlZCBpbnRlcm5hbGx5KVxuICAgICAgICBjb25zdCByZXN0b3JlZFN0YXRlID0gcGFyc2VIYW5kb2ZmQmxvY2soaGFuZG9mZkJsb2NrUGFyYW0pO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGUgYWdlbnQgbmFtZSBtYXRjaGVzXG4gICAgICAgIGlmIChyZXN0b3JlZFN0YXRlLmFnZW50TmFtZSAhPT0gZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICBsb2dnZXIud2FybignSGFuZG9mZiBhZ2VudCBtaXNtYXRjaCBkZXRlY3RlZCcsIHtcbiAgICAgICAgICAgIGV4cGVjdGVkQWdlbnQ6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgYmxvY2tBZ2VudDogcmVzdG9yZWRTdGF0ZS5hZ2VudE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0hhbmRvZmYgYWdlbnQgbWlzbWF0Y2g6IHRoZSBoYW5kb2ZmIGJsb2NrIHdhcyBub3QgcHJlcGFyZWQgZm9yIHRoaXMgYWdlbnQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1lcmdlIGNhbGxlci1wcm92aWRlZCBwYXJhbWV0ZXJzIHdpdGggaGFuZG9mZiBtZXRhZGF0YS5cbiAgICAgICAgLy8gVGhlIGNhbGxlciBtdXN0IHN1cHBseSBhbnkgcmVxdWlyZWQgZ29hbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChlLmcuIHRhc2spLlxuICAgICAgICBjb25zdCBjYWxsZXJQYXJhbXMgPSAocGFyYW1zLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt9O1xuICAgICAgICBjb25zdCByZXN1bWVQYXJhbXMgPSB7XG4gICAgICAgICAgLi4uY2FsbGVyUGFyYW1zLFxuICAgICAgICAgIHJlc3VtZWRGcm9tSGFuZG9mZjogdHJ1ZSxcbiAgICAgICAgICBvcmlnaW5hbEdvYWxJZDogcmVzdG9yZWRTdGF0ZS5nb2FsSWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiB1c2luZyBjb250aW51ZSB3aXRoIHJlc3RvcmVkIGNvbnRleHRcbiAgICAgICAgY29uc3QgY29udGludWVSZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLmNvbnRpbnVlQWdlbnRFeGVjdXRpb24oe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgcHJldmlvdXNTdGVwUmVzdWx0OiBgUmVzdW1lZCBmcm9tIGhhbmRvZmYgKGdvYWxJZDogJHtyZXN0b3JlZFN0YXRlLmdvYWxJZH0sICR7cmVzdG9yZWRTdGF0ZS5nb2FsUHJvZ3Jlc3Muc3RlcHNDb21wbGV0ZWR9IHN0ZXBzIGNvbXBsZXRlZClgLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHJlc3VtZVBhcmFtcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfdHlwZTogJ1Jlc3VtZVJlc3VsdCcsXG4gICAgICAgICAgLi4uY29udGludWVSZXN1bHQsXG4gICAgICAgICAgcmVzdG9yZWRGcm9tOiB7XG4gICAgICAgICAgICBhZ2VudE5hbWU6IHJlc3RvcmVkU3RhdGUuYWdlbnROYW1lLFxuICAgICAgICAgICAgZ29hbElkOiByZXN0b3JlZFN0YXRlLmdvYWxJZCxcbiAgICAgICAgICAgIHZlcnNpb246IHJlc3RvcmVkU3RhdGUudmVyc2lvbixcbiAgICAgICAgICAgIHN0ZXBzQ29tcGxldGVkOiByZXN0b3JlZFN0YXRlLmdvYWxQcm9ncmVzcy5zdGVwc0NvbXBsZXRlZCxcbiAgICAgICAgICAgIHByZXBhcmVkQXQ6IHJlc3RvcmVkU3RhdGUucHJlcGFyZWRBdCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gRXhlY3V0ZSBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWdlbnQgTm90aWZpY2F0aW9uIFN5c3RlbVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIE1heGltdW0gcmVjZW50IGJsb2NrcyB0cmFja2VkIHBlciBhZ2VudCB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGggKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1JFQ0VOVF9CTE9DS1MgPSA1MDtcblxuICAvKipcbiAgICogUmVjb3JkIGEgZ2F0ZWtlZXBlciBibG9jayBhZ2FpbnN0IGFsbCBjdXJyZW50bHkgZXhlY3V0aW5nIGFnZW50cy5cbiAgICogQ2FsbGVkIHdoZW4gR2F0ZWtlZXBlci5lbmZvcmNlKCkgZGVuaWVzIGFuIG9wZXJhdGlvbiwgc28gdGhhdFxuICAgKiByZWNvcmRfZXhlY3V0aW9uX3N0ZXAgY2FuIHJlcG9ydCBpdCBhcyBhIG5vdGlmaWNhdGlvbi5cbiAgICpcbiAgICogQHNpbmNlIHYyLjEuMCAtIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVjb3JkR2F0ZWtlZXBlckJsb2NrRm9yQWdlbnRzKFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICAgbGV2ZWw6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leGVjdXRpbmdBZ2VudHMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYmxvY2sgPSB7XG4gICAgICBvcGVyYXRpb24sXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIHJlYXNvbixcbiAgICAgIGxldmVsLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXBvcnRlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgWywgYWdlbnRFbnRyeV0gb2YgdGhpcy5leGVjdXRpbmdBZ2VudHMpIHtcbiAgICAgIGFnZW50RW50cnkucmVjZW50QmxvY2tzLnB1c2goYmxvY2spO1xuXG4gICAgICAvLyBDYXAgYXQgTUFYX1JFQ0VOVF9CTE9DS1M6IGV2aWN0IG9sZGVzdCByZXBvcnRlZCBmaXJzdCwgdGhlbiBvbGRlc3QgdW5yZXBvcnRlZFxuICAgICAgd2hpbGUgKGFnZW50RW50cnkucmVjZW50QmxvY2tzLmxlbmd0aCA+IE1DUEFRTEhhbmRsZXIuTUFYX1JFQ0VOVF9CTE9DS1MpIHtcbiAgICAgICAgY29uc3QgcmVwb3J0ZWRJZHggPSBhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5maW5kSW5kZXgoYiA9PiBiLnJlcG9ydGVkKTtcbiAgICAgICAgaWYgKHJlcG9ydGVkSWR4ID49IDApIHtcbiAgICAgICAgICBhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5zcGxpY2UocmVwb3J0ZWRJZHgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFnZW50RW50cnkucmVjZW50QmxvY2tzLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdCBub3RpZmljYXRpb25zIGZvciBhbiBleGVjdXRpbmcgYWdlbnQgZnJvbSBhbGwgc291cmNlczpcbiAgICogMS4gVW5yZXBvcnRlZCBnYXRla2VlcGVyIGJsb2NrcyDihpIgcGVybWlzc2lvbl9wZW5kaW5nXG4gICAqIDIuIEF1dG9ub215IHBhdXNlIChjb250aW51ZT1mYWxzZSkg4oaSIGF1dG9ub215X3BhdXNlXG4gICAqIDMuIERhbmdlclpvbmUgYmxvY2tlZCBhZ2VudHMgKHN5c3RlbS13aWRlIGJyb2FkY2FzdCkg4oaSIGRhbmdlcl96b25lXG4gICAqXG4gICAqIEdhdGVrZWVwZXIgYmxvY2tzIGFyZSBtYXJrZWQgYXMgXCJyZXBvcnRlZFwiIGFmdGVyIGZpcnN0IGNvbGxlY3Rpb25cbiAgICogc28gdGhleSBkb24ndCByZXBlYXQgb24gc3Vic2VxdWVudCBjYWxscy4gRGFuZ2VyWm9uZSBhbmQgYXV0b25vbXlcbiAgICogbm90aWZpY2F0aW9ucyBhcmUgYWx3YXlzIGVtaXR0ZWQgd2hpbGUgdGhlIGNvbmRpdGlvbiBwZXJzaXN0cy5cbiAgICpcbiAgICogQHNpbmNlIHYyLjEuMCAtIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY29sbGVjdE5vdGlmaWNhdGlvbnMoXG4gICAgYWdlbnROYW1lOiBzdHJpbmcsXG4gICAgYXV0b25vbXk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IEFnZW50Tm90aWZpY2F0aW9uW10ge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbnM6IEFnZW50Tm90aWZpY2F0aW9uW10gPSBbXTtcbiAgICBjb25zdCBleGVjdXRpbmdBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChhZ2VudE5hbWUpO1xuXG4gICAgLy8gU291cmNlIDE6IFVucmVwb3J0ZWQgZ2F0ZWtlZXBlciBibG9ja3NcbiAgICBpZiAoZXhlY3V0aW5nQWdlbnQ/LnJlY2VudEJsb2Nrcykge1xuICAgICAgZm9yIChjb25zdCBibG9jayBvZiBleGVjdXRpbmdBZ2VudC5yZWNlbnRCbG9ja3MpIHtcbiAgICAgICAgaWYgKCFibG9jay5yZXBvcnRlZCkge1xuICAgICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAncGVybWlzc2lvbl9wZW5kaW5nJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke2Jsb2NrLm9wZXJhdGlvbn0ke2Jsb2NrLmVsZW1lbnRUeXBlID8gYCgke2Jsb2NrLmVsZW1lbnRUeXBlfSlgIDogJyd9IHJlcXVpcmVzIGNvbmZpcm1hdGlvbmAsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBvcGVyYXRpb246IGJsb2NrLm9wZXJhdGlvbixcbiAgICAgICAgICAgICAgZWxlbWVudF90eXBlOiBibG9jay5lbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBibG9jay5yZWFzb24sXG4gICAgICAgICAgICAgIGxldmVsOiBibG9jay5sZXZlbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGJsb2NrLnRpbWVzdGFtcCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBibG9jay5yZXBvcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3VyY2UgMjogQXV0b25vbXkgcGF1c2VcbiAgICBpZiAoYXV0b25vbXkuY29udGludWUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCByZWFzb24gPSAoYXV0b25vbXkucmVhc29uIGFzIHN0cmluZykgfHwgKGF1dG9ub215LmZhY3RvcnMgYXMgc3RyaW5nW10gfHwgW10pLmpvaW4oJywgJyk7XG4gICAgICBpZiAocmVhc29uKSB7XG4gICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2F1dG9ub215X3BhdXNlJyxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgcGF1c2VkOiAke3JlYXNvbn1gLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU291cmNlIDM6IERhbmdlclpvbmUgYnJvYWRjYXN0IOKAlCBhbGVydCBBTEwgZXhlY3V0aW5nIGFnZW50cyBhYm91dCBhbnkgYmxvY2tlZCBhZ2VudFxuICAgIGNvbnN0IGVuZm9yY2VyID0gdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXI7XG4gICAgaWYgKGVuZm9yY2VyPy5oYXNCbG9ja2VkQWdlbnRzKCkpIHtcbiAgICAgIGZvciAoY29uc3QgYmxvY2tlZEFnZW50IG9mIGVuZm9yY2VyLmdldEJsb2NrZWRBZ2VudHMoKSkge1xuICAgICAgICBjb25zdCBibG9ja0NoZWNrID0gZW5mb3JjZXIuY2hlY2soYmxvY2tlZEFnZW50KTtcbiAgICAgICAgaWYgKGJsb2NrQ2hlY2suYmxvY2tlZCkge1xuICAgICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnZGFuZ2VyX3pvbmUnLFxuICAgICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke2Jsb2NrZWRBZ2VudH0nIGlzIGJsb2NrZWQgZHVlIHRvIGRhbmdlciB6b25lIHRyaWdnZXI6ICR7YmxvY2tDaGVjay5yZWFzb259YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIGFnZW50TmFtZTogYmxvY2tlZEFnZW50LFxuICAgICAgICAgICAgICByZWFzb246IGJsb2NrQ2hlY2sucmVhc29uLFxuICAgICAgICAgICAgICB2ZXJpZmljYXRpb25JZDogYmxvY2tDaGVjay52ZXJpZmljYXRpb25JZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3RpZmljYXRpb25zO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZXNpbGllbmNlIEV2YWx1YXRpb24gKElzc3VlICM1MjYpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXZhbHVhdGUgcmVzaWxpZW5jZSBwb2xpY3kgYWZ0ZXIgYSBzdGVwIHJlc3VsdCBhbmQgcG90ZW50aWFsbHkgb3ZlcnJpZGVcbiAgICogdGhlIGF1dG9ub215IGRpcmVjdGl2ZSB0byBlbmFibGUgYXV0by1jb250aW51YXRpb24gb3IgcmV0cnkuXG4gICAqXG4gICAqIFJldHVybnMgYSBtb2RpZmllZCBzdGVwIHJlc3VsdCBpZiByZXNpbGllbmNlIGtpY2tzIGluLCBvciBudWxsIHRvIHVzZVxuICAgKiB0aGUgb3JpZ2luYWwgcmVzdWx0IChkZWZhdWx0IGJlaGF2aW9yKS5cbiAgICpcbiAgICogQHNpbmNlIHYyLjEuMCAtIEFnZW50IEV4ZWN1dGlvbiBSZXNpbGllbmNlIChJc3N1ZSAjNTI2KVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBldmFsdWF0ZVJlc2lsaWVuY2UoXG4gICAgYWdlbnROYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlUmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdGVwT3V0Y29tZTogc3RyaW5nXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB7XG4gICAgLy8gT25seSBldmFsdWF0ZSB3aGVuIGF1dG9ub215IHNheXMgcGF1c2VcbiAgICBjb25zdCBhdXRvbm9teSA9IHVwZGF0ZVJlc3VsdC5hdXRvbm9teSBhcyB7IGNvbnRpbnVlOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmc7IGZhY3RvcnM/OiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXV0b25vbXkgfHwgYXV0b25vbXkuY29udGludWUgPT09IHRydWUpIHJldHVybiBudWxsO1xuXG4gICAgLy8gTG9vayB1cCB0aGUgZXhlY3V0aW5nIGFnZW50J3MgcmVzaWxpZW5jZSB0cmFja2luZyBzdGF0ZVxuICAgIGNvbnN0IGV4ZWN1dGluZ0FnZW50ID0gdGhpcy5leGVjdXRpbmdBZ2VudHMuZ2V0KGFnZW50TmFtZSk7XG4gICAgaWYgKCFleGVjdXRpbmdBZ2VudD8ucmVzaWxpZW5jZVBvbGljeSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hhdCB0cmlnZ2VyZWQgdGhlIHBhdXNlXG4gICAgY29uc3QgaXNTdGVwTGltaXQgPSBhdXRvbm9teS5yZWFzb24/LnN0YXJ0c1dpdGgoJ01heGltdW0gYXV0b25vbW91cyBzdGVwcyByZWFjaGVkJykgPz8gZmFsc2U7XG4gICAgY29uc3QgaXNGYWlsdXJlID0gc3RlcE91dGNvbWUgPT09ICdmYWlsdXJlJztcblxuICAgIC8vIE9ubHkgaGFuZGxlIHN0ZXAtbGltaXQgYW5kIGZhaWx1cmUgdHJpZ2dlcnNcbiAgICBpZiAoIWlzU3RlcExpbWl0ICYmICFpc0ZhaWx1cmUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29udGV4dDogUmVzaWxpZW5jZUNvbnRleHQgPSB7XG4gICAgICB0cmlnZ2VyOiBpc1N0ZXBMaW1pdCA/ICdzdGVwX2xpbWl0JyA6ICdleGVjdXRpb25fZmFpbHVyZScsXG4gICAgICBjb250aW51YXRpb25Db3VudDogZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQsXG4gICAgICByZXRyeUNvdW50OiBleGVjdXRpbmdBZ2VudC5yZXRyeUNvdW50LFxuICAgICAgc3RlcE91dGNvbWU6IHN0ZXBPdXRjb21lIGFzICdzdWNjZXNzJyB8ICdmYWlsdXJlJyB8ICdwYXJ0aWFsJyxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9O1xuXG4gICAgY29uc3QgYWN0aW9uID0gZXZhbHVhdGVSZXNpbGllbmNlUG9saWN5KGV4ZWN1dGluZ0FnZW50LnJlc2lsaWVuY2VQb2xpY3ksIGNvbnRleHQpO1xuXG4gICAgLy8gSWYgcmVzaWxpZW5jZSBzYXlzIHBhdXNlLCByZWNvcmQgdGhlIGxpbWl0IGFuZCB1c2UgdGhlIG9yaWdpbmFsIHJlc3VsdFxuICAgIGlmIChhY3Rpb24uYWN0aW9uID09PSAncGF1c2UnKSB7XG4gICAgICAvLyBUcmFjayBpZiB0aGlzIHdhcyBhIGxpbWl0IGV4aGF1c3Rpb24gKG5vdCBhIGRlZmF1bHQtcGF1c2UgcG9saWN5KVxuICAgICAgaWYgKGFjdGlvbi5yZWFzb24/LmluY2x1ZGVzKCdleGhhdXN0ZWQnKSB8fCBhY3Rpb24ucmVhc29uPy5pbmNsdWRlcygnQ2lyY3VpdCBicmVha2VyJykpIHtcbiAgICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkUmVzaWxpZW5jZUxpbWl0KCk7XG4gICAgICAgIGlmIChhY3Rpb24ucmVhc29uPy5pbmNsdWRlcygnQ2lyY3VpdCBicmVha2VyJykpIHtcbiAgICAgICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRDaXJjdWl0QnJlYWtlclRyaXAoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQXV0by1jb250aW51ZTogb3ZlcnJpZGUgdGhlIGF1dG9ub215IGRpcmVjdGl2ZSB0byBjb250aW51ZVxuICAgIGlmIChhY3Rpb24uYWN0aW9uID09PSAnY29udGludWUnKSB7XG4gICAgICBleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudCsrO1xuICAgICAgZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCA9IDA7IC8vIFJlc2V0IHJldHJ5IGNvdW50IG9uIGNvbnRpbnVhdGlvblxuICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkQXV0b0NvbnRpbnVhdGlvbigpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9BVVRPX0NPTlRJTlVFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5ldmFsdWF0ZVJlc2lsaWVuY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgYXV0by1jb250aW51ZWQ6ICR7YWN0aW9uLnJlYXNvbn1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50TmFtZSxcbiAgICAgICAgICBjb250aW51YXRpb25Db3VudDogZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQsXG4gICAgICAgICAgbWF4Q29udGludWF0aW9uczogYWN0aW9uLm1heENvbnRpbnVhdGlvbnMsXG4gICAgICAgICAgdHJpZ2dlcjogY29udGV4dC50cmlnZ2VyLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnVwZGF0ZVJlc3VsdCxcbiAgICAgICAgYXV0b25vbXk6IHtcbiAgICAgICAgICAuLi5hdXRvbm9teSxcbiAgICAgICAgICBjb250aW51ZTogdHJ1ZSxcbiAgICAgICAgICByZWFzb246IGFjdGlvbi5yZWFzb24sXG4gICAgICAgICAgZmFjdG9yczogWy4uLihhdXRvbm9teS5mYWN0b3JzIHx8IFtdKSwgYHJlc2lsaWVuY2U6IGF1dG8tY29udGludWVkICgke2V4ZWN1dGluZ0FnZW50LmNvbnRpbnVhdGlvbkNvdW50fS8ke2FjdGlvbi5tYXhDb250aW51YXRpb25zIHx8ICd1bmxpbWl0ZWQnfSlgXSxcbiAgICAgICAgICByZXNpbGllbmNlQWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJldHJ5OiB0ZWxsIExMTSB0byByZXRyeSB3aXRoIGJhY2tvZmYgZ3VpZGFuY2VcbiAgICBpZiAoYWN0aW9uLmFjdGlvbiA9PT0gJ3JldHJ5Jykge1xuICAgICAgZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCsrO1xuICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkU3RlcFJldHJ5KCk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX1NURVBfUkVUUklFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5ldmFsdWF0ZVJlc2lsaWVuY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgc3RlcCByZXRyeTogJHthY3Rpb24ucmVhc29ufWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnROYW1lLFxuICAgICAgICAgIHJldHJ5Q291bnQ6IGV4ZWN1dGluZ0FnZW50LnJldHJ5Q291bnQsXG4gICAgICAgICAgYmFja29mZk1zOiBhY3Rpb24uYmFja29mZk1zLFxuICAgICAgICAgIHRyaWdnZXI6IGNvbnRleHQudHJpZ2dlcixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVSZXN1bHQsXG4gICAgICAgIGF1dG9ub215OiB7XG4gICAgICAgICAgLi4uYXV0b25vbXksXG4gICAgICAgICAgY29udGludWU6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiBhY3Rpb24ucmVhc29uLFxuICAgICAgICAgIGZhY3RvcnM6IFsuLi4oYXV0b25vbXkuZmFjdG9ycyB8fCBbXSksIGByZXNpbGllbmNlOiByZXRyeSBhdHRlbXB0ICR7ZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudH1gXSxcbiAgICAgICAgICByZXNpbGllbmNlQWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlc3RhcnQ6IG92ZXJyaWRlIHRvIGNvbnRpbnVlLCBzaWduYWwgZnJlc2ggcmVzdGFydCB0byBMTE1cbiAgICBpZiAoYWN0aW9uLmFjdGlvbiA9PT0gJ3Jlc3RhcnQnKSB7XG4gICAgICBleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudCsrO1xuICAgICAgZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCA9IDA7XG4gICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRBdXRvUmVzdGFydCgpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9BVVRPX1JFU1RBUlRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5ldmFsdWF0ZVJlc2lsaWVuY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgYXV0by1yZXN0YXJ0ZWQ6ICR7YWN0aW9uLnJlYXNvbn1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50TmFtZSxcbiAgICAgICAgICBjb250aW51YXRpb25Db3VudDogZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQsXG4gICAgICAgICAgbWF4Q29udGludWF0aW9uczogYWN0aW9uLm1heENvbnRpbnVhdGlvbnMsXG4gICAgICAgICAgdHJpZ2dlcjogY29udGV4dC50cmlnZ2VyLFxuICAgICAgICAgIHByZXNlcnZlU3RhdGU6IGV4ZWN1dGluZ0FnZW50LnJlc2lsaWVuY2VQb2xpY3k/LnByZXNlcnZlU3RhdGUgPz8gdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVSZXN1bHQsXG4gICAgICAgIGF1dG9ub215OiB7XG4gICAgICAgICAgLi4uYXV0b25vbXksXG4gICAgICAgICAgY29udGludWU6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiBhY3Rpb24ucmVhc29uLFxuICAgICAgICAgIGZhY3RvcnM6IFsuLi4oYXV0b25vbXkuZmFjdG9ycyB8fCBbXSksIGByZXNpbGllbmNlOiBhdXRvLXJlc3RhcnRlZCAoJHtleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudH0vJHthY3Rpb24ubWF4Q29udGludWF0aW9ucyB8fCAndW5saW1pdGVkJ30pYF0sXG4gICAgICAgICAgcmVzaWxpZW5jZUFjdGlvbjogYWN0aW9uLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWN0aXZlIGdvYWwgSURzIGZvciBhbiBhZ2VudCAoSXNzdWUgIzI0OSkuXG4gICAqIFF1ZXJpZXMgdGhlIGFnZW50J3Mgc3RhdGUgdG8gZmluZCBpbi1wcm9ncmVzcyBnb2Fscy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWN0aXZlR29hbElkcyhcbiAgICBtYW5hZ2VyOiBBZ2VudE1hbmFnZXIsXG4gICAgYWdlbnROYW1lOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuZ2V0QWdlbnRTdGF0ZSh7IGFnZW50TmFtZSB9KTtcbiAgICAgIGlmIChzdGF0ZVJlc3VsdD8uc3RhdGU/LmdvYWxzKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZVJlc3VsdC5zdGF0ZS5nb2Fsc1xuICAgICAgICAgIC5maWx0ZXIoKGc6IHsgc3RhdHVzOiBzdHJpbmcgfSkgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpXG4gICAgICAgICAgLm1hcCgoZzogeyBpZDogc3RyaW5nIH0pID0+IGcuaWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWdlbnQgbWF5IG5vdCBoYXZlIHN0YXRlIHlldFxuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGNvcnJlbGF0aW9uIElEIGZyb20gdGhlIHVuZGVybHlpbmcgQ29udGV4dFRyYWNrZXIuXG4gICAqIEV4cG9zZWQgZm9yIHVzZSBieSBVbmlmaWVkRW5kcG9pbnQgYW5kIG90aGVyIHdyYXBwZXJzLlxuICAgKiBJc3N1ZSAjMzAxLlxuICAgKi9cbiAgZ2V0Q29ycmVsYXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlc3VsdCBIZWxwZXIgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHJlc3BvbnNlIG1ldGFkYXRhIHdpdGggY29ycmVsYXRpb24gSUQgYW5kIHRpbWluZy5cbiAgICogSXNzdWUgIzMwMTogUmVxdWVzdCBJRHMgYW5kIGRpc3RyaWJ1dGVkIHRyYWNpbmcgc3VwcG9ydC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRNZXRhKHN0YXJ0VGltZTogbnVtYmVyKTogUmVzcG9uc2VNZXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWVzdElkOiB0aGlzLmNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCkgPz8gJ3Vua25vd24nLFxuICAgICAgZHVyYXRpb25NczogcGFyc2VGbG9hdCgocGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWUpLnRvRml4ZWQoMikpLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdWNjZXNzZnVsIG9wZXJhdGlvbiByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgc3VjY2VzcyhkYXRhOiB1bmtub3duLCBzdGFydFRpbWU6IG51bWJlcik6IE9wZXJhdGlvblN1Y2Nlc3Mge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgZGF0YSxcbiAgICAgIF9tZXRhOiB0aGlzLmJ1aWxkTWV0YShzdGFydFRpbWUpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZmFpbGVkIG9wZXJhdGlvbiByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgZmFpbHVyZShlcnJvcjogc3RyaW5nLCBzdGFydFRpbWU6IG51bWJlcik6IE9wZXJhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yLFxuICAgICAgX21ldGE6IHRoaXMuYnVpbGRNZXRhKHN0YXJ0VGltZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRmllbGQgU2VsZWN0aW9uIChJc3N1ZSAjMjAyKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFwcGx5IGZpZWxkIHNlbGVjdGlvbiBhbmQgbmFtZSB0cmFuc2Zvcm1hdGlvbiB0byBoYW5kbGVyIHJlc3BvbnNlLlxuICAgKlxuICAgKiBQcm9jZXNzZXMgdGhlIGBmaWVsZHNgIHBhcmFtZXRlciB0byBmaWx0ZXIgcmVzcG9uc2UgZGF0YTpcbiAgICogLSBJZiBmaWVsZHMgaXMgYW4gYXJyYXksIGZpbHRlciB0byB0aG9zZSBmaWVsZHMgb25seVxuICAgKiAtIElmIGZpZWxkcyBpcyBhIHByZXNldCBzdHJpbmcgKCdtaW5pbWFsJywgJ3N0YW5kYXJkJywgJ2Z1bGwnKSwgdXNlIHByZXNldFxuICAgKiAtIElmIGZpZWxkcyBpcyBub3QgcHJvdmlkZWQsIHRyYW5zZm9ybSBuYW1lcyBvbmx5IChuYW1lIOKGkiBlbGVtZW50X25hbWUpXG4gICAqXG4gICAqIEZvciByZXNwb25zZXMgd2l0aCBgcmVzdWx0c2Agb3IgYGl0ZW1zYCBhcnJheXMsIGZpZWxkIHNlbGVjdGlvbiBpcyBhcHBsaWVkXG4gICAqIHRvIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgcmF0aGVyIHRoYW4gZmlsdGVyaW5nIHRoZSBjb250YWluZXIgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHJhdyBoYW5kbGVyIHJlc3VsdFxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3JpZ2luYWwgcGFyYW1zIGNvbnRhaW5pbmcgb3B0aW9uYWwgYGZpZWxkc2BcbiAgICogQHJldHVybnMgVHJhbnNmb3JtZWQgcmVzdWx0IHdpdGggZmllbGQgc2VsZWN0aW9uIGFwcGxpZWRcbiAgICovXG4gIHByaXZhdGUgYXBwbHlGaWVsZFNlbGVjdGlvbihcbiAgICByZXN1bHQ6IHVua25vd24sXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdW5rbm93biB7XG4gICAgLy8gU2tpcCB0cmFuc2Zvcm1hdGlvbiBmb3IgTUNQIHJlc3BvbnNlIGZvcm1hdCB3aXRoIGNvbnRlbnQgYXJyYXlcbiAgICAvLyBUaGVzZSBhcmUgZm9ybWF0dGVkIHRleHQgcmVzcG9uc2VzIHRoYXQgc2hvdWxkbid0IGJlIHRyYW5zZm9ybWVkXG4gICAgaWYgKHRoaXMuaXNNQ1BSZXNwb25zZShyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkc1BhcmFtID0gcGFyYW1zPy5maWVsZHM7XG5cbiAgICAvLyBObyBmaWVsZHMgcGFyYW0gLSBhcHBseSBuYW1lIHRyYW5zZm9ybWF0aW9uIG9ubHlcbiAgICBpZiAoZmllbGRzUGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtV2l0aEFycmF5QXdhcmVuZXNzKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSBmaWVsZHMgZnJvbSBwcmVzZXQgb3IgYXJyYXlcbiAgICBsZXQgZmllbGRzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJlc2V0OiAnbWluaW1hbCcgfCAnc3RhbmRhcmQnIHwgJ2Z1bGwnIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBmaWVsZHNQYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChpc1ZhbGlkUHJlc2V0KGZpZWxkc1BhcmFtKSkge1xuICAgICAgICBpZiAoZmllbGRzUGFyYW0gPT09ICdmdWxsJykge1xuICAgICAgICAgIC8vICdmdWxsJyBwcmVzZXQgPSBhbGwgZmllbGRzLCBqdXN0IHRyYW5zZm9ybSBuYW1lc1xuICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHByZXNldCA9IGZpZWxkc1BhcmFtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW52YWxpZCBwcmVzZXQgLSB0cmVhdCBhcyBzaW5nbGUgZmllbGRcbiAgICAgICAgZmllbGRzID0gW2ZpZWxkc1BhcmFtXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRzUGFyYW0pKSB7XG4gICAgICAvLyBGaWx0ZXIgdG8gc3RyaW5ncyBvbmx5LCB3YXJuIGFib3V0IG5vbi1zdHJpbmcgZWxlbWVudHNcbiAgICAgIGNvbnN0IG5vblN0cmluZ0NvdW50ID0gZmllbGRzUGFyYW0uZmlsdGVyKGYgPT4gdHlwZW9mIGYgIT09ICdzdHJpbmcnKS5sZW5ndGg7XG4gICAgICBpZiAobm9uU3RyaW5nQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBGaWVsZCBzZWxlY3Rpb246ICR7bm9uU3RyaW5nQ291bnR9IG5vbi1zdHJpbmcgZWxlbWVudChzKSBpbiBmaWVsZHMgYXJyYXkgaWdub3JlZGBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyaW5nRmllbGRzID0gZmllbGRzUGFyYW0uZmlsdGVyKChmKTogZiBpcyBzdHJpbmcgPT4gdHlwZW9mIGYgPT09ICdzdHJpbmcnKTtcbiAgICAgIGlmIChzdHJpbmdGaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGZpZWxkcyA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBmaWVsZCBuYW1lcyBmb3Igc2VjdXJpdHkgYW5kIGNoZWNrIGZvciBVbmljb2RlIGlzc3Vlc1xuICAgICAgICBjb25zdCB7IG5vcm1hbGl6ZWQsIHdhcm5pbmdzIH0gPSBub3JtYWxpemVGaWVsZE5hbWVzKHN0cmluZ0ZpZWxkcyk7XG4gICAgICAgIGlmICh3YXJuaW5ncykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBGaWVsZCBzZWxlY3Rpb24gVW5pY29kZSBub3JtYWxpemF0aW9uOiAke3dhcm5pbmdzLmpvaW4oJzsgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRzID0gbm9ybWFsaXplZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBObyB2YWxpZCBmaWVsZHMgLSBqdXN0IHRyYW5zZm9ybSBuYW1lc1xuICAgIGlmICghZmllbGRzICYmICFwcmVzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGZpZWxkIGZpbHRlcmluZyB3aXRoIGFycmF5LWF3YXJlbmVzc1xuICAgIHJldHVybiB0aGlzLmZpbHRlcldpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQsIGZpZWxkcywgcHJlc2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gcmVzcG9uc2Ugd2l0aCBhd2FyZW5lc3Mgb2YgbmVzdGVkIGFycmF5cy5cbiAgICogQXBwbGllcyBuYW1lIHRyYW5zZm9ybWF0aW9uIHRvIGl0ZW1zIHdpdGhpbiBgcmVzdWx0c2Agb3IgYGl0ZW1zYCBhcnJheXMuXG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNvbW1vbiBhcnJheSBjb250YWluZXIgcGF0dGVybnNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iai5yZXN1bHRzKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRoaXMudHJhbnNmb3JtVG9wTGV2ZWwob2JqLCBbJ3Jlc3VsdHMnXSksXG4gICAgICAgICAgcmVzdWx0czogZmlsdGVyRmllbGRzKG9iai5yZXN1bHRzLCB7IHRyYW5zZm9ybU5hbWVzOiB0cnVlIH0pLmRhdGEsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmouaXRlbXMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy50cmFuc2Zvcm1Ub3BMZXZlbChvYmosIFsnaXRlbXMnXSksXG4gICAgICAgICAgaXRlbXM6IGZpbHRlckZpZWxkcyhvYmouaXRlbXMsIHsgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiB0cmFuc2Zvcm0gZW50aXJlIHJlc3BvbnNlXG4gICAgY29uc3QgeyBkYXRhIH0gPSBmaWx0ZXJGaWVsZHMocmVzdWx0LCB7IHRyYW5zZm9ybU5hbWVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciByZXNwb25zZSB3aXRoIGF3YXJlbmVzcyBvZiBuZXN0ZWQgYXJyYXlzLlxuICAgKiBBcHBsaWVzIGZpZWxkIGZpbHRlcmluZyB0byBpdGVtcyB3aXRoaW4gYHJlc3VsdHNgIG9yIGBpdGVtc2AgYXJyYXlzLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJXaXRoQXJyYXlBd2FyZW5lc3MoXG4gICAgcmVzdWx0OiB1bmtub3duLFxuICAgIGZpZWxkcz86IHN0cmluZ1tdLFxuICAgIHByZXNldD86ICdtaW5pbWFsJyB8ICdzdGFuZGFyZCcgfCAnZnVsbCdcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBjb25zdCBvYmogPSByZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIC8vIENoZWNrIGZvciBjb21tb24gYXJyYXkgY29udGFpbmVyIHBhdHRlcm5zXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmoucmVzdWx0cykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybVRvcExldmVsKG9iaiwgWydyZXN1bHRzJ10pLFxuICAgICAgICAgIHJlc3VsdHM6IGZpbHRlckZpZWxkcyhvYmoucmVzdWx0cywgeyBmaWVsZHMsIHByZXNldCwgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iai5pdGVtcykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybVRvcExldmVsKG9iaiwgWydpdGVtcyddKSxcbiAgICAgICAgICBpdGVtczogZmlsdGVyRmllbGRzKG9iai5pdGVtcywgeyBmaWVsZHMsIHByZXNldCwgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiBmaWx0ZXIgZW50aXJlIHJlc3BvbnNlXG4gICAgY29uc3QgeyBkYXRhIH0gPSBmaWx0ZXJGaWVsZHMocmVzdWx0LCB7IGZpZWxkcywgcHJlc2V0LCB0cmFuc2Zvcm1OYW1lczogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdG9wLWxldmVsIGZpZWxkcyBvZiBhbiBvYmplY3QsIGV4Y2x1ZGluZyBzcGVjaWZpZWQga2V5cy5cbiAgICogVXNlZCB0byBwcmVzZXJ2ZSBjb250YWluZXIgbWV0YWRhdGEgKHRvdGFsLCBxdWVyeSwgZXRjLikgd2hpbGUgZmlsdGVyaW5nIG5lc3RlZCBhcnJheXMuXG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybVRvcExldmVsKFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZXhjbHVkZUtleXM6IHN0cmluZ1tdXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgaWYgKCFleGNsdWRlS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcmVzdWx0IGlzIGFuIE1DUCByZXNwb25zZSBmb3JtYXQgKHdpdGggY29udGVudCBhcnJheSkuXG4gICAqIFRoZXNlIHJlc3BvbnNlcyBjb250YWluIGZvcm1hdHRlZCB0ZXh0IGFuZCBzaG91bGRuJ3QgYmUgdHJhbnNmb3JtZWQuXG4gICAqL1xuICBwcml2YXRlIGlzTUNQUmVzcG9uc2UocmVzdWx0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHJlc3VsdCAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICdjb250ZW50JyBpbiByZXN1bHQgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoKHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuY29udGVudClcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIENMSSBhcHByb3ZhbCBwb2xpY3kgZnJvbSBhbGwgYWN0aXZlIGVsZW1lbnRzLlxuICpcbiAqIFVuaW9ucyBgcmVxdWlyZUFwcHJvdmFsYCBhcnJheXMgYWNyb3NzIGFsbCBlbGVtZW50cy4gVGFrZXMgdGhlIG1vc3RcbiAqIGNvbnNlcnZhdGl2ZSAoc21hbGxlc3QpIFRUTC4gRmFsbHMgYmFjayB0byBlbnYgdmFyIGBET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX1BPTElDWWAuXG4gKlxuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnRzIC0gQ3VycmVudGx5IGFjdGl2ZSBlbGVtZW50c1xuICogQHJldHVybnMgUmVzb2x2ZWQgYXBwcm92YWwgcG9saWN5XG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVDbGlBcHByb3ZhbFBvbGljeShhY3RpdmVFbGVtZW50czogQWN0aXZlRWxlbWVudFtdKTogQ2xpQXBwcm92YWxQb2xpY3kge1xuICBjb25zdCByZXF1aXJlQXBwcm92YWwgPSBuZXcgU2V0PCdtb2RlcmF0ZScgfCAnZGFuZ2Vyb3VzJz4oKTtcbiAgbGV0IGRlZmF1bHRTY29wZTogQ2xpQXBwcm92YWxTY29wZSB8IHVuZGVmaW5lZDtcbiAgbGV0IHR0bFNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWN0aXZlRWxlbWVudHMpIHtcbiAgICBjb25zdCBwb2xpY3kgPSBlbGVtZW50Lm1ldGFkYXRhPy5nYXRla2VlcGVyPy5leHRlcm5hbFJlc3RyaWN0aW9ucz8uYXBwcm92YWxQb2xpY3k7XG4gICAgaWYgKCFwb2xpY3kpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHBvbGljeS5yZXF1aXJlQXBwcm92YWwpIHtcbiAgICAgIGZvciAoY29uc3QgbGV2ZWwgb2YgcG9saWN5LnJlcXVpcmVBcHByb3ZhbCkge1xuICAgICAgICByZXF1aXJlQXBwcm92YWwuYWRkKGxldmVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBvbGljeS5kZWZhdWx0U2NvcGUgJiYgIWRlZmF1bHRTY29wZSkge1xuICAgICAgZGVmYXVsdFNjb3BlID0gcG9saWN5LmRlZmF1bHRTY29wZTtcbiAgICB9XG4gICAgaWYgKHBvbGljeS50dGxTZWNvbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHR0bFNlY29uZHMgPSB0dGxTZWNvbmRzID09PSB1bmRlZmluZWQgPyBwb2xpY3kudHRsU2Vjb25kcyA6IE1hdGgubWluKHR0bFNlY29uZHMsIHBvbGljeS50dGxTZWNvbmRzKTtcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICBpZiAocmVxdWlyZUFwcHJvdmFsLnNpemUgPT09IDApIHtcbiAgICBjb25zdCBlbnZQb2xpY3kgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX1BPTElDWTtcbiAgICBpZiAoZW52UG9saWN5KSB7XG4gICAgICBjb25zdCBsZXZlbHMgPSBlbnZQb2xpY3kuc3BsaXQoJywnKS5tYXAocyA9PiBzLnRyaW0oKSkuZmlsdGVyKHMgPT4gcyA9PT0gJ21vZGVyYXRlJyB8fCBzID09PSAnZGFuZ2Vyb3VzJyk7XG4gICAgICBmb3IgKGNvbnN0IGxldmVsIG9mIGxldmVscykge1xuICAgICAgICByZXF1aXJlQXBwcm92YWwuYWRkKGxldmVsIGFzICdtb2RlcmF0ZScgfCAnZGFuZ2Vyb3VzJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICByZXF1aXJlQXBwcm92YWw6IHJlcXVpcmVBcHByb3ZhbC5zaXplID4gMCA/IEFycmF5LmZyb20ocmVxdWlyZUFwcHJvdmFsKSA6IHVuZGVmaW5lZCxcbiAgICBkZWZhdWx0U2NvcGUsXG4gICAgdHRsU2Vjb25kcyxcbiAgfTtcbn1cbiJdfQ==
|
|
3638
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTUNQQVFMSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUdILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQXNCLDJCQUEyQixFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHlCQUF5QixFQUFFLDJCQUEyQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0osT0FBTyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlGLE9BQU8sRUFNTCxtQkFBbUIsRUFDbkIsb0JBQW9CLEVBSXBCLGNBQWMsRUFDZCwwQkFBMEIsR0FDM0IsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMs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IC0gVW5pZmllZCBoYW5kbGVyIGZvciBhbGwgTUNQLUFRTCBvcGVyYXRpb25zXG4gKlxuICogQVJDSElURUNUVVJFOlxuICogLSBUaGluIHJlc29sdmVyIHBhdHRlcm46IHZhbGlkYXRlcyDihpIgcm91dGVzIOKGkiBkaXNwYXRjaGVzXG4gKiAtIFNPTElEIHByaW5jaXBsZXM6IGRlcGVuZHMgb24gYWJzdHJhY3Rpb25zIChIYW5kbGVyUmVnaXN0cnkgaW50ZXJmYWNlKVxuICogLSBEZWZlbnNlIGluIGRlcHRoOiBHYXRla2VlcGVyIHZhbGlkYXRlcyBlbmRwb2ludC9vcGVyYXRpb24gbWF0Y2hpbmcgYW5kIGVuZm9yY2VzIHBvbGljaWVzXG4gKiAtIERpc3BhdGNoIHBhdHRlcm46IHJvdXRlcyBoYW5kbGVyIHJlZmVyZW5jZXMgdG8gYWN0dWFsIG1ldGhvZCBjYWxsc1xuICpcbiAqIE9QRVJBVElPTiBGTE9XOlxuICogMS4gVmFsaWRhdGUgaW5wdXQgc3RydWN0dXJlICh0eXBlIGd1YXJkcylcbiAqIDIuIFZhbGlkYXRlIHBlcm1pc3Npb25zIChHYXRla2VlcGVyKVxuICogMy4gUm91dGUgb3BlcmF0aW9uIChPcGVyYXRpb25Sb3V0ZXIpXG4gKiA0LiBEaXNwYXRjaCB0byBoYW5kbGVyIChyZXNvbHZlSGFuZGxlclJlZmVyZW5jZSlcbiAqIDUuIFJldHVybiBzdGFuZGFyZGl6ZWQgcmVzdWx0IChPcGVyYXRpb25SZXN1bHQpXG4gKlxuICogRVJST1IgSEFORExJTkc6XG4gKiBBbGwgZXJyb3JzIGFyZSBjYXVnaHQgYW5kIHJldHVybmVkIGFzIE9wZXJhdGlvbkZhaWx1cmUgd2l0aDpcbiAqIC0gc3VjY2VzczogZmFsc2VcbiAqIC0gZXJyb3I6IGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2VcbiAqIC0gZGF0YTogbmV2ZXIgKGRpc2NyaW1pbmF0ZWQgdW5pb24gZW5mb3JjZXMgdGhpcylcbiAqL1xuXG5pbXBvcnQgeyBDUlVERW5kcG9pbnQgfSBmcm9tICcuL09wZXJhdGlvblJvdXRlci5qcyc7XG5pbXBvcnQgeyBHYXRla2VlcGVyIH0gZnJvbSAnLi9HYXRla2VlcGVyLmpzJztcbmltcG9ydCB7IHR5cGUgQWN0aXZlRWxlbWVudCwgdHJhbnNsYXRlVG9vbENvbmZpZ1RvUG9saWN5LCBjYW5PcGVyYXRpb25CZUVsZXZhdGVkIH0gZnJvbSAnLi9wb2xpY2llcy9pbmRleC5qcyc7XG5pbXBvcnQgeyBpc0dhdGVrZWVwZXJJbmZyYU9wZXJhdGlvbiwgZmluZENvbmZpcm1EZW55aW5nRWxlbWVudCwgZmluZENvbmZpcm1BZHZpc29yeUVsZW1lbnRzLCBnZXRHYXRla2VlcGVyRGlhZ25vc3RpY3MgfSBmcm9tICcuL3BvbGljaWVzL0VsZW1lbnRQb2xpY2llcy5qcyc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uTGV2ZWwsIEdhdGVrZWVwZXJFcnJvckNvZGUgfSBmcm9tICcuL0dhdGVrZWVwZXJUeXBlcy5qcyc7XG5pbXBvcnQgeyBnZXRSb3V0ZSB9IGZyb20gJy4vT3BlcmF0aW9uUm91dGVyLmpzJztcbmltcG9ydCB7IEFMTF9PUEVSQVRJT05fU0NIRU1BUyB9IGZyb20gJy4vT3BlcmF0aW9uU2NoZW1hLmpzJztcbmltcG9ydCB7IEludHJvc3BlY3Rpb25SZXNvbHZlciB9IGZyb20gJy4vSW50cm9zcGVjdGlvblJlc29sdmVyLmpzJztcbmltcG9ydCB7IFNjaGVtYURpc3BhdGNoZXIgfSBmcm9tICcuL1NjaGVtYURpc3BhdGNoZXIuanMnO1xuaW1wb3J0IHsgaW5pdGlhbGl6ZU5vcm1hbGl6ZXJzIH0gZnJvbSAnLi9ub3JtYWxpemVycy9pbmRleC5qcyc7XG5pbXBvcnQgeyBmaWx0ZXJGaWVsZHMsIGlzVmFsaWRQcmVzZXQsIG5vcm1hbGl6ZUZpZWxkTmFtZXMgfSBmcm9tICcuLi8uLi91dGlscy9GaWVsZEZpbHRlci5qcyc7XG5pbXBvcnQge1xuICBPcGVyYXRpb25JbnB1dCxcbiAgT3BlcmF0aW9uUmVzdWx0LFxuICBPcGVyYXRpb25TdWNjZXNzLFxuICBPcGVyYXRpb25GYWlsdXJlLFxuICBSZXNwb25zZU1ldGEsXG4gIHBhcnNlT3BlcmF0aW9uSW5wdXQsXG4gIGRlc2NyaWJlSW52YWxpZElucHV0LFxuICBCYXRjaFJlcXVlc3QsXG4gIEJhdGNoUmVzdWx0LFxuICBCYXRjaE9wZXJhdGlvblJlc3VsdCxcbiAgaXNCYXRjaFJlcXVlc3QsXG4gIG5vcm1hbGl6ZU1DUEFRTEVsZW1lbnRUeXBlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBpc1NlYXJjaE1hdGNoIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2VhcmNoVXRpbHMuanMnO1xuaW1wb3J0IHsgUGFnaW5hdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9xdWVyeS9QYWdpbmF0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVFbGVtZW50VHlwZSwgQUxMX0VMRU1FTlRfVFlQRVMsIGZvcm1hdEVsZW1lbnRUeXBlc0xpc3QgfSBmcm9tICcuLi8uLi91dGlscy9lbGVtZW50VHlwZU5vcm1hbGl6YXRpb24uanMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBTRUNVUklUWV9MSU1JVFMgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgY2xhc3NpZnlUb29sLCBldmFsdWF0ZUNsaVRvb2xQb2xpY3ksIGFzc2Vzc1Jpc2sgfSBmcm9tICcuL3BvbGljaWVzL1Rvb2xDbGFzc2lmaWNhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IENsaUFwcHJvdmFsU2NvcGUsIENsaUFwcHJvdmFsUG9saWN5IH0gZnJvbSAnLi9HYXRla2VlcGVyVHlwZXMuanMnO1xuaW1wb3J0IHsgUmF0ZUxpbWl0ZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vdXRpbHMvUmF0ZUxpbWl0ZXIuanMnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vY29uZmlnL2Vudi5qcyc7XG5pbXBvcnQgeyBTVE9SQUdFX0xBWUVSX0NPTkZJRyB9IGZyb20gJy4uLy4uL2NvbmZpZy9wZXJmb3JtYW5jZS1jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBEYW5nZXJab25lRW5mb3JjZXIgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9EYW5nZXJab25lRW5mb3JjZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBWZXJpZmljYXRpb25TdG9yZSB9IGZyb20gJ0Bkb2xsaG91c2VtY3Avc2FmZXR5JztcbmltcG9ydCB0eXBlIHsgSVZlcmlmaWNhdGlvbk5vdGlmaWVyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvVmVyaWZpY2F0aW9uTm90aWZpZXIuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEaXNwbGF5Q29kZSB9IGZyb20gJ0Bkb2xsaG91c2VtY3Avc2FmZXR5JztcbmltcG9ydCB7IHJhbmRvbVVVSUQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRDUlVESGFuZGxlciB9IGZyb20gJy4uL0VsZW1lbnRDUlVESGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeU1hbmFnZXIgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9tZW1vcmllcy9NZW1vcnlNYW5hZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgQWdlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL0FnZW50TWFuYWdlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEFnZW50TWV0YWRhdGFWMiwgQWdlbnRSZXNpbGllbmNlUG9saWN5LCBBZ2VudE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy90eXBlcy5qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZVJlc2lsaWVuY2VQb2xpY3ksIGNpcmN1aXRCcmVha2VyLCB0eXBlIFJlc2lsaWVuY2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvYWdlbnRzL3Jlc2lsaWVuY2VFdmFsdWF0b3IuanMnO1xuaW1wb3J0IHsgcmVzaWxpZW5jZU1ldHJpY3MgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvcmVzaWxpZW5jZU1ldHJpY3MuanMnO1xuaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZVJlbmRlcmVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvVGVtcGxhdGVSZW5kZXJlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVsZW1lbnRRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9xdWVyeS9FbGVtZW50UXVlcnlTZXJ2aWNlLmpzJztcbmltcG9ydCB7IGFnZ3JlZ2F0ZUVsZW1lbnRzLCB2YWxpZGF0ZUFnZ3JlZ2F0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3F1ZXJ5L0FnZ3JlZ2F0aW9uU2VydmljZS5qcyc7XG5pbXBvcnQgdHlwZSB7IElFbGVtZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uSGFuZGxlciB9IGZyb20gJy4uL0NvbGxlY3Rpb25IYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUG9ydGZvbGlvSGFuZGxlciB9IGZyb20gJy4uL1BvcnRmb2xpb0hhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBHaXRIdWJBdXRoSGFuZGxlciB9IGZyb20gJy4uL0dpdEh1YkF1dGhIYW5kbGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29uZmlnSGFuZGxlciB9IGZyb20gJy4uL0NvbmZpZ0hhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBFbmhhbmNlZEluZGV4SGFuZGxlciB9IGZyb20gJy4uL0VuaGFuY2VkSW5kZXhIYW5kbGVyLmpzJztcbmltcG9ydCB7IGdldFBlcm1pc3Npb25Ib29rU3RhdHVzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGVybWlzc2lvbkhvb2tzLmpzJztcbmltcG9ydCB0eXBlIHsgUGVyc29uYUhhbmRsZXIgfSBmcm9tICcuLi9QZXJzb25hSGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFN5bmNIYW5kbGVyIH0gZnJvbSAnLi4vU3luY0hhbmRsZXJWMi5qcyc7XG5pbXBvcnQgdHlwZSB7IEJ1aWxkSW5mb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9CdWlsZEluZm9TZXJ2aWNlLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TG9nU2luayB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcyc7XG5pbXBvcnQgdHlwZSB7IExvZ1F1ZXJ5T3B0aW9ucyB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZXRyaWNRdWVyeU9wdGlvbnMsIE1ldHJpY1R5cGUgfSBmcm9tICcuLi8uLi9tZXRyaWNzL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUGVyZm9ybWFuY2VNb25pdG9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvUGVyZm9ybWFuY2VNb25pdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgT3BlcmF0aW9uTWV0cmljc1RyYWNrZXIgfSBmcm9tICcuLi8uLi9tZXRyaWNzL09wZXJhdGlvbk1ldHJpY3NUcmFja2VyLmpzJztcbmltcG9ydCB0eXBlIHsgR2F0ZWtlZXBlck1ldHJpY3NUcmFja2VyIH0gZnJvbSAnLi4vLi4vbWV0cmljcy9HYXRla2VlcGVyTWV0cmljc1RyYWNrZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vUG9ydGZvbGlvTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBwcmVwYXJlSGFuZG9mZlN0YXRlLCBwYXJzZUhhbmRvZmZCbG9jaywgZ2VuZXJhdGVIYW5kb2ZmQmxvY2sgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvaGFuZG9mZi5qcyc7XG5pbXBvcnQgeyBnZXRBdXRvbm9teU1ldHJpY3MgfSBmcm9tICcuLi8uLi9lbGVtZW50cy9hZ2VudHMvYXV0b25vbXlFdmFsdWF0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBBdXRvbm9teU1ldHJpY3NTbmFwc2hvdCB9IGZyb20gJy4uLy4uL2VsZW1lbnRzL2FnZW50cy9hdXRvbm9teUV2YWx1YXRvci5qcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBhcmFtZXRlciBWYWxpZGF0aW9uIFV0aWxpdGllcyAoSXNzdWUgIzMyMylcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgZXh0cmFjdCBhIHJlcXVpcmVkIHN0cmluZyBwYXJhbWV0ZXIgZnJvbSBwYXJhbXMuXG4gKiBUaHJvd3MgYSB1c2VyLWZyaWVuZGx5IGVycm9yIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbWlzc2luZyBvciBub3QgYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdCB0byBleHRyYWN0IGZyb21cbiAqIEBwYXJhbSBwYXJhbU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVxdWlyZWQgcGFyYW1ldGVyXG4gKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGVycm9yIG1lc3NhZ2VcbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgc3RyaW5nIHZhbHVlXG4gKiBAdGhyb3dzIEVycm9yIHdpdGggdXNlci1mcmllbmRseSBtZXNzYWdlIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGFyYW1OYW1lOiBzdHJpbmcsXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gcGFyYW1zW3BhcmFtTmFtZV07XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUudHJpbSgpID09PSAnJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlciAnJHtwYXJhbU5hbWV9Jy4gRXhwZWN0ZWQ6IHN0cmluZyAoJHtkZXNjcmlwdGlvbn0pYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBmbGF0IHBhZ2luYXRpb24gcGFyYW1zIGludG8gYSB7IHBhZ2UsIHBhZ2VTaXplIH0gb2JqZWN0LlxuICpcbiAqIElzc3VlICM1MDA6IHF1ZXJ5X2VsZW1lbnRzIGFuZCBzZWFyY2hfZWxlbWVudHMgc2lsZW50bHkgaWdub3JlZCBmbGF0XG4gKiBwYWdlU2l6ZS9wYWdlL2xpbWl0L29mZnNldCBwYXJhbXMuIFRoaXMgaGVscGVyIGRldGVjdHMgdGhlc2UgYXQgdGhlXG4gKiB0b3AgbGV2ZWwgYW5kIG5vcm1hbGl6ZXMgdGhlbSwgbWF0Y2hpbmcgdGhlIHBhdHRlcm4gdXNlZCBieSBsaXN0RWxlbWVudHMuXG4gKlxuICogUHJpb3JpdHk6IG5lc3RlZCBwYWdpbmF0aW9uID4gbGltaXQvb2Zmc2V0ID4gZmxhdCBwYWdlL3BhZ2VTaXplID4gZGVmYXVsdHNcbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGFnaW5hdGlvblBhcmFtcyhcbiAgcGFyYW1zOiB7XG4gICAgcGFnaW5hdGlvbj86IHsgcGFnZT86IG51bWJlcjsgcGFnZVNpemU/OiBudW1iZXIgfTtcbiAgICBwYWdlPzogbnVtYmVyO1xuICAgIHBhZ2VTaXplPzogbnVtYmVyO1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICB9XG4pOiB7IHBhZ2U6IG51bWJlcjsgcGFnZVNpemU6IG51bWJlciB9IHtcbiAgLy8gSWYgbmVzdGVkIHBhZ2luYXRpb24gaXMgcHJlc2VudCwgdXNlIGl0IGRpcmVjdGx5XG4gIGlmIChwYXJhbXMucGFnaW5hdGlvbiAmJiB0eXBlb2YgcGFyYW1zLnBhZ2luYXRpb24gPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgcCA9IHBhcmFtcy5wYWdpbmF0aW9uO1xuICAgIHJldHVybiB7XG4gICAgICBwYWdlOiAodHlwZW9mIHAucGFnZSA9PT0gJ251bWJlcicgJiYgcC5wYWdlID4gMCkgPyBwLnBhZ2UgOiAxLFxuICAgICAgcGFnZVNpemU6ICh0eXBlb2YgcC5wYWdlU2l6ZSA9PT0gJ251bWJlcicgJiYgcC5wYWdlU2l6ZSA+IDApID8gcC5wYWdlU2l6ZSA6IDIwLFxuICAgIH07XG4gIH1cblxuICBsZXQgcGFnZSA9IDE7XG4gIGxldCBwYWdlU2l6ZSA9IDIwO1xuXG4gIC8vIFN1cHBvcnQgbGltaXQvb2Zmc2V0IHN0eWxlIChjb252ZXJ0IHRvIHBhZ2UvcGFnZVNpemUpXG4gIGlmICh0eXBlb2YgcGFyYW1zLmxpbWl0ID09PSAnbnVtYmVyJyAmJiBwYXJhbXMubGltaXQgPiAwKSB7XG4gICAgcGFnZVNpemUgPSBwYXJhbXMubGltaXQ7XG4gICAgaWYgKHR5cGVvZiBwYXJhbXMub2Zmc2V0ID09PSAnbnVtYmVyJyAmJiBwYXJhbXMub2Zmc2V0ID49IDApIHtcbiAgICAgIHBhZ2UgPSBNYXRoLmZsb29yKHBhcmFtcy5vZmZzZXQgLyBwYXJhbXMubGltaXQpICsgMTtcbiAgICB9XG4gIH1cblxuICAvLyBTdXBwb3J0IGZsYXQgcGFnZS9wYWdlU2l6ZSAob3ZlcnJpZGVzIGxpbWl0L29mZnNldCBpZiBib3RoIHByZXNlbnQpXG4gIGlmICh0eXBlb2YgcGFyYW1zLnBhZ2UgPT09ICdudW1iZXInICYmIHBhcmFtcy5wYWdlID4gMCkge1xuICAgIHBhZ2UgPSBwYXJhbXMucGFnZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5wYWdlU2l6ZSA9PT0gJ251bWJlcicgJiYgcGFyYW1zLnBhZ2VTaXplID4gMCkge1xuICAgIHBhZ2VTaXplID0gcGFyYW1zLnBhZ2VTaXplO1xuICB9XG5cbiAgcmV0dXJuIHsgcGFnZSwgcGFnZVNpemUgfTtcbn1cblxuLyoqXG4gKiBWYWxpZCBsb2cgY2F0ZWdvcmllcyBhY2NlcHRlZCBieSBMb2dRdWVyeU9wdGlvbnMuXG4gKiBNYXRjaGVzIHRoZSBMb2dDYXRlZ29yeSB1bmlvbiB0eXBlIHBsdXMgdGhlICdhbGwnIHdpbGRjYXJkLlxuICovXG5jb25zdCBWQUxJRF9MT0dfQ0FURUdPUklFUyA9IG5ldyBTZXQoWydhcHBsaWNhdGlvbicsICdzZWN1cml0eScsICdwZXJmb3JtYW5jZScsICd0ZWxlbWV0cnknLCAnYWxsJ10pO1xuXG4vKipcbiAqIFZhbGlkIGxvZyBsZXZlbHMgYWNjZXB0ZWQgYnkgTG9nUXVlcnlPcHRpb25zLlxuICogTWF0Y2hlcyB0aGUgTG9nTGV2ZWwgdW5pb24gdHlwZS5cbiAqL1xuY29uc3QgVkFMSURfTE9HX0xFVkVMUyA9IG5ldyBTZXQoWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSk7XG5cbi8qKlxuICogVmFsaWRhdGUgYW5kIHNhbml0aXplIHJhdyBwYXJhbXMgaW50byBhIHNhZmUgTG9nUXVlcnlPcHRpb25zIG9iamVjdC5cbiAqIFN0cmlwcyB1bmtub3duIGtleXMsIHZhbGlkYXRlcyB0eXBlcyBvZiBrbm93biBmaWVsZHMsIGFuZCByZXR1cm5zXG4gKiBvbmx5IHdlbGwtdHlwZWQgdmFsdWVzLiBJbnZhbGlkIGZpZWxkcyBhcmUgc2lsZW50bHkgZHJvcHBlZCBzaW5jZVxuICogYWxsIExvZ1F1ZXJ5T3B0aW9ucyBmaWVsZHMgYXJlIG9wdGlvbmFsLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBSYXcgcGFyYW1zIGZyb20gdGhlIE1DUCByZXF1ZXN0XG4gKiBAcmV0dXJucyBWYWxpZGF0ZWQgTG9nUXVlcnlPcHRpb25zIHdpdGggb25seSB2YWxpZCBmaWVsZHNcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVMb2dRdWVyeVBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogTG9nUXVlcnlPcHRpb25zIHtcbiAgY29uc3Qgb3B0aW9uczogTG9nUXVlcnlPcHRpb25zID0ge307XG5cbiAgaWYgKHR5cGVvZiBwYXJhbXMuY2F0ZWdvcnkgPT09ICdzdHJpbmcnICYmIFZBTElEX0xPR19DQVRFR09SSUVTLmhhcyhwYXJhbXMuY2F0ZWdvcnkpKSB7XG4gICAgb3B0aW9ucy5jYXRlZ29yeSA9IHBhcmFtcy5jYXRlZ29yeSBhcyBMb2dRdWVyeU9wdGlvbnNbJ2NhdGVnb3J5J107XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMubGV2ZWwgPT09ICdzdHJpbmcnICYmIFZBTElEX0xPR19MRVZFTFMuaGFzKHBhcmFtcy5sZXZlbCkpIHtcbiAgICBvcHRpb25zLmxldmVsID0gcGFyYW1zLmxldmVsIGFzIExvZ1F1ZXJ5T3B0aW9uc1snbGV2ZWwnXTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5zb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5zb3VyY2UgPSBwYXJhbXMuc291cmNlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5tZXNzYWdlID0gcGFyYW1zLm1lc3NhZ2U7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMuc2luY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgb3B0aW9ucy5zaW5jZSA9IHBhcmFtcy5zaW5jZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy51bnRpbCA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLnVudGlsID0gcGFyYW1zLnVudGlsO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLmxpbWl0ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUocGFyYW1zLmxpbWl0KSkge1xuICAgIG9wdGlvbnMubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMub2Zmc2V0ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUocGFyYW1zLm9mZnNldCkpIHtcbiAgICBvcHRpb25zLm9mZnNldCA9IHBhcmFtcy5vZmZzZXQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMuY29ycmVsYXRpb25JZCA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLmNvcnJlbGF0aW9uSWQgPSBwYXJhbXMuY29ycmVsYXRpb25JZDtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG5jb25zdCBWQUxJRF9NRVRSSUNfVFlQRVMgPSBuZXcgU2V0PE1ldHJpY1R5cGU+KFsnY291bnRlcicsICdnYXVnZScsICdoaXN0b2dyYW0nXSk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTWV0cmljUXVlcnlQYXJhbXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IE1ldHJpY1F1ZXJ5T3B0aW9ucyB7XG4gIGNvbnN0IG9wdGlvbnM6IE1ldHJpY1F1ZXJ5T3B0aW9ucyA9IHt9O1xuXG4gIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcy5uYW1lcykpIHtcbiAgICBvcHRpb25zLm5hbWVzID0gcGFyYW1zLm5hbWVzLmZpbHRlcigobik6IG4gaXMgc3RyaW5nID0+IHR5cGVvZiBuID09PSAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMuc291cmNlID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMuc291cmNlID0gcGFyYW1zLnNvdXJjZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy50eXBlID09PSAnc3RyaW5nJyAmJiBWQUxJRF9NRVRSSUNfVFlQRVMuaGFzKHBhcmFtcy50eXBlIGFzIE1ldHJpY1R5cGUpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gcGFyYW1zLnR5cGUgYXMgTWV0cmljVHlwZTtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5zaW5jZSA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zLnNpbmNlID0gcGFyYW1zLnNpbmNlO1xuICB9XG4gIGlmICh0eXBlb2YgcGFyYW1zLnVudGlsID09PSAnc3RyaW5nJykge1xuICAgIG9wdGlvbnMudW50aWwgPSBwYXJhbXMudW50aWw7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMubGF0ZXN0ID09PSAnYm9vbGVhbicpIHtcbiAgICBvcHRpb25zLmxhdGVzdCA9IHBhcmFtcy5sYXRlc3Q7XG4gIH1cbiAgaWYgKHR5cGVvZiBwYXJhbXMubGltaXQgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShwYXJhbXMubGltaXQpKSB7XG4gICAgb3B0aW9ucy5saW1pdCA9IHBhcmFtcy5saW1pdDtcbiAgfVxuICBpZiAodHlwZW9mIHBhcmFtcy5vZmZzZXQgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShwYXJhbXMub2Zmc2V0KSkge1xuICAgIG9wdGlvbnMub2Zmc2V0ID0gcGFyYW1zLm9mZnNldDtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBWZXJpZmljYXRpb24gU2VjdXJpdHkgVXRpbGl0aWVzIChJc3N1ZSAjMTQyIOKAlCBQUiAjNDc4IHJldmlldyBmb2xsb3ctdXBzKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogVVVJRCB2NCBmb3JtYXQ6IDgtNC00LTQtMTIgaGV4IGRpZ2l0cyB3aXRoIHZlcnNpb24gNCBtYXJrZXIgYW5kIHZhcmlhbnQgYml0cyAqL1xuY29uc3QgVVVJRF9WNF9SRUdFWCA9IC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tNFswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfSQvaTtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgY2hhbGxlbmdlIElEIGlzIGEgdmFsaWQgVVVJRCB2NCBmb3JtYXQuXG4gKiBDaGFsbGVuZ2UgSURzIGFyZSBnZW5lcmF0ZWQgYnkgY3J5cHRvLnJhbmRvbVVVSUQoKSBhbmQgbXVzdCBjb25mb3JtLlxuICogUmVqZWN0cyBvYnZpb3VzbHkgaW52YWxpZCBJRHMgYmVmb3JlIGhpdHRpbmcgdGhlIHN0b3JlIHRvIHByZXZlbnQgZW51bWVyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hhbGxlbmdlSWRGb3JtYXQoY2hhbGxlbmdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIVVVSURfVjRfUkVHRVgudGVzdChjaGFsbGVuZ2VJZCkpIHtcbiAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICBgSW52YWxpZCBjaGFsbGVuZ2VfaWQgZm9ybWF0LiBFeHBlY3RlZCBVVUlEIHY0IChlLmcuLCBcIjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMFwiKS5gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFN0cnVjdHVyZWQgdmVyaWZpY2F0aW9uIGVycm9yIHdpdGggR2F0ZWtlZXBlciBlcnJvciBjb2RlLlxuICogRW5hYmxlcyBjb25zaXN0ZW50IGVycm9yIGhhbmRsaW5nIGFsaWduZWQgd2l0aCBleGlzdGluZyBHYXRla2VlcGVyIHBhdHRlcm5zLlxuICovXG5jbGFzcyBWZXJpZmljYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGVycm9yQ29kZTogR2F0ZWtlZXBlckVycm9yQ29kZSxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdWZXJpZmljYXRpb25FcnJvcic7XG4gIH1cbn1cblxuY29uc3QgREVBRExPQ0tfUkVMSUVGX1JFQVNPTiA9ICdEZWFkbG9jayByZWxpZWYgcmVxdWVzdGVkJztcbmNvbnN0IERFQURMT0NLX1JFTElFRl9USU1FT1VUX01TID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IERFQURMT0NLX1JFTElFRl9ESUFMT0dfUkVBU09OID1cbiAgJ0RlYWRsb2NrIHJlbGllZiByZXF1ZXN0ZWQuXFxuXFxuVGhpcyB3aWxsIGRlYWN0aXZhdGUgYWxsIGFjdGl2ZSBlbGVtZW50cyBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbmQgY2xlYXIgcGVyc2lzdGVkIGFjdGl2YXRpb24gc3RhdGUuJztcblxuLyoqXG4gKiBHbG9iYWwgcmF0ZSBsaW1pdGVyIGZvciB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuXG4gKiBUcmFja3MgZmFpbGVkIGF0dGVtcHRzIHdpdGhpbiBhIHNsaWRpbmcgd2luZG93IHRvIHByZXZlbnQgYnJ1dGUtZm9yY2UgYXR0YWNrcy5cbiAqXG4gKiBEZXNpZ246IFNpbmNlIHZlcmlmaWNhdGlvbiBjb2RlcyBhcmUgb25lLXRpbWUtdXNlIChkZWxldGVkIG9uIGFueSBhdHRlbXB0KSxcbiAqIHRoZSByZWFsIGF0dGFjayB2ZWN0b3IgaXMgcmVwZWF0ZWQgY2hhbGxlbmdlIGNyZWF0aW9uICsgaW1tZWRpYXRlIGF0dGVtcHQuXG4gKiBUaGlzIGxpbWl0ZXIgY2FwcyB0b3RhbCBmYWlsdXJlcyBhY3Jvc3MgYWxsIGNoYWxsZW5nZXMgd2l0aGluIGEgdGltZSB3aW5kb3cuXG4gKi9cbmNsYXNzIFZlcmlmaWNhdGlvblJhdGVMaW1pdGVyIHtcbiAgcHJpdmF0ZSBmYWlsdXJlczogbnVtYmVyW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1heEZhaWx1cmVzOiBudW1iZXIgPSAxMCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvd01zOiBudW1iZXIgPSA2MF8wMDAsXG4gICkge31cblxuICAvKiogUmVjb3JkIGEgZmFpbGVkIHZlcmlmaWNhdGlvbiBhdHRlbXB0LiBSZXR1cm5zIHRydWUgaWYgcmF0ZSBsaW1pdCBpcyBleGNlZWRlZC4gKi9cbiAgcmVjb3JkRmFpbHVyZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuZmFpbHVyZXMucHVzaChub3cpO1xuICAgIHRoaXMucHJ1bmUobm93KTtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlcy5sZW5ndGggPiB0aGlzLm1heEZhaWx1cmVzO1xuICB9XG5cbiAgLyoqIENoZWNrIGlmIHJhdGUgbGltaXQgaXMgY3VycmVudGx5IGV4Y2VlZGVkIHdpdGhvdXQgcmVjb3JkaW5nLiAqL1xuICBpc0xpbWl0ZWQoKTogYm9vbGVhbiB7XG4gICAgdGhpcy5wcnVuZShEYXRlLm5vdygpKTtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlcy5sZW5ndGggPiB0aGlzLm1heEZhaWx1cmVzO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBlbnRyaWVzIG91dHNpZGUgdGhlIHNsaWRpbmcgd2luZG93LiAqL1xuICBwcml2YXRlIHBydW5lKG5vdzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgY3V0b2ZmID0gbm93IC0gdGhpcy53aW5kb3dNcztcbiAgICB3aGlsZSAodGhpcy5mYWlsdXJlcy5sZW5ndGggPiAwICYmIHRoaXMuZmFpbHVyZXNbMF0gPCBjdXRvZmYpIHtcbiAgICAgIHRoaXMuZmFpbHVyZXMuc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ3VycmVudCBmYWlsdXJlIGNvdW50IGluIHdpbmRvdyAoZm9yIG1ldHJpY3MpLiAqL1xuICBnZXQgZmFpbHVyZXNJbldpbmRvdygpOiBudW1iZXIge1xuICAgIHRoaXMucHJ1bmUoRGF0ZS5ub3coKSk7XG4gICAgcmV0dXJuIHRoaXMuZmFpbHVyZXMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIFJlc2V0IChmb3IgdGVzdGluZykuICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuZmFpbHVyZXMgPSBbXTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmaWNhdGlvbiBtZXRyaWNzIHRyYWNrZXIgZm9sbG93aW5nIERhbmdlclpvbmVFbmZvcmNlci5nZXRNZXRyaWNzKCkgcGF0dGVybi5cbiAqIFRyYWNrcyBzdWNjZXNzL2ZhaWx1cmUvZXhwaXJ5IHJhdGVzIGFuZCB0aW1lLXRvLXZlcmlmeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25NZXRyaWNzIHtcbiAgLyoqIFRvdGFsIHZlcmlmeV9jaGFsbGVuZ2UgY2FsbHMgc2luY2Ugc3RhcnR1cCAqL1xuICB0b3RhbEF0dGVtcHRzOiBudW1iZXI7XG4gIC8qKiBTdWNjZXNzZnVsIHZlcmlmaWNhdGlvbnMgKi9cbiAgdG90YWxTdWNjZXNzZXM6IG51bWJlcjtcbiAgLyoqIEZhaWxlZCB2ZXJpZmljYXRpb25zICh3cm9uZyBjb2RlKSAqL1xuICB0b3RhbEZhaWx1cmVzOiBudW1iZXI7XG4gIC8qKiBFeHBpcmVkIGNoYWxsZW5nZSBhdHRlbXB0cyAqL1xuICB0b3RhbEV4cGlyZWQ6IG51bWJlcjtcbiAgLyoqIEludmFsaWQgZm9ybWF0IGF0dGVtcHRzIChyZWplY3RlZCBiZWZvcmUgc3RvcmUgbG9va3VwKSAqL1xuICB0b3RhbEludmFsaWRGb3JtYXQ6IG51bWJlcjtcbiAgLyoqIFJhdGUtbGltaXRlZCBhdHRlbXB0cyAqL1xuICB0b3RhbFJhdGVMaW1pdGVkOiBudW1iZXI7XG4gIC8qKiBBdmVyYWdlIHRpbWUgZnJvbSBjaGFsbGVuZ2UgY3JlYXRpb24gdG8gc3VjY2Vzc2Z1bCB2ZXJpZnkgKG1zKSAqL1xuICBhdmVyYWdlVGltZVRvVmVyaWZ5TXM6IG51bWJlcjtcbiAgLyoqIEN1cnJlbnQgZmFpbHVyZXMgaW4gcmF0ZS1saW1pdCB3aW5kb3cgKi9cbiAgZmFpbHVyZXNJbkN1cnJlbnRXaW5kb3c6IG51bWJlcjtcbn1cblxuY2xhc3MgVmVyaWZpY2F0aW9uTWV0cmljc1RyYWNrZXIge1xuICBwcml2YXRlIF90b3RhbEF0dGVtcHRzID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxTdWNjZXNzZXMgPSAwO1xuICBwcml2YXRlIF90b3RhbEZhaWx1cmVzID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxFeHBpcmVkID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxJbnZhbGlkRm9ybWF0ID0gMDtcbiAgcHJpdmF0ZSBfdG90YWxSYXRlTGltaXRlZCA9IDA7XG4gIHByaXZhdGUgdmVyaWZ5RHVyYXRpb25zOiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfRFVSQVRJT05TID0gMTAwMDtcblxuICByZWNvcmRBdHRlbXB0KCk6IHZvaWQgeyB0aGlzLl90b3RhbEF0dGVtcHRzKys7IH1cbiAgcmVjb3JkU3VjY2VzcyhkdXJhdGlvbk1zPzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fdG90YWxTdWNjZXNzZXMrKztcbiAgICBpZiAoZHVyYXRpb25NcyAhPT0gdW5kZWZpbmVkICYmIGR1cmF0aW9uTXMgPj0gMCkge1xuICAgICAgdGhpcy52ZXJpZnlEdXJhdGlvbnMucHVzaChkdXJhdGlvbk1zKTtcbiAgICAgIGlmICh0aGlzLnZlcmlmeUR1cmF0aW9ucy5sZW5ndGggPiBWZXJpZmljYXRpb25NZXRyaWNzVHJhY2tlci5NQVhfRFVSQVRJT05TKSB7XG4gICAgICAgIHRoaXMudmVyaWZ5RHVyYXRpb25zLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlY29yZEZhaWx1cmUoKTogdm9pZCB7IHRoaXMuX3RvdGFsRmFpbHVyZXMrKzsgfVxuICByZWNvcmRFeHBpcmVkKCk6IHZvaWQgeyB0aGlzLl90b3RhbEV4cGlyZWQrKzsgfVxuICByZWNvcmRJbnZhbGlkRm9ybWF0KCk6IHZvaWQgeyB0aGlzLl90b3RhbEludmFsaWRGb3JtYXQrKzsgfVxuICByZWNvcmRSYXRlTGltaXRlZCgpOiB2b2lkIHsgdGhpcy5fdG90YWxSYXRlTGltaXRlZCsrOyB9XG5cbiAgZ2V0TWV0cmljcyhyYXRlTGltaXRlcjogVmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIpOiBWZXJpZmljYXRpb25NZXRyaWNzIHtcbiAgICBjb25zdCBhdmdEdXJhdGlvbiA9IHRoaXMudmVyaWZ5RHVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgID8gTWF0aC5yb3VuZCh0aGlzLnZlcmlmeUR1cmF0aW9ucy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHRoaXMudmVyaWZ5RHVyYXRpb25zLmxlbmd0aClcbiAgICAgIDogMDtcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxBdHRlbXB0czogdGhpcy5fdG90YWxBdHRlbXB0cyxcbiAgICAgIHRvdGFsU3VjY2Vzc2VzOiB0aGlzLl90b3RhbFN1Y2Nlc3NlcyxcbiAgICAgIHRvdGFsRmFpbHVyZXM6IHRoaXMuX3RvdGFsRmFpbHVyZXMsXG4gICAgICB0b3RhbEV4cGlyZWQ6IHRoaXMuX3RvdGFsRXhwaXJlZCxcbiAgICAgIHRvdGFsSW52YWxpZEZvcm1hdDogdGhpcy5fdG90YWxJbnZhbGlkRm9ybWF0LFxuICAgICAgdG90YWxSYXRlTGltaXRlZDogdGhpcy5fdG90YWxSYXRlTGltaXRlZCxcbiAgICAgIGF2ZXJhZ2VUaW1lVG9WZXJpZnlNczogYXZnRHVyYXRpb24sXG4gICAgICBmYWlsdXJlc0luQ3VycmVudFdpbmRvdzogcmF0ZUxpbWl0ZXIuZmFpbHVyZXNJbldpbmRvdyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJlc2V0IChmb3IgdGVzdGluZykuICovXG4gIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX3RvdGFsQXR0ZW1wdHMgPSAwO1xuICAgIHRoaXMuX3RvdGFsU3VjY2Vzc2VzID0gMDtcbiAgICB0aGlzLl90b3RhbEZhaWx1cmVzID0gMDtcbiAgICB0aGlzLl90b3RhbEV4cGlyZWQgPSAwO1xuICAgIHRoaXMuX3RvdGFsSW52YWxpZEZvcm1hdCA9IDA7XG4gICAgdGhpcy5fdG90YWxSYXRlTGltaXRlZCA9IDA7XG4gICAgdGhpcy52ZXJpZnlEdXJhdGlvbnMgPSBbXTtcbiAgfVxufVxuXG4vKipcbiAqIEhhbmRsZXIgcmVnaXN0cnkgaW50ZXJmYWNlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIEFic3RyYWN0cyB0aGUgY29uY3JldGUgaGFuZGxlciB0eXBlcyBmb3IgYmV0dGVyIHRlc3RhYmlsaXR5IGFuZCBkZWNvdXBsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXJSZWdpc3RyeSB7XG4gIGVsZW1lbnRDUlVEOiBFbGVtZW50Q1JVREhhbmRsZXI7XG4gIG1lbW9yeU1hbmFnZXI6IE1lbW9yeU1hbmFnZXI7XG4gIGFnZW50TWFuYWdlcjogQWdlbnRNYW5hZ2VyO1xuICB0ZW1wbGF0ZVJlbmRlcmVyOiBUZW1wbGF0ZVJlbmRlcmVyO1xuICBlbGVtZW50UXVlcnlTZXJ2aWNlOiBFbGVtZW50UXVlcnlTZXJ2aWNlO1xuICAvLyBNQ1AtQVFMIGV4dGVuc2lvbiBoYW5kbGVycyAoSXNzdWUgIzI0MSlcbiAgY29sbGVjdGlvbkhhbmRsZXI/OiBDb2xsZWN0aW9uSGFuZGxlcjtcbiAgcG9ydGZvbGlvSGFuZGxlcj86IFBvcnRmb2xpb0hhbmRsZXI7XG4gIGF1dGhIYW5kbGVyPzogR2l0SHViQXV0aEhhbmRsZXI7XG4gIGNvbmZpZ0hhbmRsZXI/OiBDb25maWdIYW5kbGVyO1xuICBlbmhhbmNlZEluZGV4SGFuZGxlcj86IEVuaGFuY2VkSW5kZXhIYW5kbGVyO1xuICBwZXJzb25hSGFuZGxlcj86IFBlcnNvbmFIYW5kbGVyO1xuICBzeW5jSGFuZGxlcj86IFN5bmNIYW5kbGVyO1xuICBidWlsZEluZm9TZXJ2aWNlPzogQnVpbGRJbmZvU2VydmljZTtcbiAgY2FjaGVNZW1vcnlCdWRnZXQ/OiBpbXBvcnQoJy4uLy4uL2NhY2hlL0NhY2hlTWVtb3J5QnVkZ2V0LmpzJykuQ2FjaGVNZW1vcnlCdWRnZXQ7XG4gIGdhdGVrZWVwZXI6IEdhdGVrZWVwZXI7XG4gIC8vIElzc3VlICM0MDI6IERJLWluamVjdGVkIGRhbmdlciB6b25lIGVuZm9yY2VyIChyZXBsYWNlcyBzaW5nbGV0b24gaW1wb3J0KVxuICBkYW5nZXJab25lRW5mb3JjZXI/OiBEYW5nZXJab25lRW5mb3JjZXI7XG4gIC8vIElzc3VlICMxNDI6IFNlcnZlci1zaWRlIHZlcmlmaWNhdGlvbiBzdG9yZSBmb3IgY2hhbGxlbmdlIGNvZGVzXG4gIHZlcmlmaWNhdGlvblN0b3JlPzogVmVyaWZpY2F0aW9uU3RvcmU7XG4gIC8vIElzc3VlICM1MjI6IE5vbi1ibG9ja2luZyBPUyBkaWFsb2cgZm9yIHZlcmlmaWNhdGlvbiBjb2RlcyAocmVwbGFjZXMgcmV0dXJuaW5nIGNvZGUgdG8gTExNKVxuICB2ZXJpZmljYXRpb25Ob3RpZmllcj86IElWZXJpZmljYXRpb25Ob3RpZmllcjtcbiAgLy8gSXNzdWUgIzUyODogTWVtb3J5TG9nU2luayBmb3IgQ1JVREUtcm91dGVkIHF1ZXJ5X2xvZ3NcbiAgbWVtb3J5U2luaz86IE1lbW9yeUxvZ1Npbms7XG4gIC8vIE1ldHJpY3M6IE1lbW9yeU1ldHJpY3NTaW5rIGZvciBDUlVERS1yb3V0ZWQgcXVlcnlfbWV0cmljc1xuICBtZXRyaWNzU2luaz86IGltcG9ydCgnLi4vLi4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcycpLk1lbW9yeU1ldHJpY3NTaW5rO1xuICAvLyBTZWFyY2ggbWV0cmljczogUGVyZm9ybWFuY2VNb25pdG9yIGZvciByZWNvcmRTZWFyY2goKVxuICBwZXJmb3JtYW5jZU1vbml0b3I/OiBQZXJmb3JtYW5jZU1vbml0b3I7XG4gIC8vIE9wZXJhdGlvbiBtZXRyaWNzOiBPcGVyYXRpb25NZXRyaWNzVHJhY2tlciBmb3IgQ1JVRCBvcGVyYXRpb24gc3RhdHNcbiAgb3BlcmF0aW9uTWV0cmljc1RyYWNrZXI/OiBPcGVyYXRpb25NZXRyaWNzVHJhY2tlcjtcbiAgLy8gR2F0ZWtlZXBlciBtZXRyaWNzOiBHYXRla2VlcGVyTWV0cmljc1RyYWNrZXIgZm9yIHBvbGljeSBlbmZvcmNlbWVudCBzdGF0c1xuICBnYXRla2VlcGVyTWV0cmljc1RyYWNrZXI/OiBHYXRla2VlcGVyTWV0cmljc1RyYWNrZXI7XG59XG5cbi8qKlxuICogRXhwb3J0IHBhY2thZ2Ugc3RydWN0dXJlIGZvciBlbGVtZW50IGltcG9ydC9leHBvcnQgb3BlcmF0aW9uc1xuICovXG5pbnRlcmZhY2UgRXhwb3J0UGFja2FnZSB7XG4gIGV4cG9ydFZlcnNpb246IHN0cmluZztcbiAgZXhwb3J0ZWRBdDogc3RyaW5nO1xuICBlbGVtZW50VHlwZTogc3RyaW5nO1xuICBlbGVtZW50TmFtZT86IHN0cmluZztcbiAgZm9ybWF0OiAnanNvbicgfCAneWFtbCc7XG4gIGRhdGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBNQ1BBUUxIYW5kbGVyIC0gVW5pZmllZCBlbnRyeSBwb2ludCBmb3IgYWxsIE1DUC1BUUwgb3BlcmF0aW9uc1xuICpcbiAqIFRoaXMgaGFuZGxlciBpbXBsZW1lbnRzIHRoZSB0aGluIHJlc29sdmVyIHBhdHRlcm46XG4gKiAxLiBWYWxpZGF0ZXMgdGhhdCBvcGVyYXRpb25zIGFyZSBjYWxsZWQgdmlhIGNvcnJlY3QgQ1JVRCBlbmRwb2ludHNcbiAqIDIuIFJvdXRlcyBvcGVyYXRpb25zIHRvIHRoZWlyIGhhbmRsZXIgcmVmZXJlbmNlc1xuICogMy4gRGlzcGF0Y2hlcyB0byBhY3R1YWwgaGFuZGxlciBtZXRob2RzXG4gKiA0LiBSZXR1cm5zIHN0YW5kYXJkaXplZCBPcGVyYXRpb25SZXN1bHRcbiAqXG4gKiBERVNJR04gUkFUSU9OQUxFOlxuICogLSBTaW5nbGUgUmVzcG9uc2liaWxpdHk6IE9ubHkgb3JjaGVzdHJhdGVzLCBkZWxlZ2F0ZXMgYWN0dWFsIHdvcmtcbiAqIC0gRGVwZW5kZW5jeSBJbnZlcnNpb246IERlcGVuZHMgb24gSGFuZGxlclJlZ2lzdHJ5IGludGVyZmFjZVxuICogLSBJbnRlcmZhY2UgU2VncmVnYXRpb246IEhhbmRsZXJSZWdpc3RyeSBleHBvc2VzIG9ubHkgd2hhdCdzIG5lZWRlZFxuICogLSBPcGVuL0Nsb3NlZDogTmV3IG9wZXJhdGlvbnMgYWRkZWQgdG8gcm91dGVyLCBub3QgdGhpcyBjbGFzc1xuICovXG4vKipcbiAqIE1pbmltYWwgaW50ZXJmYWNlIGZvciBjb3JyZWxhdGlvbiBJRCByZXRyaWV2YWwuXG4gKiBLZWVwcyBjb3VwbGluZyBsb29zZSDigJQgb25seSByZXF1aXJlcyB3aGF0IE1DUEFRTEhhbmRsZXIgYWN0dWFsbHkgbmVlZHMuXG4gKiBJc3N1ZSAjMzAxOiBSZXF1ZXN0IGNvcnJlbGF0aW9uIHN1cHBvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ycmVsYXRpb25JZFByb3ZpZGVyIHtcbiAgZ2V0Q29ycmVsYXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNQ1BBUUxIYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBnYXRla2VlcGVyOiBHYXRla2VlcGVyO1xuICAvKipcbiAgICogSXNzdWUgIzY1NjogUGVyLW1lbW9yeSBzYXZlIGRlYm91bmNlIHRpbWVycy5cbiAgICogV2hlbiBhZGRFbnRyeSBpcyBjYWxsZWQgcmFwaWRseSwgd2UgY29hbGVzY2Ugc2F2ZXMg4oCUIG9ubHkgdGhlIGxhdGVzdFxuICAgKiBzdGF0ZSBpcyB3cml0dGVuIHRvIGRpc2sgYWZ0ZXIgdGhlIGRlYm91bmNlIHdpbmRvdyBleHBpcmVzLlxuICAgKiBLZXk6IG5vcm1hbGl6ZWQgbWVtb3J5IG5hbWUsIFZhbHVlOiB7IHRpbWVyLCBtZW1vcnksIG1hbmFnZXIgfVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nU2F2ZXMgPSBuZXcgTWFwPHN0cmluZywge1xuICAgIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgICBtZW1vcnk6IGltcG9ydCgnLi4vLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5LmpzJykuTWVtb3J5O1xuICAgIG1hbmFnZXI6IE1lbW9yeU1hbmFnZXI7XG4gIH0+KCk7XG4gIC8qKiBJc3N1ZSAjNjU2OiBEZWJvdW5jZSBtZXRyaWNzIOKAlCB0cmFja3Mgc2F2ZXMgY29hbGVzY2VkIHZzIGFjdHVhbGx5IHdyaXR0ZW4uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVib3VuY2VNZXRyaWNzID0geyBjb2FsZXNjZWQ6IDAsIHdyaXR0ZW46IDAgfTtcbiAgLyoqXG4gICAqIElzc3VlICM2NTc6IFBlci1tZW1vcnkgc2F2ZSBmcmVxdWVuY3kgdHJhY2tlci5cbiAgICogU2xpZGluZyB3aW5kb3cgY291bnRlcjogdHJhY2tzIGFkZEVudHJ5IGNhbGxzIHBlciBtZW1vcnkgd2l0aGluIHRoZSBtb25pdG9yIHdpbmRvdy5cbiAgICogTG9ncyB3YXJuaW5ncyBhdCBjb25maWd1cmFibGUgdGhyZXNob2xkcyB0byBjYXRjaCBydW5hd2F5IGxvb3BzIGVhcmx5LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzYXZlRnJlcXVlbmN5Q291bnRlcnMgPSBuZXcgTWFwPHN0cmluZywgeyB0aW1lc3RhbXBzOiBudW1iZXJbXTsgd2FybmVkOiBib29sZWFuOyBjcml0aWNhbDogYm9vbGVhbiB9PigpO1xuICAvKiogSXNzdWUgIzYyNSBQaGFzZSA0OiBSYXRlIGxpbWl0ZXIgZm9yIHBlcm1pc3Npb25fcHJvbXB0IGV2YWx1YXRpb25zIChjb25maWd1cmFibGUgdmlhIGVudikgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXNzaW9uUHJvbXB0TGltaXRlciA9IFJhdGVMaW1pdGVyRmFjdG9yeS5jcmVhdGVQZXJtaXNzaW9uUHJvbXB0TGltaXRlcihcbiAgICBlbnYuRE9MTEhPVVNFX1BFUk1JU1NJT05fUFJPTVBUX1JBVEVfTElNSVQsIGVudi5ET0xMSE9VU0VfUEVSTUlTU0lPTl9SQVRFX1dJTkRPV19NU1xuICApO1xuICAvKiogSXNzdWUgIzYyNSBQaGFzZSA0OiBSYXRlIGxpbWl0ZXIgZm9yIENMSSBhcHByb3ZhbCByZWNvcmQgY3JlYXRpb24gKGNvbmZpZ3VyYWJsZSB2aWEgZW52KSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaUFwcHJvdmFsTGltaXRlciA9IFJhdGVMaW1pdGVyRmFjdG9yeS5jcmVhdGVDbGlBcHByb3ZhbExpbWl0ZXIoXG4gICAgZW52LkRPTExIT1VTRV9DTElfQVBQUk9WQUxfUkFURV9MSU1JVCwgZW52LkRPTExIT1VTRV9QRVJNSVNTSU9OX1JBVEVfV0lORE9XX01TXG4gICk7XG4gIC8qKlxuICAgKiBCdWlsZCBhIHN0YW5kYXJkaXplZCByYXRlLWxpbWl0IGRlbnkgcmVzcG9uc2UgZm9yIHBlcm1pc3Npb25fcHJvbXB0LlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFJhdGVMaW1pdERlbnkoXG4gICAgbGltaXRlck5hbWU6IHN0cmluZyxcbiAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgIHN0YXR1czogaW1wb3J0KCcuLi8uLi91dGlscy9SYXRlTGltaXRlci5qcycpLlJhdGVMaW1pdFN0YXR1cyxcbiAgICByaXNrTGV2ZWwgPSAnYmxvY2tlZCcsXG4gICAgcmVhc29uID0gJ1JhdGUgbGltaXQgZXhjZWVkZWQnLFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnBlcm1pc3Npb25Qcm9tcHQnLFxuICAgICAgZGV0YWlsczogYCR7bGltaXRlck5hbWV9IHJhdGUgbGltaXQgZXhjZWVkZWQgZm9yICR7dG9vbE5hbWV9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIHRvb2xOYW1lLFxuICAgICAgICBsaW1pdGVyOiBsaW1pdGVyTmFtZSxcbiAgICAgICAgcmV0cnlBZnRlck1zOiBzdGF0dXMucmV0cnlBZnRlck1zLFxuICAgICAgICByZW1haW5pbmdUb2tlbnM6IHN0YXR1cy5yZW1haW5pbmdUb2tlbnMsXG4gICAgICAgIHJlc2V0VGltZTogc3RhdHVzLnJlc2V0VGltZS50b0lTT1N0cmluZygpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgIG1lc3NhZ2U6IGBSYXRlIGxpbWl0IGV4Y2VlZGVkIGZvciAke2xpbWl0ZXJOYW1lfS4gUmV0cnkgYWZ0ZXIgJHtzdGF0dXMucmV0cnlBZnRlck1zfW1zLmAsXG4gICAgICBjbGFzc2lmaWNhdGlvbjogeyByaXNrTGV2ZWwsIHJlYXNvbiwgc3RhZ2U6ICdyYXRlX2xpbWl0JyB9LFxuICAgIH07XG4gIH1cblxuICAvKiogSXNzdWUgIzE0MjogUmF0ZSBsaW1pdGVyIGZvciB2ZXJpZnlfY2hhbGxlbmdlIGF0dGVtcHRzIChtYXggMTAgZmFpbHVyZXMgcGVyIDYwcyB3aW5kb3cpICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIgPSBuZXcgVmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIoKTtcbiAgLyoqIElzc3VlICMxNDI6IE1ldHJpY3MgdHJhY2tlciBmb3IgdmVyaWZpY2F0aW9uIG9wZXJhdGlvbnMgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2ZXJpZmljYXRpb25NZXRyaWNzID0gbmV3IFZlcmlmaWNhdGlvbk1ldHJpY3NUcmFja2VyKCk7XG4gIC8qKlxuICAgKiBUcmFja3MgYWdlbnRzIGN1cnJlbnRseSBpbiBhbiBleGVjdXRpb24gbG9vcCBmb3IgR2F0ZWtlZXBlciBwb2xpY3kgZW5mb3JjZW1lbnQuXG4gICAqXG4gICAqICoqTGlmZWN5Y2xlOioqIEVudHJpZXMgYXJlIGFkZGVkIGluIGBkaXNwYXRjaEV4ZWN1dGUoKWAgb24gYGV4ZWN1dGVfYWdlbnRgIGFuZFxuICAgKiByZW1vdmVkIG9uIGBjb21wbGV0ZV9leGVjdXRpb25gLiBPbmx5IGFnZW50cyB3aXRoIGEgZ2F0ZWtlZXBlciBwb2xpY3kgKGV4cGxpY2l0XG4gICAqIG9yIHN5bnRoZXNpemVkIGZyb20gYHRvb2xzYCBjb25maWcpIGFyZSB0cmFja2VkLlxuICAgKlxuICAgKiAqKlBvbGljeSByZXNvbHV0aW9uOioqIEVudHJpZXMgYXJlIGluY2x1ZGVkIGluIGBnZXRBY3RpdmVFbGVtZW50cygpYCBzbyB0aGVcbiAgICogR2F0ZWtlZXBlciBldmFsdWF0ZXMgYWdlbnQgcG9saWNpZXMgYWxvbmdzaWRlIHBlcnNvbmEvc2tpbGwvZW5zZW1ibGUgcG9saWNpZXMuXG4gICAqIFRoZSBzdGFuZGFyZCBwcmlvcml0eSBhcHBsaWVzOiBkZW55ID4gc2NvcGVfcmVzdHJpY3Rpb24gPiBjb25maXJtID4gYWxsb3cuXG4gICAqXG4gICAqICoqTWVtb3J5IHNhZmV0eToqKiBUaGUgTWFwIGlzIGJvdW5kZWQgYnkgY29uY3VycmVudGx5IGV4ZWN1dGluZyBhZ2VudHMuIElmIGFcbiAgICogc2Vzc2lvbiBlbmRzIHdpdGhvdXQgYGNvbXBsZXRlX2V4ZWN1dGlvbmAsIHRoZSBNYXAgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQgd2l0aFxuICAgKiB0aGUgTUNQQVFMSGFuZGxlciBpbnN0YW5jZS5cbiAgICpcbiAgICogSXNzdWUgIzQ0OVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRpbmdBZ2VudHMgPSBuZXcgTWFwPHN0cmluZywge1xuICAgIC8qKiBBZ2VudCBlbGVtZW50IG5hbWUgKG1hdGNoZXMgdGhlIE1hcCBrZXkpICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKiBNZXRhZGF0YSBjb250YWluaW5nIHRoZSByZXNvbHZlZCBnYXRla2VlcGVyIHBvbGljeSAqL1xuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAvKiogVGltZXN0YW1wIHdoZW4gZXhlY3V0aW9uIHN0YXJ0ZWQgKGZvciBkaWFnbm9zdGljcykgKi9cbiAgICBzdGFydGVkQXQ6IG51bWJlcjtcbiAgICAvKiogUmVzaWxpZW5jZSB0cmFja2luZzogbnVtYmVyIG9mIGF1dG8tY29udGludWF0aW9ucyBwZXJmb3JtZWQgKElzc3VlICM1MjYpICovXG4gICAgY29udGludWF0aW9uQ291bnQ6IG51bWJlcjtcbiAgICAvKiogUmVzaWxpZW5jZSB0cmFja2luZzogbnVtYmVyIG9mIHJldHJpZXMgZm9yIHRoZSBjdXJyZW50IHN0ZXAgKElzc3VlICM1MjYpICovXG4gICAgcmV0cnlDb3VudDogbnVtYmVyO1xuICAgIC8qKiBSZXNpbGllbmNlIHRyYWNraW5nOiBvcmlnaW5hbCBwYXJhbWV0ZXJzIGZyb20gZXhlY3V0ZV9hZ2VudCAoSXNzdWUgIzUyNikgKi9cbiAgICBvcmlnaW5hbFBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAvKiogUmVzaWxpZW5jZSB0cmFja2luZzogcmVzb2x2ZWQgcG9saWN5IGZyb20gYWdlbnQgbWV0YWRhdGEgKElzc3VlICM1MjYpICovXG4gICAgcmVzaWxpZW5jZVBvbGljeT86IEFnZW50UmVzaWxpZW5jZVBvbGljeTtcbiAgICAvKiogUmVjZW50IGdhdGVrZWVwZXIgYmxvY2tzIGR1cmluZyB0aGlzIGFnZW50J3MgZXhlY3V0aW9uIChBZ2VudCBOb3RpZmljYXRpb24gU3lzdGVtKSAqL1xuICAgIHJlY2VudEJsb2NrczogQXJyYXk8e1xuICAgICAgb3BlcmF0aW9uOiBzdHJpbmc7XG4gICAgICBlbGVtZW50VHlwZT86IHN0cmluZztcbiAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgLyoqIFBlcm1pc3Npb24gbGV2ZWwgdGhhdCBjYXVzZWQgdGhlIGJsb2NrIChERU5ZLCBDT05GSVJNX1NFU1NJT04sIENPTkZJUk1fU0lOR0xFX1VTRSkgKi9cbiAgICAgIGxldmVsOiBzdHJpbmc7XG4gICAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICAgIC8qKiBXaGV0aGVyIHRoaXMgYmxvY2sgaGFzIGJlZW4gcmVwb3J0ZWQgaW4gYSBub3RpZmljYXRpb24gKi9cbiAgICAgIHJlcG9ydGVkOiBib29sZWFuO1xuICAgIH0+O1xuICB9PigpO1xuXG4gIC8qKlxuICAgKiBTZXQgb2YgYWJvcnRlZCBnb2FsSWRzLiBPbmNlIGEgZ29hbElkIGlzIGFib3J0ZWQsIGFsbCBmdXJ0aGVyIGV4ZWN1dGlvblxuICAgKiBvcGVyYXRpb25zIChyZWNvcmRfZXhlY3V0aW9uX3N0ZXAsIGNvbXBsZXRlX2V4ZWN1dGlvbiwgY29udGludWVfZXhlY3V0aW9uKVxuICAgKiBmb3IgdGhhdCBnb2FsSWQgYXJlIHJlamVjdGVkIGF0IHRoZSBkaXNwYXRjaCBsYXllci5cbiAgICpcbiAgICogSXNzdWUgIzI0OTogQWJvcnQvY2FuY2VsbGF0aW9uIGluZnJhc3RydWN0dXJlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBhYm9ydGVkR29hbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzOiBIYW5kbGVyUmVnaXN0cnksXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0VHJhY2tlcj86IENvcnJlbGF0aW9uSWRQcm92aWRlcixcbiAgKSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBub3JtYWxpemVycyBmb3Igc2NoZW1hLWRyaXZlbiBvcGVyYXRpb25zIChJc3N1ZSAjMjQzKVxuICAgIGluaXRpYWxpemVOb3JtYWxpemVycygpO1xuICAgIC8vIElzc3VlICM0NTI6IFN0b3JlIEdhdGVrZWVwZXIgaW5zdGFuY2UgZm9yIHBvbGljeSBlbmZvcmNlbWVudFxuICAgIGlmICghaGFuZGxlcnMuZ2F0ZWtlZXBlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdHYXRla2VlcGVyIGluc3RhbmNlIGlzIHJlcXVpcmVkIGluIEhhbmRsZXJSZWdpc3RyeS4gUHJvdmlkZSBvbmUgdmlhIHRoZSBESSBjb250YWluZXIuJyk7XG4gICAgfVxuICAgIHRoaXMuZ2F0ZWtlZXBlciA9IGhhbmRsZXJzLmdhdGVrZWVwZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZlcmlmaWNhdGlvbiBtZXRyaWNzIGZvciBtb25pdG9yaW5nL2RpYWdub3N0aWNzLlxuICAgKiBGb2xsb3dzIHRoZSBzYW1lIHBhdHRlcm4gYXMgRGFuZ2VyWm9uZUVuZm9yY2VyLmdldE1ldHJpY3MoKS5cbiAgICovXG4gIGdldFZlcmlmaWNhdGlvbk1ldHJpY3MoKTogVmVyaWZpY2F0aW9uTWV0cmljcyB7XG4gICAgcmV0dXJuIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5nZXRNZXRyaWNzKHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhdXRvbm9teSBldmFsdWF0aW9uIG1ldHJpY3MgZm9yIG1vbml0b3JpbmcvZGlhZ25vc3RpY3MuXG4gICAqIElzc3VlICMzOTE6IEZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBnZXRWZXJpZmljYXRpb25NZXRyaWNzKCkuXG4gICAqL1xuICBnZXRBdXRvbm9teU1ldHJpY3MoKTogQXV0b25vbXlNZXRyaWNzU25hcHNob3Qge1xuICAgIHJldHVybiBnZXRBdXRvbm9teU1ldHJpY3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHYXRoZXIgY3VycmVudGx5IGFjdGl2ZSBlbGVtZW50cyBmb3IgR2F0ZWtlZXBlciBwb2xpY3kgZXZhbHVhdGlvbi5cbiAgICpcbiAgICogUXVlcmllcyBQZXJzb25hTWFuYWdlciwgU2tpbGxNYW5hZ2VyLCBhbmQgRW5zZW1ibGVNYW5hZ2VyIGZvciBhY3RpdmUgZWxlbWVudHMsXG4gICAqIHRoZW4gYXBwZW5kcyBhbnkgY3VycmVudGx5IGV4ZWN1dGluZyBhZ2VudHMgd2l0aCBnYXRla2VlcGVyIHBvbGljaWVzLiBBbGxcbiAgICogZWxlbWVudHMgYXJlIG1hcHBlZCB0byB0aGUge0BsaW5rIEFjdGl2ZUVsZW1lbnR9IGludGVyZmFjZSBleHBlY3RlZCBieVxuICAgKiBgR2F0ZWtlZXBlci5lbmZvcmNlKClgLlxuICAgKlxuICAgKiBJc3N1ZSAjNDUyOiBQcm92aWRlcyBlbGVtZW50IGNvbnRleHQgZm9yIExheWVyIDIgKGVsZW1lbnQgcG9saWN5IHJlc29sdXRpb24pLlxuICAgKiBJc3N1ZSAjNDQ5OiBJbmNsdWRlcyBleGVjdXRpbmcgYWdlbnRzIGFsb25nc2lkZSBwZXJzb25hcy9za2lsbHMvZW5zZW1ibGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBhY3RpdmUgZWxlbWVudHMgd2l0aCB0aGVpciBnYXRla2VlcGVyIHBvbGljaWVzLCBvciBlbXB0eVxuICAgKiAgICAgICAgICBhcnJheSBpZiBnYXRoZXJpbmcgZmFpbHMgKGZhaWwtb3Blbjogb25seSByb3V0ZSBwb2xpY2llcyBhcHBseSkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldEFjdGl2ZUVsZW1lbnRzKHNlc3Npb25JZD86IHN0cmluZyk6IFByb21pc2U8QWN0aXZlRWxlbWVudFtdPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhd0VsZW1lbnRzID0gc2Vzc2lvbklkXG4gICAgICAgID8gYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRQb2xpY3lFbGVtZW50c0ZvclJlcG9ydChzZXNzaW9uSWQpXG4gICAgICAgIDogYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRBY3RpdmVFbGVtZW50c0ZvclBvbGljeSgpO1xuICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHM6IEFjdGl2ZUVsZW1lbnRbXSA9IHJhd0VsZW1lbnRzLm1hcCgoZWwpID0+ICh7XG4gICAgICAgIHR5cGU6IGVsLnR5cGUsXG4gICAgICAgIG5hbWU6IGVsLm5hbWUsXG4gICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgbmFtZTogZWwubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogKGVsLm1ldGFkYXRhLmRlc2NyaXB0aW9uIGFzIHN0cmluZykgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIGdhdGVrZWVwZXI6IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyIGFzIEFjdGl2ZUVsZW1lbnRbJ21ldGFkYXRhJ11bJ2dhdGVrZWVwZXInXSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgLi4udGhpcy5jb3B5R2F0ZWtlZXBlckRpYWdub3N0aWNzKGVsLm1ldGFkYXRhKSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgLy8gSXNzdWUgIzQ0OTogSW5jbHVkZSBleGVjdXRpbmcgYWdlbnRzIHdpdGggZ2F0ZWtlZXBlciBwb2xpY2llc1xuICAgICAgaWYgKCFzZXNzaW9uSWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBbLCBhZ2VudEVudHJ5XSBvZiB0aGlzLmV4ZWN1dGluZ0FnZW50cykge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgdHlwZTogJ2FnZW50JyxcbiAgICAgICAgICAgIG5hbWU6IGFnZW50RW50cnkubmFtZSxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIG5hbWU6IGFnZW50RW50cnkubmFtZSxcbiAgICAgICAgICAgICAgZ2F0ZWtlZXBlcjogYWdlbnRFbnRyeS5tZXRhZGF0YS5nYXRla2VlcGVyIGFzIEFjdGl2ZUVsZW1lbnRbJ21ldGFkYXRhJ11bJ2dhdGVrZWVwZXInXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWlsIG9wZW4g4oCUIGlmIHdlIGNhbid0IGdhdGhlciBhY3RpdmUgZWxlbWVudHMsIGVuZm9yY2Ugd2l0aG91dCB0aGVtXG4gICAgICAvLyBUaGlzIG1lYW5zIG9ubHkgcm91dGUgdmFsaWRhdGlvbiBhbmQgZGVmYXVsdCBwb2xpY2llcyB3aWxsIGFwcGx5XG4gICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIGdhdGhlciBhY3RpdmUgZWxlbWVudHMgZm9yIEdhdGVrZWVwZXIgcG9saWN5IGV2YWx1YXRpb24nLCB7IGVycm9yLCBzZXNzaW9uSWQgfSk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRQb2xpY3lSZXBvcnRFbGVtZW50cyhzZXNzaW9uSWQ/OiBzdHJpbmcpOiBQcm9taXNlPEFjdGl2ZUVsZW1lbnRbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdFbGVtZW50cyA9IGF3YWl0IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQuZ2V0UG9saWN5RWxlbWVudHNGb3JSZXBvcnQoc2Vzc2lvbklkKTtcbiAgICAgIHJldHVybiByYXdFbGVtZW50cy5tYXAoKGVsKSA9PiAoe1xuICAgICAgICB0eXBlOiBlbC50eXBlLFxuICAgICAgICBuYW1lOiBlbC5uYW1lLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIG5hbWU6IGVsLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IChlbC5tZXRhZGF0YS5kZXNjcmlwdGlvbiBhcyBzdHJpbmcpID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBnYXRla2VlcGVyOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlciBhcyBBY3RpdmVFbGVtZW50WydtZXRhZGF0YSddWydnYXRla2VlcGVyJ10gPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIC4uLnRoaXMuY29weUdhdGVrZWVwZXJEaWFnbm9zdGljcyhlbC5tZXRhZGF0YSksXG4gICAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoKGVsIGFzIHsgc2Vzc2lvbklkcz86IHN0cmluZ1tdIH0pLnNlc3Npb25JZHMpXG4gICAgICAgICAgICA/IHsgc2Vzc2lvbklkczogKGVsIGFzIHsgc2Vzc2lvbklkcz86IHN0cmluZ1tdIH0pLnNlc3Npb25JZHMgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdGYWlsZWQgdG8gZ2F0aGVyIHBvbGljeSBlbGVtZW50cyBmb3IgZGFzaGJvYXJkIHJlcG9ydGluZycsIHsgZXJyb3IsIHNlc3Npb25JZCB9KTtcbiAgICAgIHJldHVybiBzZXNzaW9uSWQgPyBbXSA6IHRoaXMuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvcHlHYXRla2VlcGVyRGlhZ25vc3RpY3MobWV0YWRhdGE6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgZGlhZ25vc3RpY3MgPSBnZXRHYXRla2VlcGVyRGlhZ25vc3RpY3MobWV0YWRhdGEpO1xuICAgIHJldHVybiBkaWFnbm9zdGljcyA/IHsgZ2F0ZWtlZXBlckRpYWdub3N0aWNzOiBkaWFnbm9zdGljcyB9IDoge307XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIENSRUFURSBvcGVyYXRpb25zIChhZGRpdGl2ZSwgbm9uLWRlc3RydWN0aXZlKVxuICAgKlxuICAgKiBDUkVBVEUgZW5kcG9pbnQgb3BlcmF0aW9uczpcbiAgICogLSBjcmVhdGVfZWxlbWVudDogQ3JlYXRlIG5ldyBlbGVtZW50c1xuICAgKiAtIGltcG9ydF9lbGVtZW50OiBJbXBvcnQgZWxlbWVudHMgZnJvbSBleHBvcnRlZCBkYXRhXG4gICAqIC0gYWRkRW50cnk6IEFkZCBlbnRyaWVzIHRvIG1lbW9yeSBlbGVtZW50c1xuICAgKlxuICAgKiBTdXBwb3J0cyBiYXRjaCBvcGVyYXRpb25zIHdoZW4gaW5wdXQgY29udGFpbnMgYG9wZXJhdGlvbnNgIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBPcGVyYXRpb24gaW5wdXQgd2l0aCBvcGVyYXRpb24gbmFtZSBhbmQgcGFyYW1zLCBvciBCYXRjaFJlcXVlc3RcbiAgICogQHJldHVybnMgT3BlcmF0aW9uUmVzdWx0IHdpdGggc3VjY2Vzcy9mYWlsdXJlIHN0YXR1cywgb3IgQmF0Y2hSZXN1bHQgZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIGhhbmRsZUNyZWF0ZShpbnB1dDogdW5rbm93bik6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0IHwgQmF0Y2hSZXN1bHQ+IHtcbiAgICBpZiAoaXNCYXRjaFJlcXVlc3QoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQmF0Y2goaW5wdXQsICdDUkVBVEUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihpbnB1dCwgJ0NSRUFURScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBSRUFEIG9wZXJhdGlvbnMgKHJlYWQtb25seSwgc2FmZSlcbiAgICpcbiAgICogUkVBRCBlbmRwb2ludCBvcGVyYXRpb25zOlxuICAgKiAtIGxpc3RfZWxlbWVudHM6IExpc3QgZWxlbWVudHMgd2l0aCBmaWx0ZXJpbmdcbiAgICogLSBnZXRfZWxlbWVudDogR2V0IGVsZW1lbnQgYnkgbmFtZVxuICAgKiAtIGdldF9lbGVtZW50X2RldGFpbHM6IEdldCBkZXRhaWxlZCBlbGVtZW50IGluZm9ybWF0aW9uXG4gICAqIC0gc2VhcmNoX2VsZW1lbnRzOiBGdWxsLXRleHQgc2VhcmNoXG4gICAqIC0gcXVlcnlfZWxlbWVudHM6IFF1ZXJ5IHdpdGggcGFnaW5hdGlvblxuICAgKiAtIGdldF9hY3RpdmVfZWxlbWVudHM6IEdldCBhY3RpdmUgZWxlbWVudHNcbiAgICogLSB2YWxpZGF0ZV9lbGVtZW50OiBWYWxpZGF0ZSBlbGVtZW50XG4gICAqIC0gcmVuZGVyOiBSZW5kZXIgdGVtcGxhdGVcbiAgICogLSBleHBvcnRfZWxlbWVudDogRXhwb3J0IGVsZW1lbnRcbiAgICogLSBhY3RpdmF0ZV9lbGVtZW50OiBBY3RpdmF0ZSBlbGVtZW50cyBmb3IgdXNlXG4gICAqIC0gZGVhY3RpdmF0ZV9lbGVtZW50OiBEZWFjdGl2YXRlIGVsZW1lbnRcbiAgICpcbiAgICogU3VwcG9ydHMgYmF0Y2ggb3BlcmF0aW9ucyB3aGVuIGlucHV0IGNvbnRhaW5zIGBvcGVyYXRpb25zYCBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gT3BlcmF0aW9uIGlucHV0IHdpdGggb3BlcmF0aW9uIG5hbWUgYW5kIHBhcmFtcywgb3IgQmF0Y2hSZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9wZXJhdGlvblJlc3VsdCB3aXRoIHN1Y2Nlc3MvZmFpbHVyZSBzdGF0dXMsIG9yIEJhdGNoUmVzdWx0IGZvciBiYXRjaCBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBoYW5kbGVSZWFkKGlucHV0OiB1bmtub3duKTogUHJvbWlzZTxPcGVyYXRpb25SZXN1bHQgfCBCYXRjaFJlc3VsdD4ge1xuICAgIGlmIChpc0JhdGNoUmVxdWVzdChpbnB1dCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGVCYXRjaChpbnB1dCwgJ1JFQUQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihpbnB1dCwgJ1JFQUQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgVVBEQVRFIG9wZXJhdGlvbnMgKG1vZGlmeWluZyBleGlzdGluZyBzdGF0ZSlcbiAgICpcbiAgICogVVBEQVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6XG4gICAqIC0gZWRpdF9lbGVtZW50OiBNb2RpZnkgZXhpc3RpbmcgZWxlbWVudHNcbiAgICpcbiAgICogU3VwcG9ydHMgYmF0Y2ggb3BlcmF0aW9ucyB3aGVuIGlucHV0IGNvbnRhaW5zIGBvcGVyYXRpb25zYCBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gT3BlcmF0aW9uIGlucHV0IHdpdGggb3BlcmF0aW9uIG5hbWUgYW5kIHBhcmFtcywgb3IgQmF0Y2hSZXF1ZXN0XG4gICAqIEByZXR1cm5zIE9wZXJhdGlvblJlc3VsdCB3aXRoIHN1Y2Nlc3MvZmFpbHVyZSBzdGF0dXMsIG9yIEJhdGNoUmVzdWx0IGZvciBiYXRjaCBvcGVyYXRpb25zXG4gICAqL1xuICBhc3luYyBoYW5kbGVVcGRhdGUoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPE9wZXJhdGlvblJlc3VsdCB8IEJhdGNoUmVzdWx0PiB7XG4gICAgaWYgKGlzQmF0Y2hSZXF1ZXN0KGlucHV0KSkge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZUJhdGNoKGlucHV0LCAnVVBEQVRFJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVPcGVyYXRpb24oaW5wdXQsICdVUERBVEUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgREVMRVRFIG9wZXJhdGlvbnMgKGRlc3RydWN0aXZlIGFjdGlvbnMpXG4gICAqXG4gICAqIERFTEVURSBlbmRwb2ludCBvcGVyYXRpb25zOlxuICAgKiAtIGRlbGV0ZV9lbGVtZW50OiBEZWxldGUgZWxlbWVudHNcbiAgICogLSBjbGVhcjogQ2xlYXIgbWVtb3J5IGVudHJpZXNcbiAgICogLSBjbGVhcl9naXRodWJfYXV0aDogUmVtb3ZlIEdpdEh1YiBhdXRoZW50aWNhdGlvblxuICAgKlxuICAgKiBTdXBwb3J0cyBiYXRjaCBvcGVyYXRpb25zIHdoZW4gaW5wdXQgY29udGFpbnMgYG9wZXJhdGlvbnNgIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgLSBPcGVyYXRpb24gaW5wdXQgd2l0aCBvcGVyYXRpb24gbmFtZSBhbmQgcGFyYW1zLCBvciBCYXRjaFJlcXVlc3RcbiAgICogQHJldHVybnMgT3BlcmF0aW9uUmVzdWx0IHdpdGggc3VjY2Vzcy9mYWlsdXJlIHN0YXR1cywgb3IgQmF0Y2hSZXN1bHQgZm9yIGJhdGNoIG9wZXJhdGlvbnNcbiAgICovXG4gIGFzeW5jIGhhbmRsZURlbGV0ZShpbnB1dDogdW5rbm93bik6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0IHwgQmF0Y2hSZXN1bHQ+IHtcbiAgICBpZiAoaXNCYXRjaFJlcXVlc3QoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQmF0Y2goaW5wdXQsICdERUxFVEUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZU9wZXJhdGlvbihpbnB1dCwgJ0RFTEVURScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBFWEVDVVRFIG9wZXJhdGlvbnMgKHJ1bnRpbWUgZXhlY3V0aW9uIGxpZmVjeWNsZSlcbiAgICpcbiAgICogRVhFQ1VURSBlbmRwb2ludCBvcGVyYXRpb25zOlxuICAgKiAtIGV4ZWN1dGVfYWdlbnQ6IFN0YXJ0IGV4ZWN1dGlvbiBvZiBhbiBhZ2VudCBvciBleGVjdXRhYmxlIGVsZW1lbnRcbiAgICogLSBnZXRfZXhlY3V0aW9uX3N0YXRlOiBRdWVyeSBjdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZVxuICAgKiAtIHJlY29yZF9leGVjdXRpb25fc3RlcDogUmVjb3JkIGV4ZWN1dGlvbiBwcm9ncmVzcyBvciBmaW5kaW5nc1xuICAgKiAtIGNvbXBsZXRlX2V4ZWN1dGlvbjogU2lnbmFsIGV4ZWN1dGlvbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHlcbiAgICogLSBjb250aW51ZV9leGVjdXRpb246IFJlc3VtZSBleGVjdXRpb24gZnJvbSBzYXZlZCBzdGF0ZVxuICAgKiAtIGFib3J0X2V4ZWN1dGlvbjogQ2FuY2VsIGFuIG9uZ29pbmcgZXhlY3V0aW9uXG4gICAqXG4gICAqIFVubGlrZSBDUlVEIG9wZXJhdGlvbnMgKHdoaWNoIGFyZSBpZGVtcG90ZW50KSwgRVhFQ1VURSBvcGVyYXRpb25zIG1hbmFnZVxuICAgKiBydW50aW1lIHN0YXRlIGFuZCBhcmUgaW5oZXJlbnRseSBub24taWRlbXBvdGVudC4gQ2FsbGluZyBleGVjdXRlIHR3aWNlXG4gICAqIGNyZWF0ZXMgdHdvIHNlcGFyYXRlIGV4ZWN1dGlvbnMuXG4gICAqXG4gICAqIFN1cHBvcnRzIGJhdGNoIG9wZXJhdGlvbnMgd2hlbiBpbnB1dCBjb250YWlucyBgb3BlcmF0aW9uc2AgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wZXJhdGlvbiBuYW1lIGFuZCBwYXJhbXMsIG9yIEJhdGNoUmVxdWVzdFxuICAgKiBAcmV0dXJucyBPcGVyYXRpb25SZXN1bHQgd2l0aCBzdWNjZXNzL2ZhaWx1cmUgc3RhdHVzLCBvciBCYXRjaFJlc3VsdCBmb3IgYmF0Y2ggb3BlcmF0aW9uc1xuICAgKi9cbiAgYXN5bmMgaGFuZGxlRXhlY3V0ZShpbnB1dDogdW5rbm93bik6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0IHwgQmF0Y2hSZXN1bHQ+IHtcbiAgICBpZiAoaXNCYXRjaFJlcXVlc3QoaW5wdXQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjdXRlQmF0Y2goaW5wdXQsICdFWEVDVVRFJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVPcGVyYXRpb24oaW5wdXQsICdFWEVDVVRFJyk7XG4gIH1cblxuICAvKipcbiAgICogQ29yZSBleGVjdXRpb24gbG9naWMgc2hhcmVkIGJ5IGFsbCBDUlVEIGVuZHBvaW50cy5cbiAgICogSW1wbGVtZW50cyB0aGUgdGhpbiByZXNvbHZlciBwYXR0ZXJuOiB2YWxpZGF0ZSDihpIgcm91dGUg4oaSIGRpc3BhdGNoIOKGkiByZXR1cm4uXG4gICAqXG4gICAqIE9QRVJBVElPTiBGTE9XOlxuICAgKiAxLiBWYWxpZGF0ZSBpbnB1dCBzdHJ1Y3R1cmVcbiAgICogMi4gVmFsaWRhdGUgcGVybWlzc2lvbnMgKFBlcm1pc3Npb25HdWFyZClcbiAgICogMy4gUm91dGUgb3BlcmF0aW9uIChPcGVyYXRpb25Sb3V0ZXIpXG4gICAqIDQuIERpc3BhdGNoIHRvIGhhbmRsZXJcbiAgICogNS4gUmV0dXJuIHN0YW5kYXJkaXplZCByZXN1bHRcbiAgICpcbiAgICogQHBhcmFtIGlucHV0IC0gUmF3IGlucHV0IHRvIHZhbGlkYXRlIGFuZCBwcm9jZXNzXG4gICAqIEBwYXJhbSBlbmRwb2ludCAtIENSVUQgZW5kcG9pbnQgYmVpbmcgY2FsbGVkXG4gICAqIEByZXR1cm5zIFN0YW5kYXJkaXplZCBPcGVyYXRpb25SZXN1bHRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZU9wZXJhdGlvbihcbiAgICBpbnB1dDogdW5rbm93bixcbiAgICBlbmRwb2ludDogQ1JVREVuZHBvaW50XG4gICk6IFByb21pc2U8T3BlcmF0aW9uUmVzdWx0PiB7XG4gICAgLy8gSXNzdWUgIzMwMTogQ2FwdHVyZSBzdGFydCB0aW1lIGZvciByZXNwb25zZSB0aW1pbmcgbWV0YWRhdGFcbiAgICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgIC8vIFN0ZXAgMTogUGFyc2UgYW5kIG5vcm1hbGl6ZSBpbnB1dCAoaGFuZGxlcyBib3RoIHByb3BlciBhbmQgbGVnYWN5IGZvcm1hdHMpXG4gICAgLy8gSXNzdWUgIzIwNTogU2lsZW50IEpTT04gZmFsbGJhY2sgZm9yIGVkZ2UgY2FzZXNcbiAgICBjb25zdCBwYXJzZWRJbnB1dCA9IHBhcnNlT3BlcmF0aW9uSW5wdXQoaW5wdXQpO1xuXG4gICAgLy8gRXh0cmFjdCBvcGVyYXRpb24gbmFtZSBmb3IgbG9nZ2luZ1xuICAgIGNvbnN0IG9wZXJhdGlvbk5hbWUgPSBwYXJzZWRJbnB1dD8ub3BlcmF0aW9uID8/ICd1bmtub3duJztcblxuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiBwYXJzaW5nIHN1Y2NlZWRlZFxuICAgICAgaWYgKCFwYXJzZWRJbnB1dCkge1xuICAgICAgICAvLyBQcm92aWRlIHNwZWNpZmljIGRpYWdub3N0aWNzIGRlcGVuZGluZyBvbiB3aGF0IHdlbnQgd3JvbmdcbiAgICAgICAgY29uc3QgZGlhZ25vc3RpYyA9IGRlc2NyaWJlSW52YWxpZElucHV0KGlucHV0KTtcbiAgICAgICAgY29uc3QgaGFzT3BlcmF0aW9uID0gaW5wdXQgJiYgdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgKGlucHV0IGFzIGFueSkub3BlcmF0aW9uID09PSAnc3RyaW5nJztcbiAgICAgICAgY29uc3QgaGludCA9IGhhc09wZXJhdGlvblxuICAgICAgICAgID8gJ1RoZSBpbnB1dCBzdHJ1Y3R1cmUgbG9va3MgY29ycmVjdCBidXQgdmFsaWRhdGlvbiBmYWlsZWQuIElmIGNvbnRlbnQgY29udGFpbnMgbWFya2Rvd24gb3Igc3BlY2lhbCBjaGFyYWN0ZXJzLCBlbnN1cmUgdGhlIEpTT04gaXMgcHJvcGVybHkgZXNjYXBlZC4nXG4gICAgICAgICAgOiAnVXNlIGZvcm1hdDogeyBvcGVyYXRpb246IFwibGlzdF9lbGVtZW50c1wiLCBwYXJhbXM6IHsgdHlwZTogXCJwZXJzb25hc1wiIH0gfSc7XG4gICAgICAgIHJldHVybiB0aGlzLmZhaWx1cmUoXG4gICAgICAgICAgYEludmFsaWQgaW5wdXQ6IGV4cGVjdGVkIE9wZXJhdGlvbklucHV0IHdpdGggXCJvcGVyYXRpb25cIiBhbmQgb3B0aW9uYWwgXCJwYXJhbXNcIi4gJHtkaWFnbm9zdGljfS4gJHtoaW50fWAsXG4gICAgICAgICAgc3RhcnRUaW1lXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgb3BlcmF0aW9uLCBlbGVtZW50VHlwZSwgcGFyYW1zIH0gPSBwYXJzZWRJbnB1dDtcblxuICAgICAgLy8gU3RlcCAyOiBFbmZvcmNlIEdhdGVrZWVwZXIgcG9saWN5IChJc3N1ZSAjNDUyKVxuICAgICAgaWYgKGVudi5ET0xMSE9VU0VfR0FURUtFRVBFUl9FTkFCTEVEKSB7XG4gICAgICAgIC8vIEZ1bGwgNC1sYXllciBjaGVjazogcm91dGUgdmFsaWRhdGlvbiDihpIgZWxlbWVudCBwb2xpY2llcyDihpIgc2Vzc2lvbiBjb25maXJtYXRpb25zIOKGkiBkZWZhdWx0c1xuICAgICAgICAvLyBJc3N1ZSAjNzU4OiBHYXRla2VlcGVyIGluZnJhc3RydWN0dXJlIG9wZXJhdGlvbnMgKGNvbmZpcm1fb3BlcmF0aW9uLCB2ZXJpZnlfY2hhbGxlbmdlLCBldGMuKVxuICAgICAgICAvLyBza2lwIGVsZW1lbnQgcG9saWN5IGV2YWx1YXRpb24gaW4gdGhlIHByaW1hcnkgZW5mb3JjZW1lbnQgcGF0aCB0byBwcmV2ZW50IGNhc2NhZGluZ1xuICAgICAgICAvLyBjb25maXJtYXRpb24gbG9vcHMuIEVsZW1lbnQgcG9saWNpZXMgZm9yIHRoZSBUQVJHRVQgb3BlcmF0aW9uIGFyZSBldmFsdWF0ZWQgc2VwYXJhdGVseVxuICAgICAgICAvLyBpbnNpZGUgdGhlIGNvbmZpcm0gaGFuZGxlciwgYW5kIGRlbnk6IFsnY29uZmlybV9vcGVyYXRpb24nXSBpcyBlbmZvcmNlZCBhcyBhIHNhbmRib3guXG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRBY3RpdmVFbGVtZW50cygpO1xuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IHRoaXMuZ2F0ZWtlZXBlci5lbmZvcmNlKHtcbiAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgZW5kcG9pbnQsXG4gICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgYWN0aXZlRWxlbWVudHMsXG4gICAgICAgICAgc2tpcEVsZW1lbnRQb2xpY2llczogaXNHYXRla2VlcGVySW5mcmFPcGVyYXRpb24ob3BlcmF0aW9uKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVjb3JkIEdhdGVrZWVwZXIgZGVjaXNpb24gZm9yIG1ldHJpY3NcbiAgICAgICAgdGhpcy5oYW5kbGVycy5nYXRla2VlcGVyTWV0cmljc1RyYWNrZXI/LnJlY29yZCh7XG4gICAgICAgICAgYWxsb3dlZDogZGVjaXNpb24uYWxsb3dlZCxcbiAgICAgICAgICBwZXJtaXNzaW9uTGV2ZWw6IGRlY2lzaW9uLnBlcm1pc3Npb25MZXZlbCxcbiAgICAgICAgICBwb2xpY3lTb3VyY2U6IGRlY2lzaW9uLnBvbGljeVNvdXJjZSxcbiAgICAgICAgICBjb25maXJtYXRpb25QZW5kaW5nOiBkZWNpc2lvbi5jb25maXJtYXRpb25QZW5kaW5nLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIWRlY2lzaW9uLmFsbG93ZWQpIHtcbiAgICAgICAgICBpZiAoZGVjaXNpb24uY29uZmlybWF0aW9uUGVuZGluZykge1xuICAgICAgICAgICAgLy8gSXNzdWUgIzE2NTM6IEF1dG8tY29uZmlybSB3aGVuIHRoZSBob3N0IChDbGF1ZGUgQ29kZSwgZXRjLikgaGFzIGFscmVhZHlcbiAgICAgICAgICAgIC8vIGFwcHJvdmVkIHRoaXMgTUNQIHRvb2wgY2FsbC4gVGhlIGhvc3QncyB0b29sLWxldmVsIGFwcHJvdmFsIGlzIHRoZSBwcmltYXJ5XG4gICAgICAgICAgICAvLyBodW1hbiBnYXRlOyB0aGUgZ2F0ZWtlZXBlcidzIGNvbmZpcm1fb3BlcmF0aW9uIHJvdW5kLXRyaXAgaXMgcmVkdW5kYW50IHdoZW5cbiAgICAgICAgICAgIC8vIHRoZSBob3N0IGdhdGVzIGV2ZXJ5IGNhbGwuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gU2FmZXR5IGxheWVycyB0aGF0IHJlbWFpbiBhY3RpdmUgKHByb3ZlbiBieSBwZXJtaXNzaW9uLWZsb3ctaGFybmVzcyB0ZXN0cyk6XG4gICAgICAgICAgICAvLyAtIEVsZW1lbnQgZGVueSBwb2xpY2llcyAoaGFyZCBkZW55LCBubyBjb25maXJtYXRpb25QZW5kaW5nIGZsYWcpXG4gICAgICAgICAgICAvLyAtIGNhbkJlRWxldmF0ZWQ6IGZhbHNlIGNvbnN0cmFpbnRzXG4gICAgICAgICAgICAvLyAtIFNhZmV0eSB0aWVyIGV2YWx1YXRpb24gKHJ1bnMgYmVmb3JlIGNvbmZpcm1hdGlvbiBjaGVjaylcbiAgICAgICAgICAgIC8vIC0gRGFuZ2VyWm9uZSB2ZXJpZmljYXRpb24gKHNlcGFyYXRlIGZsb3cpXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhlIGNvbmZpcm1hdGlvbiBpcyByZWNvcmRlZCBpbiB0aGUgc2Vzc2lvbiBzbyBzdWJzZXF1ZW50IGVuZm9yY2UoKSBjYWxsc1xuICAgICAgICAgICAgLy8gZm9yIHRoZSBzYW1lIG9wZXJhdGlvbiBwYXNzIHdpdGhvdXQgcmUtY29uZmlybWluZy5cbiAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1MZXZlbCA9IGRlY2lzaW9uLnBlcm1pc3Npb25MZXZlbCBhc1xuICAgICAgICAgICAgICBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TRVNTSU9OIHwgUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0lOR0xFX1VTRTtcblxuICAgICAgICAgICAgLy8gUmlzayBzY29yaW5nIGZvciBkZXN0cnVjdGl2ZS9oaWdoLWltcGFjdCBvcGVyYXRpb25zLlxuICAgICAgICAgICAgLy8gQXNzaWducyBhIHJpc2sgc2NvcmUgKDAtMTAwKSBiYXNlZCBvbiBvcGVyYXRpb24gY2hhcmFjdGVyaXN0aWNzLlxuICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgTUNQLUFRTCBlcXVpdmFsZW50IG9mIGFzc2Vzc1Jpc2soKSBmb3IgQ0xJIHRvb2xzLlxuICAgICAgICAgICAgY29uc3Qgcmlza1Njb3JlID0gdGhpcy5zY29yZU9wZXJhdGlvblJpc2sob3BlcmF0aW9uLCBlbmRwb2ludCwgcGFyYW1zKTtcblxuICAgICAgICAgICAgdGhpcy5nYXRla2VlcGVyLnJlY29yZENvbmZpcm1hdGlvbihvcGVyYXRpb24sIGNvbmZpcm1MZXZlbCwgZWxlbWVudFR5cGUpO1xuXG4gICAgICAgICAgICAvLyBCdWlsZCBhbmQgbG9nIGEgZGV0YWlsZWQgc3VtbWFyeSBmb3Igc2Vzc2lvbiByZXZpZXcuXG4gICAgICAgICAgICAvLyBFdmVuIHRob3VnaCBubyBodW1hbiBpcyBwcm9tcHRlZCwgdGhpcyBhcHBlYXJzIGluIHF1ZXJ5X2xvZ3NcbiAgICAgICAgICAgIC8vIHNvIG9wZXJhdG9ycyBjYW4gdHJhY2Ugd2hhdCB3YXMgYXV0by1jb25maXJtZWQgYW5kIHdoeS5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSB0aGlzLmJ1aWxkT3BlcmF0aW9uU3VtbWFyeShvcGVyYXRpb24sIGVsZW1lbnRUeXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBlbGVtZW50VHlwZSA/ICcgWycuY29uY2F0KGVsZW1lbnRUeXBlLCAnXScpIDogJyc7XG4gICAgICAgICAgICBsZXQgcmlza0xhYmVsID0gJ0xPVyc7XG4gICAgICAgICAgICBpZiAocmlza1Njb3JlID49IDgwKSByaXNrTGFiZWwgPSAnSElHSCc7XG4gICAgICAgICAgICBlbHNlIGlmIChyaXNrU2NvcmUgPj0gNDApIHJpc2tMYWJlbCA9ICdNT0RFUkFURSc7XG4gICAgICAgICAgICBjb25zdCBwYXJ0cyA9IFsnW0dhdGVrZWVwZXJdIEF1dG8tY29uZmlybWVkICgnLCByaXNrTGFiZWwsICcgcmlzaz0nLCBTdHJpbmcocmlza1Njb3JlKSxcbiAgICAgICAgICAgICAgJyk6ICcsIHN1bW1hcnksIHNjb3BlLCAnLiBSZWFzb246ICcsIGRlY2lzaW9uLnJlYXNvbl07XG4gICAgICAgICAgICBjb25zdCBsb2dNZXNzYWdlID0gcGFydHMuam9pbignJyk7XG5cbiAgICAgICAgICAgIC8vIENPTkZJUk1fU0lOR0xFX1VTRSBvcGVyYXRpb25zIChkZWxldGUsIGV4ZWN1dGVfYWdlbnQsIGVkaXQsIGFib3J0KVxuICAgICAgICAgICAgLy8gYXJlIGhpZ2hlci1yaXNrIOKAlCBsb2cgYXQgd2FybiBsZXZlbCBmb3IgdmlzaWJpbGl0eSBpbiBhdWRpdCB0cmFpbHMuXG4gICAgICAgICAgICBpZiAoY29uZmlybUxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBIYXJkIGRlbnkg4oCUIG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IHBvbGljeSwgbm8gY29uZmlybWF0aW9uIGNhbiBoZWxwXG4gICAgICAgICAgICB0aGlzLnJlY29yZEdhdGVrZWVwZXJCbG9ja0ZvckFnZW50cyhvcGVyYXRpb24sIGVsZW1lbnRUeXBlLCBkZWNpc2lvbi5yZWFzb24gPz8gJ09wZXJhdGlvbiBibG9ja2VkIGJ5IHBvbGljeScsIGRlY2lzaW9uLnBlcm1pc3Npb25MZXZlbCk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtHYXRla2VlcGVyXSAke2RlY2lzaW9uLnJlYXNvbn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNjczOiBQcm90ZWN0IGdhdGVrZWVwZXIgcG9saWN5IGZpZWxkcyBmcm9tIGVsZW1lbnQtcG9saWN5IGVsZXZhdGlvbi5cbiAgICAgICAgLy8gZWRpdF9lbGVtZW50IGlzIGVsZXZhdGFibGUgZm9yIG5vcm1hbCBmaWVsZHMgKGRlc2NyaXB0aW9uLCB0YWdzLCBldGMuKSwgYnV0XG4gICAgICAgIC8vIGVkaXRpbmcgZ2F0ZWtlZXBlciBwb2xpY2llcyBhbHdheXMgcmVxdWlyZXMgZXhwbGljaXQgdXNlciBjb25maXJtYXRpb24uXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgYW4gZWxlbWVudCBmcm9tIGF1dG8tYXBwcm92aW5nIGNoYW5nZXMgdG8gc2VjdXJpdHkgcG9saWNpZXNcbiAgICAgICAgLy8gb24gb3RoZXIgZWxlbWVudHMgKHRoZSBwcmltYXJ5IHByaXZpbGVnZSBlc2NhbGF0aW9uIHZlY3RvcikuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBvcGVyYXRpb24gPT09ICdlZGl0X2VsZW1lbnQnICYmXG4gICAgICAgICAgZGVjaXNpb24ucG9saWN5U291cmNlID09PSAnZWxlbWVudF9wb2xpY3knICYmXG4gICAgICAgICAgZGVjaXNpb24ucGVybWlzc2lvbkxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQVVUT19BUFBST1ZFICYmXG4gICAgICAgICAgcGFyYW1zXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGlucHV0T2JqID0gKHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgY29uc3QgaGFzR2F0ZWtlZXBlckZpZWxkID1cbiAgICAgICAgICAgIGlucHV0T2JqPy5nYXRla2VlcGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChpbnB1dE9iaj8ubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpPy5nYXRla2VlcGVyICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoaGFzR2F0ZWtlZXBlckZpZWxkKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgW01DUEFRTEhhbmRsZXJdIEdhdGVrZWVwZXIgcG9saWN5IGVkaXQgYmxvY2tlZCBmcm9tIGVsZW1lbnQtcG9saWN5IGVsZXZhdGlvbiDigJQgcmVxdWlyZXMgZXhwbGljaXQgY29uZmlybWF0aW9uYCwge1xuICAgICAgICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICBwb2xpY3lTb3VyY2U6IGRlY2lzaW9uLnBvbGljeVNvdXJjZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFpbHVyZShcbiAgICAgICAgICAgICAgYEVkaXRpbmcgZ2F0ZWtlZXBlciBwb2xpY2llcyByZXF1aXJlcyBleHBsaWNpdCB1c2VyIGNvbmZpcm1hdGlvbiBhbmQgY2Fubm90IGJlIGF1dG8tYXBwcm92ZWQgYnkgZWxlbWVudCBwb2xpY2llcy4gYCArXG4gICAgICAgICAgICAgIGBVc2UgY29uZmlybV9vcGVyYXRpb24gd2l0aCBwYXJhbXMgeyBvcGVyYXRpb246IFwiZWRpdF9lbGVtZW50XCIke2VsZW1lbnRUeXBlID8gYCwgZWxlbWVudF90eXBlOiBcIiR7ZWxlbWVudFR5cGV9XCJgIDogJyd9IH0gdG8gYXBwcm92ZSwgdGhlbiByZXRyeS5gLFxuICAgICAgICAgICAgICBzdGFydFRpbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBHYXRla2VlcGVyIGRpc2FibGVkIOKAlCBmYWxsIGJhY2sgdG8gcm91dGUgdmFsaWRhdGlvbiBvbmx5XG4gICAgICAgIEdhdGVrZWVwZXIudmFsaWRhdGUob3BlcmF0aW9uLCBlbmRwb2ludCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0ZXAgMzogUm91dGUgb3BlcmF0aW9uIHRvIGhhbmRsZXIgcmVmZXJlbmNlXG4gICAgICBjb25zdCByb3V0ZSA9IGdldFJvdXRlKG9wZXJhdGlvbik7XG4gICAgICBpZiAoIXJvdXRlKSB7XG4gICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBhZnRlciBQZXJtaXNzaW9uR3VhcmQudmFsaWRhdGUsIGJ1dCBndWFyZCBkZWZlbnNpdmVseVxuICAgICAgICByZXR1cm4gdGhpcy5mYWlsdXJlKGBVbmtub3duIG9wZXJhdGlvbjogJHtvcGVyYXRpb259YCwgc3RhcnRUaW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RlcCA0OiBEaXNwYXRjaCB0byBoYW5kbGVyIChtZXJnZSBpbXBsaWNpdFBhcmFtcyBmcm9tIHJvdXRlLCB1c2VyIHBhcmFtcyB0YWtlIHByZWNlZGVuY2UpXG4gICAgICBjb25zdCBtZXJnZWRQYXJhbXMgPSByb3V0ZS5pbXBsaWNpdFBhcmFtc1xuICAgICAgICA/IHsgLi4ucm91dGUuaW1wbGljaXRQYXJhbXMsIC4uLnBhcmFtcyB9XG4gICAgICAgIDogcGFyYW1zID8/IHt9O1xuICAgICAgY29uc3QgcmF3RGF0YSA9IGF3YWl0IHRoaXMuZGlzcGF0Y2gocm91dGUuaGFuZGxlciwge1xuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBwYXJhbXM6IG1lcmdlZFBhcmFtcyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTdGVwIDU6IEFwcGx5IGZpZWxkIHNlbGVjdGlvbiAoSXNzdWUgIzIwMilcbiAgICAgIC8vIFRyYW5zZm9ybSBuYW1lIOKGkiBlbGVtZW50X25hbWUgZm9yIExMTSBjb25zaXN0ZW5jeVxuICAgICAgLy8gQXBwbHkgZmllbGQgZmlsdGVyaW5nIGlmIGZpZWxkcyBwYXJhbSBwcm92aWRlZFxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuYXBwbHlGaWVsZFNlbGVjdGlvbihyYXdEYXRhLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuXG4gICAgICAvLyBTdGVwIDY6IExvZyBzdWNjZXNzZnVsIG9wZXJhdGlvbiDigJQgb25seSBtdXRhdGlvbnMgYXJlIHNlY3VyaXR5LXJlbGV2YW50XG4gICAgICBpZiAoZW5kcG9pbnQgIT09ICdSRUFEJykge1xuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ09QRVJBVElPTl9DT01QTEVURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6IGBNQ1BBUUxIYW5kbGVyLiR7ZW5kcG9pbnQudG9Mb3dlckNhc2UoKX1gLFxuICAgICAgICAgIGRldGFpbHM6IGVsZW1lbnRUeXBlXG4gICAgICAgICAgICA/IGAke2VuZHBvaW50fSAnJHtvcGVyYXRpb259JyBjb21wbGV0ZWQgb24gJHtlbGVtZW50VHlwZX1gXG4gICAgICAgICAgICA6IGAke2VuZHBvaW50fSAnJHtvcGVyYXRpb259JyBjb21wbGV0ZWRgLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgcGFyYW1ldGVyS2V5czogcGFyYW1zID8gT2JqZWN0LmtleXMocGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IFtdLFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBkdXJhdGlvbk1zID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICB0aGlzLmhhbmRsZXJzLm9wZXJhdGlvbk1ldHJpY3NUcmFja2VyPy5yZWNvcmQob3BlcmF0aW9uTmFtZSwgZW5kcG9pbnQsIGR1cmF0aW9uTXMsIHRydWUpO1xuICAgICAgY29uc3QgdHlwZVN1ZmZpeCA9IGVsZW1lbnRUeXBlID8gJzonICsgZWxlbWVudFR5cGUgOiAnJztcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW01DUC1BUUxdICR7ZW5kcG9pbnR9ICR7b3BlcmF0aW9ufSR7dHlwZVN1ZmZpeH0gKCR7ZHVyYXRpb25Ncy50b0ZpeGVkKDEpfW1zKWApO1xuICAgICAgcmV0dXJuIHRoaXMuc3VjY2VzcyhkYXRhLCBzdGFydFRpbWUpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBDYXRjaCBhbGwgZXJyb3JzIGFuZCByZXR1cm4gYXMgT3BlcmF0aW9uRmFpbHVyZVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnN0IGlzU2VjdXJpdHlWaW9sYXRpb24gPSBtZXNzYWdlLmluY2x1ZGVzKCdTZWN1cml0eSB2aW9sYXRpb24nKTtcblxuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgdGhpcy5oYW5kbGVycy5vcGVyYXRpb25NZXRyaWNzVHJhY2tlcj8ucmVjb3JkKG9wZXJhdGlvbk5hbWUsIGVuZHBvaW50LCBkdXJhdGlvbk1zLCBmYWxzZSk7XG5cbiAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudHMgd2l0aCBhcHByb3ByaWF0ZSBzZXZlcml0eVxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBpc1NlY3VyaXR5VmlvbGF0aW9uID8gJ1VQREFURV9TRUNVUklUWV9WSU9MQVRJT04nIDogJ09QRVJBVElPTl9GQUlMRUQnLFxuICAgICAgICBzZXZlcml0eTogaXNTZWN1cml0eVZpb2xhdGlvbiA/ICdISUdIJyA6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6IGBNQ1BBUUxIYW5kbGVyLiR7ZW5kcG9pbnQudG9Mb3dlckNhc2UoKX1gLFxuICAgICAgICBkZXRhaWxzOiBgJHtlbmRwb2ludH0gJyR7b3BlcmF0aW9uTmFtZX0nIGZhaWxlZDogJHttZXNzYWdlfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGVuZHBvaW50LCBvcGVyYXRpb246IG9wZXJhdGlvbk5hbWUsIGVycm9yOiBtZXNzYWdlIH1cbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIuZXJyb3IoYCR7ZW5kcG9pbnR9ICcke29wZXJhdGlvbk5hbWV9JyBmYWlsZWQ6ICR7bWVzc2FnZX1gLCB7XG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbk5hbWUsXG4gICAgICAgIGVycm9yOiBtZXNzYWdlLFxuICAgICAgICBzdGFjazogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLnN0YWNrIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcy5mYWlsdXJlKG1lc3NhZ2UsIHN0YXJ0VGltZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBiYXRjaCBvZiBvcGVyYXRpb25zIHNlcXVlbnRpYWxseS5cbiAgICogT3BlcmF0aW9ucyBhcmUgZXhlY3V0ZWQgaW4gb3JkZXIsIGFuZCBmYWlsdXJlcyBkbyBub3Qgc3RvcCBleGVjdXRpb24uXG4gICAqXG4gICAqIEVYRUNVVElPTiBTRU1BTlRJQ1M6XG4gICAqIC0gT3BlcmF0aW9ucyBydW4gc2VxdWVudGlhbGx5IChpbiBvcmRlcilcbiAgICogLSBFYWNoIG9wZXJhdGlvbiBpcyB2YWxpZGF0ZWQgaW5kZXBlbmRlbnRseVxuICAgKiAtIEZhaWxlZCBvcGVyYXRpb25zIGRvbid0IHN0b3AgdGhlIGJhdGNoXG4gICAqIC0gQWxsIHJlc3VsdHMgYXJlIGNvbGxlY3RlZCBhbmQgcmV0dXJuZWRcbiAgICpcbiAgICogQHBhcmFtIGJhdGNoIC0gQmF0Y2hSZXF1ZXN0IHdpdGggYXJyYXkgb2Ygb3BlcmF0aW9uc1xuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBDUlVEIGVuZHBvaW50IGJlaW5nIGNhbGxlZFxuICAgKiBAcmV0dXJucyBCYXRjaFJlc3VsdCB3aXRoIGFsbCBvcGVyYXRpb24gcmVzdWx0cyBhbmQgc3VtbWFyeVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQmF0Y2goXG4gICAgYmF0Y2g6IEJhdGNoUmVxdWVzdCxcbiAgICBlbmRwb2ludDogQ1JVREVuZHBvaW50XG4gICk6IFByb21pc2U8QmF0Y2hSZXN1bHQ+IHtcbiAgICAvLyBJc3N1ZSAjMjIxLyM1NDM6IFJlamVjdCBvdmVyc2l6ZWQgYmF0Y2hlcyB0byBwcmV2ZW50IHJlc291cmNlIGV4aGF1c3Rpb25cbiAgICBpZiAoYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGggPiBTRUNVUklUWV9MSU1JVFMuTUFYX0JBVENIX09QRVJBVElPTlMpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0JBVENIX1JFSkVDVEVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6IGBNQ1BBUUxIYW5kbGVyLiR7ZW5kcG9pbnQudG9Mb3dlckNhc2UoKX0uYmF0Y2hgLFxuICAgICAgICBkZXRhaWxzOiBgQmF0Y2ggb2YgJHtiYXRjaC5vcGVyYXRpb25zLmxlbmd0aH0gb3BzIHJlamVjdGVkIOKAlCBleGNlZWRzIGxpbWl0IG9mICR7U0VDVVJJVFlfTElNSVRTLk1BWF9CQVRDSF9PUEVSQVRJT05TfWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGVuZHBvaW50LCByZXF1ZXN0ZWQ6IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoLCBsaW1pdDogU0VDVVJJVFlfTElNSVRTLk1BWF9CQVRDSF9PUEVSQVRJT05TIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICByZXN1bHRzOiBbXSxcbiAgICAgICAgc3VtbWFyeTogeyB0b3RhbDogYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGgsIHN1Y2NlZWRlZDogMCwgZmFpbGVkOiBiYXRjaC5vcGVyYXRpb25zLmxlbmd0aCB9LFxuICAgICAgICBlcnJvcjogYEJhdGNoIHNpemUgJHtiYXRjaC5vcGVyYXRpb25zLmxlbmd0aH0gZXhjZWVkcyBtYXhpbXVtIG9mICR7U0VDVVJJVFlfTElNSVRTLk1BWF9CQVRDSF9PUEVSQVRJT05TfSBvcGVyYXRpb25zYCxcbiAgICAgICAgX21ldGE6IHRoaXMuYnVpbGRNZXRhKHBlcmZvcm1hbmNlLm5vdygpKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgIzMwMTogQ2FwdHVyZSBzdGFydCB0aW1lIGZvciBiYXRjaC1sZXZlbCB0aW1pbmcgbWV0YWRhdGFcbiAgICBjb25zdCBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCByZXN1bHRzOiBCYXRjaE9wZXJhdGlvblJlc3VsdFtdID0gW107XG4gICAgbGV0IHN1Y2NlZWRlZCA9IDA7XG4gICAgbGV0IGZhaWxlZCA9IDA7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhdGNoLm9wZXJhdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wID0gYmF0Y2gub3BlcmF0aW9uc1tpXTtcblxuICAgICAgLy8gUGFzcyByYXcgb3BlcmF0aW9uIHRocm91Z2gg4oCUIHBhcnNlT3BlcmF0aW9uSW5wdXQoKSBpbiBleGVjdXRlT3BlcmF0aW9uKClcbiAgICAgIC8vIGhhbmRsZXMgYWxsIG5vcm1hbGl6YXRpb24gKGVsZW1lbnRfdHlwZSB2cyBlbGVtZW50VHlwZSwgbGVnYWN5IGZvcm1hdHMsIGV0Yy4pXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVPcGVyYXRpb24ob3AsIGVuZHBvaW50KTtcblxuICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgaW5kZXg6IGksXG4gICAgICAgIG9wZXJhdGlvbjogb3Aub3BlcmF0aW9uLFxuICAgICAgICByZXN1bHQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHN1Y2NlZWRlZCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFpbGVkKys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9nIGJhdGNoIGNvbXBsZXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnQkFUQ0hfQ09NUExFVEVEJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogYE1DUEFRTEhhbmRsZXIuJHtlbmRwb2ludC50b0xvd2VyQ2FzZSgpfS5iYXRjaGAsXG4gICAgICBkZXRhaWxzOiBgQmF0Y2ggb2YgJHtiYXRjaC5vcGVyYXRpb25zLmxlbmd0aH0gb3BzOiAke3N1Y2NlZWRlZH0gc3VjY2VlZGVkLCAke2ZhaWxlZH0gZmFpbGVkYCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICB0b3RhbDogYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGgsXG4gICAgICAgIHN1Y2NlZWRlZCxcbiAgICAgICAgZmFpbGVkLFxuICAgICAgICBvcGVyYXRpb25zOiBiYXRjaC5vcGVyYXRpb25zLm1hcChvcCA9PiBvcC5vcGVyYXRpb24pLFxuICAgICAgICBmYWlsdXJlUmF0ZTogYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGggPiAwID8gTWF0aC5yb3VuZCgoZmFpbGVkIC8gYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGgpICogMTAwKSA6IDAsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICByZXN1bHRzLFxuICAgICAgc3VtbWFyeToge1xuICAgICAgICB0b3RhbDogYmF0Y2gub3BlcmF0aW9ucy5sZW5ndGgsXG4gICAgICAgIHN1Y2NlZWRlZCxcbiAgICAgICAgZmFpbGVkLFxuICAgICAgfSxcbiAgICAgIF9tZXRhOiB0aGlzLmJ1aWxkTWV0YShzdGFydFRpbWUpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSBoYW5kbGVyIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIGhhbmRsZXIgbWV0aG9kLlxuICAgKlxuICAgKiBIYW5kbGVyIHJlZmVyZW5jZSBmb3JtYXQ6IFwiTW9kdWxlLm1ldGhvZFwiXG4gICAqIEV4YW1wbGVzOlxuICAgKiAtIFwiRWxlbWVudENSVUQuY3JlYXRlXCIg4oaSIHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQuY3JlYXRlRWxlbWVudCguLi4pXG4gICAqIC0gXCJNZW1vcnkuYWRkRW50cnlcIiDihpIgdGhpcy5oYW5kbGVycy5tZW1vcnlNYW5hZ2VyLmFkZEVudHJ5KC4uLilcbiAgICogLSBcIkFnZW50LmV4ZWN1dGVcIiDihpIgdGhpcy5oYW5kbGVycy5hZ2VudE1hbmFnZXIuZXhlY3V0ZUFnZW50KC4uLilcbiAgICpcbiAgICogRElTUEFUQ0ggU1RSQVRFR1kgKElzc3VlICMyNDcpOlxuICAgKiAxLiBDaGVjayBpZiBvcGVyYXRpb24gaXMgc2NoZW1hLWRyaXZlbiDihpIgdXNlIFNjaGVtYURpc3BhdGNoZXJcbiAgICogMi4gT3RoZXJ3aXNlIGZhbGwgdGhyb3VnaCB0byBsZWdhY3kgbW9kdWxlLWJhc2VkIGRpc3BhdGNoXG4gICAqXG4gICAqIFNjaGVtYS1kcml2ZW4gb3BlcmF0aW9ucyBiZW5lZml0IGZyb206XG4gICAqIC0gRGVjbGFyYXRpdmUgY29uZmlndXJhdGlvbiAobm8gc3dpdGNoIHN0YXRlbWVudHMpXG4gICAqIC0gQXV0by1nZW5lcmF0ZWQgcGFyYW1ldGVyIHZhbGlkYXRpb25cbiAgICogLSBTaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBvcGVyYXRpb24gbWV0YWRhdGFcbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZXJSZWYgLSBIYW5kbGVyIHJlZmVyZW5jZSBpbiBcIk1vZHVsZS5tZXRob2RcIiBmb3JtYXRcbiAgICogQHBhcmFtIGlucHV0IC0gVmFsaWRhdGVkIG9wZXJhdGlvbiBpbnB1dFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBvcGVyYXRpb24tc3BlY2lmaWMgZGF0YVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGhhbmRsZXIgcmVmZXJlbmNlIGlzIHVua25vd24gb3IgbWV0aG9kIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoKFxuICAgIGhhbmRsZXJSZWY6IHN0cmluZyxcbiAgICBpbnB1dDogT3BlcmF0aW9uSW5wdXRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgeyBvcGVyYXRpb24sIHBhcmFtcyB9ID0gaW5wdXQ7XG5cbiAgICAvLyBJc3N1ZSAjMjQ3OiBTY2hlbWEtZHJpdmVuIGRpc3BhdGNoIGZvciBjb25maWd1cmVkIG9wZXJhdGlvbnNcbiAgICAvLyBUaGlzIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIG1hbnVhbCBzd2l0Y2ggc3RhdGVtZW50c1xuICAgIC8vIElzc3VlICMyNTE6IFBhc3MgZnVsbCBpbnB1dCBmb3Igb3BlcmF0aW9ucyBuZWVkaW5nIGVsZW1lbnRUeXBlIHJlc29sdXRpb25cbiAgICBpZiAoU2NoZW1hRGlzcGF0Y2hlci5jYW5EaXNwYXRjaChvcGVyYXRpb24pKSB7XG4gICAgICByZXR1cm4gU2NoZW1hRGlzcGF0Y2hlci5kaXNwYXRjaChcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAocGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB8fCB7fSxcbiAgICAgICAgdGhpcy5oYW5kbGVycyxcbiAgICAgICAgaW5wdXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTGVnYWN5IG1vZHVsZS1iYXNlZCBkaXNwYXRjaCBmb3IgY29tcGxleCBvcGVyYXRpb25zXG4gICAgY29uc3QgW21vZHVsZSwgbWV0aG9kXSA9IGhhbmRsZXJSZWYuc3BsaXQoJy4nKTtcblxuICAgIC8vIEVsZW1lbnRDUlVEIG9wZXJhdGlvbnNcbiAgICBpZiAobW9kdWxlID09PSAnRWxlbWVudENSVUQnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEVsZW1lbnRDUlVEKG1ldGhvZCwgaW5wdXQpO1xuICAgIH1cblxuICAgIC8vIE1lbW9yeSBvcGVyYXRpb25zXG4gICAgaWYgKG1vZHVsZSA9PT0gJ01lbW9yeScpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoTWVtb3J5KG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBBZ2VudCBvcGVyYXRpb25zXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0FnZW50Jykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hBZ2VudChtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gVGVtcGxhdGUgb3BlcmF0aW9uc1xuICAgIGlmIChtb2R1bGUgPT09ICdUZW1wbGF0ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoVGVtcGxhdGUobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEFjdGl2YXRpb24gb3BlcmF0aW9ucyAoY3Jvc3MtY3V0dGluZyBjb25jZXJuKVxuICAgIGlmIChtb2R1bGUgPT09ICdBY3RpdmF0aW9uJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hBY3RpdmF0aW9uKG1ldGhvZCwgaW5wdXQpO1xuICAgIH1cblxuICAgIC8vIFNlYXJjaCBvcGVyYXRpb25zXG4gICAgaWYgKG1vZHVsZSA9PT0gJ1NlYXJjaCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoU2VhcmNoKG1ldGhvZCwgaW5wdXQpO1xuICAgIH1cblxuICAgIC8vIE5PVEU6IFVuaWZpZWRTZWFyY2ggb3BlcmF0aW9ucyAoSXNzdWUgIzI0MykgYXJlIG5vdyBzY2hlbWEtZHJpdmVuXG4gICAgLy8gdmlhIFNjaGVtYURpc3BhdGNoZXIgd2l0aCB0aGUgJ3NlYXJjaFBhcmFtcycgbm9ybWFsaXplci5cbiAgICAvLyBTZWUgUE9SVEZPTElPX09QRVJBVElPTlMuc2VhcmNoIGluIE9wZXJhdGlvblNjaGVtYS50c1xuXG4gICAgLy8gSW50cm9zcGVjdGlvbiBvcGVyYXRpb25zXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0ludHJvc3BlY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEludHJvc3BlY3Rpb24obWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3Rpb24gb3BlcmF0aW9ucyAoSXNzdWUgIzI0MSlcbiAgICBpZiAobW9kdWxlID09PSAnQ29sbGVjdGlvbicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoQ29sbGVjdGlvbihtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gUG9ydGZvbGlvIG9wZXJhdGlvbnMgKElzc3VlICMyNDEpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ1BvcnRmb2xpbycpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoUG9ydGZvbGlvKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBBdXRoIG9wZXJhdGlvbnMgKElzc3VlICMyNDEpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0F1dGgnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEF1dGgobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIENvbmZpZyBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdDb25maWcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaENvbmZpZyhtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gRW5oYW5jZWRJbmRleCBvcGVyYXRpb25zIChJc3N1ZSAjMjQxKVxuICAgIGlmIChtb2R1bGUgPT09ICdFbmhhbmNlZEluZGV4Jykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hFbmhhbmNlZEluZGV4KG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBQZXJzb25hIG9wZXJhdGlvbnMgKElzc3VlICMyNDEpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ1BlcnNvbmEnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaFBlcnNvbmEobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgb3BlcmF0aW9ucyAoSXNzdWUgIzI0NCAtIENSVURFKVxuICAgIGlmIChtb2R1bGUgPT09ICdFeGVjdXRlJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hFeGVjdXRlKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBHYXRla2VlcGVyIG9wZXJhdGlvbnMgKElzc3VlICM0NTIgLSBjb25maXJtYXRpb24gZmxvdylcbiAgICBpZiAobW9kdWxlID09PSAnR2F0ZWtlZXBlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLmRpc3BhdGNoR2F0ZWtlZXBlcihtZXRob2QsIHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgfVxuXG4gICAgLy8gTG9nZ2luZyBvcGVyYXRpb25zIChJc3N1ZSAjNTI4IC0gQ1JVREUgbWlncmF0aW9uKVxuICAgIGlmIChtb2R1bGUgPT09ICdMb2dnaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hMb2dnaW5nKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBNZXRyaWNzIG9wZXJhdGlvbnMgKENSVURFLXJvdXRlZCBxdWVyeV9tZXRyaWNzKVxuICAgIGlmIChtb2R1bGUgPT09ICdNZXRyaWNzJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2hNZXRyaWNzKG1ldGhvZCwgcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9XG5cbiAgICAvLyBCcm93c2VyIG9wZXJhdGlvbnMgKElzc3VlICM3NzQ6IG9wZW4gcG9ydGZvbGlvIGJyb3dzZXIpXG4gICAgaWYgKG1vZHVsZSA9PT0gJ0Jyb3dzZXInKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaEJyb3dzZXIobWV0aG9kLCBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBoYW5kbGVyIG1vZHVsZTogJHttb2R1bGV9YCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggRWxlbWVudENSVUQgb3BlcmF0aW9ucyB0byBFbGVtZW50Q1JVREhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hFbGVtZW50Q1JVRChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBpbnB1dDogT3BlcmF0aW9uSW5wdXRcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgeyBlbGVtZW50VHlwZSwgcGFyYW1zIH0gPSBpbnB1dDtcbiAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRDtcbiAgICBjb25zdCBwID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2NyZWF0ZSc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzI3ODogRm9yIGVuc2VtYmxlcywgbWVyZ2UgdG9wLWxldmVsIGVsZW1lbnRzIGludG8gbWV0YWRhdGFcbiAgICAgICAgLy8gTExNcyBvZnRlbiBwYXNzIGVsZW1lbnRzIGF0IHBhcmFtcyBsZXZlbCwgbm90IGluc2lkZSBtZXRhZGF0YVxuICAgICAgICBjb25zdCByZXNvbHZlZFR5cGUgPSBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZyk7XG4gICAgICAgIGxldCBtZXRhZGF0YSA9IHAubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGVuc2VtYmxlIHR5cGUgKGhhbmRsZXMgYm90aCBwbHVyYWwgY29uc3RhbnQgYW5kIHNpbmd1bGFyIGZvcm0pXG4gICAgICAgIGNvbnN0IGlzRW5zZW1ibGUgPSByZXNvbHZlZFR5cGUgPT09IEVsZW1lbnRUeXBlLkVOU0VNQkxFIHx8IHJlc29sdmVkVHlwZSA9PT0gJ2Vuc2VtYmxlJztcbiAgICAgICAgaWYgKGlzRW5zZW1ibGUpIHtcbiAgICAgICAgICAvLyBJc3N1ZSAjMzY1OiBSZWNvZ25pemUgY29tbW9uIHN5bm9ueW1zIGZvciAnZWxlbWVudHMnIChtZW1iZXJzLCBjb21wb25lbnRzLCBpdGVtcylcbiAgICAgICAgICBjb25zdCBzeW5vbnltcyA9IFsnbWVtYmVycycsICdjb21wb25lbnRzJywgJ2l0ZW1zJ10gYXMgY29uc3Q7XG4gICAgICAgICAgY29uc3QgZWxlbWVudHNTb3VyY2UgPSBwLmVsZW1lbnRzIHx8IHN5bm9ueW1zLnJlZHVjZTx1bmtub3duPihcbiAgICAgICAgICAgIChmb3VuZCwgc3luKSA9PiBmb3VuZCB8fCBwW3N5bl0sIHVuZGVmaW5lZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGVsZW1lbnRzU291cmNlICYmICghbWV0YWRhdGEgfHwgIW1ldGFkYXRhLmVsZW1lbnRzKSkge1xuICAgICAgICAgICAgbWV0YWRhdGEgPSB7IC4uLm1ldGFkYXRhLCBlbGVtZW50czogZWxlbWVudHNTb3VyY2UgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNjAyOiAnaW5zdHJ1Y3Rpb25zJyBpcyBubyBsb25nZXIgYW4gQVBJIGZpZWxkLiBVc2UgJ2NvbnRlbnQnIGZvciBhbGwgdHlwZXMuXG4gICAgICAgIC8vIElmIGFuIExMTSBzZW5kcyAnaW5zdHJ1Y3Rpb25zJywgcGFzcyBpdCB0aHJvdWdoIHNvIGNyZWF0ZUVsZW1lbnQgY2FuIHJlamVjdCB3aXRoIGd1aWRhbmNlLlxuICAgICAgICByZXR1cm4gaGFuZGxlci5jcmVhdGVFbGVtZW50KHtcbiAgICAgICAgICBuYW1lOiBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIHR5cGU6IHJlc29sdmVkVHlwZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcC5kZXNjcmlwdGlvbiBhcyBzdHJpbmcsXG4gICAgICAgICAgY29udGVudDogcC5jb250ZW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IHAuaW5zdHJ1Y3Rpb25zIGFzIHN0cmluZyB8IHVuZGVmaW5lZCwgIC8vIFJlamVjdGVkIHdpdGggZ3VpZGFuY2UgaW4gY3JlYXRlRWxlbWVudFxuICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmxpc3RFbGVtZW50cyhcbiAgICAgICAgICBlbGVtZW50VHlwZSB8fCAocC50eXBlIGFzIHN0cmluZyksXG4gICAgICAgICAgcCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICApO1xuXG4gICAgICBjYXNlICdnZXQnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRFbGVtZW50RGV0YWlscyhcbiAgICAgICAgICBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKVxuICAgICAgICApO1xuXG4gICAgICAvLyBJc3N1ZSAjNzM4OiBDdXJyZW50bHkgc2hhcmVzIGNvZGUgcGF0aCB3aXRoICdnZXQnLiBGdXR1cmUgZGl2ZXJnZW5jZSBwb2ludCDigJRcbiAgICAgIC8vICdnZXREZXRhaWxzJyB3aWxsIHJldHVybiBleHRlbmRlZCBtZXRhZGF0YSAocmVsYXRpb25zaGlwIGdyYXBoLCBzdGFjayBtZW1iZXJzaGlwLFxuICAgICAgLy8gcG9saWN5IHJlc29sdXRpb24sIGFjdGl2YXRpb24gc3RhdGUsIHJldmVyc2UgZGVwZW5kZW5jaWVzKS5cbiAgICAgIGNhc2UgJ2dldERldGFpbHMnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRFbGVtZW50RGV0YWlscyhcbiAgICAgICAgICBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKVxuICAgICAgICApO1xuXG4gICAgICBjYXNlICdlZGl0JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZWRpdEVsZW1lbnQoe1xuICAgICAgICAgIG5hbWU6IHAubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGlucHV0OiBwLmlucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAndmFsaWRhdGUnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci52YWxpZGF0ZUVsZW1lbnQoe1xuICAgICAgICAgIG5hbWU6IHAubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIHN0cmljdDogcC5zdHJpY3QgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmRlbGV0ZUVsZW1lbnQoe1xuICAgICAgICAgIG5hbWU6IHAubmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgdHlwZTogZWxlbWVudFR5cGUgfHwgKHAudHlwZSBhcyBzdHJpbmcpLFxuICAgICAgICAgIGRlbGV0ZURhdGE6IHAuZGVsZXRlRGF0YSBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnaW1wb3J0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW1wb3J0RWxlbWVudChwKTtcblxuICAgICAgY2FzZSAnZXhwb3J0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXhwb3J0RWxlbWVudChcbiAgICAgICAgICBwLm5hbWUgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlIHx8IChwLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICAgICAocC5mb3JtYXQgYXMgJ2pzb24nIHwgJ3lhbWwnKSB8fCAnanNvbidcbiAgICAgICAgKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEVsZW1lbnRDUlVEIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBlbGVtZW50IGltcG9ydCBvcGVyYXRpb24uXG4gICAqIFBhcnNlcyBleHBvcnQgcGFja2FnZSwgZGVzZXJpYWxpemVzIGVsZW1lbnQgZGF0YSwgYW5kIGNyZWF0ZXMgdGhlIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBPcGVyYXRpb24gcGFyYW1ldGVycyBjb250YWluaW5nIGRhdGEgYW5kIG9wdGlvbmFsIG92ZXJ3cml0ZSBmbGFnXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGNyZWF0ZWQgZWxlbWVudFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGV4cG9ydCBwYWNrYWdlIGlzIGludmFsaWQgb3IgZWxlbWVudCBhbHJlYWR5IGV4aXN0cyAod2hlbiBvdmVyd3JpdGUgaXMgZmFsc2UpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGhhbmRsZUltcG9ydEVsZW1lbnQocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVEO1xuXG4gICAgLy8gUGFyc2UgZXhwb3J0IHBhY2thZ2UgKGNhbiBiZSBzdHJpbmcgb3IgYWxyZWFkeS1wYXJzZWQgb2JqZWN0KVxuICAgIGxldCBleHBvcnRQYWNrYWdlOiBFeHBvcnRQYWNrYWdlO1xuICAgIGlmICh0eXBlb2YgcGFyYW1zLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBleHBvcnRQYWNrYWdlID0gSlNPTi5wYXJzZShwYXJhbXMuZGF0YSkgYXMgRXhwb3J0UGFja2FnZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBleHBvcnQgcGFja2FnZTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW1zLmRhdGEgPT09ICdvYmplY3QnICYmIHBhcmFtcy5kYXRhICE9PSBudWxsKSB7XG4gICAgICBleHBvcnRQYWNrYWdlID0gcGFyYW1zLmRhdGEgYXMgRXhwb3J0UGFja2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGV4cG9ydCBwYWNrYWdlOiBkYXRhIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nIG9yIG9iamVjdCcpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGV4cG9ydCBwYWNrYWdlIHN0cnVjdHVyZSB3aXRoIGRldGFpbGVkIG1pc3NpbmcgZmllbGQgcmVwb3J0aW5nXG4gICAgY29uc3QgcmVxdWlyZWRGaWVsZHMgPSBbJ2V4cG9ydFZlcnNpb24nLCAnZWxlbWVudFR5cGUnLCAnZm9ybWF0JywgJ2RhdGEnXSBhcyBjb25zdDtcbiAgICBjb25zdCBtaXNzaW5nRmllbGRzID0gcmVxdWlyZWRGaWVsZHMuZmlsdGVyKFxuICAgICAgKGZpZWxkKSA9PiAhZXhwb3J0UGFja2FnZVtmaWVsZCBhcyBrZXlvZiBFeHBvcnRQYWNrYWdlXVxuICAgICk7XG4gICAgaWYgKG1pc3NpbmdGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGV4cG9ydCBwYWNrYWdlOiBtaXNzaW5nIGZpZWxkczogJHttaXNzaW5nRmllbGRzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgLy8gRGVzZXJpYWxpemUgZWxlbWVudCBkYXRhIGJhc2VkIG9uIGZvcm1hdFxuICAgIGxldCBlbGVtZW50RGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgdHJ5IHtcbiAgICAgIGlmIChleHBvcnRQYWNrYWdlLmZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIGVsZW1lbnREYXRhID0gSlNPTi5wYXJzZShleHBvcnRQYWNrYWdlLmRhdGEpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfSBlbHNlIGlmIChleHBvcnRQYWNrYWdlLmZvcm1hdCA9PT0gJ3lhbWwnKSB7XG4gICAgICAgIC8vIFNFQ1VSSVRZOiBVc2UgSlNPTl9TQ0hFTUEgZm9yIHB1cmUgWUFNTCBwYXJzaW5nIChwcmV2ZW50cyBjb2RlIGV4ZWN1dGlvbilcbiAgICAgICAgLy8gSlNPTl9TQ0hFTUEgPSBGQUlMU0FGRSArIGJvb2wvaW50L2Zsb2F0L251bGwgKHNhZmVyIHRoYW4gREVGQVVMVCB3aGljaCBhZGRzIHRpbWVzdGFtcHMpXG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwubG9hZChleHBvcnRQYWNrYWdlLmRhdGEsIHsgc2NoZW1hOiB5YW1sLkpTT05fU0NIRU1BIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHBhcnNlZCAhPT0gJ29iamVjdCcgfHwgcGFyc2VkID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFlBTUwgZGF0YTogZXhwZWN0ZWQgb2JqZWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudERhdGEgPSBwYXJzZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGZvcm1hdDogJHtleHBvcnRQYWNrYWdlLmZvcm1hdH1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgZWxlbWVudCBkYXRhOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IGVsZW1lbnQgZmllbGRzXG4gICAgY29uc3QgbmFtZSA9IGVsZW1lbnREYXRhLm5hbWUgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZWxlbWVudERhdGEuZGVzY3JpcHRpb24gYXMgc3RyaW5nO1xuICAgIGNvbnN0IGNvbnRlbnQgPSBlbGVtZW50RGF0YS5jb250ZW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGVsZW1lbnREYXRhLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFuYW1lIHx8ICFkZXNjcmlwdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQgZGF0YTogbWlzc2luZyByZXF1aXJlZCBmaWVsZHMgKG5hbWUsIGRlc2NyaXB0aW9uKScpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIG92ZXJ3cml0ZSBpcyBhbGxvd2VkXG4gICAgY29uc3Qgb3ZlcndyaXRlID0gcGFyYW1zLm92ZXJ3cml0ZSA9PT0gdHJ1ZTtcblxuICAgIC8vIElmIG5vdCBvdmVyd3JpdGluZywgY2hlY2sgaWYgZWxlbWVudCBleGlzdHNcbiAgICBpZiAoIW92ZXJ3cml0ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaGFuZGxlci5nZXRFbGVtZW50RGV0YWlscyhuYW1lLCBleHBvcnRQYWNrYWdlLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgLy8gSWYgd2UgcmVhY2ggaGVyZSwgZWxlbWVudCBleGlzdHNcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGFscmVhZHkgZXhpc3RzOiAke25hbWV9LiBVc2Ugb3ZlcndyaXRlOnRydWUgdG8gcmVwbGFjZSBpdC5gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEVsZW1lbnQgZG9lc24ndCBleGlzdCwgb3IgZXJyb3IgZ2V0dGluZyBkZXRhaWxzIC0gcHJvY2VlZCB3aXRoIGNyZWF0aW9uXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ2FscmVhZHkgZXhpc3RzJykpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjsgLy8gUmUtdGhyb3cgb3VyIG93biBcImFscmVhZHkgZXhpc3RzXCIgZXJyb3JcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIGVsZW1lbnQgZG9lc24ndCBleGlzdCAtIGNvbnRpbnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBlbGVtZW50ICh3aWxsIG92ZXJ3cml0ZSBpZiBpdCBleGlzdHMpXG4gICAgcmV0dXJuIGhhbmRsZXIuY3JlYXRlRWxlbWVudCh7XG4gICAgICBuYW1lLFxuICAgICAgdHlwZTogZXhwb3J0UGFja2FnZS5lbGVtZW50VHlwZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgY29udGVudCxcbiAgICAgIG1ldGFkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cG9ydCBhbiBlbGVtZW50IHRvIEpTT04gb3IgWUFNTCBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBFbGVtZW50IG5hbWUgdG8gZXhwb3J0XG4gICAqIEBwYXJhbSB0eXBlIC0gRWxlbWVudCB0eXBlIChwZXJzb25hLCBza2lsbCwgdGVtcGxhdGUsIGFnZW50LCBtZW1vcnksIGVuc2VtYmxlKVxuICAgKiBAcGFyYW0gZm9ybWF0IC0gRXhwb3J0IGZvcm1hdDogJ2pzb24nIG9yICd5YW1sJyAoZGVmYXVsdDogJ2pzb24nKVxuICAgKiBAcmV0dXJucyBFeHBvcnRQYWNrYWdlIHdpdGggc2VyaWFsaXplZCBlbGVtZW50IGRhdGFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRXhwb3J0RWxlbWVudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGZvcm1hdDogJ2pzb24nIHwgJ3lhbWwnID0gJ2pzb24nXG4gICk6IFByb21pc2U8RXhwb3J0UGFja2FnZT4ge1xuICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwb3J0IG9wZXJhdGlvbiByZXF1aXJlcyBuYW1lIHBhcmFtZXRlcicpO1xuICAgIH1cbiAgICBpZiAoIXR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwb3J0IG9wZXJhdGlvbiByZXF1aXJlcyB0eXBlIHBhcmFtZXRlciAodmlhIGVsZW1lbnRUeXBlIG9yIHBhcmFtcy50eXBlKScpO1xuICAgIH1cblxuICAgIC8vIEdldCBlbGVtZW50IGRldGFpbHMgdXNpbmcgZXhpc3RpbmcgaGFuZGxlclxuICAgIGNvbnN0IGVsZW1lbnREZXRhaWxzID0gYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRFbGVtZW50RGV0YWlscyhuYW1lLCB0eXBlKTtcblxuICAgIC8vIEJ1aWxkIGV4cG9ydCBwYWNrYWdlXG4gICAgY29uc3QgZXhwb3J0UGFja2FnZTogRXhwb3J0UGFja2FnZSA9IHtcbiAgICAgIGV4cG9ydFZlcnNpb246ICcxLjAnLFxuICAgICAgZXhwb3J0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZWxlbWVudFR5cGU6IHR5cGUsXG4gICAgICBlbGVtZW50TmFtZTogbmFtZSxcbiAgICAgIGZvcm1hdCxcbiAgICAgIGRhdGE6ICcnLFxuICAgIH07XG5cbiAgICAvLyBTZXJpYWxpemUgdG8gcmVxdWVzdGVkIGZvcm1hdFxuICAgIGlmIChmb3JtYXQgPT09ICd5YW1sJykge1xuICAgICAgZXhwb3J0UGFja2FnZS5kYXRhID0geWFtbC5kdW1wKGVsZW1lbnREZXRhaWxzLCB7XG4gICAgICAgIGluZGVudDogMixcbiAgICAgICAgbGluZVdpZHRoOiAxMjAsXG4gICAgICAgIG5vUmVmczogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHBvcnRQYWNrYWdlLmRhdGEgPSBKU09OLnN0cmluZ2lmeShlbGVtZW50RGV0YWlscywgbnVsbCwgMik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cG9ydFBhY2thZ2U7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggTWVtb3J5IG9wZXJhdGlvbnMgdG8gTWVtb3J5TWFuYWdlclxuICAgKlxuICAgKiBNZW1vcnkgb3BlcmF0aW9ucyB3b3JrIG9uIGluZGl2aWR1YWwgTWVtb3J5IGluc3RhbmNlczpcbiAgICogMS4gR2V0IHRoZSBNZW1vcnkgYnkgbmFtZSBmcm9tIE1lbW9yeU1hbmFnZXJcbiAgICogMi4gQ2FsbCB0aGUgb3BlcmF0aW9uIG9uIHRoZSBNZW1vcnkgaW5zdGFuY2VcbiAgICovXG5cbiAgLyoqXG4gICAqIElzc3VlICM2NTY6IERlYm91bmNlIG1lbW9yeSBzYXZlcyB0byBwcmV2ZW50IGZpbGUgZGVzY3JpcHRvciBleGhhdXN0aW9uLlxuICAgKiBDb2FsZXNjZXMgcmFwaWQgYWRkRW50cnkgY2FsbHMg4oCUIG9ubHkgd3JpdGVzIHRoZSBsYXRlc3Qgc3RhdGUgYWZ0ZXIgdGhlIHdpbmRvdyBleHBpcmVzLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWJvdW5jZWRNZW1vcnlTYXZlKFxuICAgIG1lbW9yeU5hbWU6IHN0cmluZyxcbiAgICBtZW1vcnk6IGltcG9ydCgnLi4vLi4vZWxlbWVudHMvbWVtb3JpZXMvTWVtb3J5LmpzJykuTWVtb3J5LFxuICAgIG1hbmFnZXI6IE1lbW9yeU1hbmFnZXIsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9IG1lbW9yeU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMucGVuZGluZ1NhdmVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgY2xlYXJUaW1lb3V0KGV4aXN0aW5nLnRpbWVyKTtcbiAgICAgIHRoaXMuZGVib3VuY2VNZXRyaWNzLmNvYWxlc2NlZCsrO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbTUNQQVFMSGFuZGxlcl0gQ29hbGVzY2VkIHNhdmUgZm9yIG1lbW9yeSAnJHttZW1vcnlOYW1lfScgKHBlbmRpbmc6ICR7dGhpcy5wZW5kaW5nU2F2ZXMuc2l6ZX0sIGNvYWxlc2NlZDogJHt0aGlzLmRlYm91bmNlTWV0cmljcy5jb2FsZXNjZWR9LCB3cml0dGVuOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLndyaXR0ZW59KWApO1xuICAgIH1cbiAgICBjb25zdCBkZWJvdW5jZU1zID0gU1RPUkFHRV9MQVlFUl9DT05GSUcuTUVNT1JZX1NBVkVfREVCT1VOQ0VfTVM7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ1NhdmVzLmRlbGV0ZShrZXkpO1xuICAgICAgdGhpcy5kZWJvdW5jZU1ldHJpY3Mud3JpdHRlbisrO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbTUNQQVFMSGFuZGxlcl0gRmx1c2hpbmcgZGVib3VuY2VkIHNhdmUgZm9yIG1lbW9yeSAnJHttZW1vcnlOYW1lfScgKGNvYWxlc2NlZDogJHt0aGlzLmRlYm91bmNlTWV0cmljcy5jb2FsZXNjZWR9LCB3cml0dGVuOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLndyaXR0ZW59KWApO1xuICAgICAgbWFuYWdlci5zYXZlKG1lbW9yeSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYFtNQ1BBUUxIYW5kbGVyXSBEZWJvdW5jZWQgc2F2ZSBmYWlsZWQgZm9yIG1lbW9yeSAnJHttZW1vcnlOYW1lfScgKHBlbmRpbmc6ICR7dGhpcy5wZW5kaW5nU2F2ZXMuc2l6ZX0sIGNvYWxlc2NlZDogJHt0aGlzLmRlYm91bmNlTWV0cmljcy5jb2FsZXNjZWR9LCB3cml0dGVuOiAke3RoaXMuZGVib3VuY2VNZXRyaWNzLndyaXR0ZW59KTogJHtlcnJ9YCk7XG4gICAgICB9KTtcbiAgICB9LCBkZWJvdW5jZU1zKTtcbiAgICAvLyBFbnN1cmUgdGltZXIgZG9lc24ndCBrZWVwIE5vZGUgcHJvY2VzcyBhbGl2ZSAoaW1wb3J0YW50IGZvciB0ZXN0cy9zaHV0ZG93bilcbiAgICBpZiAodHlwZW9mIHRpbWVyID09PSAnb2JqZWN0JyAmJiAndW5yZWYnIGluIHRpbWVyKSB7XG4gICAgICB0aW1lci51bnJlZigpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdTYXZlcy5zZXQoa2V5LCB7IHRpbWVyLCBtZW1vcnksIG1hbmFnZXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY1NzogVHJhY2sgYWRkRW50cnkgY2FsbCBmcmVxdWVuY3kgcGVyIG1lbW9yeSBhbmQgbG9nIHdhcm5pbmdzIGF0IHRocmVzaG9sZHMuXG4gICAqXG4gICAqIFVzZXMgYSBzbGlkaW5nIHdpbmRvdyBjb3VudGVyIHRvIGRldGVjdCBydW5hd2F5IHNhdmUgbG9vcHMgYmVmb3JlIHRoZXkgZXhoYXVzdCByZXNvdXJjZXMuXG4gICAqIENvdW50ZXJzIGFyZSBib3VuZGVkOiBtYXggNTAwIHRyYWNrZWQgbWVtb3JpZXMsIG9sZGVzdC1maXJzdCBldmljdGlvbiB3aGVuIGV4Y2VlZGVkLlxuICAgKiBXYXJuaW5nL2NyaXRpY2FsIGZsYWdzIGF1dG8tcmVzZXQgd2hlbiBmcmVxdWVuY3kgZHJvcHMgYmVsb3cgdGhyZXNob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIG1lbW9yeU5hbWUgLSBOYW1lIG9mIHRoZSBtZW1vcnkgYmVpbmcgd3JpdHRlbiB0b1xuICAgKi9cbiAgcHJpdmF0ZSB0cmFja1NhdmVGcmVxdWVuY3kobWVtb3J5TmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gbWVtb3J5TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd2luZG93TXMgPSBTVE9SQUdFX0xBWUVSX0NPTkZJRy5NRU1PUllfU0FWRV9NT05JVE9SX1dJTkRPV19NUztcbiAgICBjb25zdCB3YXJuVGhyZXNob2xkID0gU1RPUkFHRV9MQVlFUl9DT05GSUcuTUVNT1JZX1NBVkVfRlJFUVVFTkNZX1dBUk5fVEhSRVNIT0xEO1xuICAgIGNvbnN0IGNyaXRpY2FsVGhyZXNob2xkID0gU1RPUkFHRV9MQVlFUl9DT05GSUcuTUVNT1JZX1NBVkVfRlJFUVVFTkNZX0NSSVRJQ0FMX1RIUkVTSE9MRDtcblxuICAgIGxldCBjb3VudGVyID0gdGhpcy5zYXZlRnJlcXVlbmN5Q291bnRlcnMuZ2V0KGtleSk7XG4gICAgaWYgKCFjb3VudGVyKSB7XG4gICAgICAvLyBFdmljdCBvbGRlc3QgZW50cnkgaWYgbWFwIGV4Y2VlZHMgc2l6ZSBsaW1pdCAocHJldmVudHMgdW5ib3VuZGVkIGdyb3d0aClcbiAgICAgIGlmICh0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5zaXplID49IDUwMCkge1xuICAgICAgICBjb25zdCBvbGRlc3RLZXkgPSB0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgICBpZiAob2xkZXN0S2V5KSB0aGlzLnNhdmVGcmVxdWVuY3lDb3VudGVycy5kZWxldGUob2xkZXN0S2V5KTtcbiAgICAgIH1cbiAgICAgIGNvdW50ZXIgPSB7IHRpbWVzdGFtcHM6IFtdLCB3YXJuZWQ6IGZhbHNlLCBjcml0aWNhbDogZmFsc2UgfTtcbiAgICAgIHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLnNldChrZXksIGNvdW50ZXIpO1xuICAgIH1cblxuICAgIC8vIFBydW5lIHRpbWVzdGFtcHMgb3V0c2lkZSB0aGUgd2luZG93XG4gICAgY29uc3QgY3V0b2ZmID0gbm93IC0gd2luZG93TXM7XG4gICAgY291bnRlci50aW1lc3RhbXBzID0gY291bnRlci50aW1lc3RhbXBzLmZpbHRlcih0ID0+IHQgPiBjdXRvZmYpO1xuICAgIGNvdW50ZXIudGltZXN0YW1wcy5wdXNoKG5vdyk7XG5cbiAgICBjb25zdCBjb3VudCA9IGNvdW50ZXIudGltZXN0YW1wcy5sZW5ndGg7XG5cbiAgICBpZiAoY291bnQgPj0gY3JpdGljYWxUaHJlc2hvbGQgJiYgIWNvdW50ZXIuY3JpdGljYWwpIHtcbiAgICAgIGNvdW50ZXIuY3JpdGljYWwgPSB0cnVlO1xuICAgICAgbG9nZ2VyLmVycm9yKCdbTUNQQVFMSGFuZGxlcl0gU2F2ZSBmcmVxdWVuY3kgY3JpdGljYWwgdGhyZXNob2xkIGV4Y2VlZGVkJywge1xuICAgICAgICBtZW1vcnlOYW1lLFxuICAgICAgICBjb3VudCxcbiAgICAgICAgdGhyZXNob2xkOiBjcml0aWNhbFRocmVzaG9sZCxcbiAgICAgICAgd2luZG93U2Vjb25kczogd2luZG93TXMgLyAxMDAwLFxuICAgICAgICB0cmFja2VkTWVtb3JpZXM6IHRoaXMuc2F2ZUZyZXF1ZW5jeUNvdW50ZXJzLnNpemUsXG4gICAgICB9KTtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLnRyYWNrU2F2ZUZyZXF1ZW5jeScsXG4gICAgICAgIGRldGFpbHM6IGBNZW1vcnkgJyR7bWVtb3J5TmFtZX0nIGV4Y2VlZHMgY3JpdGljYWwgc2F2ZSBmcmVxdWVuY3k6ICR7Y291bnR9IGNhbGxzIGluICR7d2luZG93TXMgLyAxMDAwfXNgLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBtZW1vcnlOYW1lLCBjb3VudCwgdGhyZXNob2xkOiBjcml0aWNhbFRocmVzaG9sZCwgd2luZG93TXMgfSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoY291bnQgPj0gd2FyblRocmVzaG9sZCAmJiAhY291bnRlci53YXJuZWQpIHtcbiAgICAgIGNvdW50ZXIud2FybmVkID0gdHJ1ZTtcbiAgICAgIGxvZ2dlci53YXJuKCdbTUNQQVFMSGFuZGxlcl0gU2F2ZSBmcmVxdWVuY3kgd2FybiB0aHJlc2hvbGQgZXhjZWVkZWQnLCB7XG4gICAgICAgIG1lbW9yeU5hbWUsXG4gICAgICAgIGNvdW50LFxuICAgICAgICB0aHJlc2hvbGQ6IHdhcm5UaHJlc2hvbGQsXG4gICAgICAgIHdpbmRvd1NlY29uZHM6IHdpbmRvd01zIC8gMTAwMCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHdhcm5pbmcgZmxhZ3Mgd2hlbiBjb3VudCBkcm9wcyBiYWNrIGJlbG93IHRocmVzaG9sZHNcbiAgICBpZiAoY291bnQgPCB3YXJuVGhyZXNob2xkKSB7XG4gICAgICBjb3VudGVyLndhcm5lZCA9IGZhbHNlO1xuICAgICAgY291bnRlci5jcml0aWNhbCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZSAjNjU2OiBGbHVzaCBhbGwgcGVuZGluZyBkZWJvdW5jZWQgc2F2ZXMgb24gc2h1dGRvd24uXG4gICAqIENhbGxlZCBieSBESSBjb250YWluZXIgZGlzcG9zZSBjaGFpbiB0byBlbnN1cmUgbm8gZGF0YSBpcyBsb3N0LlxuICAgKi9cbiAgYXN5bmMgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmZsdXNoUGVuZGluZ1NhdmVzKCk7XG4gIH1cblxuICAvKipcbiAgICogSXNzdWUgIzY1NjogRmx1c2ggYWxsIHBlbmRpbmcgZGVib3VuY2VkIHNhdmVzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgYXN5bmMgZmx1c2hQZW5kaW5nU2F2ZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZyA9IFsuLi50aGlzLnBlbmRpbmdTYXZlcy5lbnRyaWVzKCldO1xuICAgIHRoaXMucGVuZGluZ1NhdmVzLmNsZWFyKCk7XG4gICAgaWYgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgbG9nZ2VyLmluZm8oYFtNQ1BBUUxIYW5kbGVyXSBGbHVzaGluZyAke3BlbmRpbmcubGVuZ3RofSBwZW5kaW5nIG1lbW9yeSBzYXZlKHMpIG9uIHNodXRkb3duICh0b3RhbCBjb2FsZXNjZWQ6ICR7dGhpcy5kZWJvdW5jZU1ldHJpY3MuY29hbGVzY2VkfSwgdG90YWwgd3JpdHRlbjogJHt0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVufSlgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBba2V5LCB7IHRpbWVyLCBtZW1vcnksIG1hbmFnZXIgfV0gb2YgcGVuZGluZykge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IG1hbmFnZXIuc2F2ZShtZW1vcnkpO1xuICAgICAgICB0aGlzLmRlYm91bmNlTWV0cmljcy53cml0dGVuKys7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgZW50cnlDb3VudCA9IHR5cGVvZiBtZW1vcnkuZ2V0RW50cmllcyA9PT0gJ2Z1bmN0aW9uJyA/IG1lbW9yeS5nZXRFbnRyaWVzKCkuc2l6ZSA6ICd1bmtub3duJztcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbTUNQQVFMSGFuZGxlcl0gRmx1c2ggc2F2ZSBmYWlsZWQgZm9yIG1lbW9yeSAnJHtrZXl9JyAoZW50cmllczogJHtlbnRyeUNvdW50fSwgcGVuZGluZyByZW1haW5pbmc6ICR7cGVuZGluZy5sZW5ndGh9KTogJHtlcnJ9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaE1lbW9yeShcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmhhbmRsZXJzLm1lbW9yeU1hbmFnZXI7XG4gICAgLy8gSXNzdWUgIzI5MDogVXNlIGVsZW1lbnRfbmFtZSBwYXJhbWV0ZXJcbiAgICAvLyBJc3N1ZSAjMzIzOiBVc2Ugc2hhcmVkIHZhbGlkYXRpb24gdXRpbGl0eVxuICAgIGNvbnN0IG1lbW9yeU5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgcGFyYW1zLFxuICAgICAgJ2VsZW1lbnRfbmFtZScsXG4gICAgICAndGhlIG5hbWUgb2YgdGhlIG1lbW9yeSB0byBvcGVyYXRlIG9uJ1xuICAgICk7XG5cbiAgICAvLyBHZXQgdGhlIG1lbW9yeSBpbnN0YW5jZSBieSBuYW1lIHVzaW5nIGZpbmQoKVxuICAgIC8vIE1lbW9yeSBuYW1lIGlzIHN0b3JlZCBpbiBtZXRhZGF0YS5uYW1lXG4gICAgY29uc3QgbWVtb3J5ID0gYXdhaXQgbWFuYWdlci5maW5kKG0gPT4gbS5tZXRhZGF0YS5uYW1lID09PSBtZW1vcnlOYW1lKTtcbiAgICBpZiAoIW1lbW9yeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNZW1vcnkgJyR7bWVtb3J5TmFtZX0nIG5vdCBmb3VuZC4gVXNlIGxpc3RfZWxlbWVudHMgdG8gc2VlIGF2YWlsYWJsZSBtZW1vcmllcy5gKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnYWRkRW50cnknOiB7XG4gICAgICAgIC8vIEZpeCAjMzg3OiBBY2NlcHQgJ2VudHJ5JyBhcyBhbGlhcyBmb3IgJ2NvbnRlbnQnXG4gICAgICAgIGlmIChwYXJhbXMuZW50cnkgIT09IHVuZGVmaW5lZCAmJiBwYXJhbXMuY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcGFyYW1zLmNvbnRlbnQgPSBwYXJhbXMuZW50cnk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWVtb3J5LmFkZEVudHJ5KGNvbnRlbnQsIHRhZ3M/LCBtZXRhZGF0YT8pXG4gICAgICAgIC8vIEZpeCAjMzg3IE9wdGlvbiBEOiBDb250ZXh0dWFsIGVycm9yIG1lc3NhZ2UgZ3VpZGluZyB0b3dhcmQgY29ycmVjdCBwYXJhbWV0ZXJcbiAgICAgICAgaWYgKHBhcmFtcy5jb250ZW50ID09PSB1bmRlZmluZWQgfHwgcGFyYW1zLmNvbnRlbnQgPT09IG51bGwgfHwgdHlwZW9mIHBhcmFtcy5jb250ZW50ICE9PSAnc3RyaW5nJyB8fCAocGFyYW1zLmNvbnRlbnQgYXMgc3RyaW5nKS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgY29uc3QgaGludCA9IHBhcmFtcy5lbnRyeSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IGBZb3UgcGFzc2VkICdlbnRyeScsIGJ1dCBhbiBlbnRyeSBpcyB0aGUgZnVsbCBvYmplY3QgKGNvbnRlbnQgKyB0YWdzICsgbWV0YWRhdGEgKyB0aW1lc3RhbXApLiBgICtcbiAgICAgICAgICAgICAgYFVzZSAnY29udGVudCcgdG8gcHJvdmlkZSB0aGUgdGV4dCBwb3J0aW9uIG9mIHRoZSBlbnRyeS5gXG4gICAgICAgICAgICA6IGBUaGUgJ2NvbnRlbnQnIHBhcmFtZXRlciBpcyB0aGUgdGV4dCBwb3J0aW9uIG9mIHRoZSBtZW1vcnkgZW50cnkuYDtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NvbnRlbnQnLiAke2hpbnR9IGAgK1xuICAgICAgICAgICAgYEV4YW1wbGU6IHsgb3BlcmF0aW9uOiBcImFkZEVudHJ5XCIsIHBhcmFtczogeyBlbGVtZW50X25hbWU6IFwiJHttZW1vcnlOYW1lfVwiLCBjb250ZW50OiBcInlvdXIgdGV4dCBoZXJlXCIsIHRhZ3M6IFtcIm9wdGlvbmFsXCJdIH0gfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBwYXJhbXMuY29udGVudCBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSBwYXJhbXMudGFncyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJhbXMubWV0YWRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGVudHJ5UmVzdWx0ID0gbWVtb3J5LmFkZEVudHJ5KGNvbnRlbnQsIHRhZ3MsIG1ldGFkYXRhKTtcbiAgICAgICAgLy8gSXNzdWUgIzY1NzogVHJhY2sgc2F2ZSBmcmVxdWVuY3kgYW5kIGFsZXJ0IG9uIGFub21hbG91cyBwYXR0ZXJucy5cbiAgICAgICAgdGhpcy50cmFja1NhdmVGcmVxdWVuY3kobWVtb3J5TmFtZSk7XG4gICAgICAgIC8vIElzc3VlICM2NTY6IERlYm91bmNlIHNhdmVzIHRvIHByZXZlbnQgRkQgZXhoYXVzdGlvbiBmcm9tIHJhcGlkIGFkZEVudHJ5IGNhbGxzLlxuICAgICAgICAvLyBUaGUgZW50cnkgaXMgYWxyZWFkeSBpbiBtZW1vcnkg4oCUIGRpc2sgd3JpdGUgaXMgZGVmZXJyZWQgYW5kIGNvYWxlc2NlZC5cbiAgICAgICAgdGhpcy5kZWJvdW5jZWRNZW1vcnlTYXZlKG1lbW9yeU5hbWUsIG1lbW9yeSwgbWFuYWdlcik7XG4gICAgICAgIHJldHVybiBlbnRyeVJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnY2xlYXInOiB7XG4gICAgICAgIC8vIE1lbW9yeS5jbGVhckFsbChjb25maXJtKSAtIHJlcXVpcmVzIGV4cGxpY2l0IGNvbmZpcm1hdGlvblxuICAgICAgICBjb25zdCBjbGVhclJlc3VsdCA9IG1lbW9yeS5jbGVhckFsbCh0cnVlKTtcbiAgICAgICAgLy8gRml4ICM0Mzg6IFBlcnNpc3QgdG8gZGlzayBzbyBjbGVhcmVkIHN0YXRlIHN1cnZpdmVzIHJlc3RhcnRcbiAgICAgICAgYXdhaXQgbWFuYWdlci5zYXZlKG1lbW9yeSk7XG4gICAgICAgIHJldHVybiBjbGVhclJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIE1lbW9yeSBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBBZ2VudCBvcGVyYXRpb25zIHRvIEFnZW50TWFuYWdlclxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEFnZW50KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IHRoaXMuaGFuZGxlcnMuYWdlbnRNYW5hZ2VyO1xuICAgIC8vIElzc3VlICMyOTA6IFVzZSBlbGVtZW50X25hbWUgcGFyYW1ldGVyXG4gICAgLy8gSXNzdWUgIzMyMzogVmFsaWRhdGUgcGFyYW1ldGVyIGJlZm9yZSB1c2VcbiAgICBjb25zdCBhZ2VudE5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgcGFyYW1zLFxuICAgICAgJ2VsZW1lbnRfbmFtZScsXG4gICAgICAndGhlIG5hbWUgb2YgdGhlIGFnZW50IHRvIGV4ZWN1dGUnXG4gICAgKTtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdleGVjdXRlJzpcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZXhlY3V0ZUFnZW50KFxuICAgICAgICAgIGFnZW50TmFtZSxcbiAgICAgICAgICBwYXJhbXMucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICApO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQWdlbnQgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggVGVtcGxhdGUgb3BlcmF0aW9ucyB0byBUZW1wbGF0ZVJlbmRlcmVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoVGVtcGxhdGUoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCByZW5kZXJlciA9IHRoaXMuaGFuZGxlcnMudGVtcGxhdGVSZW5kZXJlcjtcbiAgICAvLyBJc3N1ZSAjMjkwOiBVc2UgZWxlbWVudF9uYW1lIHBhcmFtZXRlclxuICAgIC8vIElzc3VlICMzMjM6IFZhbGlkYXRlIHBhcmFtZXRlciBiZWZvcmUgdXNlXG4gICAgY29uc3QgdGVtcGxhdGVOYW1lID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgIHBhcmFtcyxcbiAgICAgICdlbGVtZW50X25hbWUnLFxuICAgICAgJ3RoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSB0byByZW5kZXInXG4gICAgKTtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdyZW5kZXInOlxuICAgICAgICByZXR1cm4gcmVuZGVyZXIucmVuZGVyKFxuICAgICAgICAgIHRlbXBsYXRlTmFtZSxcbiAgICAgICAgICBwYXJhbXMudmFyaWFibGVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgIHBhcmFtcy5zZWN0aW9uIGFzICd0ZW1wbGF0ZScgfCAnc3R5bGUnIHwgJ3NjcmlwdCcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1zLmFsbF9zZWN0aW9ucyBhcyBib29sZWFuIHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBUZW1wbGF0ZSBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBBY3RpdmF0aW9uIG9wZXJhdGlvbnMgKGNyb3NzLWN1dHRpbmcgY29uY2VybilcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hBY3RpdmF0aW9uKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIGlucHV0OiBPcGVyYXRpb25JbnB1dFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCB7IGVsZW1lbnRUeXBlLCBwYXJhbXMgfSA9IGlucHV0O1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVEO1xuICAgIGNvbnN0IHAgPSBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBJc3N1ZSAjMjkwOiBVc2UgZWxlbWVudF9uYW1lL2VsZW1lbnRfdHlwZSBwYXJhbWV0ZXIgbmFtZXNcbiAgICAvLyBJc3N1ZSAjMzIzOiBWYWxpZGF0ZSBwYXJhbWV0ZXJzIGJlZm9yZSB1c2VcbiAgICAvLyBGb3IgZ2V0QWN0aXZlLCBlbGVtZW50X25hbWUgaXMgbm90IHJlcXVpcmVkXG4gICAgaWYgKG1ldGhvZCAhPT0gJ2dldEFjdGl2ZScpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICBwLFxuICAgICAgICAnZWxlbWVudF9uYW1lJyxcbiAgICAgICAgJ3RoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGFjdGl2YXRlL2RlYWN0aXZhdGUnXG4gICAgICApO1xuXG4gICAgICAvLyBlbGVtZW50X3R5cGUgY2FuIGNvbWUgZnJvbSBpbnB1dC5lbGVtZW50VHlwZSBvciBwYXJhbXMuZWxlbWVudF90eXBlXG4gICAgICBjb25zdCB0eXBlID0gZWxlbWVudFR5cGUgfHwgKHAuZWxlbWVudF90eXBlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG4gICAgICBpZiAoIXR5cGUgfHwgdHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnIHx8IHR5cGUudHJpbSgpID09PSAnJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyICdlbGVtZW50X3R5cGUnLiBFeHBlY3RlZDogc3RyaW5nIChwZXJzb25hLCBza2lsbCwgdGVtcGxhdGUsIGFnZW50LCBtZW1vcnksIG9yIGVuc2VtYmxlKWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgICAgY2FzZSAnYWN0aXZhdGUnOlxuICAgICAgICAgIHJldHVybiBoYW5kbGVyLmFjdGl2YXRlRWxlbWVudChcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgcC5jb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkXG4gICAgICAgICAgKTtcblxuICAgICAgICBjYXNlICdkZWFjdGl2YXRlJzpcbiAgICAgICAgICByZXR1cm4gaGFuZGxlci5kZWFjdGl2YXRlRWxlbWVudChuYW1lLCB0eXBlKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBBY3RpdmF0aW9uIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0QWN0aXZlOiBlbGVtZW50X3R5cGUgaXMgb3B0aW9uYWwgLSBpZiBub3QgcHJvdmlkZWQsIHJldHVybnMgYWxsIGFjdGl2ZSBlbGVtZW50c1xuICAgIC8vIElzc3VlICM1MDE6IFBhc3MgdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQg4oCUIGdldEFjdGl2ZUVsZW1lbnRzIGhhbmRsZXMgYm90aCBjYXNlc1xuICAgIGNvbnN0IHR5cGUgPSBlbGVtZW50VHlwZSB8fCAocC5lbGVtZW50X3R5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gaGFuZGxlci5nZXRBY3RpdmVFbGVtZW50cyh0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBTZWFyY2ggb3BlcmF0aW9ucyB0byBFbGVtZW50UXVlcnlTZXJ2aWNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoU2VhcmNoKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIGlucHV0OiBPcGVyYXRpb25JbnB1dFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCB7IGVsZW1lbnRUeXBlLCBwYXJhbXMgfSA9IGlucHV0O1xuICAgIGNvbnN0IHF1ZXJ5U2VydmljZSA9IHRoaXMuaGFuZGxlcnMuZWxlbWVudFF1ZXJ5U2VydmljZTtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdzZWFyY2gnOlxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVTZWFyY2hFbGVtZW50cyhpbnB1dCk7XG5cbiAgICAgIGNhc2UgJ3F1ZXJ5Jzoge1xuICAgICAgICAvLyBWYWxpZGF0ZSBlbGVtZW50VHlwZSBpcyByZXF1aXJlZCBmb3IgcXVlcnlcbiAgICAgICAgaWYgKCFlbGVtZW50VHlwZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZWxlbWVudFR5cGUgaXMgcmVxdWlyZWQgZm9yIHF1ZXJ5X2VsZW1lbnRzIG9wZXJhdGlvbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHJhdyBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgKGNhc3QgdG8gSUVsZW1lbnRbXSBmb3IgcXVlcnkgc2VydmljZSlcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAoYXdhaXQgdGhpcy5oYW5kbGVycy5lbGVtZW50Q1JVRC5nZXRFbGVtZW50cyhlbGVtZW50VHlwZSkpIGFzIElFbGVtZW50W107XG5cbiAgICAgICAgLy8gQnVpbGQgUXVlcnlPcHRpb25zIGZyb20gcGFyYW1zXG4gICAgICAgIGNvbnN0IHAgPSBwYXJhbXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IHF1ZXJ5T3B0aW9uczoge1xuICAgICAgICAgIGZpbHRlcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICBzb3J0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgcGFnaW5hdGlvbj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGFnZ3JlZ2F0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9ID0ge307XG5cbiAgICAgICAgaWYgKHAuZmlsdGVycykge1xuICAgICAgICAgIHF1ZXJ5T3B0aW9ucy5maWx0ZXJzID0gcC5maWx0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLnNvcnQpIHtcbiAgICAgICAgICBxdWVyeU9wdGlvbnMuc29ydCA9IHAuc29ydCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC5wYWdpbmF0aW9uKSB7XG4gICAgICAgICAgcXVlcnlPcHRpb25zLnBhZ2luYXRpb24gPSBwLnBhZ2luYXRpb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYWdncmVnYXRpb24gcmVxdWVzdHMgKElzc3VlICMzMDkpIOKAlCBkZWxlZ2F0ZXMgdG8gc2hhcmVkIEFnZ3JlZ2F0aW9uU2VydmljZVxuICAgICAgICBpZiAocC5hZ2dyZWdhdGUpIHtcbiAgICAgICAgICBjb25zdCBhZ2dyZWdhdGUgPSBwLmFnZ3JlZ2F0ZSBhcyB7IGNvdW50PzogYm9vbGVhbjsgZ3JvdXBfYnk/OiBzdHJpbmcgfTtcblxuICAgICAgICAgIC8vIFZhbGlkYXRlIGFnZ3JlZ2F0aW9uIG9wdGlvbnNcbiAgICAgICAgICBjb25zdCBhZ2dFcnJvciA9IHZhbGlkYXRlQWdncmVnYXRpb25PcHRpb25zKGFnZ3JlZ2F0ZSk7XG4gICAgICAgICAgaWYgKGFnZ0Vycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYWdnRXJyb3IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBhZ2dyZWdhdGVFbGVtZW50cyhcbiAgICAgICAgICAgIGVsZW1lbnRzLFxuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICBhZ2dyZWdhdGUsXG4gICAgICAgICAgICBxdWVyeU9wdGlvbnMuZmlsdGVycyBhcyBhbnlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzUwMDogTm9ybWFsaXplIGZsYXQgcGFnaW5hdGlvbiBwYXJhbXMgKHBhZ2VTaXplLCBwYWdlLCBsaW1pdCwgb2Zmc2V0KVxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgZmxhdCBwYXJhbXMgbGlrZSB7IHBhZ2VTaXplOiA1IH0gd29yayB0aGUgc2FtZSBhcyB7IHBhZ2luYXRpb246IHsgcGFnZVNpemU6IDUgfSB9XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYWdpbmF0aW9uID0gbm9ybWFsaXplUGFnaW5hdGlvblBhcmFtcyhwKTtcbiAgICAgICAgcXVlcnlPcHRpb25zLnBhZ2luYXRpb24gPSBub3JtYWxpemVkUGFnaW5hdGlvbjtcblxuICAgICAgICAvLyBFeGVjdXRlIHF1ZXJ5IHdpdGggRWxlbWVudFF1ZXJ5U2VydmljZVxuICAgICAgICBjb25zdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5U2VydmljZS5xdWVyeShlbGVtZW50cywgcXVlcnlPcHRpb25zKTtcblxuICAgICAgICAvLyBSZXR1cm4gY29uY2lzZSBzdHJ1Y3R1cmVkIHJlc3BvbnNlIChJc3N1ZSAjMjk5KVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW1zOiBxdWVyeVJlc3VsdC5pdGVtcy5tYXAoKGl0ZW06IElFbGVtZW50KSA9PiAoe1xuICAgICAgICAgICAgbmFtZTogaXRlbS5tZXRhZGF0YT8ubmFtZSB8fCAnVW5rbm93bicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogaXRlbS5tZXRhZGF0YT8uZGVzY3JpcHRpb24gfHwgJycsXG4gICAgICAgICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgIHZlcnNpb246IGl0ZW0ubWV0YWRhdGE/LnZlcnNpb24gfHwgaXRlbS52ZXJzaW9uLFxuICAgICAgICAgICAgdGFnczogaXRlbS5tZXRhZGF0YT8udGFncyxcbiAgICAgICAgICB9KSksXG4gICAgICAgICAgcGFnaW5hdGlvbjogcXVlcnlSZXN1bHQucGFnaW5hdGlvbixcbiAgICAgICAgICBzb3J0aW5nOiBxdWVyeVJlc3VsdC5zb3J0aW5nLFxuICAgICAgICAgIGZpbHRlcnM6IHF1ZXJ5UmVzdWx0LmZpbHRlcnMuYXBwbGllZC5jb3VudCA+IDAgPyB7IGFwcGxpZWQ6IHF1ZXJ5UmVzdWx0LmZpbHRlcnMuYXBwbGllZCB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBTZWFyY2ggbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvLyBOT1RFOiBVbmlmaWVkIFNlYXJjaCBvcGVyYXRpb25zIChJc3N1ZSAjMjQzKSBhcmUgbm93IHNjaGVtYS1kcml2ZW4uXG4gIC8vIFRoZSAnc2VhcmNoJyBvcGVyYXRpb24gdXNlcyB0aGUgJ3NlYXJjaFBhcmFtcycgbm9ybWFsaXplciBpbiBPcGVyYXRpb25TY2hlbWEudHMuXG4gIC8vIFNlZTogU2VhcmNoUGFyYW1zTm9ybWFsaXplciBmb3Igc2NvcGUvcGFnaW5hdGlvbi9zb3J0L2ZpbHRlciB0cmFuc2Zvcm1hdGlvbi5cblxuICAvKipcbiAgICogRGlzcGF0Y2ggSW50cm9zcGVjdGlvbiBvcGVyYXRpb25zIHRvIEludHJvc3BlY3Rpb25SZXNvbHZlclxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaEludHJvc3BlY3Rpb24oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB1bmtub3duIHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAncmVzb2x2ZSc6XG4gICAgICAgIHJldHVybiBJbnRyb3NwZWN0aW9uUmVzb2x2ZXIucmVzb2x2ZShwYXJhbXMpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gSW50cm9zcGVjdGlvbiBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggZWxlbWVudHMgYWNyb3NzIG9uZSBvciBhbGwgZWxlbWVudCB0eXBlc1xuICAgKlxuICAgKiBJbXBsZW1lbnRzIHNpbXBsZSBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBtYXRjaGluZyBvbjpcbiAgICogLSBtZXRhZGF0YS5uYW1lXG4gICAqIC0gbWV0YWRhdGEuZGVzY3JpcHRpb25cbiAgICogLSBjb250ZW50IChpZiBhdmFpbGFibGUpXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIE9wZXJhdGlvbiBpbnB1dCB3aXRoIG9wdGlvbmFsIGVsZW1lbnRUeXBlIGFuZCBzZWFyY2ggcGFyYW1zXG4gICAqIEByZXR1cm5zIFNlYXJjaCByZXN1bHRzIHdpdGggbWF0Y2hlZCBlbGVtZW50cyBhbmQgcmVsZXZhbmNlIGluZm9cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlU2VhcmNoRWxlbWVudHMoaW5wdXQ6IE9wZXJhdGlvbklucHV0KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3Qgc2VhcmNoU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCBtZW1vcnlCZWZvcmUgPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCkuaGVhcFVzZWQ7XG4gICAgY29uc3QgeyBlbGVtZW50VHlwZSwgcGFyYW1zIH0gPSBpbnB1dDtcbiAgICBjb25zdCBwID0gcGFyYW1zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHF1ZXJ5ID0gKHAucXVlcnkgYXMgc3RyaW5nKT8udHJpbSgpO1xuXG4gICAgLy8gSXNzdWUgIzUwMDogTm9ybWFsaXplIGZsYXQgcGFnaW5hdGlvbiBwYXJhbXMgKHBhZ2VTaXplLCBwYWdlLCBsaW1pdCwgb2Zmc2V0KVxuICAgIGNvbnN0IHsgcGFnZSwgcGFnZVNpemUgfSA9IG5vcm1hbGl6ZVBhZ2luYXRpb25QYXJhbXMocCk7XG5cbiAgICAvLyBFeHRyYWN0IHNvcnQgcGFyYW1zXG4gICAgY29uc3Qgc29ydFBhcmFtID0gcC5zb3J0IGFzIHsgc29ydEJ5Pzogc3RyaW5nOyBzb3J0T3JkZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzb3J0QnkgPSBzb3J0UGFyYW0/LnNvcnRCeSA/PyAnbmFtZSc7XG4gICAgY29uc3Qgc29ydE9yZGVyID0gKHNvcnRQYXJhbT8uc29ydE9yZGVyID8/ICdhc2MnKSBhcyAnYXNjJyB8ICdkZXNjJztcblxuICAgIC8vIElucHV0IHZhbGlkYXRpb24gd2l0aCBsZW5ndGggbGltaXRcbiAgICBpZiAoIXF1ZXJ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlYXJjaCBxdWVyeSBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAocXVlcnkubGVuZ3RoID4gMTAwMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWFyY2ggcXVlcnkgbXVzdCBiZSB1bmRlciAxMDAwIGNoYXJhY3RlcnMnKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZWxlbWVudCB0eXBlcyB0byBzZWFyY2ggKElzc3VlICM0MzM6IGFjY2VwdCBzaW5ndWxhciBmb3JtcylcbiAgICBsZXQgZWxlbWVudFR5cGVzOiBzdHJpbmdbXTtcbiAgICBpZiAoZWxlbWVudFR5cGUpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVFbGVtZW50VHlwZShlbGVtZW50VHlwZSk7XG4gICAgICBpZiAoIW5vcm1hbGl6ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVsZW1lbnQgdHlwZSAnJHtlbGVtZW50VHlwZX0nLiBWYWxpZCB0eXBlczogJHtmb3JtYXRFbGVtZW50VHlwZXNMaXN0KCl9YCk7XG4gICAgICB9XG4gICAgICBlbGVtZW50VHlwZXMgPSBbbm9ybWFsaXplZF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRUeXBlcyA9IFsuLi5BTExfRUxFTUVOVF9UWVBFU107XG4gICAgfVxuXG4gICAgY29uc3QgYWxsUmVzdWx0czogQXJyYXk8e1xuICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAgIG1hdGNoZWRJbjogc3RyaW5nW107XG4gICAgfT4gPSBbXTtcblxuICAgIC8vIENvbGxlY3QgQUxMIG1hdGNoZXMgKG5vIGVhcmx5IHRlcm1pbmF0aW9uIOKAlCBwYWdpbmF0aW9uIGhhbmRsZXMgbGltaXRpbmcpXG4gICAgZm9yIChjb25zdCB0eXBlIG9mIGVsZW1lbnRUeXBlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmhhbmRsZXJzLmVsZW1lbnRDUlVELmdldEVsZW1lbnRzKHR5cGUpO1xuXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGVkSW46IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSAoZWxlbWVudC5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfHwge307XG5cbiAgICAgICAgICAvLyBDaGVjayBuYW1lIG1hdGNoXG4gICAgICAgICAgY29uc3QgbmFtZSA9IChtZXRhZGF0YS5uYW1lIGFzIHN0cmluZykgfHwgJyc7XG4gICAgICAgICAgaWYgKG5hbWUgJiYgaXNTZWFyY2hNYXRjaChxdWVyeSwgbmFtZSkpIHtcbiAgICAgICAgICAgIG1hdGNoZWRJbi5wdXNoKCduYW1lJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgZGVzY3JpcHRpb24gbWF0Y2hcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChtZXRhZGF0YS5kZXNjcmlwdGlvbiBhcyBzdHJpbmcpIHx8ICcnO1xuICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBpc1NlYXJjaE1hdGNoKHF1ZXJ5LCBkZXNjcmlwdGlvbikpIHtcbiAgICAgICAgICAgIG1hdGNoZWRJbi5wdXNoKCdkZXNjcmlwdGlvbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrIGNvbnRlbnQgbWF0Y2ggKGlmIGF2YWlsYWJsZSlcbiAgICAgICAgICBpZiAoZWxlbWVudC5jb250ZW50ICYmIHR5cGVvZiBlbGVtZW50LmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAoaXNTZWFyY2hNYXRjaChxdWVyeSwgZWxlbWVudC5jb250ZW50IGFzIHN0cmluZykpIHtcbiAgICAgICAgICAgICAgbWF0Y2hlZEluLnB1c2goJ2NvbnRlbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBhbnkgbWF0Y2hlcyBmb3VuZCwgYWRkIHRvIHJlc3VsdHNcbiAgICAgICAgICAvLyBVc2UgJ25hbWUnIGhlcmUg4oCUIEZJRUxEX1RSQU5TRk9STVMgd2lsbCByZW5hbWUgdG8gJ2VsZW1lbnRfbmFtZScgaW4gYXBwbHlGaWVsZFNlbGVjdGlvblxuICAgICAgICAgIGlmIChtYXRjaGVkSW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWxsUmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIG1hdGNoZWRJbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gU2tpcCBlbGVtZW50IHR5cGVzIHRoYXQgZmFpbCB0byBsb2FkXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmFpbGVkIHRvIGxvYWQgZWxlbWVudHMgZm9yIHNlYXJjaDogJHt0eXBlfWAsIHsgZXJyb3IgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjb3JkIHNlYXJjaCBtZXRyaWNzIHZpYSBQZXJmb3JtYW5jZU1vbml0b3JcbiAgICB0aGlzLmhhbmRsZXJzLnBlcmZvcm1hbmNlTW9uaXRvcj8ucmVjb3JkU2VhcmNoKHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgZHVyYXRpb246IHBlcmZvcm1hbmNlLm5vdygpIC0gc2VhcmNoU3RhcnQsXG4gICAgICByZXN1bHRDb3VudDogYWxsUmVzdWx0cy5sZW5ndGgsXG4gICAgICBzb3VyY2VzOiBlbGVtZW50VHlwZXMsXG4gICAgICBjYWNoZUhpdDogZmFsc2UsXG4gICAgICBtZW1vcnlCZWZvcmUsXG4gICAgICBtZW1vcnlBZnRlcjogcHJvY2Vzcy5tZW1vcnlVc2FnZSgpLmhlYXBVc2VkLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgIH0pO1xuXG4gICAgLy8gU29ydCByZXN1bHRzIChjdXJyZW50bHkgb25seSAnbmFtZScgaXMgc3VwcG9ydGVkIGFzIGEgc29ydCBmaWVsZClcbiAgICBjb25zdCBzb3J0ZWRSZXN1bHRzID0gWy4uLmFsbFJlc3VsdHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGNtcCA9IGEubmFtZS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi5uYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgcmV0dXJuIHNvcnRPcmRlciA9PT0gJ2Rlc2MnID8gLWNtcCA6IGNtcDtcbiAgICB9KTtcblxuICAgIC8vIFBhZ2luYXRlIHZpYSBQYWdpbmF0aW9uU2VydmljZVxuICAgIGNvbnN0IHBhZ2luYXRvciA9IG5ldyBQYWdpbmF0aW9uU2VydmljZSgpO1xuICAgIGNvbnN0IHBhZ2luYXRlZCA9IHBhZ2luYXRvci5wYWdpbmF0ZShzb3J0ZWRSZXN1bHRzLCB7IHBhZ2UsIHBhZ2VTaXplIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW1zOiBwYWdpbmF0ZWQuaXRlbXMsXG4gICAgICBwYWdpbmF0aW9uOiBwYWdpbmF0ZWQucGFnaW5hdGlvbixcbiAgICAgIHNvcnRpbmc6IHsgc29ydEJ5LCBzb3J0T3JkZXIgfSxcbiAgICAgIHF1ZXJ5LFxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1DUC1BUUwgRXh0ZW5zaW9uIERpc3BhdGNoIE1ldGhvZHMgKElzc3VlICMyNDEpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQ29sbGVjdGlvbiBvcGVyYXRpb25zIHRvIENvbGxlY3Rpb25IYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQ29sbGVjdGlvbihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmNvbGxlY3Rpb25IYW5kbGVyO1xuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2xsZWN0aW9uIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogQ29sbGVjdGlvbkhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnYnJvd3NlJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuYnJvd3NlQ29sbGVjdGlvbihcbiAgICAgICAgICBwYXJhbXMuc2VjdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1zLnR5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG5cbiAgICAgIGNhc2UgJ3NlYXJjaCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnNlYXJjaENvbGxlY3Rpb24ocGFyYW1zLnF1ZXJ5IGFzIHN0cmluZyk7XG5cbiAgICAgIGNhc2UgJ3NlYXJjaEVuaGFuY2VkJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VhcmNoQ29sbGVjdGlvbkVuaGFuY2VkKHBhcmFtcy5xdWVyeSBhcyBzdHJpbmcsIHBhcmFtcyk7XG5cbiAgICAgIGNhc2UgJ2dldENvbnRlbnQnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5nZXRDb2xsZWN0aW9uQ29udGVudChwYXJhbXMucGF0aCBhcyBzdHJpbmcpO1xuXG4gICAgICBjYXNlICdnZXRDYWNoZUhlYWx0aCc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmdldENvbGxlY3Rpb25DYWNoZUhlYWx0aCgpO1xuXG4gICAgICBjYXNlICdpbnN0YWxsJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuaW5zdGFsbENvbnRlbnQocGFyYW1zLnBhdGggYXMgc3RyaW5nKTtcblxuICAgICAgY2FzZSAnc3VibWl0JzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc3VibWl0Q29udGVudChwYXJhbXMuY29udGVudCBhcyBzdHJpbmcpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQ29sbGVjdGlvbiBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBQb3J0Zm9saW8gb3BlcmF0aW9ucyB0byBQb3J0Zm9saW9IYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoUG9ydGZvbGlvKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMucG9ydGZvbGlvSGFuZGxlcjtcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUG9ydGZvbGlvIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogUG9ydGZvbGlvSGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdzdGF0dXMnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5wb3J0Zm9saW9TdGF0dXMocGFyYW1zLnVzZXJuYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIGNhc2UgJ2luaXQnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5pbml0UG9ydGZvbGlvKHtcbiAgICAgICAgICByZXBvc2l0b3J5TmFtZTogcGFyYW1zLnJlcG9zaXRvcnlfbmFtZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcHJpdmF0ZTogcGFyYW1zLnByaXZhdGUgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogcGFyYW1zLmRlc2NyaXB0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2NvbmZpZyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnBvcnRmb2xpb0NvbmZpZyh7XG4gICAgICAgICAgYXV0b1N5bmM6IHBhcmFtcy5hdXRvX3N5bmMgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBkZWZhdWx0VmlzaWJpbGl0eTogcGFyYW1zLmRlZmF1bHRfdmlzaWJpbGl0eSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgYXV0b1N1Ym1pdDogcGFyYW1zLmF1dG9fc3VibWl0IGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHBhcmFtcy5yZXBvc2l0b3J5X25hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnc3luYyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLnN5bmNQb3J0Zm9saW8oe1xuICAgICAgICAgIGRpcmVjdGlvbjogKHBhcmFtcy5kaXJlY3Rpb24gYXMgc3RyaW5nKSB8fCAncHVzaCcsXG4gICAgICAgICAgbW9kZTogcGFyYW1zLm1vZGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGZvcmNlOiBwYXJhbXMuZm9yY2UgYXMgYm9vbGVhbiB8fCBmYWxzZSxcbiAgICAgICAgICBkcnlSdW46IHBhcmFtcy5kcnlfcnVuIGFzIGJvb2xlYW4gfHwgZmFsc2UsXG4gICAgICAgICAgY29uZmlybURlbGV0aW9uczogcGFyYW1zLmNvbmZpcm1fZGVsZXRpb25zIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdzZWFyY2gnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZWFyY2hQb3J0Zm9saW8oe1xuICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMucXVlcnkgYXMgc3RyaW5nLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBwYXJhbXMudHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZnV6enlNYXRjaDogcGFyYW1zLmZ1enp5X21hdGNoIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgbWF4UmVzdWx0czogcGFyYW1zLm1heF9yZXN1bHRzIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbmNsdWRlS2V5d29yZHM6IHBhcmFtcy5pbmNsdWRlX2tleXdvcmRzIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZVRhZ3M6IHBhcmFtcy5pbmNsdWRlX3RhZ3MgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBpbmNsdWRlVHJpZ2dlcnM6IHBhcmFtcy5pbmNsdWRlX3RyaWdnZXJzIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZURlc2NyaXB0aW9uczogcGFyYW1zLmluY2x1ZGVfZGVzY3JpcHRpb25zIGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICBjYXNlICdzZWFyY2hBbGwnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZWFyY2hBbGwoe1xuICAgICAgICAgIHF1ZXJ5OiBwYXJhbXMucXVlcnkgYXMgc3RyaW5nLFxuICAgICAgICAgIHNvdXJjZXM6IHBhcmFtcy5zb3VyY2VzIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBwYXJhbXMudHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFnZTogcGFyYW1zLnBhZ2UgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHBhZ2VTaXplOiBwYXJhbXMucGFnZV9zaXplIGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBzb3J0Qnk6IHBhcmFtcy5zb3J0X2J5IGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2VsZW1lbnRNYW5hZ2VyJzoge1xuICAgICAgICBjb25zdCBzeW5jSGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuc3luY0hhbmRsZXI7XG4gICAgICAgIGlmICghc3luY0hhbmRsZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvcnRmb2xpbyBlbGVtZW50IG1hbmFnZXIgbm90IGF2YWlsYWJsZTogU3luY0hhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3luY0hhbmRsZXIuaGFuZGxlU3luY09wZXJhdGlvbih7XG4gICAgICAgICAgb3BlcmF0aW9uOiBwYXJhbXMub3BlcmF0aW9uIGFzICdsaXN0LXJlbW90ZScgfCAnZG93bmxvYWQnIHwgJ3VwbG9hZCcgfCAnY29tcGFyZScsXG4gICAgICAgICAgZWxlbWVudF9uYW1lOiBwYXJhbXMuZWxlbWVudF9uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBlbGVtZW50X3R5cGU6IHBhcmFtcy5lbGVtZW50X3R5cGUgYXMgRWxlbWVudFR5cGUgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZmlsdGVyOiBwYXJhbXMuZmlsdGVyIGFzIHsgdHlwZT86IEVsZW1lbnRUeXBlOyBhdXRob3I/OiBzdHJpbmc7IHVwZGF0ZWRfYWZ0ZXI/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBvcHRpb25zOiBwYXJhbXMub3B0aW9ucyBhcyB7IGZvcmNlPzogYm9vbGVhbjsgZHJ5X3J1bj86IGJvb2xlYW47IGluY2x1ZGVfcHJpdmF0ZT86IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBQb3J0Zm9saW8gbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggQXV0aCBvcGVyYXRpb25zIHRvIEdpdEh1YkF1dGhIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoQXV0aChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmF1dGhIYW5kbGVyO1xuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogR2l0SHViQXV0aEhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnc2V0dXAnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5zZXR1cEdpdEh1YkF1dGgoKTtcblxuICAgICAgY2FzZSAnY2hlY2snOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5jaGVja0dpdEh1YkF1dGgoKTtcblxuICAgICAgY2FzZSAnY2xlYXInOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5jbGVhckdpdEh1YkF1dGgoKTtcblxuICAgICAgY2FzZSAnY29uZmlndXJlT0F1dGgnOlxuICAgICAgICByZXR1cm4gaGFuZGxlci5jb25maWd1cmVPQXV0aChwYXJhbXMuY2xpZW50X2lkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIGNhc2UgJ29hdXRoSGVscGVyU3RhdHVzJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0T0F1dGhIZWxwZXJTdGF0dXMocGFyYW1zLnZlcmJvc2UgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCk7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBBdXRoIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIENvbmZpZyBvcGVyYXRpb25zIHRvIENvbmZpZ0hhbmRsZXIgYW5kIEJ1aWxkSW5mb1NlcnZpY2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hDb25maWcoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnbWFuYWdlJzoge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVycy5jb25maWdIYW5kbGVyO1xuICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpZyBvcGVyYXRpb25zIG5vdCBhdmFpbGFibGU6IENvbmZpZ0hhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFuZGxlci5oYW5kbGVDb25maWdPcGVyYXRpb24oe1xuICAgICAgICAgIGFjdGlvbjogcGFyYW1zLmFjdGlvbiBhcyAnZ2V0JyB8ICdzZXQnIHwgJ3Jlc2V0JyB8ICdleHBvcnQnIHwgJ2ltcG9ydCcgfCAnd2l6YXJkJyxcbiAgICAgICAgICBzZXR0aW5nOiBwYXJhbXMuc2V0dGluZyBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgdmFsdWU6IHBhcmFtcy52YWx1ZSxcbiAgICAgICAgICBzZWN0aW9uOiBwYXJhbXMuc2VjdGlvbiBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgZm9ybWF0OiBwYXJhbXMuZm9ybWF0IGFzICd5YW1sJyB8ICdqc29uJyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICBkYXRhOiBwYXJhbXMuZGF0YSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdnZXRCdWlsZEluZm8nOiB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLmhhbmRsZXJzLmJ1aWxkSW5mb1NlcnZpY2U7XG4gICAgICAgIGlmICghc2VydmljZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQnVpbGRJbmZvIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogQnVpbGRJbmZvU2VydmljZSBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBzZXJ2aWNlLmdldEJ1aWxkSW5mbygpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICB0ZXh0OiBzZXJ2aWNlLmZvcm1hdEJ1aWxkSW5mbyhpbmZvKVxuICAgICAgICAgIH1dXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldENhY2hlQnVkZ2V0UmVwb3J0Jzoge1xuICAgICAgICBjb25zdCBidWRnZXQgPSB0aGlzLmhhbmRsZXJzLmNhY2hlTWVtb3J5QnVkZ2V0O1xuICAgICAgICBpZiAoIWJ1ZGdldCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FjaGUgYnVkZ2V0IG5vdCBhdmFpbGFibGU6IENhY2hlTWVtb3J5QnVkZ2V0IG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVwb3J0ID0gYnVkZ2V0LmdldFJlcG9ydCgpO1xuICAgICAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgJyMgQ2FjaGUgTWVtb3J5IEJ1ZGdldCBSZXBvcnQnLFxuICAgICAgICAgICcnLFxuICAgICAgICAgIGAqKkJ1ZGdldDoqKiAke3JlcG9ydC5idWRnZXRNQn0gTUJgLFxuICAgICAgICAgIGAqKlVzZWQ6KiogJHtyZXBvcnQudG90YWxNZW1vcnlNQn0gTUIgKCR7cmVwb3J0LnV0aWxpemF0aW9uUGVyY2VudH0lKWAsXG4gICAgICAgICAgYCoqUmVnaXN0ZXJlZCBDYWNoZXM6KiogJHtyZXBvcnQuY2FjaGVzLmxlbmd0aH1gLFxuICAgICAgICAgICcnLFxuICAgICAgICBdO1xuICAgICAgICBpZiAocmVwb3J0LmNhY2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGluZXMucHVzaCgnfCBDYWNoZSB8IEVudHJpZXMgfCBNZW1vcnkgKE1CKSB8IEhpdCBSYXRlIHwgTGFzdCBBY3Rpdml0eSB8Jyk7XG4gICAgICAgICAgbGluZXMucHVzaCgnfC0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18Jyk7XG4gICAgICAgICAgZm9yIChjb25zdCBjIG9mIHJlcG9ydC5jYWNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2aXR5ID0gYy5sYXN0QWN0aXZpdHlNcyA+IDBcbiAgICAgICAgICAgICAgPyBgJHsoKERhdGUubm93KCkgLSBjLmxhc3RBY3Rpdml0eU1zKSAvIDEwMDApLnRvRml4ZWQoMCl9cyBhZ29gXG4gICAgICAgICAgICAgIDogJ25ldmVyJztcbiAgICAgICAgICAgIGxpbmVzLnB1c2goYHwgJHtjLm5hbWV9IHwgJHtjLmVudHJpZXN9IHwgJHtjLm1lbW9yeU1CfSB8ICR7KGMuaGl0UmF0ZSAqIDEwMCkudG9GaXhlZCgxKX0lIHwgJHthY3Rpdml0eX0gfGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaW5lcy5wdXNoKCdfTm8gY2FjaGVzIHJlZ2lzdGVyZWQuXycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29udGVudDogW3tcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHRleHQ6IGxpbmVzLmpvaW4oJ1xcbicpXG4gICAgICAgICAgfV1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIENvbmZpZyBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBFbmhhbmNlZEluZGV4IG9wZXJhdGlvbnMgdG8gRW5oYW5jZWRJbmRleEhhbmRsZXJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzcGF0Y2hFbmhhbmNlZEluZGV4KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuaGFuZGxlcnMuZW5oYW5jZWRJbmRleEhhbmRsZXI7XG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuaGFuY2VkSW5kZXggb3BlcmF0aW9ucyBub3QgYXZhaWxhYmxlOiBFbmhhbmNlZEluZGV4SGFuZGxlciBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdmaW5kU2ltaWxhcic6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmZpbmRTaW1pbGFyRWxlbWVudHMoe1xuICAgICAgICAgIGVsZW1lbnROYW1lOiBwYXJhbXMuZWxlbWVudF9uYW1lIGFzIHN0cmluZyxcbiAgICAgICAgICBlbGVtZW50VHlwZTogcGFyYW1zLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgbGltaXQ6IChwYXJhbXMubGltaXQgYXMgbnVtYmVyKSA/PyAxMCxcbiAgICAgICAgICB0aHJlc2hvbGQ6IChwYXJhbXMudGhyZXNob2xkIGFzIG51bWJlcikgPz8gMC41LFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnZ2V0UmVsYXRpb25zaGlwcyc6XG4gICAgICAgIHJldHVybiBoYW5kbGVyLmdldEVsZW1lbnRSZWxhdGlvbnNoaXBzKHtcbiAgICAgICAgICBlbGVtZW50TmFtZTogcGFyYW1zLmVsZW1lbnRfbmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IHBhcmFtcy5lbGVtZW50X3R5cGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHJlbGF0aW9uc2hpcFR5cGVzOiBwYXJhbXMucmVsYXRpb25zaGlwX3R5cGVzIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcblxuICAgICAgY2FzZSAnc2VhcmNoQnlWZXJiJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuc2VhcmNoQnlWZXJiKHtcbiAgICAgICAgICB2ZXJiOiBwYXJhbXMudmVyYiBhcyBzdHJpbmcsXG4gICAgICAgICAgbGltaXQ6IChwYXJhbXMubGltaXQgYXMgbnVtYmVyKSA/PyAyMCxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNhc2UgJ2dldFN0YXRzJzpcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0UmVsYXRpb25zaGlwU3RhdHMoKTtcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIEVuaGFuY2VkSW5kZXggbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggUGVyc29uYSBvcGVyYXRpb25zIHRvIFBlcnNvbmFIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoUGVyc29uYShcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLnBlcnNvbmFIYW5kbGVyO1xuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQZXJzb25hIG9wZXJhdGlvbnMgbm90IGF2YWlsYWJsZTogUGVyc29uYUhhbmRsZXIgbm90IGNvbmZpZ3VyZWQnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAnaW1wb3J0Jzoge1xuICAgICAgICAvLyBJc3N1ZSAjMzIzOiBWYWxpZGF0ZSBzb3VyY2UgcGFyYW1ldGVyIGJlZm9yZSB1c2VcbiAgICAgICAgY29uc3Qgc291cmNlID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ3NvdXJjZScsXG4gICAgICAgICAgJ1VSTCBvciBmaWxlIHBhdGggdG8gaW1wb3J0IHBlcnNvbmEgZnJvbSdcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZXIuaW1wb3J0UGVyc29uYShzb3VyY2UsIHBhcmFtcy5vdmVyd3JpdGUgYXMgYm9vbGVhbiB8IHVuZGVmaW5lZCk7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBQZXJzb25hIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjaGFsbGVuZ2VJc0ZvckRlYWRsb2NrUmVsaWVmKGNoYWxsZW5nZTogeyByZWFzb246IHN0cmluZyB9IHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBjaGFsbGVuZ2U/LnJlYXNvbiA9PT0gJ3N0cmluZycgJiYgY2hhbGxlbmdlLnJlYXNvbi5zdGFydHNXaXRoKERFQURMT0NLX1JFTElFRl9SRUFTT04pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc3N1ZURlYWRsb2NrUmVsaWVmQ2hhbGxlbmdlKCk6IHtcbiAgICBwZW5kaW5nOiB0cnVlO1xuICAgIGNoYWxsZW5nZV9pZDogc3RyaW5nO1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICB3YXJuaW5nOiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5oYW5kbGVycy52ZXJpZmljYXRpb25TdG9yZTtcbiAgICBpZiAoIXN0b3JlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZlcmlmaWNhdGlvbiBzeXN0ZW0gbm90IGF2YWlsYWJsZS4gRW5zdXJlIHRoZSBzZXJ2ZXIgaXMgcHJvcGVybHkgY29uZmlndXJlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGFsbGVuZ2VJZCA9IHJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCBjb2RlID0gZ2VuZXJhdGVEaXNwbGF5Q29kZSgpO1xuICAgIHN0b3JlLnNldChjaGFsbGVuZ2VJZCwge1xuICAgICAgY29kZSxcbiAgICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIERFQURMT0NLX1JFTElFRl9USU1FT1VUX01TLFxuICAgICAgcmVhc29uOiBERUFETE9DS19SRUxJRUZfUkVBU09OLFxuICAgIH0pO1xuXG4gICAgdGhpcy5oYW5kbGVycy52ZXJpZmljYXRpb25Ob3RpZmllcj8uc2hvd0NvZGUoY29kZSwgREVBRExPQ0tfUkVMSUVGX0RJQUxPR19SRUFTT04pO1xuXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ0RBTkdFUl9aT05FX1RSSUdHRVJFRCcsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmlzc3VlRGVhZGxvY2tSZWxpZWZDaGFsbGVuZ2UnLFxuICAgICAgZGV0YWlsczogYERlYWRsb2NrIHJlbGllZiBjaGFsbGVuZ2UgaXNzdWVkIGZvciBzZXNzaW9uICR7dGhpcy5nYXRla2VlcGVyLnNlc3Npb25JZH1gLFxuICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgY2hhbGxlbmdlSWQsXG4gICAgICAgIHNlc3Npb25JZDogdGhpcy5nYXRla2VlcGVyLnNlc3Npb25JZCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGVuZGluZzogdHJ1ZSxcbiAgICAgIGNoYWxsZW5nZV9pZDogY2hhbGxlbmdlSWQsXG4gICAgICBtZXNzYWdlOiAnRGVhZGxvY2sgcmVsaWVmIHJlcXVpcmVzIGh1bWFuIGNvbmZpcm1hdGlvbi4gQSB2ZXJpZmljYXRpb24gY29kZSBoYXMgYmVlbiBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuJyxcbiAgICAgIHdhcm5pbmc6ICdDb21wbGV0aW5nIHRoaXMgZmxvdyB3aWxsIGRlYWN0aXZhdGUgYWxsIGFjdGl2ZSBlbGVtZW50cyBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbmQgY2xlYXIgcGVyc2lzdGVkIGFjdGl2YXRpb24gc3RhdGUuJyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb21wbGV0ZURlYWRsb2NrUmVsaWVmKGNoYWxsZW5nZUlkOiBzdHJpbmcsIGNvZGU6IHN0cmluZyk6IFByb21pc2U8e1xuICAgIHJlbGVhc2VkOiB0cnVlO1xuICAgIGNoYWxsZW5nZV9pZDogc3RyaW5nO1xuICAgIHNlc3Npb25JZD86IHN0cmluZztcbiAgICBhY3RpdmVCZWZvcmVSZXNldDogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PjtcbiAgICBkZWFjdGl2YXRlZDogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PjtcbiAgICBmYWlsZWQ6IEFycmF5PHsgdHlwZTogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IGVycm9yOiBzdHJpbmcgfT47XG4gICAgcGVyc2lzdGVkU3RhdGVDbGVhcmVkOiBib29sZWFuO1xuICAgIGxpa2VseURlYWRsb2NrQ2F1c2U6IHtcbiAgICAgIHNhbmRib3hpbmdFbGVtZW50PzogeyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9O1xuICAgICAgYWR2aXNvcnlFbGVtZW50czogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9PjtcbiAgICB9O1xuICAgIHNuYXBzaG90RmlsZT86IHN0cmluZztcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuaGFuZGxlcnMudmVyaWZpY2F0aW9uU3RvcmU7XG4gICAgaWYgKCFzdG9yZSkge1xuICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICAgICdWZXJpZmljYXRpb24gc3lzdGVtIG5vdCBhdmFpbGFibGUuIEVuc3VyZSB0aGUgc2VydmVyIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVDaGFsbGVuZ2VJZEZvcm1hdChjaGFsbGVuZ2VJZCk7XG5cbiAgICBjb25zdCBjaGFsbGVuZ2UgPSBzdG9yZS5nZXQoY2hhbGxlbmdlSWQpO1xuICAgIGlmICghY2hhbGxlbmdlKSB7XG4gICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgIEdhdGVrZWVwZXJFcnJvckNvZGUuVkVSSUZJQ0FUSU9OX1RJTUVPVVQsXG4gICAgICAgICdEZWFkbG9jayByZWxpZWYgY2hhbGxlbmdlIG5vdCBmb3VuZC4gSXQgbWF5IGhhdmUgZXhwaXJlZCBvciBhbHJlYWR5IGJlZW4gdXNlZC4gUmV0cnkgcmVsZWFzZV9kZWFkbG9jayB0byByZWNlaXZlIGEgbmV3IGNvZGUuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNoYWxsZW5nZUlzRm9yRGVhZGxvY2tSZWxpZWYoY2hhbGxlbmdlKSkge1xuICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICAgICdUaGlzIGNoYWxsZW5nZSBpcyBub3QgZm9yIGRlYWRsb2NrIHJlbGllZi4gVXNlIHRoZSBtYXRjaGluZyB2ZXJpZmljYXRpb24gZmxvdyBmb3IgdGhlIHJlcXVlc3RlZCBvcGVyYXRpb24uJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWQgPSBzdG9yZS52ZXJpZnkoY2hhbGxlbmdlSWQsIGNvZGUpO1xuICAgIGlmICghdmFsaWQpIHtcbiAgICAgIHRocm93IG5ldyBWZXJpZmljYXRpb25FcnJvcihcbiAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fRkFJTEVELFxuICAgICAgICAnVmVyaWZpY2F0aW9uIGZhaWxlZDogaW5jb3JyZWN0IGNvZGUuIFRoZSBjb2RlIGhhcyBiZWVuIGNvbnN1bWVkIChvbmUtdGltZSB1c2UpLiBSZXRyeSByZWxlYXNlX2RlYWRsb2NrIHRvIHJlY2VpdmUgYSBuZXcgY29kZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNldCA9IGF3YWl0IHRoaXMuaGFuZGxlcnMuZWxlbWVudENSVUQucmVsZWFzZURlYWRsb2NrKCk7XG5cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX1NVQ0NFRURFRCcsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmNvbXBsZXRlRGVhZGxvY2tSZWxpZWYnLFxuICAgICAgZGV0YWlsczogYERlYWRsb2NrIHJlbGllZiBjb21wbGV0ZWQgZm9yIHNlc3Npb24gJHt0aGlzLmdhdGVrZWVwZXIuc2Vzc2lvbklkfWAsXG4gICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICBjaGFsbGVuZ2VJZCxcbiAgICAgICAgc2Vzc2lvbklkOiB0aGlzLmdhdGVrZWVwZXIuc2Vzc2lvbklkLFxuICAgICAgICBkZWFjdGl2YXRlZENvdW50OiByZXNldC5kZWFjdGl2YXRlZC5sZW5ndGgsXG4gICAgICAgIGZhaWxlZENvdW50OiByZXNldC5mYWlsZWQubGVuZ3RoLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHNuYXBzaG90U3VmZml4ID0gcmVzZXQuc25hcHNob3RGaWxlXG4gICAgICA/IGAgQSByZWNvdmVyeSBzbmFwc2hvdCB3YXMgc2F2ZWQgdG8gJHtyZXNldC5zbmFwc2hvdEZpbGV9LmBcbiAgICAgIDogJyc7XG4gICAgY29uc3QgbWVzc2FnZSA9IHJlc2V0LmZhaWxlZC5sZW5ndGggPiAwXG4gICAgICA/IGBEZWFkbG9jayByZWxpZWYgY29tcGxldGVkIHdpdGggJHtyZXNldC5mYWlsZWQubGVuZ3RofSBkZWFjdGl2YXRpb24gZmFpbHVyZShzKS4gUmV2aWV3IHRoZSBmYWlsZWQgbGlzdCwgbGlrZWx5IGRlYWRsb2NrIGNhdXNlLCBhbmQgcmVjb3Zlcnkgc25hcHNob3QgYmVmb3JlIHJlYWN0aXZhdGluZyBlbGVtZW50cy5gXG4gICAgICA6IGBEZWFkbG9jayByZWxpZWYgY29tcGxldGVkLiBBbGwgYWN0aXZlIGVsZW1lbnRzIGZvciB0aGlzIHNlc3Npb24gd2VyZSBkZWFjdGl2YXRlZCBhbmQgcGVyc2lzdGVkIGFjdGl2YXRpb24gc3RhdGUgd2FzIGNsZWFyZWQuJHtzbmFwc2hvdFN1ZmZpeH1gO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbGVhc2VkOiB0cnVlLFxuICAgICAgY2hhbGxlbmdlX2lkOiBjaGFsbGVuZ2VJZCxcbiAgICAgIC4uLnJlc2V0LFxuICAgICAgbWVzc2FnZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIEdhdGVrZWVwZXIgb3BlcmF0aW9ucyBmb3IgY29uZmlybWF0aW9uIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIElzc3VlICM0NTI6IEhhbmRsZXMgdGhlIGNvbmZpcm1fb3BlcmF0aW9uIGZsb3cgd2hlcmUgdXNlcnMgYXBwcm92ZVxuICAgKiBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBjb25maXJtYXRpb24gcGVyIEdhdGVrZWVwZXIgcG9saWN5LlxuICAgKlxuICAgKiBGbG93OlxuICAgKiAxLiBHYXRla2VlcGVyLmVuZm9yY2UoKSByZXR1cm5zIGNvbmZpcm1hdGlvblBlbmRpbmc6IHRydWVcbiAgICogMi4gTExNIGNhbGxzIGNvbmZpcm1fb3BlcmF0aW9uIHdpdGggdGhlIG9wZXJhdGlvbiBuYW1lXG4gICAqIDMuIFRoaXMgbWV0aG9kIHJlY29yZHMgdGhlIGNvbmZpcm1hdGlvbiBpbiB0aGUgc2Vzc2lvblxuICAgKiA0LiBMTE0gcmV0cmllcyB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uLCB3aGljaCBub3cgcGFzc2VzIHZpYSBMYXllciAzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoR2F0ZWtlZXBlcihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdjb25maXJtJzoge1xuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAnb3BlcmF0aW9uJyxcbiAgICAgICAgICAndGhlIG9wZXJhdGlvbiBuYW1lIHRvIGNvbmZpcm0gKGUuZy4gXCJjcmVhdGVfZWxlbWVudFwiKSdcbiAgICAgICAgKTtcbiAgICAgICAgLy8gSXNzdWUgIzE2MzY6IE5vcm1hbGl6ZSBlbGVtZW50X3R5cGUgdG8gbWF0Y2ggdGhlIE1DUC1BUUwgc2luZ3VsYXIgZm9ybVxuICAgICAgICAvLyB1c2VkIGJ5IHRoZSBlbmZvcmNlIHBhdGguIFdpdGhvdXQgdGhpcywgc2NvcGVkIGNvbmZpcm1hdGlvbnMgc3RvcmVkIGFzXG4gICAgICAgIC8vIFwiY3JlYXRlX2VsZW1lbnQ6c2tpbGxzXCIgbmV2ZXIgbWF0Y2ggZW5mb3JjZSBsb29rdXBzIGZvciBcImNyZWF0ZV9lbGVtZW50OnNraWxsXCIuXG4gICAgICAgIGNvbnN0IHJhd0VsZW1lbnRUeXBlID0gcGFyYW1zLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRUeXBlID0gcmF3RWxlbWVudFR5cGVcbiAgICAgICAgICA/IG5vcm1hbGl6ZU1DUEFRTEVsZW1lbnRUeXBlKHJhd0VsZW1lbnRUeXBlKSA/PyByYXdFbGVtZW50VHlwZVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIElzc3VlICM3NDg6IEJ1aWxkIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgb2Ygd2hhdCdzIGJlaW5nIGNvbmZpcm1lZFxuICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5idWlsZE9wZXJhdGlvblN1bW1hcnkob3BlcmF0aW9uLCBlbGVtZW50VHlwZSwgcGFyYW1zKTtcbiAgICAgICAgY29uc3QgYWN0aXZlRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUVsZW1lbnRzKCk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzc1ODogQ2hlY2sgZm9yIG51Y2xlYXIgc2FuZGJveCDigJQgZGVueTogWydjb25maXJtX29wZXJhdGlvbiddIG9uIGFueSBhY3RpdmUgZWxlbWVudC5cbiAgICAgICAgLy8gVGhpcyBpcyBhIGhhcmQgYmxvY2s6IHRoZSBMTE0gY2Fubm90IGNvbmZpcm0gQU5ZIG9wZXJhdGlvbiB3aGlsZSB0aGUgZGVueWluZyBlbGVtZW50XG4gICAgICAgIC8vIGlzIGFjdGl2ZS4gVGhlIGh1bWFuIG11c3QgZGVhY3RpdmF0ZSB0aGUgZWxlbWVudCB0byByZXN0b3JlIGNvbmZpcm1hdGlvbiBjYXBhYmlsaXR5LlxuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIGF1dG9tYXRlZCBjb25maXJt4oaSZXhlY3V0ZSBsb29wcyB0aGF0IGJ5cGFzcyBodW1hbiByZXZpZXcuXG4gICAgICAgIGNvbnN0IGRlbnlpbmdFbGVtZW50ID0gZmluZENvbmZpcm1EZW55aW5nRWxlbWVudChhY3RpdmVFbGVtZW50cyk7XG4gICAgICAgIGlmIChkZW55aW5nRWxlbWVudCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGBbR2F0ZWtlZXBlcl0gU2FuZGJveCBhY3RpdmU6ICR7ZGVueWluZ0VsZW1lbnQudHlwZX0gXCIke2RlbnlpbmdFbGVtZW50Lm5hbWV9XCIgZGVuaWVzIGNvbmZpcm1fb3BlcmF0aW9uYCwge1xuICAgICAgICAgICAgYmxvY2tlZE9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYE9wZXJhdGlvbiBjYW5ub3QgYmUgY29uZmlybWVkIOKAlCAke2RlbnlpbmdFbGVtZW50LnR5cGV9IFwiJHtkZW55aW5nRWxlbWVudC5uYW1lfVwiIGhhcyBzYW5kYm94ZWQgdGhpcyBzZXNzaW9uLiBgICtcbiAgICAgICAgICAgIGBBbGwgY29uZmlybWF0aW9ucyBhcmUgYmxvY2tlZCB3aGlsZSB0aGlzIGVsZW1lbnQgaXMgYWN0aXZlLiBgICtcbiAgICAgICAgICAgIGBEZWFjdGl2YXRlIHRoZSBlbGVtZW50IHRvIHJlc3RvcmUgY29uZmlybWF0aW9uIGNhcGFiaWxpdHkuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNzU4OiBDaGVjayBmb3IgYWR2aXNvcnkg4oCUIGNvbmZpcm06IFsnY29uZmlybV9vcGVyYXRpb24nXSBvbiBhY3RpdmUgZWxlbWVudHMuXG4gICAgICAgIC8vIE5vdCBlbmZvcmNlZCBhcyBhIGdhdGUsIGJ1dCBzdXJmYWNlZCB0byB0aGUgaHVtYW4gZm9yIGF3YXJlbmVzcy5cbiAgICAgICAgY29uc3QgYWR2aXNvcnlFbGVtZW50cyA9IGZpbmRDb25maXJtQWR2aXNvcnlFbGVtZW50cyhhY3RpdmVFbGVtZW50cyk7XG4gICAgICAgIGNvbnN0IGFkdmlzb3J5Tm90ZSA9IGFkdmlzb3J5RWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgID8gYCBOb3RlOiAke2Fkdmlzb3J5RWxlbWVudHMubWFwKGUgPT4gYCR7ZS50eXBlfSBcIiR7ZS5uYW1lfVwiYCkuam9pbignLCAnKX0gcmVxdWVzdCBhZGRpdGlvbmFsIHNjcnV0aW55IGZvciBjb25maXJtYXRpb25zLmBcbiAgICAgICAgICA6ICcnO1xuXG4gICAgICAgIC8vIEV2YWx1YXRlIHRoZSBUQVJHRVQgb3BlcmF0aW9uJ3MgcGVybWlzc2lvbiBsZXZlbCB3aXRoIGZ1bGwgZWxlbWVudCBwb2xpY2llcy5cbiAgICAgICAgLy8gVGhpcyBpcyBOT1QgY2hlY2tpbmcgY29uZmlybV9vcGVyYXRpb24gaXRzZWxmICh0aGF0IHdhcyBoYW5kbGVkIGluIHRoZSBwcmltYXJ5XG4gICAgICAgIC8vIGVuZm9yY2VtZW50IHBhdGggd2l0aCBza2lwRWxlbWVudFBvbGljaWVzKS4gVGhpcyBjaGVja3Mgd2hhdCB0aGUgdGFyZ2V0IG9wZXJhdGlvblxuICAgICAgICAvLyBuZWVkcyBzbyB3ZSByZWNvcmQgdGhlIHJpZ2h0IGNvbmZpcm1hdGlvbiBsZXZlbC5cbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSB0aGlzLmdhdGVrZWVwZXIuZW5mb3JjZSh7XG4gICAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICAgIGVuZHBvaW50OiB0aGlzLmdldEVuZHBvaW50Rm9yT3BlcmF0aW9uKG9wZXJhdGlvbiksXG4gICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgYWN0aXZlRWxlbWVudHMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHRoZSBvcGVyYXRpb24gZG9lc24ndCBhY3R1YWxseSBuZWVkIGNvbmZpcm1hdGlvbiwgaW5mb3JtIHRoZSBjYWxsZXJcbiAgICAgICAgaWYgKGRlY2lzaW9uLmFsbG93ZWQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZmlybWVkOiB0cnVlLFxuICAgICAgICAgICAgbWVzc2FnZTogYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGlzIGFscmVhZHkgYXBwcm92ZWQgKCR7ZGVjaXNpb24ucG9saWN5U291cmNlID8/ICdhdXRvX2FwcHJvdmUnfSkuIE5vIGNvbmZpcm1hdGlvbiBuZWVkZWQuYCxcbiAgICAgICAgICAgIHN1bW1hcnksXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGVjaXNpb24uY29uZmlybWF0aW9uUGVuZGluZykge1xuICAgICAgICAgIC8vIEhhcmQgZGVueSBvbiB0aGUgdGFyZ2V0IG9wZXJhdGlvbiDigJQgY29uZmlybWF0aW9uIHdvbid0IGhlbHBcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgT3BlcmF0aW9uIFwiJHtvcGVyYXRpb259XCIgaXMgZGVuaWVkIGJ5IHBvbGljeSBhbmQgY2Fubm90IGJlIGNvbmZpcm1lZC4gJHtkZWNpc2lvbi5yZWFzb259YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWNvcmQgdGhlIGNvbmZpcm1hdGlvbiBpbiB0aGUgc2Vzc2lvblxuICAgICAgICBjb25zdCBsZXZlbCA9IGRlY2lzaW9uLnBlcm1pc3Npb25MZXZlbCA9PT0gUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0lOR0xFX1VTRVxuICAgICAgICAgID8gUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0lOR0xFX1VTRVxuICAgICAgICAgIDogUGVybWlzc2lvbkxldmVsLkNPTkZJUk1fU0VTU0lPTjtcblxuICAgICAgICB0aGlzLmdhdGVrZWVwZXIucmVjb3JkQ29uZmlybWF0aW9uKG9wZXJhdGlvbiwgbGV2ZWwsIGVsZW1lbnRUeXBlKTtcblxuICAgICAgICAvLyBBZ2VudCBOb3RpZmljYXRpb24gU3lzdGVtOiBjbGVhciBtYXRjaGluZyBibG9ja3MgZnJvbSBleGVjdXRpbmcgYWdlbnRzXG4gICAgICAgIGZvciAoY29uc3QgWywgYWdlbnRFbnRyeV0gb2YgdGhpcy5leGVjdXRpbmdBZ2VudHMpIHtcbiAgICAgICAgICBhZ2VudEVudHJ5LnJlY2VudEJsb2NrcyA9IGFnZW50RW50cnkucmVjZW50QmxvY2tzLmZpbHRlcihcbiAgICAgICAgICAgIGIgPT4gYi5vcGVyYXRpb24gIT09IG9wZXJhdGlvbiB8fCAoZWxlbWVudFR5cGUgJiYgYi5lbGVtZW50VHlwZSAhPT0gZWxlbWVudFR5cGUpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29uZmlybWVkOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBDb25maXJtZWQ6ICR7c3VtbWFyeX0uJHthZHZpc29yeU5vdGV9YCxcbiAgICAgICAgICByYXRpb25hbGU6IGRlY2lzaW9uLnJlYXNvbixcbiAgICAgICAgICBzY29wZTogZWxlbWVudFR5cGUgPyBgU2NvcGVkIHRvIGVsZW1lbnQgdHlwZTogJHtlbGVtZW50VHlwZX1gIDogJ0FsbCBlbGVtZW50IHR5cGVzJyxcbiAgICAgICAgICBsZXZlbDogbGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0UgPyAnc2luZ2xlX3VzZScgOiAnc2Vzc2lvbicsXG4gICAgICAgICAgc3VtbWFyeSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAndmVyaWZ5Jzoge1xuICAgICAgICAvLyBJc3N1ZSAjMTQyOiBWZXJpZnkgYSBkYW5nZXIgem9uZSBjaGFsbGVuZ2UgY29kZSB0byB1bmJsb2NrIGFuIGFnZW50LlxuICAgICAgICAvLyBUaGlzIGlzIHN0ZXAgOSBvZiB0aGUgdmVyaWZpY2F0aW9uIGZsb3cgKHNlZSBhdXRvbm9teUV2YWx1YXRvci50cyBoZWFkZXIpLlxuICAgICAgICAvL1xuICAgICAgICAvLyBQaXBlbGluZTogdmFsaWRhdGUgcGFyYW1zIOKGkiByYXRlIGxpbWl0IGNoZWNrIOKGkiBVVUlEIHY0IGZvcm1hdCBjaGVjayDihpJcbiAgICAgICAgLy8gICAgICAgICAgIHByZS1jaGVjayBzdG9yZSAoZXhwaXJlZD8pIOKGkiB2ZXJpZnkgY29kZSAod3Jvbmc/KSDihpIgdW5ibG9jayBhZ2VudFxuICAgICAgICAvL1xuICAgICAgICAvLyBFYWNoIHN0YWdlIGxvZ3MgYSBkaXN0aW5jdCBzZWN1cml0eSBldmVudCB0eXBlOlxuICAgICAgICAvLyAgIFZFUklGSUNBVElPTl9BVFRFTVBURUQg4oaSIFZFUklGSUNBVElPTl9GQUlMRUQgKGZvcm1hdC9yYXRlL3dyb25nKSBvclxuICAgICAgICAvLyAgIFZFUklGSUNBVElPTl9FWFBJUkVEIChub3QgZm91bmQpIG9yIFZFUklGSUNBVElPTl9TVUNDRUVERURcbiAgICAgICAgdGhpcy52ZXJpZmljYXRpb25NZXRyaWNzLnJlY29yZEF0dGVtcHQoKTtcbiAgICAgICAgY29uc3QgYXR0ZW1wdFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgY29uc3QgY2hhbGxlbmdlSWQgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAnY2hhbGxlbmdlX2lkJyxcbiAgICAgICAgICAndGhlIHZlcmlmaWNhdGlvbiBjaGFsbGVuZ2UgSUQnXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvZGUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAnY29kZScsXG4gICAgICAgICAgJ3RoZSB2ZXJpZmljYXRpb24gY29kZSBkaXNwbGF5ZWQgb24geW91ciBzY3JlZW4nXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTG9nIGV2ZXJ5IHZlcmlmaWNhdGlvbiBhdHRlbXB0IGZvciBhdWRpdCB0cmFpbFxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9BVFRFTVBURUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci52ZXJpZnknLFxuICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gYXR0ZW1wdGVkIGZvciBjaGFsbGVuZ2UgJHtjaGFsbGVuZ2VJZH1gLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJhdGUgbGltaXRpbmc6IHJlamVjdCBpZiB0b28gbWFueSByZWNlbnQgZmFpbHVyZXNcbiAgICAgICAgaWYgKHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIuaXNMaW1pdGVkKCkpIHtcbiAgICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbk1ldHJpY3MucmVjb3JkUmF0ZUxpbWl0ZWQoKTtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnVkVSSUZJQ0FUSU9OX0ZBSUxFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gcmF0ZS1saW1pdGVkOiB0b28gbWFueSBmYWlsZWQgYXR0ZW1wdHMgKGNoYWxsZW5nZTogJHtjaGFsbGVuZ2VJZH0pYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCByZWFzb246ICdyYXRlX2xpbWl0ZWQnIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fRkFJTEVELFxuICAgICAgICAgICAgJ1RvbyBtYW55IGZhaWxlZCB2ZXJpZmljYXRpb24gYXR0ZW1wdHMuIFBsZWFzZSB3YWl0IGJlZm9yZSB0cnlpbmcgYWdhaW4uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVVUlEIHY0IGZvcm1hdCB2YWxpZGF0aW9uOiByZWplY3QgaW52YWxpZCBJRHMgYmVmb3JlIHN0b3JlIGxvb2t1cFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbGlkYXRlQ2hhbGxlbmdlSWRGb3JtYXQoY2hhbGxlbmdlSWQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHRoaXMudmVyaWZpY2F0aW9uTWV0cmljcy5yZWNvcmRJbnZhbGlkRm9ybWF0KCk7XG4gICAgICAgICAgdGhpcy52ZXJpZmljYXRpb25SYXRlTGltaXRlci5yZWNvcmRGYWlsdXJlKCk7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9GQUlMRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIHJlamVjdGVkOiBpbnZhbGlkIGNoYWxsZW5nZV9pZCBmb3JtYXQgKCR7Y2hhbGxlbmdlSWR9KWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgcmVhc29uOiAnaW52YWxpZF9mb3JtYXQnIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuaGFuZGxlcnMudmVyaWZpY2F0aW9uU3RvcmU7XG4gICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICAgICAgICAnVmVyaWZpY2F0aW9uIHN5c3RlbSBub3QgYXZhaWxhYmxlLiBFbnN1cmUgdGhlIHNlcnZlciBpcyBwcm9wZXJseSBjb25maWd1cmVkLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgY2hhbGxlbmdlIGV4aXN0cyBhbmQgaXMgbm90IGV4cGlyZWQgYmVmb3JlIGF0dGVtcHRpbmcgdmVyaWZ5XG4gICAgICAgIC8vIFRoaXMgbGV0cyB1cyBkaXN0aW5ndWlzaCBcIndyb25nIGNvZGVcIiBmcm9tIFwiZXhwaXJlZFwiIGZvciBncmFudWxhciBsb2dnaW5nXG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZVByZUNoZWNrID0gc3RvcmUuZ2V0KGNoYWxsZW5nZUlkKTtcbiAgICAgICAgaWYgKCFjaGFsbGVuZ2VQcmVDaGVjaykge1xuICAgICAgICAgIC8vIENoYWxsZW5nZSBub3QgZm91bmQg4oCUIGVpdGhlciBleHBpcmVkLCBhbHJlYWR5IHVzZWQsIG9yIG5ldmVyIGV4aXN0ZWRcbiAgICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbk1ldHJpY3MucmVjb3JkRXhwaXJlZCgpO1xuICAgICAgICAgIHRoaXMudmVyaWZpY2F0aW9uUmF0ZUxpbWl0ZXIucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fRVhQSVJFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEdhdGVrZWVwZXIudmVyaWZ5JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gZmFpbGVkOiBjaGFsbGVuZ2UgJHtjaGFsbGVuZ2VJZH0gbm90IGZvdW5kIChleHBpcmVkLCBhbHJlYWR5IHVzZWQsIG9yIGludmFsaWQpYCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkLCByZWFzb246ICdleHBpcmVkX29yX25vdF9mb3VuZCcgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9USU1FT1VULFxuICAgICAgICAgICAgJ1ZlcmlmaWNhdGlvbiBmYWlsZWQ6IGNoYWxsZW5nZSBub3QgZm91bmQuIEl0IG1heSBoYXZlIGV4cGlyZWQgb3IgYWxyZWFkeSBiZWVuIHVzZWQuICcgK1xuICAgICAgICAgICAgJ1JldHJ5IHRoZSBibG9ja2VkIG9wZXJhdGlvbiB0byByZWNlaXZlIGEgbmV3IHZlcmlmaWNhdGlvbiBjb2RlLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2hhbGxlbmdlSXNGb3JEZWFkbG9ja1JlbGllZihjaGFsbGVuZ2VQcmVDaGVjaykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmVyaWZpY2F0aW9uRXJyb3IoXG4gICAgICAgICAgICBHYXRla2VlcGVyRXJyb3JDb2RlLlZFUklGSUNBVElPTl9GQUlMRUQsXG4gICAgICAgICAgICAnVGhpcyB2ZXJpZmljYXRpb24gY29kZSBpcyByZXNlcnZlZCBmb3IgZGVhZGxvY2sgcmVsaWVmLiBVc2UgcmVsZWFzZV9kZWFkbG9jayB3aXRoIGNoYWxsZW5nZV9pZCBhbmQgY29kZSB0byBjb21wbGV0ZSB0aGUgcmVzZXQuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJpZnkgdGhlIGNvZGUgKG9uZS10aW1lIHVzZSDigJQgc3RvcmUgZGVsZXRlcyBjaGFsbGVuZ2UgYWZ0ZXIgdGhpcyBjYWxsKVxuICAgICAgICBjb25zdCB2YWxpZCA9IHN0b3JlLnZlcmlmeShjaGFsbGVuZ2VJZCwgY29kZSk7XG4gICAgICAgIGlmICghdmFsaWQpIHtcbiAgICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbk1ldHJpY3MucmVjb3JkRmFpbHVyZSgpO1xuICAgICAgICAgIGNvbnN0IHJhdGVMaW1pdEV4Y2VlZGVkID0gdGhpcy52ZXJpZmljYXRpb25SYXRlTGltaXRlci5yZWNvcmRGYWlsdXJlKCk7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9GQUlMRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnZlcmlmeScsXG4gICAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIGZhaWxlZCBmb3IgY2hhbGxlbmdlICR7Y2hhbGxlbmdlSWR9OiBpbmNvcnJlY3QgY29kZWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgcmVhc29uOiAnd3JvbmdfY29kZScsIHJhdGVMaW1pdEV4Y2VlZGVkIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZlcmlmaWNhdGlvbkVycm9yKFxuICAgICAgICAgICAgR2F0ZWtlZXBlckVycm9yQ29kZS5WRVJJRklDQVRJT05fRkFJTEVELFxuICAgICAgICAgICAgJ1ZlcmlmaWNhdGlvbiBmYWlsZWQ6IGluY29ycmVjdCBjb2RlLiAnICtcbiAgICAgICAgICAgICdUaGUgY29kZSBoYXMgYmVlbiBjb25zdW1lZCAob25lLXRpbWUgdXNlKS4gJyArXG4gICAgICAgICAgICAnUmV0cnkgdGhlIGJsb2NrZWQgb3BlcmF0aW9uIHRvIHJlY2VpdmUgYSBuZXcgdmVyaWZpY2F0aW9uIGNvZGUuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWNjZXNzIOKAlCBjYWxjdWxhdGUgdGltZS10by12ZXJpZnkgYW5kIHJlY29yZCBtZXRyaWNzXG4gICAgICAgIGNvbnN0IHZlcmlmeUR1cmF0aW9uTXMgPSBhdHRlbXB0VGltZXN0YW1wIC0gKGNoYWxsZW5nZVByZUNoZWNrLmV4cGlyZXNBdCAtIDUgKiA2MCAqIDEwMDApO1xuICAgICAgICB0aGlzLnZlcmlmaWNhdGlvbk1ldHJpY3MucmVjb3JkU3VjY2Vzcyh2ZXJpZnlEdXJhdGlvbk1zID4gMCA/IHZlcmlmeUR1cmF0aW9uTXMgOiB1bmRlZmluZWQpO1xuXG4gICAgICAgIC8vIEZpbmQgd2hpY2ggYWdlbnQgaXMgYmxvY2tlZCB3aXRoIHRoaXMgY2hhbGxlbmdlSWQgYW5kIHVuYmxvY2sgaXRcbiAgICAgICAgY29uc3QgZW5mb3JjZXIgPSB0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlcjtcbiAgICAgICAgaWYgKGVuZm9yY2VyKSB7XG4gICAgICAgICAgY29uc3QgYmxvY2tlZEFnZW50cyA9IGVuZm9yY2VyLmdldEJsb2NrZWRBZ2VudHMoKTtcbiAgICAgICAgICBsZXQgdW5ibG9ja2VkQWdlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBmb3IgKGNvbnN0IGFnZW50TmFtZSBvZiBibG9ja2VkQWdlbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBibG9ja0luZm8gPSBlbmZvcmNlci5jaGVjayhhZ2VudE5hbWUpO1xuICAgICAgICAgICAgaWYgKGJsb2NrSW5mby52ZXJpZmljYXRpb25JZCA9PT0gY2hhbGxlbmdlSWQpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGVuZm9yY2VyLnVuYmxvY2soYWdlbnROYW1lLCBjaGFsbGVuZ2VJZCk7XG4gICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgdW5ibG9ja2VkQWdlbnQgPSBhZ2VudE5hbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHVuYmxvY2tlZEFnZW50KSB7XG4gICAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdWRVJJRklDQVRJT05fU1VDQ0VFREVEJyxcbiAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci52ZXJpZnknLFxuICAgICAgICAgICAgICBkZXRhaWxzOiBgVmVyaWZpY2F0aW9uIHN1Y2NlZWRlZDogYWdlbnQgJyR7dW5ibG9ja2VkQWdlbnR9JyB1bmJsb2NrZWQgKGNoYWxsZW5nZTogJHtjaGFsbGVuZ2VJZH0pYCxcbiAgICAgICAgICAgICAgYWRkaXRpb25hbERhdGE6IHsgY2hhbGxlbmdlSWQsIHVuYmxvY2tlZEFnZW50IH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHZlcmlmaWVkOiB0cnVlLFxuICAgICAgICAgICAgICB1bmJsb2NrZWRBZ2VudCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFZlcmlmaWNhdGlvbiBzdWNjZXNzZnVsLiBBZ2VudCAnJHt1bmJsb2NrZWRBZ2VudH0nIGhhcyBiZWVuIHVuYmxvY2tlZC4gWW91IG1heSBub3cgcmV0cnkgdGhlIG9wZXJhdGlvbi5gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb2RlIHdhcyB2YWxpZCBidXQgbm8gYWdlbnQgd2FzIGZvdW5kIGJsb2NrZWQgd2l0aCB0aGlzIGNoYWxsZW5nZUlkXG4gICAgICAgIC8vIChjb3VsZCBiZSBhIHN0YW5kYWxvbmUgdmVyaWZpY2F0aW9uLCBvciBibG9jayB3YXMgYWxyZWFkeSBjbGVhcmVkKVxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ1ZFUklGSUNBVElPTl9TVUNDRUVERUQnLFxuICAgICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci52ZXJpZnknLFxuICAgICAgICAgIGRldGFpbHM6IGBWZXJpZmljYXRpb24gc3VjY2VlZGVkIGJ1dCBubyBibG9ja2VkIGFnZW50IGZvdW5kIGZvciBjaGFsbGVuZ2UgJHtjaGFsbGVuZ2VJZH1gLFxuICAgICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IGNoYWxsZW5nZUlkIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZlcmlmaWVkOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6ICdWZXJpZmljYXRpb24gc3VjY2Vzc2Z1bC4gWW91IG1heSBub3cgcmV0cnkgdGhlIG9wZXJhdGlvbi4nLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdyZWxlYXNlRGVhZGxvY2snOiB7XG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZUlkVmFsdWUgPSB0eXBlb2YgcGFyYW1zLmNoYWxsZW5nZV9pZCA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IHBhcmFtcy5jaGFsbGVuZ2VfaWQudHJpbSgpXG4gICAgICAgICAgOiAnJztcbiAgICAgICAgY29uc3QgY29kZVZhbHVlID0gdHlwZW9mIHBhcmFtcy5jb2RlID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gcGFyYW1zLmNvZGUudHJpbSgpXG4gICAgICAgICAgOiAnJztcblxuICAgICAgICBpZiAoKGNoYWxsZW5nZUlkVmFsdWUgJiYgIWNvZGVWYWx1ZSkgfHwgKCFjaGFsbGVuZ2VJZFZhbHVlICYmIGNvZGVWYWx1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAncmVsZWFzZV9kZWFkbG9jayByZXF1aXJlcyBib3RoIGNoYWxsZW5nZV9pZCBhbmQgY29kZSB0b2dldGhlciwgb3IgbmVpdGhlciBmb3IgdGhlIGluaXRpYWwgY2hhbGxlbmdlIHJlcXVlc3QuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNoYWxsZW5nZUlkVmFsdWUgJiYgIWNvZGVWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmlzc3VlRGVhZGxvY2tSZWxpZWZDaGFsbGVuZ2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlRGVhZGxvY2tSZWxpZWYoY2hhbGxlbmdlSWRWYWx1ZSwgY29kZVZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnYmVldGxlanVpY2UnOiB7XG4gICAgICAgIC8vIElzc3VlICM1MDM6IFNhZmUtdHJpZ2dlciB0aGUgZnVsbCBkYW5nZXIgem9uZSB2ZXJpZmljYXRpb24gcGlwZWxpbmUuXG4gICAgICAgIC8vIENyZWF0ZXMgYSBjaGFsbGVuZ2UsIHN0b3JlcyBpdCwgYW5kIGJsb2NrcyBhbiBhZ2VudCDigJQgYWxsIGluIG9uZSBjYWxsLlxuICAgICAgICAvLyBJc3N1ZSAjNTIyOiBDb2RlIGlzIHNob3duIHZpYSBPUyBkaWFsb2csIE5FVkVSIHJldHVybmVkIHRvIHRoZSBMTE0uXG4gICAgICAgIGNvbnN0IGFnZW50TmFtZSA9IHR5cGVvZiBwYXJhbXMuYWdlbnRfbmFtZSA9PT0gJ3N0cmluZycgJiYgcGFyYW1zLmFnZW50X25hbWUubGVuZ3RoID4gMFxuICAgICAgICAgID8gcGFyYW1zLmFnZW50X25hbWVcbiAgICAgICAgICA6ICdiZWV0bGVqdWljZS10ZXN0LWFnZW50JztcblxuICAgICAgICBjb25zdCBzdG9yZSA9IHRoaXMuaGFuZGxlcnMudmVyaWZpY2F0aW9uU3RvcmU7XG4gICAgICAgIGlmICghc3RvcmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZlcmlmaWNhdGlvblN0b3JlIG5vdCBhdmFpbGFibGUuIEVuc3VyZSB0aGUgc2VydmVyIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5mb3JjZXIgPSB0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlcjtcbiAgICAgICAgaWYgKCFlbmZvcmNlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRGFuZ2VyWm9uZUVuZm9yY2VyIG5vdCBhdmFpbGFibGUuIEVuc3VyZSB0aGUgc2VydmVyIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBCRUVUTEVKVUlDRV9DSEFMTEVOR0VfVElNRU9VVF9NUyA9IDUgKiA2MCAqIDEwMDA7IC8vIDUgbWludXRlcywgbWF0Y2hlcyBkZWZhdWx0IHZlcmlmaWNhdGlvblRpbWVvdXRNaW51dGVzXG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZUlkID0gcmFuZG9tVVVJRCgpO1xuICAgICAgICBjb25zdCBjb2RlID0gZ2VuZXJhdGVEaXNwbGF5Q29kZSgpO1xuICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgQkVFVExFSlVJQ0VfQ0hBTExFTkdFX1RJTUVPVVRfTVM7XG5cbiAgICAgICAgc3RvcmUuc2V0KGNoYWxsZW5nZUlkLCB7IGNvZGUsIGV4cGlyZXNBdCwgcmVhc29uOiAnQmVldGxlanVpY2UgdGVzdCB0cmlnZ2VyIChJc3N1ZSAjNTAzKScgfSk7XG4gICAgICAgIGVuZm9yY2VyLmJsb2NrKGFnZW50TmFtZSwgJ0JlZXRsZWp1aWNlIHRlc3QgdHJpZ2dlcicsIFsnYmVldGxlanVpY2VfYmVldGxlanVpY2VfYmVldGxlanVpY2UnXSwgY2hhbGxlbmdlSWQpO1xuXG4gICAgICAgIC8vIElzc3VlICM1MjI6IFNob3cgY29kZSB2aWEgT1MgZGlhbG9nIChmaXJlLWFuZC1mb3JnZXQsIG5vbi1ibG9ja2luZylcbiAgICAgICAgLy8gVGhlIGNvZGUgaXMgTkVWRVIgaW5jbHVkZWQgaW4gdGhlIE1DUCByZXNwb25zZSDigJQgb25seSB0aGUgaHVtYW4gc2VlcyBpdC5cbiAgICAgICAgdGhpcy5oYW5kbGVycy52ZXJpZmljYXRpb25Ob3RpZmllcj8uc2hvd0NvZGUoY29kZSwgYEFnZW50ICcke2FnZW50TmFtZX0nIHJlcXVpcmVzIHZlcmlmaWNhdGlvbiAoQmVldGxlanVpY2UgdHJpZ2dlcilgKTtcblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0RBTkdFUl9aT05FX1RSSUdHRVJFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLmJlZXRsZWp1aWNlJyxcbiAgICAgICAgICBkZXRhaWxzOiBgQmVldGxlanVpY2UgdGVzdCB0cmlnZ2VyOiBhZ2VudCAnJHthZ2VudE5hbWV9JyBibG9ja2VkIHdpdGggY2hhbGxlbmdlICR7Y2hhbGxlbmdlSWR9YCxcbiAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyBjaGFsbGVuZ2VJZCwgYWdlbnROYW1lLCB0ZXN0VHJpZ2dlcjogdHJ1ZSB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJc3N1ZSAjNTIyOiBSZXNwb25zZSBkZWxpYmVyYXRlbHkgb21pdHMgY29kZSBhbmQgaW5zdHJ1Y3Rpb25zLlxuICAgICAgICAvLyBUaGUgaHVtYW4gcmVhZHMgdGhlIGNvZGUgZnJvbSB0aGUgT1MgZGlhbG9nIGFuZCB0eXBlcyBpdCBpbnRvIGNoYXQuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHJpZ2dlcmVkOiB0cnVlLFxuICAgICAgICAgIGNoYWxsZW5nZV9pZDogY2hhbGxlbmdlSWQsXG4gICAgICAgICAgYWdlbnRfbmFtZTogYWdlbnROYW1lLFxuICAgICAgICAgIG1lc3NhZ2U6IGBBZ2VudCAnJHthZ2VudE5hbWV9JyBpcyBub3cgYmxvY2tlZC4gQSB2ZXJpZmljYXRpb24gY29kZSBoYXMgYmVlbiBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuIFRoZXkgbXVzdCB0eXBlIGl0IHRvIHByb2NlZWQgdmlhIHZlcmlmeV9jaGFsbGVuZ2UuYCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncGVybWlzc2lvblByb21wdCc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzYyNTogRXZhbHVhdGUgQ0xJLWxldmVsIHBlcm1pc3Npb24gcHJvbXB0cyBmb3IgLS1wZXJtaXNzaW9uLXByb21wdC10b29sXG4gICAgICAgIC8vIFNlZTogZG9jcy9hcmNoaXRlY3R1cmUvUEVSTUlTU0lPTl9QUk9NUFRfQVJDSElURUNUVVJFLm1kIGZvciBwcm90b2NvbCBkZXRhaWxzXG4gICAgICAgIGNvbnN0IHRvb2xOYW1lID0gdmFsaWRhdGVSZXF1aXJlZFN0cmluZyhcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgJ3Rvb2xfbmFtZScsXG4gICAgICAgICAgJ3RoZSB0b29sIHJlcXVlc3RpbmcgcGVybWlzc2lvbiAoZS5nLiwgXCJCYXNoXCIsIFwiRWRpdFwiLCBcIldyaXRlXCIpJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCB0b29sSW5wdXRSYXcgPSBwYXJhbXMuaW5wdXQ7XG4gICAgICAgIGlmICghdG9vbElucHV0UmF3IHx8IHR5cGVvZiB0b29sSW5wdXRSYXcgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJlaGF2aW9yOiAnZGVueScsXG4gICAgICAgICAgICBtZXNzYWdlOiBgTWlzc2luZyByZXF1aXJlZCBcImlucHV0XCIgcGFyYW1ldGVyIGZvciAke3Rvb2xOYW1lfSB0b29sIGV2YWx1YXRpb24uYCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogJ2Rhbmdlcm91cycsXG4gICAgICAgICAgICAgIHJlYXNvbjogJ0Nhbm5vdCBldmFsdWF0ZSBwZXJtaXNzaW9uIHdpdGhvdXQgdG9vbCBpbnB1dCcsXG4gICAgICAgICAgICAgIHN0YWdlOiAnaW5wdXRfdmFsaWRhdGlvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9vbElucHV0ID0gdG9vbElucHV0UmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgICAgIC8vIElzc3VlICM2NjU6IFZhbGlkYXRlIEJhc2ggY29tbWFuZHMgaGF2ZSBhIG5vbi1lbXB0eSBjb21tYW5kIHN0cmluZ1xuICAgICAgICBpZiAodG9vbE5hbWUgPT09ICdCYXNoJykge1xuICAgICAgICAgIGNvbnN0IGNvbW1hbmQgPSB0eXBlb2YgdG9vbElucHV0LmNvbW1hbmQgPT09ICdzdHJpbmcnID8gdG9vbElucHV0LmNvbW1hbmQudHJpbSgpIDogJyc7XG4gICAgICAgICAgaWYgKCFjb21tYW5kKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgTWlzc2luZyByZXF1aXJlZCBcImNvbW1hbmRcIiBpbiBpbnB1dCBmb3IgQmFzaCB0b29sLiBDYW5ub3QgZXZhbHVhdGUgYW4gZW1wdHkgY29tbWFuZC5gLFxuICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICAgIHJpc2tMZXZlbDogJ2Rhbmdlcm91cycsXG4gICAgICAgICAgICAgICAgcmVhc29uOiAnRW1wdHkgQmFzaCBjb21tYW5kIOKAlCBkZW5pZWQgYnkgZGVmYXVsdCBmb3Igc2FmZXR5JyxcbiAgICAgICAgICAgICAgICBzdGFnZTogJ2lucHV0X3ZhbGlkYXRpb24nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNjQ3OiBDYXB0dXJlIGFnZW50X2lkZW50aXR5IGZyb20gQ2xhdWRlIENvZGUgLS1wZXJtaXNzaW9uLXByb21wdC10b29sXG4gICAgICAgIGNvbnN0IGFnZW50SWRlbnRpdHkgPSB0eXBlb2YgcGFyYW1zLmFnZW50X2lkZW50aXR5ID09PSAnc3RyaW5nJyA/IHBhcmFtcy5hZ2VudF9pZGVudGl0eSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFJhdGUgbGltaXQgY2hlY2tcbiAgICAgICAgY29uc3QgcHJvbXB0UmF0ZVN0YXR1cyA9IHRoaXMucGVybWlzc2lvblByb21wdExpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuICAgICAgICBpZiAoIXByb21wdFJhdGVTdGF0dXMuYWxsb3dlZCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmF0ZUxpbWl0RGVueSgncGVybWlzc2lvbl9wcm9tcHQnLCB0b29sTmFtZSwgcHJvbXB0UmF0ZVN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZXJtaXNzaW9uUHJvbXB0TGltaXRlci5jb25zdW1lVG9rZW4oKTtcblxuICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFRyYWNrIHRoYXQgcGVybWlzc2lvbl9wcm9tcHQgaXMgYWN0aXZlIChmYWlsLXNhZmUgZGV0ZWN0aW9uKVxuICAgICAgICBpZiAoIXRoaXMuZ2F0ZWtlZXBlci5pc1Blcm1pc3Npb25Qcm9tcHRBY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmdhdGVrZWVwZXIubWFya1Blcm1pc3Npb25Qcm9tcHRBY3RpdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDE6IFN0YXRpYyBjbGFzc2lmaWNhdGlvbiAoZmFzdCBwYXRoKVxuICAgICAgICBjb25zdCBjbGFzc2lmaWNhdGlvbiA9IGNsYXNzaWZ5VG9vbCh0b29sTmFtZSwgdG9vbElucHV0KTtcblxuICAgICAgICBpZiAoY2xhc3NpZmljYXRpb24uYmVoYXZpb3IgPT09ICdhbGxvdycpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdhbGxvdycsXG4gICAgICAgICAgICB1cGRhdGVkSW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdzdGF0aWNfY2xhc3NpZmljYXRpb24nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjbGFzc2lmaWNhdGlvbi5iZWhhdmlvciA9PT0gJ2RlbnknKSB7XG4gICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgdHlwZTogJ1BFUk1JU1NJT05fUFJPTVBUX0RFTklFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICBzb3VyY2U6ICdNQ1BBUUxIYW5kbGVyLmRpc3BhdGNoR2F0ZWtlZXBlci5wZXJtaXNzaW9uUHJvbXB0JyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBQZXJtaXNzaW9uIGRlbmllZCBmb3IgJHt0b29sTmFtZX06ICR7Y2xhc3NpZmljYXRpb24ucmVhc29ufWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyB0b29sTmFtZSwgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsIGFnZW50SWRlbnRpdHkgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgIC4uLihhZ2VudElkZW50aXR5ICYmIHsgYWdlbnRfaWRlbnRpdHk6IGFnZW50SWRlbnRpdHkgfSksXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbjoge1xuICAgICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICAgIHN0YWdlOiAnc3RhdGljX2NsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDI6IEFjdGl2ZSBlbGVtZW50IHBvbGljeSBjaGVja1xuICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgICAgICAgY29uc3QgZWxlbWVudERlY2lzaW9uID0gZXZhbHVhdGVDbGlUb29sUG9saWN5KHRvb2xOYW1lLCB0b29sSW5wdXQsIGFjdGl2ZUVsZW1lbnRzKTtcblxuICAgICAgICBpZiAoZWxlbWVudERlY2lzaW9uLmJlaGF2aW9yID09PSAnZGVueScpIHtcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnUEVSTUlTU0lPTl9QUk9NUFRfREVOSUVEJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgIHNvdXJjZTogJ01DUEFRTEhhbmRsZXIuZGlzcGF0Y2hHYXRla2VlcGVyLnBlcm1pc3Npb25Qcm9tcHQnLFxuICAgICAgICAgICAgZGV0YWlsczogYFBlcm1pc3Npb24gZGVuaWVkIGJ5IGVsZW1lbnQgcG9saWN5IGZvciAke3Rvb2xOYW1lfWAsXG4gICAgICAgICAgICBhZGRpdGlvbmFsRGF0YTogeyB0b29sTmFtZSwgbWVzc2FnZTogZWxlbWVudERlY2lzaW9uLm1lc3NhZ2UsIGFnZW50SWRlbnRpdHkgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmVoYXZpb3I6ICdkZW55JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVsZW1lbnREZWNpc2lvbi5tZXNzYWdlLFxuICAgICAgICAgICAgLi4uKGFnZW50SWRlbnRpdHkgJiYgeyBhZ2VudF9pZGVudGl0eTogYWdlbnRJZGVudGl0eSB9KSxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdlbGVtZW50X3BvbGljeScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9saWN5Q29udGV4dDogZWxlbWVudERlY2lzaW9uLnBvbGljeUNvbnRleHQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDIuMTogUGF0dGVybi1iYXNlZCBhcHByb3ZhbCAoY29uZmlybVBhdHRlcm5zIOKAlCBJc3N1ZSAjMTY2MClcbiAgICAgICAgaWYgKGVsZW1lbnREZWNpc2lvbi5iZWhhdmlvciA9PT0gJ2NvbmZpcm0nKSB7XG4gICAgICAgICAgY29uc3QgcmlzayA9IGFzc2Vzc1Jpc2sodG9vbE5hbWUsIHRvb2xJbnB1dCwgY2xhc3NpZmljYXRpb24pO1xuICAgICAgICAgIGNvbnN0IHBvbGljeVNvdXJjZSA9IGVsZW1lbnREZWNpc2lvbi5jb25maXJtU291cmNlIHx8ICd1bmtub3duJztcblxuICAgICAgICAgIGNvbnN0IGFwcHJvdmFsUmF0ZVN0YXR1cyA9IHRoaXMuY2xpQXBwcm92YWxMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgICAgICAgICBpZiAoIWFwcHJvdmFsUmF0ZVN0YXR1cy5hbGxvd2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5idWlsZFJhdGVMaW1pdERlbnkoXG4gICAgICAgICAgICAgICdjbGlfYXBwcm92YWwnLCB0b29sTmFtZSwgYXBwcm92YWxSYXRlU3RhdHVzLFxuICAgICAgICAgICAgICBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsIGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2xpQXBwcm92YWxMaW1pdGVyLmNvbnN1bWVUb2tlbigpO1xuXG4gICAgICAgICAgY29uc3QgYXBwcm92YWxQb2xpY3kgPSByZXNvbHZlQ2xpQXBwcm92YWxQb2xpY3koYWN0aXZlRWxlbWVudHMpO1xuICAgICAgICAgIGNvbnN0IHR0bE1zID0gYXBwcm92YWxQb2xpY3kudHRsU2Vjb25kcyA/IGFwcHJvdmFsUG9saWN5LnR0bFNlY29uZHMgKiAxMDAwIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2F0ZWtlZXBlci5jcmVhdGVDbGlBcHByb3ZhbFJlcXVlc3QoXG4gICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgIHRvb2xJbnB1dCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgIHJpc2suc2NvcmUsXG4gICAgICAgICAgICByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgIGVsZW1lbnREZWNpc2lvbi5tZXNzYWdlIHx8IGBDb25maXJtYXRpb24gcmVxdWlyZWQgYnkgZWxlbWVudCBwb2xpY3lgLFxuICAgICAgICAgICAgcG9saWN5U291cmNlLFxuICAgICAgICAgICAgdHRsTXMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgbWVzc2FnZTogYFJlcXVpcmVzIGh1bWFuIGFwcHJvdmFsLiBSZXF1ZXN0IElEOiAke3JlcXVlc3RJZH0uIENhbGwgYXBwcm92ZV9jbGlfcGVybWlzc2lvbiB0byBhdXRob3JpemUuYCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdhcHByb3ZhbF9yZXF1aXJlZCcsXG4gICAgICAgICAgICAgIHJpc2tTY29yZTogcmlzay5zY29yZSxcbiAgICAgICAgICAgICAgaXJyZXZlcnNpYmxlOiByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcHByb3ZhbFJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJpc2tTY29yZTogcmlzay5zY29yZSxcbiAgICAgICAgICAgICAgaXJyZXZlcnNpYmxlOiByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBlbGVtZW50RGVjaXNpb24ubWVzc2FnZSB8fCAnQ29uZmlybWF0aW9uIHJlcXVpcmVkIGJ5IGVsZW1lbnQgcG9saWN5JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb2xpY3lDb250ZXh0OiBlbGVtZW50RGVjaXNpb24ucG9saWN5Q29udGV4dCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhZ2UgMi41OiBDaGVjayBleGlzdGluZyBDTEkgYXBwcm92YWwgKElzc3VlICM2MjUgUGhhc2UgMylcbiAgICAgICAgY29uc3QgZXhpc3RpbmdBcHByb3ZhbCA9IHRoaXMuZ2F0ZWtlZXBlci5jaGVja0NsaUFwcHJvdmFsKHRvb2xOYW1lLCB0b29sSW5wdXQpO1xuICAgICAgICBpZiAoZXhpc3RpbmdBcHByb3ZhbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2FsbG93JyxcbiAgICAgICAgICAgIHVwZGF0ZWRJbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgICAgY2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgICBzdGFnZTogJ2NsaV9hcHByb3ZhbCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwcm92YWxDb250ZXh0OiB7XG4gICAgICAgICAgICAgIHJlcXVlc3RJZDogZXhpc3RpbmdBcHByb3ZhbC5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIHNjb3BlOiBleGlzdGluZ0FwcHJvdmFsLnNjb3BlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBvbGljeUNvbnRleHQ6IGVsZW1lbnREZWNpc2lvbi5wb2xpY3lDb250ZXh0LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFnZSAyLjc1OiBBcHByb3ZhbC1yZXF1aXJlZCByb3V0aW5nIChJc3N1ZSAjNjI1IFBoYXNlIDMpXG4gICAgICAgIGNvbnN0IGFwcHJvdmFsUG9saWN5ID0gcmVzb2x2ZUNsaUFwcHJvdmFsUG9saWN5KGFjdGl2ZUVsZW1lbnRzKTtcbiAgICAgICAgaWYgKGFwcHJvdmFsUG9saWN5LnJlcXVpcmVBcHByb3ZhbD8uaW5jbHVkZXMoY2xhc3NpZmljYXRpb24ucmlza0xldmVsIGFzICdtb2RlcmF0ZScgfCAnZGFuZ2Vyb3VzJykpIHtcbiAgICAgICAgICBjb25zdCByaXNrID0gYXNzZXNzUmlzayh0b29sTmFtZSwgdG9vbElucHV0LCBjbGFzc2lmaWNhdGlvbik7XG4gICAgICAgICAgY29uc3QgcG9saWN5U291cmNlID0gYWN0aXZlRWxlbWVudHNcbiAgICAgICAgICAgIC5maWx0ZXIoZWwgPT4gZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5hcHByb3ZhbFBvbGljeT8ucmVxdWlyZUFwcHJvdmFsPy5sZW5ndGgpXG4gICAgICAgICAgICAubWFwKGVsID0+IGAke2VsLnR5cGV9OiR7ZWwubmFtZX1gKVxuICAgICAgICAgICAgLmpvaW4oJywgJykgfHwgJ2VudjpET0xMSE9VU0VfQ0xJX0FQUFJPVkFMX1BPTElDWSc7XG5cbiAgICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDQ6IFJhdGUgbGltaXQgQ0xJIGFwcHJvdmFsIGNyZWF0aW9uXG4gICAgICAgICAgY29uc3QgYXBwcm92YWxSYXRlU3RhdHVzID0gdGhpcy5jbGlBcHByb3ZhbExpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuICAgICAgICAgIGlmICghYXBwcm92YWxSYXRlU3RhdHVzLmFsbG93ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmF0ZUxpbWl0RGVueShcbiAgICAgICAgICAgICAgJ2NsaV9hcHByb3ZhbCcsIHRvb2xOYW1lLCBhcHByb3ZhbFJhdGVTdGF0dXMsXG4gICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCwgY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jbGlBcHByb3ZhbExpbWl0ZXIuY29uc3VtZVRva2VuKCk7XG5cbiAgICAgICAgICBjb25zdCB0dGxNcyA9IGFwcHJvdmFsUG9saWN5LnR0bFNlY29uZHMgPyBhcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzICogMTAwMCA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLmdhdGVrZWVwZXIuY3JlYXRlQ2xpQXBwcm92YWxSZXF1ZXN0KFxuICAgICAgICAgICAgdG9vbE5hbWUsXG4gICAgICAgICAgICB0b29sSW5wdXQsXG4gICAgICAgICAgICBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICByaXNrLnNjb3JlLFxuICAgICAgICAgICAgcmlzay5pcnJldmVyc2libGUsXG4gICAgICAgICAgICBgVG9vbCAnJHt0b29sTmFtZX0nIGNsYXNzaWZpZWQgYXMgJHtjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWx9OiAke2NsYXNzaWZpY2F0aW9uLnJlYXNvbn1gLFxuICAgICAgICAgICAgcG9saWN5U291cmNlLFxuICAgICAgICAgICAgdHRsTXMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBiZWhhdmlvcjogJ2RlbnknLFxuICAgICAgICAgICAgbWVzc2FnZTogYFJlcXVpcmVzIGh1bWFuIGFwcHJvdmFsLiBSZXF1ZXN0IElEOiAke3JlcXVlc3RJZH0uIENhbGwgYXBwcm92ZV9jbGlfcGVybWlzc2lvbiB0byBhdXRob3JpemUuYCxcbiAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICAgIHJpc2tMZXZlbDogY2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICByZWFzb246IGNsYXNzaWZpY2F0aW9uLnJlYXNvbixcbiAgICAgICAgICAgICAgc3RhZ2U6ICdhcHByb3ZhbF9yZXF1aXJlZCcsXG4gICAgICAgICAgICAgIHJpc2tTY29yZTogcmlzay5zY29yZSxcbiAgICAgICAgICAgICAgaXJyZXZlcnNpYmxlOiByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcHByb3ZhbFJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgcmVxdWVzdElkLFxuICAgICAgICAgICAgICB0b29sTmFtZSxcbiAgICAgICAgICAgICAgcmlza0xldmVsOiBjbGFzc2lmaWNhdGlvbi5yaXNrTGV2ZWwsXG4gICAgICAgICAgICAgIHJpc2tTY29yZTogcmlzay5zY29yZSxcbiAgICAgICAgICAgICAgaXJyZXZlcnNpYmxlOiByaXNrLmlycmV2ZXJzaWJsZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBjbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcG9saWN5Q29udGV4dDogZWxlbWVudERlY2lzaW9uLnBvbGljeUNvbnRleHQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0YWdlIDM6IERlZmF1bHQg4oCUIGFsbG93IChwZXJtaXNzaXZlKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJlaGF2aW9yOiAnYWxsb3cnLFxuICAgICAgICAgIHVwZGF0ZWRJbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgIGNsYXNzaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICByaXNrTGV2ZWw6IGNsYXNzaWZpY2F0aW9uLnJpc2tMZXZlbCxcbiAgICAgICAgICAgIHJlYXNvbjogY2xhc3NpZmljYXRpb24ucmVhc29uLFxuICAgICAgICAgICAgc3RhZ2U6ICdkZWZhdWx0JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBvbGljeUNvbnRleHQ6IGVsZW1lbnREZWNpc2lvbi5wb2xpY3lDb250ZXh0LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdldmFsdWF0ZVBlcm1pc3Npb24nOiB7XG4gICAgICAgIC8vIEV2YWx1YXRlIENMSSBwZXJtaXNzaW9uIGZvciBQcmVUb29sVXNlIGhvb2tzIChhbGwgcGxhdGZvcm1zKVxuICAgICAgICBjb25zdCB7IGV2YWx1YXRlUGVybWlzc2lvbiB9ID0gYXdhaXQgaW1wb3J0KCcuL2V2YWx1YXRlUGVybWlzc2lvbi5qcycpO1xuICAgICAgICByZXR1cm4gZXZhbHVhdGVQZXJtaXNzaW9uKHBhcmFtcywge1xuICAgICAgICAgIHBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyOiB0aGlzLnBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyLFxuICAgICAgICAgIGNsYXNzaWZ5VG9vbCxcbiAgICAgICAgICBldmFsdWF0ZUNsaVRvb2xQb2xpY3ksXG4gICAgICAgICAgZ2V0QWN0aXZlRWxlbWVudHM6IChzZXNzaW9uSWQ/OiBzdHJpbmcpID0+IHRoaXMuZ2V0QWN0aXZlRWxlbWVudHMoc2Vzc2lvbklkKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldEVmZmVjdGl2ZUNsaVBvbGljaWVzJzoge1xuICAgICAgICAvLyBJc3N1ZSAjNjI1IFBoYXNlIDI6IEdldCBlZmZlY3RpdmUgQ0xJIHBlcm1pc3Npb24gcG9saWNpZXNcbiAgICAgICAgY29uc3QgdG9vbE5hbWUgPSBwYXJhbXMudG9vbF9uYW1lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgdG9vbElucHV0ID0gKHBhcmFtcy50b29sX2lucHV0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA/PyB7fTtcbiAgICAgICAgY29uc3QgcmVwb3J0U2Vzc2lvbklkID0gdHlwZW9mIHBhcmFtcy5zZXNzaW9uX2lkID09PSAnc3RyaW5nJyA/IHBhcmFtcy5zZXNzaW9uX2lkIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCByZXBvcnRpbmdTY29wZSA9IHBhcmFtcy5yZXBvcnRpbmdfc2NvcGUgPT09ICdkYXNoYm9hcmQnO1xuXG4gICAgICAgIC8vIDEuIEdldCBhbGwgYWN0aXZlIGVsZW1lbnRzXG4gICAgICAgIGNvbnN0IHBvbGljeUVsZW1lbnRzID0gcmVwb3J0aW5nU2NvcGUgJiYgIXRvb2xOYW1lXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLmdldFBvbGljeVJlcG9ydEVsZW1lbnRzKHJlcG9ydFNlc3Npb25JZClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0QWN0aXZlRWxlbWVudHMoKTtcblxuICAgICAgICAvLyAyLiBFeHRyYWN0IGV4dGVybmFsUmVzdHJpY3Rpb25zIGZyb20gZWFjaCBlbGVtZW50XG4gICAgICAgIGNvbnN0IGVsZW1lbnRQb2xpY2llcyA9IHBvbGljeUVsZW1lbnRzLm1hcChlbCA9PiB7XG4gICAgICAgICAgY29uc3QgZGlhZ25vc3RpY3MgPSBnZXRHYXRla2VlcGVyRGlhZ25vc3RpY3MoZWwubWV0YWRhdGEpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBlbC50eXBlLFxuICAgICAgICAgICAgbmFtZTogZWwubmFtZSxcbiAgICAgICAgICAgIGFsbG93UGF0dGVybnM6IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyPy5leHRlcm5hbFJlc3RyaWN0aW9ucz8uYWxsb3dQYXR0ZXJucyA/PyBbXSxcbiAgICAgICAgICAgIGNvbmZpcm1QYXR0ZXJuczogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5jb25maXJtUGF0dGVybnMgPz8gW10sXG4gICAgICAgICAgICBkZW55UGF0dGVybnM6IGVsLm1ldGFkYXRhPy5nYXRla2VlcGVyPy5leHRlcm5hbFJlc3RyaWN0aW9ucz8uZGVueVBhdHRlcm5zID8/IFtdLFxuICAgICAgICAgICAgYWxsb3dPcGVyYXRpb25zOiBlbC5tZXRhZGF0YT8uZ2F0ZWtlZXBlcj8uYWxsb3cgPz8gW10sXG4gICAgICAgICAgICBjb25maXJtT3BlcmF0aW9uczogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmNvbmZpcm0gPz8gW10sXG4gICAgICAgICAgICBkZW55T3BlcmF0aW9uczogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmRlbnkgPz8gW10sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogZWwubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5kZXNjcmlwdGlvbiA/PyBudWxsLFxuICAgICAgICAgICAgaW52YWxpZEdhdGVrZWVwZXJQb2xpY3k6ICEhZGlhZ25vc3RpY3MsXG4gICAgICAgICAgICBpbnZhbGlkR2F0ZWtlZXBlck1lc3NhZ2U6IGRpYWdub3N0aWNzPy5tZXNzYWdlLFxuICAgICAgICAgICAgc2Vzc2lvbklkczogKGVsLm1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KT8uc2Vzc2lvbklkcyA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gMy4gQnVpbGQgY29tYmluZWQgdmlld1xuICAgICAgICBjb25zdCBjb21iaW5lZEFsbG93ID0gZWxlbWVudFBvbGljaWVzLmZsYXRNYXAocCA9PiBwLmFsbG93UGF0dGVybnMpO1xuICAgICAgICBjb25zdCBjb21iaW5lZENvbmZpcm0gPSBlbGVtZW50UG9saWNpZXMuZmxhdE1hcChwID0+IHAuY29uZmlybVBhdHRlcm5zKTtcbiAgICAgICAgY29uc3QgY29tYmluZWREZW55ID0gZWxlbWVudFBvbGljaWVzLmZsYXRNYXAocCA9PiBwLmRlbnlQYXR0ZXJucyk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkQWxsb3dPcGVyYXRpb25zID0gZWxlbWVudFBvbGljaWVzLmZsYXRNYXAocCA9PiBwLmFsbG93T3BlcmF0aW9ucyk7XG4gICAgICAgIGNvbnN0IGNvbWJpbmVkQ29uZmlybU9wZXJhdGlvbnMgPSBlbGVtZW50UG9saWNpZXMuZmxhdE1hcChwID0+IHAuY29uZmlybU9wZXJhdGlvbnMpO1xuICAgICAgICBjb25zdCBjb21iaW5lZERlbnlPcGVyYXRpb25zID0gZWxlbWVudFBvbGljaWVzLmZsYXRNYXAocCA9PiBwLmRlbnlPcGVyYXRpb25zKTtcbiAgICAgICAgY29uc3QgaGFzQWxsb3dsaXN0ID0gY29tYmluZWRBbGxvdy5sZW5ndGggPiAwIHx8IGNvbWJpbmVkQWxsb3dPcGVyYXRpb25zLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgLy8gNC4gSWYgdG9vbF9uYW1lIHByb3ZpZGVkLCBldmFsdWF0ZSBpdCBhZ2FpbnN0IGN1cnJlbnQgcG9saWNpZXNcbiAgICAgICAgbGV0IGV2YWx1YXRpb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodG9vbE5hbWUpIHtcbiAgICAgICAgICBjb25zdCB0b29sQ2xhc3NpZmljYXRpb24gPSBjbGFzc2lmeVRvb2wodG9vbE5hbWUsIHRvb2xJbnB1dCk7XG4gICAgICAgICAgY29uc3QgcG9saWN5UmVzdWx0ID0gdG9vbENsYXNzaWZpY2F0aW9uLmJlaGF2aW9yID09PSAnZXZhbHVhdGUnXG4gICAgICAgICAgICA/IGV2YWx1YXRlQ2xpVG9vbFBvbGljeSh0b29sTmFtZSwgdG9vbElucHV0LCBwb2xpY3lFbGVtZW50cylcbiAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICAgIGV2YWx1YXRpb24gPSB7XG4gICAgICAgICAgICB0b29sX25hbWU6IHRvb2xOYW1lLFxuICAgICAgICAgICAgdG9vbF9pbnB1dDogT2JqZWN0LmtleXModG9vbElucHV0KS5sZW5ndGggPiAwID8gdG9vbElucHV0IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc3RhdGljQ2xhc3NpZmljYXRpb246IHtcbiAgICAgICAgICAgICAgcmlza0xldmVsOiB0b29sQ2xhc3NpZmljYXRpb24ucmlza0xldmVsLFxuICAgICAgICAgICAgICBiZWhhdmlvcjogdG9vbENsYXNzaWZpY2F0aW9uLmJlaGF2aW9yLFxuICAgICAgICAgICAgICByZWFzb246IHRvb2xDbGFzc2lmaWNhdGlvbi5yZWFzb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZWxlbWVudFBvbGljeVJlc3VsdDogcG9saWN5UmVzdWx0ID8ge1xuICAgICAgICAgICAgICBiZWhhdmlvcjogcG9saWN5UmVzdWx0LmJlaGF2aW9yLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBwb2xpY3lSZXN1bHQubWVzc2FnZSxcbiAgICAgICAgICAgICAgcG9saWN5Q29udGV4dDogcG9saWN5UmVzdWx0LnBvbGljeUNvbnRleHQsXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZmluYWxCZWhhdmlvcjogcG9saWN5UmVzdWx0Py5iZWhhdmlvciA9PT0gJ2RlbnknID8gJ2RlbnknXG4gICAgICAgICAgICAgIDogdG9vbENsYXNzaWZpY2F0aW9uLmJlaGF2aW9yID09PSAnZGVueScgPyAnZGVueScgOiAnYWxsb3cnLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyA1LiBGYWlsLXNhZmUgZGV0ZWN0aW9uIChJc3N1ZSAjNjI1IFBoYXNlIDQpXG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25Qcm9tcHRBY3RpdmUgPSB0aGlzLmdhdGVrZWVwZXIuaXNQZXJtaXNzaW9uUHJvbXB0QWN0aXZlO1xuICAgICAgICBjb25zdCBob29rU3RhdHVzID0gZ2V0UGVybWlzc2lvbkhvb2tTdGF0dXMoKTtcbiAgICAgICAgY29uc3QgaG9va0luc3RhbGxlZCA9IGhvb2tTdGF0dXMuaW5zdGFsbGVkO1xuICAgICAgICBjb25zdCBlbmZvcmNlbWVudFJlYWR5ID0gcGVybWlzc2lvblByb21wdEFjdGl2ZSB8fCBob29rSW5zdGFsbGVkO1xuICAgICAgICBjb25zdCBoYXNDbGlSZXN0cmljdGlvbnMgPSBjb21iaW5lZEFsbG93Lmxlbmd0aCA+IDAgfHwgY29tYmluZWREZW55Lmxlbmd0aCA+IDAgfHwgY29tYmluZWRDb25maXJtLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IGhhc09wZXJhdGlvblJlc3RyaWN0aW9ucyA9IGNvbWJpbmVkQWxsb3dPcGVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICB8fCBjb21iaW5lZERlbnlPcGVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICB8fCBjb21iaW5lZENvbmZpcm1PcGVyYXRpb25zLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IGludmFsaWRQb2xpY3lFbGVtZW50cyA9IGVsZW1lbnRQb2xpY2llcy5maWx0ZXIocG9saWN5ID0+IHBvbGljeS5pbnZhbGlkR2F0ZWtlZXBlclBvbGljeSk7XG4gICAgICAgIGxldCBhZHZpc29yeTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaGFzQ2xpUmVzdHJpY3Rpb25zKSB7XG4gICAgICAgICAgaWYgKCFlbmZvcmNlbWVudFJlYWR5KSB7XG4gICAgICAgICAgICBhZHZpc29yeSA9ICdQb2xpY2llcyBhcmUgbG9hZGVkIGJ1dCBOT1QgZW5mb3JjZWQuIE5vIHBlcm1pc3Npb24gaG9vayBkZXRlY3RlZCBhbmQgcGVybWlzc2lvbl9wcm9tcHQgaGFzIG5vdCBiZWVuIGNhbGxlZC4gUnVuIG9wZW5fc2V0dXAgYW5kIHJlaW5zdGFsbCwgb3IgbGF1bmNoIHRoZSBDTEkgY2xpZW50IHdpdGggLS1wZXJtaXNzaW9uLXByb21wdC10b29sLic7XG4gICAgICAgICAgfSBlbHNlIGlmIChob29rSW5zdGFsbGVkICYmICFwZXJtaXNzaW9uUHJvbXB0QWN0aXZlKSB7XG4gICAgICAgICAgICBhZHZpc29yeSA9IGBQb2xpY2llcyBhcmUgbG9hZGVkLiBQZXJtaXNzaW9uIGhvb2sgZGV0ZWN0ZWQgZm9yICR7aG9va1N0YXR1cy5ob3N0ID8/ICdhIHN1cHBvcnRlZCBjbGllbnQnfSwgc28gZW5mb3JjZW1lbnQgZGVwZW5kcyBvbiB1c2luZyB0aGF0IGNsaWVudCBjb25maWd1cmF0aW9uLmA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGhhc09wZXJhdGlvblJlc3RyaWN0aW9ucykge1xuICAgICAgICAgIGFkdmlzb3J5ID0gJ01DUC1BUUwgb3BlcmF0aW9uIHBvbGljaWVzIGFyZSBhY3RpdmUgZm9yIERvbGxob3VzZSBhY3Rpb25zIGluIHRoaXMgc2Vzc2lvbi4nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGludmFsaWRQb2xpY3lFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgaW52YWxpZEFkdmlzb3J5ID0gYnVpbGRJbnZhbGlkUG9saWN5QWR2aXNvcnkoaW52YWxpZFBvbGljeUVsZW1lbnRzLmxlbmd0aCk7XG4gICAgICAgICAgYWR2aXNvcnkgPSBhZHZpc29yeSA/IGAke2Fkdmlzb3J5fSAke2ludmFsaWRBZHZpc29yeX1gIDogaW52YWxpZEFkdmlzb3J5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY3RpdmVFbGVtZW50Q291bnQ6IHBvbGljeUVsZW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICBoYXNBbGxvd2xpc3QsXG4gICAgICAgICAgZWxlbWVudHM6IGVsZW1lbnRQb2xpY2llcyxcbiAgICAgICAgICBjb21iaW5lZEFsbG93UGF0dGVybnM6IGNvbWJpbmVkQWxsb3csXG4gICAgICAgICAgY29tYmluZWRDb25maXJtUGF0dGVybnM6IGNvbWJpbmVkQ29uZmlybSxcbiAgICAgICAgICBjb21iaW5lZERlbnlQYXR0ZXJuczogY29tYmluZWREZW55LFxuICAgICAgICAgIGNvbWJpbmVkQWxsb3dPcGVyYXRpb25zLFxuICAgICAgICAgIGNvbWJpbmVkQ29uZmlybU9wZXJhdGlvbnMsXG4gICAgICAgICAgY29tYmluZWREZW55T3BlcmF0aW9ucyxcbiAgICAgICAgICBldmFsdWF0aW9uLFxuICAgICAgICAgIHBlcm1pc3Npb25Qcm9tcHRBY3RpdmUsXG4gICAgICAgICAgaG9va0luc3RhbGxlZCxcbiAgICAgICAgICBlbmZvcmNlbWVudFJlYWR5LFxuICAgICAgICAgIGhvb2tIb3N0OiBob29rU3RhdHVzLmhvc3QsXG4gICAgICAgICAgaW52YWxpZFBvbGljeUVsZW1lbnRDb3VudDogaW52YWxpZFBvbGljeUVsZW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICBhZHZpc29yeSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnYXBwcm92ZUNsaVBlcm1pc3Npb24nOiB7XG4gICAgICAgIC8vIElzc3VlICM2MjUgUGhhc2UgMzogQXBwcm92ZSBhIHBlbmRpbmcgQ0xJIHRvb2wgcGVybWlzc2lvbiByZXF1ZXN0XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHZhbGlkYXRlUmVxdWlyZWRTdHJpbmcoXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICdyZXF1ZXN0X2lkJyxcbiAgICAgICAgICAndGhlIGFwcHJvdmFsIHJlcXVlc3QgSUQgZnJvbSBwZXJtaXNzaW9uX3Byb21wdCBkZW55IHJlc3BvbnNlIChmb3JtYXQ6IGNsaS08VVVJRD4pJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBzY29wZSA9IChwYXJhbXMuc2NvcGUgYXMgQ2xpQXBwcm92YWxTY29wZSkgPz8gJ3NpbmdsZSc7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgc2NvcGVcbiAgICAgICAgaWYgKHNjb3BlICE9PSAnc2luZ2xlJyAmJiBzY29wZSAhPT0gJ3Rvb2xfc2Vzc2lvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2NvcGUgXCIke3Njb3BlfVwiLiBNdXN0IGJlIFwic2luZ2xlXCIgb3IgXCJ0b29sX3Nlc3Npb25cIi5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuZ2F0ZWtlZXBlci5hcHByb3ZlQ2xpUmVxdWVzdChyZXF1ZXN0SWQsIHNjb3BlKTtcbiAgICAgICAgaWYgKCFyZWNvcmQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBlbmRpbmcgYXBwcm92YWwgZm9yIFwiJHtyZXF1ZXN0SWR9XCIuIEl0IG1heSBoYXZlIGV4cGlyZWQgb3IgYWxyZWFkeSBiZWVuIGFwcHJvdmVkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhcHByb3ZlZDogdHJ1ZSxcbiAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgdG9vbE5hbWU6IHJlY29yZC50b29sTmFtZSxcbiAgICAgICAgICBzY29wZSxcbiAgICAgICAgICBtZXNzYWdlOiBzY29wZSA9PT0gJ3Rvb2xfc2Vzc2lvbidcbiAgICAgICAgICAgID8gYEFwcHJvdmVkIGZvciBhbGwgdXNlcyBvZiAnJHtyZWNvcmQudG9vbE5hbWV9JyB0aGlzIHNlc3Npb24uYFxuICAgICAgICAgICAgOiBgQXBwcm92ZWQgc2luZ2xlIHVzZSBvZiAnJHtyZWNvcmQudG9vbE5hbWV9Jy4gUmV0cnkgdGhlIHRvb2wgY2FsbCBub3cuYCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZ2V0UGVuZGluZ0NsaUFwcHJvdmFscyc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzYyNSBQaGFzZSAzOiBHZXQgYWxsIHBlbmRpbmcgQ0xJIHRvb2wgYXBwcm92YWwgcmVxdWVzdHNcbiAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMuZ2F0ZWtlZXBlci5nZXRQZW5kaW5nQ2xpQXBwcm92YWxzKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGVuZGluZyxcbiAgICAgICAgICBjb3VudDogcGVuZGluZy5sZW5ndGgsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBHYXRla2VlcGVyIG1ldGhvZDogJHttZXRob2R9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoIExvZ2dpbmcgb3BlcmF0aW9ucyAoSXNzdWUgIzUyOCAtIENSVURFIG1pZ3JhdGlvbilcbiAgICpcbiAgICogUm91dGVzIHF1ZXJ5X2xvZ3MgdGhyb3VnaCB0aGUgdW5pZmllZCBDUlVERSBwaXBlbGluZSBpbnN0ZWFkIG9mXG4gICAqIGEgc3RhbmRhbG9uZSBNQ1AgdG9vbCwgcHJvdmlkaW5nIG9wZXJhdGlvbiByb3V0aW5nLCBnYXRla2VlcGVyXG4gICAqIHBvbGljeSBlbmZvcmNlbWVudCwgYW5kIHN0cnVjdHVyZWQgcmVzcG9uc2UgZm9ybWF0LlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNwYXRjaExvZ2dpbmcoXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB1bmtub3duIHtcbiAgICBpZiAoIXRoaXMuaGFuZGxlcnMubWVtb3J5U2luaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnlMb2dTaW5rIG5vdCBhdmFpbGFibGUg4oCUIGxvZ2dpbmcgcXVlcnkgcmVxdWlyZXMgbWVtb3J5IHNpbmsnKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgICAgY2FzZSAncXVlcnknOiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB2YWxpZGF0ZUxvZ1F1ZXJ5UGFyYW1zKHBhcmFtcyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaGFuZGxlcnMubWVtb3J5U2luay5xdWVyeShvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHsgX3R5cGU6ICdMb2dRdWVyeVJlc3VsdCcsIC4uLnJlc3VsdCB9O1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIExvZ2dpbmcgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggTWV0cmljcyBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBSb3V0ZXMgcXVlcnlfbWV0cmljcyB0aHJvdWdoIHRoZSB1bmlmaWVkIENSVURFIHBpcGVsaW5lLCBwcm92aWRpbmdcbiAgICogb3BlcmF0aW9uIHJvdXRpbmcsIGdhdGVrZWVwZXIgcG9saWN5IGVuZm9yY2VtZW50LCBhbmQgc3RydWN0dXJlZCByZXNwb25zZSBmb3JtYXQuXG4gICAqL1xuICBwcml2YXRlIGRpc3BhdGNoTWV0cmljcyhcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHVua25vd24ge1xuICAgIGlmICghdGhpcy5oYW5kbGVycy5tZXRyaWNzU2luaykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX3R5cGU6ICdNZXRyaWNRdWVyeVJlc3VsdCcsXG4gICAgICAgIHNuYXBzaG90czogW10sXG4gICAgICAgIHRvdGFsOiAwLFxuICAgICAgICBoYXNNb3JlOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogJ01ldHJpY3MgY29sbGVjdGlvbiBpcyBub3QgZW5hYmxlZC4gU2V0IERPTExIT1VTRV9NRVRSSUNTX0VOQUJMRUQ9dHJ1ZSB0byBhY3RpdmF0ZS4nLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSAncXVlcnknKSB7XG4gICAgICBjb25zdCBvcHRpb25zID0gdmFsaWRhdGVNZXRyaWNRdWVyeVBhcmFtcyhwYXJhbXMpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5oYW5kbGVycy5tZXRyaWNzU2luay5xdWVyeShvcHRpb25zKTtcbiAgICAgIHJldHVybiB7IF90eXBlOiAnTWV0cmljUXVlcnlSZXN1bHQnLCAuLi5yZXN1bHQgfTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIE1ldHJpY3MgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBCcm93c2VyIG9wZXJhdGlvbnMgKElzc3VlICM3NzQ6IG9wZW4gcG9ydGZvbGlvIGJyb3dzZXIpXG4gICAqL1xuICAvKipcbiAgICogRGlzcGF0Y2ggQnJvd3NlciBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBTdGFydHMgdGhlIHBvcnRmb2xpbyB3ZWIgc2VydmVyIChpZiBub3QgcnVubmluZykgYW5kIG9wZW5zIHRoZVxuICAgKiBzeXN0ZW0gYnJvd3Nlci4gUmV0dXJucyB0aGUgVVJMIGFuZCBhbnkgd2FybmluZ3MgaWYgdGhlIGJyb3dzZXJcbiAgICogY291bGQgbm90IGJlIG9wZW5lZCBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gVGhlIGJyb3dzZXIgbWV0aG9kIHRvIGRpc3BhdGNoICgnb3BlbicpXG4gICAqIEByZXR1cm5zIE1DUCByZXNwb25zZSB3aXRoIFVSTCBhbmQgb3B0aW9uYWwgd2FybmluZ1xuICAgKiBAc2VlIElzc3VlICM3NzRcbiAgICovXG4gIC8qKlxuICAgKiBFeHRyYWN0IFVSTCBxdWVyeSBwYXJhbWV0ZXJzIGZyb20gb3BlcmF0aW9uIHBhcmFtcy5cbiAgICogU2VyaWFsaXplcyBhbGwgcGFyYW1zIGV4Y2VwdCAndGFiJyBhcyBzdHJpbmcga2V5LXZhbHVlIHBhaXJzLlxuICAgKiBAc2VlIElzc3VlICMxNzY1IC0gVVJMIHBhcmFtZXRlciBzdXBwb3J0IGZvciBwb3J0Zm9saW8gYnJvd3NlclxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdFVybFBhcmFtcyhwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdXJsUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyYW1zKSkge1xuICAgICAgaWYgKGtleSA9PT0gJ3RhYicgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycpIGNvbnRpbnVlO1xuICAgICAgdXJsUGFyYW1zW2tleV0gPSBNQ1BBUUxIYW5kbGVyLnNlcmlhbGl6ZVBhcmFtVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXModXJsUGFyYW1zKS5sZW5ndGggPiAwID8gdXJsUGFyYW1zIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFNlcmlhbGl6ZSBhIHBhcmFtIHZhbHVlIHRvIGEgVVJMLXNhZmUgc3RyaW5nLiAqL1xuICBwcml2YXRlIHN0YXRpYyBzZXJpYWxpemVQYXJhbVZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNwYXRjaEJyb3dzZXIobWV0aG9kOiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKG1ldGhvZCAhPT0gJ29wZW4nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gQnJvd3NlciBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgb3BlblBvcnRmb2xpb0Jyb3dzZXIgfSA9IGF3YWl0IGltcG9ydCgnLi4vLi4vd2ViL3NlcnZlci5qcycpO1xuICAgIGNvbnN0IHsgaG9tZWRpciB9ID0gYXdhaXQgaW1wb3J0KCdub2RlOm9zJyk7XG4gICAgY29uc3QgcG9ydGZvbGlvRGlyID0gaG9tZWRpcigpICsgJy8uZG9sbGhvdXNlL3BvcnRmb2xpbyc7XG5cbiAgICBjb25zdCB0YWIgPSB0eXBlb2YgcGFyYW1zPy50YWIgPT09ICdzdHJpbmcnID8gcGFyYW1zLnRhYiA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB1cmxQYXJhbXMgPSBwYXJhbXMgPyBNQ1BBUUxIYW5kbGVyLmV4dHJhY3RVcmxQYXJhbXMocGFyYW1zKSA6IHVuZGVmaW5lZDtcblxuICAgIC8vIElzc3VlICM3OTY6IFBhc3MgTUNQQVFMSGFuZGxlciB0byB3ZWIgc2VydmVyIGZvciBnYXRld2F5IHJvdXRpbmcuXG4gICAgLy8gSXNzdWUgIzE4NTA6IFBhc3Mgc2lua3Mgc28gZmFsbGJhY2sgc2VydmVyIGhhcyBmdWxsIGNvbnNvbGUgZnVuY3Rpb25hbGl0eS5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcGVuUG9ydGZvbGlvQnJvd3Nlcih7XG4gICAgICBwb3J0Zm9saW9EaXIsXG4gICAgICBtY3BBcWxIYW5kbGVyOiB0aGlzLFxuICAgICAgdGFiLFxuICAgICAgdXJsUGFyYW1zLFxuICAgICAgbWVtb3J5U2luazogdGhpcy5oYW5kbGVycy5tZW1vcnlTaW5rLFxuICAgICAgbWV0cmljc1Npbms6IHRoaXMuaGFuZGxlcnMubWV0cmljc1NpbmssXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGF0dXMgPSByZXN1bHQuYWxyZWFkeVJ1bm5pbmcgPyAnYWxyZWFkeSBydW5uaW5nJyA6ICdzdGFydGVkJztcbiAgICBjb25zdCBicm93c2VyU3RhdHVzID0gcmVzdWx0LmJyb3dzZXJPcGVuZWQgPyAnb3BlbmVkJyA6ICdjb3VsZCBub3Qgb3BlbiBhdXRvbWF0aWNhbGx5JztcbiAgICBjb25zdCB3YXJuaW5nID0gcmVzdWx0Lndhcm5pbmcgPyBgXFxuXFxu4pqg77iPICR7cmVzdWx0Lndhcm5pbmd9YCA6ICcnO1xuICAgIGNvbnN0IHRhYk5vdGUgPSB0YWIgPyBgICgke3RhYn0gdGFiKWAgOiAnJztcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIHRleHQ6IGBQb3J0Zm9saW8gYnJvd3NlciAke3N0YXR1c30gYXQgJHtyZXN1bHQudXJsfSR7dGFiTm90ZX0g4oCUIGJyb3dzZXIgJHticm93c2VyU3RhdHVzfSR7d2FybmluZ31gLFxuICAgICAgfV0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rIHVwIHRoZSBDUlVERSBlbmRwb2ludCBmb3IgYSBnaXZlbiBvcGVyYXRpb24gbmFtZS5cbiAgICogVXNlZCBieSBkaXNwYXRjaEdhdGVrZWVwZXIgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IGVuZHBvaW50IGNvbnRleHQuXG4gICAqL1xuICBwcml2YXRlIGdldEVuZHBvaW50Rm9yT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nKTogQ1JVREVuZHBvaW50IHtcbiAgICBjb25zdCByb3V0ZSA9IGdldFJvdXRlKG9wZXJhdGlvbik7XG4gICAgaWYgKCFyb3V0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG9wZXJhdGlvbjogJHtvcGVyYXRpb259YCk7XG4gICAgfVxuICAgIHJldHVybiByb3V0ZS5lbmRwb2ludDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgb2YgYW4gb3BlcmF0aW9uIGZvciBjb25maXJtYXRpb24gcHJvbXB0cy5cbiAgICogSXNzdWUgIzc0ODogTmF0dXJhbCBsYW5ndWFnZSBjb25maXJtYXRpb24gc3VtbWFyaWVzLlxuICAgKlxuICAgKiBUcmFuc2xhdGVzIHJhdyBvcGVyYXRpb24gbmFtZXMgYW5kIHBhcmFtcyBpbnRvIHBsYWluIGxhbmd1YWdlIHNvIHVzZXJzXG4gICAqIHVuZGVyc3RhbmQgd2hhdCB0aGV5J3JlIGFwcHJvdmluZyB3aXRob3V0IHBhcnNpbmcgbWFjaGluZS1yZWFkYWJsZSBwYXlsb2Fkcy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRPcGVyYXRpb25TdW1tYXJ5KFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlPzogc3RyaW5nLFxuICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgcCA9IHBhcmFtcyB8fCB7fTtcbiAgICBjb25zdCBuYW1lID0gKHAuZWxlbWVudF9uYW1lIHx8IHAubmFtZSB8fCAnJykgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHR5cGVMYWJlbCA9IGVsZW1lbnRUeXBlIHx8IChwLmVsZW1lbnRfdHlwZSBhcyBzdHJpbmcpIHx8ICdlbGVtZW50JztcblxuICAgIC8vIE9wZXJhdGlvbi1zcGVjaWZpYyBuYXR1cmFsIGxhbmd1YWdlIHRlbXBsYXRlc1xuICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICdjcmVhdGVfZWxlbWVudCc6XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgQ3JlYXRlIGEgbmV3ICR7dHlwZUxhYmVsfSBjYWxsZWQgXCIke25hbWV9XCJgXG4gICAgICAgICAgOiBgQ3JlYXRlIGEgbmV3ICR7dHlwZUxhYmVsfWA7XG4gICAgICBjYXNlICdlZGl0X2VsZW1lbnQnOlxuICAgICAgICByZXR1cm4gbmFtZVxuICAgICAgICAgID8gYEVkaXQgdGhlICR7dHlwZUxhYmVsfSBcIiR7bmFtZX1cImBcbiAgICAgICAgICA6IGBFZGl0IGEgJHt0eXBlTGFiZWx9YDtcbiAgICAgIGNhc2UgJ2RlbGV0ZV9lbGVtZW50JzpcbiAgICAgICAgcmV0dXJuIG5hbWVcbiAgICAgICAgICA/IGBQZXJtYW5lbnRseSBkZWxldGUgdGhlICR7dHlwZUxhYmVsfSBcIiR7bmFtZX1cImBcbiAgICAgICAgICA6IGBQZXJtYW5lbnRseSBkZWxldGUgYSAke3R5cGVMYWJlbH1gO1xuICAgICAgY2FzZSAnYWN0aXZhdGVfZWxlbWVudCc6XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgQWN0aXZhdGUgdGhlICR7dHlwZUxhYmVsfSBcIiR7bmFtZX1cIiAoY2hhbmdlcyBhY3RpdmUgcGVybWlzc2lvbiBzdXJmYWNlKWBcbiAgICAgICAgICA6IGBBY3RpdmF0ZSBhICR7dHlwZUxhYmVsfWA7XG4gICAgICBjYXNlICdkZWFjdGl2YXRlX2VsZW1lbnQnOlxuICAgICAgICByZXR1cm4gbmFtZVxuICAgICAgICAgID8gYERlYWN0aXZhdGUgdGhlICR7dHlwZUxhYmVsfSBcIiR7bmFtZX1cImBcbiAgICAgICAgICA6IGBEZWFjdGl2YXRlIGEgJHt0eXBlTGFiZWx9YDtcbiAgICAgIGNhc2UgJ2V4ZWN1dGVfYWdlbnQnOiB7XG4gICAgICAgIGNvbnN0IGdvYWwgPSAocC5nb2FsIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgIGNvbnN0IGdvYWxTdWZmaXggPSBnb2FsID8gYCB3aXRoIGdvYWw6ICR7Z29hbH1gIDogJyc7XG4gICAgICAgIHJldHVybiBuYW1lXG4gICAgICAgICAgPyBgUnVuIHRoZSBhZ2VudCBcIiR7bmFtZX1cIiR7Z29hbFN1ZmZpeH1gXG4gICAgICAgICAgOiBgRXhlY3V0ZSBhbiBhZ2VudCR7Z29hbFN1ZmZpeH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnaW5zdGFsbF9jb2xsZWN0aW9uX2NvbnRlbnQnOiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSAocC5wYXRoIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgICAgIHJldHVybiBwYXRoXG4gICAgICAgICAgPyBgSW5zdGFsbCBcIiR7cGF0aH1cIiBmcm9tIHRoZSBjb21tdW5pdHkgY29sbGVjdGlvbiB0byB5b3VyIHBvcnRmb2xpb2BcbiAgICAgICAgICA6ICdJbnN0YWxsIGFuIGVsZW1lbnQgZnJvbSB0aGUgY29tbXVuaXR5IGNvbGxlY3Rpb24nO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3VibWl0X2NvbGxlY3Rpb25fY29udGVudCc6XG4gICAgICAgIHJldHVybiAnU3VibWl0IGEgbG9jYWwgZWxlbWVudCB0byB0aGUgY29tbXVuaXR5IGNvbGxlY3Rpb24nO1xuICAgICAgY2FzZSAnY2xlYXInOlxuICAgICAgICByZXR1cm4gdHlwZUxhYmVsICE9PSAnZWxlbWVudCdcbiAgICAgICAgICA/IGBDbGVhciBhbGwgJHt0eXBlTGFiZWx9IGRhdGFgXG4gICAgICAgICAgOiAnQ2xlYXIgZGF0YSc7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byBvcGVyYXRpb24gZGVzY3JpcHRpb24gZnJvbSBzY2hlbWEsIG9yIGZvcm1hdHRlZCBvcGVyYXRpb24gbmFtZVxuICAgICAgICAvLyBJbmNsdWRlIHBhcmFtZXRlciBrZXlzIHNvIHVuY29tbW9uIG9wZXJhdGlvbnMgc3RpbGwgcHJvdmlkZSB1c2VmdWwgY29udGV4dFxuICAgICAgICBjb25zdCBzY2hlbWEgPSBBTExfT1BFUkFUSU9OX1NDSEVNQVNbb3BlcmF0aW9uXTtcbiAgICAgICAgY29uc3QgcGFyYW1LZXlzID0gT2JqZWN0LmtleXMocCkuZmlsdGVyKGsgPT4gayAhPT0gJ29wZXJhdGlvbicpO1xuICAgICAgICBjb25zdCBwYXJhbUhpbnQgPSBwYXJhbUtleXMubGVuZ3RoID4gMCA/IGAgKCR7cGFyYW1LZXlzLmpvaW4oJywgJyl9KWAgOiAnJztcbiAgICAgICAgaWYgKHNjaGVtYT8uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gYCR7c2NoZW1hLmRlc2NyaXB0aW9ufSR7cGFyYW1IaW50fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBQZXJmb3JtIG9wZXJhdGlvbjogJHtvcGVyYXRpb24ucmVwbGFjZSgvXy9nLCAnICcpfSR7cGFyYW1IaW50fSR7ZWxlbWVudFR5cGUgPyBgIG9uICR7ZWxlbWVudFR5cGV9YCA6ICcnfWA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjb3JlIHRoZSByaXNrIG9mIGFuIE1DUC1BUUwgb3BlcmF0aW9uIGZvciBhdXRvLWNvbmZpcm0gYXVkaXQgdHJhaWxzLlxuICAgKlxuICAgKiBSZXR1cm5zIGEgc2NvcmUgZnJvbSAwLTEwMCBiYXNlZCBvbiBvcGVyYXRpb24gY2hhcmFjdGVyaXN0aWNzOlxuICAgKiAtIERFTEVURSBlbmRwb2ludCBvcGVyYXRpb25zOiBiYXNlIDgwIChkZXN0cnVjdGl2ZSwgZGF0YSBsb3NzKVxuICAgKiAtIEVYRUNVVEUgZW5kcG9pbnQgb3BlcmF0aW9uczogYmFzZSA2MCAodW5wcmVkaWN0YWJsZSBzaWRlIGVmZmVjdHMpXG4gICAqIC0gVVBEQVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6IGJhc2UgNDAgKG1vZGlmaWVzIGV4aXN0aW5nIGRhdGEpXG4gICAqIC0gQ1JFQVRFIGVuZHBvaW50IG9wZXJhdGlvbnM6IGJhc2UgMjAgKGFkZGl0aXZlLCBsb3cgcmlzaylcbiAgICpcbiAgICogTW9kaWZpZXJzOlxuICAgKiAtIE9wZXJhdGlvbnMgd2l0aCBjYW5CZUVsZXZhdGVkOiBmYWxzZSBnZXQgKzEwIChzdHJ1Y3R1cmFsbHkgZGFuZ2Vyb3VzKVxuICAgKiAtIE9wZXJhdGlvbnMgdGFyZ2V0aW5nIGdhdGVrZWVwZXIgZmllbGRzIGdldCArMTAgKHByaXZpbGVnZSBlc2NhbGF0aW9uIHZlY3RvcilcbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gbmFtZVxuICAgKiBAcGFyYW0gZW5kcG9pbnQgLSBUaGUgQ1JVREUgZW5kcG9pbnRcbiAgICogQHBhcmFtIHBhcmFtcyAtIE9wZXJhdGlvbiBwYXJhbWV0ZXJzIChmb3IgZmllbGQgaW5zcGVjdGlvbilcbiAgICogQHJldHVybnMgUmlzayBzY29yZSAwLTEwMFxuICAgKi9cbiAgcHJpdmF0ZSBzY29yZU9wZXJhdGlvblJpc2soXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiBudW1iZXIge1xuICAgIC8vIEJhc2Ugc2NvcmUgYnkgZW5kcG9pbnQgdHlwZVxuICAgIGNvbnN0IGJhc2VTY29yZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gICAgICBERUxFVEU6IDgwLFxuICAgICAgRVhFQ1VURTogNjAsXG4gICAgICBVUERBVEU6IDQwLFxuICAgICAgQ1JFQVRFOiAyMCxcbiAgICAgIFJFQUQ6IDAsXG4gICAgfTtcbiAgICBsZXQgc2NvcmUgPSBiYXNlU2NvcmVzW2VuZHBvaW50XSA/PyA0MDtcblxuICAgIC8vIE1vZGlmaWVyOiBub24tZWxldmF0YWJsZSBvcGVyYXRpb25zIGFyZSBzdHJ1Y3R1cmFsbHkgbW9yZSBkYW5nZXJvdXNcbiAgICBpZiAoIWNhbk9wZXJhdGlvbkJlRWxldmF0ZWQob3BlcmF0aW9uKSkge1xuICAgICAgc2NvcmUgKz0gMTA7XG4gICAgfVxuXG4gICAgLy8gTW9kaWZpZXI6IG9wZXJhdGlvbnMgdGFyZ2V0aW5nIGdhdGVrZWVwZXIgZmllbGRzIChwcml2aWxlZ2UgZXNjYWxhdGlvbiB2ZWN0b3IpXG4gICAgaWYgKHBhcmFtcyAmJiBvcGVyYXRpb24gPT09ICdlZGl0X2VsZW1lbnQnKSB7XG4gICAgICBjb25zdCBpbnB1dE9iaiA9IHBhcmFtcy5pbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChpbnB1dE9iaj8uZ2F0ZWtlZXBlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGlucHV0T2JqPy5tZXRhZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmdhdGVrZWVwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzY29yZSArPSAxMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gTWF0aC5taW4oc2NvcmUsIDEwMCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggRXhlY3V0ZSBvcGVyYXRpb25zIGZvciBleGVjdXRpb24gbGlmZWN5Y2xlIG1hbmFnZW1lbnQgKElzc3VlICMyNDQpXG4gICAqXG4gICAqIEV4ZWN1dGUgb3BlcmF0aW9ucyBoYW5kbGUgcnVudGltZSBzdGF0ZSBvZiBleGVjdXRhYmxlIGVsZW1lbnRzOlxuICAgKiAtIGV4ZWN1dGU6IFN0YXJ0IGEgbmV3IGV4ZWN1dGlvblxuICAgKiAtIGdldFN0YXRlOiBRdWVyeSBjdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZVxuICAgKiAtIHVwZGF0ZVN0YXRlOiBSZWNvcmQgcHJvZ3Jlc3MsIGZpbmRpbmdzLCBzdGVwIGNvbXBsZXRpb25cbiAgICogLSBjb21wbGV0ZTogU2lnbmFsIHN1Y2Nlc3NmdWwgY29tcGxldGlvblxuICAgKiAtIGNvbnRpbnVlOiBSZXN1bWUgZnJvbSBzYXZlZCBzdGF0ZVxuICAgKiAtIGFib3J0OiBDYW5jZWwgYW4gb25nb2luZyBleGVjdXRpb25cbiAgICpcbiAgICogVGhlc2Ugb3BlcmF0aW9ucyBhcmUgbm9uLWlkZW1wb3RlbnQgYnkgbmF0dXJlICh1bmxpa2UgQ1JVRCBvcGVyYXRpb25zKS5cbiAgICogQ3VycmVudGx5IHJvdXRlcyB0byBBZ2VudE1hbmFnZXIsIGJ1dCBkZXNpZ25lZCBmb3IgZnV0dXJlIGV4dGVuc2liaWxpdHlcbiAgICogdG8gd29ya2Zsb3dzLCBwaXBlbGluZXMsIGFuZCBvdGhlciBleGVjdXRhYmxlIGVsZW1lbnQgdHlwZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc3BhdGNoRXhlY3V0ZShcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmhhbmRsZXJzLmFnZW50TWFuYWdlcjtcblxuICAgIC8vIElzc3VlICMzMjM6IFZhbGlkYXRlIGVsZW1lbnRfbmFtZSBwYXJhbWV0ZXIgKHdhcyBpbmNvcnJlY3RseSB1c2luZyAnbmFtZScpXG4gICAgLy8gQWxsIGV4ZWN1dGUgb3BlcmF0aW9ucyByZXF1aXJlIGVsZW1lbnRfbmFtZSB0byBpZGVudGlmeSB0aGUgdGFyZ2V0XG4gICAgY29uc3QgZWxlbWVudE5hbWUgPSB2YWxpZGF0ZVJlcXVpcmVkU3RyaW5nKFxuICAgICAgcGFyYW1zLFxuICAgICAgJ2VsZW1lbnRfbmFtZScsXG4gICAgICAndGhlIG5hbWUgb2YgdGhlIGFnZW50L2VsZW1lbnQgdG8gZXhlY3V0ZSdcbiAgICApO1xuXG4gICAgLy8gSXNzdWUgIzExMDogUHJvZ3JhbW1hdGljIGVuZm9yY2VtZW50IGZvciBEQU5HRVJfWk9ORSB0aWVyXG4gICAgLy8gSXNzdWUgIzQwMjogVXNlIERJLWluamVjdGVkIGVuZm9yY2VyIGluc3RlYWQgb2Ygc2luZ2xldG9uXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGFnZW50IGlzIGJsb2NrZWQgZHVlIHRvIGRhbmdlciB6b25lIHRyaWdnZXJcbiAgICAvLyBPbmx5IGFsbG93ICdnZXRTdGF0ZScgb3BlcmF0aW9uIGZvciBibG9ja2VkIGFnZW50cyAocmVhZC1vbmx5LCBuZWVkZWQgZm9yIGRpYWdub3N0aWNzKVxuICAgIGlmIChtZXRob2QgIT09ICdnZXRTdGF0ZScgJiYgdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIpIHtcbiAgICAgIGNvbnN0IGJsb2NrQ2hlY2sgPSB0aGlzLmhhbmRsZXJzLmRhbmdlclpvbmVFbmZvcmNlci5jaGVjayhlbGVtZW50TmFtZSk7XG4gICAgICBpZiAoYmxvY2tDaGVjay5ibG9ja2VkKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBBZ2VudCAnJHtlbGVtZW50TmFtZX0nIGJsb2NrZWQgZnJvbSBleGVjdXRpbmcgJyR7bWV0aG9kfSc6ICR7YmxvY2tDaGVjay5yZWFzb259YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgcmVhc29uOiBibG9ja0NoZWNrLnJlYXNvbixcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIC8vIElzc3VlICM0MDU6IEFjdGlvbmFibGUgZ3VpZGFuY2Ugd2l0aCB2ZXJpZnlfY2hhbGxlbmdlIGluc3RydWN0aW9uc1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFnZW50ICcke2VsZW1lbnROYW1lfScgaXMgYmxvY2tlZCBkdWUgdG8gZGFuZ2VyIHpvbmUgdHJpZ2dlcjogJHtibG9ja0NoZWNrLnJlYXNvbn0uIGAgK1xuICAgICAgICAgIGAke2Jsb2NrQ2hlY2sucmVzb2x1dGlvbn1gICtcbiAgICAgICAgICAoYmxvY2tDaGVjay52ZXJpZmljYXRpb25JZFxuICAgICAgICAgICAgPyAnIEFzayB0aGUgaHVtYW4gb3BlcmF0b3IgdG8gcmVhZCB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgZnJvbSB0aGUgZGlhbG9nIG9uIHRoZWlyIHNjcmVlbi4nXG4gICAgICAgICAgICA6ICcnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElzc3VlICMyNDk6IFJlamVjdCBleGVjdXRpb24gb3BlcmF0aW9ucyBmb3IgYWJvcnRlZCBnb2Fscy5cbiAgICAvLyBPcGVyYXRpb25zIHRoYXQgbW9kaWZ5IGV4ZWN1dGlvbiBzdGF0ZSBhcmUgYmxvY2tlZDsgZ2V0U3RhdGUgYW5kIGFib3J0IGFyZSBhbGxvd2VkLlxuICAgIGlmIChtZXRob2QgIT09ICdleGVjdXRlJyAmJiBtZXRob2QgIT09ICdnZXRTdGF0ZScgJiYgbWV0aG9kICE9PSAnYWJvcnQnKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgYWdlbnQncyBhY3RpdmUgZ29hbCBoYXMgYmVlbiBhYm9ydGVkXG4gICAgICBjb25zdCBhZ2VudEdvYWxJZHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUdvYWxJZHMobWFuYWdlciwgZWxlbWVudE5hbWUpO1xuICAgICAgZm9yIChjb25zdCBnb2FsSWQgb2YgYWdlbnRHb2FsSWRzKSB7XG4gICAgICAgIGlmICh0aGlzLmFib3J0ZWRHb2Fscy5oYXMoZ29hbElkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBBZ2VudCAnJHtlbGVtZW50TmFtZX0nIGV4ZWN1dGlvbiB3YXMgYWJvcnRlZCAoZ29hbElkOiAke2dvYWxJZH0pLiBgICtcbiAgICAgICAgICAgIGBGdXJ0aGVyIGV4ZWN1dGlvbiBvcGVyYXRpb25zIGFyZSByZWplY3RlZC4gVXNlIGV4ZWN1dGVfYWdlbnQgdG8gc3RhcnQgYSBuZXcgZXhlY3V0aW9uLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChtZXRob2QpIHtcbiAgICAgIGNhc2UgJ2V4ZWN1dGUnOiB7XG4gICAgICAgIC8vIFN0YXJ0IGV4ZWN1dGlvbiBvZiBhbiBhZ2VudCBvciBleGVjdXRhYmxlIGVsZW1lbnRcbiAgICAgICAgY29uc3QgZXhlY3V0ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuZXhlY3V0ZUFnZW50KFxuICAgICAgICAgIGVsZW1lbnROYW1lLFxuICAgICAgICAgIHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzQ0NzogVmFsaWRhdGUgcnVudGltZSBtYXhBdXRvbm9tb3VzU3RlcHMgb3ZlcnJpZGVcbiAgICAgICAgY29uc3QgcnVudGltZU1heFN0ZXBzID0gcGFyYW1zLm1heEF1dG9ub21vdXNTdGVwcztcbiAgICAgICAgaWYgKHJ1bnRpbWVNYXhTdGVwcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBydW50aW1lTWF4U3RlcHMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHJ1bnRpbWVNYXhTdGVwcykgfHwgcnVudGltZU1heFN0ZXBzIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXhBdXRvbm9tb3VzU3RlcHMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzQ0OTogVHJhY2sgZXhlY3V0aW5nIGFnZW50IGZvciBHYXRla2VlcGVyIHBvbGljeSBlbmZvcmNlbWVudFxuICAgICAgICAvLyBJc3N1ZSAjNDQ3OiBBbHNvIHN0b3JlIHJ1bnRpbWUgbWF4QXV0b25vbW91c1N0ZXBzIG92ZXJyaWRlXG4gICAgICAgIC8vIElzc3VlICM1MjY6IEFsc28gc3RvcmUgcmVzaWxpZW5jZSBwb2xpY3kgYW5kIG9yaWdpbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhZ2VudEVsZW1lbnQgPSBhd2FpdCBtYW5hZ2VyLnJlYWQoZWxlbWVudE5hbWUpO1xuICAgICAgICAgIGlmIChhZ2VudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFnZW50TWV0YSA9IGFnZW50RWxlbWVudC5tZXRhZGF0YSBhcyBBZ2VudE1ldGFkYXRhVjI7XG4gICAgICAgICAgICBsZXQgZ2F0ZWtlZXBlclBvbGljeSA9IGFnZW50TWV0YS5nYXRla2VlcGVyO1xuXG4gICAgICAgICAgICAvLyBTeW50aGVzaXplIHBvbGljeSBmcm9tIHRvb2xzIGNvbmZpZyBpZiBubyBleHBsaWNpdCBnYXRla2VlcGVyIHBvbGljeVxuICAgICAgICAgICAgaWYgKCFnYXRla2VlcGVyUG9saWN5ICYmIGFnZW50TWV0YS50b29scykge1xuICAgICAgICAgICAgICBnYXRla2VlcGVyUG9saWN5ID0gdHJhbnNsYXRlVG9vbENvbmZpZ1RvUG9saWN5KGFnZW50TWV0YS50b29scykgPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJc3N1ZSAjNTI2OiBFeHRyYWN0IHJlc2lsaWVuY2UgcG9saWN5IGZyb20gYWdlbnQgbWV0YWRhdGFcbiAgICAgICAgICAgIGNvbnN0IHJlc2lsaWVuY2VQb2xpY3kgPSBhZ2VudE1ldGEucmVzaWxpZW5jZTtcblxuICAgICAgICAgICAgLy8gQWx3YXlzIHRyYWNrIGlmIHRoZXJlJ3MgYSBnYXRla2VlcGVyIHBvbGljeSwgcnVudGltZSBvdmVycmlkZSwgb3IgcmVzaWxpZW5jZSBwb2xpY3lcbiAgICAgICAgICAgIGlmIChnYXRla2VlcGVyUG9saWN5IHx8IHJ1bnRpbWVNYXhTdGVwcyAhPT0gdW5kZWZpbmVkIHx8IHJlc2lsaWVuY2VQb2xpY3kpIHtcbiAgICAgICAgICAgICAgdGhpcy5leGVjdXRpbmdBZ2VudHMuc2V0KGVsZW1lbnROYW1lLCB7XG4gICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgIC4uLihnYXRla2VlcGVyUG9saWN5ID8geyBnYXRla2VlcGVyOiBnYXRla2VlcGVyUG9saWN5IH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAuLi4ocnVudGltZU1heFN0ZXBzICE9PSB1bmRlZmluZWQgPyB7IG1heEF1dG9ub21vdXNTdGVwczogcnVudGltZU1heFN0ZXBzIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGFydGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICAgICAgY29udGludWF0aW9uQ291bnQ6IDAsXG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFBhcmFtZXRlcnM6IHBhcmFtcy5wYXJhbWV0ZXJzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHJlc2lsaWVuY2VQb2xpY3ksXG4gICAgICAgICAgICAgICAgcmVjZW50QmxvY2tzOiBbXSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChydW50aW1lTWF4U3RlcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gTm8gYWdlbnQgZWxlbWVudCB0byByZWFkLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBzdG9yZSB0aGUgb3ZlcnJpZGVcbiAgICAgICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLnNldChlbGVtZW50TmFtZSwge1xuICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHsgbWF4QXV0b25vbW91c1N0ZXBzOiBydW50aW1lTWF4U3RlcHMgfSxcbiAgICAgICAgICAgICAgc3RhcnRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICBjb250aW51YXRpb25Db3VudDogMCxcbiAgICAgICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxQYXJhbWV0ZXJzOiBwYXJhbXMucGFyYW1ldGVycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgcmVjZW50QmxvY2tzOiBbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gTm9uLWZhdGFsOiBhZ2VudCBleGVjdXRlcyBldmVuIGlmIHRyYWNraW5nIGZhaWxzXG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byB0cmFjayBleGVjdXRpbmcgYWdlbnQgZm9yIEdhdGVrZWVwZXIgcG9saWN5JywgeyBhZ2VudE5hbWU6IGVsZW1lbnROYW1lIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0V4ZWN1dGVBZ2VudFJlc3VsdCcsIC4uLmV4ZWN1dGVSZXN1bHQgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZ2V0U3RhdGUnOiB7XG4gICAgICAgIC8vIFF1ZXJ5IGN1cnJlbnQgZXhlY3V0aW9uIHN0YXRlXG4gICAgICAgIGNvbnN0IHN0YXRlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5nZXRBZ2VudFN0YXRlKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGluY2x1ZGVEZWNpc2lvbkhpc3Rvcnk6IHBhcmFtcy5pbmNsdWRlRGVjaXNpb25IaXN0b3J5IGFzIGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgICAgICAgaW5jbHVkZUNvbnRleHQ6IHBhcmFtcy5pbmNsdWRlQ29udGV4dCBhcyBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0V4ZWN1dGlvblN0YXRlJywgLi4uc3RhdGVSZXN1bHQgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAndXBkYXRlU3RhdGUnOiB7XG4gICAgICAgIC8vIFJlY29yZCBleGVjdXRpb24gcHJvZ3Jlc3MsIHN0ZXAgY29tcGxldGlvbiwgb3IgZmluZGluZ3NcbiAgICAgICAgLy8gUmV0dXJucyBhdXRvbm9teSBkaXJlY3RpdmUgaW5kaWNhdGluZyBjb250aW51ZS9wYXVzZVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIG9wdGlvbmFsIHBhcmFtZXRlcnNcbiAgICAgICAgY29uc3QgbmV4dEFjdGlvbkhpbnQgPSBwYXJhbXMubmV4dEFjdGlvbkhpbnQ7XG4gICAgICAgIGlmIChuZXh0QWN0aW9uSGludCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBuZXh0QWN0aW9uSGludCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25leHRBY3Rpb25IaW50IG11c3QgYmUgYSBzdHJpbmcgaWYgcHJvdmlkZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJpc2tTY29yZSA9IHBhcmFtcy5yaXNrU2NvcmU7XG4gICAgICAgIGlmIChyaXNrU2NvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2Ygcmlza1Njb3JlICE9PSAnbnVtYmVyJyB8fCBpc05hTihyaXNrU2NvcmUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jpc2tTY29yZSBtdXN0IGJlIGEgbnVtYmVyIGlmIHByb3ZpZGVkJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyaXNrU2NvcmUgPCAwIHx8IHJpc2tTY29yZSA+IDEwMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyaXNrU2NvcmUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzc3VlICM0NDc6IEFwcGx5IHJ1bnRpbWUgbWF4QXV0b25vbW91c1N0ZXBzIG92ZXJyaWRlIGlmIHN0b3JlZCBmb3IgdGhpcyBhZ2VudFxuICAgICAgICBjb25zdCBleGVjdXRpbmdBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChlbGVtZW50TmFtZSk7XG4gICAgICAgIGNvbnN0IG1heFN0ZXBzT3ZlcnJpZGUgPSBleGVjdXRpbmdBZ2VudD8ubWV0YWRhdGE/Lm1heEF1dG9ub21vdXNTdGVwcyBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5yZWNvcmRBZ2VudFN0ZXAoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgc3RlcERlc2NyaXB0aW9uOiBwYXJhbXMuc3RlcERlc2NyaXB0aW9uIGFzIHN0cmluZyxcbiAgICAgICAgICBvdXRjb21lOiBwYXJhbXMub3V0Y29tZSBhcyAnc3VjY2VzcycgfCAnZmFpbHVyZScgfCAncGFydGlhbCcsXG4gICAgICAgICAgZmluZGluZ3M6IHBhcmFtcy5maW5kaW5ncyBhcyBzdHJpbmcsXG4gICAgICAgICAgY29uZmlkZW5jZTogcGFyYW1zLmNvbmZpZGVuY2UgYXMgbnVtYmVyLFxuICAgICAgICAgIG5leHRBY3Rpb25IaW50OiBuZXh0QWN0aW9uSGludCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcmlza1Njb3JlOiByaXNrU2NvcmUgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgICAgICAgIG1heFN0ZXBzT3ZlcnJpZGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElzc3VlICM1MjY6IEV2YWx1YXRlIHJlc2lsaWVuY2UgcG9saWN5IHdoZW4gYXV0b25vbXkgc2F5cyBwYXVzZVxuICAgICAgICBjb25zdCByZXNpbGllbmNlUmVzdWx0ID0gdGhpcy5ldmFsdWF0ZVJlc2lsaWVuY2UoXG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgdXBkYXRlUmVzdWx0LFxuICAgICAgICAgIHBhcmFtcy5vdXRjb21lIGFzIHN0cmluZ1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW06IGNvbGxlY3QgYW5kIGF0dGFjaCBub3RpZmljYXRpb25zXG4gICAgICAgIGNvbnN0IGZpbmFsUmVzdWx0ID0gcmVzaWxpZW5jZVJlc3VsdCA/PyB1cGRhdGVSZXN1bHQ7XG4gICAgICAgIGNvbnN0IGF1dG9ub215ID0gZmluYWxSZXN1bHQuYXV0b25vbXkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChhdXRvbm9teSkge1xuICAgICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSB0aGlzLmNvbGxlY3ROb3RpZmljYXRpb25zKGVsZW1lbnROYW1lLCBhdXRvbm9teSk7XG4gICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXV0b25vbXkubm90aWZpY2F0aW9ucyA9IG5vdGlmaWNhdGlvbnM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ1N0ZXBSZXN1bHQnLCAuLi5maW5hbFJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdjb21wbGV0ZSc6IHtcbiAgICAgICAgLy8gU2lnbmFsIGV4ZWN1dGlvbiBmaW5pc2hlZCBzdWNjZXNzZnVsbHlcbiAgICAgICAgY29uc3QgY29tcGxldGVSZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLmNvbXBsZXRlQWdlbnRHb2FsKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIG91dGNvbWU6IHBhcmFtcy5vdXRjb21lIGFzICdzdWNjZXNzJyB8ICdmYWlsdXJlJyB8ICdwYXJ0aWFsJyxcbiAgICAgICAgICBzdW1tYXJ5OiBwYXJhbXMuc3VtbWFyeSBhcyBzdHJpbmcsXG4gICAgICAgICAgZ29hbElkOiBwYXJhbXMuZ29hbElkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzUyNjogVHJhY2sgcmVzaWxpZW5jZSBvdXRjb21lIGFuZCByZXNldCBjaXJjdWl0IGJyZWFrZXIgb24gc3VjY2Vzc1xuICAgICAgICBjb25zdCBjb21wbGV0ZWRBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChlbGVtZW50TmFtZSk7XG4gICAgICAgIGlmIChjb21wbGV0ZWRBZ2VudD8ucmVzaWxpZW5jZVBvbGljeSAmJiAoY29tcGxldGVkQWdlbnQuY29udGludWF0aW9uQ291bnQgPiAwIHx8IGNvbXBsZXRlZEFnZW50LnJldHJ5Q291bnQgPiAwKSkge1xuICAgICAgICAgIGNvbnN0IGlzU3VjY2VzcyA9IHBhcmFtcy5vdXRjb21lID09PSAnc3VjY2Vzcyc7XG4gICAgICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkQ29tcGxldGlvbkFmdGVyUmVzaWxpZW5jZShpc1N1Y2Nlc3MpO1xuICAgICAgICAgIGlmIChpc1N1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNpcmN1aXRCcmVha2VyLnJlc2V0KGVsZW1lbnROYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNDQ5OiBSZW1vdmUgYWdlbnQgZnJvbSBleGVjdXRpbmcgc2V0IHNvIGl0cyBwb2xpY2llcyBzdG9wIGFwcGx5aW5nXG4gICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLmRlbGV0ZShlbGVtZW50TmFtZSk7XG5cbiAgICAgICAgLy8gSXNzdWUgIzEyNTogUmV0dXJuIHN0cnVjdHVyZWQgSlNPTiB3aXRoIHR5cGUgZGlzY3JpbWluYXRvclxuICAgICAgICByZXR1cm4geyBfdHlwZTogJ0NvbXBsZXRpb25SZXN1bHQnLCAuLi5jb21wbGV0ZVJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdjb250aW51ZSc6IHtcbiAgICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBmcm9tIHNhdmVkIHN0YXRlXG4gICAgICAgIGNvbnN0IGNvbnRpbnVlUmVzdWx0ID0gYXdhaXQgbWFuYWdlci5jb250aW51ZUFnZW50RXhlY3V0aW9uKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIHByZXZpb3VzU3RlcFJlc3VsdDogcGFyYW1zLnByZXZpb3VzU3RlcFJlc3VsdCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgcGFyYW1ldGVyczogcGFyYW1zLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7IF90eXBlOiAnQ29udGludWVSZXN1bHQnLCAuLi5jb250aW51ZVJlc3VsdCB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlICdhYm9ydCc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzI0OTogQWJvcnQgYSBydW5uaW5nIGFnZW50IGV4ZWN1dGlvblxuICAgICAgICBjb25zdCByZWFzb24gPSAocGFyYW1zLnJlYXNvbiBhcyBzdHJpbmcpIHx8ICdBYm9ydGVkIGJ5IHVzZXInO1xuXG4gICAgICAgIC8vIEZpbmQgdGhlIGFjdGl2ZSBnb2FsIGZvciB0aGlzIGFnZW50XG4gICAgICAgIGNvbnN0IGFjdGl2ZUdvYWxJZHMgPSBhd2FpdCB0aGlzLmdldEFjdGl2ZUdvYWxJZHMobWFuYWdlciwgZWxlbWVudE5hbWUpO1xuICAgICAgICBpZiAoYWN0aXZlR29hbElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgTm8gYWN0aXZlIGV4ZWN1dGlvbiBmb3VuZCBmb3IgYWdlbnQgJyR7ZWxlbWVudE5hbWV9Jy4gYCArXG4gICAgICAgICAgICBgTm90aGluZyB0byBhYm9ydC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYWxsIGFjdGl2ZSBnb2FscyBhcyBhYm9ydGVkXG4gICAgICAgIGZvciAoY29uc3QgZ29hbElkIG9mIGFjdGl2ZUdvYWxJZHMpIHtcbiAgICAgICAgICB0aGlzLmFib3J0ZWRHb2Fscy5hZGQoZ29hbElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXBsZXRlIHRoZSBhZ2VudCBnb2FsIHdpdGggJ2ZhaWx1cmUnIG91dGNvbWUgdG8gcGVyc2lzdCB0aGUgYWJvcnRlZCBzdGF0ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG1hbmFnZXIuY29tcGxldGVBZ2VudEdvYWwoe1xuICAgICAgICAgICAgYWdlbnROYW1lOiBlbGVtZW50TmFtZSxcbiAgICAgICAgICAgIG91dGNvbWU6ICdmYWlsdXJlJyxcbiAgICAgICAgICAgIHN1bW1hcnk6IGBFeGVjdXRpb24gYWJvcnRlZDogJHtyZWFzb259YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gTm9uLWZhdGFsOiBnb2FsIG1heSBhbHJlYWR5IGJlIGNvbXBsZXRlZCBvciBhZ2VudCBzdGF0ZSBtYXkgYmUgaW5jb25zaXN0ZW50XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0ZhaWxlZCB0byBtYXJrIGFib3J0ZWQgYWdlbnQgZ29hbCBhcyBmYWlsZWQnLCB7IGFnZW50TmFtZTogZWxlbWVudE5hbWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJc3N1ZSAjNTI2OiBUcmFjayByZXNpbGllbmNlIG91dGNvbWUgKGFib3J0ID0gZmFpbHVyZSBhZnRlciByZXNpbGllbmNlKVxuICAgICAgICBjb25zdCBhYm9ydGVkQWdlbnQgPSB0aGlzLmV4ZWN1dGluZ0FnZW50cy5nZXQoZWxlbWVudE5hbWUpO1xuICAgICAgICBpZiAoYWJvcnRlZEFnZW50Py5yZXNpbGllbmNlUG9saWN5ICYmIChhYm9ydGVkQWdlbnQuY29udGludWF0aW9uQ291bnQgPiAwIHx8IGFib3J0ZWRBZ2VudC5yZXRyeUNvdW50ID4gMCkpIHtcbiAgICAgICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRDb21wbGV0aW9uQWZ0ZXJSZXNpbGllbmNlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFuIHVwIGV4ZWN1dGluZ0FnZW50cyBNYXAgKHN0b3AgR2F0ZWtlZXBlciBwb2xpY3kgZW5mb3JjZW1lbnQpXG4gICAgICAgIHRoaXMuZXhlY3V0aW5nQWdlbnRzLmRlbGV0ZShlbGVtZW50TmFtZSk7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgRGFuZ2VyWm9uZUVuZm9yY2VyIGJsb2NrcyBmb3IgdGhpcyBhZ2VudFxuICAgICAgICBpZiAodGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXIudW5ibG9jayhlbGVtZW50TmFtZSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBOb24tZmF0YWw6IGFnZW50IG1heSBub3QgaGF2ZSBiZWVuIGJsb2NrZWRcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgdHlwZTogJ0FHRU5UX0VYRUNVVEVEJyxcbiAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5kaXNwYXRjaEV4ZWN1dGUuYWJvcnQnLFxuICAgICAgICAgIGRldGFpbHM6IGBBZ2VudCBleGVjdXRpb24gYWJvcnRlZDogJHtlbGVtZW50TmFtZX0g4oCUICR7cmVhc29ufWAsXG4gICAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgICBhYm9ydGVkR29hbElkczogYWN0aXZlR29hbElkcyxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBJc3N1ZSAjMTI1OiBSZXR1cm4gc3RydWN0dXJlZCBKU09OIHdpdGggdHlwZSBkaXNjcmltaW5hdG9yXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX3R5cGU6ICdBYm9ydFJlc3VsdCcsXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGFib3J0ZWRHb2FsSWRzOiBhY3RpdmVHb2FsSWRzLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgJyR7ZWxlbWVudE5hbWV9JyBleGVjdXRpb24gYWJvcnRlZC4gJHthY3RpdmVHb2FsSWRzLmxlbmd0aH0gZ29hbChzKSB0ZXJtaW5hdGVkLmAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2dldEdhdGhlcmVkRGF0YSc6IHtcbiAgICAgICAgLy8gSXNzdWUgIzY4OiBHZXQgYWdncmVnYXRlZCBleGVjdXRpb24gZGF0YSBmb3IgYSBzcGVjaWZpYyBnb2FsXG4gICAgICAgIGNvbnN0IGdvYWxJZCA9IHBhcmFtcy5nb2FsSWQ7XG4gICAgICAgIGlmICh0eXBlb2YgZ29hbElkICE9PSAnc3RyaW5nJyB8fCAhZ29hbElkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnb2FsSWQgaXMgcmVxdWlyZWQgZm9yIGdldF9nYXRoZXJlZF9kYXRhJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2F0aGVyZWREYXRhID0gYXdhaXQgbWFuYWdlci5nZXRHYXRoZXJlZERhdGEoe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgZ29hbElkOiBnb2FsSWQgYXMgc3RyaW5nLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgX3R5cGU6ICdHYXRoZXJlZERhdGEnLCAuLi5nYXRoZXJlZERhdGEgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncHJlcGFyZUhhbmRvZmYnOiB7XG4gICAgICAgIC8vIElzc3VlICM2OTogUHJlcGFyZSBhIGhhbmRvZmYgc3RhdGUgZm9yIHNlc3Npb24gdHJhbnNmZXJcbiAgICAgICAgY29uc3QgaGFuZG9mZkdvYWxJZCA9IHBhcmFtcy5nb2FsSWQ7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZG9mZkdvYWxJZCAhPT0gJ3N0cmluZycgfHwgIWhhbmRvZmZHb2FsSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvYWxJZCBpcyByZXF1aXJlZCBmb3IgcHJlcGFyZV9oYW5kb2ZmJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZ2F0aGVyZWQgZGF0YSBmb3IgdGhlIGdvYWxcbiAgICAgICAgY29uc3QgaGFuZG9mZkdhdGhlcmVkRGF0YSA9IGF3YWl0IG1hbmFnZXIuZ2V0R2F0aGVyZWREYXRhKHtcbiAgICAgICAgICBhZ2VudE5hbWU6IGVsZW1lbnROYW1lLFxuICAgICAgICAgIGdvYWxJZDogaGFuZG9mZkdvYWxJZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVhZCBhZ2VudCBtZXRhZGF0YSBmb3IgYWN0aXZlIGVsZW1lbnRzIGFuZCBzdWNjZXNzIGNyaXRlcmlhXG4gICAgICAgIGxldCBhY3RpdmVFbGVtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gICAgICAgIGxldCBzdWNjZXNzQ3JpdGVyaWE6IHN0cmluZ1tdID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYWdlbnRFbGVtZW50ID0gYXdhaXQgbWFuYWdlci5yZWFkKGVsZW1lbnROYW1lKTtcbiAgICAgICAgICBpZiAoYWdlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhID0gYWdlbnRFbGVtZW50Lm1ldGFkYXRhIGFzIEFnZW50TWV0YWRhdGFWMjtcbiAgICAgICAgICAgIGlmIChtZXRhLmFjdGl2YXRlcykge1xuICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50cyA9IHsgLi4ubWV0YS5hY3RpdmF0ZXMgfSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdWNjZXNzQ3JpdGVyaWEgPSBtZXRhLmdvYWw/LnN1Y2Nlc3NDcml0ZXJpYSB8fCBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIE5vbi1mYXRhbDogcHJvY2VlZCB3aXRoIGRlZmF1bHRzXG4gICAgICAgIH1cbiAgICAgICAgLy8gQWx3YXlzIGluY2x1ZGUgdGhlIGFnZW50IGl0c2VsZlxuICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXSkge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYWN0aXZlRWxlbWVudHNbJ2FnZW50cyddLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRzWydhZ2VudHMnXS5wdXNoKGVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBoYW5kb2ZmIHN0YXRlXG4gICAgICAgIGNvbnN0IGhhbmRvZmZTdGF0ZSA9IHByZXBhcmVIYW5kb2ZmU3RhdGUoXG4gICAgICAgICAgZWxlbWVudE5hbWUsXG4gICAgICAgICAgaGFuZG9mZkdhdGhlcmVkRGF0YSxcbiAgICAgICAgICBhY3RpdmVFbGVtZW50cyxcbiAgICAgICAgICBzdWNjZXNzQ3JpdGVyaWFcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSB0aGUgY29weS1wYXN0ZWFibGUgYmxvY2tcbiAgICAgICAgY29uc3QgaGFuZG9mZkJsb2NrID0gZ2VuZXJhdGVIYW5kb2ZmQmxvY2soaGFuZG9mZlN0YXRlKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF90eXBlOiAnSGFuZG9mZlJlc3VsdCcsXG4gICAgICAgICAgaGFuZG9mZlN0YXRlLFxuICAgICAgICAgIGhhbmRvZmZCbG9jayxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSAncmVzdW1lRnJvbUhhbmRvZmYnOiB7XG4gICAgICAgIC8vIElzc3VlICM2OTogUmVzdW1lIGV4ZWN1dGlvbiBmcm9tIGEgaGFuZG9mZiBibG9ja1xuICAgICAgICBjb25zdCBoYW5kb2ZmQmxvY2tQYXJhbSA9IHBhcmFtcy5oYW5kb2ZmQmxvY2s7XG4gICAgICAgIGlmICh0eXBlb2YgaGFuZG9mZkJsb2NrUGFyYW0gIT09ICdzdHJpbmcnIHx8ICFoYW5kb2ZmQmxvY2tQYXJhbSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGFuZG9mZkJsb2NrIGlzIHJlcXVpcmVkIGZvciByZXN1bWVfZnJvbV9oYW5kb2ZmICh0aGUgZnVsbCBoYW5kb2ZmIGJsb2NrIHRleHQpJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSBhbmQgdmFsaWRhdGUgdGhlIGhhbmRvZmYgYmxvY2sgKGNoZWNrc3VtIHZhbGlkYXRlZCBpbnRlcm5hbGx5KVxuICAgICAgICBjb25zdCByZXN0b3JlZFN0YXRlID0gcGFyc2VIYW5kb2ZmQmxvY2soaGFuZG9mZkJsb2NrUGFyYW0pO1xuXG4gICAgICAgIC8vIFZlcmlmeSB0aGUgYWdlbnQgbmFtZSBtYXRjaGVzXG4gICAgICAgIGlmIChyZXN0b3JlZFN0YXRlLmFnZW50TmFtZSAhPT0gZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICBsb2dnZXIud2FybignSGFuZG9mZiBhZ2VudCBtaXNtYXRjaCBkZXRlY3RlZCcsIHtcbiAgICAgICAgICAgIGV4cGVjdGVkQWdlbnQ6IGVsZW1lbnROYW1lLFxuICAgICAgICAgICAgYmxvY2tBZ2VudDogcmVzdG9yZWRTdGF0ZS5hZ2VudE5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0hhbmRvZmYgYWdlbnQgbWlzbWF0Y2g6IHRoZSBoYW5kb2ZmIGJsb2NrIHdhcyBub3QgcHJlcGFyZWQgZm9yIHRoaXMgYWdlbnQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1lcmdlIGNhbGxlci1wcm92aWRlZCBwYXJhbWV0ZXJzIHdpdGggaGFuZG9mZiBtZXRhZGF0YS5cbiAgICAgICAgLy8gVGhlIGNhbGxlciBtdXN0IHN1cHBseSBhbnkgcmVxdWlyZWQgZ29hbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChlLmcuIHRhc2spLlxuICAgICAgICBjb25zdCBjYWxsZXJQYXJhbXMgPSAocGFyYW1zLnBhcmFtZXRlcnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt9O1xuICAgICAgICBjb25zdCByZXN1bWVQYXJhbXMgPSB7XG4gICAgICAgICAgLi4uY2FsbGVyUGFyYW1zLFxuICAgICAgICAgIHJlc3VtZWRGcm9tSGFuZG9mZjogdHJ1ZSxcbiAgICAgICAgICBvcmlnaW5hbEdvYWxJZDogcmVzdG9yZWRTdGF0ZS5nb2FsSWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiB1c2luZyBjb250aW51ZSB3aXRoIHJlc3RvcmVkIGNvbnRleHRcbiAgICAgICAgY29uc3QgY29udGludWVSZXN1bHQgPSBhd2FpdCBtYW5hZ2VyLmNvbnRpbnVlQWdlbnRFeGVjdXRpb24oe1xuICAgICAgICAgIGFnZW50TmFtZTogZWxlbWVudE5hbWUsXG4gICAgICAgICAgcHJldmlvdXNTdGVwUmVzdWx0OiBgUmVzdW1lZCBmcm9tIGhhbmRvZmYgKGdvYWxJZDogJHtyZXN0b3JlZFN0YXRlLmdvYWxJZH0sICR7cmVzdG9yZWRTdGF0ZS5nb2FsUHJvZ3Jlc3Muc3RlcHNDb21wbGV0ZWR9IHN0ZXBzIGNvbXBsZXRlZClgLFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHJlc3VtZVBhcmFtcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfdHlwZTogJ1Jlc3VtZVJlc3VsdCcsXG4gICAgICAgICAgLi4uY29udGludWVSZXN1bHQsXG4gICAgICAgICAgcmVzdG9yZWRGcm9tOiB7XG4gICAgICAgICAgICBhZ2VudE5hbWU6IHJlc3RvcmVkU3RhdGUuYWdlbnROYW1lLFxuICAgICAgICAgICAgZ29hbElkOiByZXN0b3JlZFN0YXRlLmdvYWxJZCxcbiAgICAgICAgICAgIHZlcnNpb246IHJlc3RvcmVkU3RhdGUudmVyc2lvbixcbiAgICAgICAgICAgIHN0ZXBzQ29tcGxldGVkOiByZXN0b3JlZFN0YXRlLmdvYWxQcm9ncmVzcy5zdGVwc0NvbXBsZXRlZCxcbiAgICAgICAgICAgIHByZXBhcmVkQXQ6IHJlc3RvcmVkU3RhdGUucHJlcGFyZWRBdCxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gRXhlY3V0ZSBtZXRob2Q6ICR7bWV0aG9kfWApO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWdlbnQgTm90aWZpY2F0aW9uIFN5c3RlbVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIE1heGltdW0gcmVjZW50IGJsb2NrcyB0cmFja2VkIHBlciBhZ2VudCB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGggKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1JFQ0VOVF9CTE9DS1MgPSA1MDtcblxuICAvKipcbiAgICogUmVjb3JkIGEgZ2F0ZWtlZXBlciBibG9jayBhZ2FpbnN0IGFsbCBjdXJyZW50bHkgZXhlY3V0aW5nIGFnZW50cy5cbiAgICogQ2FsbGVkIHdoZW4gR2F0ZWtlZXBlci5lbmZvcmNlKCkgZGVuaWVzIGFuIG9wZXJhdGlvbiwgc28gdGhhdFxuICAgKiByZWNvcmRfZXhlY3V0aW9uX3N0ZXAgY2FuIHJlcG9ydCBpdCBhcyBhIG5vdGlmaWNhdGlvbi5cbiAgICpcbiAgICogQHNpbmNlIHYyLjEuMCAtIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVjb3JkR2F0ZWtlZXBlckJsb2NrRm9yQWdlbnRzKFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIGVsZW1lbnRUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICAgbGV2ZWw6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5leGVjdXRpbmdBZ2VudHMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYmxvY2sgPSB7XG4gICAgICBvcGVyYXRpb24sXG4gICAgICBlbGVtZW50VHlwZSxcbiAgICAgIHJlYXNvbixcbiAgICAgIGxldmVsLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICByZXBvcnRlZDogZmFsc2UsXG4gICAgfTtcblxuICAgIGZvciAoY29uc3QgWywgYWdlbnRFbnRyeV0gb2YgdGhpcy5leGVjdXRpbmdBZ2VudHMpIHtcbiAgICAgIGFnZW50RW50cnkucmVjZW50QmxvY2tzLnB1c2goYmxvY2spO1xuXG4gICAgICAvLyBDYXAgYXQgTUFYX1JFQ0VOVF9CTE9DS1M6IGV2aWN0IG9sZGVzdCByZXBvcnRlZCBmaXJzdCwgdGhlbiBvbGRlc3QgdW5yZXBvcnRlZFxuICAgICAgd2hpbGUgKGFnZW50RW50cnkucmVjZW50QmxvY2tzLmxlbmd0aCA+IE1DUEFRTEhhbmRsZXIuTUFYX1JFQ0VOVF9CTE9DS1MpIHtcbiAgICAgICAgY29uc3QgcmVwb3J0ZWRJZHggPSBhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5maW5kSW5kZXgoYiA9PiBiLnJlcG9ydGVkKTtcbiAgICAgICAgaWYgKHJlcG9ydGVkSWR4ID49IDApIHtcbiAgICAgICAgICBhZ2VudEVudHJ5LnJlY2VudEJsb2Nrcy5zcGxpY2UocmVwb3J0ZWRJZHgsIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFnZW50RW50cnkucmVjZW50QmxvY2tzLnNoaWZ0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdCBub3RpZmljYXRpb25zIGZvciBhbiBleGVjdXRpbmcgYWdlbnQgZnJvbSBhbGwgc291cmNlczpcbiAgICogMS4gVW5yZXBvcnRlZCBnYXRla2VlcGVyIGJsb2NrcyDihpIgcGVybWlzc2lvbl9wZW5kaW5nXG4gICAqIDIuIEF1dG9ub215IHBhdXNlIChjb250aW51ZT1mYWxzZSkg4oaSIGF1dG9ub215X3BhdXNlXG4gICAqIDMuIERhbmdlclpvbmUgYmxvY2tlZCBhZ2VudHMgKHN5c3RlbS13aWRlIGJyb2FkY2FzdCkg4oaSIGRhbmdlcl96b25lXG4gICAqXG4gICAqIEdhdGVrZWVwZXIgYmxvY2tzIGFyZSBtYXJrZWQgYXMgXCJyZXBvcnRlZFwiIGFmdGVyIGZpcnN0IGNvbGxlY3Rpb25cbiAgICogc28gdGhleSBkb24ndCByZXBlYXQgb24gc3Vic2VxdWVudCBjYWxscy4gRGFuZ2VyWm9uZSBhbmQgYXV0b25vbXlcbiAgICogbm90aWZpY2F0aW9ucyBhcmUgYWx3YXlzIGVtaXR0ZWQgd2hpbGUgdGhlIGNvbmRpdGlvbiBwZXJzaXN0cy5cbiAgICpcbiAgICogQHNpbmNlIHYyLjEuMCAtIEFnZW50IE5vdGlmaWNhdGlvbiBTeXN0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY29sbGVjdE5vdGlmaWNhdGlvbnMoXG4gICAgYWdlbnROYW1lOiBzdHJpbmcsXG4gICAgYXV0b25vbXk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IEFnZW50Tm90aWZpY2F0aW9uW10ge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbnM6IEFnZW50Tm90aWZpY2F0aW9uW10gPSBbXTtcbiAgICBjb25zdCBleGVjdXRpbmdBZ2VudCA9IHRoaXMuZXhlY3V0aW5nQWdlbnRzLmdldChhZ2VudE5hbWUpO1xuXG4gICAgLy8gU291cmNlIDE6IFVucmVwb3J0ZWQgZ2F0ZWtlZXBlciBibG9ja3NcbiAgICBpZiAoZXhlY3V0aW5nQWdlbnQ/LnJlY2VudEJsb2Nrcykge1xuICAgICAgZm9yIChjb25zdCBibG9jayBvZiBleGVjdXRpbmdBZ2VudC5yZWNlbnRCbG9ja3MpIHtcbiAgICAgICAgaWYgKCFibG9jay5yZXBvcnRlZCkge1xuICAgICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAncGVybWlzc2lvbl9wZW5kaW5nJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke2Jsb2NrLm9wZXJhdGlvbn0ke2Jsb2NrLmVsZW1lbnRUeXBlID8gYCgke2Jsb2NrLmVsZW1lbnRUeXBlfSlgIDogJyd9IHJlcXVpcmVzIGNvbmZpcm1hdGlvbmAsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBvcGVyYXRpb246IGJsb2NrLm9wZXJhdGlvbixcbiAgICAgICAgICAgICAgZWxlbWVudF90eXBlOiBibG9jay5lbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgcmVhc29uOiBibG9jay5yZWFzb24sXG4gICAgICAgICAgICAgIGxldmVsOiBibG9jay5sZXZlbCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGJsb2NrLnRpbWVzdGFtcCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBibG9jay5yZXBvcnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3VyY2UgMjogQXV0b25vbXkgcGF1c2VcbiAgICBpZiAoYXV0b25vbXkuY29udGludWUgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCByZWFzb24gPSAoYXV0b25vbXkucmVhc29uIGFzIHN0cmluZykgfHwgKGF1dG9ub215LmZhY3RvcnMgYXMgc3RyaW5nW10gfHwgW10pLmpvaW4oJywgJyk7XG4gICAgICBpZiAocmVhc29uKSB7XG4gICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2F1dG9ub215X3BhdXNlJyxcbiAgICAgICAgICBtZXNzYWdlOiBgQWdlbnQgcGF1c2VkOiAke3JlYXNvbn1gLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU291cmNlIDM6IERhbmdlclpvbmUgYnJvYWRjYXN0IOKAlCBhbGVydCBBTEwgZXhlY3V0aW5nIGFnZW50cyBhYm91dCBhbnkgYmxvY2tlZCBhZ2VudFxuICAgIGNvbnN0IGVuZm9yY2VyID0gdGhpcy5oYW5kbGVycy5kYW5nZXJab25lRW5mb3JjZXI7XG4gICAgaWYgKGVuZm9yY2VyPy5oYXNCbG9ja2VkQWdlbnRzKCkpIHtcbiAgICAgIGZvciAoY29uc3QgYmxvY2tlZEFnZW50IG9mIGVuZm9yY2VyLmdldEJsb2NrZWRBZ2VudHMoKSkge1xuICAgICAgICBjb25zdCBibG9ja0NoZWNrID0gZW5mb3JjZXIuY2hlY2soYmxvY2tlZEFnZW50KTtcbiAgICAgICAgaWYgKGJsb2NrQ2hlY2suYmxvY2tlZCkge1xuICAgICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiAnZGFuZ2VyX3pvbmUnLFxuICAgICAgICAgICAgbWVzc2FnZTogYEFnZW50ICcke2Jsb2NrZWRBZ2VudH0nIGlzIGJsb2NrZWQgZHVlIHRvIGRhbmdlciB6b25lIHRyaWdnZXI6ICR7YmxvY2tDaGVjay5yZWFzb259YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIGFnZW50TmFtZTogYmxvY2tlZEFnZW50LFxuICAgICAgICAgICAgICByZWFzb246IGJsb2NrQ2hlY2sucmVhc29uLFxuICAgICAgICAgICAgICB2ZXJpZmljYXRpb25JZDogYmxvY2tDaGVjay52ZXJpZmljYXRpb25JZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub3RpZmljYXRpb25zO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZXNpbGllbmNlIEV2YWx1YXRpb24gKElzc3VlICM1MjYpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXZhbHVhdGUgcmVzaWxpZW5jZSBwb2xpY3kgYWZ0ZXIgYSBzdGVwIHJlc3VsdCBhbmQgcG90ZW50aWFsbHkgb3ZlcnJpZGVcbiAgICogdGhlIGF1dG9ub215IGRpcmVjdGl2ZSB0byBlbmFibGUgYXV0by1jb250aW51YXRpb24gb3IgcmV0cnkuXG4gICAqXG4gICAqIFJldHVybnMgYSBtb2RpZmllZCBzdGVwIHJlc3VsdCBpZiByZXNpbGllbmNlIGtpY2tzIGluLCBvciBudWxsIHRvIHVzZVxuICAgKiB0aGUgb3JpZ2luYWwgcmVzdWx0IChkZWZhdWx0IGJlaGF2aW9yKS5cbiAgICpcbiAgICogQHNpbmNlIHYyLjEuMCAtIEFnZW50IEV4ZWN1dGlvbiBSZXNpbGllbmNlIChJc3N1ZSAjNTI2KVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBldmFsdWF0ZVJlc2lsaWVuY2UoXG4gICAgYWdlbnROYW1lOiBzdHJpbmcsXG4gICAgdXBkYXRlUmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzdGVwT3V0Y29tZTogc3RyaW5nXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCB7XG4gICAgLy8gT25seSBldmFsdWF0ZSB3aGVuIGF1dG9ub215IHNheXMgcGF1c2VcbiAgICBjb25zdCBhdXRvbm9teSA9IHVwZGF0ZVJlc3VsdC5hdXRvbm9teSBhcyB7IGNvbnRpbnVlOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmc7IGZhY3RvcnM/OiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXV0b25vbXkgfHwgYXV0b25vbXkuY29udGludWUgPT09IHRydWUpIHJldHVybiBudWxsO1xuXG4gICAgLy8gTG9vayB1cCB0aGUgZXhlY3V0aW5nIGFnZW50J3MgcmVzaWxpZW5jZSB0cmFja2luZyBzdGF0ZVxuICAgIGNvbnN0IGV4ZWN1dGluZ0FnZW50ID0gdGhpcy5leGVjdXRpbmdBZ2VudHMuZ2V0KGFnZW50TmFtZSk7XG4gICAgaWYgKCFleGVjdXRpbmdBZ2VudD8ucmVzaWxpZW5jZVBvbGljeSkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBEZXRlcm1pbmUgd2hhdCB0cmlnZ2VyZWQgdGhlIHBhdXNlXG4gICAgY29uc3QgaXNTdGVwTGltaXQgPSBhdXRvbm9teS5yZWFzb24/LnN0YXJ0c1dpdGgoJ01heGltdW0gYXV0b25vbW91cyBzdGVwcyByZWFjaGVkJykgPz8gZmFsc2U7XG4gICAgY29uc3QgaXNGYWlsdXJlID0gc3RlcE91dGNvbWUgPT09ICdmYWlsdXJlJztcblxuICAgIC8vIE9ubHkgaGFuZGxlIHN0ZXAtbGltaXQgYW5kIGZhaWx1cmUgdHJpZ2dlcnNcbiAgICBpZiAoIWlzU3RlcExpbWl0ICYmICFpc0ZhaWx1cmUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY29udGV4dDogUmVzaWxpZW5jZUNvbnRleHQgPSB7XG4gICAgICB0cmlnZ2VyOiBpc1N0ZXBMaW1pdCA/ICdzdGVwX2xpbWl0JyA6ICdleGVjdXRpb25fZmFpbHVyZScsXG4gICAgICBjb250aW51YXRpb25Db3VudDogZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQsXG4gICAgICByZXRyeUNvdW50OiBleGVjdXRpbmdBZ2VudC5yZXRyeUNvdW50LFxuICAgICAgc3RlcE91dGNvbWU6IHN0ZXBPdXRjb21lIGFzICdzdWNjZXNzJyB8ICdmYWlsdXJlJyB8ICdwYXJ0aWFsJyxcbiAgICAgIGFnZW50TmFtZSxcbiAgICB9O1xuXG4gICAgY29uc3QgYWN0aW9uID0gZXZhbHVhdGVSZXNpbGllbmNlUG9saWN5KGV4ZWN1dGluZ0FnZW50LnJlc2lsaWVuY2VQb2xpY3ksIGNvbnRleHQpO1xuXG4gICAgLy8gSWYgcmVzaWxpZW5jZSBzYXlzIHBhdXNlLCByZWNvcmQgdGhlIGxpbWl0IGFuZCB1c2UgdGhlIG9yaWdpbmFsIHJlc3VsdFxuICAgIGlmIChhY3Rpb24uYWN0aW9uID09PSAncGF1c2UnKSB7XG4gICAgICAvLyBUcmFjayBpZiB0aGlzIHdhcyBhIGxpbWl0IGV4aGF1c3Rpb24gKG5vdCBhIGRlZmF1bHQtcGF1c2UgcG9saWN5KVxuICAgICAgaWYgKGFjdGlvbi5yZWFzb24/LmluY2x1ZGVzKCdleGhhdXN0ZWQnKSB8fCBhY3Rpb24ucmVhc29uPy5pbmNsdWRlcygnQ2lyY3VpdCBicmVha2VyJykpIHtcbiAgICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkUmVzaWxpZW5jZUxpbWl0KCk7XG4gICAgICAgIGlmIChhY3Rpb24ucmVhc29uPy5pbmNsdWRlcygnQ2lyY3VpdCBicmVha2VyJykpIHtcbiAgICAgICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRDaXJjdWl0QnJlYWtlclRyaXAoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gQXV0by1jb250aW51ZTogb3ZlcnJpZGUgdGhlIGF1dG9ub215IGRpcmVjdGl2ZSB0byBjb250aW51ZVxuICAgIGlmIChhY3Rpb24uYWN0aW9uID09PSAnY29udGludWUnKSB7XG4gICAgICBleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudCsrO1xuICAgICAgZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCA9IDA7IC8vIFJlc2V0IHJldHJ5IGNvdW50IG9uIGNvbnRpbnVhdGlvblxuICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkQXV0b0NvbnRpbnVhdGlvbigpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9BVVRPX0NPTlRJTlVFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5ldmFsdWF0ZVJlc2lsaWVuY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgYXV0by1jb250aW51ZWQ6ICR7YWN0aW9uLnJlYXNvbn1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50TmFtZSxcbiAgICAgICAgICBjb250aW51YXRpb25Db3VudDogZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQsXG4gICAgICAgICAgbWF4Q29udGludWF0aW9uczogYWN0aW9uLm1heENvbnRpbnVhdGlvbnMsXG4gICAgICAgICAgdHJpZ2dlcjogY29udGV4dC50cmlnZ2VyLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnVwZGF0ZVJlc3VsdCxcbiAgICAgICAgYXV0b25vbXk6IHtcbiAgICAgICAgICAuLi5hdXRvbm9teSxcbiAgICAgICAgICBjb250aW51ZTogdHJ1ZSxcbiAgICAgICAgICByZWFzb246IGFjdGlvbi5yZWFzb24sXG4gICAgICAgICAgZmFjdG9yczogWy4uLihhdXRvbm9teS5mYWN0b3JzIHx8IFtdKSwgYHJlc2lsaWVuY2U6IGF1dG8tY29udGludWVkICgke2V4ZWN1dGluZ0FnZW50LmNvbnRpbnVhdGlvbkNvdW50fS8ke2FjdGlvbi5tYXhDb250aW51YXRpb25zIHx8ICd1bmxpbWl0ZWQnfSlgXSxcbiAgICAgICAgICByZXNpbGllbmNlQWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJldHJ5OiB0ZWxsIExMTSB0byByZXRyeSB3aXRoIGJhY2tvZmYgZ3VpZGFuY2VcbiAgICBpZiAoYWN0aW9uLmFjdGlvbiA9PT0gJ3JldHJ5Jykge1xuICAgICAgZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCsrO1xuICAgICAgcmVzaWxpZW5jZU1ldHJpY3MucmVjb3JkU3RlcFJldHJ5KCk7XG5cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0FHRU5UX1NURVBfUkVUUklFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5ldmFsdWF0ZVJlc2lsaWVuY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgc3RlcCByZXRyeTogJHthY3Rpb24ucmVhc29ufWAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgYWdlbnROYW1lLFxuICAgICAgICAgIHJldHJ5Q291bnQ6IGV4ZWN1dGluZ0FnZW50LnJldHJ5Q291bnQsXG4gICAgICAgICAgYmFja29mZk1zOiBhY3Rpb24uYmFja29mZk1zLFxuICAgICAgICAgIHRyaWdnZXI6IGNvbnRleHQudHJpZ2dlcixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVSZXN1bHQsXG4gICAgICAgIGF1dG9ub215OiB7XG4gICAgICAgICAgLi4uYXV0b25vbXksXG4gICAgICAgICAgY29udGludWU6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiBhY3Rpb24ucmVhc29uLFxuICAgICAgICAgIGZhY3RvcnM6IFsuLi4oYXV0b25vbXkuZmFjdG9ycyB8fCBbXSksIGByZXNpbGllbmNlOiByZXRyeSBhdHRlbXB0ICR7ZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudH1gXSxcbiAgICAgICAgICByZXNpbGllbmNlQWN0aW9uOiBhY3Rpb24sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFJlc3RhcnQ6IG92ZXJyaWRlIHRvIGNvbnRpbnVlLCBzaWduYWwgZnJlc2ggcmVzdGFydCB0byBMTE1cbiAgICBpZiAoYWN0aW9uLmFjdGlvbiA9PT0gJ3Jlc3RhcnQnKSB7XG4gICAgICBleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudCsrO1xuICAgICAgZXhlY3V0aW5nQWdlbnQucmV0cnlDb3VudCA9IDA7XG4gICAgICByZXNpbGllbmNlTWV0cmljcy5yZWNvcmRBdXRvUmVzdGFydCgpO1xuXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdBR0VOVF9BVVRPX1JFU1RBUlRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTUNQQVFMSGFuZGxlci5ldmFsdWF0ZVJlc2lsaWVuY2UnLFxuICAgICAgICBkZXRhaWxzOiBgQWdlbnQgJyR7YWdlbnROYW1lfScgYXV0by1yZXN0YXJ0ZWQ6ICR7YWN0aW9uLnJlYXNvbn1gLFxuICAgICAgICBhZGRpdGlvbmFsRGF0YToge1xuICAgICAgICAgIGFnZW50TmFtZSxcbiAgICAgICAgICBjb250aW51YXRpb25Db3VudDogZXhlY3V0aW5nQWdlbnQuY29udGludWF0aW9uQ291bnQsXG4gICAgICAgICAgbWF4Q29udGludWF0aW9uczogYWN0aW9uLm1heENvbnRpbnVhdGlvbnMsXG4gICAgICAgICAgdHJpZ2dlcjogY29udGV4dC50cmlnZ2VyLFxuICAgICAgICAgIHByZXNlcnZlU3RhdGU6IGV4ZWN1dGluZ0FnZW50LnJlc2lsaWVuY2VQb2xpY3k/LnByZXNlcnZlU3RhdGUgPz8gdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi51cGRhdGVSZXN1bHQsXG4gICAgICAgIGF1dG9ub215OiB7XG4gICAgICAgICAgLi4uYXV0b25vbXksXG4gICAgICAgICAgY29udGludWU6IHRydWUsXG4gICAgICAgICAgcmVhc29uOiBhY3Rpb24ucmVhc29uLFxuICAgICAgICAgIGZhY3RvcnM6IFsuLi4oYXV0b25vbXkuZmFjdG9ycyB8fCBbXSksIGByZXNpbGllbmNlOiBhdXRvLXJlc3RhcnRlZCAoJHtleGVjdXRpbmdBZ2VudC5jb250aW51YXRpb25Db3VudH0vJHthY3Rpb24ubWF4Q29udGludWF0aW9ucyB8fCAndW5saW1pdGVkJ30pYF0sXG4gICAgICAgICAgcmVzaWxpZW5jZUFjdGlvbjogYWN0aW9uLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWN0aXZlIGdvYWwgSURzIGZvciBhbiBhZ2VudCAoSXNzdWUgIzI0OSkuXG4gICAqIFF1ZXJpZXMgdGhlIGFnZW50J3Mgc3RhdGUgdG8gZmluZCBpbi1wcm9ncmVzcyBnb2Fscy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWN0aXZlR29hbElkcyhcbiAgICBtYW5hZ2VyOiBBZ2VudE1hbmFnZXIsXG4gICAgYWdlbnROYW1lOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0ZVJlc3VsdCA9IGF3YWl0IG1hbmFnZXIuZ2V0QWdlbnRTdGF0ZSh7IGFnZW50TmFtZSB9KTtcbiAgICAgIGlmIChzdGF0ZVJlc3VsdD8uc3RhdGU/LmdvYWxzKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZVJlc3VsdC5zdGF0ZS5nb2Fsc1xuICAgICAgICAgIC5maWx0ZXIoKGc6IHsgc3RhdHVzOiBzdHJpbmcgfSkgPT4gZy5zdGF0dXMgPT09ICdpbl9wcm9ncmVzcycpXG4gICAgICAgICAgLm1hcCgoZzogeyBpZDogc3RyaW5nIH0pID0+IGcuaWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQWdlbnQgbWF5IG5vdCBoYXZlIHN0YXRlIHlldFxuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGNvcnJlbGF0aW9uIElEIGZyb20gdGhlIHVuZGVybHlpbmcgQ29udGV4dFRyYWNrZXIuXG4gICAqIEV4cG9zZWQgZm9yIHVzZSBieSBVbmlmaWVkRW5kcG9pbnQgYW5kIG90aGVyIHdyYXBwZXJzLlxuICAgKiBJc3N1ZSAjMzAxLlxuICAgKi9cbiAgZ2V0Q29ycmVsYXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlc3VsdCBIZWxwZXIgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHJlc3BvbnNlIG1ldGFkYXRhIHdpdGggY29ycmVsYXRpb24gSUQgYW5kIHRpbWluZy5cbiAgICogSXNzdWUgIzMwMTogUmVxdWVzdCBJRHMgYW5kIGRpc3RyaWJ1dGVkIHRyYWNpbmcgc3VwcG9ydC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRNZXRhKHN0YXJ0VGltZTogbnVtYmVyKTogUmVzcG9uc2VNZXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWVzdElkOiB0aGlzLmNvbnRleHRUcmFja2VyPy5nZXRDb3JyZWxhdGlvbklkKCkgPz8gJ3Vua25vd24nLFxuICAgICAgZHVyYXRpb25NczogcGFyc2VGbG9hdCgocGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWUpLnRvRml4ZWQoMikpLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdWNjZXNzZnVsIG9wZXJhdGlvbiByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgc3VjY2VzcyhkYXRhOiB1bmtub3duLCBzdGFydFRpbWU6IG51bWJlcik6IE9wZXJhdGlvblN1Y2Nlc3Mge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgZGF0YSxcbiAgICAgIF9tZXRhOiB0aGlzLmJ1aWxkTWV0YShzdGFydFRpbWUpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZmFpbGVkIG9wZXJhdGlvbiByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgZmFpbHVyZShlcnJvcjogc3RyaW5nLCBzdGFydFRpbWU6IG51bWJlcik6IE9wZXJhdGlvbkZhaWx1cmUge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgIGVycm9yLFxuICAgICAgX21ldGE6IHRoaXMuYnVpbGRNZXRhKHN0YXJ0VGltZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRmllbGQgU2VsZWN0aW9uIChJc3N1ZSAjMjAyKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFwcGx5IGZpZWxkIHNlbGVjdGlvbiBhbmQgbmFtZSB0cmFuc2Zvcm1hdGlvbiB0byBoYW5kbGVyIHJlc3BvbnNlLlxuICAgKlxuICAgKiBQcm9jZXNzZXMgdGhlIGBmaWVsZHNgIHBhcmFtZXRlciB0byBmaWx0ZXIgcmVzcG9uc2UgZGF0YTpcbiAgICogLSBJZiBmaWVsZHMgaXMgYW4gYXJyYXksIGZpbHRlciB0byB0aG9zZSBmaWVsZHMgb25seVxuICAgKiAtIElmIGZpZWxkcyBpcyBhIHByZXNldCBzdHJpbmcgKCdtaW5pbWFsJywgJ3N0YW5kYXJkJywgJ2Z1bGwnKSwgdXNlIHByZXNldFxuICAgKiAtIElmIGZpZWxkcyBpcyBub3QgcHJvdmlkZWQsIHRyYW5zZm9ybSBuYW1lcyBvbmx5IChuYW1lIOKGkiBlbGVtZW50X25hbWUpXG4gICAqXG4gICAqIEZvciByZXNwb25zZXMgd2l0aCBgcmVzdWx0c2Agb3IgYGl0ZW1zYCBhcnJheXMsIGZpZWxkIHNlbGVjdGlvbiBpcyBhcHBsaWVkXG4gICAqIHRvIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkgcmF0aGVyIHRoYW4gZmlsdGVyaW5nIHRoZSBjb250YWluZXIgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHJhdyBoYW5kbGVyIHJlc3VsdFxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3JpZ2luYWwgcGFyYW1zIGNvbnRhaW5pbmcgb3B0aW9uYWwgYGZpZWxkc2BcbiAgICogQHJldHVybnMgVHJhbnNmb3JtZWQgcmVzdWx0IHdpdGggZmllbGQgc2VsZWN0aW9uIGFwcGxpZWRcbiAgICovXG4gIHByaXZhdGUgYXBwbHlGaWVsZFNlbGVjdGlvbihcbiAgICByZXN1bHQ6IHVua25vd24sXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgKTogdW5rbm93biB7XG4gICAgLy8gU2tpcCB0cmFuc2Zvcm1hdGlvbiBmb3IgTUNQIHJlc3BvbnNlIGZvcm1hdCB3aXRoIGNvbnRlbnQgYXJyYXlcbiAgICAvLyBUaGVzZSBhcmUgZm9ybWF0dGVkIHRleHQgcmVzcG9uc2VzIHRoYXQgc2hvdWxkbid0IGJlIHRyYW5zZm9ybWVkXG4gICAgaWYgKHRoaXMuaXNNQ1BSZXNwb25zZShyZXN1bHQpKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkc1BhcmFtID0gcGFyYW1zPy5maWVsZHM7XG5cbiAgICAvLyBObyBmaWVsZHMgcGFyYW0gLSBhcHBseSBuYW1lIHRyYW5zZm9ybWF0aW9uIG9ubHlcbiAgICBpZiAoZmllbGRzUGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtV2l0aEFycmF5QXdhcmVuZXNzKHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLy8gUmVzb2x2ZSBmaWVsZHMgZnJvbSBwcmVzZXQgb3IgYXJyYXlcbiAgICBsZXQgZmllbGRzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcHJlc2V0OiAnbWluaW1hbCcgfCAnc3RhbmRhcmQnIHwgJ2Z1bGwnIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBmaWVsZHNQYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChpc1ZhbGlkUHJlc2V0KGZpZWxkc1BhcmFtKSkge1xuICAgICAgICBpZiAoZmllbGRzUGFyYW0gPT09ICdmdWxsJykge1xuICAgICAgICAgIC8vICdmdWxsJyBwcmVzZXQgPSBhbGwgZmllbGRzLCBqdXN0IHRyYW5zZm9ybSBuYW1lc1xuICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHByZXNldCA9IGZpZWxkc1BhcmFtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSW52YWxpZCBwcmVzZXQgLSB0cmVhdCBhcyBzaW5nbGUgZmllbGRcbiAgICAgICAgZmllbGRzID0gW2ZpZWxkc1BhcmFtXTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRzUGFyYW0pKSB7XG4gICAgICAvLyBGaWx0ZXIgdG8gc3RyaW5ncyBvbmx5LCB3YXJuIGFib3V0IG5vbi1zdHJpbmcgZWxlbWVudHNcbiAgICAgIGNvbnN0IG5vblN0cmluZ0NvdW50ID0gZmllbGRzUGFyYW0uZmlsdGVyKGYgPT4gdHlwZW9mIGYgIT09ICdzdHJpbmcnKS5sZW5ndGg7XG4gICAgICBpZiAobm9uU3RyaW5nQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgIGBGaWVsZCBzZWxlY3Rpb246ICR7bm9uU3RyaW5nQ291bnR9IG5vbi1zdHJpbmcgZWxlbWVudChzKSBpbiBmaWVsZHMgYXJyYXkgaWdub3JlZGBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RyaW5nRmllbGRzID0gZmllbGRzUGFyYW0uZmlsdGVyKChmKTogZiBpcyBzdHJpbmcgPT4gdHlwZW9mIGYgPT09ICdzdHJpbmcnKTtcbiAgICAgIGlmIChzdHJpbmdGaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGZpZWxkcyA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vcm1hbGl6ZSBmaWVsZCBuYW1lcyBmb3Igc2VjdXJpdHkgYW5kIGNoZWNrIGZvciBVbmljb2RlIGlzc3Vlc1xuICAgICAgICBjb25zdCB7IG5vcm1hbGl6ZWQsIHdhcm5pbmdzIH0gPSBub3JtYWxpemVGaWVsZE5hbWVzKHN0cmluZ0ZpZWxkcyk7XG4gICAgICAgIGlmICh3YXJuaW5ncykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBGaWVsZCBzZWxlY3Rpb24gVW5pY29kZSBub3JtYWxpemF0aW9uOiAke3dhcm5pbmdzLmpvaW4oJzsgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRzID0gbm9ybWFsaXplZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBObyB2YWxpZCBmaWVsZHMgLSBqdXN0IHRyYW5zZm9ybSBuYW1lc1xuICAgIGlmICghZmllbGRzICYmICFwcmVzZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQpO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IGZpZWxkIGZpbHRlcmluZyB3aXRoIGFycmF5LWF3YXJlbmVzc1xuICAgIHJldHVybiB0aGlzLmZpbHRlcldpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQsIGZpZWxkcywgcHJlc2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gcmVzcG9uc2Ugd2l0aCBhd2FyZW5lc3Mgb2YgbmVzdGVkIGFycmF5cy5cbiAgICogQXBwbGllcyBuYW1lIHRyYW5zZm9ybWF0aW9uIHRvIGl0ZW1zIHdpdGhpbiBgcmVzdWx0c2Agb3IgYGl0ZW1zYCBhcnJheXMuXG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybVdpdGhBcnJheUF3YXJlbmVzcyhyZXN1bHQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAocmVzdWx0ICE9PSBudWxsICYmIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHJlc3VsdCkpIHtcbiAgICAgIGNvbnN0IG9iaiA9IHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNvbW1vbiBhcnJheSBjb250YWluZXIgcGF0dGVybnNcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iai5yZXN1bHRzKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnRoaXMudHJhbnNmb3JtVG9wTGV2ZWwob2JqLCBbJ3Jlc3VsdHMnXSksXG4gICAgICAgICAgcmVzdWx0czogZmlsdGVyRmllbGRzKG9iai5yZXN1bHRzLCB7IHRyYW5zZm9ybU5hbWVzOiB0cnVlIH0pLmRhdGEsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmouaXRlbXMpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4udGhpcy50cmFuc2Zvcm1Ub3BMZXZlbChvYmosIFsnaXRlbXMnXSksXG4gICAgICAgICAgaXRlbXM6IGZpbHRlckZpZWxkcyhvYmouaXRlbXMsIHsgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiB0cmFuc2Zvcm0gZW50aXJlIHJlc3BvbnNlXG4gICAgY29uc3QgeyBkYXRhIH0gPSBmaWx0ZXJGaWVsZHMocmVzdWx0LCB7IHRyYW5zZm9ybU5hbWVzOiB0cnVlIH0pO1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciByZXNwb25zZSB3aXRoIGF3YXJlbmVzcyBvZiBuZXN0ZWQgYXJyYXlzLlxuICAgKiBBcHBsaWVzIGZpZWxkIGZpbHRlcmluZyB0byBpdGVtcyB3aXRoaW4gYHJlc3VsdHNgIG9yIGBpdGVtc2AgYXJyYXlzLlxuICAgKi9cbiAgcHJpdmF0ZSBmaWx0ZXJXaXRoQXJyYXlBd2FyZW5lc3MoXG4gICAgcmVzdWx0OiB1bmtub3duLFxuICAgIGZpZWxkcz86IHN0cmluZ1tdLFxuICAgIHByZXNldD86ICdtaW5pbWFsJyB8ICdzdGFuZGFyZCcgfCAnZnVsbCdcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICBjb25zdCBvYmogPSByZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIC8vIENoZWNrIGZvciBjb21tb24gYXJyYXkgY29udGFpbmVyIHBhdHRlcm5zXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmoucmVzdWx0cykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybVRvcExldmVsKG9iaiwgWydyZXN1bHRzJ10pLFxuICAgICAgICAgIHJlc3VsdHM6IGZpbHRlckZpZWxkcyhvYmoucmVzdWx0cywgeyBmaWVsZHMsIHByZXNldCwgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iai5pdGVtcykpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi50aGlzLnRyYW5zZm9ybVRvcExldmVsKG9iaiwgWydpdGVtcyddKSxcbiAgICAgICAgICBpdGVtczogZmlsdGVyRmllbGRzKG9iai5pdGVtcywgeyBmaWVsZHMsIHByZXNldCwgdHJhbnNmb3JtTmFtZXM6IHRydWUgfSkuZGF0YSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiBmaWx0ZXIgZW50aXJlIHJlc3BvbnNlXG4gICAgY29uc3QgeyBkYXRhIH0gPSBmaWx0ZXJGaWVsZHMocmVzdWx0LCB7IGZpZWxkcywgcHJlc2V0LCB0cmFuc2Zvcm1OYW1lczogdHJ1ZSB9KTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdG9wLWxldmVsIGZpZWxkcyBvZiBhbiBvYmplY3QsIGV4Y2x1ZGluZyBzcGVjaWZpZWQga2V5cy5cbiAgICogVXNlZCB0byBwcmVzZXJ2ZSBjb250YWluZXIgbWV0YWRhdGEgKHRvdGFsLCBxdWVyeSwgZXRjLikgd2hpbGUgZmlsdGVyaW5nIG5lc3RlZCBhcnJheXMuXG4gICAqL1xuICBwcml2YXRlIHRyYW5zZm9ybVRvcExldmVsKFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZXhjbHVkZUtleXM6IHN0cmluZ1tdXG4gICk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgaWYgKCFleGNsdWRlS2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcmVzdWx0IGlzIGFuIE1DUCByZXNwb25zZSBmb3JtYXQgKHdpdGggY29udGVudCBhcnJheSkuXG4gICAqIFRoZXNlIHJlc3BvbnNlcyBjb250YWluIGZvcm1hdHRlZCB0ZXh0IGFuZCBzaG91bGRuJ3QgYmUgdHJhbnNmb3JtZWQuXG4gICAqL1xuICBwcml2YXRlIGlzTUNQUmVzcG9uc2UocmVzdWx0OiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHJlc3VsdCAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICdjb250ZW50JyBpbiByZXN1bHQgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkoKHJlc3VsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuY29udGVudClcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSW52YWxpZFBvbGljeUFkdmlzb3J5KGludmFsaWRQb2xpY3lDb3VudDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3Qgc2luZ3VsYXIgPSBpbnZhbGlkUG9saWN5Q291bnQgPT09IDE7XG4gIHJldHVybiBgJHtpbnZhbGlkUG9saWN5Q291bnR9IGFjdGl2ZSBlbGVtZW50JHtzaW5ndWxhciA/ICcnIDogJ3MnfSBoYSR7c2luZ3VsYXIgPyAncycgOiAndmUnfSBtYWxmb3JtZWQgZ2F0ZWtlZXBlciBwb2xpY3kuIFRoZSBlbGVtZW50JHtzaW5ndWxhciA/ICcgcmVtYWlucycgOiAncyByZW1haW4nfSBhY3RpdmUsIGJ1dCB0aGF0IHBvbGljeSBpcyBub3QgZW5mb3JjZWFibGUgdW50aWwgZml4ZWQuYDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlZmZlY3RpdmUgQ0xJIGFwcHJvdmFsIHBvbGljeSBmcm9tIGFsbCBhY3RpdmUgZWxlbWVudHMuXG4gKlxuICogVW5pb25zIGByZXF1aXJlQXBwcm92YWxgIGFycmF5cyBhY3Jvc3MgYWxsIGVsZW1lbnRzLiBUYWtlcyB0aGUgbW9zdFxuICogY29uc2VydmF0aXZlIChzbWFsbGVzdCkgVFRMLiBGYWxscyBiYWNrIHRvIGVudiB2YXIgYERPTExIT1VTRV9DTElfQVBQUk9WQUxfUE9MSUNZYC5cbiAqXG4gKiBAcGFyYW0gYWN0aXZlRWxlbWVudHMgLSBDdXJyZW50bHkgYWN0aXZlIGVsZW1lbnRzXG4gKiBAcmV0dXJucyBSZXNvbHZlZCBhcHByb3ZhbCBwb2xpY3lcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUNsaUFwcHJvdmFsUG9saWN5KGFjdGl2ZUVsZW1lbnRzOiBBY3RpdmVFbGVtZW50W10pOiBDbGlBcHByb3ZhbFBvbGljeSB7XG4gIGNvbnN0IHJlcXVpcmVBcHByb3ZhbCA9IG5ldyBTZXQ8J21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnPigpO1xuICBsZXQgZGVmYXVsdFNjb3BlOiBDbGlBcHByb3ZhbFNjb3BlIHwgdW5kZWZpbmVkO1xuICBsZXQgdHRsU2Vjb25kczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhY3RpdmVFbGVtZW50cykge1xuICAgIGNvbnN0IHBvbGljeSA9IGVsZW1lbnQubWV0YWRhdGE/LmdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zPy5hcHByb3ZhbFBvbGljeTtcbiAgICBpZiAoIXBvbGljeSkgY29udGludWU7XG5cbiAgICBpZiAocG9saWN5LnJlcXVpcmVBcHByb3ZhbCkge1xuICAgICAgZm9yIChjb25zdCBsZXZlbCBvZiBwb2xpY3kucmVxdWlyZUFwcHJvdmFsKSB7XG4gICAgICAgIHJlcXVpcmVBcHByb3ZhbC5hZGQobGV2ZWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocG9saWN5LmRlZmF1bHRTY29wZSAmJiAhZGVmYXVsdFNjb3BlKSB7XG4gICAgICBkZWZhdWx0U2NvcGUgPSBwb2xpY3kuZGVmYXVsdFNjb3BlO1xuICAgIH1cbiAgICBpZiAocG9saWN5LnR0bFNlY29uZHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHRsU2Vjb25kcyA9IHR0bFNlY29uZHMgPT09IHVuZGVmaW5lZCA/IHBvbGljeS50dGxTZWNvbmRzIDogTWF0aC5taW4odHRsU2Vjb25kcywgcG9saWN5LnR0bFNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIGVudmlyb25tZW50IHZhcmlhYmxlXG4gIGlmIChyZXF1aXJlQXBwcm92YWwuc2l6ZSA9PT0gMCkge1xuICAgIGNvbnN0IGVudlBvbGljeSA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9DTElfQVBQUk9WQUxfUE9MSUNZO1xuICAgIGlmIChlbnZQb2xpY3kpIHtcbiAgICAgIGNvbnN0IGxldmVscyA9IGVudlBvbGljeS5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKS5maWx0ZXIocyA9PiBzID09PSAnbW9kZXJhdGUnIHx8IHMgPT09ICdkYW5nZXJvdXMnKTtcbiAgICAgIGZvciAoY29uc3QgbGV2ZWwgb2YgbGV2ZWxzKSB7XG4gICAgICAgIHJlcXVpcmVBcHByb3ZhbC5hZGQobGV2ZWwgYXMgJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHJlcXVpcmVBcHByb3ZhbDogcmVxdWlyZUFwcHJvdmFsLnNpemUgPiAwID8gQXJyYXkuZnJvbShyZXF1aXJlQXBwcm92YWwpIDogdW5kZWZpbmVkLFxuICAgIGRlZmF1bHRTY29wZSxcbiAgICB0dGxTZWNvbmRzLFxuICB9O1xufVxuIl19
|