obsidian-integration-testing 3.0.1 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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" : "3.0.0";
24
+ const LIBRARY_VERSION = false ? "dev" : "3.0.2";
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  LIBRARY_VERSION
@@ -31,7 +31,7 @@ const NO_OUTPUT = "(no output)";
31
31
  const APP_STATE_FOREGROUND = 4;
32
32
  const WEBVIEW_CONTEXT_PREFIX = "WEBVIEW_md.obsidian";
33
33
  const WEBVIEW_POLL_INTERVAL_IN_MILLISECONDS = 500;
34
- const WEBVIEW_POLL_TIMEOUT_IN_MILLISECONDS = 3e4;
34
+ const DEFAULT_WEBVIEW_POLL_TIMEOUT_IN_MILLISECONDS = 6e4;
35
35
  const LAYOUT_READY_POLL_INTERVAL_IN_MILLISECONDS = 500;
36
36
  const LAYOUT_READY_POLL_TIMEOUT_IN_MILLISECONDS = 3e4;
37
37
  const APP_RESTART_DELAY_IN_MILLISECONDS = 2e3;
@@ -50,6 +50,7 @@ class AppiumTransport {
50
50
  deviceId;
51
51
  platform;
52
52
  vaultBasePath;
53
+ webviewTimeoutInMilliseconds;
53
54
  /**
54
55
  * Creates a new Appium transport.
55
56
  *
@@ -61,6 +62,7 @@ class AppiumTransport {
61
62
  this.platform = config.platform;
62
63
  this.appId = config.appId ?? DEFAULT_APP_ID;
63
64
  this.vaultBasePath = config.vaultBasePath ?? DEFAULT_VAULT_BASE_PATH[this.platform] ?? "/sdcard/Documents/";
65
+ this.webviewTimeoutInMilliseconds = config.webviewTimeoutInMilliseconds ?? DEFAULT_WEBVIEW_POLL_TIMEOUT_IN_MILLISECONDS;
64
66
  }
65
67
  /**
66
68
  * Ends the Appium session.
@@ -207,8 +209,8 @@ class AppiumTransport {
207
209
  * to Chrome or other WebViews on the device.
208
210
  */
209
211
  async ensureWebViewContext() {
210
- const deadline = Date.now() + WEBVIEW_POLL_TIMEOUT_IN_MILLISECONDS;
211
- (0, import_log.log)(`[appium-transport] Waiting for ${WEBVIEW_CONTEXT_PREFIX} context (timeout=${String(WEBVIEW_POLL_TIMEOUT_IN_MILLISECONDS)}ms)...`);
212
+ const deadline = Date.now() + this.webviewTimeoutInMilliseconds;
213
+ (0, import_log.log)(`[appium-transport] Waiting for ${WEBVIEW_CONTEXT_PREFIX} context (timeout=${String(this.webviewTimeoutInMilliseconds)}ms)...`);
212
214
  while (Date.now() < deadline) {
213
215
  const contexts = await this.browser.getContexts();
214
216
  const obsidianContext = contexts.find((ctx) => typeof ctx === "string" && ctx.startsWith(WEBVIEW_CONTEXT_PREFIX));
@@ -218,13 +220,18 @@ class AppiumTransport {
218
220
  await this.browser.switchContext(obsidianContext);
219
221
  return;
220
222
  } catch (error) {
221
- (0, import_log.log)(`[appium-transport] switchContext failed: ${String(error)}. Retrying...`);
223
+ (0, import_log.log)(`[appium-transport] switchContext failed: ${String(error)}. Resetting to NATIVE_APP before retrying...`);
224
+ try {
225
+ await this.browser.switchContext("NATIVE_APP");
226
+ } catch (resetError) {
227
+ (0, import_log.log)(`[appium-transport] NATIVE_APP reset also failed: ${String(resetError)}`);
228
+ }
222
229
  }
223
230
  }
224
231
  (0, import_log.log)(`[appium-transport] WebView not ready, available contexts: ${JSON.stringify(contexts)}. Retrying...`);
225
232
  await delay(WEBVIEW_POLL_INTERVAL_IN_MILLISECONDS);
226
233
  }
227
- throw new Error(`No ${WEBVIEW_CONTEXT_PREFIX} context found within ${String(WEBVIEW_POLL_TIMEOUT_IN_MILLISECONDS)}ms. Is the Obsidian app fully loaded?`);
234
+ throw new Error(`No ${WEBVIEW_CONTEXT_PREFIX} context found within ${String(this.webviewTimeoutInMilliseconds)}ms. Is the Obsidian app fully loaded?`);
228
235
  }
