obsidian-integration-testing 9.1.0 → 9.1.1
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/dist/lib/cjs/global-setup-core.cjs +17 -1
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/esm/global-setup-core.mjs +17 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/obsidian-integration-testing-9.1.1.tgz +0 -0
- package/package.json +1 -1
- package/dist/obsidian-integration-testing-9.1.0.tgz +0 -0
|
@@ -55,6 +55,8 @@ const MAIN_JS = "main.js";
|
|
|
55
55
|
const OBSIDIAN_CONFIG_DIR = ".obsidian";
|
|
56
56
|
const PLUGINS_DIR = "plugins";
|
|
57
57
|
const COMMUNITY_PLUGINS_JSON = "community-plugins.json";
|
|
58
|
+
const APP_JSON = "app.json";
|
|
59
|
+
const APP_JSON_INDENT = 2;
|
|
58
60
|
const activeSetups = /* @__PURE__ */ new Set();
|
|
59
61
|
const disposedResults = /* @__PURE__ */ new WeakSet();
|
|
60
62
|
let isCleanupHandlerRegistered = false;
|
|
@@ -96,6 +98,7 @@ async function coreSetup(params) {
|
|
|
96
98
|
(0, import_log.log)(`[integration-setup:${label}] Populating vault with ${String(entryCount)} entries before open...`);
|
|
97
99
|
tempVault.populate(params.populate);
|
|
98
100
|
}
|
|
101
|
+
await ensureAlwaysUpdateLinks(tempVault, label);
|
|
99
102
|
(0, import_log.log)(`[integration-setup:${label}] Syncing vault to device...`);
|
|
100
103
|
await tempVault.syncToDevice(transport);
|
|
101
104
|
(0, import_log.log)(`[integration-setup:${label}] Registering vault...`);
|
|
@@ -262,6 +265,19 @@ async function enablePluginInVault(params) {
|
|
|
262
265
|
const detail = logcatTail ?? (0, import_enable_plugin.getGenericPluginLoadFailureMessage)(pluginId);
|
|
263
266
|
throw new Error(`Plugin "${pluginId}" failed to load: ${detail}`);
|
|
264
267
|
}
|
|
268
|
+
async function ensureAlwaysUpdateLinks(tempVault, label) {
|
|
269
|
+
const configDir = (0, import_node_path.join)(tempVault.path, OBSIDIAN_CONFIG_DIR);
|
|
270
|
+
const appJsonPath = (0, import_node_path.join)(configDir, APP_JSON);
|
|
271
|
+
let appConfig = {};
|
|
272
|
+
try {
|
|
273
|
+
appConfig = JSON.parse(await (0, import_promises.readFile)(appJsonPath, "utf-8"));
|
|
274
|
+
} catch {
|
|
275
|
+
}
|
|
276
|
+
appConfig["alwaysUpdateLinks"] = true;
|
|
277
|
+
await (0, import_promises.mkdir)(configDir, { recursive: true });
|
|
278
|
+
await (0, import_promises.writeFile)(appJsonPath, JSON.stringify(appConfig, null, APP_JSON_INDENT));
|
|
279
|
+
(0, import_log.log)(`[integration-setup:${label}] Enabled alwaysUpdateLinks in ${APP_JSON} (headless rename support).`);
|
|
280
|
+
}
|
|
265
281
|
function findProjectRoot() {
|
|
266
282
|
let dir = import_node_process.default.cwd();
|
|
267
283
|
while (true) {
|
|
@@ -369,4 +385,4 @@ async function teardownAsync(result) {
|
|
|
369
385
|
coreTeardown,
|
|
370
386
|
resolveIntegrationTransportOptions
|
|
371
387
|
});
|
|
372
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgYXMgc2xlZXAgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB0eXBlIHsgRW5hYmxlUGx1Z2luUmVzdWx0IH0gZnJvbSAnLi9lbmFibGUtcGx1Z2luLmNqcyc7XG5pbXBvcnQgdHlwZSB7IFNldHVwTG9jayB9IGZyb20gJy4vc2V0dXAtbG9jay5janMnO1xuaW1wb3J0IHR5cGUgeyBQb3B1bGF0ZUZpbGVzUGFyYW1zIH0gZnJvbSAnLi90ZW1wLXZhdWx0LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQge1xuICBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICBnZXRHZW5lcmljUGx1Z2luTG9hZEZhaWx1cmVNZXNzYWdlXG59IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5janMnO1xuaW1wb3J0IHsgZXJyb3JUb1N0cmluZyB9IGZyb20gJy4vZXJyb3ItdG8tc3RyaW5nLmNqcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7XG4gIGNvbXB1dGVCYWNrb2ZmRGVsYXlJbk1pbGxpc2Vjb25kcyxcbiAgcmVzb2x2ZVBsdWdpbkVuYWJsZVJldHJ5Q291bnQsXG4gIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHMsXG4gIHNob3VsZFJldHJ5UGx1Z2luRW5hYmxlXG59IGZyb20gJy4vcGx1Z2luLWVuYWJsZS1yZXRyeS5janMnO1xuaW1wb3J0IHsgYWNxdWlyZVNldHVwTG9jayB9IGZyb20gJy4vc2V0dXAtbG9jay5janMnO1xuaW1wb3J0IHsgVGVtcFZhdWx0IH0gZnJvbSAnLi90ZW1wLXZhdWx0LmNqcyc7XG5pbXBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0uY2pzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2RwJztcbmNvbnN0IERJU1RfREVWID0gJ2Rpc3QvZGV2JztcbmNvbnN0IERJU1RfQlVJTEQgPSAnZGlzdC9idWlsZCc7XG5jb25zdCBNQUlOX0pTID0gJ21haW4uanMnO1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9ICcub2JzaWRpYW4nO1xuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuXG4vKipcbiAqIFRyYWNrcyBzZXR1cHMgdGhhdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCBoYXZlbid0IGJlZW4gdG9ybiBkb3duIHlldC5cbiAqIFVzZWQgYnkgdGhlIGBiZWZvcmVFeGl0YCBoYW5kbGVyIHRvIGNsZWFuIHVwIHdoZW4gYSB0ZXN0IHJ1bm5lciBleGl0c1xuICogd2l0aG91dCBjYWxsaW5nIHRlYXJkb3duIChlLmcuLCB3aGVuIG9uZSBwcm9qZWN0J3Mgc2V0dXAgZmFpbHMgYW5kIHRoZVxuICogcnVubmVyIGFib3J0cyBiZWZvcmUgdGVhcmluZyBkb3duIGFscmVhZHktaW5pdGlhbGl6ZWQgcHJvamVjdHMpLlxuICovXG5jb25zdCBhY3RpdmVTZXR1cHMgPSBuZXcgU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmNvbnN0IGRpc3Bvc2VkUmVzdWx0cyA9IG5ldyBXZWFrU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmxldCBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBjcm9zcy1wcm9jZXNzIHNldHVwIGxvY2sgaGVsZCBieSBlYWNoIGFjdGl2ZSBzZXR1cC4gUmVsZWFzZWQgd2hlbiB0aGVcbiAqIHNldHVwIGlzIHRvcm4gZG93biAob3IgYnkgdGhlIHByb2Nlc3MgY2xlYW51cCBoYW5kbGVycyksIGFsbG93aW5nIGEgY29tcGV0aW5nXG4gKiBydW4gdG8gcHJvY2VlZC4gU2VlIHtAbGluayBhY3F1aXJlU2V0dXBMb2NrfS5cbiAqL1xuY29uc3Qgc2V0dXBMb2NrcyA9IG5ldyBNYXA8Q29yZVNldHVwUmVzdWx0LCBTZXR1cExvY2s+KCk7XG5cbmNvbnN0IEFORFJPSURfTE9DS19TQ09QRSA9ICdhbmRyb2lkJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29yZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBQYXJhbXMge1xuICAvKipcbiAgICogQ29tbXVuaXR5LXBsdWdpbiBpZHMgdG8gZW5hYmxlIGluIHRoZSB2YXVsdCAqKmluIGFkZGl0aW9uIHRvKiogdGhlXG4gICAqIHBsdWdpbi11bmRlci10ZXN0LCBhZnRlciBpdCBpcyBlbmFibGVkLiBFYWNoIGlkJ3MgYnVpbHQgZmlsZXMgbXVzdCBhbHJlYWR5IGJlXG4gICAqIHByZXNlbnQgdW5kZXIgYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBcdTIwMTQgc2VlZCB0aGVtIHZpYSB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLnBvcHVsYXRlfVxuICAgKiAoZS5nLiB3aXRoIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYCkuIEVuYWJsaW5nIGdvZXMgdGhyb3VnaCB0aGUgc2FtZVxuICAgKiByZXRyeS9sb2FkLXZlcmlmeSBwYXRoIGFzIHRoZSBwbHVnaW4tdW5kZXItdGVzdC4gQ29tcG9zZXMgd2l0aFxuICAgKiBgaW5zdGFsbFBsdWdpbjogZmFsc2VgIChlbmFibGUgZXh0cmFzIGludG8gYW4gb3RoZXJ3aXNlIHBsdWdpbi1sZXNzIHZhdWx0KS5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUNvbW11bml0eVBsdWdpbnM/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbnN0YWxsIGFuZCBlbmFibGUgdGhlIGJ1aWx0IHBsdWdpbiBpbiB0aGUgdGVtcCB2YXVsdC4gRGVmYXVsdHNcbiAgICogdG8gYHRydWVgLiBTZXQgdG8gYGZhbHNlYCBmb3IgYSAqKm5vbi1wbHVnaW4qKiBjb25zdW1lciAoZS5nLiBhIHR5cGluZ3NcbiAgICogY3Jhd2xlcikgdGhhdCBvbmx5IG5lZWRzIGEgcmVnaXN0ZXJlZCwgZW1wdHkgdmF1bHQgdG8gYGV2YWxJbk9ic2lkaWFuYFxuICAgKiBhZ2FpbnN0OiB0aGUgcGx1Z2luIGBkaXN0YC9gbWFuaWZlc3QuanNvbmAgcmVhZCwgdGhlIGNvcHkgaW50b1xuICAgKiBgLm9ic2lkaWFuL3BsdWdpbnNgLCB0aGUgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIHdyaXRlLCBhbmQgdGhlIGVuYWJsZSBzdGVwXG4gICAqIGFyZSBhbGwgc2tpcHBlZCwgd2hpbGUgdGhlIHRyYW5zcG9ydCwgdGVtcCB2YXVsdCwgcmVnaXN0cmF0aW9uLCBhbmRcbiAgICogd29ya2VyLWZhY2luZyBlbmRwb2ludCBwcm92aXNpb25pbmcgc3RpbGwgcnVuIHVuY2hhbmdlZC5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxQbHVnaW4/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBGaWxlcyBhbmQgZm9sZGVycyB0byB3cml0ZSBpbnRvIHRoZSB2YXVsdCAqKmJlZm9yZSoqIE9ic2lkaWFuIG9wZW5zIGl0LCBzb1xuICAgKiBpdHMgc3RhcnR1cCBzY2FuIGluZGV4ZXMgdGhlbSBpbiBvbmUgcGFzcyAoc2VlIHtAbGluayBUZW1wVmF1bHQucG9wdWxhdGV9KS5cbiAgICogVXNlIHRoaXMgZm9yIGxhcmdlIGZpeHR1cmVzIFx1MjAxNCB3cml0aW5nIHRob3VzYW5kcyBvZiBub3RlcyBhZnRlciBvcGVuIGFuZFxuICAgKiBmb3JjaW5nIGEgcmUtc2NhbiBpcyBmYXIgc2xvd2VyIGFuZCBsZXNzIHJlbGlhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9wdWxhdGU/OiBQb3B1bGF0ZUZpbGVzUGFyYW1zIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUcmFuc3BvcnQgb3B0aW9ucy4gV2hlbiBvbWl0dGVkLCB1c2VzIGFuIG9mZi1zY3JlZW4gb3duZWQgZGVza3RvcCBpbnN0YW5jZS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkge0BsaW5rIGNvcmVTZXR1cH0sIHVzZWQgYnkgZnJhbWV3b3JrIGFkYXB0ZXJzXG4gKiB0byBwYXNzIGNvbnRleHQgdG8gdGVzdCB3b3JrZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZXR1cFJlc3VsdCB7XG4gIC8qKiBUaGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLiAqL1xuICByZWFkb25seSB0ZW1wVmF1bHQ6IFRlbXBWYXVsdDtcblxuICAvKiogVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSB1c2VkIGR1cmluZyBzZXR1cC4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKiogU2hvcnQgbGFiZWwgZm9yIGxvZyBtZXNzYWdlcyAoZS5nLiBgXCJvYnNpZGlhbi1jZHBcImApLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IG9wdGlvbnMgdGhhdCB3ZXJlIHJlc29sdmVkLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcHlQbHVnaW5JbnRvVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgQ29weVBsdWdpbkludG9WYXVsdFBhcmFtcyB7XG4gIC8qKiBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzLiAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgcHJvamVjdCByb290IHRvIHJlc29sdmUgdGhlIGJ1aWx0IHBsdWdpbiBmcm9tLiAqL1xuICByZWFkb25seSBwcm9qZWN0Um9vdDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdGVtcCB2YXVsdCB0byBjb3B5IHRoZSBwbHVnaW4gaW50by4gKi9cbiAgcmVhZG9ubHkgdGVtcFZhdWx0OiBUZW1wVmF1bHQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgKHVzZWQgZm9yIHRoZSBtb2JpbGUvZGVza3RvcC1vbmx5IGNvbXBhdGliaWxpdHkgY2hlY2spLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnN9LlxuICovXG5pbnRlcmZhY2UgRW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zUGFyYW1zIHtcbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBpZHMgb2YgdGhlIGV4dHJhIGNvbW11bml0eSBwbHVnaW5zIHRvIGVuYWJsZSAodGhlaXIgYmluYXJpZXMgbXVzdCBhbHJlYWR5IGJlIGluIHRoZSB2YXVsdCkuICovXG4gIHJlYWRvbmx5IHBsdWdpbklkczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIFRoZSB0ZW1wIHZhdWx0IHRoZSBwbHVnaW5zIHdlcmUgc2VlZGVkIGludG8uICovXG4gIHJlYWRvbmx5IHRlbXBWYXVsdDogVGVtcFZhdWx0O1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IHRvIGV2YWx1YXRlIGFnYWluc3QuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBwbHVnaW4tZW5hYmxlIHJldHJ5IGtub2JzKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogbnVsbCB8IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlUGx1Z2luSW5WYXVsdH0uXG4gKi9cbmludGVyZmFjZSBFbmFibGVQbHVnaW5JblZhdWx0UGFyYW1zIHtcbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS4gKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKiogVGhlIHRlbXAgdmF1bHQgdGhlIHBsdWdpbiB3YXMgY29waWVkIGludG8uICovXG4gIHJlYWRvbmx5IHRlbXBWYXVsdDogVGVtcFZhdWx0O1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IHRvIGV2YWx1YXRlIGFnYWluc3QuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBwbHVnaW4tZW5hYmxlIHJldHJ5IGtub2JzKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogbnVsbCB8IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBGcmFtZXdvcmstYWdub3N0aWMgZ2xvYmFsIHNldHVwIGxvZ2ljLlxuICpcbiAqIExvYWRzIGAuZW52YCBmcm9tIHRoZSBwcm9qZWN0IHJvb3QsIGNyZWF0ZXMgYSB0cmFuc3BvcnQsIGNyZWF0ZXMgYW5kIHJlZ2lzdGVyc1xuICogYSB0ZW1wb3JhcnkgdmF1bHQgd2l0aCBPYnNpZGlhbiwgYW5kIFx1MjAxNCB1bmxlc3Mge0BsaW5rIENvcmVTZXR1cFBhcmFtcy5pbnN0YWxsUGx1Z2lufVxuICogaXMgYGZhbHNlYCBcdTIwMTQgY29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byB0aGUgdmF1bHQgYW5kIGVuYWJsZXMgaXQuIFRoZVxuICogcGx1Z2luLWxlc3MgbW9kZSBzdGlsbCBsYXVuY2hlcyB0aGUgb3duZWQgaW5zdGFuY2UgYW5kIHB1Ymxpc2hlcyBpdHNcbiAqIHdvcmtlci1mYWNpbmcgZW5kcG9pbnQsIHNvIGEgbm9uLXBsdWdpbiBjb25zdW1lciByZXVzZXMgdGhlIHNhbWUgYXR0YWNoIHdpcmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gU2V0dXAgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBzZXR1cCByZXN1bHQgY29udGFpbmluZyB0aGUgdGVtcCB2YXVsdCwgdHJhbnNwb3J0LCBhbmQgcmVzb2x2ZWQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVTZXR1cChwYXJhbXM/OiBDb3JlU2V0dXBQYXJhbXMpOiBQcm9taXNlPENvcmVTZXR1cFJlc3VsdD4ge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IGZpbmRQcm9qZWN0Um9vdCgpO1xuICBjb25zdCBlbnZGaWxlUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsICcuZW52Jyk7XG4gIGlmIChleGlzdHNTeW5jKGVudkZpbGVQYXRoKSkge1xuICAgIGxvYWRFbnZGaWxlKGVudkZpbGVQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSByZXNvbHZlSW50ZWdyYXRpb25UcmFuc3BvcnRPcHRpb25zKHBhcmFtcz8udHJhbnNwb3J0T3B0aW9ucyk7XG4gIGNvbnN0IGxhYmVsID0gdHJhbnNwb3J0T3B0aW9ucy50eXBlO1xuICBjb25zdCBsb2NrU2NvcGUgPSBnZXRMb2NrU2NvcGUodHJhbnNwb3J0T3B0aW9ucyk7XG5cbiAgbGV0IGxvY2s6IFNldHVwTG9jayB8IHVuZGVmaW5lZDtcbiAgaWYgKGxvY2tTY29wZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIEFjcXVpcmluZyAnJHtsb2NrU2NvcGV9JyBzZXR1cCBsb2NrIChzZXJpYWxpemVzIGFnYWluc3QgYW55IGNvbmN1cnJlbnQgaW50ZWdyYXRpb24tdGVzdCBydW4pLi4uYCk7XG4gICAgbG9jayA9IGF3YWl0IGFjcXVpcmVTZXR1cExvY2soeyBsYWJlbCwgc2NvcGU6IGxvY2tTY29wZSB9KTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU2V0dXAgbG9jayBhY3F1aXJlZC5gKTtcbiAgfVxuXG4gIGxldCB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuICBsZXQgdGVtcFZhdWx0OiBUZW1wVmF1bHQgfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRpbmcgdHJhbnNwb3J0Li4uYCk7XG4gICAgdHJhbnNwb3J0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnModHJhbnNwb3J0T3B0aW9ucyk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjcmVhdGVkOiAke3RyYW5zcG9ydC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFByb2plY3Qgcm9vdDogJHtwcm9qZWN0Um9vdH1gKTtcbiAgICBjb25zdCBzaG91bGRJbnN0YWxsUGx1Z2luID0gcGFyYW1zPy5pbnN0YWxsUGx1Z2luICE9PSBmYWxzZTtcblxuICAgIHRlbXBWYXVsdCA9IG5ldyBUZW1wVmF1bHQoKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRlZCB0ZW1wIHZhdWx0OiAke3RlbXBWYXVsdC5wYXRofWApO1xuXG4gICAgbGV0IHBsdWdpbklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoc2hvdWxkSW5zdGFsbFBsdWdpbikge1xuICAgICAgcGx1Z2luSWQgPSBhd2FpdCBjb3B5UGx1Z2luSW50b1ZhdWx0KHsgbGFiZWwsIHByb2plY3RSb290LCB0ZW1wVmF1bHQsIHRyYW5zcG9ydCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNraXBwaW5nIHBsdWdpbiBpbnN0YWxsIChpbnN0YWxsUGx1Z2luOiBmYWxzZSkgXHUyMDE0IHJlZ2lzdGVyaW5nIGFuIGVtcHR5IHZhdWx0LmApO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXM/LnBvcHVsYXRlKSB7XG4gICAgICBjb25zdCBlbnRyeUNvdW50ID0gT2JqZWN0LmtleXMocGFyYW1zLnBvcHVsYXRlKS5sZW5ndGg7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUG9wdWxhdGluZyB2YXVsdCB3aXRoICR7U3RyaW5nKGVudHJ5Q291bnQpfSBlbnRyaWVzIGJlZm9yZSBvcGVuLi4uYCk7XG4gICAgICB0ZW1wVmF1bHQucG9wdWxhdGUocGFyYW1zLnBvcHVsYXRlKTtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU3luY2luZyB2YXVsdCB0byBkZXZpY2UuLi5gKTtcbiAgICBhd2FpdCB0ZW1wVmF1bHQuc3luY1RvRGV2aWNlKHRyYW5zcG9ydCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFJlZ2lzdGVyaW5nIHZhdWx0Li4uYCk7XG4gICAgYXdhaXQgdGVtcFZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFZhdWx0IHJlZ2lzdGVyZWQuYCk7XG5cbiAgICBpZiAocGx1Z2luSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgZW5hYmxlUGx1Z2luSW5WYXVsdCh7IGxhYmVsLCBwbHVnaW5JZCwgdGVtcFZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydE9wdGlvbnMgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgZW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zKHtcbiAgICAgIGxhYmVsLFxuICAgICAgcGx1Z2luSWRzOiBwYXJhbXM/LmVuYWJsZUNvbW11bml0eVBsdWdpbnMgPz8gW10sXG4gICAgICB0ZW1wVmF1bHQsXG4gICAgICB0cmFuc3BvcnQsXG4gICAgICB0cmFuc3BvcnRPcHRpb25zXG4gICAgfSk7XG5cbiAgICBjb25zdCBhdWdtZW50ZWRPcHRpb25zID0gYXVnbWVudFRyYW5zcG9ydE9wdGlvbnModHJhbnNwb3J0T3B0aW9ucywgdHJhbnNwb3J0KTtcbiAgICBjb25zdCByZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCA9IHsgdGVtcFZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydExhYmVsOiBsYWJlbCwgdHJhbnNwb3J0T3B0aW9uczogYXVnbWVudGVkT3B0aW9ucyB9O1xuICAgIGFjdGl2ZVNldHVwcy5hZGQocmVzdWx0KTtcbiAgICBpZiAobG9jaykge1xuICAgICAgc2V0dXBMb2Nrcy5zZXQocmVzdWx0LCBsb2NrKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBmYWlsZWQsIGNsZWFuaW5nIHVwLi4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0ZW1wVmF1bHQgJiYgdHJhbnNwb3J0KSB7XG4gICAgICAgIGF3YWl0IHRlbXBWYXVsdC5kaXNwb3NlKHRyYW5zcG9ydCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoY2xlYW51cEVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cmFuc3BvcnQ/LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoY2xlYW51cEVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBSZWxlYXNlIHRoZSBsb2NrIHNvIGEgd2FpdGluZyBydW4gY2FuIHByb2NlZWQgZXZlbiB0aG91Z2ggdGhpcyBydW4gZmFpbGVkLlxuICAgIGxvY2s/LnJlbGVhc2UoKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBOT1RFOiBJZiB0aGUgdGVzdCBydW5uZXIgcmVwb3J0cyBcIk5vIHRlc3QgZmlsZXMgZm91bmRcIiwgaWdub3JlIGl0IFx1MjAxNCBpdCBpcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBzZXR1cCBmYWlsdXJlIGFib3ZlLmApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCB0ZWFyZG93biBsb2dpYy5cbiAqXG4gKiBEaXNwb3NlcyBvZiB0aGUgdGVtcG9yYXJ5IHZhdWx0IGFuZCB0cmFuc3BvcnQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgZnJvbSB7QGxpbmsgY29yZVNldHVwfS4gV2hlbiBgdW5kZWZpbmVkYCwgZG9lcyBub3RoaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVRlYXJkb3duKHJlc3VsdD86IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlc3VsdCB8fCBkaXNwb3NlZFJlc3VsdHMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZGlzcG9zZWRSZXN1bHRzLmFkZChyZXN1bHQpO1xuXG4gIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVGVhcmluZyBkb3duLi4uYCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0ZWFyZG93bkFzeW5jKHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBDbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2ZVNldHVwcy5kZWxldGUocmVzdWx0KTtcbiAgICByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0cmFuc3BvcnQgb3B0aW9ucyBmb3IgYW4gaW50ZWdyYXRpb24gcnVuLlxuICpcbiAqIERlc2t0b3AgbGF1bmNoZXMgYXJlIG5vcm1hbGx5IHZpc2libGUsIGJ1dCB0ZXN0IHNldHVwIGV4cGxpY2l0bHkga2VlcHMgaXRzXG4gKiBvd25lZCBpbnN0YW5jZSBvZmYtc2NyZWVuIHNvIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgZGV2ZWxvcGVyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uc3VtZXItcHJvdmlkZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBPcHRpb25zIHdpdGggdGhlIGRlc2t0b3AgaW50ZWdyYXRpb24gdmlzaWJpbGl0eSBkZWZhdWx0IGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSW50ZWdyYXRpb25UcmFuc3BvcnRPcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMge1xuICBpZiAob3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJykge1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGlzT2JzaWRpYW5BcHBWaXNpYmxlOiBvcHRpb25zPy5pc09ic2lkaWFuQXBwVmlzaWJsZSA/PyBmYWxzZSxcbiAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICB9O1xufVxuXG4vKipcbiAqIEF1Z21lbnRzIHRyYW5zcG9ydCBvcHRpb25zIHdpdGggcmV1c2UgaW5mbyBzbyB0ZXN0IHdvcmtlcnMgY2FuIHJlYXR0YWNoIHRvIHRoZVxuICogaW5zdGFuY2UgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGluc3RlYWQgb2YgY3JlYXRpbmcgdGhlaXIgb3duOlxuICpcbiAqIC0gKipBcHBpdW0qKiBcdTIwMTQgaW5qZWN0cyB0aGUgZXN0YWJsaXNoZWQgYHNlc3Npb25JZGAvYGRldmljZUlkYC5cbiAqIC0gKipPd25lZCBkZXNrdG9wIENEUCoqIFx1MjAxNCBpbmplY3RzIHRoZSBvd25lZCBpbnN0YW5jZSdzIGBob3N0YC9gcG9ydGAgKGNob3NlblxuICogICBhdCBsYXVuY2gpIHBsdXMgdGhlIGludGVybmFsIGBpc0hhcm5lc3NPd25lZEluc3RhbmNlYCBmbGFnLCBzbyBlYWNoIHdvcmtlclxuICogICAqKmF0dGFjaGVzKiogdG8gdGhhdCBpbnN0YW5jZSBvdmVyIENEUCByYXRoZXIgdGhhbiBsYXVuY2hpbmcgKGFuZCBuZXZlclxuICogICByZWdpc3RlcmluZykgaXRzIG93biBcdTIwMTQgdGhlIGJ1ZyB0aGF0IG90aGVyd2lzZSBsZWF2ZXMgYSB3b3JrZXIncyB0cmFuc3BvcnRcbiAqICAgd2l0aCBubyBDRFAgZW5kcG9pbnQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3JpZ2luYWwgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqIEByZXR1cm5zIFRoZSBhdWdtZW50ZWQgb3B0aW9ucywgb3IgdGhlIG9yaWdpbmFsIG9wdGlvbnMgaWYgbm90IGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIGF1Z21lbnRUcmFuc3BvcnRPcHRpb25zKFxuICBvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnRcbik6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb25zPy50eXBlID09PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nICYmIHRyYW5zcG9ydCBpbnN0YW5jZW9mIEFwcGl1bVRyYW5zcG9ydCkge1xuICAgIGNvbnN0IHNlc3Npb25JbmZvID0gdHJhbnNwb3J0LmdldFNlc3Npb25JbmZvKCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtvcHRpb25zLnR5cGV9XSBTZXNzaW9uIHJldXNlIGluZm86IHNlc3Npb25JZD0ke3Nlc3Npb25JbmZvLnNlc3Npb25JZH0sIGRldmljZUlkPSR7c2Vzc2lvbkluZm8uZGV2aWNlSWR9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkZXZpY2VJZDogc2Vzc2lvbkluZm8uZGV2aWNlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JbmZvLnNlc3Npb25JZFxuICAgIH07XG4gIH1cblxuICBpZiAoKG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSAmJiB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0cmFuc3BvcnQuZ2V0T3duZWRJbnN0YW5jZUVuZHBvaW50KCk7XG4gICAgaWYgKGVuZHBvaW50KSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke0RFRkFVTFRfVFJBTlNQT1JUX1RZUEV9XSBPd25lZCBpbnN0YW5jZSByZXVzZSBpbmZvOiBob3N0PSR7ZW5kcG9pbnQuaG9zdH0sIHBvcnQ9JHtTdHJpbmcoZW5kcG9pbnQucG9ydCl9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBob3N0OiBlbmRwb2ludC5ob3N0LFxuICAgICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiB0cnVlLFxuICAgICAgICBwb3J0OiBlbmRwb2ludC5wb3J0LFxuICAgICAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIHRoZSB0ZW1wIHZhdWx0IGFuZCBtYXJrcyBpdCBhcyBhIGNvbW11bml0eSBwbHVnaW4uXG4gKlxuICogUmVhZHMgYG1hbmlmZXN0Lmpzb25gIGZyb20gdGhlIG5ld2VyIG9mIGBkaXN0L2RldmAvYGRpc3QvYnVpbGRgLCByZWplY3RzIGFcbiAqIGRlc2t0b3Atb25seSBwbHVnaW4gb24gYSBtb2JpbGUgdHJhbnNwb3J0LCBjb3BpZXMgdGhlIGJ1aWxkIGludG9cbiAqIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+YCwgYW5kIHdyaXRlcyBgLm9ic2lkaWFuL2NvbW11bml0eS1wbHVnaW5zLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29weSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHBsdWdpbiBpZCByZWFkIGZyb20gdGhlIG1hbmlmZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5UGx1Z2luSW50b1ZhdWx0KHBhcmFtczogQ29weVBsdWdpbkludG9WYXVsdFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgbGFiZWwsIHByb2plY3RSb290LCB0ZW1wVmF1bHQsIHRyYW5zcG9ydCB9ID0gcGFyYW1zO1xuICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuICBjb25zdCBwbHVnaW5JZCA9IG1hbmlmZXN0SnNvbi5pZDtcblxuICBpZiAodHJhbnNwb3J0LmlzTW9iaWxlICYmIG1hbmlmZXN0SnNvbi5pc0Rlc2t0b3BPbmx5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGlzRGVza3RvcE9ubHk6IHRydWUgaW4gbWFuaWZlc3QuanNvbi4gTW9iaWxlIGludGVncmF0aW9uIHRlc3RzIGNhbm5vdCBydW4gZm9yIGRlc2t0b3Atb25seSBwbHVnaW5zLmBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWFpbkpzID0gam9pbihkaXN0UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGF3YWl0IHN0YXQobWFpbkpzKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFVzaW5nICR7ZGlzdFBhdGh9ICgke2J1aWxkU3RhdC5tdGltZS50b0lTT1N0cmluZygpfSkuIElmIG91dGRhdGVkLCByZWJ1aWxkLmApO1xuXG4gIGNvbnN0IHBsdWdpbkRpciA9IGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIFBMVUdJTlNfRElSLCBwbHVnaW5JZCk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGNwKGRpc3RQYXRoLCBwbHVnaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiksIEpTT04uc3RyaW5naWZ5KFtwbHVnaW5JZF0pKTtcblxuICByZXR1cm4gcGx1Z2luSWQ7XG59XG5cbi8qKlxuICogRW5hYmxlcyBleHRyYSBjb21tdW5pdHkgcGx1Z2lucyAoYmV5b25kIHRoZSBwbHVnaW4tdW5kZXItdGVzdCkgaW4gdGhlIHJlZ2lzdGVyZWQgdmF1bHQsIGVhY2ggdGhyb3VnaCB0aGVcbiAqIHNhbWUge0BsaW5rIGVuYWJsZVBsdWdpbkluVmF1bHR9IHBhdGguIEVhY2ggcGx1Z2luJ3MgYnVpbHQgZmlsZXMgbXVzdCBhbHJlYWR5IGJlIHByZXNlbnQgaW4gdGhlIHZhdWx0IChzZWVkXG4gKiB0aGVtIHZpYSB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLnBvcHVsYXRlfSkuIEEgbm8tb3Agd2hlbiB0aGUgbGlzdCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVuYWJsZSBwYXJhbWV0ZXJzLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnMocGFyYW1zOiBFbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcGx1Z2luSWRzLCB0ZW1wVmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0T3B0aW9ucyB9ID0gcGFyYW1zO1xuICBmb3IgKGNvbnN0IHBsdWdpbklkIG9mIHBsdWdpbklkcykge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBleHRyYSBjb21tdW5pdHkgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi4uLmApO1xuICAgIGF3YWl0IGVuYWJsZVBsdWdpbkluVmF1bHQoeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0pO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlcyB0aGUgcGx1Z2luIGluIHRoZSByZWdpc3RlcmVkIHZhdWx0IGFuZCB2ZXJpZmllcyBpdCBsb2FkZWQuXG4gKlxuICogT2JzaWRpYW4ncyBgZW5hYmxlUGx1Z2luKClgIHdyYXBzIGBsb2FkUGx1Z2luKClgIGluIGEgdHJ5LWNhdGNoIHRoYXQgc3dhbGxvd3NcbiAqIGVycm9ycyBhbmQgcmV0dXJucyBmYWxzZSwgc28ge0BsaW5rIGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmV9IG1vbmtleS1wYXRjaGVzXG4gKiBgbG9hZFBsdWdpbigpYCB0byBjYXB0dXJlIHRoZSBlcnJvciBiZWZvcmUgaXQncyBzd2FsbG93ZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbmFibGUgcGFyYW1ldGVycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5hYmxlUGx1Z2luSW5WYXVsdChwYXJhbXM6IEVuYWJsZVBsdWdpbkluVmF1bHRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0gPSBwYXJhbXM7XG4gIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBwbHVnaW4gXCIke3BsdWdpbklkfVwiLi4uYCk7XG5cbiAgLypcbiAgICogT3BlbiBhIG5hdGl2ZSBjb25zb2xlLWNhcHR1cmUgd2luZG93IChMYXllciAyLCBBbmRyb2lkIG9ubHkpIGFyb3VuZCB0aGVcbiAgICogZW5hYmxlIHNvIHRoYXQgaWYgT2JzaWRpYW4gc3dhbGxvd3MgdGhlIGxvYWQgZXJyb3IgYmVmb3JlIHRoZSBtb25rZXktcGF0Y2hcbiAgICogYW5kIHRoZSByZW5kZXJlciBjb25zb2xlIChMYXllciAxKSBjYW1lIHVwIGVtcHR5LCB3ZSBjYW4gc3RpbGwgcmVjb3ZlciB0aGVcbiAgICogcmVhbCBjYXVzZSBmcm9tIGBhZGIgbG9nY2F0YC4gTm8tb3AgKHVuZGVmaW5lZCkgb24gdHJhbnNwb3J0cyB0aGF0IGRvbid0XG4gICAqIGltcGxlbWVudCBpdCAoZS5nLiBkZXNrdG9wKS5cbiAgICovXG4gIGNvbnN0IGNhcHR1cmVIYW5kbGUgPSBhd2FpdCB0cmFuc3BvcnQuYmVnaW5Db25zb2xlQ2FwdHVyZT8uKCk7XG5cbiAgLypcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHdlIGVuYWJsZSB0aGUgcGx1Z2luLCBzbyBhIHNpbmdsZS1zaG90IGVuYWJsZSByYWNlcyB0aGUgbG9hZCBhbmQgbG9zZXNcbiAgICogKHRoZSBwbHVnaW4gbGFuZHMgaW4gdGhlIGVuYWJsZWQgc2V0IGJ1dCBuZXZlciBsb2FkcykuIFJldHJ5IHRoZSBlbmFibGUgK1xuICAgKiBsb2FkLXZlcmlmaWNhdGlvbiBhIGZldyB0aW1lcyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYsIHdoaWNoIHJlY292ZXJzIHRoZVxuICAgKiB0cmFuc2llbnQgcmFjZS4gQSBjYXB0dXJlZCBsb2FkIGVycm9yIChgcmVhbEVycm9yYCkgaXMgYSBkZXRlcm1pbmlzdGljIGJ1ZyBcdTIwMTRcbiAgICogcmV0cnlpbmcgY2Fubm90IGZpeCBpdCwgc28gd2UgZmFpbCBmYXN0LiBOb24tQW5kcm9pZCB0cmFuc3BvcnRzIHJlc29sdmUgdG9cbiAgICogdGhlIHNhbWUgZGVmYXVsdHMgYnV0IG5ldmVyIGVudGVyIHRoZSByZXRyeSBwYXRoOiB0aGVpciBsb2FkIGVpdGhlciBzdWNjZWVkc1xuICAgKiBvbiB0aGUgZmlyc3QgYXR0ZW1wdCBvciB0aHJvd3MgYSBjYXB0dXJlZCBlcnJvci5cbiAgICovXG4gIGNvbnN0IG1heEF0dGVtcHRzID0gMSArIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeUNvdW50KHRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCBiYXNlRGVsYXlJbk1pbGxpc2Vjb25kcyA9IHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHModHJhbnNwb3J0T3B0aW9ucyk7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGxldCByZXN1bHQ6IEVuYWJsZVBsdWdpblJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgICBhcmdzOiB7IHBsdWdpbklkIH0sXG4gICAgICAgIGZuOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgICAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlLFxuICAgICAgICB0cmFuc3BvcnQsXG4gICAgICAgIHZhdWx0UGF0aDogdGVtcFZhdWx0LnBhdGhcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvKlxuICAgICAgICogVGhlIGV2YWwgaXRzZWxmIHRocmV3IChlLmcuIHRoZSBXZWJWaWV3IGNvbnRleHQgd2FzIGxvc3QgbWlkLWV4ZWN1dGlvbiBvblxuICAgICAgICogYSBjaHVybmluZyBndWVzdCkgXHUyMDE0IGEgdHJhbnNwb3J0LWxldmVsIHRyYW5zaWVudC4gUmV0cnkgaWYgYXR0ZW1wdHMgcmVtYWluLlxuICAgICAgICovXG4gICAgICBpZiAoYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgIGNvbnN0IGRlbGF5SW5NaWxsaXNlY29uZHMgPSBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMoYmFzZURlbGF5SW5NaWxsaXNlY29uZHMsIGF0dGVtcHQgLSAxKTtcbiAgICAgICAgbG9nKFxuICAgICAgICAgIGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIEVuYWJsZSBhdHRlbXB0ICR7U3RyaW5nKGF0dGVtcHQpfS8ke1N0cmluZyhtYXhBdHRlbXB0cyl9IHRocmV3IGBcbiAgICAgICAgICAgICsgYCgke2Vycm9yVG9TdHJpbmcoZXJyb3IpfSk7IHJldHJ5aW5nIGluICR7U3RyaW5nKGRlbGF5SW5NaWxsaXNlY29uZHMpfW1zLi4uYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChkZWxheUluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGBlcnJvck1lc3NhZ2VgIGlzIHRoZSByZWFsIHRocm93IHNlZW4gYnkgdGhlIG1vbmtleS1wYXRjaDtcbiAgICAgKiBgcmVuZGVyZXJDb25zb2xlRXJyb3JzYCAoTGF5ZXIgMSkgaXMgdGhlIHJlYWwgY2F1c2UgY29uc29sZS1sb2dnZWQgaW4gdGhlIHJlbmRlcmVyLlxuICAgICAqL1xuICAgIGNvbnN0IHJlYWxFcnJvciA9IHJlc3VsdC5lcnJvck1lc3NhZ2UgPz8gcmVzdWx0LnJlbmRlcmVyQ29uc29sZUVycm9ycztcblxuICAgIGlmIChyZXN1bHQuaXNMb2FkZWQgJiYgIXJlYWxFcnJvcikge1xuICAgICAgY29uc3QgYXR0ZW1wdFN1ZmZpeCA9IGF0dGVtcHQgPiAxID8gYCAoYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcobWF4QXR0ZW1wdHMpfSlgIDogJyc7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIHN1Y2Nlc3NmdWxseSR7YXR0ZW1wdFN1ZmZpeH0uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSBjYXB0dXJlZCBsb2FkIGVycm9yIGlzIGRldGVybWluaXN0aWMgXHUyMDE0IGZhaWwgZmFzdCByYXRoZXIgdGhhbiByZXRyeS5cbiAgICBpZiAoIXNob3VsZFJldHJ5UGx1Z2luRW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtyZWFsRXJyb3IgPz8gZ2V0R2VuZXJpY1BsdWdpbkxvYWRGYWlsdXJlTWVzc2FnZShwbHVnaW5JZCl9YCk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNpZW50IGNvbGQtYm9vdCByYWNlIChlbmFibGVkIGJ1dCBub3QgbG9hZGVkLCBubyBjYXVzZSBjYXB0dXJlZCk6IHJldHJ5LlxuICAgIGlmIChhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgIGNvbnN0IGRlbGF5SW5NaWxsaXNlY29uZHMgPSBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMoYmFzZURlbGF5SW5NaWxsaXNlY29uZHMsIGF0dGVtcHQgLSAxKTtcbiAgICAgIGxvZyhcbiAgICAgICAgYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIGJ1dCBub3QgbG9hZGVkIGBcbiAgICAgICAgICArIGAoYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcobWF4QXR0ZW1wdHMpfSk7IHJldHJ5aW5nIGluICR7U3RyaW5nKGRlbGF5SW5NaWxsaXNlY29uZHMpfW1zLi4uYFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHNsZWVwKGRlbGF5SW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAqIEV4aGF1c3RlZCBldmVyeSBhdHRlbXB0IG9uIHRoZSB0cmFuc2llbnQgc2lnbmF0dXJlOiBjb21wb3NlIHRoZSBtb3N0XG4gICAqIHNwZWNpZmljIGRldGFpbCBhdmFpbGFibGUgKGBhZGIgbG9nY2F0YCB0YWlsIG9uIEFuZHJvaWQsIGVsc2UgdGhlIGdlbmVyaWNcbiAgICogbWVzc2FnZSkgXHUyMDE0IHVuY2hhbmdlZCBmcm9tIHRoZSBwcmUtcmV0cnkgc2luZ2xlLXNob3QgZmFpbHVyZS5cbiAgICovXG4gIGNvbnN0IGxvZ2NhdFRhaWwgPSBhd2FpdCB0cmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2U/LihjYXB0dXJlSGFuZGxlKTtcbiAgY29uc3QgZGV0YWlsID0gbG9nY2F0VGFpbCA/PyBnZXRHZW5lcmljUGx1Z2luTG9hZEZhaWx1cmVNZXNzYWdlKHBsdWdpbklkKTtcbiAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGZhaWxlZCB0byBsb2FkOiAke2RldGFpbH1gKTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgcHJvamVjdCByb290IGJ5IHdhbGtpbmcgdXAgZnJvbSBgcHJvY2Vzcy5jd2QoKWAgbG9va2luZyBmb3IgYHBhY2thZ2UuanNvbmAuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqL1xuZnVuY3Rpb24gZmluZFByb2plY3RSb290KCk6IHN0cmluZyB7XG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIExvb3AgdGVybWluYXRlcyBhdCBmaWxlc3lzdGVtIHJvb3QuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGV4aXN0c1N5bmMoam9pbihkaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGpvaW4oZGlyLCAnLi4nKTtcbiAgICBpZiAocGFyZW50ID09PSBkaXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgcHJvamVjdCByb290IChubyBwYWNrYWdlLmpzb24gZm91bmQpLicpO1xuICAgIH1cbiAgICBkaXIgPSBwYXJlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgY3Jvc3MtcHJvY2VzcyBsb2NrIHNjb3BlIGZvciBhIHRyYW5zcG9ydCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBub1xuICogbG9jayBpcyBuZWVkZWQuXG4gKlxuICogRGVza3RvcCBydW5zIHVzZSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBpbnN0YW5jZXMgKHRoZWlyIG93biB1c2VyLWRhdGEgZGlyXG4gKiBhbmQgQ0RQIHBvcnQpLCBzbyB0aGV5IG5vIGxvbmdlciBjb250ZW5kIGFuZCBuZWVkIG5vIGxvY2suIE9ubHkgdGhlIEFuZHJvaWRcbiAqIHRyYW5zcG9ydCwgd2hpY2ggc2hhcmVzIHRoZSBzaW5nbGUgZW11bGF0b3IgYW5kIEFwcGl1bSBzZXJ2ZXIsIG11c3Qgc2VyaWFsaXplLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnRPcHRpb25zIC0gVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIGxvY2sgc2NvcGUgc3RyaW5nLCBvciBgdW5kZWZpbmVkYCBpZiBubyBsb2NrIGlzIG5lZWRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0TG9ja1Njb3BlKHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0cmFuc3BvcnRPcHRpb25zPy50eXBlID09PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nID8gQU5EUk9JRF9MT0NLX1NDT1BFIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBjbGVhbnVwIGhhbmRsZXJzIGZvciBvcnBoYW5lZCBzZXR1cHMgdGhhdCB3ZXJlIG5ldmVyIGV4cGxpY2l0bHlcbiAqIHRvcm4gZG93bi5cbiAqXG4gKiBUd28gaGFuZGxlcnMgY292ZXIgZGlmZmVyZW50IGV4aXQgc2NlbmFyaW9zOlxuICpcbiAqIC0gYGJlZm9yZUV4aXRgIFx1MjAxNCBmaXJlcyB3aGVuIHRoZSBldmVudCBsb29wIGRyYWlucyBuYXR1cmFsbHkuIEFsbG93cyBmdWxsXG4gKiAgIGFzeW5jIHRlYXJkb3duICh1bnJlZ2lzdGVyIHZhdWx0cywgZGlzcG9zZSB0cmFuc3BvcnRzKS4gRG9lcyBOT1QgZmlyZVxuICogICB3aGVuIGBwcm9jZXNzLmV4aXQoKWAgaXMgY2FsbGVkIGRpcmVjdGx5LlxuICpcbiAqIC0gYHVuaGFuZGxlZFJlamVjdGlvbmAgXHUyMDE0IGNhdGNoZXMgYXN5bmMgZXJyb3JzIHRoYXQgYnlwYXNzIGBjb3JlU2V0dXBgJ3NcbiAqICAgY2F0Y2ggYmxvY2suIFBlcmZvcm1zIGZ1bGwgYXN5bmMgdGVhcmRvd24gd2hpbGUgd2Ugc3RpbGwgY2FuLlxuICpcbiAqIC0gYGV4aXRgIFx1MjAxNCBmaXJlcyBvbiBldmVyeSBleGl0LCBpbmNsdWRpbmcgYHByb2Nlc3MuZXhpdCgpYC4gT25seSBzeW5jaHJvbm91c1xuICogICB3b3JrIGlzIHBvc3NpYmxlLCBzbyB0aGlzIGhhbmRsZXIgZG9lcyBiZXN0LWVmZm9ydCBjbGVhbnVwOiBraWxscyBjaGlsZFxuICogICBwcm9jZXNzZXMgdmlhIGBkaXNwb3NlU3luYygpYCBhbmQgcmVtb3ZlcyB0ZW1wIHZhdWx0IGRpcmVjdG9yaWVzIHdpdGhcbiAqICAgYHJtU3luY2AuIFVucmVnaXN0ZXJpbmcgdmF1bHRzICh3aGljaCByZXF1aXJlcyBJUEMgd2l0aCBPYnNpZGlhbikgaXNcbiAqICAgc2tpcHBlZCBcdTIwMTQgYSBzdGFsZSB2YXVsdCBlbnRyeSBpcyBhbiBhY2NlcHRhYmxlIHRyYWRlLW9mZiB2cy4gbGVha2VkXG4gKiAgIHByb2Nlc3NlcyBhbmQgdGVtcCBkaXJlY3Rvcmllcy5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTogdm9pZCB7XG4gIGlmIChpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gUHJvY2VzcyBleGl0aW5nIHdpdGggJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBzZXR1cChzKSBub3QgdG9ybiBkb3duLiBDbGVhbmluZyB1cC4uLmApO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFByb2Nlc3MgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBVbmhhbmRsZWQgcmVqZWN0aW9uIGRldGVjdGVkLiBUZWFyaW5nIGRvd24gJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBhY3RpdmUgc2V0dXAocykuLi5gKTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgY29yZVRlYXJkb3duKHJlc3VsdCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gUmVqZWN0aW9uIGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZVNldHVwcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd25dIFN5bmMgY2xlYW51cDogJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBvcnBoYW5lZCBzZXR1cChzKS5gKTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0LnRyYW5zcG9ydC5kaXNwb3NlU3luYz8uKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFN5bmMgdHJhbnNwb3J0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBybVN5bmMocmVzdWx0LnRlbXBWYXVsdC5wYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFN5bmMgdmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlbGVhc2VTZXR1cExvY2socmVzdWx0KTtcbiAgICB9XG4gICAgYWN0aXZlU2V0dXBzLmNsZWFyKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlbGVhc2VzIGFuZCBmb3JnZXRzIHRoZSBzZXR1cCBsb2NrIGFzc29jaWF0ZWQgd2l0aCBhIHJlc3VsdCwgaWYgYW55LlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgc2V0dXAgcmVzdWx0IHdob3NlIGxvY2sgc2hvdWxkIGJlIHJlbGVhc2VkLlxuICovXG5mdW5jdGlvbiByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdDogQ29yZVNldHVwUmVzdWx0KTogdm9pZCB7XG4gIGNvbnN0IGxvY2sgPSBzZXR1cExvY2tzLmdldChyZXN1bHQpO1xuICBpZiAobG9jaykge1xuICAgIGxvY2sucmVsZWFzZSgpO1xuICAgIHNldHVwTG9ja3MuZGVsZXRlKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgZGlzdCBwYXRoIHRvIHVzZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKlxuICogUGlja3Mgd2hpY2hldmVyIG9mIGBkaXN0L2RldmAgYW5kIGBkaXN0L2J1aWxkYCBoYXMgYSBuZXdlciBgbWFpbi5qc2AuXG4gKiBJZiBvbmx5IG9uZSBleGlzdHMsIHRoYXQgb25lIGlzIHVzZWQuIFRocm93cyBpZiBuZWl0aGVyIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdFJvb3QgLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGNob3NlbiBkaXN0IGZvbGRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURpc3RQYXRoKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkZXZQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9ERVYpO1xuICBjb25zdCBidWlsZFBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0JVSUxEKTtcbiAgY29uc3QgZGV2TWFpbkpzID0gam9pbihkZXZQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgYnVpbGRNYWluSnMgPSBqb2luKGJ1aWxkUGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGRldlN0YXQgPSBleGlzdHNTeW5jKGRldk1haW5KcykgPyBhd2FpdCBzdGF0KGRldk1haW5KcykgOiBudWxsO1xuICBjb25zdCBidWlsZFN0YXQgPSBleGlzdHNTeW5jKGJ1aWxkTWFpbkpzKSA/IGF3YWl0IHN0YXQoYnVpbGRNYWluSnMpIDogbnVsbDtcblxuICBpZiAoZGV2U3RhdCAmJiBidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gZGV2U3RhdC5tdGltZSA+IGJ1aWxkU3RhdC5tdGltZSA/IGRldlBhdGggOiBidWlsZFBhdGg7XG4gIH1cblxuICBpZiAoZGV2U3RhdCkge1xuICAgIHJldHVybiBkZXZQYXRoO1xuICB9XG5cbiAgaWYgKGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBidWlsZFBhdGg7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJ1aWxkIGZvdW5kLiBSdW4gYG5wbSBydW4gYnVpbGRgIG9yIGBucG0gcnVuIGRldmAgZmlyc3QuJyk7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIGFzeW5jIHRlYXJkb3duIHdvcmsgKHZhdWx0IGRpc3Bvc2FsICsgdHJhbnNwb3J0IGRpc3Bvc2FsKS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHNldHVwIHJlc3VsdCB0byB0ZWFyIGRvd24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRlYXJkb3duQXN5bmMocmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudGVtcFZhdWx0LmRpc3Bvc2UocmVzdWx0LnRyYW5zcG9ydCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2U/LigpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVHJhbnNwb3J0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlBLHFCQUdPO0FBQ1Asc0JBTU87QUFDUCx1QkFB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
|
|
388
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgYXMgc2xlZXAgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB0eXBlIHsgRW5hYmxlUGx1Z2luUmVzdWx0IH0gZnJvbSAnLi9lbmFibGUtcGx1Z2luLmNqcyc7XG5pbXBvcnQgdHlwZSB7IFNldHVwTG9jayB9IGZyb20gJy4vc2V0dXAtbG9jay5janMnO1xuaW1wb3J0IHR5cGUgeyBQb3B1bGF0ZUZpbGVzUGFyYW1zIH0gZnJvbSAnLi90ZW1wLXZhdWx0LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQge1xuICBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICBnZXRHZW5lcmljUGx1Z2luTG9hZEZhaWx1cmVNZXNzYWdlXG59IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5janMnO1xuaW1wb3J0IHsgZXJyb3JUb1N0cmluZyB9IGZyb20gJy4vZXJyb3ItdG8tc3RyaW5nLmNqcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5janMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cuY2pzJztcbmltcG9ydCB7XG4gIGNvbXB1dGVCYWNrb2ZmRGVsYXlJbk1pbGxpc2Vjb25kcyxcbiAgcmVzb2x2ZVBsdWdpbkVuYWJsZVJldHJ5Q291bnQsXG4gIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHMsXG4gIHNob3VsZFJldHJ5UGx1Z2luRW5hYmxlXG59IGZyb20gJy4vcGx1Z2luLWVuYWJsZS1yZXRyeS5janMnO1xuaW1wb3J0IHsgYWNxdWlyZVNldHVwTG9jayB9IGZyb20gJy4vc2V0dXAtbG9jay5janMnO1xuaW1wb3J0IHsgVGVtcFZhdWx0IH0gZnJvbSAnLi90ZW1wLXZhdWx0LmNqcyc7XG5pbXBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0uY2pzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2RwJztcbmNvbnN0IERJU1RfREVWID0gJ2Rpc3QvZGV2JztcbmNvbnN0IERJU1RfQlVJTEQgPSAnZGlzdC9idWlsZCc7XG5jb25zdCBNQUlOX0pTID0gJ21haW4uanMnO1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9ICcub2JzaWRpYW4nO1xuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuY29uc3QgQVBQX0pTT04gPSAnYXBwLmpzb24nO1xuY29uc3QgQVBQX0pTT05fSU5ERU5UID0gMjtcblxuLyoqXG4gKiBUcmFja3Mgc2V0dXBzIHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBidXQgaGF2ZW4ndCBiZWVuIHRvcm4gZG93biB5ZXQuXG4gKiBVc2VkIGJ5IHRoZSBgYmVmb3JlRXhpdGAgaGFuZGxlciB0byBjbGVhbiB1cCB3aGVuIGEgdGVzdCBydW5uZXIgZXhpdHNcbiAqIHdpdGhvdXQgY2FsbGluZyB0ZWFyZG93biAoZS5nLiwgd2hlbiBvbmUgcHJvamVjdCdzIHNldHVwIGZhaWxzIGFuZCB0aGVcbiAqIHJ1bm5lciBhYm9ydHMgYmVmb3JlIHRlYXJpbmcgZG93biBhbHJlYWR5LWluaXRpYWxpemVkIHByb2plY3RzKS5cbiAqL1xuY29uc3QgYWN0aXZlU2V0dXBzID0gbmV3IFNldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5jb25zdCBkaXNwb3NlZFJlc3VsdHMgPSBuZXcgV2Vha1NldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5sZXQgaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgY3Jvc3MtcHJvY2VzcyBzZXR1cCBsb2NrIGhlbGQgYnkgZWFjaCBhY3RpdmUgc2V0dXAuIFJlbGVhc2VkIHdoZW4gdGhlXG4gKiBzZXR1cCBpcyB0b3JuIGRvd24gKG9yIGJ5IHRoZSBwcm9jZXNzIGNsZWFudXAgaGFuZGxlcnMpLCBhbGxvd2luZyBhIGNvbXBldGluZ1xuICogcnVuIHRvIHByb2NlZWQuIFNlZSB7QGxpbmsgYWNxdWlyZVNldHVwTG9ja30uXG4gKi9cbmNvbnN0IHNldHVwTG9ja3MgPSBuZXcgTWFwPENvcmVTZXR1cFJlc3VsdCwgU2V0dXBMb2NrPigpO1xuXG5jb25zdCBBTkRST0lEX0xPQ0tfU0NPUEUgPSAnYW5kcm9pZCc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcmVTZXR1cH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNldHVwUGFyYW1zIHtcbiAgLyoqXG4gICAqIENvbW11bml0eS1wbHVnaW4gaWRzIHRvIGVuYWJsZSBpbiB0aGUgdmF1bHQgKippbiBhZGRpdGlvbiB0byoqIHRoZVxuICAgKiBwbHVnaW4tdW5kZXItdGVzdCwgYWZ0ZXIgaXQgaXMgZW5hYmxlZC4gRWFjaCBpZCdzIGJ1aWx0IGZpbGVzIG11c3QgYWxyZWFkeSBiZVxuICAgKiBwcmVzZW50IHVuZGVyIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+L2AgXHUyMDE0IHNlZWQgdGhlbSB2aWEge0BsaW5rIENvcmVTZXR1cFBhcmFtcy5wb3B1bGF0ZX1cbiAgICogKGUuZy4gd2l0aCBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWApLiBFbmFibGluZyBnb2VzIHRocm91Z2ggdGhlIHNhbWVcbiAgICogcmV0cnkvbG9hZC12ZXJpZnkgcGF0aCBhcyB0aGUgcGx1Z2luLXVuZGVyLXRlc3QuIENvbXBvc2VzIHdpdGhcbiAgICogYGluc3RhbGxQbHVnaW46IGZhbHNlYCAoZW5hYmxlIGV4dHJhcyBpbnRvIGFuIG90aGVyd2lzZSBwbHVnaW4tbGVzcyB2YXVsdCkuXG4gICAqL1xuICByZWFkb25seSBlbmFibGVDb21tdW5pdHlQbHVnaW5zPzogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5zdGFsbCBhbmQgZW5hYmxlIHRoZSBidWlsdCBwbHVnaW4gaW4gdGhlIHRlbXAgdmF1bHQuIERlZmF1bHRzXG4gICAqIHRvIGB0cnVlYC4gU2V0IHRvIGBmYWxzZWAgZm9yIGEgKipub24tcGx1Z2luKiogY29uc3VtZXIgKGUuZy4gYSB0eXBpbmdzXG4gICAqIGNyYXdsZXIpIHRoYXQgb25seSBuZWVkcyBhIHJlZ2lzdGVyZWQsIGVtcHR5IHZhdWx0IHRvIGBldmFsSW5PYnNpZGlhbmBcbiAgICogYWdhaW5zdDogdGhlIHBsdWdpbiBgZGlzdGAvYG1hbmlmZXN0Lmpzb25gIHJlYWQsIHRoZSBjb3B5IGludG9cbiAgICogYC5vYnNpZGlhbi9wbHVnaW5zYCwgdGhlIGBjb21tdW5pdHktcGx1Z2lucy5qc29uYCB3cml0ZSwgYW5kIHRoZSBlbmFibGUgc3RlcFxuICAgKiBhcmUgYWxsIHNraXBwZWQsIHdoaWxlIHRoZSB0cmFuc3BvcnQsIHRlbXAgdmF1bHQsIHJlZ2lzdHJhdGlvbiwgYW5kXG4gICAqIHdvcmtlci1mYWNpbmcgZW5kcG9pbnQgcHJvdmlzaW9uaW5nIHN0aWxsIHJ1biB1bmNoYW5nZWQuXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsUGx1Z2luPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRmlsZXMgYW5kIGZvbGRlcnMgdG8gd3JpdGUgaW50byB0aGUgdmF1bHQgKipiZWZvcmUqKiBPYnNpZGlhbiBvcGVucyBpdCwgc29cbiAgICogaXRzIHN0YXJ0dXAgc2NhbiBpbmRleGVzIHRoZW0gaW4gb25lIHBhc3MgKHNlZSB7QGxpbmsgVGVtcFZhdWx0LnBvcHVsYXRlfSkuXG4gICAqIFVzZSB0aGlzIGZvciBsYXJnZSBmaXh0dXJlcyBcdTIwMTQgd3JpdGluZyB0aG91c2FuZHMgb2Ygbm90ZXMgYWZ0ZXIgb3BlbiBhbmRcbiAgICogZm9yY2luZyBhIHJlLXNjYW4gaXMgZmFyIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBvcHVsYXRlPzogUG9wdWxhdGVGaWxlc1BhcmFtcyB8IHVuZGVmaW5lZDtcblxuICAvKiogVHJhbnNwb3J0IG9wdGlvbnMuIFdoZW4gb21pdHRlZCwgdXNlcyBhbiBvZmYtc2NyZWVuIG93bmVkIGRlc2t0b3AgaW5zdGFuY2UuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IHtAbGluayBjb3JlU2V0dXB9LCB1c2VkIGJ5IGZyYW1ld29yayBhZGFwdGVyc1xuICogdG8gcGFzcyBjb250ZXh0IHRvIHRlc3Qgd29ya2Vycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBSZXN1bHQge1xuICAvKiogVGhlIHRlbXBvcmFyeSB2YXVsdCBjcmVhdGVkIGR1cmluZyBzZXR1cC4gKi9cbiAgcmVhZG9ubHkgdGVtcFZhdWx0OiBUZW1wVmF1bHQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgdXNlZCBkdXJpbmcgc2V0dXAuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMgKGUuZy4gYFwib2JzaWRpYW4tY2RwXCJgKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0TGFiZWw6IHN0cmluZztcblxuICAvKiogVGhlIHRyYW5zcG9ydCBvcHRpb25zIHRoYXQgd2VyZSByZXNvbHZlZC4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb3B5UGx1Z2luSW50b1ZhdWx0fS5cbiAqL1xuaW50ZXJmYWNlIENvcHlQbHVnaW5JbnRvVmF1bHRQYXJhbXMge1xuICAvKiogU2hvcnQgbGFiZWwgZm9yIGxvZyBtZXNzYWdlcy4gKi9cbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcblxuICAvKiogVGhlIHByb2plY3Qgcm9vdCB0byByZXNvbHZlIHRoZSBidWlsdCBwbHVnaW4gZnJvbS4gKi9cbiAgcmVhZG9ubHkgcHJvamVjdFJvb3Q6IHN0cmluZztcblxuICAvKiogVGhlIHRlbXAgdmF1bHQgdG8gY29weSB0aGUgcGx1Z2luIGludG8uICovXG4gIHJlYWRvbmx5IHRlbXBWYXVsdDogVGVtcFZhdWx0O1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0ICh1c2VkIGZvciB0aGUgbW9iaWxlL2Rlc2t0b3Atb25seSBjb21wYXRpYmlsaXR5IGNoZWNrKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zfS5cbiAqL1xuaW50ZXJmYWNlIEVuYWJsZUV4dHJhQ29tbXVuaXR5UGx1Z2luc1BhcmFtcyB7XG4gIC8qKiBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzLiAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgaWRzIG9mIHRoZSBleHRyYSBjb21tdW5pdHkgcGx1Z2lucyB0byBlbmFibGUgKHRoZWlyIGJpbmFyaWVzIG11c3QgYWxyZWFkeSBiZSBpbiB0aGUgdmF1bHQpLiAqL1xuICByZWFkb25seSBwbHVnaW5JZHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBUaGUgdGVtcCB2YXVsdCB0aGUgcGx1Z2lucyB3ZXJlIHNlZWRlZCBpbnRvLiAqL1xuICByZWFkb25seSB0ZW1wVmF1bHQ6IFRlbXBWYXVsdDtcblxuICAvKiogVGhlIHRyYW5zcG9ydCB0byBldmFsdWF0ZSBhZ2FpbnN0LiAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0O1xuXG4gIC8qKiBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMgKHNvdXJjZSBvZiB0aGUgcGx1Z2luLWVuYWJsZSByZXRyeSBrbm9icykuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IG51bGwgfCBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVuYWJsZVBsdWdpbkluVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgRW5hYmxlUGx1Z2luSW5WYXVsdFBhcmFtcyB7XG4gIC8qKiBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzLiAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgaWQgb2YgdGhlIHBsdWdpbiB0byBlbmFibGUuICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSB0ZW1wIHZhdWx0IHRoZSBwbHVnaW4gd2FzIGNvcGllZCBpbnRvLiAqL1xuICByZWFkb25seSB0ZW1wVmF1bHQ6IFRlbXBWYXVsdDtcblxuICAvKiogVGhlIHRyYW5zcG9ydCB0byBldmFsdWF0ZSBhZ2FpbnN0LiAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0O1xuXG4gIC8qKiBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMgKHNvdXJjZSBvZiB0aGUgcGx1Z2luLWVuYWJsZSByZXRyeSBrbm9icykuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IG51bGwgfCBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnM7XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCBzZXR1cCBsb2dpYy5cbiAqXG4gKiBMb2FkcyBgLmVudmAgZnJvbSB0aGUgcHJvamVjdCByb290LCBjcmVhdGVzIGEgdHJhbnNwb3J0LCBjcmVhdGVzIGFuZCByZWdpc3RlcnNcbiAqIGEgdGVtcG9yYXJ5IHZhdWx0IHdpdGggT2JzaWRpYW4sIGFuZCBcdTIwMTQgdW5sZXNzIHtAbGluayBDb3JlU2V0dXBQYXJhbXMuaW5zdGFsbFBsdWdpbn1cbiAqIGlzIGBmYWxzZWAgXHUyMDE0IGNvcGllcyB0aGUgYnVpbHQgcGx1Z2luIGludG8gdGhlIHZhdWx0IGFuZCBlbmFibGVzIGl0LiBUaGVcbiAqIHBsdWdpbi1sZXNzIG1vZGUgc3RpbGwgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIGFuZCBwdWJsaXNoZXMgaXRzXG4gKiB3b3JrZXItZmFjaW5nIGVuZHBvaW50LCBzbyBhIG5vbi1wbHVnaW4gY29uc3VtZXIgcmV1c2VzIHRoZSBzYW1lIGF0dGFjaCB3aXJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNldHVwIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgc2V0dXAgcmVzdWx0IGNvbnRhaW5pbmcgdGhlIHRlbXAgdmF1bHQsIHRyYW5zcG9ydCwgYW5kIHJlc29sdmVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3JlU2V0dXAocGFyYW1zPzogQ29yZVNldHVwUGFyYW1zKTogUHJvbWlzZTxDb3JlU2V0dXBSZXN1bHQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBmaW5kUHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZW52RmlsZVBhdGggPSBqb2luKHByb2plY3RSb290LCAnLmVudicpO1xuICBpZiAoZXhpc3RzU3luYyhlbnZGaWxlUGF0aCkpIHtcbiAgICBsb2FkRW52RmlsZShlbnZGaWxlUGF0aCk7XG4gIH1cblxuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gcmVzb2x2ZUludGVncmF0aW9uVHJhbnNwb3J0T3B0aW9ucyhwYXJhbXM/LnRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCBsYWJlbCA9IHRyYW5zcG9ydE9wdGlvbnMudHlwZTtcbiAgY29uc3QgbG9ja1Njb3BlID0gZ2V0TG9ja1Njb3BlKHRyYW5zcG9ydE9wdGlvbnMpO1xuXG4gIGxldCBsb2NrOiBTZXR1cExvY2sgfCB1bmRlZmluZWQ7XG4gIGlmIChsb2NrU2NvcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBBY3F1aXJpbmcgJyR7bG9ja1Njb3BlfScgc2V0dXAgbG9jayAoc2VyaWFsaXplcyBhZ2FpbnN0IGFueSBjb25jdXJyZW50IGludGVncmF0aW9uLXRlc3QgcnVuKS4uLmApO1xuICAgIGxvY2sgPSBhd2FpdCBhY3F1aXJlU2V0dXBMb2NrKHsgbGFiZWwsIHNjb3BlOiBsb2NrU2NvcGUgfSk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGxvY2sgYWNxdWlyZWQuYCk7XG4gIH1cblxuICBsZXQgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCB8IHVuZGVmaW5lZDtcbiAgbGV0IHRlbXBWYXVsdDogVGVtcFZhdWx0IHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIENyZWF0aW5nIHRyYW5zcG9ydC4uLmApO1xuICAgIHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBUcmFuc3BvcnQgY3JlYXRlZDogJHt0cmFuc3BvcnQuY29uc3RydWN0b3IubmFtZX1gKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBQcm9qZWN0IHJvb3Q6ICR7cHJvamVjdFJvb3R9YCk7XG4gICAgY29uc3Qgc2hvdWxkSW5zdGFsbFBsdWdpbiA9IHBhcmFtcz8uaW5zdGFsbFBsdWdpbiAhPT0gZmFsc2U7XG5cbiAgICB0ZW1wVmF1bHQgPSBuZXcgVGVtcFZhdWx0KCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIENyZWF0ZWQgdGVtcCB2YXVsdDogJHt0ZW1wVmF1bHQucGF0aH1gKTtcblxuICAgIGxldCBwbHVnaW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHNob3VsZEluc3RhbGxQbHVnaW4pIHtcbiAgICAgIHBsdWdpbklkID0gYXdhaXQgY29weVBsdWdpbkludG9WYXVsdCh7IGxhYmVsLCBwcm9qZWN0Um9vdCwgdGVtcFZhdWx0LCB0cmFuc3BvcnQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTa2lwcGluZyBwbHVnaW4gaW5zdGFsbCAoaW5zdGFsbFBsdWdpbjogZmFsc2UpIFx1MjAxNCByZWdpc3RlcmluZyBhbiBlbXB0eSB2YXVsdC5gKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zPy5wb3B1bGF0ZSkge1xuICAgICAgY29uc3QgZW50cnlDb3VudCA9IE9iamVjdC5rZXlzKHBhcmFtcy5wb3B1bGF0ZSkubGVuZ3RoO1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBvcHVsYXRpbmcgdmF1bHQgd2l0aCAke1N0cmluZyhlbnRyeUNvdW50KX0gZW50cmllcyBiZWZvcmUgb3Blbi4uLmApO1xuICAgICAgdGVtcFZhdWx0LnBvcHVsYXRlKHBhcmFtcy5wb3B1bGF0ZSk7XG4gICAgfVxuXG4gICAgYXdhaXQgZW5zdXJlQWx3YXlzVXBkYXRlTGlua3ModGVtcFZhdWx0LCBsYWJlbCk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU3luY2luZyB2YXVsdCB0byBkZXZpY2UuLi5gKTtcbiAgICBhd2FpdCB0ZW1wVmF1bHQuc3luY1RvRGV2aWNlKHRyYW5zcG9ydCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFJlZ2lzdGVyaW5nIHZhdWx0Li4uYCk7XG4gICAgYXdhaXQgdGVtcFZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFZhdWx0IHJlZ2lzdGVyZWQuYCk7XG5cbiAgICBpZiAocGx1Z2luSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgZW5hYmxlUGx1Z2luSW5WYXVsdCh7IGxhYmVsLCBwbHVnaW5JZCwgdGVtcFZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydE9wdGlvbnMgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgZW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zKHtcbiAgICAgIGxhYmVsLFxuICAgICAgcGx1Z2luSWRzOiBwYXJhbXM/LmVuYWJsZUNvbW11bml0eVBsdWdpbnMgPz8gW10sXG4gICAgICB0ZW1wVmF1bHQsXG4gICAgICB0cmFuc3BvcnQsXG4gICAgICB0cmFuc3BvcnRPcHRpb25zXG4gICAgfSk7XG5cbiAgICBjb25zdCBhdWdtZW50ZWRPcHRpb25zID0gYXVnbWVudFRyYW5zcG9ydE9wdGlvbnModHJhbnNwb3J0T3B0aW9ucywgdHJhbnNwb3J0KTtcbiAgICBjb25zdCByZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCA9IHsgdGVtcFZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydExhYmVsOiBsYWJlbCwgdHJhbnNwb3J0T3B0aW9uczogYXVnbWVudGVkT3B0aW9ucyB9O1xuICAgIGFjdGl2ZVNldHVwcy5hZGQocmVzdWx0KTtcbiAgICBpZiAobG9jaykge1xuICAgICAgc2V0dXBMb2Nrcy5zZXQocmVzdWx0LCBsb2NrKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBmYWlsZWQsIGNsZWFuaW5nIHVwLi4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0ZW1wVmF1bHQgJiYgdHJhbnNwb3J0KSB7XG4gICAgICAgIGF3YWl0IHRlbXBWYXVsdC5kaXNwb3NlKHRyYW5zcG9ydCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoY2xlYW51cEVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cmFuc3BvcnQ/LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoY2xlYW51cEVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBSZWxlYXNlIHRoZSBsb2NrIHNvIGEgd2FpdGluZyBydW4gY2FuIHByb2NlZWQgZXZlbiB0aG91Z2ggdGhpcyBydW4gZmFpbGVkLlxuICAgIGxvY2s/LnJlbGVhc2UoKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBOT1RFOiBJZiB0aGUgdGVzdCBydW5uZXIgcmVwb3J0cyBcIk5vIHRlc3QgZmlsZXMgZm91bmRcIiwgaWdub3JlIGl0IFx1MjAxNCBpdCBpcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBzZXR1cCBmYWlsdXJlIGFib3ZlLmApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCB0ZWFyZG93biBsb2dpYy5cbiAqXG4gKiBEaXNwb3NlcyBvZiB0aGUgdGVtcG9yYXJ5IHZhdWx0IGFuZCB0cmFuc3BvcnQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgZnJvbSB7QGxpbmsgY29yZVNldHVwfS4gV2hlbiBgdW5kZWZpbmVkYCwgZG9lcyBub3RoaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVRlYXJkb3duKHJlc3VsdD86IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlc3VsdCB8fCBkaXNwb3NlZFJlc3VsdHMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZGlzcG9zZWRSZXN1bHRzLmFkZChyZXN1bHQpO1xuXG4gIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVGVhcmluZyBkb3duLi4uYCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0ZWFyZG93bkFzeW5jKHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBDbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2ZVNldHVwcy5kZWxldGUocmVzdWx0KTtcbiAgICByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0cmFuc3BvcnQgb3B0aW9ucyBmb3IgYW4gaW50ZWdyYXRpb24gcnVuLlxuICpcbiAqIERlc2t0b3AgbGF1bmNoZXMgYXJlIG5vcm1hbGx5IHZpc2libGUsIGJ1dCB0ZXN0IHNldHVwIGV4cGxpY2l0bHkga2VlcHMgaXRzXG4gKiBvd25lZCBpbnN0YW5jZSBvZmYtc2NyZWVuIHNvIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgZGV2ZWxvcGVyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uc3VtZXItcHJvdmlkZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBPcHRpb25zIHdpdGggdGhlIGRlc2t0b3AgaW50ZWdyYXRpb24gdmlzaWJpbGl0eSBkZWZhdWx0IGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSW50ZWdyYXRpb25UcmFuc3BvcnRPcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMge1xuICBpZiAob3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJykge1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGlzT2JzaWRpYW5BcHBWaXNpYmxlOiBvcHRpb25zPy5pc09ic2lkaWFuQXBwVmlzaWJsZSA/PyBmYWxzZSxcbiAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICB9O1xufVxuXG4vKipcbiAqIEF1Z21lbnRzIHRyYW5zcG9ydCBvcHRpb25zIHdpdGggcmV1c2UgaW5mbyBzbyB0ZXN0IHdvcmtlcnMgY2FuIHJlYXR0YWNoIHRvIHRoZVxuICogaW5zdGFuY2UgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGluc3RlYWQgb2YgY3JlYXRpbmcgdGhlaXIgb3duOlxuICpcbiAqIC0gKipBcHBpdW0qKiBcdTIwMTQgaW5qZWN0cyB0aGUgZXN0YWJsaXNoZWQgYHNlc3Npb25JZGAvYGRldmljZUlkYC5cbiAqIC0gKipPd25lZCBkZXNrdG9wIENEUCoqIFx1MjAxNCBpbmplY3RzIHRoZSBvd25lZCBpbnN0YW5jZSdzIGBob3N0YC9gcG9ydGAgKGNob3NlblxuICogICBhdCBsYXVuY2gpIHBsdXMgdGhlIGludGVybmFsIGBpc0hhcm5lc3NPd25lZEluc3RhbmNlYCBmbGFnLCBzbyBlYWNoIHdvcmtlclxuICogICAqKmF0dGFjaGVzKiogdG8gdGhhdCBpbnN0YW5jZSBvdmVyIENEUCByYXRoZXIgdGhhbiBsYXVuY2hpbmcgKGFuZCBuZXZlclxuICogICByZWdpc3RlcmluZykgaXRzIG93biBcdTIwMTQgdGhlIGJ1ZyB0aGF0IG90aGVyd2lzZSBsZWF2ZXMgYSB3b3JrZXIncyB0cmFuc3BvcnRcbiAqICAgd2l0aCBubyBDRFAgZW5kcG9pbnQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3JpZ2luYWwgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqIEByZXR1cm5zIFRoZSBhdWdtZW50ZWQgb3B0aW9ucywgb3IgdGhlIG9yaWdpbmFsIG9wdGlvbnMgaWYgbm90IGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIGF1Z21lbnRUcmFuc3BvcnRPcHRpb25zKFxuICBvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnRcbik6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb25zPy50eXBlID09PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nICYmIHRyYW5zcG9ydCBpbnN0YW5jZW9mIEFwcGl1bVRyYW5zcG9ydCkge1xuICAgIGNvbnN0IHNlc3Npb25JbmZvID0gdHJhbnNwb3J0LmdldFNlc3Npb25JbmZvKCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtvcHRpb25zLnR5cGV9XSBTZXNzaW9uIHJldXNlIGluZm86IHNlc3Npb25JZD0ke3Nlc3Npb25JbmZvLnNlc3Npb25JZH0sIGRldmljZUlkPSR7c2Vzc2lvbkluZm8uZGV2aWNlSWR9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkZXZpY2VJZDogc2Vzc2lvbkluZm8uZGV2aWNlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JbmZvLnNlc3Npb25JZFxuICAgIH07XG4gIH1cblxuICBpZiAoKG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSAmJiB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0cmFuc3BvcnQuZ2V0T3duZWRJbnN0YW5jZUVuZHBvaW50KCk7XG4gICAgaWYgKGVuZHBvaW50KSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke0RFRkFVTFRfVFJBTlNQT1JUX1RZUEV9XSBPd25lZCBpbnN0YW5jZSByZXVzZSBpbmZvOiBob3N0PSR7ZW5kcG9pbnQuaG9zdH0sIHBvcnQ9JHtTdHJpbmcoZW5kcG9pbnQucG9ydCl9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBob3N0OiBlbmRwb2ludC5ob3N0LFxuICAgICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiB0cnVlLFxuICAgICAgICBwb3J0OiBlbmRwb2ludC5wb3J0LFxuICAgICAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIHRoZSB0ZW1wIHZhdWx0IGFuZCBtYXJrcyBpdCBhcyBhIGNvbW11bml0eSBwbHVnaW4uXG4gKlxuICogUmVhZHMgYG1hbmlmZXN0Lmpzb25gIGZyb20gdGhlIG5ld2VyIG9mIGBkaXN0L2RldmAvYGRpc3QvYnVpbGRgLCByZWplY3RzIGFcbiAqIGRlc2t0b3Atb25seSBwbHVnaW4gb24gYSBtb2JpbGUgdHJhbnNwb3J0LCBjb3BpZXMgdGhlIGJ1aWxkIGludG9cbiAqIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+YCwgYW5kIHdyaXRlcyBgLm9ic2lkaWFuL2NvbW11bml0eS1wbHVnaW5zLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29weSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHBsdWdpbiBpZCByZWFkIGZyb20gdGhlIG1hbmlmZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5UGx1Z2luSW50b1ZhdWx0KHBhcmFtczogQ29weVBsdWdpbkludG9WYXVsdFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgbGFiZWwsIHByb2plY3RSb290LCB0ZW1wVmF1bHQsIHRyYW5zcG9ydCB9ID0gcGFyYW1zO1xuICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuICBjb25zdCBwbHVnaW5JZCA9IG1hbmlmZXN0SnNvbi5pZDtcblxuICBpZiAodHJhbnNwb3J0LmlzTW9iaWxlICYmIG1hbmlmZXN0SnNvbi5pc0Rlc2t0b3BPbmx5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGlzRGVza3RvcE9ubHk6IHRydWUgaW4gbWFuaWZlc3QuanNvbi4gTW9iaWxlIGludGVncmF0aW9uIHRlc3RzIGNhbm5vdCBydW4gZm9yIGRlc2t0b3Atb25seSBwbHVnaW5zLmBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWFpbkpzID0gam9pbihkaXN0UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGF3YWl0IHN0YXQobWFpbkpzKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFVzaW5nICR7ZGlzdFBhdGh9ICgke2J1aWxkU3RhdC5tdGltZS50b0lTT1N0cmluZygpfSkuIElmIG91dGRhdGVkLCByZWJ1aWxkLmApO1xuXG4gIGNvbnN0IHBsdWdpbkRpciA9IGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIFBMVUdJTlNfRElSLCBwbHVnaW5JZCk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGNwKGRpc3RQYXRoLCBwbHVnaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiksIEpTT04uc3RyaW5naWZ5KFtwbHVnaW5JZF0pKTtcblxuICByZXR1cm4gcGx1Z2luSWQ7XG59XG5cbi8qKlxuICogRW5hYmxlcyBleHRyYSBjb21tdW5pdHkgcGx1Z2lucyAoYmV5b25kIHRoZSBwbHVnaW4tdW5kZXItdGVzdCkgaW4gdGhlIHJlZ2lzdGVyZWQgdmF1bHQsIGVhY2ggdGhyb3VnaCB0aGVcbiAqIHNhbWUge0BsaW5rIGVuYWJsZVBsdWdpbkluVmF1bHR9IHBhdGguIEVhY2ggcGx1Z2luJ3MgYnVpbHQgZmlsZXMgbXVzdCBhbHJlYWR5IGJlIHByZXNlbnQgaW4gdGhlIHZhdWx0IChzZWVkXG4gKiB0aGVtIHZpYSB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLnBvcHVsYXRlfSkuIEEgbm8tb3Agd2hlbiB0aGUgbGlzdCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVuYWJsZSBwYXJhbWV0ZXJzLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnMocGFyYW1zOiBFbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcGx1Z2luSWRzLCB0ZW1wVmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0T3B0aW9ucyB9ID0gcGFyYW1zO1xuICBmb3IgKGNvbnN0IHBsdWdpbklkIG9mIHBsdWdpbklkcykge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBleHRyYSBjb21tdW5pdHkgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi4uLmApO1xuICAgIGF3YWl0IGVuYWJsZVBsdWdpbkluVmF1bHQoeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0pO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlcyB0aGUgcGx1Z2luIGluIHRoZSByZWdpc3RlcmVkIHZhdWx0IGFuZCB2ZXJpZmllcyBpdCBsb2FkZWQuXG4gKlxuICogT2JzaWRpYW4ncyBgZW5hYmxlUGx1Z2luKClgIHdyYXBzIGBsb2FkUGx1Z2luKClgIGluIGEgdHJ5LWNhdGNoIHRoYXQgc3dhbGxvd3NcbiAqIGVycm9ycyBhbmQgcmV0dXJucyBmYWxzZSwgc28ge0BsaW5rIGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmV9IG1vbmtleS1wYXRjaGVzXG4gKiBgbG9hZFBsdWdpbigpYCB0byBjYXB0dXJlIHRoZSBlcnJvciBiZWZvcmUgaXQncyBzd2FsbG93ZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbmFibGUgcGFyYW1ldGVycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5hYmxlUGx1Z2luSW5WYXVsdChwYXJhbXM6IEVuYWJsZVBsdWdpbkluVmF1bHRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0gPSBwYXJhbXM7XG4gIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBwbHVnaW4gXCIke3BsdWdpbklkfVwiLi4uYCk7XG5cbiAgLypcbiAgICogT3BlbiBhIG5hdGl2ZSBjb25zb2xlLWNhcHR1cmUgd2luZG93IChMYXllciAyLCBBbmRyb2lkIG9ubHkpIGFyb3VuZCB0aGVcbiAgICogZW5hYmxlIHNvIHRoYXQgaWYgT2JzaWRpYW4gc3dhbGxvd3MgdGhlIGxvYWQgZXJyb3IgYmVmb3JlIHRoZSBtb25rZXktcGF0Y2hcbiAgICogYW5kIHRoZSByZW5kZXJlciBjb25zb2xlIChMYXllciAxKSBjYW1lIHVwIGVtcHR5LCB3ZSBjYW4gc3RpbGwgcmVjb3ZlciB0aGVcbiAgICogcmVhbCBjYXVzZSBmcm9tIGBhZGIgbG9nY2F0YC4gTm8tb3AgKHVuZGVmaW5lZCkgb24gdHJhbnNwb3J0cyB0aGF0IGRvbid0XG4gICAqIGltcGxlbWVudCBpdCAoZS5nLiBkZXNrdG9wKS5cbiAgICovXG4gIGNvbnN0IGNhcHR1cmVIYW5kbGUgPSBhd2FpdCB0cmFuc3BvcnQuYmVnaW5Db25zb2xlQ2FwdHVyZT8uKCk7XG5cbiAgLypcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHdlIGVuYWJsZSB0aGUgcGx1Z2luLCBzbyBhIHNpbmdsZS1zaG90IGVuYWJsZSByYWNlcyB0aGUgbG9hZCBhbmQgbG9zZXNcbiAgICogKHRoZSBwbHVnaW4gbGFuZHMgaW4gdGhlIGVuYWJsZWQgc2V0IGJ1dCBuZXZlciBsb2FkcykuIFJldHJ5IHRoZSBlbmFibGUgK1xuICAgKiBsb2FkLXZlcmlmaWNhdGlvbiBhIGZldyB0aW1lcyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYsIHdoaWNoIHJlY292ZXJzIHRoZVxuICAgKiB0cmFuc2llbnQgcmFjZS4gQSBjYXB0dXJlZCBsb2FkIGVycm9yIChgcmVhbEVycm9yYCkgaXMgYSBkZXRlcm1pbmlzdGljIGJ1ZyBcdTIwMTRcbiAgICogcmV0cnlpbmcgY2Fubm90IGZpeCBpdCwgc28gd2UgZmFpbCBmYXN0LiBOb24tQW5kcm9pZCB0cmFuc3BvcnRzIHJlc29sdmUgdG9cbiAgICogdGhlIHNhbWUgZGVmYXVsdHMgYnV0IG5ldmVyIGVudGVyIHRoZSByZXRyeSBwYXRoOiB0aGVpciBsb2FkIGVpdGhlciBzdWNjZWVkc1xuICAgKiBvbiB0aGUgZmlyc3QgYXR0ZW1wdCBvciB0aHJvd3MgYSBjYXB0dXJlZCBlcnJvci5cbiAgICovXG4gIGNvbnN0IG1heEF0dGVtcHRzID0gMSArIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeUNvdW50KHRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCBiYXNlRGVsYXlJbk1pbGxpc2Vjb25kcyA9IHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHModHJhbnNwb3J0T3B0aW9ucyk7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGxldCByZXN1bHQ6IEVuYWJsZVBsdWdpblJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgICBhcmdzOiB7IHBsdWdpbklkIH0sXG4gICAgICAgIGZuOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgICAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlLFxuICAgICAgICB0cmFuc3BvcnQsXG4gICAgICAgIHZhdWx0UGF0aDogdGVtcFZhdWx0LnBhdGhcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvKlxuICAgICAgICogVGhlIGV2YWwgaXRzZWxmIHRocmV3IChlLmcuIHRoZSBXZWJWaWV3IGNvbnRleHQgd2FzIGxvc3QgbWlkLWV4ZWN1dGlvbiBvblxuICAgICAgICogYSBjaHVybmluZyBndWVzdCkgXHUyMDE0IGEgdHJhbnNwb3J0LWxldmVsIHRyYW5zaWVudC4gUmV0cnkgaWYgYXR0ZW1wdHMgcmVtYWluLlxuICAgICAgICovXG4gICAgICBpZiAoYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgIGNvbnN0IGRlbGF5SW5NaWxsaXNlY29uZHMgPSBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMoYmFzZURlbGF5SW5NaWxsaXNlY29uZHMsIGF0dGVtcHQgLSAxKTtcbiAgICAgICAgbG9nKFxuICAgICAgICAgIGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIEVuYWJsZSBhdHRlbXB0ICR7U3RyaW5nKGF0dGVtcHQpfS8ke1N0cmluZyhtYXhBdHRlbXB0cyl9IHRocmV3IGBcbiAgICAgICAgICAgICsgYCgke2Vycm9yVG9TdHJpbmcoZXJyb3IpfSk7IHJldHJ5aW5nIGluICR7U3RyaW5nKGRlbGF5SW5NaWxsaXNlY29uZHMpfW1zLi4uYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChkZWxheUluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGBlcnJvck1lc3NhZ2VgIGlzIHRoZSByZWFsIHRocm93IHNlZW4gYnkgdGhlIG1vbmtleS1wYXRjaDtcbiAgICAgKiBgcmVuZGVyZXJDb25zb2xlRXJyb3JzYCAoTGF5ZXIgMSkgaXMgdGhlIHJlYWwgY2F1c2UgY29uc29sZS1sb2dnZWQgaW4gdGhlIHJlbmRlcmVyLlxuICAgICAqL1xuICAgIGNvbnN0IHJlYWxFcnJvciA9IHJlc3VsdC5lcnJvck1lc3NhZ2UgPz8gcmVzdWx0LnJlbmRlcmVyQ29uc29sZUVycm9ycztcblxuICAgIGlmIChyZXN1bHQuaXNMb2FkZWQgJiYgIXJlYWxFcnJvcikge1xuICAgICAgY29uc3QgYXR0ZW1wdFN1ZmZpeCA9IGF0dGVtcHQgPiAxID8gYCAoYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcobWF4QXR0ZW1wdHMpfSlgIDogJyc7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIHN1Y2Nlc3NmdWxseSR7YXR0ZW1wdFN1ZmZpeH0uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSBjYXB0dXJlZCBsb2FkIGVycm9yIGlzIGRldGVybWluaXN0aWMgXHUyMDE0IGZhaWwgZmFzdCByYXRoZXIgdGhhbiByZXRyeS5cbiAgICBpZiAoIXNob3VsZFJldHJ5UGx1Z2luRW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtyZWFsRXJyb3IgPz8gZ2V0R2VuZXJpY1BsdWdpbkxvYWRGYWlsdXJlTWVzc2FnZShwbHVnaW5JZCl9YCk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNpZW50IGNvbGQtYm9vdCByYWNlIChlbmFibGVkIGJ1dCBub3QgbG9hZGVkLCBubyBjYXVzZSBjYXB0dXJlZCk6IHJldHJ5LlxuICAgIGlmIChhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgIGNvbnN0IGRlbGF5SW5NaWxsaXNlY29uZHMgPSBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMoYmFzZURlbGF5SW5NaWxsaXNlY29uZHMsIGF0dGVtcHQgLSAxKTtcbiAgICAgIGxvZyhcbiAgICAgICAgYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIGJ1dCBub3QgbG9hZGVkIGBcbiAgICAgICAgICArIGAoYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcobWF4QXR0ZW1wdHMpfSk7IHJldHJ5aW5nIGluICR7U3RyaW5nKGRlbGF5SW5NaWxsaXNlY29uZHMpfW1zLi4uYFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHNsZWVwKGRlbGF5SW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAqIEV4aGF1c3RlZCBldmVyeSBhdHRlbXB0IG9uIHRoZSB0cmFuc2llbnQgc2lnbmF0dXJlOiBjb21wb3NlIHRoZSBtb3N0XG4gICAqIHNwZWNpZmljIGRldGFpbCBhdmFpbGFibGUgKGBhZGIgbG9nY2F0YCB0YWlsIG9uIEFuZHJvaWQsIGVsc2UgdGhlIGdlbmVyaWNcbiAgICogbWVzc2FnZSkgXHUyMDE0IHVuY2hhbmdlZCBmcm9tIHRoZSBwcmUtcmV0cnkgc2luZ2xlLXNob3QgZmFpbHVyZS5cbiAgICovXG4gIGNvbnN0IGxvZ2NhdFRhaWwgPSBhd2FpdCB0cmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2U/LihjYXB0dXJlSGFuZGxlKTtcbiAgY29uc3QgZGV0YWlsID0gbG9nY2F0VGFpbCA/PyBnZXRHZW5lcmljUGx1Z2luTG9hZEZhaWx1cmVNZXNzYWdlKHBsdWdpbklkKTtcbiAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGZhaWxlZCB0byBsb2FkOiAke2RldGFpbH1gKTtcbn1cblxuLyoqXG4gKiBFbmFibGVzIGBhbHdheXNVcGRhdGVMaW5rc2AgaW4gdGhlIG93bmVkIHZhdWx0J3MgYC5vYnNpZGlhbi9hcHAuanNvbmAuXG4gKlxuICogV2l0aG91dCBpdCwgYW55IHJlbmFtZSBvciBtb3ZlIHRoYXQgYWZmZWN0cyBsaW5rcyBtYWtlcyBPYnNpZGlhbidzXG4gKiBgRmlsZU1hbmFnZXIudXBkYXRlQWxsTGlua3NgIHBvcCBhbiBpbnRlcmFjdGl2ZSBcIlVwZGF0ZSBsaW5rcz9cIiBjb25maXJtYXRpb24gbW9kYWxcbiAqIChpdCBvbmx5IHNraXBzIHRoZSBtb2RhbCB3aGVuIGBhbHdheXNVcGRhdGVMaW5rc2AgaXMgb24pLiBIZWFkbGVzcyB0aGVyZSBpcyBubyB1c2VyXG4gKiB0byBhbnN3ZXIgaXQsIHNvIHRoZSBQcm9taXNlIG5ldmVyIHJlc29sdmVzIFx1MjAxNCB0aGUgcmVuYW1lJ3MgaW50ZXJuYWxcbiAqIGBGaWxlTWFuYWdlci51cGRhdGVRdWV1ZWAgdGFzayBoYW5ncyBmb3JldmVyLCBhbmQgYmVjYXVzZSB0aGF0IHF1ZXVlIGlzIGEgc2luZ2xldG9uXG4gKiBldmVyeSBzdWJzZXF1ZW50IGByZW5hbWVGaWxlYCBpbiB0aGUgc2hhcmVkIGluc3RhbmNlIGhhbmdzIHRvbyAodGhlIGxvbmctb2JzZXJ2ZWRcbiAqIFwicmVuYW1lIHdhbGxcIikuIEVuYWJsaW5nIHRoZSBzZXR0aW5nIG1ha2VzIHJlbmFtZXMgdXBkYXRlIGxpbmtzIG5vbi1pbnRlcmFjdGl2ZWx5LFxuICogc28gcmVuYW1lLWRyaXZlbiBpbnRlZ3JhdGlvbiB0ZXN0cyBydW4gaW4gaGVhZGxlc3MgbW9kZS5cbiAqXG4gKiBNZXJnZXMgaW50byBhbnkgZXhpc3RpbmcgYGFwcC5qc29uYCAoZS5nLiBvbmUgY2FycmllZCBpbiB2aWEgYHBvcHVsYXRlYCkgc28gb3RoZXJcbiAqIGNvbmZpZyBrZXlzIGFyZSBwcmVzZXJ2ZWQsIGFuZCBydW5zIGJlZm9yZSBgc3luY1RvRGV2aWNlYCBzbyB0aGUgdmFsdWUgcmVhY2hlc1xuICogbW9iaWxlIGRldmljZXMgdG9vLlxuICpcbiAqIEBwYXJhbSB0ZW1wVmF1bHQgLSBUaGUgb3duZWQgdGVtcCB2YXVsdCB0byBjb25maWd1cmUuXG4gKiBAcGFyYW0gbGFiZWwgLSBUaGUgdHJhbnNwb3J0IGxhYmVsLCBmb3IgbG9nZ2luZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlQWx3YXlzVXBkYXRlTGlua3ModGVtcFZhdWx0OiBUZW1wVmF1bHQsIGxhYmVsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29uZmlnRGlyID0gam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUik7XG4gIGNvbnN0IGFwcEpzb25QYXRoID0gam9pbihjb25maWdEaXIsIEFQUF9KU09OKTtcbiAgbGV0IGFwcENvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgdHJ5IHtcbiAgICBhcHBDb25maWcgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGFwcEpzb25QYXRoLCAndXRmLTgnKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vIGV4aXN0aW5nIGFwcC5qc29uIChvciB1bnJlYWRhYmxlKSBcdTIwMTQgc3RhcnQgZnJvbSBhbiBlbXB0eSBjb25maWcuXG4gIH1cbiAgYXBwQ29uZmlnWydhbHdheXNVcGRhdGVMaW5rcyddID0gdHJ1ZTtcbiAgYXdhaXQgbWtkaXIoY29uZmlnRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGFwcEpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShhcHBDb25maWcsIG51bGwsIEFQUF9KU09OX0lOREVOVCkpO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gRW5hYmxlZCBhbHdheXNVcGRhdGVMaW5rcyBpbiAke0FQUF9KU09OfSAoaGVhZGxlc3MgcmVuYW1lIHN1cHBvcnQpLmApO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBwcm9qZWN0IHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIGBwcm9jZXNzLmN3ZCgpYCBsb29raW5nIGZvciBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICovXG5mdW5jdGlvbiBmaW5kUHJvamVjdFJvb3QoKTogc3RyaW5nIHtcbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gTG9vcCB0ZXJtaW5hdGVzIGF0IGZpbGVzeXN0ZW0gcm9vdC5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcmV0dXJuIGRpcjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gam9pbihkaXIsICcuLicpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBwcm9qZWN0IHJvb3QgKG5vIHBhY2thZ2UuanNvbiBmb3VuZCkuJyk7XG4gICAgfVxuICAgIGRpciA9IHBhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBjcm9zcy1wcm9jZXNzIGxvY2sgc2NvcGUgZm9yIGEgdHJhbnNwb3J0LCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vXG4gKiBsb2NrIGlzIG5lZWRlZC5cbiAqXG4gKiBEZXNrdG9wIHJ1bnMgdXNlIGhhcm5lc3Mtb3duZWQsIGlzb2xhdGVkIGluc3RhbmNlcyAodGhlaXIgb3duIHVzZXItZGF0YSBkaXJcbiAqIGFuZCBDRFAgcG9ydCksIHNvIHRoZXkgbm8gbG9uZ2VyIGNvbnRlbmQgYW5kIG5lZWQgbm8gbG9jay4gT25seSB0aGUgQW5kcm9pZFxuICogdHJhbnNwb3J0LCB3aGljaCBzaGFyZXMgdGhlIHNpbmdsZSBlbXVsYXRvciBhbmQgQXBwaXVtIHNlcnZlciwgbXVzdCBzZXJpYWxpemUuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydE9wdGlvbnMgLSBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgbG9jayBzY29wZSBzdHJpbmcsIG9yIGB1bmRlZmluZWRgIGlmIG5vIGxvY2sgaXMgbmVlZGVkLlxuICovXG5mdW5jdGlvbiBnZXRMb2NrU2NvcGUodHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRyYW5zcG9ydE9wdGlvbnM/LnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScgPyBBTkRST0lEX0xPQ0tfU0NPUEUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGNsZWFudXAgaGFuZGxlcnMgZm9yIG9ycGhhbmVkIHNldHVwcyB0aGF0IHdlcmUgbmV2ZXIgZXhwbGljaXRseVxuICogdG9ybiBkb3duLlxuICpcbiAqIFR3byBoYW5kbGVycyBjb3ZlciBkaWZmZXJlbnQgZXhpdCBzY2VuYXJpb3M6XG4gKlxuICogLSBgYmVmb3JlRXhpdGAgXHUyMDE0IGZpcmVzIHdoZW4gdGhlIGV2ZW50IGxvb3AgZHJhaW5zIG5hdHVyYWxseS4gQWxsb3dzIGZ1bGxcbiAqICAgYXN5bmMgdGVhcmRvd24gKHVucmVnaXN0ZXIgdmF1bHRzLCBkaXNwb3NlIHRyYW5zcG9ydHMpLiBEb2VzIE5PVCBmaXJlXG4gKiAgIHdoZW4gYHByb2Nlc3MuZXhpdCgpYCBpcyBjYWxsZWQgZGlyZWN0bHkuXG4gKlxuICogLSBgdW5oYW5kbGVkUmVqZWN0aW9uYCBcdTIwMTQgY2F0Y2hlcyBhc3luYyBlcnJvcnMgdGhhdCBieXBhc3MgYGNvcmVTZXR1cGAnc1xuICogICBjYXRjaCBibG9jay4gUGVyZm9ybXMgZnVsbCBhc3luYyB0ZWFyZG93biB3aGlsZSB3ZSBzdGlsbCBjYW4uXG4gKlxuICogLSBgZXhpdGAgXHUyMDE0IGZpcmVzIG9uIGV2ZXJ5IGV4aXQsIGluY2x1ZGluZyBgcHJvY2Vzcy5leGl0KClgLiBPbmx5IHN5bmNocm9ub3VzXG4gKiAgIHdvcmsgaXMgcG9zc2libGUsIHNvIHRoaXMgaGFuZGxlciBkb2VzIGJlc3QtZWZmb3J0IGNsZWFudXA6IGtpbGxzIGNoaWxkXG4gKiAgIHByb2Nlc3NlcyB2aWEgYGRpc3Bvc2VTeW5jKClgIGFuZCByZW1vdmVzIHRlbXAgdmF1bHQgZGlyZWN0b3JpZXMgd2l0aFxuICogICBgcm1TeW5jYC4gVW5yZWdpc3RlcmluZyB2YXVsdHMgKHdoaWNoIHJlcXVpcmVzIElQQyB3aXRoIE9ic2lkaWFuKSBpc1xuICogICBza2lwcGVkIFx1MjAxNCBhIHN0YWxlIHZhdWx0IGVudHJ5IGlzIGFuIGFjY2VwdGFibGUgdHJhZGUtb2ZmIHZzLiBsZWFrZWRcbiAqICAgcHJvY2Vzc2VzIGFuZCB0ZW1wIGRpcmVjdG9yaWVzLlxuICovXG5mdW5jdGlvbiByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpOiB2b2lkIHtcbiAgaWYgKGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBQcm9jZXNzIGV4aXRpbmcgd2l0aCAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IHNldHVwKHMpIG5vdCB0b3JuIGRvd24uIENsZWFuaW5nIHVwLi4uYCk7XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgY29yZVRlYXJkb3duKHJlc3VsdCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gUHJvY2VzcyBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBwcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZVNldHVwcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd25dIFVuaGFuZGxlZCByZWplY3Rpb24gZGV0ZWN0ZWQuIFRlYXJpbmcgZG93biAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IGFjdGl2ZSBzZXR1cChzKS4uLmApO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIFsuLi5hY3RpdmVTZXR1cHNdKSB7XG4gICAgICBjb3JlVGVhcmRvd24ocmVzdWx0KS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBSZWplY3Rpb24gY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gU3luYyBjbGVhbnVwOiAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IG9ycGhhbmVkIHNldHVwKHMpLmApO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIFsuLi5hY3RpdmVTZXR1cHNdKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB0cmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHJtU3luYyhyZXN1bHQudGVtcFZhdWx0LnBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB2YXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgcmVsZWFzZVNldHVwTG9jayhyZXN1bHQpO1xuICAgIH1cbiAgICBhY3RpdmVTZXR1cHMuY2xlYXIoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgYW5kIGZvcmdldHMgdGhlIHNldHVwIGxvY2sgYXNzb2NpYXRlZCB3aXRoIGEgcmVzdWx0LCBpZiBhbnkuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSBzZXR1cCByZXN1bHQgd2hvc2UgbG9jayBzaG91bGQgYmUgcmVsZWFzZWQuXG4gKi9cbmZ1bmN0aW9uIHJlbGVhc2VTZXR1cExvY2socmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQpOiB2b2lkIHtcbiAgY29uc3QgbG9jayA9IHNldHVwTG9ja3MuZ2V0KHJlc3VsdCk7XG4gIGlmIChsb2NrKSB7XG4gICAgbG9jay5yZWxlYXNlKCk7XG4gICAgc2V0dXBMb2Nrcy5kZWxldGUocmVzdWx0KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXN0IHBhdGggdG8gdXNlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBQaWNrcyB3aGljaGV2ZXIgb2YgYGRpc3QvZGV2YCBhbmQgYGRpc3QvYnVpbGRgIGhhcyBhIG5ld2VyIGBtYWluLmpzYC5cbiAqIElmIG9ubHkgb25lIGV4aXN0cywgdGhhdCBvbmUgaXMgdXNlZC4gVGhyb3dzIGlmIG5laXRoZXIgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRldlBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0RFVik7XG4gIGNvbnN0IGJ1aWxkUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfQlVJTEQpO1xuICBjb25zdCBkZXZNYWluSnMgPSBqb2luKGRldlBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBidWlsZE1haW5KcyA9IGpvaW4oYnVpbGRQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgZGV2U3RhdCA9IGV4aXN0c1N5bmMoZGV2TWFpbkpzKSA/IGF3YWl0IHN0YXQoZGV2TWFpbkpzKSA6IG51bGw7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGV4aXN0c1N5bmMoYnVpbGRNYWluSnMpID8gYXdhaXQgc3RhdChidWlsZE1haW5KcykgOiBudWxsO1xuXG4gIGlmIChkZXZTdGF0ICYmIGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBkZXZTdGF0Lm10aW1lID4gYnVpbGRTdGF0Lm10aW1lID8gZGV2UGF0aCA6IGJ1aWxkUGF0aDtcbiAgfVxuXG4gIGlmIChkZXZTdGF0KSB7XG4gICAgcmV0dXJuIGRldlBhdGg7XG4gIH1cblxuICBpZiAoYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGJ1aWxkUGF0aDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTm8gYnVpbGQgZm91bmQuIFJ1biBgbnBtIHJ1biBidWlsZGAgb3IgYG5wbSBydW4gZGV2YCBmaXJzdC4nKTtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyB0aGUgYXN5bmMgdGVhcmRvd24gd29yayAodmF1bHQgZGlzcG9zYWwgKyB0cmFuc3BvcnQgZGlzcG9zYWwpLlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgc2V0dXAgcmVzdWx0IHRvIHRlYXIgZG93bi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdGVhcmRvd25Bc3luYyhyZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50ZW1wVmF1bHQuZGlzcG9zZShyZXN1bHQudHJhbnNwb3J0KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50cmFuc3BvcnQuZGlzcG9zZT8uKCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBUcmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfVxufVxuIl0sCiAg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QVMsT0FBZ0I7QUFDdkIsNEJBQUkseUJBQXlCLE9BQU8sY0FBYyxtREFBK0Msc0NBQWMsS0FBSyxDQUFDLEVBQUU7QUFBQSxNQUN6SDtBQUNBLFVBQUk7QUFDRixtQ0FBTyxPQUFPLFVBQVUsTUFBTSxFQUFFLE9BQU8sTUFBTSxXQUFXLEtBQUssQ0FBQztBQUFBLE1BQ2hFLFNBQVMsT0FBZ0I7QUFDdkIsNEJBQUkseUJBQXlCLE9BQU8sY0FBYywrQ0FBMkMsc0NBQWMsS0FBSyxDQUFDLEVBQUU7QUFBQSxNQUNySDtBQUNBLHVCQUFpQixNQUFNO0FBQUEsSUFDekI7QUFDQSxpQkFBYSxNQUFNO0FBQUEsRUFDckIsQ0FBQztBQUNIO0FBT0EsU0FBUyxpQkFBaUIsUUFBK0I7QUFDdkQsUUFBTSxPQUFPLFdBQVcsSUFBSSxNQUFNO0FBQ2xDLE1BQUksTUFBTTtBQUNSLFNBQUssUUFBUTtBQUNiLGVBQVcsT0FBTyxNQUFNO0FBQUEsRUFDMUI7QUFDRjtBQVdBLGVBQWUsZ0JBQWdCLGFBQXNDO0FBQ25FLFFBQU0sY0FBVSx1QkFBSyxhQUFhLFFBQVE7QUFDMUMsUUFBTSxnQkFBWSx1QkFBSyxhQUFhLFVBQVU7QUFDOUMsUUFBTSxnQkFBWSx1QkFBSyxTQUFTLE9BQU87QUFDdkMsUUFBTSxrQkFBYyx1QkFBSyxXQUFXLE9BQU87QUFDM0MsUUFBTSxjQUFVLDJCQUFXLFNBQVMsSUFBSSxVQUFNLHNCQUFLLFNBQVMsSUFBSTtBQUNoRSxRQUFNLGdCQUFZLDJCQUFXLFdBQVcsSUFBSSxVQUFNLHNCQUFLLFdBQVcsSUFBSTtBQUV0RSxNQUFJLFdBQVcsV0FBVztBQUN4QixXQUFPLFFBQVEsUUFBUSxVQUFVLFFBQVEsVUFBVTtBQUFBLEVBQ3JEO0FBRUEsTUFBSSxTQUFTO0FBQ1gsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLFdBQVc7QUFDYixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sSUFBSSxNQUFNLDZEQUE2RDtBQUMvRTtBQU9BLGVBQWUsY0FBYyxRQUF3QztBQUNuRSxNQUFJO0FBQ0YsVUFBTSxPQUFPLFVBQVUsUUFBUSxPQUFPLFNBQVM7QUFBQSxFQUNqRCxTQUFTLE9BQWdCO0FBQ3ZCLHdCQUFJLHlCQUF5QixPQUFPLGNBQWMsMENBQXNDLHNDQUFjLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDaEg7QUFFQSxNQUFJO0FBQ0YsVUFBTSxPQUFPLFVBQVUsVUFBVTtBQUFBLEVBQ25DLFNBQVMsT0FBZ0I7QUFDdkIsd0JBQUkseUJBQXlCLE9BQU8sY0FBYyw4Q0FBMEMsc0NBQWMsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUNwSDtBQUNGOyIsCiAgIm5hbWVzIjogWyJpbXBvcnRfcHJvbWlzZXMiLCAic2xlZXAiLCAicHJvY2VzcyJdCn0K
|
package/dist/lib/cjs/library.cjs
CHANGED
|
@@ -21,7 +21,7 @@ __export(library_exports, {
|
|
|
21
21
|
LIBRARY_VERSION: () => LIBRARY_VERSION
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(library_exports);
|
|
24
|
-
const LIBRARY_VERSION = false ? "dev" : "9.
|
|
24
|
+
const LIBRARY_VERSION = false ? "dev" : "9.1.0";
|
|
25
25
|
// Annotate the CommonJS export names for ESM import in node:
|
|
26
26
|
0 && (module.exports = {
|
|
27
27
|
LIBRARY_VERSION
|
|
@@ -37,6 +37,8 @@ const MAIN_JS = "main.js";
|
|
|
37
37
|
const OBSIDIAN_CONFIG_DIR = ".obsidian";
|
|
38
38
|
const PLUGINS_DIR = "plugins";
|
|
39
39
|
const COMMUNITY_PLUGINS_JSON = "community-plugins.json";
|
|
40
|
+
const APP_JSON = "app.json";
|
|
41
|
+
const APP_JSON_INDENT = 2;
|
|
40
42
|
const activeSetups = /* @__PURE__ */ new Set();
|
|
41
43
|
const disposedResults = /* @__PURE__ */ new WeakSet();
|
|
42
44
|
let isCleanupHandlerRegistered = false;
|
|
@@ -78,6 +80,7 @@ async function coreSetup(params) {
|
|
|
78
80
|
log(`[integration-setup:${label}] Populating vault with ${String(entryCount)} entries before open...`);
|
|
79
81
|
tempVault.populate(params.populate);
|
|
80
82
|
}
|
|
83
|
+
await ensureAlwaysUpdateLinks(tempVault, label);
|
|
81
84
|
log(`[integration-setup:${label}] Syncing vault to device...`);
|
|
82
85
|
await tempVault.syncToDevice(transport);
|
|
83
86
|
log(`[integration-setup:${label}] Registering vault...`);
|
|
@@ -244,6 +247,19 @@ async function enablePluginInVault(params) {
|
|
|
244
247
|
const detail = logcatTail ?? getGenericPluginLoadFailureMessage(pluginId);
|
|
245
248
|
throw new Error(`Plugin "${pluginId}" failed to load: ${detail}`);
|
|
246
249
|
}
|
|
250
|
+
async function ensureAlwaysUpdateLinks(tempVault, label) {
|
|
251
|
+
const configDir = join(tempVault.path, OBSIDIAN_CONFIG_DIR);
|
|
252
|
+
const appJsonPath = join(configDir, APP_JSON);
|
|
253
|
+
let appConfig = {};
|
|
254
|
+
try {
|
|
255
|
+
appConfig = JSON.parse(await readFile(appJsonPath, "utf-8"));
|
|
256
|
+
} catch {
|
|
257
|
+
}
|
|
258
|
+
appConfig["alwaysUpdateLinks"] = true;
|
|
259
|
+
await mkdir(configDir, { recursive: true });
|
|
260
|
+
await writeFile(appJsonPath, JSON.stringify(appConfig, null, APP_JSON_INDENT));
|
|
261
|
+
log(`[integration-setup:${label}] Enabled alwaysUpdateLinks in ${APP_JSON} (headless rename support).`);
|
|
262
|
+
}
|
|
247
263
|
function findProjectRoot() {
|
|
248
264
|
let dir = process.cwd();
|
|
249
265
|
while (true) {
|
|
@@ -350,4 +366,4 @@ export {
|
|
|
350
366
|
coreTeardown,
|
|
351
367
|
resolveIntegrationTransportOptions
|
|
352
368
|
};
|
|
353
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgYXMgc2xlZXAgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB0eXBlIHsgRW5hYmxlUGx1Z2luUmVzdWx0IH0gZnJvbSAnLi9lbmFibGUtcGx1Z2luLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFNldHVwTG9jayB9IGZyb20gJy4vc2V0dXAtbG9jay5tanMnO1xuaW1wb3J0IHR5cGUgeyBQb3B1bGF0ZUZpbGVzUGFyYW1zIH0gZnJvbSAnLi90ZW1wLXZhdWx0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQge1xuICBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICBnZXRHZW5lcmljUGx1Z2luTG9hZEZhaWx1cmVNZXNzYWdlXG59IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5tanMnO1xuaW1wb3J0IHsgZXJyb3JUb1N0cmluZyB9IGZyb20gJy4vZXJyb3ItdG8tc3RyaW5nLm1qcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7XG4gIGNvbXB1dGVCYWNrb2ZmRGVsYXlJbk1pbGxpc2Vjb25kcyxcbiAgcmVzb2x2ZVBsdWdpbkVuYWJsZVJldHJ5Q291bnQsXG4gIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHMsXG4gIHNob3VsZFJldHJ5UGx1Z2luRW5hYmxlXG59IGZyb20gJy4vcGx1Z2luLWVuYWJsZS1yZXRyeS5tanMnO1xuaW1wb3J0IHsgYWNxdWlyZVNldHVwTG9jayB9IGZyb20gJy4vc2V0dXAtbG9jay5tanMnO1xuaW1wb3J0IHsgVGVtcFZhdWx0IH0gZnJvbSAnLi90ZW1wLXZhdWx0Lm1qcyc7XG5pbXBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0ubWpzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5Lm1qcyc7XG5cbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2RwJztcbmNvbnN0IERJU1RfREVWID0gJ2Rpc3QvZGV2JztcbmNvbnN0IERJU1RfQlVJTEQgPSAnZGlzdC9idWlsZCc7XG5jb25zdCBNQUlOX0pTID0gJ21haW4uanMnO1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9ICcub2JzaWRpYW4nO1xuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuXG4vKipcbiAqIFRyYWNrcyBzZXR1cHMgdGhhdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCBoYXZlbid0IGJlZW4gdG9ybiBkb3duIHlldC5cbiAqIFVzZWQgYnkgdGhlIGBiZWZvcmVFeGl0YCBoYW5kbGVyIHRvIGNsZWFuIHVwIHdoZW4gYSB0ZXN0IHJ1bm5lciBleGl0c1xuICogd2l0aG91dCBjYWxsaW5nIHRlYXJkb3duIChlLmcuLCB3aGVuIG9uZSBwcm9qZWN0J3Mgc2V0dXAgZmFpbHMgYW5kIHRoZVxuICogcnVubmVyIGFib3J0cyBiZWZvcmUgdGVhcmluZyBkb3duIGFscmVhZHktaW5pdGlhbGl6ZWQgcHJvamVjdHMpLlxuICovXG5jb25zdCBhY3RpdmVTZXR1cHMgPSBuZXcgU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmNvbnN0IGRpc3Bvc2VkUmVzdWx0cyA9IG5ldyBXZWFrU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmxldCBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBjcm9zcy1wcm9jZXNzIHNldHVwIGxvY2sgaGVsZCBieSBlYWNoIGFjdGl2ZSBzZXR1cC4gUmVsZWFzZWQgd2hlbiB0aGVcbiAqIHNldHVwIGlzIHRvcm4gZG93biAob3IgYnkgdGhlIHByb2Nlc3MgY2xlYW51cCBoYW5kbGVycyksIGFsbG93aW5nIGEgY29tcGV0aW5nXG4gKiBydW4gdG8gcHJvY2VlZC4gU2VlIHtAbGluayBhY3F1aXJlU2V0dXBMb2NrfS5cbiAqL1xuY29uc3Qgc2V0dXBMb2NrcyA9IG5ldyBNYXA8Q29yZVNldHVwUmVzdWx0LCBTZXR1cExvY2s+KCk7XG5cbmNvbnN0IEFORFJPSURfTE9DS19TQ09QRSA9ICdhbmRyb2lkJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29yZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBQYXJhbXMge1xuICAvKipcbiAgICogQ29tbXVuaXR5LXBsdWdpbiBpZHMgdG8gZW5hYmxlIGluIHRoZSB2YXVsdCAqKmluIGFkZGl0aW9uIHRvKiogdGhlXG4gICAqIHBsdWdpbi11bmRlci10ZXN0LCBhZnRlciBpdCBpcyBlbmFibGVkLiBFYWNoIGlkJ3MgYnVpbHQgZmlsZXMgbXVzdCBhbHJlYWR5IGJlXG4gICAqIHByZXNlbnQgdW5kZXIgYC5vYnNpZGlhbi9wbHVnaW5zLzxpZD4vYCBcdTIwMTQgc2VlZCB0aGVtIHZpYSB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLnBvcHVsYXRlfVxuICAgKiAoZS5nLiB3aXRoIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYCkuIEVuYWJsaW5nIGdvZXMgdGhyb3VnaCB0aGUgc2FtZVxuICAgKiByZXRyeS9sb2FkLXZlcmlmeSBwYXRoIGFzIHRoZSBwbHVnaW4tdW5kZXItdGVzdC4gQ29tcG9zZXMgd2l0aFxuICAgKiBgaW5zdGFsbFBsdWdpbjogZmFsc2VgIChlbmFibGUgZXh0cmFzIGludG8gYW4gb3RoZXJ3aXNlIHBsdWdpbi1sZXNzIHZhdWx0KS5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUNvbW11bml0eVBsdWdpbnM/OiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbnN0YWxsIGFuZCBlbmFibGUgdGhlIGJ1aWx0IHBsdWdpbiBpbiB0aGUgdGVtcCB2YXVsdC4gRGVmYXVsdHNcbiAgICogdG8gYHRydWVgLiBTZXQgdG8gYGZhbHNlYCBmb3IgYSAqKm5vbi1wbHVnaW4qKiBjb25zdW1lciAoZS5nLiBhIHR5cGluZ3NcbiAgICogY3Jhd2xlcikgdGhhdCBvbmx5IG5lZWRzIGEgcmVnaXN0ZXJlZCwgZW1wdHkgdmF1bHQgdG8gYGV2YWxJbk9ic2lkaWFuYFxuICAgKiBhZ2FpbnN0OiB0aGUgcGx1Z2luIGBkaXN0YC9gbWFuaWZlc3QuanNvbmAgcmVhZCwgdGhlIGNvcHkgaW50b1xuICAgKiBgLm9ic2lkaWFuL3BsdWdpbnNgLCB0aGUgYGNvbW11bml0eS1wbHVnaW5zLmpzb25gIHdyaXRlLCBhbmQgdGhlIGVuYWJsZSBzdGVwXG4gICAqIGFyZSBhbGwgc2tpcHBlZCwgd2hpbGUgdGhlIHRyYW5zcG9ydCwgdGVtcCB2YXVsdCwgcmVnaXN0cmF0aW9uLCBhbmRcbiAgICogd29ya2VyLWZhY2luZyBlbmRwb2ludCBwcm92aXNpb25pbmcgc3RpbGwgcnVuIHVuY2hhbmdlZC5cbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbGxQbHVnaW4/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBGaWxlcyBhbmQgZm9sZGVycyB0byB3cml0ZSBpbnRvIHRoZSB2YXVsdCAqKmJlZm9yZSoqIE9ic2lkaWFuIG9wZW5zIGl0LCBzb1xuICAgKiBpdHMgc3RhcnR1cCBzY2FuIGluZGV4ZXMgdGhlbSBpbiBvbmUgcGFzcyAoc2VlIHtAbGluayBUZW1wVmF1bHQucG9wdWxhdGV9KS5cbiAgICogVXNlIHRoaXMgZm9yIGxhcmdlIGZpeHR1cmVzIFx1MjAxNCB3cml0aW5nIHRob3VzYW5kcyBvZiBub3RlcyBhZnRlciBvcGVuIGFuZFxuICAgKiBmb3JjaW5nIGEgcmUtc2NhbiBpcyBmYXIgc2xvd2VyIGFuZCBsZXNzIHJlbGlhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9wdWxhdGU/OiBQb3B1bGF0ZUZpbGVzUGFyYW1zIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUcmFuc3BvcnQgb3B0aW9ucy4gV2hlbiBvbWl0dGVkLCB1c2VzIGFuIG9mZi1zY3JlZW4gb3duZWQgZGVza3RvcCBpbnN0YW5jZS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkge0BsaW5rIGNvcmVTZXR1cH0sIHVzZWQgYnkgZnJhbWV3b3JrIGFkYXB0ZXJzXG4gKiB0byBwYXNzIGNvbnRleHQgdG8gdGVzdCB3b3JrZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZXR1cFJlc3VsdCB7XG4gIC8qKiBUaGUgdGVtcG9yYXJ5IHZhdWx0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLiAqL1xuICByZWFkb25seSB0ZW1wVmF1bHQ6IFRlbXBWYXVsdDtcblxuICAvKiogVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSB1c2VkIGR1cmluZyBzZXR1cC4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKiogU2hvcnQgbGFiZWwgZm9yIGxvZyBtZXNzYWdlcyAoZS5nLiBgXCJvYnNpZGlhbi1jZHBcImApLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IG9wdGlvbnMgdGhhdCB3ZXJlIHJlc29sdmVkLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcHlQbHVnaW5JbnRvVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgQ29weVBsdWdpbkludG9WYXVsdFBhcmFtcyB7XG4gIC8qKiBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzLiAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgcHJvamVjdCByb290IHRvIHJlc29sdmUgdGhlIGJ1aWx0IHBsdWdpbiBmcm9tLiAqL1xuICByZWFkb25seSBwcm9qZWN0Um9vdDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdGVtcCB2YXVsdCB0byBjb3B5IHRoZSBwbHVnaW4gaW50by4gKi9cbiAgcmVhZG9ubHkgdGVtcFZhdWx0OiBUZW1wVmF1bHQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgKHVzZWQgZm9yIHRoZSBtb2JpbGUvZGVza3RvcC1vbmx5IGNvbXBhdGliaWxpdHkgY2hlY2spLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnN9LlxuICovXG5pbnRlcmZhY2UgRW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zUGFyYW1zIHtcbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBpZHMgb2YgdGhlIGV4dHJhIGNvbW11bml0eSBwbHVnaW5zIHRvIGVuYWJsZSAodGhlaXIgYmluYXJpZXMgbXVzdCBhbHJlYWR5IGJlIGluIHRoZSB2YXVsdCkuICovXG4gIHJlYWRvbmx5IHBsdWdpbklkczogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIFRoZSB0ZW1wIHZhdWx0IHRoZSBwbHVnaW5zIHdlcmUgc2VlZGVkIGludG8uICovXG4gIHJlYWRvbmx5IHRlbXBWYXVsdDogVGVtcFZhdWx0O1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IHRvIGV2YWx1YXRlIGFnYWluc3QuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBwbHVnaW4tZW5hYmxlIHJldHJ5IGtub2JzKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogbnVsbCB8IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlUGx1Z2luSW5WYXVsdH0uXG4gKi9cbmludGVyZmFjZSBFbmFibGVQbHVnaW5JblZhdWx0UGFyYW1zIHtcbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMuICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS4gKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKiogVGhlIHRlbXAgdmF1bHQgdGhlIHBsdWdpbiB3YXMgY29waWVkIGludG8uICovXG4gIHJlYWRvbmx5IHRlbXBWYXVsdDogVGVtcFZhdWx0O1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IHRvIGV2YWx1YXRlIGFnYWluc3QuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBwbHVnaW4tZW5hYmxlIHJldHJ5IGtub2JzKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogbnVsbCB8IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBGcmFtZXdvcmstYWdub3N0aWMgZ2xvYmFsIHNldHVwIGxvZ2ljLlxuICpcbiAqIExvYWRzIGAuZW52YCBmcm9tIHRoZSBwcm9qZWN0IHJvb3QsIGNyZWF0ZXMgYSB0cmFuc3BvcnQsIGNyZWF0ZXMgYW5kIHJlZ2lzdGVyc1xuICogYSB0ZW1wb3JhcnkgdmF1bHQgd2l0aCBPYnNpZGlhbiwgYW5kIFx1MjAxNCB1bmxlc3Mge0BsaW5rIENvcmVTZXR1cFBhcmFtcy5pbnN0YWxsUGx1Z2lufVxuICogaXMgYGZhbHNlYCBcdTIwMTQgY29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byB0aGUgdmF1bHQgYW5kIGVuYWJsZXMgaXQuIFRoZVxuICogcGx1Z2luLWxlc3MgbW9kZSBzdGlsbCBsYXVuY2hlcyB0aGUgb3duZWQgaW5zdGFuY2UgYW5kIHB1Ymxpc2hlcyBpdHNcbiAqIHdvcmtlci1mYWNpbmcgZW5kcG9pbnQsIHNvIGEgbm9uLXBsdWdpbiBjb25zdW1lciByZXVzZXMgdGhlIHNhbWUgYXR0YWNoIHdpcmluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gU2V0dXAgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBzZXR1cCByZXN1bHQgY29udGFpbmluZyB0aGUgdGVtcCB2YXVsdCwgdHJhbnNwb3J0LCBhbmQgcmVzb2x2ZWQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVTZXR1cChwYXJhbXM/OiBDb3JlU2V0dXBQYXJhbXMpOiBQcm9taXNlPENvcmVTZXR1cFJlc3VsdD4ge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IGZpbmRQcm9qZWN0Um9vdCgpO1xuICBjb25zdCBlbnZGaWxlUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsICcuZW52Jyk7XG4gIGlmIChleGlzdHNTeW5jKGVudkZpbGVQYXRoKSkge1xuICAgIGxvYWRFbnZGaWxlKGVudkZpbGVQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSByZXNvbHZlSW50ZWdyYXRpb25UcmFuc3BvcnRPcHRpb25zKHBhcmFtcz8udHJhbnNwb3J0T3B0aW9ucyk7XG4gIGNvbnN0IGxhYmVsID0gdHJhbnNwb3J0T3B0aW9ucy50eXBlO1xuICBjb25zdCBsb2NrU2NvcGUgPSBnZXRMb2NrU2NvcGUodHJhbnNwb3J0T3B0aW9ucyk7XG5cbiAgbGV0IGxvY2s6IFNldHVwTG9jayB8IHVuZGVmaW5lZDtcbiAgaWYgKGxvY2tTY29wZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIEFjcXVpcmluZyAnJHtsb2NrU2NvcGV9JyBzZXR1cCBsb2NrIChzZXJpYWxpemVzIGFnYWluc3QgYW55IGNvbmN1cnJlbnQgaW50ZWdyYXRpb24tdGVzdCBydW4pLi4uYCk7XG4gICAgbG9jayA9IGF3YWl0IGFjcXVpcmVTZXR1cExvY2soeyBsYWJlbCwgc2NvcGU6IGxvY2tTY29wZSB9KTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU2V0dXAgbG9jayBhY3F1aXJlZC5gKTtcbiAgfVxuXG4gIGxldCB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuICBsZXQgdGVtcFZhdWx0OiBUZW1wVmF1bHQgfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRpbmcgdHJhbnNwb3J0Li4uYCk7XG4gICAgdHJhbnNwb3J0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnModHJhbnNwb3J0T3B0aW9ucyk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjcmVhdGVkOiAke3RyYW5zcG9ydC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFByb2plY3Qgcm9vdDogJHtwcm9qZWN0Um9vdH1gKTtcbiAgICBjb25zdCBzaG91bGRJbnN0YWxsUGx1Z2luID0gcGFyYW1zPy5pbnN0YWxsUGx1Z2luICE9PSBmYWxzZTtcblxuICAgIHRlbXBWYXVsdCA9IG5ldyBUZW1wVmF1bHQoKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRlZCB0ZW1wIHZhdWx0OiAke3RlbXBWYXVsdC5wYXRofWApO1xuXG4gICAgbGV0IHBsdWdpbklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoc2hvdWxkSW5zdGFsbFBsdWdpbikge1xuICAgICAgcGx1Z2luSWQgPSBhd2FpdCBjb3B5UGx1Z2luSW50b1ZhdWx0KHsgbGFiZWwsIHByb2plY3RSb290LCB0ZW1wVmF1bHQsIHRyYW5zcG9ydCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNraXBwaW5nIHBsdWdpbiBpbnN0YWxsIChpbnN0YWxsUGx1Z2luOiBmYWxzZSkgXHUyMDE0IHJlZ2lzdGVyaW5nIGFuIGVtcHR5IHZhdWx0LmApO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXM/LnBvcHVsYXRlKSB7XG4gICAgICBjb25zdCBlbnRyeUNvdW50ID0gT2JqZWN0LmtleXMocGFyYW1zLnBvcHVsYXRlKS5sZW5ndGg7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUG9wdWxhdGluZyB2YXVsdCB3aXRoICR7U3RyaW5nKGVudHJ5Q291bnQpfSBlbnRyaWVzIGJlZm9yZSBvcGVuLi4uYCk7XG4gICAgICB0ZW1wVmF1bHQucG9wdWxhdGUocGFyYW1zLnBvcHVsYXRlKTtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU3luY2luZyB2YXVsdCB0byBkZXZpY2UuLi5gKTtcbiAgICBhd2FpdCB0ZW1wVmF1bHQuc3luY1RvRGV2aWNlKHRyYW5zcG9ydCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFJlZ2lzdGVyaW5nIHZhdWx0Li4uYCk7XG4gICAgYXdhaXQgdGVtcFZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFZhdWx0IHJlZ2lzdGVyZWQuYCk7XG5cbiAgICBpZiAocGx1Z2luSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgZW5hYmxlUGx1Z2luSW5WYXVsdCh7IGxhYmVsLCBwbHVnaW5JZCwgdGVtcFZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydE9wdGlvbnMgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgZW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zKHtcbiAgICAgIGxhYmVsLFxuICAgICAgcGx1Z2luSWRzOiBwYXJhbXM/LmVuYWJsZUNvbW11bml0eVBsdWdpbnMgPz8gW10sXG4gICAgICB0ZW1wVmF1bHQsXG4gICAgICB0cmFuc3BvcnQsXG4gICAgICB0cmFuc3BvcnRPcHRpb25zXG4gICAgfSk7XG5cbiAgICBjb25zdCBhdWdtZW50ZWRPcHRpb25zID0gYXVnbWVudFRyYW5zcG9ydE9wdGlvbnModHJhbnNwb3J0T3B0aW9ucywgdHJhbnNwb3J0KTtcbiAgICBjb25zdCByZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCA9IHsgdGVtcFZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydExhYmVsOiBsYWJlbCwgdHJhbnNwb3J0T3B0aW9uczogYXVnbWVudGVkT3B0aW9ucyB9O1xuICAgIGFjdGl2ZVNldHVwcy5hZGQocmVzdWx0KTtcbiAgICBpZiAobG9jaykge1xuICAgICAgc2V0dXBMb2Nrcy5zZXQocmVzdWx0LCBsb2NrKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBmYWlsZWQsIGNsZWFuaW5nIHVwLi4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0ZW1wVmF1bHQgJiYgdHJhbnNwb3J0KSB7XG4gICAgICAgIGF3YWl0IHRlbXBWYXVsdC5kaXNwb3NlKHRyYW5zcG9ydCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoY2xlYW51cEVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cmFuc3BvcnQ/LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoY2xlYW51cEVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBSZWxlYXNlIHRoZSBsb2NrIHNvIGEgd2FpdGluZyBydW4gY2FuIHByb2NlZWQgZXZlbiB0aG91Z2ggdGhpcyBydW4gZmFpbGVkLlxuICAgIGxvY2s/LnJlbGVhc2UoKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBOT1RFOiBJZiB0aGUgdGVzdCBydW5uZXIgcmVwb3J0cyBcIk5vIHRlc3QgZmlsZXMgZm91bmRcIiwgaWdub3JlIGl0IFx1MjAxNCBpdCBpcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBzZXR1cCBmYWlsdXJlIGFib3ZlLmApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCB0ZWFyZG93biBsb2dpYy5cbiAqXG4gKiBEaXNwb3NlcyBvZiB0aGUgdGVtcG9yYXJ5IHZhdWx0IGFuZCB0cmFuc3BvcnQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgZnJvbSB7QGxpbmsgY29yZVNldHVwfS4gV2hlbiBgdW5kZWZpbmVkYCwgZG9lcyBub3RoaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVRlYXJkb3duKHJlc3VsdD86IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlc3VsdCB8fCBkaXNwb3NlZFJlc3VsdHMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZGlzcG9zZWRSZXN1bHRzLmFkZChyZXN1bHQpO1xuXG4gIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVGVhcmluZyBkb3duLi4uYCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0ZWFyZG93bkFzeW5jKHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBDbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2ZVNldHVwcy5kZWxldGUocmVzdWx0KTtcbiAgICByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0cmFuc3BvcnQgb3B0aW9ucyBmb3IgYW4gaW50ZWdyYXRpb24gcnVuLlxuICpcbiAqIERlc2t0b3AgbGF1bmNoZXMgYXJlIG5vcm1hbGx5IHZpc2libGUsIGJ1dCB0ZXN0IHNldHVwIGV4cGxpY2l0bHkga2VlcHMgaXRzXG4gKiBvd25lZCBpbnN0YW5jZSBvZmYtc2NyZWVuIHNvIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgZGV2ZWxvcGVyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uc3VtZXItcHJvdmlkZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBPcHRpb25zIHdpdGggdGhlIGRlc2t0b3AgaW50ZWdyYXRpb24gdmlzaWJpbGl0eSBkZWZhdWx0IGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSW50ZWdyYXRpb25UcmFuc3BvcnRPcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMge1xuICBpZiAob3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJykge1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGlzT2JzaWRpYW5BcHBWaXNpYmxlOiBvcHRpb25zPy5pc09ic2lkaWFuQXBwVmlzaWJsZSA/PyBmYWxzZSxcbiAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICB9O1xufVxuXG4vKipcbiAqIEF1Z21lbnRzIHRyYW5zcG9ydCBvcHRpb25zIHdpdGggcmV1c2UgaW5mbyBzbyB0ZXN0IHdvcmtlcnMgY2FuIHJlYXR0YWNoIHRvIHRoZVxuICogaW5zdGFuY2UgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGluc3RlYWQgb2YgY3JlYXRpbmcgdGhlaXIgb3duOlxuICpcbiAqIC0gKipBcHBpdW0qKiBcdTIwMTQgaW5qZWN0cyB0aGUgZXN0YWJsaXNoZWQgYHNlc3Npb25JZGAvYGRldmljZUlkYC5cbiAqIC0gKipPd25lZCBkZXNrdG9wIENEUCoqIFx1MjAxNCBpbmplY3RzIHRoZSBvd25lZCBpbnN0YW5jZSdzIGBob3N0YC9gcG9ydGAgKGNob3NlblxuICogICBhdCBsYXVuY2gpIHBsdXMgdGhlIGludGVybmFsIGBpc0hhcm5lc3NPd25lZEluc3RhbmNlYCBmbGFnLCBzbyBlYWNoIHdvcmtlclxuICogICAqKmF0dGFjaGVzKiogdG8gdGhhdCBpbnN0YW5jZSBvdmVyIENEUCByYXRoZXIgdGhhbiBsYXVuY2hpbmcgKGFuZCBuZXZlclxuICogICByZWdpc3RlcmluZykgaXRzIG93biBcdTIwMTQgdGhlIGJ1ZyB0aGF0IG90aGVyd2lzZSBsZWF2ZXMgYSB3b3JrZXIncyB0cmFuc3BvcnRcbiAqICAgd2l0aCBubyBDRFAgZW5kcG9pbnQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3JpZ2luYWwgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqIEByZXR1cm5zIFRoZSBhdWdtZW50ZWQgb3B0aW9ucywgb3IgdGhlIG9yaWdpbmFsIG9wdGlvbnMgaWYgbm90IGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIGF1Z21lbnRUcmFuc3BvcnRPcHRpb25zKFxuICBvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnRcbik6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb25zPy50eXBlID09PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nICYmIHRyYW5zcG9ydCBpbnN0YW5jZW9mIEFwcGl1bVRyYW5zcG9ydCkge1xuICAgIGNvbnN0IHNlc3Npb25JbmZvID0gdHJhbnNwb3J0LmdldFNlc3Npb25JbmZvKCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtvcHRpb25zLnR5cGV9XSBTZXNzaW9uIHJldXNlIGluZm86IHNlc3Npb25JZD0ke3Nlc3Npb25JbmZvLnNlc3Npb25JZH0sIGRldmljZUlkPSR7c2Vzc2lvbkluZm8uZGV2aWNlSWR9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkZXZpY2VJZDogc2Vzc2lvbkluZm8uZGV2aWNlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JbmZvLnNlc3Npb25JZFxuICAgIH07XG4gIH1cblxuICBpZiAoKG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSAmJiB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0cmFuc3BvcnQuZ2V0T3duZWRJbnN0YW5jZUVuZHBvaW50KCk7XG4gICAgaWYgKGVuZHBvaW50KSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke0RFRkFVTFRfVFJBTlNQT1JUX1RZUEV9XSBPd25lZCBpbnN0YW5jZSByZXVzZSBpbmZvOiBob3N0PSR7ZW5kcG9pbnQuaG9zdH0sIHBvcnQ9JHtTdHJpbmcoZW5kcG9pbnQucG9ydCl9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBob3N0OiBlbmRwb2ludC5ob3N0LFxuICAgICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiB0cnVlLFxuICAgICAgICBwb3J0OiBlbmRwb2ludC5wb3J0LFxuICAgICAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIHRoZSB0ZW1wIHZhdWx0IGFuZCBtYXJrcyBpdCBhcyBhIGNvbW11bml0eSBwbHVnaW4uXG4gKlxuICogUmVhZHMgYG1hbmlmZXN0Lmpzb25gIGZyb20gdGhlIG5ld2VyIG9mIGBkaXN0L2RldmAvYGRpc3QvYnVpbGRgLCByZWplY3RzIGFcbiAqIGRlc2t0b3Atb25seSBwbHVnaW4gb24gYSBtb2JpbGUgdHJhbnNwb3J0LCBjb3BpZXMgdGhlIGJ1aWxkIGludG9cbiAqIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+YCwgYW5kIHdyaXRlcyBgLm9ic2lkaWFuL2NvbW11bml0eS1wbHVnaW5zLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29weSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHBsdWdpbiBpZCByZWFkIGZyb20gdGhlIG1hbmlmZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5UGx1Z2luSW50b1ZhdWx0KHBhcmFtczogQ29weVBsdWdpbkludG9WYXVsdFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgbGFiZWwsIHByb2plY3RSb290LCB0ZW1wVmF1bHQsIHRyYW5zcG9ydCB9ID0gcGFyYW1zO1xuICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuICBjb25zdCBwbHVnaW5JZCA9IG1hbmlmZXN0SnNvbi5pZDtcblxuICBpZiAodHJhbnNwb3J0LmlzTW9iaWxlICYmIG1hbmlmZXN0SnNvbi5pc0Rlc2t0b3BPbmx5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGlzRGVza3RvcE9ubHk6IHRydWUgaW4gbWFuaWZlc3QuanNvbi4gTW9iaWxlIGludGVncmF0aW9uIHRlc3RzIGNhbm5vdCBydW4gZm9yIGRlc2t0b3Atb25seSBwbHVnaW5zLmBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWFpbkpzID0gam9pbihkaXN0UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGF3YWl0IHN0YXQobWFpbkpzKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFVzaW5nICR7ZGlzdFBhdGh9ICgke2J1aWxkU3RhdC5tdGltZS50b0lTT1N0cmluZygpfSkuIElmIG91dGRhdGVkLCByZWJ1aWxkLmApO1xuXG4gIGNvbnN0IHBsdWdpbkRpciA9IGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIFBMVUdJTlNfRElSLCBwbHVnaW5JZCk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGNwKGRpc3RQYXRoLCBwbHVnaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiksIEpTT04uc3RyaW5naWZ5KFtwbHVnaW5JZF0pKTtcblxuICByZXR1cm4gcGx1Z2luSWQ7XG59XG5cbi8qKlxuICogRW5hYmxlcyBleHRyYSBjb21tdW5pdHkgcGx1Z2lucyAoYmV5b25kIHRoZSBwbHVnaW4tdW5kZXItdGVzdCkgaW4gdGhlIHJlZ2lzdGVyZWQgdmF1bHQsIGVhY2ggdGhyb3VnaCB0aGVcbiAqIHNhbWUge0BsaW5rIGVuYWJsZVBsdWdpbkluVmF1bHR9IHBhdGguIEVhY2ggcGx1Z2luJ3MgYnVpbHQgZmlsZXMgbXVzdCBhbHJlYWR5IGJlIHByZXNlbnQgaW4gdGhlIHZhdWx0IChzZWVkXG4gKiB0aGVtIHZpYSB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLnBvcHVsYXRlfSkuIEEgbm8tb3Agd2hlbiB0aGUgbGlzdCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVuYWJsZSBwYXJhbWV0ZXJzLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnMocGFyYW1zOiBFbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcGx1Z2luSWRzLCB0ZW1wVmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0T3B0aW9ucyB9ID0gcGFyYW1zO1xuICBmb3IgKGNvbnN0IHBsdWdpbklkIG9mIHBsdWdpbklkcykge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBleHRyYSBjb21tdW5pdHkgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi4uLmApO1xuICAgIGF3YWl0IGVuYWJsZVBsdWdpbkluVmF1bHQoeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0pO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlcyB0aGUgcGx1Z2luIGluIHRoZSByZWdpc3RlcmVkIHZhdWx0IGFuZCB2ZXJpZmllcyBpdCBsb2FkZWQuXG4gKlxuICogT2JzaWRpYW4ncyBgZW5hYmxlUGx1Z2luKClgIHdyYXBzIGBsb2FkUGx1Z2luKClgIGluIGEgdHJ5LWNhdGNoIHRoYXQgc3dhbGxvd3NcbiAqIGVycm9ycyBhbmQgcmV0dXJucyBmYWxzZSwgc28ge0BsaW5rIGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmV9IG1vbmtleS1wYXRjaGVzXG4gKiBgbG9hZFBsdWdpbigpYCB0byBjYXB0dXJlIHRoZSBlcnJvciBiZWZvcmUgaXQncyBzd2FsbG93ZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbmFibGUgcGFyYW1ldGVycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5hYmxlUGx1Z2luSW5WYXVsdChwYXJhbXM6IEVuYWJsZVBsdWdpbkluVmF1bHRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0gPSBwYXJhbXM7XG4gIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBwbHVnaW4gXCIke3BsdWdpbklkfVwiLi4uYCk7XG5cbiAgLypcbiAgICogT3BlbiBhIG5hdGl2ZSBjb25zb2xlLWNhcHR1cmUgd2luZG93IChMYXllciAyLCBBbmRyb2lkIG9ubHkpIGFyb3VuZCB0aGVcbiAgICogZW5hYmxlIHNvIHRoYXQgaWYgT2JzaWRpYW4gc3dhbGxvd3MgdGhlIGxvYWQgZXJyb3IgYmVmb3JlIHRoZSBtb25rZXktcGF0Y2hcbiAgICogYW5kIHRoZSByZW5kZXJlciBjb25zb2xlIChMYXllciAxKSBjYW1lIHVwIGVtcHR5LCB3ZSBjYW4gc3RpbGwgcmVjb3ZlciB0aGVcbiAgICogcmVhbCBjYXVzZSBmcm9tIGBhZGIgbG9nY2F0YC4gTm8tb3AgKHVuZGVmaW5lZCkgb24gdHJhbnNwb3J0cyB0aGF0IGRvbid0XG4gICAqIGltcGxlbWVudCBpdCAoZS5nLiBkZXNrdG9wKS5cbiAgICovXG4gIGNvbnN0IGNhcHR1cmVIYW5kbGUgPSBhd2FpdCB0cmFuc3BvcnQuYmVnaW5Db25zb2xlQ2FwdHVyZT8uKCk7XG5cbiAgLypcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHdlIGVuYWJsZSB0aGUgcGx1Z2luLCBzbyBhIHNpbmdsZS1zaG90IGVuYWJsZSByYWNlcyB0aGUgbG9hZCBhbmQgbG9zZXNcbiAgICogKHRoZSBwbHVnaW4gbGFuZHMgaW4gdGhlIGVuYWJsZWQgc2V0IGJ1dCBuZXZlciBsb2FkcykuIFJldHJ5IHRoZSBlbmFibGUgK1xuICAgKiBsb2FkLXZlcmlmaWNhdGlvbiBhIGZldyB0aW1lcyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYsIHdoaWNoIHJlY292ZXJzIHRoZVxuICAgKiB0cmFuc2llbnQgcmFjZS4gQSBjYXB0dXJlZCBsb2FkIGVycm9yIChgcmVhbEVycm9yYCkgaXMgYSBkZXRlcm1pbmlzdGljIGJ1ZyBcdTIwMTRcbiAgICogcmV0cnlpbmcgY2Fubm90IGZpeCBpdCwgc28gd2UgZmFpbCBmYXN0LiBOb24tQW5kcm9pZCB0cmFuc3BvcnRzIHJlc29sdmUgdG9cbiAgICogdGhlIHNhbWUgZGVmYXVsdHMgYnV0IG5ldmVyIGVudGVyIHRoZSByZXRyeSBwYXRoOiB0aGVpciBsb2FkIGVpdGhlciBzdWNjZWVkc1xuICAgKiBvbiB0aGUgZmlyc3QgYXR0ZW1wdCBvciB0aHJvd3MgYSBjYXB0dXJlZCBlcnJvci5cbiAgICovXG4gIGNvbnN0IG1heEF0dGVtcHRzID0gMSArIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeUNvdW50KHRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCBiYXNlRGVsYXlJbk1pbGxpc2Vjb25kcyA9IHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHModHJhbnNwb3J0T3B0aW9ucyk7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGxldCByZXN1bHQ6IEVuYWJsZVBsdWdpblJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgICBhcmdzOiB7IHBsdWdpbklkIH0sXG4gICAgICAgIGZuOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgICAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlLFxuICAgICAgICB0cmFuc3BvcnQsXG4gICAgICAgIHZhdWx0UGF0aDogdGVtcFZhdWx0LnBhdGhcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvKlxuICAgICAgICogVGhlIGV2YWwgaXRzZWxmIHRocmV3IChlLmcuIHRoZSBXZWJWaWV3IGNvbnRleHQgd2FzIGxvc3QgbWlkLWV4ZWN1dGlvbiBvblxuICAgICAgICogYSBjaHVybmluZyBndWVzdCkgXHUyMDE0IGEgdHJhbnNwb3J0LWxldmVsIHRyYW5zaWVudC4gUmV0cnkgaWYgYXR0ZW1wdHMgcmVtYWluLlxuICAgICAgICovXG4gICAgICBpZiAoYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgIGNvbnN0IGRlbGF5SW5NaWxsaXNlY29uZHMgPSBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMoYmFzZURlbGF5SW5NaWxsaXNlY29uZHMsIGF0dGVtcHQgLSAxKTtcbiAgICAgICAgbG9nKFxuICAgICAgICAgIGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIEVuYWJsZSBhdHRlbXB0ICR7U3RyaW5nKGF0dGVtcHQpfS8ke1N0cmluZyhtYXhBdHRlbXB0cyl9IHRocmV3IGBcbiAgICAgICAgICAgICsgYCgke2Vycm9yVG9TdHJpbmcoZXJyb3IpfSk7IHJldHJ5aW5nIGluICR7U3RyaW5nKGRlbGF5SW5NaWxsaXNlY29uZHMpfW1zLi4uYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChkZWxheUluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGBlcnJvck1lc3NhZ2VgIGlzIHRoZSByZWFsIHRocm93IHNlZW4gYnkgdGhlIG1vbmtleS1wYXRjaDtcbiAgICAgKiBgcmVuZGVyZXJDb25zb2xlRXJyb3JzYCAoTGF5ZXIgMSkgaXMgdGhlIHJlYWwgY2F1c2UgY29uc29sZS1sb2dnZWQgaW4gdGhlIHJlbmRlcmVyLlxuICAgICAqL1xuICAgIGNvbnN0IHJlYWxFcnJvciA9IHJlc3VsdC5lcnJvck1lc3NhZ2UgPz8gcmVzdWx0LnJlbmRlcmVyQ29uc29sZUVycm9ycztcblxuICAgIGlmIChyZXN1bHQuaXNMb2FkZWQgJiYgIXJlYWxFcnJvcikge1xuICAgICAgY29uc3QgYXR0ZW1wdFN1ZmZpeCA9IGF0dGVtcHQgPiAxID8gYCAoYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcobWF4QXR0ZW1wdHMpfSlgIDogJyc7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIHN1Y2Nlc3NmdWxseSR7YXR0ZW1wdFN1ZmZpeH0uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSBjYXB0dXJlZCBsb2FkIGVycm9yIGlzIGRldGVybWluaXN0aWMgXHUyMDE0IGZhaWwgZmFzdCByYXRoZXIgdGhhbiByZXRyeS5cbiAgICBpZiAoIXNob3VsZFJldHJ5UGx1Z2luRW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtyZWFsRXJyb3IgPz8gZ2V0R2VuZXJpY1BsdWdpbkxvYWRGYWlsdXJlTWVzc2FnZShwbHVnaW5JZCl9YCk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNpZW50IGNvbGQtYm9vdCByYWNlIChlbmFibGVkIGJ1dCBub3QgbG9hZGVkLCBubyBjYXVzZSBjYXB0dXJlZCk6IHJldHJ5LlxuICAgIGlmIChhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgIGNvbnN0IGRlbGF5SW5NaWxsaXNlY29uZHMgPSBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMoYmFzZURlbGF5SW5NaWxsaXNlY29uZHMsIGF0dGVtcHQgLSAxKTtcbiAgICAgIGxvZyhcbiAgICAgICAgYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIGJ1dCBub3QgbG9hZGVkIGBcbiAgICAgICAgICArIGAoYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcobWF4QXR0ZW1wdHMpfSk7IHJldHJ5aW5nIGluICR7U3RyaW5nKGRlbGF5SW5NaWxsaXNlY29uZHMpfW1zLi4uYFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHNsZWVwKGRlbGF5SW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAqIEV4aGF1c3RlZCBldmVyeSBhdHRlbXB0IG9uIHRoZSB0cmFuc2llbnQgc2lnbmF0dXJlOiBjb21wb3NlIHRoZSBtb3N0XG4gICAqIHNwZWNpZmljIGRldGFpbCBhdmFpbGFibGUgKGBhZGIgbG9nY2F0YCB0YWlsIG9uIEFuZHJvaWQsIGVsc2UgdGhlIGdlbmVyaWNcbiAgICogbWVzc2FnZSkgXHUyMDE0IHVuY2hhbmdlZCBmcm9tIHRoZSBwcmUtcmV0cnkgc2luZ2xlLXNob3QgZmFpbHVyZS5cbiAgICovXG4gIGNvbnN0IGxvZ2NhdFRhaWwgPSBhd2FpdCB0cmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2U/LihjYXB0dXJlSGFuZGxlKTtcbiAgY29uc3QgZGV0YWlsID0gbG9nY2F0VGFpbCA/PyBnZXRHZW5lcmljUGx1Z2luTG9hZEZhaWx1cmVNZXNzYWdlKHBsdWdpbklkKTtcbiAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGZhaWxlZCB0byBsb2FkOiAke2RldGFpbH1gKTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgcHJvamVjdCByb290IGJ5IHdhbGtpbmcgdXAgZnJvbSBgcHJvY2Vzcy5jd2QoKWAgbG9va2luZyBmb3IgYHBhY2thZ2UuanNvbmAuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqL1xuZnVuY3Rpb24gZmluZFByb2plY3RSb290KCk6IHN0cmluZyB7XG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIExvb3AgdGVybWluYXRlcyBhdCBmaWxlc3lzdGVtIHJvb3QuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGV4aXN0c1N5bmMoam9pbihkaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGpvaW4oZGlyLCAnLi4nKTtcbiAgICBpZiAocGFyZW50ID09PSBkaXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgcHJvamVjdCByb290IChubyBwYWNrYWdlLmpzb24gZm91bmQpLicpO1xuICAgIH1cbiAgICBkaXIgPSBwYXJlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgY3Jvc3MtcHJvY2VzcyBsb2NrIHNjb3BlIGZvciBhIHRyYW5zcG9ydCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBub1xuICogbG9jayBpcyBuZWVkZWQuXG4gKlxuICogRGVza3RvcCBydW5zIHVzZSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBpbnN0YW5jZXMgKHRoZWlyIG93biB1c2VyLWRhdGEgZGlyXG4gKiBhbmQgQ0RQIHBvcnQpLCBzbyB0aGV5IG5vIGxvbmdlciBjb250ZW5kIGFuZCBuZWVkIG5vIGxvY2suIE9ubHkgdGhlIEFuZHJvaWRcbiAqIHRyYW5zcG9ydCwgd2hpY2ggc2hhcmVzIHRoZSBzaW5nbGUgZW11bGF0b3IgYW5kIEFwcGl1bSBzZXJ2ZXIsIG11c3Qgc2VyaWFsaXplLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnRPcHRpb25zIC0gVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIGxvY2sgc2NvcGUgc3RyaW5nLCBvciBgdW5kZWZpbmVkYCBpZiBubyBsb2NrIGlzIG5lZWRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0TG9ja1Njb3BlKHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0cmFuc3BvcnRPcHRpb25zPy50eXBlID09PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nID8gQU5EUk9JRF9MT0NLX1NDT1BFIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBjbGVhbnVwIGhhbmRsZXJzIGZvciBvcnBoYW5lZCBzZXR1cHMgdGhhdCB3ZXJlIG5ldmVyIGV4cGxpY2l0bHlcbiAqIHRvcm4gZG93bi5cbiAqXG4gKiBUd28gaGFuZGxlcnMgY292ZXIgZGlmZmVyZW50IGV4aXQgc2NlbmFyaW9zOlxuICpcbiAqIC0gYGJlZm9yZUV4aXRgIFx1MjAxNCBmaXJlcyB3aGVuIHRoZSBldmVudCBsb29wIGRyYWlucyBuYXR1cmFsbHkuIEFsbG93cyBmdWxsXG4gKiAgIGFzeW5jIHRlYXJkb3duICh1bnJlZ2lzdGVyIHZhdWx0cywgZGlzcG9zZSB0cmFuc3BvcnRzKS4gRG9lcyBOT1QgZmlyZVxuICogICB3aGVuIGBwcm9jZXNzLmV4aXQoKWAgaXMgY2FsbGVkIGRpcmVjdGx5LlxuICpcbiAqIC0gYHVuaGFuZGxlZFJlamVjdGlvbmAgXHUyMDE0IGNhdGNoZXMgYXN5bmMgZXJyb3JzIHRoYXQgYnlwYXNzIGBjb3JlU2V0dXBgJ3NcbiAqICAgY2F0Y2ggYmxvY2suIFBlcmZvcm1zIGZ1bGwgYXN5bmMgdGVhcmRvd24gd2hpbGUgd2Ugc3RpbGwgY2FuLlxuICpcbiAqIC0gYGV4aXRgIFx1MjAxNCBmaXJlcyBvbiBldmVyeSBleGl0LCBpbmNsdWRpbmcgYHByb2Nlc3MuZXhpdCgpYC4gT25seSBzeW5jaHJvbm91c1xuICogICB3b3JrIGlzIHBvc3NpYmxlLCBzbyB0aGlzIGhhbmRsZXIgZG9lcyBiZXN0LWVmZm9ydCBjbGVhbnVwOiBraWxscyBjaGlsZFxuICogICBwcm9jZXNzZXMgdmlhIGBkaXNwb3NlU3luYygpYCBhbmQgcmVtb3ZlcyB0ZW1wIHZhdWx0IGRpcmVjdG9yaWVzIHdpdGhcbiAqICAgYHJtU3luY2AuIFVucmVnaXN0ZXJpbmcgdmF1bHRzICh3aGljaCByZXF1aXJlcyBJUEMgd2l0aCBPYnNpZGlhbikgaXNcbiAqICAgc2tpcHBlZCBcdTIwMTQgYSBzdGFsZSB2YXVsdCBlbnRyeSBpcyBhbiBhY2NlcHRhYmxlIHRyYWRlLW9mZiB2cy4gbGVha2VkXG4gKiAgIHByb2Nlc3NlcyBhbmQgdGVtcCBkaXJlY3Rvcmllcy5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTogdm9pZCB7XG4gIGlmIChpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gUHJvY2VzcyBleGl0aW5nIHdpdGggJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBzZXR1cChzKSBub3QgdG9ybiBkb3duLiBDbGVhbmluZyB1cC4uLmApO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFByb2Nlc3MgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBVbmhhbmRsZWQgcmVqZWN0aW9uIGRldGVjdGVkLiBUZWFyaW5nIGRvd24gJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBhY3RpdmUgc2V0dXAocykuLi5gKTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgY29yZVRlYXJkb3duKHJlc3VsdCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gUmVqZWN0aW9uIGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZVNldHVwcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd25dIFN5bmMgY2xlYW51cDogJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBvcnBoYW5lZCBzZXR1cChzKS5gKTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0LnRyYW5zcG9ydC5kaXNwb3NlU3luYz8uKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFN5bmMgdHJhbnNwb3J0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBybVN5bmMocmVzdWx0LnRlbXBWYXVsdC5wYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFN5bmMgdmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlbGVhc2VTZXR1cExvY2socmVzdWx0KTtcbiAgICB9XG4gICAgYWN0aXZlU2V0dXBzLmNsZWFyKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlbGVhc2VzIGFuZCBmb3JnZXRzIHRoZSBzZXR1cCBsb2NrIGFzc29jaWF0ZWQgd2l0aCBhIHJlc3VsdCwgaWYgYW55LlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgc2V0dXAgcmVzdWx0IHdob3NlIGxvY2sgc2hvdWxkIGJlIHJlbGVhc2VkLlxuICovXG5mdW5jdGlvbiByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdDogQ29yZVNldHVwUmVzdWx0KTogdm9pZCB7XG4gIGNvbnN0IGxvY2sgPSBzZXR1cExvY2tzLmdldChyZXN1bHQpO1xuICBpZiAobG9jaykge1xuICAgIGxvY2sucmVsZWFzZSgpO1xuICAgIHNldHVwTG9ja3MuZGVsZXRlKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgZGlzdCBwYXRoIHRvIHVzZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKlxuICogUGlja3Mgd2hpY2hldmVyIG9mIGBkaXN0L2RldmAgYW5kIGBkaXN0L2J1aWxkYCBoYXMgYSBuZXdlciBgbWFpbi5qc2AuXG4gKiBJZiBvbmx5IG9uZSBleGlzdHMsIHRoYXQgb25lIGlzIHVzZWQuIFRocm93cyBpZiBuZWl0aGVyIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdFJvb3QgLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGNob3NlbiBkaXN0IGZvbGRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURpc3RQYXRoKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkZXZQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9ERVYpO1xuICBjb25zdCBidWlsZFBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0JVSUxEKTtcbiAgY29uc3QgZGV2TWFpbkpzID0gam9pbihkZXZQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgYnVpbGRNYWluSnMgPSBqb2luKGJ1aWxkUGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGRldlN0YXQgPSBleGlzdHNTeW5jKGRldk1haW5KcykgPyBhd2FpdCBzdGF0KGRldk1haW5KcykgOiBudWxsO1xuICBjb25zdCBidWlsZFN0YXQgPSBleGlzdHNTeW5jKGJ1aWxkTWFpbkpzKSA/IGF3YWl0IHN0YXQoYnVpbGRNYWluSnMpIDogbnVsbDtcblxuICBpZiAoZGV2U3RhdCAmJiBidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gZGV2U3RhdC5tdGltZSA+IGJ1aWxkU3RhdC5tdGltZSA/IGRldlBhdGggOiBidWlsZFBhdGg7XG4gIH1cblxuICBpZiAoZGV2U3RhdCkge1xuICAgIHJldHVybiBkZXZQYXRoO1xuICB9XG5cbiAgaWYgKGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBidWlsZFBhdGg7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJ1aWxkIGZvdW5kLiBSdW4gYG5wbSBydW4gYnVpbGRgIG9yIGBucG0gcnVuIGRldmAgZmlyc3QuJyk7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIGFzeW5jIHRlYXJkb3duIHdvcmsgKHZhdWx0IGRpc3Bvc2FsICsgdHJhbnNwb3J0IGRpc3Bvc2FsKS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHNldHVwIHJlc3VsdCB0byB0ZWFyIGRvd24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRlYXJkb3duQXN5bmMocmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudGVtcFZhdWx0LmRpc3Bvc2UocmVzdWx0LnRyYW5zcG9ydCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2U/LigpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVHJhbnNwb3J0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQVlBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFB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
|
|
369
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcbmltcG9ydCB7IHNldFRpbWVvdXQgYXMgc2xlZXAgfSBmcm9tICdub2RlOnRpbWVycy9wcm9taXNlcyc7XG5cbmltcG9ydCB0eXBlIHsgRW5hYmxlUGx1Z2luUmVzdWx0IH0gZnJvbSAnLi9lbmFibGUtcGx1Z2luLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFNldHVwTG9jayB9IGZyb20gJy4vc2V0dXAtbG9jay5tanMnO1xuaW1wb3J0IHR5cGUgeyBQb3B1bGF0ZUZpbGVzUGFyYW1zIH0gZnJvbSAnLi90ZW1wLXZhdWx0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQge1xuICBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICBnZXRHZW5lcmljUGx1Z2luTG9hZEZhaWx1cmVNZXNzYWdlXG59IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5tanMnO1xuaW1wb3J0IHsgZXJyb3JUb1N0cmluZyB9IGZyb20gJy4vZXJyb3ItdG8tc3RyaW5nLm1qcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7XG4gIGNvbXB1dGVCYWNrb2ZmRGVsYXlJbk1pbGxpc2Vjb25kcyxcbiAgcmVzb2x2ZVBsdWdpbkVuYWJsZVJldHJ5Q291bnQsXG4gIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHMsXG4gIHNob3VsZFJldHJ5UGx1Z2luRW5hYmxlXG59IGZyb20gJy4vcGx1Z2luLWVuYWJsZS1yZXRyeS5tanMnO1xuaW1wb3J0IHsgYWNxdWlyZVNldHVwTG9jayB9IGZyb20gJy4vc2V0dXAtbG9jay5tanMnO1xuaW1wb3J0IHsgVGVtcFZhdWx0IH0gZnJvbSAnLi90ZW1wLXZhdWx0Lm1qcyc7XG5pbXBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0ubWpzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5Lm1qcyc7XG5cbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2RwJztcbmNvbnN0IERJU1RfREVWID0gJ2Rpc3QvZGV2JztcbmNvbnN0IERJU1RfQlVJTEQgPSAnZGlzdC9idWlsZCc7XG5jb25zdCBNQUlOX0pTID0gJ21haW4uanMnO1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9ICcub2JzaWRpYW4nO1xuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuY29uc3QgQVBQX0pTT04gPSAnYXBwLmpzb24nO1xuY29uc3QgQVBQX0pTT05fSU5ERU5UID0gMjtcblxuLyoqXG4gKiBUcmFja3Mgc2V0dXBzIHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBidXQgaGF2ZW4ndCBiZWVuIHRvcm4gZG93biB5ZXQuXG4gKiBVc2VkIGJ5IHRoZSBgYmVmb3JlRXhpdGAgaGFuZGxlciB0byBjbGVhbiB1cCB3aGVuIGEgdGVzdCBydW5uZXIgZXhpdHNcbiAqIHdpdGhvdXQgY2FsbGluZyB0ZWFyZG93biAoZS5nLiwgd2hlbiBvbmUgcHJvamVjdCdzIHNldHVwIGZhaWxzIGFuZCB0aGVcbiAqIHJ1bm5lciBhYm9ydHMgYmVmb3JlIHRlYXJpbmcgZG93biBhbHJlYWR5LWluaXRpYWxpemVkIHByb2plY3RzKS5cbiAqL1xuY29uc3QgYWN0aXZlU2V0dXBzID0gbmV3IFNldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5jb25zdCBkaXNwb3NlZFJlc3VsdHMgPSBuZXcgV2Vha1NldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5sZXQgaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgY3Jvc3MtcHJvY2VzcyBzZXR1cCBsb2NrIGhlbGQgYnkgZWFjaCBhY3RpdmUgc2V0dXAuIFJlbGVhc2VkIHdoZW4gdGhlXG4gKiBzZXR1cCBpcyB0b3JuIGRvd24gKG9yIGJ5IHRoZSBwcm9jZXNzIGNsZWFudXAgaGFuZGxlcnMpLCBhbGxvd2luZyBhIGNvbXBldGluZ1xuICogcnVuIHRvIHByb2NlZWQuIFNlZSB7QGxpbmsgYWNxdWlyZVNldHVwTG9ja30uXG4gKi9cbmNvbnN0IHNldHVwTG9ja3MgPSBuZXcgTWFwPENvcmVTZXR1cFJlc3VsdCwgU2V0dXBMb2NrPigpO1xuXG5jb25zdCBBTkRST0lEX0xPQ0tfU0NPUEUgPSAnYW5kcm9pZCc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcmVTZXR1cH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNldHVwUGFyYW1zIHtcbiAgLyoqXG4gICAqIENvbW11bml0eS1wbHVnaW4gaWRzIHRvIGVuYWJsZSBpbiB0aGUgdmF1bHQgKippbiBhZGRpdGlvbiB0byoqIHRoZVxuICAgKiBwbHVnaW4tdW5kZXItdGVzdCwgYWZ0ZXIgaXQgaXMgZW5hYmxlZC4gRWFjaCBpZCdzIGJ1aWx0IGZpbGVzIG11c3QgYWxyZWFkeSBiZVxuICAgKiBwcmVzZW50IHVuZGVyIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+L2AgXHUyMDE0IHNlZWQgdGhlbSB2aWEge0BsaW5rIENvcmVTZXR1cFBhcmFtcy5wb3B1bGF0ZX1cbiAgICogKGUuZy4gd2l0aCBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWApLiBFbmFibGluZyBnb2VzIHRocm91Z2ggdGhlIHNhbWVcbiAgICogcmV0cnkvbG9hZC12ZXJpZnkgcGF0aCBhcyB0aGUgcGx1Z2luLXVuZGVyLXRlc3QuIENvbXBvc2VzIHdpdGhcbiAgICogYGluc3RhbGxQbHVnaW46IGZhbHNlYCAoZW5hYmxlIGV4dHJhcyBpbnRvIGFuIG90aGVyd2lzZSBwbHVnaW4tbGVzcyB2YXVsdCkuXG4gICAqL1xuICByZWFkb25seSBlbmFibGVDb21tdW5pdHlQbHVnaW5zPzogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5zdGFsbCBhbmQgZW5hYmxlIHRoZSBidWlsdCBwbHVnaW4gaW4gdGhlIHRlbXAgdmF1bHQuIERlZmF1bHRzXG4gICAqIHRvIGB0cnVlYC4gU2V0IHRvIGBmYWxzZWAgZm9yIGEgKipub24tcGx1Z2luKiogY29uc3VtZXIgKGUuZy4gYSB0eXBpbmdzXG4gICAqIGNyYXdsZXIpIHRoYXQgb25seSBuZWVkcyBhIHJlZ2lzdGVyZWQsIGVtcHR5IHZhdWx0IHRvIGBldmFsSW5PYnNpZGlhbmBcbiAgICogYWdhaW5zdDogdGhlIHBsdWdpbiBgZGlzdGAvYG1hbmlmZXN0Lmpzb25gIHJlYWQsIHRoZSBjb3B5IGludG9cbiAgICogYC5vYnNpZGlhbi9wbHVnaW5zYCwgdGhlIGBjb21tdW5pdHktcGx1Z2lucy5qc29uYCB3cml0ZSwgYW5kIHRoZSBlbmFibGUgc3RlcFxuICAgKiBhcmUgYWxsIHNraXBwZWQsIHdoaWxlIHRoZSB0cmFuc3BvcnQsIHRlbXAgdmF1bHQsIHJlZ2lzdHJhdGlvbiwgYW5kXG4gICAqIHdvcmtlci1mYWNpbmcgZW5kcG9pbnQgcHJvdmlzaW9uaW5nIHN0aWxsIHJ1biB1bmNoYW5nZWQuXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsUGx1Z2luPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRmlsZXMgYW5kIGZvbGRlcnMgdG8gd3JpdGUgaW50byB0aGUgdmF1bHQgKipiZWZvcmUqKiBPYnNpZGlhbiBvcGVucyBpdCwgc29cbiAgICogaXRzIHN0YXJ0dXAgc2NhbiBpbmRleGVzIHRoZW0gaW4gb25lIHBhc3MgKHNlZSB7QGxpbmsgVGVtcFZhdWx0LnBvcHVsYXRlfSkuXG4gICAqIFVzZSB0aGlzIGZvciBsYXJnZSBmaXh0dXJlcyBcdTIwMTQgd3JpdGluZyB0aG91c2FuZHMgb2Ygbm90ZXMgYWZ0ZXIgb3BlbiBhbmRcbiAgICogZm9yY2luZyBhIHJlLXNjYW4gaXMgZmFyIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBvcHVsYXRlPzogUG9wdWxhdGVGaWxlc1BhcmFtcyB8IHVuZGVmaW5lZDtcblxuICAvKiogVHJhbnNwb3J0IG9wdGlvbnMuIFdoZW4gb21pdHRlZCwgdXNlcyBhbiBvZmYtc2NyZWVuIG93bmVkIGRlc2t0b3AgaW5zdGFuY2UuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IHtAbGluayBjb3JlU2V0dXB9LCB1c2VkIGJ5IGZyYW1ld29yayBhZGFwdGVyc1xuICogdG8gcGFzcyBjb250ZXh0IHRvIHRlc3Qgd29ya2Vycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBSZXN1bHQge1xuICAvKiogVGhlIHRlbXBvcmFyeSB2YXVsdCBjcmVhdGVkIGR1cmluZyBzZXR1cC4gKi9cbiAgcmVhZG9ubHkgdGVtcFZhdWx0OiBUZW1wVmF1bHQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgdXNlZCBkdXJpbmcgc2V0dXAuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMgKGUuZy4gYFwib2JzaWRpYW4tY2RwXCJgKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0TGFiZWw6IHN0cmluZztcblxuICAvKiogVGhlIHRyYW5zcG9ydCBvcHRpb25zIHRoYXQgd2VyZSByZXNvbHZlZC4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb3B5UGx1Z2luSW50b1ZhdWx0fS5cbiAqL1xuaW50ZXJmYWNlIENvcHlQbHVnaW5JbnRvVmF1bHRQYXJhbXMge1xuICAvKiogU2hvcnQgbGFiZWwgZm9yIGxvZyBtZXNzYWdlcy4gKi9cbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcblxuICAvKiogVGhlIHByb2plY3Qgcm9vdCB0byByZXNvbHZlIHRoZSBidWlsdCBwbHVnaW4gZnJvbS4gKi9cbiAgcmVhZG9ubHkgcHJvamVjdFJvb3Q6IHN0cmluZztcblxuICAvKiogVGhlIHRlbXAgdmF1bHQgdG8gY29weSB0aGUgcGx1Z2luIGludG8uICovXG4gIHJlYWRvbmx5IHRlbXBWYXVsdDogVGVtcFZhdWx0O1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0ICh1c2VkIGZvciB0aGUgbW9iaWxlL2Rlc2t0b3Atb25seSBjb21wYXRpYmlsaXR5IGNoZWNrKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zfS5cbiAqL1xuaW50ZXJmYWNlIEVuYWJsZUV4dHJhQ29tbXVuaXR5UGx1Z2luc1BhcmFtcyB7XG4gIC8qKiBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzLiAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgaWRzIG9mIHRoZSBleHRyYSBjb21tdW5pdHkgcGx1Z2lucyB0byBlbmFibGUgKHRoZWlyIGJpbmFyaWVzIG11c3QgYWxyZWFkeSBiZSBpbiB0aGUgdmF1bHQpLiAqL1xuICByZWFkb25seSBwbHVnaW5JZHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBUaGUgdGVtcCB2YXVsdCB0aGUgcGx1Z2lucyB3ZXJlIHNlZWRlZCBpbnRvLiAqL1xuICByZWFkb25seSB0ZW1wVmF1bHQ6IFRlbXBWYXVsdDtcblxuICAvKiogVGhlIHRyYW5zcG9ydCB0byBldmFsdWF0ZSBhZ2FpbnN0LiAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0O1xuXG4gIC8qKiBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMgKHNvdXJjZSBvZiB0aGUgcGx1Z2luLWVuYWJsZSByZXRyeSBrbm9icykuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IG51bGwgfCBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVuYWJsZVBsdWdpbkluVmF1bHR9LlxuICovXG5pbnRlcmZhY2UgRW5hYmxlUGx1Z2luSW5WYXVsdFBhcmFtcyB7XG4gIC8qKiBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzLiAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgaWQgb2YgdGhlIHBsdWdpbiB0byBlbmFibGUuICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSB0ZW1wIHZhdWx0IHRoZSBwbHVnaW4gd2FzIGNvcGllZCBpbnRvLiAqL1xuICByZWFkb25seSB0ZW1wVmF1bHQ6IFRlbXBWYXVsdDtcblxuICAvKiogVGhlIHRyYW5zcG9ydCB0byBldmFsdWF0ZSBhZ2FpbnN0LiAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0O1xuXG4gIC8qKiBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMgKHNvdXJjZSBvZiB0aGUgcGx1Z2luLWVuYWJsZSByZXRyeSBrbm9icykuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IG51bGwgfCBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnM7XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCBzZXR1cCBsb2dpYy5cbiAqXG4gKiBMb2FkcyBgLmVudmAgZnJvbSB0aGUgcHJvamVjdCByb290LCBjcmVhdGVzIGEgdHJhbnNwb3J0LCBjcmVhdGVzIGFuZCByZWdpc3RlcnNcbiAqIGEgdGVtcG9yYXJ5IHZhdWx0IHdpdGggT2JzaWRpYW4sIGFuZCBcdTIwMTQgdW5sZXNzIHtAbGluayBDb3JlU2V0dXBQYXJhbXMuaW5zdGFsbFBsdWdpbn1cbiAqIGlzIGBmYWxzZWAgXHUyMDE0IGNvcGllcyB0aGUgYnVpbHQgcGx1Z2luIGludG8gdGhlIHZhdWx0IGFuZCBlbmFibGVzIGl0LiBUaGVcbiAqIHBsdWdpbi1sZXNzIG1vZGUgc3RpbGwgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIGFuZCBwdWJsaXNoZXMgaXRzXG4gKiB3b3JrZXItZmFjaW5nIGVuZHBvaW50LCBzbyBhIG5vbi1wbHVnaW4gY29uc3VtZXIgcmV1c2VzIHRoZSBzYW1lIGF0dGFjaCB3aXJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNldHVwIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgc2V0dXAgcmVzdWx0IGNvbnRhaW5pbmcgdGhlIHRlbXAgdmF1bHQsIHRyYW5zcG9ydCwgYW5kIHJlc29sdmVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3JlU2V0dXAocGFyYW1zPzogQ29yZVNldHVwUGFyYW1zKTogUHJvbWlzZTxDb3JlU2V0dXBSZXN1bHQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBmaW5kUHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZW52RmlsZVBhdGggPSBqb2luKHByb2plY3RSb290LCAnLmVudicpO1xuICBpZiAoZXhpc3RzU3luYyhlbnZGaWxlUGF0aCkpIHtcbiAgICBsb2FkRW52RmlsZShlbnZGaWxlUGF0aCk7XG4gIH1cblxuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gcmVzb2x2ZUludGVncmF0aW9uVHJhbnNwb3J0T3B0aW9ucyhwYXJhbXM/LnRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCBsYWJlbCA9IHRyYW5zcG9ydE9wdGlvbnMudHlwZTtcbiAgY29uc3QgbG9ja1Njb3BlID0gZ2V0TG9ja1Njb3BlKHRyYW5zcG9ydE9wdGlvbnMpO1xuXG4gIGxldCBsb2NrOiBTZXR1cExvY2sgfCB1bmRlZmluZWQ7XG4gIGlmIChsb2NrU2NvcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBBY3F1aXJpbmcgJyR7bG9ja1Njb3BlfScgc2V0dXAgbG9jayAoc2VyaWFsaXplcyBhZ2FpbnN0IGFueSBjb25jdXJyZW50IGludGVncmF0aW9uLXRlc3QgcnVuKS4uLmApO1xuICAgIGxvY2sgPSBhd2FpdCBhY3F1aXJlU2V0dXBMb2NrKHsgbGFiZWwsIHNjb3BlOiBsb2NrU2NvcGUgfSk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGxvY2sgYWNxdWlyZWQuYCk7XG4gIH1cblxuICBsZXQgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCB8IHVuZGVmaW5lZDtcbiAgbGV0IHRlbXBWYXVsdDogVGVtcFZhdWx0IHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIENyZWF0aW5nIHRyYW5zcG9ydC4uLmApO1xuICAgIHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBUcmFuc3BvcnQgY3JlYXRlZDogJHt0cmFuc3BvcnQuY29uc3RydWN0b3IubmFtZX1gKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBQcm9qZWN0IHJvb3Q6ICR7cHJvamVjdFJvb3R9YCk7XG4gICAgY29uc3Qgc2hvdWxkSW5zdGFsbFBsdWdpbiA9IHBhcmFtcz8uaW5zdGFsbFBsdWdpbiAhPT0gZmFsc2U7XG5cbiAgICB0ZW1wVmF1bHQgPSBuZXcgVGVtcFZhdWx0KCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIENyZWF0ZWQgdGVtcCB2YXVsdDogJHt0ZW1wVmF1bHQucGF0aH1gKTtcblxuICAgIGxldCBwbHVnaW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHNob3VsZEluc3RhbGxQbHVnaW4pIHtcbiAgICAgIHBsdWdpbklkID0gYXdhaXQgY29weVBsdWdpbkludG9WYXVsdCh7IGxhYmVsLCBwcm9qZWN0Um9vdCwgdGVtcFZhdWx0LCB0cmFuc3BvcnQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTa2lwcGluZyBwbHVnaW4gaW5zdGFsbCAoaW5zdGFsbFBsdWdpbjogZmFsc2UpIFx1MjAxNCByZWdpc3RlcmluZyBhbiBlbXB0eSB2YXVsdC5gKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zPy5wb3B1bGF0ZSkge1xuICAgICAgY29uc3QgZW50cnlDb3VudCA9IE9iamVjdC5rZXlzKHBhcmFtcy5wb3B1bGF0ZSkubGVuZ3RoO1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBvcHVsYXRpbmcgdmF1bHQgd2l0aCAke1N0cmluZyhlbnRyeUNvdW50KX0gZW50cmllcyBiZWZvcmUgb3Blbi4uLmApO1xuICAgICAgdGVtcFZhdWx0LnBvcHVsYXRlKHBhcmFtcy5wb3B1bGF0ZSk7XG4gICAgfVxuXG4gICAgYXdhaXQgZW5zdXJlQWx3YXlzVXBkYXRlTGlua3ModGVtcFZhdWx0LCBsYWJlbCk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU3luY2luZyB2YXVsdCB0byBkZXZpY2UuLi5gKTtcbiAgICBhd2FpdCB0ZW1wVmF1bHQuc3luY1RvRGV2aWNlKHRyYW5zcG9ydCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFJlZ2lzdGVyaW5nIHZhdWx0Li4uYCk7XG4gICAgYXdhaXQgdGVtcFZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFZhdWx0IHJlZ2lzdGVyZWQuYCk7XG5cbiAgICBpZiAocGx1Z2luSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgZW5hYmxlUGx1Z2luSW5WYXVsdCh7IGxhYmVsLCBwbHVnaW5JZCwgdGVtcFZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydE9wdGlvbnMgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgZW5hYmxlRXh0cmFDb21tdW5pdHlQbHVnaW5zKHtcbiAgICAgIGxhYmVsLFxuICAgICAgcGx1Z2luSWRzOiBwYXJhbXM/LmVuYWJsZUNvbW11bml0eVBsdWdpbnMgPz8gW10sXG4gICAgICB0ZW1wVmF1bHQsXG4gICAgICB0cmFuc3BvcnQsXG4gICAgICB0cmFuc3BvcnRPcHRpb25zXG4gICAgfSk7XG5cbiAgICBjb25zdCBhdWdtZW50ZWRPcHRpb25zID0gYXVnbWVudFRyYW5zcG9ydE9wdGlvbnModHJhbnNwb3J0T3B0aW9ucywgdHJhbnNwb3J0KTtcbiAgICBjb25zdCByZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCA9IHsgdGVtcFZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydExhYmVsOiBsYWJlbCwgdHJhbnNwb3J0T3B0aW9uczogYXVnbWVudGVkT3B0aW9ucyB9O1xuICAgIGFjdGl2ZVNldHVwcy5hZGQocmVzdWx0KTtcbiAgICBpZiAobG9jaykge1xuICAgICAgc2V0dXBMb2Nrcy5zZXQocmVzdWx0LCBsb2NrKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBmYWlsZWQsIGNsZWFuaW5nIHVwLi4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0ZW1wVmF1bHQgJiYgdHJhbnNwb3J0KSB7XG4gICAgICAgIGF3YWl0IHRlbXBWYXVsdC5kaXNwb3NlKHRyYW5zcG9ydCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoY2xlYW51cEVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cmFuc3BvcnQ/LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoY2xlYW51cEVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBSZWxlYXNlIHRoZSBsb2NrIHNvIGEgd2FpdGluZyBydW4gY2FuIHByb2NlZWQgZXZlbiB0aG91Z2ggdGhpcyBydW4gZmFpbGVkLlxuICAgIGxvY2s/LnJlbGVhc2UoKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBOT1RFOiBJZiB0aGUgdGVzdCBydW5uZXIgcmVwb3J0cyBcIk5vIHRlc3QgZmlsZXMgZm91bmRcIiwgaWdub3JlIGl0IFx1MjAxNCBpdCBpcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBzZXR1cCBmYWlsdXJlIGFib3ZlLmApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCB0ZWFyZG93biBsb2dpYy5cbiAqXG4gKiBEaXNwb3NlcyBvZiB0aGUgdGVtcG9yYXJ5IHZhdWx0IGFuZCB0cmFuc3BvcnQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgZnJvbSB7QGxpbmsgY29yZVNldHVwfS4gV2hlbiBgdW5kZWZpbmVkYCwgZG9lcyBub3RoaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVRlYXJkb3duKHJlc3VsdD86IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlc3VsdCB8fCBkaXNwb3NlZFJlc3VsdHMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZGlzcG9zZWRSZXN1bHRzLmFkZChyZXN1bHQpO1xuXG4gIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVGVhcmluZyBkb3duLi4uYCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0ZWFyZG93bkFzeW5jKHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBDbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2ZVNldHVwcy5kZWxldGUocmVzdWx0KTtcbiAgICByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0cmFuc3BvcnQgb3B0aW9ucyBmb3IgYW4gaW50ZWdyYXRpb24gcnVuLlxuICpcbiAqIERlc2t0b3AgbGF1bmNoZXMgYXJlIG5vcm1hbGx5IHZpc2libGUsIGJ1dCB0ZXN0IHNldHVwIGV4cGxpY2l0bHkga2VlcHMgaXRzXG4gKiBvd25lZCBpbnN0YW5jZSBvZmYtc2NyZWVuIHNvIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgZGV2ZWxvcGVyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uc3VtZXItcHJvdmlkZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBPcHRpb25zIHdpdGggdGhlIGRlc2t0b3AgaW50ZWdyYXRpb24gdmlzaWJpbGl0eSBkZWZhdWx0IGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSW50ZWdyYXRpb25UcmFuc3BvcnRPcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMge1xuICBpZiAob3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJykge1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGlzT2JzaWRpYW5BcHBWaXNpYmxlOiBvcHRpb25zPy5pc09ic2lkaWFuQXBwVmlzaWJsZSA/PyBmYWxzZSxcbiAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICB9O1xufVxuXG4vKipcbiAqIEF1Z21lbnRzIHRyYW5zcG9ydCBvcHRpb25zIHdpdGggcmV1c2UgaW5mbyBzbyB0ZXN0IHdvcmtlcnMgY2FuIHJlYXR0YWNoIHRvIHRoZVxuICogaW5zdGFuY2UgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGluc3RlYWQgb2YgY3JlYXRpbmcgdGhlaXIgb3duOlxuICpcbiAqIC0gKipBcHBpdW0qKiBcdTIwMTQgaW5qZWN0cyB0aGUgZXN0YWJsaXNoZWQgYHNlc3Npb25JZGAvYGRldmljZUlkYC5cbiAqIC0gKipPd25lZCBkZXNrdG9wIENEUCoqIFx1MjAxNCBpbmplY3RzIHRoZSBvd25lZCBpbnN0YW5jZSdzIGBob3N0YC9gcG9ydGAgKGNob3NlblxuICogICBhdCBsYXVuY2gpIHBsdXMgdGhlIGludGVybmFsIGBpc0hhcm5lc3NPd25lZEluc3RhbmNlYCBmbGFnLCBzbyBlYWNoIHdvcmtlclxuICogICAqKmF0dGFjaGVzKiogdG8gdGhhdCBpbnN0YW5jZSBvdmVyIENEUCByYXRoZXIgdGhhbiBsYXVuY2hpbmcgKGFuZCBuZXZlclxuICogICByZWdpc3RlcmluZykgaXRzIG93biBcdTIwMTQgdGhlIGJ1ZyB0aGF0IG90aGVyd2lzZSBsZWF2ZXMgYSB3b3JrZXIncyB0cmFuc3BvcnRcbiAqICAgd2l0aCBubyBDRFAgZW5kcG9pbnQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3JpZ2luYWwgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqIEByZXR1cm5zIFRoZSBhdWdtZW50ZWQgb3B0aW9ucywgb3IgdGhlIG9yaWdpbmFsIG9wdGlvbnMgaWYgbm90IGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIGF1Z21lbnRUcmFuc3BvcnRPcHRpb25zKFxuICBvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnRcbik6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb25zPy50eXBlID09PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nICYmIHRyYW5zcG9ydCBpbnN0YW5jZW9mIEFwcGl1bVRyYW5zcG9ydCkge1xuICAgIGNvbnN0IHNlc3Npb25JbmZvID0gdHJhbnNwb3J0LmdldFNlc3Npb25JbmZvKCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtvcHRpb25zLnR5cGV9XSBTZXNzaW9uIHJldXNlIGluZm86IHNlc3Npb25JZD0ke3Nlc3Npb25JbmZvLnNlc3Npb25JZH0sIGRldmljZUlkPSR7c2Vzc2lvbkluZm8uZGV2aWNlSWR9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkZXZpY2VJZDogc2Vzc2lvbkluZm8uZGV2aWNlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JbmZvLnNlc3Npb25JZFxuICAgIH07XG4gIH1cblxuICBpZiAoKG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSAmJiB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0cmFuc3BvcnQuZ2V0T3duZWRJbnN0YW5jZUVuZHBvaW50KCk7XG4gICAgaWYgKGVuZHBvaW50KSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke0RFRkFVTFRfVFJBTlNQT1JUX1RZUEV9XSBPd25lZCBpbnN0YW5jZSByZXVzZSBpbmZvOiBob3N0PSR7ZW5kcG9pbnQuaG9zdH0sIHBvcnQ9JHtTdHJpbmcoZW5kcG9pbnQucG9ydCl9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBob3N0OiBlbmRwb2ludC5ob3N0LFxuICAgICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiB0cnVlLFxuICAgICAgICBwb3J0OiBlbmRwb2ludC5wb3J0LFxuICAgICAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIHRoZSB0ZW1wIHZhdWx0IGFuZCBtYXJrcyBpdCBhcyBhIGNvbW11bml0eSBwbHVnaW4uXG4gKlxuICogUmVhZHMgYG1hbmlmZXN0Lmpzb25gIGZyb20gdGhlIG5ld2VyIG9mIGBkaXN0L2RldmAvYGRpc3QvYnVpbGRgLCByZWplY3RzIGFcbiAqIGRlc2t0b3Atb25seSBwbHVnaW4gb24gYSBtb2JpbGUgdHJhbnNwb3J0LCBjb3BpZXMgdGhlIGJ1aWxkIGludG9cbiAqIGAub2JzaWRpYW4vcGx1Z2lucy88aWQ+YCwgYW5kIHdyaXRlcyBgLm9ic2lkaWFuL2NvbW11bml0eS1wbHVnaW5zLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29weSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHBsdWdpbiBpZCByZWFkIGZyb20gdGhlIG1hbmlmZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5UGx1Z2luSW50b1ZhdWx0KHBhcmFtczogQ29weVBsdWdpbkludG9WYXVsdFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgbGFiZWwsIHByb2plY3RSb290LCB0ZW1wVmF1bHQsIHRyYW5zcG9ydCB9ID0gcGFyYW1zO1xuICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuICBjb25zdCBwbHVnaW5JZCA9IG1hbmlmZXN0SnNvbi5pZDtcblxuICBpZiAodHJhbnNwb3J0LmlzTW9iaWxlICYmIG1hbmlmZXN0SnNvbi5pc0Rlc2t0b3BPbmx5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGlzRGVza3RvcE9ubHk6IHRydWUgaW4gbWFuaWZlc3QuanNvbi4gTW9iaWxlIGludGVncmF0aW9uIHRlc3RzIGNhbm5vdCBydW4gZm9yIGRlc2t0b3Atb25seSBwbHVnaW5zLmBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgbWFpbkpzID0gam9pbihkaXN0UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGF3YWl0IHN0YXQobWFpbkpzKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFVzaW5nICR7ZGlzdFBhdGh9ICgke2J1aWxkU3RhdC5tdGltZS50b0lTT1N0cmluZygpfSkuIElmIG91dGRhdGVkLCByZWJ1aWxkLmApO1xuXG4gIGNvbnN0IHBsdWdpbkRpciA9IGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIFBMVUdJTlNfRElSLCBwbHVnaW5JZCk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGNwKGRpc3RQYXRoLCBwbHVnaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiksIEpTT04uc3RyaW5naWZ5KFtwbHVnaW5JZF0pKTtcblxuICByZXR1cm4gcGx1Z2luSWQ7XG59XG5cbi8qKlxuICogRW5hYmxlcyBleHRyYSBjb21tdW5pdHkgcGx1Z2lucyAoYmV5b25kIHRoZSBwbHVnaW4tdW5kZXItdGVzdCkgaW4gdGhlIHJlZ2lzdGVyZWQgdmF1bHQsIGVhY2ggdGhyb3VnaCB0aGVcbiAqIHNhbWUge0BsaW5rIGVuYWJsZVBsdWdpbkluVmF1bHR9IHBhdGguIEVhY2ggcGx1Z2luJ3MgYnVpbHQgZmlsZXMgbXVzdCBhbHJlYWR5IGJlIHByZXNlbnQgaW4gdGhlIHZhdWx0IChzZWVkXG4gKiB0aGVtIHZpYSB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLnBvcHVsYXRlfSkuIEEgbm8tb3Agd2hlbiB0aGUgbGlzdCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVuYWJsZSBwYXJhbWV0ZXJzLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnMocGFyYW1zOiBFbmFibGVFeHRyYUNvbW11bml0eVBsdWdpbnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcGx1Z2luSWRzLCB0ZW1wVmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0T3B0aW9ucyB9ID0gcGFyYW1zO1xuICBmb3IgKGNvbnN0IHBsdWdpbklkIG9mIHBsdWdpbklkcykge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBleHRyYSBjb21tdW5pdHkgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi4uLmApO1xuICAgIGF3YWl0IGVuYWJsZVBsdWdpbkluVmF1bHQoeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0pO1xuICB9XG59XG5cbi8qKlxuICogRW5hYmxlcyB0aGUgcGx1Z2luIGluIHRoZSByZWdpc3RlcmVkIHZhdWx0IGFuZCB2ZXJpZmllcyBpdCBsb2FkZWQuXG4gKlxuICogT2JzaWRpYW4ncyBgZW5hYmxlUGx1Z2luKClgIHdyYXBzIGBsb2FkUGx1Z2luKClgIGluIGEgdHJ5LWNhdGNoIHRoYXQgc3dhbGxvd3NcbiAqIGVycm9ycyBhbmQgcmV0dXJucyBmYWxzZSwgc28ge0BsaW5rIGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmV9IG1vbmtleS1wYXRjaGVzXG4gKiBgbG9hZFBsdWdpbigpYCB0byBjYXB0dXJlIHRoZSBlcnJvciBiZWZvcmUgaXQncyBzd2FsbG93ZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbmFibGUgcGFyYW1ldGVycy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5hYmxlUGx1Z2luSW5WYXVsdChwYXJhbXM6IEVuYWJsZVBsdWdpbkluVmF1bHRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBsYWJlbCwgcGx1Z2luSWQsIHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRPcHRpb25zIH0gPSBwYXJhbXM7XG4gIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBwbHVnaW4gXCIke3BsdWdpbklkfVwiLi4uYCk7XG5cbiAgLypcbiAgICogT3BlbiBhIG5hdGl2ZSBjb25zb2xlLWNhcHR1cmUgd2luZG93IChMYXllciAyLCBBbmRyb2lkIG9ubHkpIGFyb3VuZCB0aGVcbiAgICogZW5hYmxlIHNvIHRoYXQgaWYgT2JzaWRpYW4gc3dhbGxvd3MgdGhlIGxvYWQgZXJyb3IgYmVmb3JlIHRoZSBtb25rZXktcGF0Y2hcbiAgICogYW5kIHRoZSByZW5kZXJlciBjb25zb2xlIChMYXllciAxKSBjYW1lIHVwIGVtcHR5LCB3ZSBjYW4gc3RpbGwgcmVjb3ZlciB0aGVcbiAgICogcmVhbCBjYXVzZSBmcm9tIGBhZGIgbG9nY2F0YC4gTm8tb3AgKHVuZGVmaW5lZCkgb24gdHJhbnNwb3J0cyB0aGF0IGRvbid0XG4gICAqIGltcGxlbWVudCBpdCAoZS5nLiBkZXNrdG9wKS5cbiAgICovXG4gIGNvbnN0IGNhcHR1cmVIYW5kbGUgPSBhd2FpdCB0cmFuc3BvcnQuYmVnaW5Db25zb2xlQ2FwdHVyZT8uKCk7XG5cbiAgLypcbiAgICogT24gYSBmcmVzaGx5IGNvbGQtYm9vdGVkIGVtdWxhdG9yIHRoZSBwbHVnaW4gc3Vic3lzdGVtIGNhbiBzdGlsbCBiZSBzZXR0bGluZ1xuICAgKiB3aGVuIHdlIGVuYWJsZSB0aGUgcGx1Z2luLCBzbyBhIHNpbmdsZS1zaG90IGVuYWJsZSByYWNlcyB0aGUgbG9hZCBhbmQgbG9zZXNcbiAgICogKHRoZSBwbHVnaW4gbGFuZHMgaW4gdGhlIGVuYWJsZWQgc2V0IGJ1dCBuZXZlciBsb2FkcykuIFJldHJ5IHRoZSBlbmFibGUgK1xuICAgKiBsb2FkLXZlcmlmaWNhdGlvbiBhIGZldyB0aW1lcyB3aXRoIGV4cG9uZW50aWFsIGJhY2tvZmYsIHdoaWNoIHJlY292ZXJzIHRoZVxuICAgKiB0cmFuc2llbnQgcmFjZS4gQSBjYXB0dXJlZCBsb2FkIGVycm9yIChgcmVhbEVycm9yYCkgaXMgYSBkZXRlcm1pbmlzdGljIGJ1ZyBcdTIwMTRcbiAgICogcmV0cnlpbmcgY2Fubm90IGZpeCBpdCwgc28gd2UgZmFpbCBmYXN0LiBOb24tQW5kcm9pZCB0cmFuc3BvcnRzIHJlc29sdmUgdG9cbiAgICogdGhlIHNhbWUgZGVmYXVsdHMgYnV0IG5ldmVyIGVudGVyIHRoZSByZXRyeSBwYXRoOiB0aGVpciBsb2FkIGVpdGhlciBzdWNjZWVkc1xuICAgKiBvbiB0aGUgZmlyc3QgYXR0ZW1wdCBvciB0aHJvd3MgYSBjYXB0dXJlZCBlcnJvci5cbiAgICovXG4gIGNvbnN0IG1heEF0dGVtcHRzID0gMSArIHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeUNvdW50KHRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCBiYXNlRGVsYXlJbk1pbGxpc2Vjb25kcyA9IHJlc29sdmVQbHVnaW5FbmFibGVSZXRyeURlbGF5SW5NaWxsaXNlY29uZHModHJhbnNwb3J0T3B0aW9ucyk7XG5cbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gbWF4QXR0ZW1wdHM7IGF0dGVtcHQrKykge1xuICAgIGxldCByZXN1bHQ6IEVuYWJsZVBsdWdpblJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgICBhcmdzOiB7IHBsdWdpbklkIH0sXG4gICAgICAgIGZuOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgICAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlLFxuICAgICAgICB0cmFuc3BvcnQsXG4gICAgICAgIHZhdWx0UGF0aDogdGVtcFZhdWx0LnBhdGhcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvKlxuICAgICAgICogVGhlIGV2YWwgaXRzZWxmIHRocmV3IChlLmcuIHRoZSBXZWJWaWV3IGNvbnRleHQgd2FzIGxvc3QgbWlkLWV4ZWN1dGlvbiBvblxuICAgICAgICogYSBjaHVybmluZyBndWVzdCkgXHUyMDE0IGEgdHJhbnNwb3J0LWxldmVsIHRyYW5zaWVudC4gUmV0cnkgaWYgYXR0ZW1wdHMgcmVtYWluLlxuICAgICAgICovXG4gICAgICBpZiAoYXR0ZW1wdCA8IG1heEF0dGVtcHRzKSB7XG4gICAgICAgIGNvbnN0IGRlbGF5SW5NaWxsaXNlY29uZHMgPSBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMoYmFzZURlbGF5SW5NaWxsaXNlY29uZHMsIGF0dGVtcHQgLSAxKTtcbiAgICAgICAgbG9nKFxuICAgICAgICAgIGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIEVuYWJsZSBhdHRlbXB0ICR7U3RyaW5nKGF0dGVtcHQpfS8ke1N0cmluZyhtYXhBdHRlbXB0cyl9IHRocmV3IGBcbiAgICAgICAgICAgICsgYCgke2Vycm9yVG9TdHJpbmcoZXJyb3IpfSk7IHJldHJ5aW5nIGluICR7U3RyaW5nKGRlbGF5SW5NaWxsaXNlY29uZHMpfW1zLi4uYFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChkZWxheUluTWlsbGlzZWNvbmRzKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGBlcnJvck1lc3NhZ2VgIGlzIHRoZSByZWFsIHRocm93IHNlZW4gYnkgdGhlIG1vbmtleS1wYXRjaDtcbiAgICAgKiBgcmVuZGVyZXJDb25zb2xlRXJyb3JzYCAoTGF5ZXIgMSkgaXMgdGhlIHJlYWwgY2F1c2UgY29uc29sZS1sb2dnZWQgaW4gdGhlIHJlbmRlcmVyLlxuICAgICAqL1xuICAgIGNvbnN0IHJlYWxFcnJvciA9IHJlc3VsdC5lcnJvck1lc3NhZ2UgPz8gcmVzdWx0LnJlbmRlcmVyQ29uc29sZUVycm9ycztcblxuICAgIGlmIChyZXN1bHQuaXNMb2FkZWQgJiYgIXJlYWxFcnJvcikge1xuICAgICAgY29uc3QgYXR0ZW1wdFN1ZmZpeCA9IGF0dGVtcHQgPiAxID8gYCAoYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcobWF4QXR0ZW1wdHMpfSlgIDogJyc7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIHN1Y2Nlc3NmdWxseSR7YXR0ZW1wdFN1ZmZpeH0uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQSBjYXB0dXJlZCBsb2FkIGVycm9yIGlzIGRldGVybWluaXN0aWMgXHUyMDE0IGZhaWwgZmFzdCByYXRoZXIgdGhhbiByZXRyeS5cbiAgICBpZiAoIXNob3VsZFJldHJ5UGx1Z2luRW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtyZWFsRXJyb3IgPz8gZ2V0R2VuZXJpY1BsdWdpbkxvYWRGYWlsdXJlTWVzc2FnZShwbHVnaW5JZCl9YCk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNpZW50IGNvbGQtYm9vdCByYWNlIChlbmFibGVkIGJ1dCBub3QgbG9hZGVkLCBubyBjYXVzZSBjYXB0dXJlZCk6IHJldHJ5LlxuICAgIGlmIChhdHRlbXB0IDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgIGNvbnN0IGRlbGF5SW5NaWxsaXNlY29uZHMgPSBjb21wdXRlQmFja29mZkRlbGF5SW5NaWxsaXNlY29uZHMoYmFzZURlbGF5SW5NaWxsaXNlY29uZHMsIGF0dGVtcHQgLSAxKTtcbiAgICAgIGxvZyhcbiAgICAgICAgYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIGJ1dCBub3QgbG9hZGVkIGBcbiAgICAgICAgICArIGAoYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0vJHtTdHJpbmcobWF4QXR0ZW1wdHMpfSk7IHJldHJ5aW5nIGluICR7U3RyaW5nKGRlbGF5SW5NaWxsaXNlY29uZHMpfW1zLi4uYFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHNsZWVwKGRlbGF5SW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAqIEV4aGF1c3RlZCBldmVyeSBhdHRlbXB0IG9uIHRoZSB0cmFuc2llbnQgc2lnbmF0dXJlOiBjb21wb3NlIHRoZSBtb3N0XG4gICAqIHNwZWNpZmljIGRldGFpbCBhdmFpbGFibGUgKGBhZGIgbG9nY2F0YCB0YWlsIG9uIEFuZHJvaWQsIGVsc2UgdGhlIGdlbmVyaWNcbiAgICogbWVzc2FnZSkgXHUyMDE0IHVuY2hhbmdlZCBmcm9tIHRoZSBwcmUtcmV0cnkgc2luZ2xlLXNob3QgZmFpbHVyZS5cbiAgICovXG4gIGNvbnN0IGxvZ2NhdFRhaWwgPSBhd2FpdCB0cmFuc3BvcnQucmVhZENvbnNvbGVDYXB0dXJlU2luY2U/LihjYXB0dXJlSGFuZGxlKTtcbiAgY29uc3QgZGV0YWlsID0gbG9nY2F0VGFpbCA/PyBnZXRHZW5lcmljUGx1Z2luTG9hZEZhaWx1cmVNZXNzYWdlKHBsdWdpbklkKTtcbiAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGZhaWxlZCB0byBsb2FkOiAke2RldGFpbH1gKTtcbn1cblxuLyoqXG4gKiBFbmFibGVzIGBhbHdheXNVcGRhdGVMaW5rc2AgaW4gdGhlIG93bmVkIHZhdWx0J3MgYC5vYnNpZGlhbi9hcHAuanNvbmAuXG4gKlxuICogV2l0aG91dCBpdCwgYW55IHJlbmFtZSBvciBtb3ZlIHRoYXQgYWZmZWN0cyBsaW5rcyBtYWtlcyBPYnNpZGlhbidzXG4gKiBgRmlsZU1hbmFnZXIudXBkYXRlQWxsTGlua3NgIHBvcCBhbiBpbnRlcmFjdGl2ZSBcIlVwZGF0ZSBsaW5rcz9cIiBjb25maXJtYXRpb24gbW9kYWxcbiAqIChpdCBvbmx5IHNraXBzIHRoZSBtb2RhbCB3aGVuIGBhbHdheXNVcGRhdGVMaW5rc2AgaXMgb24pLiBIZWFkbGVzcyB0aGVyZSBpcyBubyB1c2VyXG4gKiB0byBhbnN3ZXIgaXQsIHNvIHRoZSBQcm9taXNlIG5ldmVyIHJlc29sdmVzIFx1MjAxNCB0aGUgcmVuYW1lJ3MgaW50ZXJuYWxcbiAqIGBGaWxlTWFuYWdlci51cGRhdGVRdWV1ZWAgdGFzayBoYW5ncyBmb3JldmVyLCBhbmQgYmVjYXVzZSB0aGF0IHF1ZXVlIGlzIGEgc2luZ2xldG9uXG4gKiBldmVyeSBzdWJzZXF1ZW50IGByZW5hbWVGaWxlYCBpbiB0aGUgc2hhcmVkIGluc3RhbmNlIGhhbmdzIHRvbyAodGhlIGxvbmctb2JzZXJ2ZWRcbiAqIFwicmVuYW1lIHdhbGxcIikuIEVuYWJsaW5nIHRoZSBzZXR0aW5nIG1ha2VzIHJlbmFtZXMgdXBkYXRlIGxpbmtzIG5vbi1pbnRlcmFjdGl2ZWx5LFxuICogc28gcmVuYW1lLWRyaXZlbiBpbnRlZ3JhdGlvbiB0ZXN0cyBydW4gaW4gaGVhZGxlc3MgbW9kZS5cbiAqXG4gKiBNZXJnZXMgaW50byBhbnkgZXhpc3RpbmcgYGFwcC5qc29uYCAoZS5nLiBvbmUgY2FycmllZCBpbiB2aWEgYHBvcHVsYXRlYCkgc28gb3RoZXJcbiAqIGNvbmZpZyBrZXlzIGFyZSBwcmVzZXJ2ZWQsIGFuZCBydW5zIGJlZm9yZSBgc3luY1RvRGV2aWNlYCBzbyB0aGUgdmFsdWUgcmVhY2hlc1xuICogbW9iaWxlIGRldmljZXMgdG9vLlxuICpcbiAqIEBwYXJhbSB0ZW1wVmF1bHQgLSBUaGUgb3duZWQgdGVtcCB2YXVsdCB0byBjb25maWd1cmUuXG4gKiBAcGFyYW0gbGFiZWwgLSBUaGUgdHJhbnNwb3J0IGxhYmVsLCBmb3IgbG9nZ2luZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlQWx3YXlzVXBkYXRlTGlua3ModGVtcFZhdWx0OiBUZW1wVmF1bHQsIGxhYmVsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29uZmlnRGlyID0gam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUik7XG4gIGNvbnN0IGFwcEpzb25QYXRoID0gam9pbihjb25maWdEaXIsIEFQUF9KU09OKTtcbiAgbGV0IGFwcENvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgdHJ5IHtcbiAgICBhcHBDb25maWcgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGFwcEpzb25QYXRoLCAndXRmLTgnKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vIGV4aXN0aW5nIGFwcC5qc29uIChvciB1bnJlYWRhYmxlKSBcdTIwMTQgc3RhcnQgZnJvbSBhbiBlbXB0eSBjb25maWcuXG4gIH1cbiAgYXBwQ29uZmlnWydhbHdheXNVcGRhdGVMaW5rcyddID0gdHJ1ZTtcbiAgYXdhaXQgbWtkaXIoY29uZmlnRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGFwcEpzb25QYXRoLCBKU09OLnN0cmluZ2lmeShhcHBDb25maWcsIG51bGwsIEFQUF9KU09OX0lOREVOVCkpO1xuICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gRW5hYmxlZCBhbHdheXNVcGRhdGVMaW5rcyBpbiAke0FQUF9KU09OfSAoaGVhZGxlc3MgcmVuYW1lIHN1cHBvcnQpLmApO1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBwcm9qZWN0IHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIGBwcm9jZXNzLmN3ZCgpYCBsb29raW5nIGZvciBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICovXG5mdW5jdGlvbiBmaW5kUHJvamVjdFJvb3QoKTogc3RyaW5nIHtcbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gTG9vcCB0ZXJtaW5hdGVzIGF0IGZpbGVzeXN0ZW0gcm9vdC5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcmV0dXJuIGRpcjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gam9pbihkaXIsICcuLicpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBwcm9qZWN0IHJvb3QgKG5vIHBhY2thZ2UuanNvbiBmb3VuZCkuJyk7XG4gICAgfVxuICAgIGRpciA9IHBhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBjcm9zcy1wcm9jZXNzIGxvY2sgc2NvcGUgZm9yIGEgdHJhbnNwb3J0LCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vXG4gKiBsb2NrIGlzIG5lZWRlZC5cbiAqXG4gKiBEZXNrdG9wIHJ1bnMgdXNlIGhhcm5lc3Mtb3duZWQsIGlzb2xhdGVkIGluc3RhbmNlcyAodGhlaXIgb3duIHVzZXItZGF0YSBkaXJcbiAqIGFuZCBDRFAgcG9ydCksIHNvIHRoZXkgbm8gbG9uZ2VyIGNvbnRlbmQgYW5kIG5lZWQgbm8gbG9jay4gT25seSB0aGUgQW5kcm9pZFxuICogdHJhbnNwb3J0LCB3aGljaCBzaGFyZXMgdGhlIHNpbmdsZSBlbXVsYXRvciBhbmQgQXBwaXVtIHNlcnZlciwgbXVzdCBzZXJpYWxpemUuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydE9wdGlvbnMgLSBUaGUgcmVzb2x2ZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgbG9jayBzY29wZSBzdHJpbmcsIG9yIGB1bmRlZmluZWRgIGlmIG5vIGxvY2sgaXMgbmVlZGVkLlxuICovXG5mdW5jdGlvbiBnZXRMb2NrU2NvcGUodHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRyYW5zcG9ydE9wdGlvbnM/LnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScgPyBBTkRST0lEX0xPQ0tfU0NPUEUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGNsZWFudXAgaGFuZGxlcnMgZm9yIG9ycGhhbmVkIHNldHVwcyB0aGF0IHdlcmUgbmV2ZXIgZXhwbGljaXRseVxuICogdG9ybiBkb3duLlxuICpcbiAqIFR3byBoYW5kbGVycyBjb3ZlciBkaWZmZXJlbnQgZXhpdCBzY2VuYXJpb3M6XG4gKlxuICogLSBgYmVmb3JlRXhpdGAgXHUyMDE0IGZpcmVzIHdoZW4gdGhlIGV2ZW50IGxvb3AgZHJhaW5zIG5hdHVyYWxseS4gQWxsb3dzIGZ1bGxcbiAqICAgYXN5bmMgdGVhcmRvd24gKHVucmVnaXN0ZXIgdmF1bHRzLCBkaXNwb3NlIHRyYW5zcG9ydHMpLiBEb2VzIE5PVCBmaXJlXG4gKiAgIHdoZW4gYHByb2Nlc3MuZXhpdCgpYCBpcyBjYWxsZWQgZGlyZWN0bHkuXG4gKlxuICogLSBgdW5oYW5kbGVkUmVqZWN0aW9uYCBcdTIwMTQgY2F0Y2hlcyBhc3luYyBlcnJvcnMgdGhhdCBieXBhc3MgYGNvcmVTZXR1cGAnc1xuICogICBjYXRjaCBibG9jay4gUGVyZm9ybXMgZnVsbCBhc3luYyB0ZWFyZG93biB3aGlsZSB3ZSBzdGlsbCBjYW4uXG4gKlxuICogLSBgZXhpdGAgXHUyMDE0IGZpcmVzIG9uIGV2ZXJ5IGV4aXQsIGluY2x1ZGluZyBgcHJvY2Vzcy5leGl0KClgLiBPbmx5IHN5bmNocm9ub3VzXG4gKiAgIHdvcmsgaXMgcG9zc2libGUsIHNvIHRoaXMgaGFuZGxlciBkb2VzIGJlc3QtZWZmb3J0IGNsZWFudXA6IGtpbGxzIGNoaWxkXG4gKiAgIHByb2Nlc3NlcyB2aWEgYGRpc3Bvc2VTeW5jKClgIGFuZCByZW1vdmVzIHRlbXAgdmF1bHQgZGlyZWN0b3JpZXMgd2l0aFxuICogICBgcm1TeW5jYC4gVW5yZWdpc3RlcmluZyB2YXVsdHMgKHdoaWNoIHJlcXVpcmVzIElQQyB3aXRoIE9ic2lkaWFuKSBpc1xuICogICBza2lwcGVkIFx1MjAxNCBhIHN0YWxlIHZhdWx0IGVudHJ5IGlzIGFuIGFjY2VwdGFibGUgdHJhZGUtb2ZmIHZzLiBsZWFrZWRcbiAqICAgcHJvY2Vzc2VzIGFuZCB0ZW1wIGRpcmVjdG9yaWVzLlxuICovXG5mdW5jdGlvbiByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpOiB2b2lkIHtcbiAgaWYgKGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBQcm9jZXNzIGV4aXRpbmcgd2l0aCAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IHNldHVwKHMpIG5vdCB0b3JuIGRvd24uIENsZWFuaW5nIHVwLi4uYCk7XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgY29yZVRlYXJkb3duKHJlc3VsdCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gUHJvY2VzcyBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBwcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZVNldHVwcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd25dIFVuaGFuZGxlZCByZWplY3Rpb24gZGV0ZWN0ZWQuIFRlYXJpbmcgZG93biAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IGFjdGl2ZSBzZXR1cChzKS4uLmApO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIFsuLi5hY3RpdmVTZXR1cHNdKSB7XG4gICAgICBjb3JlVGVhcmRvd24ocmVzdWx0KS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBSZWplY3Rpb24gY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gU3luYyBjbGVhbnVwOiAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IG9ycGhhbmVkIHNldHVwKHMpLmApO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIFsuLi5hY3RpdmVTZXR1cHNdKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB0cmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHJtU3luYyhyZXN1bHQudGVtcFZhdWx0LnBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB2YXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgcmVsZWFzZVNldHVwTG9jayhyZXN1bHQpO1xuICAgIH1cbiAgICBhY3RpdmVTZXR1cHMuY2xlYXIoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgYW5kIGZvcmdldHMgdGhlIHNldHVwIGxvY2sgYXNzb2NpYXRlZCB3aXRoIGEgcmVzdWx0LCBpZiBhbnkuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSBzZXR1cCByZXN1bHQgd2hvc2UgbG9jayBzaG91bGQgYmUgcmVsZWFzZWQuXG4gKi9cbmZ1bmN0aW9uIHJlbGVhc2VTZXR1cExvY2socmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQpOiB2b2lkIHtcbiAgY29uc3QgbG9jayA9IHNldHVwTG9ja3MuZ2V0KHJlc3VsdCk7XG4gIGlmIChsb2NrKSB7XG4gICAgbG9jay5yZWxlYXNlKCk7XG4gICAgc2V0dXBMb2Nrcy5kZWxldGUocmVzdWx0KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkaXN0IHBhdGggdG8gdXNlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBQaWNrcyB3aGljaGV2ZXIgb2YgYGRpc3QvZGV2YCBhbmQgYGRpc3QvYnVpbGRgIGhhcyBhIG5ld2VyIGBtYWluLmpzYC5cbiAqIElmIG9ubHkgb25lIGV4aXN0cywgdGhhdCBvbmUgaXMgdXNlZC4gVGhyb3dzIGlmIG5laXRoZXIgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY2hvc2VuIGRpc3QgZm9sZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRldlBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0RFVik7XG4gIGNvbnN0IGJ1aWxkUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfQlVJTEQpO1xuICBjb25zdCBkZXZNYWluSnMgPSBqb2luKGRldlBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBidWlsZE1haW5KcyA9IGpvaW4oYnVpbGRQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgZGV2U3RhdCA9IGV4aXN0c1N5bmMoZGV2TWFpbkpzKSA/IGF3YWl0IHN0YXQoZGV2TWFpbkpzKSA6IG51bGw7XG4gIGNvbnN0IGJ1aWxkU3RhdCA9IGV4aXN0c1N5bmMoYnVpbGRNYWluSnMpID8gYXdhaXQgc3RhdChidWlsZE1haW5KcykgOiBudWxsO1xuXG4gIGlmIChkZXZTdGF0ICYmIGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBkZXZTdGF0Lm10aW1lID4gYnVpbGRTdGF0Lm10aW1lID8gZGV2UGF0aCA6IGJ1aWxkUGF0aDtcbiAgfVxuXG4gIGlmIChkZXZTdGF0KSB7XG4gICAgcmV0dXJuIGRldlBhdGg7XG4gIH1cblxuICBpZiAoYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGJ1aWxkUGF0aDtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignTm8gYnVpbGQgZm91bmQuIFJ1biBgbnBtIHJ1biBidWlsZGAgb3IgYG5wbSBydW4gZGV2YCBmaXJzdC4nKTtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyB0aGUgYXN5bmMgdGVhcmRvd24gd29yayAodmF1bHQgZGlzcG9zYWwgKyB0cmFuc3BvcnQgZGlzcG9zYWwpLlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgc2V0dXAgcmVzdWx0IHRvIHRlYXIgZG93bi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdGVhcmRvd25Bc3luYyhyZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50ZW1wVmF1bHQuZGlzcG9zZShyZXN1bHQudHJhbnNwb3J0KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50cmFuc3BvcnQuZGlzcG9zZT8uKCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBUcmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBWUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQUNyQixPQUFPLFdBQVcsbUJBQW1CO0FBQ3JDLFNBQVMsY0FBYyxhQUFhO0FBUXBDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxxQkFBcUI7QUFDOUIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxXQUFXO0FBQ3BCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLGtDQUFrQztBQUUzQyxNQUFNLHlCQUF5QjtBQUMvQixNQUFNLFdBQVc7QUFDakIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sVUFBVTtBQUNoQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGNBQWM7QUFDcEIsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sa0JBQWtCO0FBUXhCLE1BQU0sZUFBZSxvQkFBSSxJQUFxQjtBQUM5QyxNQUFNLGtCQUFrQixvQkFBSSxRQUF5QjtBQUNyRCxJQUFJLDZCQUE2QjtBQU9qQyxNQUFNLGFBQWEsb0JBQUksSUFBZ0M7QUFFdkQsTUFBTSxxQkFBcUI7QUE4SDNCLGVBQXNCLFVBQVUsUUFBb0Q7QUFDbEYsUUFBTSxjQUFjLGdCQUFnQjtBQUNwQyxRQUFNLGNBQWMsS0FBSyxhQUFhLE1BQU07QUFDNUMsTUFBSSxXQUFXLFdBQVcsR0FBRztBQUMzQixnQkFBWSxXQUFXO0FBQUEsRUFDekI7QUFFQSxRQUFNLG1CQUFtQixtQ0FBbUMsUUFBUSxnQkFBZ0I7QUFDcEYsUUFBTSxRQUFRLGlCQUFpQjtBQUMvQixRQUFNLFlBQVksYUFBYSxnQkFBZ0I7QUFFL0MsTUFBSTtBQUNKLE1BQUksY0FBYyxRQUFXO0FBQzNCLFFBQUksc0JBQXNCLEtBQUssZ0JBQWdCLFNBQVMsMEVBQTBFO0FBQ2xJLFdBQU8sTUFBTSxpQkFBaUIsRUFBRSxPQUFPLE9BQU8sVUFBVSxDQUFDO0FBQ3pELFFBQUksc0JBQXNCLEtBQUssd0JBQXdCO0FBQUEsRUFDekQ7QUFFQSxNQUFJO0FBQ0osTUFBSTtBQUVKLE1BQUk7QUFDRixRQUFJLHNCQUFzQixLQUFLLHlCQUF5QjtBQUN4RCxnQkFBWSxNQUFNLDJCQUEyQixnQkFBZ0I7QUFDN0QsUUFBSSxzQkFBc0IsS0FBSyx3QkFBd0IsVUFBVSxZQUFZLElBQUksRUFBRTtBQUVuRixRQUFJLHNCQUFzQixLQUFLLG1CQUFtQixXQUFXLEVBQUU7QUFDL0QsVUFBTSxzQkFBc0IsUUFBUSxrQkFBa0I7QUFFdEQsZ0JBQVksSUFBSSxVQUFVO0FBQzFCLFFBQUksc0JBQXNCLEtBQUsseUJBQXlCLFVBQVUsSUFBSSxFQUFFO0FBRXhFLFFBQUk7QUFFSixRQUFJLHFCQUFxQjtBQUN2QixpQkFBVyxNQUFNLG9CQUFvQixFQUFFLE9BQU8sYUFBYSxXQUFXLFVBQVUsQ0FBQztBQUFBLElBQ25GLE9BQU87QUFDTCxVQUFJLHNCQUFzQixLQUFLLHFGQUFnRjtBQUFBLElBQ2pIO0FBRUEsUUFBSSxRQUFRLFVBQVU7QUFDcEIsWUFBTSxhQUFhLE9BQU8sS0FBSyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxVQUFJLHNCQUFzQixLQUFLLDJCQUEyQixPQUFPLFVBQVUsQ0FBQyx5QkFBeUI7QUFDckcsZ0JBQVUsU0FBUyxPQUFPLFFBQVE7QUFBQSxJQUNwQztBQUVBLFVBQU0sd0JBQXdCLFdBQVcsS0FBSztBQUU5QyxRQUFJLHNCQUFzQixLQUFLLDhCQUE4QjtBQUM3RCxVQUFNLFVBQVUsYUFBYSxTQUFTO0FBQ3RDLFFBQUksc0JBQXNCLEtBQUssd0JBQXdCO0FBQ3ZELFVBQU0sVUFBVSxTQUFTLFNBQVM7QUFDbEMsUUFBSSxzQkFBc0IsS0FBSyxxQkFBcUI7QUFFcEQsUUFBSSxhQUFhLFFBQVc7QUFDMUIsWUFBTSxvQkFBb0IsRUFBRSxPQUFPLFVBQVUsV0FBVyxXQUFXLGlCQUFpQixDQUFDO0FBQUEsSUFDdkY7QUFFQSxVQUFNLDRCQUE0QjtBQUFBLE1BQ2hDO0FBQUEsTUFDQSxXQUFXLFFBQVEsMEJBQTBCLENBQUM7QUFBQSxNQUM5QztBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDO0FBRUQsVUFBTSxtQkFBbUIsd0JBQXdCLGtCQUFrQixTQUFTO0FBQzVFLFVBQU0sU0FBMEIsRUFBRSxXQUFXLFdBQVcsZ0JBQWdCLE9BQU8sa0JBQWtCLGlCQUFpQjtBQUNsSCxpQkFBYSxJQUFJLE1BQU07QUFDdkIsUUFBSSxNQUFNO0FBQ1IsaUJBQVcsSUFBSSxRQUFRLElBQUk7QUFBQSxJQUM3QjtBQUNBLGtDQUE4QjtBQUM5QixXQUFPO0FBQUEsRUFDVCxTQUFTLE9BQWdCO0FBQ3ZCLFFBQUksc0JBQXNCLEtBQUssZ0NBQWdDO0FBQy9ELFFBQUk7QUFDRixVQUFJLGFBQWEsV0FBVztBQUMxQixjQUFNLFVBQVUsUUFBUSxTQUFTO0FBQUEsTUFDbkM7QUFBQSxJQUNGLFNBQVMsY0FBdUI7QUFDOUIsVUFBSSxzQkFBc0IsS0FBSyxzQ0FBc0MsY0FBYyxZQUFZLENBQUMsRUFBRTtBQUFBLElBQ3BHO0FBQ0EsUUFBSTtBQUNGLFlBQU0sV0FBVyxVQUFVO0FBQUEsSUFDN0IsU0FBUyxjQUF1QjtBQUM5QixVQUFJLHNCQUFzQixLQUFLLDBDQUEwQyxjQUFjLFlBQVksQ0FBQyxFQUFFO0FBQUEsSUFDeEc7QUFHQSxVQUFNLFFBQVE7QUFFZCxRQUFJLHNCQUFzQixLQUFLLDRIQUF1SDtBQUN0SixVQUFNO0FBQUEsRUFDUjtBQUNGO0FBU0EsZUFBc0IsYUFBYSxRQUF5QztBQUMxRSxNQUFJLENBQUMsVUFBVSxnQkFBZ0IsSUFBSSxNQUFNLEdBQUc7QUFDMUM7QUFBQSxFQUNGO0FBQ0Esa0JBQWdCLElBQUksTUFBTTtBQUUxQixNQUFJLHlCQUF5QixPQUFPLGNBQWMsbUJBQW1CO0FBRXJFLE1BQUk7QUFDRixVQUFNLGNBQWMsTUFBTTtBQUFBLEVBQzVCLFNBQVMsT0FBZ0I7QUFDdkIsUUFBSSx5QkFBeUIsT0FBTyxjQUFjLGdDQUFnQyxjQUFjLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDMUcsVUFBRTtBQUNBLGlCQUFhLE9BQU8sTUFBTTtBQUMxQixxQkFBaUIsTUFBTTtBQUFBLEVBQ3pCO0FBQ0Y7QUFXTyxTQUFTLG1DQUFtQyxTQUE4RDtBQUMvRyxNQUFJLFNBQVMsU0FBUywyQkFBMkI7QUFDL0MsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPO0FBQUEsSUFDTCxHQUFHO0FBQUEsSUFDSCxzQkFBc0IsU0FBUyx3QkFBd0I7QUFBQSxJQUN2RCxNQUFNO0FBQUEsRUFDUjtBQUNGO0FBaUJBLFNBQVMsd0JBQ1AsU0FDQSxXQUNzQztBQUN0QyxNQUFJLFNBQVMsU0FBUyw2QkFBNkIscUJBQXFCLGlCQUFpQjtBQUN2RixVQUFNLGNBQWMsVUFBVSxlQUFlO0FBQzdDLFFBQUksc0JBQXNCLFFBQVEsSUFBSSxtQ0FBbUMsWUFBWSxTQUFTLGNBQWMsWUFBWSxRQUFRLEVBQUU7QUFDbEksV0FBTztBQUFBLE1BQ0wsR0FBRztBQUFBLE1BQ0gsVUFBVSxZQUFZO0FBQUEsTUFDdEIsV0FBVyxZQUFZO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBRUEsT0FBSyxZQUFZLFVBQWEsUUFBUSxTQUFTLG1CQUFtQixxQkFBcUIscUJBQXFCO0FBQzFHLFVBQU0sV0FBVyxVQUFVLHlCQUF5QjtBQUNwRCxRQUFJLFVBQVU7QUFDWixVQUFJLHNCQUFzQixzQkFBc0IscUNBQXFDLFNBQVMsSUFBSSxVQUFVLE9BQU8sU0FBUyxJQUFJLENBQUMsRUFBRTtBQUNuSSxhQUFPO0FBQUEsUUFDTCxHQUFHO0FBQUEsUUFDSCxNQUFNLFNBQVM7QUFBQSxRQUNmLHdCQUF3QjtBQUFBLFFBQ3hCLE1BQU0sU0FBUztBQUFBLFFBQ2YsTUFBTTtBQUFBLE1BQ1I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVlBLGVBQWUsb0JBQW9CLFFBQW9EO0FBQ3JGLFFBQU0sRUFBRSxPQUFPLGFBQWEsV0FBVyxVQUFVLElBQUk7QUFDckQsUUFBTSxXQUFXLE1BQU0sZ0JBQWdCLFdBQVc7QUFDbEQsUUFBTSxlQUFlLEtBQUssTUFBTSxNQUFNLFNBQVMsS0FBSyxVQUFVLGVBQWUsR0FBRyxPQUFPLENBQUM7QUFDeEYsUUFBTSxXQUFXLGFBQWE7QUFFOUIsTUFBSSxVQUFVLFlBQVksYUFBYSxlQUFlO0FBQ3BELFVBQU0sSUFBSTtBQUFBLE1BQ1IsV0FBVyxRQUFRO0FBQUEsSUFDckI7QUFBQSxFQUNGO0FBRUEsUUFBTSxTQUFTLEtBQUssVUFBVSxPQUFPO0FBQ3JDLFFBQU0sWUFBWSxNQUFNLEtBQUssTUFBTTtBQUNuQyxNQUFJLHNCQUFzQixLQUFLLFdBQVcsUUFBUSxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUMsMEJBQTBCO0FBRTlHLFFBQU0sWUFBWSxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsYUFBYSxRQUFRO0FBQ2pGLFFBQU0sTUFBTSxXQUFXLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDMUMsUUFBTSxHQUFHLFVBQVUsV0FBVyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ2pELFFBQU0sVUFBVSxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsc0JBQXNCLEdBQUcsS0FBSyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFN0csU0FBTztBQUNUO0FBU0EsZUFBZSw0QkFBNEIsUUFBMEQ7QUFDbkcsUUFBTSxFQUFFLE9BQU8sV0FBVyxXQUFXLFdBQVcsaUJBQWlCLElBQUk7QUFDckUsYUFBVyxZQUFZLFdBQVc7QUFDaEMsUUFBSSxzQkFBc0IsS0FBSyxzQ0FBc0MsUUFBUSxNQUFNO0FBQ25GLFVBQU0sb0JBQW9CLEVBQUUsT0FBTyxVQUFVLFdBQVcsV0FBVyxpQkFBaUIsQ0FBQztBQUFBLEVBQ3ZGO0FBQ0Y7QUFXQSxlQUFlLG9CQUFvQixRQUFrRDtBQUNuRixRQUFNLEVBQUUsT0FBTyxVQUFVLFdBQVcsV0FBVyxpQkFBaUIsSUFBSTtBQUNwRSxNQUFJLHNCQUFzQixLQUFLLHNCQUFzQixRQUFRLE1BQU07QUFTbkUsUUFBTSxnQkFBZ0IsTUFBTSxVQUFVLHNCQUFzQjtBQVk1RCxRQUFNLGNBQWMsSUFBSSw4QkFBOEIsZ0JBQWdCO0FBQ3RFLFFBQU0sMEJBQTBCLDRDQUE0QyxnQkFBZ0I7QUFFNUYsV0FBUyxVQUFVLEdBQUcsV0FBVyxhQUFhLFdBQVc7QUFDdkQsUUFBSTtBQUNKLFFBQUk7QUFDRixlQUFTLE1BQU0sZUFBZTtBQUFBLFFBQzVCLE1BQU0sRUFBRSxTQUFTO0FBQUEsUUFDakIsSUFBSTtBQUFBLFFBQ0osMkJBQTJCO0FBQUEsUUFDM0I7QUFBQSxRQUNBLFdBQVcsVUFBVTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNILFNBQVMsT0FBTztBQUtkLFVBQUksVUFBVSxhQUFhO0FBQ3pCLGNBQU0sc0JBQXNCLGtDQUFrQyx5QkFBeUIsVUFBVSxDQUFDO0FBQ2xHO0FBQUEsVUFDRSxzQkFBc0IsS0FBSyxvQkFBb0IsT0FBTyxPQUFPLENBQUMsSUFBSSxPQUFPLFdBQVcsQ0FBQyxXQUM3RSxjQUFjLEtBQUssQ0FBQyxrQkFBa0IsT0FBTyxtQkFBbUIsQ0FBQztBQUFBLFFBQzNFO0FBQ0EsY0FBTSxNQUFNLG1CQUFtQjtBQUMvQjtBQUFBLE1BQ0Y7QUFDQSxZQUFNO0FBQUEsSUFDUjtBQU1BLFVBQU0sWUFBWSxPQUFPLGdCQUFnQixPQUFPO0FBRWhELFFBQUksT0FBTyxZQUFZLENBQUMsV0FBVztBQUNqQyxZQUFNLGdCQUFnQixVQUFVLElBQUksYUFBYSxPQUFPLE9BQU8sQ0FBQyxJQUFJLE9BQU8sV0FBVyxDQUFDLE1BQU07QUFDN0YsVUFBSSxzQkFBc0IsS0FBSyxhQUFhLFFBQVEseUJBQXlCLGFBQWEsR0FBRztBQUM3RjtBQUFBLElBQ0Y7QUFHQSxRQUFJLENBQUMsd0JBQXdCLE1BQU0sR0FBRztBQUNwQyxZQUFNLElBQUksTUFBTSxXQUFXLFFBQVEscUJBQXFCLGFBQWEsbUNBQW1DLFFBQVEsQ0FBQyxFQUFFO0FBQUEsSUFDckg7QUFHQSxRQUFJLFVBQVUsYUFBYTtBQUN6QixZQUFNLHNCQUFzQixrQ0FBa0MseUJBQXlCLFVBQVUsQ0FBQztBQUNsRztBQUFBLFFBQ0Usc0JBQXNCLEtBQUssYUFBYSxRQUFRLHFDQUNoQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLE9BQU8sV0FBVyxDQUFDLGtCQUFrQixPQUFPLG1CQUFtQixDQUFDO0FBQUEsTUFDckc7QUFDQSxZQUFNLE1BQU0sbUJBQW1CO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBT0EsUUFBTSxhQUFhLE1BQU0sVUFBVSwwQkFBMEIsYUFBYTtBQUMxRSxRQUFNLFNBQVMsY0FBYyxtQ0FBbUMsUUFBUTtBQUN4RSxRQUFNLElBQUksTUFBTSxXQUFXLFFBQVEscUJBQXFCLE1BQU0sRUFBRTtBQUNsRTtBQXFCQSxlQUFlLHdCQUF3QixXQUFzQixPQUE4QjtBQUN6RixRQUFNLFlBQVksS0FBSyxVQUFVLE1BQU0sbUJBQW1CO0FBQzFELFFBQU0sY0FBYyxLQUFLLFdBQVcsUUFBUTtBQUM1QyxNQUFJLFlBQXFDLENBQUM7QUFDMUMsTUFBSTtBQUNGLGdCQUFZLEtBQUssTUFBTSxNQUFNLFNBQVMsYUFBYSxPQUFPLENBQUM7QUFBQSxFQUM3RCxRQUFRO0FBQUEsRUFFUjtBQUNBLFlBQVUsbUJBQW1CLElBQUk7QUFDakMsUUFBTSxNQUFNLFdBQVcsRUFBRSxXQUFXLEtBQUssQ0FBQztBQUMxQyxRQUFNLFVBQVUsYUFBYSxLQUFLLFVBQVUsV0FBVyxNQUFNLGVBQWUsQ0FBQztBQUM3RSxNQUFJLHNCQUFzQixLQUFLLGtDQUFrQyxRQUFRLDZCQUE2QjtBQUN4RztBQU9BLFNBQVMsa0JBQTBCO0FBQ2pDLE1BQUksTUFBTSxRQUFRLElBQUk7QUFHdEIsU0FBTyxNQUFNO0FBQ1gsUUFBSSxXQUFXLEtBQUssS0FBSyxjQUFjLENBQUMsR0FBRztBQUN6QyxhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sU0FBUyxLQUFLLEtBQUssSUFBSTtBQUM3QixRQUFJLFdBQVcsS0FBSztBQUNsQixZQUFNLElBQUksTUFBTSxzREFBc0Q7QUFBQSxJQUN4RTtBQUNBLFVBQU07QUFBQSxFQUNSO0FBQ0Y7QUFhQSxTQUFTLGFBQWEsa0JBQTRFO0FBQ2hHLFNBQU8sa0JBQWtCLFNBQVMsNEJBQTRCLHFCQUFxQjtBQUNyRjtBQXNCQSxTQUFTLGdDQUFzQztBQUM3QyxNQUFJLDRCQUE0QjtBQUM5QjtBQUFBLEVBQ0Y7QUFDQSwrQkFBNkI7QUFFN0IsVUFBUSxHQUFHLGNBQWMsTUFBTTtBQUM3QixRQUFJLGFBQWEsU0FBUyxHQUFHO0FBQzNCO0FBQUEsSUFDRjtBQUVBLFFBQUksK0NBQStDLE9BQU8sYUFBYSxJQUFJLENBQUMseUNBQXlDO0FBRXJILGVBQVcsVUFBVSxDQUFDLEdBQUcsWUFBWSxHQUFHO0FBQ3RDLG1CQUFhLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBbUI7QUFDN0MsWUFBSSx5QkFBeUIsT0FBTyxjQUFjLHdDQUF3QyxjQUFjLEtBQUssQ0FBQyxFQUFFO0FBQUEsTUFDbEgsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGLENBQUM7QUFFRCxVQUFRLEdBQUcsc0JBQXNCLE1BQU07QUFDckMsUUFBSSxhQUFhLFNBQVMsR0FBRztBQUMzQjtBQUFBLElBQ0Y7QUFFQSxRQUFJLHFFQUFxRSxPQUFPLGFBQWEsSUFBSSxDQUFDLHFCQUFxQjtBQUN2SCxlQUFXLFVBQVUsQ0FBQyxHQUFHLFlBQVksR0FBRztBQUN0QyxtQkFBYSxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQW1CO0FBQzdDLFlBQUkseUJBQXlCLE9BQU8sY0FBYywwQ0FBMEMsY0FBYyxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQ3BILENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRixDQUFDO0FBRUQsVUFBUSxHQUFHLFFBQVEsTUFBTTtBQUN2QixRQUFJLGFBQWEsU0FBUyxHQUFHO0FBQzNCO0FBQUEsSUFDRjtBQUVBLFFBQUksd0NBQXdDLE9BQU8sYUFBYSxJQUFJLENBQUMscUJBQXFCO0FBQzFGLGVBQVcsVUFBVSxDQUFDLEdBQUcsWUFBWSxHQUFHO0FBQ3RDLFVBQUk7QUFDRixlQUFPLFVBQVUsY0FBYztBQUFBLE1BQ2pDLFNBQVMsT0FBZ0I7QUFDdkIsWUFBSSx5QkFBeUIsT0FBTyxjQUFjLCtDQUErQyxjQUFjLEtBQUssQ0FBQyxFQUFFO0FBQUEsTUFDekg7QUFDQSxVQUFJO0FBQ0YsZUFBTyxPQUFPLFVBQVUsTUFBTSxFQUFFLE9BQU8sTUFBTSxXQUFXLEtBQUssQ0FBQztBQUFBLE1BQ2hFLFNBQVMsT0FBZ0I7QUFDdkIsWUFBSSx5QkFBeUIsT0FBTyxjQUFjLDJDQUEyQyxjQUFjLEtBQUssQ0FBQyxFQUFFO0FBQUEsTUFDckg7QUFDQSx1QkFBaUIsTUFBTTtBQUFBLElBQ3pCO0FBQ0EsaUJBQWEsTUFBTTtBQUFBLEVBQ3JCLENBQUM7QUFDSDtBQU9BLFNBQVMsaUJBQWlCLFFBQStCO0FBQ3ZELFFBQU0sT0FBTyxXQUFXLElBQUksTUFBTTtBQUNsQyxNQUFJLE1BQU07QUFDUixTQUFLLFFBQVE7QUFDYixlQUFXLE9BQU8sTUFBTTtBQUFBLEVBQzFCO0FBQ0Y7QUFXQSxlQUFlLGdCQUFnQixhQUFzQztBQUNuRSxRQUFNLFVBQVUsS0FBSyxhQUFhLFFBQVE7QUFDMUMsUUFBTSxZQUFZLEtBQUssYUFBYSxVQUFVO0FBQzlDLFFBQU0sWUFBWSxLQUFLLFNBQVMsT0FBTztBQUN2QyxRQUFNLGNBQWMsS0FBSyxXQUFXLE9BQU87QUFDM0MsUUFBTSxVQUFVLFdBQVcsU0FBUyxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUk7QUFDaEUsUUFBTSxZQUFZLFdBQVcsV0FBVyxJQUFJLE1BQU0sS0FBSyxXQUFXLElBQUk7QUFFdEUsTUFBSSxXQUFXLFdBQVc7QUFDeEIsV0FBTyxRQUFRLFFBQVEsVUFBVSxRQUFRLFVBQVU7QUFBQSxFQUNyRDtBQUVBLE1BQUksU0FBUztBQUNYLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxXQUFXO0FBQ2IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLElBQUksTUFBTSw2REFBNkQ7QUFDL0U7QUFPQSxlQUFlLGNBQWMsUUFBd0M7QUFDbkUsTUFBSTtBQUNGLFVBQU0sT0FBTyxVQUFVLFFBQVEsT0FBTyxTQUFTO0FBQUEsRUFDakQsU0FBUyxPQUFnQjtBQUN2QixRQUFJLHlCQUF5QixPQUFPLGNBQWMsc0NBQXNDLGNBQWMsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUNoSDtBQUVBLE1BQUk7QUFDRixVQUFNLE9BQU8sVUFBVSxVQUFVO0FBQUEsRUFDbkMsU0FBUyxPQUFnQjtBQUN2QixRQUFJLHlCQUF5QixPQUFPLGNBQWMsMENBQTBDLGNBQWMsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUNwSDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
package/dist/lib/esm/library.mjs
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
Binary file
|