@dollhousemcp/mcp-server 1.7.1 → 1.7.3
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 +22 -0
- package/dist/auth/GitHubAuthManager.js +2 -2
- package/dist/config/ConfigManager.d.ts +158 -25
- package/dist/config/ConfigManager.d.ts.map +1 -1
- package/dist/config/ConfigManager.js +627 -88
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ConfigHandler.d.ts +32 -0
- package/dist/handlers/ConfigHandler.d.ts.map +1 -0
- package/dist/handlers/ConfigHandler.js +202 -0
- package/dist/handlers/SyncHandlerV2.d.ts +42 -0
- package/dist/handlers/SyncHandlerV2.d.ts.map +1 -0
- package/dist/handlers/SyncHandlerV2.js +231 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -3
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts +0 -1
- package/dist/portfolio/GitHubPortfolioIndexer.d.ts.map +1 -1
- package/dist/portfolio/GitHubPortfolioIndexer.js +36 -16
- package/dist/portfolio/PortfolioRepoManager.d.ts +2 -1
- package/dist/portfolio/PortfolioRepoManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioRepoManager.js +2 -1
- package/dist/portfolio/PortfolioSyncManager.d.ts +127 -0
- package/dist/portfolio/PortfolioSyncManager.d.ts.map +1 -0
- package/dist/portfolio/PortfolioSyncManager.js +818 -0
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +54 -2
- package/dist/security/secureYamlParser.d.ts +46 -2
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +47 -3
- package/dist/server/ServerSetup.d.ts.map +1 -1
- package/dist/server/ServerSetup.js +16 -10
- package/dist/server/tools/ConfigToolsV2.d.ts +10 -0
- package/dist/server/tools/ConfigToolsV2.d.ts.map +1 -0
- package/dist/server/tools/ConfigToolsV2.js +110 -0
- package/dist/server/types.d.ts +2 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +1 -1
- package/dist/utils/logger.d.ts +45 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +202 -9
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.7.3] - 2025-09-09
|
|
4
|
+
|
|
5
|
+
### Security
|
|
6
|
+
- **Critical**: Added prototype pollution protection to prevent `__proto__`, `constructor`, and `prototype` injection attacks in ConfigManager
|
|
7
|
+
- Achieved 0 security findings across all severity levels in security audit
|
|
8
|
+
- Maintained FAILSAFE_SCHEMA usage with documented security rationale for YAML parsing
|
|
9
|
+
|
|
10
|
+
### Improved
|
|
11
|
+
- **ConfigManager Test Coverage**: Increased from 64.5% to 96.8% (+32.3%)
|
|
12
|
+
- Forward compatibility: Unknown configuration fields are now preserved during updates
|
|
13
|
+
- Enforced secure file permissions (0o700 for directories, 0o600 for files)
|
|
14
|
+
- All file operations now use atomic read/write mechanisms
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
- Fixed YAML "null" string being incorrectly parsed as null value
|
|
18
|
+
- Resolved race conditions in file operations
|
|
19
|
+
- Corrected file permission issues on Unix systems
|
|
20
|
+
|
|
21
|
+
### Known Issues
|
|
22
|
+
- Test-only: ConfigManager persistence test failing in mock environment (#896)
|
|
23
|
+
- Test-only: Two prototype pollution tests not triggering in test environment (#897)
|
|
24
|
+
|
|
3
25
|
## [1.6.11] - 2025-08-28
|
|
4
26
|
|
|
5
27
|
### Fixed
|
|
@@ -38,7 +38,7 @@ export class GitHubAuthManager {
|
|
|
38
38
|
// Check ConfigManager for stored configuration
|
|
39
39
|
try {
|
|
40
40
|
const configManager = ConfigManager.getInstance();
|
|
41
|
-
await configManager.
|
|
41
|
+
await configManager.initialize();
|
|
42
42
|
const configClientId = configManager.getGitHubClientId();
|
|
43
43
|
if (configClientId) {
|
|
44
44
|
logger.debug('Using OAuth Client ID from config');
|
|
@@ -562,4 +562,4 @@ Don't have a GitHub account? You'll be prompted to create one (it's free!)
|
|
|
562
562
|
}
|
|
563
563
|
}
|
|
564
564
|
}
|
|
565
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViQXV0aE1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXV0aC9HaXRIdWJBdXRoTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQXdCM0Q7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qjs7Ozs7OztPQU9HO0lBQ0ssTUFBTSxDQUFVLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO0lBRW5FOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXO1FBQzdCLGdFQUFnRTtRQUNoRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDO1FBQzNELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDO1lBQ0gsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xELE1BQU0sYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pELElBQUksY0FBYyxFQUFFLENBQUM7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WUFDakYsS0FBSyxHQUFHO2dCQUNOLE9BQU8sNERBQTRELENBQUM7WUFDdEUsS0FBSyxHQUFHO2dCQUNOLE9BQU8scUVBQXFFLENBQUM7WUFDL0UsS0FBSyxHQUFHO2dCQUNOLE9BQU8sa0VBQWtFLENBQUM7WUFDNUUsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLEdBQUcsQ0FBQztZQUNULEtBQUssR0FBRyxDQUFDO1lBQ1QsS0FBSyxHQUFHO2dCQUNOLE9BQU8sNEVBQTRFLENBQUM7WUFDdEY7Z0JBQ0Usb0VBQW9FO2dCQUNwRSxNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ3ZFLE9BQU8sc0JBQXNCLFNBQVMsd0RBQXdELENBQUM7UUFDbkcsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdpdEh1YiBhdXRoZW50aWNhdGlvbiBtYW5hZ2VyIHVzaW5nIE9BdXRoIGRldmljZSBmbG93XG4gKiBIYW5kbGVzIGF1dGhlbnRpY2F0aW9uIGZvciBNQ1Agc2VydmVycyB3aXRob3V0IHJlcXVpcmluZyBjbGllbnQgc2VjcmV0c1xuICovXG5cbmltcG9ydCB7IFRva2VuTWFuYWdlciB9IGZyb20gJy4uL3NlY3VyaXR5L3Rva2VuTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgQVBJQ2FjaGUgfSBmcm9tICcuLi9jYWNoZS9BUElDYWNoZS5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgQ29uZmlnTWFuYWdlciB9IGZyb20gJy4uL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBEZXZpY2VDb2RlUmVzcG9uc2Uge1xuICBkZXZpY2VfY29kZTogc3RyaW5nO1xuICB1c2VyX2NvZGU6IHN0cmluZztcbiAgdmVyaWZpY2F0aW9uX3VyaTogc3RyaW5nO1xuICBleHBpcmVzX2luOiBudW1iZXI7XG4gIGludGVydmFsOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXNwb25zZSB7XG4gIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICB0b2tlbl90eXBlOiBzdHJpbmc7XG4gIHNjb3BlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFN0YXR1cyB7XG4gIGlzQXV0aGVudGljYXRlZDogYm9vbGVhbjtcbiAgaGFzVG9rZW46IGJvb2xlYW47XG4gIHVzZXJuYW1lPzogc3RyaW5nO1xuICBzY29wZXM/OiBzdHJpbmdbXTtcbiAgZXhwaXJlc0F0PzogRGF0ZTtcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIEdpdEh1YiBhdXRoZW50aWNhdGlvbiB1c2luZyB0aGUgT0F1dGggZGV2aWNlIGZsb3dcbiAqIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoIGZvciBDTEkvZGVza3RvcCBhcHBsaWNhdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIEdpdEh1YkF1dGhNYW5hZ2VyIHtcbiAgLyoqXG4gICAqIERvbGxob3VzZU1DUCdzIG9mZmljaWFsIE9BdXRoIEFwcCBDbGllbnQgSURcbiAgICogVGhpcyBpcyBQVUJMSUMgaW5mb3JtYXRpb24gLSBPQXV0aCBDbGllbnQgSURzIGFyZSBtZWFudCB0byBiZSB2aXNpYmxlLlxuICAgKiBPbmx5IENsaWVudCBTZWNyZXRzIGFyZSBwcml2YXRlIChkZXZpY2UgZmxvdyBkb2Vzbid0IHVzZSBzZWNyZXRzKS5cbiAgICogXG4gICAqIFRoaXMgQ2xpZW50IElEIGVuYWJsZXMgdGhlIEdpdEh1YiBkZXZpY2UgZmxvdyBhdXRoZW50aWNhdGlvblxuICAgKiBhbGxvd2luZyB1c2VycyB0byBhdXRoZW50aWNhdGUgd2l0aCBhbiA4LWNoYXJhY3RlciBjb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9DTElFTlRfSUQgPSAnT3YyM2xpOWd5TlpQNm05YUoyRVAnO1xuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgQ0xJRU5UX0lEIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGUsIENvbmZpZ01hbmFnZXIsIG9yIGRlZmF1bHRcbiAgICogUHJpb3JpdHk6IEVudmlyb25tZW50IHZhcmlhYmxlID4gQ29uZmlnTWFuYWdlciA+IERlZmF1bHQgQ2xpZW50IElEXG4gICAqIFxuICAgKiBAcmV0dXJucyBUaGUgT0F1dGggQ2xpZW50IElEIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0Q2xpZW50SWQoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgLy8gQ2hlY2sgZW52aXJvbm1lbnQgdmFyaWFibGUgZmlyc3QgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgIGNvbnN0IGVudkNsaWVudElkID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0dJVEhVQl9DTElFTlRfSUQ7XG4gICAgaWYgKGVudkNsaWVudElkKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1VzaW5nIE9BdXRoIENsaWVudCBJRCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlJyk7XG4gICAgICByZXR1cm4gZW52Q2xpZW50SWQ7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgQ29uZmlnTWFuYWdlciBmb3Igc3RvcmVkIGNvbmZpZ3VyYXRpb25cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IENvbmZpZ01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIubG9hZENvbmZpZygpO1xuICAgICAgY29uc3QgY29uZmlnQ2xpZW50SWQgPSBjb25maWdNYW5hZ2VyLmdldEdpdEh1YkNsaWVudElkKCk7XG4gICAgICBpZiAoY29uZmlnQ2xpZW50SWQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdVc2luZyBPQXV0aCBDbGllbnQgSUQgZnJvbSBjb25maWcnKTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZ0NsaWVudElkO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIE9BdXRoIENsaWVudCBJRCBpbiBjb25maWcnLCB7IGVycm9yIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBVc2UgZGVmYXVsdCBEb2xsaG91c2VNQ1AgT0F1dGggQXBwIENsaWVudCBJRFxuICAgIC8vIFRoaXMgZW5hYmxlcyBcImp1c3Qgd29ya3NcIiBleHBlcmllbmNlIGZvciBOUE0gaW5zdGFsbHNcbiAgICBsb2dnZXIuZGVidWcoJ1VzaW5nIGRlZmF1bHQgRG9sbGhvdXNlTUNQIE9BdXRoIENsaWVudCBJRCcpO1xuICAgIHJldHVybiBHaXRIdWJBdXRoTWFuYWdlci5ERUZBVUxUX0NMSUVOVF9JRDtcbiAgfVxuICBcbiAgLy8gR2l0SHViIE9BdXRoIGVuZHBvaW50c1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERVZJQ0VfQ09ERV9VUkwgPSAnaHR0cHM6Ly9naXRodWIuY29tL2xvZ2luL2RldmljZS9jb2RlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVE9LRU5fVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aC9hY2Nlc3NfdG9rZW4nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBVU0VSX1VSTCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3VzZXInO1xuICBcbiAgLy8gUG9sbGluZyBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUE9MTF9JTlRFUlZBTCA9IDUwMDA7IC8vIDUgc2Vjb25kc1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUE9MTF9BVFRFTVBUUyA9IDE4MDsgLy8gMTUgbWludXRlcyB0b3RhbFxuICBcbiAgcHJpdmF0ZSBhcGlDYWNoZTogQVBJQ2FjaGU7XG4gIHByaXZhdGUgYWN0aXZlUG9sbGluZzogQWJvcnRDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG4gIFxuICBjb25zdHJ1Y3RvcihhcGlDYWNoZTogQVBJQ2FjaGUpIHtcbiAgICB0aGlzLmFwaUNhY2hlID0gYXBpQ2FjaGU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgbmV0d29yayByZXF1ZXN0IHdpdGggcmV0cnkgbG9naWNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hXaXRoUmV0cnkoXG4gICAgdXJsOiBzdHJpbmcsIFxuICAgIG9wdGlvbnM6IFJlcXVlc3RJbml0LCBcbiAgICBtYXhSZXRyaWVzOiBudW1iZXIgPSAzLFxuICAgIHJldHJ5RGVsYXk6IG51bWJlciA9IDEwMDBcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0dpdEh1YkF1dGhNYW5hZ2VyLmZldGNoV2l0aFJldHJ5JywgZXJyb3IsIHsgdXJsLCBhdHRlbXB0IH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3IgdGhhdCBzaG91bGQgYmUgcmV0cmllZFxuICAgICAgICBjb25zdCBpc05ldHdvcmtFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgKFxuICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VDT05OUkVGVVNFRCcpIHx8XG4gICAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRVRJTUVET1VUJykgfHxcbiAgICAgICAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFTk9URk9VTkQnKSB8fFxuICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ25ldHdvcmsnKVxuICAgICAgICApO1xuICAgICAgICBcbiAgICAgICAgaWYgKGlzTmV0d29ya0Vycm9yICYmIGF0dGVtcHQgPCBtYXhSZXRyaWVzKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBOZXR3b3JrIHJlcXVlc3QgZmFpbGVkLCByZXRyeWluZyAoJHthdHRlbXB0fS8ke21heFJldHJpZXN9KWAsIHtcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgbmV4dFJldHJ5SW46IHJldHJ5RGVsYXkgKiBhdHRlbXB0XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCByZXRyeURlbGF5ICogYXR0ZW1wdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vdCBhIG5ldHdvcmsgZXJyb3Igb3IgbGFzdCBhdHRlbXB0LCB0aHJvdyBpbW1lZGlhdGVseVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRocm93IGxhc3RFcnJvciB8fCBuZXcgRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQgYWZ0ZXIgYWxsIHJldHJpZXMnKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGN1cnJlbnQgYXV0aGVudGljYXRpb24gc3RhdHVzXG4gICAqL1xuICBhc3luYyBnZXRBdXRoU3RhdHVzKCk6IFByb21pc2U8QXV0aFN0YXR1cz4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICBcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBoYXNUb2tlbjogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gZ2V0IHVzZXIgaW5mbyB0byB2YWxpZGF0ZSB0b2tlblxuICAgICAgY29uc3QgdXNlckluZm8gPSBhd2FpdCB0aGlzLmZldGNoVXNlckluZm8odG9rZW4pO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IHRydWUsXG4gICAgICAgIGhhc1Rva2VuOiB0cnVlLFxuICAgICAgICB1c2VybmFtZTogdXNlckluZm8ubG9naW4sXG4gICAgICAgIHNjb3BlczogdXNlckluZm8uc2NvcGVzXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBUb2tlbiBtaWdodCBiZSBpbnZhbGlkIG9yIGV4cGlyZWRcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignR2l0SHViQXV0aE1hbmFnZXIuY2hlY2tBdXRoU3RhdHVzJywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgICAgICAgaGFzVG9rZW46IHRydWUgLy8gSGFzIHRva2VuIGJ1dCBpdCdzIGludmFsaWRcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSW5pdGlhdGUgdGhlIGRldmljZSBmbG93IGF1dGhlbnRpY2F0aW9uIHByb2Nlc3NcbiAgICovXG4gIGFzeW5jIGluaXRpYXRlRGV2aWNlRmxvdygpOiBQcm9taXNlPERldmljZUNvZGVSZXNwb25zZT4ge1xuICAgIGNvbnN0IGNsaWVudElkID0gYXdhaXQgR2l0SHViQXV0aE1hbmFnZXIuZ2V0Q2xpZW50SWQoKTtcbiAgICAvLyBnZXRDbGllbnRJZCgpIGFsd2F5cyByZXR1cm5zIGEgdmFsdWUgKGVudiwgY29uZmlnLCBvciBkZWZhdWx0KVxuICAgIFxuICAgIC8vIExvZyB0aGUgT0F1dGggZmxvdyBzdGVwIGZvciBkZWJ1Z2dpbmdcbiAgICBsb2dnZXIuZGVidWcoJ09BVVRIX1NURVBfMTogR2V0dGluZyBjbGllbnQgSUQnLCB7IGNsaWVudElkOiBjbGllbnRJZD8uc3Vic3RyaW5nKDAsIDgpICsgJy4uLicgfSk7XG4gICAgXG4gICAgaWYgKCFjbGllbnRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPQVVUSF9OT19DTElFTlRfSUQ6IE5vIE9BdXRoIGNsaWVudCBJRCBjb25maWd1cmVkLiBTZXQgRE9MTEhPVVNFX0dJVEhVQl9DTElFTlRfSUQgZW52aXJvbm1lbnQgdmFyaWFibGUuJyk7XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci5kZWJ1ZygnT0FVVEhfU1RFUF8yOiBJbml0aWF0aW5nIGRldmljZSBmbG93JywgeyB1cmw6IEdpdEh1YkF1dGhNYW5hZ2VyLkRFVklDRV9DT0RFX1VSTCB9KTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoV2l0aFJldHJ5KEdpdEh1YkF1dGhNYW5hZ2VyLkRFVklDRV9DT0RFX1VSTCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgICBzY29wZTogJ3B1YmxpY19yZXBvIHJlYWQ6dXNlcidcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ09BVVRIX1NURVBfMzogR2l0SHViIHJlc3BvbnNlJywgeyBcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ3gtZ2l0aHViLXJlcXVlc3QtaWQnOiByZXNwb25zZS5oZWFkZXJzLmdldCgneC1naXRodWItcmVxdWVzdC1pZCcpLFxuICAgICAgICAgICd4LXJhdGVsaW1pdC1yZW1haW5pbmcnOiByZXNwb25zZS5oZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVtYWluaW5nJylcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0dpdEh1YiBPQXV0aCBlbmRwb2ludCBlcnJvcicsIHsgXG4gICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICByZXNwb25zZUJvZHk6IHJlc3BvbnNlVGV4dCxcbiAgICAgICAgICBjbGllbnRJZDogY2xpZW50SWQ/LnN1YnN0cmluZygwLCA4KSArICcuLi4nXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gUGFyc2UgR2l0SHViJ3MgZXJyb3IgcmVzcG9uc2UgZm9yIHNwZWNpZmljIGVycm9yIGNvZGVzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JEYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChlcnJvckRhdGEuZXJyb3IgPT09ICd1bmF1dGhvcml6ZWRfY2xpZW50Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPQVVUSF9DTElFTlRfVU5BVVRIT1JJWkVEOiBPQXV0aCBhcHAgJyR7Y2xpZW50SWQ/LnN1YnN0cmluZygwLCA4KX0uLi4nIGlzIG5vdCBhdXRob3JpemVkIGZvciBkZXZpY2UgZmxvdy4gVGhlIGFwcCBtYXkgbmVlZCByZWNvbmZpZ3VyYXRpb24uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGlmIChlcnJvckRhdGEuZXJyb3IgPT09ICdpbnZhbGlkX2NsaWVudCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT0FVVEhfQ0xJRU5UX0lOVkFMSUQ6IEdpdEh1YiByZWplY3RlZCBPQXV0aCBjbGllbnQgSUQgJyR7Y2xpZW50SWQ/LnN1YnN0cmluZygwLCA4KX0uLi4nLiBUaGUgYXBwIG1heSBub3QgZXhpc3Qgb3IgYmUgZGlzYWJsZWQuYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGlmIChlcnJvckRhdGEuZXJyb3JfZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT0FVVEhfQVBJX0VSUk9SOiAke2Vycm9yRGF0YS5lcnJvcl9kZXNjcmlwdGlvbn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBjYW4ndCBwYXJzZSB0aGUgZXJyb3IsIHByb3ZpZGUgSFRUUCBzdGF0dXMgc3BlY2lmaWMgZXJyb3JcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT0FVVEhfQ0xJRU5UX0lOVkFMSUQ6IEdpdEh1YiByZWplY3RlZCBPQXV0aCBjbGllbnQgSUQgJyR7Y2xpZW50SWQ/LnN1YnN0cmluZygwLCA4KX0uLi4nLiBUaGUgYXBwIG1heSBub3QgZXhpc3Qgb3IgYmUgZGlzYWJsZWQuYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPQVVUSF9ERVZJQ0VfRkxPV19ESVNBQkxFRDogVGhpcyBPQXV0aCBhcHAgZG9lc24ndCBoYXZlIGRldmljZSBmbG93IGVuYWJsZWQuIENvbnRhY3QgYWRtaW5pc3RyYXRvci5gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9BVVRIX1JBVEVfTElNSVRFRDogVG9vIG1hbnkgYXV0aGVudGljYXRpb24gYXR0ZW1wdHMuIFBsZWFzZSB3YWl0IGJlZm9yZSB0cnlpbmcgYWdhaW4uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT0FVVEhfSFRUUF8ke3Jlc3BvbnNlLnN0YXR1c306IEdpdEh1YiBPQXV0aCBmYWlsZWQgLSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgcmVzcG9uc2VcbiAgICAgIGlmICghZGF0YS5kZXZpY2VfY29kZSB8fCAhZGF0YS51c2VyX2NvZGUgfHwgIWRhdGEudmVyaWZpY2F0aW9uX3VyaSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0ludmFsaWQgZGV2aWNlIGZsb3cgcmVzcG9uc2Ugc3RydWN0dXJlJywgeyBcbiAgICAgICAgICBoYXNEZXZpY2VDb2RlOiAhIWRhdGEuZGV2aWNlX2NvZGUsXG4gICAgICAgICAgaGFzVXNlckNvZGU6ICEhZGF0YS51c2VyX2NvZGUsXG4gICAgICAgICAgaGFzVmVyaWZpY2F0aW9uVXJpOiAhIWRhdGEudmVyaWZpY2F0aW9uX3VyaVxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPQVVUSF9JTlZBTElEX1JFU1BPTlNFOiBJbnZhbGlkIGRldmljZSBmbG93IHJlc3BvbnNlIGZyb20gR2l0SHViIC0gbWlzc2luZyByZXF1aXJlZCBmaWVsZHMnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBhdWRpdCB0cmFpbFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoTWFuYWdlci5pbml0aWF0ZURldmljZUZsb3cnLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIE9BdXRoIGRldmljZSBmbG93IGluaXRpYXRlZCBzdWNjZXNzZnVsbHknLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHVzZXJDb2RlOiBkYXRhLnVzZXJfY29kZSxcbiAgICAgICAgICBleHBpcmVzSW46IGRhdGEuZXhwaXJlc19pbixcbiAgICAgICAgICBpbnRlcnZhbDogZGF0YS5pbnRlcnZhbFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGRhdGEgYXMgRGV2aWNlQ29kZVJlc3BvbnNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0dpdEh1YkF1dGhNYW5hZ2VyLmluaXRpYXRlRGV2aWNlRmxvdycsIGVycm9yKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3JcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIC8vIFJlLXRocm93IGlmIGl0J3MgYWxyZWFkeSBhIHByb3Blcmx5IGZvcm1hdHRlZCBlcnJvciB3aXRoIGNvZGVcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnT0FVVEhfJykpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gRm9ybWF0IG5ldHdvcmsgZXJyb3JzXG4gICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFQ09OTlJFRlVTRUQnKSB8fCBcbiAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VUSU1FRE9VVCcpIHx8IFxuICAgICAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRU5PVEZPVU5EJykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9BVVRIX05FVFdPUktfRVJST1I6IFVuYWJsZSB0byByZWFjaCBHaXRIdWIgc2VydmVycyAoaHR0cHM6Ly9naXRodWIuY29tL2xvZ2luL2RldmljZS9jb2RlKS4gQ2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uLmApO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbmV0d29yaycpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPQVVUSF9ORVRXT1JLX0VSUk9SOiBOZXR3b3JrIGVycm9yIHdoaWxlIGNvbm5lY3RpbmcgdG8gR2l0SHViLiBQbGVhc2UgY2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdlbmVyaWMgZmFsbGJhY2sgKHNob3VsZCByYXJlbHkgaGFwcGVuKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPQVVUSF9VTktOT1dOX0VSUk9SOiBGYWlsZWQgdG8gc3RhcnQgR2l0SHViIGF1dGhlbnRpY2F0aW9uIC0gJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQb2xsIGZvciB0b2tlbiBhZnRlciB1c2VyIGhhcyBhdXRob3JpemVkIHRoZSBkZXZpY2VcbiAgICovXG4gIGFzeW5jIHBvbGxGb3JUb2tlbihkZXZpY2VDb2RlOiBzdHJpbmcsIGludGVydmFsOiBudW1iZXIgPSBHaXRIdWJBdXRoTWFuYWdlci5ERUZBVUxUX1BPTExfSU5URVJWQUwpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgICAvLyBDcmVhdGUgbmV3IGFib3J0IGNvbnRyb2xsZXIgZm9yIHRoaXMgcG9sbGluZyBzZXNzaW9uXG4gICAgdGhpcy5hY3RpdmVQb2xsaW5nID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuYWN0aXZlUG9sbGluZy5zaWduYWw7XG4gICAgXG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBcbiAgICB0cnkge1xuICAgICAgd2hpbGUgKGF0dGVtcHRzIDwgR2l0SHViQXV0aE1hbmFnZXIuTUFYX1BPTExfQVRURU1QVFMpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgcG9sbGluZyB3YXMgYWJvcnRlZFxuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIHBvbGxpbmcgd2FzIGNhbmNlbGxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChHaXRIdWJBdXRoTWFuYWdlci5UT0tFTl9VUkwsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgY2xpZW50X2lkOiBhd2FpdCBHaXRIdWJBdXRoTWFuYWdlci5nZXRDbGllbnRJZCgpIHx8ICcnLFxuICAgICAgICAgICAgZGV2aWNlX2NvZGU6IGRldmljZUNvZGUsXG4gICAgICAgICAgICBncmFudF90eXBlOiAndXJuOmlldGY6cGFyYW1zOm9hdXRoOmdyYW50LXR5cGU6ZGV2aWNlX2NvZGUnXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgZm9yIHZhcmlvdXMgcmVzcG9uc2Ugc3RhdGVzXG4gICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgc3dpdGNoIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICBjYXNlICdhdXRob3JpemF0aW9uX3BlbmRpbmcnOlxuICAgICAgICAgICAgICAvLyBVc2VyIGhhc24ndCBhdXRob3JpemVkIHlldCwga2VlcCBwb2xsaW5nXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ3Nsb3dfZG93bic6XG4gICAgICAgICAgICAgIC8vIEluY3JlYXNlIHBvbGxpbmcgaW50ZXJ2YWxcbiAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBNYXRoLm1pbihpbnRlcnZhbCAqIDEuNSwgMzAwMDApOyAvLyBNYXggMzAgc2Vjb25kc1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1Nsb3dpbmcgZG93biBwb2xsaW5nIGludGVydmFsJywgeyBuZXdJbnRlcnZhbDogaW50ZXJ2YWwgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ2V4cGlyZWRfdG9rZW4nOlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBhdXRob3JpemF0aW9uIGNvZGUgaGFzIGV4cGlyZWQuIFBsZWFzZSBzdGFydCBvdmVyLicpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ2FjY2Vzc19kZW5pZWQnOlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhvcml6YXRpb24gd2FzIGRlbmllZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAvLyBMb2cgdGhlIGFjdHVhbCBlcnJvciBmb3IgZGVidWdnaW5nXG4gICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnT0F1dGggZGV2aWNlIGZsb3cgZXJyb3InLCB7IFxuICAgICAgICAgICAgICAgIGVycm9yOiBkYXRhLmVycm9yLCBcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS5lcnJvcl9kZXNjcmlwdGlvbiBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkLiBQbGVhc2UgdHJ5IHN0YXJ0aW5nIHRoZSBwcm9jZXNzIGFnYWluLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgIC8vIFN1Y2Nlc3MhXG4gICAgICAgICAgcmV0dXJuIGRhdGEgYXMgVG9rZW5SZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gV2FpdCBiZWZvcmUgbmV4dCBwb2xsXG4gICAgICAgIC8vIFdhaXQgZm9yIGludGVydmFsIHdpdGggYWJvcnQgc3VwcG9ydFxuICAgICAgICBhd2FpdCB0aGlzLndhaXRXaXRoQWJvcnQoaW50ZXJ2YWwsIHNpZ25hbCk7XG4gICAgICAgIFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTmV0d29yayBlcnJvcnMgc2hvdWxkbid0IHN0b3AgcG9sbGluZ1xuICAgICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0dpdEh1YkF1dGhNYW5hZ2VyLnBvbGxGb3JUb2tlbicsIGVycm9yLCB7IGF0dGVtcHQ6IGF0dGVtcHRzIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRXaXRoQWJvcnQoaW50ZXJ2YWwsIHNpZ25hbCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gdGltZWQgb3V0LiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBDbGVhciBhY3RpdmUgcG9sbGluZyByZWZlcmVuY2VcbiAgICAgIHRoaXMuYWN0aXZlUG9sbGluZyA9IG51bGw7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ29tcGxldGUgdGhlIGF1dGhlbnRpY2F0aW9uIGZsb3cgYW5kIHN0b3JlIHRoZSB0b2tlblxuICAgKi9cbiAgYXN5bmMgY29tcGxldGVBdXRoZW50aWNhdGlvbih0b2tlblJlc3BvbnNlOiBUb2tlblJlc3BvbnNlKTogUHJvbWlzZTxBdXRoU3RhdHVzPiB7XG4gICAgLy8gU3RvcmUgdG9rZW4gc2VjdXJlbHlcbiAgICBhd2FpdCB0aGlzLnN0b3JlVG9rZW4odG9rZW5SZXNwb25zZS5hY2Nlc3NfdG9rZW4pO1xuICAgIFxuICAgIC8vIEdldCB1c2VyIGluZm9cbiAgICBjb25zdCB1c2VySW5mbyA9IGF3YWl0IHRoaXMuZmV0Y2hVc2VySW5mbyh0b2tlblJlc3BvbnNlLmFjY2Vzc190b2tlbik7XG4gICAgXG4gICAgLy8gTG9nIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24gY29tcGxldGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnR2l0SHViQXV0aE1hbmFnZXIuY29tcGxldGVBdXRoZW50aWNhdGlvbicsXG4gICAgICBkZXRhaWxzOiAnR2l0SHViIE9BdXRoIGRldmljZSBmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgdXNlcm5hbWU6IHVzZXJJbmZvLmxvZ2luLFxuICAgICAgICBzY29wZXM6IHRva2VuUmVzcG9uc2Uuc2NvcGUuc3BsaXQoJyAnKSxcbiAgICAgICAgdG9rZW5UeXBlOiBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKHRva2VuUmVzcG9uc2UuYWNjZXNzX3Rva2VuKVxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBpc0F1dGhlbnRpY2F0ZWQ6IHRydWUsXG4gICAgICBoYXNUb2tlbjogdHJ1ZSxcbiAgICAgIHVzZXJuYW1lOiB1c2VySW5mby5sb2dpbixcbiAgICAgIHNjb3BlczogdG9rZW5SZXNwb25zZS5zY29wZS5zcGxpdCgnICcpXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENsZWFyIHN0b3JlZCBhdXRoZW50aWNhdGlvbiBhbmQgcmV2b2tlIHRva2VuXG4gICAqL1xuICBhc3luYyBjbGVhckF1dGhlbnRpY2F0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgdGhlIHRva2VuIGJlZm9yZSBjbGVhcmluZyBpdFxuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1hbmFnZXIuZ2V0R2l0SHViVG9rZW5Bc3luYygpO1xuICAgICAgXG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byByZXZva2UgdGhlIHRva2VuIG9uIEdpdEh1YlxuICAgICAgICAvLyBOb3RlOiBHaXRIdWIgT0F1dGggdG9rZW5zIGRvbid0IGhhdmUgYSByZXZvY2F0aW9uIGVuZHBvaW50IGZvciBkZXZpY2UgZmxvdyB0b2tlbnNcbiAgICAgICAgLy8gQnV0IHdlJ2xsIGNsZWFyIHRoZSBjYWNoZSBhbmQgcmVtb3ZlIGZyb20gc3RvcmFnZVxuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgY2FjaGVkIHVzZXIgaW5mb1xuICAgICAgICB0aGlzLmFwaUNhY2hlLmNsZWFyKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhNYW5hZ2VyLmNsZWFyQXV0aGVudGljYXRpb24nLFxuICAgICAgICAgIGRldGFpbHM6ICdHaXRIdWIgYXV0aGVudGljYXRpb24gY2xlYXJlZCBieSB1c2VyIHJlcXVlc3QnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBoYWRUb2tlbjogdHJ1ZSxcbiAgICAgICAgICAgIHRva2VuUHJlZml4OiBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5QcmVmaXgodG9rZW4pXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmVtb3ZlIGZyb20gc2VjdXJlIHN0b3JhZ2VcbiAgICAgIGF3YWl0IFRva2VuTWFuYWdlci5yZW1vdmVTdG9yZWRUb2tlbigpO1xuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbygnR2l0SHViIGF1dGhlbnRpY2F0aW9uIGNsZWFyZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignR2l0SHViQXV0aE1hbmFnZXIuY2xlYXJBdXRoZW50aWNhdGlvbicsIGVycm9yKTtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignRmFpbGVkIHRvIGNsZWFyIGF1dGhlbnRpY2F0aW9uJywgRXJyb3JDYXRlZ29yeS5BVVRIX0VSUk9SLCB1bmRlZmluZWQsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTdG9yZSB0b2tlbiBzZWN1cmVseSB1c2luZyBlbmNyeXB0ZWQgZmlsZSBzdG9yYWdlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN0b3JlVG9rZW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBUb2tlbk1hbmFnZXIuc3RvcmVHaXRIdWJUb2tlbih0b2tlbik7XG4gICAgICBsb2dnZXIuaW5mbygnR2l0SHViIHRva2VuIHN0b3JlZCBzZWN1cmVseS4gWW91IGFyZSBub3cgYXV0aGVudGljYXRlZCEnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdHaXRIdWJBdXRoTWFuYWdlci5zdG9yZVRva2VuJywgZXJyb3IpO1xuICAgICAgLy8gRmFsbGJhY2sgdG8gZW52aXJvbm1lbnQgdmFyaWFibGUgaW5zdHJ1Y3Rpb25zXG4gICAgICBsb2dnZXIuaW5mbygnRm9yIG1hbnVhbCBzZXR1cCwgeW91IGNhbiBzZXQgR0lUSFVCX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlLicpO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgJ0ZhaWxlZCB0byBzdG9yZSBHaXRIdWIgdG9rZW4nLCBFcnJvckNhdGVnb3J5LkFVVEhfRVJST1IpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEZldGNoIHVzZXIgaW5mb3JtYXRpb24gZnJvbSBHaXRIdWJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hVc2VySW5mbyh0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuYXBpQ2FjaGUuZ2V0KEdpdEh1YkF1dGhNYW5hZ2VyLlVTRVJfVVJMKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hXaXRoUmV0cnkoR2l0SHViQXV0aE1hbmFnZXIuVVNFUl9VUkwsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nXG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gdGhpcy5nZXRFcnJvck1lc3NhZ2VGb3JTdGF0dXMocmVzcG9uc2Uuc3RhdHVzLCAndXNlciBpbmZvcm1hdGlvbiBmZXRjaCcpO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gZmV0Y2ggdXNlciBpbmZvJywgeyBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIFxuICAgIC8vIE5vcm1hbGl6ZSB1c2VybmFtZSBhbmQgb3RoZXIgdGV4dCBmaWVsZHMgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3NcbiAgICBpZiAoZGF0YS5sb2dpbikge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRhdGEubG9naW4pO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoTWFuYWdlci5mZXRjaFVzZXJJbmZvJyxcbiAgICAgICAgICBkZXRhaWxzOiAnR2l0SHViIHVzZXJuYW1lIGNvbnRhaW5zIGludmFsaWQgVW5pY29kZScsXG4gICAgICAgICAgbWV0YWRhdGE6IHsgXG4gICAgICAgICAgICBvcmlnaW5hbExlbmd0aDogZGF0YS5sb2dpbi5sZW5ndGgsXG4gICAgICAgICAgICBkZXRlY3RlZElzc3VlczogdmFsaWRhdGlvbi5kZXRlY3RlZElzc3VlcyBcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlcm5hbWUgZm9ybWF0IGZyb20gR2l0SHViJyk7XG4gICAgICB9XG4gICAgICBkYXRhLmxvZ2luID0gdmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcbiAgICB9XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIGRpc3BsYXkgbmFtZSBpZiBwcmVzZW50XG4gICAgaWYgKGRhdGEubmFtZSkge1xuICAgICAgY29uc3QgbmFtZVZhbGlkYXRpb24gPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkYXRhLm5hbWUpO1xuICAgICAgaWYgKG5hbWVWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgZGF0YS5uYW1lID0gbmFtZVZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCBmYWlsIG9uIGRpc3BsYXkgbmFtZSwganVzdCByZW1vdmUgaXRcbiAgICAgICAgZGVsZXRlIGRhdGEubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIHNjb3BlcyBmcm9tIHJlc3BvbnNlIGhlYWRlcnNcbiAgICBjb25zdCBzY29wZUhlYWRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LW9hdXRoLXNjb3BlcycpO1xuICAgIGlmIChzY29wZUhlYWRlcikge1xuICAgICAgZGF0YS5zY29wZXMgPSBzY29wZUhlYWRlci5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKTtcbiAgICB9XG4gICAgXG4gICAgLy8gTG9nIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24gZm9yIGF1ZGl0IHRyYWlsXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoTWFuYWdlci5mZXRjaFVzZXJJbmZvJyxcbiAgICAgIGRldGFpbHM6ICdHaXRIdWIgdXNlciBhdXRoZW50aWNhdGVkIHN1Y2Nlc3NmdWxseScsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICB1c2VybmFtZTogZGF0YS5sb2dpbixcbiAgICAgICAgaGFzRW1haWw6ICEhZGF0YS5lbWFpbCxcbiAgICAgICAgc2NvcGVzOiBkYXRhLnNjb3BlcyB8fCBbXVxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICB0aGlzLmFwaUNhY2hlLnNldChHaXRIdWJBdXRoTWFuYWdlci5VU0VSX1VSTCwgZGF0YSk7XG4gICAgXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGb3JtYXQgYXV0aGVudGljYXRpb24gaW5zdHJ1Y3Rpb25zIGZvciB1c2Vyc1xuICAgKi9cbiAgZm9ybWF0QXV0aEluc3RydWN0aW9ucyhkZXZpY2VSZXNwb25zZTogRGV2aWNlQ29kZVJlc3BvbnNlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYPCflJAgKipHaXRIdWIgQXV0aGVudGljYXRpb24gUmVxdWlyZWQqKlxuXG5UbyBhY2Nlc3MgYWxsIERvbGxob3VzZU1DUCBmZWF0dXJlcywgcGxlYXNlIGF1dGhlbnRpY2F0ZSB3aXRoIEdpdEh1YjpcblxuMS4gVmlzaXQ6ICoqJHtkZXZpY2VSZXNwb25zZS52ZXJpZmljYXRpb25fdXJpfSoqXG4yLiBFbnRlciBjb2RlOiAqKiR7ZGV2aWNlUmVzcG9uc2UudXNlcl9jb2RlfSoqXG4zLiBBdXRob3JpemUgJ0RvbGxob3VzZU1DUCBDb2xsZWN0aW9uJ1xuXG5UaGlzIHdpbGwgZ3JhbnQgYWNjZXNzIHRvOlxu4pyFIEJyb3dzZSB0aGUgcHVibGljIGNvbGxlY3Rpb25cbuKchSBJbnN0YWxsIGNvbW11bml0eSBjb250ZW50ICBcbuKchSBTdWJtaXQgeW91ciBvd24gY3JlYXRpb25zXG5cbkRvbid0IGhhdmUgYSBHaXRIdWIgYWNjb3VudD8gWW91J2xsIGJlIHByb21wdGVkIHRvIGNyZWF0ZSBvbmUgKGl0J3MgZnJlZSEpXG5cbuKPse+4jyBUaGlzIGNvZGUgZXhwaXJlcyBpbiAke01hdGguZmxvb3IoZGV2aWNlUmVzcG9uc2UuZXhwaXJlc19pbiAvIDYwKX0gbWludXRlcy5gO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgdXNlciBuZWVkcyB0byBhdXRoZW50aWNhdGUgZm9yIGEgc3BlY2lmaWMgYWN0aW9uXG4gICAqL1xuICBuZWVkc0F1dGhGb3JBY3Rpb24oYWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBhdXRoUmVxdWlyZWRBY3Rpb25zID0gWydzdWJtaXQnLCAnY3JlYXRlX3ByJywgJ21hbmFnZV9jb250ZW50J107XG4gICAgcmV0dXJuIGF1dGhSZXF1aXJlZEFjdGlvbnMuaW5jbHVkZXMoYWN0aW9uLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIFxuICAvKipcbiAgICogV2FpdCB3aXRoIGFib3J0IHNpZ25hbCBzdXBwb3J0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRXaXRoQWJvcnQobXM6IG51bWJlciwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG4gICAgICBcbiAgICAgIC8vIExpc3RlbiBmb3IgYWJvcnQgc2lnbmFsXG4gICAgICBjb25zdCBhYm9ydEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignV2FpdCBhYm9ydGVkJykpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRIYW5kbGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIENsZWFuIHVwIGFmdGVyIHRpbWVvdXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgfSwgbXMpO1xuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYW4gdXAgYW55IGFjdGl2ZSBvcGVyYXRpb25zIChjYWxsZWQgb24gc2VydmVyIHNodXRkb3duKVxuICAgKi9cbiAgYXN5bmMgY2xlYW51cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBYm9ydCBhbnkgYWN0aXZlIHBvbGxpbmdcbiAgICBpZiAodGhpcy5hY3RpdmVQb2xsaW5nKSB7XG4gICAgICB0aGlzLmFjdGl2ZVBvbGxpbmcuYWJvcnQoKTtcbiAgICAgIHRoaXMuYWN0aXZlUG9sbGluZyA9IG51bGw7XG4gICAgICBcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX0NBQ0hFX0NMRUFSRUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhNYW5hZ2VyLmNsZWFudXAnLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIGF1dGggbWFuYWdlciBjbGVhbmVkIHVwIG9uIHNodXRkb3duJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBoYWRBY3RpdmVQb2xsaW5nOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbygnR2l0SHViIGF1dGhlbnRpY2F0aW9uIHBvbGxpbmcgY2FuY2VsbGVkIGR1ZSB0byBzaHV0ZG93bicpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDbGVhciBBUEkgY2FjaGVcbiAgICB0aGlzLmFwaUNhY2hlLmNsZWFyKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlIGJhc2VkIG9uIEhUVFAgc3RhdHVzIGNvZGVcbiAgICogQXZvaWRzIGV4cG9zaW5nIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiB3aGlsZSBwcm92aWRpbmcgaGVscGZ1bCBndWlkYW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFcnJvck1lc3NhZ2VGb3JTdGF0dXMoc3RhdHVzOiBudW1iZXIsIG9wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSA0MDA6XG4gICAgICAgIHJldHVybiBgSW52YWxpZCByZXF1ZXN0IHRvIEdpdEh1Yi4gUGxlYXNlIGVuc3VyZSB0aGUgT0F1dGggYXBwIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuYDtcbiAgICAgIGNhc2UgNDAxOlxuICAgICAgICByZXR1cm4gYEdpdEh1YiBPQXV0aCBpcyBub3QgY29uZmlndXJlZC4gUGxlYXNlIHJlcG9ydCB0aGlzIGlzc3VlIGF0OiBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXIvaXNzdWVzYDtcbiAgICAgIGNhc2UgNDAzOlxuICAgICAgICByZXR1cm4gYEFjY2VzcyBkZW5pZWQgYnkgR2l0SHViLiBUaGUgT0F1dGggYXBwIG1heSBsYWNrIHJlcXVpcmVkIHBlcm1pc3Npb25zLmA7XG4gICAgICBjYXNlIDQwNDpcbiAgICAgICAgcmV0dXJuIGBHaXRIdWIgc2VydmljZSBub3QgZm91bmQuIFRoaXMgbWF5IGluZGljYXRlIGFuIEFQSSBjaGFuZ2UuYDtcbiAgICAgIGNhc2UgNDIyOlxuICAgICAgICByZXR1cm4gYEludmFsaWQgcGFyYW1ldGVycyBzZW50IHRvIEdpdEh1Yi4gUGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbi5gO1xuICAgICAgY2FzZSA0Mjk6XG4gICAgICAgIHJldHVybiBgVG9vIG1hbnkgcmVxdWVzdHMgdG8gR2l0SHViLiBQbGVhc2Ugd2FpdCBhIG1vbWVudCBhbmQgdHJ5IGFnYWluLmA7XG4gICAgICBjYXNlIDUwMDpcbiAgICAgIGNhc2UgNTAyOlxuICAgICAgY2FzZSA1MDM6XG4gICAgICBjYXNlIDUwNDpcbiAgICAgICAgcmV0dXJuIGBHaXRIdWIgc2VydmljZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4gUGxlYXNlIHRyeSBhZ2FpbiBpbiBhIGZldyBtb21lbnRzLmA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBMb2cgdGhlIGFjdHVhbCBzdGF0dXMgZm9yIGRlYnVnZ2luZywgYnV0IGRvbid0IGV4cG9zZSBpdCB0byB1c2Vyc1xuICAgICAgICBsb2dnZXIuZGVidWcoYFVuZXhwZWN0ZWQgc3RhdHVzIGNvZGUgZHVyaW5nICR7b3BlcmF0aW9ufWAsIHsgc3RhdHVzIH0pO1xuICAgICAgICByZXR1cm4gYEZhaWxlZCB0byBjb21wbGV0ZSAke29wZXJhdGlvbn0uIFBsZWFzZSBjaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi5gO1xuICAgIH1cbiAgfVxufSJdfQ==
|
|
565
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2l0SHViQXV0aE1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXV0aC9HaXRIdWJBdXRoTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQXdCM0Q7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUM1Qjs7Ozs7OztPQU9HO0lBQ0ssTUFBTSxDQUFVLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO0lBRW5FOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXO1FBQzdCLGdFQUFnRTtRQUNoRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDO1FBQzNELElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFFRCwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDO1lBQ0gsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xELE1BQU0sYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pELElBQUksY0FBYyxFQUFFLENBQUM7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WUFDakYsS0FBSyxHQUFHO2dCQUNOLE9BQU8sNERBQTRELENBQUM7WUFDdEUsS0FBSyxHQUFHO2dCQUNOLE9BQU8scUVBQXFFLENBQUM7WUFDL0UsS0FBSyxHQUFHO2dCQUNOLE9BQU8sa0VBQWtFLENBQUM7WUFDNUUsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLEdBQUcsQ0FBQztZQUNULEtBQUssR0FBRyxDQUFDO1lBQ1QsS0FBSyxHQUFHO2dCQUNOLE9BQU8sNEVBQTRFLENBQUM7WUFDdEY7Z0JBQ0Usb0VBQW9FO2dCQUNwRSxNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQ3ZFLE9BQU8sc0JBQXNCLFNBQVMsd0RBQXdELENBQUM7UUFDbkcsQ0FBQztJQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdpdEh1YiBhdXRoZW50aWNhdGlvbiBtYW5hZ2VyIHVzaW5nIE9BdXRoIGRldmljZSBmbG93XG4gKiBIYW5kbGVzIGF1dGhlbnRpY2F0aW9uIGZvciBNQ1Agc2VydmVycyB3aXRob3V0IHJlcXVpcmluZyBjbGllbnQgc2VjcmV0c1xuICovXG5cbmltcG9ydCB7IFRva2VuTWFuYWdlciB9IGZyb20gJy4uL3NlY3VyaXR5L3Rva2VuTWFuYWdlci5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgQVBJQ2FjaGUgfSBmcm9tICcuLi9jYWNoZS9BUElDYWNoZS5qcyc7XG5pbXBvcnQgeyBVbmljb2RlVmFsaWRhdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvdmFsaWRhdG9ycy91bmljb2RlVmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyaXR5TW9uaXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyaXR5TW9uaXRvci5qcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuLi91dGlscy9FcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHsgQ29uZmlnTWFuYWdlciB9IGZyb20gJy4uL2NvbmZpZy9Db25maWdNYW5hZ2VyLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBEZXZpY2VDb2RlUmVzcG9uc2Uge1xuICBkZXZpY2VfY29kZTogc3RyaW5nO1xuICB1c2VyX2NvZGU6IHN0cmluZztcbiAgdmVyaWZpY2F0aW9uX3VyaTogc3RyaW5nO1xuICBleHBpcmVzX2luOiBudW1iZXI7XG4gIGludGVydmFsOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXNwb25zZSB7XG4gIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICB0b2tlbl90eXBlOiBzdHJpbmc7XG4gIHNjb3BlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFN0YXR1cyB7XG4gIGlzQXV0aGVudGljYXRlZDogYm9vbGVhbjtcbiAgaGFzVG9rZW46IGJvb2xlYW47XG4gIHVzZXJuYW1lPzogc3RyaW5nO1xuICBzY29wZXM/OiBzdHJpbmdbXTtcbiAgZXhwaXJlc0F0PzogRGF0ZTtcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIEdpdEh1YiBhdXRoZW50aWNhdGlvbiB1c2luZyB0aGUgT0F1dGggZGV2aWNlIGZsb3dcbiAqIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIGFwcHJvYWNoIGZvciBDTEkvZGVza3RvcCBhcHBsaWNhdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIEdpdEh1YkF1dGhNYW5hZ2VyIHtcbiAgLyoqXG4gICAqIERvbGxob3VzZU1DUCdzIG9mZmljaWFsIE9BdXRoIEFwcCBDbGllbnQgSURcbiAgICogVGhpcyBpcyBQVUJMSUMgaW5mb3JtYXRpb24gLSBPQXV0aCBDbGllbnQgSURzIGFyZSBtZWFudCB0byBiZSB2aXNpYmxlLlxuICAgKiBPbmx5IENsaWVudCBTZWNyZXRzIGFyZSBwcml2YXRlIChkZXZpY2UgZmxvdyBkb2Vzbid0IHVzZSBzZWNyZXRzKS5cbiAgICogXG4gICAqIFRoaXMgQ2xpZW50IElEIGVuYWJsZXMgdGhlIEdpdEh1YiBkZXZpY2UgZmxvdyBhdXRoZW50aWNhdGlvblxuICAgKiBhbGxvd2luZyB1c2VycyB0byBhdXRoZW50aWNhdGUgd2l0aCBhbiA4LWNoYXJhY3RlciBjb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9DTElFTlRfSUQgPSAnT3YyM2xpOWd5TlpQNm05YUoyRVAnO1xuICBcbiAgLyoqXG4gICAqIEdldCB0aGUgQ0xJRU5UX0lEIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGUsIENvbmZpZ01hbmFnZXIsIG9yIGRlZmF1bHRcbiAgICogUHJpb3JpdHk6IEVudmlyb25tZW50IHZhcmlhYmxlID4gQ29uZmlnTWFuYWdlciA+IERlZmF1bHQgQ2xpZW50IElEXG4gICAqIFxuICAgKiBAcmV0dXJucyBUaGUgT0F1dGggQ2xpZW50IElEIHRvIHVzZSBmb3IgYXV0aGVudGljYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0Q2xpZW50SWQoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgLy8gQ2hlY2sgZW52aXJvbm1lbnQgdmFyaWFibGUgZmlyc3QgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgIGNvbnN0IGVudkNsaWVudElkID0gcHJvY2Vzcy5lbnYuRE9MTEhPVVNFX0dJVEhVQl9DTElFTlRfSUQ7XG4gICAgaWYgKGVudkNsaWVudElkKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1VzaW5nIE9BdXRoIENsaWVudCBJRCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlJyk7XG4gICAgICByZXR1cm4gZW52Q2xpZW50SWQ7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgQ29uZmlnTWFuYWdlciBmb3Igc3RvcmVkIGNvbmZpZ3VyYXRpb25cbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnTWFuYWdlciA9IENvbmZpZ01hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIuaW5pdGlhbGl6ZSgpO1xuICAgICAgY29uc3QgY29uZmlnQ2xpZW50SWQgPSBjb25maWdNYW5hZ2VyLmdldEdpdEh1YkNsaWVudElkKCk7XG4gICAgICBpZiAoY29uZmlnQ2xpZW50SWQpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdVc2luZyBPQXV0aCBDbGllbnQgSUQgZnJvbSBjb25maWcnKTtcbiAgICAgICAgcmV0dXJuIGNvbmZpZ0NsaWVudElkO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ05vIE9BdXRoIENsaWVudCBJRCBpbiBjb25maWcnLCB7IGVycm9yIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBVc2UgZGVmYXVsdCBEb2xsaG91c2VNQ1AgT0F1dGggQXBwIENsaWVudCBJRFxuICAgIC8vIFRoaXMgZW5hYmxlcyBcImp1c3Qgd29ya3NcIiBleHBlcmllbmNlIGZvciBOUE0gaW5zdGFsbHNcbiAgICBsb2dnZXIuZGVidWcoJ1VzaW5nIGRlZmF1bHQgRG9sbGhvdXNlTUNQIE9BdXRoIENsaWVudCBJRCcpO1xuICAgIHJldHVybiBHaXRIdWJBdXRoTWFuYWdlci5ERUZBVUxUX0NMSUVOVF9JRDtcbiAgfVxuICBcbiAgLy8gR2l0SHViIE9BdXRoIGVuZHBvaW50c1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERVZJQ0VfQ09ERV9VUkwgPSAnaHR0cHM6Ly9naXRodWIuY29tL2xvZ2luL2RldmljZS9jb2RlJztcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVE9LRU5fVVJMID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aC9hY2Nlc3NfdG9rZW4nO1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBVU0VSX1VSTCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3VzZXInO1xuICBcbiAgLy8gUG9sbGluZyBjb25maWd1cmF0aW9uXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUE9MTF9JTlRFUlZBTCA9IDUwMDA7IC8vIDUgc2Vjb25kc1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNQVhfUE9MTF9BVFRFTVBUUyA9IDE4MDsgLy8gMTUgbWludXRlcyB0b3RhbFxuICBcbiAgcHJpdmF0ZSBhcGlDYWNoZTogQVBJQ2FjaGU7XG4gIHByaXZhdGUgYWN0aXZlUG9sbGluZzogQWJvcnRDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG4gIFxuICBjb25zdHJ1Y3RvcihhcGlDYWNoZTogQVBJQ2FjaGUpIHtcbiAgICB0aGlzLmFwaUNhY2hlID0gYXBpQ2FjaGU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgbmV0d29yayByZXF1ZXN0IHdpdGggcmV0cnkgbG9naWNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hXaXRoUmV0cnkoXG4gICAgdXJsOiBzdHJpbmcsIFxuICAgIG9wdGlvbnM6IFJlcXVlc3RJbml0LCBcbiAgICBtYXhSZXRyaWVzOiBudW1iZXIgPSAzLFxuICAgIHJldHJ5RGVsYXk6IG51bWJlciA9IDEwMDBcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGxldCBsYXN0RXJyb3I6IEVycm9yIHwgbnVsbCA9IG51bGw7XG4gICAgXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4UmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0dpdEh1YkF1dGhNYW5hZ2VyLmZldGNoV2l0aFJldHJ5JywgZXJyb3IsIHsgdXJsLCBhdHRlbXB0IH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3IgdGhhdCBzaG91bGQgYmUgcmV0cmllZFxuICAgICAgICBjb25zdCBpc05ldHdvcmtFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgKFxuICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VDT05OUkVGVVNFRCcpIHx8XG4gICAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRVRJTUVET1VUJykgfHxcbiAgICAgICAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFTk9URk9VTkQnKSB8fFxuICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ25ldHdvcmsnKVxuICAgICAgICApO1xuICAgICAgICBcbiAgICAgICAgaWYgKGlzTmV0d29ya0Vycm9yICYmIGF0dGVtcHQgPCBtYXhSZXRyaWVzKSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBOZXR3b3JrIHJlcXVlc3QgZmFpbGVkLCByZXRyeWluZyAoJHthdHRlbXB0fS8ke21heFJldHJpZXN9KWAsIHtcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgbmV4dFJldHJ5SW46IHJldHJ5RGVsYXkgKiBhdHRlbXB0XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgXG4gICAgICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCByZXRyeURlbGF5ICogYXR0ZW1wdCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vdCBhIG5ldHdvcmsgZXJyb3Igb3IgbGFzdCBhdHRlbXB0LCB0aHJvdyBpbW1lZGlhdGVseVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRocm93IGxhc3RFcnJvciB8fCBuZXcgRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQgYWZ0ZXIgYWxsIHJldHJpZXMnKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENoZWNrIGN1cnJlbnQgYXV0aGVudGljYXRpb24gc3RhdHVzXG4gICAqL1xuICBhc3luYyBnZXRBdXRoU3RhdHVzKCk6IFByb21pc2U8QXV0aFN0YXR1cz4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5NYW5hZ2VyLmdldEdpdEh1YlRva2VuQXN5bmMoKTtcbiAgICBcbiAgICBpZiAoIXRva2VuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICBoYXNUb2tlbjogZmFsc2VcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gZ2V0IHVzZXIgaW5mbyB0byB2YWxpZGF0ZSB0b2tlblxuICAgICAgY29uc3QgdXNlckluZm8gPSBhd2FpdCB0aGlzLmZldGNoVXNlckluZm8odG9rZW4pO1xuICAgICAgXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IHRydWUsXG4gICAgICAgIGhhc1Rva2VuOiB0cnVlLFxuICAgICAgICB1c2VybmFtZTogdXNlckluZm8ubG9naW4sXG4gICAgICAgIHNjb3BlczogdXNlckluZm8uc2NvcGVzXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBUb2tlbiBtaWdodCBiZSBpbnZhbGlkIG9yIGV4cGlyZWRcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignR2l0SHViQXV0aE1hbmFnZXIuY2hlY2tBdXRoU3RhdHVzJywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgICAgICAgaGFzVG9rZW46IHRydWUgLy8gSGFzIHRva2VuIGJ1dCBpdCdzIGludmFsaWRcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogSW5pdGlhdGUgdGhlIGRldmljZSBmbG93IGF1dGhlbnRpY2F0aW9uIHByb2Nlc3NcbiAgICovXG4gIGFzeW5jIGluaXRpYXRlRGV2aWNlRmxvdygpOiBQcm9taXNlPERldmljZUNvZGVSZXNwb25zZT4ge1xuICAgIGNvbnN0IGNsaWVudElkID0gYXdhaXQgR2l0SHViQXV0aE1hbmFnZXIuZ2V0Q2xpZW50SWQoKTtcbiAgICAvLyBnZXRDbGllbnRJZCgpIGFsd2F5cyByZXR1cm5zIGEgdmFsdWUgKGVudiwgY29uZmlnLCBvciBkZWZhdWx0KVxuICAgIFxuICAgIC8vIExvZyB0aGUgT0F1dGggZmxvdyBzdGVwIGZvciBkZWJ1Z2dpbmdcbiAgICBsb2dnZXIuZGVidWcoJ09BVVRIX1NURVBfMTogR2V0dGluZyBjbGllbnQgSUQnLCB7IGNsaWVudElkOiBjbGllbnRJZD8uc3Vic3RyaW5nKDAsIDgpICsgJy4uLicgfSk7XG4gICAgXG4gICAgaWYgKCFjbGllbnRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPQVVUSF9OT19DTElFTlRfSUQ6IE5vIE9BdXRoIGNsaWVudCBJRCBjb25maWd1cmVkLiBTZXQgRE9MTEhPVVNFX0dJVEhVQl9DTElFTlRfSUQgZW52aXJvbm1lbnQgdmFyaWFibGUuJyk7XG4gICAgfVxuICAgIFxuICAgIGxvZ2dlci5kZWJ1ZygnT0FVVEhfU1RFUF8yOiBJbml0aWF0aW5nIGRldmljZSBmbG93JywgeyB1cmw6IEdpdEh1YkF1dGhNYW5hZ2VyLkRFVklDRV9DT0RFX1VSTCB9KTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoV2l0aFJldHJ5KEdpdEh1YkF1dGhNYW5hZ2VyLkRFVklDRV9DT0RFX1VSTCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgICBzY29wZTogJ3B1YmxpY19yZXBvIHJlYWQ6dXNlcidcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBsb2dnZXIuZGVidWcoJ09BVVRIX1NURVBfMzogR2l0SHViIHJlc3BvbnNlJywgeyBcbiAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgJ3gtZ2l0aHViLXJlcXVlc3QtaWQnOiByZXNwb25zZS5oZWFkZXJzLmdldCgneC1naXRodWItcmVxdWVzdC1pZCcpLFxuICAgICAgICAgICd4LXJhdGVsaW1pdC1yZW1haW5pbmcnOiByZXNwb25zZS5oZWFkZXJzLmdldCgneC1yYXRlbGltaXQtcmVtYWluaW5nJylcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0dpdEh1YiBPQXV0aCBlbmRwb2ludCBlcnJvcicsIHsgXG4gICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgc3RhdHVzVGV4dDogcmVzcG9uc2Uuc3RhdHVzVGV4dCxcbiAgICAgICAgICByZXNwb25zZUJvZHk6IHJlc3BvbnNlVGV4dCxcbiAgICAgICAgICBjbGllbnRJZDogY2xpZW50SWQ/LnN1YnN0cmluZygwLCA4KSArICcuLi4nXG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gUGFyc2UgR2l0SHViJ3MgZXJyb3IgcmVzcG9uc2UgZm9yIHNwZWNpZmljIGVycm9yIGNvZGVzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JEYXRhID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChlcnJvckRhdGEuZXJyb3IgPT09ICd1bmF1dGhvcml6ZWRfY2xpZW50Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPQVVUSF9DTElFTlRfVU5BVVRIT1JJWkVEOiBPQXV0aCBhcHAgJyR7Y2xpZW50SWQ/LnN1YnN0cmluZygwLCA4KX0uLi4nIGlzIG5vdCBhdXRob3JpemVkIGZvciBkZXZpY2UgZmxvdy4gVGhlIGFwcCBtYXkgbmVlZCByZWNvbmZpZ3VyYXRpb24uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGlmIChlcnJvckRhdGEuZXJyb3IgPT09ICdpbnZhbGlkX2NsaWVudCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT0FVVEhfQ0xJRU5UX0lOVkFMSUQ6IEdpdEh1YiByZWplY3RlZCBPQXV0aCBjbGllbnQgSUQgJyR7Y2xpZW50SWQ/LnN1YnN0cmluZygwLCA4KX0uLi4nLiBUaGUgYXBwIG1heSBub3QgZXhpc3Qgb3IgYmUgZGlzYWJsZWQuYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGlmIChlcnJvckRhdGEuZXJyb3JfZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT0FVVEhfQVBJX0VSUk9SOiAke2Vycm9yRGF0YS5lcnJvcl9kZXNjcmlwdGlvbn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiB3ZSBjYW4ndCBwYXJzZSB0aGUgZXJyb3IsIHByb3ZpZGUgSFRUUCBzdGF0dXMgc3BlY2lmaWMgZXJyb3JcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT0FVVEhfQ0xJRU5UX0lOVkFMSUQ6IEdpdEh1YiByZWplY3RlZCBPQXV0aCBjbGllbnQgSUQgJyR7Y2xpZW50SWQ/LnN1YnN0cmluZygwLCA4KX0uLi4nLiBUaGUgYXBwIG1heSBub3QgZXhpc3Qgb3IgYmUgZGlzYWJsZWQuYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPQVVUSF9ERVZJQ0VfRkxPV19ESVNBQkxFRDogVGhpcyBPQXV0aCBhcHAgZG9lc24ndCBoYXZlIGRldmljZSBmbG93IGVuYWJsZWQuIENvbnRhY3QgYWRtaW5pc3RyYXRvci5gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9BVVRIX1JBVEVfTElNSVRFRDogVG9vIG1hbnkgYXV0aGVudGljYXRpb24gYXR0ZW1wdHMuIFBsZWFzZSB3YWl0IGJlZm9yZSB0cnlpbmcgYWdhaW4uYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgT0FVVEhfSFRUUF8ke3Jlc3BvbnNlLnN0YXR1c306IEdpdEh1YiBPQXV0aCBmYWlsZWQgLSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIFxuICAgICAgLy8gVmFsaWRhdGUgcmVzcG9uc2VcbiAgICAgIGlmICghZGF0YS5kZXZpY2VfY29kZSB8fCAhZGF0YS51c2VyX2NvZGUgfHwgIWRhdGEudmVyaWZpY2F0aW9uX3VyaSkge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0ludmFsaWQgZGV2aWNlIGZsb3cgcmVzcG9uc2Ugc3RydWN0dXJlJywgeyBcbiAgICAgICAgICBoYXNEZXZpY2VDb2RlOiAhIWRhdGEuZGV2aWNlX2NvZGUsXG4gICAgICAgICAgaGFzVXNlckNvZGU6ICEhZGF0YS51c2VyX2NvZGUsXG4gICAgICAgICAgaGFzVmVyaWZpY2F0aW9uVXJpOiAhIWRhdGEudmVyaWZpY2F0aW9uX3VyaVxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPQVVUSF9JTlZBTElEX1JFU1BPTlNFOiBJbnZhbGlkIGRldmljZSBmbG93IHJlc3BvbnNlIGZyb20gR2l0SHViIC0gbWlzc2luZyByZXF1aXJlZCBmaWVsZHMnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gTG9nIHNlY3VyaXR5IGV2ZW50IGZvciBhdWRpdCB0cmFpbFxuICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICB0eXBlOiAnVE9LRU5fVkFMSURBVElPTl9TVUNDRVNTJyxcbiAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoTWFuYWdlci5pbml0aWF0ZURldmljZUZsb3cnLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIE9BdXRoIGRldmljZSBmbG93IGluaXRpYXRlZCBzdWNjZXNzZnVsbHknLFxuICAgICAgICBtZXRhZGF0YToge1xuICAgICAgICAgIHVzZXJDb2RlOiBkYXRhLnVzZXJfY29kZSxcbiAgICAgICAgICBleHBpcmVzSW46IGRhdGEuZXhwaXJlc19pbixcbiAgICAgICAgICBpbnRlcnZhbDogZGF0YS5pbnRlcnZhbFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgcmV0dXJuIGRhdGEgYXMgRGV2aWNlQ29kZVJlc3BvbnNlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0dpdEh1YkF1dGhNYW5hZ2VyLmluaXRpYXRlRGV2aWNlRmxvdycsIGVycm9yKTtcbiAgICAgIFxuICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhIG5ldHdvcmsgZXJyb3JcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIC8vIFJlLXRocm93IGlmIGl0J3MgYWxyZWFkeSBhIHByb3Blcmx5IGZvcm1hdHRlZCBlcnJvciB3aXRoIGNvZGVcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnT0FVVEhfJykpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gRm9ybWF0IG5ldHdvcmsgZXJyb3JzXG4gICAgICAgIGlmIChlcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdFQ09OTlJFRlVTRUQnKSB8fCBcbiAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VUSU1FRE9VVCcpIHx8IFxuICAgICAgICAgICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRU5PVEZPVU5EJykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9BVVRIX05FVFdPUktfRVJST1I6IFVuYWJsZSB0byByZWFjaCBHaXRIdWIgc2VydmVycyAoaHR0cHM6Ly9naXRodWIuY29tL2xvZ2luL2RldmljZS9jb2RlKS4gQ2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uLmApO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbmV0d29yaycpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPQVVUSF9ORVRXT1JLX0VSUk9SOiBOZXR3b3JrIGVycm9yIHdoaWxlIGNvbm5lY3RpbmcgdG8gR2l0SHViLiBQbGVhc2UgY2hlY2sgeW91ciBpbnRlcm5ldCBjb25uZWN0aW9uLmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEdlbmVyaWMgZmFsbGJhY2sgKHNob3VsZCByYXJlbHkgaGFwcGVuKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPQVVUSF9VTktOT1dOX0VSUk9SOiBGYWlsZWQgdG8gc3RhcnQgR2l0SHViIGF1dGhlbnRpY2F0aW9uIC0gJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQb2xsIGZvciB0b2tlbiBhZnRlciB1c2VyIGhhcyBhdXRob3JpemVkIHRoZSBkZXZpY2VcbiAgICovXG4gIGFzeW5jIHBvbGxGb3JUb2tlbihkZXZpY2VDb2RlOiBzdHJpbmcsIGludGVydmFsOiBudW1iZXIgPSBHaXRIdWJBdXRoTWFuYWdlci5ERUZBVUxUX1BPTExfSU5URVJWQUwpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgICAvLyBDcmVhdGUgbmV3IGFib3J0IGNvbnRyb2xsZXIgZm9yIHRoaXMgcG9sbGluZyBzZXNzaW9uXG4gICAgdGhpcy5hY3RpdmVQb2xsaW5nID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuYWN0aXZlUG9sbGluZy5zaWduYWw7XG4gICAgXG4gICAgbGV0IGF0dGVtcHRzID0gMDtcbiAgICBcbiAgICB0cnkge1xuICAgICAgd2hpbGUgKGF0dGVtcHRzIDwgR2l0SHViQXV0aE1hbmFnZXIuTUFYX1BPTExfQVRURU1QVFMpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgcG9sbGluZyB3YXMgYWJvcnRlZFxuICAgICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIHBvbGxpbmcgd2FzIGNhbmNlbGxlZCcpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBhdHRlbXB0cysrO1xuICAgICAgICBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChHaXRIdWJBdXRoTWFuYWdlci5UT0tFTl9VUkwsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgY2xpZW50X2lkOiBhd2FpdCBHaXRIdWJBdXRoTWFuYWdlci5nZXRDbGllbnRJZCgpIHx8ICcnLFxuICAgICAgICAgICAgZGV2aWNlX2NvZGU6IGRldmljZUNvZGUsXG4gICAgICAgICAgICBncmFudF90eXBlOiAndXJuOmlldGY6cGFyYW1zOm9hdXRoOmdyYW50LXR5cGU6ZGV2aWNlX2NvZGUnXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgZm9yIHZhcmlvdXMgcmVzcG9uc2Ugc3RhdGVzXG4gICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgc3dpdGNoIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICBjYXNlICdhdXRob3JpemF0aW9uX3BlbmRpbmcnOlxuICAgICAgICAgICAgICAvLyBVc2VyIGhhc24ndCBhdXRob3JpemVkIHlldCwga2VlcCBwb2xsaW5nXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ3Nsb3dfZG93bic6XG4gICAgICAgICAgICAgIC8vIEluY3JlYXNlIHBvbGxpbmcgaW50ZXJ2YWxcbiAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBNYXRoLm1pbihpbnRlcnZhbCAqIDEuNSwgMzAwMDApOyAvLyBNYXggMzAgc2Vjb25kc1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1Nsb3dpbmcgZG93biBwb2xsaW5nIGludGVydmFsJywgeyBuZXdJbnRlcnZhbDogaW50ZXJ2YWwgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ2V4cGlyZWRfdG9rZW4nOlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBhdXRob3JpemF0aW9uIGNvZGUgaGFzIGV4cGlyZWQuIFBsZWFzZSBzdGFydCBvdmVyLicpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ2FjY2Vzc19kZW5pZWQnOlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGhvcml6YXRpb24gd2FzIGRlbmllZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAvLyBMb2cgdGhlIGFjdHVhbCBlcnJvciBmb3IgZGVidWdnaW5nXG4gICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnT0F1dGggZGV2aWNlIGZsb3cgZXJyb3InLCB7IFxuICAgICAgICAgICAgICAgIGVycm9yOiBkYXRhLmVycm9yLCBcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS5lcnJvcl9kZXNjcmlwdGlvbiBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gZmFpbGVkLiBQbGVhc2UgdHJ5IHN0YXJ0aW5nIHRoZSBwcm9jZXNzIGFnYWluLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgIC8vIFN1Y2Nlc3MhXG4gICAgICAgICAgcmV0dXJuIGRhdGEgYXMgVG9rZW5SZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gV2FpdCBiZWZvcmUgbmV4dCBwb2xsXG4gICAgICAgIC8vIFdhaXQgZm9yIGludGVydmFsIHdpdGggYWJvcnQgc3VwcG9ydFxuICAgICAgICBhd2FpdCB0aGlzLndhaXRXaXRoQWJvcnQoaW50ZXJ2YWwsIHNpZ25hbCk7XG4gICAgICAgIFxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTmV0d29yayBlcnJvcnMgc2hvdWxkbid0IHN0b3AgcG9sbGluZ1xuICAgICAgICBFcnJvckhhbmRsZXIubG9nRXJyb3IoJ0dpdEh1YkF1dGhNYW5hZ2VyLnBvbGxGb3JUb2tlbicsIGVycm9yLCB7IGF0dGVtcHQ6IGF0dGVtcHRzIH0pO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRXaXRoQWJvcnQoaW50ZXJ2YWwsIHNpZ25hbCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHRocm93IG5ldyBFcnJvcignQXV0aGVudGljYXRpb24gdGltZWQgb3V0LiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBDbGVhciBhY3RpdmUgcG9sbGluZyByZWZlcmVuY2VcbiAgICAgIHRoaXMuYWN0aXZlUG9sbGluZyA9IG51bGw7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogQ29tcGxldGUgdGhlIGF1dGhlbnRpY2F0aW9uIGZsb3cgYW5kIHN0b3JlIHRoZSB0b2tlblxuICAgKi9cbiAgYXN5bmMgY29tcGxldGVBdXRoZW50aWNhdGlvbih0b2tlblJlc3BvbnNlOiBUb2tlblJlc3BvbnNlKTogUHJvbWlzZTxBdXRoU3RhdHVzPiB7XG4gICAgLy8gU3RvcmUgdG9rZW4gc2VjdXJlbHlcbiAgICBhd2FpdCB0aGlzLnN0b3JlVG9rZW4odG9rZW5SZXNwb25zZS5hY2Nlc3NfdG9rZW4pO1xuICAgIFxuICAgIC8vIEdldCB1c2VyIGluZm9cbiAgICBjb25zdCB1c2VySW5mbyA9IGF3YWl0IHRoaXMuZmV0Y2hVc2VySW5mbyh0b2tlblJlc3BvbnNlLmFjY2Vzc190b2tlbik7XG4gICAgXG4gICAgLy8gTG9nIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24gY29tcGxldGlvblxuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdUT0tFTl9WQUxJREFUSU9OX1NVQ0NFU1MnLFxuICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgc291cmNlOiAnR2l0SHViQXV0aE1hbmFnZXIuY29tcGxldGVBdXRoZW50aWNhdGlvbicsXG4gICAgICBkZXRhaWxzOiAnR2l0SHViIE9BdXRoIGRldmljZSBmbG93IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgdXNlcm5hbWU6IHVzZXJJbmZvLmxvZ2luLFxuICAgICAgICBzY29wZXM6IHRva2VuUmVzcG9uc2Uuc2NvcGUuc3BsaXQoJyAnKSxcbiAgICAgICAgdG9rZW5UeXBlOiBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5UeXBlKHRva2VuUmVzcG9uc2UuYWNjZXNzX3Rva2VuKVxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBpc0F1dGhlbnRpY2F0ZWQ6IHRydWUsXG4gICAgICBoYXNUb2tlbjogdHJ1ZSxcbiAgICAgIHVzZXJuYW1lOiB1c2VySW5mby5sb2dpbixcbiAgICAgIHNjb3BlczogdG9rZW5SZXNwb25zZS5zY29wZS5zcGxpdCgnICcpXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENsZWFyIHN0b3JlZCBhdXRoZW50aWNhdGlvbiBhbmQgcmV2b2tlIHRva2VuXG4gICAqL1xuICBhc3luYyBjbGVhckF1dGhlbnRpY2F0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgdGhlIHRva2VuIGJlZm9yZSBjbGVhcmluZyBpdFxuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1hbmFnZXIuZ2V0R2l0SHViVG9rZW5Bc3luYygpO1xuICAgICAgXG4gICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgLy8gQXR0ZW1wdCB0byByZXZva2UgdGhlIHRva2VuIG9uIEdpdEh1YlxuICAgICAgICAvLyBOb3RlOiBHaXRIdWIgT0F1dGggdG9rZW5zIGRvbid0IGhhdmUgYSByZXZvY2F0aW9uIGVuZHBvaW50IGZvciBkZXZpY2UgZmxvdyB0b2tlbnNcbiAgICAgICAgLy8gQnV0IHdlJ2xsIGNsZWFyIHRoZSBjYWNoZSBhbmQgcmVtb3ZlIGZyb20gc3RvcmFnZVxuICAgICAgICBcbiAgICAgICAgLy8gQ2xlYXIgY2FjaGVkIHVzZXIgaW5mb1xuICAgICAgICB0aGlzLmFwaUNhY2hlLmNsZWFyKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBMb2cgc2VjdXJpdHkgZXZlbnQgZm9yIGF1ZGl0IHRyYWlsXG4gICAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgICB0eXBlOiAnVE9LRU5fQ0FDSEVfQ0xFQVJFRCcsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdMT1cnLFxuICAgICAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhNYW5hZ2VyLmNsZWFyQXV0aGVudGljYXRpb24nLFxuICAgICAgICAgIGRldGFpbHM6ICdHaXRIdWIgYXV0aGVudGljYXRpb24gY2xlYXJlZCBieSB1c2VyIHJlcXVlc3QnLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICBoYWRUb2tlbjogdHJ1ZSxcbiAgICAgICAgICAgIHRva2VuUHJlZml4OiBUb2tlbk1hbmFnZXIuZ2V0VG9rZW5QcmVmaXgodG9rZW4pXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUmVtb3ZlIGZyb20gc2VjdXJlIHN0b3JhZ2VcbiAgICAgIGF3YWl0IFRva2VuTWFuYWdlci5yZW1vdmVTdG9yZWRUb2tlbigpO1xuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbygnR2l0SHViIGF1dGhlbnRpY2F0aW9uIGNsZWFyZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIEVycm9ySGFuZGxlci5sb2dFcnJvcignR2l0SHViQXV0aE1hbmFnZXIuY2xlYXJBdXRoZW50aWNhdGlvbicsIGVycm9yKTtcbiAgICAgIHRocm93IEVycm9ySGFuZGxlci5jcmVhdGVFcnJvcignRmFpbGVkIHRvIGNsZWFyIGF1dGhlbnRpY2F0aW9uJywgRXJyb3JDYXRlZ29yeS5BVVRIX0VSUk9SLCB1bmRlZmluZWQsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTdG9yZSB0b2tlbiBzZWN1cmVseSB1c2luZyBlbmNyeXB0ZWQgZmlsZSBzdG9yYWdlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN0b3JlVG9rZW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBUb2tlbk1hbmFnZXIuc3RvcmVHaXRIdWJUb2tlbih0b2tlbik7XG4gICAgICBsb2dnZXIuaW5mbygnR2l0SHViIHRva2VuIHN0b3JlZCBzZWN1cmVseS4gWW91IGFyZSBub3cgYXV0aGVudGljYXRlZCEnKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgRXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdHaXRIdWJBdXRoTWFuYWdlci5zdG9yZVRva2VuJywgZXJyb3IpO1xuICAgICAgLy8gRmFsbGJhY2sgdG8gZW52aXJvbm1lbnQgdmFyaWFibGUgaW5zdHJ1Y3Rpb25zXG4gICAgICBsb2dnZXIuaW5mbygnRm9yIG1hbnVhbCBzZXR1cCwgeW91IGNhbiBzZXQgR0lUSFVCX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlLicpO1xuICAgICAgdGhyb3cgRXJyb3JIYW5kbGVyLndyYXBFcnJvcihlcnJvciwgJ0ZhaWxlZCB0byBzdG9yZSBHaXRIdWIgdG9rZW4nLCBFcnJvckNhdGVnb3J5LkFVVEhfRVJST1IpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIEZldGNoIHVzZXIgaW5mb3JtYXRpb24gZnJvbSBHaXRIdWJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hVc2VySW5mbyh0b2tlbjogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuYXBpQ2FjaGUuZ2V0KEdpdEh1YkF1dGhNYW5hZ2VyLlVTRVJfVVJMKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZmV0Y2hXaXRoUmV0cnkoR2l0SHViQXV0aE1hbmFnZXIuVVNFUl9VUkwsIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi92bmQuZ2l0aHViLnYzK2pzb24nXG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gdGhpcy5nZXRFcnJvck1lc3NhZ2VGb3JTdGF0dXMocmVzcG9uc2Uuc3RhdHVzLCAndXNlciBpbmZvcm1hdGlvbiBmZXRjaCcpO1xuICAgICAgbG9nZ2VyLmRlYnVnKCdGYWlsZWQgdG8gZmV0Y2ggdXNlciBpbmZvJywgeyBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIFxuICAgIC8vIE5vcm1hbGl6ZSB1c2VybmFtZSBhbmQgb3RoZXIgdGV4dCBmaWVsZHMgdG8gcHJldmVudCBVbmljb2RlIGF0dGFja3NcbiAgICBpZiAoZGF0YS5sb2dpbikge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGRhdGEubG9naW4pO1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgICAgIHR5cGU6ICdVTklDT0RFX1ZBTElEQVRJT05fRVJST1InLFxuICAgICAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoTWFuYWdlci5mZXRjaFVzZXJJbmZvJyxcbiAgICAgICAgICBkZXRhaWxzOiAnR2l0SHViIHVzZXJuYW1lIGNvbnRhaW5zIGludmFsaWQgVW5pY29kZScsXG4gICAgICAgICAgbWV0YWRhdGE6IHsgXG4gICAgICAgICAgICBvcmlnaW5hbExlbmd0aDogZGF0YS5sb2dpbi5sZW5ndGgsXG4gICAgICAgICAgICBkZXRlY3RlZElzc3VlczogdmFsaWRhdGlvbi5kZXRlY3RlZElzc3VlcyBcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdXNlcm5hbWUgZm9ybWF0IGZyb20gR2l0SHViJyk7XG4gICAgICB9XG4gICAgICBkYXRhLmxvZ2luID0gdmFsaWRhdGlvbi5ub3JtYWxpemVkQ29udGVudDtcbiAgICB9XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIGRpc3BsYXkgbmFtZSBpZiBwcmVzZW50XG4gICAgaWYgKGRhdGEubmFtZSkge1xuICAgICAgY29uc3QgbmFtZVZhbGlkYXRpb24gPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkYXRhLm5hbWUpO1xuICAgICAgaWYgKG5hbWVWYWxpZGF0aW9uLmlzVmFsaWQpIHtcbiAgICAgICAgZGF0YS5uYW1lID0gbmFtZVZhbGlkYXRpb24ubm9ybWFsaXplZENvbnRlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCBmYWlsIG9uIGRpc3BsYXkgbmFtZSwganVzdCByZW1vdmUgaXRcbiAgICAgICAgZGVsZXRlIGRhdGEubmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIHNjb3BlcyBmcm9tIHJlc3BvbnNlIGhlYWRlcnNcbiAgICBjb25zdCBzY29wZUhlYWRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LW9hdXRoLXNjb3BlcycpO1xuICAgIGlmIChzY29wZUhlYWRlcikge1xuICAgICAgZGF0YS5zY29wZXMgPSBzY29wZUhlYWRlci5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKTtcbiAgICB9XG4gICAgXG4gICAgLy8gTG9nIHN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24gZm9yIGF1ZGl0IHRyYWlsXG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1RPS0VOX1ZBTElEQVRJT05fU1VDQ0VTUycsXG4gICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICBzb3VyY2U6ICdHaXRIdWJBdXRoTWFuYWdlci5mZXRjaFVzZXJJbmZvJyxcbiAgICAgIGRldGFpbHM6ICdHaXRIdWIgdXNlciBhdXRoZW50aWNhdGVkIHN1Y2Nlc3NmdWxseScsXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICB1c2VybmFtZTogZGF0YS5sb2dpbixcbiAgICAgICAgaGFzRW1haWw6ICEhZGF0YS5lbWFpbCxcbiAgICAgICAgc2NvcGVzOiBkYXRhLnNjb3BlcyB8fCBbXVxuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICB0aGlzLmFwaUNhY2hlLnNldChHaXRIdWJBdXRoTWFuYWdlci5VU0VSX1VSTCwgZGF0YSk7XG4gICAgXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBGb3JtYXQgYXV0aGVudGljYXRpb24gaW5zdHJ1Y3Rpb25zIGZvciB1c2Vyc1xuICAgKi9cbiAgZm9ybWF0QXV0aEluc3RydWN0aW9ucyhkZXZpY2VSZXNwb25zZTogRGV2aWNlQ29kZVJlc3BvbnNlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYPCflJAgKipHaXRIdWIgQXV0aGVudGljYXRpb24gUmVxdWlyZWQqKlxuXG5UbyBhY2Nlc3MgYWxsIERvbGxob3VzZU1DUCBmZWF0dXJlcywgcGxlYXNlIGF1dGhlbnRpY2F0ZSB3aXRoIEdpdEh1YjpcblxuMS4gVmlzaXQ6ICoqJHtkZXZpY2VSZXNwb25zZS52ZXJpZmljYXRpb25fdXJpfSoqXG4yLiBFbnRlciBjb2RlOiAqKiR7ZGV2aWNlUmVzcG9uc2UudXNlcl9jb2RlfSoqXG4zLiBBdXRob3JpemUgJ0RvbGxob3VzZU1DUCBDb2xsZWN0aW9uJ1xuXG5UaGlzIHdpbGwgZ3JhbnQgYWNjZXNzIHRvOlxu4pyFIEJyb3dzZSB0aGUgcHVibGljIGNvbGxlY3Rpb25cbuKchSBJbnN0YWxsIGNvbW11bml0eSBjb250ZW50ICBcbuKchSBTdWJtaXQgeW91ciBvd24gY3JlYXRpb25zXG5cbkRvbid0IGhhdmUgYSBHaXRIdWIgYWNjb3VudD8gWW91J2xsIGJlIHByb21wdGVkIHRvIGNyZWF0ZSBvbmUgKGl0J3MgZnJlZSEpXG5cbuKPse+4jyBUaGlzIGNvZGUgZXhwaXJlcyBpbiAke01hdGguZmxvb3IoZGV2aWNlUmVzcG9uc2UuZXhwaXJlc19pbiAvIDYwKX0gbWludXRlcy5gO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgdXNlciBuZWVkcyB0byBhdXRoZW50aWNhdGUgZm9yIGEgc3BlY2lmaWMgYWN0aW9uXG4gICAqL1xuICBuZWVkc0F1dGhGb3JBY3Rpb24oYWN0aW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBhdXRoUmVxdWlyZWRBY3Rpb25zID0gWydzdWJtaXQnLCAnY3JlYXRlX3ByJywgJ21hbmFnZV9jb250ZW50J107XG4gICAgcmV0dXJuIGF1dGhSZXF1aXJlZEFjdGlvbnMuaW5jbHVkZXMoYWN0aW9uLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIFxuICAvKipcbiAgICogV2FpdCB3aXRoIGFib3J0IHNpZ25hbCBzdXBwb3J0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRXaXRoQWJvcnQobXM6IG51bWJlciwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG4gICAgICBcbiAgICAgIC8vIExpc3RlbiBmb3IgYWJvcnQgc2lnbmFsXG4gICAgICBjb25zdCBhYm9ydEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignV2FpdCBhYm9ydGVkJykpO1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgYWJvcnRIYW5kbGVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICBcbiAgICAgIC8vIENsZWFuIHVwIGFmdGVyIHRpbWVvdXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBhYm9ydEhhbmRsZXIpO1xuICAgICAgfSwgbXMpO1xuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2xlYW4gdXAgYW55IGFjdGl2ZSBvcGVyYXRpb25zIChjYWxsZWQgb24gc2VydmVyIHNodXRkb3duKVxuICAgKi9cbiAgYXN5bmMgY2xlYW51cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBYm9ydCBhbnkgYWN0aXZlIHBvbGxpbmdcbiAgICBpZiAodGhpcy5hY3RpdmVQb2xsaW5nKSB7XG4gICAgICB0aGlzLmFjdGl2ZVBvbGxpbmcuYWJvcnQoKTtcbiAgICAgIHRoaXMuYWN0aXZlUG9sbGluZyA9IG51bGw7XG4gICAgICBcbiAgICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgICAgdHlwZTogJ1RPS0VOX0NBQ0hFX0NMRUFSRUQnLFxuICAgICAgICBzZXZlcml0eTogJ0xPVycsXG4gICAgICAgIHNvdXJjZTogJ0dpdEh1YkF1dGhNYW5hZ2VyLmNsZWFudXAnLFxuICAgICAgICBkZXRhaWxzOiAnR2l0SHViIGF1dGggbWFuYWdlciBjbGVhbmVkIHVwIG9uIHNodXRkb3duJyxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBoYWRBY3RpdmVQb2xsaW5nOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBsb2dnZXIuaW5mbygnR2l0SHViIGF1dGhlbnRpY2F0aW9uIHBvbGxpbmcgY2FuY2VsbGVkIGR1ZSB0byBzaHV0ZG93bicpO1xuICAgIH1cbiAgICBcbiAgICAvLyBDbGVhciBBUEkgY2FjaGVcbiAgICB0aGlzLmFwaUNhY2hlLmNsZWFyKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlIGJhc2VkIG9uIEhUVFAgc3RhdHVzIGNvZGVcbiAgICogQXZvaWRzIGV4cG9zaW5nIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiB3aGlsZSBwcm92aWRpbmcgaGVscGZ1bCBndWlkYW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFcnJvck1lc3NhZ2VGb3JTdGF0dXMoc3RhdHVzOiBudW1iZXIsIG9wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSA0MDA6XG4gICAgICAgIHJldHVybiBgSW52YWxpZCByZXF1ZXN0IHRvIEdpdEh1Yi4gUGxlYXNlIGVuc3VyZSB0aGUgT0F1dGggYXBwIGlzIHByb3Blcmx5IGNvbmZpZ3VyZWQuYDtcbiAgICAgIGNhc2UgNDAxOlxuICAgICAgICByZXR1cm4gYEdpdEh1YiBPQXV0aCBpcyBub3QgY29uZmlndXJlZC4gUGxlYXNlIHJlcG9ydCB0aGlzIGlzc3VlIGF0OiBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXIvaXNzdWVzYDtcbiAgICAgIGNhc2UgNDAzOlxuICAgICAgICByZXR1cm4gYEFjY2VzcyBkZW5pZWQgYnkgR2l0SHViLiBUaGUgT0F1dGggYXBwIG1heSBsYWNrIHJlcXVpcmVkIHBlcm1pc3Npb25zLmA7XG4gICAgICBjYXNlIDQwNDpcbiAgICAgICAgcmV0dXJuIGBHaXRIdWIgc2VydmljZSBub3QgZm91bmQuIFRoaXMgbWF5IGluZGljYXRlIGFuIEFQSSBjaGFuZ2UuYDtcbiAgICAgIGNhc2UgNDIyOlxuICAgICAgICByZXR1cm4gYEludmFsaWQgcGFyYW1ldGVycyBzZW50IHRvIEdpdEh1Yi4gUGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbi5gO1xuICAgICAgY2FzZSA0Mjk6XG4gICAgICAgIHJldHVybiBgVG9vIG1hbnkgcmVxdWVzdHMgdG8gR2l0SHViLiBQbGVhc2Ugd2FpdCBhIG1vbWVudCBhbmQgdHJ5IGFnYWluLmA7XG4gICAgICBjYXNlIDUwMDpcbiAgICAgIGNhc2UgNTAyOlxuICAgICAgY2FzZSA1MDM6XG4gICAgICBjYXNlIDUwNDpcbiAgICAgICAgcmV0dXJuIGBHaXRIdWIgc2VydmljZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4gUGxlYXNlIHRyeSBhZ2FpbiBpbiBhIGZldyBtb21lbnRzLmA7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBMb2cgdGhlIGFjdHVhbCBzdGF0dXMgZm9yIGRlYnVnZ2luZywgYnV0IGRvbid0IGV4cG9zZSBpdCB0byB1c2Vyc1xuICAgICAgICBsb2dnZXIuZGVidWcoYFVuZXhwZWN0ZWQgc3RhdHVzIGNvZGUgZHVyaW5nICR7b3BlcmF0aW9ufWAsIHsgc3RhdHVzIH0pO1xuICAgICAgICByZXR1cm4gYEZhaWxlZCB0byBjb21wbGV0ZSAke29wZXJhdGlvbn0uIFBsZWFzZSBjaGVjayB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24gYW5kIHRyeSBhZ2Fpbi5gO1xuICAgIH1cbiAgfVxufSJdfQ==
|
|
@@ -1,22 +1,110 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ConfigManager -
|
|
2
|
+
* ConfigManager - Centralized configuration management for DollhouseMCP
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - YAML-based configuration file
|
|
6
|
+
* - Default values with user overrides
|
|
7
|
+
* - Migration from environment variables
|
|
8
|
+
* - Validation and type safety
|
|
9
|
+
* - Atomic updates with backup
|
|
10
|
+
* - Privacy-first defaults
|
|
11
|
+
* - OAuth client ID storage for Claude Desktop integration
|
|
7
12
|
*/
|
|
8
|
-
interface
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
export interface UserConfig {
|
|
14
|
+
username: string | null;
|
|
15
|
+
email: string | null;
|
|
16
|
+
display_name: string | null;
|
|
17
|
+
}
|
|
18
|
+
export interface GitHubPortfolioConfig {
|
|
19
|
+
repository_url: string | null;
|
|
20
|
+
repository_name: string;
|
|
21
|
+
default_branch: string;
|
|
22
|
+
auto_create: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface GitHubAuthConfig {
|
|
25
|
+
use_oauth: boolean;
|
|
26
|
+
token_source: 'environment' | 'oauth' | 'config';
|
|
27
|
+
client_id?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface GitHubConfig {
|
|
30
|
+
portfolio: GitHubPortfolioConfig;
|
|
31
|
+
auth: GitHubAuthConfig;
|
|
32
|
+
}
|
|
33
|
+
export interface SyncIndividualConfig {
|
|
34
|
+
require_confirmation: boolean;
|
|
35
|
+
show_diff_before_sync: boolean;
|
|
36
|
+
track_versions: boolean;
|
|
37
|
+
keep_history: number;
|
|
38
|
+
}
|
|
39
|
+
export interface SyncBulkConfig {
|
|
40
|
+
upload_enabled: boolean;
|
|
41
|
+
download_enabled: boolean;
|
|
42
|
+
require_preview: boolean;
|
|
43
|
+
respect_local_only: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface SyncPrivacyConfig {
|
|
46
|
+
scan_for_secrets: boolean;
|
|
47
|
+
scan_for_pii: boolean;
|
|
48
|
+
warn_on_sensitive: boolean;
|
|
49
|
+
excluded_patterns: string[];
|
|
50
|
+
}
|
|
51
|
+
export interface SyncConfig {
|
|
52
|
+
enabled: boolean;
|
|
53
|
+
individual: SyncIndividualConfig;
|
|
54
|
+
bulk: SyncBulkConfig;
|
|
55
|
+
privacy: SyncPrivacyConfig;
|
|
56
|
+
}
|
|
57
|
+
export interface CollectionConfig {
|
|
58
|
+
auto_submit: boolean;
|
|
59
|
+
require_review: boolean;
|
|
60
|
+
add_attribution: boolean;
|
|
61
|
+
}
|
|
62
|
+
export interface ElementsConfig {
|
|
63
|
+
auto_activate: {
|
|
64
|
+
personas?: string[];
|
|
65
|
+
skills?: string[];
|
|
66
|
+
templates?: string[];
|
|
67
|
+
agents?: string[];
|
|
68
|
+
memories?: string[];
|
|
69
|
+
ensembles?: string[];
|
|
12
70
|
};
|
|
13
|
-
|
|
71
|
+
default_element_dir: string;
|
|
72
|
+
}
|
|
73
|
+
export interface DisplayConfig {
|
|
74
|
+
persona_indicators: {
|
|
75
|
+
enabled: boolean;
|
|
76
|
+
style: 'full' | 'minimal' | 'compact' | 'custom';
|
|
77
|
+
include_emoji: boolean;
|
|
78
|
+
};
|
|
79
|
+
verbose_logging: boolean;
|
|
80
|
+
show_progress: boolean;
|
|
81
|
+
}
|
|
82
|
+
export interface DollhouseConfig {
|
|
83
|
+
version: string;
|
|
84
|
+
user: UserConfig;
|
|
85
|
+
github: GitHubConfig;
|
|
86
|
+
sync: SyncConfig;
|
|
87
|
+
collection: CollectionConfig;
|
|
88
|
+
elements: ElementsConfig;
|
|
89
|
+
display: DisplayConfig;
|
|
90
|
+
}
|
|
91
|
+
export interface ConfigUpdateResult {
|
|
92
|
+
success: boolean;
|
|
93
|
+
message: string;
|
|
94
|
+
previousValue?: any;
|
|
95
|
+
newValue?: any;
|
|
96
|
+
}
|
|
97
|
+
export interface ConfigActionResult {
|
|
98
|
+
success: boolean;
|
|
99
|
+
message: string;
|
|
100
|
+
data?: any;
|
|
14
101
|
}
|
|
15
102
|
export declare class ConfigManager {
|
|
16
103
|
private static instance;
|
|
17
104
|
private static instanceLock;
|
|
18
105
|
private configDir;
|
|
19
106
|
private configPath;
|
|
107
|
+
private backupPath;
|
|
20
108
|
private config;
|
|
21
109
|
private constructor();
|
|
22
110
|
/**
|
|
@@ -24,14 +112,21 @@ export declare class ConfigManager {
|
|
|
24
112
|
*/
|
|
25
113
|
static getInstance(): ConfigManager;
|
|
26
114
|
/**
|
|
27
|
-
*
|
|
28
|
-
|
|
115
|
+
* Get default configuration
|
|
116
|
+
*/
|
|
117
|
+
private getDefaultConfig;
|
|
118
|
+
/**
|
|
119
|
+
* Initialize configuration
|
|
120
|
+
*/
|
|
121
|
+
initialize(): Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* Load configuration from file
|
|
29
124
|
*/
|
|
30
|
-
private
|
|
125
|
+
private loadConfig;
|
|
31
126
|
/**
|
|
32
|
-
*
|
|
127
|
+
* Check if config file exists
|
|
33
128
|
*/
|
|
34
|
-
|
|
129
|
+
private configExists;
|
|
35
130
|
/**
|
|
36
131
|
* Get GitHub OAuth client ID
|
|
37
132
|
* Environment variable takes precedence over config file
|
|
@@ -42,15 +137,20 @@ export declare class ConfigManager {
|
|
|
42
137
|
*/
|
|
43
138
|
setGitHubClientId(clientId: string): Promise<void>;
|
|
44
139
|
/**
|
|
45
|
-
* Get
|
|
46
|
-
* @returns A defensive copy of the configuration object
|
|
140
|
+
* Get the current configuration
|
|
47
141
|
*/
|
|
48
|
-
getConfig():
|
|
142
|
+
getConfig(): DollhouseConfig;
|
|
49
143
|
/**
|
|
50
|
-
*
|
|
51
|
-
* @param newConfig The new configuration to set
|
|
144
|
+
* Get a specific setting using dot notation
|
|
52
145
|
*/
|
|
53
|
-
|
|
146
|
+
getSetting<T>(path: string, defaultValue?: T): T | undefined;
|
|
147
|
+
/**
|
|
148
|
+
* Update a specific setting using dot notation
|
|
149
|
+
* SECURITY FIX (PR #895): Added prototype pollution protection
|
|
150
|
+
* Previously: Direct property assignment allowed __proto__ injection
|
|
151
|
+
* Now: Validates keys against forbidden properties before assignment
|
|
152
|
+
*/
|
|
153
|
+
updateSetting(path: string, value: any): Promise<ConfigUpdateResult>;
|
|
54
154
|
/**
|
|
55
155
|
* Validate GitHub OAuth client ID format
|
|
56
156
|
* Client IDs start with "Ov23li" followed by at least 14 alphanumeric characters
|
|
@@ -66,13 +166,46 @@ export declare class ConfigManager {
|
|
|
66
166
|
*/
|
|
67
167
|
static validateClientId(clientId: any): boolean;
|
|
68
168
|
/**
|
|
69
|
-
*
|
|
169
|
+
* Save configuration to file
|
|
70
170
|
*/
|
|
71
|
-
private
|
|
171
|
+
private saveConfig;
|
|
72
172
|
/**
|
|
73
|
-
*
|
|
173
|
+
* Check if backup exists
|
|
74
174
|
*/
|
|
75
|
-
private
|
|
175
|
+
private backupExists;
|
|
176
|
+
/**
|
|
177
|
+
* Fix incorrect types in config (e.g., string booleans, string "null")
|
|
178
|
+
*/
|
|
179
|
+
private fixConfigTypes;
|
|
180
|
+
/**
|
|
181
|
+
* Merge partial config with defaults
|
|
182
|
+
*
|
|
183
|
+
* IMPORTANT: This function preserves unknown fields for forward compatibility.
|
|
184
|
+
* If a future version adds new config fields, older versions won't lose them.
|
|
185
|
+
*/
|
|
186
|
+
private mergeWithDefaults;
|
|
187
|
+
/**
|
|
188
|
+
* Migrate settings from environment variables
|
|
189
|
+
*/
|
|
190
|
+
private migrateFromEnvironment;
|
|
191
|
+
/**
|
|
192
|
+
* Reset configuration to defaults
|
|
193
|
+
* SECURITY FIX (PR #895): Added prototype pollution protection
|
|
194
|
+
* Previously: Direct property assignment allowed __proto__ injection
|
|
195
|
+
* Now: Validates keys against forbidden properties before assignment
|
|
196
|
+
*/
|
|
197
|
+
resetConfig(section?: string): Promise<ConfigActionResult>;
|
|
198
|
+
/**
|
|
199
|
+
* Export configuration to file
|
|
200
|
+
*/
|
|
201
|
+
exportConfig(filePath: string): Promise<ConfigActionResult>;
|
|
202
|
+
/**
|
|
203
|
+
* Import configuration from file
|
|
204
|
+
*/
|
|
205
|
+
importConfig(filePath: string): Promise<ConfigActionResult>;
|
|
206
|
+
/**
|
|
207
|
+
* Get formatted config for display
|
|
208
|
+
*/
|
|
209
|
+
getFormattedConfig(section?: string): string;
|
|
76
210
|
}
|
|
77
|
-
export {};
|
|
78
211
|
//# sourceMappingURL=ConfigManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"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"}
|