229
236
  /**
230
237
  * Converts a host-side vault path to the device-side path.
@@ -272,4 +279,4 @@ function extractVaultName(vaultPath) {
272
279
  0 && (module.exports = {
273
280
  AppiumTransport
274
281
  });
275
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1hcHBpdW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcHBpdW0gdHJhbnNwb3J0IFx1MjAxNCBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSB2aWEgV2ViVmlld1xuICogSmF2YVNjcmlwdCBpbmplY3Rpb24uIE1hbmFnZXMgdmF1bHQgbGlmZWN5Y2xlIHZpYSBsb2NhbFN0b3JhZ2UgYW5kIGZpbGUgcHVzaC5cbiAqXG4gKiBDb25maWd1cmVkIHZpYSBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCBpbiB2aXRlc3QgY29uZmlnOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHZpdGVzdC5jb25maWcudHNcbiAqIGVudmlyb25tZW50T3B0aW9uczoge1xuICogICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICogICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScsXG4gKiAgICAgYXBwaXVtVXJsOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJyxcbiAqICAgICBkZXZpY2VJZDogJ2VtdWxhdG9yLTU1NTQnLFxuICogICB9LFxuICogfVxuICogYGBgXG4gKlxuICogRm9yIEJyb3dzZXJTdGFjaywgc2V0IGBhcHBpdW1VcmxgIHRvIHRoZSBCcm93c2VyU3RhY2sgaHViIFVSTFxuICogXHUyMDE0IHRoZSB0cmFuc3BvcnQgaXRzZWxmIGlzIGh1Yi1hZ25vc3RpYy5cbiAqXG4gKiAjIyBIb3cgdmF1bHQgcmVnaXN0cmF0aW9uIHdvcmtzIG9uIG1vYmlsZVxuICpcbiAqIE9ic2lkaWFuIE1vYmlsZSBzdG9yZXMgaXRzIHZhdWx0IHJlZ2lzdHJ5IGluIHRoZSBXZWJWaWV3J3MgYGxvY2FsU3RvcmFnZWA6XG4gKlxuICogLSBgbW9iaWxlLWV4dGVybmFsLXZhdWx0c2AgXHUyMDE0IEpTT04gYXJyYXkgb2YgcmVnaXN0ZXJlZCB2YXVsdCBwYXRoc1xuICogLSBgbW9iaWxlLXNlbGVjdGVkLXZhdWx0YCBcdTIwMTQgdGhlIGN1cnJlbnRseSBhY3RpdmUgdmF1bHQgcGF0aFxuICogLSBgZW5hYmxlLXBsdWdpbi08dmF1bHRQYXRoPmAgXHUyMDE0IGBcInRydWVcImAgdG8gZW5hYmxlIHRoZSBwbHVnaW4gc3lzdGVtIGZvciB0aGUgdmF1bHRcbiAqXG4gKiBUbyByZWdpc3RlciBhIHZhdWx0IHByb2dyYW1tYXRpY2FsbHkgKHdpdGhvdXQgVUkgaW50ZXJhY3Rpb24pOlxuICpcbiAqIDEuIFB1c2ggdmF1bHQgZmlsZXMgdG8gdGhlIGRldmljZSAoZS5nLiBgL3NkY2FyZC9Eb2N1bWVudHMvPE5hbWU+Ly5vYnNpZGlhbi9hcHAuanNvbmApXG4gKiAyLiBTd2l0Y2ggdG8gYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHRcbiAqIDMuIFNldCB0aGUgbG9jYWxTdG9yYWdlIGVudHJpZXNcbiAqIDQuIENhbGwgYGxvY2F0aW9uLnJlbG9hZCgpYCBcdTIwMTQgT2JzaWRpYW4gcmUtcmVhZHMgbG9jYWxTdG9yYWdlIGFuZCBvcGVucyB0aGUgdmF1bHRcbiAqXG4gKiBUaGlzIGF2b2lkcyB0aGUgb25ib2FyZGluZyBmbG93IGVudGlyZWx5LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQnJvd3NlciB9IGZyb20gJ3dlYmRyaXZlcmlvJztcblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IHJtIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBBcHBpdW0gdHJhbnNwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGl1bVRyYW5zcG9ydENvbmZpZyB7XG4gIC8qKlxuICAgKiBBcHAgcGFja2FnZSAoQW5kcm9pZCkgb3IgYnVuZGxlIElEIChpT1MpLlxuICAgKiBEZWZhdWx0cyB0byBgJ21kLm9ic2lkaWFuJ2AuXG4gICAqL1xuICBhcHBJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBicm93c2VyL2RyaXZlciBpbnN0YW5jZS5cbiAgICogQ3JlYXRlZCBieSB0aGUgY29uc3VtZXIgdmlhIGUuZy4gV2ViRHJpdmVySU8ncyBgcmVtb3RlKClgLlxuICAgKi9cbiAgYnJvd3NlcjogQnJvd3NlcjtcblxuICAvKipcbiAgICogVGhlIGRldmljZSBVRElEIChlLmcuIGAnZW11bGF0b3ItNTU1NCdgKS5cbiAgICogVXNlZCBmb3IgYGFkYmAgY29tbWFuZHMgd2hlbiBwdXNoaW5nIGZpbGVzIHRvIHRoZSBkZXZpY2UuXG4gICAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXJnZXQgcGxhdGZvcm0uIERldGVybWluZXMgV2ViVmlldyBjb250ZXh0IG5hbWluZyBhbmQgZGV2aWNlIGZpbGUgcGF0aHMuXG4gICAqL1xuICBwbGF0Zm9ybTogJ2FuZHJvaWQnIHwgJ2lvcyc7XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBvbiB0aGUgZGV2aWNlIHdoZXJlIE9ic2lkaWFuIHN0b3JlcyB2YXVsdHMuXG4gICAqXG4gICAqIERlZmF1bHRzOlxuICAgKiAtIEFuZHJvaWQ6IGAvc2RjYXJkL0RvY3VtZW50cy9gXG4gICAqIC0gaU9TOiBgQG1kLm9ic2lkaWFuOmRvY3VtZW50cy9gXG4gICAqL1xuICB2YXVsdEJhc2VQYXRoPzogc3RyaW5nO1xufVxuXG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuY29uc3QgQVBQX1NUQVRFX0ZPUkVHUk9VTkQgPSA0O1xuY29uc3QgV0VCVklFV19DT05URVhUX1BSRUZJWCA9ICdXRUJWSUVXX21kLm9ic2lkaWFuJztcbmNvbnN0IFdFQlZJRVdfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBXRUJWSUVXX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IExBWU9VVF9SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IExBWU9VVF9SRUFEWV9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwMDA7XG5jb25zdCBBUFBfUkVTVEFSVF9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgREVGQVVMVF9BUFBfSUQgPSAnbWQub2JzaWRpYW4nO1xuXG5jb25zdCBERUZBVUxUX1ZBVUxUX0JBU0VfUEFUSDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgYW5kcm9pZDogJy9zZGNhcmQvRG9jdW1lbnRzLycsXG4gIGlvczogJ0BtZC5vYnNpZGlhbjpkb2N1bWVudHMvJ1xufTtcblxuaW50ZXJmYWNlIExvYWRpbmdBcHAge1xuICB3b3Jrc3BhY2U/OiBMb2FkaW5nV29ya3NwYWNlO1xufVxuXG5pbnRlcmZhY2UgTG9hZGluZ1dvcmtzcGFjZSB7XG4gIGxheW91dFJlYWR5PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBPYnNpZGlhbiBNb2JpbGUgdmlhIEFwcGl1bSBXZWJWaWV3IEpTIGluamVjdGlvbi5cbiAqXG4gKiBFdmFsdWF0ZXMgZXhwcmVzc2lvbnMgYnkgc3dpdGNoaW5nIHRvIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dCBhbmRcbiAqIGNhbGxpbmcgYGV4ZWN1dGUoKWAuIE1hbmFnZXMgdmF1bHRzIGJ5IHdyaXRpbmcgdG8gdGhlIFdlYlZpZXcncyBgbG9jYWxTdG9yYWdlYFxuICogKHdoaWNoIE9ic2lkaWFuIHVzZXMgYXMgaXRzIHZhdWx0IHJlZ2lzdHJ5IG9uIG1vYmlsZSkgYW5kIHB1c2hpbmcgZmlsZXMgdG8gdGhlIGRldmljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcGl1bVRyYW5zcG9ydCBpbXBsZW1lbnRzIE9ic2lkaWFuVHJhbnNwb3J0IHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIGZvciBhIG1vYmlsZSBwbGF0Zm9ybS4gQWx3YXlzIGB0cnVlYCBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSB0cnVlO1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnJvd3NlcjogQnJvd3NlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtOiAnYW5kcm9pZCcgfCAnaW9zJztcbiAgcHJpdmF0ZSByZWFkb25seSB2YXVsdEJhc2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQXBwaXVtIHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIEFwcGl1bSB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc6IEFwcGl1bVRyYW5zcG9ydENvbmZpZykge1xuICAgIHRoaXMuYnJvd3NlciA9IGNvbmZpZy5icm93c2VyO1xuICAgIHRoaXMuZGV2aWNlSWQgPSBjb25maWcuZGV2aWNlSWQ7XG4gICAgdGhpcy5wbGF0Zm9ybSA9IGNvbmZpZy5wbGF0Zm9ybTtcbiAgICB0aGlzLmFwcElkID0gY29uZmlnLmFwcElkID8/IERFRkFVTFRfQVBQX0lEO1xuICAgIHRoaXMudmF1bHRCYXNlUGF0aCA9IGNvbmZpZy52YXVsdEJhc2VQYXRoID8/IERFRkFVTFRfVkFVTFRfQkFTRV9QQVRIW3RoaXMucGxhdGZvcm1dID8/ICcvc2RjYXJkL0RvY3VtZW50cy8nO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZHMgdGhlIEFwcGl1bSBzZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5icm93c2VyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSdzIFdlYlZpZXcuXG4gICAqXG4gICAqIFN3aXRjaGVzIHRvIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dCwgZXhlY3V0ZXMgdGhlIGV4cHJlc3Npb24sXG4gICAqIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBfb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucyAoY3dkIGlzIG5vdCB1c2VkIG9uIG1vYmlsZSBcdTIwMTQgdmF1bHQgdGFyZ2V0aW5nIGlzIHZpYSBsb2NhbFN0b3JhZ2UpLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgX29wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZTxudWxsIHwgc3RyaW5nIHwgdW5kZWZpbmVkLCBbXT4oXG4gICAgICBgcmV0dXJuICgke2V4cHJlc3Npb259KWBcbiAgICApO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkIHx8IHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE5PX09VVFBVVDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIE9ic2lkaWFuIGFwcCBpcyBydW5uaW5nIGFuZCB0aGUgV2ViVmlldyBpcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBfdmF1bHRQYXRoIC0gTm90IHVzZWQgb24gbW9iaWxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKF92YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFJ1bm5pbmcgcHJlZmxpZ2h0IGNoZWNrLi4uJyk7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmJyb3dzZXIucXVlcnlBcHBTdGF0ZSh0aGlzLmFwcElkKTtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBBcHAgc3RhdGU6ICR7U3RyaW5nKHN0YXRlKX0gKG5lZWQgJHtTdHJpbmcoQVBQX1NUQVRFX0ZPUkVHUk9VTkQpfT1mb3JlZ3JvdW5kKWApO1xuICAgIGlmIChzdGF0ZSAhPT0gQVBQX1NUQVRFX0ZPUkVHUk9VTkQpIHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEFjdGl2YXRpbmcgYXBwICR7dGhpcy5hcHBJZH0uLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5hY3RpdmF0ZUFwcCh0aGlzLmFwcElkKTtcbiAgICAgIGF3YWl0IGRlbGF5KEFQUF9SRVNUQVJUX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFByZWZsaWdodCBjaGVjayBwYXNzZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaGVzIHZhdWx0IGZpbGVzIHRvIHRoZSBkZXZpY2UgdmlhIGNvbXByZXNzZWQgYGFkYiBwdXNoYC5cbiAgICpcbiAgICogQ3JlYXRlcyBhIHRhci5neiBhcmNoaXZlIG9mIHRoZSBsb2NhbCB2YXVsdCBkaXJlY3RvcnksIHB1c2hlcyBpdCB0byB0aGVcbiAgICogZGV2aWNlIGFzIGEgc2luZ2xlIGZpbGUsIGFuZCBleHRyYWN0cyBpdCBpbi1wbGFjZS4gVGhpcyBhdm9pZHMgdGhlXG4gICAqIHdlYmRyaXZlciBgUmFuZ2VFcnJvcmAgb24gbGFyZ2UgYmFzZTY0IHBheWxvYWRzIGFuZCBpcyBzaWduaWZpY2FudGx5XG4gICAqIGZhc3RlciB0aGFuIHBlci1maWxlIGBicm93c2VyLnB1c2hGaWxlKClgIGNhbGxzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggKHVzZWQgYXMgdGhlIHZhdWx0IGRpcmVjdG9yeSBuYW1lIG9uIGRldmljZSkuXG4gICAqIEBwYXJhbSBfZmlsZXMgLSBNYXAgb2YgcmVsYXRpdmUgZmlsZSBwYXRocyB0byBjb250ZW50IGJ1ZmZlcnMgKHVudXNlZCBcdTIwMTQgYWRiIHB1c2hlcyB0aGUgZGlyZWN0b3J5IGRpcmVjdGx5KS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwdXNoRmlsZXModmF1bHRQYXRoOiBzdHJpbmcsIF9maWxlczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXZpY2VWYXVsdFBhdGggPSB0aGlzLmdldERldmljZVZhdWx0UGF0aCh2YXVsdFBhdGgpO1xuICAgIGNvbnN0IGFyY2hpdmVOYW1lID0gYHZhdWx0LSR7cmFuZG9tVVVJRCgpfS50YXIuZ3pgO1xuICAgIGNvbnN0IGxvY2FsQXJjaGl2ZSA9IGpvaW4odG1wZGlyKCksIGFyY2hpdmVOYW1lKTtcbiAgICBjb25zdCByZW1vdGVBcmNoaXZlID0gYC9kYXRhL2xvY2FsL3RtcC8ke2FyY2hpdmVOYW1lfWA7XG5cbiAgICB0cnkge1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gQ3JlYXRpbmcgYXJjaGl2ZTogJHtsb2NhbEFyY2hpdmV9YCk7XG4gICAgICBhd2FpdCBleGVjKFsndGFyJywgJ2N6ZicsIGFyY2hpdmVOYW1lLCAnLUMnLCB2YXVsdFBhdGgsICcuJ10sIHsgY3dkOiB0bXBkaXIoKSwgaXNRdWlldDogdHJ1ZSB9KTtcblxuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUHVzaGluZyBhcmNoaXZlIHRvIGRldmljZSAke3RoaXMuZGV2aWNlSWR9Li4uYCk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3B1c2gnLCBsb2NhbEFyY2hpdmUsIHJlbW90ZUFyY2hpdmVdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEV4dHJhY3RpbmcgYXJjaGl2ZSBvbiBkZXZpY2UgYXQgJHtkZXZpY2VWYXVsdFBhdGh9Li4uYCk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ21rZGlyJywgJy1wJywgZGV2aWNlVmF1bHRQYXRoXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICd0YXInLCAneHpmJywgcmVtb3RlQXJjaGl2ZSwgJy1DJywgZGV2aWNlVmF1bHRQYXRoXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBGbHVzaGluZyBmaWxlc3lzdGVtIGJ1ZmZlcnMuLi4nKTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnc3luYyddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIENsZWFuaW5nIHVwIHJlbW90ZSBhcmNoaXZlLi4uJyk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3JtJywgcmVtb3RlQXJjaGl2ZV0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcm0obG9jYWxBcmNoaXZlLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YXVsdCBvbiBtb2JpbGUgYnkgcHVzaGluZyBmaWxlcyBhbmQgY29uZmlndXJpbmcgbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBUaGUgcmVnaXN0cmF0aW9uIGZsb3c6XG4gICAqIDEuIFB1c2ggYSBtaW5pbWFsIGAub2JzaWRpYW4vYXBwLmpzb25gIHRvIHRoZSBkZXZpY2Ugc28gT2JzaWRpYW4gcmVjb2duaXplcyB0aGUgdmF1bHRcbiAgICogMi4gU3dpdGNoIHRvIHRoZSBXZWJWaWV3IGNvbnRleHRcbiAgICogMy4gQWRkIHRoZSB2YXVsdCB0byBsb2NhbFN0b3JhZ2UgKGBtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzYCwgYG1vYmlsZS1zZWxlY3RlZC12YXVsdGAsXG4gICAqICAgIGBlbmFibGUtcGx1Z2luLTxwYXRoPmApXG4gICAqIDQuIFRyaWdnZXIgYGxvY2F0aW9uLnJlbG9hZCgpYCBzbyBPYnNpZGlhbiByZS1yZWFkcyBsb2NhbFN0b3JhZ2UgYW5kIG9wZW5zIHRoZSB2YXVsdFxuICAgKiA1LiBXYWl0IGZvciBgYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeWBcbiAgICpcbiAgICogRXhpc3RpbmcgdmF1bHQgcmVnaXN0cmF0aW9ucyBpbiBsb2NhbFN0b3JhZ2UgYXJlIHByZXNlcnZlZCAoYXBwZW5kLCBub3Qgb3ZlcndyaXRlKS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBSZWdpc3RlcmluZyB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcblxuICAgIC8vIFB1c2ggYSBtaW5pbWFsIC5vYnNpZGlhbiBkaXJlY3Rvcnkgc28gT2JzaWRpYW4gcmVjb2duaXplcyBpdCBhcyBhIHZhdWx0LlxuICAgIGNvbnN0IG9ic2lkaWFuTWFya2VyID0gYCR7ZGV2aWNlVmF1bHRQYXRofS8ub2JzaWRpYW4vYXBwLmpzb25gO1xuICAgIGNvbnN0IGJhc2U2NENvbnRlbnQgPSBCdWZmZXIuZnJvbSgne30nLCAndXRmLTgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgYXdhaXQgdGhpcy5icm93c2VyLnB1c2hGaWxlKG9ic2lkaWFuTWFya2VyLCBiYXNlNjRDb250ZW50KTtcblxuICAgIC8vIFN3aXRjaCB0byBXZWJWaWV3IGFuZCBjb25maWd1cmUgbG9jYWxTdG9yYWdlLlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViVmlld0NvbnRleHQoKTtcblxuICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLWV4dGVybmFsLXZhdWx0cycpID8/ICdbXScpIGFzIHN0cmluZ1tdO1xuICAgICAgaWYgKCFleGlzdGluZy5pbmNsdWRlcyhwYXRoKSkge1xuICAgICAgICBleGlzdGluZy5wdXNoKHBhdGgpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLWV4dGVybmFsLXZhdWx0cycsIEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nKSk7XG4gICAgICB9XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JywgcGF0aCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgZW5hYmxlLXBsdWdpbi0ke3BhdGh9YCwgJ3RydWUnKTtcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH0sIGRldmljZVZhdWx0UGF0aCk7XG5cbiAgICAvLyBXYWl0IGZvciByZWxvYWQgKyB2YXVsdCBpbml0aWFsaXphdGlvbi5cbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMYXlvdXRSZWFkeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgdmF1bHQgb24gbW9iaWxlIGJ5IHJlbW92aW5nIGl0IGZyb20gbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBQcmVzZXJ2ZXMgb3RoZXIgdmF1bHQgcmVnaXN0cmF0aW9ucy4gSWYgdGhlIHVucmVnaXN0ZXJlZCB2YXVsdCB3YXMgc2VsZWN0ZWQsXG4gICAqIHN3aXRjaGVzIHRvIHRoZSBmaXJzdCByZW1haW5pbmcgdmF1bHQgKG9yIGNsZWFycyB0aGUgc2VsZWN0aW9uKS5cbiAgICpcbiAgICogTm90ZTogVmF1bHQgZmlsZXMgb24gdGhlIGRldmljZSBhcmUgbm90IGRlbGV0ZWQuIFRoZSB0ZXN0IGhhcm5lc3Mgb3IgQ0lcbiAgICogZW52aXJvbm1lbnQgc2hvdWxkIGhhbmRsZSBkZXZpY2UgY2xlYW51cC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRldmljZVZhdWx0UGF0aCA9IHRoaXMuZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aCk7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG5cbiAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZSgocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21vYmlsZS1leHRlcm5hbC12YXVsdHMnKSA/PyAnW10nKSBhcyBzdHJpbmdbXTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gZXhpc3RpbmcuZmlsdGVyKCh2KSA9PiB2ICE9PSBwYXRoKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJywgSlNPTi5zdHJpbmdpZnkoZmlsdGVyZWQpKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGBlbmFibGUtcGx1Z2luLSR7cGF0aH1gKTtcbiAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JykgPT09IHBhdGgpIHtcbiAgICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JywgZmlsdGVyZWRbMF0gPz8gJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdtb2JpbGUtc2VsZWN0ZWQtdmF1bHQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIGRldmljZVZhdWx0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoZXMgdGhlIGRyaXZlciB0byB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQuXG4gICAqXG4gICAqIFBvbGxzIHVudGlsIHRoZSBjb250ZXh0IGJlY29tZXMgYXZhaWxhYmxlICh0aGUgYXBwIG1heSBzdGlsbCBiZSBsb2FkaW5nKS5cbiAgICogVXNlcyB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQgc3BlY2lmaWNhbGx5IHRvIGF2b2lkIGNvbm5lY3RpbmdcbiAgICogdG8gQ2hyb21lIG9yIG90aGVyIFdlYlZpZXdzIG9uIHRoZSBkZXZpY2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVdlYlZpZXdDb250ZXh0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFdFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBXYWl0aW5nIGZvciAke1dFQlZJRVdfQ09OVEVYVF9QUkVGSVh9IGNvbnRleHQgKHRpbWVvdXQ9JHtTdHJpbmcoV0VCVklFV19QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IGNvbnRleHRzID0gYXdhaXQgdGhpcy5icm93c2VyLmdldENvbnRleHRzKCk7XG4gICAgICBjb25zdCBvYnNpZGlhbkNvbnRleHQgPSBjb250ZXh0cy5maW5kKChjdHgpOiBjdHggaXMgc3RyaW5nID0+IHR5cGVvZiBjdHggPT09ICdzdHJpbmcnICYmIGN0eC5zdGFydHNXaXRoKFdFQlZJRVdfQ09OVEVYVF9QUkVGSVgpKTtcblxuICAgICAgaWYgKG9ic2lkaWFuQ29udGV4dCkge1xuICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBGb3VuZCBXZWJWaWV3IGNvbnRleHQ6ICR7b2JzaWRpYW5Db250ZXh0fWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5zd2l0Y2hDb250ZXh0KG9ic2lkaWFuQ29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIHN3aXRjaENvbnRleHQgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9LiBSZXRyeWluZy4uLmApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdlYlZpZXcgbm90IHJlYWR5LCBhdmFpbGFibGUgY29udGV4dHM6ICR7SlNPTi5zdHJpbmdpZnkoY29udGV4dHMpfS4gUmV0cnlpbmcuLi5gKTtcbiAgICAgIGF3YWl0IGRlbGF5KFdFQlZJRVdfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm8gJHtXRUJWSUVXX0NPTlRFWFRfUFJFRklYfSBjb250ZXh0IGZvdW5kIHdpdGhpbiAke1N0cmluZyhXRUJWSUVXX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBJcyB0aGUgT2JzaWRpYW4gYXBwIGZ1bGx5IGxvYWRlZD9gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGhvc3Qtc2lkZSB2YXVsdCBwYXRoIHRvIHRoZSBkZXZpY2Utc2lkZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gQWJzb2x1dGUgcGF0aCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKiBAcmV0dXJucyBUaGUgZGV2aWNlLXNpZGUgdmF1bHQgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy52YXVsdEJhc2VQYXRofSR7ZXh0cmFjdFZhdWx0TmFtZSh2YXVsdFBhdGgpfWA7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdW50aWwgYGFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHlgIGlzIGB0cnVlYCBpbiB0aGUgV2ViVmlldy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckxheW91dFJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIExBWU9VVF9SRUFEWV9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIGxheW91dCByZWFkeSAodGltZW91dD0ke1N0cmluZyhMQVlPVVRfUkVBRFlfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpc1JlYWR5ID0gYXdhaXQgdGhpcy5icm93c2VyLmV4ZWN1dGUoKCk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBXZSBuZWVkIGdsb2JhbCBgYXBwYCB2YXJpYWJsZS5cbiAgICAgICAgICBjb25zdCBhcHAgPSB3aW5kb3cuYXBwIGFzIExvYWRpbmdBcHAgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgcmV0dXJuICEhYXBwPy53b3Jrc3BhY2U/LmxheW91dFJlYWR5O1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzUmVhZHkpIHtcbiAgICAgICAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBMYXlvdXQgaXMgcmVhZHkuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQXBwIG5vdCByZWFkeSB5ZXQgKHBhZ2UgbWF5IGJlIHJlbG9hZGluZykuXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGRlbGF5KExBWU9VVF9SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBPYnNpZGlhbiBsYXlvdXQgZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKExBWU9VVF9SRUFEWV9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2ApO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHZhdWx0IGRpcmVjdG9yeSBuYW1lIGZyb20gYSBob3N0LXNpZGUgdmF1bHQgcGF0aC5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gQWJzb2x1dGUgcGF0aCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICogQHJldHVybnMgVGhlIGxhc3QgcGF0aCBzZWdtZW50ICh2YXVsdCBkaXJlY3RvcnkgbmFtZSkuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RWYXVsdE5hbWUodmF1bHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkID0gdmF1bHRQYXRoLnJlcGxhY2UoL1tcXFxcL10rJC8sICcnKTtcbiAgY29uc3QgbGFzdFNlcCA9IE1hdGgubWF4KG5vcm1hbGl6ZWQubGFzdEluZGV4T2YoJy8nKSwgbm9ybWFsaXplZC5sYXN0SW5kZXhPZignXFxcXCcpKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQuc2xpY2UobGFzdFNlcCArIDEpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7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
282
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1hcHBpdW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBcHBpdW0gdHJhbnNwb3J0IFx1MjAxNCBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSB2aWEgV2ViVmlld1xuICogSmF2YVNjcmlwdCBpbmplY3Rpb24uIE1hbmFnZXMgdmF1bHQgbGlmZWN5Y2xlIHZpYSBsb2NhbFN0b3JhZ2UgYW5kIGZpbGUgcHVzaC5cbiAqXG4gKiBDb25maWd1cmVkIHZpYSBgZW52aXJvbm1lbnRPcHRpb25zLm9ic2lkaWFuVHJhbnNwb3J0YCBpbiB2aXRlc3QgY29uZmlnOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIHZpdGVzdC5jb25maWcudHNcbiAqIGVudmlyb25tZW50T3B0aW9uczoge1xuICogICBvYnNpZGlhblRyYW5zcG9ydDoge1xuICogICAgIHR5cGU6ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScsXG4gKiAgICAgYXBwaXVtVXJsOiAnaHR0cDovL2xvY2FsaG9zdDo0NzIzJyxcbiAqICAgICBkZXZpY2VJZDogJ2VtdWxhdG9yLTU1NTQnLFxuICogICB9LFxuICogfVxuICogYGBgXG4gKlxuICogRm9yIEJyb3dzZXJTdGFjaywgc2V0IGBhcHBpdW1VcmxgIHRvIHRoZSBCcm93c2VyU3RhY2sgaHViIFVSTFxuICogXHUyMDE0IHRoZSB0cmFuc3BvcnQgaXRzZWxmIGlzIGh1Yi1hZ25vc3RpYy5cbiAqXG4gKiAjIyBIb3cgdmF1bHQgcmVnaXN0cmF0aW9uIHdvcmtzIG9uIG1vYmlsZVxuICpcbiAqIE9ic2lkaWFuIE1vYmlsZSBzdG9yZXMgaXRzIHZhdWx0IHJlZ2lzdHJ5IGluIHRoZSBXZWJWaWV3J3MgYGxvY2FsU3RvcmFnZWA6XG4gKlxuICogLSBgbW9iaWxlLWV4dGVybmFsLXZhdWx0c2AgXHUyMDE0IEpTT04gYXJyYXkgb2YgcmVnaXN0ZXJlZCB2YXVsdCBwYXRoc1xuICogLSBgbW9iaWxlLXNlbGVjdGVkLXZhdWx0YCBcdTIwMTQgdGhlIGN1cnJlbnRseSBhY3RpdmUgdmF1bHQgcGF0aFxuICogLSBgZW5hYmxlLXBsdWdpbi08dmF1bHRQYXRoPmAgXHUyMDE0IGBcInRydWVcImAgdG8gZW5hYmxlIHRoZSBwbHVnaW4gc3lzdGVtIGZvciB0aGUgdmF1bHRcbiAqXG4gKiBUbyByZWdpc3RlciBhIHZhdWx0IHByb2dyYW1tYXRpY2FsbHkgKHdpdGhvdXQgVUkgaW50ZXJhY3Rpb24pOlxuICpcbiAqIDEuIFB1c2ggdmF1bHQgZmlsZXMgdG8gdGhlIGRldmljZSAoZS5nLiBgL3NkY2FyZC9Eb2N1bWVudHMvPE5hbWU+Ly5vYnNpZGlhbi9hcHAuanNvbmApXG4gKiAyLiBTd2l0Y2ggdG8gYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHRcbiAqIDMuIFNldCB0aGUgbG9jYWxTdG9yYWdlIGVudHJpZXNcbiAqIDQuIENhbGwgYGxvY2F0aW9uLnJlbG9hZCgpYCBcdTIwMTQgT2JzaWRpYW4gcmUtcmVhZHMgbG9jYWxTdG9yYWdlIGFuZCBvcGVucyB0aGUgdmF1bHRcbiAqXG4gKiBUaGlzIGF2b2lkcyB0aGUgb25ib2FyZGluZyBmbG93IGVudGlyZWx5LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQnJvd3NlciB9IGZyb20gJ3dlYmRyaXZlcmlvJztcblxuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IHJtIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBBcHBpdW0gdHJhbnNwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGl1bVRyYW5zcG9ydENvbmZpZyB7XG4gIC8qKlxuICAgKiBBcHAgcGFja2FnZSAoQW5kcm9pZCkgb3IgYnVuZGxlIElEIChpT1MpLlxuICAgKiBEZWZhdWx0cyB0byBgJ21kLm9ic2lkaWFuJ2AuXG4gICAqL1xuICBhcHBJZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFwcGl1bSBicm93c2VyL2RyaXZlciBpbnN0YW5jZS5cbiAgICogQ3JlYXRlZCBieSB0aGUgY29uc3VtZXIgdmlhIGUuZy4gV2ViRHJpdmVySU8ncyBgcmVtb3RlKClgLlxuICAgKi9cbiAgYnJvd3NlcjogQnJvd3NlcjtcblxuICAvKipcbiAgICogVGhlIGRldmljZSBVRElEIChlLmcuIGAnZW11bGF0b3ItNTU1NCdgKS5cbiAgICogVXNlZCBmb3IgYGFkYmAgY29tbWFuZHMgd2hlbiBwdXNoaW5nIGZpbGVzIHRvIHRoZSBkZXZpY2UuXG4gICAqL1xuICBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYXJnZXQgcGxhdGZvcm0uIERldGVybWluZXMgV2ViVmlldyBjb250ZXh0IG5hbWluZyBhbmQgZGV2aWNlIGZpbGUgcGF0aHMuXG4gICAqL1xuICBwbGF0Zm9ybTogJ2FuZHJvaWQnIHwgJ2lvcyc7XG5cbiAgLyoqXG4gICAqIEJhc2UgcGF0aCBvbiB0aGUgZGV2aWNlIHdoZXJlIE9ic2lkaWFuIHN0b3JlcyB2YXVsdHMuXG4gICAqXG4gICAqIERlZmF1bHRzOlxuICAgKiAtIEFuZHJvaWQ6IGAvc2RjYXJkL0RvY3VtZW50cy9gXG4gICAqIC0gaU9TOiBgQG1kLm9ic2lkaWFuOmRvY3VtZW50cy9gXG4gICAqL1xuICB2YXVsdEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3Igd2FpdGluZyBmb3IgdGhlIFdlYlZpZXcgY29udGV4dCB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjAwMDBgXG4gICAqL1xuICB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuY29uc3QgQVBQX1NUQVRFX0ZPUkVHUk9VTkQgPSA0O1xuY29uc3QgV0VCVklFV19DT05URVhUX1BSRUZJWCA9ICdXRUJWSUVXX21kLm9ic2lkaWFuJztcbmNvbnN0IFdFQlZJRVdfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBERUZBVUxUX1dFQlZJRVdfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMDAwO1xuY29uc3QgTEFZT1VUX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgTEFZT1VUX1JFQURZX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IEFQUF9SRVNUQVJUX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBERUZBVUxUX0FQUF9JRCA9ICdtZC5vYnNpZGlhbic7XG5cbmNvbnN0IERFRkFVTFRfVkFVTFRfQkFTRV9QQVRIOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBhbmRyb2lkOiAnL3NkY2FyZC9Eb2N1bWVudHMvJyxcbiAgaW9zOiAnQG1kLm9ic2lkaWFuOmRvY3VtZW50cy8nXG59O1xuXG5pbnRlcmZhY2UgTG9hZGluZ0FwcCB7XG4gIHdvcmtzcGFjZT86IExvYWRpbmdXb3Jrc3BhY2U7XG59XG5cbmludGVyZmFjZSBMb2FkaW5nV29ya3NwYWNlIHtcbiAgbGF5b3V0UmVhZHk/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIE9ic2lkaWFuIE1vYmlsZSB2aWEgQXBwaXVtIFdlYlZpZXcgSlMgaW5qZWN0aW9uLlxuICpcbiAqIEV2YWx1YXRlcyBleHByZXNzaW9ucyBieSBzd2l0Y2hpbmcgdG8gdGhlIGBXRUJWSUVXX21kLm9ic2lkaWFuYCBjb250ZXh0IGFuZFxuICogY2FsbGluZyBgZXhlY3V0ZSgpYC4gTWFuYWdlcyB2YXVsdHMgYnkgd3JpdGluZyB0byB0aGUgV2ViVmlldydzIGBsb2NhbFN0b3JhZ2VgXG4gKiAod2hpY2ggT2JzaWRpYW4gdXNlcyBhcyBpdHMgdmF1bHQgcmVnaXN0cnkgb24gbW9iaWxlKSBhbmQgcHVzaGluZyBmaWxlcyB0byB0aGUgZGV2aWNlLlxuICovXG5leHBvcnQgY2xhc3MgQXBwaXVtVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYHRydWVgIGZvciB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc01vYmlsZSA9IHRydWU7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBicm93c2VyOiBCcm93c2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRldmljZUlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm06ICdhbmRyb2lkJyB8ICdpb3MnO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhdWx0QmFzZVBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgQXBwaXVtIHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIGNvbmZpZyAtIEFwcGl1bSB0cmFuc3BvcnQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb25maWc6IEFwcGl1bVRyYW5zcG9ydENvbmZpZykge1xuICAgIHRoaXMuYnJvd3NlciA9IGNvbmZpZy5icm93c2VyO1xuICAgIHRoaXMuZGV2aWNlSWQgPSBjb25maWcuZGV2aWNlSWQ7XG4gICAgdGhpcy5wbGF0Zm9ybSA9IGNvbmZpZy5wbGF0Zm9ybTtcbiAgICB0aGlzLmFwcElkID0gY29uZmlnLmFwcElkID8/IERFRkFVTFRfQVBQX0lEO1xuICAgIHRoaXMudmF1bHRCYXNlUGF0aCA9IGNvbmZpZy52YXVsdEJhc2VQYXRoID8/IERFRkFVTFRfVkFVTFRfQkFTRV9QQVRIW3RoaXMucGxhdGZvcm1dID8/ICcvc2RjYXJkL0RvY3VtZW50cy8nO1xuICAgIHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IGNvbmZpZy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfV0VCVklFV19QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZHMgdGhlIEFwcGl1bSBzZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5icm93c2VyLmRlbGV0ZVNlc3Npb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gaW5zaWRlIE9ic2lkaWFuIE1vYmlsZSdzIFdlYlZpZXcuXG4gICAqXG4gICAqIFN3aXRjaGVzIHRvIHRoZSBgV0VCVklFV19tZC5vYnNpZGlhbmAgY29udGV4dCwgZXhlY3V0ZXMgdGhlIGV4cHJlc3Npb24sXG4gICAqIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBfb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucyAoY3dkIGlzIG5vdCB1c2VkIG9uIG1vYmlsZSBcdTIwMTQgdmF1bHQgdGFyZ2V0aW5nIGlzIHZpYSBsb2NhbFN0b3JhZ2UpLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgX29wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZTxudWxsIHwgc3RyaW5nIHwgdW5kZWZpbmVkLCBbXT4oXG4gICAgICBgcmV0dXJuICgke2V4cHJlc3Npb259KWBcbiAgICApO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkIHx8IHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIE5PX09VVFBVVDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIE9ic2lkaWFuIGFwcCBpcyBydW5uaW5nIGFuZCB0aGUgV2ViVmlldyBpcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBfdmF1bHRQYXRoIC0gTm90IHVzZWQgb24gbW9iaWxlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKF92YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFJ1bm5pbmcgcHJlZmxpZ2h0IGNoZWNrLi4uJyk7XG4gICAgY29uc3Qgc3RhdGUgPSBhd2FpdCB0aGlzLmJyb3dzZXIucXVlcnlBcHBTdGF0ZSh0aGlzLmFwcElkKTtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBBcHAgc3RhdGU6ICR7U3RyaW5nKHN0YXRlKX0gKG5lZWQgJHtTdHJpbmcoQVBQX1NUQVRFX0ZPUkVHUk9VTkQpfT1mb3JlZ3JvdW5kKWApO1xuICAgIGlmIChzdGF0ZSAhPT0gQVBQX1NUQVRFX0ZPUkVHUk9VTkQpIHtcbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEFjdGl2YXRpbmcgYXBwICR7dGhpcy5hcHBJZH0uLi5gKTtcbiAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5hY3RpdmF0ZUFwcCh0aGlzLmFwcElkKTtcbiAgICAgIGF3YWl0IGRlbGF5KEFQUF9SRVNUQVJUX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVXZWJWaWV3Q29udGV4dCgpO1xuICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIFByZWZsaWdodCBjaGVjayBwYXNzZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaGVzIHZhdWx0IGZpbGVzIHRvIHRoZSBkZXZpY2UgdmlhIGNvbXByZXNzZWQgYGFkYiBwdXNoYC5cbiAgICpcbiAgICogQ3JlYXRlcyBhIHRhci5neiBhcmNoaXZlIG9mIHRoZSBsb2NhbCB2YXVsdCBkaXJlY3RvcnksIHB1c2hlcyBpdCB0byB0aGVcbiAgICogZGV2aWNlIGFzIGEgc2luZ2xlIGZpbGUsIGFuZCBleHRyYWN0cyBpdCBpbi1wbGFjZS4gVGhpcyBhdm9pZHMgdGhlXG4gICAqIHdlYmRyaXZlciBgUmFuZ2VFcnJvcmAgb24gbGFyZ2UgYmFzZTY0IHBheWxvYWRzIGFuZCBpcyBzaWduaWZpY2FudGx5XG4gICAqIGZhc3RlciB0aGFuIHBlci1maWxlIGBicm93c2VyLnB1c2hGaWxlKClgIGNhbGxzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggKHVzZWQgYXMgdGhlIHZhdWx0IGRpcmVjdG9yeSBuYW1lIG9uIGRldmljZSkuXG4gICAqIEBwYXJhbSBfZmlsZXMgLSBNYXAgb2YgcmVsYXRpdmUgZmlsZSBwYXRocyB0byBjb250ZW50IGJ1ZmZlcnMgKHVudXNlZCBcdTIwMTQgYWRiIHB1c2hlcyB0aGUgZGlyZWN0b3J5IGRpcmVjdGx5KS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBwdXNoRmlsZXModmF1bHRQYXRoOiBzdHJpbmcsIF9maWxlczogUmVjb3JkPHN0cmluZywgVWludDhBcnJheT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZXZpY2VWYXVsdFBhdGggPSB0aGlzLmdldERldmljZVZhdWx0UGF0aCh2YXVsdFBhdGgpO1xuICAgIGNvbnN0IGFyY2hpdmVOYW1lID0gYHZhdWx0LSR7cmFuZG9tVVVJRCgpfS50YXIuZ3pgO1xuICAgIGNvbnN0IGxvY2FsQXJjaGl2ZSA9IGpvaW4odG1wZGlyKCksIGFyY2hpdmVOYW1lKTtcbiAgICBjb25zdCByZW1vdGVBcmNoaXZlID0gYC9kYXRhL2xvY2FsL3RtcC8ke2FyY2hpdmVOYW1lfWA7XG5cbiAgICB0cnkge1xuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gQ3JlYXRpbmcgYXJjaGl2ZTogJHtsb2NhbEFyY2hpdmV9YCk7XG4gICAgICBhd2FpdCBleGVjKFsndGFyJywgJ2N6ZicsIGFyY2hpdmVOYW1lLCAnLUMnLCB2YXVsdFBhdGgsICcuJ10sIHsgY3dkOiB0bXBkaXIoKSwgaXNRdWlldDogdHJ1ZSB9KTtcblxuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gUHVzaGluZyBhcmNoaXZlIHRvIGRldmljZSAke3RoaXMuZGV2aWNlSWR9Li4uYCk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3B1c2gnLCBsb2NhbEFyY2hpdmUsIHJlbW90ZUFyY2hpdmVdLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIEV4dHJhY3RpbmcgYXJjaGl2ZSBvbiBkZXZpY2UgYXQgJHtkZXZpY2VWYXVsdFBhdGh9Li4uYCk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ21rZGlyJywgJy1wJywgZGV2aWNlVmF1bHRQYXRoXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlYyhbJ2FkYicsICctcycsIHRoaXMuZGV2aWNlSWQsICdzaGVsbCcsICd0YXInLCAneHpmJywgcmVtb3RlQXJjaGl2ZSwgJy1DJywgZGV2aWNlVmF1bHRQYXRoXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuXG4gICAgICBsb2coJ1thcHBpdW0tdHJhbnNwb3J0XSBGbHVzaGluZyBmaWxlc3lzdGVtIGJ1ZmZlcnMuLi4nKTtcbiAgICAgIGF3YWl0IGV4ZWMoWydhZGInLCAnLXMnLCB0aGlzLmRldmljZUlkLCAnc2hlbGwnLCAnc3luYyddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIENsZWFuaW5nIHVwIHJlbW90ZSBhcmNoaXZlLi4uJyk7XG4gICAgICBhd2FpdCBleGVjKFsnYWRiJywgJy1zJywgdGhpcy5kZXZpY2VJZCwgJ3NoZWxsJywgJ3JtJywgcmVtb3RlQXJjaGl2ZV0sIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcm0obG9jYWxBcmNoaXZlLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YXVsdCBvbiBtb2JpbGUgYnkgcHVzaGluZyBmaWxlcyBhbmQgY29uZmlndXJpbmcgbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBUaGUgcmVnaXN0cmF0aW9uIGZsb3c6XG4gICAqIDEuIFB1c2ggYSBtaW5pbWFsIGAub2JzaWRpYW4vYXBwLmpzb25gIHRvIHRoZSBkZXZpY2Ugc28gT2JzaWRpYW4gcmVjb2duaXplcyB0aGUgdmF1bHRcbiAgICogMi4gU3dpdGNoIHRvIHRoZSBXZWJWaWV3IGNvbnRleHRcbiAgICogMy4gQWRkIHRoZSB2YXVsdCB0byBsb2NhbFN0b3JhZ2UgKGBtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzYCwgYG1vYmlsZS1zZWxlY3RlZC12YXVsdGAsXG4gICAqICAgIGBlbmFibGUtcGx1Z2luLTxwYXRoPmApXG4gICAqIDQuIFRyaWdnZXIgYGxvY2F0aW9uLnJlbG9hZCgpYCBzbyBPYnNpZGlhbiByZS1yZWFkcyBsb2NhbFN0b3JhZ2UgYW5kIG9wZW5zIHRoZSB2YXVsdFxuICAgKiA1LiBXYWl0IGZvciBgYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeWBcbiAgICpcbiAgICogRXhpc3RpbmcgdmF1bHQgcmVnaXN0cmF0aW9ucyBpbiBsb2NhbFN0b3JhZ2UgYXJlIHByZXNlcnZlZCAoYXBwZW5kLCBub3Qgb3ZlcndyaXRlKS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBSZWdpc3RlcmluZyB2YXVsdDogJHt2YXVsdFBhdGh9YCk7XG4gICAgY29uc3QgZGV2aWNlVmF1bHRQYXRoID0gdGhpcy5nZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoKTtcblxuICAgIC8vIFB1c2ggYSBtaW5pbWFsIC5vYnNpZGlhbiBkaXJlY3Rvcnkgc28gT2JzaWRpYW4gcmVjb2duaXplcyBpdCBhcyBhIHZhdWx0LlxuICAgIGNvbnN0IG9ic2lkaWFuTWFya2VyID0gYCR7ZGV2aWNlVmF1bHRQYXRofS8ub2JzaWRpYW4vYXBwLmpzb25gO1xuICAgIGNvbnN0IGJhc2U2NENvbnRlbnQgPSBCdWZmZXIuZnJvbSgne30nLCAndXRmLTgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgYXdhaXQgdGhpcy5icm93c2VyLnB1c2hGaWxlKG9ic2lkaWFuTWFya2VyLCBiYXNlNjRDb250ZW50KTtcblxuICAgIC8vIFN3aXRjaCB0byBXZWJWaWV3IGFuZCBjb25maWd1cmUgbG9jYWxTdG9yYWdlLlxuICAgIGF3YWl0IHRoaXMuZW5zdXJlV2ViVmlld0NvbnRleHQoKTtcblxuICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5leGVjdXRlKChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLWV4dGVybmFsLXZhdWx0cycpID8/ICdbXScpIGFzIHN0cmluZ1tdO1xuICAgICAgaWYgKCFleGlzdGluZy5pbmNsdWRlcyhwYXRoKSkge1xuICAgICAgICBleGlzdGluZy5wdXNoKHBhdGgpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLWV4dGVybmFsLXZhdWx0cycsIEpTT04uc3RyaW5naWZ5KGV4aXN0aW5nKSk7XG4gICAgICB9XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JywgcGF0aCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShgZW5hYmxlLXBsdWdpbi0ke3BhdGh9YCwgJ3RydWUnKTtcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH0sIGRldmljZVZhdWx0UGF0aCk7XG5cbiAgICAvLyBXYWl0IGZvciByZWxvYWQgKyB2YXVsdCBpbml0aWFsaXphdGlvbi5cbiAgICBhd2FpdCB0aGlzLndhaXRGb3JMYXlvdXRSZWFkeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVucmVnaXN0ZXJzIGEgdmF1bHQgb24gbW9iaWxlIGJ5IHJlbW92aW5nIGl0IGZyb20gbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBQcmVzZXJ2ZXMgb3RoZXIgdmF1bHQgcmVnaXN0cmF0aW9ucy4gSWYgdGhlIHVucmVnaXN0ZXJlZCB2YXVsdCB3YXMgc2VsZWN0ZWQsXG4gICAqIHN3aXRjaGVzIHRvIHRoZSBmaXJzdCByZW1haW5pbmcgdmF1bHQgKG9yIGNsZWFycyB0aGUgc2VsZWN0aW9uKS5cbiAgICpcbiAgICogTm90ZTogVmF1bHQgZmlsZXMgb24gdGhlIGRldmljZSBhcmUgbm90IGRlbGV0ZWQuIFRoZSB0ZXN0IGhhcm5lc3Mgb3IgQ0lcbiAgICogZW52aXJvbm1lbnQgc2hvdWxkIGhhbmRsZSBkZXZpY2UgY2xlYW51cC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBvbiB0aGUgaG9zdCBtYWNoaW5lLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHVucmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRldmljZVZhdWx0UGF0aCA9IHRoaXMuZ2V0RGV2aWNlVmF1bHRQYXRoKHZhdWx0UGF0aCk7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVdlYlZpZXdDb250ZXh0KCk7XG5cbiAgICBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZSgocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBleGlzdGluZyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21vYmlsZS1leHRlcm5hbC12YXVsdHMnKSA/PyAnW10nKSBhcyBzdHJpbmdbXTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gZXhpc3RpbmcuZmlsdGVyKCh2KSA9PiB2ICE9PSBwYXRoKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdtb2JpbGUtZXh0ZXJuYWwtdmF1bHRzJywgSlNPTi5zdHJpbmdpZnkoZmlsdGVyZWQpKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGBlbmFibGUtcGx1Z2luLSR7cGF0aH1gKTtcbiAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JykgPT09IHBhdGgpIHtcbiAgICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnbW9iaWxlLXNlbGVjdGVkLXZhdWx0JywgZmlsdGVyZWRbMF0gPz8gJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdtb2JpbGUtc2VsZWN0ZWQtdmF1bHQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIGRldmljZVZhdWx0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoZXMgdGhlIGRyaXZlciB0byB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQuXG4gICAqXG4gICAqIFBvbGxzIHVudGlsIHRoZSBjb250ZXh0IGJlY29tZXMgYXZhaWxhYmxlICh0aGUgYXBwIG1heSBzdGlsbCBiZSBsb2FkaW5nKS5cbiAgICogVXNlcyB0aGUgYFdFQlZJRVdfbWQub2JzaWRpYW5gIGNvbnRleHQgc3BlY2lmaWNhbGx5IHRvIGF2b2lkIGNvbm5lY3RpbmdcbiAgICogdG8gQ2hyb21lIG9yIG90aGVyIFdlYlZpZXdzIG9uIHRoZSBkZXZpY2UuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZVdlYlZpZXdDb250ZXh0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcztcbiAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBXYWl0aW5nIGZvciAke1dFQlZJRVdfQ09OVEVYVF9QUkVGSVh9IGNvbnRleHQgKHRpbWVvdXQ9JHtTdHJpbmcodGhpcy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzKX1tcykuLi5gKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGNvbnN0IGNvbnRleHRzID0gYXdhaXQgdGhpcy5icm93c2VyLmdldENvbnRleHRzKCk7XG4gICAgICBjb25zdCBvYnNpZGlhbkNvbnRleHQgPSBjb250ZXh0cy5maW5kKChjdHgpOiBjdHggaXMgc3RyaW5nID0+IHR5cGVvZiBjdHggPT09ICdzdHJpbmcnICYmIGN0eC5zdGFydHNXaXRoKFdFQlZJRVdfQ09OVEVYVF9QUkVGSVgpKTtcblxuICAgICAgaWYgKG9ic2lkaWFuQ29udGV4dCkge1xuICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBGb3VuZCBXZWJWaWV3IGNvbnRleHQ6ICR7b2JzaWRpYW5Db250ZXh0fWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuYnJvd3Nlci5zd2l0Y2hDb250ZXh0KG9ic2lkaWFuQ29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICAgIGxvZyhgW2FwcGl1bS10cmFuc3BvcnRdIHN3aXRjaENvbnRleHQgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9LiBSZXNldHRpbmcgdG8gTkFUSVZFX0FQUCBiZWZvcmUgcmV0cnlpbmcuLi5gKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5icm93c2VyLnN3aXRjaENvbnRleHQoJ05BVElWRV9BUFAnKTtcbiAgICAgICAgICB9IGNhdGNoIChyZXNldEVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICBsb2coYFthcHBpdW0tdHJhbnNwb3J0XSBOQVRJVkVfQVBQIHJlc2V0IGFsc28gZmFpbGVkOiAke1N0cmluZyhyZXNldEVycm9yKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2ViVmlldyBub3QgcmVhZHksIGF2YWlsYWJsZSBjb250ZXh0czogJHtKU09OLnN0cmluZ2lmeShjb250ZXh0cyl9LiBSZXRyeWluZy4uLmApO1xuICAgICAgYXdhaXQgZGVsYXkoV0VCVklFV19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyAke1dFQlZJRVdfQ09OVEVYVF9QUkVGSVh9IGNvbnRleHQgZm91bmQgd2l0aGluICR7U3RyaW5nKHRoaXMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuIElzIHRoZSBPYnNpZGlhbiBhcHAgZnVsbHkgbG9hZGVkP2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgaG9zdC1zaWRlIHZhdWx0IHBhdGggdG8gdGhlIGRldmljZS1zaWRlIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBBYnNvbHV0ZSBwYXRoIG9uIHRoZSBob3N0IG1hY2hpbmUuXG4gICAqIEByZXR1cm5zIFRoZSBkZXZpY2Utc2lkZSB2YXVsdCBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXREZXZpY2VWYXVsdFBhdGgodmF1bHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnZhdWx0QmFzZVBhdGh9JHtleHRyYWN0VmF1bHROYW1lKHZhdWx0UGF0aCl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB1bnRpbCBgYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeWAgaXMgYHRydWVgIGluIHRoZSBXZWJWaWV3LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgTEFZT1VUX1JFQURZX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgbG9nKGBbYXBwaXVtLXRyYW5zcG9ydF0gV2FpdGluZyBmb3IgbGF5b3V0IHJlYWR5ICh0aW1lb3V0PSR7U3RyaW5nKExBWU9VVF9SRUFEWV9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGlzUmVhZHkgPSBhd2FpdCB0aGlzLmJyb3dzZXIuZXhlY3V0ZSgoKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkIC0tIFdlIG5lZWQgZ2xvYmFsIGBhcHBgIHZhcmlhYmxlLlxuICAgICAgICAgIGNvbnN0IGFwcCA9IHdpbmRvdy5hcHAgYXMgTG9hZGluZ0FwcCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXR1cm4gISFhcHA/LndvcmtzcGFjZT8ubGF5b3V0UmVhZHk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaXNSZWFkeSkge1xuICAgICAgICAgIGxvZygnW2FwcGl1bS10cmFuc3BvcnRdIExheW91dCBpcyByZWFkeS4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBBcHAgbm90IHJlYWR5IHlldCAocGFnZSBtYXkgYmUgcmVsb2FkaW5nKS5cbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGVsYXkoTEFZT1VUX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGxheW91dCBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoTEFZT1VUX1JFQURZX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgdmF1bHQgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGhvc3Qtc2lkZSB2YXVsdCBwYXRoLlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBBYnNvbHV0ZSBwYXRoIG9uIHRoZSBob3N0IG1hY2hpbmUuXG4gKiBAcmV0dXJucyBUaGUgbGFzdCBwYXRoIHNlZ21lbnQgKHZhdWx0IGRpcmVjdG9yeSBuYW1lKS5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFZhdWx0TmFtZSh2YXVsdFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB2YXVsdFBhdGgucmVwbGFjZSgvW1xcXFwvXSskLywgJycpO1xuICBjb25zdCBsYXN0U2VwID0gTWF0aC5tYXgobm9ybWFsaXplZC5sYXN0SW5kZXhPZignLycpLCBub3JtYWxpemVkLmxhc3RJbmRleE9mKCdcXFxcJykpO1xuICByZXR1cm4gbm9ybWFsaXplZC5zbGljZShsYXN0U2VwICsgMSk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNENBLHlCQUEyQjtBQUMzQixzQkFBbUI7QUFDbkIscUJBQXVCO0FBQ3ZCLHVCQUFxQjtBQU9yQixrQkFBcUI7QUFDckIsaUJBQW9CO0FBOENwQixNQUFNLFlBQVk7QUFDbEIsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSx3Q0FBd0M7QUFDOUMsTUFBTSwrQ0FBK0M7QUFDckQsTUFBTSw2Q0FBNkM7QUFDbkQsTUFBTSw0Q0FBNEM7QUFDbEQsTUFBTSxvQ0FBb0M7QUFDMUMsTUFBTSxpQkFBaUI7QUFFdkIsTUFBTSwwQkFBa0Q7QUFBQSxFQUN0RCxTQUFTO0FBQUEsRUFDVCxLQUFLO0FBQ1A7QUFpQk8sTUFBTSxnQkFBNkM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUl4QyxXQUFXO0FBQUEsRUFDVjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1YsWUFBWSxRQUErQjtBQUNoRCxTQUFLLFVBQVUsT0FBTztBQUN0QixTQUFLLFdBQVcsT0FBTztBQUN2QixTQUFLLFdBQVcsT0FBTztBQUN2QixTQUFLLFFBQVEsT0FBTyxTQUFTO0FBQzdCLFNBQUssZ0JBQWdCLE9BQU8saUJBQWlCLHdCQUF3QixLQUFLLFFBQVEsS0FBSztBQUN2RixTQUFLLCtCQUErQixPQUFPLGdDQUFnQztBQUFBLEVBQzdFO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFhLFVBQXlCO0FBQ3BDLFVBQU0sS0FBSyxRQUFRLGNBQWM7QUFBQSxFQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZQSxNQUFhLFNBQVMsWUFBb0IsVUFBaUQ7QUFDekYsVUFBTSxLQUFLLHFCQUFxQjtBQUVoQyxVQUFNLFNBQVMsTUFBTSxLQUFLLFFBQVE7QUFBQSxNQUNoQyxXQUFXLFVBQVU7QUFBQSxJQUN2QjtBQUVBLFFBQUksV0FBVyxVQUFhLFdBQVcsTUFBTTtBQUMzQyxhQUFPO0FBQUEsSUFDVDtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYSxlQUFlLFlBQW1DO0FBQzdELHdCQUFJLCtDQUErQztBQUNuRCxVQUFNLFFBQVEsTUFBTSxLQUFLLFFBQVEsY0FBYyxLQUFLLEtBQUs7QUFDekQsd0JBQUksaUNBQWlDLE9BQU8sS0FBSyxDQUFDLFVBQVUsT0FBTyxvQkFBb0IsQ0FBQyxjQUFjO0FBQ3RHLFFBQUksVUFBVSxzQkFBc0I7QUFDbEMsMEJBQUkscUNBQXFDLEtBQUssS0FBSyxLQUFLO0FBQ3hELFlBQU0sS0FBSyxRQUFRLFlBQVksS0FBSyxLQUFLO0FBQ3pDLFlBQU0sTUFBTSxpQ0FBaUM7QUFBQSxJQUMvQztBQUVBLFVBQU0sS0FBSyxxQkFBcUI7QUFDaEMsd0JBQUksNENBQTRDO0FBQUEsRUFDbEQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFhQSxNQUFhLFVBQVUsV0FBbUIsUUFBbUQ7QUFDM0YsVUFBTSxrQkFBa0IsS0FBSyxtQkFBbUIsU0FBUztBQUN6RCxVQUFNLGNBQWMsYUFBUywrQkFBVyxDQUFDO0FBQ3pDLFVBQU0sbUJBQWUsMkJBQUssdUJBQU8sR0FBRyxXQUFXO0FBQy9DLFVBQU0sZ0JBQWdCLG1CQUFtQixXQUFXO0FBRXBELFFBQUk7QUFDRiwwQkFBSSx3Q0FBd0MsWUFBWSxFQUFFO0FBQzFELGdCQUFNLGtCQUFLLENBQUMsT0FBTyxPQUFPLGFBQWEsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFLFNBQUssdUJBQU8sR0FBRyxTQUFTLEtBQUssQ0FBQztBQUU5RiwwQkFBSSxnREFBZ0QsS0FBSyxRQUFRLEtBQUs7QUFDdEUsZ0JBQU0sa0JBQUssQ0FBQyxPQUFPLE1BQU0sS0FBSyxVQUFVLFFBQVEsY0FBYyxhQUFhLEdBQUcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUUvRiwwQkFBSSxzREFBc0QsZUFBZSxLQUFLO0FBQzlFLGdCQUFNLGtCQUFLLENBQUMsT0FBTyxNQUFNLEtBQUssVUFBVSxTQUFTLFNBQVMsTUFBTSxlQUFlLEdBQUcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUNuRyxnQkFBTSxrQkFBSyxDQUFDLE9BQU8sTUFBTSxLQUFLLFVBQVUsU0FBUyxPQUFPLE9BQU8sZUFBZSxNQUFNLGVBQWUsR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBRXZILDBCQUFJLG1EQUFtRDtBQUN2RCxnQkFBTSxrQkFBSyxDQUFDLE9BQU8sTUFBTSxLQUFLLFVBQVUsU0FBUyxNQUFNLEdBQUcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUUzRSwwQkFBSSxrREFBa0Q7QUFDdEQsZ0JBQU0sa0JBQUssQ0FBQyxPQUFPLE1BQU0sS0FBSyxVQUFVLFNBQVMsTUFBTSxhQUFhLEdBQUcsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUFBLElBQzFGLFVBQUU7QUFDQSxnQkFBTSxvQkFBRyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFBQSxJQUN4QztBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWlCQSxNQUFhLGNBQWMsV0FBa0M7QUFDM0Qsd0JBQUkseUNBQXlDLFNBQVMsRUFBRTtBQUN4RCxVQUFNLGtCQUFrQixLQUFLLG1CQUFtQixTQUFTO0FBR3pELFVBQU0saUJBQWlCLEdBQUcsZUFBZTtBQUN6QyxVQUFNLGdCQUFnQixPQUFPLEtBQUssTUFBTSxPQUFPLEVBQUUsU0FBUyxRQUFRO0FBQ2xFLFVBQU0sS0FBSyxRQUFRLFNBQVMsZ0JBQWdCLGFBQWE7QUFHekQsVUFBTSxLQUFLLHFCQUFxQjtBQUVoQyxVQUFNLEtBQUssUUFBUSxRQUFRLENBQUMsU0FBaUI7QUFDM0MsWUFBTSxXQUFXLEtBQUssTUFBTSxhQUFhLFFBQVEsd0JBQXdCLEtBQUssSUFBSTtBQUNsRixVQUFJLENBQUMsU0FBUyxTQUFTLElBQUksR0FBRztBQUM1QixpQkFBUyxLQUFLLElBQUk7QUFDbEIscUJBQWEsUUFBUSwwQkFBMEIsS0FBSyxVQUFVLFFBQVEsQ0FBQztBQUFBLE1BQ3pFO0FBQ0EsbUJBQWEsUUFBUSx5QkFBeUIsSUFBSTtBQUNsRCxtQkFBYSxRQUFRLGlCQUFpQixJQUFJLElBQUksTUFBTTtBQUNwRCxlQUFTLE9BQU87QUFBQSxJQUNsQixHQUFHLGVBQWU7QUFHbEIsVUFBTSxLQUFLLG1CQUFtQjtBQUFBLEVBQ2hDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBYUEsTUFBYSxnQkFBZ0IsV0FBa0M7QUFDN0QsVUFBTSxrQkFBa0IsS0FBSyxtQkFBbUIsU0FBUztBQUV6RCxVQUFNLEtBQUsscUJBQXFCO0FBRWhDLFVBQU0sS0FBSyxRQUFRLFFBQVEsQ0FBQyxTQUFpQjtBQUMzQyxZQUFNLFdBQVcsS0FBSyxNQUFNLGFBQWEsUUFBUSx3QkFBd0IsS0FBSyxJQUFJO0FBQ2xGLFlBQU0sV0FBVyxTQUFTLE9BQU8sQ0FBQyxNQUFNLE1BQU0sSUFBSTtBQUNsRCxtQkFBYSxRQUFRLDBCQUEwQixLQUFLLFVBQVUsUUFBUSxDQUFDO0FBQ3ZFLG1CQUFhLFdBQVcsaUJBQWlCLElBQUksRUFBRTtBQUMvQyxVQUFJLGFBQWEsUUFBUSx1QkFBdUIsTUFBTSxNQUFNO0FBQzFELFlBQUksU0FBUyxTQUFTLEdBQUc7QUFDdkIsdUJBQWEsUUFBUSx5QkFBeUIsU0FBUyxDQUFDLEtBQUssRUFBRTtBQUFBLFFBQ2pFLE9BQU87QUFDTCx1QkFBYSxXQUFXLHVCQUF1QjtBQUFBLFFBQ2pEO0FBQUEsTUFDRjtBQUFBLElBQ0YsR0FBRyxlQUFlO0FBQUEsRUFDcEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBYyx1QkFBc0M7QUFDbEQsVUFBTSxXQUFXLEtBQUssSUFBSSxJQUFJLEtBQUs7QUFDbkMsd0JBQUksa0NBQWtDLHNCQUFzQixxQkFBcUIsT0FBTyxLQUFLLDRCQUE0QixDQUFDLFFBQVE7QUFFbEksV0FBTyxLQUFLLElBQUksSUFBSSxVQUFVO0FBQzVCLFlBQU0sV0FBVyxNQUFNLEtBQUssUUFBUSxZQUFZO0FBQ2hELFlBQU0sa0JBQWtCLFNBQVMsS0FBSyxDQUFDLFFBQXVCLE9BQU8sUUFBUSxZQUFZLElBQUksV0FBVyxzQkFBc0IsQ0FBQztBQUUvSCxVQUFJLGlCQUFpQjtBQUNuQiw0QkFBSSw2Q0FBNkMsZUFBZSxFQUFFO0FBQ2xFLFlBQUk7QUFDRixnQkFBTSxLQUFLLFFBQVEsY0FBYyxlQUFlO0FBQ2hEO0FBQUEsUUFDRixTQUFTLE9BQWdCO0FBQ3ZCLDhCQUFJLDRDQUE0QyxPQUFPLEtBQUssQ0FBQyw4Q0FBOEM7QUFDM0csY0FBSTtBQUNGLGtCQUFNLEtBQUssUUFBUSxjQUFjLFlBQVk7QUFBQSxVQUMvQyxTQUFTLFlBQXFCO0FBQzVCLGdDQUFJLG9EQUFvRCxPQUFPLFVBQVUsQ0FBQyxFQUFFO0FBQUEsVUFDOUU7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUVBLDBCQUFJLDZEQUE2RCxLQUFLLFVBQVUsUUFBUSxDQUFDLGVBQWU7QUFDeEcsWUFBTSxNQUFNLHFDQUFxQztBQUFBLElBQ25EO0FBRUEsVUFBTSxJQUFJLE1BQU0sTUFBTSxzQkFBc0IseUJBQXlCLE9BQU8sS0FBSyw0QkFBNEIsQ0FBQyx1Q0FBdUM7QUFBQSxFQUN2SjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUVEsbUJBQW1CLFdBQTJCO0FBQ3BELFdBQU8sR0FBRyxLQUFLLGFBQWEsR0FBRyxpQkFBaUIsU0FBUyxDQUFDO0FBQUEsRUFDNUQ7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWMscUJBQW9DO0FBQ2hELFVBQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUM5Qix3QkFBSSx3REFBd0QsT0FBTyx5Q0FBeUMsQ0FBQyxRQUFRO0FBRXJILFdBQU8sS0FBSyxJQUFJLElBQUksVUFBVTtBQUM1QixVQUFJO0FBQ0YsY0FBTSxVQUFVLE1BQU0sS0FBSyxRQUFRLFFBQVEsTUFBZTtBQUV4RCxnQkFBTSxNQUFNLE9BQU87QUFDbkIsaUJBQU8sQ0FBQyxDQUFDLEtBQUssV0FBVztBQUFBLFFBQzNCLENBQUM7QUFDRCxZQUFJLFNBQVM7QUFDWCw4QkFBSSxxQ0FBcUM7QUFDekM7QUFBQSxRQUNGO0FBQUEsTUFDRixRQUFRO0FBQUEsTUFFUjtBQUVBLFlBQU0sTUFBTSwwQ0FBMEM7QUFBQSxJQUN4RDtBQUVBLFVBQU0sSUFBSSxNQUFNLCtDQUErQyxPQUFPLHlDQUF5QyxDQUFDLElBQUk7QUFBQSxFQUN0SDtBQUNGO0FBUUEsU0FBUyxNQUFNLElBQTJCO0FBQ3hDLFNBQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM5QixlQUFXLFNBQVMsRUFBRTtBQUFBLEVBQ3hCLENBQUM7QUFDSDtBQVFBLFNBQVMsaUJBQWlCLFdBQTJCO0FBQ25ELFFBQU0sYUFBYSxVQUFVLFFBQVEsV0FBVyxFQUFFO0FBQ2xELFFBQU0sVUFBVSxLQUFLLElBQUksV0FBVyxZQUFZLEdBQUcsR0FBRyxXQUFXLFlBQVksSUFBSSxDQUFDO0FBQ2xGLFNBQU8sV0FBVyxNQUFNLFVBQVUsQ0FBQztBQUNyQzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -70,6 +70,12 @@ export interface AppiumTransportConfig {
70
70
  * - iOS: `@md.obsidian:documents/`
71
71
  */
