@dollhousemcp/mcp-server 2.0.12 → 2.0.14
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 +20 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +19 -9
- package/dist/elements/BaseElement.js +2 -2
- package/dist/elements/memories/Memory.d.ts.map +1 -1
- package/dist/elements/memories/Memory.js +3 -3
- package/dist/elements/skills/Skill.d.ts.map +1 -1
- package/dist/elements/skills/Skill.js +4 -4
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +4 -4
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ElementCRUDHandler.d.ts +10 -0
- package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
- package/dist/handlers/ElementCRUDHandler.js +123 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +1 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +31 -2
- package/dist/portfolio/DefaultElementProvider.d.ts +8 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +43 -1
- package/dist/security/contentValidator.d.ts +15 -0
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +40 -2
- package/dist/services/ActivationStore.d.ts +20 -0
- package/dist/services/ActivationStore.d.ts.map +1 -1
- package/dist/services/ActivationStore.js +104 -1
- package/dist/web/console/IngestRoutes.d.ts +1 -0
- package/dist/web/console/IngestRoutes.d.ts.map +1 -1
- package/dist/web/console/IngestRoutes.js +4 -1
- package/dist/web/console/UnifiedConsole.js +2 -1
- package/dist/web/public/permissions.css +224 -16
- package/dist/web/public/permissions.js +326 -63
- package/dist/web/public/sessions.js +218 -98
- package/dist/web/public/styles.css +15 -10
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +57 -19
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +2 -1
- package/package.json +2 -2
- package/server.json +2 -2
|
@@ -37,6 +37,14 @@ export declare class DefaultElementProvider {
|
|
|
37
37
|
private static metadataCache;
|
|
38
38
|
private static readonly MAX_CACHE_SIZE;
|
|
39
39
|
constructor(config?: DefaultElementProviderConfig);
|
|
40
|
+
/**
|
|
41
|
+
* Read data/HASHES.json (shipped with the npm package) and register each
|
|
42
|
+
* SHA-256 hash with ContentValidator as trusted bundled content.
|
|
43
|
+
*
|
|
44
|
+
* Only files whose on-disk hash matches the manifest entry are registered —
|
|
45
|
+
* any post-install modification breaks the hash and revokes trust automatically.
|
|
46
|
+
*/
|
|
47
|
+
private registerBundledHashes;
|
|
40
48
|
/**
|
|
41
49
|
* Get the current loadTestData configuration value
|
|
42
50
|
* @returns Whether test data loading is enabled
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultElementProvider.d.ts","sourceRoot":"","sources":["../../src/portfolio/DefaultElementProvider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"DefaultElementProvider.d.ts","sourceRoot":"","sources":["../../src/portfolio/DefaultElementProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ import { ElementType } from './types.js';
|
|
|
17
17
|
import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
|
|
18
18
|
import { SecurityMonitor } from '../security/securityMonitor.js';
|
|
19
19
|
import { SecureYamlParser } from '../security/secureYamlParser.js';
|
|
20
|
+
import { ContentValidator } from '../security/contentValidator.js';
|
|
20
21
|
// File operation constants
|
|
21
22
|
export const FILE_CONSTANTS = {
|
|
22
23
|
ELEMENT_EXTENSION: '.md',
|
|
@@ -102,6 +103,47 @@ export class DefaultElementProvider {
|
|
|
102
103
|
logger.info('[DefaultElementProvider] Development mode detected - test data loading disabled');
|
|
103
104
|
logger.info('[DefaultElementProvider] To enable test data, set DOLLHOUSE_LOAD_TEST_DATA=true');
|
|
104
105
|
}
|
|
106
|
+
// Register bundled element hashes with ContentValidator so verified bundled
|
|
107
|
+
// content does not trigger false-positive CRITICAL injection alerts at startup.
|
|
108
|
+
this.registerBundledHashes();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Read data/HASHES.json (shipped with the npm package) and register each
|
|
112
|
+
* SHA-256 hash with ContentValidator as trusted bundled content.
|
|
113
|
+
*
|
|
114
|
+
* Only files whose on-disk hash matches the manifest entry are registered —
|
|
115
|
+
* any post-install modification breaks the hash and revokes trust automatically.
|
|
116
|
+
*/
|
|
117
|
+
registerBundledHashes() {
|
|
118
|
+
try {
|
|
119
|
+
const hashesPath = path.join(this.__dirname, '..', 'data', 'HASHES.json');
|
|
120
|
+
const raw = fsSync.readFileSync(hashesPath, 'utf-8');
|
|
121
|
+
const manifest = JSON.parse(raw);
|
|
122
|
+
const dataDir = path.join(this.__dirname, '..', 'data');
|
|
123
|
+
let registered = 0;
|
|
124
|
+
for (const [relPath, expectedHash] of Object.entries(manifest.files)) {
|
|
125
|
+
const fullPath = path.join(dataDir, relPath);
|
|
126
|
+
try {
|
|
127
|
+
const content = fsSync.readFileSync(fullPath);
|
|
128
|
+
const actualHash = createHash('sha256').update(content).digest('hex');
|
|
129
|
+
if (actualHash === expectedHash) {
|
|
130
|
+
ContentValidator.registerBundledHash(expectedHash);
|
|
131
|
+
registered++;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
logger.warn(`[DefaultElementProvider] Bundled file hash mismatch — treating as untrusted: ${relPath}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// File missing from this build's data/ — skip silently
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
logger.debug(`[DefaultElementProvider] Registered ${registered} verified bundled element hashes`);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// HASHES.json missing (older install, dev mode, or stripped package) — degrade gracefully
|
|
145
|
+
logger.debug('[DefaultElementProvider] data/HASHES.json not found — bundled element trust skipped');
|
|
146
|
+
}
|
|
105
147
|
}
|
|
106
148
|
/**
|
|
107
149
|
* Get the current loadTestData configuration value
|
|
@@ -986,4 +1028,4 @@ export class DefaultElementProvider {
|
|
|
986
1028
|
}
|
|
987
1029
|
}
|
|
988
1030
|
}
|
|
989
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVsZW1lbnRQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vRGVmYXVsdEVsZW1lbnRQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxxR0FBcUc7QUFDckcseUdBQXlHO0FBQ3pHLDZGQUE2RjtBQUM3RixPQUFPLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR25FLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsTUFBTTtJQUNyQixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsZ0NBQWdDO0lBQ2pFLGtCQUFrQixFQUFFLFFBQVE7SUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxzQ0FBc0M7Q0FDcEQsQ0FBQztBQUVYLDZCQUE2QjtBQUM3QixzRUFBc0U7QUFDdEUsTUFBTSxtQkFBbUIsR0FB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InNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGVmYXVsdEVsZW1lbnRQcm92aWRlciAtIFBvcHVsYXRlcyBwb3J0Zm9saW8gd2l0aCBkZWZhdWx0IGVsZW1lbnRzIGZyb20gYnVuZGxlZCBkYXRhXG4gKiBcbiAqIFRoaXMgY2xhc3MgaGFuZGxlcyBjb3B5aW5nIGRlZmF1bHQgcGVyc29uYXMsIHNraWxscywgdGVtcGxhdGVzLCBhbmQgb3RoZXIgZWxlbWVudHNcbiAqIGZyb20gdGhlIE5QTSBwYWNrYWdlIG9yIEdpdCByZXBvc2l0b3J5IHRvIHRoZSB1c2VyJ3MgcG9ydGZvbGlvIG9uIGZpcnN0IHJ1bi5cbiAqIEl0IGVuc3VyZXMgdXNlcnMgaGF2ZSBleGFtcGxlIGNvbnRlbnQgdG8gd29yayB3aXRoIGltbWVkaWF0ZWx5IGFmdGVyIGluc3RhbGxhdGlvbi5cbiAqL1xuXG4vLyBOT1RFOiBmc1N5bmMgaXMgaW50ZW50aW9uYWxseSBrZXB0IGZvciBzeW5jaHJvbm91cyBkZXZlbG9wbWVudCBtb2RlIGRldGVjdGlvbiBhdCBtb2R1bGUgbG9hZCB0aW1lLlxuLy8gVGhlIElTX0RFVkVMT1BNRU5UX01PREUgY2hlY2sgcnVucyBkdXJpbmcgbW9kdWxlIGluaXRpYWxpemF0aW9uIGJlZm9yZSBhc3luYyBvcGVyYXRpb25zIGFyZSBhdmFpbGFibGUuXG4vLyBBbGwgb3RoZXIgZmlsZSBvcGVyYXRpb25zIHVzZSBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgZm9yIGNlbnRyYWxpemVkLCBzZWN1cmUgZmlsZSBoYW5kbGluZy5cbmltcG9ydCAqIGFzIGZzU3luYyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgSUZpbGVPcGVyYXRpb25zU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL0ZpbGVPcGVyYXRpb25zU2VydmljZS5qcyc7XG5cbi8vIEZpbGUgb3BlcmF0aW9uIGNvbnN0YW50c1xuZXhwb3J0IGNvbnN0IEZJTEVfQ09OU1RBTlRTID0ge1xuICBFTEVNRU5UX0VYVEVOU0lPTjogJy5tZCcsXG4gIFlBTUxfRVhURU5TSU9OOiAnLnlhbWwnLFxuICBZTUxfRVhURU5TSU9OOiAnLnltbCcsXG4gIEpTT05fRVhURU5TSU9OOiAnLmpzb24nLFxuICBNQVhfRklMRV9TSVpFOiAxMCAqIDEwMjQgKiAxMDI0LCAvLyAxME1CIG1heCBmaWxlIHNpemUgZm9yIHNhZmV0eVxuICBDSEVDS1NVTV9BTEdPUklUSE06ICdzaGEyNTYnLFxuICBGSUxFX1BFUk1JU1NJT05TOiAwbzY0NCxcbiAgQ0hVTktfU0laRTogNjQgKiAxMDI0IC8vIDY0S0IgY2h1bmtzIGZvciByZWFkaW5nIGxhcmdlIGZpbGVzXG59IGFzIGNvbnN0O1xuXG4vLyBEZXZlbG9wbWVudCBtb2RlIGRldGVjdGlvblxuLy8gV2hlbiBydW5uaW5nIGZyb20gYSBnaXQgY2xvbmUsIHdlIGRvbid0IHdhbnQgdG8gYXV0by1sb2FkIHRlc3QgZGF0YVxuY29uc3QgSVNfREVWRUxPUE1FTlRfTU9ERSA9ICgoKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gYSBnaXQgcmVwb3NpdG9yeSAoZGV2ZWxvcG1lbnQgbW9kZSlcbiAgICBjb25zdCBnaXREaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5naXQnKTtcbiAgICByZXR1cm4gZnNTeW5jLmV4aXN0c1N5bmMoZ2l0RGlyKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59KSgpO1xuXG4vLyBJbnRlcm5hbCBjb25zdGFudHNcbmNvbnN0IENPUFlfUkVUUllfQVRURU1QVFMgPSAzO1xuY29uc3QgQ09QWV9SRVRSWV9ERUxBWSA9IDEwMDsgLy8gbXNcblxuZXhwb3J0IGludGVyZmFjZSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29uZmlnIHtcbiAgLyoqIEN1c3RvbSBkYXRhIGRpcmVjdG9yeSBwYXRocyB0byBzZWFyY2ggKGNoZWNrZWQgYmVmb3JlIGRlZmF1bHQgcGF0aHMpICovXG4gIGN1c3RvbURhdGFQYXRocz86IHN0cmluZ1tdO1xuICAvKiogV2hldGhlciB0byB1c2UgZGVmYXVsdCBzZWFyY2ggcGF0aHMgYWZ0ZXIgY3VzdG9tIHBhdGhzICovXG4gIHVzZURlZmF1bHRQYXRocz86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRvIGxvYWQgdGVzdC9leGFtcGxlIGRhdGEgZnJvbSByZXBvc2l0b3J5IChkZWZhdWx0OiBmYWxzZSBpbiBkZXYgbW9kZSkgKi9cbiAgbG9hZFRlc3REYXRhPzogYm9vbGVhbjtcbiAgLyoqIEZpbGVPcGVyYXRpb25zU2VydmljZSBmb3IgY2VudHJhbGl6ZWQgZmlsZSBvcGVyYXRpb25zICovXG4gIGZpbGVPcGVyYXRpb25zPzogSUZpbGVPcGVyYXRpb25zU2VydmljZTtcbn1cblxuLy8gUEVSRk9STUFOQ0U6IE1ldGFkYXRhIGNhY2hlIHdpdGggbXRpbWUtYmFzZWQgaW52YWxpZGF0aW9uXG5pbnRlcmZhY2UgTWV0YWRhdGFDYWNoZUVudHJ5IHtcbiAgbWV0YWRhdGE6IGFueTtcbiAgbXRpbWU6IG51bWJlcjtcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdEVsZW1lbnRQcm92aWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX19kaXJuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhdGljIGNhY2hlZERhdGFEaXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXRpYyBwb3B1bGF0ZUluUHJvZ3Jlc3M6IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogRGVmYXVsdEVsZW1lbnRQcm92aWRlckNvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBmaWxlT3BlcmF0aW9ucz86IElGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG4gIHByaXZhdGUgc3RhdGljIGxvZ0xpc3RlbmVyPzogKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQ7XG5cbiAgc3RhdGljIGFkZExvZ0xpc3RlbmVyKGZuOiAobGV2ZWw6ICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubG9nTGlzdGVuZXIgPSBmbjtcbiAgICByZXR1cm4gKCkgPT4geyB0aGlzLmxvZ0xpc3RlbmVyID0gdW5kZWZpbmVkOyB9O1xuICB9XG5cbiAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OOiBDYWNoZSBtZXRhZGF0YSB3aXRoIGZpbGUgbXRpbWUgZm9yIGludmFsaWRhdGlvblxuICBwcml2YXRlIHN0YXRpYyBtZXRhZGF0YUNhY2hlOiBNYXA8c3RyaW5nLCBNZXRhZGF0YUNhY2hlRW50cnk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfQ0FDSEVfU0laRSA9IDIwOyAvLyBNRU1PUlkgTEVBSyBGSVg6IEZ1cnRoZXIgcmVkdWNlZCBjYWNoZSBzaXplIHRvIHByZXZlbnQgYWNjdW11bGF0aW9uIGR1cmluZyBwZXJmb3JtYW5jZSB0ZXN0c1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZz86IERlZmF1bHRFbGVtZW50UHJvdmlkZXJDb25maWcpIHtcbiAgICBjb25zdCBfX2ZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgIHRoaXMuX19kaXJuYW1lID0gcGF0aC5kaXJuYW1lKF9fZmlsZW5hbWUpO1xuXG4gICAgLy8gU3RvcmUgZmlsZU9wZXJhdGlvbnMgc2VydmljZSBpZiBwcm92aWRlZFxuICAgIHRoaXMuZmlsZU9wZXJhdGlvbnMgPSBjb25maWc/LmZpbGVPcGVyYXRpb25zO1xuICAgIFxuICAgIC8vIENoZWNrIGVudmlyb25tZW50IHZhcmlhYmxlIGZvciB0ZXN0IGRhdGEgbG9hZGluZ1xuICAgIGNvbnN0IGVudkxvYWRUZXN0RGF0YSA9IHByb2Nlc3MuZW52LkRPTExIT1VTRV9MT0FEX1RFU1RfREFUQTtcbiAgICBjb25zdCBsb2FkVGVzdERhdGFGcm9tRW52ID0gZW52TG9hZFRlc3REYXRhID09PSAndHJ1ZScgfHwgZW52TG9hZFRlc3REYXRhID09PSAnMSc7XG4gICAgY29uc3QgZGlzYWJsZVRlc3REYXRhRnJvbUVudiA9IGVudkxvYWRUZXN0RGF0YSA9PT0gJ2ZhbHNlJyB8fCBlbnZMb2FkVGVzdERhdGEgPT09ICcwJztcbiAgICBcbiAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBkZXZlbG9wbWVudCBtb2RlICh3aXRoIHJlc3BlY3QgdG8gRk9SQ0VfUFJPRFVDVElPTl9NT0RFIG92ZXJyaWRlKVxuICAgIGNvbnN0IGlzRGV2TW9kZSA9ICgoKSA9PiB7XG4gICAgICAvLyBSZXNwZWN0IEZPUkNFX1BST0RVQ1RJT05fTU9ERSBvdmVycmlkZSBmaXJzdFxuICAgICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm9yY2UgcHJvZHVjdGlvbiBtb2RlXG4gICAgICB9XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuRk9SQ0VfUFJPRFVDVElPTl9NT0RFID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBGb3JjZSBkZXZlbG9wbWVudCBtb2RlXG4gICAgICB9XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gZ2l0IGRldGVjdGlvblxuICAgICAgcmV0dXJuIElTX0RFVkVMT1BNRU5UX01PREU7XG4gICAgfSkoKTtcbiAgICBcbiAgICAvLyBEZXRlcm1pbmUgbG9hZFRlc3REYXRhIHZhbHVlXG4gICAgbGV0IGNvbXB1dGVkTG9hZFRlc3REYXRhOiBib29sZWFuO1xuICAgIGlmIChsb2FkVGVzdERhdGFGcm9tRW52KSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCBleHBsaWNpdGx5IGVuYWJsZXMgdGVzdCBkYXRhXG4gICAgICBjb21wdXRlZExvYWRUZXN0RGF0YSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChkaXNhYmxlVGVzdERhdGFGcm9tRW52KSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCBleHBsaWNpdGx5IGRpc2FibGVzIHRlc3QgZGF0YVxuICAgICAgY29tcHV0ZWRMb2FkVGVzdERhdGEgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRGVmYXVsdCBsb2dpYzogZW5hYmxlIGluIHByb2R1Y3Rpb24sIGRpc2FibGUgaW4gZGV2ZWxvcG1lbnQgdW5sZXNzIGNvbmZpZyBvdmVycmlkZXNcbiAgICAgIGNvbXB1dGVkTG9hZFRlc3REYXRhID0gIWlzRGV2TW9kZSAmJiAoY29uZmlnPy5sb2FkVGVzdERhdGEgPz8gdHJ1ZSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgdXNlRGVmYXVsdFBhdGhzOiB0cnVlLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgLy8gQXBwbHkgZmluYWwgbG9hZFRlc3REYXRhIGxvZ2ljIC0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBkZXZlbG9wbWVudCBtb2RlIHRha2UgcHJlY2VkZW5jZVxuICAgICAgbG9hZFRlc3REYXRhOiBsb2FkVGVzdERhdGFGcm9tRW52ID8gdHJ1ZSA6IGRpc2FibGVUZXN0RGF0YUZyb21FbnYgPyBmYWxzZSA6IGNvbXB1dGVkTG9hZFRlc3REYXRhXG4gICAgfTtcbiAgICBcbiAgICBpZiAoaXNEZXZNb2RlICYmICF0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRGV2ZWxvcG1lbnQgbW9kZSBkZXRlY3RlZCAtIHRlc3QgZGF0YSBsb2FkaW5nIGRpc2FibGVkJyk7XG4gICAgICBsb2dnZXIuaW5mbygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFRvIGVuYWJsZSB0ZXN0IGRhdGEsIHNldCBET0xMSE9VU0VfTE9BRF9URVNUX0RBVEE9dHJ1ZScpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBsb2FkVGVzdERhdGEgY29uZmlndXJhdGlvbiB2YWx1ZVxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRlc3QgZGF0YSBsb2FkaW5nIGlzIGVuYWJsZWRcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNUZXN0RGF0YUxvYWRpbmdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5sb2FkVGVzdERhdGEgPz8gZmFsc2U7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgd2hldGhlciB0aGUgc3lzdGVtIGlzIGluIGRldmVsb3BtZW50IG1vZGVcbiAgICogQHJldHVybnMgV2hldGhlciBydW5uaW5nIGluIGRldmVsb3BtZW50IG1vZGVcbiAgICovXG4gIHB1YmxpYyBnZXQgaXNEZXZlbG9wbWVudE1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIElTX0RFVkVMT1BNRU5UX01PREU7XG4gIH1cblxuICAvLyA9PT09PSBIRUxQRVIgTUVUSE9EUyBGT1IgRklMRSBPUEVSQVRJT05TID09PT09XG4gIC8vIFRoZXNlIG1ldGhvZHMgcHJvdmlkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdoZW4gZmlsZU9wZXJhdGlvbnMgaXMgbm90IGluamVjdGVkXG4gIC8vIGFuZCBjZW50cmFsaXplIGFsbCBmaWxlIHN5c3RlbSBjYWxscyB0aHJvdWdoIEZpbGVPcGVyYXRpb25zU2VydmljZSB3aGVuIGF2YWlsYWJsZVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8ZnNTeW5jLlN0YXRzPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLnN0YXQoZmlsZVBhdGgpO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjazogaW1wb3J0IGZzL3Byb21pc2VzIGR5bmFtaWNhbGx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICByZXR1cm4gZnMuc3RhdChmaWxlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxpc3REaXIoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5saXN0RGlyZWN0b3J5KGRpclBhdGgpO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIHJldHVybiBmcy5yZWFkZGlyKGRpclBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaWxlRXhpc3RzKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuZXhpc3RzKGZpbGVQYXRoKTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuYWNjZXNzKGZpbGVQYXRoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWFrZURpcmVjdG9yeShkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuY3JlYXRlRGlyZWN0b3J5KGRpclBhdGgpO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIGF3YWl0IGZzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RmlsZU9wKHNvdXJjZVBhdGg6IHN0cmluZywgZGVzdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5jb3B5RmlsZShzb3VyY2VQYXRoLCBkZXN0UGF0aCwge1xuICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvcHlGaWxlT3AnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzb3VyY2VQYXRoLCBkZXN0UGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNobW9kRmlsZShmaWxlUGF0aDogc3RyaW5nLCBtb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuY2htb2QoZmlsZVBhdGgsIG1vZGUsIHtcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jaG1vZEZpbGUnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBhd2FpdCBmcy5jaG1vZChmaWxlUGF0aCwgbW9kZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRlbGV0ZUZpbGVPcChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLmRlbGV0ZUZpbGUoZmlsZVBhdGgsIHVuZGVmaW5lZCwge1xuICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmRlbGV0ZUZpbGVPcCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgIGF3YWl0IGZzLnVubGluayhmaWxlUGF0aCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRGaWxlQ29udGVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMucmVhZEZpbGUoZmlsZVBhdGgsIHtcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5yZWFkRmlsZUNvbnRlbnQnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICByZXR1cm4gZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGYtOCcpO1xuICB9XG5cbiAgLy8gPT09PT0gRU5EIEhFTFBFUiBNRVRIT0RTID09PT09XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBwYXRocyBmb3IgYnVuZGxlZCBkYXRhIGRpcmVjdG9yeVxuICAgKiBPcmRlcmVkIGJ5IHByaW9yaXR5IC0gY3VzdG9tIHBhdGhzIGZpcnN0LCB0aGVuIGRldmVsb3BtZW50L2dpdCwgdGhlbiBOUE0gbG9jYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGdldCBkYXRhU2VhcmNoUGF0aHMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgIFxuICAgIC8vIEFkZCBjdXN0b20gcGF0aHMgZmlyc3QgKGhpZ2hlc3QgcHJpb3JpdHkpXG4gICAgaWYgKHRoaXMuY29uZmlnLmN1c3RvbURhdGFQYXRocykge1xuICAgICAgcGF0aHMucHVzaCguLi50aGlzLmNvbmZpZy5jdXN0b21EYXRhUGF0aHMpO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgZGVmYXVsdCBwYXRocyBpZiBlbmFibGVkXG4gICAgaWYgKHRoaXMuY29uZmlnLnVzZURlZmF1bHRQYXRocyAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIFNraXAgZGV2ZWxvcG1lbnQvcmVwb3NpdG9yeSBkYXRhIHBhdGhzIHVubGVzcyB0ZXN0IGRhdGEgbG9hZGluZyBpcyBlbmFibGVkXG4gICAgICBpZiAodGhpcy5jb25maWcubG9hZFRlc3REYXRhKSB7XG4gICAgICAgIC8vIERldmVsb3BtZW50L0dpdCBpbnN0YWxsYXRpb24gKHJlbGF0aXZlIHRvIHRoaXMgZmlsZSlcbiAgICAgICAgcGF0aHMucHVzaChcbiAgICAgICAgICBwYXRoLmpvaW4odGhpcy5fX2Rpcm5hbWUsICcuLi8uLi9kYXRhJyksXG4gICAgICAgICAgcGF0aC5qb2luKHRoaXMuX19kaXJuYW1lLCAnLi4vLi4vLi4vZGF0YScpLFxuICAgICAgICAgIC8vIEN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKGxhc3QgcmVzb3J0KVxuICAgICAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnZGF0YScpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEFsd2F5cyBpbmNsdWRlIE5QTSBpbnN0YWxsYXRpb24gcGF0aHMgKHRoZXNlIHdvdWxkIGhhdmUgcHJvZHVjdGlvbiBkYXRhKVxuICAgICAgcGF0aHMucHVzaChcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBtYWNPUyBIb21lYnJld1xuICAgICAgICAnL29wdC9ob21lYnJldy9saWIvbm9kZV9tb2R1bGVzL0Bkb2xsaG91c2VtY3AvbWNwLXNlcnZlci9kYXRhJyxcbiAgICAgICAgXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gc3RhbmRhcmQgVW5peC9MaW51eFxuICAgICAgICAnL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzL0Bkb2xsaG91c2VtY3AvbWNwLXNlcnZlci9kYXRhJyxcbiAgICAgICAgJy91c3IvbGliL25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIvZGF0YScsXG4gICAgICAgIFxuICAgICAgICAvLyBOUE0gaW5zdGFsbGF0aW9ucyAtIFdpbmRvd3NcbiAgICAgICAgJ0M6XFxcXFByb2dyYW0gRmlsZXNcXFxcbm9kZWpzXFxcXG5vZGVfbW9kdWxlc1xcXFxAZG9sbGhvdXNlbWNwXFxcXG1jcC1zZXJ2ZXJcXFxcZGF0YScsXG4gICAgICAgICdDOlxcXFxQcm9ncmFtIEZpbGVzICh4ODYpXFxcXG5vZGVqc1xcXFxub2RlX21vZHVsZXNcXFxcQGRvbGxob3VzZW1jcFxcXFxtY3Atc2VydmVyXFxcXGRhdGEnLFxuICAgICAgICBcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBXaW5kb3dzIHdpdGggbnZtXG4gICAgICAgIHBhdGguam9pbihwcm9jZXNzLmVudi5BUFBEQVRBIHx8ICcnLCAnbnBtJywgJ25vZGVfbW9kdWxlcycsICdAZG9sbGhvdXNlbWNwJywgJ21jcC1zZXJ2ZXInLCAnZGF0YScpXG4gICAgICApO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gcGF0aHM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBidW5kbGVkIGRhdGEgZGlyZWN0b3J5IGJ5IGNoZWNraW5nIGVhY2ggc2VhcmNoIHBhdGhcbiAgICogVXNlcyBQcm9taXNlLmFsbFNldHRsZWQgZm9yIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgY2FjaGVzIHRoZSByZXN1bHRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmluZERhdGFEaXJlY3RvcnkoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCB2YWx1ZSBpZiBhdmFpbGFibGVcbiAgICBpZiAoRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBhbGwgcGF0aHMgaW4gcGFyYWxsZWwgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgIGNvbnN0IGNoZWNrUHJvbWlzZXMgPSB0aGlzLmRhdGFTZWFyY2hQYXRocy5tYXAoYXN5bmMgKHNlYXJjaFBhdGgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5zdGF0RmlsZShzZWFyY2hQYXRoKTtcbiAgICAgICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAvLyBWZXJpZnkgaXQgY29udGFpbnMgZXhwZWN0ZWQgc3ViZGlyZWN0b3JpZXNcbiAgICAgICAgICBjb25zdCBoYXNQZXJzb25hcyA9IGF3YWl0IHRoaXMuZGlyZWN0b3J5RXhpc3RzKHBhdGguam9pbihzZWFyY2hQYXRoLCAncGVyc29uYXMnKSk7XG4gICAgICAgICAgY29uc3QgaGFzU2tpbGxzID0gYXdhaXQgdGhpcy5kaXJlY3RvcnlFeGlzdHMocGF0aC5qb2luKHNlYXJjaFBhdGgsICdza2lsbHMnKSk7XG4gICAgICAgICAgaWYgKGhhc1BlcnNvbmFzIHx8IGhhc1NraWxscykge1xuICAgICAgICAgICAgcmV0dXJuIHNlYXJjaFBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gRGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgYWNjZXNzZWRcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KTtcbiAgICBcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKGNoZWNrUHJvbWlzZXMpO1xuICAgIFxuICAgIC8vIEZpbmQgdGhlIGZpcnN0IHN1Y2Nlc3NmdWwgcmVzdWx0XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmIHJlc3VsdC52YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEZvdW5kIGRhdGEgZGlyZWN0b3J5IGF0OiAke3Jlc3VsdC52YWx1ZX1gKTtcbiAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXIgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci53YXJuKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTm8gYnVuZGxlZCBkYXRhIGRpcmVjdG9yeSBmb3VuZCBpbiBhbnkgc2VhcmNoIHBhdGgnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhlbHBlciB0byBjaGVjayBpZiBhIGRpcmVjdG9yeSBleGlzdHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlyZWN0b3J5RXhpc3RzKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuc3RhdEZpbGUoZGlyUGF0aCk7XG4gICAgICByZXR1cm4gc3RhdHMuaXNEaXJlY3RvcnkoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgZmlsZSBwYXRoIHRvIHByZXZlbnQgcGF0aCB0cmF2ZXJzYWwgYXR0YWNrc1xuICAgKiBTRUNVUklUWSBGSVg6IEFkZGVkIGZpbGUgcGF0aCB2YWxpZGF0aW9uIHRvIHByZXZlbnQgZGlyZWN0b3J5IHRyYXZlcnNhbFxuICAgKiBQcmV2aW91c2x5OiBGaWxlIHBhdGhzIHdlcmUgdXNlZCB3aXRob3V0IHZhbGlkYXRpb24sIGFsbG93aW5nIHBvdGVudGlhbCAuLi8uLi8uLi8gYXR0YWNrc1xuICAgKiBOb3c6IFN0cmljdCB2YWxpZGF0aW9uIGVuc3VyZXMgcGF0aHMgc3RheSB3aXRoaW4gYWxsb3dlZCBkaXJlY3Rvcmllc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggVGhlIGZpbGUgcGF0aCB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gYWxsb3dlZEJhc2VQYXRocyBBcnJheSBvZiBhbGxvd2VkIGJhc2UgcGF0aHMgKG9wdGlvbmFsKVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHBhdGggaXMgc2FmZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRmlsZVBhdGgoZmlsZVBhdGg6IHN0cmluZywgYWxsb3dlZEJhc2VQYXRocz86IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFNFQ1VSSVRZOiBOb3JtYWxpemUgcGF0aCB0byBwcmV2ZW50IHRyYXZlcnNhbCBhdHRlbXB0c1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZOiBSZWplY3QgcGF0aHMgY29udGFpbmluZyB0cmF2ZXJzYWwgcGF0dGVybnNcbiAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLi4nKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFBhdGggdHJhdmVyc2FsIGF0dGVtcHQgYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogQ2hlY2sgZm9yIGhvbWUgZGlyZWN0b3J5IGV4cGFuc2lvbiBhdHRlbXB0cywgYnV0IGFsbG93IFdpbmRvd3MgOC4zIHNob3J0IHBhdGggbmFtZXNcbiAgICAgIC8vIFdpbmRvd3Mgc2hvcnQgcGF0aCBuYW1lcyB1c2UgfiBmb2xsb3dlZCBieSBhIGRpZ2l0IChlLmcuLCBSVU5ORVJ+MSksIHdoaWNoIHNob3VsZCBiZSBhbGxvd2VkXG4gICAgICAvLyBPbmx5IGJsb2NrIH4gZm9sbG93ZWQgYnkgLyBvciBcXCAoaG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uIHBhdHRlcm5zKVxuICAgICAgaWYgKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCd+LycpIHx8IG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCd+XFxcXCcpKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gSG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uIGF0dGVtcHQgYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogUmVqZWN0IGFic29sdXRlIHBhdGhzIG91dHNpZGUgYWxsb3dlZCBkaXJlY3Rvcmllc1xuICAgICAgaWYgKHBhdGguaXNBYnNvbHV0ZShub3JtYWxpemVkUGF0aCkgJiYgYWxsb3dlZEJhc2VQYXRocykge1xuICAgICAgICBjb25zdCBpc0FsbG93ZWQgPSBhbGxvd2VkQmFzZVBhdGhzLnNvbWUoYmFzZVBhdGggPT4ge1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRCYXNlID0gcGF0aC5ub3JtYWxpemUoYmFzZVBhdGgpO1xuICAgICAgICAgIHJldHVybiBub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRCYXNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWlzQWxsb3dlZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQWJzb2x1dGUgcGF0aCBvdXRzaWRlIGFsbG93ZWQgZGlyZWN0b3JpZXM6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFNFQ1VSSVRZOiBSZWplY3QgbnVsbCBieXRlcyBhbmQgb3RoZXIgZGFuZ2Vyb3VzIGNoYXJhY3RlcnNcbiAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnXFwwJykgfHwgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJ1xceDAwJykpIHsgLy8gTk9TT05BUiAtIE51bGwgYnl0ZSBkZXRlY3Rpb24gZm9yIHNlY3VyaXR5XG4gICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTnVsbCBieXRlIGluIHBhdGggYmxvY2tlZDogJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQYXRoIHZhbGlkYXRpb24gZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gREVQUkVDQVRFRDogQ29tbWVudGVkIG91dCBmaWxlbmFtZSBwYXR0ZXJuIGRldGVjdGlvbiAtIHJlcGxhY2VkIHdpdGggbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uXG4gIC8qKlxuICAgKiBDYWNoZWQgY29tcGlsZWQgcmVnZXggcGF0dGVybnMgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICovXG4gIC8vIHByaXZhdGUgc3RhdGljIGNvbXBpbGVkVGVzdFBhdHRlcm5zOiBSZWdFeHBbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBHZXQgY29tcGlsZWQgdGVzdCBwYXR0ZXJucyB3aXRoIGNhY2hpbmcgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICAgKiBAZGVwcmVjYXRlZCBVc2UgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICogQHJldHVybnMgQXJyYXkgb2YgY29tcGlsZWQgcmVnZXggcGF0dGVybnNcbiAgICovXG4gIC8vIHByaXZhdGUgZ2V0Q29tcGlsZWRUZXN0UGF0dGVybnMoKTogUmVnRXhwW10ge1xuICAvLyAgIC8vIFVzZSBjYWNoZWQgcGF0dGVybnMgaWYgYXZhaWxhYmxlXG4gIC8vICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29tcGlsZWRUZXN0UGF0dGVybnMpIHtcbiAgLy8gICAgIHJldHVybiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zO1xuICAvLyAgIH1cbiAgLy8gICBcbiAgLy8gICAvLyBDb21waWxlIGFuZCBjYWNoZSBwYXR0ZXJucyBvbiBmaXJzdCB1c2VcbiAgLy8gICAvLyBDUklUSUNBTCBGSVg6IFJlbW92ZWQgb3Zlcmx5IGJyb2FkIC9edGVzdC0vaSBwYXR0ZXJuIHRoYXQgd2FzIGJsb2NraW5nIGxlZ2l0aW1hdGUgdXNlXG4gIC8vICAgLy8gVXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRlIHBlcnNvbmFzIGxpa2UgXCJ0ZXN0LWRyaXZlbi1kZXZlbG9wZXJcIiBvciBcInRlc3QtYXV0b21hdGlvbi1leHBlcnRcIlxuICAvLyAgIC8vIFdlIG9ubHkgYmxvY2sgc3BlY2lmaWMgdGVzdCBwYXR0ZXJucyB0aGF0IGFyZSBjbGVhcmx5IGZyb20gb3VyIHRlc3Qgc3VpdGVcbiAgLy8gICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zID0gW1xuICAvLyAgICAgL150ZXN0cGVyc29uYS9pLCAgICAgICAgICAgICAgLy8gT3VyIHRlc3Qgc3VpdGUgcGF0dGVyblxuICAvLyAgICAgL155YW1sdGVzdC9pLCAgICAgICAgICAgICAgICAgLy8gU2VjdXJpdHkgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXnlhbWxib21iL2ksICAgICAgICAgICAgICAgICAvLyBTZWN1cml0eSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9ebWVtb3J5LXRlc3QtL2ksICAgICAgICAgICAgIC8vIFBlcmZvcm1hbmNlIHRlc3QgcGF0dGVyblxuICAvLyAgICAgL15wZXJmLXRlc3QtL2ksICAgICAgICAgICAgICAgLy8gUGVyZm9ybWFuY2UgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXnRlc3QtZml4dHVyZS0vaSwgICAgICAgICAgICAvLyBUZXN0IGZpeHR1cmUgcGF0dGVybiAobW9yZSBzcGVjaWZpYylcbiAgLy8gICAgIC9edGVzdC1kYXRhLS9pLCAgICAgICAgICAgICAgIC8vIFRlc3QgZGF0YSBwYXR0ZXJuIChtb3JlIHNwZWNpZmljKVxuICAvLyAgICAgL2Jpbi1zaHxybS1yZnxwd25lZC9pLCAgICAgICAgLy8gTWFsaWNpb3VzIHBhdHRlcm5zXG4gIC8vICAgICAvY29uY3VycmVudC1cXGQrL2ksICAgICAgICAgICAgLy8gQ29uY3VycmVudCB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9sZWdhY3lcXC5tZCQvaSwgICAgICAgICAgICAgICAvLyBMZWdhY3kgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvcGVyZm9ybWFuY2UtdGVzdC9pLCAgICAgICAgICAvLyBQZXJmb3JtYW5jZSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC8tXFxkezEzfS1bYS16MC05XStcXC5tZCQvaSwgICAgLy8gVGltZXN0YW1wLWJhc2VkIHRlc3QgZmlsZXNcbiAgLy8gICAgIC9edW5pdHRlc3QtL2ksICAgICAgICAgICAgICAgIC8vIFVuaXQgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXmludGVncmF0aW9udGVzdC0vaSwgICAgICAgICAvLyBJbnRlZ3JhdGlvbiB0ZXN0IHBhdHRlcm5cbiAgLy8gICBdO1xuICAvLyAgIFxuICAvLyAgIHJldHVybiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zO1xuICAvLyB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgZmlsZW5hbWUgbWF0Y2hlcyB0ZXN0IGRhdGEgcGF0dGVybnMgdGhhdCBzaG91bGQgbmV2ZXIgYmUgY29waWVkIHRvIHByb2R1Y3Rpb25cbiAgICogQGRlcHJlY2F0ZWQgVXNlIGlzRG9sbGhvdXNlTUNQVGVzdEVsZW1lbnQoKSBmb3IgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uIGluc3RlYWRcbiAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBmaWxlbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBmaWxlbmFtZSBtYXRjaGVzIHRlc3QgcGF0dGVybnMgdGhhdCBzaG91bGQgYmUgYmxvY2tlZFxuICAgKi9cbiAgLy8gcHJpdmF0ZSBpc1Rlc3REYXRhUGF0dGVybihmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLmdldENvbXBpbGVkVGVzdFBhdHRlcm5zKCk7XG4gIC8vICAgcmV0dXJuIHBhdHRlcm5zLnNvbWUocGF0dGVybiA9PiBwYXR0ZXJuLnRlc3QoZmlsZW5hbWUpKTtcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBSZWFkIG1ldGFkYXRhIGZyb20gWUFNTCBmcm9udG1hdHRlciBvbmx5IChuZXZlciByZWFkcyBjb250ZW50IGJvZHkpXG4gICAqIFVzZXMgYSBzbWFsbCBidWZmZXIgdG8gc2FmZWx5IGV4dHJhY3Qgb25seSB0aGUgZnJvbnRtYXR0ZXIgYmV0d2VlbiAtLS0gbWFya2Vyc1xuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZSB0byByZWFkIG1ldGFkYXRhIGZyb21cbiAgICogQHJldHVybnMgUGFyc2VkIG1ldGFkYXRhIG9iamVjdCBvciBudWxsIGlmIG5vIGZyb250bWF0dGVyIGZvdW5kXG4gICAqL1xuICAvLyBQRVJGT1JNQU5DRSBPUFRJTUlaQVRJT046IFJldXNhYmxlIGJ1ZmZlciBwb29sIHRvIHJlZHVjZSBhbGxvY2F0aW9uc1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBidWZmZXJQb29sOiBCdWZmZXJbXSA9IFtdO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUE9PTF9TSVpFID0gMjA7IC8vIE1FTU9SWSBMRUFLIEZJWDogUmVkdWNlZCBidWZmZXIgcG9vbCBzaXplIHRvIG1hdGNoIGNhY2hlIHNpemUgZm9yIGNvbnNpc3RlbnQgbWVtb3J5IG1hbmFnZW1lbnRcbiAgcHJpdmF0ZSBzdGF0aWMgYnVmZmVyUG9vbFN0YXRzID0geyBoaXRzOiAwLCBtaXNzZXM6IDAsIGNyZWF0ZWQ6IDAgfTtcbiAgXG4gIHByaXZhdGUgZ2V0QnVmZmVyKCk6IEJ1ZmZlciB7XG4gICAgLy8gUEVSRk9STUFOQ0U6IFRyYWNrIGJ1ZmZlciBwb29sIHVzYWdlIGZvciBvcHRpbWl6YXRpb24gbW9uaXRvcmluZ1xuICAgIGxldCBidWZmZXIgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wucG9wKCk7XG4gICAgaWYgKGJ1ZmZlcikge1xuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuaGl0cysrO1xuICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMubWlzc2VzKys7XG4gICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5jcmVhdGVkKys7XG4gICAgICBidWZmZXIgPSBCdWZmZXIuYWxsb2MoNDA5Nik7XG4gICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDcmVhdGVkIG5ldyBidWZmZXIgKHBvb2wgZW1wdHkpLCB0b3RhbCBjcmVhdGVkOiAke0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLmNyZWF0ZWR9YCk7XG4gICAgICByZXR1cm4gYnVmZmVyO1xuICAgIH1cbiAgfVxuICBcbiAgcHJpdmF0ZSByZWxlYXNlQnVmZmVyKGJ1ZmZlcjogQnVmZmVyKTogdm9pZCB7XG4gICAgLy8gQ1JJVElDQUwgRklYOiBBbHdheXMgYXR0ZW1wdCB0byByZXR1cm4gYnVmZmVyIHRvIHBvb2wgZm9yIHJldXNlXG4gICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5sZW5ndGggPCBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9QT09MX1NJWkUpIHtcbiAgICAgIGJ1ZmZlci5maWxsKDApOyAvLyBTRUNVUklUWTogQ2xlYXIgYnVmZmVyIGJlZm9yZSByZXVzZSB0byBwcmV2ZW50IGRhdGEgbGVha2FnZVxuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLnB1c2goYnVmZmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUEVSRk9STUFOQ0U6IElmIHBvb2wgaXMgZnVsbCwgY2xlYXIgdGhlIGJ1ZmZlciB0byBoZWxwIEdDXG4gICAgICBidWZmZXIuZmlsbCgwKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEJ1ZmZlciBwb29sIGZ1bGwsIGRpc2NhcmRpbmcgYnVmZmVyJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIGJ1ZmZlciBwb29sIGFuZCBjYWNoZSB0byBmcmVlIG1lbW9yeVxuICAgKiBQRVJGT1JNQU5DRSBGSVg6IEFkZGVkIGNsZWFudXAgbWV0aG9kIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgYXBwbGljYXRpb24gc2h1dGRvd24gb3IgcGVyaW9kaWMgY2xlYW51cFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbGVhbnVwKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIGJ1ZmZlciBwb29sXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLmxlbmd0aCA9IDA7XG4gICAgXG4gICAgLy8gQ2xlYXIgbWV0YWRhdGEgY2FjaGVcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuY2xlYXIoKTtcbiAgICBcbiAgICAvLyBDbGVhciBjYWNoZWQgZGF0YSBkaXJlY3RvcnlcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNhY2hlZERhdGFEaXIgPSBudWxsO1xuICAgIFxuICAgIC8vIENsZWFyIHBvcHVsYXRpb24gcHJvbWlzZXNcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBvcHVsYXRlSW5Qcm9ncmVzcy5jbGVhcigpO1xuICAgIFxuICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTWVtb3J5IGNsZWFudXAgY29tcGxldGVkJywge1xuICAgICAgYnVmZmVyU3RhdHM6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLFxuICAgICAgY2FjaGVDbGVhcmVkOiB0cnVlXG4gICAgfSk7XG4gICAgXG4gICAgLy8gUmVzZXQgc3RhdHNcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cyA9IHsgaGl0czogMCwgbWlzc2VzOiAwLCBjcmVhdGVkOiAwIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlcmZvcm1hbmNlIHN0YXRpc3RpY3MgZm9yIG1vbml0b3JpbmdcbiAgICogUEVSRk9STUFOQ0UgTU9OSVRPUklORzogQWRkZWQgc3RhdGlzdGljcyBtZXRob2QgZm9yIHBlcmZvcm1hbmNlIHRyYWNraW5nXG4gICAqIFRoaXMgcHJvdmlkZXMgaW5zaWdodHMgaW50byBidWZmZXIgcG9vbCBlZmZpY2llbmN5IGFuZCBjYWNoZSBwZXJmb3JtYW5jZVxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBwZXJmb3JtYW5jZSBtZXRyaWNzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFBlcmZvcm1hbmNlU3RhdHMoKToge1xuICAgIGJ1ZmZlclBvb2w6IHtcbiAgICAgIGhpdHM6IG51bWJlcjtcbiAgICAgIG1pc3NlczogbnVtYmVyOyBcbiAgICAgIGNyZWF0ZWQ6IG51bWJlcjtcbiAgICAgIGhpdFJhdGU6IG51bWJlcjtcbiAgICAgIHBvb2xTaXplOiBudW1iZXI7XG4gICAgICBtYXhQb29sU2l6ZTogbnVtYmVyO1xuICAgIH07XG4gICAgbWV0YWRhdGFDYWNoZToge1xuICAgICAgc2l6ZTogbnVtYmVyO1xuICAgICAgbWF4U2l6ZTogbnVtYmVyO1xuICAgIH07XG4gIH0ge1xuICAgIGNvbnN0IGJ1ZmZlckhpdHMgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5oaXRzO1xuICAgIGNvbnN0IGJ1ZmZlck1pc3NlcyA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLm1pc3NlcztcbiAgICBjb25zdCB0b3RhbFJlcXVlc3RzID0gYnVmZmVySGl0cyArIGJ1ZmZlck1pc3NlcztcblxuICAgIHJldHVybiB7XG4gICAgICBidWZmZXJQb29sOiB7XG4gICAgICAgIGhpdHM6IGJ1ZmZlckhpdHMsXG4gICAgICAgIG1pc3NlczogYnVmZmVyTWlzc2VzLFxuICAgICAgICBjcmVhdGVkOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5jcmVhdGVkLFxuICAgICAgICBoaXRSYXRlOiB0b3RhbFJlcXVlc3RzID4gMCA/IGJ1ZmZlckhpdHMgLyB0b3RhbFJlcXVlc3RzIDogMCxcbiAgICAgICAgcG9vbFNpemU6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5sZW5ndGgsXG4gICAgICAgIG1heFBvb2xTaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9QT09MX1NJWkVcbiAgICAgIH0sXG4gICAgICBtZXRhZGF0YUNhY2hlOiB7XG4gICAgICAgIHNpemU6IERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zaXplLFxuICAgICAgICBtYXhTaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9DQUNIRV9TSVpFXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIG9ubHkgdGhlIFlBTUwgZnJvbnRtYXR0ZXIgbWV0YWRhdGEgZnJvbSBhIGZpbGUgKGZpcnN0IDRLQilcbiAgICpcbiAgICogU0VDVVJJVFkgTk9URSAoSXNzdWUgIzEyMjgpOiBUaGlzIG1ldGhvZCBNVVNUIHVzZSB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUgd2hlbiBjYWxsaW5nXG4gICAqIFNlY3VyZVlhbWxQYXJzZXIucGFyc2UoKSB0byBlbnN1cmUgVW5pY29kZSBzZWN1cml0eSB2YWxpZGF0aW9uIHJ1bnMuIFNldHRpbmcgdmFsaWRhdGVDb250ZW50XG4gICAqIHRvIGZhbHNlIHdvdWxkIGRpc2FibGUgQUxMIGNvbnRlbnQgdmFsaWRhdGlvbiBpbmNsdWRpbmcgemVyby13aWR0aCBjaGFyYWN0ZXIgZGV0ZWN0aW9uLFxuICAgKiBjcmVhdGluZyBhIHNlY3VyaXR5IGJ5cGFzcyB2dWxuZXJhYmlsaXR5LlxuICAgKlxuICAgKiBAcGFyYW0gZmlsZVBhdGggLSBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlIHRvIHJlYWRcbiAgICogQHBhcmFtIHJldHJpZXMgLSBOdW1iZXIgb2YgcmV0cmllcyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzIChkZWZhdWx0OiAyKVxuICAgKiBAcmV0dXJucyBQYXJzZWQgbWV0YWRhdGEgb2JqZWN0IG9yIG51bGwgaWYgbm8gdmFsaWQgZnJvbnRtYXR0ZXIgZm91bmRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVhZE1ldGFkYXRhT25seShmaWxlUGF0aDogc3RyaW5nLCByZXRyaWVzID0gMik6IFByb21pc2U8YW55IHwgbnVsbD4ge1xuICAgIC8vIFBFUkZPUk1BTkNFOiBDaGVjayBjYWNoZSBmaXJzdCBiZWZvcmUgcmVhZGluZyBmaWxlXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgdGhpcy5zdGF0RmlsZShmaWxlUGF0aCk7XG4gICAgICBjb25zdCBjYWNoZUtleSA9IGZpbGVQYXRoO1xuICAgICAgY29uc3QgY2FjaGVkID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmdldChjYWNoZUtleSk7XG5cbiAgICAgIC8vIFJldHVybiBjYWNoZWQgbWV0YWRhdGEgaWYgZmlsZSBoYXNuJ3QgY2hhbmdlZFxuICAgICAgLy8gQ1JJVElDQUwgRklYOiBVc2UgaW50ZWdlciBtdGltZSBjb21wYXJpc29uIHRvIGF2b2lkIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbiBpc3N1ZXNcbiAgICAgIGlmIChjYWNoZWQgJiYgTWF0aC5mbG9vcihjYWNoZWQubXRpbWUpID09PSBNYXRoLmZsb29yKHN0YXRzLm10aW1lTXMpICYmIGNhY2hlZC5zaXplID09PSBzdGF0cy5zaXplKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENhY2hlIGhpdCBmb3IgJHtmaWxlUGF0aH1gKTtcbiAgICAgICAgcmV0dXJuIGNhY2hlZC5tZXRhZGF0YTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCwgcHJvY2VlZCB3aXRoIG5vcm1hbCBmbG93XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBOT1RFOiBVc2luZyBkaXJlY3QgZnMub3BlbiBmb3IgcGFydGlhbCBmaWxlIHJlYWQgKGZpcnN0IDRLQiBvbmx5KS5cbiAgICAgIC8vIEZpbGVPcGVyYXRpb25zU2VydmljZSBkb2Vzbid0IHN1cHBvcnQgcGFydGlhbCByZWFkcyB3aXRoIGZpbGUgaGFuZGxlcy5cbiAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBrZXB0IGFzIGEgZGlyZWN0IGZzIGNhbGwgZm9yIHBlcmZvcm1hbmNlLWNyaXRpY2FsXG4gICAgICAvLyBtZXRhZGF0YSBleHRyYWN0aW9uIHRoYXQgb25seSBuZWVkcyB0aGUgWUFNTCBmcm9udG1hdHRlci5cbiAgICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgICBjb25zdCBmZCA9IGF3YWl0IGZzLm9wZW4oZmlsZVBhdGgsICdyJyk7XG4gICAgICAvLyBQRVJGT1JNQU5DRTogVXNlIGJ1ZmZlciBwb29sIGluc3RlYWQgb2YgYWxsb2NhdGluZyBuZXcgYnVmZmVyIGVhY2ggdGltZVxuICAgICAgY29uc3QgYnVmZmVyID0gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmQucmVhZChidWZmZXIsIDAsIDQwOTYsIDApO1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBidWZmZXIuc3ViYXJyYXkoMCwgcmVzdWx0LmJ5dGVzUmVhZCkudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgICAgIFxuICAgICAgICAvLyBMb29rIGZvciBZQU1MIGZyb250bWF0dGVyIGJldHdlZW4gLS0tIG1hcmtlcnNcbiAgICAgICAgLy8gU3VwcG9ydCBib3RoIFVuaXggKFxcbikgYW5kIFdpbmRvd3MgKFxcclxcbikgbGluZSBlbmRpbmdzXG4gICAgICAgIGNvbnN0IG1hdGNoID0gaGVhZGVyLm1hdGNoKC9eLS0tXFxyP1xcbihbXFxzXFxTXSo/KVxccj9cXG4tLS0vKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIHJldHVybiBudWxsOyAvLyBObyBmcm9udG1hdHRlciBmb3VuZFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBQYXJzZSB0aGUgWUFNTCBmcm9udG1hdHRlciBzYWZlbHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBTRUNVUklUWSBGSVggKElzc3VlICMxMjI4KTogRW5hYmxlIHZhbGlkYXRlQ29udGVudCB0byBibG9jayB6ZXJvLXdpZHRoIFVuaWNvZGUgYW5kIG90aGVyIHNlY3VyaXR5IHRocmVhdHNcbiAgICAgICAgICAvLyBTZWN1cmVZYW1sUGFyc2VyIHByb3ZpZGVzIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiwgaW5qZWN0aW9uIHByZXZlbnRpb24sIGFuZCBjb250ZW50IHNhbml0aXphdGlvblxuICAgICAgICAgIC8vIEl0IGV4cGVjdHMgZnVsbCBZQU1MIHdpdGggLS0tIG1hcmtlcnMsIHNvIHdlIHJlY29uc3RydWN0IHRoZSBmcm9udG1hdHRlciBibG9ja1xuICAgICAgICAgIC8vIFdlIGRpc2FibGUgZmllbGQtc3BlY2lmaWMgdmFsaWRhdGlvbiBhcyB0aGlzIGlzIGdlbmVyYWwgbWV0YWRhdGEgcGFyc2luZywgbm90IHBlcnNvbmEtc3BlY2lmaWNcbiAgICAgICAgICAvLyBidXQgd2UgTVVTVCBrZWVwIHZhbGlkYXRlQ29udGVudDogdHJ1ZSB0byBlbnN1cmUgVW5pY29kZSBzZWN1cml0eSB2YWxpZGF0aW9uIHJ1bnNcbiAgICAgICAgICBjb25zdCBmdWxsWWFtbCA9IGAtLS1cXG4ke21hdGNoWzFdfVxcbi0tLWA7XG4gICAgICAgICAgY29uc3QgcGFyc2VSZXN1bHQgPSBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKGZ1bGxZYW1sLCB7XG4gICAgICAgICAgICAvLyBSRVFVSVJFRDogdmFsaWRhdGVDb250ZW50IG11c3QgYmUgdHJ1ZSB0byBlbmFibGUgVW5pY29kZSBzZWN1cml0eSB2YWxpZGF0aW9uIGluY2x1ZGluZ1xuICAgICAgICAgICAgLy8gemVyby13aWR0aCBjaGFyYWN0ZXIgZGV0ZWN0aW9uIChVKzIwMEItVSsyMDBGLCBVK0ZFRkYsIGV0Yy4pLiBTZXR0aW5nIHRoaXMgdG8gZmFsc2VcbiAgICAgICAgICAgIC8vIHdvdWxkIGRpc2FibGUgQUxMIGNvbnRlbnQgdmFsaWRhdGlvbiwgY3JlYXRpbmcgYSBzZWN1cml0eSBieXBhc3MgZm9yIFVuaWNvZGUtYmFzZWQgYXR0YWNrcy5cbiAgICAgICAgICAgIC8vIFNlZSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSgpIGZvciBkZXRlY3Rpb24gbG9naWMuXG4gICAgICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUsXG4gICAgICAgICAgICB2YWxpZGF0ZUZpZWxkczogZmFsc2UgICAvLyBGaWVsZC1zcGVjaWZpYyB2YWxpZGF0aW9uIGlzIG9wdGlvbmFsIGZvciBnZW5lcmFsIG1ldGFkYXRhIHBhcnNpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHBhcnNlUmVzdWx0LmRhdGE7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gUEVSRk9STUFOQ0U6IENhY2hlIHRoZSBtZXRhZGF0YSB3aXRoIGZpbGUgc3RhdHMgZm9yIGZ1dHVyZSByZWFkc1xuICAgICAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09ICdvYmplY3QnICYmIG1ldGFkYXRhICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuc3RhdEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICBjb25zdCBjYWNoZUVudHJ5OiBNZXRhZGF0YUNhY2hlRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgbXRpbWU6IHN0YXRzLm10aW1lTXMsXG4gICAgICAgICAgICAgICAgc2l6ZTogc3RhdHMuc2l6ZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gQ1JJVElDQUwgTUVNT1JZIExFQUsgRklYOiBNb3JlIGFnZ3Jlc3NpdmUgY2FjaGUgbWFuYWdlbWVudCB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGhcbiAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBlbnRyeSBhbHJlYWR5IGV4aXN0cyBhbmQganVzdCB1cGRhdGUgaXQgaW5zdGVhZCBvZiBhZGRpbmcgbmV3XG4gICAgICAgICAgICAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuaGFzKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBlbnRyeSAtIG5vIGV2aWN0aW9uIG5lZWRlZFxuICAgICAgICAgICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zZXQoZmlsZVBhdGgsIGNhY2hlRW50cnkpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFVwZGF0ZWQgZXhpc3RpbmcgY2FjaGUgZW50cnkgZm9yICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IGVudHJ5IC0gY2hlY2sgaWYgd2UgbmVlZCB0byBldmljdCBmaXJzdFxuICAgICAgICAgICAgICAgIC8vIFVzZSA+IGluc3RlYWQgb2YgPj0gdG8gZW5zdXJlIHdlIG5ldmVyIGV4Y2VlZCBNQVhfQ0FDSEVfU0laRVxuICAgICAgICAgICAgICAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2l6ZSA+PSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9DQUNIRV9TSVpFKSB7XG4gICAgICAgICAgICAgICAgICAvLyBNb3JlIGFnZ3Jlc3NpdmUgZXZpY3Rpb246IHJlbW92ZSBlbm91Z2ggZW50cmllcyB0byBzdGF5IHdlbGwgdW5kZXIgbGltaXRcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJpZXNUb0V2aWN0ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihEZWZhdWx0RWxlbWVudFByb3ZpZGVyLk1BWF9DQUNIRV9TSVpFICogMC40KSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBrZXlzVG9FdmljdCA9IEFycmF5LmZyb20oRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmtleXMoKSkuc2xpY2UoMCwgZW50cmllc1RvRXZpY3QpO1xuICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1RvRXZpY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXZpY3RlZCAke2tleXNUb0V2aWN0Lmxlbmd0aH0gY2FjaGUgZW50cmllcyB0byBtYW5hZ2UgbWVtb3J5IChjYWNoZSBzaXplIHdhcyAke0RlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zaXplICsga2V5c1RvRXZpY3QubGVuZ3RofSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNldChmaWxlUGF0aCwgY2FjaGVFbnRyeSk7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQWRkZWQgbmV3IGNhY2hlIGVudHJ5IGZvciAke2ZpbGVQYXRofSAoY2FjaGUgc2l6ZSBub3c6ICR7RGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNpemV9KWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgLy8gSWdub3JlIGNhY2hlIGVycm9ycywgcmV0dXJuIG1ldGFkYXRhIGFueXdheVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoeWFtbEVycm9yKSB7XG4gICAgICAgICAgLy8gSW52YWxpZCBZQU1MLCByZXR1cm4gbnVsbFxuICAgICAgICAgIC8vIEVOSEFOQ0VNRU5UOiBJbmNsdWRlIGVycm9yIHR5cGUgZm9yIGJldHRlciBkZWJ1Z2dpbmdcbiAgICAgICAgICBjb25zdCB5YW1sRXJyb3JUeXBlID0gKHlhbWxFcnJvciBhcyBhbnkpPy5jb25zdHJ1Y3Rvcj8ubmFtZSB8fCAnWUFNTEVycm9yJztcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBJbnZhbGlkIFlBTUwgaW4gJHtmaWxlUGF0aH06ICR7eWFtbEVycm9yVHlwZX0gLSAke3lhbWxFcnJvcn1gKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gQ1JJVElDQUwgRklYOiBFbnN1cmUgZmlsZSBkZXNjcmlwdG9yIGlzIGNsb3NlZCBhbmQgYnVmZmVyIGlzIHJlbGVhc2VkIGluIEFMTCBwYXRoc1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGZkLmNsb3NlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGNsb3NlRXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjbG9zaW5nIGZpbGUgZGVzY3JpcHRvciBmb3IgJHtmaWxlUGF0aH06ICR7Y2xvc2VFcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQRVJGT1JNQU5DRTogUmV0dXJuIGJ1ZmZlciB0byBwb29sIGZvciByZXVzZVxuICAgICAgICB0aGlzLnJlbGVhc2VCdWZmZXIoYnVmZmVyKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAvLyBFTkhBTkNFTUVOVDogSW5jbHVkZSBlcnJvciB0eXBlIGluIGRlYnVnIGxvZ3MgZm9yIGJldHRlciBkZWJ1Z2dpbmdcbiAgICAgIGNvbnN0IGVycm9yVHlwZSA9IGVycm9yPy5jb25zdHJ1Y3Rvcj8ubmFtZSB8fCAnVW5rbm93bkVycm9yJztcbiAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGVycm9yPy5jb2RlIHx8ICdOT19DT0RFJztcbiAgICAgIFxuICAgICAgLy8gUkVMSUFCSUxJVFk6IEFkZCByZXRyeSBsb2dpYyBmb3IgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAgICBpZiAocmV0cmllcyA+IDAgJiYgKGVycm9yQ29kZSA9PT0gJ0VCVVNZJyB8fCBlcnJvckNvZGUgPT09ICdFQUdBSU4nKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBSZXRyeWluZyByZWFkIGZvciAke2ZpbGVQYXRofSBhZnRlciAke2Vycm9yVHlwZX06JHtlcnJvckNvZGV9YCk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MCkpOyAvLyBCcmllZiBkZWxheSBiZWZvcmUgcmV0cnlcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZE1ldGFkYXRhT25seShmaWxlUGF0aCwgcmV0cmllcyAtIDEpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3VsZCBub3QgcmVhZCBtZXRhZGF0YSBmcm9tICR7ZmlsZVBhdGh9OiAke2Vycm9yVHlwZX06JHtlcnJvckNvZGV9IC0gJHtlcnJvcj8ubWVzc2FnZSB8fCBlcnJvcn1gKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGZpbGUgaXMgYSBEb2xsaG91c2VNQ1AgdGVzdCBlbGVtZW50IGJhc2VkIG9uIG1ldGFkYXRhXG4gICAqIFRoaXMgcmVwbGFjZXMgZmlsZW5hbWUgcGF0dGVybiBkZXRlY3Rpb24gd2l0aCBhY2N1cmF0ZSBtZXRhZGF0YS1iYXNlZCBkZXRlY3Rpb25cbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIGZpbGUgdG8gY2hlY2tcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBjb250YWlucyBfZG9sbGhvdXNlTUNQVGVzdDogdHJ1ZSBtZXRhZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpc0RvbGxob3VzZU1DUFRlc3RFbGVtZW50KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCB0aGlzLnJlYWRNZXRhZGF0YU9ubHkoZmlsZVBhdGgpO1xuICAgICAgY29uc3QgaXNUZXN0ID0gISEobWV0YWRhdGEgJiYgbWV0YWRhdGEuX2RvbGxob3VzZU1DUFRlc3QgPT09IHRydWUpO1xuICAgICAgXG4gICAgICBcbiAgICAgIHJldHVybiBpc1Rlc3Q7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElmIHdlIGNhbid0IHJlYWQgdGhlIG1ldGFkYXRhLCBhc3N1bWUgaXQncyBub3QgYSB0ZXN0IGZpbGVcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEVycm9yIGNoZWNraW5nIHRlc3QgbWV0YWRhdGEgZm9yICR7ZmlsZVBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgaWYgd2UncmUgaW4gYSBwcm9kdWN0aW9uIGVudmlyb25tZW50IGJ5IGNoZWNraW5nIGZvciBwcm9kdWN0aW9uIGluZGljYXRvcnNcbiAgICogVXNlcyBhIGNvbmZpZGVuY2UtYmFzZWQgYXBwcm9hY2ggcmVxdWlyaW5nIG11bHRpcGxlIGluZGljYXRvcnMgZm9yIGJldHRlciBhY2N1cmFjeVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgYXBwZWFycyB0byBiZSBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRcbiAgICovXG4gIHByaXZhdGUgaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQoKTogYm9vbGVhbiB7XG4gICAgLy8gQWxsb3cgdGVzdHMgdG8gZXhwbGljaXRseSBvdmVycmlkZSBwcm9kdWN0aW9uIG1vZGUgZGV0ZWN0aW9uXG4gICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ3RydWUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ2ZhbHNlJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBXZWlnaHRlZCBpbmRpY2F0b3JzIGZvciBwcm9kdWN0aW9uIGRldGVjdGlvblxuICAgIGNvbnN0IGluZGljYXRvcnMgPSB7XG4gICAgICAvLyBTdHJvbmcgaW5kaWNhdG9ycyAod2VpZ2h0OiAyKVxuICAgICAgaGFzVXNlckhvbWVEaXI6IChwcm9jZXNzLmVudi5IT01FICYmIChwcm9jZXNzLmVudi5IT01FLmluY2x1ZGVzKCcvVXNlcnMvJykgfHwgcHJvY2Vzcy5lbnYuSE9NRS5pbmNsdWRlcygnL2hvbWUvJykpKSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAhIXByb2Nlc3MuZW52LlVTRVJQUk9GSUxFLFxuICAgICAgaXNQcm9kdWN0aW9uTm9kZTogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyxcbiAgICAgIG5vdEluVGVzdERpcjogKCgpID0+IHtcbiAgICAgICAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBOb3JtYWxpemUgcGF0aCBzZXBhcmF0b3JzIGZvciBjcm9zcy1wbGF0Zm9ybSBjaGVja2luZyAoV2luZG93cyB1c2VzIFxcIGJ1dCBjaGVja3MgdXNlIC8pXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDd2QgPSBjd2QucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gICAgICAgIHJldHVybiAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL3Rlc3QnKSAmJiBcbiAgICAgICAgICAgICAgICFub3JtYWxpemVkQ3dkLmluY2x1ZGVzKCcvX190ZXN0c19fJykgJiYgXG4gICAgICAgICAgICAgICAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL3RlbXAnKSAmJlxuICAgICAgICAgICAgICAgIW5vcm1hbGl6ZWRDd2QuaW5jbHVkZXMoJy9kaXN0L3Rlc3QnKTtcbiAgICAgIH0pKCksXG4gICAgICBcbiAgICAgIC8vIE1vZGVyYXRlIGluZGljYXRvcnMgKHdlaWdodDogMSlcbiAgICAgIG5vdEluQ0k6ICFwcm9jZXNzLmVudi5DSSxcbiAgICAgIG5vVGVzdEVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyxcbiAgICAgIG5vRGV2RW52OiBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ2RldmVsb3BtZW50JyxcbiAgICB9O1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSB3ZWlnaHRlZCBzY29yZVxuICAgIGxldCBzY29yZSA9IDA7XG4gICAgaWYgKGluZGljYXRvcnMuaGFzVXNlckhvbWVEaXIpIHNjb3JlICs9IDI7XG4gICAgaWYgKGluZGljYXRvcnMuaXNQcm9kdWN0aW9uTm9kZSkgc2NvcmUgKz0gMjtcbiAgICBpZiAoaW5kaWNhdG9ycy5ub3RJblRlc3REaXIpIHNjb3JlICs9IDI7XG4gICAgaWYgKGluZGljYXRvcnMubm90SW5DSSkgc2NvcmUgKz0gMTtcbiAgICBpZiAoaW5kaWNhdG9ycy5ub1Rlc3RFbnYpIHNjb3JlICs9IDE7XG4gICAgaWYgKGluZGljYXRvcnMubm9EZXZFbnYpIHNjb3JlICs9IDE7XG4gICAgXG4gICAgLy8gTG9nIGRldGVjdGlvbiBkZXRhaWxzIGZvciBkZWJ1Z2dpbmdcbiAgICBjb25zdCBhY3RpdmVJbmRpY2F0b3JzID0gT2JqZWN0LmVudHJpZXMoaW5kaWNhdG9ycylcbiAgICAgIC5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlKVxuICAgICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG4gICAgXG4gICAgLy8gVFlQRVNDUklQVCBGSVg6IFJlbW92ZWQgbG9nZ2VyLmlzRGVidWdFbmFibGVkKCkgY2hlY2sgYXMgdGhpcyBtZXRob2QgZG9lc24ndCBleGlzdCBvbiBNQ1BMb2dnZXJcbiAgICAvLyBUaGUgbG9nZ2VyIGFscmVhZHkgaGFuZGxlcyBkZWJ1ZyBsZXZlbCBpbnRlcm5hbGx5LCBzbyB3ZSBjYW4gY2FsbCBkZWJ1ZygpIGRpcmVjdGx5XG4gICAgaWYgKHNjb3JlID49IDMpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQcm9kdWN0aW9uIGVudmlyb25tZW50IGRldGVjdGVkJyxcbiAgICAgICAgeyBzY29yZSwgYWN0aXZlSW5kaWNhdG9ycywgZm9yY2VNb2RlOiAnbm90IHNldCcgfVxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gUmVxdWlyZSBhIHNjb3JlIG9mIGF0IGxlYXN0IDMgZm9yIHByb2R1Y3Rpb24gZGV0ZWN0aW9uIChtb3JlIGNvbmZpZGVudClcbiAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBpbiBlZGdlIGNhc2VzIHdoaWxlIG1haW50YWluaW5nIHNlY3VyaXR5XG4gICAgcmV0dXJuIHNjb3JlID49IDM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDb3B5IGFsbCBmaWxlcyBmcm9tIHNvdXJjZSBkaXJlY3RvcnkgdG8gZGVzdGluYXRpb24gZGlyZWN0b3J5XG4gICAqIFNraXBzIGZpbGVzIHRoYXQgYWxyZWFkeSBleGlzdCB0byBwcmVzZXJ2ZSB1c2VyIG1vZGlmaWNhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY29weUVsZW1lbnRGaWxlcyhzb3VyY2VEaXI6IHN0cmluZywgZGVzdERpcjogc3RyaW5nLCBlbGVtZW50VHlwZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgY29waWVkQ291bnQgPSAwO1xuICAgIFxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBFbnN1cmUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgYXdhaXQgdGhpcy5tYWtlRGlyZWN0b3J5KGRlc3REaXIpO1xuXG4gICAgICAvLyBSZWFkIHNvdXJjZSBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgdGhpcy5saXN0RGlyKHNvdXJjZURpcik7XG4gICAgICBcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIFxuICAgICAgICAvLyBPbmx5IGNvcHkgbWFya2Rvd24gZmlsZXNcbiAgICAgICAgaWYgKCFmaWxlLmVuZHNXaXRoKEZJTEVfQ09OU1RBTlRTLkVMRU1FTlRfRVhURU5TSU9OKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBOb3JtYWxpemUgZmlsZW5hbWUgZm9yIHNlY3VyaXR5XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoZmlsZSk7XG4gICAgICAgIGlmICghbm9ybWFsaXplZEZpbGUuaXNWYWxpZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZmlsZSB3aXRoIGludmFsaWQgVW5pY29kZTogJHtmaWxlfWApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc291cmNlUGF0aCA9IHBhdGguam9pbihzb3VyY2VEaXIsIG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgICAgY29uc3QgZGVzdFBhdGggPSBwYXRoLmpvaW4oZGVzdERpciwgbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQpO1xuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIC8vIFNFQ1VSSVRZIEZJWDogVmFsaWRhdGUgZmlsZSBwYXRocyB0byBwcmV2ZW50IHBhdGggdHJhdmVyc2FsIGF0dGFja3NcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBtYWxpY2lvdXMgZmlsZXMgZnJvbSBlc2NhcGluZyB0aGUgaW50ZW5kZWQgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgICAgICBjb25zdCBzb3VyY2VWYWxpZCA9IHRoaXMudmFsaWRhdGVGaWxlUGF0aChzb3VyY2VQYXRoLCBbc291cmNlRGlyXSk7XG4gICAgICAgIGNvbnN0IGRlc3RWYWxpZCA9IHRoaXMudmFsaWRhdGVGaWxlUGF0aChkZXN0UGF0aCwgW2Rlc3REaXJdKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghc291cmNlVmFsaWQgfHwgIWRlc3RWYWxpZCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBmaWxlIHdpdGggaW52YWxpZCBwYXRoOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICB7IHNvdXJjZVBhdGgsIGRlc3RQYXRoLCBlbGVtZW50VHlwZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUHJvZHVjdGlvbiBzYWZldHkgY2hlY2s6IEJsb2NrIERvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnRzIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzXG4gICAgICAgIC8vIFNraXAgdGhpcyBjaGVjayBpZiBsb2FkVGVzdERhdGEgaXMgZXhwbGljaXRseSBlbmFibGVkIChmb3IgdGVzdGluZyBzY2VuYXJpb3MpXG4gICAgICAgIGlmICghdGhpcy5jb25maWcubG9hZFRlc3REYXRhICYmIHRoaXMuaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQoKSkge1xuICAgICAgICAgIGNvbnN0IGlzRG9sbGhvdXNlVGVzdCA9IGF3YWl0IHRoaXMuaXNEb2xsaG91c2VNQ1BUZXN0RWxlbWVudChzb3VyY2VQYXRoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaXNEb2xsaG91c2VUZXN0KSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTRUNVUklUWTogQmxvY2tpbmcgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBpbiBwcm9kdWN0aW9uOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgZmlsZTogbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQsXG4gICAgICAgICAgICAgICAgcmVhc29uOiAnRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBkZXRlY3RlZCBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50JyxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGJsb2NrZWQgdGVzdCBkYXRhXG4gICAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICAgIHR5cGU6ICdURVNUX0RBVEFfQkxPQ0tFRCcsXG4gICAgICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb3B5RWxlbWVudEZpbGVzJyxcbiAgICAgICAgICAgICAgZGV0YWlsczogYEJsb2NrZWQgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBpbiBwcm9kdWN0aW9uOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWU6IG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogJ0RvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgZGV0ZWN0ZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgZGV0ZWN0aW9uTWV0aG9kOiAnbWV0YWRhdGEtYmFzZWQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIGRlc3RpbmF0aW9uIGZpbGUgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgY29uc3QgZGVzdEV4aXN0cyA9IGF3YWl0IHRoaXMuZmlsZUV4aXN0cyhkZXN0UGF0aCk7XG4gICAgICAgIGlmIChkZXN0RXhpc3RzKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZXhpc3RpbmcgZmlsZTogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBWYWxpZGF0ZSBzb3VyY2UgZmlsZSBiZWZvcmUgY29weWluZ1xuICAgICAgICAgIGNvbnN0IHNvdXJjZVN0YXRzID0gYXdhaXQgdGhpcy5zdGF0RmlsZShzb3VyY2VQYXRoKTtcblxuICAgICAgICAgIC8vIENoZWNrIGZpbGUgc2l6ZSBsaW1pdFxuICAgICAgICAgIGlmIChzb3VyY2VTdGF0cy5zaXplID4gRklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgb3ZlcnNpemVkIGZpbGUgJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH06IGAgK1xuICAgICAgICAgICAgICBgJHtzb3VyY2VTdGF0cy5zaXplfSBieXRlcyAobWF4OiAke0ZJTEVfQ09OU1RBTlRTLk1BWF9GSUxFX1NJWkV9IGJ5dGVzKWAsXG4gICAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgICAgZmlsZTogbm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnQsIFxuICAgICAgICAgICAgICAgIHNpemU6IHNvdXJjZVN0YXRzLnNpemUsXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogRklMRV9DT05TVEFOVFMuTUFYX0ZJTEVfU0laRSxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDb3B5IHRoZSBmaWxlIHdpdGggdmVyaWZpY2F0aW9uXG4gICAgICAgICAgXG4gICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZVdpdGhWZXJpZmljYXRpb24oc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICAgICAgICAgIGNvcGllZENvdW50Kys7XG4gICAgICAgICAgXG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29waWVkICR7ZWxlbWVudFR5cGV9OiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWApO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgZWFjaCBmaWxlIGNvcGllZFxuICAgICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgICAgICBzb3VyY2U6ICdEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvcHlFbGVtZW50RmlsZXMnLFxuICAgICAgICAgICAgZGV0YWlsczogYENvcGllZCBkZWZhdWx0ICR7ZWxlbWVudFR5cGV9IGZpbGU6ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgIHNvdXJjZVBhdGgsXG4gICAgICAgICAgICAgIGRlc3RQYXRoLFxuICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgZmlsZVNpemU6IChhd2FpdCB0aGlzLnN0YXRGaWxlKGRlc3RQYXRoKSkuc2l6ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRmFpbGVkIHRvIGNvcHkgJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgeyBcbiAgICAgICAgICAgICAgZXJyb3I6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICBzdGFjazogZXJyLnN0YWNrLFxuICAgICAgICAgICAgICBzb3VyY2VQYXRoLFxuICAgICAgICAgICAgICBkZXN0UGF0aCxcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggb3RoZXIgZmlsZXMgaW5zdGVhZCBvZiBmYWlsaW5nIGNvbXBsZXRlbHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoY29waWVkQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ29waWVkICR7Y29waWVkQ291bnR9ICR7ZWxlbWVudFR5cGV9IGZpbGUocylgKTtcbiAgICAgIH1cbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjb3B5aW5nICR7ZWxlbWVudFR5cGV9IGZpbGVzOmAsIGVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGNvcGllZENvdW50O1xuICB9XG4gIFxuICAvKipcbiAgICogQ29weSBhIGZpbGUgd2l0aCBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uXG4gICAqIEVuc3VyZXMgdGhlIGZpbGUgd2FzIGNvcGllZCBjb3JyZWN0bHkgYnkgY29tcGFyaW5nIHNpemVzXG4gICAqL1xuICAvKipcbiAgICogQ2FsY3VsYXRlIGNoZWNrc3VtIG9mIGEgZmlsZSBmb3IgaW50ZWdyaXR5IHZlcmlmaWNhdGlvblxuICAgKiBAcGFyYW0gZmlsZVBhdGggUGF0aCB0byB0aGUgZmlsZVxuICAgKiBAcmV0dXJucyBIZXgtZW5jb2RlZCBjaGVja3N1bVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjYWxjdWxhdGVDaGVja3N1bShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBoYXNoID0gY3JlYXRlSGFzaChGSUxFX0NPTlNUQU5UUy5DSEVDS1NVTV9BTEdPUklUSE0pO1xuICAgIC8vIE5PVEU6IFVzaW5nIGRpcmVjdCBmcy5vcGVuIGZvciBjaHVua2VkL3N0cmVhbWluZyBmaWxlIHJlYWQuXG4gICAgLy8gRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBmaWxlIGhhbmRsZXMgZm9yIGNodW5rZWQgcmVhZGluZy5cbiAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkga2VwdCBhcyBhIGRpcmVjdCBmcyBjYWxsIGZvciBtZW1vcnktZWZmaWNpZW50XG4gICAgLy8gY2hlY2tzdW0gY2FsY3VsYXRpb24gb24gcG90ZW50aWFsbHkgbGFyZ2UgZmlsZXMuXG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBmcy5vcGVuKGZpbGVQYXRoLCAncicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhGSUxFX0NPTlNUQU5UUy5DSFVOS19TSVpFKTtcbiAgICAgIGxldCBieXRlc1JlYWQ6IG51bWJlcjtcblxuICAgICAgZG8ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJlYW0ucmVhZChidWZmZXIsIDAsIEZJTEVfQ09OU1RBTlRTLkNIVU5LX1NJWkUpO1xuICAgICAgICBieXRlc1JlYWQgPSByZXN1bHQuYnl0ZXNSZWFkO1xuXG4gICAgICAgIGlmIChieXRlc1JlYWQgPiAwKSB7XG4gICAgICAgICAgaGFzaC51cGRhdGUoYnVmZmVyLnN1YmFycmF5KDAsIGJ5dGVzUmVhZCkpO1xuICAgICAgICB9XG4gICAgICB9IHdoaWxlIChieXRlc1JlYWQgPiAwKTtcblxuICAgICAgcmV0dXJuIGhhc2guZGlnZXN0KCdoZXgnKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgc3RyZWFtLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgZmlsZSB3aXRoIGludGVncml0eSB2ZXJpZmljYXRpb24gYW5kIHJldHJ5IGxvZ2ljXG4gICAqIEBwYXJhbSBzb3VyY2VQYXRoIFNvdXJjZSBmaWxlIHBhdGhcbiAgICogQHBhcmFtIGRlc3RQYXRoIERlc3RpbmF0aW9uIGZpbGUgcGF0aFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGNvcHkgZmFpbHMgYWZ0ZXIgYWxsIHJldHJ5IGF0dGVtcHRzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvcHlGaWxlV2l0aFZlcmlmaWNhdGlvbihzb3VyY2VQYXRoOiBzdHJpbmcsIGRlc3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IG51bGwgPSBudWxsO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gQ09QWV9SRVRSWV9BVFRFTVBUUzsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDb3B5IHRoZSBmaWxlXG4gICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVPcChzb3VyY2VQYXRoLCBkZXN0UGF0aCk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHNpemUgbWF0Y2hlc1xuICAgICAgICBjb25zdCBbc291cmNlU3RhdHMsIGRlc3RTdGF0c10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgdGhpcy5zdGF0RmlsZShzb3VyY2VQYXRoKSxcbiAgICAgICAgICB0aGlzLnN0YXRGaWxlKGRlc3RQYXRoKVxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoc291cmNlU3RhdHMuc2l6ZSAhPT0gZGVzdFN0YXRzLnNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgU2l6ZSBtaXNtYXRjaCBhZnRlciBjb3B5IC0gc291cmNlOiAke3NvdXJjZVN0YXRzLnNpemV9IGJ5dGVzLCBgICtcbiAgICAgICAgICAgIGBkZXN0aW5hdGlvbjogJHtkZXN0U3RhdHMuc2l6ZX0gYnl0ZXNgXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZlcmlmeSBjaGVja3N1bSBtYXRjaGVzIGZvciBjb21wbGV0ZSBpbnRlZ3JpdHlcbiAgICAgICAgY29uc3QgW3NvdXJjZUNoZWNrc3VtLCBkZXN0Q2hlY2tzdW1dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ2hlY2tzdW0oc291cmNlUGF0aCksXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVDaGVja3N1bShkZXN0UGF0aClcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHNvdXJjZUNoZWNrc3VtICE9PSBkZXN0Q2hlY2tzdW0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2hlY2tzdW0gbWlzbWF0Y2ggYWZ0ZXIgY29weSAtIHNvdXJjZTogJHtzb3VyY2VDaGVja3N1bX0sIGAgK1xuICAgICAgICAgICAgYGRlc3RpbmF0aW9uOiAke2Rlc3RDaGVja3N1bX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBwcm9wZXIgcGVybWlzc2lvbnNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNobW9kRmlsZShkZXN0UGF0aCwgRklMRV9DT05TVEFOVFMuRklMRV9QRVJNSVNTSU9OUyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3VsZCBub3Qgc2V0IHBlcm1pc3Npb25zIG9uICR7ZGVzdFBhdGh9OiAke2Vycm9yfWAsXG4gICAgICAgICAgICB7IHNvdXJjZVBhdGgsIGRlc3RQYXRoLCBhdHRlbXB0IH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3VjY2VzcyAtIGZpbGUgY29waWVkIGFuZCB2ZXJpZmllZFxuICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTdWNjZXNzZnVsbHkgY29waWVkIGFuZCB2ZXJpZmllZDogJHtwYXRoLmJhc2VuYW1lKHNvdXJjZVBhdGgpfWAsXG4gICAgICAgICAgeyBzaXplOiBzb3VyY2VTdGF0cy5zaXplLCBjaGVja3N1bTogc291cmNlQ2hlY2tzdW0uc3Vic3RyaW5nKDAsIDgpIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBhcyBFcnJvcjtcblxuICAgICAgICAvLyBDbGVhbiB1cCBmYWlsZWQgY29weVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlRmlsZU9wKGRlc3RQYXRoKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXR0ZW1wdCA8IENPUFlfUkVUUllfQVRURU1QVFMpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvcHkgYXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZCwgcmV0cnlpbmcuLi5gLFxuICAgICAgICAgICAgeyBlcnJvcjogbGFzdEVycm9yLm1lc3NhZ2UsIHNvdXJjZVBhdGgsIGRlc3RQYXRoIH1cbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBDT1BZX1JFVFJZX0RFTEFZICogYXR0ZW1wdCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFsbCBhdHRlbXB0cyBmYWlsZWRcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGNvcHkgJHtwYXRoLmJhc2VuYW1lKHNvdXJjZVBhdGgpfSBhZnRlciAke0NPUFlfUkVUUllfQVRURU1QVFN9IGF0dGVtcHRzOiBgICtcbiAgICAgIGAke2xhc3RFcnJvcj8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YFxuICAgICk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSB0aGUgcG9ydGZvbGlvIHdpdGggZGVmYXVsdCBlbGVtZW50cyBmcm9tIGJ1bmRsZWQgZGF0YVxuICAgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgcG9ydGZvbGlvIGluaXRpYWxpemF0aW9uIGZvciBuZXcgaW5zdGFsbGF0aW9uc1xuICAgKiBQcm90ZWN0ZWQgYWdhaW5zdCBjb25jdXJyZW50IGNhbGxzIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcG9wdWxhdGVEZWZhdWx0cyhwb3J0Zm9saW9CYXNlRGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiBwb3B1bGF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgcG9ydGZvbGlvXG4gICAgY29uc3QgZXhpc3RpbmdQb3B1bGF0aW9uID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wb3B1bGF0ZUluUHJvZ3Jlc3MuZ2V0KHBvcnRmb2xpb0Jhc2VEaXIpO1xuICAgIGlmIChleGlzdGluZ1BvcHVsYXRpb24pIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQb3B1bGF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MgZm9yIHBvcnRmb2xpbywgd2FpdGluZy4uLicsXG4gICAgICAgIHsgcG9ydGZvbGlvQmFzZURpciB9XG4gICAgICApO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nUG9wdWxhdGlvbjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIG5ldyBwb3B1bGF0aW9uIHByb21pc2VcbiAgICBjb25zdCBwb3B1bGF0aW9uUHJvbWlzZSA9IHRoaXMucGVyZm9ybVBvcHVsYXRpb24ocG9ydGZvbGlvQmFzZURpcilcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgd2hlbiBkb25lXG4gICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLmRlbGV0ZShwb3J0Zm9saW9CYXNlRGlyKTtcbiAgICAgIH0pO1xuICAgIFxuICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLnNldChwb3J0Zm9saW9CYXNlRGlyLCBwb3B1bGF0aW9uUHJvbWlzZSk7XG4gICAgcmV0dXJuIHBvcHVsYXRpb25Qcm9taXNlO1xuICB9XG4gIFxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgYWN0dWFsIHBvcHVsYXRpb24gb2YgZGVmYXVsdCBlbGVtZW50c1xuICAgKiBAcGFyYW0gcG9ydGZvbGlvQmFzZURpciBCYXNlIGRpcmVjdG9yeSBvZiB0aGUgcG9ydGZvbGlvXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBlcmZvcm1Qb3B1bGF0aW9uKHBvcnRmb2xpb0Jhc2VEaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENoZWNrIGlmIHRlc3QgZGF0YSBsb2FkaW5nIGlzIGRpc2FibGVkXG4gICAgLy8gTm90ZTogVGhpcyBjaGVjayBpcyBuZWVkZWQgZXZlbiB0aG91Z2ggY29uc3RydWN0b3Igc2V0cyBjb25maWcsIGJlY2F1c2VcbiAgICAvLyBjb25maWcgY2FuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIgY29uc3RydWN0aW9uXG4gICAgXG4gICAgLy8gVXNlIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQgZGV0ZWN0aW9uIHRoYXQgcmVzcGVjdHMgRk9SQ0VfUFJPRFVDVElPTl9NT0RFXG4gICAgY29uc3QgaXNEZXZlbG9wbWVudE1vZGUgPSAhdGhpcy5pc1Byb2R1Y3Rpb25FbnZpcm9ubWVudCgpO1xuICAgIFxuICAgIGlmIChpc0RldmVsb3BtZW50TW9kZSAmJiAhdGhpcy5jb25maWcubG9hZFRlc3REYXRhKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTa2lwcGluZyBkZWZhdWx0IGVsZW1lbnQgcG9wdWxhdGlvbiBpbiBkZXZlbG9wbWVudCBtb2RlJyxcbiAgICAgICAgeyBcbiAgICAgICAgICBwb3J0Zm9saW9CYXNlRGlyLFxuICAgICAgICAgIHJlYXNvbjogJ1Rlc3QgZGF0YSBsb2FkaW5nIGRpc2FibGVkJyxcbiAgICAgICAgICBlbmFibGVXaXRoOiAnU2V0IERPTExIT1VTRV9MT0FEX1RFU1RfREFUQT10cnVlIHRvIGVuYWJsZSdcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgbG9nZ2VyLmluZm8oXG4gICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN0YXJ0aW5nIGRlZmF1bHQgZWxlbWVudCBwb3B1bGF0aW9uJyxcbiAgICAgIHsgcG9ydGZvbGlvQmFzZURpciB9XG4gICAgKTtcbiAgICBcbiAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIHBvcnRmb2xpbyBpbml0aWFsaXphdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdQT1JURk9MSU9fSU5JVElBTElaQVRJT04nLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wZXJmb3JtUG9wdWxhdGlvbicsXG4gICAgICBkZXRhaWxzOiBgU3RhcnRpbmcgZGVmYXVsdCBlbGVtZW50IHBvcHVsYXRpb24gZm9yIHBvcnRmb2xpbzogJHtwb3J0Zm9saW9CYXNlRGlyfWBcbiAgICB9KTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBidW5kbGVkIGRhdGEgZGlyZWN0b3J5XG4gICAgY29uc3QgZGF0YURpciA9IGF3YWl0IHRoaXMuZmluZERhdGFEaXJlY3RvcnkoKTtcbiAgICBpZiAoIWRhdGFEaXIpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnkgZm91bmQgLSBwb3J0Zm9saW8gd2lsbCBzdGFydCBlbXB0eScsXG4gICAgICAgIHsgXG4gICAgICAgICAgc2VhcmNoUGF0aHM6IHRoaXMuZGF0YVNlYXJjaFBhdGhzLnNsaWNlKDAsIDMpLCAvLyBMb2cgZmlyc3QgZmV3IHBhdGhzIGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgZGlybmFtZTogdGhpcy5fX2Rpcm5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gVHJhY2sgdG90YWwgZmlsZXMgY29waWVkXG4gICAgbGV0IHRvdGFsQ29waWVkID0gMDtcbiAgICBjb25zdCBjb3BpZWRDb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBcbiAgICAvLyBDb3B5IGVhY2ggZWxlbWVudCB0eXBlIC0gZGlyZWN0b3JpZXMgbm93IG1hdGNoIGVudW0gdmFsdWVzIChhbGwgcGx1cmFsKVxuICAgIGZvciAoY29uc3QgZWxlbWVudFR5cGUgb2YgT2JqZWN0LnZhbHVlcyhFbGVtZW50VHlwZSkpIHtcbiAgICAgIGNvbnN0IHNvdXJjZURpciA9IHBhdGguam9pbihkYXRhRGlyLCBlbGVtZW50VHlwZSk7XG4gICAgICBjb25zdCBkZXN0RGlyID0gcGF0aC5qb2luKHBvcnRmb2xpb0Jhc2VEaXIsIGVsZW1lbnRUeXBlKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgc291cmNlIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGNvbnN0IHNvdXJjZURpckV4aXN0cyA9IGF3YWl0IHRoaXMuZmlsZUV4aXN0cyhzb3VyY2VEaXIpO1xuICAgICAgaWYgKCFzb3VyY2VEaXJFeGlzdHMpIHtcbiAgICAgICAgLy8gU291cmNlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCBza2lwXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vICR7ZWxlbWVudFR5cGV9IGRpcmVjdG9yeSBpbiBidW5kbGVkIGRhdGFgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvcGllZENvdW50ID0gYXdhaXQgdGhpcy5jb3B5RWxlbWVudEZpbGVzKHNvdXJjZURpciwgZGVzdERpciwgZWxlbWVudFR5cGUpO1xuICAgICAgICBjb3BpZWRDb3VudHNbZWxlbWVudFR5cGVdID0gY29waWVkQ291bnQ7XG4gICAgICAgIHRvdGFsQ29waWVkICs9IGNvcGllZENvdW50O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXJyb3IgY29weWluZyAke2VsZW1lbnRUeXBlfSBlbGVtZW50czpgLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmICh0b3RhbENvcGllZCA+IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFN1Y2Nlc3NmdWxseSBwb3B1bGF0ZWQgcG9ydGZvbGlvIHdpdGggJHt0b3RhbENvcGllZH0gZGVmYXVsdCBlbGVtZW50KHMpYCxcbiAgICAgICAge1xuICAgICAgICAgIHBvcnRmb2xpb0Jhc2VEaXIsXG4gICAgICAgICAgZGF0YURpcixcbiAgICAgICAgICBicmVha2Rvd246IGNvcGllZENvdW50c1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgXG4gICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIHN1Y2Nlc3NmdWwgcG9wdWxhdGlvblxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnUE9SVEZPTElPX1BPUFVMQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wZXJmb3JtUG9wdWxhdGlvbicsXG4gICAgICAgIGRldGFpbHM6IGBTdWNjZXNzZnVsbHkgcG9wdWxhdGVkIHBvcnRmb2xpbyB3aXRoICR7dG90YWxDb3BpZWR9IGRlZmF1bHQgZWxlbWVudHNgLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHBvcnRmb2xpb0Jhc2VEaXIsXG4gICAgICAgICAgZGF0YURpcixcbiAgICAgICAgICBjb3BpZWRDb3VudHNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gTm8gbmV3IGVsZW1lbnRzIHRvIGNvcHkgLSBwb3J0Zm9saW8gbWF5IGFscmVhZHkgaGF2ZSBjb250ZW50Jyk7XG4gICAgfVxuICB9XG59Il19
|
|
1031
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVmYXVsdEVsZW1lbnRQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wb3J0Zm9saW8vRGVmYXVsdEVsZW1lbnRQcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxxR0FBcUc7QUFDckcseUdBQXlHO0FBQ3pHLDZGQUE2RjtBQUM3RixPQUFPLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQztBQUM3QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRW5FLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUc7SUFDNUIsaUJBQWlCLEVBQUUsS0FBSztJQUN4QixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsTUFBTTtJQUNyQixjQUFjLEVBQUUsT0FBTztJQUN2QixhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsZ0NBQWdDO0lBQ2pFLGtCQUFrQixFQUFFLFFBQVE7SUFDNUIsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxzQ0FBc0M7Q0FDcEQsQ0FBQztB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LFlBQVk7YUFDeEIsQ0FDRixDQUFDO1lBRUYsK0NBQStDO1lBQy9DLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLHFCQUFxQjtnQkFDM0IsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLDBDQUEwQztnQkFDbEQsT0FBTyxFQUFFLHlDQUF5QyxXQUFXLG1CQUFtQjtnQkFDaEYsUUFBUSxFQUFFO29CQUNSLGdCQUFnQjtvQkFDaEIsT0FBTztvQkFDUCxZQUFZO2lCQUNiO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsSUFBSSxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDdkcsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlZmF1bHRFbGVtZW50UHJvdmlkZXIgLSBQb3B1bGF0ZXMgcG9ydGZvbGlvIHdpdGggZGVmYXVsdCBlbGVtZW50cyBmcm9tIGJ1bmRsZWQgZGF0YVxuICogXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMgY29weWluZyBkZWZhdWx0IHBlcnNvbmFzLCBza2lsbHMsIHRlbXBsYXRlcywgYW5kIG90aGVyIGVsZW1lbnRzXG4gKiBmcm9tIHRoZSBOUE0gcGFja2FnZSBvciBHaXQgcmVwb3NpdG9yeSB0byB0aGUgdXNlcidzIHBvcnRmb2xpbyBvbiBmaXJzdCBydW4uXG4gKiBJdCBlbnN1cmVzIHVzZXJzIGhhdmUgZXhhbXBsZSBjb250ZW50IHRvIHdvcmsgd2l0aCBpbW1lZGlhdGVseSBhZnRlciBpbnN0YWxsYXRpb24uXG4gKi9cblxuLy8gTk9URTogZnNTeW5jIGlzIGludGVudGlvbmFsbHkga2VwdCBmb3Igc3luY2hyb25vdXMgZGV2ZWxvcG1lbnQgbW9kZSBkZXRlY3Rpb24gYXQgbW9kdWxlIGxvYWQgdGltZS5cbi8vIFRoZSBJU19ERVZFTE9QTUVOVF9NT0RFIGNoZWNrIHJ1bnMgZHVyaW5nIG1vZHVsZSBpbml0aWFsaXphdGlvbiBiZWZvcmUgYXN5bmMgb3BlcmF0aW9ucyBhcmUgYXZhaWxhYmxlLlxuLy8gQWxsIG90aGVyIGZpbGUgb3BlcmF0aW9ucyB1c2UgRmlsZU9wZXJhdGlvbnNTZXJ2aWNlIGZvciBjZW50cmFsaXplZCwgc2VjdXJlIGZpbGUgaGFuZGxpbmcuXG5pbXBvcnQgKiBhcyBmc1N5bmMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IElGaWxlT3BlcmF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9GaWxlT3BlcmF0aW9uc1NlcnZpY2UuanMnO1xuaW1wb3J0IHsgQ29udGVudFZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L2NvbnRlbnRWYWxpZGF0b3IuanMnO1xuXG4vLyBGaWxlIG9wZXJhdGlvbiBjb25zdGFudHNcbmV4cG9ydCBjb25zdCBGSUxFX0NPTlNUQU5UUyA9IHtcbiAgRUxFTUVOVF9FWFRFTlNJT046ICcubWQnLFxuICBZQU1MX0VYVEVOU0lPTjogJy55YW1sJyxcbiAgWU1MX0VYVEVOU0lPTjogJy55bWwnLFxuICBKU09OX0VYVEVOU0lPTjogJy5qc29uJyxcbiAgTUFYX0ZJTEVfU0laRTogMTAgKiAxMDI0ICogMTAyNCwgLy8gMTBNQiBtYXggZmlsZSBzaXplIGZvciBzYWZldHlcbiAgQ0hFQ0tTVU1fQUxHT1JJVEhNOiAnc2hhMjU2JyxcbiAgRklMRV9QRVJNSVNTSU9OUzogMG82NDQsXG4gIENIVU5LX1NJWkU6IDY0ICogMTAyNCAvLyA2NEtCIGNodW5rcyBmb3IgcmVhZGluZyBsYXJnZSBmaWxlc1xufSBhcyBjb25zdDtcblxuLy8gRGV2ZWxvcG1lbnQgbW9kZSBkZXRlY3Rpb25cbi8vIFdoZW4gcnVubmluZyBmcm9tIGEgZ2l0IGNsb25lLCB3ZSBkb24ndCB3YW50IHRvIGF1dG8tbG9hZCB0ZXN0IGRhdGFcbmNvbnN0IElTX0RFVkVMT1BNRU5UX01PREUgPSAoKCkgPT4ge1xuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGEgZ2l0IHJlcG9zaXRvcnkgKGRldmVsb3BtZW50IG1vZGUpXG4gICAgY29uc3QgZ2l0RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuZ2l0Jyk7XG4gICAgcmV0dXJuIGZzU3luYy5leGlzdHNTeW5jKGdpdERpcik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSkoKTtcblxuLy8gSW50ZXJuYWwgY29uc3RhbnRzXG5jb25zdCBDT1BZX1JFVFJZX0FUVEVNUFRTID0gMztcbmNvbnN0IENPUFlfUkVUUllfREVMQVkgPSAxMDA7IC8vIG1zXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdEVsZW1lbnRQcm92aWRlckNvbmZpZyB7XG4gIC8qKiBDdXN0b20gZGF0YSBkaXJlY3RvcnkgcGF0aHMgdG8gc2VhcmNoIChjaGVja2VkIGJlZm9yZSBkZWZhdWx0IHBhdGhzKSAqL1xuICBjdXN0b21EYXRhUGF0aHM/OiBzdHJpbmdbXTtcbiAgLyoqIFdoZXRoZXIgdG8gdXNlIGRlZmF1bHQgc2VhcmNoIHBhdGhzIGFmdGVyIGN1c3RvbSBwYXRocyAqL1xuICB1c2VEZWZhdWx0UGF0aHM/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0byBsb2FkIHRlc3QvZXhhbXBsZSBkYXRhIGZyb20gcmVwb3NpdG9yeSAoZGVmYXVsdDogZmFsc2UgaW4gZGV2IG1vZGUpICovXG4gIGxvYWRUZXN0RGF0YT86IGJvb2xlYW47XG4gIC8qKiBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgZm9yIGNlbnRyYWxpemVkIGZpbGUgb3BlcmF0aW9ucyAqL1xuICBmaWxlT3BlcmF0aW9ucz86IElGaWxlT3BlcmF0aW9uc1NlcnZpY2U7XG59XG5cbi8vIFBFUkZPUk1BTkNFOiBNZXRhZGF0YSBjYWNoZSB3aXRoIG10aW1lLWJhc2VkIGludmFsaWRhdGlvblxuaW50ZXJmYWNlIE1ldGFkYXRhQ2FjaGVFbnRyeSB7XG4gIG1ldGFkYXRhOiBhbnk7XG4gIG10aW1lOiBudW1iZXI7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRFbGVtZW50UHJvdmlkZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IF9fZGlybmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHN0YXRpYyBjYWNoZWREYXRhRGlyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGF0aWMgcG9wdWxhdGVJblByb2dyZXNzOiBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IERlZmF1bHRFbGVtZW50UHJvdmlkZXJDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmlsZU9wZXJhdGlvbnM/OiBJRmlsZU9wZXJhdGlvbnNTZXJ2aWNlO1xuICBwcml2YXRlIHN0YXRpYyBsb2dMaXN0ZW5lcj86IChsZXZlbDogJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcicsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkO1xuXG4gIHN0YXRpYyBhZGRMb2dMaXN0ZW5lcihmbjogKGxldmVsOiAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJywgbWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLmxvZ0xpc3RlbmVyID0gZm47XG4gICAgcmV0dXJuICgpID0+IHsgdGhpcy5sb2dMaXN0ZW5lciA9IHVuZGVmaW5lZDsgfTtcbiAgfVxuXG4gIC8vIFBFUkZPUk1BTkNFIE9QVElNSVpBVElPTjogQ2FjaGUgbWV0YWRhdGEgd2l0aCBmaWxlIG10aW1lIGZvciBpbnZhbGlkYXRpb25cbiAgcHJpdmF0ZSBzdGF0aWMgbWV0YWRhdGFDYWNoZTogTWFwPHN0cmluZywgTWV0YWRhdGFDYWNoZUVudHJ5PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX0NBQ0hFX1NJWkUgPSAyMDsgLy8gTUVNT1JZIExFQUsgRklYOiBGdXJ0aGVyIHJlZHVjZWQgY2FjaGUgc2l6ZSB0byBwcmV2ZW50IGFjY3VtdWxhdGlvbiBkdXJpbmcgcGVyZm9ybWFuY2UgdGVzdHNcblxuICBjb25zdHJ1Y3Rvcihjb25maWc/OiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyQ29uZmlnKSB7XG4gICAgY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICB0aGlzLl9fZGlybmFtZSA9IHBhdGguZGlybmFtZShfX2ZpbGVuYW1lKTtcblxuICAgIC8vIFN0b3JlIGZpbGVPcGVyYXRpb25zIHNlcnZpY2UgaWYgcHJvdmlkZWRcbiAgICB0aGlzLmZpbGVPcGVyYXRpb25zID0gY29uZmlnPy5maWxlT3BlcmF0aW9ucztcbiAgICBcbiAgICAvLyBDaGVjayBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgdGVzdCBkYXRhIGxvYWRpbmdcbiAgICBjb25zdCBlbnZMb2FkVGVzdERhdGEgPSBwcm9jZXNzLmVudi5ET0xMSE9VU0VfTE9BRF9URVNUX0RBVEE7XG4gICAgY29uc3QgbG9hZFRlc3REYXRhRnJvbUVudiA9IGVudkxvYWRUZXN0RGF0YSA9PT0gJ3RydWUnIHx8IGVudkxvYWRUZXN0RGF0YSA9PT0gJzEnO1xuICAgIGNvbnN0IGRpc2FibGVUZXN0RGF0YUZyb21FbnYgPSBlbnZMb2FkVGVzdERhdGEgPT09ICdmYWxzZScgfHwgZW52TG9hZFRlc3REYXRhID09PSAnMCc7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgd2UncmUgaW4gZGV2ZWxvcG1lbnQgbW9kZSAod2l0aCByZXNwZWN0IHRvIEZPUkNFX1BST0RVQ1RJT05fTU9ERSBvdmVycmlkZSlcbiAgICBjb25zdCBpc0Rldk1vZGUgPSAoKCkgPT4ge1xuICAgICAgLy8gUmVzcGVjdCBGT1JDRV9QUk9EVUNUSU9OX01PREUgb3ZlcnJpZGUgZmlyc3RcbiAgICAgIGlmIChwcm9jZXNzLmVudi5GT1JDRV9QUk9EVUNUSU9OX01PREUgPT09ICd0cnVlJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZvcmNlIHByb2R1Y3Rpb24gbW9kZVxuICAgICAgfVxuICAgICAgaWYgKHByb2Nlc3MuZW52LkZPUkNFX1BST0RVQ1RJT05fTU9ERSA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRm9yY2UgZGV2ZWxvcG1lbnQgbW9kZVxuICAgICAgfVxuICAgICAgLy8gRmFsbCBiYWNrIHRvIGdpdCBkZXRlY3Rpb25cbiAgICAgIHJldHVybiBJU19ERVZFTE9QTUVOVF9NT0RFO1xuICAgIH0pKCk7XG4gICAgXG4gICAgLy8gRGV0ZXJtaW5lIGxvYWRUZXN0RGF0YSB2YWx1ZVxuICAgIGxldCBjb21wdXRlZExvYWRUZXN0RGF0YTogYm9vbGVhbjtcbiAgICBpZiAobG9hZFRlc3REYXRhRnJvbUVudikge1xuICAgICAgLy8gRW52aXJvbm1lbnQgZXhwbGljaXRseSBlbmFibGVzIHRlc3QgZGF0YVxuICAgICAgY29tcHV0ZWRMb2FkVGVzdERhdGEgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZGlzYWJsZVRlc3REYXRhRnJvbUVudikge1xuICAgICAgLy8gRW52aXJvbm1lbnQgZXhwbGljaXRseSBkaXNhYmxlcyB0ZXN0IGRhdGFcbiAgICAgIGNvbXB1dGVkTG9hZFRlc3REYXRhID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERlZmF1bHQgbG9naWM6IGVuYWJsZSBpbiBwcm9kdWN0aW9uLCBkaXNhYmxlIGluIGRldmVsb3BtZW50IHVubGVzcyBjb25maWcgb3ZlcnJpZGVzXG4gICAgICBjb21wdXRlZExvYWRUZXN0RGF0YSA9ICFpc0Rldk1vZGUgJiYgKGNvbmZpZz8ubG9hZFRlc3REYXRhID8/IHRydWUpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIHVzZURlZmF1bHRQYXRoczogdHJ1ZSxcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIC8vIEFwcGx5IGZpbmFsIGxvYWRUZXN0RGF0YSBsb2dpYyAtIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgZGV2ZWxvcG1lbnQgbW9kZSB0YWtlIHByZWNlZGVuY2VcbiAgICAgIGxvYWRUZXN0RGF0YTogbG9hZFRlc3REYXRhRnJvbUVudiA/IHRydWUgOiBkaXNhYmxlVGVzdERhdGFGcm9tRW52ID8gZmFsc2UgOiBjb21wdXRlZExvYWRUZXN0RGF0YVxuICAgIH07XG4gICAgXG4gICAgaWYgKGlzRGV2TW9kZSAmJiAhdGhpcy5jb25maWcubG9hZFRlc3REYXRhKSB7XG4gICAgICBsb2dnZXIuaW5mbygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIERldmVsb3BtZW50IG1vZGUgZGV0ZWN0ZWQgLSB0ZXN0IGRhdGEgbG9hZGluZyBkaXNhYmxlZCcpO1xuICAgICAgbG9nZ2VyLmluZm8oJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBUbyBlbmFibGUgdGVzdCBkYXRhLCBzZXQgRE9MTEhPVVNFX0xPQURfVEVTVF9EQVRBPXRydWUnKTtcbiAgICB9XG5cbiAgICAvLyBSZWdpc3RlciBidW5kbGVkIGVsZW1lbnQgaGFzaGVzIHdpdGggQ29udGVudFZhbGlkYXRvciBzbyB2ZXJpZmllZCBidW5kbGVkXG4gICAgLy8gY29udGVudCBkb2VzIG5vdCB0cmlnZ2VyIGZhbHNlLXBvc2l0aXZlIENSSVRJQ0FMIGluamVjdGlvbiBhbGVydHMgYXQgc3RhcnR1cC5cbiAgICB0aGlzLnJlZ2lzdGVyQnVuZGxlZEhhc2hlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgZGF0YS9IQVNIRVMuanNvbiAoc2hpcHBlZCB3aXRoIHRoZSBucG0gcGFja2FnZSkgYW5kIHJlZ2lzdGVyIGVhY2hcbiAgICogU0hBLTI1NiBoYXNoIHdpdGggQ29udGVudFZhbGlkYXRvciBhcyB0cnVzdGVkIGJ1bmRsZWQgY29udGVudC5cbiAgICpcbiAgICogT25seSBmaWxlcyB3aG9zZSBvbi1kaXNrIGhhc2ggbWF0Y2hlcyB0aGUgbWFuaWZlc3QgZW50cnkgYXJlIHJlZ2lzdGVyZWQg4oCUXG4gICAqIGFueSBwb3N0LWluc3RhbGwgbW9kaWZpY2F0aW9uIGJyZWFrcyB0aGUgaGFzaCBhbmQgcmV2b2tlcyB0cnVzdCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3RlckJ1bmRsZWRIYXNoZXMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhc2hlc1BhdGggPSBwYXRoLmpvaW4odGhpcy5fX2Rpcm5hbWUsICcuLicsICdkYXRhJywgJ0hBU0hFUy5qc29uJyk7XG4gICAgICBjb25zdCByYXcgPSBmc1N5bmMucmVhZEZpbGVTeW5jKGhhc2hlc1BhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgbWFuaWZlc3Q6IHsgZmlsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfSA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgIGNvbnN0IGRhdGFEaXIgPSBwYXRoLmpvaW4odGhpcy5fX2Rpcm5hbWUsICcuLicsICdkYXRhJyk7XG4gICAgICBsZXQgcmVnaXN0ZXJlZCA9IDA7XG5cbiAgICAgIGZvciAoY29uc3QgW3JlbFBhdGgsIGV4cGVjdGVkSGFzaF0gb2YgT2JqZWN0LmVudHJpZXMobWFuaWZlc3QuZmlsZXMpKSB7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRhdGFEaXIsIHJlbFBhdGgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmc1N5bmMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoKTtcbiAgICAgICAgICBjb25zdCBhY3R1YWxIYXNoID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGNvbnRlbnQpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgICAgaWYgKGFjdHVhbEhhc2ggPT09IGV4cGVjdGVkSGFzaCkge1xuICAgICAgICAgICAgQ29udGVudFZhbGlkYXRvci5yZWdpc3RlckJ1bmRsZWRIYXNoKGV4cGVjdGVkSGFzaCk7XG4gICAgICAgICAgICByZWdpc3RlcmVkKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQnVuZGxlZCBmaWxlIGhhc2ggbWlzbWF0Y2gg4oCUIHRyZWF0aW5nIGFzIHVudHJ1c3RlZDogJHtyZWxQYXRofWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gRmlsZSBtaXNzaW5nIGZyb20gdGhpcyBidWlsZCdzIGRhdGEvIOKAlCBza2lwIHNpbGVudGx5XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gUmVnaXN0ZXJlZCAke3JlZ2lzdGVyZWR9IHZlcmlmaWVkIGJ1bmRsZWQgZWxlbWVudCBoYXNoZXNgKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEhBU0hFUy5qc29uIG1pc3NpbmcgKG9sZGVyIGluc3RhbGwsIGRldiBtb2RlLCBvciBzdHJpcHBlZCBwYWNrYWdlKSDigJQgZGVncmFkZSBncmFjZWZ1bGx5XG4gICAgICBsb2dnZXIuZGVidWcoJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBkYXRhL0hBU0hFUy5qc29uIG5vdCBmb3VuZCDigJQgYnVuZGxlZCBlbGVtZW50IHRydXN0IHNraXBwZWQnKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgbG9hZFRlc3REYXRhIGNvbmZpZ3VyYXRpb24gdmFsdWVcbiAgICogQHJldHVybnMgV2hldGhlciB0ZXN0IGRhdGEgbG9hZGluZyBpcyBlbmFibGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzVGVzdERhdGFMb2FkaW5nRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubG9hZFRlc3REYXRhID8/IGZhbHNlO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IHdoZXRoZXIgdGhlIHN5c3RlbSBpcyBpbiBkZXZlbG9wbWVudCBtb2RlXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgcnVubmluZyBpbiBkZXZlbG9wbWVudCBtb2RlXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRGV2ZWxvcG1lbnRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBJU19ERVZFTE9QTUVOVF9NT0RFO1xuICB9XG5cbiAgLy8gPT09PT0gSEVMUEVSIE1FVEhPRFMgRk9SIEZJTEUgT1BFUkFUSU9OUyA9PT09PVxuICAvLyBUaGVzZSBtZXRob2RzIHByb3ZpZGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aGVuIGZpbGVPcGVyYXRpb25zIGlzIG5vdCBpbmplY3RlZFxuICAvLyBhbmQgY2VudHJhbGl6ZSBhbGwgZmlsZSBzeXN0ZW0gY2FsbHMgdGhyb3VnaCBGaWxlT3BlcmF0aW9uc1NlcnZpY2Ugd2hlbiBhdmFpbGFibGVcblxuICBwcml2YXRlIGFzeW5jIHN0YXRGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGZzU3luYy5TdGF0cz4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5zdGF0KGZpbGVQYXRoKTtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2s6IGltcG9ydCBmcy9wcm9taXNlcyBkeW5hbWljYWxseSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgcmV0dXJuIGZzLnN0YXQoZmlsZVBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsaXN0RGlyKGRpclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMubGlzdERpcmVjdG9yeShkaXJQYXRoKTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICByZXR1cm4gZnMucmVhZGRpcihkaXJQYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmlsZUV4aXN0cyhmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLmV4aXN0cyhmaWxlUGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLmFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1ha2VEaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLmNyZWF0ZURpcmVjdG9yeShkaXJQYXRoKTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weUZpbGVPcChzb3VyY2VQYXRoOiBzdHJpbmcsIGRlc3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5maWxlT3BlcmF0aW9ucykge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZU9wZXJhdGlvbnMuY29weUZpbGUoc291cmNlUGF0aCwgZGVzdFBhdGgsIHtcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb3B5RmlsZU9wJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgYXdhaXQgZnMuY29weUZpbGUoc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaG1vZEZpbGUoZmlsZVBhdGg6IHN0cmluZywgbW9kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLmNobW9kKGZpbGVQYXRoLCBtb2RlLCB7XG4gICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2htb2RGaWxlJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgYXdhaXQgZnMuY2htb2QoZmlsZVBhdGgsIG1vZGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkZWxldGVGaWxlT3AoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmZpbGVPcGVyYXRpb25zKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWxlT3BlcmF0aW9ucy5kZWxldGVGaWxlKGZpbGVQYXRoLCB1bmRlZmluZWQsIHtcbiAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5kZWxldGVGaWxlT3AnXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgeyBwcm9taXNlczogZnMgfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICBhd2FpdCBmcy51bmxpbmsoZmlsZVBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkRmlsZUNvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuZmlsZU9wZXJhdGlvbnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbGVPcGVyYXRpb25zLnJlYWRGaWxlKGZpbGVQYXRoLCB7XG4gICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIucmVhZEZpbGVDb250ZW50J1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgfVxuXG4gIC8vID09PT09IEVORCBIRUxQRVIgTUVUSE9EUyA9PT09PVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggcGF0aHMgZm9yIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnlcbiAgICogT3JkZXJlZCBieSBwcmlvcml0eSAtIGN1c3RvbSBwYXRocyBmaXJzdCwgdGhlbiBkZXZlbG9wbWVudC9naXQsIHRoZW4gTlBNIGxvY2F0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZGF0YVNlYXJjaFBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICAvLyBBZGQgY3VzdG9tIHBhdGhzIGZpcnN0IChoaWdoZXN0IHByaW9yaXR5KVxuICAgIGlmICh0aGlzLmNvbmZpZy5jdXN0b21EYXRhUGF0aHMpIHtcbiAgICAgIHBhdGhzLnB1c2goLi4udGhpcy5jb25maWcuY3VzdG9tRGF0YVBhdGhzKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIGRlZmF1bHQgcGF0aHMgaWYgZW5hYmxlZFxuICAgIGlmICh0aGlzLmNvbmZpZy51c2VEZWZhdWx0UGF0aHMgIT09IGZhbHNlKSB7XG4gICAgICAvLyBTa2lwIGRldmVsb3BtZW50L3JlcG9zaXRvcnkgZGF0YSBwYXRocyB1bmxlc3MgdGVzdCBkYXRhIGxvYWRpbmcgaXMgZW5hYmxlZFxuICAgICAgaWYgKHRoaXMuY29uZmlnLmxvYWRUZXN0RGF0YSkge1xuICAgICAgICAvLyBEZXZlbG9wbWVudC9HaXQgaW5zdGFsbGF0aW9uIChyZWxhdGl2ZSB0byB0aGlzIGZpbGUpXG4gICAgICAgIHBhdGhzLnB1c2goXG4gICAgICAgICAgcGF0aC5qb2luKHRoaXMuX19kaXJuYW1lLCAnLi4vLi4vZGF0YScpLFxuICAgICAgICAgIHBhdGguam9pbih0aGlzLl9fZGlybmFtZSwgJy4uLy4uLy4uL2RhdGEnKSxcbiAgICAgICAgICAvLyBDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IChsYXN0IHJlc29ydClcbiAgICAgICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2RhdGEnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBBbHdheXMgaW5jbHVkZSBOUE0gaW5zdGFsbGF0aW9uIHBhdGhzICh0aGVzZSB3b3VsZCBoYXZlIHByb2R1Y3Rpb24gZGF0YSlcbiAgICAgIHBhdGhzLnB1c2goXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gbWFjT1MgSG9tZWJyZXdcbiAgICAgICAgJy9vcHQvaG9tZWJyZXcvbGliL25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIvZGF0YScsXG4gICAgICAgIFxuICAgICAgICAvLyBOUE0gaW5zdGFsbGF0aW9ucyAtIHN0YW5kYXJkIFVuaXgvTGludXhcbiAgICAgICAgJy91c3IvbG9jYWwvbGliL25vZGVfbW9kdWxlcy9AZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIvZGF0YScsXG4gICAgICAgICcvdXNyL2xpYi9ub2RlX21vZHVsZXMvQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyL2RhdGEnLFxuICAgICAgICBcbiAgICAgICAgLy8gTlBNIGluc3RhbGxhdGlvbnMgLSBXaW5kb3dzXG4gICAgICAgICdDOlxcXFxQcm9ncmFtIEZpbGVzXFxcXG5vZGVqc1xcXFxub2RlX21vZHVsZXNcXFxcQGRvbGxob3VzZW1jcFxcXFxtY3Atc2VydmVyXFxcXGRhdGEnLFxuICAgICAgICAnQzpcXFxcUHJvZ3JhbSBGaWxlcyAoeDg2KVxcXFxub2RlanNcXFxcbm9kZV9tb2R1bGVzXFxcXEBkb2xsaG91c2VtY3BcXFxcbWNwLXNlcnZlclxcXFxkYXRhJyxcbiAgICAgICAgXG4gICAgICAgIC8vIE5QTSBpbnN0YWxsYXRpb25zIC0gV2luZG93cyB3aXRoIG52bVxuICAgICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5lbnYuQVBQREFUQSB8fCAnJywgJ25wbScsICdub2RlX21vZHVsZXMnLCAnQGRvbGxob3VzZW1jcCcsICdtY3Atc2VydmVyJywgJ2RhdGEnKVxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHBhdGhzO1xuICB9XG4gIFxuICAvKipcbiAgICogRmluZCB0aGUgYnVuZGxlZCBkYXRhIGRpcmVjdG9yeSBieSBjaGVja2luZyBlYWNoIHNlYXJjaCBwYXRoXG4gICAqIFVzZXMgUHJvbWlzZS5hbGxTZXR0bGVkIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIGNhY2hlcyB0aGUgcmVzdWx0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZpbmREYXRhRGlyZWN0b3J5KCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIC8vIFJldHVybiBjYWNoZWQgdmFsdWUgaWYgYXZhaWxhYmxlXG4gICAgaWYgKERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2FjaGVkRGF0YURpciAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuY2FjaGVkRGF0YURpcjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgYWxsIHBhdGhzIGluIHBhcmFsbGVsIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICBjb25zdCBjaGVja1Byb21pc2VzID0gdGhpcy5kYXRhU2VhcmNoUGF0aHMubWFwKGFzeW5jIChzZWFyY2hQYXRoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuc3RhdEZpbGUoc2VhcmNoUGF0aCk7XG4gICAgICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgLy8gVmVyaWZ5IGl0IGNvbnRhaW5zIGV4cGVjdGVkIHN1YmRpcmVjdG9yaWVzXG4gICAgICAgICAgY29uc3QgaGFzUGVyc29uYXMgPSBhd2FpdCB0aGlzLmRpcmVjdG9yeUV4aXN0cyhwYXRoLmpvaW4oc2VhcmNoUGF0aCwgJ3BlcnNvbmFzJykpO1xuICAgICAgICAgIGNvbnN0IGhhc1NraWxscyA9IGF3YWl0IHRoaXMuZGlyZWN0b3J5RXhpc3RzKHBhdGguam9pbihzZWFyY2hQYXRoLCAnc2tpbGxzJykpO1xuICAgICAgICAgIGlmIChoYXNQZXJzb25hcyB8fCBoYXNTa2lsbHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWFyY2hQYXRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIERpcmVjdG9yeSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIGFjY2Vzc2VkXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gICAgXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChjaGVja1Byb21pc2VzKTtcbiAgICBcbiAgICAvLyBGaW5kIHRoZSBmaXJzdCBzdWNjZXNzZnVsIHJlc3VsdFxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJiByZXN1bHQudmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBGb3VuZCBkYXRhIGRpcmVjdG9yeSBhdDogJHtyZXN1bHQudmFsdWV9YCk7XG4gICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBsb2dnZXIud2FybignW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vIGJ1bmRsZWQgZGF0YSBkaXJlY3RvcnkgZm91bmQgaW4gYW55IHNlYXJjaCBwYXRoJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gY2hlY2sgaWYgYSBkaXJlY3RvcnkgZXhpc3RzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpcmVjdG9yeUV4aXN0cyhkaXJQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCB0aGlzLnN0YXRGaWxlKGRpclBhdGgpO1xuICAgICAgcmV0dXJuIHN0YXRzLmlzRGlyZWN0b3J5KCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGZpbGUgcGF0aCB0byBwcmV2ZW50IHBhdGggdHJhdmVyc2FsIGF0dGFja3NcbiAgICogU0VDVVJJVFkgRklYOiBBZGRlZCBmaWxlIHBhdGggdmFsaWRhdGlvbiB0byBwcmV2ZW50IGRpcmVjdG9yeSB0cmF2ZXJzYWxcbiAgICogUHJldmlvdXNseTogRmlsZSBwYXRocyB3ZXJlIHVzZWQgd2l0aG91dCB2YWxpZGF0aW9uLCBhbGxvd2luZyBwb3RlbnRpYWwgLi4vLi4vLi4vIGF0dGFja3NcbiAgICogTm93OiBTdHJpY3QgdmFsaWRhdGlvbiBlbnN1cmVzIHBhdGhzIHN0YXkgd2l0aGluIGFsbG93ZWQgZGlyZWN0b3JpZXNcbiAgICogQHBhcmFtIGZpbGVQYXRoIFRoZSBmaWxlIHBhdGggdG8gdmFsaWRhdGVcbiAgICogQHBhcmFtIGFsbG93ZWRCYXNlUGF0aHMgQXJyYXkgb2YgYWxsb3dlZCBiYXNlIHBhdGhzIChvcHRpb25hbClcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBwYXRoIGlzIHNhZmUsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZpbGVQYXRoKGZpbGVQYXRoOiBzdHJpbmcsIGFsbG93ZWRCYXNlUGF0aHM/OiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBTRUNVUklUWTogTm9ybWFsaXplIHBhdGggdG8gcHJldmVudCB0cmF2ZXJzYWwgYXR0ZW1wdHNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5ub3JtYWxpemUoZmlsZVBhdGgpO1xuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogUmVqZWN0IHBhdGhzIGNvbnRhaW5pbmcgdHJhdmVyc2FsIHBhdHRlcm5zXG4gICAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy4uJykpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBQYXRoIHRyYXZlcnNhbCBhdHRlbXB0IGJsb2NrZWQ6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFk6IENoZWNrIGZvciBob21lIGRpcmVjdG9yeSBleHBhbnNpb24gYXR0ZW1wdHMsIGJ1dCBhbGxvdyBXaW5kb3dzIDguMyBzaG9ydCBwYXRoIG5hbWVzXG4gICAgICAvLyBXaW5kb3dzIHNob3J0IHBhdGggbmFtZXMgdXNlIH4gZm9sbG93ZWQgYnkgYSBkaWdpdCAoZS5nLiwgUlVOTkVSfjEpLCB3aGljaCBzaG91bGQgYmUgYWxsb3dlZFxuICAgICAgLy8gT25seSBibG9jayB+IGZvbGxvd2VkIGJ5IC8gb3IgXFwgKGhvbWUgZGlyZWN0b3J5IGV4cGFuc2lvbiBwYXR0ZXJucylcbiAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnfi8nKSB8fCBub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnflxcXFwnKSkge1xuICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEhvbWUgZGlyZWN0b3J5IGV4cGFuc2lvbiBhdHRlbXB0IGJsb2NrZWQ6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gU0VDVVJJVFk6IFJlamVjdCBhYnNvbHV0ZSBwYXRocyBvdXRzaWRlIGFsbG93ZWQgZGlyZWN0b3JpZXNcbiAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUobm9ybWFsaXplZFBhdGgpICYmIGFsbG93ZWRCYXNlUGF0aHMpIHtcbiAgICAgICAgY29uc3QgaXNBbGxvd2VkID0gYWxsb3dlZEJhc2VQYXRocy5zb21lKGJhc2VQYXRoID0+IHtcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkQmFzZSA9IHBhdGgubm9ybWFsaXplKGJhc2VQYXRoKTtcbiAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkQmFzZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFpc0FsbG93ZWQpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEFic29sdXRlIHBhdGggb3V0c2lkZSBhbGxvd2VkIGRpcmVjdG9yaWVzOiAke2ZpbGVQYXRofWApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBTRUNVUklUWTogUmVqZWN0IG51bGwgYnl0ZXMgYW5kIG90aGVyIGRhbmdlcm91cyBjaGFyYWN0ZXJzXG4gICAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJ1xcMCcpIHx8IG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCdcXHgwMCcpKSB7IC8vIE5PU09OQVIgLSBOdWxsIGJ5dGUgZGV0ZWN0aW9uIGZvciBzZWN1cml0eVxuICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE51bGwgYnl0ZSBpbiBwYXRoIGJsb2NrZWQ6ICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gUGF0aCB2YWxpZGF0aW9uIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIERFUFJFQ0FURUQ6IENvbW1lbnRlZCBvdXQgZmlsZW5hbWUgcGF0dGVybiBkZXRlY3Rpb24gLSByZXBsYWNlZCB3aXRoIG1ldGFkYXRhLWJhc2VkIGRldGVjdGlvblxuICAvKipcbiAgICogQ2FjaGVkIGNvbXBpbGVkIHJlZ2V4IHBhdHRlcm5zIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICogQGRlcHJlY2F0ZWQgVXNlIG1ldGFkYXRhLWJhc2VkIGRldGVjdGlvbiBpbnN0ZWFkXG4gICAqL1xuICAvLyBwcml2YXRlIHN0YXRpYyBjb21waWxlZFRlc3RQYXR0ZXJuczogUmVnRXhwW10gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogR2V0IGNvbXBpbGVkIHRlc3QgcGF0dGVybnMgd2l0aCBjYWNoaW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAgICogQGRlcHJlY2F0ZWQgVXNlIG1ldGFkYXRhLWJhc2VkIGRldGVjdGlvbiBpbnN0ZWFkXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGNvbXBpbGVkIHJlZ2V4IHBhdHRlcm5zXG4gICAqL1xuICAvLyBwcml2YXRlIGdldENvbXBpbGVkVGVzdFBhdHRlcm5zKCk6IFJlZ0V4cFtdIHtcbiAgLy8gICAvLyBVc2UgY2FjaGVkIHBhdHRlcm5zIGlmIGF2YWlsYWJsZVxuICAvLyAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmNvbXBpbGVkVGVzdFBhdHRlcm5zKSB7XG4gIC8vICAgICByZXR1cm4gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb21waWxlZFRlc3RQYXR0ZXJucztcbiAgLy8gICB9XG4gIC8vICAgXG4gIC8vICAgLy8gQ29tcGlsZSBhbmQgY2FjaGUgcGF0dGVybnMgb24gZmlyc3QgdXNlXG4gIC8vICAgLy8gQ1JJVElDQUwgRklYOiBSZW1vdmVkIG92ZXJseSBicm9hZCAvXnRlc3QtL2kgcGF0dGVybiB0aGF0IHdhcyBibG9ja2luZyBsZWdpdGltYXRlIHVzZVxuICAvLyAgIC8vIFVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIGNyZWF0ZSBwZXJzb25hcyBsaWtlIFwidGVzdC1kcml2ZW4tZGV2ZWxvcGVyXCIgb3IgXCJ0ZXN0LWF1dG9tYXRpb24tZXhwZXJ0XCJcbiAgLy8gICAvLyBXZSBvbmx5IGJsb2NrIHNwZWNpZmljIHRlc3QgcGF0dGVybnMgdGhhdCBhcmUgY2xlYXJseSBmcm9tIG91ciB0ZXN0IHN1aXRlXG4gIC8vICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb21waWxlZFRlc3RQYXR0ZXJucyA9IFtcbiAgLy8gICAgIC9edGVzdHBlcnNvbmEvaSwgICAgICAgICAgICAgIC8vIE91ciB0ZXN0IHN1aXRlIHBhdHRlcm5cbiAgLy8gICAgIC9eeWFtbHRlc3QvaSwgICAgICAgICAgICAgICAgIC8vIFNlY3VyaXR5IHRlc3QgcGF0dGVyblxuICAvLyAgICAgL155YW1sYm9tYi9pLCAgICAgICAgICAgICAgICAgLy8gU2VjdXJpdHkgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvXm1lbW9yeS10ZXN0LS9pLCAgICAgICAgICAgICAvLyBQZXJmb3JtYW5jZSB0ZXN0IHBhdHRlcm5cbiAgLy8gICAgIC9ecGVyZi10ZXN0LS9pLCAgICAgICAgICAgICAgIC8vIFBlcmZvcm1hbmNlIHRlc3QgcGF0dGVyblxuICAvLyAgICAgL150ZXN0LWZpeHR1cmUtL2ksICAgICAgICAgICAgLy8gVGVzdCBmaXh0dXJlIHBhdHRlcm4gKG1vcmUgc3BlY2lmaWMpXG4gIC8vICAgICAvXnRlc3QtZGF0YS0vaSwgICAgICAgICAgICAgICAvLyBUZXN0IGRhdGEgcGF0dGVybiAobW9yZSBzcGVjaWZpYylcbiAgLy8gICAgIC9iaW4tc2h8cm0tcmZ8cHduZWQvaSwgICAgICAgIC8vIE1hbGljaW91cyBwYXR0ZXJuc1xuICAvLyAgICAgL2NvbmN1cnJlbnQtXFxkKy9pLCAgICAgICAgICAgIC8vIENvbmN1cnJlbnQgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvbGVnYWN5XFwubWQkL2ksICAgICAgICAgICAgICAgLy8gTGVnYWN5IHRlc3QgcGF0dGVyblxuICAvLyAgICAgL3BlcmZvcm1hbmNlLXRlc3QvaSwgICAgICAgICAgLy8gUGVyZm9ybWFuY2UgdGVzdCBwYXR0ZXJuXG4gIC8vICAgICAvLVxcZHsxM30tW2EtejAtOV0rXFwubWQkL2ksICAgIC8vIFRpbWVzdGFtcC1iYXNlZCB0ZXN0IGZpbGVzXG4gIC8vICAgICAvXnVuaXR0ZXN0LS9pLCAgICAgICAgICAgICAgICAvLyBVbml0IHRlc3QgcGF0dGVyblxuICAvLyAgICAgL15pbnRlZ3JhdGlvbnRlc3QtL2ksICAgICAgICAgLy8gSW50ZWdyYXRpb24gdGVzdCBwYXR0ZXJuXG4gIC8vICAgXTtcbiAgLy8gICBcbiAgLy8gICByZXR1cm4gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb21waWxlZFRlc3RQYXR0ZXJucztcbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGZpbGVuYW1lIG1hdGNoZXMgdGVzdCBkYXRhIHBhdHRlcm5zIHRoYXQgc2hvdWxkIG5ldmVyIGJlIGNvcGllZCB0byBwcm9kdWN0aW9uXG4gICAqIEBkZXByZWNhdGVkIFVzZSBpc0RvbGxob3VzZU1DUFRlc3RFbGVtZW50KCkgZm9yIG1ldGFkYXRhLWJhc2VkIGRldGVjdGlvbiBpbnN0ZWFkXG4gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgZmlsZW5hbWUgdG8gY2hlY2tcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZW5hbWUgbWF0Y2hlcyB0ZXN0IHBhdHRlcm5zIHRoYXQgc2hvdWxkIGJlIGJsb2NrZWRcbiAgICovXG4gIC8vIHByaXZhdGUgaXNUZXN0RGF0YVBhdHRlcm4oZmlsZW5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAvLyAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5nZXRDb21waWxlZFRlc3RQYXR0ZXJucygpO1xuICAvLyAgIHJldHVybiBwYXR0ZXJucy5zb21lKHBhdHRlcm4gPT4gcGF0dGVybi50ZXN0KGZpbGVuYW1lKSk7XG4gIC8vIH1cblxuICAvKipcbiAgICogUmVhZCBtZXRhZGF0YSBmcm9tIFlBTUwgZnJvbnRtYXR0ZXIgb25seSAobmV2ZXIgcmVhZHMgY29udGVudCBib2R5KVxuICAgKiBVc2VzIGEgc21hbGwgYnVmZmVyIHRvIHNhZmVseSBleHRyYWN0IG9ubHkgdGhlIGZyb250bWF0dGVyIGJldHdlZW4gLS0tIG1hcmtlcnNcbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIGZpbGUgdG8gcmVhZCBtZXRhZGF0YSBmcm9tXG4gICAqIEByZXR1cm5zIFBhcnNlZCBtZXRhZGF0YSBvYmplY3Qgb3IgbnVsbCBpZiBubyBmcm9udG1hdHRlciBmb3VuZFxuICAgKi9cbiAgLy8gUEVSRk9STUFOQ0UgT1BUSU1JWkFUSU9OOiBSZXVzYWJsZSBidWZmZXIgcG9vbCB0byByZWR1Y2UgYWxsb2NhdGlvbnNcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYnVmZmVyUG9vbDogQnVmZmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1BPT0xfU0laRSA9IDIwOyAvLyBNRU1PUlkgTEVBSyBGSVg6IFJlZHVjZWQgYnVmZmVyIHBvb2wgc2l6ZSB0byBtYXRjaCBjYWNoZSBzaXplIGZvciBjb25zaXN0ZW50IG1lbW9yeSBtYW5hZ2VtZW50XG4gIHByaXZhdGUgc3RhdGljIGJ1ZmZlclBvb2xTdGF0cyA9IHsgaGl0czogMCwgbWlzc2VzOiAwLCBjcmVhdGVkOiAwIH07XG4gIFxuICBwcml2YXRlIGdldEJ1ZmZlcigpOiBCdWZmZXIge1xuICAgIC8vIFBFUkZPUk1BTkNFOiBUcmFjayBidWZmZXIgcG9vbCB1c2FnZSBmb3Igb3B0aW1pemF0aW9uIG1vbml0b3JpbmdcbiAgICBsZXQgYnVmZmVyID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sLnBvcCgpO1xuICAgIGlmIChidWZmZXIpIHtcbiAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLmhpdHMrKztcbiAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbFN0YXRzLm1pc3NlcysrO1xuICAgICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuY3JlYXRlZCsrO1xuICAgICAgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDQwOTYpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ3JlYXRlZCBuZXcgYnVmZmVyIChwb29sIGVtcHR5KSwgdG90YWwgY3JlYXRlZDogJHtEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5jcmVhdGVkfWApO1xuICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICB9XG4gIH1cbiAgXG4gIHByaXZhdGUgcmVsZWFzZUJ1ZmZlcihidWZmZXI6IEJ1ZmZlcik6IHZvaWQge1xuICAgIC8vIENSSVRJQ0FMIEZJWDogQWx3YXlzIGF0dGVtcHQgdG8gcmV0dXJuIGJ1ZmZlciB0byBwb29sIGZvciByZXVzZVxuICAgIGlmIChEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wubGVuZ3RoIDwgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfUE9PTF9TSVpFKSB7XG4gICAgICBidWZmZXIuZmlsbCgwKTsgLy8gU0VDVVJJVFk6IENsZWFyIGJ1ZmZlciBiZWZvcmUgcmV1c2UgdG8gcHJldmVudCBkYXRhIGxlYWthZ2VcbiAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5wdXNoKGJ1ZmZlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBFUkZPUk1BTkNFOiBJZiBwb29sIGlzIGZ1bGwsIGNsZWFyIHRoZSBidWZmZXIgdG8gaGVscCBHQ1xuICAgICAgYnVmZmVyLmZpbGwoMCk7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBCdWZmZXIgcG9vbCBmdWxsLCBkaXNjYXJkaW5nIGJ1ZmZlcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCBidWZmZXIgcG9vbCBhbmQgY2FjaGUgdG8gZnJlZSBtZW1vcnlcbiAgICogUEVSRk9STUFOQ0UgRklYOiBBZGRlZCBjbGVhbnVwIG1ldGhvZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZHVyaW5nIGFwcGxpY2F0aW9uIHNodXRkb3duIG9yIHBlcmlvZGljIGNsZWFudXBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBidWZmZXIgcG9vbFxuICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIuYnVmZmVyUG9vbC5sZW5ndGggPSAwO1xuICAgIFxuICAgIC8vIENsZWFyIG1ldGFkYXRhIGNhY2hlXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmNsZWFyKCk7XG4gICAgXG4gICAgLy8gQ2xlYXIgY2FjaGVkIGRhdGEgZGlyZWN0b3J5XG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jYWNoZWREYXRhRGlyID0gbnVsbDtcbiAgICBcbiAgICAvLyBDbGVhciBwb3B1bGF0aW9uIHByb21pc2VzXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5wb3B1bGF0ZUluUHJvZ3Jlc3MuY2xlYXIoKTtcbiAgICBcbiAgICBsb2dnZXIuaW5mbygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE1lbW9yeSBjbGVhbnVwIGNvbXBsZXRlZCcsIHtcbiAgICAgIGJ1ZmZlclN0YXRzOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cyxcbiAgICAgIGNhY2hlQ2xlYXJlZDogdHJ1ZVxuICAgIH0pO1xuICAgIFxuICAgIC8vIFJlc2V0IHN0YXRzXG4gICAgRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMgPSB7IGhpdHM6IDAsIG1pc3NlczogMCwgY3JlYXRlZDogMCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzIGZvciBtb25pdG9yaW5nXG4gICAqIFBFUkZPUk1BTkNFIE1PTklUT1JJTkc6IEFkZGVkIHN0YXRpc3RpY3MgbWV0aG9kIGZvciBwZXJmb3JtYW5jZSB0cmFja2luZ1xuICAgKiBUaGlzIHByb3ZpZGVzIGluc2lnaHRzIGludG8gYnVmZmVyIHBvb2wgZWZmaWNpZW5jeSBhbmQgY2FjaGUgcGVyZm9ybWFuY2VcbiAgICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgcGVyZm9ybWFuY2UgbWV0cmljc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRQZXJmb3JtYW5jZVN0YXRzKCk6IHtcbiAgICBidWZmZXJQb29sOiB7XG4gICAgICBoaXRzOiBudW1iZXI7XG4gICAgICBtaXNzZXM6IG51bWJlcjsgXG4gICAgICBjcmVhdGVkOiBudW1iZXI7XG4gICAgICBoaXRSYXRlOiBudW1iZXI7XG4gICAgICBwb29sU2l6ZTogbnVtYmVyO1xuICAgICAgbWF4UG9vbFNpemU6IG51bWJlcjtcbiAgICB9O1xuICAgIG1ldGFkYXRhQ2FjaGU6IHtcbiAgICAgIHNpemU6IG51bWJlcjtcbiAgICAgIG1heFNpemU6IG51bWJlcjtcbiAgICB9O1xuICB9IHtcbiAgICBjb25zdCBidWZmZXJIaXRzID0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuaGl0cztcbiAgICBjb25zdCBidWZmZXJNaXNzZXMgPSBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2xTdGF0cy5taXNzZXM7XG4gICAgY29uc3QgdG90YWxSZXF1ZXN0cyA9IGJ1ZmZlckhpdHMgKyBidWZmZXJNaXNzZXM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYnVmZmVyUG9vbDoge1xuICAgICAgICBoaXRzOiBidWZmZXJIaXRzLFxuICAgICAgICBtaXNzZXM6IGJ1ZmZlck1pc3NlcyxcbiAgICAgICAgY3JlYXRlZDogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5idWZmZXJQb29sU3RhdHMuY3JlYXRlZCxcbiAgICAgICAgaGl0UmF0ZTogdG90YWxSZXF1ZXN0cyA+IDAgPyBidWZmZXJIaXRzIC8gdG90YWxSZXF1ZXN0cyA6IDAsXG4gICAgICAgIHBvb2xTaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLmJ1ZmZlclBvb2wubGVuZ3RoLFxuICAgICAgICBtYXhQb29sU2l6ZTogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfUE9PTF9TSVpFXG4gICAgICB9LFxuICAgICAgbWV0YWRhdGFDYWNoZToge1xuICAgICAgICBzaXplOiBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2l6ZSxcbiAgICAgICAgbWF4U2l6ZTogRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfQ0FDSEVfU0laRVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVhZCBvbmx5IHRoZSBZQU1MIGZyb250bWF0dGVyIG1ldGFkYXRhIGZyb20gYSBmaWxlIChmaXJzdCA0S0IpXG4gICAqXG4gICAqIFNFQ1VSSVRZIE5PVEUgKElzc3VlICMxMjI4KTogVGhpcyBtZXRob2QgTVVTVCB1c2UgdmFsaWRhdGVDb250ZW50OiB0cnVlIHdoZW4gY2FsbGluZ1xuICAgKiBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKCkgdG8gZW5zdXJlIFVuaWNvZGUgc2VjdXJpdHkgdmFsaWRhdGlvbiBydW5zLiBTZXR0aW5nIHZhbGlkYXRlQ29udGVudFxuICAgKiB0byBmYWxzZSB3b3VsZCBkaXNhYmxlIEFMTCBjb250ZW50IHZhbGlkYXRpb24gaW5jbHVkaW5nIHplcm8td2lkdGggY2hhcmFjdGVyIGRldGVjdGlvbixcbiAgICogY3JlYXRpbmcgYSBzZWN1cml0eSBieXBhc3MgdnVsbmVyYWJpbGl0eS5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVQYXRoIC0gQWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZSB0byByZWFkXG4gICAqIEBwYXJhbSByZXRyaWVzIC0gTnVtYmVyIG9mIHJldHJpZXMgZm9yIHRyYW5zaWVudCBmYWlsdXJlcyAoZGVmYXVsdDogMilcbiAgICogQHJldHVybnMgUGFyc2VkIG1ldGFkYXRhIG9iamVjdCBvciBudWxsIGlmIG5vIHZhbGlkIGZyb250bWF0dGVyIGZvdW5kXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlYWRNZXRhZGF0YU9ubHkoZmlsZVBhdGg6IHN0cmluZywgcmV0cmllcyA9IDIpOiBQcm9taXNlPGFueSB8IG51bGw+IHtcbiAgICAvLyBQRVJGT1JNQU5DRTogQ2hlY2sgY2FjaGUgZmlyc3QgYmVmb3JlIHJlYWRpbmcgZmlsZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHRoaXMuc3RhdEZpbGUoZmlsZVBhdGgpO1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBmaWxlUGF0aDtcbiAgICAgIGNvbnN0IGNhY2hlZCA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5nZXQoY2FjaGVLZXkpO1xuXG4gICAgICAvLyBSZXR1cm4gY2FjaGVkIG1ldGFkYXRhIGlmIGZpbGUgaGFzbid0IGNoYW5nZWRcbiAgICAgIC8vIENSSVRJQ0FMIEZJWDogVXNlIGludGVnZXIgbXRpbWUgY29tcGFyaXNvbiB0byBhdm9pZCBmbG9hdGluZy1wb2ludCBwcmVjaXNpb24gaXNzdWVzXG4gICAgICBpZiAoY2FjaGVkICYmIE1hdGguZmxvb3IoY2FjaGVkLm10aW1lKSA9PT0gTWF0aC5mbG9vcihzdGF0cy5tdGltZU1zKSAmJiBjYWNoZWQuc2l6ZSA9PT0gc3RhdHMuc2l6ZSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDYWNoZSBoaXQgZm9yICR7ZmlsZVBhdGh9YCk7XG4gICAgICAgIHJldHVybiBjYWNoZWQubWV0YWRhdGE7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGaWxlIGRvZXNuJ3QgZXhpc3QsIHByb2NlZWQgd2l0aCBub3JtYWwgZmxvd1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gTk9URTogVXNpbmcgZGlyZWN0IGZzLm9wZW4gZm9yIHBhcnRpYWwgZmlsZSByZWFkIChmaXJzdCA0S0Igb25seSkuXG4gICAgICAvLyBGaWxlT3BlcmF0aW9uc1NlcnZpY2UgZG9lc24ndCBzdXBwb3J0IHBhcnRpYWwgcmVhZHMgd2l0aCBmaWxlIGhhbmRsZXMuXG4gICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkga2VwdCBhcyBhIGRpcmVjdCBmcyBjYWxsIGZvciBwZXJmb3JtYW5jZS1jcml0aWNhbFxuICAgICAgLy8gbWV0YWRhdGEgZXh0cmFjdGlvbiB0aGF0IG9ubHkgbmVlZHMgdGhlIFlBTUwgZnJvbnRtYXR0ZXIuXG4gICAgICBjb25zdCB7IHByb21pc2VzOiBmcyB9ID0gYXdhaXQgaW1wb3J0KCdmcycpO1xuICAgICAgY29uc3QgZmQgPSBhd2FpdCBmcy5vcGVuKGZpbGVQYXRoLCAncicpO1xuICAgICAgLy8gUEVSRk9STUFOQ0U6IFVzZSBidWZmZXIgcG9vbCBpbnN0ZWFkIG9mIGFsbG9jYXRpbmcgbmV3IGJ1ZmZlciBlYWNoIHRpbWVcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZ2V0QnVmZmVyKCk7XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZkLnJlYWQoYnVmZmVyLCAwLCA0MDk2LCAwKTtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gYnVmZmVyLnN1YmFycmF5KDAsIHJlc3VsdC5ieXRlc1JlYWQpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgICAgICBcbiAgICAgICAgLy8gTG9vayBmb3IgWUFNTCBmcm9udG1hdHRlciBiZXR3ZWVuIC0tLSBtYXJrZXJzXG4gICAgICAgIC8vIFN1cHBvcnQgYm90aCBVbml4IChcXG4pIGFuZCBXaW5kb3dzIChcXHJcXG4pIGxpbmUgZW5kaW5nc1xuICAgICAgICBjb25zdCBtYXRjaCA9IGhlYWRlci5tYXRjaCgvXi0tLVxccj9cXG4oW1xcc1xcU10qPylcXHI/XFxuLS0tLyk7XG4gICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm8gZnJvbnRtYXR0ZXIgZm91bmRcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUGFyc2UgdGhlIFlBTUwgZnJvbnRtYXR0ZXIgc2FmZWx5XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gU0VDVVJJVFkgRklYIChJc3N1ZSAjMTIyOCk6IEVuYWJsZSB2YWxpZGF0ZUNvbnRlbnQgdG8gYmxvY2sgemVyby13aWR0aCBVbmljb2RlIGFuZCBvdGhlciBzZWN1cml0eSB0aHJlYXRzXG4gICAgICAgICAgLy8gU2VjdXJlWWFtbFBhcnNlciBwcm92aWRlcyBhZGRpdGlvbmFsIHZhbGlkYXRpb24sIGluamVjdGlvbiBwcmV2ZW50aW9uLCBhbmQgY29udGVudCBzYW5pdGl6YXRpb25cbiAgICAgICAgICAvLyBJdCBleHBlY3RzIGZ1bGwgWUFNTCB3aXRoIC0tLSBtYXJrZXJzLCBzbyB3ZSByZWNvbnN0cnVjdCB0aGUgZnJvbnRtYXR0ZXIgYmxvY2tcbiAgICAgICAgICAvLyBXZSBkaXNhYmxlIGZpZWxkLXNwZWNpZmljIHZhbGlkYXRpb24gYXMgdGhpcyBpcyBnZW5lcmFsIG1ldGFkYXRhIHBhcnNpbmcsIG5vdCBwZXJzb25hLXNwZWNpZmljXG4gICAgICAgICAgLy8gYnV0IHdlIE1VU1Qga2VlcCB2YWxpZGF0ZUNvbnRlbnQ6IHRydWUgdG8gZW5zdXJlIFVuaWNvZGUgc2VjdXJpdHkgdmFsaWRhdGlvbiBydW5zXG4gICAgICAgICAgY29uc3QgZnVsbFlhbWwgPSBgLS0tXFxuJHttYXRjaFsxXX1cXG4tLS1gO1xuICAgICAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gU2VjdXJlWWFtbFBhcnNlci5wYXJzZShmdWxsWWFtbCwge1xuICAgICAgICAgICAgLy8gUkVRVUlSRUQ6IHZhbGlkYXRlQ29udGVudCBtdXN0IGJlIHRydWUgdG8gZW5hYmxlIFVuaWNvZGUgc2VjdXJpdHkgdmFsaWRhdGlvbiBpbmNsdWRpbmdcbiAgICAgICAgICAgIC8vIHplcm8td2lkdGggY2hhcmFjdGVyIGRldGVjdGlvbiAoVSsyMDBCLVUrMjAwRiwgVStGRUZGLCBldGMuKS4gU2V0dGluZyB0aGlzIHRvIGZhbHNlXG4gICAgICAgICAgICAvLyB3b3VsZCBkaXNhYmxlIEFMTCBjb250ZW50IHZhbGlkYXRpb24sIGNyZWF0aW5nIGEgc2VjdXJpdHkgYnlwYXNzIGZvciBVbmljb2RlLWJhc2VkIGF0dGFja3MuXG4gICAgICAgICAgICAvLyBTZWUgVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoKSBmb3IgZGV0ZWN0aW9uIGxvZ2ljLlxuICAgICAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlLFxuICAgICAgICAgICAgdmFsaWRhdGVGaWVsZHM6IGZhbHNlICAgLy8gRmllbGQtc3BlY2lmaWMgdmFsaWRhdGlvbiBpcyBvcHRpb25hbCBmb3IgZ2VuZXJhbCBtZXRhZGF0YSBwYXJzaW5nXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZVJlc3VsdC5kYXRhO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFBFUkZPUk1BTkNFOiBDYWNoZSB0aGUgbWV0YWRhdGEgd2l0aCBmaWxlIHN0YXRzIGZvciBmdXR1cmUgcmVhZHNcbiAgICAgICAgICBpZiAodHlwZW9mIG1ldGFkYXRhID09PSAnb2JqZWN0JyAmJiBtZXRhZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCB0aGlzLnN0YXRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgY29uc3QgY2FjaGVFbnRyeTogTWV0YWRhdGFDYWNoZUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIG10aW1lOiBzdGF0cy5tdGltZU1zLFxuICAgICAgICAgICAgICAgIHNpemU6IHN0YXRzLnNpemVcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIENSSVRJQ0FMIE1FTU9SWSBMRUFLIEZJWDogTW9yZSBhZ2dyZXNzaXZlIGNhY2hlIG1hbmFnZW1lbnQgdG8gcHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoXG4gICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZW50cnkgYWxyZWFkeSBleGlzdHMgYW5kIGp1c3QgdXBkYXRlIGl0IGluc3RlYWQgb2YgYWRkaW5nIG5ld1xuICAgICAgICAgICAgICBpZiAoRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLmhhcyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZXhpc3RpbmcgZW50cnkgLSBubyBldmljdGlvbiBuZWVkZWRcbiAgICAgICAgICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2V0KGZpbGVQYXRoLCBjYWNoZUVudHJ5KTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBVcGRhdGVkIGV4aXN0aW5nIGNhY2hlIGVudHJ5IGZvciAke2ZpbGVQYXRofWApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5ldyBlbnRyeSAtIGNoZWNrIGlmIHdlIG5lZWQgdG8gZXZpY3QgZmlyc3RcbiAgICAgICAgICAgICAgICAvLyBVc2UgPiBpbnN0ZWFkIG9mID49IHRvIGVuc3VyZSB3ZSBuZXZlciBleGNlZWQgTUFYX0NBQ0hFX1NJWkVcbiAgICAgICAgICAgICAgICBpZiAoRGVmYXVsdEVsZW1lbnRQcm92aWRlci5tZXRhZGF0YUNhY2hlLnNpemUgPj0gRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfQ0FDSEVfU0laRSkge1xuICAgICAgICAgICAgICAgICAgLy8gTW9yZSBhZ2dyZXNzaXZlIGV2aWN0aW9uOiByZW1vdmUgZW5vdWdoIGVudHJpZXMgdG8gc3RheSB3ZWxsIHVuZGVyIGxpbWl0XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbnRyaWVzVG9FdmljdCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoRGVmYXVsdEVsZW1lbnRQcm92aWRlci5NQVhfQ0FDSEVfU0laRSAqIDAuNCkpO1xuICAgICAgICAgICAgICAgICAgY29uc3Qga2V5c1RvRXZpY3QgPSBBcnJheS5mcm9tKERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5rZXlzKCkpLnNsaWNlKDAsIGVudHJpZXNUb0V2aWN0KTtcbiAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXNUb0V2aWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEV2aWN0ZWQgJHtrZXlzVG9FdmljdC5sZW5ndGh9IGNhY2hlIGVudHJpZXMgdG8gbWFuYWdlIG1lbW9yeSAoY2FjaGUgc2l6ZSB3YXMgJHtEZWZhdWx0RWxlbWVudFByb3ZpZGVyLm1ldGFkYXRhQ2FjaGUuc2l6ZSArIGtleXNUb0V2aWN0Lmxlbmd0aH0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIERlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zZXQoZmlsZVBhdGgsIGNhY2hlRW50cnkpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEFkZGVkIG5ldyBjYWNoZSBlbnRyeSBmb3IgJHtmaWxlUGF0aH0gKGNhY2hlIHNpemUgbm93OiAke0RlZmF1bHRFbGVtZW50UHJvdmlkZXIubWV0YWRhdGFDYWNoZS5zaXplfSlgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIC8vIElnbm9yZSBjYWNoZSBlcnJvcnMsIHJldHVybiBtZXRhZGF0YSBhbnl3YXlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gY2F0Y2ggKHlhbWxFcnJvcikge1xuICAgICAgICAgIC8vIEludmFsaWQgWUFNTCwgcmV0dXJuIG51bGxcbiAgICAgICAgICAvLyBFTkhBTkNFTUVOVDogSW5jbHVkZSBlcnJvciB0eXBlIGZvciBiZXR0ZXIgZGVidWdnaW5nXG4gICAgICAgICAgY29uc3QgeWFtbEVycm9yVHlwZSA9ICh5YW1sRXJyb3IgYXMgYW55KT8uY29uc3RydWN0b3I/Lm5hbWUgfHwgJ1lBTUxFcnJvcic7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gSW52YWxpZCBZQU1MIGluICR7ZmlsZVBhdGh9OiAke3lhbWxFcnJvclR5cGV9IC0gJHt5YW1sRXJyb3J9YCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIENSSVRJQ0FMIEZJWDogRW5zdXJlIGZpbGUgZGVzY3JpcHRvciBpcyBjbG9zZWQgYW5kIGJ1ZmZlciBpcyByZWxlYXNlZCBpbiBBTEwgcGF0aHNcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmZC5jbG9zZSgpO1xuICAgICAgICB9IGNhdGNoIChjbG9zZUVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXJyb3IgY2xvc2luZyBmaWxlIGRlc2NyaXB0b3IgZm9yICR7ZmlsZVBhdGh9OiAke2Nsb3NlRXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUEVSRk9STUFOQ0U6IFJldHVybiBidWZmZXIgdG8gcG9vbCBmb3IgcmV1c2VcbiAgICAgICAgdGhpcy5yZWxlYXNlQnVmZmVyKGJ1ZmZlcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gRU5IQU5DRU1FTlQ6IEluY2x1ZGUgZXJyb3IgdHlwZSBpbiBkZWJ1ZyBsb2dzIGZvciBiZXR0ZXIgZGVidWdnaW5nXG4gICAgICBjb25zdCBlcnJvclR5cGUgPSBlcnJvcj8uY29uc3RydWN0b3I/Lm5hbWUgfHwgJ1Vua25vd25FcnJvcic7XG4gICAgICBjb25zdCBlcnJvckNvZGUgPSBlcnJvcj8uY29kZSB8fCAnTk9fQ09ERSc7XG4gICAgICBcbiAgICAgIC8vIFJFTElBQklMSVRZOiBBZGQgcmV0cnkgbG9naWMgZm9yIHRyYW5zaWVudCBmYWlsdXJlc1xuICAgICAgaWYgKHJldHJpZXMgPiAwICYmIChlcnJvckNvZGUgPT09ICdFQlVTWScgfHwgZXJyb3JDb2RlID09PSAnRUFHQUlOJykpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gUmV0cnlpbmcgcmVhZCBmb3IgJHtmaWxlUGF0aH0gYWZ0ZXIgJHtlcnJvclR5cGV9OiR7ZXJyb3JDb2RlfWApO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTApKTsgLy8gQnJpZWYgZGVsYXkgYmVmb3JlIHJldHJ5XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRNZXRhZGF0YU9ubHkoZmlsZVBhdGgsIHJldHJpZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgbG9nZ2VyLmRlYnVnKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ291bGQgbm90IHJlYWQgbWV0YWRhdGEgZnJvbSAke2ZpbGVQYXRofTogJHtlcnJvclR5cGV9OiR7ZXJyb3JDb2RlfSAtICR7ZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3J9YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBmaWxlIGlzIGEgRG9sbGhvdXNlTUNQIHRlc3QgZWxlbWVudCBiYXNlZCBvbiBtZXRhZGF0YVxuICAgKiBUaGlzIHJlcGxhY2VzIGZpbGVuYW1lIHBhdHRlcm4gZGV0ZWN0aW9uIHdpdGggYWNjdXJhdGUgbWV0YWRhdGEtYmFzZWQgZGV0ZWN0aW9uXG4gICAqIEBwYXJhbSBmaWxlUGF0aCBQYXRoIHRvIHRoZSBmaWxlIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgY29udGFpbnMgX2RvbGxob3VzZU1DUFRlc3Q6IHRydWUgbWV0YWRhdGFcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaXNEb2xsaG91c2VNQ1BUZXN0RWxlbWVudChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgdGhpcy5yZWFkTWV0YWRhdGFPbmx5KGZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGlzVGVzdCA9ICEhKG1ldGFkYXRhICYmIG1ldGFkYXRhLl9kb2xsaG91c2VNQ1BUZXN0ID09PSB0cnVlKTtcbiAgICAgIFxuICAgICAgXG4gICAgICByZXR1cm4gaXNUZXN0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiB3ZSBjYW4ndCByZWFkIHRoZSBtZXRhZGF0YSwgYXNzdW1lIGl0J3Mgbm90IGEgdGVzdCBmaWxlXG4gICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBFcnJvciBjaGVja2luZyB0ZXN0IG1ldGFkYXRhIGZvciAke2ZpbGVQYXRofTogJHtlcnJvcn1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IGlmIHdlJ3JlIGluIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudCBieSBjaGVja2luZyBmb3IgcHJvZHVjdGlvbiBpbmRpY2F0b3JzXG4gICAqIFVzZXMgYSBjb25maWRlbmNlLWJhc2VkIGFwcHJvYWNoIHJlcXVpcmluZyBtdWx0aXBsZSBpbmRpY2F0b3JzIGZvciBiZXR0ZXIgYWNjdXJhY3lcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGFwcGVhcnMgdG8gYmUgYSBwcm9kdWN0aW9uIGVudmlyb25tZW50XG4gICAqL1xuICBwcml2YXRlIGlzUHJvZHVjdGlvbkVudmlyb25tZW50KCk6IGJvb2xlYW4ge1xuICAgIC8vIEFsbG93IHRlc3RzIHRvIGV4cGxpY2l0bHkgb3ZlcnJpZGUgcHJvZHVjdGlvbiBtb2RlIGRldGVjdGlvblxuICAgIGlmIChwcm9jZXNzLmVudi5GT1JDRV9QUk9EVUNUSU9OX01PREUgPT09ICd0cnVlJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChwcm9jZXNzLmVudi5GT1JDRV9QUk9EVUNUSU9OX01PREUgPT09ICdmYWxzZScpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gV2VpZ2h0ZWQgaW5kaWNhdG9ycyBmb3IgcHJvZHVjdGlvbiBkZXRlY3Rpb25cbiAgICBjb25zdCBpbmRpY2F0b3JzID0ge1xuICAgICAgLy8gU3Ryb25nIGluZGljYXRvcnMgKHdlaWdodDogMilcbiAgICAgIGhhc1VzZXJIb21lRGlyOiAocHJvY2Vzcy5lbnYuSE9NRSAmJiAocHJvY2Vzcy5lbnYuSE9NRS5pbmNsdWRlcygnL1VzZXJzLycpIHx8IHByb2Nlc3MuZW52LkhPTUUuaW5jbHVkZXMoJy9ob21lLycpKSkgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgISFwcm9jZXNzLmVudi5VU0VSUFJPRklMRSxcbiAgICAgIGlzUHJvZHVjdGlvbk5vZGU6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicsXG4gICAgICBub3RJblRlc3REaXI6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggc2VwYXJhdG9ycyBmb3IgY3Jvc3MtcGxhdGZvcm0gY2hlY2tpbmcgKFdpbmRvd3MgdXNlcyBcXCBidXQgY2hlY2tzIHVzZSAvKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkQ3dkID0gY3dkLnJlcGxhY2VBbGwoJ1xcXFwnLCAnLycpO1xuICAgICAgICByZXR1cm4gIW5vcm1hbGl6ZWRDd2QuaW5jbHVkZXMoJy90ZXN0JykgJiYgXG4gICAgICAgICAgICAgICAhbm9ybWFsaXplZEN3ZC5pbmNsdWRlcygnL19fdGVzdHNfXycpICYmIFxuICAgICAgICAgICAgICAgIW5vcm1hbGl6ZWRDd2QuaW5jbHVkZXMoJy90ZW1wJykgJiZcbiAgICAgICAgICAgICAgICFub3JtYWxpemVkQ3dkLmluY2x1ZGVzKCcvZGlzdC90ZXN0Jyk7XG4gICAgICB9KSgpLFxuICAgICAgXG4gICAgICAvLyBNb2RlcmF0ZSBpbmRpY2F0b3JzICh3ZWlnaHQ6IDEpXG4gICAgICBub3RJbkNJOiAhcHJvY2Vzcy5lbnYuQ0ksXG4gICAgICBub1Rlc3RFbnY6IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCcsXG4gICAgICBub0RldkVudjogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdkZXZlbG9wbWVudCcsXG4gICAgfTtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgd2VpZ2h0ZWQgc2NvcmVcbiAgICBsZXQgc2NvcmUgPSAwO1xuICAgIGlmIChpbmRpY2F0b3JzLmhhc1VzZXJIb21lRGlyKSBzY29yZSArPSAyO1xuICAgIGlmIChpbmRpY2F0b3JzLmlzUHJvZHVjdGlvbk5vZGUpIHNjb3JlICs9IDI7XG4gICAgaWYgKGluZGljYXRvcnMubm90SW5UZXN0RGlyKSBzY29yZSArPSAyO1xuICAgIGlmIChpbmRpY2F0b3JzLm5vdEluQ0kpIHNjb3JlICs9IDE7XG4gICAgaWYgKGluZGljYXRvcnMubm9UZXN0RW52KSBzY29yZSArPSAxO1xuICAgIGlmIChpbmRpY2F0b3JzLm5vRGV2RW52KSBzY29yZSArPSAxO1xuICAgIFxuICAgIC8vIExvZyBkZXRlY3Rpb24gZGV0YWlscyBmb3IgZGVidWdnaW5nXG4gICAgY29uc3QgYWN0aXZlSW5kaWNhdG9ycyA9IE9iamVjdC5lbnRyaWVzKGluZGljYXRvcnMpXG4gICAgICAuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSlcbiAgICAgIC5tYXAoKFtrZXldKSA9PiBrZXkpO1xuICAgIFxuICAgIC8vIFRZUEVTQ1JJUFQgRklYOiBSZW1vdmVkIGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpIGNoZWNrIGFzIHRoaXMgbWV0aG9kIGRvZXNuJ3QgZXhpc3Qgb24gTUNQTG9nZ2VyXG4gICAgLy8gVGhlIGxvZ2dlciBhbHJlYWR5IGhhbmRsZXMgZGVidWcgbGV2ZWwgaW50ZXJuYWxseSwgc28gd2UgY2FuIGNhbGwgZGVidWcoKSBkaXJlY3RseVxuICAgIGlmIChzY29yZSA+PSAzKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gUHJvZHVjdGlvbiBlbnZpcm9ubWVudCBkZXRlY3RlZCcsXG4gICAgICAgIHsgc2NvcmUsIGFjdGl2ZUluZGljYXRvcnMsIGZvcmNlTW9kZTogJ25vdCBzZXQnIH1cbiAgICAgICk7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlcXVpcmUgYSBzY29yZSBvZiBhdCBsZWFzdCAzIGZvciBwcm9kdWN0aW9uIGRldGVjdGlvbiAobW9yZSBjb25maWRlbnQpXG4gICAgLy8gVGhpcyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgaW4gZWRnZSBjYXNlcyB3aGlsZSBtYWludGFpbmluZyBzZWN1cml0eVxuICAgIHJldHVybiBzY29yZSA+PSAzO1xuICB9XG4gIFxuICAvKipcbiAgICogQ29weSBhbGwgZmlsZXMgZnJvbSBzb3VyY2UgZGlyZWN0b3J5IHRvIGRlc3RpbmF0aW9uIGRpcmVjdG9yeVxuICAgKiBTa2lwcyBmaWxlcyB0aGF0IGFscmVhZHkgZXhpc3QgdG8gcHJlc2VydmUgdXNlciBtb2RpZmljYXRpb25zXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvcHlFbGVtZW50RmlsZXMoc291cmNlRGlyOiBzdHJpbmcsIGRlc3REaXI6IHN0cmluZywgZWxlbWVudFR5cGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IGNvcGllZENvdW50ID0gMDtcbiAgICBcbiAgICBcbiAgICB0cnkge1xuICAgICAgLy8gRW5zdXJlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGF3YWl0IHRoaXMubWFrZURpcmVjdG9yeShkZXN0RGlyKTtcblxuICAgICAgLy8gUmVhZCBzb3VyY2UgZGlyZWN0b3J5XG4gICAgICBjb25zdCBmaWxlcyA9IGF3YWl0IHRoaXMubGlzdERpcihzb3VyY2VEaXIpO1xuICAgICAgXG4gICAgICBcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICBcbiAgICAgICAgLy8gT25seSBjb3B5IG1hcmtkb3duIGZpbGVzXG4gICAgICAgIGlmICghZmlsZS5lbmRzV2l0aChGSUxFX0NPTlNUQU5UUy5FTEVNRU5UX0VYVEVOU0lPTikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gTm9ybWFsaXplIGZpbGVuYW1lIGZvciBzZWN1cml0eVxuICAgICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGZpbGUpO1xuICAgICAgICBpZiAoIW5vcm1hbGl6ZWRGaWxlLmlzVmFsaWQpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFNraXBwaW5nIGZpbGUgd2l0aCBpbnZhbGlkIFVuaWNvZGU6ICR7ZmlsZX1gKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSBwYXRoLmpvaW4oc291cmNlRGlyLCBub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudCk7XG4gICAgICAgIGNvbnN0IGRlc3RQYXRoID0gcGF0aC5qb2luKGRlc3REaXIsIG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50KTtcbiAgICAgICAgXG4gICAgICAgIFxuICAgICAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIGZpbGUgcGF0aHMgdG8gcHJldmVudCBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzXG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgbWFsaWNpb3VzIGZpbGVzIGZyb20gZXNjYXBpbmcgdGhlIGludGVuZGVkIGRpcmVjdG9yeSBzdHJ1Y3R1cmVcbiAgICAgICAgY29uc3Qgc291cmNlVmFsaWQgPSB0aGlzLnZhbGlkYXRlRmlsZVBhdGgoc291cmNlUGF0aCwgW3NvdXJjZURpcl0pO1xuICAgICAgICBjb25zdCBkZXN0VmFsaWQgPSB0aGlzLnZhbGlkYXRlRmlsZVBhdGgoZGVzdFBhdGgsIFtkZXN0RGlyXSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIXNvdXJjZVZhbGlkIHx8ICFkZXN0VmFsaWQpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZmlsZSB3aXRoIGludmFsaWQgcGF0aDogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgeyBzb3VyY2VQYXRoLCBkZXN0UGF0aCwgZWxlbWVudFR5cGUgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFByb2R1Y3Rpb24gc2FmZXR5IGNoZWNrOiBCbG9jayBEb2xsaG91c2VNQ1AgdGVzdCBlbGVtZW50cyBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50c1xuICAgICAgICAvLyBTa2lwIHRoaXMgY2hlY2sgaWYgbG9hZFRlc3REYXRhIGlzIGV4cGxpY2l0bHkgZW5hYmxlZCAoZm9yIHRlc3Rpbmcgc2NlbmFyaW9zKVxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmxvYWRUZXN0RGF0YSAmJiB0aGlzLmlzUHJvZHVjdGlvbkVudmlyb25tZW50KCkpIHtcbiAgICAgICAgICBjb25zdCBpc0RvbGxob3VzZVRlc3QgPSBhd2FpdCB0aGlzLmlzRG9sbGhvdXNlTUNQVGVzdEVsZW1lbnQoc291cmNlUGF0aCk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGlzRG9sbGhvdXNlVGVzdCkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU0VDVVJJVFk6IEJsb2NraW5nIERvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgaW4gcHJvZHVjdGlvbjogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIGZpbGU6IG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50LFxuICAgICAgICAgICAgICAgIHJlYXNvbjogJ0RvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgZGV0ZWN0ZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudCcsXG4gICAgICAgICAgICAgICAgZWxlbWVudFR5cGVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBibG9ja2VkIHRlc3QgZGF0YVxuICAgICAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgICAgICB0eXBlOiAnVEVTVF9EQVRBX0JMT0NLRUQnLFxuICAgICAgICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIuY29weUVsZW1lbnRGaWxlcycsXG4gICAgICAgICAgICAgIGRldGFpbHM6IGBCbG9ja2VkIERvbGxob3VzZU1DUCB0ZXN0IGVsZW1lbnQgaW4gcHJvZHVjdGlvbjogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gLFxuICAgICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudCxcbiAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgICAgICAgICByZWFzb246ICdEb2xsaG91c2VNQ1AgdGVzdCBlbGVtZW50IGRldGVjdGVkIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQnLFxuICAgICAgICAgICAgICAgIGRldGVjdGlvbk1ldGhvZDogJ21ldGFkYXRhLWJhc2VkJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDaGVjayBpZiBkZXN0aW5hdGlvbiBmaWxlIGFscmVhZHkgZXhpc3RzXG4gICAgICAgIGNvbnN0IGRlc3RFeGlzdHMgPSBhd2FpdCB0aGlzLmZpbGVFeGlzdHMoZGVzdFBhdGgpO1xuICAgICAgICBpZiAoZGVzdEV4aXN0cykge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFNraXBwaW5nIGV4aXN0aW5nIGZpbGU6ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVmFsaWRhdGUgc291cmNlIGZpbGUgYmVmb3JlIGNvcHlpbmdcbiAgICAgICAgICBjb25zdCBzb3VyY2VTdGF0cyA9IGF3YWl0IHRoaXMuc3RhdEZpbGUoc291cmNlUGF0aCk7XG5cbiAgICAgICAgICAvLyBDaGVjayBmaWxlIHNpemUgbGltaXRcbiAgICAgICAgICBpZiAoc291cmNlU3RhdHMuc2l6ZSA+IEZJTEVfQ09OU1RBTlRTLk1BWF9GSUxFX1NJWkUpIHtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIFNraXBwaW5nIG92ZXJzaXplZCBmaWxlICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9OiBgICtcbiAgICAgICAgICAgICAgYCR7c291cmNlU3RhdHMuc2l6ZX0gYnl0ZXMgKG1heDogJHtGSUxFX0NPTlNUQU5UUy5NQVhfRklMRV9TSVpFfSBieXRlcylgLFxuICAgICAgICAgICAgICB7IFxuICAgICAgICAgICAgICAgIGZpbGU6IG5vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50LCBcbiAgICAgICAgICAgICAgICBzaXplOiBzb3VyY2VTdGF0cy5zaXplLFxuICAgICAgICAgICAgICAgIG1heFNpemU6IEZJTEVfQ09OU1RBTlRTLk1BWF9GSUxFX1NJWkUsXG4gICAgICAgICAgICAgICAgZWxlbWVudFR5cGUgXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ29weSB0aGUgZmlsZSB3aXRoIHZlcmlmaWNhdGlvblxuICAgICAgICAgIFxuICAgICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVXaXRoVmVyaWZpY2F0aW9uKHNvdXJjZVBhdGgsIGRlc3RQYXRoKTtcbiAgICAgICAgICBjb3BpZWRDb3VudCsrO1xuICAgICAgICAgIFxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvcGllZCAke2VsZW1lbnRUeXBlfTogJHtub3JtYWxpemVkRmlsZS5ub3JtYWxpemVkQ29udGVudH1gKTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGVhY2ggZmlsZSBjb3BpZWRcbiAgICAgICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgICAgc291cmNlOiAnRGVmYXVsdEVsZW1lbnRQcm92aWRlci5jb3B5RWxlbWVudEZpbGVzJyxcbiAgICAgICAgICAgIGRldGFpbHM6IGBDb3BpZWQgZGVmYXVsdCAke2VsZW1lbnRUeXBlfSBmaWxlOiAke25vcm1hbGl6ZWRGaWxlLm5vcm1hbGl6ZWRDb250ZW50fWAsXG4gICAgICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgICAgICBzb3VyY2VQYXRoLFxuICAgICAgICAgICAgICBkZXN0UGF0aCxcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGUsXG4gICAgICAgICAgICAgIGZpbGVTaXplOiAoYXdhaXQgdGhpcy5zdGF0RmlsZShkZXN0UGF0aCkpLnNpemVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBFcnJvcjtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICBgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEZhaWxlZCB0byBjb3B5ICR7bm9ybWFsaXplZEZpbGUubm9ybWFsaXplZENvbnRlbnR9YCxcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIGVycm9yOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgc3RhY2s6IGVyci5zdGFjayxcbiAgICAgICAgICAgICAgc291cmNlUGF0aCxcbiAgICAgICAgICAgICAgZGVzdFBhdGgsXG4gICAgICAgICAgICAgIGVsZW1lbnRUeXBlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBDb250aW51ZSB3aXRoIG90aGVyIGZpbGVzIGluc3RlYWQgb2YgZmFpbGluZyBjb21wbGV0ZWx5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKGNvcGllZENvdW50ID4gMCkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIENvcGllZCAke2NvcGllZENvdW50fSAke2VsZW1lbnRUeXBlfSBmaWxlKHMpYCk7XG4gICAgICB9XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gRXJyb3IgY29weWluZyAke2VsZW1lbnRUeXBlfSBmaWxlczpgLCBlcnJvcik7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBjb3BpZWRDb3VudDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENvcHkgYSBmaWxlIHdpdGggaW50ZWdyaXR5IHZlcmlmaWNhdGlvblxuICAgKiBFbnN1cmVzIHRoZSBmaWxlIHdhcyBjb3BpZWQgY29ycmVjdGx5IGJ5IGNvbXBhcmluZyBzaXplc1xuICAgKi9cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBjaGVja3N1bSBvZiBhIGZpbGUgZm9yIGludGVncml0eSB2ZXJpZmljYXRpb25cbiAgICogQHBhcmFtIGZpbGVQYXRoIFBhdGggdG8gdGhlIGZpbGVcbiAgICogQHJldHVybnMgSGV4LWVuY29kZWQgY2hlY2tzdW1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2FsY3VsYXRlQ2hlY2tzdW0oZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goRklMRV9DT05TVEFOVFMuQ0hFQ0tTVU1fQUxHT1JJVEhNKTtcbiAgICAvLyBOT1RFOiBVc2luZyBkaXJlY3QgZnMub3BlbiBmb3IgY2h1bmtlZC9zdHJlYW1pbmcgZmlsZSByZWFkLlxuICAgIC8vIEZpbGVPcGVyYXRpb25zU2VydmljZSBkb2Vzbid0IHN1cHBvcnQgZmlsZSBoYW5kbGVzIGZvciBjaHVua2VkIHJlYWRpbmcuXG4gICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGtlcHQgYXMgYSBkaXJlY3QgZnMgY2FsbCBmb3IgbWVtb3J5LWVmZmljaWVudFxuICAgIC8vIGNoZWNrc3VtIGNhbGN1bGF0aW9uIG9uIHBvdGVudGlhbGx5IGxhcmdlIGZpbGVzLlxuICAgIGNvbnN0IHsgcHJvbWlzZXM6IGZzIH0gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgZnMub3BlbihmaWxlUGF0aCwgJ3InKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoRklMRV9DT05TVEFOVFMuQ0hVTktfU0laRSk7XG4gICAgICBsZXQgYnl0ZXNSZWFkOiBudW1iZXI7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyZWFtLnJlYWQoYnVmZmVyLCAwLCBGSUxFX0NPTlNUQU5UUy5DSFVOS19TSVpFKTtcbiAgICAgICAgYnl0ZXNSZWFkID0gcmVzdWx0LmJ5dGVzUmVhZDtcblxuICAgICAgICBpZiAoYnl0ZXNSZWFkID4gMCkge1xuICAgICAgICAgIGhhc2gudXBkYXRlKGJ1ZmZlci5zdWJhcnJheSgwLCBieXRlc1JlYWQpKTtcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoYnl0ZXNSZWFkID4gMCk7XG5cbiAgICAgIHJldHVybiBoYXNoLmRpZ2VzdCgnaGV4Jyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHN0cmVhbS5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IGZpbGUgd2l0aCBpbnRlZ3JpdHkgdmVyaWZpY2F0aW9uIGFuZCByZXRyeSBsb2dpY1xuICAgKiBAcGFyYW0gc291cmNlUGF0aCBTb3VyY2UgZmlsZSBwYXRoXG4gICAqIEBwYXJhbSBkZXN0UGF0aCBEZXN0aW5hdGlvbiBmaWxlIHBhdGhcbiAgICogQHRocm93cyBFcnJvciBpZiBjb3B5IGZhaWxzIGFmdGVyIGFsbCByZXRyeSBhdHRlbXB0c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RmlsZVdpdGhWZXJpZmljYXRpb24oc291cmNlUGF0aDogc3RyaW5nLCBkZXN0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IENPUFlfUkVUUllfQVRURU1QVFM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ29weSB0aGUgZmlsZVxuICAgICAgICBhd2FpdCB0aGlzLmNvcHlGaWxlT3Aoc291cmNlUGF0aCwgZGVzdFBhdGgpO1xuXG4gICAgICAgIC8vIFZlcmlmeSBzaXplIG1hdGNoZXNcbiAgICAgICAgY29uc3QgW3NvdXJjZVN0YXRzLCBkZXN0U3RhdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIHRoaXMuc3RhdEZpbGUoc291cmNlUGF0aCksXG4gICAgICAgICAgdGhpcy5zdGF0RmlsZShkZXN0UGF0aClcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHNvdXJjZVN0YXRzLnNpemUgIT09IGRlc3RTdGF0cy5zaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFNpemUgbWlzbWF0Y2ggYWZ0ZXIgY29weSAtIHNvdXJjZTogJHtzb3VyY2VTdGF0cy5zaXplfSBieXRlcywgYCArXG4gICAgICAgICAgICBgZGVzdGluYXRpb246ICR7ZGVzdFN0YXRzLnNpemV9IGJ5dGVzYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWZXJpZnkgY2hlY2tzdW0gbWF0Y2hlcyBmb3IgY29tcGxldGUgaW50ZWdyaXR5XG4gICAgICAgIGNvbnN0IFtzb3VyY2VDaGVja3N1bSwgZGVzdENoZWNrc3VtXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNoZWNrc3VtKHNvdXJjZVBhdGgpLFxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ2hlY2tzdW0oZGVzdFBhdGgpXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChzb3VyY2VDaGVja3N1bSAhPT0gZGVzdENoZWNrc3VtKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENoZWNrc3VtIG1pc21hdGNoIGFmdGVyIGNvcHkgLSBzb3VyY2U6ICR7c291cmNlQ2hlY2tzdW19LCBgICtcbiAgICAgICAgICAgIGBkZXN0aW5hdGlvbjogJHtkZXN0Q2hlY2tzdW19YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgcHJvcGVyIHBlcm1pc3Npb25zXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5jaG1vZEZpbGUoZGVzdFBhdGgsIEZJTEVfQ09OU1RBTlRTLkZJTEVfUEVSTUlTU0lPTlMpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gQ291bGQgbm90IHNldCBwZXJtaXNzaW9ucyBvbiAke2Rlc3RQYXRofTogJHtlcnJvcn1gLFxuICAgICAgICAgICAgeyBzb3VyY2VQYXRoLCBkZXN0UGF0aCwgYXR0ZW1wdCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1Y2Nlc3MgLSBmaWxlIGNvcGllZCBhbmQgdmVyaWZpZWRcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU3VjY2Vzc2Z1bGx5IGNvcGllZCBhbmQgdmVyaWZpZWQ6ICR7cGF0aC5iYXNlbmFtZShzb3VyY2VQYXRoKX1gLFxuICAgICAgICAgIHsgc2l6ZTogc291cmNlU3RhdHMuc2l6ZSwgY2hlY2tzdW06IHNvdXJjZUNoZWNrc3VtLnN1YnN0cmluZygwLCA4KSB9XG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgYXMgRXJyb3I7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgZmFpbGVkIGNvcHlcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZUZpbGVPcChkZXN0UGF0aCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGF0dGVtcHQgPCBDT1BZX1JFVFJZX0FUVEVNUFRTKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBDb3B5IGF0dGVtcHQgJHthdHRlbXB0fSBmYWlsZWQsIHJldHJ5aW5nLi4uYCxcbiAgICAgICAgICAgIHsgZXJyb3I6IGxhc3RFcnJvci5tZXNzYWdlLCBzb3VyY2VQYXRoLCBkZXN0UGF0aCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgQ09QWV9SRVRSWV9ERUxBWSAqIGF0dGVtcHQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBBbGwgYXR0ZW1wdHMgZmFpbGVkXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZhaWxlZCB0byBjb3B5ICR7cGF0aC5iYXNlbmFtZShzb3VyY2VQYXRoKX0gYWZ0ZXIgJHtDT1BZX1JFVFJZX0FUVEVNUFRTfSBhdHRlbXB0czogYCArXG4gICAgICBgJHtsYXN0RXJyb3I/Lm1lc3NhZ2UgfHwgJ1Vua25vd24gZXJyb3InfWBcbiAgICApO1xuICB9XG4gIFxuICAvKipcbiAgICogUG9wdWxhdGUgdGhlIHBvcnRmb2xpbyB3aXRoIGRlZmF1bHQgZWxlbWVudHMgZnJvbSBidW5kbGVkIGRhdGFcbiAgICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHBvcnRmb2xpbyBpbml0aWFsaXphdGlvbiBmb3IgbmV3IGluc3RhbGxhdGlvbnNcbiAgICogUHJvdGVjdGVkIGFnYWluc3QgY29uY3VycmVudCBjYWxscyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHBvcHVsYXRlRGVmYXVsdHMocG9ydGZvbGlvQmFzZURpcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgaWYgcG9wdWxhdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzIGZvciB0aGlzIHBvcnRmb2xpb1xuICAgIGNvbnN0IGV4aXN0aW5nUG9wdWxhdGlvbiA9IERlZmF1bHRFbGVtZW50UHJvdmlkZXIucG9wdWxhdGVJblByb2dyZXNzLmdldChwb3J0Zm9saW9CYXNlRGlyKTtcbiAgICBpZiAoZXhpc3RpbmdQb3B1bGF0aW9uKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gUG9wdWxhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIGZvciBwb3J0Zm9saW8sIHdhaXRpbmcuLi4nLFxuICAgICAgICB7IHBvcnRmb2xpb0Jhc2VEaXIgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiBleGlzdGluZ1BvcHVsYXRpb247XG4gICAgfVxuICAgIFxuICAgIC8vIENyZWF0ZSBuZXcgcG9wdWxhdGlvbiBwcm9taXNlXG4gICAgY29uc3QgcG9wdWxhdGlvblByb21pc2UgPSB0aGlzLnBlcmZvcm1Qb3B1bGF0aW9uKHBvcnRmb2xpb0Jhc2VEaXIpXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIHdoZW4gZG9uZVxuICAgICAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBvcHVsYXRlSW5Qcm9ncmVzcy5kZWxldGUocG9ydGZvbGlvQmFzZURpcik7XG4gICAgICB9KTtcbiAgICBcbiAgICBEZWZhdWx0RWxlbWVudFByb3ZpZGVyLnBvcHVsYXRlSW5Qcm9ncmVzcy5zZXQocG9ydGZvbGlvQmFzZURpciwgcG9wdWxhdGlvblByb21pc2UpO1xuICAgIHJldHVybiBwb3B1bGF0aW9uUHJvbWlzZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFBlcmZvcm0gdGhlIGFjdHVhbCBwb3B1bGF0aW9uIG9mIGRlZmF1bHQgZWxlbWVudHNcbiAgICogQHBhcmFtIHBvcnRmb2xpb0Jhc2VEaXIgQmFzZSBkaXJlY3Rvcnkgb2YgdGhlIHBvcnRmb2xpb1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwZXJmb3JtUG9wdWxhdGlvbihwb3J0Zm9saW9CYXNlRGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBDaGVjayBpZiB0ZXN0IGRhdGEgbG9hZGluZyBpcyBkaXNhYmxlZFxuICAgIC8vIE5vdGU6IFRoaXMgY2hlY2sgaXMgbmVlZGVkIGV2ZW4gdGhvdWdoIGNvbnN0cnVjdG9yIHNldHMgY29uZmlnLCBiZWNhdXNlXG4gICAgLy8gY29uZmlnIGNhbiBiZSBvdmVycmlkZGVuIGFmdGVyIGNvbnN0cnVjdGlvblxuICAgIFxuICAgIC8vIFVzZSBwcm9kdWN0aW9uIGVudmlyb25tZW50IGRldGVjdGlvbiB0aGF0IHJlc3BlY3RzIEZPUkNFX1BST0RVQ1RJT05fTU9ERVxuICAgIGNvbnN0IGlzRGV2ZWxvcG1lbnRNb2RlID0gIXRoaXMuaXNQcm9kdWN0aW9uRW52aXJvbm1lbnQoKTtcbiAgICBcbiAgICBpZiAoaXNEZXZlbG9wbWVudE1vZGUgJiYgIXRoaXMuY29uZmlnLmxvYWRUZXN0RGF0YSkge1xuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICdbRGVmYXVsdEVsZW1lbnRQcm92aWRlcl0gU2tpcHBpbmcgZGVmYXVsdCBlbGVtZW50IHBvcHVsYXRpb24gaW4gZGV2ZWxvcG1lbnQgbW9kZScsXG4gICAgICAgIHsgXG4gICAgICAgICAgcG9ydGZvbGlvQmFzZURpcixcbiAgICAgICAgICByZWFzb246ICdUZXN0IGRhdGEgbG9hZGluZyBkaXNhYmxlZCcsXG4gICAgICAgICAgZW5hYmxlV2l0aDogJ1NldCBET0xMSE9VU0VfTE9BRF9URVNUX0RBVEE9dHJ1ZSB0byBlbmFibGUnXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci5pbmZvKFxuICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTdGFydGluZyBkZWZhdWx0IGVsZW1lbnQgcG9wdWxhdGlvbicsXG4gICAgICB7IHBvcnRmb2xpb0Jhc2VEaXIgfVxuICAgICk7XG4gICAgXG4gICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBwb3J0Zm9saW8gaW5pdGlhbGl6YXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiAnUE9SVEZPTElPX0lOSVRJQUxJWkFUSU9OJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIucGVyZm9ybVBvcHVsYXRpb24nLFxuICAgICAgZGV0YWlsczogYFN0YXJ0aW5nIGRlZmF1bHQgZWxlbWVudCBwb3B1bGF0aW9uIGZvciBwb3J0Zm9saW86ICR7cG9ydGZvbGlvQmFzZURpcn1gXG4gICAgfSk7XG4gICAgXG4gICAgLy8gRmluZCB0aGUgYnVuZGxlZCBkYXRhIGRpcmVjdG9yeVxuICAgIGNvbnN0IGRhdGFEaXIgPSBhd2FpdCB0aGlzLmZpbmREYXRhRGlyZWN0b3J5KCk7XG4gICAgaWYgKCFkYXRhRGlyKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgJ1tEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBObyBidW5kbGVkIGRhdGEgZGlyZWN0b3J5IGZvdW5kIC0gcG9ydGZvbGlvIHdpbGwgc3RhcnQgZW1wdHknLFxuICAgICAgICB7IFxuICAgICAgICAgIHNlYXJjaFBhdGhzOiB0aGlzLmRhdGFTZWFyY2hQYXRocy5zbGljZSgwLCAzKSwgLy8gTG9nIGZpcnN0IGZldyBwYXRocyBmb3IgZGVidWdnaW5nXG4gICAgICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIGRpcm5hbWU6IHRoaXMuX19kaXJuYW1lXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIFRyYWNrIHRvdGFsIGZpbGVzIGNvcGllZFxuICAgIGxldCB0b3RhbENvcGllZCA9IDA7XG4gICAgY29uc3QgY29waWVkQ291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgXG4gICAgLy8gQ29weSBlYWNoIGVsZW1lbnQgdHlwZSAtIGRpcmVjdG9yaWVzIG5vdyBtYXRjaCBlbnVtIHZhbHVlcyAoYWxsIHBsdXJhbClcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnRUeXBlIG9mIE9iamVjdC52YWx1ZXMoRWxlbWVudFR5cGUpKSB7XG4gICAgICBjb25zdCBzb3VyY2VEaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZWxlbWVudFR5cGUpO1xuICAgICAgY29uc3QgZGVzdERpciA9IHBhdGguam9pbihwb3J0Zm9saW9CYXNlRGlyLCBlbGVtZW50VHlwZSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHNvdXJjZSBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBjb25zdCBzb3VyY2VEaXJFeGlzdHMgPSBhd2FpdCB0aGlzLmZpbGVFeGlzdHMoc291cmNlRGlyKTtcbiAgICAgIGlmICghc291cmNlRGlyRXhpc3RzKSB7XG4gICAgICAgIC8vIFNvdXJjZSBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCwgc2tpcFxuICAgICAgICBsb2dnZXIuZGVidWcoYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBObyAke2VsZW1lbnRUeXBlfSBkaXJlY3RvcnkgaW4gYnVuZGxlZCBkYXRhYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb3BpZWRDb3VudCA9IGF3YWl0IHRoaXMuY29weUVsZW1lbnRGaWxlcyhzb3VyY2VEaXIsIGRlc3REaXIsIGVsZW1lbnRUeXBlKTtcbiAgICAgICAgY29waWVkQ291bnRzW2VsZW1lbnRUeXBlXSA9IGNvcGllZENvdW50O1xuICAgICAgICB0b3RhbENvcGllZCArPSBjb3BpZWRDb3VudDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIEVycm9yIGNvcHlpbmcgJHtlbGVtZW50VHlwZX0gZWxlbWVudHM6YCwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAodG90YWxDb3BpZWQgPiAwKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYFtEZWZhdWx0RWxlbWVudFByb3ZpZGVyXSBTdWNjZXNzZnVsbHkgcG9wdWxhdGVkIHBvcnRmb2xpbyB3aXRoICR7dG90YWxDb3BpZWR9IGRlZmF1bHQgZWxlbWVudChzKWAsXG4gICAgICAgIHtcbiAgICAgICAgICBwb3J0Zm9saW9CYXNlRGlyLFxuICAgICAgICAgIGRhdGFEaXIsXG4gICAgICAgICAgYnJlYWtkb3duOiBjb3BpZWRDb3VudHNcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIFxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBzdWNjZXNzZnVsIHBvcHVsYXRpb25cbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1BPUlRGT0xJT19QT1BVTEFURUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0RlZmF1bHRFbGVtZW50UHJvdmlkZXIucGVyZm9ybVBvcHVsYXRpb24nLFxuICAgICAgICBkZXRhaWxzOiBgU3VjY2Vzc2Z1bGx5IHBvcHVsYXRlZCBwb3J0Zm9saW8gd2l0aCAke3RvdGFsQ29waWVkfSBkZWZhdWx0IGVsZW1lbnRzYCxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBwb3J0Zm9saW9CYXNlRGlyLFxuICAgICAgICAgIGRhdGFEaXIsXG4gICAgICAgICAgY29waWVkQ291bnRzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuaW5mbygnW0RlZmF1bHRFbGVtZW50UHJvdmlkZXJdIE5vIG5ldyBlbGVtZW50cyB0byBjb3B5IC0gcG9ydGZvbGlvIG1heSBhbHJlYWR5IGhhdmUgY29udGVudCcpO1xuICAgIH1cbiAgfVxufSJdfQ==
|
|
@@ -34,6 +34,21 @@ export interface ContentValidatorOptions {
|
|
|
34
34
|
contentContext?: 'persona' | 'skill' | 'template' | 'agent' | 'memory';
|
|
35
35
|
}
|
|
36
36
|
export declare class ContentValidator {
|
|
37
|
+
/**
|
|
38
|
+
* SHA-256 hashes of bundled data/ elements verified against HASHES.json at seed time.
|
|
39
|
+
* Content whose hash is in this set bypasses injection-pattern checks — it was
|
|
40
|
+
* vetted by the DollhouseMCP team before being included in the npm package.
|
|
41
|
+
* Unicode and YAML-bomb checks still run regardless.
|
|
42
|
+
*
|
|
43
|
+
* Populated by DefaultElementProvider.registerBundledHashes() on startup.
|
|
44
|
+
* Only content that matches the published HASHES.json is registered — any
|
|
45
|
+
* modification to a bundled file after install breaks the hash and revokes trust.
|
|
46
|
+
*/
|
|
47
|
+
private static readonly bundledContentHashes;
|
|
48
|
+
/** Register a SHA-256 hex hash as trusted bundled content. */
|
|
49
|
+
static registerBundledHash(sha256hex: string): void;
|
|
50
|
+
/** True if the given content hash belongs to a verified bundled element. */
|
|
51
|
+
static isBundledContent(content: string): boolean;
|
|
37
52
|
private static telemetryResolver?;
|
|
38
53
|
static configureTelemetryResolver(resolver: () => SecurityTelemetry | undefined): void;
|
|
39
54
|
private static getTelemetry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentValidator.d.ts","sourceRoot":"","sources":["../../src/security/contentValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"contentValidator.d.ts","sourceRoot":"","sources":["../../src/security/contentValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAG1E,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC;CACxE;AAED,qBAAa,gBAAgB;IAC3B;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAqB;IAEjE,8DAA8D;IAC9D,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAInD,4EAA4E;IAC5E,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAMjD,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAsC;WAEzD,0BAA0B,CAAC,QAAQ,EAAE,MAAM,iBAAiB,GAAG,SAAS,GAAG,IAAI;IAI7F,OAAO,CAAC,MAAM,CAAC,YAAY;IAO3B;;;;;;;;;;;OAWG;IAIH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAwExC;IAKF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAcxC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAkF7C;IAEF;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAOzC;IAEH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAK5C;IAEH;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAc1C;IAEH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAI1C;IAEH;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAuCtC;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAiErC;;;;;;;;OAQG;IACH,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,uBAA4B,GAAG,uBAAuB;IAiF3G;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IA0JxD;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,uBAAuB;IAuC/D;;OAEG;IACH,MAAM,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAkCvD"}
|