@dollhousemcp/mcp-server 2.0.35 → 2.0.36
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 +5 -0
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +6 -2
- package/dist/elements/memories/Memory.d.ts.map +1 -1
- package/dist/elements/memories/Memory.js +9 -2
- package/dist/elements/memories/MemoryManager.d.ts +13 -0
- package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
- package/dist/elements/memories/MemoryManager.js +57 -44
- package/dist/elements/memories/constants.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/GitHubAuthHandler.d.ts +12 -0
- package/dist/handlers/GitHubAuthHandler.d.ts.map +1 -1
- package/dist/handlers/GitHubAuthHandler.js +303 -60
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +62 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +209 -34
- package/dist/security/contentValidator.d.ts +32 -1
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +74 -31
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +5 -2
- package/dist/security/tokenManager.d.ts +1 -1
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +10 -7
- package/dist/storage/MemoryMetadataExtractor.d.ts +4 -1
- package/dist/storage/MemoryMetadataExtractor.d.ts.map +1 -1
- package/dist/storage/MemoryMetadataExtractor.js +7 -3
- package/oauth-helper.mjs +233 -92
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -987,7 +987,14 @@ export class Memory extends BaseElement {
|
|
|
987
987
|
* @returns true if entry was removed, false if not found
|
|
988
988
|
*/
|
|
989
989
|
removeEntry(entryId) {
|
|
990
|
-
|
|
990
|
+
const removed = this.entries.delete(entryId);
|
|
991
|
+
if (removed) {
|
|
992
|
+
// Issue #2329: keep the search index consistent with the entries map —
|
|
993
|
+
// previously removed entries stayed searchable until a full index rebuild.
|
|
994
|
+
this.searchIndex.removeEntry(entryId);
|
|
995
|
+
this._isDirty = true;
|
|
996
|
+
}
|
|
997
|
+
return removed;
|
|
991
998
|
}
|
|
992
999
|
/**
|
|
993
1000
|
* Get an iterator over all entries
|
|
@@ -1126,4 +1133,4 @@ export class Memory extends BaseElement {
|
|
|
1126
1133
|
return true;
|
|
1127
1134
|
}
|
|
1128
1135
|
}
|
|
1129
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVqRSwwRkFBMEY7QUFDMUYsaURBQWlEO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBZ0MsWUFBWSxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBa0MsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5EOzs7R0FHRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBRTlCOzs7O0dBSUc7QUFDSCxNQUFNLHdCQUF3QixHQUFHLHFCQUFxQixDQUFDO0FBRXZELGtDQUFrQztBQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMs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QUUsQ0FBQztnQkFDcEIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUVELGdCQUFnQjtRQUNoQixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxXQUFXLEdBQUcsVUFBVSxFQUFFLENBQUM7Z0JBQ3pELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lbW9yeSBFbGVtZW50IC0gUGVyc2lzdGVudCBjb250ZXh0IHN0b3JhZ2UgZm9yIGNvbnRpbnVpdHkgYW5kIGxlYXJuaW5nXG4gKiBcbiAqIFByb3ZpZGVzIG11bHRpcGxlIHN0b3JhZ2UgYmFja2VuZHMsIHJldGVudGlvbiBwb2xpY2llcywgYW5kIHNlYXJjaCBjYXBhYmlsaXRpZXNcbiAqIGZvciBtYWludGFpbmluZyBjb250ZXh0IGFjcm9zcyBzZXNzaW9ucyBhbmQgaW50ZXJhY3Rpb25zLlxuICogXG4gKiBTRUNVUklUWSBNRUFTVVJFUyBJTVBMRU1FTlRFRDpcbiAqIDEuIElucHV0IHNhbml0aXphdGlvbiBmb3IgYWxsIG1lbW9yeSBjb250ZW50XG4gKiAyLiBNZW1vcnkgc2l6ZSBsaW1pdHMgdG8gcHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoXG4gKiAzLiBQYXRoIHZhbGlkYXRpb24gZm9yIGZpbGUtYmFzZWQgc3RvcmFnZVxuICogNC4gUmV0ZW50aW9uIHBvbGljeSBlbmZvcmNlbWVudFxuICogNS4gUHJpdmFjeSBsZXZlbCBhY2Nlc3MgY29udHJvbFxuICogNi4gQXVkaXQgbG9nZ2luZyBmb3IgYWxsIG9wZXJhdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBCYXNlRWxlbWVudCwgbm9ybWFsaXplVmVyc2lvbiB9IGZyb20gJy4uL0Jhc2VFbGVtZW50LmpzJztcbmltcG9ydCB7IElFbGVtZW50LCBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvaW5kZXguanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi8uLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnRNZXRhZGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzL2VsZW1lbnRzL0lFbGVtZW50LmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IHNhbml0aXplSW5wdXQgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9JbnB1dFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9NZXRhZGF0YVNlcnZpY2UuanMnO1xuLy8gRklYICMxMzE1OiBDb250ZW50VmFsaWRhdG9yIG5vIGxvbmdlciB1c2VkIGluIGFkZEVudHJ5IChtb3ZlZCB0byBiYWNrZ3JvdW5kIHZhbGlkYXRpb24pXG4vLyBJbXBvcnQgcmVtb3ZlZCB0byBjbGVhbiB1cCB1bnVzZWQgZGVwZW5kZW5jaWVzXG5pbXBvcnQgeyBNRU1PUllfQ09OU1RBTlRTLCBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLCBQcml2YWN5TGV2ZWwsIFN0b3JhZ2VCYWNrZW5kLCBUUlVTVF9MRVZFTFMsIFRydXN0TGV2ZWwgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBNZW1vcnlUeXBlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU1lbW9yeUlkIH0gZnJvbSAnLi91dGlscy5qcyc7XG5pbXBvcnQgeyBNZW1vcnlTZWFyY2hJbmRleCwgU2VhcmNoUXVlcnksIFNlYXJjaEluZGV4Q29uZmlnIH0gZnJvbSAnLi9NZW1vcnlTZWFyY2hJbmRleC5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IERPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknO1xuaW1wb3J0IHsgSlNET00gfSBmcm9tICdqc2RvbSc7XG5pbXBvcnQgeyBMUlVDYWNoZSB9IGZyb20gJy4uLy4uL2NhY2hlL0xSVUNhY2hlLmpzJztcblxuLyoqXG4gKiBNYXhpbXVtIGxlbmd0aCBmb3IgaW5kaXZpZHVhbCB0cmlnZ2VyIHdvcmRzIHVzZWQgaW4gRW5oYW5jZWQgSW5kZXhcbiAqIEBjb25zdGFudCB7bnVtYmVyfVxuICovXG5jb25zdCBNQVhfVFJJR0dFUl9MRU5HVEggPSA1MDtcblxuLyoqXG4gKiBWYWxpZGF0aW9uIHBhdHRlcm4gZm9yIHRyaWdnZXIgd29yZHNcbiAqIEFsbG93cyBhbHBoYW51bWVyaWMsIGh5cGhlbnMsIHVuZGVyc2NvcmVzLCBAIChtZW50aW9ucy9lbWFpbHMpLCAuIChkb21haW5zKVxuICogQGNvbnN0YW50IHtSZWdFeHB9XG4gKi9cbmNvbnN0IFRSSUdHRVJfVkFMSURBVElPTl9SRUdFWCA9IC9eW2EtekEtWjAtOVxcLV9ALl0rJC87XG5cbi8vIEluaXRpYWxpemUgRE9NUHVyaWZ5IHdpdGggSlNET01cbmNvbnN0IHdpbmRvdyA9IG5ldyBKU0RPTSgnJykud2luZG93O1xuY29uc3QgcHVyaWZ5ID0gRE9NUHVyaWZ5KHdpbmRvdyBhcyBhbnkpO1xuXG4vLyBDb25maWd1cmUgRE9NUHVyaWZ5IGZvciBtZW1vcnkgY29udGVudCAtIHN0cmlwIGFsbCBIVE1MIGJ1dCBrZWVwIHRleHRcbnB1cmlmeS5zZXRDb25maWcoe1xuICBBTExPV0VEX1RBR1M6IFtdLCAgLy8gTm8gSFRNTCB0YWdzIGFsbG93ZWRcbiAgQUxMT1dFRF9BVFRSOiBbXSwgIC8vIE5vIGF0dHJpYnV0ZXMgYWxsb3dlZFxuICBLRUVQX0NPTlRFTlQ6IHRydWUgLy8gS2VlcCB0ZXh0IGNvbnRlbnRcbn0pO1xuXG4vKipcbiAqIFNhbml0aXplIGNvbnRlbnQgZm9yIG1lbW9yeSBzdG9yYWdlXG4gKiBNb3JlIHBlcm1pc3NpdmUgdGhhbiBzYW5pdGl6ZUlucHV0IC0gYWxsb3dzIHB1bmN0dWF0aW9uLCBxdW90ZXMsIGV0Yy5cbiAqIGJ1dCBzdGlsbCBwcmV2ZW50cyBYU1MgYW5kIGNvbnRyb2wgY2hhcmFjdGVyc1xuICovXG5mdW5jdGlvbiBzYW5pdGl6ZU1lbW9yeUNvbnRlbnQoY29udGVudDogc3RyaW5nLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICghY29udGVudCB8fCB0eXBlb2YgY29udGVudCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgXG4gIC8vIEZpcnN0IG5vcm1hbGl6ZSBVbmljb2RlXG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShjb250ZW50KS5ub3JtYWxpemVkQ29udGVudDtcbiAgXG4gIC8vIFVzZSBET01QdXJpZnkgdG8gc3RyaXAgYW55IEhUTUwvWFNTIGF0dGVtcHRzIGJ1dCBrZWVwIHRleHRcbiAgY29uc3QgY2xlYW5lZCA9IHB1cmlmeS5zYW5pdGl6ZShub3JtYWxpemVkKTtcbiAgXG4gIC8vIFJlbW92ZSBvbmx5IGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgbnVsbCBieXRlc1xuICByZXR1cm4gY2xlYW5lZFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIEludGVudGlvbmFsbHkgcmVtb3ZpbmcgY29udHJvbCBjaGFycyBleGNlcHQgXFx0IFxcbiBcXHIgZm9yIHNhbml0aXphdGlvblxuICAgIC5yZXBsYWNlQWxsKC9bXFx1MDAwMC1cXHUwMDA4XFx1MDAwQlxcdTAwMENcXHUwMDBFLVxcdTAwMUZcXHUwMDdGXS9nLCAnJykgLy8gTk9TT05BUlxuICAgIC5zdWJzdHJpbmcoMCwgbWF4TGVuZ3RoKVxuICAgIC50cmltKCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5TWV0YWRhdGEgZXh0ZW5kcyBJRWxlbWVudE1ldGFkYXRhIHtcbiAgc3RvcmFnZUJhY2tlbmQ/OiBTdG9yYWdlQmFja2VuZDtcbiAgcmV0ZW50aW9uRGF5cz86IG51bWJlcjtcbiAgcHJpdmFjeUxldmVsPzogUHJpdmFjeUxldmVsO1xuICBzZWFyY2hhYmxlPzogYm9vbGVhbjtcbiAgbWF4RW50cmllcz86IG51bWJlcjtcbiAgZW5jcnlwdGlvbkVuYWJsZWQ/OiBib29sZWFuO1xuICAvLyBTZWFyY2ggaW5kZXggY29uZmlndXJhdGlvbiAoSXNzdWUgIzk4NClcbiAgaW5kZXhUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIGVuYWJsZUNvbnRlbnRJbmRleD86IGJvb2xlYW47XG4gIG1heFRlcm1zUGVyRW50cnk/OiBudW1iZXI7XG4gIG1pblRlcm1MZW5ndGg/OiBudW1iZXI7XG4gIC8vIFRyaWdnZXIgd29yZHMgZm9yIEVuaGFuY2VkIEluZGV4IChJc3N1ZSAjMTEyNClcbiAgdHJpZ2dlcnM/OiBzdHJpbmdbXTtcbiAgLy8gQXV0by1sb2FkIGNvbmZpZ3VyYXRpb24gKElzc3VlICMxNDMwKVxuICBhdXRvTG9hZD86IGJvb2xlYW47XG4gIHByaW9yaXR5PzogbnVtYmVyO1xuICAvLyBNZW1vcnkgdHlwZSBjbGFzc2lmaWNhdGlvbiBmb3IgZm9sZGVyIG9yZ2FuaXphdGlvblxuICBtZW1vcnlUeXBlPzogTWVtb3J5VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlFbnRyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogRGF0ZTtcbiAgY29udGVudDogc3RyaW5nO1xuICB0YWdzPzogc3RyaW5nW107XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgZXhwaXJlc0F0PzogRGF0ZTtcbiAgcHJpdmFjeUxldmVsPzogUHJpdmFjeUxldmVsO1xuICAvLyBGSVggIzEyNjk6IFRydXN0IGxldmVsIGZvciBjb250ZW50IHNlY3VyaXR5XG4gIHRydXN0TGV2ZWw/OiBUcnVzdExldmVsO1xuICAvLyBTb3VyY2UgaW5mb3JtYXRpb24gZm9yIHRydXN0IGRlY2lzaW9uc1xuICBzb3VyY2U/OiBzdHJpbmc7ICAvLyBlLmcuLCAndXNlcicsICd3ZWItc2NyYXBlJywgJ2FnZW50JywgJ2FwaSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlTZWFyY2hPcHRpb25zIHtcbiAgcXVlcnk/OiBzdHJpbmc7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbiAgc3RhcnREYXRlPzogRGF0ZTtcbiAgZW5kRGF0ZT86IERhdGU7XG4gIGxpbWl0PzogbnVtYmVyO1xuICBwcml2YWN5TGV2ZWw/OiBQcml2YWN5TGV2ZWw7XG59XG5cbi8qKlxuICogTWVtb3J5IEVsZW1lbnQgSW1wbGVtZW50YXRpb25cbiAqXG4gKiBUT0RPOiBNZW1vcnkgU2hhcmRpbmcgU3RyYXRlZ3kgKElzc3VlICM5ODEpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEN1cnJlbnQ6IFNpbmdsZSBNYXA8aWQsIGVudHJ5PiBmb3IgYWxsIG1lbW9yaWVzXG4gKiBQcm9ibGVtOiBMYXJnZSBtZW1vcnkgc2V0cyAoPjEwSyBlbnRyaWVzKSBjYXVzZSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvblxuICpcbiAqIFBsYW5uZWQgU2hhcmRpbmcgQXJjaGl0ZWN0dXJlOlxuICogMS4gU2hhcmQgbWVtb3JpZXMgYWNyb3NzIG11bHRpcGxlIGZpbGVzIGJhc2VkIG9uIGhhc2gobWVtb3J5SWQpICUgc2hhcmRDb3VudFxuICogMi4gRWFjaCBzaGFyZCBmaWxlIDwyNTZLQiBmb3Igb3B0aW1hbCBZQU1MIHBhcnNpbmdcbiAqIDMuIE1lbW9yeSByZWZlcmVuY2VzIHN0b3JlZCBzZXBhcmF0ZWx5IGZyb20gY29udGVudCAobGlrZSBnaXQgb2JqZWN0cylcbiAqIDQuIExhcmdlIGJpbmFyeSBjb250ZW50IChQREZzLCBpbWFnZXMpIHN0b3JlZCBhcyBleHRlcm5hbCByZWZlcmVuY2VzXG4gKlxuICogQmVuZWZpdHM6XG4gKiAtIFBhcmFsbGVsIGxvYWRpbmcgb2YgbWVtb3J5IHNoYXJkc1xuICogLSBSZWR1Y2VkIG1lbW9yeSBmb290cHJpbnQgKGxvYWQgb25seSBuZWVkZWQgc2hhcmRzKVxuICogLSBCZXR0ZXIgY29ycnVwdGlvbiByZXNpc3RhbmNlIChvbmUgc2hhcmQgZmFpbHVyZSBkb2Vzbid0IGFmZmVjdCBvdGhlcnMpXG4gKiAtIEVmZmljaWVudCBpbmNyZW1lbnRhbCB1cGRhdGVzXG4gKlxuICogVE9ETzogQ29udGVudCBJbnRlZ3JpdHkgVmVyaWZpY2F0aW9uIChJc3N1ZSAjOTgyKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFkZCBTSEEtMjU2IGhhc2hlcyB0byBkZXRlY3Q6XG4gKiAtIEFjY2lkZW50YWwgY29ycnVwdGlvbiBmcm9tIGRpc2sgZXJyb3JzXG4gKiAtIEludGVudGlvbmFsIHRhbXBlcmluZyB3aXRoIG1lbW9yeSBmaWxlc1xuICogLSBWZXJzaW9uIGNvbmZsaWN0cyBkdXJpbmcgY29uY3VycmVudCBhY2Nlc3NcbiAqXG4gKiBJbXBsZW1lbnRhdGlvbjpcbiAqIC0gU3RvcmUgaGFzaCBpbiBtZW1vcnkgbWV0YWRhdGFcbiAqIC0gVmVyaWZ5IG9uIGxvYWQsIHdhcm4gb24gbWlzbWF0Y2hcbiAqIC0gT3B0aW9uIHRvIGF1dG8tcmVzdG9yZSBmcm9tIGJhY2t1cCBvbiBjb3JydXB0aW9uXG4gKlxuICogVE9ETzogTWVtb3J5IENhcGFjaXR5IE1hbmFnZW1lbnQgKElzc3VlICM5ODMpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEN1cnJlbnQ6IFN5bmNocm9ub3VzIHJldGVudGlvbiBlbmZvcmNlbWVudCBvbiBlYWNoIGFkZFxuICogQmV0dGVyOiBCYWNrZ3JvdW5kIGNsZWFudXAgd2l0aCBzbWFydCB0cmlnZ2VyczpcbiAqIC0gQ2xlYW51cCB3aGVuIDkwJSBjYXBhY2l0eSByZWFjaGVkXG4gKiAtIEJhdGNoIGRlbGV0aW9ucyBmb3IgZWZmaWNpZW5jeVxuICogLSBMUlUgZXZpY3Rpb24gd2l0aCBhY2Nlc3MgdHJhY2tpbmdcbiAqIC0gUHJlc2VydmUgXCJwaW5uZWRcIiBtZW1vcmllcyByZWdhcmRsZXNzIG9mIGFnZVxuICovXG5leHBvcnQgY2xhc3MgTWVtb3J5IGV4dGVuZHMgQmFzZUVsZW1lbnQgaW1wbGVtZW50cyBJRWxlbWVudCB7XG4gIC8vIGluc3RydWN0aW9ucyBpbmhlcml0ZWQgZnJvbSBCYXNlRWxlbWVudCAodjIuMCBkdWFsLWZpZWxkIGFyY2hpdGVjdHVyZSlcbiAgLy8gY29udGVudDogb3ZlcnJpZGRlbiBiZWxvdyB3aXRoIGEgY3VzdG9tIGdldHRlciB0aGF0IHJldHVybnMgZm9ybWF0dGVkIGVudHJpZXNcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBjcmVhdGVkTWVtb3J5TmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzdGF0aWMgbWVtb3J5TWFuYWdlclJlc29sdmVyPzogKCkgPT4geyBsaXN0KCk6IFByb21pc2U8TWVtb3J5W10+OyBzYXZlKG1lbW9yeTogTWVtb3J5LCBmaWxlUGF0aD86IHN0cmluZyk6IFByb21pc2U8dm9pZD47IH0gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFN0YXRpYyByZXNvbHZlciBmb3IgUmV0ZW50aW9uUG9saWN5U2VydmljZSAoSXNzdWUgIzUxKVxuICAgKiBVc2VkIHRvIGNoZWNrIGlmIHJldGVudGlvbiBlbmZvcmNlbWVudCBzaG91bGQgaGFwcGVuIG9uIGxvYWRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJldGVudGlvblBvbGljeVJlc29sdmVyPzogKCkgPT4geyBzaG91bGRFbmZvcmNlT25Mb2FkKCk6IGJvb2xlYW47IGlzRW5hYmxlZCgpOiBib29sZWFuOyB9IHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBzdGF0aWMgY29uZmlndXJlTWVtb3J5TWFuYWdlclJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiB7IGxpc3QoKTogUHJvbWlzZTxNZW1vcnlbXT47IHNhdmUobWVtb3J5OiBNZW1vcnksIGZpbGVQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjsgfSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMubWVtb3J5TWFuYWdlclJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSBSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlIHJlc29sdmVyIChJc3N1ZSAjNTEpXG4gICAqIENhbGxlZCBkdXJpbmcgREkgY29udGFpbmVyIHNldHVwXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNvbmZpZ3VyZVJldGVudGlvblBvbGljeVJlc29sdmVyKHJlc29sdmVyOiAoKSA9PiB7IHNob3VsZEVuZm9yY2VPbkxvYWQoKTogYm9vbGVhbjsgaXNFbmFibGVkKCk6IGJvb2xlYW47IH0gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnJldGVudGlvblBvbGljeVJlc29sdmVyID0gcmVzb2x2ZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgYWxsIHN0YXRpYyByZXNvbHZlcnMgKGZvciB0ZXN0IGNsZWFudXApXG4gICAqIENhbGwgdGhpcyBpbiBhZnRlckVhY2ggaG9va3MgdG8gcHJldmVudCB0ZXN0IGlzb2xhdGlvbiBpc3N1ZXNcbiAgICogd2hlcmUgYSBzdGFsZSByZXNvbHZlciByZWZlcmVuY2VzIGRpc3Bvc2VkIHNlcnZpY2VzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlc2V0UmVzb2x2ZXJzKCk6IHZvaWQge1xuICAgIHRoaXMubWVtb3J5TWFuYWdlclJlc29sdmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmV0ZW50aW9uUG9saWN5UmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlIGluc3RhbmNlXG4gICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBjb25maWd1cmVkIChhbGxvd3MgZ3JhY2VmdWwgZmFsbGJhY2spXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlKCkge1xuICAgIGlmICghdGhpcy5yZXRlbnRpb25Qb2xpY3lSZXNvbHZlcikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmV0ZW50aW9uUG9saWN5UmVzb2x2ZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldE1lbW9yeU1hbmFnZXIoKSB7XG4gICAgaWYgKCF0aGlzLm1lbW9yeU1hbmFnZXJSZXNvbHZlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgbWFuYWdlciByZXNvbHZlciBub3QgY29uZmlndXJlZCcpO1xuICAgIH1cbiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5tZW1vcnlNYW5hZ2VyUmVzb2x2ZXIoKTtcbiAgICBpZiAoIW1hbmFnZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IG1hbmFnZXIgcmVzb2x2ZXIgcmV0dXJuZWQgdW5kZWZpbmVkJyk7XG4gICAgfVxuICAgIHJldHVybiBtYW5hZ2VyO1xuICB9XG4gIC8vIE1lbW9yeS1zcGVjaWZpYyBwcm9wZXJ0aWVzICh3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzKVxuICBwcml2YXRlIGVudHJpZXM6IExSVUNhY2hlPE1lbW9yeUVudHJ5PjtcbiAgcHJpdmF0ZSBzdG9yYWdlQmFja2VuZDogU3RvcmFnZUJhY2tlbmQ7XG4gIHByaXZhdGUgcmV0ZW50aW9uRGF5czogbnVtYmVyO1xuICBwcml2YXRlIHByaXZhY3lMZXZlbDogUHJpdmFjeUxldmVsO1xuICBwcml2YXRlIHNlYXJjaGFibGU6IGJvb2xlYW47XG4gIHByaXZhdGUgbWF4RW50cmllczogbnVtYmVyO1xuXG4gIC8vIFNlYXJjaCBpbmRleCBmb3IgcGVyZm9ybWFuY2UgKElzc3VlICM5ODQpXG4gIHByaXZhdGUgc2VhcmNoSW5kZXg6IE1lbW9yeVNlYXJjaEluZGV4O1xuXG4gIC8vIFNhbml0aXphdGlvbiBjYWNoZSB0byBhdm9pZCByZWR1bmRhbnQgcHJvY2Vzc2luZyAod2l0aCBzaXplIGxpbWl0cylcbiAgcHJpdmF0ZSBzYW5pdGl6YXRpb25DYWNoZTogTFJVQ2FjaGU8c3RyaW5nPjtcblxuICAvLyBGSVggIzEzMjA6IFN0b3JlIGZpbGUgcGF0aCBmb3IgcGVyc2lzdGVuY2VcbiAgcHJpdmF0ZSBmaWxlUGF0aD86IHN0cmluZztcblxuICAvLyBDYWNoZSBjb25maWd1cmF0aW9uIGNvbnN0YW50c1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfU0FOSVRJWkFUSU9OX0NBQ0hFX1NJWkUgPSA1MDA7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9TQU5JVElaQVRJT05fQ0FDSEVfTUVNT1JZX01CID0gNTtcbiAgXG4gIGNvbnN0cnVjdG9yKG1ldGFkYXRhOiBQYXJ0aWFsPE1lbW9yeU1ldGFkYXRhPiA9IHt9LCBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSkge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogU2FuaXRpemUgYWxsIGlucHV0cyBkdXJpbmcgY29uc3RydWN0aW9uXG4gICAgY29uc3Qgc2FuaXRpemVkTWV0YWRhdGEgPSB7XG4gICAgICAuLi5tZXRhZGF0YSxcbiAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUgP1xuICAgICAgICBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG1ldGFkYXRhLm5hbWUpLm5vcm1hbGl6ZWRDb250ZW50LCAxMDApIDpcbiAgICAgICAgJ1VubmFtZWQgTWVtb3J5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbiA/XG4gICAgICAgIHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobWV0YWRhdGEuZGVzY3JpcHRpb24pLm5vcm1hbGl6ZWRDb250ZW50LCA1MDApIDpcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgLy8gRklYICMxMTI0OiBQcmVzZXJ2ZSB0cmlnZ2VycyBmb3IgRW5oYW5jZWQgSW5kZXhcbiAgICAgIC8vIFNFQ1VSSVRZOiBWYWxpZGF0ZSBCRUZPUkUgc2FuaXRpemF0aW9uIHRvIHJlamVjdCBpbnZhbGlkIGNoYXJhY3RlcnNcbiAgICAgIC8vIFRoaXMgcHJldmVudHMgJ2JhZCF0cmlnZ2VyJyBmcm9tIGJlY29taW5nICdiYWR0cmlnZ2VyJyBhbmQgcGFzc2luZ1xuICAgICAgdHJpZ2dlcnM6IEFycmF5LmlzQXJyYXkobWV0YWRhdGEudHJpZ2dlcnMpID9cbiAgICAgICAgbWV0YWRhdGEudHJpZ2dlcnNcbiAgICAgICAgICAubWFwKHQgPT4gU3RyaW5nKHQpLnRyaW0oKSlcbiAgICAgICAgICAuZmlsdGVyKHQgPT4gdCAmJiBUUklHR0VSX1ZBTElEQVRJT05fUkVHRVgudGVzdCh0KSkgLy8gVmFsaWRhdGUgZm9ybWF0IEZJUlNUXG4gICAgICAgICAgLm1hcCh0ID0+IHNhbml0aXplSW5wdXQodCwgTUFYX1RSSUdHRVJfTEVOR1RIKSkgLy8gVGhlbiBzYW5pdGl6ZSBmb3IgbGVuZ3RoXG4gICAgICAgICAgLmZpbHRlcih0ID0+IHQpIDogLy8gUmVtb3ZlIGFueSB0aGF0IGJlY2FtZSBlbXB0eSBhZnRlciBzYW5pdGl6YXRpb25cbiAgICAgICAgW11cbiAgICB9O1xuXG4gICAgc3VwZXIoRWxlbWVudFR5cGUuTUVNT1JZLCBzYW5pdGl6ZWRNZXRhZGF0YSwgbWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgIC8vIEluaXRpYWxpemUgbWVtb3J5LXNwZWNpZmljIHByb3BlcnRpZXMgd2l0aCBkZWZhdWx0c1xuICAgIHRoaXMuc3RvcmFnZUJhY2tlbmQgPSBtZXRhZGF0YS5zdG9yYWdlQmFja2VuZCB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfU1RPUkFHRV9CQUNLRU5EO1xuICAgIHRoaXMucmV0ZW50aW9uRGF5cyA9IG1ldGFkYXRhLnJldGVudGlvbkRheXMgfHwgTUVNT1JZX0NPTlNUQU5UUy5ERUZBVUxUX1JFVEVOVElPTl9EQVlTO1xuICAgIC8vIFZhbGlkYXRlIHByaXZhY3kgbGV2ZWwgLSBkZWZhdWx0IHRvIHByaXZhdGUgaWYgaW52YWxpZFxuICAgIHRoaXMucHJpdmFjeUxldmVsID0gKG1ldGFkYXRhLnByaXZhY3lMZXZlbCAmJiBNRU1PUllfQ09OU1RBTlRTLlBSSVZBQ1lfTEVWRUxTLmluY2x1ZGVzKG1ldGFkYXRhLnByaXZhY3lMZXZlbCkpXG4gICAgICA/IG1ldGFkYXRhLnByaXZhY3lMZXZlbFxuICAgICAgOiBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUFJJVkFDWV9MRVZFTDtcbiAgICB0aGlzLnNlYXJjaGFibGUgPSBtZXRhZGF0YS5zZWFyY2hhYmxlICE9PSBmYWxzZTtcbiAgICB0aGlzLm1heEVudHJpZXMgPSBNYXRoLm1pbihcbiAgICAgIG1ldGFkYXRhLm1heEVudHJpZXMgfHwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxULFxuICAgICAgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUXG4gICAgKTtcblxuICAgIC8vIEluaXRpYWxpemUgTFJVIGNhY2hlcyB3aXRoIHNpemUgbGltaXRzIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzXG4gICAgdGhpcy5lbnRyaWVzID0gbmV3IExSVUNhY2hlPE1lbW9yeUVudHJ5Pih7XG4gICAgICBuYW1lOiAnbWVtb3J5LWVudHJpZXMnLFxuICAgICAgbWF4U2l6ZTogdGhpcy5tYXhFbnRyaWVzLFxuICAgICAgbWF4TWVtb3J5TUI6IDI1LCAvLyBNYXggMjVNQiBmb3IgbWVtb3J5IGVudHJpZXNcbiAgICB9KTtcblxuICAgIHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUgPSBuZXcgTFJVQ2FjaGU8c3RyaW5nPih7XG4gICAgICBuYW1lOiAnbWVtb3J5LXNhbml0aXphdGlvbicsXG4gICAgICBtYXhTaXplOiBNZW1vcnkuTUFYX1NBTklUSVpBVElPTl9DQUNIRV9TSVpFLFxuICAgICAgbWF4TWVtb3J5TUI6IE1lbW9yeS5NQVhfU0FOSVRJWkFUSU9OX0NBQ0hFX01FTU9SWV9NQixcbiAgICB9KTtcblxuICAgIC8vIEZJWCAjMTQzMDogVXBkYXRlIG1ldGFkYXRhIHRvIGluY2x1ZGUgYWxsIE1lbW9yeU1ldGFkYXRhIGZpZWxkc1xuICAgIC8vIFRoaXMgZW5zdXJlcyB0aGV5IGFyZSBwcmVzZXJ2ZWQgd2hlbiBzZXJpYWxpemVFbGVtZW50KCkgaXMgY2FsbGVkXG4gICAgLy8gUGVyIFRvZGQncyBzdWdnZXN0aW9uOiBzdG9yZSBhbGwgcnVudGltZSBwcm9wZXJ0aWVzIGluIG1ldGFkYXRhLCBub3QgZXh0ZW5zaW9uc1xuICAgIHRoaXMubWV0YWRhdGEgPSB7XG4gICAgICAuLi50aGlzLm1ldGFkYXRhLFxuICAgICAgc3RvcmFnZUJhY2tlbmQ6IHRoaXMuc3RvcmFnZUJhY2tlbmQsXG4gICAgICByZXRlbnRpb25EYXlzOiB0aGlzLnJldGVudGlvbkRheXMsXG4gICAgICBwcml2YWN5TGV2ZWw6IHRoaXMucHJpdmFjeUxldmVsLFxuICAgICAgc2VhcmNoYWJsZTogdGhpcy5zZWFyY2hhYmxlLFxuICAgICAgbWF4RW50cmllczogdGhpcy5tYXhFbnRyaWVzLFxuICAgICAgYXV0b0xvYWQ6IG1ldGFkYXRhLmF1dG9Mb2FkLFxuICAgICAgcHJpb3JpdHk6IG1ldGFkYXRhLnByaW9yaXR5LFxuICAgICAgZW5jcnlwdGlvbkVuYWJsZWQ6IG1ldGFkYXRhLmVuY3J5cHRpb25FbmFibGVkIHx8IGZhbHNlXG4gICAgfSBhcyBNZW1vcnlNZXRhZGF0YTtcblxuICAgIC8vIFNldCB1cCBleHRlbnNpb25zIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgdGhpcy5leHRlbnNpb25zID0ge1xuICAgICAgc3RvcmFnZUJhY2tlbmQ6IHRoaXMuc3RvcmFnZUJhY2tlbmQsXG4gICAgICByZXRlbnRpb25EYXlzOiB0aGlzLnJldGVudGlvbkRheXMsXG4gICAgICBwcml2YWN5TGV2ZWw6IHRoaXMucHJpdmFjeUxldmVsLFxuICAgICAgc2VhcmNoYWJsZTogdGhpcy5zZWFyY2hhYmxlLFxuICAgICAgbWF4RW50cmllczogdGhpcy5tYXhFbnRyaWVzLFxuICAgICAgZW5jcnlwdGlvbkVuYWJsZWQ6IG1ldGFkYXRhLmVuY3J5cHRpb25FbmFibGVkIHx8IGZhbHNlXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VhcmNoIGluZGV4IHdpdGggY29uZmlndXJhdGlvbiAoSXNzdWUgIzk4NClcbiAgICBjb25zdCBpbmRleENvbmZpZzogU2VhcmNoSW5kZXhDb25maWcgPSB7XG4gICAgICBpbmRleFRocmVzaG9sZDogbWV0YWRhdGEuaW5kZXhUaHJlc2hvbGQgfHwgMTAwLFxuICAgICAgZW5hYmxlQ29udGVudEluZGV4OiBtZXRhZGF0YS5lbmFibGVDb250ZW50SW5kZXggIT09IGZhbHNlLFxuICAgICAgbWF4VGVybXNQZXJFbnRyeTogbWV0YWRhdGEubWF4VGVybXNQZXJFbnRyeSB8fCAxMDAsXG4gICAgICBtaW5UZXJtTGVuZ3RoOiBtZXRhZGF0YS5taW5UZXJtTGVuZ3RoIHx8IDIsXG4gICAgICBlbmFibGVQZXJzaXN0ZW5jZTogZmFsc2UgLy8gRnV0dXJlIGVuaGFuY2VtZW50XG4gICAgfTtcbiAgICB0aGlzLnNlYXJjaEluZGV4ID0gbmV3IE1lbW9yeVNlYXJjaEluZGV4KGluZGV4Q29uZmlnKTtcblxuICAgIC8vIExvZyBtZW1vcnkgY3JlYXRpb24gKG9uY2UgcGVyIHVuaXF1ZSBuYW1lIHBlciBzZXJ2ZXIgbGlmZXRpbWUpXG4gICAgaWYgKCFNZW1vcnkuY3JlYXRlZE1lbW9yeU5hbWVzLmhhcyh0aGlzLm1ldGFkYXRhLm5hbWUpKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX0NSRUFURUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5LmNvbnN0cnVjdG9yJyxcbiAgICAgICAgZGV0YWlsczogYE1lbW9yeSBjcmVhdGVkOiAke3RoaXMubWV0YWRhdGEubmFtZX0gd2l0aCAke3RoaXMuc3RvcmFnZUJhY2tlbmR9IGJhY2tlbmRgXG4gICAgICB9KTtcbiAgICAgIE1lbW9yeS5jcmVhdGVkTWVtb3J5TmFtZXMuYWRkKHRoaXMubWV0YWRhdGEubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBjdXJyZW50IG51bWJlciBvZiBlbnRyaWVzXG4gICAqIENvbXBhdGlibGUgd2l0aCBMUlVDYWNoZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZW50cmllc1NpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldFN0YXRzKCkuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgbWVtb3J5IGVudHJ5XG4gICAqIFNFQ1VSSVRZOiBTYW5pdGl6ZXMgaW5wdXQgYW5kIGVuZm9yY2VzIHNpemUgbGltaXRzXG4gICAqIEZJWCAjMTMxNTogUmVtb3ZlZCBibG9ja2luZyB2YWxpZGF0aW9uIC0gYWxsIGVudHJpZXMgY3JlYXRlZCBhcyBVTlRSVVNURURcbiAgICogQmFja2dyb3VuZCB2YWxpZGF0aW9uIHdpbGwgdXBkYXRlIHRydXN0IGxldmVscyBhc3luY2hyb25vdXNseSAoSXNzdWUgIzEzMTQpXG4gICAqXG4gICAqIEZJWDogUmVmYWN0b3JlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHkgKFNvbmFyQ2xvdWQgUzM3NzYpXG4gICAqIEZJWCAoUFIgIzEzMTMgcmV2aWV3KTogU2FuaXRpemUgc291cmNlIHBhcmFtZXRlciBmb3IgbG9nIGluamVjdGlvbiBwcmV2ZW50aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYWRkRW50cnkoXG4gICAgY29udGVudDogc3RyaW5nLFxuICAgIHRhZ3M/OiBzdHJpbmdbXSxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgc291cmNlOiBzdHJpbmcgPSAndW5rbm93bidcbiAgKTogUHJvbWlzZTxNZW1vcnlFbnRyeT4ge1xuICAgIC8vIFNFQ1VSSVRZOiBTYW5pdGl6ZSBzb3VyY2UgcGFyYW1ldGVyIGJlZm9yZSB1c2VcbiAgICBjb25zdCBzYW5pdGl6ZWRTb3VyY2UgPSBzYW5pdGl6ZUlucHV0KHNvdXJjZSwgNTApO1xuXG4gICAgaWYgKHRoaXMuZW50cmllc1NpemUgPj0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICBhd2FpdCB0aGlzLmVuZm9yY2VSZXRlbnRpb25Qb2xpY3koKTtcbiAgICB9XG5cbiAgICAvLyBGSVggIzEzMTU6IFNhbml0aXplIGNvbnRlbnQgYnV0IGRvbid0IHZhbGlkYXRlIGZvciB0aHJlYXRzIChub24tYmxvY2tpbmcpXG4gICAgLy8gSnVzdCBub3JtYWxpemUgVW5pY29kZSBhbmQgYXBwbHkgRE9NUHVyaWZ5XG4gICAgY29uc3Qgc2FuaXRpemVkQ29udGVudCA9IHNhbml0aXplTWVtb3J5Q29udGVudChjb250ZW50LCBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSWV9TSVpFKTtcblxuICAgIGlmICghc2FuaXRpemVkQ29udGVudCB8fCBzYW5pdGl6ZWRDb250ZW50LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IGNvbnRlbnQgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuXG4gICAgLy8gU0VDVVJJVFkgRklYOiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgdGFnc1xuICAgIGNvbnN0IHNhbml0aXplZFRhZ3MgPSB0YWdzID8gdGhpcy5zYW5pdGl6ZVRhZ3ModGFncykgOiBbXTtcblxuICAgIC8vIENyZWF0ZSBtZW1vcnkgZW50cnkgd2l0aCBnZW5lcmF0ZWQgSURcbiAgICAvLyBGSVggIzEzMTU6IEFsbCBuZXcgZW50cmllcyBzdGFydCBhcyBVTlRSVVNURUQgYnkgZGVmYXVsdFxuICAgIGNvbnN0IGVudHJ5OiBNZW1vcnlFbnRyeSA9IHtcbiAgICAgIGlkOiBnZW5lcmF0ZU1lbW9yeUlkKCksXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBjb250ZW50OiBzYW5pdGl6ZWRDb250ZW50LFxuICAgICAgdGFnczogc2FuaXRpemVkVGFncyxcbiAgICAgIG1ldGFkYXRhOiB0aGlzLnNhbml0aXplTWV0YWRhdGEobWV0YWRhdGEpLFxuICAgICAgcHJpdmFjeUxldmVsOiB0aGlzLnByaXZhY3lMZXZlbCxcbiAgICAgIGV4cGlyZXNBdDogdGhpcy5jYWxjdWxhdGVFeHBpcnlEYXRlKCksXG4gICAgICB0cnVzdExldmVsOiBUUlVTVF9MRVZFTFMuVU5UUlVTVEVELCAvLyBBbHdheXMgVU5UUlVTVEVEIHVudGlsIGJhY2tncm91bmQgdmFsaWRhdGlvblxuICAgICAgc291cmNlOiBzYW5pdGl6ZWRTb3VyY2VcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgZW50cnlcbiAgICB0aGlzLmVudHJpZXMuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG5cbiAgICAvLyBGSVggKFBSICMxMzEzKTogRW5mb3JjZSBjYXBhY2l0eSBBRlRFUiBhZGRpbmcgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICAvLyBNdWx0aXBsZSBjb25jdXJyZW50IGFkZEVudHJ5IGNhbGxzIGNhbiBhbGwgcGFzcyB0aGUgXCJiZWZvcmVcIiBjaGVjaywgYnV0XG4gICAgLy8gYnkgZW5mb3JjaW5nIGFmdGVyLCB3ZSBndWFyYW50ZWUgdGhlIGxpbWl0IGlzIG5ldmVyIGV4Y2VlZGVkXG4gICAgdGhpcy5lbmZvcmNlQ2FwYWNpdHlTeW5jKCk7XG5cbiAgICAvLyBVcGRhdGUgc2VhcmNoIGluZGV4IChJc3N1ZSAjOTg0KVxuICAgIHRoaXMuc2VhcmNoSW5kZXguYWRkRW50cnkoZW50cnkpO1xuXG4gICAgLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIGJ1aWxkL3JlYnVpbGQgdGhlIGluZGV4XG4gICAgaWYgKCF0aGlzLnNlYXJjaEluZGV4LmlzSW5kZXhlZCAmJiB0aGlzLmVudHJpZXNTaXplID49IDEwMCkge1xuICAgICAgLy8gQnVpbGQgaW5kZXggYXN5bmNocm9ub3VzbHkgdG8gYXZvaWQgYmxvY2tpbmcsIHdpdGggcmV0cnkgbG9naWNcbiAgICAgIHRoaXMuYnVpbGRTZWFyY2hJbmRleFdpdGhSZXRyeSgpLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgLy8gRmluYWwgZmFpbHVyZSBhZnRlciByZXRyaWVzIC0gc2VhcmNoIHdpbGwgZmFsbCBiYWNrIHRvIGxpbmVhciBzY2FuXG4gICAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGJ1aWxkIHNlYXJjaCBpbmRleCBhZnRlciByZXRyaWVzLCBzZWFyY2ggd2lsbCB1c2UgZmFsbGJhY2snLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBMb2cgbWVtb3J5IGFkZGl0aW9uXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfQURERUQsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdNZW1vcnkuYWRkRW50cnknLFxuICAgICAgZGV0YWlsczogYEFkZGVkIG1lbW9yeSBlbnRyeSAke2VudHJ5LmlkfSB3aXRoICR7c2FuaXRpemVkVGFncy5sZW5ndGh9IHRhZ3MgKFVOVFJVU1RFRCwgcGVuZGluZyB2YWxpZGF0aW9uKWBcbiAgICB9KTtcblxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmZvcmNlIGNhcGFjaXR5IGxpbWl0IHN5bmNocm9ub3VzbHlcbiAgICogRklYIChQUiAjMTMxMyk6IE1hZGUgc3luY2hyb25vdXMgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnNcbiAgICogVGhpcyBpcyBjYWxsZWQgQUZURVIgYWRkaW5nIGFuIGVudHJ5IHRvIGVuc3VyZSB3ZSBuZXZlciBleGNlZWQgbWF4RW50cmllc1xuICAgKi9cbiAgcHJpdmF0ZSBlbmZvcmNlQ2FwYWNpdHlTeW5jKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVudHJpZXNTaXplIDw9IHRoaXMubWF4RW50cmllcykge1xuICAgICAgcmV0dXJuOyAvLyBXaXRoaW4gY2FwYWNpdHlcbiAgICB9XG5cbiAgICAvLyBPdmVyIGNhcGFjaXR5IC0gcmVtb3ZlIG9sZGVzdCBlbnRyaWVzIHVudGlsIHdlJ3JlIGF0IHRoZSBsaW1pdFxuICAgIGNvbnN0IGVudHJpZXNUb1JlbW92ZSA9IHRoaXMuZW50cmllc1NpemUgLSB0aGlzLm1heEVudHJpZXM7XG4gICAgY29uc3Qgc29ydGVkRW50cmllcyA9IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYVRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgYlRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYi50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgcmV0dXJuIGFUaW1lIC0gYlRpbWU7IC8vIE9sZGVzdCBmaXJzdFxuICAgICAgfSk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIG9sZGVzdCBlbnRyaWVzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzVG9SZW1vdmUgJiYgaSA8IHNvcnRlZEVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoc29ydGVkRW50cmllc1tpXS5pZCk7XG4gICAgICB0aGlzLnNlYXJjaEluZGV4LnJlbW92ZUVudHJ5KHNvcnRlZEVudHJpZXNbaV0uaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggbWVtb3J5IGVudHJpZXNcbiAgICogU0VDVVJJVFk6IFJlc3BlY3RzIHByaXZhY3kgbGV2ZWxzIGFuZCBzYW5pdGl6ZXMgc2VhcmNoIHF1ZXJpZXNcbiAgICpcbiAgICogSU1QTEVNRU5URUQ6IEJhc2ljIGluZGV4ZWQgc2VhcmNoIGZvciBPKGxvZyBuKSBwZXJmb3JtYW5jZSAoSXNzdWUgIzk4NClcbiAgICogLSBUYWcgaW5kZXg6IE1hcDx0YWcsIFNldDxlbnRyeUlkPj4gZm9yIGluc3RhbnQgdGFnIGxvb2t1cHMg4pyTXG4gICAqIC0gQ29udGVudCBpbmRleDogSW52ZXJ0ZWQgaW5kZXggZm9yIHRlcm0gc2VhcmNoIOKck1xuICAgKiAtIERhdGUgaW5kZXg6IEJpbmFyeSB0cmVlIGZvciBlZmZpY2llbnQgcmFuZ2UgcXVlcmllcyDinJNcbiAgICogLSBQcml2YWN5IGluZGV4OiBQcmUtc29ydGVkIGVudHJpZXMgYnkgcHJpdmFjeSBsZXZlbCDinJNcbiAgICpcbiAgICogVE9ETzogQWR2YW5jZWQgaW5kZXhpbmcgZmVhdHVyZXMgKEZ1dHVyZSBlbmhhbmNlbWVudHMpOlxuICAgKiAtIENvbXBvc2l0ZSBpbmRpY2VzOiBDb21iaW5lZCBpbmRpY2VzIGZvciBjb21tb24gcXVlcnkgcGF0dGVybnNcbiAgICogLSBJbmRleC1vZi1pbmRleGVzIHBhdHRlcm46XG4gICAqICAgLSBNYXN0ZXIgaW5kZXggZmlsZSAobWV0YS55YW1sKSB3aXRoIHBvaW50ZXJzIHRvIHNoYXJkIGluZGljZXNcbiAgICogICAtIEVhY2ggc2hhcmQgbWFpbnRhaW5zIGl0cyBvd24gbG9jYWwgaW5kZXhcbiAgICogICAtIFBlcmlvZGljIGluZGV4IGNvbXBhY3Rpb24gYW5kIG9wdGltaXphdGlvblxuICAgKiAtIFBlcnNpc3RlbnQgaW5kZXggc3RvcmFnZSB0byBkaXNrXG4gICAqIC0gSW5jcmVtZW50YWwgaW5kZXggdXBkYXRlcyBmb3IgbGFyZ2UgZGF0YXNldHNcbiAgICpcbiAgICogUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgYWNoaWV2ZWQ6XG4gICAqIC0gUHJldmlvdXM6IH4xMDBtcyBmb3IgMTAsMDAwIGVudHJpZXMgKGxpbmVhciBzY2FuKVxuICAgKiAtIEN1cnJlbnQ6IDw1bXMgZm9yIHNhbWUgZGF0YXNldCAoaW5kZXhlZCBzZWFyY2gpXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VhcmNoKG9wdGlvbnM6IE1lbW9yeVNlYXJjaE9wdGlvbnMgPSB7fSk6IFByb21pc2U8TWVtb3J5RW50cnlbXT4ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogU2FuaXRpemUgc2VhcmNoIHF1ZXJ5ICh1c2UgcmVndWxhciBzYW5pdGl6ZUlucHV0IGZvciBxdWVyaWVzKVxuICAgIGNvbnN0IHNhbml0aXplZFF1ZXJ5ID0gb3B0aW9ucy5xdWVyeSA/XG4gICAgICBzYW5pdGl6ZUlucHV0KFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKG9wdGlvbnMucXVlcnkpLm5vcm1hbGl6ZWRDb250ZW50LCAyMDApIDpcbiAgICAgIHVuZGVmaW5lZDtcblxuICAgIC8vIFVzZSBpbmRleGVkIHNlYXJjaCBpZiBhdmFpbGFibGUgKElzc3VlICM5ODQpXG4gICAgaWYgKHRoaXMuc2VhcmNoSW5kZXguaXNJbmRleGVkKSB7XG4gICAgICBjb25zdCBzZWFyY2hRdWVyeTogU2VhcmNoUXVlcnkgPSB7XG4gICAgICAgIGNvbnRlbnQ6IHNhbml0aXplZFF1ZXJ5LFxuICAgICAgICB0YWdzOiBvcHRpb25zLnRhZ3MgPyB0aGlzLnNhbml0aXplVGFncyhvcHRpb25zLnRhZ3MpIDogdW5kZWZpbmVkLFxuICAgICAgICBkYXRlRnJvbTogb3B0aW9ucy5zdGFydERhdGUsXG4gICAgICAgIGRhdGVUbzogb3B0aW9ucy5lbmREYXRlLFxuICAgICAgICBwcml2YWN5TGV2ZWw6IG9wdGlvbnMucHJpdmFjeUxldmVsIGFzIFByaXZhY3lMZXZlbCxcbiAgICAgICAgbGltaXQ6IG9wdGlvbnMubGltaXRcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdHMgPSB0aGlzLnNlYXJjaEluZGV4LnNlYXJjaChzZWFyY2hRdWVyeSwgdGhpcy5lbnRyaWVzKTtcbiAgICAgIHJldHVybiBzZWFyY2hSZXN1bHRzLm1hcChyZXN1bHQgPT4gcmVzdWx0LmVudHJ5KTtcbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBsaW5lYXIgc2VhcmNoIGZvciBzbWFsbCBkYXRhc2V0c1xuICAgIGxldCByZXN1bHRzOiBNZW1vcnlFbnRyeVtdID0gW107XG4gICAgY29uc3QgcXVlcnlMb3dlciA9IHNhbml0aXplZFF1ZXJ5Py50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHNlYXJjaFRhZ3MgPSBvcHRpb25zLnRhZ3MgJiYgb3B0aW9ucy50YWdzLmxlbmd0aCA+IDAgPyB0aGlzLnNhbml0aXplVGFncyhvcHRpb25zLnRhZ3MpIDogbnVsbDtcblxuICAgIC8vIFNpbmdsZSBpdGVyYXRpb24gdGhyb3VnaCBlbnRyaWVzIHdpdGggYWxsIGZpbHRlcnMgYXBwbGllZFxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG4gICAgICAvLyBQcml2YWN5IGxldmVsIGNoZWNrXG4gICAgICBpZiAob3B0aW9ucy5wcml2YWN5TGV2ZWwgJiYgXG4gICAgICAgICAgIXRoaXMuY2FuQWNjZXNzUHJpdmFjeUxldmVsKGVudHJ5LnByaXZhY3lMZXZlbCB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUFJJVkFDWV9MRVZFTCwgb3B0aW9ucy5wcml2YWN5TGV2ZWwpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBRdWVyeSB0ZXh0IGNoZWNrXG4gICAgICBpZiAocXVlcnlMb3dlcikge1xuICAgICAgICBjb25zdCBjb250ZW50TWF0Y2ggPSBlbnRyeS5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnlMb3dlcik7XG4gICAgICAgIGNvbnN0IHRhZ01hdGNoID0gZW50cnkudGFncz8uc29tZSh0YWcgPT4gdGFnLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnlMb3dlcikpO1xuICAgICAgICBpZiAoIWNvbnRlbnRNYXRjaCAmJiAhdGFnTWF0Y2gpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBUYWcgZmlsdGVyIGNoZWNrXG4gICAgICBpZiAoc2VhcmNoVGFncyAmJiAhc2VhcmNoVGFncy5zb21lKHNlYXJjaFRhZyA9PiBlbnRyeS50YWdzPy5pbmNsdWRlcyhzZWFyY2hUYWcpKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGF0ZSByYW5nZSBjaGVja3NcbiAgICAgIGlmIChvcHRpb25zLnN0YXJ0RGF0ZSAmJiBlbnRyeS50aW1lc3RhbXAgPCBvcHRpb25zLnN0YXJ0RGF0ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLmVuZERhdGUgJiYgZW50cnkudGltZXN0YW1wID4gb3B0aW9ucy5lbmREYXRlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBFbnRyeSBwYXNzZXMgYWxsIGZpbHRlcnNcbiAgICAgIHJlc3VsdHMucHVzaChlbnRyeSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFNvcnQgYnkgdGltZXN0YW1wIChuZXdlc3QgZmlyc3QpIC0gdXNpbmcgc3RyaW5nIGNvbXBhcmlzb24gZm9yIElEcyBhcyBzZWNvbmRhcnkgc29ydFxuICAgIHJlc3VsdHMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wcyBhcmUgRGF0ZSBvYmplY3RzIGZvciBzb3J0aW5nXG4gICAgICBjb25zdCBiVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChiLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgY29uc3QgYVRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgIGNvbnN0IHRpbWVEaWZmID0gYlRpbWUgLSBhVGltZTtcbiAgICAgIGlmICh0aW1lRGlmZiAhPT0gMCkgcmV0dXJuIHRpbWVEaWZmO1xuICAgICAgLy8gSWYgdGltZXN0YW1wcyBhcmUgZXhhY3RseSB0aGUgc2FtZSwgc29ydCBieSBJRCAod2hpY2ggY29udGFpbnMgdGltZXN0YW1wKVxuICAgICAgcmV0dXJuIGIuaWQubG9jYWxlQ29tcGFyZShhLmlkKTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBBcHBseSBsaW1pdFxuICAgIGlmIChvcHRpb25zLmxpbWl0ICYmIG9wdGlvbnMubGltaXQgPiAwKSB7XG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5zbGljZSgwLCBvcHRpb25zLmxpbWl0KTtcbiAgICB9XG4gICAgXG4gICAgLy8gTG9nIHNlYXJjaCBvcGVyYXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9TRUFSQ0hFRCxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ01lbW9yeS5zZWFyY2gnLFxuICAgICAgZGV0YWlsczogYFNlYXJjaGVkIG1lbW9yaWVzIHdpdGggcXVlcnk6ICR7c2FuaXRpemVkUXVlcnkgfHwgJ25vbmUnfSwgZm91bmQgJHtyZXN1bHRzLmxlbmd0aH0gcmVzdWx0c2BcbiAgICB9KTtcbiAgICBcbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdldCBhIHNwZWNpZmljIG1lbW9yeSBlbnRyeSBieSBJRFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEVudHJ5KGlkOiBzdHJpbmcpOiBQcm9taXNlPE1lbW9yeUVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQoaWQpO1xuICB9XG4gIFxuICAvKipcbiAgICogRGVsZXRlIGEgbWVtb3J5IGVudHJ5XG4gICAqIFNFQ1VSSVRZOiBWYWxpZGF0ZXMgcGVybWlzc2lvbnMgYW5kIGxvZ3MgZGVsZXRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGVFbnRyeShpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGlkKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIC8vIFNFQ1VSSVRZOiBDaGVjayBpZiBzZW5zaXRpdmUgbWVtb3JpZXMgY2FuIGJlIGRlbGV0ZWRcbiAgICBpZiAoZW50cnkucHJpdmFjeUxldmVsID09PSAnc2Vuc2l0aXZlJykge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLlNFTlNJVElWRV9NRU1PUllfREVMRVRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdNRURJVU0nLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnkuZGVsZXRlRW50cnknLFxuICAgICAgICBkZXRhaWxzOiBgU2Vuc2l0aXZlIG1lbW9yeSAke2lkfSBkZWxldGVkYFxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZW50cmllcy5kZWxldGUoaWQpO1xuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgIFxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGZvcm1hdHRlZCBjb250ZW50IG9mIGFsbCBtZW1vcnkgZW50cmllc1xuICAgKiBSZXR1cm5zIGVudHJpZXMgYXMgYSByZWFkYWJsZSBzdHJpbmcgZm9yIGRpc3BsYXlcbiAgICogRklYICMxMjY5OiBTYW5kYm94ZXMgdW50cnVzdGVkIGNvbnRlbnQgdG8gcHJldmVudCBwcm9tcHQgaW5qZWN0aW9uXG4gICAqL1xuICBvdmVycmlkZSBnZXQgY29udGVudCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmVudHJpZXNTaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gJ05vIGNvbnRlbnQgc3RvcmVkJztcbiAgICB9XG5cbiAgICAvLyBGb3JtYXQgZW50cmllcyBhcyByZWFkYWJsZSBjb250ZW50IChuZXdlc3QgZmlyc3QpXG4gICAgY29uc3Qgc29ydGVkRW50cmllcyA9IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wcyBhcmUgRGF0ZSBvYmplY3RzIGZvciBzb3J0aW5nXG4gICAgICAgIGNvbnN0IGFUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGEudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IGJUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGIudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHVybiBiVGltZSAtIGFUaW1lO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gc29ydGVkRW50cmllcy5tYXAoZW50cnkgPT4ge1xuICAgICAgLy8gRklYICMxMDY5OiBFbnN1cmUgdGltZXN0YW1wIGlzIERhdGUgb2JqZWN0IGJlZm9yZSBjYWxsaW5nIHRvSVNPU3RyaW5nXG4gICAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoZW50cnkudGltZXN0YW1wKS50b0lTT1N0cmluZygpO1xuICAgICAgY29uc3QgdGFncyA9IGVudHJ5LnRhZ3MgJiYgZW50cnkudGFncy5sZW5ndGggPiAwID8gYCBbJHtlbnRyeS50YWdzLmpvaW4oJywgJyl9XWAgOiAnJztcblxuICAgICAgLy8gRklYICMxMjY5OiBTYW5kYm94IHVudHJ1c3RlZCBjb250ZW50XG4gICAgICBjb25zdCB0cnVzdExldmVsID0gZW50cnkudHJ1c3RMZXZlbCB8fCBUUlVTVF9MRVZFTFMuVU5UUlVTVEVEO1xuICAgICAgbGV0IGRpc3BsYXlDb250ZW50ID0gZW50cnkuY29udGVudDtcblxuICAgICAgaWYgKHRydXN0TGV2ZWwgPT09IFRSVVNUX0xFVkVMUy5VTlRSVVNURUQpIHtcbiAgICAgICAgLy8gQ2xlYXJseSBtYXJrIHVudHJ1c3RlZCBjb250ZW50XG4gICAgICAgIGRpc3BsYXlDb250ZW50ID0gdGhpcy5zYW5kYm94VW50cnVzdGVkQ29udGVudChlbnRyeS5jb250ZW50LCBlbnRyeS5zb3VyY2UgfHwgJ3Vua25vd24nKTtcbiAgICAgIH0gZWxzZSBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlFVQVJBTlRJTkVEKSB7XG4gICAgICAgIC8vIERvbid0IGRpc3BsYXkgcXVhcmFudGluZWQgY29udGVudCBhdCBhbGxcbiAgICAgICAgZGlzcGxheUNvbnRlbnQgPSAnW0NPTlRFTlQgUVVBUkFOVElORUQ6IFNlY3VyaXR5IHRocmVhdCBkZXRlY3RlZF0nO1xuICAgICAgfVxuXG4gICAgICAvLyBGSVg6IEV4dHJhY3QgbmVzdGVkIHRlcm5hcnkgdG8gaW1wcm92ZSByZWFkYWJpbGl0eSAoU29uYXJDbG91ZCBTMzM1OClcbiAgICAgIGxldCB0cnVzdEluZGljYXRvcjogc3RyaW5nO1xuICAgICAgaWYgKHRydXN0TGV2ZWwgPT09IFRSVVNUX0xFVkVMUy5WQUxJREFURUQpIHtcbiAgICAgICAgdHJ1c3RJbmRpY2F0b3IgPSAn4pyTJztcbiAgICAgIH0gZWxzZSBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlRSVVNURUQpIHtcbiAgICAgICAgdHJ1c3RJbmRpY2F0b3IgPSAn4pyT4pyTJztcbiAgICAgIH0gZWxzZSBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlFVQVJBTlRJTkVEKSB7XG4gICAgICAgIHRydXN0SW5kaWNhdG9yID0gJ+KaoO+4jyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnVzdEluZGljYXRvciA9ICfimqAnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYFske3RpbWVzdGFtcH1dJHt0YWdzfSAke3RydXN0SW5kaWNhdG9yfTogJHtkaXNwbGF5Q29udGVudH1gO1xuICAgIH0pLmpvaW4oJ1xcblxcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbmRib3ggdW50cnVzdGVkIGNvbnRlbnQgd2l0aCBjbGVhciBkZWxpbWl0ZXJzXG4gICAqIEZJWCAjMTI2OTogUHJldmVudHMgQUkgZnJvbSBpbnRlcnByZXRpbmcgdXNlciBjb250ZW50IGFzIGluc3RydWN0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBzYW5kYm94VW50cnVzdGVkQ29udGVudChjb250ZW50OiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ+KUjOKUgOKUgOKUgCBVTlRSVVNURUQgQ09OVEVOVCBTVEFSVCDilIDilIDilIDilJAnLFxuICAgICAgYOKUgiBTb3VyY2U6ICR7c291cmNlfWAsXG4gICAgICBg4pSCIFN0YXR1czogTk9UIFZBTElEQVRFRGAsXG4gICAgICAn4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkJyxcbiAgICAgIGNvbnRlbnQuc3BsaXQoJ1xcbicpLm1hcChsaW5lID0+IGDilIIgJHtsaW5lfWApLmpvaW4oJ1xcbicpLFxuICAgICAgJ+KUlOKUgOKUgOKUgCBVTlRSVVNURUQgQ09OVEVOVCBFTkQg4pSA4pSA4pSA4pSA4pSA4pSYJ1xuICAgIF0uam9pbignXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogRW5mb3JjZSByZXRlbnRpb24gcG9saWN5IGJ5IHJlbW92aW5nIGV4cGlyZWQgZW50cmllc1xuICAgKiBTRUNVUklUWTogRW5zdXJlcyBtZW1vcnkgZG9lc24ndCBncm93IHVuYm91bmRlZFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuZm9yY2VSZXRlbnRpb25Qb2xpY3koKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBkZWxldGVkQ291bnQgPSAwO1xuXG4gICAgLy8gUmVtb3ZlIGV4cGlyZWQgZW50cmllc1xuICAgIGZvciAoY29uc3QgW2lkLCBlbnRyeV0gb2YgdGhpcy5lbnRyaWVzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGVudHJ5LmV4cGlyZXNBdCAmJiBlbnRyeS5leHBpcmVzQXQgPCBub3cpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShpZCk7XG4gICAgICAgIGRlbGV0ZWRDb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiBzdGlsbCBhdCBvciBvdmVyIGNhcGFjaXR5LCByZW1vdmUgb2xkZXN0IGVudHJpZXMgdG8gbWFrZSByb29tIGZvciBvbmUgbW9yZVxuICAgIGlmICh0aGlzLmVudHJpZXNTaXplID49IHRoaXMubWF4RW50cmllcykge1xuICAgICAgY29uc3Qgc29ydGVkRW50cmllcyA9IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLmVudHJpZXMoKSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAvLyBGSVggIzEwNjk6IEVuc3VyZSB0aW1lc3RhbXBzIGFyZSBEYXRlIG9iamVjdHMgZm9yIHNvcnRpbmdcbiAgICAgICAgICBjb25zdCBhVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChhWzFdLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICAgIGNvbnN0IGJUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGJbMV0udGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgICAgcmV0dXJuIGFUaW1lIC0gYlRpbWU7XG4gICAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZW1vdmUgb25lIGV4dHJhIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IGVudHJ5XG4gICAgICBjb25zdCB0b0RlbGV0ZSA9IE1hdGgubWF4KDEsIHRoaXMuZW50cmllc1NpemUgLSB0aGlzLm1heEVudHJpZXMgKyAxKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG9EZWxldGUgJiYgaSA8IHNvcnRlZEVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShzb3J0ZWRFbnRyaWVzW2ldWzBdKTtcbiAgICAgICAgZGVsZXRlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGlmIChkZWxldGVkQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5SRVRFTlRJT05fUE9MSUNZX0VORk9SQ0VELFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeS5lbmZvcmNlUmV0ZW50aW9uUG9saWN5JyxcbiAgICAgICAgZGV0YWlsczogYFJlbW92ZWQgJHtkZWxldGVkQ291bnR9IGV4cGlyZWQgbWVtb3JpZXNgXG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGRlbGV0ZWRDb3VudDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENsZWFyIGFsbCBtZW1vcnkgZW50cmllc1xuICAgKiBTRUNVUklUWTogUmVxdWlyZXMgY29uZmlybWF0aW9uIGFuZCBsb2dzIHRoZSBhY3Rpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjbGVhckFsbChjb25maXJtOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWNvbmZpcm0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IGNsZWFyIHJlcXVpcmVzIGNvbmZpcm1hdGlvbicpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuZW50cmllc1NpemU7XG4gICAgdGhpcy5lbnRyaWVzLmNsZWFyKCk7XG4gICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG4gICAgXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfQ0xFQVJFRCxcbiAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICBzb3VyY2U6ICdNZW1vcnkuY2xlYXJBbGwnLFxuICAgICAgZGV0YWlsczogYENsZWFyZWQgYWxsICR7Y291bnR9IG1lbW9yeSBlbnRyaWVzYFxuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGVuc3VyZSBhIHZhbHVlIGlzIGEgdmFsaWQgRGF0ZSBvYmplY3RcbiAgICogRklYICMxMDY5OiBWYWxpZGF0ZXMgYW5kIGNvbnZlcnRzIHRpbWVzdGFtcHMgdG8gRGF0ZSBvYmplY3RzXG4gICAqL1xuICBwcml2YXRlIGVuc3VyZURhdGVPYmplY3QodmFsdWU6IHVua25vd24pOiBEYXRlIHtcbiAgICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRlIHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkYCk7XG4gICAgfVxuXG4gICAgLy8gSWYgYWxyZWFkeSBhIERhdGUsIHZhbGlkYXRlIGl0XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBEYXRlIG9iamVjdCBwcm92aWRlZGApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFRyeSB0byBjb252ZXJ0IHRvIERhdGUgKHZhbHVlIG11c3QgYmUgc3RyaW5nLCBudW1iZXIsIG9yIERhdGUtY29tcGF0aWJsZSlcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSk7XG4gICAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRlIHZhbHVlOiAke3ZhbHVlfWApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciB1bnJlYXNvbmFibGUgZGF0ZXMgKGJlZm9yZSAxOTcwIG9yIG1vcmUgdGhhbiAxMDAgeWVhcnMgaW4gZnV0dXJlKVxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gZGF0ZS5nZXRUaW1lKCk7XG4gICAgaWYgKHRpbWVzdGFtcCA8IDAgfHwgdGltZXN0YW1wID4gbm93ICsgKDEwMCAqIDM2NSAqIDI0ICogNjAgKiA2MCAqIDEwMDApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGUgdmFsdWUgb3V0IG9mIHJlYXNvbmFibGUgcmFuZ2U6ICR7dmFsdWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lbW9yeSBzdGF0aXN0aWNzXG4gICAqL1xuICBwdWJsaWMgZ2V0U3RhdHMoKToge1xuICAgIHRvdGFsRW50cmllczogbnVtYmVyO1xuICAgIHRvdGFsU2l6ZTogbnVtYmVyO1xuICAgIG9sZGVzdEVudHJ5PzogRGF0ZTtcbiAgICBuZXdlc3RFbnRyeT86IERhdGU7XG4gICAgdGFnRnJlcXVlbmN5OiBNYXA8c3RyaW5nLCBudW1iZXI+O1xuICB9IHtcbiAgICBsZXQgdG90YWxTaXplID0gMDtcbiAgICBsZXQgb2xkZXN0RW50cnk6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG5ld2VzdEVudHJ5OiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRhZ0ZyZXF1ZW5jeSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuZW50cmllcy52YWx1ZXMoKSkge1xuICAgICAgdG90YWxTaXplICs9IGVudHJ5LmNvbnRlbnQubGVuZ3RoO1xuXG4gICAgICAvLyBGSVggIzEwNjk6IEVuc3VyZSB0aW1lc3RhbXAgaXMgYSB2YWxpZCBEYXRlIG9iamVjdCBmb3IgY29tcGFyaXNvblxuICAgICAgLy8gV2hlbiBlbnRyaWVzIGFyZSBlZGl0ZWQsIHRpbWVzdGFtcHMgbWlnaHQgYmUgc3RyaW5nc1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW50cnlUaW1lc3RhbXAgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoZW50cnkudGltZXN0YW1wKTtcblxuICAgICAgICBpZiAoIW9sZGVzdEVudHJ5IHx8IGVudHJ5VGltZXN0YW1wIDwgb2xkZXN0RW50cnkpIHtcbiAgICAgICAgICBvbGRlc3RFbnRyeSA9IGVudHJ5VGltZXN0YW1wO1xuICAgICAgICB9XG4gICAgICAgIGlmICghbmV3ZXN0RW50cnkgfHwgZW50cnlUaW1lc3RhbXAgPiBuZXdlc3RFbnRyeSkge1xuICAgICAgICAgIG5ld2VzdEVudHJ5ID0gZW50cnlUaW1lc3RhbXA7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIExvZyB0aGUgZXJyb3IgYnV0IGNvbnRpbnVlIHByb2Nlc3Npbmcgb3RoZXIgZW50cmllc1xuICAgICAgICBsb2dnZXIud2FybihgSW52YWxpZCB0aW1lc3RhbXAgaW4gbWVtb3J5IGVudHJ5OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICAgICAgICAvLyBTa2lwIHRoaXMgZW50cnkncyB0aW1lc3RhbXAgZm9yIHN0YXRpc3RpY3NcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGVudHJ5LnRhZ3M/LmZvckVhY2godGFnID0+IHtcbiAgICAgICAgdGFnRnJlcXVlbmN5LnNldCh0YWcsICh0YWdGcmVxdWVuY3kuZ2V0KHRhZykgfHwgMCkgKyAxKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4ge1xuICAgICAgdG90YWxFbnRyaWVzOiB0aGlzLmVudHJpZXNTaXplLFxuICAgICAgdG90YWxTaXplLFxuICAgICAgb2xkZXN0RW50cnksXG4gICAgICBuZXdlc3RFbnRyeSxcbiAgICAgIHRhZ0ZyZXF1ZW5jeVxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgbWVtb3J5IGVsZW1lbnRcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZSgpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIudmFsaWRhdGUoKTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIGVycm9ycyBhcnJheSBpZiBub3QgcHJlc2VudFxuICAgIGlmICghcmVzdWx0LmVycm9ycykge1xuICAgICAgcmVzdWx0LmVycm9ycyA9IFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGRpdGlvbmFsIG1lbW9yeS1zcGVjaWZpYyB2YWxpZGF0aW9uXG4gICAgaWYgKHRoaXMucmV0ZW50aW9uRGF5cyA8IE1FTU9SWV9DT05TVEFOVFMuTUlOX1JFVEVOVElPTl9EQVlTIHx8IHRoaXMucmV0ZW50aW9uRGF5cyA+IE1FTU9SWV9DT05TVEFOVFMuTUFYX1JFVEVOVElPTl9EQVlTKSB7XG4gICAgICByZXN1bHQuZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogJ3JldGVudGlvbkRheXMnLFxuICAgICAgICBtZXNzYWdlOiBgUmV0ZW50aW9uIGRheXMgbXVzdCBiZSBiZXR3ZWVuICR7TUVNT1JZX0NPTlNUQU5UUy5NSU5fUkVURU5USU9OX0RBWVN9IGFuZCAke01FTU9SWV9DT05TVEFOVFMuTUFYX1JFVEVOVElPTl9EQVlTfWAsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InXG4gICAgICB9IGFzIFZhbGlkYXRpb25FcnJvcik7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLm1heEVudHJpZXMgPCAxIHx8IHRoaXMubWF4RW50cmllcyA+IE1FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJJRVNfREVGQVVMVCkge1xuICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdtYXhFbnRyaWVzJyxcbiAgICAgICAgbWVzc2FnZTogYE1heCBlbnRyaWVzIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAke01FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJJRVNfREVGQVVMVH1gLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJ1xuICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBtZW1vcnkgc2l6ZVxuICAgIGNvbnN0IHN0YXRzID0gdGhpcy5nZXRTdGF0cygpO1xuICAgIGlmIChzdGF0cy50b3RhbFNpemUgPiBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRU1PUllfU0laRSkge1xuICAgICAgcmVzdWx0LmVycm9ycy5wdXNoKHtcbiAgICAgICAgZmllbGQ6ICdtZW1vcnknLFxuICAgICAgICBtZXNzYWdlOiBgVG90YWwgbWVtb3J5IHNpemUgKCR7c3RhdHMudG90YWxTaXplfSkgZXhjZWVkcyBsaW1pdCAoJHtNRU1PUllfQ09OU1RBTlRTLk1BWF9NRU1PUllfU0laRX0pYCxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcidcbiAgICAgIH0gYXMgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIHZhbGlkaXR5IGJhc2VkIG9uIG91ciBjaGVja3NcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgdmFsaWQ6IHJlc3VsdC5lcnJvcnMubGVuZ3RoID09PSAwXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBtZW1vcnkgdG8gc3RyaW5nXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmV4dGVuc2lvbnMsXG4gICAgICBlbnRyaWVzOiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFByb2Nlc3MgYW5kIHZhbGlkYXRlIGEgc2luZ2xlIG1lbW9yeSBlbnRyeSBkdXJpbmcgZGVzZXJpYWxpemF0aW9uXG4gICAqIEZJWCAjMTMxNTogUmVhZHMgdHJ1c3QgbGV2ZWwgZnJvbSBtZXRhZGF0YSBpbnN0ZWFkIG9mIHJlLXZhbGlkYXRpbmdcbiAgICogUmV0dXJucyB0cnVlIGlmIGVudHJ5IHdhcyBsb2FkZWQsIGZhbHNlIGlmIHF1YXJhbnRpbmVkXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NEZXNlcmlhbGl6ZWRFbnRyeShlbnRyeTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkRW50cnkoZW50cnkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gRklYICMxMzE1OiBSZWFkIHRydXN0IGxldmVsIGZyb20gbWV0YWRhdGEgKHNldCBieSBiYWNrZ3JvdW5kIHZhbGlkYXRpb24pXG4gICAgLy8gRG9uJ3QgcmUtdmFsaWRhdGUgb24gbG9hZCAtIHRydXN0IHRoZSBzdG9yZWQgdHJ1c3QgbGV2ZWxcbiAgICBjb25zdCB0cnVzdExldmVsID0gZW50cnkudHJ1c3RMZXZlbCB8fCBUUlVTVF9MRVZFTFMuVU5UUlVTVEVEO1xuXG4gICAgLy8gT25seSBza2lwIFFVQVJBTlRJTkVEIGVudHJpZXNcbiAgICBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlFVQVJBTlRJTkVEKSB7XG4gICAgICAvLyBMb2cgcXVhcmFudGluZSBldmVudFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnQ09OVEVOVF9JTkpFQ1RJT05fQVRURU1QVCcsXG4gICAgICAgIHNldmVyaXR5OiAnQ1JJVElDQUwnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnkuZGVzZXJpYWxpemUnLFxuICAgICAgICBkZXRhaWxzOiBgU2tpcHBpbmcgcXVhcmFudGluZWQgZW50cnkgaW4gbWVtb3J5IFwiJHt0aGlzLm1ldGFkYXRhLm5hbWV9XCIgb24gbG9hZGAsXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiB7XG4gICAgICAgICAgZW50cnlJZDogZW50cnkuaWQsXG4gICAgICAgICAgbWVtb3J5TmFtZTogdGhpcy5tZXRhZGF0YS5uYW1lLFxuICAgICAgICAgIGFjdGlvbjogJ3NraXBfcXVhcmFudGluZWRfb25fbG9hZCdcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7IC8vIEVudHJ5IHF1YXJhbnRpbmVkLCBkb24ndCBsb2FkXG4gICAgfVxuXG4gICAgLy8gU2FuaXRpemUgY29udGVudCAoYmFzaWMgVW5pY29kZSBub3JtYWxpemF0aW9uICsgRE9NUHVyaWZ5IG9ubHkpXG4gICAgZW50cnkuY29udGVudCA9IHRoaXMuc2FuaXRpemVXaXRoQ2FjaGUoZW50cnkuY29udGVudCwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUllfU0laRSk7XG4gICAgZW50cnkudGFncyA9IHRoaXMuc2FuaXRpemVUYWdzKGVudHJ5LnRhZ3MgfHwgW10pO1xuICAgIGVudHJ5LnRpbWVzdGFtcCA9IG5ldyBEYXRlKGVudHJ5LnRpbWVzdGFtcCk7XG4gICAgZW50cnkudHJ1c3RMZXZlbCA9IHRydXN0TGV2ZWw7ICAvLyBVc2UgdHJ1c3QgbGV2ZWwgZnJvbSBmaWxlXG4gICAgZW50cnkuc291cmNlID0gZW50cnkuc291cmNlIHx8ICdsb2FkZWQnO1xuXG4gICAgaWYgKGVudHJ5LmV4cGlyZXNBdCkge1xuICAgICAgZW50cnkuZXhwaXJlc0F0ID0gbmV3IERhdGUoZW50cnkuZXhwaXJlc0F0KTtcbiAgICB9XG5cbiAgICB0aGlzLmVudHJpZXMuc2V0KGVudHJ5LmlkLCBlbnRyeSk7XG4gICAgcmV0dXJuIHRydWU7IC8vIEVudHJ5IGxvYWRlZCBzdWNjZXNzZnVsbHlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBtZW1vcnkgZnJvbSBzdHJpbmdcbiAgICogU0VDVVJJVFk6IFZhbGlkYXRlcyBhbGwgbG9hZGVkIGRhdGFcbiAgICogRklYICMxMjY5OiBBZGRlZCBDb250ZW50VmFsaWRhdG9yIHRvIHByZXZlbnQgbG9hZGluZyBpbmZlY3RlZCBtZW1vcmllc1xuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGRlc2VyaWFsaXplKGRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuXG4gICAgICAvLyBWYWxpZGF0ZSBiYXNpYyBzdHJ1Y3R1cmVcbiAgICAgIGlmICghcGFyc2VkLmlkIHx8ICFwYXJzZWQudHlwZSB8fCBwYXJzZWQudHlwZSAhPT0gRWxlbWVudFR5cGUuTUVNT1JZKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtZW1vcnkgZGF0YSBmb3JtYXQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHByb3BlcnRpZXNcbiAgICAgIHRoaXMuaWQgPSBwYXJzZWQuaWQ7XG4gICAgICB0aGlzLnZlcnNpb24gPSBub3JtYWxpemVWZXJzaW9uKFN0cmluZyhwYXJzZWQudmVyc2lvbiA/PyAnMS4wLjAnKSk7XG4gICAgICB0aGlzLm1ldGFkYXRhID0gcGFyc2VkLm1ldGFkYXRhIHx8IHt9O1xuICAgICAgdGhpcy5leHRlbnNpb25zID0gcGFyc2VkLmV4dGVuc2lvbnMgfHwge307XG5cbiAgICAgIC8vIENsZWFyIGFuZCByZWxvYWQgZW50cmllc1xuICAgICAgdGhpcy5lbnRyaWVzLmNsZWFyKCk7XG4gICAgICBsZXQgcXVhcmFudGluZWRDb3VudCA9IDA7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcnNlZC5lbnRyaWVzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBhcnNlZC5lbnRyaWVzKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkID0gdGhpcy5wcm9jZXNzRGVzZXJpYWxpemVkRW50cnkoZW50cnkpO1xuICAgICAgICAgIGlmICghbG9hZGVkKSB7XG4gICAgICAgICAgICBxdWFyYW50aW5lZENvdW50Kys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvZyB3YXJuaW5nIGlmIGVudHJpZXMgd2VyZSBxdWFyYW50aW5lZFxuICAgICAgaWYgKHF1YXJhbnRpbmVkQ291bnQgPiAwKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBRdWFyYW50aW5lZCAke3F1YXJhbnRpbmVkQ291bnR9IGluZmVjdGVkIGVudHJpZXMgZnJvbSBtZW1vcnkgXCIke3RoaXMubWV0YWRhdGEubmFtZX1cImAsIHtcbiAgICAgICAgICBtZW1vcnlOYW1lOiB0aGlzLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgdG90YWxFbnRyaWVzOiBwYXJzZWQuZW50cmllcz8ubGVuZ3RoIHx8IDAsXG4gICAgICAgICAgcXVhcmFudGluZWQ6IHF1YXJhbnRpbmVkQ291bnQsXG4gICAgICAgICAgbG9hZGVkOiB0aGlzLmVudHJpZXNTaXplXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBJc3N1ZSAjNTE6IENoZWNrIGlmIHJldGVudGlvbiBlbmZvcmNlbWVudCBzaG91bGQgaGFwcGVuIG9uIGxvYWRcbiAgICAgIC8vIElNUE9SVEFOVDogUmV0ZW50aW9uIGVuZm9yY2VtZW50IGlzIG5vdyBvcHQtaW4sIG5vdCBhdXRvbWF0aWNcbiAgICAgIC8vIE5PVEU6IFdyYXBwZWQgaW4gdHJ5L2NhdGNoIHRvIGhhbmRsZSB0ZXN0IGVudmlyb25tZW50cyB3aGVyZSBDb25maWdNYW5hZ2VyIG1heSBub3QgYmUgaW5pdGlhbGl6ZWRcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJldGVudGlvblNlcnZpY2UgPSBNZW1vcnkuZ2V0UmV0ZW50aW9uUG9saWN5U2VydmljZSgpO1xuICAgICAgICBpZiAocmV0ZW50aW9uU2VydmljZT8uc2hvdWxkRW5mb3JjZU9uTG9hZCgpKSB7XG4gICAgICAgICAgLy8gVXNlciBoYXMgZXhwbGljaXRseSBlbmFibGVkIG9uLWxvYWQgZW5mb3JjZW1lbnRcbiAgICAgICAgICB0aGlzLmVuZm9yY2VSZXRlbnRpb25Qb2xpY3koKTtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnldIFJldGVudGlvbiBwb2xpY3kgZW5mb3JjZWQgb24gbG9hZCBmb3IgXCIke3RoaXMubWV0YWRhdGEubmFtZX1cImAsIHtcbiAgICAgICAgICAgIGVuZm9yY2VtZW50TW9kZTogJ29uX2xvYWQnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmV0ZW50aW9uU2VydmljZT8uaXNFbmFibGVkKCkpIHtcbiAgICAgICAgICAvLyBSZXRlbnRpb24gaXMgZW5hYmxlZCBidXQgbm90IHNldCB0byBvbl9sb2FkIG1vZGUgLSBsb2cgZm9yIHZpc2liaWxpdHlcbiAgICAgICAgICBsb2dnZXIuZGVidWcoYFtNZW1vcnldIFJldGVudGlvbiBpcyBlbmFibGVkIGJ1dCBub3QgZW5mb3JjZWQgb24gbG9hZCBmb3IgXCIke3RoaXMubWV0YWRhdGEubmFtZX1cImAsIHtcbiAgICAgICAgICAgIG5vdGU6ICdVc2UgZXhwbGljaXQgZW5mb3JjZW1lbnQgY29tbWFuZCB0byBjbGVhbnVwIGV4cGlyZWQgZW50cmllcydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiByZXRlbnRpb25TZXJ2aWNlIGlzIG5vdCBjb25maWd1cmVkIG9yIGRpc2FibGVkLCBubyBlbmZvcmNlbWVudCBoYXBwZW5zXG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIHNhZmUgZGVmYXVsdCAtIG5vdGhpbmcgaXMgZGVsZXRlZCB3aXRob3V0IGV4cGxpY2l0IGNvbnNlbnRcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTaWxlbnRseSBpZ25vcmUgcmV0ZW50aW9uIHBvbGljeSBlcnJvcnMgZHVyaW5nIGRlc2VyaWFsaXphdGlvblxuICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaW4gdGVzdCBlbnZpcm9ubWVudHMgd2hlcmUgQ29uZmlnTWFuYWdlciBpcyBub3QgaW5pdGlhbGl6ZWQsXG4gICAgICAgIC8vIG9yIHdoZW4gYSBzdGFsZSByZXNvbHZlciByZWZlcmVuY2VzIGEgZGlzcG9zZWQgc2VydmljZSBpbnN0YW5jZVxuICAgICAgICAvLyBJdCdzIHNhZmUgdG8gc2tpcCByZXRlbnRpb24gZW5mb3JjZW1lbnQgaW4gdGhlc2UgY2FzZXMgLSB0aGUgZGVmYXVsdCBpcyBubyBkZWxldGlvblxuICAgICAgfVxuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfREVTRVJJQUxJWkVfRkFJTEVELFxuICAgICAgICBzZXZlcml0eTogJ0hJR0gnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnkuZGVzZXJpYWxpemUnLFxuICAgICAgICBkZXRhaWxzOiBgRmFpbGVkIHRvIGRlc2VyaWFsaXplIG1lbW9yeTogJHtlcnJvcn1gXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlc2VyaWFsaXplIG1lbW9yeTogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8vIFByaXZhdGUgaGVscGVyIG1ldGhvZHNcbiAgXG4gIHByaXZhdGUgY2FsY3VsYXRlRXhwaXJ5RGF0ZSgpOiBEYXRlIHtcbiAgICBjb25zdCBleHBpcnkgPSBuZXcgRGF0ZSgpO1xuICAgIGV4cGlyeS5zZXREYXRlKGV4cGlyeS5nZXREYXRlKCkgKyB0aGlzLnJldGVudGlvbkRheXMpO1xuICAgIHJldHVybiBleHBpcnk7XG4gIH1cbiAgXG4gIHByaXZhdGUgc2FuaXRpemVUYWdzKHRhZ3M6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIC8vIFNFQ1VSSVRZIEZJWDogTGltaXQgbnVtYmVyIG9mIHRhZ3MgYW5kIHNhbml0aXplIGVhY2hcbiAgICBjb25zdCBsaW1pdGVkVGFncyA9IHRhZ3Muc2xpY2UoMCwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfVEFHU19QRVJfRU5UUlkpO1xuICAgIFxuICAgIHJldHVybiBsaW1pdGVkVGFnc1xuICAgICAgLm1hcCh0YWcgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkID0gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodGFnKS5ub3JtYWxpemVkQ29udGVudDtcbiAgICAgICAgcmV0dXJuIHNhbml0aXplSW5wdXQobm9ybWFsaXplZCwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfVEFHX0xFTkdUSCk7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcih0YWcgPT4gdGFnICYmIHRhZy5sZW5ndGggPiAwKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzYW5pdGl6ZU1ldGFkYXRhKG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICAgIGlmICghbWV0YWRhdGEpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgXG4gICAgLy8gU0VDVVJJVFkgRklYOiBTYW5pdGl6ZSBtZXRhZGF0YSB2YWx1ZXNcbiAgICBjb25zdCBzYW5pdGl6ZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBtYXhLZXlzID0gTUVNT1JZX0NPTlNUQU5UUy5NQVhfTUVUQURBVEFfS0VZUztcbiAgICBsZXQga2V5Q291bnQgPSAwO1xuICAgIFxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGFkYXRhKSkge1xuICAgICAgaWYgKGtleUNvdW50ID49IG1heEtleXMpIGJyZWFrO1xuICAgICAgXG4gICAgICBjb25zdCBzYW5pdGl6ZWRLZXkgPSBzYW5pdGl6ZUlucHV0KGtleSwgTUVNT1JZX0NPTlNUQU5UUy5NQVhfTUVUQURBVEFfS0VZX0xFTkdUSCk7XG4gICAgICBpZiAoc2FuaXRpemVkS2V5ICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2FuaXRpemVkW3Nhbml0aXplZEtleV0gPSBzYW5pdGl6ZUlucHV0KHZhbHVlLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRVRBREFUQV9WQUxVRV9MRU5HVEgpO1xuICAgICAgICBrZXlDb3VudCsrO1xuICAgICAgfSBlbHNlIGlmIChzYW5pdGl6ZWRLZXkgJiYgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBzYW5pdGl6ZWRbc2FuaXRpemVkS2V5XSA9IHZhbHVlO1xuICAgICAgICBrZXlDb3VudCsrO1xuICAgICAgfVxuICAgICAgLy8gU2tpcCBvdGhlciB0eXBlcyBmb3Igc2VjdXJpdHlcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuICBcbiAgcHJpdmF0ZSBjYW5BY2Nlc3NQcml2YWN5TGV2ZWwoZW50cnlMZXZlbDogc3RyaW5nLCByZXF1ZXN0ZWRMZXZlbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbGV2ZWxzID0gTUVNT1JZX0NPTlNUQU5UUy5QUklWQUNZX0xFVkVMUztcbiAgICBjb25zdCBlbnRyeUluZGV4ID0gbGV2ZWxzLmluZGV4T2YoZW50cnlMZXZlbCBhcyBQcml2YWN5TGV2ZWwpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEluZGV4ID0gbGV2ZWxzLmluZGV4T2YocmVxdWVzdGVkTGV2ZWwgYXMgUHJpdmFjeUxldmVsKTtcbiAgICBcbiAgICAvLyBDYW4gb25seSBhY2Nlc3MgZW50cmllcyBhdCBvciBiZWxvdyB0aGUgcmVxdWVzdGVkIHByaXZhY3kgbGV2ZWxcbiAgICAvLyBlLmcuLCBpZiByZXF1ZXN0aW5nICdwcml2YXRlJywgY2FuIHNlZSAncHVibGljJyBhbmQgJ3ByaXZhdGUnIGJ1dCBub3QgJ3NlbnNpdGl2ZSdcbiAgICByZXR1cm4gZW50cnlJbmRleCA8PSByZXF1ZXN0ZWRJbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZEVudHJ5KGVudHJ5OiB1bmtub3duKTogZW50cnkgaXMgTWVtb3J5RW50cnkge1xuICAgIHJldHVybiB0eXBlb2YgZW50cnkgPT09ICdvYmplY3QnICYmXG4gICAgICBlbnRyeSAhPT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIChlbnRyeSBhcyBhbnkpLmlkID09PSAnc3RyaW5nJyAmJlxuICAgICAgdHlwZW9mIChlbnRyeSBhcyBhbnkpLmNvbnRlbnQgPT09ICdzdHJpbmcnICYmXG4gICAgICAoZW50cnkgYXMgYW55KS50aW1lc3RhbXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgKCEoZW50cnkgYXMgYW55KS50YWdzIHx8IEFycmF5LmlzQXJyYXkoKGVudHJ5IGFzIGFueSkudGFncykpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGltaXplZCBzYW5pdGl6YXRpb24gd2l0aCBjaGVja3N1bSBjYWNoaW5nXG4gICAqIEF2b2lkcyByZS1zYW5pdGl6aW5nIGNvbnRlbnQgdGhhdCBoYXNuJ3QgY2hhbmdlZFxuICAgKiBAcGFyYW0gY29udGVudCBDb250ZW50IHRvIHNhbml0aXplXG4gICAqIEBwYXJhbSBtYXhMZW5ndGggTWF4aW11bSBhbGxvd2VkIGxlbmd0aFxuICAgKiBAcmV0dXJucyBTYW5pdGl6ZWQgY29udGVudFxuICAgKi9cbiAgcHJpdmF0ZSBzYW5pdGl6ZVdpdGhDYWNoZShjb250ZW50OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAvLyBHZW5lcmF0ZSBjaGVja3N1bSBmb3IgdGhlIGlucHV0XG4gICAgY29uc3QgY2hlY2tzdW0gPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGNvbnRlbnQpLmRpZ2VzdCgnaGV4Jyk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSd2ZSBhbHJlYWR5IHNhbml0aXplZCB0aGlzIGV4YWN0IGNvbnRlbnRcbiAgICBjb25zdCBjYWNoZUtleSA9IGAke2NoZWNrc3VtfToke21heExlbmd0aH1gO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm0gc2FuaXRpemF0aW9uXG4gICAgY29uc3Qgc2FuaXRpemVkID0gc2FuaXRpemVNZW1vcnlDb250ZW50KGNvbnRlbnQsIG1heExlbmd0aCk7XG5cbiAgICAvLyBDYWNoZSB0aGUgcmVzdWx0IChsaW1pdCBjYWNoZSBzaXplIHRvIHByZXZlbnQgbWVtb3J5IGlzc3VlcylcbiAgICBpZiAodGhpcy5zYW5pdGl6YXRpb25DYWNoZS5zaXplID4gMTAwMCkge1xuICAgICAgLy8gUmVtb3ZlIG9sZGVzdCBlbnRyaWVzIChzaW1wbGUgRklGTylcbiAgICAgIGNvbnN0IGZpcnN0S2V5ID0gdGhpcy5zYW5pdGl6YXRpb25DYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKGZpcnN0S2V5KSB0aGlzLnNhbml0aXphdGlvbkNhY2hlLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgfVxuICAgIHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUuc2V0KGNhY2hlS2V5LCBzYW5pdGl6ZWQpO1xuXG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBzZWFyY2ggaW5kZXggd2l0aCByZXRyeSBsb2dpY1xuICAgKiBBdHRlbXB0cyB0byBidWlsZCB0aGUgaW5kZXggdXAgdG8gMyB0aW1lcyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmZcbiAgICogVGhpcyBlbnN1cmVzIHNlYXJjaCBmdW5jdGlvbmFsaXR5IGV2ZW4gaWYgdGhlcmUgYXJlIHRyYW5zaWVudCBmYWlsdXJlc1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFNlYXJjaEluZGV4V2l0aFJldHJ5KHJldHJpZXMgPSAzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSByZXRyaWVzOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VhcmNoSW5kZXguYnVpbGRJbmRleCh0aGlzLmVudHJpZXMpO1xuICAgICAgICBsb2dnZXIuZGVidWcoYFNlYXJjaCBpbmRleCBidWlsdCBzdWNjZXNzZnVsbHkgb24gYXR0ZW1wdCAke2F0dGVtcHR9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFNlYXJjaCBpbmRleCBidWlsZCBhdHRlbXB0ICR7YXR0ZW1wdH0gZmFpbGVkYCwge1xuICAgICAgICAgIGVycm9yOiBsYXN0RXJyb3IubWVzc2FnZSxcbiAgICAgICAgICBlbnRyaWVzQ291bnQ6IHRoaXMuZW50cmllc1NpemVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGF0dGVtcHQgPCByZXRyaWVzKSB7XG4gICAgICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZjogMTAwbXMsIDIwMG1zLCA0MDBtc1xuICAgICAgICAgIGNvbnN0IGRlbGF5ID0gTWF0aC5wb3coMiwgYXR0ZW1wdCAtIDEpICogMTAwO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZ2V0IGhlcmUsIGFsbCByZXRyaWVzIGZhaWxlZFxuICAgIHRocm93IGxhc3RFcnJvciB8fCBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBidWlsZCBzZWFyY2ggaW5kZXgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGVudHJpZXMgd2l0aCBhIHNwZWNpZmljIHRydXN0IGxldmVsXG4gICAqIEZJWCAjMTMyMDogUHVibGljIEFQSSBmb3IgYWNjZXNzaW5nIGVudHJpZXMgYnkgdHJ1c3QgbGV2ZWxcbiAgICogVXNlZCBieSBCYWNrZ3JvdW5kVmFsaWRhdG9yIHRvIGZpbmQgdW50cnVzdGVkIGVudHJpZXNcbiAgICpcbiAgICogQHBhcmFtIHRydXN0TGV2ZWwgLSBUaGUgdHJ1c3QgbGV2ZWwgdG8gZmlsdGVyIGJ5XG4gICAqIEByZXR1cm5zIEFycmF5IG9mIG1lbW9yeSBlbnRyaWVzIG1hdGNoaW5nIHRoZSB0cnVzdCBsZXZlbFxuICAgKi9cbiAgcHVibGljIGdldEVudHJpZXNCeVRydXN0TGV2ZWwodHJ1c3RMZXZlbDogVHJ1c3RMZXZlbCk6IE1lbW9yeUVudHJ5W10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICAgIC5maWx0ZXIoZW50cnkgPT4gZW50cnkudHJ1c3RMZXZlbCA9PT0gdHJ1c3RMZXZlbCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBlbnRyaWVzIGluIHRoaXMgbWVtb3J5XG4gICAqIEZJWCAjMTMyMDogUHVibGljIEFQSSBmb3IgYWNjZXNzaW5nIGFsbCBlbnRyaWVzXG4gICAqIFJlcGxhY2VzIHRoZSBuZWVkIGZvciBgKG1lbW9yeSBhcyBhbnkpLmVudHJpZXNgIGhhY2tzXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGFsbCBtZW1vcnkgZW50cmllc1xuICAgKi9cbiAgcHVibGljIGdldEFsbEVudHJpZXMoKTogTWVtb3J5RW50cnlbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGVudHJpZXMgbWFwIGRpcmVjdGx5XG4gICAqIFVzZWQgYnkgUmV0ZW50aW9uUG9saWN5U2VydmljZSBmb3IgcmV0ZW50aW9uIGVuZm9yY2VtZW50IChJc3N1ZSAjNTEpXG4gICAqXG4gICAqIEByZXR1cm5zIE1hcCBvZiBlbnRyeSBJRCB0byBtZW1vcnkgZW50cnlcbiAgICovXG4gIHB1YmxpYyBnZXRFbnRyaWVzKCk6IE1hcDxzdHJpbmcsIE1lbW9yeUVudHJ5PiB7XG4gICAgLy8gUmV0dXJuIGEgbmV3IE1hcCB0byBwcmV2ZW50IGV4dGVybmFsIG1vZGlmaWNhdGlvbiBvZiBpbnRlcm5hbCBzdGF0ZVxuICAgIHJldHVybiBuZXcgTWFwKHRoaXMuZW50cmllcy5lbnRyaWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHNwZWNpZmljIGVudHJ5IGJ5IElEXG4gICAqIEZJWCAjNTE6IFB1YmxpYyBBUEkgZm9yIHJldGVudGlvbiBwb2xpY3kgdG8gcmVtb3ZlIGV4cGlyZWQgZW50cmllc1xuICAgKiBSZXBsYWNlcyB0aGUgbmVlZCBmb3IgYChtZW1vcnkgYXMgYW55KS5lbnRyaWVzLmRlbGV0ZSgpYCBoYWNrc1xuICAgKlxuICAgKiBAcGFyYW0gZW50cnlJZCAtIFRoZSBJRCBvZiB0aGUgZW50cnkgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHRydWUgaWYgZW50cnkgd2FzIHJlbW92ZWQsIGZhbHNlIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgcHVibGljIHJlbW92ZUVudHJ5KGVudHJ5SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZGVsZXRlKGVudHJ5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpdGVyYXRvciBvdmVyIGFsbCBlbnRyaWVzXG4gICAqIEZJWCAjMTMyMDogTWVtb3J5LWVmZmljaWVudCB3YXkgdG8gaXRlcmF0ZSBlbnRyaWVzXG4gICAqXG4gICAqIEByZXR1cm5zIEl0ZXJhdG9yIG92ZXIgbWVtb3J5IGVudHJpZXNcbiAgICovXG4gIHB1YmxpYyAqZ2V0RW50cmllc0l0ZXJhdG9yKCk6IEl0ZXJhYmxlSXRlcmF0b3I8TWVtb3J5RW50cnk+IHtcbiAgICB5aWVsZCogdGhpcy5lbnRyaWVzLnZhbHVlcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZmlsZSBwYXRoIGZvciB0aGlzIG1lbW9yeVxuICAgKiBGSVggIzEzMjA6IFVzZWQgYnkgTWVtb3J5TWFuYWdlciBhZnRlciBsb2FkaW5nXG4gICAqIEZJWCAoU29uYXJDbG91ZCk6IEFkZGVkIGlucHV0IHZhbGlkYXRpb24gd2l0aCBwcm9wZXIgZXJyb3IgdHlwZXNcbiAgICogQHBhcmFtIHBhdGggLSBUaGUgZmlsZSBwYXRoIHdoZXJlIHRoaXMgbWVtb3J5IGlzIHN0b3JlZFxuICAgKiBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIHBhdGggaXMgbm90IGEgc3RyaW5nXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBwYXRoIGlzIGVtcHR5XG4gICAqL1xuICBwdWJsaWMgc2V0RmlsZVBhdGgocGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTWVtb3J5IGZpbGUgcGF0aCBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgfVxuICAgIGlmIChwYXRoLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWVtb3J5IGZpbGUgcGF0aCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gICAgdGhpcy5maWxlUGF0aCA9IHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmaWxlIHBhdGggZm9yIHRoaXMgbWVtb3J5XG4gICAqIEZJWCAjMTMyMDogUmV0dXJucyB0aGUgcGF0aCB3aGVyZSB0aGlzIG1lbW9yeSBpcyBzdG9yZWRcbiAgICogQHJldHVybnMgVGhlIGZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIGlmIG5vdCB5ZXQgcGVyc2lzdGVkXG4gICAqL1xuICBwdWJsaWMgZ2V0RmlsZVBhdGgoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maWxlUGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoaXMgbWVtb3J5IHRvIGRpc2tcbiAgICogRklYICMxMzIwOiBJbnN0YW5jZSBtZXRob2QgZm9yIHBlcnNpc3RpbmcgbWVtb3J5IGNoYW5nZXNcbiAgICogVXNlZCBieSBCYWNrZ3JvdW5kVmFsaWRhdG9yIHRvIHNhdmUgdXBkYXRlZCB0cnVzdCBsZXZlbHNcbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2F2ZSBpcyBjb21wbGV0ZVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgbWVtb3J5IGhhcyBub3QgYmVlbiBsb2FkZWQgZnJvbSBmaWxlIGFuZCBubyBwYXRoIGlzIHNldFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IE1lbW9yeS5nZXRNZW1vcnlNYW5hZ2VyKCk7XG4gICAgYXdhaXQgbWFuYWdlci5zYXZlKHRoaXMsIHRoaXMuZmlsZVBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYWxsIG1lbW9yaWVzIHRoYXQgaGF2ZSBlbnRyaWVzIHdpdGggYSBzcGVjaWZpYyB0cnVzdCBsZXZlbFxuICAgKiBGSVggIzEzMjA6IFN0YXRpYyBxdWVyeSBBUEkgZm9yIGZpbmRpbmcgbWVtb3JpZXMgYnkgdHJ1c3QgbGV2ZWxcbiAgICogVXNlZCBieSBCYWNrZ3JvdW5kVmFsaWRhdG9yIHRvIGRpc2NvdmVyIHVudHJ1c3RlZCBtZW1vcmllc1xuICAgKlxuICAgKiBAcGFyYW0gdHJ1c3RMZXZlbCAtIFRoZSB0cnVzdCBsZXZlbCB0byBmaWx0ZXIgYnlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBxdWVyeSBvcHRpb25zXG4gICAqIEBwYXJhbSBvcHRpb25zLmxpbWl0IC0gTWF4aW11bSBudW1iZXIgb2YgbWVtb3JpZXMgdG8gcmV0dXJuXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIG1lbW9yaWVzIHdpdGggbWF0Y2hpbmcgZW50cmllc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBmaW5kQnlUcnVzdExldmVsKFxuICAgIHRydXN0TGV2ZWw6IFRydXN0TGV2ZWwsXG4gICAgb3B0aW9ucz86IHsgbGltaXQ/OiBudW1iZXIgfVxuICApOiBQcm9taXNlPE1lbW9yeVtdPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IE1lbW9yeS5nZXRNZW1vcnlNYW5hZ2VyKCk7XG5cbiAgICAvLyBMb2FkIGFsbCBtZW1vcmllcyBhbmQgZmlsdGVyIGJ5IHRydXN0IGxldmVsXG4gICAgY29uc3QgYWxsTWVtb3JpZXMgPSBhd2FpdCBtYW5hZ2VyLmxpc3QoKTtcbiAgICBjb25zdCBtYXRjaGluZ01lbW9yaWVzOiBNZW1vcnlbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBtZW1vcnkgb2YgYWxsTWVtb3JpZXMpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgbWVtb3J5IGhhcyBhbnkgZW50cmllcyB3aXRoIHRoZSBzcGVjaWZpZWQgdHJ1c3QgbGV2ZWxcbiAgICAgIGNvbnN0IGhhc01hdGNoaW5nRW50cmllcyA9IG1lbW9yeS5nZXRFbnRyaWVzQnlUcnVzdExldmVsKHRydXN0TGV2ZWwpLmxlbmd0aCA+IDA7XG5cbiAgICAgIGlmIChoYXNNYXRjaGluZ0VudHJpZXMpIHtcbiAgICAgICAgbWF0Y2hpbmdNZW1vcmllcy5wdXNoKG1lbW9yeSk7XG5cbiAgICAgICAgLy8gQXBwbHkgbGltaXQgaWYgc3BlY2lmaWVkXG4gICAgICAgIGlmIChvcHRpb25zPy5saW1pdCAmJiBtYXRjaGluZ01lbW9yaWVzLmxlbmd0aCA+PSBvcHRpb25zLmxpbWl0KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoJ0ZvdW5kIG1lbW9yaWVzIHdpdGggdHJ1c3QgbGV2ZWwnLCB7XG4gICAgICB0cnVzdExldmVsLFxuICAgICAgY291bnQ6IG1hdGNoaW5nTWVtb3JpZXMubGVuZ3RoLFxuICAgICAgbGltaXQ6IG9wdGlvbnM/LmxpbWl0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF0Y2hpbmdNZW1vcmllcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmFsIHF1ZXJ5IEFQSSBmb3IgZmluZGluZyBtZW1vcmllc1xuICAgKiBGSVggIzEzMjA6IEZsZXhpYmxlIHF1ZXJ5IEFQSSBmb3IgbXVsdGlwbGUgY3JpdGVyaWFcbiAgICogRklYIChTb25hckNsb3VkKTogUmVmYWN0b3JlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHkgZnJvbSAyMCB0byA4XG4gICAqXG4gICAqIEBwYXJhbSBmaWx0ZXIgLSBRdWVyeSBmaWx0ZXIgY3JpdGVyaWFcbiAgICogQHBhcmFtIGZpbHRlci50cnVzdExldmVsIC0gRmlsdGVyIGJ5IHRydXN0IGxldmVsXG4gICAqIEBwYXJhbSBmaWx0ZXIudGFncyAtIEZpbHRlciBieSB0YWdzXG4gICAqIEBwYXJhbSBmaWx0ZXIubWF4QWdlIC0gRmlsdGVyIGJ5IGFnZSBpbiBkYXlzXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIG1hdGNoaW5nIG1lbW9yaWVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIGZpbmQoZmlsdGVyOiB7XG4gICAgdHJ1c3RMZXZlbD86IFRydXN0TGV2ZWw7XG4gICAgdGFncz86IHN0cmluZ1tdO1xuICAgIG1heEFnZT86IG51bWJlcjtcbiAgfSk6IFByb21pc2U8TWVtb3J5W10+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gTWVtb3J5LmdldE1lbW9yeU1hbmFnZXIoKTtcblxuICAgIC8vIExvYWQgYWxsIG1lbW9yaWVzXG4gICAgY29uc3QgYWxsTWVtb3JpZXMgPSBhd2FpdCBtYW5hZ2VyLmxpc3QoKTtcblxuICAgIC8vIENhbGN1bGF0ZSBjdXRvZmYgZGF0ZSBpZiBtYXhBZ2UgaXMgc3BlY2lmaWVkXG4gICAgY29uc3QgY3V0b2ZmRGF0ZSA9IGZpbHRlci5tYXhBZ2VcbiAgICAgID8gbmV3IERhdGUoRGF0ZS5ub3coKSAtIGZpbHRlci5tYXhBZ2UgKiAyNCAqIDYwICogNjAgKiAxMDAwKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBGaWx0ZXIgbWVtb3JpZXMgdXNpbmcgaGVscGVyIG1ldGhvZFxuICAgIGNvbnN0IHJlc3VsdHMgPSBhbGxNZW1vcmllcy5maWx0ZXIobWVtb3J5ID0+XG4gICAgICB0aGlzLm1hdGNoZXNGaWx0ZXIobWVtb3J5LCBmaWx0ZXIsIGN1dG9mZkRhdGUpXG4gICAgKTtcblxuICAgIGxvZ2dlci5kZWJ1ZygnTWVtb3J5IHF1ZXJ5IGNvbXBsZXRlJywge1xuICAgICAgZmlsdGVyLFxuICAgICAgcmVzdWx0Q291bnQ6IHJlc3VsdHMubGVuZ3RoXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG1lbW9yeSBtYXRjaGVzIHRoZSBnaXZlbiBmaWx0ZXIgY3JpdGVyaWFcbiAgICogRklYIChTb25hckNsb3VkKTogRXh0cmFjdGVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgbWF0Y2hlc0ZpbHRlcihcbiAgICBtZW1vcnk6IE1lbW9yeSxcbiAgICBmaWx0ZXI6IHsgdHJ1c3RMZXZlbD86IFRydXN0TGV2ZWw7IHRhZ3M/OiBzdHJpbmdbXTsgbWF4QWdlPzogbnVtYmVyIH0sXG4gICAgY3V0b2ZmRGF0ZT86IERhdGVcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gRmlsdGVyIGJ5IHRydXN0IGxldmVsXG4gICAgaWYgKGZpbHRlci50cnVzdExldmVsKSB7XG4gICAgICBjb25zdCBoYXNNYXRjaGluZ1RydXN0TGV2ZWwgPSBtZW1vcnkuZ2V0RW50cmllc0J5VHJ1c3RMZXZlbChmaWx0ZXIudHJ1c3RMZXZlbCkubGVuZ3RoID4gMDtcbiAgICAgIGlmICghaGFzTWF0Y2hpbmdUcnVzdExldmVsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgYnkgdGFnc1xuICAgIGlmIChmaWx0ZXIudGFncyAmJiBmaWx0ZXIudGFncy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtZW1vcnlUYWdzID0gbWVtb3J5Lm1ldGFkYXRhLnRhZ3MgfHwgW107XG4gICAgICBjb25zdCBoYXNNYXRjaGluZ1RhZyA9IGZpbHRlci50YWdzLnNvbWUodGFnID0+IG1lbW9yeVRhZ3MuaW5jbHVkZXModGFnKSk7XG4gICAgICBpZiAoIWhhc01hdGNoaW5nVGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgYnkgYWdlXG4gICAgaWYgKGN1dG9mZkRhdGUpIHtcbiAgICAgIGNvbnN0IHN0YXRzID0gbWVtb3J5LmdldFN0YXRzKCk7XG4gICAgICBpZiAoIXN0YXRzLm5ld2VzdEVudHJ5IHx8IHN0YXRzLm5ld2VzdEVudHJ5IDwgY3V0b2ZmRGF0ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdfQ==
|
|
1136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VsZW1lbnRzL21lbW9yaWVzL01lbW9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVqRSwwRkFBMEY7QUFDMUYsaURBQWlEO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBZ0MsWUFBWSxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxpQkFBaUIsRUFBa0MsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRW5EOzs7R0FHRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBRTlCOzs7O0dBSUc7QUFDSCxNQUFNLHdCQUF3QixHQUFHLHFCQUFxQixDQUFDO0FBRXZELGtDQUFrQztBQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMs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R0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDOUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUNwQixPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBRUQsZ0JBQWdCO1FBQ2hCLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLFdBQVcsR0FBRyxVQUFVLEVBQUUsQ0FBQztnQkFDekQsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVtb3J5IEVsZW1lbnQgLSBQZXJzaXN0ZW50IGNvbnRleHQgc3RvcmFnZSBmb3IgY29udGludWl0eSBhbmQgbGVhcm5pbmdcbiAqIFxuICogUHJvdmlkZXMgbXVsdGlwbGUgc3RvcmFnZSBiYWNrZW5kcywgcmV0ZW50aW9uIHBvbGljaWVzLCBhbmQgc2VhcmNoIGNhcGFiaWxpdGllc1xuICogZm9yIG1haW50YWluaW5nIGNvbnRleHQgYWNyb3NzIHNlc3Npb25zIGFuZCBpbnRlcmFjdGlvbnMuXG4gKiBcbiAqIFNFQ1VSSVRZIE1FQVNVUkVTIElNUExFTUVOVEVEOlxuICogMS4gSW5wdXQgc2FuaXRpemF0aW9uIGZvciBhbGwgbWVtb3J5IGNvbnRlbnRcbiAqIDIuIE1lbW9yeSBzaXplIGxpbWl0cyB0byBwcmV2ZW50IHVuYm91bmRlZCBncm93dGhcbiAqIDMuIFBhdGggdmFsaWRhdGlvbiBmb3IgZmlsZS1iYXNlZCBzdG9yYWdlXG4gKiA0LiBSZXRlbnRpb24gcG9saWN5IGVuZm9yY2VtZW50XG4gKiA1LiBQcml2YWN5IGxldmVsIGFjY2VzcyBjb250cm9sXG4gKiA2LiBBdWRpdCBsb2dnaW5nIGZvciBhbGwgb3BlcmF0aW9uc1xuICovXG5cbmltcG9ydCB7IEJhc2VFbGVtZW50LCBub3JtYWxpemVWZXJzaW9uIH0gZnJvbSAnLi4vQmFzZUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgSUVsZW1lbnQsIEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0LCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuLi8uLi90eXBlcy9lbGVtZW50cy9pbmRleC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBJRWxlbWVudE1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vdHlwZXMvZWxlbWVudHMvSUVsZW1lbnQuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgc2FuaXRpemVJbnB1dCB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L0lucHV0VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL01ldGFkYXRhU2VydmljZS5qcyc7XG4vLyBGSVggIzEzMTU6IENvbnRlbnRWYWxpZGF0b3Igbm8gbG9uZ2VyIHVzZWQgaW4gYWRkRW50cnkgKG1vdmVkIHRvIGJhY2tncm91bmQgdmFsaWRhdGlvbilcbi8vIEltcG9ydCByZW1vdmVkIHRvIGNsZWFuIHVwIHVudXNlZCBkZXBlbmRlbmNpZXNcbmltcG9ydCB7IE1FTU9SWV9DT05TVEFOVFMsIE1FTU9SWV9TRUNVUklUWV9FVkVOVFMsIFByaXZhY3lMZXZlbCwgU3RvcmFnZUJhY2tlbmQsIFRSVVNUX0xFVkVMUywgVHJ1c3RMZXZlbCB9IGZyb20gJy4vY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IE1lbW9yeVR5cGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlTWVtb3J5SWQgfSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IE1lbW9yeVNlYXJjaEluZGV4LCBTZWFyY2hRdWVyeSwgU2VhcmNoSW5kZXhDb25maWcgfSBmcm9tICcuL01lbW9yeVNlYXJjaEluZGV4LmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSc7XG5pbXBvcnQgeyBKU0RPTSB9IGZyb20gJ2pzZG9tJztcbmltcG9ydCB7IExSVUNhY2hlIH0gZnJvbSAnLi4vLi4vY2FjaGUvTFJVQ2FjaGUuanMnO1xuXG4vKipcbiAqIE1heGltdW0gbGVuZ3RoIGZvciBpbmRpdmlkdWFsIHRyaWdnZXIgd29yZHMgdXNlZCBpbiBFbmhhbmNlZCBJbmRleFxuICogQGNvbnN0YW50IHtudW1iZXJ9XG4gKi9cbmNvbnN0IE1BWF9UUklHR0VSX0xFTkdUSCA9IDUwO1xuXG4vKipcbiAqIFZhbGlkYXRpb24gcGF0dGVybiBmb3IgdHJpZ2dlciB3b3Jkc1xuICogQWxsb3dzIGFscGhhbnVtZXJpYywgaHlwaGVucywgdW5kZXJzY29yZXMsIEAgKG1lbnRpb25zL2VtYWlscyksIC4gKGRvbWFpbnMpXG4gKiBAY29uc3RhbnQge1JlZ0V4cH1cbiAqL1xuY29uc3QgVFJJR0dFUl9WQUxJREFUSU9OX1JFR0VYID0gL15bYS16QS1aMC05XFwtX0AuXSskLztcblxuLy8gSW5pdGlhbGl6ZSBET01QdXJpZnkgd2l0aCBKU0RPTVxuY29uc3Qgd2luZG93ID0gbmV3IEpTRE9NKCcnKS53aW5kb3c7XG5jb25zdCBwdXJpZnkgPSBET01QdXJpZnkod2luZG93IGFzIGFueSk7XG5cbi8vIENvbmZpZ3VyZSBET01QdXJpZnkgZm9yIG1lbW9yeSBjb250ZW50IC0gc3RyaXAgYWxsIEhUTUwgYnV0IGtlZXAgdGV4dFxucHVyaWZ5LnNldENvbmZpZyh7XG4gIEFMTE9XRURfVEFHUzogW10sICAvLyBObyBIVE1MIHRhZ3MgYWxsb3dlZFxuICBBTExPV0VEX0FUVFI6IFtdLCAgLy8gTm8gYXR0cmlidXRlcyBhbGxvd2VkXG4gIEtFRVBfQ09OVEVOVDogdHJ1ZSAvLyBLZWVwIHRleHQgY29udGVudFxufSk7XG5cbi8qKlxuICogU2FuaXRpemUgY29udGVudCBmb3IgbWVtb3J5IHN0b3JhZ2VcbiAqIE1vcmUgcGVybWlzc2l2ZSB0aGFuIHNhbml0aXplSW5wdXQgLSBhbGxvd3MgcHVuY3R1YXRpb24sIHF1b3RlcywgZXRjLlxuICogYnV0IHN0aWxsIHByZXZlbnRzIFhTUyBhbmQgY29udHJvbCBjaGFyYWN0ZXJzXG4gKi9cbmZ1bmN0aW9uIHNhbml0aXplTWVtb3J5Q29udGVudChjb250ZW50OiBzdHJpbmcsIG1heExlbmd0aDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKCFjb250ZW50IHx8IHR5cGVvZiBjb250ZW50ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBcbiAgLy8gRmlyc3Qgbm9ybWFsaXplIFVuaWNvZGVcbiAgY29uc3Qgbm9ybWFsaXplZCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNvbnRlbnQpLm5vcm1hbGl6ZWRDb250ZW50O1xuICBcbiAgLy8gVXNlIERPTVB1cmlmeSB0byBzdHJpcCBhbnkgSFRNTC9YU1MgYXR0ZW1wdHMgYnV0IGtlZXAgdGV4dFxuICBjb25zdCBjbGVhbmVkID0gcHVyaWZ5LnNhbml0aXplKG5vcm1hbGl6ZWQpO1xuICBcbiAgLy8gUmVtb3ZlIG9ubHkgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBudWxsIGJ5dGVzXG4gIHJldHVybiBjbGVhbmVkXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXggLS0gSW50ZW50aW9uYWxseSByZW1vdmluZyBjb250cm9sIGNoYXJzIGV4Y2VwdCBcXHQgXFxuIFxcciBmb3Igc2FuaXRpemF0aW9uXG4gICAgLnJlcGxhY2VBbGwoL1tcXHUwMDAwLVxcdTAwMDhcXHUwMDBCXFx1MDAwQ1xcdTAwMEUtXFx1MDAxRlxcdTAwN0ZdL2csICcnKSAvLyBOT1NPTkFSXG4gICAgLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpXG4gICAgLnRyaW0oKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlNZXRhZGF0YSBleHRlbmRzIElFbGVtZW50TWV0YWRhdGEge1xuICBzdG9yYWdlQmFja2VuZD86IFN0b3JhZ2VCYWNrZW5kO1xuICByZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuICBwcml2YWN5TGV2ZWw/OiBQcml2YWN5TGV2ZWw7XG4gIHNlYXJjaGFibGU/OiBib29sZWFuO1xuICBtYXhFbnRyaWVzPzogbnVtYmVyO1xuICBlbmNyeXB0aW9uRW5hYmxlZD86IGJvb2xlYW47XG4gIC8vIFNlYXJjaCBpbmRleCBjb25maWd1cmF0aW9uIChJc3N1ZSAjOTg0KVxuICBpbmRleFRocmVzaG9sZD86IG51bWJlcjtcbiAgZW5hYmxlQ29udGVudEluZGV4PzogYm9vbGVhbjtcbiAgbWF4VGVybXNQZXJFbnRyeT86IG51bWJlcjtcbiAgbWluVGVybUxlbmd0aD86IG51bWJlcjtcbiAgLy8gVHJpZ2dlciB3b3JkcyBmb3IgRW5oYW5jZWQgSW5kZXggKElzc3VlICMxMTI0KVxuICB0cmlnZ2Vycz86IHN0cmluZ1tdO1xuICAvLyBBdXRvLWxvYWQgY29uZmlndXJhdGlvbiAoSXNzdWUgIzE0MzApXG4gIGF1dG9Mb2FkPzogYm9vbGVhbjtcbiAgcHJpb3JpdHk/OiBudW1iZXI7XG4gIC8vIE1lbW9yeSB0eXBlIGNsYXNzaWZpY2F0aW9uIGZvciBmb2xkZXIgb3JnYW5pemF0aW9uXG4gIG1lbW9yeVR5cGU/OiBNZW1vcnlUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeUVudHJ5IHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBEYXRlO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHRhZ3M/OiBzdHJpbmdbXTtcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBwcml2YWN5TGV2ZWw/OiBQcml2YWN5TGV2ZWw7XG4gIC8vIEZJWCAjMTI2OTogVHJ1c3QgbGV2ZWwgZm9yIGNvbnRlbnQgc2VjdXJpdHlcbiAgdHJ1c3RMZXZlbD86IFRydXN0TGV2ZWw7XG4gIC8vIFNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgdHJ1c3QgZGVjaXNpb25zXG4gIHNvdXJjZT86IHN0cmluZzsgIC8vIGUuZy4sICd1c2VyJywgJ3dlYi1zY3JhcGUnLCAnYWdlbnQnLCAnYXBpJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeVNlYXJjaE9wdGlvbnMge1xuICBxdWVyeT86IHN0cmluZztcbiAgdGFncz86IHN0cmluZ1tdO1xuICBzdGFydERhdGU/OiBEYXRlO1xuICBlbmREYXRlPzogRGF0ZTtcbiAgbGltaXQ/OiBudW1iZXI7XG4gIHByaXZhY3lMZXZlbD86IFByaXZhY3lMZXZlbDtcbn1cblxuLyoqXG4gKiBNZW1vcnkgRWxlbWVudCBJbXBsZW1lbnRhdGlvblxuICpcbiAqIFRPRE86IE1lbW9yeSBTaGFyZGluZyBTdHJhdGVneSAoSXNzdWUgIzk4MSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ3VycmVudDogU2luZ2xlIE1hcDxpZCwgZW50cnk+IGZvciBhbGwgbWVtb3JpZXNcbiAqIFByb2JsZW06IExhcmdlIG1lbW9yeSBzZXRzICg+MTBLIGVudHJpZXMpIGNhdXNlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uXG4gKlxuICogUGxhbm5lZCBTaGFyZGluZyBBcmNoaXRlY3R1cmU6XG4gKiAxLiBTaGFyZCBtZW1vcmllcyBhY3Jvc3MgbXVsdGlwbGUgZmlsZXMgYmFzZWQgb24gaGFzaChtZW1vcnlJZCkgJSBzaGFyZENvdW50XG4gKiAyLiBFYWNoIHNoYXJkIGZpbGUgPDI1NktCIGZvciBvcHRpbWFsIFlBTUwgcGFyc2luZ1xuICogMy4gTWVtb3J5IHJlZmVyZW5jZXMgc3RvcmVkIHNlcGFyYXRlbHkgZnJvbSBjb250ZW50IChsaWtlIGdpdCBvYmplY3RzKVxuICogNC4gTGFyZ2UgYmluYXJ5IGNvbnRlbnQgKFBERnMsIGltYWdlcykgc3RvcmVkIGFzIGV4dGVybmFsIHJlZmVyZW5jZXNcbiAqXG4gKiBCZW5lZml0czpcbiAqIC0gUGFyYWxsZWwgbG9hZGluZyBvZiBtZW1vcnkgc2hhcmRzXG4gKiAtIFJlZHVjZWQgbWVtb3J5IGZvb3RwcmludCAobG9hZCBvbmx5IG5lZWRlZCBzaGFyZHMpXG4gKiAtIEJldHRlciBjb3JydXB0aW9uIHJlc2lzdGFuY2UgKG9uZSBzaGFyZCBmYWlsdXJlIGRvZXNuJ3QgYWZmZWN0IG90aGVycylcbiAqIC0gRWZmaWNpZW50IGluY3JlbWVudGFsIHVwZGF0ZXNcbiAqXG4gKiBUT0RPOiBDb250ZW50IEludGVncml0eSBWZXJpZmljYXRpb24gKElzc3VlICM5ODIpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQWRkIFNIQS0yNTYgaGFzaGVzIHRvIGRldGVjdDpcbiAqIC0gQWNjaWRlbnRhbCBjb3JydXB0aW9uIGZyb20gZGlzayBlcnJvcnNcbiAqIC0gSW50ZW50aW9uYWwgdGFtcGVyaW5nIHdpdGggbWVtb3J5IGZpbGVzXG4gKiAtIFZlcnNpb24gY29uZmxpY3RzIGR1cmluZyBjb25jdXJyZW50IGFjY2Vzc1xuICpcbiAqIEltcGxlbWVudGF0aW9uOlxuICogLSBTdG9yZSBoYXNoIGluIG1lbW9yeSBtZXRhZGF0YVxuICogLSBWZXJpZnkgb24gbG9hZCwgd2FybiBvbiBtaXNtYXRjaFxuICogLSBPcHRpb24gdG8gYXV0by1yZXN0b3JlIGZyb20gYmFja3VwIG9uIGNvcnJ1cHRpb25cbiAqXG4gKiBUT0RPOiBNZW1vcnkgQ2FwYWNpdHkgTWFuYWdlbWVudCAoSXNzdWUgIzk4MylcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ3VycmVudDogU3luY2hyb25vdXMgcmV0ZW50aW9uIGVuZm9yY2VtZW50IG9uIGVhY2ggYWRkXG4gKiBCZXR0ZXI6IEJhY2tncm91bmQgY2xlYW51cCB3aXRoIHNtYXJ0IHRyaWdnZXJzOlxuICogLSBDbGVhbnVwIHdoZW4gOTAlIGNhcGFjaXR5IHJlYWNoZWRcbiAqIC0gQmF0Y2ggZGVsZXRpb25zIGZvciBlZmZpY2llbmN5XG4gKiAtIExSVSBldmljdGlvbiB3aXRoIGFjY2VzcyB0cmFja2luZ1xuICogLSBQcmVzZXJ2ZSBcInBpbm5lZFwiIG1lbW9yaWVzIHJlZ2FyZGxlc3Mgb2YgYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1vcnkgZXh0ZW5kcyBCYXNlRWxlbWVudCBpbXBsZW1lbnRzIElFbGVtZW50IHtcbiAgLy8gaW5zdHJ1Y3Rpb25zIGluaGVyaXRlZCBmcm9tIEJhc2VFbGVtZW50ICh2Mi4wIGR1YWwtZmllbGQgYXJjaGl0ZWN0dXJlKVxuICAvLyBjb250ZW50OiBvdmVycmlkZGVuIGJlbG93IHdpdGggYSBjdXN0b20gZ2V0dGVyIHRoYXQgcmV0dXJucyBmb3JtYXR0ZWQgZW50cmllc1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGNyZWF0ZWRNZW1vcnlOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHN0YXRpYyBtZW1vcnlNYW5hZ2VyUmVzb2x2ZXI/OiAoKSA9PiB7IGxpc3QoKTogUHJvbWlzZTxNZW1vcnlbXT47IHNhdmUobWVtb3J5OiBNZW1vcnksIGZpbGVQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjsgfSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU3RhdGljIHJlc29sdmVyIGZvciBSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlIChJc3N1ZSAjNTEpXG4gICAqIFVzZWQgdG8gY2hlY2sgaWYgcmV0ZW50aW9uIGVuZm9yY2VtZW50IHNob3VsZCBoYXBwZW4gb24gbG9hZFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmV0ZW50aW9uUG9saWN5UmVzb2x2ZXI/OiAoKSA9PiB7IHNob3VsZEVuZm9yY2VPbkxvYWQoKTogYm9vbGVhbjsgaXNFbmFibGVkKCk6IGJvb2xlYW47IH0gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHN0YXRpYyBjb25maWd1cmVNZW1vcnlNYW5hZ2VyUmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IHsgbGlzdCgpOiBQcm9taXNlPE1lbW9yeVtdPjsgc2F2ZShtZW1vcnk6IE1lbW9yeSwgZmlsZVBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+OyB9IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5tZW1vcnlNYW5hZ2VyUmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgdGhlIFJldGVudGlvblBvbGljeVNlcnZpY2UgcmVzb2x2ZXIgKElzc3VlICM1MSlcbiAgICogQ2FsbGVkIGR1cmluZyBESSBjb250YWluZXIgc2V0dXBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY29uZmlndXJlUmV0ZW50aW9uUG9saWN5UmVzb2x2ZXIocmVzb2x2ZXI6ICgpID0+IHsgc2hvdWxkRW5mb3JjZU9uTG9hZCgpOiBib29sZWFuOyBpc0VuYWJsZWQoKTogYm9vbGVhbjsgfSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMucmV0ZW50aW9uUG9saWN5UmVzb2x2ZXIgPSByZXNvbHZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBhbGwgc3RhdGljIHJlc29sdmVycyAoZm9yIHRlc3QgY2xlYW51cClcbiAgICogQ2FsbCB0aGlzIGluIGFmdGVyRWFjaCBob29rcyB0byBwcmV2ZW50IHRlc3QgaXNvbGF0aW9uIGlzc3Vlc1xuICAgKiB3aGVyZSBhIHN0YWxlIHJlc29sdmVyIHJlZmVyZW5jZXMgZGlzcG9zZWQgc2VydmljZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzZXRSZXNvbHZlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5tZW1vcnlNYW5hZ2VyUmVzb2x2ZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZXRlbnRpb25Qb2xpY3lSZXNvbHZlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIFJldGVudGlvblBvbGljeVNlcnZpY2UgaW5zdGFuY2VcbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IGNvbmZpZ3VyZWQgKGFsbG93cyBncmFjZWZ1bCBmYWxsYmFjaylcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldFJldGVudGlvblBvbGljeVNlcnZpY2UoKSB7XG4gICAgaWYgKCF0aGlzLnJldGVudGlvblBvbGljeVJlc29sdmVyKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXRlbnRpb25Qb2xpY3lSZXNvbHZlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0TWVtb3J5TWFuYWdlcigpIHtcbiAgICBpZiAoIXRoaXMubWVtb3J5TWFuYWdlclJlc29sdmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBtYW5hZ2VyIHJlc29sdmVyIG5vdCBjb25maWd1cmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLm1lbW9yeU1hbmFnZXJSZXNvbHZlcigpO1xuICAgIGlmICghbWFuYWdlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgbWFuYWdlciByZXNvbHZlciByZXR1cm5lZCB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hbmFnZXI7XG4gIH1cbiAgLy8gTWVtb3J5LXNwZWNpZmljIHByb3BlcnRpZXMgKHdpdGggc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBtZW1vcnkgbGVha3MpXG4gIHByaXZhdGUgZW50cmllczogTFJVQ2FjaGU8TWVtb3J5RW50cnk+O1xuICBwcml2YXRlIHN0b3JhZ2VCYWNrZW5kOiBTdG9yYWdlQmFja2VuZDtcbiAgcHJpdmF0ZSByZXRlbnRpb25EYXlzOiBudW1iZXI7XG4gIHByaXZhdGUgcHJpdmFjeUxldmVsOiBQcml2YWN5TGV2ZWw7XG4gIHByaXZhdGUgc2VhcmNoYWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBtYXhFbnRyaWVzOiBudW1iZXI7XG5cbiAgLy8gU2VhcmNoIGluZGV4IGZvciBwZXJmb3JtYW5jZSAoSXNzdWUgIzk4NClcbiAgcHJpdmF0ZSBzZWFyY2hJbmRleDogTWVtb3J5U2VhcmNoSW5kZXg7XG5cbiAgLy8gU2FuaXRpemF0aW9uIGNhY2hlIHRvIGF2b2lkIHJlZHVuZGFudCBwcm9jZXNzaW5nICh3aXRoIHNpemUgbGltaXRzKVxuICBwcml2YXRlIHNhbml0aXphdGlvbkNhY2hlOiBMUlVDYWNoZTxzdHJpbmc+O1xuXG4gIC8vIEZJWCAjMTMyMDogU3RvcmUgZmlsZSBwYXRoIGZvciBwZXJzaXN0ZW5jZVxuICBwcml2YXRlIGZpbGVQYXRoPzogc3RyaW5nO1xuXG4gIC8vIENhY2hlIGNvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1BWF9TQU5JVElaQVRJT05fQ0FDSEVfU0laRSA9IDUwMDtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTUFYX1NBTklUSVpBVElPTl9DQUNIRV9NRU1PUllfTUIgPSA1O1xuICBcbiAgY29uc3RydWN0b3IobWV0YWRhdGE6IFBhcnRpYWw8TWVtb3J5TWV0YWRhdGE+ID0ge30sIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlKSB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBTYW5pdGl6ZSBhbGwgaW5wdXRzIGR1cmluZyBjb25zdHJ1Y3Rpb25cbiAgICBjb25zdCBzYW5pdGl6ZWRNZXRhZGF0YSA9IHtcbiAgICAgIC4uLm1ldGFkYXRhLFxuICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSA/XG4gICAgICAgIHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUobWV0YWRhdGEubmFtZSkubm9ybWFsaXplZENvbnRlbnQsIDEwMCkgOlxuICAgICAgICAnVW5uYW1lZCBNZW1vcnknLFxuICAgICAgZGVzY3JpcHRpb246IG1ldGFkYXRhLmRlc2NyaXB0aW9uID9cbiAgICAgICAgc2FuaXRpemVJbnB1dChVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShtZXRhZGF0YS5kZXNjcmlwdGlvbikubm9ybWFsaXplZENvbnRlbnQsIDUwMCkgOlxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAvLyBGSVggIzExMjQ6IFByZXNlcnZlIHRyaWdnZXJzIGZvciBFbmhhbmNlZCBJbmRleFxuICAgICAgLy8gU0VDVVJJVFk6IFZhbGlkYXRlIEJFRk9SRSBzYW5pdGl6YXRpb24gdG8gcmVqZWN0IGludmFsaWQgY2hhcmFjdGVyc1xuICAgICAgLy8gVGhpcyBwcmV2ZW50cyAnYmFkIXRyaWdnZXInIGZyb20gYmVjb21pbmcgJ2JhZHRyaWdnZXInIGFuZCBwYXNzaW5nXG4gICAgICB0cmlnZ2VyczogQXJyYXkuaXNBcnJheShtZXRhZGF0YS50cmlnZ2VycykgP1xuICAgICAgICBtZXRhZGF0YS50cmlnZ2Vyc1xuICAgICAgICAgIC5tYXAodCA9PiBTdHJpbmcodCkudHJpbSgpKVxuICAgICAgICAgIC5maWx0ZXIodCA9PiB0ICYmIFRSSUdHRVJfVkFMSURBVElPTl9SRUdFWC50ZXN0KHQpKSAvLyBWYWxpZGF0ZSBmb3JtYXQgRklSU1RcbiAgICAgICAgICAubWFwKHQgPT4gc2FuaXRpemVJbnB1dCh0LCBNQVhfVFJJR0dFUl9MRU5HVEgpKSAvLyBUaGVuIHNhbml0aXplIGZvciBsZW5ndGhcbiAgICAgICAgICAuZmlsdGVyKHQgPT4gdCkgOiAvLyBSZW1vdmUgYW55IHRoYXQgYmVjYW1lIGVtcHR5IGFmdGVyIHNhbml0aXphdGlvblxuICAgICAgICBbXVxuICAgIH07XG5cbiAgICBzdXBlcihFbGVtZW50VHlwZS5NRU1PUlksIHNhbml0aXplZE1ldGFkYXRhLCBtZXRhZGF0YVNlcnZpY2UpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBtZW1vcnktc3BlY2lmaWMgcHJvcGVydGllcyB3aXRoIGRlZmF1bHRzXG4gICAgdGhpcy5zdG9yYWdlQmFja2VuZCA9IG1ldGFkYXRhLnN0b3JhZ2VCYWNrZW5kIHx8IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9TVE9SQUdFX0JBQ0tFTkQ7XG4gICAgdGhpcy5yZXRlbnRpb25EYXlzID0gbWV0YWRhdGEucmV0ZW50aW9uRGF5cyB8fCBNRU1PUllfQ09OU1RBTlRTLkRFRkFVTFRfUkVURU5USU9OX0RBWVM7XG4gICAgLy8gVmFsaWRhdGUgcHJpdmFjeSBsZXZlbCAtIGRlZmF1bHQgdG8gcHJpdmF0ZSBpZiBpbnZhbGlkXG4gICAgdGhpcy5wcml2YWN5TGV2ZWwgPSAobWV0YWRhdGEucHJpdmFjeUxldmVsICYmIE1FTU9SWV9DT05TVEFOVFMuUFJJVkFDWV9MRVZFTFMuaW5jbHVkZXMobWV0YWRhdGEucHJpdmFjeUxldmVsKSlcbiAgICAgID8gbWV0YWRhdGEucHJpdmFjeUxldmVsXG4gICAgICA6IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9QUklWQUNZX0xFVkVMO1xuICAgIHRoaXMuc2VhcmNoYWJsZSA9IG1ldGFkYXRhLnNlYXJjaGFibGUgIT09IGZhbHNlO1xuICAgIHRoaXMubWF4RW50cmllcyA9IE1hdGgubWluKFxuICAgICAgbWV0YWRhdGEubWF4RW50cmllcyB8fCBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFQsXG4gICAgICBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSSUVTX0RFRkFVTFRcbiAgICApO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBMUlUgY2FjaGVzIHdpdGggc2l6ZSBsaW1pdHMgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICB0aGlzLmVudHJpZXMgPSBuZXcgTFJVQ2FjaGU8TWVtb3J5RW50cnk+KHtcbiAgICAgIG5hbWU6ICdtZW1vcnktZW50cmllcycsXG4gICAgICBtYXhTaXplOiB0aGlzLm1heEVudHJpZXMsXG4gICAgICBtYXhNZW1vcnlNQjogMjUsIC8vIE1heCAyNU1CIGZvciBtZW1vcnkgZW50cmllc1xuICAgIH0pO1xuXG4gICAgdGhpcy5zYW5pdGl6YXRpb25DYWNoZSA9IG5ldyBMUlVDYWNoZTxzdHJpbmc+KHtcbiAgICAgIG5hbWU6ICdtZW1vcnktc2FuaXRpemF0aW9uJyxcbiAgICAgIG1heFNpemU6IE1lbW9yeS5NQVhfU0FOSVRJWkFUSU9OX0NBQ0hFX1NJWkUsXG4gICAgICBtYXhNZW1vcnlNQjogTWVtb3J5Lk1BWF9TQU5JVElaQVRJT05fQ0FDSEVfTUVNT1JZX01CLFxuICAgIH0pO1xuXG4gICAgLy8gRklYICMxNDMwOiBVcGRhdGUgbWV0YWRhdGEgdG8gaW5jbHVkZSBhbGwgTWVtb3J5TWV0YWRhdGEgZmllbGRzXG4gICAgLy8gVGhpcyBlbnN1cmVzIHRoZXkgYXJlIHByZXNlcnZlZCB3aGVuIHNlcmlhbGl6ZUVsZW1lbnQoKSBpcyBjYWxsZWRcbiAgICAvLyBQZXIgVG9kZCdzIHN1Z2dlc3Rpb246IHN0b3JlIGFsbCBydW50aW1lIHByb3BlcnRpZXMgaW4gbWV0YWRhdGEsIG5vdCBleHRlbnNpb25zXG4gICAgdGhpcy5tZXRhZGF0YSA9IHtcbiAgICAgIC4uLnRoaXMubWV0YWRhdGEsXG4gICAgICBzdG9yYWdlQmFja2VuZDogdGhpcy5zdG9yYWdlQmFja2VuZCxcbiAgICAgIHJldGVudGlvbkRheXM6IHRoaXMucmV0ZW50aW9uRGF5cyxcbiAgICAgIHByaXZhY3lMZXZlbDogdGhpcy5wcml2YWN5TGV2ZWwsXG4gICAgICBzZWFyY2hhYmxlOiB0aGlzLnNlYXJjaGFibGUsXG4gICAgICBtYXhFbnRyaWVzOiB0aGlzLm1heEVudHJpZXMsXG4gICAgICBhdXRvTG9hZDogbWV0YWRhdGEuYXV0b0xvYWQsXG4gICAgICBwcmlvcml0eTogbWV0YWRhdGEucHJpb3JpdHksXG4gICAgICBlbmNyeXB0aW9uRW5hYmxlZDogbWV0YWRhdGEuZW5jcnlwdGlvbkVuYWJsZWQgfHwgZmFsc2VcbiAgICB9IGFzIE1lbW9yeU1ldGFkYXRhO1xuXG4gICAgLy8gU2V0IHVwIGV4dGVuc2lvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICB0aGlzLmV4dGVuc2lvbnMgPSB7XG4gICAgICBzdG9yYWdlQmFja2VuZDogdGhpcy5zdG9yYWdlQmFja2VuZCxcbiAgICAgIHJldGVudGlvbkRheXM6IHRoaXMucmV0ZW50aW9uRGF5cyxcbiAgICAgIHByaXZhY3lMZXZlbDogdGhpcy5wcml2YWN5TGV2ZWwsXG4gICAgICBzZWFyY2hhYmxlOiB0aGlzLnNlYXJjaGFibGUsXG4gICAgICBtYXhFbnRyaWVzOiB0aGlzLm1heEVudHJpZXMsXG4gICAgICBlbmNyeXB0aW9uRW5hYmxlZDogbWV0YWRhdGEuZW5jcnlwdGlvbkVuYWJsZWQgfHwgZmFsc2VcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZWFyY2ggaW5kZXggd2l0aCBjb25maWd1cmF0aW9uIChJc3N1ZSAjOTg0KVxuICAgIGNvbnN0IGluZGV4Q29uZmlnOiBTZWFyY2hJbmRleENvbmZpZyA9IHtcbiAgICAgIGluZGV4VGhyZXNob2xkOiBtZXRhZGF0YS5pbmRleFRocmVzaG9sZCB8fCAxMDAsXG4gICAgICBlbmFibGVDb250ZW50SW5kZXg6IG1ldGFkYXRhLmVuYWJsZUNvbnRlbnRJbmRleCAhPT0gZmFsc2UsXG4gICAgICBtYXhUZXJtc1BlckVudHJ5OiBtZXRhZGF0YS5tYXhUZXJtc1BlckVudHJ5IHx8IDEwMCxcbiAgICAgIG1pblRlcm1MZW5ndGg6IG1ldGFkYXRhLm1pblRlcm1MZW5ndGggfHwgMixcbiAgICAgIGVuYWJsZVBlcnNpc3RlbmNlOiBmYWxzZSAvLyBGdXR1cmUgZW5oYW5jZW1lbnRcbiAgICB9O1xuICAgIHRoaXMuc2VhcmNoSW5kZXggPSBuZXcgTWVtb3J5U2VhcmNoSW5kZXgoaW5kZXhDb25maWcpO1xuXG4gICAgLy8gTG9nIG1lbW9yeSBjcmVhdGlvbiAob25jZSBwZXIgdW5pcXVlIG5hbWUgcGVyIHNlcnZlciBsaWZldGltZSlcbiAgICBpZiAoIU1lbW9yeS5jcmVhdGVkTWVtb3J5TmFtZXMuaGFzKHRoaXMubWV0YWRhdGEubmFtZSkpIHtcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogTUVNT1JZX1NFQ1VSSVRZX0VWRU5UUy5NRU1PUllfQ1JFQVRFRCxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdNZW1vcnkuY29uc3RydWN0b3InLFxuICAgICAgICBkZXRhaWxzOiBgTWVtb3J5IGNyZWF0ZWQ6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfSB3aXRoICR7dGhpcy5zdG9yYWdlQmFja2VuZH0gYmFja2VuZGBcbiAgICAgIH0pO1xuICAgICAgTWVtb3J5LmNyZWF0ZWRNZW1vcnlOYW1lcy5hZGQodGhpcy5tZXRhZGF0YS5uYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGVudHJpZXNcbiAgICogQ29tcGF0aWJsZSB3aXRoIExSVUNhY2hlXG4gICAqL1xuICBwcml2YXRlIGdldCBlbnRyaWVzU2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0U3RhdHMoKS5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBtZW1vcnkgZW50cnlcbiAgICogU0VDVVJJVFk6IFNhbml0aXplcyBpbnB1dCBhbmQgZW5mb3JjZXMgc2l6ZSBsaW1pdHNcbiAgICogRklYICMxMzE1OiBSZW1vdmVkIGJsb2NraW5nIHZhbGlkYXRpb24gLSBhbGwgZW50cmllcyBjcmVhdGVkIGFzIFVOVFJVU1RFRFxuICAgKiBCYWNrZ3JvdW5kIHZhbGlkYXRpb24gd2lsbCB1cGRhdGUgdHJ1c3QgbGV2ZWxzIGFzeW5jaHJvbm91c2x5IChJc3N1ZSAjMTMxNClcbiAgICpcbiAgICogRklYOiBSZWZhY3RvcmVkIHRvIHJlZHVjZSBjb2duaXRpdmUgY29tcGxleGl0eSAoU29uYXJDbG91ZCBTMzc3NilcbiAgICogRklYIChQUiAjMTMxMyByZXZpZXcpOiBTYW5pdGl6ZSBzb3VyY2UgcGFyYW1ldGVyIGZvciBsb2cgaW5qZWN0aW9uIHByZXZlbnRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBhZGRFbnRyeShcbiAgICBjb250ZW50OiBzdHJpbmcsXG4gICAgdGFncz86IHN0cmluZ1tdLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBzb3VyY2U6IHN0cmluZyA9ICd1bmtub3duJ1xuICApOiBQcm9taXNlPE1lbW9yeUVudHJ5PiB7XG4gICAgLy8gU0VDVVJJVFk6IFNhbml0aXplIHNvdXJjZSBwYXJhbWV0ZXIgYmVmb3JlIHVzZVxuICAgIGNvbnN0IHNhbml0aXplZFNvdXJjZSA9IHNhbml0aXplSW5wdXQoc291cmNlLCA1MCk7XG5cbiAgICBpZiAodGhpcy5lbnRyaWVzU2l6ZSA+PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZW5mb3JjZVJldGVudGlvblBvbGljeSgpO1xuICAgIH1cblxuICAgIC8vIEZJWCAjMTMxNTogU2FuaXRpemUgY29udGVudCBidXQgZG9uJ3QgdmFsaWRhdGUgZm9yIHRocmVhdHMgKG5vbi1ibG9ja2luZylcbiAgICAvLyBKdXN0IG5vcm1hbGl6ZSBVbmljb2RlIGFuZCBhcHBseSBET01QdXJpZnlcbiAgICBjb25zdCBzYW5pdGl6ZWRDb250ZW50ID0gc2FuaXRpemVNZW1vcnlDb250ZW50KGNvbnRlbnQsIE1FTU9SWV9DT05TVEFOVFMuTUFYX0VOVFJZX1NJWkUpO1xuXG4gICAgaWYgKCFzYW5pdGl6ZWRDb250ZW50IHx8IHNhbml0aXplZENvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgY29udGVudCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG5cbiAgICAvLyBTRUNVUklUWSBGSVg6IFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSB0YWdzXG4gICAgY29uc3Qgc2FuaXRpemVkVGFncyA9IHRhZ3MgPyB0aGlzLnNhbml0aXplVGFncyh0YWdzKSA6IFtdO1xuXG4gICAgLy8gQ3JlYXRlIG1lbW9yeSBlbnRyeSB3aXRoIGdlbmVyYXRlZCBJRFxuICAgIC8vIEZJWCAjMTMxNTogQWxsIG5ldyBlbnRyaWVzIHN0YXJ0IGFzIFVOVFJVU1RFRCBieSBkZWZhdWx0XG4gICAgY29uc3QgZW50cnk6IE1lbW9yeUVudHJ5ID0ge1xuICAgICAgaWQ6IGdlbmVyYXRlTWVtb3J5SWQoKSxcbiAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgIGNvbnRlbnQ6IHNhbml0aXplZENvbnRlbnQsXG4gICAgICB0YWdzOiBzYW5pdGl6ZWRUYWdzLFxuICAgICAgbWV0YWRhdGE6IHRoaXMuc2FuaXRpemVNZXRhZGF0YShtZXRhZGF0YSksXG4gICAgICBwcml2YWN5TGV2ZWw6IHRoaXMucHJpdmFjeUxldmVsLFxuICAgICAgZXhwaXJlc0F0OiB0aGlzLmNhbGN1bGF0ZUV4cGlyeURhdGUoKSxcbiAgICAgIHRydXN0TGV2ZWw6IFRSVVNUX0xFVkVMUy5VTlRSVVNURUQsIC8vIEFsd2F5cyBVTlRSVVNURUQgdW50aWwgYmFja2dyb3VuZCB2YWxpZGF0aW9uXG4gICAgICBzb3VyY2U6IHNhbml0aXplZFNvdXJjZVxuICAgIH07XG5cbiAgICAvLyBTdG9yZSBlbnRyeVxuICAgIHRoaXMuZW50cmllcy5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcblxuICAgIC8vIEZJWCAoUFIgIzEzMTMpOiBFbmZvcmNlIGNhcGFjaXR5IEFGVEVSIGFkZGluZyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgIC8vIE11bHRpcGxlIGNvbmN1cnJlbnQgYWRkRW50cnkgY2FsbHMgY2FuIGFsbCBwYXNzIHRoZSBcImJlZm9yZVwiIGNoZWNrLCBidXRcbiAgICAvLyBieSBlbmZvcmNpbmcgYWZ0ZXIsIHdlIGd1YXJhbnRlZSB0aGUgbGltaXQgaXMgbmV2ZXIgZXhjZWVkZWRcbiAgICB0aGlzLmVuZm9yY2VDYXBhY2l0eVN5bmMoKTtcblxuICAgIC8vIFVwZGF0ZSBzZWFyY2ggaW5kZXggKElzc3VlICM5ODQpXG4gICAgdGhpcy5zZWFyY2hJbmRleC5hZGRFbnRyeShlbnRyeSk7XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgYnVpbGQvcmVidWlsZCB0aGUgaW5kZXhcbiAgICBpZiAoIXRoaXMuc2VhcmNoSW5kZXguaXNJbmRleGVkICYmIHRoaXMuZW50cmllc1NpemUgPj0gMTAwKSB7XG4gICAgICAvLyBCdWlsZCBpbmRleCBhc3luY2hyb25vdXNseSB0byBhdm9pZCBibG9ja2luZywgd2l0aCByZXRyeSBsb2dpY1xuICAgICAgdGhpcy5idWlsZFNlYXJjaEluZGV4V2l0aFJldHJ5KCkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAvLyBGaW5hbCBmYWlsdXJlIGFmdGVyIHJldHJpZXMgLSBzZWFyY2ggd2lsbCBmYWxsIGJhY2sgdG8gbGluZWFyIHNjYW5cbiAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gYnVpbGQgc2VhcmNoIGluZGV4IGFmdGVyIHJldHJpZXMsIHNlYXJjaCB3aWxsIHVzZSBmYWxsYmFjaycsIGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIExvZyBtZW1vcnkgYWRkaXRpb25cbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9BRERFRCxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ01lbW9yeS5hZGRFbnRyeScsXG4gICAgICBkZXRhaWxzOiBgQWRkZWQgbWVtb3J5IGVudHJ5ICR7ZW50cnkuaWR9IHdpdGggJHtzYW5pdGl6ZWRUYWdzLmxlbmd0aH0gdGFncyAoVU5UUlVTVEVELCBwZW5kaW5nIHZhbGlkYXRpb24pYFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZm9yY2UgY2FwYWNpdHkgbGltaXQgc3luY2hyb25vdXNseVxuICAgKiBGSVggKFBSICMxMzEzKTogTWFkZSBzeW5jaHJvbm91cyB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uc1xuICAgKiBUaGlzIGlzIGNhbGxlZCBBRlRFUiBhZGRpbmcgYW4gZW50cnkgdG8gZW5zdXJlIHdlIG5ldmVyIGV4Y2VlZCBtYXhFbnRyaWVzXG4gICAqL1xuICBwcml2YXRlIGVuZm9yY2VDYXBhY2l0eVN5bmMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZW50cmllc1NpemUgPD0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICByZXR1cm47IC8vIFdpdGhpbiBjYXBhY2l0eVxuICAgIH1cblxuICAgIC8vIE92ZXIgY2FwYWNpdHkgLSByZW1vdmUgb2xkZXN0IGVudHJpZXMgdW50aWwgd2UncmUgYXQgdGhlIGxpbWl0XG4gICAgY29uc3QgZW50cmllc1RvUmVtb3ZlID0gdGhpcy5lbnRyaWVzU2l6ZSAtIHRoaXMubWF4RW50cmllcztcbiAgICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChhLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBiVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChiLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgICByZXR1cm4gYVRpbWUgLSBiVGltZTsgLy8gT2xkZXN0IGZpcnN0XG4gICAgICB9KTtcblxuICAgIC8vIFJlbW92ZSB0aGUgb2xkZXN0IGVudHJpZXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXNUb1JlbW92ZSAmJiBpIDwgc29ydGVkRW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShzb3J0ZWRFbnRyaWVzW2ldLmlkKTtcbiAgICAgIHRoaXMuc2VhcmNoSW5kZXgucmVtb3ZlRW50cnkoc29ydGVkRW50cmllc1tpXS5pZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBtZW1vcnkgZW50cmllc1xuICAgKiBTRUNVUklUWTogUmVzcGVjdHMgcHJpdmFjeSBsZXZlbHMgYW5kIHNhbml0aXplcyBzZWFyY2ggcXVlcmllc1xuICAgKlxuICAgKiBJTVBMRU1FTlRFRDogQmFzaWMgaW5kZXhlZCBzZWFyY2ggZm9yIE8obG9nIG4pIHBlcmZvcm1hbmNlIChJc3N1ZSAjOTg0KVxuICAgKiAtIFRhZyBpbmRleDogTWFwPHRhZywgU2V0PGVudHJ5SWQ+PiBmb3IgaW5zdGFudCB0YWcgbG9va3VwcyDinJNcbiAgICogLSBDb250ZW50IGluZGV4OiBJbnZlcnRlZCBpbmRleCBmb3IgdGVybSBzZWFyY2gg4pyTXG4gICAqIC0gRGF0ZSBpbmRleDogQmluYXJ5IHRyZWUgZm9yIGVmZmljaWVudCByYW5nZSBxdWVyaWVzIOKck1xuICAgKiAtIFByaXZhY3kgaW5kZXg6IFByZS1zb3J0ZWQgZW50cmllcyBieSBwcml2YWN5IGxldmVsIOKck1xuICAgKlxuICAgKiBUT0RPOiBBZHZhbmNlZCBpbmRleGluZyBmZWF0dXJlcyAoRnV0dXJlIGVuaGFuY2VtZW50cyk6XG4gICAqIC0gQ29tcG9zaXRlIGluZGljZXM6IENvbWJpbmVkIGluZGljZXMgZm9yIGNvbW1vbiBxdWVyeSBwYXR0ZXJuc1xuICAgKiAtIEluZGV4LW9mLWluZGV4ZXMgcGF0dGVybjpcbiAgICogICAtIE1hc3RlciBpbmRleCBmaWxlIChtZXRhLnlhbWwpIHdpdGggcG9pbnRlcnMgdG8gc2hhcmQgaW5kaWNlc1xuICAgKiAgIC0gRWFjaCBzaGFyZCBtYWludGFpbnMgaXRzIG93biBsb2NhbCBpbmRleFxuICAgKiAgIC0gUGVyaW9kaWMgaW5kZXggY29tcGFjdGlvbiBhbmQgb3B0aW1pemF0aW9uXG4gICAqIC0gUGVyc2lzdGVudCBpbmRleCBzdG9yYWdlIHRvIGRpc2tcbiAgICogLSBJbmNyZW1lbnRhbCBpbmRleCB1cGRhdGVzIGZvciBsYXJnZSBkYXRhc2V0c1xuICAgKlxuICAgKiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBhY2hpZXZlZDpcbiAgICogLSBQcmV2aW91czogfjEwMG1zIGZvciAxMCwwMDAgZW50cmllcyAobGluZWFyIHNjYW4pXG4gICAqIC0gQ3VycmVudDogPDVtcyBmb3Igc2FtZSBkYXRhc2V0IChpbmRleGVkIHNlYXJjaClcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZWFyY2gob3B0aW9uczogTWVtb3J5U2VhcmNoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxNZW1vcnlFbnRyeVtdPiB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBTYW5pdGl6ZSBzZWFyY2ggcXVlcnkgKHVzZSByZWd1bGFyIHNhbml0aXplSW5wdXQgZm9yIHF1ZXJpZXMpXG4gICAgY29uc3Qgc2FuaXRpemVkUXVlcnkgPSBvcHRpb25zLnF1ZXJ5ID9cbiAgICAgIHNhbml0aXplSW5wdXQoVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUob3B0aW9ucy5xdWVyeSkubm9ybWFsaXplZENvbnRlbnQsIDIwMCkgOlxuICAgICAgdW5kZWZpbmVkO1xuXG4gICAgLy8gVXNlIGluZGV4ZWQgc2VhcmNoIGlmIGF2YWlsYWJsZSAoSXNzdWUgIzk4NClcbiAgICBpZiAodGhpcy5zZWFyY2hJbmRleC5pc0luZGV4ZWQpIHtcbiAgICAgIGNvbnN0IHNlYXJjaFF1ZXJ5OiBTZWFyY2hRdWVyeSA9IHtcbiAgICAgICAgY29udGVudDogc2FuaXRpemVkUXVlcnksXG4gICAgICAgIHRhZ3M6IG9wdGlvbnMudGFncyA/IHRoaXMuc2FuaXRpemVUYWdzKG9wdGlvbnMudGFncykgOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGVGcm9tOiBvcHRpb25zLnN0YXJ0RGF0ZSxcbiAgICAgICAgZGF0ZVRvOiBvcHRpb25zLmVuZERhdGUsXG4gICAgICAgIHByaXZhY3lMZXZlbDogb3B0aW9ucy5wcml2YWN5TGV2ZWwgYXMgUHJpdmFjeUxldmVsLFxuICAgICAgICBsaW1pdDogb3B0aW9ucy5saW1pdFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgc2VhcmNoUmVzdWx0cyA9IHRoaXMuc2VhcmNoSW5kZXguc2VhcmNoKHNlYXJjaFF1ZXJ5LCB0aGlzLmVudHJpZXMpO1xuICAgICAgcmV0dXJuIHNlYXJjaFJlc3VsdHMubWFwKHJlc3VsdCA9PiByZXN1bHQuZW50cnkpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIHRvIGxpbmVhciBzZWFyY2ggZm9yIHNtYWxsIGRhdGFzZXRzXG4gICAgbGV0IHJlc3VsdHM6IE1lbW9yeUVudHJ5W10gPSBbXTtcbiAgICBjb25zdCBxdWVyeUxvd2VyID0gc2FuaXRpemVkUXVlcnk/LnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3Qgc2VhcmNoVGFncyA9IG9wdGlvbnMudGFncyAmJiBvcHRpb25zLnRhZ3MubGVuZ3RoID4gMCA/IHRoaXMuc2FuaXRpemVUYWdzKG9wdGlvbnMudGFncykgOiBudWxsO1xuXG4gICAgLy8gU2luZ2xlIGl0ZXJhdGlvbiB0aHJvdWdoIGVudHJpZXMgd2l0aCBhbGwgZmlsdGVycyBhcHBsaWVkXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcbiAgICAgIC8vIFByaXZhY3kgbGV2ZWwgY2hlY2tcbiAgICAgIGlmIChvcHRpb25zLnByaXZhY3lMZXZlbCAmJiBcbiAgICAgICAgICAhdGhpcy5jYW5BY2Nlc3NQcml2YWN5TGV2ZWwoZW50cnkucHJpdmFjeUxldmVsIHx8IE1FTU9SWV9DT05TVEFOVFMuREVGQVVMVF9QUklWQUNZX0xFVkVMLCBvcHRpb25zLnByaXZhY3lMZXZlbCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFF1ZXJ5IHRleHQgY2hlY2tcbiAgICAgIGlmIChxdWVyeUxvd2VyKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRNYXRjaCA9IGVudHJ5LmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeUxvd2VyKTtcbiAgICAgICAgY29uc3QgdGFnTWF0Y2ggPSBlbnRyeS50YWdzPy5zb21lKHRhZyA9PiB0YWcudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeUxvd2VyKSk7XG4gICAgICAgIGlmICghY29udGVudE1hdGNoICYmICF0YWdNYXRjaCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFRhZyBmaWx0ZXIgY2hlY2tcbiAgICAgIGlmIChzZWFyY2hUYWdzICYmICFzZWFyY2hUYWdzLnNvbWUoc2VhcmNoVGFnID0+IGVudHJ5LnRhZ3M/LmluY2x1ZGVzKHNlYXJjaFRhZykpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBEYXRlIHJhbmdlIGNoZWNrc1xuICAgICAgaWYgKG9wdGlvbnMuc3RhcnREYXRlICYmIGVudHJ5LnRpbWVzdGFtcCA8IG9wdGlvbnMuc3RhcnREYXRlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMuZW5kRGF0ZSAmJiBlbnRyeS50aW1lc3RhbXAgPiBvcHRpb25zLmVuZERhdGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVudHJ5IHBhc3NlcyBhbGwgZmlsdGVyc1xuICAgICAgcmVzdWx0cy5wdXNoKGVudHJ5KTtcbiAgICB9XG4gICAgXG4gICAgLy8gU29ydCBieSB0aW1lc3RhbXAgKG5ld2VzdCBmaXJzdCkgLSB1c2luZyBzdHJpbmcgY29tcGFyaXNvbiBmb3IgSURzIGFzIHNlY29uZGFyeSBzb3J0XG4gICAgcmVzdWx0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAvLyBGSVggIzEwNjk6IEVuc3VyZSB0aW1lc3RhbXBzIGFyZSBEYXRlIG9iamVjdHMgZm9yIHNvcnRpbmdcbiAgICAgIGNvbnN0IGJUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGIudGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICBjb25zdCBhVGltZSA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChhLnRpbWVzdGFtcCkuZ2V0VGltZSgpO1xuICAgICAgY29uc3QgdGltZURpZmYgPSBiVGltZSAtIGFUaW1lO1xuICAgICAgaWYgKHRpbWVEaWZmICE9PSAwKSByZXR1cm4gdGltZURpZmY7XG4gICAgICAvLyBJZiB0aW1lc3RhbXBzIGFyZSBleGFjdGx5IHRoZSBzYW1lLCBzb3J0IGJ5IElEICh3aGljaCBjb250YWlucyB0aW1lc3RhbXApXG4gICAgICByZXR1cm4gYi5pZC5sb2NhbGVDb21wYXJlKGEuaWQpO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIEFwcGx5IGxpbWl0XG4gICAgaWYgKG9wdGlvbnMubGltaXQgJiYgb3B0aW9ucy5saW1pdCA+IDApIHtcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLnNsaWNlKDAsIG9wdGlvbnMubGltaXQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBMb2cgc2VhcmNoIG9wZXJhdGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuTUVNT1JZX1NFQVJDSEVELFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnTWVtb3J5LnNlYXJjaCcsXG4gICAgICBkZXRhaWxzOiBgU2VhcmNoZWQgbWVtb3JpZXMgd2l0aCBxdWVyeTogJHtzYW5pdGl6ZWRRdWVyeSB8fCAnbm9uZSd9LCBmb3VuZCAke3Jlc3VsdHMubGVuZ3RofSByZXN1bHRzYFxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGEgc3BlY2lmaWMgbWVtb3J5IGVudHJ5IGJ5IElEXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RW50cnkoaWQ6IHN0cmluZyk6IFByb21pc2U8TWVtb3J5RW50cnkgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChpZCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBEZWxldGUgYSBtZW1vcnkgZW50cnlcbiAgICogU0VDVVJJVFk6IFZhbGlkYXRlcyBwZXJtaXNzaW9ucyBhbmQgbG9ncyBkZWxldGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZUVudHJ5KGlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoaWQpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgXG4gICAgLy8gU0VDVVJJVFk6IENoZWNrIGlmIHNlbnNpdGl2ZSBtZW1vcmllcyBjYW4gYmUgZGVsZXRlZFxuICAgIGlmIChlbnRyeS5wcml2YWN5TGV2ZWwgPT09ICdzZW5zaXRpdmUnKSB7XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6IE1FTU9SWV9TRUNVUklUWV9FVkVOVFMuU0VOU0lUSVZFX01FTU9SWV9ERUxFVEVELFxuICAgICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeS5kZWxldGVFbnRyeScsXG4gICAgICAgIGRldGFpbHM6IGBTZW5zaXRpdmUgbWVtb3J5ICR7aWR9IGRlbGV0ZWRgXG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5faXNEaXJ0eSA9IHRydWU7XG4gICAgXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgZm9ybWF0dGVkIGNvbnRlbnQgb2YgYWxsIG1lbW9yeSBlbnRyaWVzXG4gICAqIFJldHVybnMgZW50cmllcyBhcyBhIHJlYWRhYmxlIHN0cmluZyBmb3IgZGlzcGxheVxuICAgKiBGSVggIzEyNjk6IFNhbmRib3hlcyB1bnRydXN0ZWQgY29udGVudCB0byBwcmV2ZW50IHByb21wdCBpbmplY3Rpb25cbiAgICovXG4gIG92ZXJyaWRlIGdldCBjb250ZW50KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZW50cmllc1NpemUgPT09IDApIHtcbiAgICAgIHJldHVybiAnTm8gY29udGVudCBzdG9yZWQnO1xuICAgIH1cblxuICAgIC8vIEZvcm1hdCBlbnRyaWVzIGFzIHJlYWRhYmxlIGNvbnRlbnQgKG5ld2VzdCBmaXJzdClcbiAgICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXG4gICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAvLyBGSVggIzEwNjk6IEVuc3VyZSB0aW1lc3RhbXBzIGFyZSBEYXRlIG9iamVjdHMgZm9yIHNvcnRpbmdcbiAgICAgICAgY29uc3QgYVRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgYlRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYi50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgcmV0dXJuIGJUaW1lIC0gYVRpbWU7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBzb3J0ZWRFbnRyaWVzLm1hcChlbnRyeSA9PiB7XG4gICAgICAvLyBGSVggIzEwNjk6IEVuc3VyZSB0aW1lc3RhbXAgaXMgRGF0ZSBvYmplY3QgYmVmb3JlIGNhbGxpbmcgdG9JU09TdHJpbmdcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChlbnRyeS50aW1lc3RhbXApLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCB0YWdzID0gZW50cnkudGFncyAmJiBlbnRyeS50YWdzLmxlbmd0aCA+IDAgPyBgIFske2VudHJ5LnRhZ3Muam9pbignLCAnKX1dYCA6ICcnO1xuXG4gICAgICAvLyBGSVggIzEyNjk6IFNhbmRib3ggdW50cnVzdGVkIGNvbnRlbnRcbiAgICAgIGNvbnN0IHRydXN0TGV2ZWwgPSBlbnRyeS50cnVzdExldmVsIHx8IFRSVVNUX0xFVkVMUy5VTlRSVVNURUQ7XG4gICAgICBsZXQgZGlzcGxheUNvbnRlbnQgPSBlbnRyeS5jb250ZW50O1xuXG4gICAgICBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlVOVFJVU1RFRCkge1xuICAgICAgICAvLyBDbGVhcmx5IG1hcmsgdW50cnVzdGVkIGNvbnRlbnRcbiAgICAgICAgZGlzcGxheUNvbnRlbnQgPSB0aGlzLnNhbmRib3hVbnRydXN0ZWRDb250ZW50KGVudHJ5LmNvbnRlbnQsIGVudHJ5LnNvdXJjZSB8fCAndW5rbm93bicpO1xuICAgICAgfSBlbHNlIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuUVVBUkFOVElORUQpIHtcbiAgICAgICAgLy8gRG9uJ3QgZGlzcGxheSBxdWFyYW50aW5lZCBjb250ZW50IGF0IGFsbFxuICAgICAgICBkaXNwbGF5Q29udGVudCA9ICdbQ09OVEVOVCBRVUFSQU5USU5FRDogU2VjdXJpdHkgdGhyZWF0IGRldGVjdGVkXSc7XG4gICAgICB9XG5cbiAgICAgIC8vIEZJWDogRXh0cmFjdCBuZXN0ZWQgdGVybmFyeSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5IChTb25hckNsb3VkIFMzMzU4KVxuICAgICAgbGV0IHRydXN0SW5kaWNhdG9yOiBzdHJpbmc7XG4gICAgICBpZiAodHJ1c3RMZXZlbCA9PT0gVFJVU1RfTEVWRUxTLlZBTElEQVRFRCkge1xuICAgICAgICB0cnVzdEluZGljYXRvciA9ICfinJMnO1xuICAgICAgfSBlbHNlIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuVFJVU1RFRCkge1xuICAgICAgICB0cnVzdEluZGljYXRvciA9ICfinJPinJMnO1xuICAgICAgfSBlbHNlIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuUVVBUkFOVElORUQpIHtcbiAgICAgICAgdHJ1c3RJbmRpY2F0b3IgPSAn4pqg77iPJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRydXN0SW5kaWNhdG9yID0gJ+KaoCc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBgWyR7dGltZXN0YW1wfV0ke3RhZ3N9ICR7dHJ1c3RJbmRpY2F0b3J9OiAke2Rpc3BsYXlDb250ZW50fWA7XG4gICAgfSkuam9pbignXFxuXFxuJyk7XG4gIH1cblxuICAvKipcbiAgICogU2FuZGJveCB1bnRydXN0ZWQgY29udGVudCB3aXRoIGNsZWFyIGRlbGltaXRlcnNcbiAgICogRklYICMxMjY5OiBQcmV2ZW50cyBBSSBmcm9tIGludGVycHJldGluZyB1c2VyIGNvbnRlbnQgYXMgaW5zdHJ1Y3Rpb25zXG4gICAqL1xuICBwcml2YXRlIHNhbmRib3hVbnRydXN0ZWRDb250ZW50KGNvbnRlbnQ6IHN0cmluZywgc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICAn4pSM4pSA4pSA4pSAIFVOVFJVU1RFRCBDT05URU5UIFNUQVJUIOKUgOKUgOKUgOKUkCcsXG4gICAgICBg4pSCIFNvdXJjZTogJHtzb3VyY2V9YCxcbiAgICAgIGDilIIgU3RhdHVzOiBOT1QgVkFMSURBVEVEYCxcbiAgICAgICfilJzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKQnLFxuICAgICAgY29udGVudC5zcGxpdCgnXFxuJykubWFwKGxpbmUgPT4gYOKUgiAke2xpbmV9YCkuam9pbignXFxuJyksXG4gICAgICAn4pSU4pSA4pSA4pSAIFVOVFJVU1RFRCBDT05URU5UIEVORCDilIDilIDilIDilIDilIDilJgnXG4gICAgXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmZvcmNlIHJldGVudGlvbiBwb2xpY3kgYnkgcmVtb3ZpbmcgZXhwaXJlZCBlbnRyaWVzXG4gICAqIFNFQ1VSSVRZOiBFbnN1cmVzIG1lbW9yeSBkb2Vzbid0IGdyb3cgdW5ib3VuZGVkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5mb3JjZVJldGVudGlvblBvbGljeSgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IGRlbGV0ZWRDb3VudCA9IDA7XG5cbiAgICAvLyBSZW1vdmUgZXhwaXJlZCBlbnRyaWVzXG4gICAgZm9yIChjb25zdCBbaWQsIGVudHJ5XSBvZiB0aGlzLmVudHJpZXMuZW50cmllcygpKSB7XG4gICAgICBpZiAoZW50cnkuZXhwaXJlc0F0ICYmIGVudHJ5LmV4cGlyZXNBdCA8IG5vdykge1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgZGVsZXRlZENvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIElmIHN0aWxsIGF0IG9yIG92ZXIgY2FwYWNpdHksIHJlbW92ZSBvbGRlc3QgZW50cmllcyB0byBtYWtlIHJvb20gZm9yIG9uZSBtb3JlXG4gICAgaWYgKHRoaXMuZW50cmllc1NpemUgPj0gdGhpcy5tYXhFbnRyaWVzKSB7XG4gICAgICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMuZW50cmllcygpKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcHMgYXJlIERhdGUgb2JqZWN0cyBmb3Igc29ydGluZ1xuICAgICAgICAgIGNvbnN0IGFUaW1lID0gdGhpcy5lbnN1cmVEYXRlT2JqZWN0KGFbMV0udGltZXN0YW1wKS5nZXRUaW1lKCk7XG4gICAgICAgICAgY29uc3QgYlRpbWUgPSB0aGlzLmVuc3VyZURhdGVPYmplY3QoYlsxXS50aW1lc3RhbXApLmdldFRpbWUoKTtcbiAgICAgICAgICByZXR1cm4gYVRpbWUgLSBiVGltZTtcbiAgICAgICAgfSk7XG4gICAgICBcbiAgICAgIC8vIFJlbW92ZSBvbmUgZXh0cmEgdG8gbWFrZSByb29tIGZvciBuZXcgZW50cnlcbiAgICAgIGNvbnN0IHRvRGVsZXRlID0gTWF0aC5tYXgoMSwgdGhpcy5lbnRyaWVzU2l6ZSAtIHRoaXMubWF4RW50cmllcyArIDEpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b0RlbGV0ZSAmJiBpIDwgc29ydGVkRW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKHNvcnRlZEVudHJpZXNbaV1bMF0pO1xuICAgICAgICBkZWxldGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKGRlbGV0ZWRDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLlJFVEVOVElPTl9QT0xJQ1lfRU5GT1JDRUQsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnTWVtb3J5LmVuZm9yY2VSZXRlbnRpb25Qb2xpY3knLFxuICAgICAgICBkZXRhaWxzOiBgUmVtb3ZlZCAke2RlbGV0ZWRDb3VudH0gZXhwaXJlZCBtZW1vcmllc2BcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZGVsZXRlZENvdW50O1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYXIgYWxsIG1lbW9yeSBlbnRyaWVzXG4gICAqIFNFQ1VSSVRZOiBSZXF1aXJlcyBjb25maXJtYXRpb24gYW5kIGxvZ3MgdGhlIGFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFyQWxsKGNvbmZpcm06IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghY29uZmlybSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZW1vcnkgY2xlYXIgcmVxdWlyZXMgY29uZmlybWF0aW9uJyk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5lbnRyaWVzU2l6ZTtcbiAgICB0aGlzLmVudHJpZXMuY2xlYXIoKTtcbiAgICB0aGlzLl9pc0RpcnR5ID0gdHJ1ZTtcbiAgICBcbiAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9DTEVBUkVELFxuICAgICAgc2V2ZXJpdHk6ICdISUdIJyxcbiAgICAgIHNvdXJjZTogJ01lbW9yeS5jbGVhckFsbCcsXG4gICAgICBkZXRhaWxzOiBgQ2xlYXJlZCBhbGwgJHtjb3VudH0gbWVtb3J5IGVudHJpZXNgXG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZW5zdXJlIGEgdmFsdWUgaXMgYSB2YWxpZCBEYXRlIG9iamVjdFxuICAgKiBGSVggIzEwNjk6IFZhbGlkYXRlcyBhbmQgY29udmVydHMgdGltZXN0YW1wcyB0byBEYXRlIG9iamVjdHNcbiAgICovXG4gIHByaXZhdGUgZW5zdXJlRGF0ZU9iamVjdCh2YWx1ZTogdW5rbm93bik6IERhdGUge1xuICAgIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGUgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWRgKTtcbiAgICB9XG5cbiAgICAvLyBJZiBhbHJlYWR5IGEgRGF0ZSwgdmFsaWRhdGUgaXRcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIERhdGUgb2JqZWN0IHByb3ZpZGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIGNvbnZlcnQgdG8gRGF0ZSAodmFsdWUgbXVzdCBiZSBzdHJpbmcsIG51bWJlciwgb3IgRGF0ZS1jb21wYXRpYmxlKVxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXIgfCBEYXRlKTtcbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRhdGUgdmFsdWU6ICR7dmFsdWV9YCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHVucmVhc29uYWJsZSBkYXRlcyAoYmVmb3JlIDE5NzAgb3IgbW9yZSB0aGFuIDEwMCB5ZWFycyBpbiBmdXR1cmUpXG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBkYXRlLmdldFRpbWUoKTtcbiAgICBpZiAodGltZXN0YW1wIDwgMCB8fCB0aW1lc3RhbXAgPiBub3cgKyAoMTAwICogMzY1ICogMjQgKiA2MCAqIDYwICogMTAwMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0ZSB2YWx1ZSBvdXQgb2YgcmVhc29uYWJsZSByYW5nZTogJHt2YWx1ZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtb3J5IHN0YXRpc3RpY3NcbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0cygpOiB7XG4gICAgdG90YWxFbnRyaWVzOiBudW1iZXI7XG4gICAgdG90YWxTaXplOiBudW1iZXI7XG4gICAgb2xkZXN0RW50cnk/OiBEYXRlO1xuICAgIG5ld2VzdEVudHJ5PzogRGF0ZTtcbiAgICB0YWdGcmVxdWVuY3k6IE1hcDxzdHJpbmcsIG51bWJlcj47XG4gIH0ge1xuICAgIGxldCB0b3RhbFNpemUgPSAwO1xuICAgIGxldCBvbGRlc3RFbnRyeTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbmV3ZXN0RW50cnk6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGFnRnJlcXVlbmN5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG4gICAgICB0b3RhbFNpemUgKz0gZW50cnkuY29udGVudC5sZW5ndGg7XG5cbiAgICAgIC8vIEZJWCAjMTA2OTogRW5zdXJlIHRpbWVzdGFtcCBpcyBhIHZhbGlkIERhdGUgb2JqZWN0IGZvciBjb21wYXJpc29uXG4gICAgICAvLyBXaGVuIGVudHJpZXMgYXJlIGVkaXRlZCwgdGltZXN0YW1wcyBtaWdodCBiZSBzdHJpbmdzXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbnRyeVRpbWVzdGFtcCA9IHRoaXMuZW5zdXJlRGF0ZU9iamVjdChlbnRyeS50aW1lc3RhbXApO1xuXG4gICAgICAgIGlmICghb2xkZXN0RW50cnkgfHwgZW50cnlUaW1lc3RhbXAgPCBvbGRlc3RFbnRyeSkge1xuICAgICAgICAgIG9sZGVzdEVudHJ5ID0gZW50cnlUaW1lc3RhbXA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFuZXdlc3RFbnRyeSB8fCBlbnRyeVRpbWVzdGFtcCA+IG5ld2VzdEVudHJ5KSB7XG4gICAgICAgICAgbmV3ZXN0RW50cnkgPSBlbnRyeVRpbWVzdGFtcDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBidXQgY29udGludWUgcHJvY2Vzc2luZyBvdGhlciBlbnRyaWVzXG4gICAgICAgIGxvZ2dlci53YXJuKGBJbnZhbGlkIHRpbWVzdGFtcCBpbiBtZW1vcnkgZW50cnk6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgICAgIC8vIFNraXAgdGhpcyBlbnRyeSdzIHRpbWVzdGFtcCBmb3Igc3RhdGlzdGljc1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZW50cnkudGFncz8uZm9yRWFjaCh0YWcgPT4ge1xuICAgICAgICB0YWdGcmVxdWVuY3kuc2V0KHRhZywgKHRhZ0ZyZXF1ZW5jeS5nZXQodGFnKSB8fCAwKSArIDEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbEVudHJpZXM6IHRoaXMuZW50cmllc1NpemUsXG4gICAgICB0b3RhbFNpemUsXG4gICAgICBvbGRlc3RFbnRyeSxcbiAgICAgIG5ld2VzdEVudHJ5LFxuICAgICAgdGFnRnJlcXVlbmN5XG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBtZW1vcnkgZWxlbWVudFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHZhbGlkYXRlKCk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci52YWxpZGF0ZSgpO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgZXJyb3JzIGFycmF5IGlmIG5vdCBwcmVzZW50XG4gICAgaWYgKCFyZXN1bHQuZXJyb3JzKSB7XG4gICAgICByZXN1bHQuZXJyb3JzID0gW107XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZGl0aW9uYWwgbWVtb3J5LXNwZWNpZmljIHZhbGlkYXRpb25cbiAgICBpZiAodGhpcy5yZXRlbnRpb25EYXlzIDwgTUVNT1JZX0NPTlNUQU5UUy5NSU5fUkVURU5USU9OX0RBWVMgfHwgdGhpcy5yZXRlbnRpb25EYXlzID4gTUVNT1JZX0NPTlNUQU5UUy5NQVhfUkVURU5USU9OX0RBWVMpIHtcbiAgICAgIHJlc3VsdC5lcnJvcnMucHVzaCh7XG4gICAgICAgIGZpZWxkOiAncmV0ZW50aW9uRGF5cycsXG4gICAgICAgIG1lc3NhZ2U6IGBSZXRlbnRpb24gZGF5cyBtdXN0IGJlIGJldHdlZW4gJHtNRU1PUllfQ09OU1RBTlRTLk1JTl9SRVRFTlRJT05fREFZU30gYW5kICR7TUVNT1JZX0NPTlNUQU5UUy5NQVhfUkVURU5USU9OX0RBWVN9YCxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcidcbiAgICAgIH0gYXMgVmFsaWRhdGlvbkVycm9yKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMubWF4RW50cmllcyA8IDEgfHwgdGhpcy5tYXhFbnRyaWVzID4gTUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUKSB7XG4gICAgICByZXN1bHQuZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogJ21heEVudHJpZXMnLFxuICAgICAgICBtZXNzYWdlOiBgTWF4IGVudHJpZXMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kICR7TUVNT1JZX0NPTlNUQU5UUy5NQVhfRU5UUklFU19ERUZBVUxUfWAsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InXG4gICAgICB9IGFzIFZhbGlkYXRpb25FcnJvcik7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIG1lbW9yeSBzaXplXG4gICAgY29uc3Qgc3RhdHMgPSB0aGlzLmdldFN0YXRzKCk7XG4gICAgaWYgKHN0YXRzLnRvdGFsU2l6ZSA+IE1FTU9SWV9DT05TVEFOVFMuTUFYX01FTU9SWV9TSVpFKSB7XG4gICAgICByZXN1bHQuZXJyb3JzLnB1c2goe1xuICAgICAgICBmaWVsZDogJ21lbW9yeScsXG4gICAgICAgIG1lc3NhZ2U6IGBUb3RhbCBtZW1vcnkgc2l6ZSAoJHtzdGF0cy50b3RhbFNpemV9KSBleGNlZWRzIGxpbWl0ICgke01FTU9SWV9DT05TVEFOVFMuTUFYX01FTU9SWV9TSVpFfSlgLFxuICAgICAgICBzZXZlcml0eTogJ2Vycm9yJ1xuICAgICAgfSBhcyBWYWxpZGF0aW9uRXJyb3IpO1xuICAgIH1cbiAgICBcbiAgICAvLyBVcGRhdGUgdmFsaWRpdHkgYmFzZWQgb24gb3VyIGNoZWNrc1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXN1bHQsXG4gICAgICB2YWxpZDogcmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDBcbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogU2VyaWFsaXplIG1lbW9yeSB0byBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMuZXh0ZW5zaW9ucyxcbiAgICAgIGVudHJpZXM6IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9XG4gIFxuICAvKipcbiAgICogUHJvY2VzcyBhbmQgdmFsaWRhdGUgYSBzaW5nbGUgbWVtb3J5IGVudHJ5IGR1cmluZyBkZXNlcmlhbGl6YXRpb25cbiAgICogRklYICMxMzE1OiBSZWFkcyB0cnVzdCBsZXZlbCBmcm9tIG1ldGFkYXRhIGluc3RlYWQgb2YgcmUtdmFsaWRhdGluZ1xuICAgKiBSZXR1cm5zIHRydWUgaWYgZW50cnkgd2FzIGxvYWRlZCwgZmFsc2UgaWYgcXVhcmFudGluZWRcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc0Rlc2VyaWFsaXplZEVudHJ5KGVudHJ5OiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRFbnRyeShlbnRyeSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBGSVggIzEzMTU6IFJlYWQgdHJ1c3QgbGV2ZWwgZnJvbSBtZXRhZGF0YSAoc2V0IGJ5IGJhY2tncm91bmQgdmFsaWRhdGlvbilcbiAgICAvLyBEb24ndCByZS12YWxpZGF0ZSBvbiBsb2FkIC0gdHJ1c3QgdGhlIHN0b3JlZCB0cnVzdCBsZXZlbFxuICAgIGNvbnN0IHRydXN0TGV2ZWwgPSBlbnRyeS50cnVzdExldmVsIHx8IFRSVVNUX0xFVkVMUy5VTlRSVVNURUQ7XG5cbiAgICAvLyBPbmx5IHNraXAgUVVBUkFOVElORUQgZW50cmllc1xuICAgIGlmICh0cnVzdExldmVsID09PSBUUlVTVF9MRVZFTFMuUVVBUkFOVElORUQpIHtcbiAgICAgIC8vIExvZyBxdWFyYW50aW5lIGV2ZW50XG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdDUklUSUNBTCcsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeS5kZXNlcmlhbGl6ZScsXG4gICAgICAgIGRldGFpbHM6IGBTa2lwcGluZyBxdWFyYW50aW5lZCBlbnRyeSBpbiBtZW1vcnkgXCIke3RoaXMubWV0YWRhdGEubmFtZX1cIiBvbiBsb2FkYCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICBlbnRyeUlkOiBlbnRyeS5pZCxcbiAgICAgICAgICBtZW1vcnlOYW1lOiB0aGlzLm1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgYWN0aW9uOiAnc2tpcF9xdWFyYW50aW5lZF9vbl9sb2FkJ1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gRW50cnkgcXVhcmFudGluZWQsIGRvbid0IGxvYWRcbiAgICB9XG5cbiAgICAvLyBTYW5pdGl6ZSBjb250ZW50IChiYXNpYyBVbmljb2RlIG5vcm1hbGl6YXRpb24gKyBET01QdXJpZnkgb25seSlcbiAgICBlbnRyeS5jb250ZW50ID0gdGhpcy5zYW5pdGl6ZVdpdGhDYWNoZShlbnRyeS5jb250ZW50LCBNRU1PUllfQ09OU1RBTlRTLk1BWF9FTlRSWV9TSVpFKTtcbiAgICBlbnRyeS50YWdzID0gdGhpcy5zYW5pdGl6ZVRhZ3MoZW50cnkudGFncyB8fCBbXSk7XG4gICAgZW50cnkudGltZXN0YW1wID0gbmV3IERhdGUoZW50cnkudGltZXN0YW1wKTtcbiAgICBlbnRyeS50cnVzdExldmVsID0gdHJ1c3RMZXZlbDsgIC8vIFVzZSB0cnVzdCBsZXZlbCBmcm9tIGZpbGVcbiAgICBlbnRyeS5zb3VyY2UgPSBlbnRyeS5zb3VyY2UgfHwgJ2xvYWRlZCc7XG5cbiAgICBpZiAoZW50cnkuZXhwaXJlc0F0KSB7XG4gICAgICBlbnRyeS5leHBpcmVzQXQgPSBuZXcgRGF0ZShlbnRyeS5leHBpcmVzQXQpO1xuICAgIH1cblxuICAgIHRoaXMuZW50cmllcy5zZXQoZW50cnkuaWQsIGVudHJ5KTtcbiAgICByZXR1cm4gdHJ1ZTsgLy8gRW50cnkgbG9hZGVkIHN1Y2Nlc3NmdWxseVxuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIG1lbW9yeSBmcm9tIHN0cmluZ1xuICAgKiBTRUNVUklUWTogVmFsaWRhdGVzIGFsbCBsb2FkZWQgZGF0YVxuICAgKiBGSVggIzEyNjk6IEFkZGVkIENvbnRlbnRWYWxpZGF0b3IgdG8gcHJldmVudCBsb2FkaW5nIGluZmVjdGVkIG1lbW9yaWVzXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgZGVzZXJpYWxpemUoZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZGF0YSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIGJhc2ljIHN0cnVjdHVyZVxuICAgICAgaWYgKCFwYXJzZWQuaWQgfHwgIXBhcnNlZC50eXBlIHx8IHBhcnNlZC50eXBlICE9PSBFbGVtZW50VHlwZS5NRU1PUlkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1lbW9yeSBkYXRhIGZvcm1hdCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgcHJvcGVydGllc1xuICAgICAgdGhpcy5pZCA9IHBhcnNlZC5pZDtcbiAgICAgIHRoaXMudmVyc2lvbiA9IG5vcm1hbGl6ZVZlcnNpb24oU3RyaW5nKHBhcnNlZC52ZXJzaW9uID8/ICcxLjAuMCcpKTtcbiAgICAgIHRoaXMubWV0YWRhdGEgPSBwYXJzZWQubWV0YWRhdGEgfHwge307XG4gICAgICB0aGlzLmV4dGVuc2lvbnMgPSBwYXJzZWQuZXh0ZW5zaW9ucyB8fCB7fTtcblxuICAgICAgLy8gQ2xlYXIgYW5kIHJlbG9hZCBlbnRyaWVzXG4gICAgICB0aGlzLmVudHJpZXMuY2xlYXIoKTtcbiAgICAgIGxldCBxdWFyYW50aW5lZENvdW50ID0gMDtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkLmVudHJpZXMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgcGFyc2VkLmVudHJpZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWQgPSB0aGlzLnByb2Nlc3NEZXNlcmlhbGl6ZWRFbnRyeShlbnRyeSk7XG4gICAgICAgICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgICAgIHF1YXJhbnRpbmVkQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9nIHdhcm5pbmcgaWYgZW50cmllcyB3ZXJlIHF1YXJhbnRpbmVkXG4gICAgICBpZiAocXVhcmFudGluZWRDb3VudCA+IDApIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFF1YXJhbnRpbmVkICR7cXVhcmFudGluZWRDb3VudH0gaW5mZWN0ZWQgZW50cmllcyBmcm9tIG1lbW9yeSBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiYCwge1xuICAgICAgICAgIG1lbW9yeU5hbWU6IHRoaXMubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICB0b3RhbEVudHJpZXM6IHBhcnNlZC5lbnRyaWVzPy5sZW5ndGggfHwgMCxcbiAgICAgICAgICBxdWFyYW50aW5lZDogcXVhcmFudGluZWRDb3VudCxcbiAgICAgICAgICBsb2FkZWQ6IHRoaXMuZW50cmllc1NpemVcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElzc3VlICM1MTogQ2hlY2sgaWYgcmV0ZW50aW9uIGVuZm9yY2VtZW50IHNob3VsZCBoYXBwZW4gb24gbG9hZFxuICAgICAgLy8gSU1QT1JUQU5UOiBSZXRlbnRpb24gZW5mb3JjZW1lbnQgaXMgbm93IG9wdC1pbiwgbm90IGF1dG9tYXRpY1xuICAgICAgLy8gTk9URTogV3JhcHBlZCBpbiB0cnkvY2F0Y2ggdG8gaGFuZGxlIHRlc3QgZW52aXJvbm1lbnRzIHdoZXJlIENvbmZpZ01hbmFnZXIgbWF5IG5vdCBiZSBpbml0aWFsaXplZFxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmV0ZW50aW9uU2VydmljZSA9IE1lbW9yeS5nZXRSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlKCk7XG4gICAgICAgIGlmIChyZXRlbnRpb25TZXJ2aWNlPy5zaG91bGRFbmZvcmNlT25Mb2FkKCkpIHtcbiAgICAgICAgICAvLyBVc2VyIGhhcyBleHBsaWNpdGx5IGVuYWJsZWQgb24tbG9hZCBlbmZvcmNlbWVudFxuICAgICAgICAgIHRoaXMuZW5mb3JjZVJldGVudGlvblBvbGljeSgpO1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeV0gUmV0ZW50aW9uIHBvbGljeSBlbmZvcmNlZCBvbiBsb2FkIGZvciBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiYCwge1xuICAgICAgICAgICAgZW5mb3JjZW1lbnRNb2RlOiAnb25fbG9hZCdcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXRlbnRpb25TZXJ2aWNlPy5pc0VuYWJsZWQoKSkge1xuICAgICAgICAgIC8vIFJldGVudGlvbiBpcyBlbmFibGVkIGJ1dCBub3Qgc2V0IHRvIG9uX2xvYWQgbW9kZSAtIGxvZyBmb3IgdmlzaWJpbGl0eVxuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgW01lbW9yeV0gUmV0ZW50aW9uIGlzIGVuYWJsZWQgYnV0IG5vdCBlbmZvcmNlZCBvbiBsb2FkIGZvciBcIiR7dGhpcy5tZXRhZGF0YS5uYW1lfVwiYCwge1xuICAgICAgICAgICAgbm90ZTogJ1VzZSBleHBsaWNpdCBlbmZvcmNlbWVudCBjb21tYW5kIHRvIGNsZWFudXAgZXhwaXJlZCBlbnRyaWVzJ1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHJldGVudGlvblNlcnZpY2UgaXMgbm90IGNvbmZpZ3VyZWQgb3IgZGlzYWJsZWQsIG5vIGVuZm9yY2VtZW50IGhhcHBlbnNcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgc2FmZSBkZWZhdWx0IC0gbm90aGluZyBpcyBkZWxldGVkIHdpdGhvdXQgZXhwbGljaXQgY29uc2VudFxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNpbGVudGx5IGlnbm9yZSByZXRlbnRpb24gcG9saWN5IGVycm9ycyBkdXJpbmcgZGVzZXJpYWxpemF0aW9uXG4gICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpbiB0ZXN0IGVudmlyb25tZW50cyB3aGVyZSBDb25maWdNYW5hZ2VyIGlzIG5vdCBpbml0aWFsaXplZCxcbiAgICAgICAgLy8gb3Igd2hlbiBhIHN0YWxlIHJlc29sdmVyIHJlZmVyZW5jZXMgYSBkaXNwb3NlZCBzZXJ2aWNlIGluc3RhbmNlXG4gICAgICAgIC8vIEl0J3Mgc2FmZSB0byBza2lwIHJldGVudGlvbiBlbmZvcmNlbWVudCBpbiB0aGVzZSBjYXNlcyAtIHRoZSBkZWZhdWx0IGlzIG5vIGRlbGV0aW9uXG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiBNRU1PUllfU0VDVVJJVFlfRVZFTlRTLk1FTU9SWV9ERVNFUklBTElaRV9GQUlMRUQsXG4gICAgICAgIHNldmVyaXR5OiAnSElHSCcsXG4gICAgICAgIHNvdXJjZTogJ01lbW9yeS5kZXNlcmlhbGl6ZScsXG4gICAgICAgIGRldGFpbHM6IGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgbWVtb3J5OiAke2Vycm9yfWBcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVzZXJpYWxpemUgbWVtb3J5OiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gUHJpdmF0ZSBoZWxwZXIgbWV0aG9kc1xuICBcbiAgcHJpdmF0ZSBjYWxjdWxhdGVFeHBpcnlEYXRlKCk6IERhdGUge1xuICAgIGNvbnN0IGV4cGlyeSA9IG5ldyBEYXRlKCk7XG4gICAgZXhwaXJ5LnNldERhdGUoZXhwaXJ5LmdldERhdGUoKSArIHRoaXMucmV0ZW50aW9uRGF5cyk7XG4gICAgcmV0dXJuIGV4cGlyeTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzYW5pdGl6ZVRhZ3ModGFnczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgLy8gU0VDVVJJVFkgRklYOiBMaW1pdCBudW1iZXIgb2YgdGFncyBhbmQgc2FuaXRpemUgZWFjaFxuICAgIGNvbnN0IGxpbWl0ZWRUYWdzID0gdGFncy5zbGljZSgwLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9UQUdTX1BFUl9FTlRSWSk7XG4gICAgXG4gICAgcmV0dXJuIGxpbWl0ZWRUYWdzXG4gICAgICAubWFwKHRhZyA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZSh0YWcpLm5vcm1hbGl6ZWRDb250ZW50O1xuICAgICAgICByZXR1cm4gc2FuaXRpemVJbnB1dChub3JtYWxpemVkLCBNRU1PUllfQ09OU1RBTlRTLk1BWF9UQUdfTEVOR1RIKTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKHRhZyA9PiB0YWcgJiYgdGFnLmxlbmd0aCA+IDApO1xuICB9XG4gIFxuICBwcml2YXRlIHNhbml0aXplTWV0YWRhdGEobWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFtZXRhZGF0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBcbiAgICAvLyBTRUNVUklUWSBGSVg6IFNhbml0aXplIG1ldGFkYXRhIHZhbHVlc1xuICAgIGNvbnN0IHNhbml0aXplZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGNvbnN0IG1heEtleXMgPSBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRVRBREFUQV9LRVlTO1xuICAgIGxldCBrZXlDb3VudCA9IDA7XG4gICAgXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGEpKSB7XG4gICAgICBpZiAoa2V5Q291bnQgPj0gbWF4S2V5cykgYnJlYWs7XG4gICAgICBcbiAgICAgIGNvbnN0IHNhbml0aXplZEtleSA9IHNhbml0aXplSW5wdXQoa2V5LCBNRU1PUllfQ09OU1RBTlRTLk1BWF9NRVRBREFUQV9LRVlfTEVOR1RIKTtcbiAgICAgIGlmIChzYW5pdGl6ZWRLZXkgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICBzYW5pdGl6ZWRbc2FuaXRpemVkS2V5XSA9IHNhbml0aXplSW5wdXQodmFsdWUsIE1FTU9SWV9DT05TVEFOVFMuTUFYX01FVEFEQVRBX1ZBTFVFX0xFTkdUSCk7XG4gICAgICAgIGtleUNvdW50Kys7XG4gICAgICB9IGVsc2UgaWYgKHNhbml0aXplZEtleSAmJiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHNhbml0aXplZFtzYW5pdGl6ZWRLZXldID0gdmFsdWU7XG4gICAgICAgIGtleUNvdW50Kys7XG4gICAgICB9XG4gICAgICAvLyBTa2lwIG90aGVyIHR5cGVzIGZvciBzZWN1cml0eVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG4gIFxuICBwcml2YXRlIGNhbkFjY2Vzc1ByaXZhY3lMZXZlbChlbnRyeUxldmVsOiBzdHJpbmcsIHJlcXVlc3RlZExldmVsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsZXZlbHMgPSBNRU1PUllfQ09OU1RBTlRTLlBSSVZBQ1lfTEVWRUxTO1xuICAgIGNvbnN0IGVudHJ5SW5kZXggPSBsZXZlbHMuaW5kZXhPZihlbnRyeUxldmVsIGFzIFByaXZhY3lMZXZlbCk7XG4gICAgY29uc3QgcmVxdWVzdGVkSW5kZXggPSBsZXZlbHMuaW5kZXhPZihyZXF1ZXN0ZWRMZXZlbCBhcyBQcml2YWN5TGV2ZWwpO1xuICAgIFxuICAgIC8vIENhbiBvbmx5IGFjY2VzcyBlbnRyaWVzIGF0IG9yIGJlbG93IHRoZSByZXF1ZXN0ZWQgcHJpdmFjeSBsZXZlbFxuICAgIC8vIGUuZy4sIGlmIHJlcXVlc3RpbmcgJ3ByaXZhdGUnLCBjYW4gc2VlICdwdWJsaWMnIGFuZCAncHJpdmF0ZScgYnV0IG5vdCAnc2Vuc2l0aXZlJ1xuICAgIHJldHVybiBlbnRyeUluZGV4IDw9IHJlcXVlc3RlZEluZGV4O1xuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkRW50cnkoZW50cnk6IHVua25vd24pOiBlbnRyeSBpcyBNZW1vcnlFbnRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlbnRyeSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIGVudHJ5ICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgKGVudHJ5IGFzIGFueSkuaWQgPT09ICdzdHJpbmcnICYmXG4gICAgICB0eXBlb2YgKGVudHJ5IGFzIGFueSkuY29udGVudCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIChlbnRyeSBhcyBhbnkpLnRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoIShlbnRyeSBhcyBhbnkpLnRhZ3MgfHwgQXJyYXkuaXNBcnJheSgoZW50cnkgYXMgYW55KS50YWdzKSk7XG4gIH1cblxuICAvKipcbiAgICogT3B0aW1pemVkIHNhbml0aXphdGlvbiB3aXRoIGNoZWNrc3VtIGNhY2hpbmdcbiAgICogQXZvaWRzIHJlLXNhbml0aXppbmcgY29udGVudCB0aGF0IGhhc24ndCBjaGFuZ2VkXG4gICAqIEBwYXJhbSBjb250ZW50IENvbnRlbnQgdG8gc2FuaXRpemVcbiAgICogQHBhcmFtIG1heExlbmd0aCBNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoXG4gICAqIEByZXR1cm5zIFNhbml0aXplZCBjb250ZW50XG4gICAqL1xuICBwcml2YXRlIHNhbml0aXplV2l0aENhY2hlKGNvbnRlbnQ6IHN0cmluZywgbWF4TGVuZ3RoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIC8vIEdlbmVyYXRlIGNoZWNrc3VtIGZvciB0aGUgaW5wdXRcbiAgICBjb25zdCBjaGVja3N1bSA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoY29udGVudCkuZGlnZXN0KCdoZXgnKTtcblxuICAgIC8vIENoZWNrIGlmIHdlJ3ZlIGFscmVhZHkgc2FuaXRpemVkIHRoaXMgZXhhY3QgY29udGVudFxuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y2hlY2tzdW19OiR7bWF4TGVuZ3RofWA7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5zYW5pdGl6YXRpb25DYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBzYW5pdGl6YXRpb25cbiAgICBjb25zdCBzYW5pdGl6ZWQgPSBzYW5pdGl6ZU1lbW9yeUNvbnRlbnQoY29udGVudCwgbWF4TGVuZ3RoKTtcblxuICAgIC8vIENhY2hlIHRoZSByZXN1bHQgKGxpbWl0IGNhY2hlIHNpemUgdG8gcHJldmVudCBtZW1vcnkgaXNzdWVzKVxuICAgIGlmICh0aGlzLnNhbml0aXphdGlvbkNhY2hlLnNpemUgPiAxMDAwKSB7XG4gICAgICAvLyBSZW1vdmUgb2xkZXN0IGVudHJpZXMgKHNpbXBsZSBGSUZPKVxuICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLnNhbml0aXphdGlvbkNhY2hlLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAoZmlyc3RLZXkpIHRoaXMuc2FuaXRpemF0aW9uQ2FjaGUuZGVsZXRlKGZpcnN0S2V5KTtcbiAgICB9XG4gICAgdGhpcy5zYW5pdGl6YXRpb25DYWNoZS5zZXQoY2FjaGVLZXksIHNhbml0aXplZCk7XG5cbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHNlYXJjaCBpbmRleCB3aXRoIHJldHJ5IGxvZ2ljXG4gICAqIEF0dGVtcHRzIHRvIGJ1aWxkIHRoZSBpbmRleCB1cCB0byAzIHRpbWVzIHdpdGggZXhwb25lbnRpYWwgYmFja29mZlxuICAgKiBUaGlzIGVuc3VyZXMgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgZXZlbiBpZiB0aGVyZSBhcmUgdHJhbnNpZW50IGZhaWx1cmVzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkU2VhcmNoSW5kZXhXaXRoUmV0cnkocmV0cmllcyA9IDMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbGFzdEVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcblxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IHJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZWFyY2hJbmRleC5idWlsZEluZGV4KHRoaXMuZW50cmllcyk7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgU2VhcmNoIGluZGV4IGJ1aWx0IHN1Y2Nlc3NmdWxseSBvbiBhdHRlbXB0ICR7YXR0ZW1wdH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xuICAgICAgICBsb2dnZXIud2FybihgU2VhcmNoIGluZGV4IGJ1aWxkIGF0dGVtcHQgJHthdHRlbXB0fSBmYWlsZWRgLCB7XG4gICAgICAgICAgZXJyb3I6IGxhc3RFcnJvci5tZXNzYWdlLFxuICAgICAgICAgIGVudHJpZXNDb3VudDogdGhpcy5lbnRyaWVzU2l6ZVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYXR0ZW1wdCA8IHJldHJpZXMpIHtcbiAgICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmOiAxMDBtcywgMjAwbXMsIDQwMG1zXG4gICAgICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSkgKiAxMDA7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgYWxsIHJldHJpZXMgZmFpbGVkXG4gICAgdGhyb3cgbGFzdEVycm9yIHx8IG5ldyBFcnJvcignRmFpbGVkIHRvIGJ1aWxkIHNlYXJjaCBpbmRleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZW50cmllcyB3aXRoIGEgc3BlY2lmaWMgdHJ1c3QgbGV2ZWxcbiAgICogRklYICMxMzIwOiBQdWJsaWMgQVBJIGZvciBhY2Nlc3NpbmcgZW50cmllcyBieSB0cnVzdCBsZXZlbFxuICAgKiBVc2VkIGJ5IEJhY2tncm91bmRWYWxpZGF0b3IgdG8gZmluZCB1bnRydXN0ZWQgZW50cmllc1xuICAgKlxuICAgKiBAcGFyYW0gdHJ1c3RMZXZlbCAtIFRoZSB0cnVzdCBsZXZlbCB0byBmaWx0ZXIgYnlcbiAgICogQHJldHVybnMgQXJyYXkgb2YgbWVtb3J5IGVudHJpZXMgbWF0Y2hpbmcgdGhlIHRydXN0IGxldmVsXG4gICAqL1xuICBwdWJsaWMgZ2V0RW50cmllc0J5VHJ1c3RMZXZlbCh0cnVzdExldmVsOiBUcnVzdExldmVsKTogTWVtb3J5RW50cnlbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgICAgLmZpbHRlcihlbnRyeSA9PiBlbnRyeS50cnVzdExldmVsID09PSB0cnVzdExldmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIGVudHJpZXMgaW4gdGhpcyBtZW1vcnlcbiAgICogRklYICMxMzIwOiBQdWJsaWMgQVBJIGZvciBhY2Nlc3NpbmcgYWxsIGVudHJpZXNcbiAgICogUmVwbGFjZXMgdGhlIG5lZWQgZm9yIGAobWVtb3J5IGFzIGFueSkuZW50cmllc2AgaGFja3NcbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2YgYWxsIG1lbW9yeSBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgZ2V0QWxsRW50cmllcygpOiBNZW1vcnlFbnRyeVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZW50cmllcyBtYXAgZGlyZWN0bHlcbiAgICogVXNlZCBieSBSZXRlbnRpb25Qb2xpY3lTZXJ2aWNlIGZvciByZXRlbnRpb24gZW5mb3JjZW1lbnQgKElzc3VlICM1MSlcbiAgICpcbiAgICogQHJldHVybnMgTWFwIG9mIGVudHJ5IElEIHRvIG1lbW9yeSBlbnRyeVxuICAgKi9cbiAgcHVibGljIGdldEVudHJpZXMoKTogTWFwPHN0cmluZywgTWVtb3J5RW50cnk+IHtcbiAgICAvLyBSZXR1cm4gYSBuZXcgTWFwIHRvIHByZXZlbnQgZXh0ZXJuYWwgbW9kaWZpY2F0aW9uIG9mIGludGVybmFsIHN0YXRlXG4gICAgcmV0dXJuIG5ldyBNYXAodGhpcy5lbnRyaWVzLmVudHJpZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgc3BlY2lmaWMgZW50cnkgYnkgSURcbiAgICogRklYICM1MTogUHVibGljIEFQSSBmb3IgcmV0ZW50aW9uIHBvbGljeSB0byByZW1vdmUgZXhwaXJlZCBlbnRyaWVzXG4gICAqIFJlcGxhY2VzIHRoZSBuZWVkIGZvciBgKG1lbW9yeSBhcyBhbnkpLmVudHJpZXMuZGVsZXRlKClgIGhhY2tzXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyeUlkIC0gVGhlIElEIG9mIHRoZSBlbnRyeSB0byByZW1vdmVcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBlbnRyeSB3YXMgcmVtb3ZlZCwgZmFsc2UgaWYgbm90IGZvdW5kXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlRW50cnkoZW50cnlJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVtb3ZlZCA9IHRoaXMuZW50cmllcy5kZWxldGUoZW50cnlJZCk7XG4gICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgIC8vIElzc3VlICMyMzI5OiBrZWVwIHRoZSBzZWFyY2ggaW5kZXggY29uc2lzdGVudCB3aXRoIHRoZSBlbnRyaWVzIG1hcCDigJRcbiAgICAgIC8vIHByZXZpb3VzbHkgcmVtb3ZlZCBlbnRyaWVzIHN0YXllZCBzZWFyY2hhYmxlIHVudGlsIGEgZnVsbCBpbmRleCByZWJ1aWxkLlxuICAgICAgdGhpcy5zZWFyY2hJbmRleC5yZW1vdmVFbnRyeShlbnRyeUlkKTtcbiAgICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVtb3ZlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gaXRlcmF0b3Igb3ZlciBhbGwgZW50cmllc1xuICAgKiBGSVggIzEzMjA6IE1lbW9yeS1lZmZpY2llbnQgd2F5IHRvIGl0ZXJhdGUgZW50cmllc1xuICAgKlxuICAgKiBAcmV0dXJucyBJdGVyYXRvciBvdmVyIG1lbW9yeSBlbnRyaWVzXG4gICAqL1xuICBwdWJsaWMgKmdldEVudHJpZXNJdGVyYXRvcigpOiBJdGVyYWJsZUl0ZXJhdG9yPE1lbW9yeUVudHJ5PiB7XG4gICAgeWllbGQqIHRoaXMuZW50cmllcy52YWx1ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZpbGUgcGF0aCBmb3IgdGhpcyBtZW1vcnlcbiAgICogRklYICMxMzIwOiBVc2VkIGJ5IE1lbW9yeU1hbmFnZXIgYWZ0ZXIgbG9hZGluZ1xuICAgKiBGSVggKFNvbmFyQ2xvdWQpOiBBZGRlZCBpbnB1dCB2YWxpZGF0aW9uIHdpdGggcHJvcGVyIGVycm9yIHR5cGVzXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIGZpbGUgcGF0aCB3aGVyZSB0aGlzIG1lbW9yeSBpcyBzdG9yZWRcbiAgICogQHRocm93cyB7VHlwZUVycm9yfSBJZiBwYXRoIGlzIG5vdCBhIHN0cmluZ1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgcGF0aCBpcyBlbXB0eVxuICAgKi9cbiAgcHVibGljIHNldEZpbGVQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ01lbW9yeSBmaWxlIHBhdGggbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIH1cbiAgICBpZiAocGF0aC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lbW9yeSBmaWxlIHBhdGggY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuICAgIHRoaXMuZmlsZVBhdGggPSBwYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlsZSBwYXRoIGZvciB0aGlzIG1lbW9yeVxuICAgKiBGSVggIzEzMjA6IFJldHVybnMgdGhlIHBhdGggd2hlcmUgdGhpcyBtZW1vcnkgaXMgc3RvcmVkXG4gICAqIEByZXR1cm5zIFRoZSBmaWxlIHBhdGgsIG9yIHVuZGVmaW5lZCBpZiBub3QgeWV0IHBlcnNpc3RlZFxuICAgKi9cbiAgcHVibGljIGdldEZpbGVQYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZVBhdGg7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0aGlzIG1lbW9yeSB0byBkaXNrXG4gICAqIEZJWCAjMTMyMDogSW5zdGFuY2UgbWV0aG9kIGZvciBwZXJzaXN0aW5nIG1lbW9yeSBjaGFuZ2VzXG4gICAqIFVzZWQgYnkgQmFja2dyb3VuZFZhbGlkYXRvciB0byBzYXZlIHVwZGF0ZWQgdHJ1c3QgbGV2ZWxzXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNhdmUgaXMgY29tcGxldGVcbiAgICogQHRocm93cyB7RXJyb3J9IElmIG1lbW9yeSBoYXMgbm90IGJlZW4gbG9hZGVkIGZyb20gZmlsZSBhbmQgbm8gcGF0aCBpcyBzZXRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBNZW1vcnkuZ2V0TWVtb3J5TWFuYWdlcigpO1xuICAgIGF3YWl0IG1hbmFnZXIuc2F2ZSh0aGlzLCB0aGlzLmZpbGVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFsbCBtZW1vcmllcyB0aGF0IGhhdmUgZW50cmllcyB3aXRoIGEgc3BlY2lmaWMgdHJ1c3QgbGV2ZWxcbiAgICogRklYICMxMzIwOiBTdGF0aWMgcXVlcnkgQVBJIGZvciBmaW5kaW5nIG1lbW9yaWVzIGJ5IHRydXN0IGxldmVsXG4gICAqIFVzZWQgYnkgQmFja2dyb3VuZFZhbGlkYXRvciB0byBkaXNjb3ZlciB1bnRydXN0ZWQgbWVtb3JpZXNcbiAgICpcbiAgICogQHBhcmFtIHRydXN0TGV2ZWwgLSBUaGUgdHJ1c3QgbGV2ZWwgdG8gZmlsdGVyIGJ5XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcXVlcnkgb3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucy5saW1pdCAtIE1heGltdW0gbnVtYmVyIG9mIG1lbW9yaWVzIHRvIHJldHVyblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBhcnJheSBvZiBtZW1vcmllcyB3aXRoIG1hdGNoaW5nIGVudHJpZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgZmluZEJ5VHJ1c3RMZXZlbChcbiAgICB0cnVzdExldmVsOiBUcnVzdExldmVsLFxuICAgIG9wdGlvbnM/OiB7IGxpbWl0PzogbnVtYmVyIH1cbiAgKTogUHJvbWlzZTxNZW1vcnlbXT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBNZW1vcnkuZ2V0TWVtb3J5TWFuYWdlcigpO1xuXG4gICAgLy8gTG9hZCBhbGwgbWVtb3JpZXMgYW5kIGZpbHRlciBieSB0cnVzdCBsZXZlbFxuICAgIGNvbnN0IGFsbE1lbW9yaWVzID0gYXdhaXQgbWFuYWdlci5saXN0KCk7XG4gICAgY29uc3QgbWF0Y2hpbmdNZW1vcmllczogTWVtb3J5W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIGFsbE1lbW9yaWVzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIG1lbW9yeSBoYXMgYW55IGVudHJpZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHRydXN0IGxldmVsXG4gICAgICBjb25zdCBoYXNNYXRjaGluZ0VudHJpZXMgPSBtZW1vcnkuZ2V0RW50cmllc0J5VHJ1c3RMZXZlbCh0cnVzdExldmVsKS5sZW5ndGggPiAwO1xuXG4gICAgICBpZiAoaGFzTWF0Y2hpbmdFbnRyaWVzKSB7XG4gICAgICAgIG1hdGNoaW5nTWVtb3JpZXMucHVzaChtZW1vcnkpO1xuXG4gICAgICAgIC8vIEFwcGx5IGxpbWl0IGlmIHNwZWNpZmllZFxuICAgICAgICBpZiAob3B0aW9ucz8ubGltaXQgJiYgbWF0Y2hpbmdNZW1vcmllcy5sZW5ndGggPj0gb3B0aW9ucy5saW1pdCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBtZW1vcmllcyB3aXRoIHRydXN0IGxldmVsJywge1xuICAgICAgdHJ1c3RMZXZlbCxcbiAgICAgIGNvdW50OiBtYXRjaGluZ01lbW9yaWVzLmxlbmd0aCxcbiAgICAgIGxpbWl0OiBvcHRpb25zPy5saW1pdFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hdGNoaW5nTWVtb3JpZXM7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhbCBxdWVyeSBBUEkgZm9yIGZpbmRpbmcgbWVtb3JpZXNcbiAgICogRklYICMxMzIwOiBGbGV4aWJsZSBxdWVyeSBBUEkgZm9yIG11bHRpcGxlIGNyaXRlcmlhXG4gICAqIEZJWCAoU29uYXJDbG91ZCk6IFJlZmFjdG9yZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5IGZyb20gMjAgdG8gOFxuICAgKlxuICAgKiBAcGFyYW0gZmlsdGVyIC0gUXVlcnkgZmlsdGVyIGNyaXRlcmlhXG4gICAqIEBwYXJhbSBmaWx0ZXIudHJ1c3RMZXZlbCAtIEZpbHRlciBieSB0cnVzdCBsZXZlbFxuICAgKiBAcGFyYW0gZmlsdGVyLnRhZ3MgLSBGaWx0ZXIgYnkgdGFnc1xuICAgKiBAcGFyYW0gZmlsdGVyLm1heEFnZSAtIEZpbHRlciBieSBhZ2UgaW4gZGF5c1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBhcnJheSBvZiBtYXRjaGluZyBtZW1vcmllc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBmaW5kKGZpbHRlcjoge1xuICAgIHRydXN0TGV2ZWw/OiBUcnVzdExldmVsO1xuICAgIHRhZ3M/OiBzdHJpbmdbXTtcbiAgICBtYXhBZ2U/OiBudW1iZXI7XG4gIH0pOiBQcm9taXNlPE1lbW9yeVtdPiB7XG4gICAgY29uc3QgbWFuYWdlciA9IE1lbW9yeS5nZXRNZW1vcnlNYW5hZ2VyKCk7XG5cbiAgICAvLyBMb2FkIGFsbCBtZW1vcmllc1xuICAgIGNvbnN0IGFsbE1lbW9yaWVzID0gYXdhaXQgbWFuYWdlci5saXN0KCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgY3V0b2ZmIGRhdGUgaWYgbWF4QWdlIGlzIHNwZWNpZmllZFxuICAgIGNvbnN0IGN1dG9mZkRhdGUgPSBmaWx0ZXIubWF4QWdlXG4gICAgICA/IG5ldyBEYXRlKERhdGUubm93KCkgLSBmaWx0ZXIubWF4QWdlICogMjQgKiA2MCAqIDYwICogMTAwMClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gRmlsdGVyIG1lbW9yaWVzIHVzaW5nIGhlbHBlciBtZXRob2RcbiAgICBjb25zdCByZXN1bHRzID0gYWxsTWVtb3JpZXMuZmlsdGVyKG1lbW9yeSA9PlxuICAgICAgdGhpcy5tYXRjaGVzRmlsdGVyKG1lbW9yeSwgZmlsdGVyLCBjdXRvZmZEYXRlKVxuICAgICk7XG5cbiAgICBsb2dnZXIuZGVidWcoJ01lbW9yeSBxdWVyeSBjb21wbGV0ZScsIHtcbiAgICAgIGZpbHRlcixcbiAgICAgIHJlc3VsdENvdW50OiByZXN1bHRzLmxlbmd0aFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBtZW1vcnkgbWF0Y2hlcyB0aGUgZ2l2ZW4gZmlsdGVyIGNyaXRlcmlhXG4gICAqIEZJWCAoU29uYXJDbG91ZCk6IEV4dHJhY3RlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIG1hdGNoZXNGaWx0ZXIoXG4gICAgbWVtb3J5OiBNZW1vcnksXG4gICAgZmlsdGVyOiB7IHRydXN0TGV2ZWw/OiBUcnVzdExldmVsOyB0YWdzPzogc3RyaW5nW107IG1heEFnZT86IG51bWJlciB9LFxuICAgIGN1dG9mZkRhdGU/OiBEYXRlXG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIEZpbHRlciBieSB0cnVzdCBsZXZlbFxuICAgIGlmIChmaWx0ZXIudHJ1c3RMZXZlbCkge1xuICAgICAgY29uc3QgaGFzTWF0Y2hpbmdUcnVzdExldmVsID0gbWVtb3J5LmdldEVudHJpZXNCeVRydXN0TGV2ZWwoZmlsdGVyLnRydXN0TGV2ZWwpLmxlbmd0aCA+IDA7XG4gICAgICBpZiAoIWhhc01hdGNoaW5nVHJ1c3RMZXZlbCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIGJ5IHRhZ3NcbiAgICBpZiAoZmlsdGVyLnRhZ3MgJiYgZmlsdGVyLnRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWVtb3J5VGFncyA9IG1lbW9yeS5tZXRhZGF0YS50YWdzIHx8IFtdO1xuICAgICAgY29uc3QgaGFzTWF0Y2hpbmdUYWcgPSBmaWx0ZXIudGFncy5zb21lKHRhZyA9PiBtZW1vcnlUYWdzLmluY2x1ZGVzKHRhZykpO1xuICAgICAgaWYgKCFoYXNNYXRjaGluZ1RhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmlsdGVyIGJ5IGFnZVxuICAgIGlmIChjdXRvZmZEYXRlKSB7XG4gICAgICBjb25zdCBzdGF0cyA9IG1lbW9yeS5nZXRTdGF0cygpO1xuICAgICAgaWYgKCFzdGF0cy5uZXdlc3RFbnRyeSB8fCBzdGF0cy5uZXdlc3RFbnRyeSA8IGN1dG9mZkRhdGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=
|
|
@@ -123,6 +123,19 @@ export declare class MemoryManager extends BaseElementManager<Memory> {
|
|
|
123
123
|
* @throws {Error} When atomic write operation fails
|
|
124
124
|
*/
|
|
125
125
|
save(element: Memory, filePath?: string): Promise<void>;
|
|
126
|
+
/**
|
|
127
|
+
* Issue #2329: Serialize and run the full save-path validation without writing to disk.
|
|
128
|
+
* Lets callers reject a mutation immediately (e.g. addEntry) when the memory can no
|
|
129
|
+
* longer be persisted, instead of the failure surfacing only in a deferred save
|
|
130
|
+
* where it cannot be reported back to the caller.
|
|
131
|
+
*/
|
|
132
|
+
assertPersistable(element: Memory): Promise<void>;
|
|
133
|
+
/**
|
|
134
|
+
* Validation applied to serialized memory YAML before any disk write.
|
|
135
|
+
* Shared by save() and assertPersistable() so the pre-flight check and the
|
|
136
|
+
* actual write can never disagree.
|
|
137
|
+
*/
|
|
138
|
+
private validateSerializedMemoryYaml;
|
|
126
139
|
/**
|
|
127
140
|
* Handle memory load failure
|
|
128
141
|
* FIX (SonarCloud): Extract duplicated error handling to reduce code duplication
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryManager.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/MemoryManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAMnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAIpE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"MemoryManager.d.ts","sourceRoot":"","sources":["../../../src/elements/memories/MemoryManager.ts"],"names":[],"mappings":"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"}
|