@dollhousemcp/mcp-server 1.9.13 → 1.9.15
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 +48 -0
- package/README.github.md +54 -0
- package/README.md.backup +1241 -49
- package/dist/cache/CollectionCache.js +2 -2
- package/dist/collection/CollectionIndexManager.js +3 -3
- package/dist/config/ConfigWizard.js +3 -3
- package/dist/config/indicator-config.js +2 -2
- package/dist/config/portfolio-constants.js +12 -12
- package/dist/elements/BaseElement.js +7 -7
- package/dist/elements/FeedbackProcessor.d.ts +7 -0
- package/dist/elements/FeedbackProcessor.d.ts.map +1 -1
- package/dist/elements/FeedbackProcessor.js +67 -14
- package/dist/elements/agents/AgentManager.js +6 -6
- package/dist/elements/memories/Memory.js +4 -4
- package/dist/elements/memories/MemoryManager.js +3 -3
- package/dist/elements/memories/utils.js +3 -3
- package/dist/elements/skills/Skill.js +2 -2
- package/dist/elements/skills/SkillManager.js +2 -2
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +38 -14
- package/dist/elements/templates/TemplateManager.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ConfigHandler.js +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -16
- package/dist/persona/PersonaElementManager.js +3 -3
- package/dist/persona/PersonaManager.js +2 -2
- package/dist/persona/export-import/PersonaImporter.js +3 -3
- package/dist/portfolio/DefaultElementProvider.d.ts +12 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +23 -6
- package/dist/portfolio/GitHubPortfolioIndexer.js +2 -2
- package/dist/portfolio/MigrationManager.js +2 -2
- package/dist/portfolio/NLPScoringManager.js +2 -2
- package/dist/portfolio/PortfolioManager.d.ts +5 -0
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioManager.js +8 -1
- package/dist/portfolio/PortfolioRepoManager.js +2 -2
- package/dist/portfolio/PortfolioSyncManager.js +5 -5
- package/dist/portfolio/RelationshipManager.js +4 -4
- package/dist/portfolio/UnifiedIndexManager.js +4 -4
- package/dist/portfolio/types/RelationshipTypes.js +2 -2
- package/dist/security/InputValidator.d.ts +12 -0
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +38 -18
- package/dist/security/audit/config/suppressions.js +10 -10
- package/dist/security/commandValidator.js +2 -2
- package/dist/security/dosProtection.d.ts +123 -0
- package/dist/security/dosProtection.d.ts.map +1 -0
- package/dist/security/dosProtection.js +392 -0
- package/dist/security/pathValidator.js +2 -2
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +4 -3
- package/dist/security/tokenManager.js +10 -10
- package/dist/security/validators/unicodeValidator.js +2 -2
- package/dist/security/yamlValidator.js +3 -3
- package/dist/sync/PortfolioDownloader.js +2 -2
- package/dist/sync/PortfolioSyncComparer.js +2 -2
- package/dist/tools/portfolio/PortfolioElementAdapter.js +3 -3
- package/dist/tools/portfolio/submitToPortfolioTool.js +14 -14
- package/dist/utils/EarlyTerminationSearch.d.ts +1 -1
- package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -1
- package/dist/utils/EarlyTerminationSearch.js +3 -3
- package/dist/utils/ElementFormatter.d.ts +1 -0
- package/dist/utils/ElementFormatter.d.ts.map +1 -1
- package/dist/utils/ElementFormatter.js +21 -13
- package/dist/utils/GitHubRateLimiter.d.ts +6 -0
- package/dist/utils/GitHubRateLimiter.d.ts.map +1 -1
- package/dist/utils/GitHubRateLimiter.js +20 -5
- package/dist/utils/RateLimiter.js +2 -2
- package/dist/utils/SecureDownloader.js +2 -2
- package/dist/utils/fileOperations.d.ts +6 -1
- package/dist/utils/fileOperations.d.ts.map +1 -1
- package/dist/utils/fileOperations.js +29 -5
- package/dist/utils/filesystem.js +6 -6
- package/dist/utils/searchUtils.js +2 -2
- package/dist/utils/version.js +3 -3
- package/package.json +1 -1
|
@@ -58,7 +58,7 @@ function sanitizeMemoryContent(content, maxLength) {
|
|
|
58
58
|
const cleaned = purify.sanitize(normalized);
|
|
59
59
|
// Remove only control characters and null bytes
|
|
60
60
|
return cleaned
|
|
61
|
-
.
|
|
61
|
+
.replaceAll(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, '') // NOSONAR - Intentionally removing control chars except \t \n \r for sanitization
|
|
62
62
|
.substring(0, maxLength)
|
|
63
63
|
.trim();
|
|
64
64
|
}
|
|
@@ -449,14 +449,14 @@ export class Memory extends BaseElement {
|
|
|
449
449
|
}
|
|
450
450
|
// If already a Date, validate it
|
|
451
451
|
if (value instanceof Date) {
|
|
452
|
-
if (isNaN(value.getTime())) {
|
|
452
|
+
if (Number.isNaN(value.getTime())) {
|
|
453
453
|
throw new Error(`Invalid Date object provided`);
|
|
454
454
|
}
|
|
455
455
|
return value;
|
|
456
456
|
}
|
|
457
457
|
// Try to convert to Date
|
|
458
458
|
const date = new Date(value);
|
|
459
|
-
if (isNaN(date.getTime())) {
|
|
459
|
+
if (Number.isNaN(date.getTime())) {
|
|
460
460
|
throw new Error(`Invalid date value: ${value}`);
|
|
461
461
|
}
|
|
462
462
|
// Check for unreasonable dates (before 1970 or more than 100 years in future)
|
|
@@ -716,4 +716,4 @@ export class Memory extends BaseElement {
|
|
|
716
716
|
throw lastError || new Error('Failed to build search index');
|
|
717
717
|
}
|
|
718
718
|
}
|
|
719
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQWdDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBa0MsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFOUI7OztHQUdHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFFOUI7OztHQUdHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxtQkFBbUIsQ0FBQztBQUVyRCxrQ0FBa0M7QUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFhLENBQUMsQ0FBQztBQUV4Qyx3RUFBd0U7QUFDeEUsTUFBTSxDQUFDLFNB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LENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLE9BQU8sU0FBUyxFQUFFO29CQUMxRCxLQUFLLEVBQUUsU0FBUyxDQUFDLE9BQU87b0JBQ3hCLFlBQVksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7aUJBQ2hDLENBQUMsQ0FBQztnQkFFSCxJQUFJLE9BQU8sR0FBRyxPQUFPLEVBQUUsQ0FBQztvQkFDdEIsMkNBQTJDO29CQUMzQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUM3QyxNQUFNLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxxQ0FBcUM7UUFDckMsTUFBTSxTQUFTLElBQUksSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUMvRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeSBFbGVtZW50IC0gUGVyc2lzdGVudCBjb250ZXh0IHN0b3JhZ2UgZm9yIGNvbnRpbnVpdHkgYW5kIGxlYXJuaW5nXG4gKiBcbiAqIFByb3ZpZGVzIG11bHRpcGxlIHN0b3JhZ2UgYmFja2VuZHMsIHJldGVudGlvbiBwb2xpY2llcywgYW5kIHNlYXJjaCBjYXBhYmlsaXRpZXNcbiAqIGZvciBtYWludGFpbmluZyBjb250ZXh0IGFjcm9zcyBzZXNzaW9ucyBhbmQgaW50ZXJhY3Rpb25zLlxuICogXG4gKiBTRUNVUklUWSBNRUFTVVJFUyBJTVBMRU1FTlRFRDpcbiAqIDEuIElucHV0IHNhbml0aXphdGlvbiBmb3IgYWxsIG1lbW9yeSBjb250ZW50XG4gKiAyLiBNZW1vcnkgc2l6ZSBsaW1pdHMgdG8gcHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoXG4gKiAzLiBQYXRoIHZhbGlkYXRpb24gZm9yIGZpbGUtYmFzZWQgc3RvcmFnZVxuICogNC4gUmV0ZW50aW9uIHBvbGljeSBlbmZvcmNlbWVudFxuICogNS4gUHJpdmFjeSBsZXZlbCBhY2Nlc3MgY29udHJvbFxuICogNi4gQXVkaXQgbG9nZ2luZyBmb3IgYWxsIG9wZXJhdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBCYXNlRWxlbWVudCB9IGZyb20gJy4uL0Jhc2VFbGVtZW50LmpzJztcbmltcG9ydCB7IElFbGVtZW50LCBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvaW5kZXguanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnRNZXRhZGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBNRU1PUllfQ09OU1RBTlRTLCBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLCBQcml2YWN5TGV2ZWwsIFN0b3JhZ2VCYWNrZW5kIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVNZW1vcnlJZCB9IGZyb20gJy4vdXRpbHMuanMnO1xuaW1wb3J0IHsgTWVtb3J5U2VhcmNoSW5kZXgsIFNlYXJjaFF1ZXJ5LCBTZWFyY2hJbmRleENvbmZpZyB9IGZyb20gJy4vTWVtb3J5U2VhcmNoSW5kZXguanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5JztcbmltcG9ydCB7IEpTRE9NIH0gZnJvbSAnanNkb20nO1xuXG4vKipcbiAqIE1heGltdW0gbGVuZ3RoIGZvciBpbmRpdmlkdWFsIHRyaWdnZXIgd29yZHMgdXNlZCBpbiBFbmhhbmNlZCBJbmRleFxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmNvbnN0IE1BWF9UUklHR0VSX0xFTkdUSCA9IDUwO1xuXG4vKipcbiAqIFZhbGlkYXRpb24gcGF0dGVybiBmb3IgdHJpZ2dlciB3b3JkcyAtIGFsbG93cyBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzXG4gKiBAY29uc3RhbnQge1JlZ0V4cH1cbiAqL1xuY29uc3QgVFJJR0dFUl9WQUxJREFUSU9OX1JFR0VYID0gL15bYS16QS1aMC05XFwtX10rJC87XG5cbi8vIEluaXRpYWxpemUgRE9NUHVyaWZ5IHdpdGggSlNET01cbmNvbnN0IHdpbmRvdyA9IG5ldyBKU0RPTSgnJykud2luZG93O1xuY29uc3QgcHVyaWZ5ID0gRE9NUHVyaWZ5KHdpbmRvdyBhcyBhbnkpO1xuXG4vLyBDb25maWd1cmUgRE9NUHVyaWZ5IGZvciBtZW1vcnkgY29udGVudCAtIHN0cmlwIGFsbCBIVE1MIGJ1dCBrZWVwIHRleHRcbnB1cmlmeS5zZXRDb25maWcoe1xuICBBTExPV0VEX1RBR1M6IFtdLCAgLy8gTm8gSFRNTCB0YWdzIGFsbG93ZWRcbiAgQUxMT1dFRF9BVFRSOiBbXSwgIC8vIE5vIGF0dHJpYnV0ZXMgYWxsb3dlZFxuICBLRUVQX0NPTlRFTlQ6IHRydWUgLy8gS2VlcCB0ZXh0IGNvbnRlbnRcbn0pO1xuXG4vKipcbiAqIFNhbml0aXplIGNvbnRlbnQgZm9yIG1lbW9yeSBzdG9yYWdlXG4gKiBNb3JlIHBlcm1pc3NpdmUgdGhhbiBzYW5pdGl6ZUlucHV0IC0gYWxsb3dzIHB1bmN0dWF0aW9uLCBxdW90ZXMsIGV0Yy5cbiAqIGJ1dCBzdGlsbCBwcmV2ZW50cyBYU1MgYW5kIGNvbnRyb2wgY2hhcmFjdGVyc1xuICovXG5mdW5jdGlvbiBzYW5pdGl6ZU1lbW9yeUNvbnRlbnQoY29udGVudDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICghY29udGVudCB8fCB0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgXG4gIC8vIEZpcnN0IG5vcm1hbGl6ZSBVbmljb2RlXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShjb250ZW50KS5ub3JtYWxpemVkQ29udGVudDtcbiAgXG4gIC8vIFVzZSBET01QdXJpZnkgdG8gc3RyaXAgYW55IEhUTUwvWFNTIGF0dGVtcHRzIGJ1dCBrZWVwIHRleHRcbiAgY29uc3QgY2xlYW5lZCA9IHB1cmlmeS5zYW5pdGl6ZShub3JtYWxpemVkKTtcbiAgXG4gIC8vIFJlbW92ZSBvbmx5IGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgbnVsbCBieXRlc1xuICByZXR1cm4gY2xlYW5lZFxuICAgIC5yZXBsYWNlKC9bXFx1MDAwMC1cXHUwMDA4XFx1MDAwQlxcdTAwMENcXHUwMDBFLVxcdTAwMUZcXHUwMDdGXS9nLCAnJykgLy8gTk9TT05BUiAtIEludGVudGlvbmFsbHkgcmVtb3ZpbmcgY29udHJvbCBjaGFycyBleGNlcHQgXFx0IFxcbiBcXHIgZm9yIHNhbml0aXphdGlvblxuICAgIC5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKVxuICAgIC50cmltKCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5TWV0YWRhdGEgZXh0ZW5kcyBJRWxlbWVudE1ldGFkYXRhIHtcbiAgc3RvcmFnZUJhY2tlbmQ/OiBTdG9yYWdlQmFja2VuZDtcbiAgcmV0ZW50aW9uRGF5cz86IG51bWJlcjtcbiAgcHJpdmFjeUxldmVsPzogUHJpdmFjeUxldmVsO1xuICBzZWFyY2hhYmxlPzogYm9vbGVhbjtcbiAgbWF4RW50cmllcz86IG51bWJlcjtcbiAgZW5jcnlwdGlvbkVuYWJsZWQ/OiBib29sZWFuO1xuICAvLyBTZWFyY2ggaW5kZXggY29uZmlndXJhdGlvbiAoSXNzdWUgIzk4NClcbiAgaW5kZXhUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIGVuYWJsZUNvbnRlbnRJbmRleD86IGJvb2xlYW47XG4gIG1heFRlcm1zUGVyRW50cnk/OiBudW1iZXI7XG4gIG1pblRlcm1MZW5ndGg/OiBudW1iZXI7XG4gIC8vIFRyaWdnZXIgd29yZHMgZm9yIEVuaGFuY2VkIEluZGV4IChJc3N1ZSAjMTEyNClcbiAgdHJpZ2dlcnM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlFbnRyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogRGF0ZTtcbiAgY29udGVudDogc3RyaW5nO1xuICB0YWdzPzogc3RyaW5nW107XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgZXhwaXJlc0F0PzogRGF0ZTtcbiAgcHJpdmFjeUxldmVsPzogUHJpdmFjeUxldmVsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeVNlYXJjaE9wdGlvbnMge1xuICBxdWVyeT86IHN0cmluZztcbiAgdGFncz86IHN0cmluZ1tdO1xuICBzdGFydERhdGU/OiBEYXRlO1xuICBlbmREYXRlPzogRGF0ZTtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHByaXZhY3lMZXZlbD86IFByaXZhY3lMZXZlbDtcbn1cblxuLyoqXG4gKiBNZW1vcnkgRWxlbWVudCBJbXBsZW1lbnRhdGlvblxuICpcbiAqIFRPRE86IE1lbW9yeSBTaGFyZGluZyBTdHJhdGVneSAoSXNzdWUgIzk4MSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ3VycmVudDogU2luZ2xlIE1hcDxpZCwgZW50cnk+IGZvciBhbGwgbWVtb3JpZXNcbiAqIFByb2JsZW06IExhcmdlIG1lbW9yeSBzZXRzICg+MTBLIGVudHJpZXMpIGNhdXNlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gKlxuICogUGxhbm5lZCBTaGFyZGluZyBBcmNoaXRlY3R1cmU6XG4gKiAxLiBTaGFyZCBtZW1vcmllcyBhY3Jvc3MgbXVsdGlwbGUgZmlsZXMgYmFzZWQgb24gaGFzaChtZW1vcnlJZCkgJSBzaGFyZENvdW50XG4gKiAyLiBFYWNoIHNoYXJkIGZpbGUgPDI1NktCIGZvciBvcHRpbWFsIFlBTUwgcGFyc2luZ1xuICogMy4gTWVtb3J5IHJlZmVyZW5jZXMgc3RvcmVkIHNlcGFyYXRlbHkgZnJvbSBjb250ZW50IChsaWtlIGdpdCBvYmplY3RzKVxuICogNC4gTGFyZ2UgYmluYXJ5IGNvbnRlbnQgKFBERnMsIGltYWdlcykgc3RvcmVkIGFzIGV4dGVybmFsIHJlZmVyZW5jZXNcbiAqXG4gKiBCZW5lZml0czpcbiAqIC0gUGFyYWxsZWwgbG9hZGluZyBvZiBtZW1vcnkgc2hhcmRzXG4gKiAtIFJlZHVjZWQgbWVtb3J5IGZvb3RwcmludCAobG9hZCBvbmx5IG5lZWRlZCBzaGFyZHMpXG4gKiAtIEJldHRlciBjb3JydXB0aW9uIHJlc2lzdGFuY2UgKG9uZSBzaGFyZCBmYWlsdXJlIGRvZXNuJ3QgYWZmZWN0IG90aGVycylcbiAqIC0gRWZmaWNpZW50IGluY3JlbWVudGFsIHVwZGF0ZXNcbiAqXG4gKiBUT0RPOiBDb250ZW50IEludGVncml0eSBWZXJpZmljYXRpb24gKElzc3VlICM5ODIpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQWRkIFNIQS0yNTYgaGFzaGVzIHRvIGRldGVjdDpcbiAqIC0gQWNjaWRlbnRhbCBjb3JydXB0aW9uIGZyb20gZGlzayBlcnJvcnNcbiAqIC0gSW50ZW50aW9uYWwgdGFtcGVyaW5nIHdpdGggbWVtb3J5IGZpbGVzXG4gKiAtIFZlcnNpb24gY29uZmxpY3RzIGR1cmluZyBjb25jdXJyZW50IGFjY2Vzc1xuICpcbiAqIEltcGxlbWVudGF0aW9uOlxuICogLSBTdG9yZSBoYXNoIGluIG1lbW9yeSBtZXRhZGF0YVxuICogLSBWZXJpZnkgb24gbG9hZCwgd2FybiBvbiBtaXNtYXRjaFxuICogLSBPcHRpb24gdG8gYXV0by1yZXN0b3JlIGZyb20gYmFja3VwIG9uIGNvcnJ1cHRpb25cbiAqXG4gKiBUT0RPOiBNZW1vcnkgQ2FwYWNpdHkgTWFuYWdlbWVudCAoSXNzdWUgIzk4MylcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ3VycmVudDogU3luY2hyb25vdXMgcmV0ZW50aW9uIGVuZm9yY2VtZW50IG9uIGVhY2ggYWRkXG4gKiBCZXR0ZXI6IEJhY2tncm91bmQgY2xlYW51cCB3aXRoIHNtYXJ0IHRyaWdnZXJzOlxuICogLSBDbGVhbnVwIHdoZW4gOTAlIGNhcGFjaXR5IHJlYWNoZWRcbiAqIC0gQmF0Y2ggZGVsZXRpb25zIGZvciBlZmZpY2llbmN5XG4gKiAtIExSVSBldmljdGlvbiB3aXRoIGFjY2VzcyB0cmFja2luZ1xuICogLSBQcmVzZXJ2ZSBcInBpbm5lZFwiIG1lbW9yaWVzIHJlZ2FyZGxlc3Mgb2YgYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1vcnkgZXh0ZW5kcyBCYXNlRWxlbWVudCBpbXBsZW1lbnRzIElFbGVtZW50IHtcbiAgLy8gTWVtb3J5LXNwZWNpZmljIHByb3BlcnRpZXNcbiAgcHJpdmF0ZSBlbnRyaWVzOiBNYXA8c3RyaW5nLCBNZW1vcnlFbnRyeT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgc3RvcmFnZUJhY2tlbmQ6IFN0b3JhZ2VCYWNrZW5kO1xuICBwcml2YXRlIHJldGVudGlvbkRheXM6IG51bWJlcjtcbiAgcHJpdmF0ZSBwcml2YWN5TGV2ZWw6IFByaXZhY3lMZXZlbDtcbiAgcHJpdmF0ZSBzZWFyY2hhYmxlOiBib29sZWFuO1xuICBwcml2YXRlIG1heEVudHJpZXM6IG51bWJlcjtcblxuICAvLyBTZWFyY2ggaW5kZXggZm9yIHBlcmZvcm1hbmNlIChJc3N1ZSAjOTg0KVxuICBwcml2YXRlIHNlYXJjaEluZGV4OiBNZW1vcnlTZWFyY2hJbmRleDtcblxuICAvLyBTYW5pdGl6YXRpb24gY2FjaGUgdG8gYXZvaWQgcmVkdW5kYW50IHByb2Nlc3NpbmdcbiAgcHJpdmF0ZSBzYW5pdGl6YXRpb25DYWNoZTogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXAoKTtcbiAgXG4gIGNvbnN0cnVjdG9yKG1ldGFkYXRhOiBQYXJ0aWFsPE1lbW9yeU1ldGFkYXRhPiA9IHt9KSB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBTYW5pdGl6ZSBhbGwgaW5wdXRzIGR1cmluZyBjb25zdHJ1Y3Rpb25cbiAgICBjb25zdCBzYW5pdGl6ZWRNZXRhZGF0YSA9IHtcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSA/XG4gICAgICAgIHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobWV0YWRhdGEubmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCkgOlxuICAgICAgICAnVW5uYW1lZCBNZW1vcnknLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uID9cbiAgICAgICAgc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShtZXRhZGF0YS5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsIDUwMCkgOlxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAvLyBGSVggIzExMjQ6IFByZXNlcnZlIHRyaWdnZXJzIGZvciBFbmhhbmNlZCBJbmRleFxuICAgICAgdHJpZ2dlcnM6IEFycmF5LmlzQXJyYXkobWV0YWRhdGEudHJpZ2dlcnMpID9cbiAgICAgICAgbWV0YWRhdGEudHJpZ2dlcnNcbiAgICAgICAgICAubWFwKHQgPT4gc2FuaXRpemVJbnB1dCh0LCBNQVhfVFJJR0dFUl9MRU5HVEgpKVxuICAgICAgICAgIC5maWx0ZXIodCA9PiB0ICYmIFRSSUdHRVJfVkFMSURBVElPTl9SRUdFWC50ZXN0KHQpKSA6IC8vIE9ubHkgYWxsb3cgdmFsaWQgdHJpZ2dlciBwYXR0ZXJuc1xuICAgICAgICBbXVxuICAgIH07XG5cbiAgICBzdXBlcihFbGVtZW50VHlwZS5NRU1PUlksIHNhbml0aXplZE1ldGFkYXRhKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIG1lbW9yeS1zcGVjaWZpYyBwcm9wZXJ0aWVzIHdpdGggZGVmYXVsdHNcbiAgICB0aGlzLnN0b3JhZ2VCYWNrZW5kID0gbWV0YWRhdGEuc3RvcmFnZUJhY2tlbmQgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1NUT1JBR0VfQkFDS0VORDtcbiAgICB0aGlzLnJldGVudGlvbkRheXMgPSBtZXRhZGF0YS5yZXRlbnRpb25EYXlzIHx8IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9SRVRFTlRJT05fREFZUztcbiAgICAvLyBWYWxpZGF0ZSBwcml2YWN5IGxldmVsIC0gZGVmYXVsdCB0byBwcml2YXRlIGlmIGludmFsaWRcbiAgICB0aGlzLnByaXZhY3lMZXZlbCA9IChtZXRhZGF0YS5wcml2YWN5TGV2ZWwgJiYgTUVNT1JZX0NPTlNUQU5UUy5QUklWQUNZX0xFVkVMUy5pbmNsdWRlcyhtZXRhZGF0YS5wcml2YWN5TGV2ZWwpKSBcbiAgICAgID8gbWV0YWRhdGEucHJpdmFjeUxldmVsIFxuICAgICAgOiBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUFJJVkFDWV9MRVZFTDtcbiAgICB0aGlzLnNlYXJjaGFibGUgPSBtZXRhZGF0YS5zZWFyY2hhYmxlICE9PSBmYWxzZTtcbiAgICB0aGlzLm1heEVudHJpZXMgPSBNYXRoLm1pbihcbiAgICAgIG1ldGFkYXRhLm1heEVudHJpZXMgfHwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxULFxuICAgICAgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUXG4gICAgKTtcbiAgICBcbiAgICAvLyBTZXQgdXAgZXh0ZW5zaW9uc1xuICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHtcbiAgICAgIHN0b3JhZ2VCYWNrZW5kOiB0aGlzLnN0b3JhZ2VCYWNrZW5kLFxuICAgICAgcmV0ZW50aW9uRGF5czogdGhpcy5yZXRlbnRpb25EYXlzLFxuICAgICAgcHJpdmFjeUxldmVsOiB0aGlzLnByaXZhY3lMZXZlbCxcbiAgICAgIHNlYXJjaGFibGU6IHRoaXMuc2VhcmNoYWJsZSxcbiAgICAgIG1heEVudHJpZXM6IHRoaXMubWF4RW50cmllcyxcbiAgICAgIGVuY3J5cHRpb25FbmFibGVkOiBtZXRhZGF0YS5lbmNyeXB0aW9uRW5hYmxlZCB8fCBmYWxzZVxuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIHNlYXJjaCBpbmRleCB3aXRoIGNvbmZpZ3VyYXRpb24gKElzc3VlICM5ODQpXG4gICAgY29uc3QgaW5kZXhDb25maWc6IFNlYXJjaEluZGV4Q29uZmlnID0ge1xuICAgICAgaW5kZXhUaHJlc2hvbGQ6IG1ldGFkYXRhLmluZGV4VGhyZXNob2xkIHx8IDEwMCxcbiAgICAgIGVuYWJsZUNvbnRlbnRJbmRleDogbWV0YWRhdGEuZW5hYmxlQ29udGVudEluZGV4ICE9PSBmYWxzZSxcbiAgICAgIG1heFRlcm1zUGVyRW50cnk6IG1ldGFkYXRhLm1heFRlcm1zUGVyRW50cnkgfHwgMTAwLFxuICAgICAgbWluVGVybUxlbmd0aDogbWV0YWRhdGEubWluVGVybUxlbmd0aCB8fCAyLFxuICAgICAgZW5hYmxlUGVyc2lzdGVuY2U6IGZhbHNlIC8vIEZ1dHVyZSBlbmhhbmNlbWVudFxuICAgIH07XG4gICAgdGhpcy5zZWFyY2hJbmRleCA9IG5ldyBNZW1vcnlTZWFyY2hJbmRleChpbmRleENvbmZpZyk7XG5cbiAgICAvLyBMb2cgbWVtb3J5IGNyZWF0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfQ1JFQVRFRCxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ01lbW9yeS5jb25zdHJ1Y3RvcicsXG4gICAgICBkZXRhaWxzOiBgTWVtb3J5IGNyZWF0ZWQ6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfSB3aXRoICR7dGhpcy5zdG9yYWdlQmFja2VuZH0gYmFja2VuZGBcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBtZW1vcnkgZW50cnlcbiAgICogU0VDVVJJVFk6IFZhbGlkYXRlcyBhbmQgc2FuaXRpemVzIGFsbCBpbnB1dCwgZW5mb3JjZXMgc2l6ZSBsaW1pdHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhZGRFbnRyeShjb250ZW50OiBzdHJpbmcsIHRhZ3M/OiBzdHJpbmdbXSwgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxNZW1vcnlFbnRyeT4ge1xuICAgIC8vIFZhbGlkYXRlIG1lbW9yeSBzaXplIGxpbWl0c1xuICAgIGlmICh0aGlzLmVudHJpZXMuc2l6ZSA+PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgIC8vIFNFQ1VSSVRZIEZJWDogRW5mb3JjZSByZXRlbnRpb24gcG9saWN5IHdoZW4gYXQgY2FwYWNpdHlcbiAgICAgIGF3YWl0IHRoaXMuZW5mb3JjZVJldGVudGlvblBvbGljeSgpO1xuICAgICAgXG4gICAgICAvLyBJZiBzdGlsbCBhdCBjYXBhY2l0eSBhZnRlciByZXRlbnRpb24sIHJlbW92ZSBvbGRlc3QgdG8gbWFrZSByb29tXG4gICAgICBpZiAodGhpcy5lbnRyaWVzLnNpemUgPj0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IG9sZGVzdEVudHJ5ID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcHMgYXJlIERhdGUgb2JqZWN0cyBmb3Igc29ydGluZ1xuICAgICAgICAgICAgY29uc3QgYVRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGJUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGIudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICByZXR1cm4gYVRpbWUgLSBiVGltZTtcbiAgICAgICAgICB9KVswXTtcbiAgICAgICAgaWYgKG9sZGVzdEVudHJ5KSB7XG4gICAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShvbGRlc3RFbnRyeS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYOiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgY29udGVudFxuICAgIGNvbnN0IHNhbml0aXplZENvbnRlbnQgPSBzYW5pdGl6ZU1lbW9yeUNvbnRlbnQoY29udGVudCwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUllfU0laRSk7XG4gICAgXG4gICAgaWYgKCFzYW5pdGl6ZWRDb250ZW50IHx8IHNhbml0aXplZENvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgY29udGVudCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYOiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGFnc1xuICAgIGNvbnN0IHNhbml0aXplZFRhZ3MgPSB0YWdzID8gdGhpcy5zYW5pdGl6ZVRhZ3ModGFncykgOiBbXTtcbiAgICBcbiAgICAvLyBDcmVhdGUgbWVtb3J5IGVudHJ5IHdpdGggZ2VuZXJhdGVkIElEXG4gICAgY29uc3QgZW50cnk6IE1lbW9yeUVudHJ5ID0ge1xuICAgICAgaWQ6IGdlbmVyYXRlTWVtb3J5SWQoKSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgIGNvbnRlbnQ6IHNhbml0aXplZENvbnRlbnQsXG4gICAgICB0YWdzOiBzYW5pdGl6ZWRUYWdzLFxuICAgICAgbWV0YWRhdGE6IHRoaXMuc2FuaXRpemVNZXRhZGF0YShtZXRhZGF0YSksXG4gICAgICBwcml2YWN5TGV2ZWw6IHRoaXMucHJpdmFjeUxldmVsLFxuICAgICAgZXhwaXJlc0F0OiB0aGlzLmNhbGN1bGF0ZUV4cGlyeURhdGUoKVxuICAgIH07XG4gICAgXG4gICAgLy8gU3RvcmUgZW50cnlcbiAgICB0aGlzLmVudHJpZXMuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG5cbiAgICAvLyBVcGRhdGUgc2VhcmNoIGluZGV4IChJc3N1ZSAjOTg0KVxuICAgIHRoaXMuc2VhcmNoSW5kZXguYWRkRW50cnkoZW50cnkpO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIGJ1aWxkL3JlYnVpbGQgdGhlIGluZGV4XG4gICAgaWYgKCF0aGlzLnNlYXJjaEluZGV4LmlzSW5kZXhlZCAmJiB0aGlzLmVudHJpZXMuc2l6ZSA+PSAxMDApIHtcbiAgICAgIC8vIEJ1aWxkIGluZGV4IGFzeW5jaHJvbm91c2x5IHRvIGF2b2lkIGJsb2NraW5nLCB3aXRoIHJldHJ5IGxvZ2ljXG4gICAgICB0aGlzLmJ1aWxkU2VhcmNoSW5kZXhXaXRoUmV0cnkoKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIC8vIEZpbmFsIGZhaWx1cmUgYWZ0ZXIgcmV0cmllcyAtIHNlYXJjaCB3aWxsIGZhbGwgYmFjayB0byBsaW5lYXIgc2NhblxuICAgICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBidWlsZCBzZWFyY2ggaW5kZXggYWZ0ZXIgcmV0cmllcywgc2VhcmNoIHdpbGwgdXNlIGZhbGxiYWNrJywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTG9nIG1lbW9yeSBhZGRpdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0FEREVELFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnTWVtb3J5LmFkZEVudHJ5JyxcbiAgICAgIGRldGFpbHM6IGBBZGRlZCBtZW1vcnkgZW50cnkgJHtlbnRyeS5pZH0gd2l0aCAke3Nhbml0aXplZFRhZ3MubGVuZ3RofSB0YWdzYFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG4gIFxuICAvKipcbiAgICogU2VhcmNoIG1lbW9yeSBlbnRyaWVzXG4gICAqIFNFQ1VSSVRZOiBSZXNwZWN0cyBwcml2YWN5IGxldmVscyBhbmQgc2FuaXRpemVzIHNlYXJjaCBxdWVyaWVzXG4gICAqXG4gICAqIElNUExFTUVOVEVEOiBCYXNpYyBpbmRleGVkIHNlYXJjaCBmb3IgTyhsb2cgbikgcGVyZm9ybWFuY2UgKElzc3VlICM5ODQpXG4gICAqIC0gVGFnIGluZGV4OiBNYXA8dGFnLCBTZXQ8ZW50cnlJZD4+IGZvciBpbnN0YW50IHRhZyBsb29rdXBzIOKck1xuICAgKiAtIENvbnRlbnQgaW5kZXg6IEludmVydGVkIGluZGV4IGZvciB0ZXJtIHNlYXJjaCDinJNcbiAgICogLSBEYXRlIGluZGV4OiBCaW5hcnkgdHJlZSBmb3IgZWZmaWNpZW50IHJhbmdlIHF1ZXJpZXMg4pyTXG4gICAqIC0gUHJpdmFjeSBpbmRleDogUHJlLXNvcnRlZCBlbnRyaWVzIGJ5IHByaXZhY3kgbGV2ZWwg4pyTXG4gICAqXG4gICAqIFRPRE86IEFkdmFuY2VkIGluZGV4aW5nIGZlYXR1cmVzIChGdXR1cmUgZW5oYW5jZW1lbnRzKTpcbiAgICogLSBDb21wb3NpdGUgaW5kaWNlczogQ29tYmluZWQgaW5kaWNlcyBmb3IgY29tbW9uIHF1ZXJ5IHBhdHRlcm5zXG4gICAqIC0gSW5kZXgtb2YtaW5kZXhlcyBwYXR0ZXJuOlxuICAgKiAgIC0gTWFzdGVyIGluZGV4IGZpbGUgKG1ldGEueWFtbCkgd2l0aCBwb2ludGVycyB0byBzaGFyZCBpbmRpY2VzXG4gICAqICAgLSBFYWNoIHNoYXJkIG1haW50YWlucyBpdHMgb3duIGxvY2FsIGluZGV4XG4gICAqICAgLSBQZXJpb2RpYyBpbmRleCBjb21wYWN0aW9uIGFuZCBvcHRpbWl6YXRpb25cbiAgICogLSBQZXJzaXN0ZW50IGluZGV4IHN0b3JhZ2UgdG8gZGlza1xuICAgKiAtIEluY3JlbWVudGFsIGluZGV4IHVwZGF0ZXMgZm9yIGxhcmdlIGRhdGFzZXRzXG4gICAqXG4gICAqIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGFjaGlldmVkOlxuICAgKiAtIFByZXZpb3VzOiB+MTAwbXMgZm9yIDEwLDAwMCBlbnRyaWVzIChsaW5lYXIgc2NhbilcbiAgICogLSBDdXJyZW50OiA8NW1zIGZvciBzYW1lIGRhdGFzZXQgKGluZGV4ZWQgc2VhcmNoKVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlYXJjaChvcHRpb25zOiBNZW1vcnlTZWFyY2hPcHRpb25zID0ge30pOiBQcm9taXNlPE1lbW9yeUVudHJ5W10+IHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IFNhbml0aXplIHNlYXJjaCBxdWVyeSAodXNlIHJlZ3VsYXIgc2FuaXRpemVJbnB1dCBmb3IgcXVlcmllcylcbiAgICBjb25zdCBzYW5pdGl6ZWRRdWVyeSA9IG9wdGlvbnMucXVlcnkgP1xuICAgICAgc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShvcHRpb25zLnF1ZXJ5KS5ub3JtYWxpemVkQ29udGVudCwgMjAwKSA6XG4gICAgICB1bmRlZmluZWQ7XG5cbiAgICAvLyBVc2UgaW5kZXhlZCBzZWFyY2ggaWYgYXZhaWxhYmxlIChJc3N1ZSAjOTg0KVxuICAgIGlmICh0aGlzLnNlYXJjaEluZGV4LmlzSW5kZXhlZCkge1xuICAgICAgY29uc3Qgc2VhcmNoUXVlcnk6IFNlYXJjaFF1ZXJ5ID0ge1xuICAgICAgICBjb250ZW50OiBzYW5pdGl6ZWRRdWVyeSxcbiAgICAgICAgdGFnczogb3B0aW9ucy50YWdzID8gdGhpcy5zYW5pdGl6ZVRhZ3Mob3B0aW9ucy50YWdzKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0ZUZyb206IG9wdGlvbnMuc3RhcnREYXRlLFxuICAgICAgICBkYXRlVG86IG9wdGlvbnMuZW5kRGF0ZSxcbiAgICAgICAgcHJpdmFjeUxldmVsOiBvcHRpb25zLnByaXZhY3lMZXZlbCBhcyBQcml2YWN5TGV2ZWwsXG4gICAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzZWFyY2hSZXN1bHRzID0gdGhpcy5zZWFyY2hJbmRleC5zZWFyY2goc2VhcmNoUXVlcnksIHRoaXMuZW50cmllcyk7XG4gICAgICByZXR1cm4gc2VhcmNoUmVzdWx0cy5tYXAocmVzdWx0ID0+IHJlc3VsdC5lbnRyeSk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gbGluZWFyIHNlYXJjaCBmb3Igc21hbGwgZGF0YXNldHNcbiAgICBsZXQgcmVzdWx0czogTWVtb3J5RW50cnlbXSA9IFtdO1xuICAgIGNvbnN0IHF1ZXJ5TG93ZXIgPSBzYW5pdGl6ZWRRdWVyeT8udG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBzZWFyY2hUYWdzID0gb3B0aW9ucy50YWdzICYmIG9wdGlvbnMudGFncy5sZW5ndGggPiAwID8gdGhpcy5zYW5pdGl6ZVRhZ3Mob3B0aW9ucy50YWdzKSA6IG51bGw7XG5cbiAgICAvLyBTaW5nbGUgaXRlcmF0aW9uIHRocm91Z2ggZW50cmllcyB3aXRoIGFsbCBmaWx0ZXJzIGFwcGxpZWRcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcy52YWx1ZXMoKSkge1xuICAgICAgLy8gUHJpdmFjeSBsZXZlbCBjaGVja1xuICAgICAgaWYgKG9wdGlvbnMucHJpdmFjeUxldmVsICYmIFxuICAgICAgICAgICF0aGlzLmNhbkFjY2Vzc1ByaXZhY3lMZXZlbChlbnRyeS5wcml2YWN5TGV2ZWwgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1BSSVZBQ1lfTEVWRUwsIG9wdGlvbnMucHJpdmFjeUxldmVsKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUXVlcnkgdGV4dCBjaGVja1xuICAgICAgaWYgKHF1ZXJ5TG93ZXIpIHtcbiAgICAgICAgY29uc3QgY29udGVudE1hdGNoID0gZW50cnkuY29udGVudC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5TG93ZXIpO1xuICAgICAgICBjb25zdCB0YWdNYXRjaCA9IGVudHJ5LnRhZ3M/LnNvbWUodGFnID0+IHRhZy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5TG93ZXIpKTtcbiAgICAgICAgaWYgKCFjb250ZW50TWF0Y2ggJiYgIXRhZ01hdGNoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVGFnIGZpbHRlciBjaGVja1xuICAgICAgaWYgKHNlYXJjaFRhZ3MgJiYgIXNlYXJjaFRhZ3Muc29tZShzZWFyY2hUYWcgPT4gZW50cnkudGFncz8uaW5jbHVkZXMoc2VhcmNoVGFnKSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERhdGUgcmFuZ2UgY2hlY2tzXG4gICAgICBpZiAob3B0aW9ucy5zdGFydERhdGUgJiYgZW50cnkudGltZXN0YW1wIDwgb3B0aW9ucy5zdGFydERhdGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAob3B0aW9ucy5lbmREYXRlICYmIGVudHJ5LnRpbWVzdGFtcCA+IG9wdGlvbnMuZW5kRGF0ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW50cnkgcGFzc2VzIGFsbCBmaWx0ZXJzXG4gICAgICByZXN1bHRzLnB1c2goZW50cnkpO1xuICAgIH1cbiAgICBcbiAgICAvLyBTb3J0IGJ5IHRpbWVzdGFtcCAobmV3ZXN0IGZpcnN0KSAtIHVzaW5nIHN0cmluZyBjb21wYXJpc29uIGZvciBJRHMgYXMgc2Vjb25kYXJ5IHNvcnRcbiAgICByZXN1bHRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcHMgYXJlIERhdGUgb2JqZWN0cyBmb3Igc29ydGluZ1xuICAgICAgY29uc3QgYlRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYi50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IGFUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGEudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICBjb25zdCB0aW1lRGlmZiA9IGJUaW1lIC0gYVRpbWU7XG4gICAgICBpZiAodGltZURpZmYgIT09IDApIHJldHVybiB0aW1lRGlmZjtcbiAgICAgIC8vIElmIHRpbWVzdGFtcHMgYXJlIGV4YWN0bHkgdGhlIHNhbWUsIHNvcnQgYnkgSUQgKHdoaWNoIGNvbnRhaW5zIHRpbWVzdGFtcClcbiAgICAgIHJldHVybiBiLmlkLmxvY2FsZUNvbXBhcmUoYS5pZCk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQXBwbHkgbGltaXRcbiAgICBpZiAob3B0aW9ucy5saW1pdCAmJiBvcHRpb25zLmxpbWl0ID4gMCkge1xuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc2xpY2UoMCwgb3B0aW9ucy5saW1pdCk7XG4gICAgfVxuICAgIFxuICAgIC8vIExvZyBzZWFyY2ggb3BlcmF0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfU0VBUkNIRUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdNZW1vcnkuc2VhcmNoJyxcbiAgICAgIGRldGFpbHM6IGBTZWFyY2hlZCBtZW1vcmllcyB3aXRoIHF1ZXJ5OiAke3Nhbml0aXplZFF1ZXJ5IHx8ICdub25lJ30sIGZvdW5kICR7cmVzdWx0cy5sZW5ndGh9IHJlc3VsdHNgXG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgYSBzcGVjaWZpYyBtZW1vcnkgZW50cnkgYnkgSURcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRFbnRyeShpZDogc3RyaW5nKTogUHJvbWlzZTxNZW1vcnlFbnRyeSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGlkKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERlbGV0ZSBhIG1lbW9yeSBlbnRyeVxuICAgKiBTRUNVUklUWTogVmFsaWRhdGVzIHBlcm1pc3Npb25zIGFuZCBsb2dzIGRlbGV0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlRW50cnkoaWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChpZCk7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvLyBTRUNVUklUWTogQ2hlY2sgaWYgc2Vuc2l0aXZlIG1lbW9yaWVzIGNhbiBiZSBkZWxldGVkXG4gICAgaWYgKGVudHJ5LnByaXZhY3lMZXZlbCA9PT0gJ3NlbnNpdGl2ZScpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5TRU5TSVRJVkVfTUVNT1JZX0RFTEVURUQsXG4gICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5LmRlbGV0ZUVudHJ5JyxcbiAgICAgICAgZGV0YWlsczogYFNlbnNpdGl2ZSBtZW1vcnkgJHtpZH0gZGVsZXRlZGBcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGlkKTtcbiAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgICBcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBmb3JtYXR0ZWQgY29udGVudCBvZiBhbGwgbWVtb3J5IGVudHJpZXNcbiAgICogUmV0dXJucyBlbnRyaWVzIGFzIGEgcmVhZGFibGUgc3RyaW5nIGZvciBkaXNwbGF5XG4gICAqL1xuICBnZXQgY29udGVudCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmVudHJpZXMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuICdObyBjb250ZW50IHN0b3JlZCc7XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0IGVudHJpZXMgYXMgcmVhZGFibGUgY29udGVudCAobmV3ZXN0IGZpcnN0KVxuICAgIGNvbnN0IHNvcnRlZEVudHJpZXMgPSBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcHMgYXJlIERhdGUgb2JqZWN0cyBmb3Igc29ydGluZ1xuICAgICAgICBjb25zdCBhVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChhLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBiVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChiLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICByZXR1cm4gYlRpbWUgLSBhVGltZTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHNvcnRlZEVudHJpZXMubWFwKGVudHJ5ID0+IHtcbiAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcCBpcyBEYXRlIG9iamVjdCBiZWZvcmUgY2FsbGluZyB0b0lTT1N0cmluZ1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGVudHJ5LnRpbWVzdGFtcCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHRhZ3MgPSBlbnRyeS50YWdzICYmIGVudHJ5LnRhZ3MubGVuZ3RoID4gMCA/IGAgWyR7ZW50cnkudGFncy5qb2luKCcsICcpfV1gIDogJyc7XG4gICAgICByZXR1cm4gYFske3RpbWVzdGFtcH1dJHt0YWdzfTogJHtlbnRyeS5jb250ZW50fWA7XG4gICAgfSkuam9pbignXFxuXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogRW5mb3JjZSByZXRlbnRpb24gcG9saWN5IGJ5IHJlbW92aW5nIGV4cGlyZWQgZW50cmllc1xuICAgKiBTRUNVUklUWTogRW5zdXJlcyBtZW1vcnkgZG9lc24ndCBncm93IHVuYm91bmRlZFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuZm9yY2VSZXRlbnRpb25Qb2xpY3koKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBkZWxldGVkQ291bnQgPSAwO1xuICAgIFxuICAgIC8vIFJlbW92ZSBleHBpcmVkIGVudHJpZXNcbiAgICBmb3IgKGNvbnN0IFtpZCwgZW50cnldIG9mIHRoaXMuZW50cmllcykge1xuICAgICAgaWYgKGVudHJ5LmV4cGlyZXNBdCAmJiBlbnRyeS5leHBpcmVzQXQgPCBub3cpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShpZCk7XG4gICAgICAgIGRlbGV0ZWRDb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiBzdGlsbCBhdCBvciBvdmVyIGNhcGFjaXR5LCByZW1vdmUgb2xkZXN0IGVudHJpZXMgdG8gbWFrZSByb29tIGZvciBvbmUgbW9yZVxuICAgIGlmICh0aGlzLmVudHJpZXMuc2l6ZSA+PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHNvcnRlZEVudHJpZXMgPSBBcnJheS5mcm9tKHRoaXMuZW50cmllcy5lbnRyaWVzKCkpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wcyBhcmUgRGF0ZSBvYmplY3RzIGZvciBzb3J0aW5nXG4gICAgICAgICAgY29uc3QgYVRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYVsxXS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgICBjb25zdCBiVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChiWzFdLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICAgIHJldHVybiBhVGltZSAtIGJUaW1lO1xuICAgICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gUmVtb3ZlIG9uZSBleHRyYSB0byBtYWtlIHJvb20gZm9yIG5ldyBlbnRyeVxuICAgICAgY29uc3QgdG9EZWxldGUgPSBNYXRoLm1heCgxLCB0aGlzLmVudHJpZXMuc2l6ZSAtIHRoaXMubWF4RW50cmllcyArIDEpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b0RlbGV0ZSAmJiBpIDwgc29ydGVkRW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKHNvcnRlZEVudHJpZXNbaV1bMF0pO1xuICAgICAgICBkZWxldGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKGRlbGV0ZWRDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLlJFVEVOVElPTl9QT0xJQ1lfRU5GT1JDRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5LmVuZm9yY2VSZXRlbnRpb25Qb2xpY3knLFxuICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke2RlbGV0ZWRDb3VudH0gZXhwaXJlZCBtZW1vcmllc2BcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZGVsZXRlZENvdW50O1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYXIgYWxsIG1lbW9yeSBlbnRyaWVzXG4gICAqIFNFQ1VSSVRZOiBSZXF1aXJlcyBjb25maXJtYXRpb24gYW5kIGxvZ3MgdGhlIGFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFyQWxsKGNvbmZpcm06IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghY29uZmlybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgY2xlYXIgcmVxdWlyZXMgY29uZmlybWF0aW9uJyk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5lbnRyaWVzLnNpemU7XG4gICAgdGhpcy5lbnRyaWVzLmNsZWFyKCk7XG4gICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG4gICAgXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfQ0xFQVJFRCxcbiAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICBzb3VyY2U6ICdNZW1vcnkuY2xlYXJBbGwnLFxuICAgICAgZGV0YWlsczogYENsZWFyZWQgYWxsICR7Y291bnR9IG1lbW9yeSBlbnRyaWVzYFxuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGVuc3VyZSBhIHZhbHVlIGlzIGEgdmFsaWQgRGF0ZSBvYmplY3RcbiAgICogRklYICMxMDY5OiBWYWxpZGF0ZXMgYW5kIGNvbnZlcnRzIHRpbWVzdGFtcHMgdG8gRGF0ZSBvYmplY3RzXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZURhdGVPYmplY3QodmFsdWU6IGFueSk6IERhdGUge1xuICAgIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRgKTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbHJlYWR5IGEgRGF0ZSwgdmFsaWRhdGUgaXRcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBpZiAoaXNOYU4odmFsdWUuZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgRGF0ZSBvYmplY3QgcHJvdmlkZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gY29udmVydCB0byBEYXRlXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICBpZiAoaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0ZSB2YWx1ZTogJHt2YWx1ZX1gKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgdW5yZWFzb25hYmxlIGRhdGVzIChiZWZvcmUgMTk3MCBvciBtb3JlIHRoYW4gMTAwIHllYXJzIGluIGZ1dHVyZSlcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IGRhdGUuZ2V0VGltZSgpO1xuICAgIGlmICh0aW1lc3RhbXAgPCAwIHx8IHRpbWVzdGFtcCA+IG5vdyArICgxMDAgKiAzNjUgKiAyNCAqIDYwICogNjAgKiAxMDAwKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRlIHZhbHVlIG91dCBvZiByZWFzb25hYmxlIHJhbmdlOiAke3ZhbHVlfWApO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZW1vcnkgc3RhdGlzdGljc1xuICAgKi9cbiAgcHVibGljIGdldFN0YXRzKCk6IHtcbiAgICB0b3RhbEVudHJpZXM6IG51bWJlcjtcbiAgICB0b3RhbFNpemU6IG51bWJlcjtcbiAgICBvbGRlc3RFbnRyeT86IERhdGU7XG4gICAgbmV3ZXN0RW50cnk/OiBEYXRlO1xuICAgIHRhZ0ZyZXF1ZW5jeTogTWFwPHN0cmluZywgbnVtYmVyPjtcbiAgfSB7XG4gICAgbGV0IHRvdGFsU2l6ZSA9IDA7XG4gICAgbGV0IG9sZGVzdEVudHJ5OiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgIGxldCBuZXdlc3RFbnRyeTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0YWdGcmVxdWVuY3kgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcbiAgICAgIHRvdGFsU2l6ZSArPSBlbnRyeS5jb250ZW50Lmxlbmd0aDtcblxuICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wIGlzIGEgdmFsaWQgRGF0ZSBvYmplY3QgZm9yIGNvbXBhcmlzb25cbiAgICAgIC8vIFdoZW4gZW50cmllcyBhcmUgZWRpdGVkLCB0aW1lc3RhbXBzIG1pZ2h0IGJlIHN0cmluZ3NcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVudHJ5VGltZXN0YW1wID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGVudHJ5LnRpbWVzdGFtcCk7XG5cbiAgICAgICAgaWYgKCFvbGRlc3RFbnRyeSB8fCBlbnRyeVRpbWVzdGFtcCA8IG9sZGVzdEVudHJ5KSB7XG4gICAgICAgICAgb2xkZXN0RW50cnkgPSBlbnRyeVRpbWVzdGFtcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW5ld2VzdEVudHJ5IHx8IGVudHJ5VGltZXN0YW1wID4gbmV3ZXN0RW50cnkpIHtcbiAgICAgICAgICBuZXdlc3RFbnRyeSA9IGVudHJ5VGltZXN0YW1wO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBMb2cgdGhlIGVycm9yIGJ1dCBjb250aW51ZSBwcm9jZXNzaW5nIG90aGVyIGVudHJpZXNcbiAgICAgICAgbG9nZ2VyLndhcm4oYEludmFsaWQgdGltZXN0YW1wIGluIG1lbW9yeSBlbnRyeTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICAgICAgLy8gU2tpcCB0aGlzIGVudHJ5J3MgdGltZXN0YW1wIGZvciBzdGF0aXN0aWNzXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBlbnRyeS50YWdzPy5mb3JFYWNoKHRhZyA9PiB7XG4gICAgICAgIHRhZ0ZyZXF1ZW5jeS5zZXQodGFnLCAodGFnRnJlcXVlbmN5LmdldCh0YWcpIHx8IDApICsgMSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvdGFsRW50cmllczogdGhpcy5lbnRyaWVzLnNpemUsXG4gICAgICB0b3RhbFNpemUsXG4gICAgICBvbGRlc3RFbnRyeSxcbiAgICAgIG5ld2VzdEVudHJ5LFxuICAgICAgdGFnRnJlcXVlbmN5XG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBtZW1vcnkgZWxlbWVudFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHZhbGlkYXRlKCk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci52YWxpZGF0ZSgpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZXJyb3JzIGFycmF5IGlmIG5vdCBwcmVzZW50XG4gICAgaWYgKCFyZXN1bHQuZXJyb3JzKSB7XG4gICAgICByZXN1bHQuZXJyb3JzID0gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgbWVtb3J5LXNwZWNpZmljIHZhbGlkYXRpb25cbiAgICBpZiAodGhpcy5yZXRlbnRpb25EYXlzIDwgTUVNT1JZX0NPTlNUQU5UUy5NSU5fUkVURU5USU9OX0RBWVMgfHwgdGhpcy5yZXRlbnRpb25EYXlzID4gTUVNT1JZX0NPTlNUQU5UUy5NQVhfUkVURU5USU9OX0RBWVMpIHtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCh7XG4gICAgICAgIGZpZWxkOiAncmV0ZW50aW9uRGF5cycsXG4gICAgICAgIG1lc3NhZ2U6IGBSZXRlbnRpb24gZGF5cyBtdXN0IGJlIGJldHdlZW4gJHtNRU1PUllfQ09OU1RBTlRTLk1JTl9SRVRFTlRJT05fREFZU30gYW5kICR7TUVNT1JZX0NPTlNUQU5UUy5NQVhfUkVURU5USU9OX0RBWVN9YCxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcidcbiAgICAgIH0gYXMgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMubWF4RW50cmllcyA8IDEgfHwgdGhpcy5tYXhFbnRyaWVzID4gTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUKSB7XG4gICAgICByZXN1bHQuZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogJ21heEVudHJpZXMnLFxuICAgICAgICBtZXNzYWdlOiBgTWF4IGVudHJpZXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICR7TUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUfWAsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InXG4gICAgICB9IGFzIFZhbGlkYXRpb25FcnJvcik7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIG1lbW9yeSBzaXplXG4gICAgY29uc3Qgc3RhdHMgPSB0aGlzLmdldFN0YXRzKCk7XG4gICAgaWYgKHN0YXRzLnRvdGFsU2l6ZSA+IE1FTU9SWV9DT05TVEFOVFMuTUFYX01FTU9SWV9TSVpFKSB7XG4gICAgICByZXN1bHQuZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogJ21lbW9yeScsXG4gICAgICAgIG1lc3NhZ2U6IGBUb3RhbCBtZW1vcnkgc2l6ZSAoJHtzdGF0cy50b3RhbFNpemV9KSBleGNlZWRzIGxpbWl0ICgke01FTU9SWV9DT05TVEFOVFMuTUFYX01FTU9SWV9TSVpFfSlgLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJ1xuICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgdmFsaWRpdHkgYmFzZWQgb24gb3VyIGNoZWNrc1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICB2YWxpZDogcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDBcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogU2VyaWFsaXplIG1lbW9yeSB0byBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMuZXh0ZW5zaW9ucyxcbiAgICAgIGVudHJpZXM6IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9XG4gIFxuICAvKipcbiAgICogRGVzZXJpYWxpemUgbWVtb3J5IGZyb20gc3RyaW5nXG4gICAqIFNFQ1VSSVRZOiBWYWxpZGF0ZXMgYWxsIGxvYWRlZCBkYXRhXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZGVzZXJpYWxpemUoZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGJhc2ljIHN0cnVjdHVyZVxuICAgICAgaWYgKCFwYXJzZWQuaWQgfHwgIXBhcnNlZC50eXBlIHx8IHBhcnNlZC50eXBlICE9PSBFbGVtZW50VHlwZS5NRU1PUlkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1lbW9yeSBkYXRhIGZvcm1hdCcpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBVcGRhdGUgcHJvcGVydGllc1xuICAgICAgdGhpcy5pZCA9IHBhcnNlZC5pZDtcbiAgICAgIHRoaXMudmVyc2lvbiA9IHBhcnNlZC52ZXJzaW9uIHx8ICcxLjAuMCc7XG4gICAgICB0aGlzLm1ldGFkYXRhID0gcGFyc2VkLm1ldGFkYXRhIHx8IHt9O1xuICAgICAgdGhpcy5leHRlbnNpb25zID0gcGFyc2VkLmV4dGVuc2lvbnMgfHwge307XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGFuZCByZWxvYWQgZW50cmllc1xuICAgICAgdGhpcy5lbnRyaWVzLmNsZWFyKCk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJzZWQuZW50cmllcykpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBwYXJzZWQuZW50cmllcykge1xuICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWRFbnRyeShlbnRyeSkpIHtcbiAgICAgICAgICAgIC8vIFVzZSBvcHRpbWl6ZWQgc2FuaXRpemF0aW9uIHdpdGggY2FjaGluZ1xuICAgICAgICAgICAgZW50cnkuY29udGVudCA9IHRoaXMuc2FuaXRpemVXaXRoQ2FjaGUoZW50cnkuY29udGVudCwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUllfU0laRSk7XG4gICAgICAgICAgICBlbnRyeS50YWdzID0gdGhpcy5zYW5pdGl6ZVRhZ3MoZW50cnkudGFncyB8fCBbXSk7XG4gICAgICAgICAgICBlbnRyeS50aW1lc3RhbXAgPSBuZXcgRGF0ZShlbnRyeS50aW1lc3RhbXApO1xuICAgICAgICAgICAgaWYgKGVudHJ5LmV4cGlyZXNBdCkge1xuICAgICAgICAgICAgICBlbnRyeS5leHBpcmVzQXQgPSBuZXcgRGF0ZShlbnRyeS5leHBpcmVzQXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChlbnRyeS5pZCwgZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbmZvcmNlIHJldGVudGlvbiBwb2xpY3kgYWZ0ZXIgbG9hZGluZ1xuICAgICAgdGhpcy5lbmZvcmNlUmV0ZW50aW9uUG9saWN5KCk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9ERVNFUklBTElaRV9GQUlMRUQsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeS5kZXNlcmlhbGl6ZScsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgbWVtb3J5OiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgbWVtb3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gUHJpdmF0ZSBoZWxwZXIgbWV0aG9kc1xuICBcbiAgcHJpdmF0ZSBjYWxjdWxhdGVFeHBpcnlEYXRlKCk6IERhdGUge1xuICAgIGNvbnN0IGV4cGlyeSA9IG5ldyBEYXRlKCk7XG4gICAgZXhwaXJ5LnNldERhdGUoZXhwaXJ5LmdldERhdGUoKSArIHRoaXMucmV0ZW50aW9uRGF5cyk7XG4gICAgcmV0dXJuIGV4cGlyeTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzYW5pdGl6ZVRhZ3ModGFnczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBMaW1pdCBudW1iZXIgb2YgdGFncyBhbmQgc2FuaXRpemUgZWFjaFxuICAgIGNvbnN0IGxpbWl0ZWRUYWdzID0gdGFncy5zbGljZSgwLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9UQUdTX1BFUl9FTlRSWSk7XG4gICAgXG4gICAgcmV0dXJuIGxpbWl0ZWRUYWdzXG4gICAgICAubWFwKHRhZyA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh0YWcpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgICAgICByZXR1cm4gc2FuaXRpemVJbnB1dChub3JtYWxpemVkLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9UQUdfTEVOR1RIKTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKHRhZyA9PiB0YWcgJiYgdGFnLmxlbmd0aCA+IDApO1xuICB9XG4gIFxuICBwcml2YXRlIHNhbml0aXplTWV0YWRhdGEobWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFtZXRhZGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVg6IFNhbml0aXplIG1ldGFkYXRhIHZhbHVlc1xuICAgIGNvbnN0IHNhbml0aXplZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IG1heEtleXMgPSBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRVRBREFUQV9LRVlTO1xuICAgIGxldCBrZXlDb3VudCA9IDA7XG4gICAgXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEpKSB7XG4gICAgICBpZiAoa2V5Q291bnQgPj0gbWF4S2V5cykgYnJlYWs7XG4gICAgICBcbiAgICAgIGNvbnN0IHNhbml0aXplZEtleSA9IHNhbml0aXplSW5wdXQoa2V5LCBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRVRBREFUQV9LRVlfTEVOR1RIKTtcbiAgICAgIGlmIChzYW5pdGl6ZWRLZXkgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzYW5pdGl6ZWRbc2FuaXRpemVkS2V5XSA9IHNhbml0aXplSW5wdXQodmFsdWUsIE1FTU9SWV9DT05TVEFOVFMuTUFYX01FVEFEQVRBX1ZBTFVFX0xFTkdUSCk7XG4gICAgICAgIGtleUNvdW50Kys7XG4gICAgICB9IGVsc2UgaWYgKHNhbml0aXplZEtleSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNhbml0aXplZFtzYW5pdGl6ZWRLZXldID0gdmFsdWU7XG4gICAgICAgIGtleUNvdW50Kys7XG4gICAgICB9XG4gICAgICAvLyBTa2lwIG90aGVyIHR5cGVzIGZvciBzZWN1cml0eVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG4gIFxuICBwcml2YXRlIGNhbkFjY2Vzc1ByaXZhY3lMZXZlbChlbnRyeUxldmVsOiBzdHJpbmcsIHJlcXVlc3RlZExldmVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsZXZlbHMgPSBNRU1PUllfQ09OU1RBTlRTLlBSSVZBQ1lfTEVWRUxTO1xuICAgIGNvbnN0IGVudHJ5SW5kZXggPSBsZXZlbHMuaW5kZXhPZihlbnRyeUxldmVsIGFzIFByaXZhY3lMZXZlbCk7XG4gICAgY29uc3QgcmVxdWVzdGVkSW5kZXggPSBsZXZlbHMuaW5kZXhPZihyZXF1ZXN0ZWRMZXZlbCBhcyBQcml2YWN5TGV2ZWwpO1xuICAgIFxuICAgIC8vIENhbiBvbmx5IGFjY2VzcyBlbnRyaWVzIGF0IG9yIGJlbG93IHRoZSByZXF1ZXN0ZWQgcHJpdmFjeSBsZXZlbFxuICAgIC8vIGUuZy4sIGlmIHJlcXVlc3RpbmcgJ3ByaXZhdGUnLCBjYW4gc2VlICdwdWJsaWMnIGFuZCAncHJpdmF0ZScgYnV0IG5vdCAnc2Vuc2l0aXZlJ1xuICAgIHJldHVybiBlbnRyeUluZGV4IDw9IHJlcXVlc3RlZEluZGV4O1xuICB9XG4gIFxuICBwcml2YXRlIGlzVmFsaWRFbnRyeShlbnRyeTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVudHJ5ICYmXG4gICAgICB0eXBlb2YgZW50cnkuaWQgPT09ICdzdHJpbmcnICYmXG4gICAgICB0eXBlb2YgZW50cnkuY29udGVudCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGVudHJ5LnRpbWVzdGFtcCAmJlxuICAgICAgKCFlbnRyeS50YWdzIHx8IEFycmF5LmlzQXJyYXkoZW50cnkudGFncykpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGltaXplZCBzYW5pdGl6YXRpb24gd2l0aCBjaGVja3N1bSBjYWNoaW5nXG4gICAqIEF2b2lkcyByZS1zYW5pdGl6aW5nIGNvbnRlbnQgdGhhdCBoYXNuJ3QgY2hhbmdlZFxuICAgKiBAcGFyYW0gY29udGVudCBDb250ZW50IHRvIHNhbml0aXplXG4gICAqIEBwYXJhbSBtYXhMZW5ndGggTWF4aW11bSBhbGxvd2VkIGxlbmd0aFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgY29udGVudFxuICAgKi9cbiAgcHJpdmF0ZSBzYW5pdGl6ZVdpdGhDYWNoZShjb250ZW50OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAvLyBHZW5lcmF0ZSBjaGVja3N1bSBmb3IgdGhlIGlucHV0XG4gICAgY29uc3QgY2hlY2tzdW0gPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGNvbnRlbnQpLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSd2ZSBhbHJlYWR5IHNhbml0aXplZCB0aGlzIGV4YWN0IGNvbnRlbnRcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke2NoZWNrc3VtfToke21heExlbmd0aH1gO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gc2FuaXRpemF0aW9uXG4gICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVNZW1vcnlDb250ZW50KGNvbnRlbnQsIG1heExlbmd0aCk7XG5cbiAgICAvLyBDYWNoZSB0aGUgcmVzdWx0IChsaW1pdCBjYWNoZSBzaXplIHRvIHByZXZlbnQgbWVtb3J5IGlzc3VlcylcbiAgICBpZiAodGhpcy5zYW5pdGl6YXRpb25DYWNoZS5zaXplID4gMTAwMCkge1xuICAgICAgLy8gUmVtb3ZlIG9sZGVzdCBlbnRyaWVzIChzaW1wbGUgRklGTylcbiAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5zYW5pdGl6YXRpb25DYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKGZpcnN0S2V5KSB0aGlzLnNhbml0aXphdGlvbkNhY2hlLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgfVxuICAgIHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUuc2V0KGNhY2hlS2V5LCBzYW5pdGl6ZWQpO1xuXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBzZWFyY2ggaW5kZXggd2l0aCByZXRyeSBsb2dpY1xuICAgKiBBdHRlbXB0cyB0byBidWlsZCB0aGUgaW5kZXggdXAgdG8gMyB0aW1lcyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICogVGhpcyBlbnN1cmVzIHNlYXJjaCBmdW5jdGlvbmFsaXR5IGV2ZW4gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBmYWlsdXJlc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFNlYXJjaEluZGV4V2l0aFJldHJ5KHJldHJpZXMgPSAzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSByZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VhcmNoSW5kZXguYnVpbGRJbmRleCh0aGlzLmVudHJpZXMpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYFNlYXJjaCBpbmRleCBidWlsdCBzdWNjZXNzZnVsbHkgb24gYXR0ZW1wdCAke2F0dGVtcHR9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFNlYXJjaCBpbmRleCBidWlsZCBhdHRlbXB0ICR7YXR0ZW1wdH0gZmFpbGVkYCwge1xuICAgICAgICAgIGVycm9yOiBsYXN0RXJyb3IubWVzc2FnZSxcbiAgICAgICAgICBlbnRyaWVzQ291bnQ6IHRoaXMuZW50cmllcy5zaXplXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChhdHRlbXB0IDwgcmV0cmllcykge1xuICAgICAgICAgIC8vIEV4cG9uZW50aWFsIGJhY2tvZmY6IDEwMG1zLCAyMDBtcywgNDAwbXNcbiAgICAgICAgICBjb25zdCBkZWxheSA9IE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKSAqIDEwMDtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgZGVsYXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGdldCBoZXJlLCBhbGwgcmV0cmllcyBmYWlsZWRcbiAgICB0aHJvdyBsYXN0RXJyb3IgfHwgbmV3IEVycm9yKCdGYWlsZWQgdG8gYnVpbGQgc2VhcmNoIGluZGV4Jyk7XG4gIH1cbn0iXX0=
|
|
719
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWhELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsc0JBQXNCLEVBQWdDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBa0MsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFOUI7OztHQUdHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFFOUI7OztHQUdHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxtQkFBbUIsQ0FBQztBQUVyRCxrQ0FBa0M7QUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFhLENBQUMsQ0FBQztBQUV4Qyx3RUFBd0U7QUFDeEUsTUFBTSxDQUFDLFNB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LENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDdEUsTUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsT0FBTyxTQUFTLEVBQUU7b0JBQzFELEtBQUssRUFBRSxTQUFTLENBQUMsT0FBTztvQkFDeEIsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtpQkFDaEMsQ0FBQyxDQUFDO2dCQUVILElBQUksT0FBTyxHQUFHLE9BQU8sRUFBRSxDQUFDO29CQUN0QiwyQ0FBMkM7b0JBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7b0JBQzdDLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzNELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELHFDQUFxQztRQUNyQyxNQUFNLFNBQVMsSUFBSSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQy9ELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVtb3J5IEVsZW1lbnQgLSBQZXJzaXN0ZW50IGNvbnRleHQgc3RvcmFnZSBmb3IgY29udGludWl0eSBhbmQgbGVhcm5pbmdcbiAqIFxuICogUHJvdmlkZXMgbXVsdGlwbGUgc3RvcmFnZSBiYWNrZW5kcywgcmV0ZW50aW9uIHBvbGljaWVzLCBhbmQgc2VhcmNoIGNhcGFiaWxpdGllc1xuICogZm9yIG1haW50YWluaW5nIGNvbnRleHQgYWNyb3NzIHNlc3Npb25zIGFuZCBpbnRlcmFjdGlvbnMuXG4gKiBcbiAqIFNFQ1VSSVRZIE1FQVNVUkVTIElNUExFTUVOVEVEOlxuICogMS4gSW5wdXQgc2FuaXRpemF0aW9uIGZvciBhbGwgbWVtb3J5IGNvbnRlbnRcbiAqIDIuIE1lbW9yeSBzaXplIGxpbWl0cyB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGhcbiAqIDMuIFBhdGggdmFsaWRhdGlvbiBmb3IgZmlsZS1iYXNlZCBzdG9yYWdlXG4gKiA0LiBSZXRlbnRpb24gcG9saWN5IGVuZm9yY2VtZW50XG4gKiA1LiBQcml2YWN5IGxldmVsIGFjY2VzcyBjb250cm9sXG4gKiA2LiBBdWRpdCBsb2dnaW5nIGZvciBhbGwgb3BlcmF0aW9uc1xuICovXG5cbmltcG9ydCB7IEJhc2VFbGVtZW50IH0gZnJvbSAnLi4vQmFzZUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnQsIEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0LCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9pbmRleC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudE1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IE1FTU9SWV9DT05TVEFOVFMsIE1FTU9SWV9TRUNVUklUWV9FVkVOVFMsIFByaXZhY3lMZXZlbCwgU3RvcmFnZUJhY2tlbmQgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU1lbW9yeUlkIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBNZW1vcnlTZWFyY2hJbmRleCwgU2VhcmNoUXVlcnksIFNlYXJjaEluZGV4Q29uZmlnIH0gZnJvbSAnLi9NZW1vcnlTZWFyY2hJbmRleC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IERPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknO1xuaW1wb3J0IHsgSlNET00gfSBmcm9tICdqc2RvbSc7XG5cbi8qKlxuICogTWF4aW11bSBsZW5ndGggZm9yIGluZGl2aWR1YWwgdHJpZ2dlciB3b3JkcyB1c2VkIGluIEVuaGFuY2VkIEluZGV4XG4gKiBAY29uc3RhbnQge251bWJlcn1cbiAqL1xuY29uc3QgTUFYX1RSSUdHRVJfTEVOR1RIID0gNTA7XG5cbi8qKlxuICogVmFsaWRhdGlvbiBwYXR0ZXJuIGZvciB0cmlnZ2VyIHdvcmRzIC0gYWxsb3dzIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCBhbmQgdW5kZXJzY29yZXNcbiAqIEBjb25zdGFudCB7UmVnRXhwfVxuICovXG5jb25zdCBUUklHR0VSX1ZBTElEQVRJT05fUkVHRVggPSAvXlthLXpBLVowLTlcXC1fXSskLztcblxuLy8gSW5pdGlhbGl6ZSBET01QdXJpZnkgd2l0aCBKU0RPTVxuY29uc3Qgd2luZG93ID0gbmV3IEpTRE9NKCcnKS53aW5kb3c7XG5jb25zdCBwdXJpZnkgPSBET01QdXJpZnkod2luZG93IGFzIGFueSk7XG5cbi8vIENvbmZpZ3VyZSBET01QdXJpZnkgZm9yIG1lbW9yeSBjb250ZW50IC0gc3RyaXAgYWxsIEhUTUwgYnV0IGtlZXAgdGV4dFxucHVyaWZ5LnNldENvbmZpZyh7XG4gIEFMTE9XRURfVEFHUzogW10sICAvLyBObyBIVE1MIHRhZ3MgYWxsb3dlZFxuICBBTExPV0VEX0FUVFI6IFtdLCAgLy8gTm8gYXR0cmlidXRlcyBhbGxvd2VkXG4gIEtFRVBfQ09OVEVOVDogdHJ1ZSAvLyBLZWVwIHRleHQgY29udGVudFxufSk7XG5cbi8qKlxuICogU2FuaXRpemUgY29udGVudCBmb3IgbWVtb3J5IHN0b3JhZ2VcbiAqIE1vcmUgcGVybWlzc2l2ZSB0aGFuIHNhbml0aXplSW5wdXQgLSBhbGxvd3MgcHVuY3R1YXRpb24sIHF1b3RlcywgZXRjLlxuICogYnV0IHN0aWxsIHByZXZlbnRzIFhTUyBhbmQgY29udHJvbCBjaGFyYWN0ZXJzXG4gKi9cbmZ1bmN0aW9uIHNhbml0aXplTWVtb3J5Q29udGVudChjb250ZW50OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50IHx8IHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBcbiAgLy8gRmlyc3Qgbm9ybWFsaXplIFVuaWNvZGVcbiAgY29uc3Qgbm9ybWFsaXplZCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNvbnRlbnQpLm5vcm1hbGl6ZWRDb250ZW50O1xuICBcbiAgLy8gVXNlIERPTVB1cmlmeSB0byBzdHJpcCBhbnkgSFRNTC9YU1MgYXR0ZW1wdHMgYnV0IGtlZXAgdGV4dFxuICBjb25zdCBjbGVhbmVkID0gcHVyaWZ5LnNhbml0aXplKG5vcm1hbGl6ZWQpO1xuICBcbiAgLy8gUmVtb3ZlIG9ubHkgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBudWxsIGJ5dGVzXG4gIHJldHVybiBjbGVhbmVkXG4gICAgLnJlcGxhY2VBbGwoL1tcXHUwMDAwLVxcdTAwMDhcXHUwMDBCXFx1MDAwQ1xcdTAwMEUtXFx1MDAxRlxcdTAwN0ZdL2csICcnKSAvLyBOT1NPTkFSIC0gSW50ZW50aW9uYWxseSByZW1vdmluZyBjb250cm9sIGNoYXJzIGV4Y2VwdCBcXHQgXFxuIFxcciBmb3Igc2FuaXRpemF0aW9uXG4gICAgLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpXG4gICAgLnRyaW0oKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlNZXRhZGF0YSBleHRlbmRzIElFbGVtZW50TWV0YWRhdGEge1xuICBzdG9yYWdlQmFja2VuZD86IFN0b3JhZ2VCYWNrZW5kO1xuICByZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuICBwcml2YWN5TGV2ZWw/OiBQcml2YWN5TGV2ZWw7XG4gIHNlYXJjaGFibGU/OiBib29sZWFuO1xuICBtYXhFbnRyaWVzPzogbnVtYmVyO1xuICBlbmNyeXB0aW9uRW5hYmxlZD86IGJvb2xlYW47XG4gIC8vIFNlYXJjaCBpbmRleCBjb25maWd1cmF0aW9uIChJc3N1ZSAjOTg0KVxuICBpbmRleFRocmVzaG9sZD86IG51bWJlcjtcbiAgZW5hYmxlQ29udGVudEluZGV4PzogYm9vbGVhbjtcbiAgbWF4VGVybXNQZXJFbnRyeT86IG51bWJlcjtcbiAgbWluVGVybUxlbmd0aD86IG51bWJlcjtcbiAgLy8gVHJpZ2dlciB3b3JkcyBmb3IgRW5oYW5jZWQgSW5kZXggKElzc3VlICMxMTI0KVxuICB0cmlnZ2Vycz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeUVudHJ5IHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBEYXRlO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBwcml2YWN5TGV2ZWw/OiBQcml2YWN5TGV2ZWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5U2VhcmNoT3B0aW9ucyB7XG4gIHF1ZXJ5Pzogc3RyaW5nO1xuICB0YWdzPzogc3RyaW5nW107XG4gIHN0YXJ0RGF0ZT86IERhdGU7XG4gIGVuZERhdGU/OiBEYXRlO1xuICBsaW1pdD86IG51bWJlcjtcbiAgcHJpdmFjeUxldmVsPzogUHJpdmFjeUxldmVsO1xufVxuXG4vKipcbiAqIE1lbW9yeSBFbGVtZW50IEltcGxlbWVudGF0aW9uXG4gKlxuICogVE9ETzogTWVtb3J5IFNoYXJkaW5nIFN0cmF0ZWd5IChJc3N1ZSAjOTgxKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDdXJyZW50OiBTaW5nbGUgTWFwPGlkLCBlbnRyeT4gZm9yIGFsbCBtZW1vcmllc1xuICogUHJvYmxlbTogTGFyZ2UgbWVtb3J5IHNldHMgKD4xMEsgZW50cmllcykgY2F1c2UgcGVyZm9ybWFuY2UgZGVncmFkYXRpb25cbiAqXG4gKiBQbGFubmVkIFNoYXJkaW5nIEFyY2hpdGVjdHVyZTpcbiAqIDEuIFNoYXJkIG1lbW9yaWVzIGFjcm9zcyBtdWx0aXBsZSBmaWxlcyBiYXNlZCBvbiBoYXNoKG1lbW9yeUlkKSAlIHNoYXJkQ291bnRcbiAqIDIuIEVhY2ggc2hhcmQgZmlsZSA8MjU2S0IgZm9yIG9wdGltYWwgWUFNTCBwYXJzaW5nXG4gKiAzLiBNZW1vcnkgcmVmZXJlbmNlcyBzdG9yZWQgc2VwYXJhdGVseSBmcm9tIGNvbnRlbnQgKGxpa2UgZ2l0IG9iamVjdHMpXG4gKiA0LiBMYXJnZSBiaW5hcnkgY29udGVudCAoUERGcywgaW1hZ2VzKSBzdG9yZWQgYXMgZXh0ZXJuYWwgcmVmZXJlbmNlc1xuICpcbiAqIEJlbmVmaXRzOlxuICogLSBQYXJhbGxlbCBsb2FkaW5nIG9mIG1lbW9yeSBzaGFyZHNcbiAqIC0gUmVkdWNlZCBtZW1vcnkgZm9vdHByaW50IChsb2FkIG9ubHkgbmVlZGVkIHNoYXJkcylcbiAqIC0gQmV0dGVyIGNvcnJ1cHRpb24gcmVzaXN0YW5jZSAob25lIHNoYXJkIGZhaWx1cmUgZG9lc24ndCBhZmZlY3Qgb3RoZXJzKVxuICogLSBFZmZpY2llbnQgaW5jcmVtZW50YWwgdXBkYXRlc1xuICpcbiAqIFRPRE86IENvbnRlbnQgSW50ZWdyaXR5IFZlcmlmaWNhdGlvbiAoSXNzdWUgIzk4MilcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBZGQgU0hBLTI1NiBoYXNoZXMgdG8gZGV0ZWN0OlxuICogLSBBY2NpZGVudGFsIGNvcnJ1cHRpb24gZnJvbSBkaXNrIGVycm9yc1xuICogLSBJbnRlbnRpb25hbCB0YW1wZXJpbmcgd2l0aCBtZW1vcnkgZmlsZXNcbiAqIC0gVmVyc2lvbiBjb25mbGljdHMgZHVyaW5nIGNvbmN1cnJlbnQgYWNjZXNzXG4gKlxuICogSW1wbGVtZW50YXRpb246XG4gKiAtIFN0b3JlIGhhc2ggaW4gbWVtb3J5IG1ldGFkYXRhXG4gKiAtIFZlcmlmeSBvbiBsb2FkLCB3YXJuIG9uIG1pc21hdGNoXG4gKiAtIE9wdGlvbiB0byBhdXRvLXJlc3RvcmUgZnJvbSBiYWNrdXAgb24gY29ycnVwdGlvblxuICpcbiAqIFRPRE86IE1lbW9yeSBDYXBhY2l0eSBNYW5hZ2VtZW50IChJc3N1ZSAjOTgzKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDdXJyZW50OiBTeW5jaHJvbm91cyByZXRlbnRpb24gZW5mb3JjZW1lbnQgb24gZWFjaCBhZGRcbiAqIEJldHRlcjogQmFja2dyb3VuZCBjbGVhbnVwIHdpdGggc21hcnQgdHJpZ2dlcnM6XG4gKiAtIENsZWFudXAgd2hlbiA5MCUgY2FwYWNpdHkgcmVhY2hlZFxuICogLSBCYXRjaCBkZWxldGlvbnMgZm9yIGVmZmljaWVuY3lcbiAqIC0gTFJVIGV2aWN0aW9uIHdpdGggYWNjZXNzIHRyYWNraW5nXG4gKiAtIFByZXNlcnZlIFwicGlubmVkXCIgbWVtb3JpZXMgcmVnYXJkbGVzcyBvZiBhZ2VcbiAqL1xuZXhwb3J0IGNsYXNzIE1lbW9yeSBleHRlbmRzIEJhc2VFbGVtZW50IGltcGxlbWVudHMgSUVsZW1lbnQge1xuICAvLyBNZW1vcnktc3BlY2lmaWMgcHJvcGVydGllc1xuICBwcml2YXRlIGVudHJpZXM6IE1hcDxzdHJpbmcsIE1lbW9yeUVudHJ5PiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSBzdG9yYWdlQmFja2VuZDogU3RvcmFnZUJhY2tlbmQ7XG4gIHByaXZhdGUgcmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICBwcml2YXRlIHByaXZhY3lMZXZlbDogUHJpdmFjeUxldmVsO1xuICBwcml2YXRlIHNlYXJjaGFibGU6IGJvb2xlYW47XG4gIHByaXZhdGUgbWF4RW50cmllczogbnVtYmVyO1xuXG4gIC8vIFNlYXJjaCBpbmRleCBmb3IgcGVyZm9ybWFuY2UgKElzc3VlICM5ODQpXG4gIHByaXZhdGUgc2VhcmNoSW5kZXg6IE1lbW9yeVNlYXJjaEluZGV4O1xuXG4gIC8vIFNhbml0aXphdGlvbiBjYWNoZSB0byBhdm9pZCByZWR1bmRhbnQgcHJvY2Vzc2luZ1xuICBwcml2YXRlIHNhbml0aXphdGlvbkNhY2hlOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xuICBcbiAgY29uc3RydWN0b3IobWV0YWRhdGE6IFBhcnRpYWw8TWVtb3J5TWV0YWRhdGE+ID0ge30pIHtcbiAgICAvLyBTRUNVUklUWSBGSVg6IFNhbml0aXplIGFsbCBpbnB1dHMgZHVyaW5nIGNvbnN0cnVjdGlvblxuICAgIGNvbnN0IHNhbml0aXplZE1ldGFkYXRhID0ge1xuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lID9cbiAgICAgICAgc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShtZXRhZGF0YS5uYW1lKS5ub3JtYWxpemVkQ29udGVudCwgMTAwKSA6XG4gICAgICAgICdVbm5hbWVkIE1lbW9yeScsXG4gICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24gP1xuICAgICAgICBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG1ldGFkYXRhLmRlc2NyaXB0aW9uKS5ub3JtYWxpemVkQ29udGVudCwgNTAwKSA6XG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgIC8vIEZJWCAjMTEyNDogUHJlc2VydmUgdHJpZ2dlcnMgZm9yIEVuaGFuY2VkIEluZGV4XG4gICAgICB0cmlnZ2VyczogQXJyYXkuaXNBcnJheShtZXRhZGF0YS50cmlnZ2VycykgP1xuICAgICAgICBtZXRhZGF0YS50cmlnZ2Vyc1xuICAgICAgICAgIC5tYXAodCA9PiBzYW5pdGl6ZUlucHV0KHQsIE1BWF9UUklHR0VSX0xFTkdUSCkpXG4gICAgICAgICAgLmZpbHRlcih0ID0+IHQgJiYgVFJJR0dFUl9WQUxJREFUSU9OX1JFR0VYLnRlc3QodCkpIDogLy8gT25seSBhbGxvdyB2YWxpZCB0cmlnZ2VyIHBhdHRlcm5zXG4gICAgICAgIFtdXG4gICAgfTtcblxuICAgIHN1cGVyKEVsZW1lbnRUeXBlLk1FTU9SWSwgc2FuaXRpemVkTWV0YWRhdGEpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgbWVtb3J5LXNwZWNpZmljIHByb3BlcnRpZXMgd2l0aCBkZWZhdWx0c1xuICAgIHRoaXMuc3RvcmFnZUJhY2tlbmQgPSBtZXRhZGF0YS5zdG9yYWdlQmFja2VuZCB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfU1RPUkFHRV9CQUNLRU5EO1xuICAgIHRoaXMucmV0ZW50aW9uRGF5cyA9IG1ldGFkYXRhLnJldGVudGlvbkRheXMgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1JFVEVOVElPTl9EQVlTO1xuICAgIC8vIFZhbGlkYXRlIHByaXZhY3kgbGV2ZWwgLSBkZWZhdWx0IHRvIHByaXZhdGUgaWYgaW52YWxpZFxuICAgIHRoaXMucHJpdmFjeUxldmVsID0gKG1ldGFkYXRhLnByaXZhY3lMZXZlbCAmJiBNRU1PUllfQ09OU1RBTlRTLlBSSVZBQ1lfTEVWRUxTLmluY2x1ZGVzKG1ldGFkYXRhLnByaXZhY3lMZXZlbCkpIFxuICAgICAgPyBtZXRhZGF0YS5wcml2YWN5TGV2ZWwgXG4gICAgICA6IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9QUklWQUNZX0xFVkVMO1xuICAgIHRoaXMuc2VhcmNoYWJsZSA9IG1ldGFkYXRhLnNlYXJjaGFibGUgIT09IGZhbHNlO1xuICAgIHRoaXMubWF4RW50cmllcyA9IE1hdGgubWluKFxuICAgICAgbWV0YWRhdGEubWF4RW50cmllcyB8fCBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFQsXG4gICAgICBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFRcbiAgICApO1xuICAgIFxuICAgIC8vIFNldCB1cCBleHRlbnNpb25zXG4gICAgdGhpcy5leHRlbnNpb25zID0ge1xuICAgICAgc3RvcmFnZUJhY2tlbmQ6IHRoaXMuc3RvcmFnZUJhY2tlbmQsXG4gICAgICByZXRlbnRpb25EYXlzOiB0aGlzLnJldGVudGlvbkRheXMsXG4gICAgICBwcml2YWN5TGV2ZWw6IHRoaXMucHJpdmFjeUxldmVsLFxuICAgICAgc2VhcmNoYWJsZTogdGhpcy5zZWFyY2hhYmxlLFxuICAgICAgbWF4RW50cmllczogdGhpcy5tYXhFbnRyaWVzLFxuICAgICAgZW5jcnlwdGlvbkVuYWJsZWQ6IG1ldGFkYXRhLmVuY3J5cHRpb25FbmFibGVkIHx8IGZhbHNlXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VhcmNoIGluZGV4IHdpdGggY29uZmlndXJhdGlvbiAoSXNzdWUgIzk4NClcbiAgICBjb25zdCBpbmRleENvbmZpZzogU2VhcmNoSW5kZXhDb25maWcgPSB7XG4gICAgICBpbmRleFRocmVzaG9sZDogbWV0YWRhdGEuaW5kZXhUaHJlc2hvbGQgfHwgMTAwLFxuICAgICAgZW5hYmxlQ29udGVudEluZGV4OiBtZXRhZGF0YS5lbmFibGVDb250ZW50SW5kZXggIT09IGZhbHNlLFxuICAgICAgbWF4VGVybXNQZXJFbnRyeTogbWV0YWRhdGEubWF4VGVybXNQZXJFbnRyeSB8fCAxMDAsXG4gICAgICBtaW5UZXJtTGVuZ3RoOiBtZXRhZGF0YS5taW5UZXJtTGVuZ3RoIHx8IDIsXG4gICAgICBlbmFibGVQZXJzaXN0ZW5jZTogZmFsc2UgLy8gRnV0dXJlIGVuaGFuY2VtZW50XG4gICAgfTtcbiAgICB0aGlzLnNlYXJjaEluZGV4ID0gbmV3IE1lbW9yeVNlYXJjaEluZGV4KGluZGV4Q29uZmlnKTtcblxuICAgIC8vIExvZyBtZW1vcnkgY3JlYXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9DUkVBVEVELFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnTWVtb3J5LmNvbnN0cnVjdG9yJyxcbiAgICAgIGRldGFpbHM6IGBNZW1vcnkgY3JlYXRlZDogJHt0aGlzLm1ldGFkYXRhLm5hbWV9IHdpdGggJHt0aGlzLnN0b3JhZ2VCYWNrZW5kfSBiYWNrZW5kYFxuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogQWRkIGEgbmV3IG1lbW9yeSBlbnRyeVxuICAgKiBTRUNVUklUWTogVmFsaWRhdGVzIGFuZCBzYW5pdGl6ZXMgYWxsIGlucHV0LCBlbmZvcmNlcyBzaXplIGxpbWl0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGFkZEVudHJ5KGNvbnRlbnQ6IHN0cmluZywgdGFncz86IHN0cmluZ1tdLCBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPE1lbW9yeUVudHJ5PiB7XG4gICAgLy8gVmFsaWRhdGUgbWVtb3J5IHNpemUgbGltaXRzXG4gICAgaWYgKHRoaXMuZW50cmllcy5zaXplID49IHRoaXMubWF4RW50cmllcykge1xuICAgICAgLy8gU0VDVVJJVFkgRklYOiBFbmZvcmNlIHJldGVudGlvbiBwb2xpY3kgd2hlbiBhdCBjYXBhY2l0eVxuICAgICAgYXdhaXQgdGhpcy5lbmZvcmNlUmV0ZW50aW9uUG9saWN5KCk7XG4gICAgICBcbiAgICAgIC8vIElmIHN0aWxsIGF0IGNhcGFjaXR5IGFmdGVyIHJldGVudGlvbiwgcmVtb3ZlIG9sZGVzdCB0byBtYWtlIHJvb21cbiAgICAgIGlmICh0aGlzLmVudHJpZXMuc2l6ZSA+PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgICAgY29uc3Qgb2xkZXN0RW50cnkgPSBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wcyBhcmUgRGF0ZSBvYmplY3RzIGZvciBzb3J0aW5nXG4gICAgICAgICAgICBjb25zdCBhVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChhLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgY29uc3QgYlRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYi50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHJldHVybiBhVGltZSAtIGJUaW1lO1xuICAgICAgICAgIH0pWzBdO1xuICAgICAgICBpZiAob2xkZXN0RW50cnkpIHtcbiAgICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKG9sZGVzdEVudHJ5LmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBjb250ZW50XG4gICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IHNhbml0aXplTWVtb3J5Q29udGVudChjb250ZW50LCBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSWV9TSVpFKTtcbiAgICBcbiAgICBpZiAoIXNhbml0aXplZENvbnRlbnQgfHwgc2FuaXRpemVkQ29udGVudC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBjb250ZW50IGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSB0YWdzXG4gICAgY29uc3Qgc2FuaXRpemVkVGFncyA9IHRhZ3MgPyB0aGlzLnNhbml0aXplVGFncyh0YWdzKSA6IFtdO1xuICAgIFxuICAgIC8vIENyZWF0ZSBtZW1vcnkgZW50cnkgd2l0aCBnZW5lcmF0ZWQgSURcbiAgICBjb25zdCBlbnRyeTogTWVtb3J5RW50cnkgPSB7XG4gICAgICBpZDogZ2VuZXJhdGVNZW1vcnlJZCgpLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgY29udGVudDogc2FuaXRpemVkQ29udGVudCxcbiAgICAgIHRhZ3M6IHNhbml0aXplZFRhZ3MsXG4gICAgICBtZXRhZGF0YTogdGhpcy5zYW5pdGl6ZU1ldGFkYXRhKG1ldGFkYXRhKSxcbiAgICAgIHByaXZhY3lMZXZlbDogdGhpcy5wcml2YWN5TGV2ZWwsXG4gICAgICBleHBpcmVzQXQ6IHRoaXMuY2FsY3VsYXRlRXhwaXJ5RGF0ZSgpXG4gICAgfTtcbiAgICBcbiAgICAvLyBTdG9yZSBlbnRyeVxuICAgIHRoaXMuZW50cmllcy5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcblxuICAgIC8vIFVwZGF0ZSBzZWFyY2ggaW5kZXggKElzc3VlICM5ODQpXG4gICAgdGhpcy5zZWFyY2hJbmRleC5hZGRFbnRyeShlbnRyeSk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgYnVpbGQvcmVidWlsZCB0aGUgaW5kZXhcbiAgICBpZiAoIXRoaXMuc2VhcmNoSW5kZXguaXNJbmRleGVkICYmIHRoaXMuZW50cmllcy5zaXplID49IDEwMCkge1xuICAgICAgLy8gQnVpbGQgaW5kZXggYXN5bmNocm9ub3VzbHkgdG8gYXZvaWQgYmxvY2tpbmcsIHdpdGggcmV0cnkgbG9naWNcbiAgICAgIHRoaXMuYnVpbGRTZWFyY2hJbmRleFdpdGhSZXRyeSgpLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgLy8gRmluYWwgZmFpbHVyZSBhZnRlciByZXRyaWVzIC0gc2VhcmNoIHdpbGwgZmFsbCBiYWNrIHRvIGxpbmVhciBzY2FuXG4gICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIHNlYXJjaCBpbmRleCBhZnRlciByZXRyaWVzLCBzZWFyY2ggd2lsbCB1c2UgZmFsbGJhY2snLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBMb2cgbWVtb3J5IGFkZGl0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfQURERUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdNZW1vcnkuYWRkRW50cnknLFxuICAgICAgZGV0YWlsczogYEFkZGVkIG1lbW9yeSBlbnRyeSAke2VudHJ5LmlkfSB3aXRoICR7c2FuaXRpemVkVGFncy5sZW5ndGh9IHRhZ3NgXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZWFyY2ggbWVtb3J5IGVudHJpZXNcbiAgICogU0VDVVJJVFk6IFJlc3BlY3RzIHByaXZhY3kgbGV2ZWxzIGFuZCBzYW5pdGl6ZXMgc2VhcmNoIHF1ZXJpZXNcbiAgICpcbiAgICogSU1QTEVNRU5URUQ6IEJhc2ljIGluZGV4ZWQgc2VhcmNoIGZvciBPKGxvZyBuKSBwZXJmb3JtYW5jZSAoSXNzdWUgIzk4NClcbiAgICogLSBUYWcgaW5kZXg6IE1hcDx0YWcsIFNldDxlbnRyeUlkPj4gZm9yIGluc3RhbnQgdGFnIGxvb2t1cHMg4pyTXG4gICAqIC0gQ29udGVudCBpbmRleDogSW52ZXJ0ZWQgaW5kZXggZm9yIHRlcm0gc2VhcmNoIOKck1xuICAgKiAtIERhdGUgaW5kZXg6IEJpbmFyeSB0cmVlIGZvciBlZmZpY2llbnQgcmFuZ2UgcXVlcmllcyDinJNcbiAgICogLSBQcml2YWN5IGluZGV4OiBQcmUtc29ydGVkIGVudHJpZXMgYnkgcHJpdmFjeSBsZXZlbCDinJNcbiAgICpcbiAgICogVE9ETzogQWR2YW5jZWQgaW5kZXhpbmcgZmVhdHVyZXMgKEZ1dHVyZSBlbmhhbmNlbWVudHMpOlxuICAgKiAtIENvbXBvc2l0ZSBpbmRpY2VzOiBDb21iaW5lZCBpbmRpY2VzIGZvciBjb21tb24gcXVlcnkgcGF0dGVybnNcbiAgICogLSBJbmRleC1vZi1pbmRleGVzIHBhdHRlcm46XG4gICAqICAgLSBNYXN0ZXIgaW5kZXggZmlsZSAobWV0YS55YW1sKSB3aXRoIHBvaW50ZXJzIHRvIHNoYXJkIGluZGljZXNcbiAgICogICAtIEVhY2ggc2hhcmQgbWFpbnRhaW5zIGl0cyBvd24gbG9jYWwgaW5kZXhcbiAgICogICAtIFBlcmlvZGljIGluZGV4IGNvbXBhY3Rpb24gYW5kIG9wdGltaXphdGlvblxuICAgKiAtIFBlcnNpc3RlbnQgaW5kZXggc3RvcmFnZSB0byBkaXNrXG4gICAqIC0gSW5jcmVtZW50YWwgaW5kZXggdXBkYXRlcyBmb3IgbGFyZ2UgZGF0YXNldHNcbiAgICpcbiAgICogUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgYWNoaWV2ZWQ6XG4gICAqIC0gUHJldmlvdXM6IH4xMDBtcyBmb3IgMTAsMDAwIGVudHJpZXMgKGxpbmVhciBzY2FuKVxuICAgKiAtIEN1cnJlbnQ6IDw1bXMgZm9yIHNhbWUgZGF0YXNldCAoaW5kZXhlZCBzZWFyY2gpXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VhcmNoKG9wdGlvbnM6IE1lbW9yeVNlYXJjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8TWVtb3J5RW50cnlbXT4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogU2FuaXRpemUgc2VhcmNoIHF1ZXJ5ICh1c2UgcmVndWxhciBzYW5pdGl6ZUlucHV0IGZvciBxdWVyaWVzKVxuICAgIGNvbnN0IHNhbml0aXplZFF1ZXJ5ID0gb3B0aW9ucy5xdWVyeSA/XG4gICAgICBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG9wdGlvbnMucXVlcnkpLm5vcm1hbGl6ZWRDb250ZW50LCAyMDApIDpcbiAgICAgIHVuZGVmaW5lZDtcblxuICAgIC8vIFVzZSBpbmRleGVkIHNlYXJjaCBpZiBhdmFpbGFibGUgKElzc3VlICM5ODQpXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5kZXguaXNJbmRleGVkKSB7XG4gICAgICBjb25zdCBzZWFyY2hRdWVyeTogU2VhcmNoUXVlcnkgPSB7XG4gICAgICAgIGNvbnRlbnQ6IHNhbml0aXplZFF1ZXJ5LFxuICAgICAgICB0YWdzOiBvcHRpb25zLnRhZ3MgPyB0aGlzLnNhbml0aXplVGFncyhvcHRpb25zLnRhZ3MpIDogdW5kZWZpbmVkLFxuICAgICAgICBkYXRlRnJvbTogb3B0aW9ucy5zdGFydERhdGUsXG4gICAgICAgIGRhdGVUbzogb3B0aW9ucy5lbmREYXRlLFxuICAgICAgICBwcml2YWN5TGV2ZWw6IG9wdGlvbnMucHJpdmFjeUxldmVsIGFzIFByaXZhY3lMZXZlbCxcbiAgICAgICAgbGltaXQ6IG9wdGlvbnMubGltaXRcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdHMgPSB0aGlzLnNlYXJjaEluZGV4LnNlYXJjaChzZWFyY2hRdWVyeSwgdGhpcy5lbnRyaWVzKTtcbiAgICAgIHJldHVybiBzZWFyY2hSZXN1bHRzLm1hcChyZXN1bHQgPT4gcmVzdWx0LmVudHJ5KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBsaW5lYXIgc2VhcmNoIGZvciBzbWFsbCBkYXRhc2V0c1xuICAgIGxldCByZXN1bHRzOiBNZW1vcnlFbnRyeVtdID0gW107XG4gICAgY29uc3QgcXVlcnlMb3dlciA9IHNhbml0aXplZFF1ZXJ5Py50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHNlYXJjaFRhZ3MgPSBvcHRpb25zLnRhZ3MgJiYgb3B0aW9ucy50YWdzLmxlbmd0aCA+IDAgPyB0aGlzLnNhbml0aXplVGFncyhvcHRpb25zLnRhZ3MpIDogbnVsbDtcblxuICAgIC8vIFNpbmdsZSBpdGVyYXRpb24gdGhyb3VnaCBlbnRyaWVzIHdpdGggYWxsIGZpbHRlcnMgYXBwbGllZFxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG4gICAgICAvLyBQcml2YWN5IGxldmVsIGNoZWNrXG4gICAgICBpZiAob3B0aW9ucy5wcml2YWN5TGV2ZWwgJiYgXG4gICAgICAgICAgIXRoaXMuY2FuQWNjZXNzUHJpdmFjeUxldmVsKGVudHJ5LnByaXZhY3lMZXZlbCB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUFJJVkFDWV9MRVZFTCwgb3B0aW9ucy5wcml2YWN5TGV2ZWwpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBRdWVyeSB0ZXh0IGNoZWNrXG4gICAgICBpZiAocXVlcnlMb3dlcikge1xuICAgICAgICBjb25zdCBjb250ZW50TWF0Y2ggPSBlbnRyeS5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnlMb3dlcik7XG4gICAgICAgIGNvbnN0IHRhZ01hdGNoID0gZW50cnkudGFncz8uc29tZSh0YWcgPT4gdGFnLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnlMb3dlcikpO1xuICAgICAgICBpZiAoIWNvbnRlbnRNYXRjaCAmJiAhdGFnTWF0Y2gpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBUYWcgZmlsdGVyIGNoZWNrXG4gICAgICBpZiAoc2VhcmNoVGFncyAmJiAhc2VhcmNoVGFncy5zb21lKHNlYXJjaFRhZyA9PiBlbnRyeS50YWdzPy5pbmNsdWRlcyhzZWFyY2hUYWcpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGF0ZSByYW5nZSBjaGVja3NcbiAgICAgIGlmIChvcHRpb25zLnN0YXJ0RGF0ZSAmJiBlbnRyeS50aW1lc3RhbXAgPCBvcHRpb25zLnN0YXJ0RGF0ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmVuZERhdGUgJiYgZW50cnkudGltZXN0YW1wID4gb3B0aW9ucy5lbmREYXRlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbnRyeSBwYXNzZXMgYWxsIGZpbHRlcnNcbiAgICAgIHJlc3VsdHMucHVzaChlbnRyeSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFNvcnQgYnkgdGltZXN0YW1wIChuZXdlc3QgZmlyc3QpIC0gdXNpbmcgc3RyaW5nIGNvbXBhcmlzb24gZm9yIElEcyBhcyBzZWNvbmRhcnkgc29ydFxuICAgIHJlc3VsdHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wcyBhcmUgRGF0ZSBvYmplY3RzIGZvciBzb3J0aW5nXG4gICAgICBjb25zdCBiVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChiLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgY29uc3QgYVRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IHRpbWVEaWZmID0gYlRpbWUgLSBhVGltZTtcbiAgICAgIGlmICh0aW1lRGlmZiAhPT0gMCkgcmV0dXJuIHRpbWVEaWZmO1xuICAgICAgLy8gSWYgdGltZXN0YW1wcyBhcmUgZXhhY3RseSB0aGUgc2FtZSwgc29ydCBieSBJRCAod2hpY2ggY29udGFpbnMgdGltZXN0YW1wKVxuICAgICAgcmV0dXJuIGIuaWQubG9jYWxlQ29tcGFyZShhLmlkKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBBcHBseSBsaW1pdFxuICAgIGlmIChvcHRpb25zLmxpbWl0ICYmIG9wdGlvbnMubGltaXQgPiAwKSB7XG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5zbGljZSgwLCBvcHRpb25zLmxpbWl0KTtcbiAgICB9XG4gICAgXG4gICAgLy8gTG9nIHNlYXJjaCBvcGVyYXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TRUFSQ0hFRCxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ01lbW9yeS5zZWFyY2gnLFxuICAgICAgZGV0YWlsczogYFNlYXJjaGVkIG1lbW9yaWVzIHdpdGggcXVlcnk6ICR7c2FuaXRpemVkUXVlcnkgfHwgJ25vbmUnfSwgZm91bmQgJHtyZXN1bHRzLmxlbmd0aH0gcmVzdWx0c2BcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBhIHNwZWNpZmljIG1lbW9yeSBlbnRyeSBieSBJRFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEVudHJ5KGlkOiBzdHJpbmcpOiBQcm9taXNlPE1lbW9yeUVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQoaWQpO1xuICB9XG4gIFxuICAvKipcbiAgICogRGVsZXRlIGEgbWVtb3J5IGVudHJ5XG4gICAqIFNFQ1VSSVRZOiBWYWxpZGF0ZXMgcGVybWlzc2lvbnMgYW5kIGxvZ3MgZGVsZXRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGVFbnRyeShpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGlkKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIFNFQ1VSSVRZOiBDaGVjayBpZiBzZW5zaXRpdmUgbWVtb3JpZXMgY2FuIGJlIGRlbGV0ZWRcbiAgICBpZiAoZW50cnkucHJpdmFjeUxldmVsID09PSAnc2Vuc2l0aXZlJykge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLlNFTlNJVElWRV9NRU1PUllfREVMRVRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnkuZGVsZXRlRW50cnknLFxuICAgICAgICBkZXRhaWxzOiBgU2Vuc2l0aXZlIG1lbW9yeSAke2lkfSBkZWxldGVkYFxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZW50cmllcy5kZWxldGUoaWQpO1xuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgIFxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGZvcm1hdHRlZCBjb250ZW50IG9mIGFsbCBtZW1vcnkgZW50cmllc1xuICAgKiBSZXR1cm5zIGVudHJpZXMgYXMgYSByZWFkYWJsZSBzdHJpbmcgZm9yIGRpc3BsYXlcbiAgICovXG4gIGdldCBjb250ZW50KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZW50cmllcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gJ05vIGNvbnRlbnQgc3RvcmVkJztcbiAgICB9XG5cbiAgICAvLyBGb3JtYXQgZW50cmllcyBhcyByZWFkYWJsZSBjb250ZW50IChuZXdlc3QgZmlyc3QpXG4gICAgY29uc3Qgc29ydGVkRW50cmllcyA9IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wcyBhcmUgRGF0ZSBvYmplY3RzIGZvciBzb3J0aW5nXG4gICAgICAgIGNvbnN0IGFUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGEudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IGJUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGIudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHVybiBiVGltZSAtIGFUaW1lO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gc29ydGVkRW50cmllcy5tYXAoZW50cnkgPT4ge1xuICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wIGlzIERhdGUgb2JqZWN0IGJlZm9yZSBjYWxsaW5nIHRvSVNPU3RyaW5nXG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoZW50cnkudGltZXN0YW1wKS50b0lTT1N0cmluZygpO1xuICAgICAgY29uc3QgdGFncyA9IGVudHJ5LnRhZ3MgJiYgZW50cnkudGFncy5sZW5ndGggPiAwID8gYCBbJHtlbnRyeS50YWdzLmpvaW4oJywgJyl9XWAgOiAnJztcbiAgICAgIHJldHVybiBgWyR7dGltZXN0YW1wfV0ke3RhZ3N9OiAke2VudHJ5LmNvbnRlbnR9YDtcbiAgICB9KS5qb2luKCdcXG5cXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmZvcmNlIHJldGVudGlvbiBwb2xpY3kgYnkgcmVtb3ZpbmcgZXhwaXJlZCBlbnRyaWVzXG4gICAqIFNFQ1VSSVRZOiBFbnN1cmVzIG1lbW9yeSBkb2Vzbid0IGdyb3cgdW5ib3VuZGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5mb3JjZVJldGVudGlvblBvbGljeSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IGRlbGV0ZWRDb3VudCA9IDA7XG4gICAgXG4gICAgLy8gUmVtb3ZlIGV4cGlyZWQgZW50cmllc1xuICAgIGZvciAoY29uc3QgW2lkLCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cnkuZXhwaXJlc0F0ICYmIGVudHJ5LmV4cGlyZXNBdCA8IG5vdykge1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgZGVsZXRlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIElmIHN0aWxsIGF0IG9yIG92ZXIgY2FwYWNpdHksIHJlbW92ZSBvbGRlc3QgZW50cmllcyB0byBtYWtlIHJvb20gZm9yIG9uZSBtb3JlXG4gICAgaWYgKHRoaXMuZW50cmllcy5zaXplID49IHRoaXMubWF4RW50cmllcykge1xuICAgICAgY29uc3Qgc29ydGVkRW50cmllcyA9IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLmVudHJpZXMoKSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAvLyBGSVggIzEwNjk6IEVuc3VyZSB0aW1lc3RhbXBzIGFyZSBEYXRlIG9iamVjdHMgZm9yIHNvcnRpbmdcbiAgICAgICAgICBjb25zdCBhVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChhWzFdLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICAgIGNvbnN0IGJUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGJbMV0udGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgICAgcmV0dXJuIGFUaW1lIC0gYlRpbWU7XG4gICAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZW1vdmUgb25lIGV4dHJhIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IGVudHJ5XG4gICAgICBjb25zdCB0b0RlbGV0ZSA9IE1hdGgubWF4KDEsIHRoaXMuZW50cmllcy5zaXplIC0gdGhpcy5tYXhFbnRyaWVzICsgMSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvRGVsZXRlICYmIGkgPCBzb3J0ZWRFbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoc29ydGVkRW50cmllc1tpXVswXSk7XG4gICAgICAgIGRlbGV0ZWRDb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBpZiAoZGVsZXRlZENvdW50ID4gMCkge1xuICAgICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuUkVURU5USU9OX1BPTElDWV9FTkZPUkNFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnkuZW5mb3JjZVJldGVudGlvblBvbGljeScsXG4gICAgICAgIGRldGFpbHM6IGBSZW1vdmVkICR7ZGVsZXRlZENvdW50fSBleHBpcmVkIG1lbW9yaWVzYFxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkZWxldGVkQ291bnQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgbWVtb3J5IGVudHJpZXNcbiAgICogU0VDVVJJVFk6IFJlcXVpcmVzIGNvbmZpcm1hdGlvbiBhbmQgbG9ncyB0aGUgYWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY2xlYXJBbGwoY29uZmlybTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFjb25maXJtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBjbGVhciByZXF1aXJlcyBjb25maXJtYXRpb24nKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgY291bnQgPSB0aGlzLmVudHJpZXMuc2l6ZTtcbiAgICB0aGlzLmVudHJpZXMuY2xlYXIoKTtcbiAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgICBcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9DTEVBUkVELFxuICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgIHNvdXJjZTogJ01lbW9yeS5jbGVhckFsbCcsXG4gICAgICBkZXRhaWxzOiBgQ2xlYXJlZCBhbGwgJHtjb3VudH0gbWVtb3J5IGVudHJpZXNgXG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZW5zdXJlIGEgdmFsdWUgaXMgYSB2YWxpZCBEYXRlIG9iamVjdFxuICAgKiBGSVggIzEwNjk6IFZhbGlkYXRlcyBhbmQgY29udmVydHMgdGltZXN0YW1wcyB0byBEYXRlIG9iamVjdHNcbiAgICovXG4gIHByaXZhdGUgZW5zdXJlRGF0ZU9iamVjdCh2YWx1ZTogYW55KTogRGF0ZSB7XG4gICAgLy8gSGFuZGxlIG51bGwvdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0ZSB2YWx1ZSBpcyBudWxsIG9yIHVuZGVmaW5lZGApO1xuICAgIH1cblxuICAgIC8vIElmIGFscmVhZHkgYSBEYXRlLCB2YWxpZGF0ZSBpdFxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgRGF0ZSBvYmplY3QgcHJvdmlkZWRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gY29udmVydCB0byBEYXRlXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRhdGUgdmFsdWU6ICR7dmFsdWV9YCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHVucmVhc29uYWJsZSBkYXRlcyAoYmVmb3JlIDE5NzAgb3IgbW9yZSB0aGFuIDEwMCB5ZWFycyBpbiBmdXR1cmUpXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBkYXRlLmdldFRpbWUoKTtcbiAgICBpZiAodGltZXN0YW1wIDwgMCB8fCB0aW1lc3RhbXAgPiBub3cgKyAoMTAwICogMzY1ICogMjQgKiA2MCAqIDYwICogMTAwMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0ZSB2YWx1ZSBvdXQgb2YgcmVhc29uYWJsZSByYW5nZTogJHt2YWx1ZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtb3J5IHN0YXRpc3RpY3NcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0cygpOiB7XG4gICAgdG90YWxFbnRyaWVzOiBudW1iZXI7XG4gICAgdG90YWxTaXplOiBudW1iZXI7XG4gICAgb2xkZXN0RW50cnk/OiBEYXRlO1xuICAgIG5ld2VzdEVudHJ5PzogRGF0ZTtcbiAgICB0YWdGcmVxdWVuY3k6IE1hcDxzdHJpbmcsIG51bWJlcj47XG4gIH0ge1xuICAgIGxldCB0b3RhbFNpemUgPSAwO1xuICAgIGxldCBvbGRlc3RFbnRyeTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbmV3ZXN0RW50cnk6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFnRnJlcXVlbmN5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG4gICAgICB0b3RhbFNpemUgKz0gZW50cnkuY29udGVudC5sZW5ndGg7XG5cbiAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcCBpcyBhIHZhbGlkIERhdGUgb2JqZWN0IGZvciBjb21wYXJpc29uXG4gICAgICAvLyBXaGVuIGVudHJpZXMgYXJlIGVkaXRlZCwgdGltZXN0YW1wcyBtaWdodCBiZSBzdHJpbmdzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbnRyeVRpbWVzdGFtcCA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChlbnRyeS50aW1lc3RhbXApO1xuXG4gICAgICAgIGlmICghb2xkZXN0RW50cnkgfHwgZW50cnlUaW1lc3RhbXAgPCBvbGRlc3RFbnRyeSkge1xuICAgICAgICAgIG9sZGVzdEVudHJ5ID0gZW50cnlUaW1lc3RhbXA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZXdlc3RFbnRyeSB8fCBlbnRyeVRpbWVzdGFtcCA+IG5ld2VzdEVudHJ5KSB7XG4gICAgICAgICAgbmV3ZXN0RW50cnkgPSBlbnRyeVRpbWVzdGFtcDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBidXQgY29udGludWUgcHJvY2Vzc2luZyBvdGhlciBlbnRyaWVzXG4gICAgICAgIGxvZ2dlci53YXJuKGBJbnZhbGlkIHRpbWVzdGFtcCBpbiBtZW1vcnkgZW50cnk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICAgIC8vIFNraXAgdGhpcyBlbnRyeSdzIHRpbWVzdGFtcCBmb3Igc3RhdGlzdGljc1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZW50cnkudGFncz8uZm9yRWFjaCh0YWcgPT4ge1xuICAgICAgICB0YWdGcmVxdWVuY3kuc2V0KHRhZywgKHRhZ0ZyZXF1ZW5jeS5nZXQodGFnKSB8fCAwKSArIDEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbEVudHJpZXM6IHRoaXMuZW50cmllcy5zaXplLFxuICAgICAgdG90YWxTaXplLFxuICAgICAgb2xkZXN0RW50cnksXG4gICAgICBuZXdlc3RFbnRyeSxcbiAgICAgIHRhZ0ZyZXF1ZW5jeVxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgbWVtb3J5IGVsZW1lbnRcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIudmFsaWRhdGUoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGVycm9ycyBhcnJheSBpZiBub3QgcHJlc2VudFxuICAgIGlmICghcmVzdWx0LmVycm9ycykge1xuICAgICAgcmVzdWx0LmVycm9ycyA9IFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGRpdGlvbmFsIG1lbW9yeS1zcGVjaWZpYyB2YWxpZGF0aW9uXG4gICAgaWYgKHRoaXMucmV0ZW50aW9uRGF5cyA8IE1FTU9SWV9DT05TVEFOVFMuTUlOX1JFVEVOVElPTl9EQVlTIHx8IHRoaXMucmV0ZW50aW9uRGF5cyA+IE1FTU9SWV9DT05TVEFOVFMuTUFYX1JFVEVOVElPTl9EQVlTKSB7XG4gICAgICByZXN1bHQuZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogJ3JldGVudGlvbkRheXMnLFxuICAgICAgICBtZXNzYWdlOiBgUmV0ZW50aW9uIGRheXMgbXVzdCBiZSBiZXR3ZWVuICR7TUVNT1JZX0NPTlNUQU5UUy5NSU5fUkVURU5USU9OX0RBWVN9IGFuZCAke01FTU9SWV9DT05TVEFOVFMuTUFYX1JFVEVOVElPTl9EQVlTfWAsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InXG4gICAgICB9IGFzIFZhbGlkYXRpb25FcnJvcik7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLm1heEVudHJpZXMgPCAxIHx8IHRoaXMubWF4RW50cmllcyA+IE1FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJJRVNfREVGQVVMVCkge1xuICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdtYXhFbnRyaWVzJyxcbiAgICAgICAgbWVzc2FnZTogYE1heCBlbnRyaWVzIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAke01FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJJRVNfREVGQVVMVH1gLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJ1xuICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBtZW1vcnkgc2l6ZVxuICAgIGNvbnN0IHN0YXRzID0gdGhpcy5nZXRTdGF0cygpO1xuICAgIGlmIChzdGF0cy50b3RhbFNpemUgPiBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRU1PUllfU0laRSkge1xuICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdtZW1vcnknLFxuICAgICAgICBtZXNzYWdlOiBgVG90YWwgbWVtb3J5IHNpemUgKCR7c3RhdHMudG90YWxTaXplfSkgZXhjZWVkcyBsaW1pdCAoJHtNRU1PUllfQ09OU1RBTlRTLk1BWF9NRU1PUllfU0laRX0pYCxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcidcbiAgICAgIH0gYXMgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIHZhbGlkaXR5IGJhc2VkIG9uIG91ciBjaGVja3NcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgdmFsaWQ6IHJlc3VsdC5lcnJvcnMubGVuZ3RoID09PSAwXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZW1vcnkgdG8gc3RyaW5nXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmV4dGVuc2lvbnMsXG4gICAgICBlbnRyaWVzOiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIG1lbW9yeSBmcm9tIHN0cmluZ1xuICAgKiBTRUNVUklUWTogVmFsaWRhdGVzIGFsbCBsb2FkZWQgZGF0YVxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGRlc2VyaWFsaXplKGRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgXG4gICAgICAvLyBWYWxpZGF0ZSBiYXNpYyBzdHJ1Y3R1cmVcbiAgICAgIGlmICghcGFyc2VkLmlkIHx8ICFwYXJzZWQudHlwZSB8fCBwYXJzZWQudHlwZSAhPT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtZW1vcnkgZGF0YSBmb3JtYXQnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHByb3BlcnRpZXNcbiAgICAgIHRoaXMuaWQgPSBwYXJzZWQuaWQ7XG4gICAgICB0aGlzLnZlcnNpb24gPSBwYXJzZWQudmVyc2lvbiB8fCAnMS4wLjAnO1xuICAgICAgdGhpcy5tZXRhZGF0YSA9IHBhcnNlZC5tZXRhZGF0YSB8fCB7fTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHBhcnNlZC5leHRlbnNpb25zIHx8IHt9O1xuICAgICAgXG4gICAgICAvLyBDbGVhciBhbmQgcmVsb2FkIGVudHJpZXNcbiAgICAgIHRoaXMuZW50cmllcy5jbGVhcigpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkLmVudHJpZXMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcGFyc2VkLmVudHJpZXMpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkRW50cnkoZW50cnkpKSB7XG4gICAgICAgICAgICAvLyBVc2Ugb3B0aW1pemVkIHNhbml0aXphdGlvbiB3aXRoIGNhY2hpbmdcbiAgICAgICAgICAgIGVudHJ5LmNvbnRlbnQgPSB0aGlzLnNhbml0aXplV2l0aENhY2hlKGVudHJ5LmNvbnRlbnQsIE1FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJZX1NJWkUpO1xuICAgICAgICAgICAgZW50cnkudGFncyA9IHRoaXMuc2FuaXRpemVUYWdzKGVudHJ5LnRhZ3MgfHwgW10pO1xuICAgICAgICAgICAgZW50cnkudGltZXN0YW1wID0gbmV3IERhdGUoZW50cnkudGltZXN0YW1wKTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5leHBpcmVzQXQpIHtcbiAgICAgICAgICAgICAgZW50cnkuZXhwaXJlc0F0ID0gbmV3IERhdGUoZW50cnkuZXhwaXJlc0F0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZW50cmllcy5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRW5mb3JjZSByZXRlbnRpb24gcG9saWN5IGFmdGVyIGxvYWRpbmdcbiAgICAgIHRoaXMuZW5mb3JjZVJldGVudGlvblBvbGljeSgpO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfREVTRVJJQUxJWkVfRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnkuZGVzZXJpYWxpemUnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGRlc2VyaWFsaXplIG1lbW9yeTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlc2VyaWFsaXplIG1lbW9yeTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8vIFByaXZhdGUgaGVscGVyIG1ldGhvZHNcbiAgXG4gIHByaXZhdGUgY2FsY3VsYXRlRXhwaXJ5RGF0ZSgpOiBEYXRlIHtcbiAgICBjb25zdCBleHBpcnkgPSBuZXcgRGF0ZSgpO1xuICAgIGV4cGlyeS5zZXREYXRlKGV4cGlyeS5nZXREYXRlKCkgKyB0aGlzLnJldGVudGlvbkRheXMpO1xuICAgIHJldHVybiBleHBpcnk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc2FuaXRpemVUYWdzKHRhZ3M6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogTGltaXQgbnVtYmVyIG9mIHRhZ3MgYW5kIHNhbml0aXplIGVhY2hcbiAgICBjb25zdCBsaW1pdGVkVGFncyA9IHRhZ3Muc2xpY2UoMCwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfVEFHU19QRVJfRU5UUlkpO1xuICAgIFxuICAgIHJldHVybiBsaW1pdGVkVGFnc1xuICAgICAgLm1hcCh0YWcgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodGFnKS5ub3JtYWxpemVkQ29udGVudDtcbiAgICAgICAgcmV0dXJuIHNhbml0aXplSW5wdXQobm9ybWFsaXplZCwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfVEFHX0xFTkdUSCk7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcih0YWcgPT4gdGFnICYmIHRhZy5sZW5ndGggPiAwKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzYW5pdGl6ZU1ldGFkYXRhKG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICAgIGlmICghbWV0YWRhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYOiBTYW5pdGl6ZSBtZXRhZGF0YSB2YWx1ZXNcbiAgICBjb25zdCBzYW5pdGl6ZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBtYXhLZXlzID0gTUVNT1JZX0NPTlNUQU5UUy5NQVhfTUVUQURBVEFfS0VZUztcbiAgICBsZXQga2V5Q291bnQgPSAwO1xuICAgIFxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKSkge1xuICAgICAgaWYgKGtleUNvdW50ID49IG1heEtleXMpIGJyZWFrO1xuICAgICAgXG4gICAgICBjb25zdCBzYW5pdGl6ZWRLZXkgPSBzYW5pdGl6ZUlucHV0KGtleSwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfTUVUQURBVEFfS0VZX0xFTkdUSCk7XG4gICAgICBpZiAoc2FuaXRpemVkS2V5ICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2FuaXRpemVkW3Nhbml0aXplZEtleV0gPSBzYW5pdGl6ZUlucHV0KHZhbHVlLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRVRBREFUQV9WQUxVRV9MRU5HVEgpO1xuICAgICAgICBrZXlDb3VudCsrO1xuICAgICAgfSBlbHNlIGlmIChzYW5pdGl6ZWRLZXkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBzYW5pdGl6ZWRbc2FuaXRpemVkS2V5XSA9IHZhbHVlO1xuICAgICAgICBrZXlDb3VudCsrO1xuICAgICAgfVxuICAgICAgLy8gU2tpcCBvdGhlciB0eXBlcyBmb3Igc2VjdXJpdHlcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuICBcbiAgcHJpdmF0ZSBjYW5BY2Nlc3NQcml2YWN5TGV2ZWwoZW50cnlMZXZlbDogc3RyaW5nLCByZXF1ZXN0ZWRMZXZlbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbGV2ZWxzID0gTUVNT1JZX0NPTlNUQU5UUy5QUklWQUNZX0xFVkVMUztcbiAgICBjb25zdCBlbnRyeUluZGV4ID0gbGV2ZWxzLmluZGV4T2YoZW50cnlMZXZlbCBhcyBQcml2YWN5TGV2ZWwpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEluZGV4ID0gbGV2ZWxzLmluZGV4T2YocmVxdWVzdGVkTGV2ZWwgYXMgUHJpdmFjeUxldmVsKTtcbiAgICBcbiAgICAvLyBDYW4gb25seSBhY2Nlc3MgZW50cmllcyBhdCBvciBiZWxvdyB0aGUgcmVxdWVzdGVkIHByaXZhY3kgbGV2ZWxcbiAgICAvLyBlLmcuLCBpZiByZXF1ZXN0aW5nICdwcml2YXRlJywgY2FuIHNlZSAncHVibGljJyBhbmQgJ3ByaXZhdGUnIGJ1dCBub3QgJ3NlbnNpdGl2ZSdcbiAgICByZXR1cm4gZW50cnlJbmRleCA8PSByZXF1ZXN0ZWRJbmRleDtcbiAgfVxuICBcbiAgcHJpdmF0ZSBpc1ZhbGlkRW50cnkoZW50cnk6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlbnRyeSAmJlxuICAgICAgdHlwZW9mIGVudHJ5LmlkID09PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIGVudHJ5LmNvbnRlbnQgPT09ICdzdHJpbmcnICYmXG4gICAgICBlbnRyeS50aW1lc3RhbXAgJiZcbiAgICAgICghZW50cnkudGFncyB8fCBBcnJheS5pc0FycmF5KGVudHJ5LnRhZ3MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpbWl6ZWQgc2FuaXRpemF0aW9uIHdpdGggY2hlY2tzdW0gY2FjaGluZ1xuICAgKiBBdm9pZHMgcmUtc2FuaXRpemluZyBjb250ZW50IHRoYXQgaGFzbid0IGNoYW5nZWRcbiAgICogQHBhcmFtIGNvbnRlbnQgQ29udGVudCB0byBzYW5pdGl6ZVxuICAgKiBAcGFyYW0gbWF4TGVuZ3RoIE1heGltdW0gYWxsb3dlZCBsZW5ndGhcbiAgICogQHJldHVybnMgU2FuaXRpemVkIGNvbnRlbnRcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVXaXRoQ2FjaGUoY29udGVudDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgLy8gR2VuZXJhdGUgY2hlY2tzdW0gZm9yIHRoZSBpbnB1dFxuICAgIGNvbnN0IGNoZWNrc3VtID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShjb250ZW50KS5kaWdlc3QoJ2hleCcpO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2UndmUgYWxyZWFkeSBzYW5pdGl6ZWQgdGhpcyBleGFjdCBjb250ZW50XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHtjaGVja3N1bX06JHttYXhMZW5ndGh9YDtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNhbml0aXphdGlvbkNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIHNhbml0aXphdGlvblxuICAgIGNvbnN0IHNhbml0aXplZCA9IHNhbml0aXplTWVtb3J5Q29udGVudChjb250ZW50LCBtYXhMZW5ndGgpO1xuXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdCAobGltaXQgY2FjaGUgc2l6ZSB0byBwcmV2ZW50IG1lbW9yeSBpc3N1ZXMpXG4gICAgaWYgKHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUuc2l6ZSA+IDEwMDApIHtcbiAgICAgIC8vIFJlbW92ZSBvbGRlc3QgZW50cmllcyAoc2ltcGxlIEZJRk8pXG4gICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChmaXJzdEtleSkgdGhpcy5zYW5pdGl6YXRpb25DYWNoZS5kZWxldGUoZmlyc3RLZXkpO1xuICAgIH1cbiAgICB0aGlzLnNhbml0aXphdGlvbkNhY2hlLnNldChjYWNoZUtleSwgc2FuaXRpemVkKTtcblxuICAgIHJldHVybiBzYW5pdGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgc2VhcmNoIGluZGV4IHdpdGggcmV0cnkgbG9naWNcbiAgICogQXR0ZW1wdHMgdG8gYnVpbGQgdGhlIGluZGV4IHVwIHRvIDMgdGltZXMgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmXG4gICAqIFRoaXMgZW5zdXJlcyBzZWFyY2ggZnVuY3Rpb25hbGl0eSBldmVuIGlmIHRoZXJlIGFyZSB0cmFuc2llbnQgZmFpbHVyZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRTZWFyY2hJbmRleFdpdGhSZXRyeShyZXRyaWVzID0gMyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gcmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnNlYXJjaEluZGV4LmJ1aWxkSW5kZXgodGhpcy5lbnRyaWVzKTtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBTZWFyY2ggaW5kZXggYnVpbHQgc3VjY2Vzc2Z1bGx5IG9uIGF0dGVtcHQgJHthdHRlbXB0fWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XG4gICAgICAgIGxvZ2dlci53YXJuKGBTZWFyY2ggaW5kZXggYnVpbGQgYXR0ZW1wdCAke2F0dGVtcHR9IGZhaWxlZGAsIHtcbiAgICAgICAgICBlcnJvcjogbGFzdEVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgZW50cmllc0NvdW50OiB0aGlzLmVudHJpZXMuc2l6ZVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYXR0ZW1wdCA8IHJldHJpZXMpIHtcbiAgICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmOiAxMDBtcywgMjAwbXMsIDQwMG1zXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSkgKiAxMDA7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIHJldHJpZXMgZmFpbGVkXG4gICAgdGhyb3cgbGFzdEVycm9yIHx8IG5ldyBFcnJvcignRmFpbGVkIHRvIGJ1aWxkIHNlYXJjaCBpbmRleCcpO1xuICB9XG59Il19
|