72
72
  vaultBasePath?: string;
73
+ /**
74
+ * Timeout in milliseconds for waiting for the WebView context to become available.
75
+ *
76
+ * @default `60000`
77
+ */
78
+ webviewTimeoutInMilliseconds?: number;
73
79
  }
74
80
  /**
75
81
  * Transport that communicates with Obsidian Mobile via Appium WebView JS injection.
@@ -88,6 +94,7 @@ export declare class AppiumTransport implements ObsidianTransport {
88
94
  private readonly deviceId;
89
95
  private readonly platform;
90
96
  private readonly vaultBasePath;
97
+ private readonly webviewTimeoutInMilliseconds;
91
98
  /**
92
99
  * Creates a new Appium transport.
93
100
  *
@@ -360,18 +360,18 @@ ${diagnostics}`);
360
360
  }
361
361
  }
362
362
  async function invokeAndWriteResult(params) {
363
- const { writeFile: writeResultFile } = window.require("node:fs/promises");
363
+ const fsPromises = Reflect.get(window.app.vault.adapter, "fsPromises");
364
364
  try {
365
365
  const result = await params.evaluate();
366
366
  if (result === void 0) {
367
- await writeResultFile(params.resultPath, JSON.stringify({ type: "undefined", value: "" }));
367
+ await fsPromises.writeFile(params.resultPath, JSON.stringify({ type: "undefined", value: "" }));
368
368
  } else if (result === null) {
369
- await writeResultFile(params.resultPath, JSON.stringify({ type: "null", value: "" }));
369
+ await fsPromises.writeFile(params.resultPath, JSON.stringify({ type: "null", value: "" }));
370
370
  } else {
371
- await writeResultFile(params.resultPath, JSON.stringify({ value: String(result) }));
371
+ await fsPromises.writeFile(params.resultPath, JSON.stringify({ value: String(result) }));
372
372
  }
373
373
  } catch (err) {
374
- await writeResultFile(params.resultPath, JSON.stringify({ type: "error", value: params.serializeError(err) }));
374
+ await fsPromises.writeFile(params.resultPath, JSON.stringify({ type: "error", value: params.serializeError(err) }));
375
375
  }
376
376
  }
377
377
  async function buildDiagnostics(params) {
@@ -428,7 +428,7 @@ function delay(ms) {
428
428
  });
429
429
  }
430
430
  async function executeScriptFile(scriptPath) {
431
- const fsPromises = window.require("node:fs/promises");
431
+ const fsPromises = Reflect.get(window.app.vault.adapter, "fsPromises");
432
432
  try {
433
433
  await fsPromises.access(scriptPath);
434
434
  } catch (cause) {
@@ -505,4 +505,4 @@ async function openVaultViaUri(vaultPath) {
505
505
  DesktopCliTransport,
506
506
  invokeAndWriteResult
507
507
  });
508
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0IH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcgfSBmcm9tICcuL2Z1bmN0aW9uLWV4cHJlc3Npb24uY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQgfSBmcm9tICcuL25hbWVzcGFjZS1ib290c3RyYXAuY2pzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuL25vb3AuY2pzJztcbmltcG9ydCB7XG4gIGVuYWJsZUNsaUluQ29uZmlnLFxuICBnZXRBbnlSZWdpc3RlcmVkVmF1bHRQYXRoLFxuICBnZXRSZWdpc3RlcmVkVmF1bHRzLFxuICBnZXRWYXVsdElkLFxuICBpc0NsaUVuYWJsZWQsXG4gIGlzVmF1bHRPcGVuLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZCxcbiAgcmVnaXN0ZXJWYXVsdEluQ29uZmlnLFxuICByZW1vdmVWYXVsdEZyb21Db25maWdcbn0gZnJvbSAnLi9vYnNpZGlhbi1jb25maWcuY2pzJztcbmltcG9ydCB7IHNlcmlhbGl6ZUVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemUtZXJyb3IuY2pzJztcblxuaW50ZXJmYWNlIEludm9rZUFuZFdyaXRlUmVzdWx0UGFyYW1zIHtcbiAgZXZhbHVhdGUoKTogUHJvbWlzZTx1bmtub3duPjtcbiAgcmVzdWx0UGF0aDogc3RyaW5nO1xuICBzZXJpYWxpemVFcnJvcihlcnJvcjogdW5rbm93bik6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIGVudmVsb3BlIHdyaXR0ZW4gYnkgdGhlIHRlbXBvcmFyeSBzY3JpcHQgZmlsZS5cbiAqXG4gKiAtIGB7IHZhbHVlOiBzdHJpbmcsIHR5cGU6ICdlcnJvcicgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHRocmV3OyBgdmFsdWVgIGlzIHRoZSBlcnJvciBtZXNzYWdlLlxuICogLSBgeyB2YWx1ZTogJycsIHR5cGU6ICdudWxsJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gcmV0dXJuZWQgYG51bGxgLlxuICogLSBgeyB2YWx1ZTogJycsIHR5cGU6ICd1bmRlZmluZWQnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgdW5kZWZpbmVkYC5cbiAqIC0gYHsgdmFsdWU6IHN0cmluZyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gcmV0dXJuZWQgYSBzdHJpbmcgdmFsdWUgKG5vIGB0eXBlYCBmaWVsZCkuXG4gKi9cbnR5cGUgU2NyaXB0UmVzdWx0RW52ZWxvcGUgPVxuICB8IHsgdHlwZTogJ2Vycm9yJyB8ICdudWxsJyB8ICd1bmRlZmluZWQnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IHZhbHVlOiBzdHJpbmcgfTtcblxuY29uc3QgVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4gPSAndW5hYmxlIHRvIGZpbmQgT2JzaWRpYW4nO1xuY29uc3QgQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwMDA7XG5jb25zdCBWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBWQVVMVF9FVkFMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTAwMDA7XG5cbmludGVyZmFjZSBCdWlsZERpYWdub3N0aWNzUGFyYW1zIHtcbiAgY29tbWFuZDogc3RyaW5nW107XG4gIGN3ZDogc3RyaW5nO1xuICBleGVjUmVzdWx0OiBFeGVjUmVzdWx0IHwgdW5kZWZpbmVkO1xuICByZXN1bHRQYXRoOiBzdHJpbmc7XG4gIHNjcmlwdENvbnRlbnQ6IHN0cmluZztcbiAgc2NyaXB0UGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIERlc2t0b3AgT2JzaWRpYW4gdmlhIHRoZSBgb2JzaWRpYW4gZXZhbGAgQ0xJIGNvbW1hbmRcbiAqIGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5leHBvcnQgY2xhc3MgRGVza3RvcENsaVRyYW5zcG9ydCBpbXBsZW1lbnRzIE9ic2lkaWFuVHJhbnNwb3J0IHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIGZvciBhIG1vYmlsZSBwbGF0Zm9ybS4gQWx3YXlzIGBmYWxzZWAgZm9yIHRoaXMgdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzTW9iaWxlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiBpbnNpZGUgT2JzaWRpYW4gdmlhIGBvYnNpZGlhbiBldmFsYC5cbiAgICpcbiAgICogV3JpdGVzIHRoZSBleHByZXNzaW9uIHRvIGEgdGVtcG9yYXJ5IGAuY2pzYCBmaWxlIGFuZCBleGVjdXRlcyBhIHRpbnlcbiAgICogYHJlcXVpcmUoKS5pbnZva2UoKWAgY2FsbCB2aWEgdGhlIENMSS4gVGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvIGFcbiAgICogYC5yZXN1bHQuanNvbmAgZmlsZSBieSB0aGUgc2NyaXB0LCBhdm9pZGluZyBDTEkgc3Rkb3V0IHNpemUgbGltaXRzXG4gICAqIGFuZCBJUEMgYnVmZmVyIGlzc3Vlcy5cbiAgICpcbiAgICogSGFuZGxlcyBhdXRvLXN0YXJ0OiBpZiBPYnNpZGlhbiBpcyBub3QgcnVubmluZywgbGF1bmNoZXMgaXQgdmlhIFVSSSBwcm90b2NvbFxuICAgKiBhbmQgcmV0cmllcyB1bnRpbCBpdCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcmVzdWx0IHN0cmluZyAodHJhbnNwb3J0LXNwZWNpZmljIHByZWZpeGVzIHN0cmlwcGVkKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBldmFsdWF0ZShleHByZXNzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBTTElDRV9TVEFSVCA9IDI7XG4gICAgY29uc3Qgc2NyaXB0SWQgPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpO1xuICAgIGNvbnN0IHNjcmlwdERpciA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG4gICAgY29uc3Qgc2NyaXB0UGF0aCA9IGpvaW4oc2NyaXB0RGlyLCBgJHtzY3JpcHRJZH0uanNgKTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5yZXN1bHQuanNvbmApO1xuXG4gICAgYXdhaXQgbWtkaXIoc2NyaXB0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHNjcmlwdENvbnRlbnQgPSBidWlsZFNjcmlwdEZpbGUoZXhwcmVzc2lvbiwgcmVzdWx0UGF0aCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHNjcmlwdFBhdGgsIHNjcmlwdENvbnRlbnQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhZmVTY3JpcHRQYXRoID0gc2NyaXB0UGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICBjb25zdCBjbGlFeHByID0gYCgke2dldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhleGVjdXRlU2NyaXB0RmlsZSl9KSgke0pTT04uc3RyaW5naWZ5KHNhZmVTY3JpcHRQYXRoKX0pYDtcbiAgICAgIGNvbnN0IHZhdWx0SWQgPSBnZXRWYXVsdElkKG9wdGlvbnMuY3dkKTtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBbJ29ic2lkaWFuJywgLi4uKHZhdWx0SWQgPyBbYHZhdWx0PSR7dmF1bHRJZH1gXSA6IFtdKSwgJ2V2YWwnLCAnLS1hbGxvdy1mb2N1cy1zdGVhbCcsIGBjb2RlPSR7Y2xpRXhwcn1gXTtcblxuICAgICAgbGV0IGV4ZWNSZXN1bHQ6IEV4ZWNSZXN1bHQgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBleGVjUmVzdWx0ID0gYXdhaXQgZXhlYyhjb21tYW5kLCB7XG4gICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVEZXRhaWxzOiB0cnVlLFxuICAgICAgICAgIC4uLihvcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFVOQUJMRV9UT19GSU5EX09CU0lESUFOKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZCwgb3B0aW9ucy5jd2QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZXhpc3RzU3luYyhyZXN1bHRQYXRoKSkge1xuICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IGF3YWl0IGJ1aWxkRGlhZ25vc3RpY3Moe1xuICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgICAgICBleGVjUmVzdWx0LFxuICAgICAgICAgIHJlc3VsdFBhdGgsXG4gICAgICAgICAgc2NyaXB0Q29udGVudCxcbiAgICAgICAgICBzY3JpcHRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmlwdCBkaWQgbm90IGV4ZWN1dGUgZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9XFxuJHtkaWFnbm9zdGljc31gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0U3RyID0gYXdhaXQgcmVhZEZpbGUocmVzdWx0UGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04ucGFyc2UocmVzdWx0U3RyKSBhcyBTY3JpcHRSZXN1bHRFbnZlbG9wZTtcblxuICAgICAgaWYgKCd0eXBlJyBpbiBlbnZlbG9wZSkge1xuICAgICAgICBpZiAoZW52ZWxvcGUudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGVycm9yIGluIE9ic2lkaWFuIGZvciBwYXRoOiAke29wdGlvbnMuY3dkfTogJHtlbnZlbG9wZS52YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbnZlbG9wZS52YWx1ZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdW5saW5rKHNjcmlwdFBhdGgpLmNhdGNoKG5vb3ApO1xuICAgICAgYXdhaXQgdW5saW5rKHJlc3VsdFBhdGgpLmNhdGNoKG5vb3ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIENMSS1zcGVjaWZpYyBwcmVmbGlnaHQgY2hlY2tzLlxuICAgKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkLCBDTEkgaXMgZW5hYmxlZCBpbiBPYnNpZGlhbiBzZXR0aW5ncyxcbiAgICogYW5kIHRoZSBgb2JzaWRpYW5gIENMSSBiaW5hcnkgaXMgYXZhaWxhYmxlIGluIFBBVEguIElmIHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkXG4gICAqIGJ1dCBub3Qgb3Blbiwgb3BlbnMgaXQgdmlhIFVSSSBwcm90b2NvbCBhbmQgcG9sbHMgdW50aWwgaXQgaXMgcmVhZHkuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUnVubmluZyBwcmVmbGlnaHQgY2hlY2sgZm9yIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBpZiAoIWlzVmF1bHRSZWdpc3RlcmVkKHZhdWx0UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIE9ic2lkaWFuOiAke3ZhdWx0UGF0aH0uIFJlZ2lzdGVyIHRoZSB2YXVsdCBmaXJzdCB3aXRoIHJlZ2lzdGVyVmF1bHQoKSBvciBUZW1wVmF1bHQucmVnaXN0ZXIoKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghaXNDbGlFbmFibGVkKCkpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIENMSSBpcyBkaXNhYmxlZCBpbiBvYnNpZGlhbi5qc29uLiBFbmFibGluZyBhbmQgcmVzdGFydGluZyBPYnNpZGlhbi4uLicpO1xuICAgICAgZW5hYmxlQ2xpSW5Db25maWcoKTtcbiAgICAgIGF3YWl0IHRoaXMucmVzdGFydE9ic2lkaWFuKHZhdWx0UGF0aCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDbGlBdmFpbGFibGUoKTtcblxuICAgIGlmICghaXNWYXVsdE9wZW4odmF1bHRQYXRoKSkge1xuICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVmF1bHQgaXMgcmVnaXN0ZXJlZCBidXQgbm90IG9wZW46ICR7dmF1bHRQYXRofS4gT3BlbmluZyB2aWEgVVJJLi4uYCk7XG4gICAgICBhd2FpdCBvcGVuVmF1bHRWaWFVcmkodmF1bHRQYXRoKTtcbiAgICAgIGF3YWl0IHRoaXMucG9sbFZhdWx0UmVhZHkodmF1bHRQYXRoKTtcbiAgICB9XG5cbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBFbGVjdHJvbiBJUEMuXG4gICAqXG4gICAqIFVzZXMgYHZhdWx0LW9wZW5gIElQQyB0byByZWdpc3RlciBhbmQgb3BlbiB0aGUgdmF1bHQsIHRoZW4gcG9sbHMgdW50aWxcbiAgICogdGhlIHZhdWx0J3MgQ0xJIGlzIHJlYWR5IGFuZCBgZ2V0QmFzZVBhdGgoKWAgbWF0Y2hlcyBgdmF1bHRQYXRoYC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0UGF0aCA9IGdldEFueVJlZ2lzdGVyZWRWYXVsdFBhdGgoKTtcblxuICAgIGlmIChleGlzdGluZ1ZhdWx0UGF0aCkge1xuICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIGV4aXN0aW5nVmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyRXhwciA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5pcGNTZW5kU3luYygke0pTT04uc3RyaW5naWZ5KHsgYXJnczogW3ZhdWx0UGF0aCwgZmFsc2VdLCBjaGFubmVsOiAndmF1bHQtb3BlbicgfSl9KWA7XG4gICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlZ2lzdGVyRXhwciwgeyBjd2Q6IGV4aXN0aW5nVmF1bHRQYXRoIH0pO1xuICAgICAgYXdhaXQgdGhpcy5lbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2UodmF1bHRQYXRoLCBleGlzdGluZ1ZhdWx0UGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE5vIGV4aXN0aW5nIHZhdWx0IHJlZ2lzdGVyZWQuIFdyaXRpbmcgdmF1bHQgZW50cnkgZGlyZWN0bHkgdG8gb2JzaWRpYW4uanNvbi4uLicpO1xuICAgICAgcmVnaXN0ZXJWYXVsdEluQ29uZmlnKHZhdWx0UGF0aCk7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCBlbnRyeSB3cml0dGVuLiBPcGVuaW5nIHZhdWx0IHZpYSBVUkkgcHJvdG9jb2wuLi4nKTtcbiAgICAgIGF3YWl0IG9wZW5WYXVsdFZpYVVyaSh2YXVsdFBhdGgpO1xuICAgICAgYXdhaXQgdGhpcy5wb2xsVmF1bHRSZWFkeSh2YXVsdFBhdGgpO1xuICAgICAgYXdhaXQgdGhpcy5lbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2UodmF1bHRQYXRoLCB2YXVsdFBhdGgpO1xuICAgICAgYXdhaXQgdGhpcy5kaXNtaXNzVHJ1c3REaWFsb2codmF1bHRQYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnBvbGxWYXVsdFJlYWR5KHZhdWx0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBmcm9tIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBTY2hlZHVsZXMgdGhlIHZhdWx0IHdpbmRvdyB0byBjbG9zZSwgd2FpdHMsIHRoZW4gcmVtb3ZlcyB0aGUgdmF1bHRcbiAgICogZnJvbSB0aGUgcmVnaXN0cnkgdmlhIGB2YXVsdC1yZW1vdmVgIElQQy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVW5yZWdpc3RlcmluZyB2YXVsdDogY2xvc2luZyB3aW5kb3cgZm9yICR7dmF1bHRQYXRofS4uLmApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IGRlc3Ryb3lFeHByID0gJ3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmRlc3Ryb3lDdXJyZW50V2luZG93KCknO1xuICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShkZXN0cm95RXhwciwgeyBjd2Q6IHZhdWx0UGF0aCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBWQVVMVF9FVkFMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0pO1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2luZG93IGRlc3Ryb3kgY29tbWFuZCBzZW50LicpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBXaW5kb3cgZGVzdHJveSBmYWlsZWQgKG5vbi1mYXRhbCk6ICR7c2VyaWFsaXplRXJyb3IoZXJyb3IpfWApO1xuICAgIH1cblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFdhaXRpbmcgZm9yIHdpbmRvdyB0byBjbG9zZS4uLicpO1xuICAgIGF3YWl0IGRlbGF5KFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBSZW1vdmluZyB2YXVsdCBmcm9tIHJlZ2lzdHJ5Li4uJyk7XG4gICAgY29uc3QgZXhpc3RpbmdWYXVsdEZvclJlbW92YWwgPSBnZXRBbnlSZWdpc3RlcmVkVmF1bHRQYXRoKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCkge1xuICAgICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgZXhpc3RpbmdWYXVsdEZvclJlbW92YWwpO1xuICAgICAgICBjb25zdCByZW1vdmVFeHByID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmlwY1NlbmRTeW5jKCR7SlNPTi5zdHJpbmdpZnkoeyBhcmdzOiBbdmF1bHRQYXRoXSwgY2hhbm5lbDogJ3ZhdWx0LXJlbW92ZScgfSl9KWA7XG4gICAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUocmVtb3ZlRXhwciwgeyBjd2Q6IGV4aXN0aW5nVmF1bHRGb3JSZW1vdmFsLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBObyBleGlzdGluZyB2YXVsdCB0byB0YXJnZXQgZm9yIHJlbW92YWwgSVBDIFx1MjAxNCByZW1vdmluZyBkaXJlY3RseSBmcm9tIG9ic2lkaWFuLmpzb24uJyk7XG4gICAgICAgIHJlbW92ZVZhdWx0RnJvbUNvbmZpZyh2YXVsdFBhdGgpO1xuICAgICAgfVxuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gVmF1bHQgcmVtb3ZlZCBmcm9tIHJlZ2lzdHJ5LicpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBWYXVsdCByZWdpc3RyeSByZW1vdmFsIGZhaWxlZCAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBPYnNpZGlhbiBDTEkgYmluYXJ5IGlzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtIFBBVEguXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFzc2VydENsaUF2YWlsYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb21tYW5kID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/ICd3aGVyZS5leGUgb2JzaWRpYW4nIDogJ3doaWNoIG9ic2lkaWFuJztcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhjb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ic2lkaWFuIENMSSBpcyBub3QgYXZhaWxhYmxlLiBFbnN1cmUgT2JzaWRpYW4gaXMgaW5zdGFsbGVkIGFuZCBpdHMgQ0xJIGlzIGluIHlvdXIgUEFUSC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzc2VzIHRoZSBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yIG9mIHRoaXMgdmF1bHQ/XCIgZGlhbG9nIGlmIHByZXNlbnQuXG4gICAqXG4gICAqIENsaWNrcyB0aGUgXCJUcnVzdCBhdXRob3IgYW5kIGVuYWJsZSBwbHVnaW5zXCIgYnV0dG9uIChgLm1vZC1jdGFgKSBpbnNpZGUgYW55XG4gICAqIG1vZGFsIHdob3NlIHRleHQgaW5jbHVkZXMgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvclwiLiBUaGlzIGlzIG5lZWRlZCB3aGVuIGFcbiAgICogdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgd2l0aG91dCBhIHByaW9yIGBlbmFibGUtcGx1Z2luLTxpZD5gXG4gICAqIGVudHJ5IGluIGxvY2FsU3RvcmFnZSAoZS5nLiwgdGhlIHZlcnkgZmlyc3QgdmF1bHQgcmVnaXN0ZXJlZCB2aWEgY29uZmlnIGZpbGUpLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgIGNvbnN0IGRpc21pc3NFeHByID0gYChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBtb2RhbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubW9kYWwtY29udGFpbmVyJyk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAobW9kYWxzW2ldLnRleHRDb250ZW50LmluY2x1ZGVzKCdEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvcicpKSB7XG4gICAgICAgICAgdmFyIGJ0biA9IG1vZGFsc1tpXS5xdWVyeVNlbGVjdG9yKCcubW9kLWN0YScpO1xuICAgICAgICAgIGlmIChidG4pIHsgYnRuLmNsaWNrKCk7IHJldHVybiB0cnVlOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KSgpYDtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV2YWx1YXRlKGRpc21pc3NFeHByLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgIGlmIChyZXN1bHQgPT09ICd0cnVlJykge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gRGlzbWlzc2VkIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3JcIiBkaWFsb2cuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYGVuYWJsZS1wbHVnaW4tPHZhdWx0SWQ+YCBpbiBPYnNpZGlhbidzIGxvY2FsU3RvcmFnZSB0byBwcmV2ZW50XG4gICAqIHRoZSBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yIG9mIHRoaXMgdmF1bHQ/XCIgZGlhbG9nIGZyb20gYXBwZWFyaW5nXG4gICAqIHdoZW4gYSB2YXVsdCB3aXRoIGNvbW11bml0eSBwbHVnaW5zIGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqXG4gICAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBgdmF1bHQtb3BlbmAgSVBDIChzbyB0aGUgdmF1bHQgSUQgZXhpc3RzIGluXG4gICAqIGBvYnNpZGlhbi5qc29uYCkgYW5kIGJlZm9yZSB0aGUgbmV3IHZhdWx0IHdpbmRvdyBmaW5pc2hlcyBsb2FkaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICogQHBhcmFtIGV2YWxUYXJnZXRWYXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byB1c2UgYXMgZXZhbCB0YXJnZXQgKGFuIGV4aXN0aW5nLCBsb2FkZWQgdmF1bHQpLlxuICAgKiAgIGxvY2FsU3RvcmFnZSBpcyBzaGFyZWQgYWNyb3NzIGFsbCBPYnNpZGlhbiB3aW5kb3dzIChzYW1lIEVsZWN0cm9uIG9yaWdpbiksIHNvIHRoZVxuICAgKiAgIGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbWAgY2FsbCBjYW4gcnVuIGluIGFueSBsb2FkZWQgdmF1bHQgd2luZG93LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2UodmF1bHRQYXRoOiBzdHJpbmcsIGV2YWxUYXJnZXRWYXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZhdWx0SWQgPSBnZXRWYXVsdElkKHZhdWx0UGF0aCk7XG4gICAgaWYgKCF2YXVsdElkKSB7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBDb3VsZCBub3QgZmluZCB2YXVsdCBJRCBcdTIwMTQgc2tpcHBpbmcgbG9jYWxTdG9yYWdlIHRydXN0IGZsYWcuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIGV2YWxUYXJnZXRWYXVsdFBhdGgpO1xuICAgIGNvbnN0IGVuYWJsZUV4cHIgPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmcuc2V0TG9jYWxTdG9yYWdlSXRlbSgke0pTT04uc3RyaW5naWZ5KHsga2V5OiBgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9YCwgdmFsdWU6ICd0cnVlJyB9KX0pYDtcbiAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGVuYWJsZUV4cHIsIHsgY3dkOiBldmFsVGFyZ2V0VmF1bHRQYXRoIH0pO1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFNldCBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH0gaW4gbG9jYWxTdG9yYWdlLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaGVzIE9ic2lkaWFuIGJpbmFyeSBhbmQgcmV0cmllcyB0aGUgZXZhbCB1bnRpbCBpdCByZXNwb25kcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgQ0xJIGNvbW1hbmQgYXJyYXkgdG8gcmV0cnkuXG4gICAqIEBwYXJhbSBjd2QgLSBUaGUgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZU9ic2lkaWFuUnVubmluZ0FuZFJldHJ5KGNvbW1hbmQ6IHN0cmluZ1tdLCBjd2Q6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLiBTdGFydGluZyBPYnNpZGlhbi4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKCksIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBsYXVuY2ggY29tbWFuZCBtYXkgZmFpbCBvbiBzb21lIHN5c3RlbXMgXHUyMDE0IHdlJ2xsIHN0aWxsIHRyeSBwb2xsaW5nLlxuICAgIH1cblxuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIE9ic2lkaWFuIENMSSAodGltZW91dD0ke1N0cmluZyhBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGF3YWl0IGRlbGF5KEFVVE9fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZXhlYyhjb21tYW5kLCB7IGN3ZCwgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gQ0xJIHJlc3BvbmRlZC4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgaWYgKCFtZXNzYWdlLmluY2x1ZGVzKFVOQUJMRV9UT19GSU5EX09CU0lESUFOKSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE9ic2lkaWFuIG5vdCByZWFkeSB5ZXQsIHJldHJ5aW5nLi4uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBPYnNpZGlhbiBkaWQgbm90IHN0YXJ0IHdpdGhpbiAke1N0cmluZyhBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcy5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyB1bnRpbCB0aGUgdmF1bHQgaXMgcmVhZHkgYW5kIHJlc3BvbmRpbmcgdG8gZXZhbCBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBvbGxWYXVsdFJlYWR5KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcG9sbEV4cHIgPSAnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcucG9sbFZhdWx0QmFzZVBhdGgoKSc7XG5cbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBQb2xsaW5nIGZvciB2YXVsdCByZWFkaW5lc3MgKHRpbWVvdXQ9JHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICBsZXQgaXNCb290c3RyYXBwZWQgPSBmYWxzZTtcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWlzQm9vdHN0cmFwcGVkKSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgICAgICAgaXNCb290c3RyYXBwZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhc2VQYXRoID0gYXdhaXQgdGhpcy5ldmFsdWF0ZShwb2xsRXhwciwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICAgICAgaWYgKEpTT04ucGFyc2UoYmFzZVBhdGgpID09PSB2YXVsdFBhdGgpIHtcbiAgICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCBpcyByZWFkeS4nKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBWYXVsdCBub3QgcmVhZHkgeWV0IFx1MjAxNCBuYW1lc3BhY2UgbWF5IG5vdCBiZSBib290c3RyYXBwZWQgeWV0IGVpdGhlci5cbiAgICAgICAgaXNCb290c3RyYXBwZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdGFydHMgT2JzaWRpYW4gYnkga2lsbGluZyB0aGUgcnVubmluZyBwcm9jZXNzIGFuZCByZWxhdW5jaGluZyBpdC5cbiAgICpcbiAgICogVXNlZCB3aGVuIGEgY29uZmlnIGNoYW5nZSAobGlrZSBlbmFibGluZyBDTEkpIHJlcXVpcmVzIGEgcmVzdGFydCB0byB0YWtlIGVmZmVjdC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIHVzZSBmb3IgcG9sbGluZyBhZnRlciByZXN0YXJ0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXN0YXJ0T2JzaWRpYW4odmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBLaWxsaW5nIE9ic2lkaWFuIHByb2Nlc3MuLi4nKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhnZXRLaWxsT2JzaWRpYW5Db21tYW5kKCksIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFByb2Nlc3MgbWF5IG5vdCBiZSBydW5uaW5nIFx1MjAxNCB0aGF0J3MgZmluZS5cbiAgICB9XG5cbiAgICBhd2FpdCBkZWxheShWQVVMVF9DTE9TRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgY29uc3QgcmVzdGFydFZhdWx0SWQgPSBnZXRWYXVsdElkKHZhdWx0UGF0aCk7XG4gICAgY29uc3QgY29tbWFuZCA9IFsnb2JzaWRpYW4nLCAuLi4ocmVzdGFydFZhdWx0SWQgPyBbYHZhdWx0PSR7cmVzdGFydFZhdWx0SWR9YF0gOiBbXSksICdldmFsJywgJ2NvZGU9XCIxXCInXTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZU9ic2lkaWFuUnVubmluZ0FuZFJldHJ5KGNvbW1hbmQsIHZhdWx0UGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBFdmFsdWF0ZXMgYW4gZXhwcmVzc2lvbiwgd3JpdGVzIHRoZSByZXN1bHQgdG8gYSBKU09OIGZpbGUuXG4gKlxuICogU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBleGVjdXRlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gKiBNdXN0IE5PVCByZWZlcmVuY2UgYW55IG91dGVyIHNjb3BlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgaW52b2NhdGlvbiBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW52b2tlQW5kV3JpdGVSZXN1bHQocGFyYW1zOiBJbnZva2VBbmRXcml0ZVJlc3VsdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHdyaXRlRmlsZTogd3JpdGVSZXN1bHRGaWxlIH0gPSB3aW5kb3cucmVxdWlyZSgnbm9kZTpmcy9wcm9taXNlcycpIGFzIHR5cGVvZiBpbXBvcnQoJ25vZGU6ZnMvcHJvbWlzZXMnKTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuZXZhbHVhdGUoKTtcbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHdyaXRlUmVzdWx0RmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAndW5kZWZpbmVkJywgdmFsdWU6ICcnIH0pKTtcbiAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgYXdhaXQgd3JpdGVSZXN1bHRGaWxlKHBhcmFtcy5yZXN1bHRQYXRoLCBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdudWxsJywgdmFsdWU6ICcnIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1iYXNlLXRvLXN0cmluZyAtLSBJbnRlbnRpb25hbDogcmVzdWx0IGlzIGFuIGFyYml0cmFyeSB2YWx1ZSBmcm9tIHRoZSBldmFsdWF0ZWQgZXhwcmVzc2lvbi5cbiAgICAgIGF3YWl0IHdyaXRlUmVzdWx0RmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZTogU3RyaW5nKHJlc3VsdCkgfSkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYXdhaXQgd3JpdGVSZXN1bHRGaWxlKHBhcmFtcy5yZXN1bHRQYXRoLCBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdlcnJvcicsIHZhbHVlOiBwYXJhbXMuc2VyaWFsaXplRXJyb3IoZXJyKSB9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBkZXRhaWxlZCBkaWFnbm9zdGljIHN0cmluZyBmb3IgdGhlIFwiU2NyaXB0IGRpZCBub3QgZXhlY3V0ZVwiIGVycm9yLlxuICpcbiAqIFBlcmZvcm1zIGxpdmUgZW52aXJvbm1lbnQgY2hlY2tzIChwcm9jZXNzIGxpc3QsIHZhdWx0IHJlZ2lzdHJ5LCBDTEkgY29uZmlnKVxuICogYW5kIGluY2x1ZGVzIHRoZSBjb21tYW5kLCBleGVjIG91dHB1dCwgYW5kIHNjcmlwdCBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGlhZ25vc3RpYyBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgQSBmb3JtYXR0ZWQgZGlhZ25vc3RpYyBzdHJpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkRGlhZ25vc3RpY3MocGFyYW1zOiBCdWlsZERpYWdub3N0aWNzUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgbGluZXMucHVzaChgICBDb21tYW5kOiAke3BhcmFtcy5jb21tYW5kLmpvaW4oJyAnKX1gKTtcbiAgbGluZXMucHVzaChgICBXb3JraW5nIGRpcmVjdG9yeTogJHtwYXJhbXMuY3dkfWApO1xuICBsaW5lcy5wdXNoKGAgIFNjcmlwdCBwYXRoOiAke3BhcmFtcy5zY3JpcHRQYXRofWApO1xuICBsaW5lcy5wdXNoKGAgIEV4cGVjdGVkIHJlc3VsdCBmaWxlOiAke3BhcmFtcy5yZXN1bHRQYXRofWApO1xuXG4gIGlmIChwYXJhbXMuZXhlY1Jlc3VsdCkge1xuICAgIGxpbmVzLnB1c2goYCAgRXhpdCBjb2RlOiAke3BhcmFtcy5leGVjUmVzdWx0LmV4aXRDb2RlID09PSBudWxsID8gJyhudWxsIFx1MjAxNCBwcm9jZXNzIGRpZCBub3QgZXhpdCBub3JtYWxseSknIDogU3RyaW5nKHBhcmFtcy5leGVjUmVzdWx0LmV4aXRDb2RlKX1gKTtcbiAgICBpZiAocGFyYW1zLmV4ZWNSZXN1bHQuZXhpdFNpZ25hbCkge1xuICAgICAgbGluZXMucHVzaChgICBFeGl0IHNpZ25hbDogJHtwYXJhbXMuZXhlY1Jlc3VsdC5leGl0U2lnbmFsfWApO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmV4ZWNSZXN1bHQuc3Rkb3V0LnRyaW0oKSkge1xuICAgICAgbGluZXMucHVzaChgICBzdGRvdXQ6ICR7cGFyYW1zLmV4ZWNSZXN1bHQuc3Rkb3V0LnRyaW0oKX1gKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5leGVjUmVzdWx0LnN0ZGVyci50cmltKCkpIHtcbiAgICAgIGxpbmVzLnB1c2goYCAgc3RkZXJyOiAke3BhcmFtcy5leGVjUmVzdWx0LnN0ZGVyci50cmltKCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLmV4ZWNSZXN1bHQuc3Rkb3V0LnRyaW0oKSAmJiAhcGFyYW1zLmV4ZWNSZXN1bHQuc3RkZXJyLnRyaW0oKSkge1xuICAgICAgbGluZXMucHVzaCgnICBzdGRvdXQvc3RkZXJyOiAoZW1wdHkpJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxpbmVzLnB1c2goJyAgZXhlYyByZXN1bHQ6IChub3QgYXZhaWxhYmxlIFx1MjAxNCBPYnNpZGlhbiB3YXMgYXV0by1zdGFydGVkIGFuZCByZXRyaWVkKScpO1xuICB9XG5cbiAgbGluZXMucHVzaCgnRW52aXJvbm1lbnQgY2hlY2tzOicpO1xuICBsaW5lcy5wdXNoKGAgIE9ic2lkaWFuIHJ1bm5pbmc6ICR7YXdhaXQgaXNPYnNpZGlhblJ1bm5pbmcoKSA/ICd5ZXMnIDogJ05PJ31gKTtcbiAgbGluZXMucHVzaChgICBDTEkgZW5hYmxlZCBpbiBvYnNpZGlhbi5qc29uOiAke2lzQ2xpRW5hYmxlZCgpID8gJ3llcycgOiAnTk8nfWApO1xuICBsaW5lcy5wdXNoKGAgIFZhdWx0IHJlZ2lzdGVyZWQ6ICR7aXNWYXVsdFJlZ2lzdGVyZWQocGFyYW1zLmN3ZCkgPyAneWVzJyA6ICdOTyd9YCk7XG4gIGxpbmVzLnB1c2goYCAgU2NyaXB0IGZpbGUgZXhpc3RzOiAke2V4aXN0c1N5bmMocGFyYW1zLnNjcmlwdFBhdGgpID8gJ3llcycgOiAnbm8gKGFscmVhZHkgY2xlYW5lZCB1cCknfWApO1xuICBsaW5lcy5wdXNoKGAgIFJlc3VsdCBmaWxlIGV4aXN0czogJHtleGlzdHNTeW5jKHBhcmFtcy5yZXN1bHRQYXRoKSA/ICd5ZXMnIDogJ25vJ31gKTtcblxuICBjb25zdCByZWdpc3RlcmVkVmF1bHRzID0gZ2V0UmVnaXN0ZXJlZFZhdWx0cygpO1xuICBpZiAocmVnaXN0ZXJlZFZhdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICBsaW5lcy5wdXNoKCcgIFJlZ2lzdGVyZWQgdmF1bHRzOiAobm9uZSknKTtcbiAgfSBlbHNlIHtcbiAgICBsaW5lcy5wdXNoKCcgIFJlZ2lzdGVyZWQgdmF1bHRzOicpO1xuICAgIGZvciAoY29uc3QgdmF1bHQgb2YgcmVnaXN0ZXJlZFZhdWx0cykge1xuICAgICAgbGluZXMucHVzaChgICAgIC0gJHt2YXVsdC5wYXRofSAob3BlbjogJHtTdHJpbmcodmF1bHQub3Blbil9KWApO1xuICAgIH1cbiAgfVxuXG4gIGxpbmVzLnB1c2goYCAgU2NyaXB0IGNvbnRlbnQ6XFxuJHtwYXJhbXMuc2NyaXB0Q29udGVudH1gKTtcblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb250ZW50IG9mIGEgdGVtcG9yYXJ5IHNjcmlwdCBmaWxlLlxuICpcbiAqIFNlcmlhbGl6ZXMge0BsaW5rIGludm9rZUFuZFdyaXRlUmVzdWx0fSBpbnRvIGEgc2VsZi1jb250YWluZWQgSUlGRSB0aGF0XG4gKiBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24sIHdyaXRlcyB0aGUgcmVzdWx0IChvciBlcnJvcikgdG8gYHJlc3VsdFBhdGhgLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS5cbiAqIEBwYXJhbSByZXN1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHJlc3VsdCBmaWxlLlxuICogQHJldHVybnMgVGhlIHNjcmlwdCBmaWxlIGNvbnRlbnQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2NyaXB0RmlsZShleHByZXNzaW9uOiBzdHJpbmcsIHJlc3VsdFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGZuU3RyID0gZ2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nKGludm9rZUFuZFdyaXRlUmVzdWx0KTtcbiAgY29uc3Qgc2VyaWFsaXplRXJyb3JTdHIgPSBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcoc2VyaWFsaXplRXJyb3IpO1xuICBjb25zdCByZXN1bHRQYXRoSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgcmV0dXJuIGAoJHtmblN0cn0pKHsgZXZhbHVhdGU6IGFzeW5jICgpID0+ICgke2V4cHJlc3Npb259KSwgcmVzdWx0UGF0aDogJHtyZXN1bHRQYXRoSnNvbn0sIHNlcmlhbGl6ZUVycm9yOiAke3NlcmlhbGl6ZUVycm9yU3RyfSB9KWA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBzY3JpcHQgZmlsZSBmcm9tIGRpc2ssIGxvZ3MgaXRzIGNvbnRlbnQsIGFuZCBleGVjdXRlcyBpdCB2aWEgYG5ldyBGdW5jdGlvbmAuXG4gKlxuICogU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBleGVjdXRlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gKiBNdXN0IE5PVCByZWZlcmVuY2UgYW55IG91dGVyIHNjb3BlLlxuICpcbiAqIEBwYXJhbSBzY3JpcHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHNjcmlwdCBmaWxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlU2NyaXB0RmlsZShzY3JpcHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZnNQcm9taXNlcyA9IHdpbmRvdy5yZXF1aXJlKCdub2RlOmZzL3Byb21pc2VzJykgYXMgdHlwZW9mIGltcG9ydCgnbm9kZTpmcy9wcm9taXNlcycpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgZnNQcm9taXNlcy5hY2Nlc3Moc2NyaXB0UGF0aCk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZmlsZSBub3QgZm91bmQ6ICR7c2NyaXB0UGF0aH1gLCB7IGNhdXNlIH0pO1xuICB9XG5cbiAgY29uc3Qgc2NyaXB0ID0gYXdhaXQgZnNQcm9taXNlcy5yZWFkRmlsZShzY3JpcHRQYXRoLCAndXRmLTgnKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGUgLS0gRGlhZ25vc3RpYyBsb2dnaW5nIGluc2lkZSBPYnNpZGlhbiBwcm9jZXNzOyBubyBsb2dnZXIgYXZhaWxhYmxlLlxuICBjb25zb2xlLmRlYnVnKGBFeGVjdXRpbmcgJHtzY3JpcHRQYXRofTpcXG4ke3NjcmlwdH1gKTtcblxuICBsZXQgZm46ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHRyeSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbXBsaWVkLWV2YWwsIG5vLW5ldy1mdW5jIC0tIFRoZSBzY3JpcHQgaXMgYSB0cnVzdGVkLCBzZWxmLWdlbmVyYXRlZCBJSUZFIGV4cHJlc3Npb24uXG4gICAgZm4gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAke3NjcmlwdH1gKSBhcyAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcGFyc2luZyAke3NjcmlwdFBhdGh9YCwgeyBjYXVzZSB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgZm4oKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGV4ZWN1dGluZyAke3NjcmlwdFBhdGh9YCwgeyBjYXVzZSB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNvbW1hbmQgdG8ga2lsbCB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldEtpbGxPYnNpZGlhbkNvbW1hbmQoKTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gJ3Rhc2traWxsIC9JTSBPYnNpZGlhbi5leGUgL0YnO1xuICB9XG5cbiAgcmV0dXJuICdwa2lsbCAtZiBPYnNpZGlhbic7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBsYXVuY2ggdGhlIE9ic2lkaWFuIGJpbmFyeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCgpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnN0IGxvY2FsQXBwRGF0YSA9IHByb2Nlc3MuZW52WydMT0NBTEFQUERBVEEnXSA/PyAnJztcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke2xvY2FsQXBwRGF0YX1cXFxcUHJvZ3JhbXNcXFxcT2JzaWRpYW5cXFxcT2JzaWRpYW4uZXhlXCJgO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuICcvQXBwbGljYXRpb25zL09ic2lkaWFuLmFwcC9Db250ZW50cy9NYWNPUy9PYnNpZGlhbiAmJztcbiAgfVxuXG4gIHJldHVybiAnb2JzaWRpYW4gJic7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBvcGVuIGEgVVJJLlxuICpcbiAqIEBwYXJhbSB1cmkgLSBUaGUgVVJJIHRvIG9wZW4uXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldE9wZW5VcmlDb21tYW5kKHVyaTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke3VyaX1cImA7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICByZXR1cm4gYG9wZW4gXCIke3VyaX1cImA7XG4gIH1cblxuICByZXR1cm4gYHhkZy1vcGVuIFwiJHt1cml9XCJgO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBPYnNpZGlhbiBwcm9jZXNzIGlzIGN1cnJlbnRseSBydW5uaW5nLlxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgT2JzaWRpYW4gcHJvY2VzcyBpcyBmb3VuZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzT2JzaWRpYW5SdW5uaW5nKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjb21tYW5kID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICAgID8gJ3Rhc2tsaXN0IC9GSSBcIklNQUdFTkFNRSBlcSBPYnNpZGlhbi5leGVcIiAvTkgnXG4gICAgOiAncGdyZXAgLWYgT2JzaWRpYW4nO1xuICB0cnkge1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICByZXR1cm4gb3V0cHV0LmluY2x1ZGVzKCdPYnNpZGlhbi5leGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dC50cmltKCkubGVuZ3RoID4gMDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogT3BlbnMgYSB2YXVsdCBpbiBPYnNpZGlhbiB1c2luZyB0aGUgYG9ic2lkaWFuOi8vb3BlbmAgVVJJIHByb3RvY29sLlxuICpcbiAqIFRoaXMgd29ya3Mgd2hldGhlciBPYnNpZGlhbiBpcyBhbHJlYWR5IHJ1bm5pbmcgKHNpZ25hbHMgaXQgdG8gb3BlbiB0aGUgdmF1bHQpXG4gKiBvciBub3QgKGxhdW5jaGVzIE9ic2lkaWFuIHdpdGggdGhlIHZhdWx0KS4gVGhlIFVSSSBwcm90b2NvbCBpcyBoYW5kbGVkIGJ5IHRoZVxuICogT1MsIHdoaWNoIHJvdXRlcyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBPYnNpZGlhbiBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBvcGVuVmF1bHRWaWFVcmkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgaWYgKCF2YXVsdElkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3BlbiB2YXVsdCB2aWEgVVJJOiB2YXVsdCBpcyBub3QgcmVnaXN0ZXJlZCBpbiBvYnNpZGlhbi5qc29uOiAke3ZhdWx0UGF0aH1gKTtcbiAgfVxuICBjb25zdCB1cmkgPSBgb2JzaWRpYW46Ly9vcGVuP3ZhdWx0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhdWx0SWQpfWA7XG4gIGNvbnN0IGNvbW1hbmQgPSBnZXRPcGVuVXJpQ29tbWFuZCh1cmkpO1xuICBsb2coYFtjbGktdHJhbnNwb3J0XSBPcGVuaW5nIHZhdWx0IHZpYSBVUkk6ICR7dXJpfWApO1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFVSSSBvcGVuIGZhaWxlZCAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQSxxQkFBMkI7QUFDM0Isc0JBS087QUFDUCxxQkFBdUI7QUFDdkIsdUJBQXFCO0FBQ3JCLDBCQUFvQjtBQVFwQixrQkFBcUI7QUFDckIsaUNBQTRDO0FBQzVDLGlCQUFvQjtBQUNwQixpQ0FBNEM7QUFDNUMsa0JBQXFCO0FBQ3JCLDZCQVVPO0FBQ1AsNkJBQStCO0FBb0IvQixNQUFNLDBC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
508
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0IH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcgfSBmcm9tICcuL2Z1bmN0aW9uLWV4cHJlc3Npb24uY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQgfSBmcm9tICcuL25hbWVzcGFjZS1ib290c3RyYXAuY2pzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuL25vb3AuY2pzJztcbmltcG9ydCB7XG4gIGVuYWJsZUNsaUluQ29uZmlnLFxuICBnZXRBbnlSZWdpc3RlcmVkVmF1bHRQYXRoLFxuICBnZXRSZWdpc3RlcmVkVmF1bHRzLFxuICBnZXRWYXVsdElkLFxuICBpc0NsaUVuYWJsZWQsXG4gIGlzVmF1bHRPcGVuLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZCxcbiAgcmVnaXN0ZXJWYXVsdEluQ29uZmlnLFxuICByZW1vdmVWYXVsdEZyb21Db25maWdcbn0gZnJvbSAnLi9vYnNpZGlhbi1jb25maWcuY2pzJztcbmltcG9ydCB7IHNlcmlhbGl6ZUVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemUtZXJyb3IuY2pzJztcblxuaW50ZXJmYWNlIEV4ZWN1dGVTY3JpcHRGaWxlRnNQcm9taXNlcyB7XG4gIGFjY2VzcyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICByZWFkRmlsZShwYXRoOiBzdHJpbmcsIGVuY29kaW5nOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbmludGVyZmFjZSBJbnZva2VBbmRXcml0ZVJlc3VsdEZzUHJvbWlzZXMge1xuICB3cml0ZUZpbGUocGF0aDogc3RyaW5nLCBkYXRhOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgSW52b2tlQW5kV3JpdGVSZXN1bHRQYXJhbXMge1xuICBldmFsdWF0ZSgpOiBQcm9taXNlPHVua25vd24+O1xuICByZXN1bHRQYXRoOiBzdHJpbmc7XG4gIHNlcmlhbGl6ZUVycm9yKGVycm9yOiB1bmtub3duKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgZW52ZWxvcGUgd3JpdHRlbiBieSB0aGUgdGVtcG9yYXJ5IHNjcmlwdCBmaWxlLlxuICpcbiAqIC0gYHsgdmFsdWU6IHN0cmluZywgdHlwZTogJ2Vycm9yJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gdGhyZXc7IGB2YWx1ZWAgaXMgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ251bGwnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgbnVsbGAuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ3VuZGVmaW5lZCcgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHJldHVybmVkIGB1bmRlZmluZWRgLlxuICogLSBgeyB2YWx1ZTogc3RyaW5nIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBhIHN0cmluZyB2YWx1ZSAobm8gYHR5cGVgIGZpZWxkKS5cbiAqL1xudHlwZSBTY3JpcHRSZXN1bHRFbnZlbG9wZSA9XG4gIHwgeyB0eXBlOiAnZXJyb3InIHwgJ251bGwnIHwgJ3VuZGVmaW5lZCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdmFsdWU6IHN0cmluZyB9O1xuXG5jb25zdCBVTkFCTEVfVE9fRklORF9PQlNJRElBTiA9ICd1bmFibGUgdG8gZmluZCBPYnNpZGlhbic7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwMDtcblxuaW50ZXJmYWNlIEJ1aWxkRGlhZ25vc3RpY3NQYXJhbXMge1xuICBjb21tYW5kOiBzdHJpbmdbXTtcbiAgY3dkOiBzdHJpbmc7XG4gIGV4ZWNSZXN1bHQ6IEV4ZWNSZXN1bHQgfCB1bmRlZmluZWQ7XG4gIHJlc3VsdFBhdGg6IHN0cmluZztcbiAgc2NyaXB0Q29udGVudDogc3RyaW5nO1xuICBzY3JpcHRQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHJhbnNwb3J0IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggRGVza3RvcCBPYnNpZGlhbiB2aWEgdGhlIGBvYnNpZGlhbiBldmFsYCBDTEkgY29tbWFuZFxuICogYW5kIG1hbmFnZXMgdmF1bHRzIHZpYSBFbGVjdHJvbiBJUEMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXNrdG9wQ2xpVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYGZhbHNlYCBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgYG9ic2lkaWFuIGV2YWxgLlxuICAgKlxuICAgKiBXcml0ZXMgdGhlIGV4cHJlc3Npb24gdG8gYSB0ZW1wb3JhcnkgYC5janNgIGZpbGUgYW5kIGV4ZWN1dGVzIGEgdGlueVxuICAgKiBgcmVxdWlyZSgpLmludm9rZSgpYCBjYWxsIHZpYSB0aGUgQ0xJLiBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gYVxuICAgKiBgLnJlc3VsdC5qc29uYCBmaWxlIGJ5IHRoZSBzY3JpcHQsIGF2b2lkaW5nIENMSSBzdGRvdXQgc2l6ZSBsaW1pdHNcbiAgICogYW5kIElQQyBidWZmZXIgaXNzdWVzLlxuICAgKlxuICAgKiBIYW5kbGVzIGF1dG8tc3RhcnQ6IGlmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBsYXVuY2hlcyBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCByZXRyaWVzIHVudGlsIGl0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nICh0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZml4ZXMgc3RyaXBwZWQpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICBjb25zdCBzY3JpcHRJZCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgY29uc3Qgc2NyaXB0RGlyID0gam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnKTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5qc2ApO1xuICAgIGNvbnN0IHJlc3VsdFBhdGggPSBqb2luKHNjcmlwdERpciwgYCR7c2NyaXB0SWR9LnJlc3VsdC5qc29uYCk7XG5cbiAgICBhd2FpdCBta2RpcihzY3JpcHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3Qgc2NyaXB0Q29udGVudCA9IGJ1aWxkU2NyaXB0RmlsZShleHByZXNzaW9uLCByZXN1bHRQYXRoKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoc2NyaXB0UGF0aCwgc2NyaXB0Q29udGVudCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FmZVNjcmlwdFBhdGggPSBzY3JpcHRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIGNvbnN0IGNsaUV4cHIgPSBgKCR7Z2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nKGV4ZWN1dGVTY3JpcHRGaWxlKX0pKCR7SlNPTi5zdHJpbmdpZnkoc2FmZVNjcmlwdFBhdGgpfSlgO1xuICAgICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQob3B0aW9ucy5jd2QpO1xuICAgICAgY29uc3QgY29tbWFuZCA9IFsnb2JzaWRpYW4nLCAuLi4odmF1bHRJZCA/IFtgdmF1bHQ9JHt2YXVsdElkfWBdIDogW10pLCAnZXZhbCcsICctLWFsbG93LWZvY3VzLXN0ZWFsJywgYGNvZGU9JHtjbGlFeHByfWBdO1xuXG4gICAgICBsZXQgZXhlY1Jlc3VsdDogRXhlY1Jlc3VsdCB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4ZWNSZXN1bHQgPSBhd2FpdCBleGVjKGNvbW1hbmQsIHtcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgICAgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWUsXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kLCBvcHRpb25zLmN3ZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gYXdhaXQgYnVpbGREaWFnbm9zdGljcyh7XG4gICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGV4ZWNSZXN1bHQsXG4gICAgICAgICAgcmVzdWx0UGF0aCxcbiAgICAgICAgICBzY3JpcHRDb250ZW50LFxuICAgICAgICAgIHNjcmlwdFBhdGhcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGRpZCBub3QgZXhlY3V0ZSBmb3IgcGF0aDogJHtvcHRpb25zLmN3ZH1cXG4ke2RpYWdub3N0aWNzfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRTdHIgPSBhd2FpdCByZWFkRmlsZShyZXN1bHRQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShyZXN1bHRTdHIpIGFzIFNjcmlwdFJlc3VsdEVudmVsb3BlO1xuXG4gICAgICBpZiAoJ3R5cGUnIGluIGVudmVsb3BlKSB7XG4gICAgICAgIGlmIChlbnZlbG9wZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZXJyb3IgaW4gT2JzaWRpYW4gZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9OiAke2VudmVsb3BlLnZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudmVsb3BlLnZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB1bmxpbmsoc2NyaXB0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgICBhd2FpdCB1bmxpbmsocmVzdWx0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ0xJLXNwZWNpZmljIHByZWZsaWdodCBjaGVja3MuXG4gICAqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsIENMSSBpcyBlbmFibGVkIGluIE9ic2lkaWFuIHNldHRpbmdzLFxuICAgKiBhbmQgdGhlIGBvYnNpZGlhbmAgQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gUEFUSC4gSWYgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWRcbiAgICogYnV0IG5vdCBvcGVuLCBvcGVucyBpdCB2aWEgVVJJIHByb3RvY29sIGFuZCBwb2xscyB1bnRpbCBpdCBpcyByZWFkeS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBWYXVsdC5yZWdpc3RlcigpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NsaUVuYWJsZWQoKSkge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gQ0xJIGlzIGRpc2FibGVkIGluIG9ic2lkaWFuLmpzb24uIEVuYWJsaW5nIGFuZCByZXN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG4gICAgICBlbmFibGVDbGlJbkNvbmZpZygpO1xuICAgICAgYXdhaXQgdGhpcy5yZXN0YXJ0T2JzaWRpYW4odmF1bHRQYXRoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFzc2VydENsaUF2YWlsYWJsZSgpO1xuXG4gICAgaWYgKCFpc1ZhdWx0T3Blbih2YXVsdFBhdGgpKSB7XG4gICAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBWYXVsdCBpcyByZWdpc3RlcmVkIGJ1dCBub3Qgb3BlbjogJHt2YXVsdFBhdGh9LiBPcGVuaW5nIHZpYSBVUkkuLi5gKTtcbiAgICAgIGF3YWl0IG9wZW5WYXVsdFZpYVVyaSh2YXVsdFBhdGgpO1xuICAgICAgYXdhaXQgdGhpcy5wb2xsVmF1bHRSZWFkeSh2YXVsdFBhdGgpO1xuICAgIH1cblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFByZWZsaWdodCBjaGVjayBwYXNzZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgaW4gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UgdmlhIEVsZWN0cm9uIElQQy5cbiAgICpcbiAgICogVXNlcyBgdmF1bHQtb3BlbmAgSVBDIHRvIHJlZ2lzdGVyIGFuZCBvcGVuIHRoZSB2YXVsdCwgdGhlbiBwb2xscyB1bnRpbFxuICAgKiB0aGUgdmF1bHQncyBDTEkgaXMgcmVhZHkgYW5kIGBnZXRCYXNlUGF0aCgpYCBtYXRjaGVzIGB2YXVsdFBhdGhgLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUmVnaXN0ZXJpbmcgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGNvbnN0IGV4aXN0aW5nVmF1bHRQYXRoID0gZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCgpO1xuXG4gICAgaWYgKGV4aXN0aW5nVmF1bHRQYXRoKSB7XG4gICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgZXhpc3RpbmdWYXVsdFBhdGgpO1xuICAgICAgY29uc3QgcmVnaXN0ZXJFeHByID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmlwY1NlbmRTeW5jKCR7SlNPTi5zdHJpbmdpZnkoeyBhcmdzOiBbdmF1bHRQYXRoLCBmYWxzZV0sIGNoYW5uZWw6ICd2YXVsdC1vcGVuJyB9KX0pYDtcbiAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUocmVnaXN0ZXJFeHByLCB7IGN3ZDogZXhpc3RpbmdWYXVsdFBhdGggfSk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIGV4aXN0aW5nVmF1bHRQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gTm8gZXhpc3RpbmcgdmF1bHQgcmVnaXN0ZXJlZC4gV3JpdGluZyB2YXVsdCBlbnRyeSBkaXJlY3RseSB0byBvYnNpZGlhbi5qc29uLi4uJyk7XG4gICAgICByZWdpc3RlclZhdWx0SW5Db25maWcodmF1bHRQYXRoKTtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IGVudHJ5IHdyaXR0ZW4uIE9wZW5pbmcgdmF1bHQgdmlhIFVSSSBwcm90b2NvbC4uLicpO1xuICAgICAgYXdhaXQgb3BlblZhdWx0VmlhVXJpKHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLnBvbGxWYXVsdFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucG9sbFZhdWx0UmVhZHkodmF1bHRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IGZyb20gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gICAqXG4gICAqIFNjaGVkdWxlcyB0aGUgdmF1bHQgd2luZG93IHRvIGNsb3NlLCB3YWl0cywgdGhlbiByZW1vdmVzIHRoZSB2YXVsdFxuICAgKiBmcm9tIHRoZSByZWdpc3RyeSB2aWEgYHZhdWx0LXJlbW92ZWAgSVBDLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBVbnJlZ2lzdGVyaW5nIHZhdWx0OiBjbG9zaW5nIHdpbmRvdyBmb3IgJHt2YXVsdFBhdGh9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgICAgY29uc3QgZGVzdHJveUV4cHIgPSAnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuZGVzdHJveUN1cnJlbnRXaW5kb3coKSc7XG4gICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGRlc3Ryb3lFeHByLCB7IGN3ZDogdmF1bHRQYXRoLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBXaW5kb3cgZGVzdHJveSBjb21tYW5kIHNlbnQuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFdpbmRvdyBkZXN0cm95IGZhaWxlZCAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igd2luZG93IHRvIGNsb3NlLi4uJyk7XG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGZyb20gcmVnaXN0cnkuLi4nKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCA9IGdldEFueVJlZ2lzdGVyZWRWYXVsdFBhdGgoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGV4aXN0aW5nVmF1bHRGb3JSZW1vdmFsKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZUV4cHIgPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGFyZ3M6IFt2YXVsdFBhdGhdLCBjaGFubmVsOiAndmF1bHQtcmVtb3ZlJyB9KX0pYDtcbiAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShyZW1vdmVFeHByLCB7IGN3ZDogZXhpc3RpbmdWYXVsdEZvclJlbW92YWwsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE5vIGV4aXN0aW5nIHZhdWx0IHRvIHRhcmdldCBmb3IgcmVtb3ZhbCBJUEMgXHUyMDE0IHJlbW92aW5nIGRpcmVjdGx5IGZyb20gb2JzaWRpYW4uanNvbi4nKTtcbiAgICAgICAgcmVtb3ZlVmF1bHRGcm9tQ29uZmlnKHZhdWx0UGF0aCk7XG4gICAgICB9XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCByZW1vdmVkIGZyb20gcmVnaXN0cnkuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlZ2lzdHJ5IHJlbW92YWwgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIENMSSBiaW5hcnkgaXMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0gUEFUSC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZXJ0Q2xpQXZhaWxhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ3doZXJlLmV4ZSBvYnNpZGlhbicgOiAnd2hpY2ggb2JzaWRpYW4nO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2JzaWRpYW4gQ0xJIGlzIG5vdCBhdmFpbGFibGUuIEVuc3VyZSBPYnNpZGlhbiBpcyBpbnN0YWxsZWQgYW5kIGl0cyBDTEkgaXMgaW4geW91ciBQQVRILicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQ2xpY2tzIHRoZSBcIlRydXN0IGF1dGhvciBhbmQgZW5hYmxlIHBsdWdpbnNcIiBidXR0b24gKGAubW9kLWN0YWApIGluc2lkZSBhbnlcbiAgICogbW9kYWwgd2hvc2UgdGV4dCBpbmNsdWRlcyBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yXCIuIFRoaXMgaXMgbmVlZGVkIHdoZW4gYVxuICAgKiB2YXVsdCB3aXRoIGNvbW11bml0eSBwbHVnaW5zIGlzIG9wZW5lZCB3aXRob3V0IGEgcHJpb3IgYGVuYWJsZS1wbHVnaW4tPGlkPmBcbiAgICogZW50cnkgaW4gbG9jYWxTdG9yYWdlIChlLmcuLCB0aGUgdmVyeSBmaXJzdCB2YXVsdCByZWdpc3RlcmVkIHZpYSBjb25maWcgZmlsZSkuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgY29uc3QgZGlzbWlzc0V4cHIgPSBgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG1vZGFscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb2RhbC1jb250YWluZXInKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChtb2RhbHNbaV0udGV4dENvbnRlbnQuaW5jbHVkZXMoJ0RvIHlvdSB0cnVzdCB0aGUgYXV0aG9yJykpIHtcbiAgICAgICAgICB2YXIgYnRuID0gbW9kYWxzW2ldLnF1ZXJ5U2VsZWN0b3IoJy5tb2QtY3RhJyk7XG4gICAgICAgICAgaWYgKGJ0bikgeyBidG4uY2xpY2soKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pKClgO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoZGlzbWlzc0V4cHIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gJ3RydWUnKSB7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBEaXNtaXNzZWQgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvclwiIGRpYWxvZy4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBgZW5hYmxlLXBsdWdpbi08dmF1bHRJZD5gIGluIE9ic2lkaWFuJ3MgbG9jYWxTdG9yYWdlIHRvIHByZXZlbnRcbiAgICogdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgZnJvbSBhcHBlYXJpbmdcbiAgICogd2hlbiBhIHZhdWx0IHdpdGggY29tbXVuaXR5IHBsdWdpbnMgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICpcbiAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGB2YXVsdC1vcGVuYCBJUEMgKHNvIHRoZSB2YXVsdCBJRCBleGlzdHMgaW5cbiAgICogYG9ic2lkaWFuLmpzb25gKSBhbmQgYmVmb3JlIHRoZSBuZXcgdmF1bHQgd2luZG93IGZpbmlzaGVzIGxvYWRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKiBAcGFyYW0gZXZhbFRhcmdldFZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIHVzZSBhcyBldmFsIHRhcmdldCAoYW4gZXhpc3RpbmcsIGxvYWRlZCB2YXVsdCkuXG4gICAqICAgbG9jYWxTdG9yYWdlIGlzIHNoYXJlZCBhY3Jvc3MgYWxsIE9ic2lkaWFuIHdpbmRvd3MgKHNhbWUgRWxlY3Ryb24gb3JpZ2luKSwgc28gdGhlXG4gICAqICAgYGxvY2FsU3RvcmFnZS5zZXRJdGVtYCBjYWxsIGNhbiBydW4gaW4gYW55IGxvYWRlZCB2YXVsdCB3aW5kb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGg6IHN0cmluZywgZXZhbFRhcmdldFZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBpZiAoIXZhdWx0SWQpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIENvdWxkIG5vdCBmaW5kIHZhdWx0IElEIFx1MjAxNCBza2lwcGluZyBsb2NhbFN0b3JhZ2UgdHJ1c3QgZmxhZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgZXZhbFRhcmdldFZhdWx0UGF0aCk7XG4gICAgY29uc3QgZW5hYmxlRXhwciA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5zZXRMb2NhbFN0b3JhZ2VJdGVtKCR7SlNPTi5zdHJpbmdpZnkoeyBrZXk6IGBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH1gLCB2YWx1ZTogJ3RydWUnIH0pfSlgO1xuICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZW5hYmxlRXhwciwgeyBjd2Q6IGV2YWxUYXJnZXRWYXVsdFBhdGggfSk7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgT2JzaWRpYW4gYmluYXJ5IGFuZCByZXRyaWVzIHRoZSBldmFsIHVudGlsIGl0IHJlc3BvbmRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBDTEkgY29tbWFuZCBhcnJheSB0byByZXRyeS5cbiAgICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZDogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcuIFN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGxhdW5jaCBjb21tYW5kIG1heSBmYWlsIG9uIHNvbWUgc3lzdGVtcyBcdTIwMTQgd2UnbGwgc3RpbGwgdHJ5IHBvbGxpbmcuXG4gICAgfVxuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgT2JzaWRpYW4gQ0xJICh0aW1lb3V0PSR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgZGVsYXkoQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgY3dkLCBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBDTEkgcmVzcG9uZGVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gbm90IHJlYWR5IHlldCwgcmV0cnlpbmcuLi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHVudGlsIHRoZSB2YXVsdCBpcyByZWFkeSBhbmQgcmVzcG9uZGluZyB0byBldmFsIGNhbGxzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcG9sbFZhdWx0UmVhZHkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb2xsRXhwciA9ICd3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5wb2xsVmF1bHRCYXNlUGF0aCgpJztcblxuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIHZhdWx0IHJlYWRpbmVzcyAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIGxldCBpc0Jvb3RzdHJhcHBlZCA9IGZhbHNlO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghaXNCb290c3RyYXBwZWQpIHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgICAgICBpc0Jvb3RzdHJhcHBlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBhd2FpdCB0aGlzLmV2YWx1YXRlKHBvbGxFeHByLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgICAgICBpZiAoSlNPTi5wYXJzZShiYXNlUGF0aCkgPT09IHZhdWx0UGF0aCkge1xuICAgICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IGlzIHJlYWR5LicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFZhdWx0IG5vdCByZWFkeSB5ZXQgXHUyMDE0IG5hbWVzcGFjZSBtYXkgbm90IGJlIGJvb3RzdHJhcHBlZCB5ZXQgZWl0aGVyLlxuICAgICAgICBpc0Jvb3RzdHJhcHBlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0YXJ0cyBPYnNpZGlhbiBieSBraWxsaW5nIHRoZSBydW5uaW5nIHByb2Nlc3MgYW5kIHJlbGF1bmNoaW5nIGl0LlxuICAgKlxuICAgKiBVc2VkIHdoZW4gYSBjb25maWcgY2hhbmdlIChsaWtlIGVuYWJsaW5nIENMSSkgcmVxdWlyZXMgYSByZXN0YXJ0IHRvIHRha2UgZWZmZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdXNlIGZvciBwb2xsaW5nIGFmdGVyIHJlc3RhcnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc3RhcnRPYnNpZGlhbih2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIEtpbGxpbmcgT2JzaWRpYW4gcHJvY2Vzcy4uLicpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGdldEtpbGxPYnNpZGlhbkNvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gUHJvY2VzcyBtYXkgbm90IGJlIHJ1bm5pbmcgXHUyMDE0IHRoYXQncyBmaW5lLlxuICAgIH1cblxuICAgIGF3YWl0IGRlbGF5KFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICBjb25zdCByZXN0YXJ0VmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBjb25zdCBjb21tYW5kID0gWydvYnNpZGlhbicsIC4uLihyZXN0YXJ0VmF1bHRJZCA/IFtgdmF1bHQ9JHtyZXN0YXJ0VmF1bHRJZH1gXSA6IFtdKSwgJ2V2YWwnLCAnY29kZT1cIjFcIiddO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZCwgdmF1bHRQYXRoKTtcbiAgfVxufVxuXG4vKipcbiAqIEV2YWx1YXRlcyBhbiBleHByZXNzaW9uLCB3cml0ZXMgdGhlIHJlc3VsdCB0byBhIEpTT04gZmlsZS5cbiAqXG4gKiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBpbnZvY2F0aW9uIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnZva2VBbmRXcml0ZVJlc3VsdChwYXJhbXM6IEludm9rZUFuZFdyaXRlUmVzdWx0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSB3aW5kb3cuYXBwIGlzIHNldCBieSBPYnNpZGlhbiBhdCBydW50aW1lLlxuICBjb25zdCBmc1Byb21pc2VzID0gUmVmbGVjdC5nZXQod2luZG93LmFwcC52YXVsdC5hZGFwdGVyLCAnZnNQcm9taXNlcycpIGFzIEludm9rZUFuZFdyaXRlUmVzdWx0RnNQcm9taXNlcztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuZXZhbHVhdGUoKTtcbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IGZzUHJvbWlzZXMud3JpdGVGaWxlKHBhcmFtcy5yZXN1bHRQYXRoLCBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICd1bmRlZmluZWQnLCB2YWx1ZTogJycgfSkpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBhd2FpdCBmc1Byb21pc2VzLndyaXRlRmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnbnVsbCcsIHZhbHVlOiAnJyB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmcgLS0gSW50ZW50aW9uYWw6IHJlc3VsdCBpcyBhbiBhcmJpdHJhcnkgdmFsdWUgZnJvbSB0aGUgZXZhbHVhdGVkIGV4cHJlc3Npb24uXG4gICAgICBhd2FpdCBmc1Byb21pc2VzLndyaXRlRmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZTogU3RyaW5nKHJlc3VsdCkgfSkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYXdhaXQgZnNQcm9taXNlcy53cml0ZUZpbGUocGFyYW1zLnJlc3VsdFBhdGgsIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ2Vycm9yJywgdmFsdWU6IHBhcmFtcy5zZXJpYWxpemVFcnJvcihlcnIpIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGRldGFpbGVkIGRpYWdub3N0aWMgc3RyaW5nIGZvciB0aGUgXCJTY3JpcHQgZGlkIG5vdCBleGVjdXRlXCIgZXJyb3IuXG4gKlxuICogUGVyZm9ybXMgbGl2ZSBlbnZpcm9ubWVudCBjaGVja3MgKHByb2Nlc3MgbGlzdCwgdmF1bHQgcmVnaXN0cnksIENMSSBjb25maWcpXG4gKiBhbmQgaW5jbHVkZXMgdGhlIGNvbW1hbmQsIGV4ZWMgb3V0cHV0LCBhbmQgc2NyaXB0IGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkaWFnbm9zdGljIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBBIGZvcm1hdHRlZCBkaWFnbm9zdGljIHN0cmluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGREaWFnbm9zdGljcyhwYXJhbXM6IEJ1aWxkRGlhZ25vc3RpY3NQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICBsaW5lcy5wdXNoKGAgIENvbW1hbmQ6ICR7cGFyYW1zLmNvbW1hbmQuam9pbignICcpfWApO1xuICBsaW5lcy5wdXNoKGAgIFdvcmtpbmcgZGlyZWN0b3J5OiAke3BhcmFtcy5jd2R9YCk7XG4gIGxpbmVzLnB1c2goYCAgU2NyaXB0IHBhdGg6ICR7cGFyYW1zLnNjcmlwdFBhdGh9YCk7XG4gIGxpbmVzLnB1c2goYCAgRXhwZWN0ZWQgcmVzdWx0IGZpbGU6ICR7cGFyYW1zLnJlc3VsdFBhdGh9YCk7XG5cbiAgaWYgKHBhcmFtcy5leGVjUmVzdWx0KSB7XG4gICAgbGluZXMucHVzaChgICBFeGl0IGNvZGU6ICR7cGFyYW1zLmV4ZWNSZXN1bHQuZXhpdENvZGUgPT09IG51bGwgPyAnKG51bGwgXHUyMDE0IHByb2Nlc3MgZGlkIG5vdCBleGl0IG5vcm1hbGx5KScgOiBTdHJpbmcocGFyYW1zLmV4ZWNSZXN1bHQuZXhpdENvZGUpfWApO1xuICAgIGlmIChwYXJhbXMuZXhlY1Jlc3VsdC5leGl0U2lnbmFsKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgIEV4aXQgc2lnbmFsOiAke3BhcmFtcy5leGVjUmVzdWx0LmV4aXRTaWduYWx9YCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZXhlY1Jlc3VsdC5zdGRvdXQudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgIHN0ZG91dDogJHtwYXJhbXMuZXhlY1Jlc3VsdC5zdGRvdXQudHJpbSgpfWApO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmV4ZWNSZXN1bHQuc3RkZXJyLnRyaW0oKSkge1xuICAgICAgbGluZXMucHVzaChgICBzdGRlcnI6ICR7cGFyYW1zLmV4ZWNSZXN1bHQuc3RkZXJyLnRyaW0oKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMuZXhlY1Jlc3VsdC5zdGRvdXQudHJpbSgpICYmICFwYXJhbXMuZXhlY1Jlc3VsdC5zdGRlcnIudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKCcgIHN0ZG91dC9zdGRlcnI6IChlbXB0eSknKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGluZXMucHVzaCgnICBleGVjIHJlc3VsdDogKG5vdCBhdmFpbGFibGUgXHUyMDE0IE9ic2lkaWFuIHdhcyBhdXRvLXN0YXJ0ZWQgYW5kIHJldHJpZWQpJyk7XG4gIH1cblxuICBsaW5lcy5wdXNoKCdFbnZpcm9ubWVudCBjaGVja3M6Jyk7XG4gIGxpbmVzLnB1c2goYCAgT2JzaWRpYW4gcnVubmluZzogJHthd2FpdCBpc09ic2lkaWFuUnVubmluZygpID8gJ3llcycgOiAnTk8nfWApO1xuICBsaW5lcy5wdXNoKGAgIENMSSBlbmFibGVkIGluIG9ic2lkaWFuLmpzb246ICR7aXNDbGlFbmFibGVkKCkgPyAneWVzJyA6ICdOTyd9YCk7XG4gIGxpbmVzLnB1c2goYCAgVmF1bHQgcmVnaXN0ZXJlZDogJHtpc1ZhdWx0UmVnaXN0ZXJlZChwYXJhbXMuY3dkKSA/ICd5ZXMnIDogJ05PJ31gKTtcbiAgbGluZXMucHVzaChgICBTY3JpcHQgZmlsZSBleGlzdHM6ICR7ZXhpc3RzU3luYyhwYXJhbXMuc2NyaXB0UGF0aCkgPyAneWVzJyA6ICdubyAoYWxyZWFkeSBjbGVhbmVkIHVwKSd9YCk7XG4gIGxpbmVzLnB1c2goYCAgUmVzdWx0IGZpbGUgZXhpc3RzOiAke2V4aXN0c1N5bmMocGFyYW1zLnJlc3VsdFBhdGgpID8gJ3llcycgOiAnbm8nfWApO1xuXG4gIGNvbnN0IHJlZ2lzdGVyZWRWYXVsdHMgPSBnZXRSZWdpc3RlcmVkVmF1bHRzKCk7XG4gIGlmIChyZWdpc3RlcmVkVmF1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxpbmVzLnB1c2goJyAgUmVnaXN0ZXJlZCB2YXVsdHM6IChub25lKScpO1xuICB9IGVsc2Uge1xuICAgIGxpbmVzLnB1c2goJyAgUmVnaXN0ZXJlZCB2YXVsdHM6Jyk7XG4gICAgZm9yIChjb25zdCB2YXVsdCBvZiByZWdpc3RlcmVkVmF1bHRzKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgICAgLSAke3ZhdWx0LnBhdGh9IChvcGVuOiAke1N0cmluZyh2YXVsdC5vcGVuKX0pYCk7XG4gICAgfVxuICB9XG5cbiAgbGluZXMucHVzaChgICBTY3JpcHQgY29udGVudDpcXG4ke3BhcmFtcy5zY3JpcHRDb250ZW50fWApO1xuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbnRlbnQgb2YgYSB0ZW1wb3Jhcnkgc2NyaXB0IGZpbGUuXG4gKlxuICogU2VyaWFsaXplcyB7QGxpbmsgaW52b2tlQW5kV3JpdGVSZXN1bHR9IGludG8gYSBzZWxmLWNvbnRhaW5lZCBJSUZFIHRoYXRcbiAqIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiwgd3JpdGVzIHRoZSByZXN1bHQgKG9yIGVycm9yKSB0byBgcmVzdWx0UGF0aGAuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICogQHBhcmFtIHJlc3VsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcmVzdWx0IGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgc2NyaXB0IGZpbGUgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb246IHN0cmluZywgcmVzdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZm5TdHIgPSBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcoaW52b2tlQW5kV3JpdGVSZXN1bHQpO1xuICBjb25zdCBzZXJpYWxpemVFcnJvclN0ciA9IGdldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhzZXJpYWxpemVFcnJvcik7XG4gIGNvbnN0IHJlc3VsdFBhdGhKc29uID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0UGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICByZXR1cm4gYCgke2ZuU3RyfSkoeyBldmFsdWF0ZTogYXN5bmMgKCkgPT4gKCR7ZXhwcmVzc2lvbn0pLCByZXN1bHRQYXRoOiAke3Jlc3VsdFBhdGhKc29ufSwgc2VyaWFsaXplRXJyb3I6ICR7c2VyaWFsaXplRXJyb3JTdHJ9IH0pYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhIHNjcmlwdCBmaWxlIGZyb20gZGlzaywgbG9ncyBpdHMgY29udGVudCwgYW5kIGV4ZWN1dGVzIGl0IHZpYSBgbmV3IEZ1bmN0aW9uYC5cbiAqXG4gKiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUuXG4gKlxuICogQHBhcmFtIHNjcmlwdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgc2NyaXB0IGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVTY3JpcHRGaWxlKHNjcmlwdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gd2luZG93LmFwcCBpcyBzZXQgYnkgT2JzaWRpYW4gYXQgcnVudGltZS5cbiAgY29uc3QgZnNQcm9taXNlcyA9IFJlZmxlY3QuZ2V0KHdpbmRvdy5hcHAudmF1bHQuYWRhcHRlciwgJ2ZzUHJvbWlzZXMnKSBhcyBFeGVjdXRlU2NyaXB0RmlsZUZzUHJvbWlzZXM7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmc1Byb21pc2VzLmFjY2VzcyhzY3JpcHRQYXRoKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmlwdCBmaWxlIG5vdCBmb3VuZDogJHtzY3JpcHRQYXRofWAsIHsgY2F1c2UgfSk7XG4gIH1cblxuICBjb25zdCBzY3JpcHQgPSBhd2FpdCBmc1Byb21pc2VzLnJlYWRGaWxlKHNjcmlwdFBhdGgsICd1dGYtOCcpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAtLSBEaWFnbm9zdGljIGxvZ2dpbmcgaW5zaWRlIE9ic2lkaWFuIHByb2Nlc3M7IG5vIGxvZ2dlciBhdmFpbGFibGUuXG4gIGNvbnNvbGUuZGVidWcoYEV4ZWN1dGluZyAke3NjcmlwdFBhdGh9OlxcbiR7c2NyaXB0fWApO1xuXG4gIGxldCBmbjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWltcGxpZWQtZXZhbCwgbm8tbmV3LWZ1bmMgLS0gVGhlIHNjcmlwdCBpcyBhIHRydXN0ZWQsIHNlbGYtZ2VuZXJhdGVkIElJRkUgZXhwcmVzc2lvbi5cbiAgICBmbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICR7c2NyaXB0fWApIGFzICgpID0+IFByb21pc2U8dm9pZD47XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nICR7c2NyaXB0UGF0aH1gLCB7IGNhdXNlIH0pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZXhlY3V0aW5nICR7c2NyaXB0UGF0aH1gLCB7IGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBraWxsIHRoZSBPYnNpZGlhbiBwcm9jZXNzLlxuICpcbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0S2lsbE9ic2lkaWFuQ29tbWFuZCgpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiAndGFza2tpbGwgL0lNIE9ic2lkaWFuLmV4ZSAvRic7XG4gIH1cblxuICByZXR1cm4gJ3BraWxsIC1mIE9ic2lkaWFuJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIGxhdW5jaCB0aGUgT2JzaWRpYW4gYmluYXJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKCk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc3QgbG9jYWxBcHBEYXRhID0gcHJvY2Vzcy5lbnZbJ0xPQ0FMQVBQREFUQSddID8/ICcnO1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7bG9jYWxBcHBEYXRhfVxcXFxQcm9ncmFtc1xcXFxPYnNpZGlhblxcXFxPYnNpZGlhbi5leGVcImA7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvT2JzaWRpYW4uYXBwL0NvbnRlbnRzL01hY09TL09ic2lkaWFuICYnO1xuICB9XG5cbiAgcmV0dXJuICdvYnNpZGlhbiAmJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIG9wZW4gYSBVUkkuXG4gKlxuICogQHBhcmFtIHVyaSAtIFRoZSBVUkkgdG8gb3Blbi5cbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlblVyaUNvbW1hbmQodXJpOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7dXJpfVwiYDtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBgb3BlbiBcIiR7dXJpfVwiYDtcbiAgfVxuXG4gIHJldHVybiBgeGRnLW9wZW4gXCIke3VyaX1cImA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIHByb2Nlc3MgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gKlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBPYnNpZGlhbiBwcm9jZXNzIGlzIGZvdW5kLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNPYnNpZGlhblJ1bm5pbmcoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gICAgPyAndGFza2xpc3QgL0ZJIFwiSU1BR0VOQU1FIGVxIE9ic2lkaWFuLmV4ZVwiIC9OSCdcbiAgICA6ICdwZ3JlcCAtZiBPYnNpZGlhbic7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZXhlYyhjb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIHJldHVybiBvdXRwdXQuaW5jbHVkZXMoJ09ic2lkaWFuLmV4ZScpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0LnRyaW0oKS5sZW5ndGggPiAwO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBPcGVucyBhIHZhdWx0IGluIE9ic2lkaWFuIHVzaW5nIHRoZSBgb2JzaWRpYW46Ly9vcGVuYCBVUkkgcHJvdG9jb2wuXG4gKlxuICogVGhpcyB3b3JrcyB3aGV0aGVyIE9ic2lkaWFuIGlzIGFscmVhZHkgcnVubmluZyAoc2lnbmFscyBpdCB0byBvcGVuIHRoZSB2YXVsdClcbiAqIG9yIG5vdCAobGF1bmNoZXMgT2JzaWRpYW4gd2l0aCB0aGUgdmF1bHQpLiBUaGUgVVJJIHByb3RvY29sIGlzIGhhbmRsZWQgYnkgdGhlXG4gKiBPUywgd2hpY2ggcm91dGVzIGl0IHRvIHRoZSByZWdpc3RlcmVkIE9ic2lkaWFuIGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5WYXVsdFZpYVVyaSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICBpZiAoIXZhdWx0SWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvcGVuIHZhdWx0IHZpYSBVUkk6IHZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIG9ic2lkaWFuLmpzb246ICR7dmF1bHRQYXRofWApO1xuICB9XG4gIGNvbnN0IHVyaSA9IGBvYnNpZGlhbjovL29wZW4/dmF1bHQ9JHtlbmNvZGVVUklDb21wb25lbnQodmF1bHRJZCl9YDtcbiAgY29uc3QgY29tbWFuZCA9IGdldE9wZW5VcmlDb21tYW5kKHVyaSk7XG4gIGxvZyhgW2NsaS10cmFuc3BvcnRdIE9wZW5pbmcgdmF1bHQgdmlhIFVSSTogJHt1cml9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYyhjb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVVJJIG9wZW4gZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBLHFCQUEyQjtBQUMzQixzQkFLTztBQUNQLHFCQUF1QjtBQUN2Qix1QkFBcUI7QUFDckIsMEJBQW9CO0FBUXBCLGtCQUFxQjtBQUNyQixpQ0FBNEM7QUFDNUMsaUJBQW9CO0FBQ3BCLGlDQUE0QztBQUM1QyxrQkFBcUI7QUFDckIsNkJBVU87QUFDUCw2QkFBK0I7QUE2Qi9CLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sMkNBQTJDO0FBQ2pELE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sc0NBQXNDO0FBQzVDLE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sb0NBQW9DO0FBQzFDLE1BQU0scUNBQXFDO0FBZXBDLE1BQU0sb0JBQWlEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJNUMsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBaUIzQixNQUFhLFNBQVMsWUFBb0IsU0FBZ0Q7QUFDeEYsVUFBTSxjQUFjO0FBQ3BCLFVBQU0sV0FBVyxPQUFPLEtBQUssT0FBTyxDQUFDLEVBQUUsTUFBTSxXQUFXO0FBQ3hELFVBQU0sZ0JBQVksMkJBQUssdUJBQU8sR0FBRyw4QkFBOEI7QUFDL0QsVUFBTSxpQkFBYSx1QkFBSyxX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TztBQUNkLFVBQU0sSUFBSSxNQUFNLG1CQUFtQixVQUFVLElBQUksRUFBRSxNQUFNLENBQUM7QUFBQSxFQUM1RDtBQUNGO0FBT0EsU0FBUyx5QkFBaUM7QUFDeEMsTUFBSSxvQkFBQUEsUUFBUSxhQUFhLFNBQVM7QUFDaEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPO0FBQ1Q7QUFPQSxTQUFTLDJCQUFtQztBQUMxQyxNQUFJLG9CQUFBQSxRQUFRLGFBQWEsU0FBUztBQUNoQyxVQUFNLGVBQWUsb0JBQUFBLFFBQVEsSUFBSSxjQUFjLEtBQUs7QUFDcEQsV0FBTyxhQUFhLFlBQVk7QUFBQSxFQUNsQztBQUVBLE1BQUksb0JBQUFBLFFBQVEsYUFBYSxVQUFVO0FBQ2pDLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTztBQUNUO0FBUUEsU0FBUyxrQkFBa0IsS0FBcUI7QUFDOUMsTUFBSSxvQkFBQUEsUUFBUSxhQUFhLFNBQVM7QUFDaEMsV0FBTyxhQUFhLEdBQUc7QUFBQSxFQUN6QjtBQUVBLE1BQUksb0JBQUFBLFFBQVEsYUFBYSxVQUFVO0FBQ2pDLFdBQU8sU0FBUyxHQUFHO0FBQUEsRUFDckI7QUFFQSxTQUFPLGFBQWEsR0FBRztBQUN6QjtBQU9BLGVBQWUsb0JBQXNDO0FBQ25ELFFBQU0sVUFBVSxvQkFBQUEsUUFBUSxhQUFhLFVBQ2pDLGlEQUNBO0FBQ0osTUFBSTtBQUNGLFVBQU0sU0FBUyxVQUFNLGtCQUFLLFNBQVMsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUNwRCxRQUFJLG9CQUFBQSxRQUFRLGFBQWEsU0FBUztBQUNoQyxhQUFPLE9BQU8sU0FBUyxjQUFjO0FBQUEsSUFDdkM7QUFDQSxXQUFPLE9BQU8sS0FBSyxFQUFFLFNBQVM7QUFBQSxFQUNoQyxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQVdBLGVBQWUsZ0JBQWdCLFdBQWtDO0FBQy9ELFFBQU0sY0FBVSxtQ0FBVyxTQUFTO0FBQ3BDLE1BQUksQ0FBQyxTQUFTO0FBQ1osVUFBTSxJQUFJLE1BQU0sd0VBQXdFLFNBQVMsRUFBRTtBQUFBLEVBQ3JHO0FBQ0EsUUFBTSxNQUFNLHlCQUF5QixtQkFBbUIsT0FBTyxDQUFDO0FBQ2hFLFFBQU0sVUFBVSxrQkFBa0IsR0FBRztBQUNyQyxzQkFBSSwwQ0FBMEMsR0FBRyxFQUFFO0FBQ25ELE1BQUk7QUFDRixjQUFNLGtCQUFLLFNBQVMsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUFBLEVBQ3ZDLFNBQVMsT0FBZ0I7QUFDdkIsd0JBQUksb0RBQWdELHVDQUFlLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDN0U7QUFDRjsiLAogICJuYW1lcyI6IFsicHJvY2VzcyJdCn0K