@dollhousemcp/mcp-server 2.0.37 → 2.0.38
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 +4 -0
- package/dist/cli/convert.js +20 -6
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/utils/pathSecurity.d.ts +44 -1
- package/dist/utils/pathSecurity.d.ts.map +1 -1
- package/dist/utils/pathSecurity.js +144 -10
- package/package.json +1 -1
- package/server.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.0.38] - 2026-07-04
|
|
4
|
+
|
|
5
|
+
- Close the remaining symlink containment bypasses for convert CLI output paths. Output directories that do not exist yet are vetted through their nearest existing ancestor (#2342, #2343), and output bases are now contained canonically: relative outputs (including the default) must truly resolve inside the working directory even when a symlink tries to redirect them, and explicit outside destinations disclose their real location when a symlink diverts them (#2344, #2346).
|
|
6
|
+
|
|
3
7
|
## [2.0.37] - 2026-07-04
|
|
4
8
|
|
|
5
9
|
- Fix MCP client configs (Claude Desktop, Cursor, Windsurf, LM Studio, Gemini CLI, VS Code, Cline) left pointing at a dead NVM launcher wrapper: the server now self-heals broken entries on startup — restoring bare `npx` when NVM is absent, or regenerating the real wrapper when NVM is present — and refuses to ever persist a temp-directory wrapper into a client config. Also isolates the test suite so it can no longer write to real client configs. (#2338, #2339)
|
package/dist/cli/convert.js
CHANGED
|
@@ -37,8 +37,21 @@ import extract from 'extract-zip';
|
|
|
37
37
|
import { DollhouseToAnthropicConverter, AnthropicToDollhouseConverter } from '../converters/index.js';
|
|
38
38
|
import { SecurityMonitor } from '../security/securityMonitor.js';
|
|
39
39
|
import { UnicodeValidator } from '../security/validators/unicodeValidator.js';
|
|
40
|
-
import { resolvePathWithinBase } from '../utils/pathSecurity.js';
|
|
40
|
+
import { resolvePathWithinBase, vetOutputBase } from '../utils/pathSecurity.js';
|
|
41
41
|
const program = new Command();
|
|
42
|
+
/**
|
|
43
|
+
* Vet the user's output base and return the canonical directory to write to
|
|
44
|
+
* (#2344). Relative outputs are contained within the working directory even
|
|
45
|
+
* when a symlink tries to redirect them; explicit outside destinations are
|
|
46
|
+
* honoured but their real location is disclosed when it differs.
|
|
47
|
+
*/
|
|
48
|
+
function vetConvertOutput(requestedOutput) {
|
|
49
|
+
return vetOutputBase(requestedOutput, {
|
|
50
|
+
onDisclose: (canonicalBase) => {
|
|
51
|
+
console.log(chalk.yellow(` Note: output resolves through a symbolic link — real destination: ${canonicalBase}`));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
42
55
|
/**
|
|
43
56
|
* Maximum ZIP file size (100MB) - prevents DoS attacks and system resource exhaustion
|
|
44
57
|
*/
|
|
@@ -269,8 +282,9 @@ async function convertToAnthropic(input, options) {
|
|
|
269
282
|
}
|
|
270
283
|
const structure = await converter.convertSkill(inputContent);
|
|
271
284
|
logConversionSteps(structure, operationsLog, options.verbose);
|
|
272
|
-
// Determine output directory
|
|
273
|
-
const
|
|
285
|
+
// Determine output directory (canonical containment per #2344)
|
|
286
|
+
const outputBase = vetConvertOutput(options.output || './anthropic-skills');
|
|
287
|
+
const outputDir = resolvePathWithinBase(outputBase, skillName);
|
|
274
288
|
if (options.dryRun) {
|
|
275
289
|
console.log(chalk.yellow('\n[DRY RUN] Would create:'));
|
|
276
290
|
console.log(chalk.gray(` Output directory: ${outputDir}`));
|
|
@@ -366,8 +380,8 @@ async function convertFromAnthropic(input, options) {
|
|
|
366
380
|
}
|
|
367
381
|
const dollhouseSkill = await converter.convertSkill(actualInput);
|
|
368
382
|
logReverseConversionSteps(actualInput, operationsLog, options.verbose);
|
|
369
|
-
// Determine output file
|
|
370
|
-
const outputDir =
|
|
383
|
+
// Determine output file (canonical containment per #2344)
|
|
384
|
+
const outputDir = vetConvertOutput(options.output || getDefaultSkillsDirectory());
|
|
371
385
|
const outputFile = resolvePathWithinBase(outputDir, `${skillName}.md`);
|
|
372
386
|
if (options.dryRun) {
|
|
373
387
|
console.log(chalk.yellow('\n[DRY RUN] Would create:'));
|
|
@@ -634,4 +648,4 @@ function generateReport(data) {
|
|
|
634
648
|
}
|
|
635
649
|
// Parse command line arguments
|
|
636
650
|
program.parse(process.argv);
|
|
637
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvY29udmVydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLE9BQU8sTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUNILDZCQUE2QixFQUM3Qiw2QkFBNkIsRUFFaEMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFakUsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUU5Qjs7R0FFRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxRQUFRO0FBRXREOztHQUVHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLFFBQVE7QUFFNUQ7O0dBRUc7QUFDSCxNQUFNLHdCQUF3QixHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTztBQUUxRDs7Ozs7R0FLRztBQUNILFNBQVMseUJBQXlCO0lBQzlCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVB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Q0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLHVDQUF1QyxDQUFDLENBQUM7SUFFL0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCwrQkFBK0I7QUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbi8qKlxuICogQ0xJIGNvbW1hbmQgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBBbnRocm9waWMgU2tpbGxzIGFuZCBEb2xsaG91c2VNQ1AgU2tpbGxzXG4gKlxuICogVXNhZ2U6XG4gKiAgIGRvbGxob3VzZSBjb252ZXJ0IHRvLWFudGhyb3BpYyA8aW5wdXQ+IFtvcHRpb25zXVxuICogICBkb2xsaG91c2UgY29udmVydCBmcm9tLWFudGhyb3BpYyA8aW5wdXQ+IFtvcHRpb25zXVxuICpcbiAqIElucHV0IGZvcm1hdHM6XG4gKiAgIHRvLWFudGhyb3BpYzogICBEb2xsaG91c2VNQ1Agc2tpbGwgZmlsZSAoLm1kKVxuICogICBmcm9tLWFudGhyb3BpYzogQW50aHJvcGljIHNraWxsIGRpcmVjdG9yeSBvciBaSVAgZmlsZVxuICpcbiAqIE9wdGlvbnM6XG4gKiAgIC1vLCAtLW91dHB1dCA8ZGlyPiAgICAgIE91dHB1dCBkaXJlY3RvcnlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBmb3IgZnJvbS1hbnRocm9waWM6IH4vLmRvbGxob3VzZS9wb3J0Zm9saW8vc2tpbGxzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgZm9yIHRvLWFudGhyb3BpYzogLi9hbnRocm9waWMtc2tpbGxzXG4gKiAgIC12LCAtLXZlcmJvc2UgICAgICAgICAgIFNob3cgZGV0YWlsZWQgY29udmVyc2lvbiBzdGVwc1xuICogICAtciwgLS1yZXBvcnQgICAgICAgICAgICBHZW5lcmF0ZSBjb252ZXJzaW9uIHJlcG9ydFxuICogICAtLWRyeS1ydW4gICAgICAgICAgICAgICBQcmV2aWV3IGNvbnZlcnNpb24gd2l0aG91dCBleGVjdXRpbmdcbiAqXG4gKiBFeGFtcGxlczpcbiAqICAgIyBDb252ZXJ0IGRvd25sb2FkZWQgWklQIGZpbGUgZnJvbSBDbGF1ZGUuYWlcbiAqICAgZG9sbGhvdXNlIGNvbnZlcnQgZnJvbS1hbnRocm9waWMgfi9Eb3dubG9hZHMvbXktc2tpbGwuemlwXG4gKlxuICogICAjIENvbnZlcnQgQW50aHJvcGljIHNraWxsIGRpcmVjdG9yeVxuICogICBkb2xsaG91c2UgY29udmVydCBmcm9tLWFudGhyb3BpYyB+L0Rvd25sb2Fkcy9teS1za2lsbC1mb2xkZXJcbiAqXG4gKiAgICMgRXhwb3J0IERvbGxob3VzZU1DUCBza2lsbCB0byBzaGFyZVxuICogICBkb2xsaG91c2UgY29udmVydCB0by1hbnRocm9waWMgfi8uZG9sbGhvdXNlL3BvcnRmb2xpby9za2lsbHMvbXktc2tpbGwubWQgLW8gLi9leHBvcnRlZFxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgZXh0cmFjdCBmcm9tICdleHRyYWN0LXppcCc7XG5pbXBvcnQge1xuICAgIERvbGxob3VzZVRvQW50aHJvcGljQ29udmVydGVyLFxuICAgIEFudGhyb3BpY1RvRG9sbGhvdXNlQ29udmVydGVyLFxuICAgIHR5cGUgQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmVcbn0gZnJvbSAnLi4vY29udmVydGVycy9pbmRleC5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUGF0aFdpdGhpbkJhc2UgfSBmcm9tICcuLi91dGlscy9wYXRoU2VjdXJpdHkuanMnO1xuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxuLyoqXG4gKiBNYXhpbXVtIFpJUCBmaWxlIHNpemUgKDEwME1CKSAtIHByZXZlbnRzIERvUyBhdHRhY2tzIGFuZCBzeXN0ZW0gcmVzb3VyY2UgZXhoYXVzdGlvblxuICovXG5jb25zdCBNQVhfWklQX1NJWkVfQllURVMgPSAxMDAgKiAxMDI0ICogMTAyNDsgLy8gMTAwTUJcblxuLyoqXG4gKiBNYXhpbXVtIGV4dHJhY3RlZCBzaXplICg1MDBNQikgLSBwcmV2ZW50cyB6aXAgYm9tYiBhdHRhY2tzXG4gKi9cbmNvbnN0IE1BWF9FWFRSQUNURURfU0laRV9CWVRFUyA9IDUwMCAqIDEwMjQgKiAxMDI0OyAvLyA1MDBNQlxuXG4vKipcbiAqIFByb2dyZXNzIGluZGljYXRvciB0aHJlc2hvbGQgKDEwTUIpIC0gc2hvdyBwcm9ncmVzcyBtZXNzYWdlIGZvciBmaWxlcyBsYXJnZXIgdGhhbiB0aGlzXG4gKi9cbmNvbnN0IFBST0dSRVNTX1RIUkVTSE9MRF9CWVRFUyA9IDEwICogMTAyNCAqIDEwMjQ7IC8vIDEwTUJcblxuLyoqXG4gKiBHZXQgdGhlIGRlZmF1bHQgRG9sbGhvdXNlTUNQIHBvcnRmb2xpbyBza2lsbHMgZGlyZWN0b3J5XG4gKiBTRUNVUklUWSBGSVggKERNQ1AtU0VDLTAwNCk6IE5vcm1hbGl6ZSBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHByZXZlbnQgVW5pY29kZSBhdHRhY2tzXG4gKiBQcmV2aW91c2x5OiBVc2VkIHByb2Nlc3MuZW52LkhPTUUgZGlyZWN0bHkgd2l0aG91dCBub3JtYWxpemF0aW9uXG4gKiBOb3c6IFZhbGlkYXRlIGFuZCBub3JtYWxpemUgYWxsIHBhdGggY29tcG9uZW50cyBpbmNsdWRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKi9cbmZ1bmN0aW9uIGdldERlZmF1bHRTa2lsbHNEaXJlY3RvcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBob21lRGlyID0gcHJvY2Vzcy5lbnYuSE9NRSB8fCAnJztcblxuICAgIC8vIE5vcm1hbGl6ZSBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3MgdmlhIGxvb2thbGlrZSBjaGFyYWN0ZXJzXG4gICAgbGV0IG5vcm1hbGl6ZWRIb21lID0gJyc7XG4gICAgaWYgKGhvbWVEaXIpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXphdGlvblJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGhvbWVEaXIpO1xuICAgICAgICBub3JtYWxpemVkSG9tZSA9IG5vcm1hbGl6YXRpb25SZXN1bHQubm9ybWFsaXplZENvbnRlbnQ7XG5cbiAgICAgICAgLy8gW1NFQ1VSSVRZIFdBUk5JTkddIExvZyBpZiBub3JtYWxpemF0aW9uIGNoYW5nZWQgdGhlIEhPTUUgcGF0aFxuICAgICAgICAvLyBUaGlzIGNvdWxkIGluZGljYXRlIGEgc2VjdXJpdHkgaXNzdWUgb3IgbWlzY29uZmlndXJhdGlvblxuICAgICAgICBpZiAobm9ybWFsaXplZEhvbWUgIT09IGhvbWVEaXIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgICAgIGBbV0FSTklOR10gSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3YXMgbW9kaWZpZWQgZHVyaW5nIFVuaWNvZGUgbm9ybWFsaXphdGlvbi5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYE9yaWdpbmFsOiBcIiR7aG9tZURpcn1cIlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgTm9ybWFsaXplZDogXCIke25vcm1hbGl6ZWRIb21lfVwiXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBUaGlzIG1heSBpbmRpY2F0ZSBhIHNlY3VyaXR5IGlzc3VlIG9yIG1pc2NvbmZpZ3VyYXRpb24uYFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aC5qb2luKG5vcm1hbGl6ZWRIb21lLCAnLmRvbGxob3VzZScsICdwb3J0Zm9saW8nLCAnc2tpbGxzJyk7XG59XG5cbi8qKlxuICogRm9ybWF0IGJ5dGVzIHRvIGh1bWFuLXJlYWRhYmxlIHN0cmluZ1xuICovXG5mdW5jdGlvbiBmb3JtYXRCeXRlcyhieXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCeXRlcyc7XG4gICAgY29uc3QgayA9IDEwMjQ7XG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0J5dGVzJywgJ0tCJywgJ01CJywgJ0dCJ107XG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoTWF0aC5sb2coYnl0ZXMpIC8gTWF0aC5sb2coaykpO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKChieXRlcyAvIE1hdGgucG93KGssIGkpKSAqIDEwMCkgLyAxMDAgKyAnICcgKyBzaXplc1tpXTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdG90YWwgc2l6ZSBvZiBleHRyYWN0ZWQgZmlsZXNcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlRXh0cmFjdGVkU2l6ZShkaXJlY3Rvcnk6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IHRvdGFsU2l6ZSA9IDA7XG5cbiAgICBmdW5jdGlvbiB3YWxrRGlyKGRpcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICB3YWxrRGlyKGZ1bGxQYXRoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpLnNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB3YWxrRGlyKGRpcmVjdG9yeSk7XG4gICAgcmV0dXJuIHRvdGFsU2l6ZTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGEgWklQIGZpbGUgdG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggc2l6ZSBsaW1pdHMgYW5kIHByb2dyZXNzIGluZGljYXRpb25cbiAqIEByZXR1cm5zIFBhdGggdG8gZXh0cmFjdGVkIGRpcmVjdG9yeVxuICogQHRocm93cyBFcnJvciBpZiBaSVAgZXhjZWVkcyBzaXplIGxpbWl0c1xuICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0WmlwRmlsZSh6aXBQYXRoOiBzdHJpbmcsIHZlcmJvc2U6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIC8vIEZJWDogVmFsaWRhdGUgWklQIGZpbGUgc2l6ZSBCRUZPUkUgZXh0cmFjdGlvbiB0byBwcmV2ZW50IERvUyBhdHRhY2tzXG4gICAgLy8gUHJldmlvdXNseTogTm8gc2l6ZSB2YWxpZGF0aW9uLCBhbGxvd2luZyBleHRyYWN0aW9uIG9mIGFyYml0cmFyaWx5IGxhcmdlIGZpbGVzXG4gICAgLy8gTm93OiBFbmZvcmNlIDEwME1CIFpJUCBzaXplIGxpbWl0IGFuZCA1MDBNQiBleHRyYWN0ZWQgc2l6ZSBsaW1pdFxuICAgIGNvbnN0IHppcFN0YXRzID0gZnMuc3RhdFN5bmMoemlwUGF0aCk7XG4gICAgY29uc3QgemlwU2l6ZSA9IHppcFN0YXRzLnNpemU7XG5cbiAgICAvLyBTRUNVUklUWSBDSEVDSyAodHlwZXNjcmlwdDpTNTA0Mik6IFZhbGlkYXRlIFpJUCBzaXplIGJlZm9yZSBleHRyYWN0aW9uXG4gICAgaWYgKHppcFNpemUgPiBNQVhfWklQX1NJWkVfQllURVMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFpJUCBmaWxlIHRvbyBsYXJnZTogJHtmb3JtYXRCeXRlcyh6aXBTaXplKX0uIE1heGltdW0gYWxsb3dlZDogJHtmb3JtYXRCeXRlcyhNQVhfWklQX1NJWkVfQllURVMpfS4gYCArXG4gICAgICAgICAgICBgVGhpcyBsaW1pdCBwcmV2ZW50cyBEb1MgYXR0YWNrcyBhbmQgc3lzdGVtIHJlc291cmNlIGV4aGF1c3Rpb24uYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksIGBkb2xsaG91c2UtZXh0cmFjdC0ke0RhdGUubm93KCl9YCk7XG5cbiAgICAvLyBGSVg6IEFkZCBzZWN1cml0eSBhdWRpdCBsb2dnaW5nIGZvciBaSVAgb3BlcmF0aW9uc1xuICAgIC8vIFByZXZpb3VzbHk6IE5vIGxvZ2dpbmcgb2YgWklQIGV4dHJhY3Rpb24gb3BlcmF0aW9uc1xuICAgIC8vIE5vdzogTG9nIGFsbCBaSVAgb3BlcmF0aW9ucyBmb3Igc2VjdXJpdHkgYXVkaXQgdHJhaWxcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdGSUxFX0NPUElFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnY29udmVydCBDTEknLFxuICAgICAgICBkZXRhaWxzOiBgWklQIGV4dHJhY3Rpb246ICR7emlwUGF0aH0gKCR7Zm9ybWF0Qnl0ZXMoemlwU2l6ZSl9KSAtPiAke3RlbXBEaXJ9YFxuICAgIH0pO1xuXG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZSgnXFxuRXh0cmFjdGluZyBaSVAgZmlsZS4uLicpKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBaSVA6ICR7emlwUGF0aH1gKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgU2l6ZTogJHtmb3JtYXRCeXRlcyh6aXBTaXplKX1gKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgVGVtcCBkaXI6ICR7dGVtcERpcn1gKSk7XG4gICAgfVxuXG4gICAgLy8gRklYOiBBZGQgcHJvZ3Jlc3MgaW5kaWNhdG9yIGZvciBsYXJnZSBaSVAgZXh0cmFjdGlvbnNcbiAgICAvLyBQcmV2aW91c2x5OiBObyBmZWVkYmFjayBkdXJpbmcgZXh0cmFjdGlvbiwgcG9vciBVWCBmb3IgbGFyZ2UgZmlsZXNcbiAgICAvLyBOb3c6IFNob3cgcHJvZ3Jlc3MgbWVzc2FnZSBmb3IgYmV0dGVyIHVzZXIgZXhwZXJpZW5jZVxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NNZXNzYWdlID0gemlwU2l6ZSA+IFBST0dSRVNTX1RIUkVTSE9MRF9CWVRFUyA/ICdFeHRyYWN0aW5nICh0aGlzIG1heSB0YWtlIGEgbW9tZW50KS4uLicgOiAnRXh0cmFjdGluZy4uLic7XG4gICAgaWYgKHZlcmJvc2UgfHwgemlwU2l6ZSA+IFBST0dSRVNTX1RIUkVTSE9MRF9CWVRFUykge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGAgICR7cHJvZ3Jlc3NNZXNzYWdlfWApKTtcbiAgICB9XG5cbiAgICAvLyBTT05BUkNMT1VEIEZJWCAodHlwZXNjcmlwdDpTNTA0Mik6IEFyY2hpdmUgZXh0cmFjdGlvbiBpcyBzYWZlIGhlcmVcbiAgICAvLyAtIFpJUCBzaXplIHZhbGlkYXRlZCAobWF4IDEwME1CKSBhdCBsaW5lcyAxMTAtMTE0IHRvIHByZXZlbnQgRG9TXG4gICAgLy8gLSBFeHRyYWN0ZWQgc2l6ZSB2YWxpZGF0ZWQgKG1heCA1MDBNQikgYXQgbGluZXMgMTUxLTE1NyB0byBwcmV2ZW50IHppcCBib21ic1xuICAgIC8vIC0gRXh0cmFjdGlvbiB0byBpc29sYXRlZCB0ZW1wIGRpcmVjdG9yeSAobm8gcGF0aCB0cmF2ZXJzYWwgcmlzaylcbiAgICAvLyAtIEZ1bGwgY2xlYW51cCBpbiBmaW5hbGx5IGJsb2NrIHByZXZlbnRzIHJlc291cmNlIGxlYWtzXG4gICAgYXdhaXQgZXh0cmFjdCh6aXBQYXRoLCB7IGRpcjogdGVtcERpciB9KTtcblxuICAgIGNvbnN0IGV4dHJhY3RUaW1lID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIEV4dHJhY3RlZCBpbiAke2V4dHJhY3RUaW1lfW1zYCkpO1xuICAgIH1cblxuICAgIC8vIFNFQ1VSSVRZIENIRUNLICh0eXBlc2NyaXB0OlM1MDQyKTogVmFsaWRhdGUgZXh0cmFjdGVkIHNpemUgdG8gcHJldmVudCB6aXAgYm9tYiBhdHRhY2tzXG4gICAgLy8gWmlwIGJvbWJzIGFyZSBtYWxpY2lvdXMgYXJjaGl2ZXMgdGhhdCBleHBhbmQgdG8gZW5vcm1vdXMgc2l6ZXMgKGUuZy4sIDQyS0Ig4oaSIDQuNVBCKVxuICAgIC8vIFRoaXMgY2hlY2sgcHJldmVudHMgc3lzdGVtIHJlc291cmNlIGV4aGF1c3Rpb24gZnJvbSBtYWxpY2lvdXNseSBjb21wcmVzc2VkIGZpbGVzXG4gICAgY29uc3QgZXh0cmFjdGVkU2l6ZSA9IGNhbGN1bGF0ZUV4dHJhY3RlZFNpemUodGVtcERpcik7XG4gICAgaWYgKGV4dHJhY3RlZFNpemUgPiBNQVhfRVhUUkFDVEVEX1NJWkVfQllURVMpIHtcbiAgICAgICAgLy8gQ2xlYW51cCBiZWZvcmUgdGhyb3dpbmcgZXJyb3IgdG8gcHJldmVudCB0ZW1wIGZpbGUgYWNjdW11bGF0aW9uXG4gICAgICAgIGZzLnJtU3luYyh0ZW1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHRyYWN0ZWQgY29udGVudCB0b28gbGFyZ2U6ICR7Zm9ybWF0Qnl0ZXMoZXh0cmFjdGVkU2l6ZSl9LiBNYXhpbXVtIGFsbG93ZWQ6ICR7Zm9ybWF0Qnl0ZXMoTUFYX0VYVFJBQ1RFRF9TSVpFX0JZVEVTKX0uIFRoaXMgbWF5IGJlIGEgemlwIGJvbWIgYXR0YWNrLmBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIEV4dHJhY3RlZCBzaXplOiAke2Zvcm1hdEJ5dGVzKGV4dHJhY3RlZFNpemUpfWApKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBza2lsbCBkaXJlY3RvcnkgKHNob3VsZCBiZSB0aGUgb25seSB0b3AtbGV2ZWwgZGlyZWN0b3J5KVxuICAgIGNvbnN0IGNvbnRlbnRzID0gZnMucmVhZGRpclN5bmModGVtcERpcik7XG4gICAgY29uc3QgZGlyZWN0b3JpZXMgPSBjb250ZW50cy5maWx0ZXIoaXRlbSA9PlxuICAgICAgICBmcy5zdGF0U3luYyhwYXRoLmpvaW4odGVtcERpciwgaXRlbSkpLmlzRGlyZWN0b3J5KClcbiAgICApO1xuXG4gICAgaWYgKGRpcmVjdG9yaWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHNraWxsIGRpcmVjdG9yeSBwYXRoXG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4odGVtcERpciwgZGlyZWN0b3JpZXNbMF0pO1xuICAgIH0gZWxzZSBpZiAoY29udGVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBJZiBtdWx0aXBsZSBpdGVtcyBvciBubyBkaXJlY3RvcnksIHJldHVybiB0ZW1wIGRpciBpdHNlbGZcbiAgICAgICAgcmV0dXJuIHRlbXBEaXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdaSVAgZmlsZSBhcHBlYXJzIHRvIGJlIGVtcHR5Jyk7XG4gICAgfVxufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgZmlsZSBpcyBhIFpJUCBmaWxlIGJhc2VkIG9uIGV4dGVuc2lvblxuICovXG5mdW5jdGlvbiBpc1ppcEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnRvTG93ZXJDYXNlKCkgPT09ICcuemlwJztcbn1cblxuLyoqXG4gKiBQcmVwYXJlIGlucHV0IGZvciBjb252ZXJzaW9uIChoYW5kbGVzIGJvdGggZGlyZWN0b3JpZXMgYW5kIFpJUCBmaWxlcylcbiAqIEByZXR1cm5zIHthY3R1YWxJbnB1dCwgdGVtcERpcn0gLSBhY3R1YWxJbnB1dCBpcyB0aGUgZGlyZWN0b3J5IHRvIGNvbnZlcnQsIHRlbXBEaXIgaXMgdGhlIHRlbXAgZGlyIHRvIGNsZWFudXAgKG9yIG51bGwpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByZXBhcmVDb252ZXJzaW9uSW5wdXQoXG4gICAgaW5wdXQ6IHN0cmluZyxcbiAgICB2ZXJib3NlOiBib29sZWFuXG4pOiBQcm9taXNlPHsgYWN0dWFsSW5wdXQ6IHN0cmluZzsgdGVtcERpcjogc3RyaW5nIHwgbnVsbCB9PiB7XG4gICAgLy8gVmVyaWZ5IGlucHV0IGV4aXN0c1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhpbnB1dCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYElucHV0IG5vdCBmb3VuZDogJHtpbnB1dH1gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgWklQIGZpbGVzXG4gICAgaWYgKGlzWmlwRmlsZShpbnB1dCkpIHtcbiAgICAgICAgY29uc3QgYWN0dWFsSW5wdXQgPSBhd2FpdCBleHRyYWN0WmlwRmlsZShpbnB1dCwgdmVyYm9zZSk7XG4gICAgICAgIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmRpcm5hbWUoYWN0dWFsSW5wdXQpO1xuICAgICAgICByZXR1cm4geyBhY3R1YWxJbnB1dCwgdGVtcERpciB9O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBkaXJlY3Rvcmllc1xuICAgIGlmICghZnMuc3RhdFN5bmMoaW5wdXQpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoYElucHV0IG11c3QgYmUgYSBkaXJlY3Rvcnkgb3IgWklQIGZpbGU6ICR7aW5wdXR9YCkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWN0dWFsSW5wdXQ6IGlucHV0LCB0ZW1wRGlyOiBudWxsIH07XG59XG5cbmludGVyZmFjZSBDb252ZXJ0T3B0aW9ucyB7XG4gICAgb3V0cHV0Pzogc3RyaW5nO1xuICAgIHZlcmJvc2U6IGJvb2xlYW47XG4gICAgcmVwb3J0OiBib29sZWFuO1xuICAgIGRyeVJ1bjogYm9vbGVhbjtcbiAgICBiYWNrdXA6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBDb252ZXJzaW9uUmVwb3J0IHtcbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICBkaXJlY3Rpb246ICd0by1hbnRocm9waWMnIHwgJ2Zyb20tYW50aHJvcGljJztcbiAgICBpbnB1dDogc3RyaW5nO1xuICAgIG91dHB1dDogc3RyaW5nO1xuICAgIGZpbGVzQ3JlYXRlZDogc3RyaW5nW107XG4gICAgb3BlcmF0aW9uc1BlcmZvcm1lZDogc3RyaW5nW107XG4gICAgc3VjY2VzczogYm9vbGVhbjtcbiAgICBlcnJvcj86IHN0cmluZztcbn1cblxucHJvZ3JhbVxuICAgIC5uYW1lKCdjb252ZXJ0JylcbiAgICAuZGVzY3JpcHRpb24oJ0NvbnZlcnQgYmV0d2VlbiBBbnRocm9waWMgU2tpbGxzIGFuZCBEb2xsaG91c2VNQ1AgU2tpbGxzIGZvcm1hdHMnKVxuICAgIC5jb21tYW5kKCd0by1hbnRocm9waWMgPGlucHV0PicpXG4gICAgLmRlc2NyaXB0aW9uKCdDb252ZXJ0IERvbGxob3VzZU1DUCBza2lsbCB0byBBbnRocm9waWMgU2tpbGxzIGZvcm1hdCcpXG4gICAgLm9wdGlvbignLW8sIC0tb3V0cHV0IDxkaXI+JywgJ091dHB1dCBkaXJlY3RvcnknLCAnLi9hbnRocm9waWMtc2tpbGxzJylcbiAgICAub3B0aW9uKCctdiwgLS12ZXJib3NlJywgJ1Nob3cgZGV0YWlsZWQgY29udmVyc2lvbiBzdGVwcycsIGZhbHNlKVxuICAgIC5vcHRpb24oJy1yLCAtLXJlcG9ydCcsICdHZW5lcmF0ZSBjb252ZXJzaW9uIHJlcG9ydCcsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdQcmV2aWV3IGNvbnZlcnNpb24gd2l0aG91dCBleGVjdXRpbmcnLCBmYWxzZSlcbiAgICAuYWN0aW9uKGFzeW5jIChpbnB1dDogc3RyaW5nLCBvcHRpb25zOiBDb252ZXJ0T3B0aW9ucykgPT4ge1xuICAgICAgICBhd2FpdCBjb252ZXJ0VG9BbnRocm9waWMoaW5wdXQsIG9wdGlvbnMpO1xuICAgIH0pO1xuXG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2Zyb20tYW50aHJvcGljIDxpbnB1dD4nKVxuICAgIC5kZXNjcmlwdGlvbignQ29udmVydCBBbnRocm9waWMgU2tpbGxzIHRvIERvbGxob3VzZU1DUCBza2lsbCBmb3JtYXQgKGlucHV0IGNhbiBiZSBhIGRpcmVjdG9yeSBvciBaSVAgZmlsZSknKVxuICAgIC5vcHRpb24oJy1vLCAtLW91dHB1dCA8ZGlyPicsICdPdXRwdXQgZGlyZWN0b3J5JywgZ2V0RGVmYXVsdFNraWxsc0RpcmVjdG9yeSgpKVxuICAgIC5vcHRpb24oJy12LCAtLXZlcmJvc2UnLCAnU2hvdyBkZXRhaWxlZCBjb252ZXJzaW9uIHN0ZXBzJywgZmFsc2UpXG4gICAgLm9wdGlvbignLXIsIC0tcmVwb3J0JywgJ0dlbmVyYXRlIGNvbnZlcnNpb24gcmVwb3J0JywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1kcnktcnVuJywgJ1ByZXZpZXcgY29udmVyc2lvbiB3aXRob3V0IGV4ZWN1dGluZycsIGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM6IENvbnZlcnRPcHRpb25zKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbnZlcnRGcm9tQW50aHJvcGljKGlucHV0LCBvcHRpb25zKTtcbiAgICB9KTtcblxuLyoqXG4gKiBDb252ZXJ0IERvbGxob3VzZU1DUCBza2lsbCB0byBBbnRocm9waWMgZm9ybWF0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRUb0FudGhyb3BpYyhpbnB1dDogc3RyaW5nLCBvcHRpb25zOiBDb252ZXJ0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWCAoRE1DUC1TRUMtMDA0KTogVXNlIFVuaWNvZGVWYWxpZGF0b3IgdG8gbm9ybWFsaXplIGFsbCB1c2VyIGlucHV0XG4gICAgLy8gUHJldmlvdXNseTogVXNlZCBidWlsdC1pbiBub3JtYWxpemUoKSB3aGljaCBkb2Vzbid0IGRldGVjdCBob21vZ3JhcGggYXR0YWNrc1xuICAgIC8vIE5vdzogVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoKSBkZXRlY3RzIGFuZCBwcmV2ZW50cyBsb29rYWxpa2UgY2hhcmFjdGVyIGF0dGFja3NcbiAgICBjb25zdCBpbnB1dFZhbGlkYXRpb24gPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShpbnB1dCk7XG4gICAgaW5wdXQgPSBpbnB1dFZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG5cbiAgICBpZiAob3B0aW9ucy5vdXRwdXQpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0VmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG9wdGlvbnMub3V0cHV0KTtcbiAgICAgICAgb3B0aW9ucy5vdXRwdXQgPSBvdXRwdXRWYWxpZGF0aW9uLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIGxvZ09wZXJhdGlvbigndG8tYW50aHJvcGljJywgaW5wdXQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFJlYWQgaW5wdXQgZmlsZVxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgSW5wdXQgZmlsZSBub3QgZm91bmQ6ICR7aW5wdXR9YCkpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXRDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGlucHV0LCAndXRmLTgnKTtcbiAgICAgICAgY29uc3Qgc2tpbGxOYW1lID0gcGF0aC5iYXNlbmFtZShpbnB1dCwgcGF0aC5leHRuYW1lKGlucHV0KSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZSgnXFxuUmVhZGluZyBEb2xsaG91c2VNQ1Agc2tpbGwuLi4nKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIElucHV0OiAke2lucHV0fWApKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgU2l6ZTogJHtpbnB1dENvbnRlbnQubGVuZ3RofSBieXRlc2ApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnRcbiAgICAgICAgY29uc3QgY29udmVydGVyID0gbmV3IERvbGxob3VzZVRvQW50aHJvcGljQ29udmVydGVyKCk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbnNMb2c6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZSgnXFxuQ29udmVydGluZyB0byBBbnRocm9waWMgU2tpbGxzIGZvcm1hdC4uLicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cnVjdHVyZSA9IGF3YWl0IGNvbnZlcnRlci5jb252ZXJ0U2tpbGwoaW5wdXRDb250ZW50KTtcbiAgICAgICAgbG9nQ29udmVyc2lvblN0ZXBzKHN0cnVjdHVyZSwgb3BlcmF0aW9uc0xvZywgb3B0aW9ucy52ZXJib3NlKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgb3V0cHV0IGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBvdXRwdXREaXIgPSByZXNvbHZlUGF0aFdpdGhpbkJhc2Uob3B0aW9ucy5vdXRwdXQgfHwgJy4vYW50aHJvcGljLXNraWxscycsIHNraWxsTmFtZSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ1xcbltEUlkgUlVOXSBXb3VsZCBjcmVhdGU6JykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBPdXRwdXQgZGlyZWN0b3J5OiAke291dHB1dERpcn1gKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIEZpbGVzOiAke2NvdW50RmlsZXMoc3RydWN0dXJlKX0gZmlsZXNgKSk7XG4gICAgICAgICAgICBsaXN0RmlsZXNUb0NyZWF0ZShzdHJ1Y3R1cmUpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgb3V0cHV0XG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFxcbldyaXRpbmcgQW50aHJvcGljIHNraWxsIHRvOiAke291dHB1dERpcn1gKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBjb252ZXJ0ZXIud3JpdGVUb0RpcmVjdG9yeShzdHJ1Y3R1cmUsIG91dHB1dERpcik7XG4gICAgICAgIGNvbnN0IGZpbGVzQ3JlYXRlZCA9IGdldENyZWF0ZWRGaWxlcyhzdHJ1Y3R1cmUsIG91dHB1dERpcik7XG5cbiAgICAgICAgLy8gR2VuZXJhdGUgcmVwb3J0XG4gICAgICAgIGlmIChvcHRpb25zLnJlcG9ydCkge1xuICAgICAgICAgICAgY29uc3QgcmVwb3J0ID0gZ2VuZXJhdGVSZXBvcnQoe1xuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ3RvLWFudGhyb3BpYycsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgb3V0cHV0OiBvdXRwdXREaXIsXG4gICAgICAgICAgICAgICAgZmlsZXNDcmVhdGVkLFxuICAgICAgICAgICAgICAgIG9wZXJhdGlvbnNQZXJmb3JtZWQ6IG9wZXJhdGlvbnNMb2csXG4gICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydFBhdGggPSByZXNvbHZlUGF0aFdpdGhpbkJhc2Uob3V0cHV0RGlyLCAnLmNvbnZlcnNpb24tcmVwb3J0Lm1kJyk7XG4gICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHJlcG9ydFBhdGgsIHJlcG9ydCk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBcXG5Db252ZXJzaW9uIHJlcG9ydDogJHtyZXBvcnRQYXRofWApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1Y2Nlc3NcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ1xcbuKckyBDb252ZXJzaW9uIGNvbXBsZXRlJykpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIENyZWF0ZWQgJHtmaWxlc0NyZWF0ZWQubGVuZ3RofSBmaWxlKHMpIGluOiAke291dHB1dERpcn1gKSk7XG5cbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdcXG7inJcgQ29udmVyc2lvbiBmYWlsZWQ6JyksIGVycm9yKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDbGVhbnVwIHRlbXBvcmFyeSBkaXJlY3Rvcnkgc2FmZWx5XG4gKiBTT05BUkNMT1VEIEZJWCAodHlwZXNjcmlwdDpTMzc3Nik6IEV4dHJhY3RlZCBmcm9tIGNvbnZlcnRGcm9tQW50aHJvcGljIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICogUHJldmlvdXNseTogSW5saW5lIGNsZWFudXAgbG9naWMgYWRkZWQgbmVzdGVkIGNvbmRpdGlvbnMgaW5jcmVhc2luZyBjb21wbGV4aXR5XG4gKiBOb3c6IFNlcGFyYXRlIGZ1bmN0aW9uIGhhbmRsZXMgY2xlYW51cCB3aXRoIHByb3BlciBlcnJvciBoYW5kbGluZ1xuICovXG5mdW5jdGlvbiBjbGVhbnVwVGVtcERpcmVjdG9yeSh0ZW1wRGlyOiBzdHJpbmcgfCBudWxsLCB2ZXJib3NlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRlbXBEaXIgJiYgZnMuZXhpc3RzU3luYyh0ZW1wRGlyKSkge1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgXFxuQ2xlYW5pbmcgdXAgdGVtcG9yYXJ5IGZpbGVzLi4uYCkpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmcy5ybVN5bmModGVtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9IGNhdGNoIChjbGVhbnVwRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIExvZyBlcnJvciBkZXRhaWxzIGJ1dCBkb24ndCBmYWlsIG9uIGNsZWFudXAgZXJyb3JzXG4gICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBjbGVhbnVwRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGNsZWFudXBFcnJvci5tZXNzYWdlIDogU3RyaW5nKGNsZWFudXBFcnJvcik7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KGBXYXJuaW5nOiBGYWlsZWQgdG8gY2xlYW51cCB0ZW1wIGRpcmVjdG9yeTogJHt0ZW1wRGlyfSAtICR7ZXJyb3JNZXNzYWdlfWApKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IEFudGhyb3BpYyBza2lsbCB0byBEb2xsaG91c2VNQ1AgZm9ybWF0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRGcm9tQW50aHJvcGljKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM6IENvbnZlcnRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYIChETUNQLVNFQy0wMDQpOiBVc2UgVW5pY29kZVZhbGlkYXRvciB0byBub3JtYWxpemUgYWxsIHVzZXIgaW5wdXRcbiAgICAvLyBQcmV2aW91c2x5OiBVc2VkIGJ1aWx0LWluIG5vcm1hbGl6ZSgpIHdoaWNoIGRvZXNuJ3QgZGV0ZWN0IGhvbW9ncmFwaCBhdHRhY2tzXG4gICAgLy8gTm93OiBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSgpIGRldGVjdHMgYW5kIHByZXZlbnRzIGxvb2thbGlrZSBjaGFyYWN0ZXIgYXR0YWNrc1xuICAgIC8vIEV4YW1wbGU6IFwiZmlsZVxcdTAwNDEudHh0XCIgdnMgXCJmaWxlXFx1MDMwMUEudHh0XCIgYm90aCBsb29rIGxpa2UgXCJmaWxlQS50eHRcIiBidXQgYXJlIGRpZmZlcmVudFxuICAgIGNvbnN0IGlucHV0VmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGlucHV0KTtcbiAgICBpbnB1dCA9IGlucHV0VmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcblxuICAgIGlmIChvcHRpb25zLm91dHB1dCkge1xuICAgICAgICBjb25zdCBvdXRwdXRWYWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUob3B0aW9ucy5vdXRwdXQpO1xuICAgICAgICBvcHRpb25zLm91dHB1dCA9IG91dHB1dFZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgfVxuXG4gICAgbGV0IHRlbXBEaXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgbG9nT3BlcmF0aW9uKCdmcm9tLWFudGhyb3BpYycsIGlucHV0LCBvcHRpb25zKTtcblxuICAgICAgICAvLyBQcmVwYXJlIGlucHV0IChoYW5kbGVzIGJvdGggZGlyZWN0b3JpZXMgYW5kIFpJUCBmaWxlcylcbiAgICAgICAgY29uc3QgeyBhY3R1YWxJbnB1dCwgdGVtcERpcjogZXh0cmFjdGVkVGVtcERpciB9ID0gYXdhaXQgcHJlcGFyZUNvbnZlcnNpb25JbnB1dChpbnB1dCwgb3B0aW9ucy52ZXJib3NlKTtcbiAgICAgICAgdGVtcERpciA9IGV4dHJhY3RlZFRlbXBEaXI7XG5cbiAgICAgICAgY29uc3Qgc2tpbGxOYW1lID0gcGF0aC5iYXNlbmFtZShhY3R1YWxJbnB1dCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZSgnXFxuUmVhZGluZyBBbnRocm9waWMgc2tpbGwuLi4nKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIElucHV0OiAke2FjdHVhbElucHV0fWApKTtcbiAgICAgICAgICAgIGxpc3RBbnRocm9waWNTdHJ1Y3R1cmUoYWN0dWFsSW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydFxuICAgICAgICBjb25zdCBjb252ZXJ0ZXIgPSBuZXcgQW50aHJvcGljVG9Eb2xsaG91c2VDb252ZXJ0ZXIoKTtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uc0xvZzogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKCdcXG5Db252ZXJ0aW5nIHRvIERvbGxob3VzZU1DUCBTa2lsbHMgZm9ybWF0Li4uJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZG9sbGhvdXNlU2tpbGwgPSBhd2FpdCBjb252ZXJ0ZXIuY29udmVydFNraWxsKGFjdHVhbElucHV0KTtcbiAgICAgICAgbG9nUmV2ZXJzZUNvbnZlcnNpb25TdGVwcyhhY3R1YWxJbnB1dCwgb3BlcmF0aW9uc0xvZywgb3B0aW9ucy52ZXJib3NlKTtcblxuICAgICAgICAvLyBEZXRlcm1pbmUgb3V0cHV0IGZpbGVcbiAgICAgICAgY29uc3Qgb3V0cHV0RGlyID0gcGF0aC5yZXNvbHZlKG9wdGlvbnMub3V0cHV0IHx8IGdldERlZmF1bHRTa2lsbHNEaXJlY3RvcnkoKSk7XG4gICAgICAgIGNvbnN0IG91dHB1dEZpbGUgPSByZXNvbHZlUGF0aFdpdGhpbkJhc2Uob3V0cHV0RGlyLCBgJHtza2lsbE5hbWV9Lm1kYCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ1xcbltEUlkgUlVOXSBXb3VsZCBjcmVhdGU6JykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBPdXRwdXQgZmlsZTogJHtvdXRwdXRGaWxlfWApKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgU2l6ZTogJHtkb2xsaG91c2VTa2lsbC5sZW5ndGh9IGJ5dGVzYCkpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgb3V0cHV0XG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFxcbldyaXRpbmcgRG9sbGhvdXNlTUNQIHNraWxsIHRvOiAke291dHB1dEZpbGV9YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dERpcikpIHtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgY29udmVydGVyLndyaXRlVG9GaWxlKGRvbGxob3VzZVNraWxsLCBvdXRwdXRGaWxlKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSByZXBvcnRcbiAgICAgICAgaWYgKG9wdGlvbnMucmVwb3J0KSB7XG4gICAgICAgICAgICBjb25zdCByZXBvcnQgPSBnZW5lcmF0ZVJlcG9ydCh7XG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnZnJvbS1hbnRocm9waWMnLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0RmlsZSxcbiAgICAgICAgICAgICAgICBmaWxlc0NyZWF0ZWQ6IFtvdXRwdXRGaWxlXSxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25zUGVyZm9ybWVkOiBvcGVyYXRpb25zTG9nLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXBvcnRQYXRoID0gcmVzb2x2ZVBhdGhXaXRoaW5CYXNlKG91dHB1dERpciwgYCR7c2tpbGxOYW1lfS1jb252ZXJzaW9uLXJlcG9ydC5tZGApO1xuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZXBvcnRQYXRoLCByZXBvcnQpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgXFxuQ29udmVyc2lvbiByZXBvcnQ6ICR7cmVwb3J0UGF0aH1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWNjZXNzXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCdcXG7inJMgQ29udmVyc2lvbiBjb21wbGV0ZScpKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBDcmVhdGVkOiAke291dHB1dEZpbGV9YCkpO1xuXG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXFxu4pyXIENvbnZlcnNpb24gZmFpbGVkOicpLCBlcnJvcik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBTT05BUkNMT1VEIEZJWCAodHlwZXNjcmlwdDpTMzc3Nik6IFVzZSBleHRyYWN0ZWQgY2xlYW51cCBmdW5jdGlvbiB0byByZWR1Y2UgY29tcGxleGl0eVxuICAgICAgICAvLyBGSVg6IEVuc3VyZSBjbGVhbnVwIGhhcHBlbnMgb24gYm90aCBzdWNjZXNzIGFuZCBmYWlsdXJlXG4gICAgICAgIC8vIFByZXZpb3VzbHk6IENsZWFudXAgb25seSBvbiBzdWNjZXNzIHBhdGhcbiAgICAgICAgLy8gTm93OiBDbGVhbnVwIGluIGZpbmFsbHkgYmxvY2sgdG8gaGFuZGxlIGFsbCBlcnJvciBzY2VuYXJpb3NcbiAgICAgICAgY2xlYW51cFRlbXBEaXJlY3RvcnkodGVtcERpciwgb3B0aW9ucy52ZXJib3NlKTtcbiAgICB9XG59XG5cbi8qKlxuICogTG9nIGNvbnZlcnNpb24gb3BlcmF0aW9uIGZvciBzZWN1cml0eSBhdWRpdFxuICovXG5mdW5jdGlvbiBsb2dPcGVyYXRpb24oZGlyZWN0aW9uOiBzdHJpbmcsIGlucHV0OiBzdHJpbmcsIG9wdGlvbnM6IENvbnZlcnRPcHRpb25zKTogdm9pZCB7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ2NvbnZlcnQgQ0xJJyxcbiAgICAgICAgZGV0YWlsczogYENvbnZlcnNpb24gJHtkaXJlY3Rpb259OiAke2lucHV0fSAoZHJ5LXJ1bjogJHtvcHRpb25zLmRyeVJ1bn0pYFxuICAgIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBsb2cgZGlyZWN0b3J5IG9wZXJhdGlvbnMgd2l0aCBvcHRpb25hbCBmaWxlIGxpc3RpbmdcbiAqL1xuZnVuY3Rpb24gbG9nRGlyZWN0b3J5T3BlcmF0aW9uKFxuICAgIHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUsXG4gICAgb3B0aW9uczoge1xuICAgICAgICBkaXJLZXk6IGtleW9mIEFudGhyb3BpY1NraWxsU3RydWN0dXJlO1xuICAgICAgICBkaXJOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICBpdGVtVHlwZTogc3RyaW5nO1xuICAgICAgICBvcGVyYXRpb25zTG9nOiBzdHJpbmdbXTtcbiAgICAgICAgdmVyYm9zZTogYm9vbGVhbjtcbiAgICAgICAgbGlzdEZpbGVzPzogYm9vbGVhbjtcbiAgICB9XG4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGRpcktleSwgZGlyTmFtZSwgYWN0aW9uLCBpdGVtVHlwZSwgb3BlcmF0aW9uc0xvZywgdmVyYm9zZSwgbGlzdEZpbGVzID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICBpZiAoc3RydWN0dXJlW2RpcktleV0pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBzdHJ1Y3R1cmVbZGlyS2V5XSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKGl0ZW1zKS5sZW5ndGg7XG4gICAgICAgIG9wZXJhdGlvbnNMb2cucHVzaChgJHthY3Rpb259ICR7Y291bnR9ICR7aXRlbVR5cGV9KHMpIHRvICR7ZGlyTmFtZX0vYCk7XG5cbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAg4pyTICR7YWN0aW9ufSAke2NvdW50fSAke2l0ZW1UeXBlfShzKWApKTtcbiAgICAgICAgICAgIGlmIChsaXN0RmlsZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIE9iamVjdC5rZXlzKGl0ZW1zKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgICAgLSAke2Rpck5hbWV9LyR7ZmlsZW5hbWV9YCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBMb2cgY29udmVyc2lvbiBzdGVwcyBkdXJpbmcgdG8tYW50aHJvcGljIGNvbnZlcnNpb25cbiAqL1xuZnVuY3Rpb24gbG9nQ29udmVyc2lvblN0ZXBzKFxuICAgIHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUsXG4gICAgb3BlcmF0aW9uc0xvZzogc3RyaW5nW10sXG4gICAgdmVyYm9zZTogYm9vbGVhblxuKTogdm9pZCB7XG4gICAgLy8gTG9nIFNLSUxMLm1kXG4gICAgb3BlcmF0aW9uc0xvZy5wdXNoKCdDcmVhdGVkIFNLSUxMLm1kIHdpdGggc2ltcGxpZmllZCBtZXRhZGF0YScpO1xuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAg4pyTIENyZWF0ZWQgU0tJTEwubWQnKSk7XG4gICAgfVxuXG4gICAgLy8gTG9nIGRpcmVjdG9yeSBvcGVyYXRpb25zXG4gICAgbG9nRGlyZWN0b3J5T3BlcmF0aW9uKHN0cnVjdHVyZSwge1xuICAgICAgICBkaXJLZXk6ICdzY3JpcHRzLycsXG4gICAgICAgIGRpck5hbWU6ICdzY3JpcHRzJyxcbiAgICAgICAgYWN0aW9uOiAnRXh0cmFjdGVkJyxcbiAgICAgICAgaXRlbVR5cGU6ICdzY3JpcHQnLFxuICAgICAgICBvcGVyYXRpb25zTG9nLFxuICAgICAgICB2ZXJib3NlLFxuICAgICAgICBsaXN0RmlsZXM6IHRydWVcbiAgICB9KTtcbiAgICBsb2dEaXJlY3RvcnlPcGVyYXRpb24oc3RydWN0dXJlLCB7XG4gICAgICAgIGRpcktleTogJ3JlZmVyZW5jZS8nLFxuICAgICAgICBkaXJOYW1lOiAncmVmZXJlbmNlJyxcbiAgICAgICAgYWN0aW9uOiAnRXh0cmFjdGVkJyxcbiAgICAgICAgaXRlbVR5cGU6ICdyZWZlcmVuY2UgZG9jdW1lbnQnLFxuICAgICAgICBvcGVyYXRpb25zTG9nLFxuICAgICAgICB2ZXJib3NlLFxuICAgICAgICBsaXN0RmlsZXM6IHRydWVcbiAgICB9KTtcbiAgICBsb2dEaXJlY3RvcnlPcGVyYXRpb24oc3RydWN0dXJlLCB7XG4gICAgICAgIGRpcktleTogJ2V4YW1wbGVzLycsXG4gICAgICAgIGRpck5hbWU6ICdleGFtcGxlcycsXG4gICAgICAgIGFjdGlvbjogJ0V4dHJhY3RlZCcsXG4gICAgICAgIGl0ZW1UeXBlOiAnZXhhbXBsZScsXG4gICAgICAgIG9wZXJhdGlvbnNMb2csXG4gICAgICAgIHZlcmJvc2VcbiAgICB9KTtcbiAgICBsb2dEaXJlY3RvcnlPcGVyYXRpb24oc3RydWN0dXJlLCB7XG4gICAgICAgIGRpcktleTogJ3RoZW1lcy8nLFxuICAgICAgICBkaXJOYW1lOiAndGhlbWVzJyxcbiAgICAgICAgYWN0aW9uOiAnRXh0cmFjdGVkJyxcbiAgICAgICAgaXRlbVR5cGU6ICd0ZW1wbGF0ZScsXG4gICAgICAgIG9wZXJhdGlvbnNMb2csXG4gICAgICAgIHZlcmJvc2VcbiAgICB9KTtcblxuICAgIC8vIExvZyBtZXRhZGF0YSBwcmVzZXJ2YXRpb25cbiAgICBpZiAoc3RydWN0dXJlWydtZXRhZGF0YS8nXSkge1xuICAgICAgICBvcGVyYXRpb25zTG9nLnB1c2goJ1ByZXNlcnZlZCBmdWxsIERvbGxob3VzZU1DUCBtZXRhZGF0YSB0byBtZXRhZGF0YS9kb2xsaG91c2UueWFtbCcpO1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICDinJMgUHJlc2VydmVkIG1ldGFkYXRhIGZvciBwZXJmZWN0IHJvdW5kdHJpcCcpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gbG9nIGRpcmVjdG9yeSBvcGVyYXRpb25zIGZvciByZXZlcnNlIGNvbnZlcnNpb24gKGZyb20tYW50aHJvcGljKVxuICovXG5mdW5jdGlvbiBsb2dSZXZlcnNlRGlyZWN0b3J5T3BlcmF0aW9uKFxuICAgIGlucHV0RGlyOiBzdHJpbmcsXG4gICAgZGlyTmFtZTogc3RyaW5nLFxuICAgIGl0ZW1UeXBlOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uc0xvZzogc3RyaW5nW10sXG4gICAgdmVyYm9zZTogYm9vbGVhblxuKTogdm9pZCB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihpbnB1dERpciwgZGlyTmFtZSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3QgY291bnQgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKS5sZW5ndGg7XG4gICAgICAgIG9wZXJhdGlvbnNMb2cucHVzaChgQ29tYmluZWQgJHtjb3VudH0gJHtpdGVtVHlwZX0ocykke2l0ZW1UeXBlID09PSAnc2NyaXB0JyA/ICcgYXMgY29kZSBibG9ja3MnIDogJyd9YCk7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIOKckyBDb21iaW5lZCAke2NvdW50fSAke2l0ZW1UeXBlfShzKWApKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBMb2cgY29udmVyc2lvbiBzdGVwcyBkdXJpbmcgZnJvbS1hbnRocm9waWMgY29udmVyc2lvblxuICovXG5mdW5jdGlvbiBsb2dSZXZlcnNlQ29udmVyc2lvblN0ZXBzKFxuICAgIGlucHV0RGlyOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uc0xvZzogc3RyaW5nW10sXG4gICAgdmVyYm9zZTogYm9vbGVhblxuKTogdm9pZCB7XG4gICAgb3BlcmF0aW9uc0xvZy5wdXNoKCdSZWFkIFNLSUxMLm1kIG1ldGFkYXRhJywgJ0VucmljaGVkIG1ldGFkYXRhIHdpdGggRG9sbGhvdXNlTUNQIGZpZWxkcycpO1xuXG4gICAgLy8gTG9nIGRpcmVjdG9yeSBvcGVyYXRpb25zIHVzaW5nIGhlbHBlclxuICAgIGxvZ1JldmVyc2VEaXJlY3RvcnlPcGVyYXRpb24oaW5wdXREaXIsICdzY3JpcHRzJywgJ3NjcmlwdCcsIG9wZXJhdGlvbnNMb2csIHZlcmJvc2UpO1xuICAgIGxvZ1JldmVyc2VEaXJlY3RvcnlPcGVyYXRpb24oaW5wdXREaXIsICdyZWZlcmVuY2UnLCAncmVmZXJlbmNlIGRvY3VtZW50Jywgb3BlcmF0aW9uc0xvZywgdmVyYm9zZSk7XG4gICAgbG9nUmV2ZXJzZURpcmVjdG9yeU9wZXJhdGlvbihpbnB1dERpciwgJ2V4YW1wbGVzJywgJ2V4YW1wbGUnLCBvcGVyYXRpb25zTG9nLCB2ZXJib3NlKTtcbiAgICBsb2dSZXZlcnNlRGlyZWN0b3J5T3BlcmF0aW9uKGlucHV0RGlyLCAndGhlbWVzJywgJ3RlbXBsYXRlJywgb3BlcmF0aW9uc0xvZywgdmVyYm9zZSk7XG5cbiAgICAvLyBIYW5kbGUgbWV0YWRhdGEgcmVzdG9yYXRpb25cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oaW5wdXREaXIsICdtZXRhZGF0YScpKSkge1xuICAgICAgICBvcGVyYXRpb25zTG9nLnB1c2goJ1Jlc3RvcmVkIG9yaWdpbmFsIERvbGxob3VzZU1DUCBtZXRhZGF0YSBmcm9tIG1ldGFkYXRhL2RvbGxob3VzZS55YW1sJyk7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIOKckyBSZXN0b3JlZCBvcmlnaW5hbCBtZXRhZGF0YSAocGVyZmVjdCByb3VuZHRyaXApJykpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIExpc3QgQW50aHJvcGljIHNraWxsIGRpcmVjdG9yeSBzdHJ1Y3R1cmVcbiAqL1xuZnVuY3Rpb24gbGlzdEFudGhyb3BpY1N0cnVjdHVyZShpbnB1dERpcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc3ViZGlycyA9IFsnc2NyaXB0cycsICdyZWZlcmVuY2UnLCAnZXhhbXBsZXMnLCAndGhlbWVzJywgJ21ldGFkYXRhJ107XG4gICAgZm9yIChjb25zdCBzdWJkaXIgb2Ygc3ViZGlycykge1xuICAgICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKGlucHV0RGlyLCBzdWJkaXIpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgJHtzdWJkaXJ9LzogJHtmaWxlcy5sZW5ndGh9IGZpbGUocylgKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQ291bnQgdG90YWwgZmlsZXMgaW4gQW50aHJvcGljIHN0cnVjdHVyZVxuICovXG5mdW5jdGlvbiBjb3VudEZpbGVzKHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUpOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDE7IC8vIFNLSUxMLm1kXG5cbiAgICBpZiAoc3RydWN0dXJlWydzY3JpcHRzLyddKSBjb3VudCArPSBPYmplY3Qua2V5cyhzdHJ1Y3R1cmVbJ3NjcmlwdHMvJ10pLmxlbmd0aDtcbiAgICBpZiAoc3RydWN0dXJlWydyZWZlcmVuY2UvJ10pIGNvdW50ICs9IE9iamVjdC5rZXlzKHN0cnVjdHVyZVsncmVmZXJlbmNlLyddKS5sZW5ndGg7XG4gICAgaWYgKHN0cnVjdHVyZVsnZXhhbXBsZXMvJ10pIGNvdW50ICs9IE9iamVjdC5rZXlzKHN0cnVjdHVyZVsnZXhhbXBsZXMvJ10pLmxlbmd0aDtcbiAgICBpZiAoc3RydWN0dXJlWyd0aGVtZXMvJ10pIGNvdW50ICs9IE9iamVjdC5rZXlzKHN0cnVjdHVyZVsndGhlbWVzLyddKS5sZW5ndGg7XG4gICAgaWYgKHN0cnVjdHVyZVsnTElDRU5TRS50eHQnXSkgY291bnQgKz0gMTtcblxuICAgIHJldHVybiBjb3VudDtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIHRocm91Z2ggYWxsIGZpbGVzIGluIGFuIEFudGhyb3BpYyBzdHJ1Y3R1cmVcbiAqIEV4ZWN1dGVzIGEgY2FsbGJhY2sgZm9yIGVhY2ggZmlsZSBmb3VuZFxuICovXG5mdW5jdGlvbiBpdGVyYXRlU3RydWN0dXJlRmlsZXMoXG4gICAgc3RydWN0dXJlOiBBbnRocm9waWNTa2lsbFN0cnVjdHVyZSxcbiAgICBjYWxsYmFjazogKGRpck5hbWU6IHN0cmluZyB8IG51bGwsIGZpbGVuYW1lOiBzdHJpbmcpID0+IHZvaWRcbik6IHZvaWQge1xuICAgIC8vIEFsd2F5cyBpbmNsdWRlIFNLSUxMLm1kXG4gICAgY2FsbGJhY2sobnVsbCwgJ1NLSUxMLm1kJyk7XG5cbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggZGlyZWN0b3JpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IFsnc2NyaXB0cy8nLCAncmVmZXJlbmNlLycsICdleGFtcGxlcy8nLCAndGhlbWVzLycsICdtZXRhZGF0YS8nXSBhcyBjb25zdDtcbiAgICBmb3IgKGNvbnN0IGRpciBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgICBjb25zdCBkaXJDb250ZW50ID0gc3RydWN0dXJlW2Rpcl07XG4gICAgICAgIGlmIChkaXJDb250ZW50KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIE9iamVjdC5rZXlzKGRpckNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZGlyLnNsaWNlKDAsIC0xKSwgZmlsZW5hbWUpOyAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBMSUNFTlNFLnR4dFxuICAgIGlmIChzdHJ1Y3R1cmVbJ0xJQ0VOU0UudHh0J10pIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgJ0xJQ0VOU0UudHh0Jyk7XG4gICAgfVxufVxuXG4vKipcbiAqIExpc3QgZmlsZXMgdGhhdCB3b3VsZCBiZSBjcmVhdGVkIChkcnktcnVuIG1vZGUpXG4gKi9cbmZ1bmN0aW9uIGxpc3RGaWxlc1RvQ3JlYXRlKHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIEZpbGVzOicpKTtcbiAgICBpdGVyYXRlU3RydWN0dXJlRmlsZXMoc3RydWN0dXJlLCAoZGlyTmFtZSwgZmlsZW5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBkaXJOYW1lID8gYCR7ZGlyTmFtZX0vJHtmaWxlbmFtZX1gIDogZmlsZW5hbWU7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgICAtICR7ZmlsZVBhdGh9YCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEdldCBsaXN0IG9mIGNyZWF0ZWQgZmlsZXNcbiAqL1xuZnVuY3Rpb24gZ2V0Q3JlYXRlZEZpbGVzKHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUsIG91dHB1dERpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGl0ZXJhdGVTdHJ1Y3R1cmVGaWxlcyhzdHJ1Y3R1cmUsIChkaXJOYW1lLCBmaWxlbmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGRpck5hbWVcbiAgICAgICAgICAgID8gcmVzb2x2ZVBhdGhXaXRoaW5CYXNlKG91dHB1dERpciwgZGlyTmFtZSwgZmlsZW5hbWUpXG4gICAgICAgICAgICA6IHJlc29sdmVQYXRoV2l0aGluQmFzZShvdXRwdXREaXIsIGZpbGVuYW1lKTtcbiAgICAgICAgZmlsZXMucHVzaChmaWxlUGF0aCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbGVzO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGNvbnZlcnNpb24gcmVwb3J0XG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlUmVwb3J0KGRhdGE6IENvbnZlcnNpb25SZXBvcnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJyMgU2tpbGwgQ29udmVyc2lvbiBSZXBvcnQnLFxuICAgICAgICAnJyxcbiAgICAgICAgYCoqVGltZXN0YW1wKio6ICR7ZGF0YS50aW1lc3RhbXB9YCxcbiAgICAgICAgYCoqRGlyZWN0aW9uKio6ICR7ZGF0YS5kaXJlY3Rpb259YCxcbiAgICAgICAgYCoqU3RhdHVzKio6ICR7ZGF0YS5zdWNjZXNzID8gJ+KckyBTdWNjZXNzJyA6ICfinJcgRmFpbGVkJ31gLFxuICAgICAgICAnJyxcbiAgICAgICAgJyMjIElucHV0L091dHB1dCcsXG4gICAgICAgICcnLFxuICAgICAgICBgKipJbnB1dCoqOiBcXGAke2RhdGEuaW5wdXR9XFxgYCxcbiAgICAgICAgYCoqT3V0cHV0Kio6IFxcYCR7ZGF0YS5vdXRwdXR9XFxgYCxcbiAgICAgICAgJydcbiAgICBdO1xuXG4gICAgaWYgKGRhdGEuZmlsZXNDcmVhdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGluZXMucHVzaCgnIyMgRmlsZXMgQ3JlYXRlZCcsICcnLCAuLi5kYXRhLmZpbGVzQ3JlYXRlZC5tYXAoZmlsZSA9PiBgLSBcXGAke2ZpbGV9XFxgYCksICcnKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKCcjIyBPcGVyYXRpb25zIFBlcmZvcm1lZCcsICcnLCAuLi5kYXRhLm9wZXJhdGlvbnNQZXJmb3JtZWQubWFwKG9wZXJhdGlvbiA9PiBgLSAke29wZXJhdGlvbn1gKSwgJycpO1xuXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgbGluZXMucHVzaCgnIyMgRXJyb3InLCAnJywgJ2BgYCcsIGRhdGEuZXJyb3IsICdgYGAnLCAnJyk7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaCgnLS0tJywgJycsICcqR2VuZXJhdGVkIGJ5IERvbGxob3VzZU1DUCBDb252ZXJ0ZXIqJyk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8vIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcbnByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTtcbiJdfQ==
|
|
651
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvY29udmVydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLE9BQU8sTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUNILDZCQUE2QixFQUM3Qiw2QkFBNkIsRUFFaEMsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWhGLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7QUFFOUI7Ozs7O0dBS0c7QUFDSCxTQUFTLGdCQUFnQixDQUFDLGVBQXVCO0lBQzdDLE9BQU8sYUFBYSxDQUFDLGVBQWUsRUFBRTtRQUNsQyxVQUFVLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsdUVBQXVFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0SCxDQUFDO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLFFBQVE7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QyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRTlHLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLHVDQUF1QyxDQUFDLENBQUM7SUFFL0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCwrQkFBK0I7QUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbi8qKlxuICogQ0xJIGNvbW1hbmQgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBBbnRocm9waWMgU2tpbGxzIGFuZCBEb2xsaG91c2VNQ1AgU2tpbGxzXG4gKlxuICogVXNhZ2U6XG4gKiAgIGRvbGxob3VzZSBjb252ZXJ0IHRvLWFudGhyb3BpYyA8aW5wdXQ+IFtvcHRpb25zXVxuICogICBkb2xsaG91c2UgY29udmVydCBmcm9tLWFudGhyb3BpYyA8aW5wdXQ+IFtvcHRpb25zXVxuICpcbiAqIElucHV0IGZvcm1hdHM6XG4gKiAgIHRvLWFudGhyb3BpYzogICBEb2xsaG91c2VNQ1Agc2tpbGwgZmlsZSAoLm1kKVxuICogICBmcm9tLWFudGhyb3BpYzogQW50aHJvcGljIHNraWxsIGRpcmVjdG9yeSBvciBaSVAgZmlsZVxuICpcbiAqIE9wdGlvbnM6XG4gKiAgIC1vLCAtLW91dHB1dCA8ZGlyPiAgICAgIE91dHB1dCBkaXJlY3RvcnlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBmb3IgZnJvbS1hbnRocm9waWM6IH4vLmRvbGxob3VzZS9wb3J0Zm9saW8vc2tpbGxzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgZm9yIHRvLWFudGhyb3BpYzogLi9hbnRocm9waWMtc2tpbGxzXG4gKiAgIC12LCAtLXZlcmJvc2UgICAgICAgICAgIFNob3cgZGV0YWlsZWQgY29udmVyc2lvbiBzdGVwc1xuICogICAtciwgLS1yZXBvcnQgICAgICAgICAgICBHZW5lcmF0ZSBjb252ZXJzaW9uIHJlcG9ydFxuICogICAtLWRyeS1ydW4gICAgICAgICAgICAgICBQcmV2aWV3IGNvbnZlcnNpb24gd2l0aG91dCBleGVjdXRpbmdcbiAqXG4gKiBFeGFtcGxlczpcbiAqICAgIyBDb252ZXJ0IGRvd25sb2FkZWQgWklQIGZpbGUgZnJvbSBDbGF1ZGUuYWlcbiAqICAgZG9sbGhvdXNlIGNvbnZlcnQgZnJvbS1hbnRocm9waWMgfi9Eb3dubG9hZHMvbXktc2tpbGwuemlwXG4gKlxuICogICAjIENvbnZlcnQgQW50aHJvcGljIHNraWxsIGRpcmVjdG9yeVxuICogICBkb2xsaG91c2UgY29udmVydCBmcm9tLWFudGhyb3BpYyB+L0Rvd25sb2Fkcy9teS1za2lsbC1mb2xkZXJcbiAqXG4gKiAgICMgRXhwb3J0IERvbGxob3VzZU1DUCBza2lsbCB0byBzaGFyZVxuICogICBkb2xsaG91c2UgY29udmVydCB0by1hbnRocm9waWMgfi8uZG9sbGhvdXNlL3BvcnRmb2xpby9za2lsbHMvbXktc2tpbGwubWQgLW8gLi9leHBvcnRlZFxuICovXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgZXh0cmFjdCBmcm9tICdleHRyYWN0LXppcCc7XG5pbXBvcnQge1xuICAgIERvbGxob3VzZVRvQW50aHJvcGljQ29udmVydGVyLFxuICAgIEFudGhyb3BpY1RvRG9sbGhvdXNlQ29udmVydGVyLFxuICAgIHR5cGUgQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmVcbn0gZnJvbSAnLi4vY29udmVydGVycy9pbmRleC5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUGF0aFdpdGhpbkJhc2UsIHZldE91dHB1dEJhc2UgfSBmcm9tICcuLi91dGlscy9wYXRoU2VjdXJpdHkuanMnO1xuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxuLyoqXG4gKiBWZXQgdGhlIHVzZXIncyBvdXRwdXQgYmFzZSBhbmQgcmV0dXJuIHRoZSBjYW5vbmljYWwgZGlyZWN0b3J5IHRvIHdyaXRlIHRvXG4gKiAoIzIzNDQpLiBSZWxhdGl2ZSBvdXRwdXRzIGFyZSBjb250YWluZWQgd2l0aGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBldmVuXG4gKiB3aGVuIGEgc3ltbGluayB0cmllcyB0byByZWRpcmVjdCB0aGVtOyBleHBsaWNpdCBvdXRzaWRlIGRlc3RpbmF0aW9ucyBhcmVcbiAqIGhvbm91cmVkIGJ1dCB0aGVpciByZWFsIGxvY2F0aW9uIGlzIGRpc2Nsb3NlZCB3aGVuIGl0IGRpZmZlcnMuXG4gKi9cbmZ1bmN0aW9uIHZldENvbnZlcnRPdXRwdXQocmVxdWVzdGVkT3V0cHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB2ZXRPdXRwdXRCYXNlKHJlcXVlc3RlZE91dHB1dCwge1xuICAgICAgICBvbkRpc2Nsb3NlOiAoY2Fub25pY2FsQmFzZSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGAgIE5vdGU6IG91dHB1dCByZXNvbHZlcyB0aHJvdWdoIGEgc3ltYm9saWMgbGluayDigJQgcmVhbCBkZXN0aW5hdGlvbjogJHtjYW5vbmljYWxCYXNlfWApKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIE1heGltdW0gWklQIGZpbGUgc2l6ZSAoMTAwTUIpIC0gcHJldmVudHMgRG9TIGF0dGFja3MgYW5kIHN5c3RlbSByZXNvdXJjZSBleGhhdXN0aW9uXG4gKi9cbmNvbnN0IE1BWF9aSVBfU0laRV9CWVRFUyA9IDEwMCAqIDEwMjQgKiAxMDI0OyAvLyAxMDBNQlxuXG4vKipcbiAqIE1heGltdW0gZXh0cmFjdGVkIHNpemUgKDUwME1CKSAtIHByZXZlbnRzIHppcCBib21iIGF0dGFja3NcbiAqL1xuY29uc3QgTUFYX0VYVFJBQ1RFRF9TSVpFX0JZVEVTID0gNTAwICogMTAyNCAqIDEwMjQ7IC8vIDUwME1CXG5cbi8qKlxuICogUHJvZ3Jlc3MgaW5kaWNhdG9yIHRocmVzaG9sZCAoMTBNQikgLSBzaG93IHByb2dyZXNzIG1lc3NhZ2UgZm9yIGZpbGVzIGxhcmdlciB0aGFuIHRoaXNcbiAqL1xuY29uc3QgUFJPR1JFU1NfVEhSRVNIT0xEX0JZVEVTID0gMTAgKiAxMDI0ICogMTAyNDsgLy8gMTBNQlxuXG4vKipcbiAqIEdldCB0aGUgZGVmYXVsdCBEb2xsaG91c2VNQ1AgcG9ydGZvbGlvIHNraWxscyBkaXJlY3RvcnlcbiAqIFNFQ1VSSVRZIEZJWCAoRE1DUC1TRUMtMDA0KTogTm9ybWFsaXplIEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3NcbiAqIFByZXZpb3VzbHk6IFVzZWQgcHJvY2Vzcy5lbnYuSE9NRSBkaXJlY3RseSB3aXRob3V0IG5vcm1hbGl6YXRpb25cbiAqIE5vdzogVmFsaWRhdGUgYW5kIG5vcm1hbGl6ZSBhbGwgcGF0aCBjb21wb25lbnRzIGluY2x1ZGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdFNraWxsc0RpcmVjdG9yeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhvbWVEaXIgPSBwcm9jZXNzLmVudi5IT01FIHx8ICcnO1xuXG4gICAgLy8gTm9ybWFsaXplIEhPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcHJldmVudCBob21vZ3JhcGggYXR0YWNrcyB2aWEgbG9va2FsaWtlIGNoYXJhY3RlcnNcbiAgICBsZXQgbm9ybWFsaXplZEhvbWUgPSAnJztcbiAgICBpZiAoaG9tZURpcikge1xuICAgICAgICBjb25zdCBub3JtYWxpemF0aW9uUmVzdWx0ID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoaG9tZURpcik7XG4gICAgICAgIG5vcm1hbGl6ZWRIb21lID0gbm9ybWFsaXphdGlvblJlc3VsdC5ub3JtYWxpemVkQ29udGVudDtcblxuICAgICAgICAvLyBbU0VDVVJJVFkgV0FSTklOR10gTG9nIGlmIG5vcm1hbGl6YXRpb24gY2hhbmdlZCB0aGUgSE9NRSBwYXRoXG4gICAgICAgIC8vIFRoaXMgY291bGQgaW5kaWNhdGUgYSBzZWN1cml0eSBpc3N1ZSBvciBtaXNjb25maWd1cmF0aW9uXG4gICAgICAgIGlmIChub3JtYWxpemVkSG9tZSAhPT0gaG9tZURpcikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgICAgICAgYFtXQVJOSU5HXSBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlIHdhcyBtb2RpZmllZCBkdXJpbmcgVW5pY29kZSBub3JtYWxpemF0aW9uLlxcbmAgK1xuICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWw6IFwiJHtob21lRGlyfVwiXFxuYCArXG4gICAgICAgICAgICAgICAgICAgIGBOb3JtYWxpemVkOiBcIiR7bm9ybWFsaXplZEhvbWV9XCJcXG5gICtcbiAgICAgICAgICAgICAgICAgICAgYFRoaXMgbWF5IGluZGljYXRlIGEgc2VjdXJpdHkgaXNzdWUgb3IgbWlzY29uZmlndXJhdGlvbi5gXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXRoLmpvaW4obm9ybWFsaXplZEhvbWUsICcuZG9sbGhvdXNlJywgJ3BvcnRmb2xpbycsICdza2lsbHMnKTtcbn1cblxuLyoqXG4gKiBGb3JtYXQgYnl0ZXMgdG8gaHVtYW4tcmVhZGFibGUgc3RyaW5nXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdEJ5dGVzKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChieXRlcyA9PT0gMCkgcmV0dXJuICcwIEJ5dGVzJztcbiAgICBjb25zdCBrID0gMTAyNDtcbiAgICBjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS0InLCAnTUInLCAnR0InXTtcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpICogMTAwKSAvIDEwMCArICcgJyArIHNpemVzW2ldO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0b3RhbCBzaXplIG9mIGV4dHJhY3RlZCBmaWxlc1xuICovXG5mdW5jdGlvbiBjYWxjdWxhdGVFeHRyYWN0ZWRTaXplKGRpcmVjdG9yeTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgdG90YWxTaXplID0gMDtcblxuICAgIGZ1bmN0aW9uIHdhbGtEaXIoZGlyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgZW50cnkubmFtZSk7XG4gICAgICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgIHdhbGtEaXIoZnVsbFBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSkge1xuICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBmcy5zdGF0U3luYyhmdWxsUGF0aCkuc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdhbGtEaXIoZGlyZWN0b3J5KTtcbiAgICByZXR1cm4gdG90YWxTaXplO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgYSBaSVAgZmlsZSB0byBhIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2l0aCBzaXplIGxpbWl0cyBhbmQgcHJvZ3Jlc3MgaW5kaWNhdGlvblxuICogQHJldHVybnMgUGF0aCB0byBleHRyYWN0ZWQgZGlyZWN0b3J5XG4gKiBAdGhyb3dzIEVycm9yIGlmIFpJUCBleGNlZWRzIHNpemUgbGltaXRzXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4dHJhY3RaaXBGaWxlKHppcFBhdGg6IHN0cmluZywgdmVyYm9zZTogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gRklYOiBWYWxpZGF0ZSBaSVAgZmlsZSBzaXplIEJFRk9SRSBleHRyYWN0aW9uIHRvIHByZXZlbnQgRG9TIGF0dGFja3NcbiAgICAvLyBQcmV2aW91c2x5OiBObyBzaXplIHZhbGlkYXRpb24sIGFsbG93aW5nIGV4dHJhY3Rpb24gb2YgYXJiaXRyYXJpbHkgbGFyZ2UgZmlsZXNcbiAgICAvLyBOb3c6IEVuZm9yY2UgMTAwTUIgWklQIHNpemUgbGltaXQgYW5kIDUwME1CIGV4dHJhY3RlZCBzaXplIGxpbWl0XG4gICAgY29uc3QgemlwU3RhdHMgPSBmcy5zdGF0U3luYyh6aXBQYXRoKTtcbiAgICBjb25zdCB6aXBTaXplID0gemlwU3RhdHMuc2l6ZTtcblxuICAgIC8vIFNFQ1VSSVRZIENIRUNLICh0eXBlc2NyaXB0OlM1MDQyKTogVmFsaWRhdGUgWklQIHNpemUgYmVmb3JlIGV4dHJhY3Rpb25cbiAgICBpZiAoemlwU2l6ZSA+IE1BWF9aSVBfU0laRV9CWVRFUykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgWklQIGZpbGUgdG9vIGxhcmdlOiAke2Zvcm1hdEJ5dGVzKHppcFNpemUpfS4gTWF4aW11bSBhbGxvd2VkOiAke2Zvcm1hdEJ5dGVzKE1BWF9aSVBfU0laRV9CWVRFUyl9LiBgICtcbiAgICAgICAgICAgIGBUaGlzIGxpbWl0IHByZXZlbnRzIERvUyBhdHRhY2tzIGFuZCBzeXN0ZW0gcmVzb3VyY2UgZXhoYXVzdGlvbi5gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcERpciA9IHBhdGguam9pbihvcy50bXBkaXIoKSwgYGRvbGxob3VzZS1leHRyYWN0LSR7RGF0ZS5ub3coKX1gKTtcblxuICAgIC8vIEZJWDogQWRkIHNlY3VyaXR5IGF1ZGl0IGxvZ2dpbmcgZm9yIFpJUCBvcGVyYXRpb25zXG4gICAgLy8gUHJldmlvdXNseTogTm8gbG9nZ2luZyBvZiBaSVAgZXh0cmFjdGlvbiBvcGVyYXRpb25zXG4gICAgLy8gTm93OiBMb2cgYWxsIFpJUCBvcGVyYXRpb25zIGZvciBzZWN1cml0eSBhdWRpdCB0cmFpbFxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ0ZJTEVfQ09QSUVEJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdjb252ZXJ0IENMSScsXG4gICAgICAgIGRldGFpbHM6IGBaSVAgZXh0cmFjdGlvbjogJHt6aXBQYXRofSAoJHtmb3JtYXRCeXRlcyh6aXBTaXplKX0pIC0+ICR7dGVtcERpcn1gXG4gICAgfSk7XG5cbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKCdcXG5FeHRyYWN0aW5nIFpJUCBmaWxlLi4uJykpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIFpJUDogJHt6aXBQYXRofWApKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBTaXplOiAke2Zvcm1hdEJ5dGVzKHppcFNpemUpfWApKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBUZW1wIGRpcjogJHt0ZW1wRGlyfWApKTtcbiAgICB9XG5cbiAgICAvLyBGSVg6IEFkZCBwcm9ncmVzcyBpbmRpY2F0b3IgZm9yIGxhcmdlIFpJUCBleHRyYWN0aW9uc1xuICAgIC8vIFByZXZpb3VzbHk6IE5vIGZlZWRiYWNrIGR1cmluZyBleHRyYWN0aW9uLCBwb29yIFVYIGZvciBsYXJnZSBmaWxlc1xuICAgIC8vIE5vdzogU2hvdyBwcm9ncmVzcyBtZXNzYWdlIGZvciBiZXR0ZXIgdXNlciBleHBlcmllbmNlXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBwcm9ncmVzc01lc3NhZ2UgPSB6aXBTaXplID4gUFJPR1JFU1NfVEhSRVNIT0xEX0JZVEVTID8gJ0V4dHJhY3RpbmcgKHRoaXMgbWF5IHRha2UgYSBtb21lbnQpLi4uJyA6ICdFeHRyYWN0aW5nLi4uJztcbiAgICBpZiAodmVyYm9zZSB8fCB6aXBTaXplID4gUFJPR1JFU1NfVEhSRVNIT0xEX0JZVEVTKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYCAgJHtwcm9ncmVzc01lc3NhZ2V9YCkpO1xuICAgIH1cblxuICAgIC8vIFNPTkFSQ0xPVUQgRklYICh0eXBlc2NyaXB0OlM1MDQyKTogQXJjaGl2ZSBleHRyYWN0aW9uIGlzIHNhZmUgaGVyZVxuICAgIC8vIC0gWklQIHNpemUgdmFsaWRhdGVkIChtYXggMTAwTUIpIGF0IGxpbmVzIDExMC0xMTQgdG8gcHJldmVudCBEb1NcbiAgICAvLyAtIEV4dHJhY3RlZCBzaXplIHZhbGlkYXRlZCAobWF4IDUwME1CKSBhdCBsaW5lcyAxNTEtMTU3IHRvIHByZXZlbnQgemlwIGJvbWJzXG4gICAgLy8gLSBFeHRyYWN0aW9uIHRvIGlzb2xhdGVkIHRlbXAgZGlyZWN0b3J5IChubyBwYXRoIHRyYXZlcnNhbCByaXNrKVxuICAgIC8vIC0gRnVsbCBjbGVhbnVwIGluIGZpbmFsbHkgYmxvY2sgcHJldmVudHMgcmVzb3VyY2UgbGVha3NcbiAgICBhd2FpdCBleHRyYWN0KHppcFBhdGgsIHsgZGlyOiB0ZW1wRGlyIH0pO1xuXG4gICAgY29uc3QgZXh0cmFjdFRpbWUgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgRXh0cmFjdGVkIGluICR7ZXh0cmFjdFRpbWV9bXNgKSk7XG4gICAgfVxuXG4gICAgLy8gU0VDVVJJVFkgQ0hFQ0sgKHR5cGVzY3JpcHQ6UzUwNDIpOiBWYWxpZGF0ZSBleHRyYWN0ZWQgc2l6ZSB0byBwcmV2ZW50IHppcCBib21iIGF0dGFja3NcbiAgICAvLyBaaXAgYm9tYnMgYXJlIG1hbGljaW91cyBhcmNoaXZlcyB0aGF0IGV4cGFuZCB0byBlbm9ybW91cyBzaXplcyAoZS5nLiwgNDJLQiDihpIgNC41UEIpXG4gICAgLy8gVGhpcyBjaGVjayBwcmV2ZW50cyBzeXN0ZW0gcmVzb3VyY2UgZXhoYXVzdGlvbiBmcm9tIG1hbGljaW91c2x5IGNvbXByZXNzZWQgZmlsZXNcbiAgICBjb25zdCBleHRyYWN0ZWRTaXplID0gY2FsY3VsYXRlRXh0cmFjdGVkU2l6ZSh0ZW1wRGlyKTtcbiAgICBpZiAoZXh0cmFjdGVkU2l6ZSA+IE1BWF9FWFRSQUNURURfU0laRV9CWVRFUykge1xuICAgICAgICAvLyBDbGVhbnVwIGJlZm9yZSB0aHJvd2luZyBlcnJvciB0byBwcmV2ZW50IHRlbXAgZmlsZSBhY2N1bXVsYXRpb25cbiAgICAgICAgZnMucm1TeW5jKHRlbXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEV4dHJhY3RlZCBjb250ZW50IHRvbyBsYXJnZTogJHtmb3JtYXRCeXRlcyhleHRyYWN0ZWRTaXplKX0uIE1heGltdW0gYWxsb3dlZDogJHtmb3JtYXRCeXRlcyhNQVhfRVhUUkFDVEVEX1NJWkVfQllURVMpfS4gVGhpcyBtYXkgYmUgYSB6aXAgYm9tYiBhdHRhY2suYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgRXh0cmFjdGVkIHNpemU6ICR7Zm9ybWF0Qnl0ZXMoZXh0cmFjdGVkU2l6ZSl9YCkpO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHNraWxsIGRpcmVjdG9yeSAoc2hvdWxkIGJlIHRoZSBvbmx5IHRvcC1sZXZlbCBkaXJlY3RvcnkpXG4gICAgY29uc3QgY29udGVudHMgPSBmcy5yZWFkZGlyU3luYyh0ZW1wRGlyKTtcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IGNvbnRlbnRzLmZpbHRlcihpdGVtID0+XG4gICAgICAgIGZzLnN0YXRTeW5jKHBhdGguam9pbih0ZW1wRGlyLCBpdGVtKSkuaXNEaXJlY3RvcnkoKVxuICAgICk7XG5cbiAgICBpZiAoZGlyZWN0b3JpZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIFJldHVybiB0aGUgc2tpbGwgZGlyZWN0b3J5IHBhdGhcbiAgICAgICAgcmV0dXJuIHBhdGguam9pbih0ZW1wRGlyLCBkaXJlY3Rvcmllc1swXSk7XG4gICAgfSBlbHNlIGlmIChjb250ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIElmIG11bHRpcGxlIGl0ZW1zIG9yIG5vIGRpcmVjdG9yeSwgcmV0dXJuIHRlbXAgZGlyIGl0c2VsZlxuICAgICAgICByZXR1cm4gdGVtcERpcjtcbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1pJUCBmaWxlIGFwcGVhcnMgdG8gYmUgZW1wdHknKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBmaWxlIGlzIGEgWklQIGZpbGUgYmFzZWQgb24gZXh0ZW5zaW9uXG4gKi9cbmZ1bmN0aW9uIGlzWmlwRmlsZShmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHBhdGguZXh0bmFtZShmaWxlUGF0aCkudG9Mb3dlckNhc2UoKSA9PT0gJy56aXAnO1xufVxuXG4vKipcbiAqIFByZXBhcmUgaW5wdXQgZm9yIGNvbnZlcnNpb24gKGhhbmRsZXMgYm90aCBkaXJlY3RvcmllcyBhbmQgWklQIGZpbGVzKVxuICogQHJldHVybnMge2FjdHVhbElucHV0LCB0ZW1wRGlyfSAtIGFjdHVhbElucHV0IGlzIHRoZSBkaXJlY3RvcnkgdG8gY29udmVydCwgdGVtcERpciBpcyB0aGUgdGVtcCBkaXIgdG8gY2xlYW51cCAob3IgbnVsbClcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUNvbnZlcnNpb25JbnB1dChcbiAgICBpbnB1dDogc3RyaW5nLFxuICAgIHZlcmJvc2U6IGJvb2xlYW5cbik6IFByb21pc2U8eyBhY3R1YWxJbnB1dDogc3RyaW5nOyB0ZW1wRGlyOiBzdHJpbmcgfCBudWxsIH0+IHtcbiAgICAvLyBWZXJpZnkgaW5wdXQgZXhpc3RzXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGlucHV0KSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgSW5wdXQgbm90IGZvdW5kOiAke2lucHV0fWApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBaSVAgZmlsZXNcbiAgICBpZiAoaXNaaXBGaWxlKGlucHV0KSkge1xuICAgICAgICBjb25zdCBhY3R1YWxJbnB1dCA9IGF3YWl0IGV4dHJhY3RaaXBGaWxlKGlucHV0LCB2ZXJib3NlKTtcbiAgICAgICAgY29uc3QgdGVtcERpciA9IHBhdGguZGlybmFtZShhY3R1YWxJbnB1dCk7XG4gICAgICAgIHJldHVybiB7IGFjdHVhbElucHV0LCB0ZW1wRGlyIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpcmVjdG9yaWVzXG4gICAgaWYgKCFmcy5zdGF0U3luYyhpbnB1dCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgSW5wdXQgbXVzdCBiZSBhIGRpcmVjdG9yeSBvciBaSVAgZmlsZTogJHtpbnB1dH1gKSk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBhY3R1YWxJbnB1dDogaW5wdXQsIHRlbXBEaXI6IG51bGwgfTtcbn1cblxuaW50ZXJmYWNlIENvbnZlcnRPcHRpb25zIHtcbiAgICBvdXRwdXQ/OiBzdHJpbmc7XG4gICAgdmVyYm9zZTogYm9vbGVhbjtcbiAgICByZXBvcnQ6IGJvb2xlYW47XG4gICAgZHJ5UnVuOiBib29sZWFuO1xuICAgIGJhY2t1cDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENvbnZlcnNpb25SZXBvcnQge1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIGRpcmVjdGlvbjogJ3RvLWFudGhyb3BpYycgfCAnZnJvbS1hbnRocm9waWMnO1xuICAgIGlucHV0OiBzdHJpbmc7XG4gICAgb3V0cHV0OiBzdHJpbmc7XG4gICAgZmlsZXNDcmVhdGVkOiBzdHJpbmdbXTtcbiAgICBvcGVyYXRpb25zUGVyZm9ybWVkOiBzdHJpbmdbXTtcbiAgICBzdWNjZXNzOiBib29sZWFuO1xuICAgIGVycm9yPzogc3RyaW5nO1xufVxuXG5wcm9ncmFtXG4gICAgLm5hbWUoJ2NvbnZlcnQnKVxuICAgIC5kZXNjcmlwdGlvbignQ29udmVydCBiZXR3ZWVuIEFudGhyb3BpYyBTa2lsbHMgYW5kIERvbGxob3VzZU1DUCBTa2lsbHMgZm9ybWF0cycpXG4gICAgLmNvbW1hbmQoJ3RvLWFudGhyb3BpYyA8aW5wdXQ+JylcbiAgICAuZGVzY3JpcHRpb24oJ0NvbnZlcnQgRG9sbGhvdXNlTUNQIHNraWxsIHRvIEFudGhyb3BpYyBTa2lsbHMgZm9ybWF0JylcbiAgICAub3B0aW9uKCctbywgLS1vdXRwdXQgPGRpcj4nLCAnT3V0cHV0IGRpcmVjdG9yeScsICcuL2FudGhyb3BpYy1za2lsbHMnKVxuICAgIC5vcHRpb24oJy12LCAtLXZlcmJvc2UnLCAnU2hvdyBkZXRhaWxlZCBjb252ZXJzaW9uIHN0ZXBzJywgZmFsc2UpXG4gICAgLm9wdGlvbignLXIsIC0tcmVwb3J0JywgJ0dlbmVyYXRlIGNvbnZlcnNpb24gcmVwb3J0JywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1kcnktcnVuJywgJ1ByZXZpZXcgY29udmVyc2lvbiB3aXRob3V0IGV4ZWN1dGluZycsIGZhbHNlKVxuICAgIC5hY3Rpb24oYXN5bmMgKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM6IENvbnZlcnRPcHRpb25zKSA9PiB7XG4gICAgICAgIGF3YWl0IGNvbnZlcnRUb0FudGhyb3BpYyhpbnB1dCwgb3B0aW9ucyk7XG4gICAgfSk7XG5cbnByb2dyYW1cbiAgICAuY29tbWFuZCgnZnJvbS1hbnRocm9waWMgPGlucHV0PicpXG4gICAgLmRlc2NyaXB0aW9uKCdDb252ZXJ0IEFudGhyb3BpYyBTa2lsbHMgdG8gRG9sbGhvdXNlTUNQIHNraWxsIGZvcm1hdCAoaW5wdXQgY2FuIGJlIGEgZGlyZWN0b3J5IG9yIFpJUCBmaWxlKScpXG4gICAgLm9wdGlvbignLW8sIC0tb3V0cHV0IDxkaXI+JywgJ091dHB1dCBkaXJlY3RvcnknLCBnZXREZWZhdWx0U2tpbGxzRGlyZWN0b3J5KCkpXG4gICAgLm9wdGlvbignLXYsIC0tdmVyYm9zZScsICdTaG93IGRldGFpbGVkIGNvbnZlcnNpb24gc3RlcHMnLCBmYWxzZSlcbiAgICAub3B0aW9uKCctciwgLS1yZXBvcnQnLCAnR2VuZXJhdGUgY29udmVyc2lvbiByZXBvcnQnLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLWRyeS1ydW4nLCAnUHJldmlldyBjb252ZXJzaW9uIHdpdGhvdXQgZXhlY3V0aW5nJywgZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAoaW5wdXQ6IHN0cmluZywgb3B0aW9uczogQ29udmVydE9wdGlvbnMpID0+IHtcbiAgICAgICAgYXdhaXQgY29udmVydEZyb21BbnRocm9waWMoaW5wdXQsIG9wdGlvbnMpO1xuICAgIH0pO1xuXG4vKipcbiAqIENvbnZlcnQgRG9sbGhvdXNlTUNQIHNraWxsIHRvIEFudGhyb3BpYyBmb3JtYXRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29udmVydFRvQW50aHJvcGljKGlucHV0OiBzdHJpbmcsIG9wdGlvbnM6IENvbnZlcnRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYIChETUNQLVNFQy0wMDQpOiBVc2UgVW5pY29kZVZhbGlkYXRvciB0byBub3JtYWxpemUgYWxsIHVzZXIgaW5wdXRcbiAgICAvLyBQcmV2aW91c2x5OiBVc2VkIGJ1aWx0LWluIG5vcm1hbGl6ZSgpIHdoaWNoIGRvZXNuJ3QgZGV0ZWN0IGhvbW9ncmFwaCBhdHRhY2tzXG4gICAgLy8gTm93OiBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSgpIGRldGVjdHMgYW5kIHByZXZlbnRzIGxvb2thbGlrZSBjaGFyYWN0ZXIgYXR0YWNrc1xuICAgIGNvbnN0IGlucHV0VmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGlucHV0KTtcbiAgICBpbnB1dCA9IGlucHV0VmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcblxuICAgIGlmIChvcHRpb25zLm91dHB1dCkge1xuICAgICAgICBjb25zdCBvdXRwdXRWYWxpZGF0aW9uID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUob3B0aW9ucy5vdXRwdXQpO1xuICAgICAgICBvcHRpb25zLm91dHB1dCA9IG91dHB1dFZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgbG9nT3BlcmF0aW9uKCd0by1hbnRocm9waWMnLCBpbnB1dCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gUmVhZCBpbnB1dCBmaWxlXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBJbnB1dCBmaWxlIG5vdCBmb3VuZDogJHtpbnB1dH1gKSk7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbnB1dENvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoaW5wdXQsICd1dGYtOCcpO1xuICAgICAgICBjb25zdCBza2lsbE5hbWUgPSBwYXRoLmJhc2VuYW1lKGlucHV0LCBwYXRoLmV4dG5hbWUoaW5wdXQpKTtcblxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKCdcXG5SZWFkaW5nIERvbGxob3VzZU1DUCBza2lsbC4uLicpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgSW5wdXQ6ICR7aW5wdXR9YCkpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBTaXplOiAke2lucHV0Q29udGVudC5sZW5ndGh9IGJ5dGVzYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydFxuICAgICAgICBjb25zdCBjb252ZXJ0ZXIgPSBuZXcgRG9sbGhvdXNlVG9BbnRocm9waWNDb252ZXJ0ZXIoKTtcbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uc0xvZzogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKCdcXG5Db252ZXJ0aW5nIHRvIEFudGhyb3BpYyBTa2lsbHMgZm9ybWF0Li4uJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RydWN0dXJlID0gYXdhaXQgY29udmVydGVyLmNvbnZlcnRTa2lsbChpbnB1dENvbnRlbnQpO1xuICAgICAgICBsb2dDb252ZXJzaW9uU3RlcHMoc3RydWN0dXJlLCBvcGVyYXRpb25zTG9nLCBvcHRpb25zLnZlcmJvc2UpO1xuXG4gICAgICAgIC8vIERldGVybWluZSBvdXRwdXQgZGlyZWN0b3J5IChjYW5vbmljYWwgY29udGFpbm1lbnQgcGVyICMyMzQ0KVxuICAgICAgICBjb25zdCBvdXRwdXRCYXNlID0gdmV0Q29udmVydE91dHB1dChvcHRpb25zLm91dHB1dCB8fCAnLi9hbnRocm9waWMtc2tpbGxzJyk7XG4gICAgICAgIGNvbnN0IG91dHB1dERpciA9IHJlc29sdmVQYXRoV2l0aGluQmFzZShvdXRwdXRCYXNlLCBza2lsbE5hbWUpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdcXG5bRFJZIFJVTl0gV291bGQgY3JlYXRlOicpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgT3V0cHV0IGRpcmVjdG9yeTogJHtvdXRwdXREaXJ9YCkpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBGaWxlczogJHtjb3VudEZpbGVzKHN0cnVjdHVyZSl9IGZpbGVzYCkpO1xuICAgICAgICAgICAgbGlzdEZpbGVzVG9DcmVhdGUoc3RydWN0dXJlKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIG91dHB1dFxuICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGBcXG5Xcml0aW5nIEFudGhyb3BpYyBza2lsbCB0bzogJHtvdXRwdXREaXJ9YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgY29udmVydGVyLndyaXRlVG9EaXJlY3Rvcnkoc3RydWN0dXJlLCBvdXRwdXREaXIpO1xuICAgICAgICBjb25zdCBmaWxlc0NyZWF0ZWQgPSBnZXRDcmVhdGVkRmlsZXMoc3RydWN0dXJlLCBvdXRwdXREaXIpO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIHJlcG9ydFxuICAgICAgICBpZiAob3B0aW9ucy5yZXBvcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydCA9IGdlbmVyYXRlUmVwb3J0KHtcbiAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICd0by1hbnRocm9waWMnLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0RGlyLFxuICAgICAgICAgICAgICAgIGZpbGVzQ3JlYXRlZCxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25zUGVyZm9ybWVkOiBvcGVyYXRpb25zTG9nLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXBvcnRQYXRoID0gcmVzb2x2ZVBhdGhXaXRoaW5CYXNlKG91dHB1dERpciwgJy5jb252ZXJzaW9uLXJlcG9ydC5tZCcpO1xuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZXBvcnRQYXRoLCByZXBvcnQpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgXFxuQ29udmVyc2lvbiByZXBvcnQ6ICR7cmVwb3J0UGF0aH1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWNjZXNzXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCdcXG7inJMgQ29udmVyc2lvbiBjb21wbGV0ZScpKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBDcmVhdGVkICR7ZmlsZXNDcmVhdGVkLmxlbmd0aH0gZmlsZShzKSBpbjogJHtvdXRwdXREaXJ9YCkpO1xuXG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXFxu4pyXIENvbnZlcnNpb24gZmFpbGVkOicpLCBlcnJvcik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2xlYW51cCB0ZW1wb3JhcnkgZGlyZWN0b3J5IHNhZmVseVxuICogU09OQVJDTE9VRCBGSVggKHR5cGVzY3JpcHQ6UzM3NzYpOiBFeHRyYWN0ZWQgZnJvbSBjb252ZXJ0RnJvbUFudGhyb3BpYyB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAqIFByZXZpb3VzbHk6IElubGluZSBjbGVhbnVwIGxvZ2ljIGFkZGVkIG5lc3RlZCBjb25kaXRpb25zIGluY3JlYXNpbmcgY29tcGxleGl0eVxuICogTm93OiBTZXBhcmF0ZSBmdW5jdGlvbiBoYW5kbGVzIGNsZWFudXAgd2l0aCBwcm9wZXIgZXJyb3IgaGFuZGxpbmdcbiAqL1xuZnVuY3Rpb24gY2xlYW51cFRlbXBEaXJlY3RvcnkodGVtcERpcjogc3RyaW5nIHwgbnVsbCwgdmVyYm9zZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0ZW1wRGlyICYmIGZzLmV4aXN0c1N5bmModGVtcERpcikpIHtcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYFxcbkNsZWFuaW5nIHVwIHRlbXBvcmFyeSBmaWxlcy4uLmApKTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZnMucm1TeW5jKHRlbXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgfSBjYXRjaCAoY2xlYW51cEVycm9yKSB7XG4gICAgICAgICAgICAvLyBMb2cgZXJyb3IgZGV0YWlscyBidXQgZG9uJ3QgZmFpbCBvbiBjbGVhbnVwIGVycm9yc1xuICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gY2xlYW51cEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBjbGVhbnVwRXJyb3IubWVzc2FnZSA6IFN0cmluZyhjbGVhbnVwRXJyb3IpO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGNoYWxrLnllbGxvdyhgV2FybmluZzogRmFpbGVkIHRvIGNsZWFudXAgdGVtcCBkaXJlY3Rvcnk6ICR7dGVtcERpcn0gLSAke2Vycm9yTWVzc2FnZX1gKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQ29udmVydCBBbnRocm9waWMgc2tpbGwgdG8gRG9sbGhvdXNlTUNQIGZvcm1hdFxuICovXG5hc3luYyBmdW5jdGlvbiBjb252ZXJ0RnJvbUFudGhyb3BpYyhpbnB1dDogc3RyaW5nLCBvcHRpb25zOiBDb252ZXJ0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWCAoRE1DUC1TRUMtMDA0KTogVXNlIFVuaWNvZGVWYWxpZGF0b3IgdG8gbm9ybWFsaXplIGFsbCB1c2VyIGlucHV0XG4gICAgLy8gUHJldmlvdXNseTogVXNlZCBidWlsdC1pbiBub3JtYWxpemUoKSB3aGljaCBkb2Vzbid0IGRldGVjdCBob21vZ3JhcGggYXR0YWNrc1xuICAgIC8vIE5vdzogVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUoKSBkZXRlY3RzIGFuZCBwcmV2ZW50cyBsb29rYWxpa2UgY2hhcmFjdGVyIGF0dGFja3NcbiAgICAvLyBFeGFtcGxlOiBcImZpbGVcXHUwMDQxLnR4dFwiIHZzIFwiZmlsZVxcdTAzMDFBLnR4dFwiIGJvdGggbG9vayBsaWtlIFwiZmlsZUEudHh0XCIgYnV0IGFyZSBkaWZmZXJlbnRcbiAgICBjb25zdCBpbnB1dFZhbGlkYXRpb24gPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShpbnB1dCk7XG4gICAgaW5wdXQgPSBpbnB1dFZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG5cbiAgICBpZiAob3B0aW9ucy5vdXRwdXQpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0VmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG9wdGlvbnMub3V0cHV0KTtcbiAgICAgICAgb3B0aW9ucy5vdXRwdXQgPSBvdXRwdXRWYWxpZGF0aW9uLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIH1cblxuICAgIGxldCB0ZW1wRGlyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICAgIGxvZ09wZXJhdGlvbignZnJvbS1hbnRocm9waWMnLCBpbnB1dCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gUHJlcGFyZSBpbnB1dCAoaGFuZGxlcyBib3RoIGRpcmVjdG9yaWVzIGFuZCBaSVAgZmlsZXMpXG4gICAgICAgIGNvbnN0IHsgYWN0dWFsSW5wdXQsIHRlbXBEaXI6IGV4dHJhY3RlZFRlbXBEaXIgfSA9IGF3YWl0IHByZXBhcmVDb252ZXJzaW9uSW5wdXQoaW5wdXQsIG9wdGlvbnMudmVyYm9zZSk7XG4gICAgICAgIHRlbXBEaXIgPSBleHRyYWN0ZWRUZW1wRGlyO1xuXG4gICAgICAgIGNvbnN0IHNraWxsTmFtZSA9IHBhdGguYmFzZW5hbWUoYWN0dWFsSW5wdXQpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoJ1xcblJlYWRpbmcgQW50aHJvcGljIHNraWxsLi4uJykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBJbnB1dDogJHthY3R1YWxJbnB1dH1gKSk7XG4gICAgICAgICAgICBsaXN0QW50aHJvcGljU3RydWN0dXJlKGFjdHVhbElucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnRcbiAgICAgICAgY29uc3QgY29udmVydGVyID0gbmV3IEFudGhyb3BpY1RvRG9sbGhvdXNlQ29udmVydGVyKCk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbnNMb2c6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZSgnXFxuQ29udmVydGluZyB0byBEb2xsaG91c2VNQ1AgU2tpbGxzIGZvcm1hdC4uLicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRvbGxob3VzZVNraWxsID0gYXdhaXQgY29udmVydGVyLmNvbnZlcnRTa2lsbChhY3R1YWxJbnB1dCk7XG4gICAgICAgIGxvZ1JldmVyc2VDb252ZXJzaW9uU3RlcHMoYWN0dWFsSW5wdXQsIG9wZXJhdGlvbnNMb2csIG9wdGlvbnMudmVyYm9zZSk7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIG91dHB1dCBmaWxlIChjYW5vbmljYWwgY29udGFpbm1lbnQgcGVyICMyMzQ0KVxuICAgICAgICBjb25zdCBvdXRwdXREaXIgPSB2ZXRDb252ZXJ0T3V0cHV0KG9wdGlvbnMub3V0cHV0IHx8IGdldERlZmF1bHRTa2lsbHNEaXJlY3RvcnkoKSk7XG4gICAgICAgIGNvbnN0IG91dHB1dEZpbGUgPSByZXNvbHZlUGF0aFdpdGhpbkJhc2Uob3V0cHV0RGlyLCBgJHtza2lsbE5hbWV9Lm1kYCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ1xcbltEUlkgUlVOXSBXb3VsZCBjcmVhdGU6JykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBPdXRwdXQgZmlsZTogJHtvdXRwdXRGaWxlfWApKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgU2l6ZTogJHtkb2xsaG91c2VTa2lsbC5sZW5ndGh9IGJ5dGVzYCkpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgb3V0cHV0XG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYFxcbldyaXRpbmcgRG9sbGhvdXNlTUNQIHNraWxsIHRvOiAke291dHB1dEZpbGV9YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG91dHB1dERpcikpIHtcbiAgICAgICAgICAgIGZzLm1rZGlyU3luYyhvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgY29udmVydGVyLndyaXRlVG9GaWxlKGRvbGxob3VzZVNraWxsLCBvdXRwdXRGaWxlKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSByZXBvcnRcbiAgICAgICAgaWYgKG9wdGlvbnMucmVwb3J0KSB7XG4gICAgICAgICAgICBjb25zdCByZXBvcnQgPSBnZW5lcmF0ZVJlcG9ydCh7XG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAnZnJvbS1hbnRocm9waWMnLFxuICAgICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICAgIG91dHB1dDogb3V0cHV0RmlsZSxcbiAgICAgICAgICAgICAgICBmaWxlc0NyZWF0ZWQ6IFtvdXRwdXRGaWxlXSxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25zUGVyZm9ybWVkOiBvcGVyYXRpb25zTG9nLFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWVcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCByZXBvcnRQYXRoID0gcmVzb2x2ZVBhdGhXaXRoaW5CYXNlKG91dHB1dERpciwgYCR7c2tpbGxOYW1lfS1jb252ZXJzaW9uLXJlcG9ydC5tZGApO1xuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZXBvcnRQYXRoLCByZXBvcnQpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgXFxuQ29udmVyc2lvbiByZXBvcnQ6ICR7cmVwb3J0UGF0aH1gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdWNjZXNzXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCdcXG7inJMgQ29udmVyc2lvbiBjb21wbGV0ZScpKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICBDcmVhdGVkOiAke291dHB1dEZpbGV9YCkpO1xuXG4gICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnXFxu4pyXIENvbnZlcnNpb24gZmFpbGVkOicpLCBlcnJvcik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICAvLyBTT05BUkNMT1VEIEZJWCAodHlwZXNjcmlwdDpTMzc3Nik6IFVzZSBleHRyYWN0ZWQgY2xlYW51cCBmdW5jdGlvbiB0byByZWR1Y2UgY29tcGxleGl0eVxuICAgICAgICAvLyBGSVg6IEVuc3VyZSBjbGVhbnVwIGhhcHBlbnMgb24gYm90aCBzdWNjZXNzIGFuZCBmYWlsdXJlXG4gICAgICAgIC8vIFByZXZpb3VzbHk6IENsZWFudXAgb25seSBvbiBzdWNjZXNzIHBhdGhcbiAgICAgICAgLy8gTm93OiBDbGVhbnVwIGluIGZpbmFsbHkgYmxvY2sgdG8gaGFuZGxlIGFsbCBlcnJvciBzY2VuYXJpb3NcbiAgICAgICAgY2xlYW51cFRlbXBEaXJlY3RvcnkodGVtcERpciwgb3B0aW9ucy52ZXJib3NlKTtcbiAgICB9XG59XG5cbi8qKlxuICogTG9nIGNvbnZlcnNpb24gb3BlcmF0aW9uIGZvciBzZWN1cml0eSBhdWRpdFxuICovXG5mdW5jdGlvbiBsb2dPcGVyYXRpb24oZGlyZWN0aW9uOiBzdHJpbmcsIGlucHV0OiBzdHJpbmcsIG9wdGlvbnM6IENvbnZlcnRPcHRpb25zKTogdm9pZCB7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnRklMRV9DT1BJRUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ2NvbnZlcnQgQ0xJJyxcbiAgICAgICAgZGV0YWlsczogYENvbnZlcnNpb24gJHtkaXJlY3Rpb259OiAke2lucHV0fSAoZHJ5LXJ1bjogJHtvcHRpb25zLmRyeVJ1bn0pYFxuICAgIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBsb2cgZGlyZWN0b3J5IG9wZXJhdGlvbnMgd2l0aCBvcHRpb25hbCBmaWxlIGxpc3RpbmdcbiAqL1xuZnVuY3Rpb24gbG9nRGlyZWN0b3J5T3BlcmF0aW9uKFxuICAgIHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUsXG4gICAgb3B0aW9uczoge1xuICAgICAgICBkaXJLZXk6IGtleW9mIEFudGhyb3BpY1NraWxsU3RydWN0dXJlO1xuICAgICAgICBkaXJOYW1lOiBzdHJpbmc7XG4gICAgICAgIGFjdGlvbjogc3RyaW5nO1xuICAgICAgICBpdGVtVHlwZTogc3RyaW5nO1xuICAgICAgICBvcGVyYXRpb25zTG9nOiBzdHJpbmdbXTtcbiAgICAgICAgdmVyYm9zZTogYm9vbGVhbjtcbiAgICAgICAgbGlzdEZpbGVzPzogYm9vbGVhbjtcbiAgICB9XG4pOiB2b2lkIHtcbiAgICBjb25zdCB7IGRpcktleSwgZGlyTmFtZSwgYWN0aW9uLCBpdGVtVHlwZSwgb3BlcmF0aW9uc0xvZywgdmVyYm9zZSwgbGlzdEZpbGVzID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICBpZiAoc3RydWN0dXJlW2RpcktleV0pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBzdHJ1Y3R1cmVbZGlyS2V5XSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgICBjb25zdCBjb3VudCA9IE9iamVjdC5rZXlzKGl0ZW1zKS5sZW5ndGg7XG4gICAgICAgIG9wZXJhdGlvbnNMb2cucHVzaChgJHthY3Rpb259ICR7Y291bnR9ICR7aXRlbVR5cGV9KHMpIHRvICR7ZGlyTmFtZX0vYCk7XG5cbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAg4pyTICR7YWN0aW9ufSAke2NvdW50fSAke2l0ZW1UeXBlfShzKWApKTtcbiAgICAgICAgICAgIGlmIChsaXN0RmlsZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIE9iamVjdC5rZXlzKGl0ZW1zKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgICAgLSAke2Rpck5hbWV9LyR7ZmlsZW5hbWV9YCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBMb2cgY29udmVyc2lvbiBzdGVwcyBkdXJpbmcgdG8tYW50aHJvcGljIGNvbnZlcnNpb25cbiAqL1xuZnVuY3Rpb24gbG9nQ29udmVyc2lvblN0ZXBzKFxuICAgIHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUsXG4gICAgb3BlcmF0aW9uc0xvZzogc3RyaW5nW10sXG4gICAgdmVyYm9zZTogYm9vbGVhblxuKTogdm9pZCB7XG4gICAgLy8gTG9nIFNLSUxMLm1kXG4gICAgb3BlcmF0aW9uc0xvZy5wdXNoKCdDcmVhdGVkIFNLSUxMLm1kIHdpdGggc2ltcGxpZmllZCBtZXRhZGF0YScpO1xuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAg4pyTIENyZWF0ZWQgU0tJTEwubWQnKSk7XG4gICAgfVxuXG4gICAgLy8gTG9nIGRpcmVjdG9yeSBvcGVyYXRpb25zXG4gICAgbG9nRGlyZWN0b3J5T3BlcmF0aW9uKHN0cnVjdHVyZSwge1xuICAgICAgICBkaXJLZXk6ICdzY3JpcHRzLycsXG4gICAgICAgIGRpck5hbWU6ICdzY3JpcHRzJyxcbiAgICAgICAgYWN0aW9uOiAnRXh0cmFjdGVkJyxcbiAgICAgICAgaXRlbVR5cGU6ICdzY3JpcHQnLFxuICAgICAgICBvcGVyYXRpb25zTG9nLFxuICAgICAgICB2ZXJib3NlLFxuICAgICAgICBsaXN0RmlsZXM6IHRydWVcbiAgICB9KTtcbiAgICBsb2dEaXJlY3RvcnlPcGVyYXRpb24oc3RydWN0dXJlLCB7XG4gICAgICAgIGRpcktleTogJ3JlZmVyZW5jZS8nLFxuICAgICAgICBkaXJOYW1lOiAncmVmZXJlbmNlJyxcbiAgICAgICAgYWN0aW9uOiAnRXh0cmFjdGVkJyxcbiAgICAgICAgaXRlbVR5cGU6ICdyZWZlcmVuY2UgZG9jdW1lbnQnLFxuICAgICAgICBvcGVyYXRpb25zTG9nLFxuICAgICAgICB2ZXJib3NlLFxuICAgICAgICBsaXN0RmlsZXM6IHRydWVcbiAgICB9KTtcbiAgICBsb2dEaXJlY3RvcnlPcGVyYXRpb24oc3RydWN0dXJlLCB7XG4gICAgICAgIGRpcktleTogJ2V4YW1wbGVzLycsXG4gICAgICAgIGRpck5hbWU6ICdleGFtcGxlcycsXG4gICAgICAgIGFjdGlvbjogJ0V4dHJhY3RlZCcsXG4gICAgICAgIGl0ZW1UeXBlOiAnZXhhbXBsZScsXG4gICAgICAgIG9wZXJhdGlvbnNMb2csXG4gICAgICAgIHZlcmJvc2VcbiAgICB9KTtcbiAgICBsb2dEaXJlY3RvcnlPcGVyYXRpb24oc3RydWN0dXJlLCB7XG4gICAgICAgIGRpcktleTogJ3RoZW1lcy8nLFxuICAgICAgICBkaXJOYW1lOiAndGhlbWVzJyxcbiAgICAgICAgYWN0aW9uOiAnRXh0cmFjdGVkJyxcbiAgICAgICAgaXRlbVR5cGU6ICd0ZW1wbGF0ZScsXG4gICAgICAgIG9wZXJhdGlvbnNMb2csXG4gICAgICAgIHZlcmJvc2VcbiAgICB9KTtcblxuICAgIC8vIExvZyBtZXRhZGF0YSBwcmVzZXJ2YXRpb25cbiAgICBpZiAoc3RydWN0dXJlWydtZXRhZGF0YS8nXSkge1xuICAgICAgICBvcGVyYXRpb25zTG9nLnB1c2goJ1ByZXNlcnZlZCBmdWxsIERvbGxob3VzZU1DUCBtZXRhZGF0YSB0byBtZXRhZGF0YS9kb2xsaG91c2UueWFtbCcpO1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICDinJMgUHJlc2VydmVkIG1ldGFkYXRhIGZvciBwZXJmZWN0IHJvdW5kdHJpcCcpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gbG9nIGRpcmVjdG9yeSBvcGVyYXRpb25zIGZvciByZXZlcnNlIGNvbnZlcnNpb24gKGZyb20tYW50aHJvcGljKVxuICovXG5mdW5jdGlvbiBsb2dSZXZlcnNlRGlyZWN0b3J5T3BlcmF0aW9uKFxuICAgIGlucHV0RGlyOiBzdHJpbmcsXG4gICAgZGlyTmFtZTogc3RyaW5nLFxuICAgIGl0ZW1UeXBlOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uc0xvZzogc3RyaW5nW10sXG4gICAgdmVyYm9zZTogYm9vbGVhblxuKTogdm9pZCB7XG4gICAgY29uc3QgZGlyUGF0aCA9IHBhdGguam9pbihpbnB1dERpciwgZGlyTmFtZSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3QgY291bnQgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKS5sZW5ndGg7XG4gICAgICAgIG9wZXJhdGlvbnNMb2cucHVzaChgQ29tYmluZWQgJHtjb3VudH0gJHtpdGVtVHlwZX0ocykke2l0ZW1UeXBlID09PSAnc2NyaXB0JyA/ICcgYXMgY29kZSBibG9ja3MnIDogJyd9YCk7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIOKckyBDb21iaW5lZCAke2NvdW50fSAke2l0ZW1UeXBlfShzKWApKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBMb2cgY29udmVyc2lvbiBzdGVwcyBkdXJpbmcgZnJvbS1hbnRocm9waWMgY29udmVyc2lvblxuICovXG5mdW5jdGlvbiBsb2dSZXZlcnNlQ29udmVyc2lvblN0ZXBzKFxuICAgIGlucHV0RGlyOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uc0xvZzogc3RyaW5nW10sXG4gICAgdmVyYm9zZTogYm9vbGVhblxuKTogdm9pZCB7XG4gICAgb3BlcmF0aW9uc0xvZy5wdXNoKCdSZWFkIFNLSUxMLm1kIG1ldGFkYXRhJywgJ0VucmljaGVkIG1ldGFkYXRhIHdpdGggRG9sbGhvdXNlTUNQIGZpZWxkcycpO1xuXG4gICAgLy8gTG9nIGRpcmVjdG9yeSBvcGVyYXRpb25zIHVzaW5nIGhlbHBlclxuICAgIGxvZ1JldmVyc2VEaXJlY3RvcnlPcGVyYXRpb24oaW5wdXREaXIsICdzY3JpcHRzJywgJ3NjcmlwdCcsIG9wZXJhdGlvbnNMb2csIHZlcmJvc2UpO1xuICAgIGxvZ1JldmVyc2VEaXJlY3RvcnlPcGVyYXRpb24oaW5wdXREaXIsICdyZWZlcmVuY2UnLCAncmVmZXJlbmNlIGRvY3VtZW50Jywgb3BlcmF0aW9uc0xvZywgdmVyYm9zZSk7XG4gICAgbG9nUmV2ZXJzZURpcmVjdG9yeU9wZXJhdGlvbihpbnB1dERpciwgJ2V4YW1wbGVzJywgJ2V4YW1wbGUnLCBvcGVyYXRpb25zTG9nLCB2ZXJib3NlKTtcbiAgICBsb2dSZXZlcnNlRGlyZWN0b3J5T3BlcmF0aW9uKGlucHV0RGlyLCAndGhlbWVzJywgJ3RlbXBsYXRlJywgb3BlcmF0aW9uc0xvZywgdmVyYm9zZSk7XG5cbiAgICAvLyBIYW5kbGUgbWV0YWRhdGEgcmVzdG9yYXRpb25cbiAgICBpZiAoZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4oaW5wdXREaXIsICdtZXRhZGF0YScpKSkge1xuICAgICAgICBvcGVyYXRpb25zTG9nLnB1c2goJ1Jlc3RvcmVkIG9yaWdpbmFsIERvbGxob3VzZU1DUCBtZXRhZGF0YSBmcm9tIG1ldGFkYXRhL2RvbGxob3VzZS55YW1sJyk7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIOKckyBSZXN0b3JlZCBvcmlnaW5hbCBtZXRhZGF0YSAocGVyZmVjdCByb3VuZHRyaXApJykpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vKipcbiAqIExpc3QgQW50aHJvcGljIHNraWxsIGRpcmVjdG9yeSBzdHJ1Y3R1cmVcbiAqL1xuZnVuY3Rpb24gbGlzdEFudGhyb3BpY1N0cnVjdHVyZShpbnB1dERpcjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc3ViZGlycyA9IFsnc2NyaXB0cycsICdyZWZlcmVuY2UnLCAnZXhhbXBsZXMnLCAndGhlbWVzJywgJ21ldGFkYXRhJ107XG4gICAgZm9yIChjb25zdCBzdWJkaXIgb2Ygc3ViZGlycykge1xuICAgICAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5qb2luKGlucHV0RGlyLCBzdWJkaXIpO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhkaXJQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgJHtzdWJkaXJ9LzogJHtmaWxlcy5sZW5ndGh9IGZpbGUocylgKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQ291bnQgdG90YWwgZmlsZXMgaW4gQW50aHJvcGljIHN0cnVjdHVyZVxuICovXG5mdW5jdGlvbiBjb3VudEZpbGVzKHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUpOiBudW1iZXIge1xuICAgIGxldCBjb3VudCA9IDE7IC8vIFNLSUxMLm1kXG5cbiAgICBpZiAoc3RydWN0dXJlWydzY3JpcHRzLyddKSBjb3VudCArPSBPYmplY3Qua2V5cyhzdHJ1Y3R1cmVbJ3NjcmlwdHMvJ10pLmxlbmd0aDtcbiAgICBpZiAoc3RydWN0dXJlWydyZWZlcmVuY2UvJ10pIGNvdW50ICs9IE9iamVjdC5rZXlzKHN0cnVjdHVyZVsncmVmZXJlbmNlLyddKS5sZW5ndGg7XG4gICAgaWYgKHN0cnVjdHVyZVsnZXhhbXBsZXMvJ10pIGNvdW50ICs9IE9iamVjdC5rZXlzKHN0cnVjdHVyZVsnZXhhbXBsZXMvJ10pLmxlbmd0aDtcbiAgICBpZiAoc3RydWN0dXJlWyd0aGVtZXMvJ10pIGNvdW50ICs9IE9iamVjdC5rZXlzKHN0cnVjdHVyZVsndGhlbWVzLyddKS5sZW5ndGg7XG4gICAgaWYgKHN0cnVjdHVyZVsnTElDRU5TRS50eHQnXSkgY291bnQgKz0gMTtcblxuICAgIHJldHVybiBjb3VudDtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIHRocm91Z2ggYWxsIGZpbGVzIGluIGFuIEFudGhyb3BpYyBzdHJ1Y3R1cmVcbiAqIEV4ZWN1dGVzIGEgY2FsbGJhY2sgZm9yIGVhY2ggZmlsZSBmb3VuZFxuICovXG5mdW5jdGlvbiBpdGVyYXRlU3RydWN0dXJlRmlsZXMoXG4gICAgc3RydWN0dXJlOiBBbnRocm9waWNTa2lsbFN0cnVjdHVyZSxcbiAgICBjYWxsYmFjazogKGRpck5hbWU6IHN0cmluZyB8IG51bGwsIGZpbGVuYW1lOiBzdHJpbmcpID0+IHZvaWRcbik6IHZvaWQge1xuICAgIC8vIEFsd2F5cyBpbmNsdWRlIFNLSUxMLm1kXG4gICAgY2FsbGJhY2sobnVsbCwgJ1NLSUxMLm1kJyk7XG5cbiAgICAvLyBJdGVyYXRlIHRocm91Z2ggZGlyZWN0b3JpZXNcbiAgICBjb25zdCBkaXJlY3RvcmllcyA9IFsnc2NyaXB0cy8nLCAncmVmZXJlbmNlLycsICdleGFtcGxlcy8nLCAndGhlbWVzLycsICdtZXRhZGF0YS8nXSBhcyBjb25zdDtcbiAgICBmb3IgKGNvbnN0IGRpciBvZiBkaXJlY3Rvcmllcykge1xuICAgICAgICBjb25zdCBkaXJDb250ZW50ID0gc3RydWN0dXJlW2Rpcl07XG4gICAgICAgIGlmIChkaXJDb250ZW50KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIE9iamVjdC5rZXlzKGRpckNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZGlyLnNsaWNlKDAsIC0xKSwgZmlsZW5hbWUpOyAvLyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBMSUNFTlNFLnR4dFxuICAgIGlmIChzdHJ1Y3R1cmVbJ0xJQ0VOU0UudHh0J10pIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgJ0xJQ0VOU0UudHh0Jyk7XG4gICAgfVxufVxuXG4vKipcbiAqIExpc3QgZmlsZXMgdGhhdCB3b3VsZCBiZSBjcmVhdGVkIChkcnktcnVuIG1vZGUpXG4gKi9cbmZ1bmN0aW9uIGxpc3RGaWxlc1RvQ3JlYXRlKHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUpOiB2b2lkIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIEZpbGVzOicpKTtcbiAgICBpdGVyYXRlU3RydWN0dXJlRmlsZXMoc3RydWN0dXJlLCAoZGlyTmFtZSwgZmlsZW5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBkaXJOYW1lID8gYCR7ZGlyTmFtZX0vJHtmaWxlbmFtZX1gIDogZmlsZW5hbWU7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYCAgICAtICR7ZmlsZVBhdGh9YCkpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEdldCBsaXN0IG9mIGNyZWF0ZWQgZmlsZXNcbiAqL1xuZnVuY3Rpb24gZ2V0Q3JlYXRlZEZpbGVzKHN0cnVjdHVyZTogQW50aHJvcGljU2tpbGxTdHJ1Y3R1cmUsIG91dHB1dERpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGl0ZXJhdGVTdHJ1Y3R1cmVGaWxlcyhzdHJ1Y3R1cmUsIChkaXJOYW1lLCBmaWxlbmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IGRpck5hbWVcbiAgICAgICAgICAgID8gcmVzb2x2ZVBhdGhXaXRoaW5CYXNlKG91dHB1dERpciwgZGlyTmFtZSwgZmlsZW5hbWUpXG4gICAgICAgICAgICA6IHJlc29sdmVQYXRoV2l0aGluQmFzZShvdXRwdXREaXIsIGZpbGVuYW1lKTtcbiAgICAgICAgZmlsZXMucHVzaChmaWxlUGF0aCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbGVzO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGNvbnZlcnNpb24gcmVwb3J0XG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlUmVwb3J0KGRhdGE6IENvbnZlcnNpb25SZXBvcnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJyMgU2tpbGwgQ29udmVyc2lvbiBSZXBvcnQnLFxuICAgICAgICAnJyxcbiAgICAgICAgYCoqVGltZXN0YW1wKio6ICR7ZGF0YS50aW1lc3RhbXB9YCxcbiAgICAgICAgYCoqRGlyZWN0aW9uKio6ICR7ZGF0YS5kaXJlY3Rpb259YCxcbiAgICAgICAgYCoqU3RhdHVzKio6ICR7ZGF0YS5zdWNjZXNzID8gJ+KckyBTdWNjZXNzJyA6ICfinJcgRmFpbGVkJ31gLFxuICAgICAgICAnJyxcbiAgICAgICAgJyMjIElucHV0L091dHB1dCcsXG4gICAgICAgICcnLFxuICAgICAgICBgKipJbnB1dCoqOiBcXGAke2RhdGEuaW5wdXR9XFxgYCxcbiAgICAgICAgYCoqT3V0cHV0Kio6IFxcYCR7ZGF0YS5vdXRwdXR9XFxgYCxcbiAgICAgICAgJydcbiAgICBdO1xuXG4gICAgaWYgKGRhdGEuZmlsZXNDcmVhdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGluZXMucHVzaCgnIyMgRmlsZXMgQ3JlYXRlZCcsICcnLCAuLi5kYXRhLmZpbGVzQ3JlYXRlZC5tYXAoZmlsZSA9PiBgLSBcXGAke2ZpbGV9XFxgYCksICcnKTtcbiAgICB9XG5cbiAgICBsaW5lcy5wdXNoKCcjIyBPcGVyYXRpb25zIFBlcmZvcm1lZCcsICcnLCAuLi5kYXRhLm9wZXJhdGlvbnNQZXJmb3JtZWQubWFwKG9wZXJhdGlvbiA9PiBgLSAke29wZXJhdGlvbn1gKSwgJycpO1xuXG4gICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgbGluZXMucHVzaCgnIyMgRXJyb3InLCAnJywgJ2BgYCcsIGRhdGEuZXJyb3IsICdgYGAnLCAnJyk7XG4gICAgfVxuXG4gICAgbGluZXMucHVzaCgnLS0tJywgJycsICcqR2VuZXJhdGVkIGJ5IERvbGxob3VzZU1DUCBDb252ZXJ0ZXIqJyk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8vIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcbnByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTtcbiJdfQ==
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export declare const PACKAGE_VERSION = "2.0.
|
|
6
|
-
export declare const BUILD_TIMESTAMP = "2026-07-
|
|
5
|
+
export declare const PACKAGE_VERSION = "2.0.38";
|
|
6
|
+
export declare const BUILD_TIMESTAMP = "2026-07-04T18:50:30.630Z";
|
|
7
7
|
export declare const BUILD_TYPE: 'npm' | 'git';
|
|
8
8
|
export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
|
|
9
9
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export const PACKAGE_VERSION = '2.0.
|
|
6
|
-
export const BUILD_TIMESTAMP = '2026-07-
|
|
5
|
+
export const PACKAGE_VERSION = '2.0.38';
|
|
6
|
+
export const BUILD_TIMESTAMP = '2026-07-04T18:50:30.630Z';
|
|
7
7
|
export const BUILD_TYPE = 'npm';
|
|
8
8
|
export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcyLjAuMzgnO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RJTUVTVEFNUCA9ICcyMDI2LTA3LTA0VDE4OjUwOjMwLjYzMFonO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RZUEU6ICducG0nIHwgJ2dpdCcgPSAnbnBtJztcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSAnQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJztcbiJdfQ==
|
|
@@ -3,7 +3,50 @@
|
|
|
3
3
|
* directory. This is separator-aware, so sibling paths such as `/tmp/base2`
|
|
4
4
|
* are not treated as children of `/tmp/base`. Existing symlinked base paths
|
|
5
5
|
* and symlinked descendants under the base are rejected because writes would
|
|
6
|
-
* follow them outside the lexical containment boundary.
|
|
6
|
+
* follow them outside the lexical containment boundary. A base that does not
|
|
7
|
+
* exist yet is vetted through its nearest existing ancestor: if that ancestor
|
|
8
|
+
* is a symlink, the recursive mkdir/write that follows would be redirected
|
|
9
|
+
* outside the intended tree, so it is rejected too (#2342).
|
|
10
|
+
*
|
|
11
|
+
* CONTRACT (#2344): the base's own ancestry can only be best-effort vetted
|
|
12
|
+
* here — a symlink whose target pre-contains matching subdirectories is not
|
|
13
|
+
* detectable without a caller-known boundary (see nearestExistingAncestorStats
|
|
14
|
+
* for why walking every ancestor false-positives on system symlinks). Do NOT
|
|
15
|
+
* pass user-controlled base paths directly to this function: vet them first
|
|
16
|
+
* with vetOutputBase(), which contains them canonically against an anchor and
|
|
17
|
+
* returns the canonical base to use here. Every current caller does this.
|
|
7
18
|
*/
|
|
8
19
|
export declare function resolvePathWithinBase(baseDir: string, ...segments: string[]): string;
|
|
20
|
+
/**
|
|
21
|
+
* Canonical (realpath) form of a path that may not fully exist yet: the
|
|
22
|
+
* deepest existing ancestor is resolved through every symlink, and the
|
|
23
|
+
* not-yet-created suffix is appended unchanged. This answers "where would a
|
|
24
|
+
* recursive mkdir/write on this path REALLY land?" — which per-component
|
|
25
|
+
* lstat checks cannot, because lstat resolves intermediate symlinks and only
|
|
26
|
+
* reports on the final component (#2344).
|
|
27
|
+
*/
|
|
28
|
+
export declare function canonicalizePath(inputPath: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Vets a user-supplied output base for CLI writes and returns the canonical
|
|
31
|
+
* path all subsequent writes should use (#2344).
|
|
32
|
+
*
|
|
33
|
+
* Two regimes, split by what the user lexically named:
|
|
34
|
+
*
|
|
35
|
+
* - Base inside the anchor (relative outputs like the './anthropic-skills'
|
|
36
|
+
* default): the canonical base must stay inside the canonical anchor.
|
|
37
|
+
* A symlink that redirects it elsewhere — including one whose target
|
|
38
|
+
* already contains matching subdirectories, the case per-component lstat
|
|
39
|
+
* checks miss — is rejected. Comparing in canonical space means system
|
|
40
|
+
* links above the anchor (macOS /tmp -> /private/tmp) never false-positive.
|
|
41
|
+
*
|
|
42
|
+
* - Base outside the anchor (explicit absolute or ../ outputs): the user
|
|
43
|
+
* named that destination, so there is no boundary to defend. Instead of
|
|
44
|
+
* guessing intent, the real destination is disclosed via `onDisclose`
|
|
45
|
+
* whenever it differs from the lexical path, and the canonical path is
|
|
46
|
+
* returned so what was vetted is what gets written.
|
|
47
|
+
*/
|
|
48
|
+
export declare function vetOutputBase(baseDir: string, options?: {
|
|
49
|
+
anchor?: string;
|
|
50
|
+
onDisclose?: (canonicalBase: string) => void;
|
|
51
|
+
}): string;
|
|
9
52
|
//# sourceMappingURL=pathSecurity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pathSecurity.d.ts","sourceRoot":"","sources":["../../src/utils/pathSecurity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pathSecurity.d.ts","sourceRoot":"","sources":["../../src/utils/pathSecurity.ts"],"names":[],"mappings":"AAkFA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CA4BpF;AASD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAsB1D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GAC1E,MAAM,CA0BR"}
|
|
@@ -1,21 +1,65 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
+
function isMissingPathError(error) {
|
|
4
|
+
const code = typeof error === 'object' && error !== null && 'code' in error
|
|
5
|
+
? error.code
|
|
6
|
+
: undefined;
|
|
7
|
+
return code === 'ENOENT' || code === 'ENOTDIR';
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* lstat of the deepest ancestor of `startPath` that exists, or null when
|
|
11
|
+
* nothing up to the filesystem root exists. Used to vet paths that will be
|
|
12
|
+
* created later: their containment depends on the directory they will be
|
|
13
|
+
* created inside.
|
|
14
|
+
*
|
|
15
|
+
* KNOWN LIMIT (#2344): this stops at the first ancestor lstat can see, and
|
|
16
|
+
* lstat resolves intermediate symlinks — so a symlink whose target already
|
|
17
|
+
* contains a matching subdirectory is reported as a plain directory and the
|
|
18
|
+
* symlink component itself is never inspected. Walking every lexical ancestor
|
|
19
|
+
* instead is not an option: system symlinks (macOS /tmp -> /private/tmp,
|
|
20
|
+
* /var -> /private/var) sit above every temp path and would false-positive.
|
|
21
|
+
* Full protection needs a caller-known boundary, which is exactly what
|
|
22
|
+
* vetOutputBase() provides — see the contract note on resolvePathWithinBase.
|
|
23
|
+
*/
|
|
24
|
+
function nearestExistingAncestorStats(startPath) {
|
|
25
|
+
let previous = startPath;
|
|
26
|
+
let current = path.dirname(startPath);
|
|
27
|
+
while (current !== previous) {
|
|
28
|
+
try {
|
|
29
|
+
return fs.lstatSync(current);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (!isMissingPathError(error)) {
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
previous = current;
|
|
37
|
+
current = path.dirname(current);
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
3
41
|
function assertNotSymlink(pathToCheck, message) {
|
|
42
|
+
let stats;
|
|
4
43
|
try {
|
|
5
|
-
|
|
6
|
-
if (stats.isSymbolicLink()) {
|
|
7
|
-
throw new Error(message);
|
|
8
|
-
}
|
|
44
|
+
stats = fs.lstatSync(pathToCheck);
|
|
9
45
|
}
|
|
10
46
|
catch (error) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
47
|
+
if (isMissingPathError(error)) {
|
|
48
|
+
// The path does not exist yet, so it will be created by a later
|
|
49
|
+
// mkdir/write. That is only safe if the directory it gets created
|
|
50
|
+
// inside is real: a symlinked existing ancestor would redirect the
|
|
51
|
+
// recursive create outside the containment boundary (#2342).
|
|
52
|
+
const ancestorStats = nearestExistingAncestorStats(pathToCheck);
|
|
53
|
+
if (ancestorStats?.isSymbolicLink()) {
|
|
54
|
+
throw new Error(message);
|
|
55
|
+
}
|
|
15
56
|
return;
|
|
16
57
|
}
|
|
17
58
|
throw error;
|
|
18
59
|
}
|
|
60
|
+
if (stats.isSymbolicLink()) {
|
|
61
|
+
throw new Error(message);
|
|
62
|
+
}
|
|
19
63
|
}
|
|
20
64
|
function assertNoSymlinkedDescendants(resolvedBase, resolvedTarget) {
|
|
21
65
|
const relativePath = path.relative(resolvedBase, resolvedTarget);
|
|
@@ -36,7 +80,18 @@ function assertNoSymlinkedDescendants(resolvedBase, resolvedTarget) {
|
|
|
36
80
|
* directory. This is separator-aware, so sibling paths such as `/tmp/base2`
|
|
37
81
|
* are not treated as children of `/tmp/base`. Existing symlinked base paths
|
|
38
82
|
* and symlinked descendants under the base are rejected because writes would
|
|
39
|
-
* follow them outside the lexical containment boundary.
|
|
83
|
+
* follow them outside the lexical containment boundary. A base that does not
|
|
84
|
+
* exist yet is vetted through its nearest existing ancestor: if that ancestor
|
|
85
|
+
* is a symlink, the recursive mkdir/write that follows would be redirected
|
|
86
|
+
* outside the intended tree, so it is rejected too (#2342).
|
|
87
|
+
*
|
|
88
|
+
* CONTRACT (#2344): the base's own ancestry can only be best-effort vetted
|
|
89
|
+
* here — a symlink whose target pre-contains matching subdirectories is not
|
|
90
|
+
* detectable without a caller-known boundary (see nearestExistingAncestorStats
|
|
91
|
+
* for why walking every ancestor false-positives on system symlinks). Do NOT
|
|
92
|
+
* pass user-controlled base paths directly to this function: vet them first
|
|
93
|
+
* with vetOutputBase(), which contains them canonically against an anchor and
|
|
94
|
+
* returns the canonical base to use here. Every current caller does this.
|
|
40
95
|
*/
|
|
41
96
|
export function resolvePathWithinBase(baseDir, ...segments) {
|
|
42
97
|
if (!baseDir || typeof baseDir !== 'string') {
|
|
@@ -63,4 +118,83 @@ export function resolvePathWithinBase(baseDir, ...segments) {
|
|
|
63
118
|
}
|
|
64
119
|
throw new Error('Resolved path escapes the base directory');
|
|
65
120
|
}
|
|
66
|
-
|
|
121
|
+
/** True when a base-relative path points outside the base. */
|
|
122
|
+
function escapesBase(relativePath) {
|
|
123
|
+
return relativePath === '..'
|
|
124
|
+
|| relativePath.startsWith('..' + path.sep)
|
|
125
|
+
|| path.isAbsolute(relativePath);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Canonical (realpath) form of a path that may not fully exist yet: the
|
|
129
|
+
* deepest existing ancestor is resolved through every symlink, and the
|
|
130
|
+
* not-yet-created suffix is appended unchanged. This answers "where would a
|
|
131
|
+
* recursive mkdir/write on this path REALLY land?" — which per-component
|
|
132
|
+
* lstat checks cannot, because lstat resolves intermediate symlinks and only
|
|
133
|
+
* reports on the final component (#2344).
|
|
134
|
+
*/
|
|
135
|
+
export function canonicalizePath(inputPath) {
|
|
136
|
+
const resolved = path.resolve(inputPath);
|
|
137
|
+
const missing = [];
|
|
138
|
+
let current = resolved;
|
|
139
|
+
for (;;) {
|
|
140
|
+
try {
|
|
141
|
+
const canonical = fs.realpathSync(current);
|
|
142
|
+
return missing.length ? path.join(canonical, ...missing) : canonical;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (!isMissingPathError(error)) {
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const parent = path.dirname(current);
|
|
150
|
+
if (parent === current) {
|
|
151
|
+
// Nothing on the chain exists (should not happen for absolute paths —
|
|
152
|
+
// the root exists — but keep a lexical fallback rather than throwing).
|
|
153
|
+
return missing.length ? path.join(current, ...missing) : current;
|
|
154
|
+
}
|
|
155
|
+
missing.unshift(path.basename(current));
|
|
156
|
+
current = parent;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Vets a user-supplied output base for CLI writes and returns the canonical
|
|
161
|
+
* path all subsequent writes should use (#2344).
|
|
162
|
+
*
|
|
163
|
+
* Two regimes, split by what the user lexically named:
|
|
164
|
+
*
|
|
165
|
+
* - Base inside the anchor (relative outputs like the './anthropic-skills'
|
|
166
|
+
* default): the canonical base must stay inside the canonical anchor.
|
|
167
|
+
* A symlink that redirects it elsewhere — including one whose target
|
|
168
|
+
* already contains matching subdirectories, the case per-component lstat
|
|
169
|
+
* checks miss — is rejected. Comparing in canonical space means system
|
|
170
|
+
* links above the anchor (macOS /tmp -> /private/tmp) never false-positive.
|
|
171
|
+
*
|
|
172
|
+
* - Base outside the anchor (explicit absolute or ../ outputs): the user
|
|
173
|
+
* named that destination, so there is no boundary to defend. Instead of
|
|
174
|
+
* guessing intent, the real destination is disclosed via `onDisclose`
|
|
175
|
+
* whenever it differs from the lexical path, and the canonical path is
|
|
176
|
+
* returned so what was vetted is what gets written.
|
|
177
|
+
*/
|
|
178
|
+
export function vetOutputBase(baseDir, options) {
|
|
179
|
+
if (!baseDir || typeof baseDir !== 'string') {
|
|
180
|
+
throw new TypeError('Base directory must be a non-empty string');
|
|
181
|
+
}
|
|
182
|
+
if (baseDir.includes('\0')) {
|
|
183
|
+
throw new Error('Path segment contains a null byte');
|
|
184
|
+
}
|
|
185
|
+
const resolvedAnchor = path.resolve(options?.anchor ?? process.cwd());
|
|
186
|
+
const resolvedBase = path.resolve(baseDir);
|
|
187
|
+
const canonicalBase = canonicalizePath(resolvedBase);
|
|
188
|
+
if (!escapesBase(path.relative(resolvedAnchor, resolvedBase))) {
|
|
189
|
+
const canonicalAnchor = canonicalizePath(resolvedAnchor);
|
|
190
|
+
if (escapesBase(path.relative(canonicalAnchor, canonicalBase))) {
|
|
191
|
+
throw new Error(`Output path resolves outside the working directory through a symbolic link (real destination: ${canonicalBase})`);
|
|
192
|
+
}
|
|
193
|
+
return canonicalBase;
|
|
194
|
+
}
|
|
195
|
+
if (canonicalBase !== resolvedBase) {
|
|
196
|
+
options?.onDisclose?.(canonicalBase);
|
|
197
|
+
}
|
|
198
|
+
return canonicalBase;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aFNlY3VyaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL3BhdGhTZWN1cml0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUVsQyxTQUFTLGtCQUFrQixDQUFDLEtBQWM7SUFDeEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksTUFBTSxJQUFJLEtBQUs7UUFDekUsQ0FBQyxDQUFFLEtBQStCLENBQUMsSUFBSTtRQUN2QyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2QsT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxTQUFTLENBQUM7QUFDakQsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyw0QkFBNEIsQ0FBQyxTQUFpQjtJQUNyRCxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFDekIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0QyxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUM7WUFDSCxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDbkIsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztB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QyxRQUFRLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMvRCxNQUFNLElBQUksS0FBSyxDQUNiLGlHQUFpRyxhQUFhLEdBQUcsQ0FDbEgsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBSSxhQUFhLEtBQUssWUFBWSxFQUFFLENBQUM7UUFDbkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLGFBQWEsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5cbmZ1bmN0aW9uIGlzTWlzc2luZ1BhdGhFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBjb25zdCBjb2RlID0gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3JcbiAgICA/IChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGVcbiAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGNvZGUgPT09ICdFTk9FTlQnIHx8IGNvZGUgPT09ICdFTk9URElSJztcbn1cblxuLyoqXG4gKiBsc3RhdCBvZiB0aGUgZGVlcGVzdCBhbmNlc3RvciBvZiBgc3RhcnRQYXRoYCB0aGF0IGV4aXN0cywgb3IgbnVsbCB3aGVuXG4gKiBub3RoaW5nIHVwIHRvIHRoZSBmaWxlc3lzdGVtIHJvb3QgZXhpc3RzLiBVc2VkIHRvIHZldCBwYXRocyB0aGF0IHdpbGwgYmVcbiAqIGNyZWF0ZWQgbGF0ZXI6IHRoZWlyIGNvbnRhaW5tZW50IGRlcGVuZHMgb24gdGhlIGRpcmVjdG9yeSB0aGV5IHdpbGwgYmVcbiAqIGNyZWF0ZWQgaW5zaWRlLlxuICpcbiAqIEtOT1dOIExJTUlUICgjMjM0NCk6IHRoaXMgc3RvcHMgYXQgdGhlIGZpcnN0IGFuY2VzdG9yIGxzdGF0IGNhbiBzZWUsIGFuZFxuICogbHN0YXQgcmVzb2x2ZXMgaW50ZXJtZWRpYXRlIHN5bWxpbmtzIOKAlCBzbyBhIHN5bWxpbmsgd2hvc2UgdGFyZ2V0IGFscmVhZHlcbiAqIGNvbnRhaW5zIGEgbWF0Y2hpbmcgc3ViZGlyZWN0b3J5IGlzIHJlcG9ydGVkIGFzIGEgcGxhaW4gZGlyZWN0b3J5IGFuZCB0aGVcbiAqIHN5bWxpbmsgY29tcG9uZW50IGl0c2VsZiBpcyBuZXZlciBpbnNwZWN0ZWQuIFdhbGtpbmcgZXZlcnkgbGV4aWNhbCBhbmNlc3RvclxuICogaW5zdGVhZCBpcyBub3QgYW4gb3B0aW9uOiBzeXN0ZW0gc3ltbGlua3MgKG1hY09TIC90bXAgLT4gL3ByaXZhdGUvdG1wLFxuICogL3ZhciAtPiAvcHJpdmF0ZS92YXIpIHNpdCBhYm92ZSBldmVyeSB0ZW1wIHBhdGggYW5kIHdvdWxkIGZhbHNlLXBvc2l0aXZlLlxuICogRnVsbCBwcm90ZWN0aW9uIG5lZWRzIGEgY2FsbGVyLWtub3duIGJvdW5kYXJ5LCB3aGljaCBpcyBleGFjdGx5IHdoYXRcbiAqIHZldE91dHB1dEJhc2UoKSBwcm92aWRlcyDigJQgc2VlIHRoZSBjb250cmFjdCBub3RlIG9uIHJlc29sdmVQYXRoV2l0aGluQmFzZS5cbiAqL1xuZnVuY3Rpb24gbmVhcmVzdEV4aXN0aW5nQW5jZXN0b3JTdGF0cyhzdGFydFBhdGg6IHN0cmluZyk6IGZzLlN0YXRzIHwgbnVsbCB7XG4gIGxldCBwcmV2aW91cyA9IHN0YXJ0UGF0aDtcbiAgbGV0IGN1cnJlbnQgPSBwYXRoLmRpcm5hbWUoc3RhcnRQYXRoKTtcbiAgd2hpbGUgKGN1cnJlbnQgIT09IHByZXZpb3VzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBmcy5sc3RhdFN5bmMoY3VycmVudCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNNaXNzaW5nUGF0aEVycm9yKGVycm9yKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgcHJldmlvdXMgPSBjdXJyZW50O1xuICAgIGN1cnJlbnQgPSBwYXRoLmRpcm5hbWUoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGFzc2VydE5vdFN5bWxpbmsocGF0aFRvQ2hlY2s6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIGxldCBzdGF0czogZnMuU3RhdHM7XG4gIHRyeSB7XG4gICAgc3RhdHMgPSBmcy5sc3RhdFN5bmMocGF0aFRvQ2hlY2spO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc01pc3NpbmdQYXRoRXJyb3IoZXJyb3IpKSB7XG4gICAgICAvLyBUaGUgcGF0aCBkb2VzIG5vdCBleGlzdCB5ZXQsIHNvIGl0IHdpbGwgYmUgY3JlYXRlZCBieSBhIGxhdGVyXG4gICAgICAvLyBta2Rpci93cml0ZS4gVGhhdCBpcyBvbmx5IHNhZmUgaWYgdGhlIGRpcmVjdG9yeSBpdCBnZXRzIGNyZWF0ZWRcbiAgICAgIC8vIGluc2lkZSBpcyByZWFsOiBhIHN5bWxpbmtlZCBleGlzdGluZyBhbmNlc3RvciB3b3VsZCByZWRpcmVjdCB0aGVcbiAgICAgIC8vIHJlY3Vyc2l2ZSBjcmVhdGUgb3V0c2lkZSB0aGUgY29udGFpbm1lbnQgYm91bmRhcnkgKCMyMzQyKS5cbiAgICAgIGNvbnN0IGFuY2VzdG9yU3RhdHMgPSBuZWFyZXN0RXhpc3RpbmdBbmNlc3RvclN0YXRzKHBhdGhUb0NoZWNrKTtcbiAgICAgIGlmIChhbmNlc3RvclN0YXRzPy5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgaWYgKHN0YXRzLmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0Tm9TeW1saW5rZWREZXNjZW5kYW50cyhyZXNvbHZlZEJhc2U6IHN0cmluZywgcmVzb2x2ZWRUYXJnZXQ6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHJlc29sdmVkQmFzZSwgcmVzb2x2ZWRUYXJnZXQpO1xuICBpZiAoIXJlbGF0aXZlUGF0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBjdXJyZW50UGF0aCA9IHJlc29sdmVkQmFzZTtcbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHJlbGF0aXZlUGF0aC5zcGxpdChwYXRoLnNlcCkpIHtcbiAgICBpZiAoIXNlZ21lbnQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGN1cnJlbnRQYXRoID0gcGF0aC5qb2luKGN1cnJlbnRQYXRoLCBzZWdtZW50KTtcbiAgICBhc3NlcnROb3RTeW1saW5rKGN1cnJlbnRQYXRoLCAnUGF0aCBzZWdtZW50IHJlc29sdmVzIHRocm91Z2ggYSBzeW1ib2xpYyBsaW5rJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgdGFyZ2V0IHBhdGggYW5kIHZlcmlmeSB0aGF0IGl0IHJlbWFpbnMgaW5zaWRlIHRoZSBpbnRlbmRlZCBiYXNlXG4gKiBkaXJlY3RvcnkuIFRoaXMgaXMgc2VwYXJhdG9yLWF3YXJlLCBzbyBzaWJsaW5nIHBhdGhzIHN1Y2ggYXMgYC90bXAvYmFzZTJgXG4gKiBhcmUgbm90IHRyZWF0ZWQgYXMgY2hpbGRyZW4gb2YgYC90bXAvYmFzZWAuIEV4aXN0aW5nIHN5bWxpbmtlZCBiYXNlIHBhdGhzXG4gKiBhbmQgc3ltbGlua2VkIGRlc2NlbmRhbnRzIHVuZGVyIHRoZSBiYXNlIGFyZSByZWplY3RlZCBiZWNhdXNlIHdyaXRlcyB3b3VsZFxuICogZm9sbG93IHRoZW0gb3V0c2lkZSB0aGUgbGV4aWNhbCBjb250YWlubWVudCBib3VuZGFyeS4gQSBiYXNlIHRoYXQgZG9lcyBub3RcbiAqIGV4aXN0IHlldCBpcyB2ZXR0ZWQgdGhyb3VnaCBpdHMgbmVhcmVzdCBleGlzdGluZyBhbmNlc3RvcjogaWYgdGhhdCBhbmNlc3RvclxuICogaXMgYSBzeW1saW5rLCB0aGUgcmVjdXJzaXZlIG1rZGlyL3dyaXRlIHRoYXQgZm9sbG93cyB3b3VsZCBiZSByZWRpcmVjdGVkXG4gKiBvdXRzaWRlIHRoZSBpbnRlbmRlZCB0cmVlLCBzbyBpdCBpcyByZWplY3RlZCB0b28gKCMyMzQyKS5cbiAqXG4gKiBDT05UUkFDVCAoIzIzNDQpOiB0aGUgYmFzZSdzIG93biBhbmNlc3RyeSBjYW4gb25seSBiZSBiZXN0LWVmZm9ydCB2ZXR0ZWRcbiAqIGhlcmUg4oCUIGEgc3ltbGluayB3aG9zZSB0YXJnZXQgcHJlLWNvbnRhaW5zIG1hdGNoaW5nIHN1YmRpcmVjdG9yaWVzIGlzIG5vdFxuICogZGV0ZWN0YWJsZSB3aXRob3V0IGEgY2FsbGVyLWtub3duIGJvdW5kYXJ5IChzZWUgbmVhcmVzdEV4aXN0aW5nQW5jZXN0b3JTdGF0c1xuICogZm9yIHdoeSB3YWxraW5nIGV2ZXJ5IGFuY2VzdG9yIGZhbHNlLXBvc2l0aXZlcyBvbiBzeXN0ZW0gc3ltbGlua3MpLiBEbyBOT1RcbiAqIHBhc3MgdXNlci1jb250cm9sbGVkIGJhc2UgcGF0aHMgZGlyZWN0bHkgdG8gdGhpcyBmdW5jdGlvbjogdmV0IHRoZW0gZmlyc3RcbiAqIHdpdGggdmV0T3V0cHV0QmFzZSgpLCB3aGljaCBjb250YWlucyB0aGVtIGNhbm9uaWNhbGx5IGFnYWluc3QgYW4gYW5jaG9yIGFuZFxuICogcmV0dXJucyB0aGUgY2Fub25pY2FsIGJhc2UgdG8gdXNlIGhlcmUuIEV2ZXJ5IGN1cnJlbnQgY2FsbGVyIGRvZXMgdGhpcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXRoV2l0aGluQmFzZShiYXNlRGlyOiBzdHJpbmcsIC4uLnNlZ21lbnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGlmICghYmFzZURpciB8fCB0eXBlb2YgYmFzZURpciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCYXNlIGRpcmVjdG9yeSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG5cbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKSB7XG4gICAgaWYgKHR5cGVvZiBzZWdtZW50ICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGF0aCBzZWdtZW50cyBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9XG4gICAgaWYgKHNlZ21lbnQuaW5jbHVkZXMoJ1xcMCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggc2VnbWVudCBjb250YWlucyBhIG51bGwgYnl0ZScpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkQmFzZSA9IHBhdGgucmVzb2x2ZShiYXNlRGlyKTtcbiAgY29uc3QgcmVzb2x2ZWRUYXJnZXQgPSBwYXRoLnJlc29sdmUocmVzb2x2ZWRCYXNlLCAuLi5zZWdtZW50cyk7XG4gIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGgucmVsYXRpdmUocmVzb2x2ZWRCYXNlLCByZXNvbHZlZFRhcmdldCk7XG4gIGNvbnN0IGlzVHJhdmVyc2FsID0gcmVsYXRpdmVQYXRoID09PSAnLi4nXG4gICAgfHwgcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uJyArIHBhdGguc2VwKVxuICAgIHx8IHBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZVBhdGgpO1xuXG4gIGlmICghaXNUcmF2ZXJzYWwpIHtcbiAgICBhc3NlcnROb3RTeW1saW5rKHJlc29sdmVkQmFzZSwgJ0Jhc2UgZGlyZWN0b3J5IHJlc29sdmVzIHRocm91Z2ggYSBzeW1ib2xpYyBsaW5rJyk7XG4gICAgYXNzZXJ0Tm9TeW1saW5rZWREZXNjZW5kYW50cyhyZXNvbHZlZEJhc2UsIHJlc29sdmVkVGFyZ2V0KTtcbiAgICByZXR1cm4gcmVzb2x2ZWRUYXJnZXQ7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ1Jlc29sdmVkIHBhdGggZXNjYXBlcyB0aGUgYmFzZSBkaXJlY3RvcnknKTtcbn1cblxuLyoqIFRydWUgd2hlbiBhIGJhc2UtcmVsYXRpdmUgcGF0aCBwb2ludHMgb3V0c2lkZSB0aGUgYmFzZS4gKi9cbmZ1bmN0aW9uIGVzY2FwZXNCYXNlKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiByZWxhdGl2ZVBhdGggPT09ICcuLidcbiAgICB8fCByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4nICsgcGF0aC5zZXApXG4gICAgfHwgcGF0aC5pc0Fic29sdXRlKHJlbGF0aXZlUGF0aCk7XG59XG5cbi8qKlxuICogQ2Fub25pY2FsIChyZWFscGF0aCkgZm9ybSBvZiBhIHBhdGggdGhhdCBtYXkgbm90IGZ1bGx5IGV4aXN0IHlldDogdGhlXG4gKiBkZWVwZXN0IGV4aXN0aW5nIGFuY2VzdG9yIGlzIHJlc29sdmVkIHRocm91Z2ggZXZlcnkgc3ltbGluaywgYW5kIHRoZVxuICogbm90LXlldC1jcmVhdGVkIHN1ZmZpeCBpcyBhcHBlbmRlZCB1bmNoYW5nZWQuIFRoaXMgYW5zd2VycyBcIndoZXJlIHdvdWxkIGFcbiAqIHJlY3Vyc2l2ZSBta2Rpci93cml0ZSBvbiB0aGlzIHBhdGggUkVBTExZIGxhbmQ/XCIg4oCUIHdoaWNoIHBlci1jb21wb25lbnRcbiAqIGxzdGF0IGNoZWNrcyBjYW5ub3QsIGJlY2F1c2UgbHN0YXQgcmVzb2x2ZXMgaW50ZXJtZWRpYXRlIHN5bWxpbmtzIGFuZCBvbmx5XG4gKiByZXBvcnRzIG9uIHRoZSBmaW5hbCBjb21wb25lbnQgKCMyMzQ0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZVBhdGgoaW5wdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXNvbHZlZCA9IHBhdGgucmVzb2x2ZShpbnB1dFBhdGgpO1xuICBjb25zdCBtaXNzaW5nOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgY3VycmVudCA9IHJlc29sdmVkO1xuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhbm9uaWNhbCA9IGZzLnJlYWxwYXRoU3luYyhjdXJyZW50KTtcbiAgICAgIHJldHVybiBtaXNzaW5nLmxlbmd0aCA/IHBhdGguam9pbihjYW5vbmljYWwsIC4uLm1pc3NpbmcpIDogY2Fub25pY2FsO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIWlzTWlzc2luZ1BhdGhFcnJvcihlcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZGlybmFtZShjdXJyZW50KTtcbiAgICBpZiAocGFyZW50ID09PSBjdXJyZW50KSB7XG4gICAgICAvLyBOb3RoaW5nIG9uIHRoZSBjaGFpbiBleGlzdHMgKHNob3VsZCBub3QgaGFwcGVuIGZvciBhYnNvbHV0ZSBwYXRocyDigJRcbiAgICAgIC8vIHRoZSByb290IGV4aXN0cyDigJQgYnV0IGtlZXAgYSBsZXhpY2FsIGZhbGxiYWNrIHJhdGhlciB0aGFuIHRocm93aW5nKS5cbiAgICAgIHJldHVybiBtaXNzaW5nLmxlbmd0aCA/IHBhdGguam9pbihjdXJyZW50LCAuLi5taXNzaW5nKSA6IGN1cnJlbnQ7XG4gICAgfVxuICAgIG1pc3NpbmcudW5zaGlmdChwYXRoLmJhc2VuYW1lKGN1cnJlbnQpKTtcbiAgICBjdXJyZW50ID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogVmV0cyBhIHVzZXItc3VwcGxpZWQgb3V0cHV0IGJhc2UgZm9yIENMSSB3cml0ZXMgYW5kIHJldHVybnMgdGhlIGNhbm9uaWNhbFxuICogcGF0aCBhbGwgc3Vic2VxdWVudCB3cml0ZXMgc2hvdWxkIHVzZSAoIzIzNDQpLlxuICpcbiAqIFR3byByZWdpbWVzLCBzcGxpdCBieSB3aGF0IHRoZSB1c2VyIGxleGljYWxseSBuYW1lZDpcbiAqXG4gKiAgLSBCYXNlIGluc2lkZSB0aGUgYW5jaG9yIChyZWxhdGl2ZSBvdXRwdXRzIGxpa2UgdGhlICcuL2FudGhyb3BpYy1za2lsbHMnXG4gKiAgICBkZWZhdWx0KTogdGhlIGNhbm9uaWNhbCBiYXNlIG11c3Qgc3RheSBpbnNpZGUgdGhlIGNhbm9uaWNhbCBhbmNob3IuXG4gKiAgICBBIHN5bWxpbmsgdGhhdCByZWRpcmVjdHMgaXQgZWxzZXdoZXJlIOKAlCBpbmNsdWRpbmcgb25lIHdob3NlIHRhcmdldFxuICogICAgYWxyZWFkeSBjb250YWlucyBtYXRjaGluZyBzdWJkaXJlY3RvcmllcywgdGhlIGNhc2UgcGVyLWNvbXBvbmVudCBsc3RhdFxuICogICAgY2hlY2tzIG1pc3Mg4oCUIGlzIHJlamVjdGVkLiBDb21wYXJpbmcgaW4gY2Fub25pY2FsIHNwYWNlIG1lYW5zIHN5c3RlbVxuICogICAgbGlua3MgYWJvdmUgdGhlIGFuY2hvciAobWFjT1MgL3RtcCAtPiAvcHJpdmF0ZS90bXApIG5ldmVyIGZhbHNlLXBvc2l0aXZlLlxuICpcbiAqICAtIEJhc2Ugb3V0c2lkZSB0aGUgYW5jaG9yIChleHBsaWNpdCBhYnNvbHV0ZSBvciAuLi8gb3V0cHV0cyk6IHRoZSB1c2VyXG4gKiAgICBuYW1lZCB0aGF0IGRlc3RpbmF0aW9uLCBzbyB0aGVyZSBpcyBubyBib3VuZGFyeSB0byBkZWZlbmQuIEluc3RlYWQgb2ZcbiAqICAgIGd1ZXNzaW5nIGludGVudCwgdGhlIHJlYWwgZGVzdGluYXRpb24gaXMgZGlzY2xvc2VkIHZpYSBgb25EaXNjbG9zZWBcbiAqICAgIHdoZW5ldmVyIGl0IGRpZmZlcnMgZnJvbSB0aGUgbGV4aWNhbCBwYXRoLCBhbmQgdGhlIGNhbm9uaWNhbCBwYXRoIGlzXG4gKiAgICByZXR1cm5lZCBzbyB3aGF0IHdhcyB2ZXR0ZWQgaXMgd2hhdCBnZXRzIHdyaXR0ZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXRPdXRwdXRCYXNlKFxuICBiYXNlRGlyOiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IGFuY2hvcj86IHN0cmluZzsgb25EaXNjbG9zZT86IChjYW5vbmljYWxCYXNlOiBzdHJpbmcpID0+IHZvaWQgfSxcbik6IHN0cmluZyB7XG4gIGlmICghYmFzZURpciB8fCB0eXBlb2YgYmFzZURpciAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdCYXNlIGRpcmVjdG9yeSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICB9XG4gIGlmIChiYXNlRGlyLmluY2x1ZGVzKCdcXDAnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUGF0aCBzZWdtZW50IGNvbnRhaW5zIGEgbnVsbCBieXRlJyk7XG4gIH1cblxuICBjb25zdCByZXNvbHZlZEFuY2hvciA9IHBhdGgucmVzb2x2ZShvcHRpb25zPy5hbmNob3IgPz8gcHJvY2Vzcy5jd2QoKSk7XG4gIGNvbnN0IHJlc29sdmVkQmFzZSA9IHBhdGgucmVzb2x2ZShiYXNlRGlyKTtcbiAgY29uc3QgY2Fub25pY2FsQmFzZSA9IGNhbm9uaWNhbGl6ZVBhdGgocmVzb2x2ZWRCYXNlKTtcblxuICBpZiAoIWVzY2FwZXNCYXNlKHBhdGgucmVsYXRpdmUocmVzb2x2ZWRBbmNob3IsIHJlc29sdmVkQmFzZSkpKSB7XG4gICAgY29uc3QgY2Fub25pY2FsQW5jaG9yID0gY2Fub25pY2FsaXplUGF0aChyZXNvbHZlZEFuY2hvcik7XG4gICAgaWYgKGVzY2FwZXNCYXNlKHBhdGgucmVsYXRpdmUoY2Fub25pY2FsQW5jaG9yLCBjYW5vbmljYWxCYXNlKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE91dHB1dCBwYXRoIHJlc29sdmVzIG91dHNpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRocm91Z2ggYSBzeW1ib2xpYyBsaW5rIChyZWFsIGRlc3RpbmF0aW9uOiAke2Nhbm9uaWNhbEJhc2V9KWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2Fub25pY2FsQmFzZTtcbiAgfVxuXG4gIGlmIChjYW5vbmljYWxCYXNlICE9PSByZXNvbHZlZEJhc2UpIHtcbiAgICBvcHRpb25zPy5vbkRpc2Nsb3NlPy4oY2Fub25pY2FsQmFzZSk7XG4gIH1cbiAgcmV0dXJuIGNhbm9uaWNhbEJhc2U7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dollhousemcp/mcp-server",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.38",
|
|
4
4
|
"description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
package/server.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "io.github.DollhouseMCP/mcp-server",
|
|
4
4
|
"title": "DollhouseMCP",
|
|
5
5
|
"description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
|
|
6
|
-
"version": "2.0.
|
|
6
|
+
"version": "2.0.38",
|
|
7
7
|
"homepage": "https://dollhousemcp.com",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
{
|
|
30
30
|
"registryType": "npm",
|
|
31
31
|
"identifier": "@dollhousemcp/mcp-server",
|
|
32
|
-
"version": "2.0.
|
|
32
|
+
"version": "2.0.38",
|
|
33
33
|
"transport": {
|
|
34
34
|
"type": "stdio"
|
|
35
35
|
}
|