system-testing 1.0.116 → 1.0.118

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.
@@ -7,6 +7,7 @@ import { wait } from "awaitery";
7
7
  import timeout from "awaitery/build/timeout.js";
8
8
  import WebDriverDriver from "./webdriver-driver.js";
9
9
  const MAX_NATIVE_VIEWPORT_SCROLL_STEPS = 8;
10
+ const DEFAULT_NATIVE_NEW_COMMAND_TIMEOUT_SECONDS = 180;
10
11
  /**
11
12
  * Appium timeout values returned by Selenium.
12
13
  * @typedef {{implicit: number, pageLoad?: number, script?: number}} NativeTimeouts
@@ -209,6 +210,24 @@ export async function ensureChromeUserDataDirCapability({ browserName, capabilit
209
210
  };
210
211
  return userDataDir;
211
212
  }
213
+ /**
214
+ * Keeps native Appium sessions alive while the React Native app opens the system-test WebSocket.
215
+ * @param {object} args
216
+ * @param {Record<string, any>} args.capabilities
217
+ * @returns {void}
218
+ */
219
+ export function ensureNativeNewCommandTimeoutCapability({ capabilities }) {
220
+ const platformName = capabilities.platformName;
221
+ if (typeof platformName !== "string" || platformName.toLowerCase() !== "android")
222
+ return;
223
+ if (typeof capabilities.browserName === "string" && capabilities.browserName.length > 0)
224
+ return;
225
+ if (capabilities["appium:newCommandTimeout"] !== undefined)
226
+ return;
227
+ if (capabilities.newCommandTimeout !== undefined)
228
+ return;
229
+ capabilities["appium:newCommandTimeout"] = DEFAULT_NATIVE_NEW_COMMAND_TIMEOUT_SECONDS;
230
+ }
212
231
  /**
213
232
  * @typedef {object} AppiumDriverOptions
214
233
  * @property {string} [serverUrl] Remote Appium server URL to connect to.
@@ -267,6 +286,7 @@ export default class AppiumDriver extends WebDriverDriver {
267
286
  browserName: this.options.browserName,
268
287
  capabilities
269
288
  });
289
+ ensureNativeNewCommandTimeoutCapability({ capabilities });
270
290
  const builder = new Builder().usingServer(this.serverUrl);
271
291
  if (Object.keys(capabilities).length > 0) {
272
292
  builder.withCapabilities(capabilities);
@@ -912,4 +932,4 @@ export default class AppiumDriver extends WebDriverDriver {
912
932
  return `http://${address}:${port}${basePath}`;
913
933
  }
914
934
  }
915
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwaXVtLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDOUMsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUNBQWlDLENBQUE7QUFDdEQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVuRCxNQUFNLGdDQUFnQyxHQUFHLENBQUMsQ0FBQTtBQUUxQzs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFFSDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUs7SUFDcEMsTUFBTSxLQUFLLEdBQUcsdUNBQXVDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ25CLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFLO0lBQ3pCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUNyRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsS0FBSztJQUM3QixPQUFPLEtB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QUFTLElBQUksQ0FBQyxXQUFXLENBQUE7SUFDckcsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWMsQ0FBQyxVQUFVO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFBO1FBQ2pELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFBO1FBQ3BDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVuSSxPQUFPLFVBQVUsT0FBTyxJQUFJLElBQUksR0FBRyxRQUFRLEVBQUUsQ0FBQTtJQUMvQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiXG5pbXBvcnQge0J1aWxkZXIsIEJ5fSBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyXCJcbmltcG9ydCB7Q29tbWFuZCwgTmFtZX0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlci9saWIvY29tbWFuZC5qc1wiXG5pbXBvcnQge09yaWdpbn0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlci9saWIvaW5wdXQuanNcIlxuaW1wb3J0IHt3YWl0fSBmcm9tIFwiYXdhaXRlcnlcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuaW1wb3J0IFdlYkRyaXZlckRyaXZlciBmcm9tIFwiLi93ZWJkcml2ZXItZHJpdmVyLmpzXCJcblxuY29uc3QgTUFYX05BVElWRV9WSUVXUE9SVF9TQ1JPTExfU1RFUFMgPSA4XG5cbi8qKlxuICogQXBwaXVtIHRpbWVvdXQgdmFsdWVzIHJldHVybmVkIGJ5IFNlbGVuaXVtLlxuICogQHR5cGVkZWYge3tpbXBsaWNpdDogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dHNcbiAqL1xuLyoqXG4gKiBBcHBpdW0gdGltZW91dCB1cGRhdGUgc2hhcGUgYWNjZXB0ZWQgYnkgU2VsZW5pdW0uXG4gKiBAdHlwZWRlZiB7e2ltcGxpY2l0PzogbnVtYmVyLCBwYWdlTG9hZD86IG51bWJlciwgc2NyaXB0PzogbnVtYmVyfX0gTmF0aXZlVGltZW91dE9wdGlvbnNcbiAqL1xuLyoqXG4gKiBOYXRpdmUgQXBwaXVtIHdpbmRvdyBkaW1lbnNpb25zLlxuICogQHR5cGVkZWYge3t4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXJ9fSBOYXRpdmVXaW5kb3dSZWN0XG4gKi9cbi8qKlxuICogVHJhY2tzIG5hdGl2ZSBzY3JvbGwgZmFsbGJhY2tzIHRoYXQgYWxyZWFkeSByZXBvcnRlZCBubyBtb3ZlbWVudC5cbiAqIEB0eXBlZGVmIHt7dHJ5RWxlbWVudFNjcm9sbDogYm9vbGVhbiwgdHJ5Vmlld3BvcnRTY3JvbGw6IGJvb2xlYW59fSBOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlXG4gKi9cbi8qKlxuICogTmF0aXZlIHZpZXdwb3J0IHNjcm9sbCBkaXJlY3Rpb24uXG4gKiBAdHlwZWRlZiB7XCJkb3duXCJ8XCJ1cFwifSBOYXRpdmVWaWV3cG9ydFNjcm9sbERpcmVjdGlvblxuICovXG4vKipcbiAqIE5hdGl2ZSBBbmRyb2lkIGxvb2t1cCB3b3JrIGV4ZWN1dGVkIGJ5IHRoZSBzY3JvbGxpbmcgcG9sbGVyLlxuICogQHR5cGVkZWYge3tkZXNjcmlwdGlvbjogc3RyaW5nLCBkaXJlY3RGaW5kOiAoKSA9PiBQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Piwgc2Nyb2xsU2VsZWN0b3JzOiBzdHJpbmdbXX19IE5hdGl2ZUNvbnRyb2xMb29rdXBcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge3Vua25vd259IGNhdXNlXG4gKiBAcmV0dXJucyB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fVxuICovXG5mdW5jdGlvbiBlcnJvcldpdGhDYXVzZShtZXNzYWdlLCBjYXVzZSkge1xuICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fSAqLyAobmV3IEVycm9yKG1lc3NhZ2UpKVxuICBlcnJvci5jYXVzZSA9IGNhdXNlXG4gIHJldHVybiBlcnJvclxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIEphdmEgcmVndWxhciBleHByZXNzaW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCByZWdleCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUmVnZXgtc2FmZSB0ZXh0LlxuICovXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCBcIlxcXFwkJlwiKVxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGluc2lkZSBhIHF1b3RlZCBVaUF1dG9tYXRvciBKYXZhIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBVbmVzY2FwZWQgSmF2YSBzdHJpbmcgdGV4dC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEphdmEtc3RyaW5nLXNhZmUgdGV4dC5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlSmF2YVN0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIFVpQXV0b21hdG9yIHNlbGVjdG9yIGZvciBSZWFjdCBOYXRpdmUgYW5kIHBhY2thZ2UtcXVhbGlmaWVkIHJlc291cmNlIElEcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgUmVzb3VyY2UgaWQgc3VmZml4IHRvIG1hdGNoLlxuICogQHJldHVybnMge3N0cmluZ30gVWlBdXRvbWF0b3Igc2VsZWN0b3Igc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWRNYXRjaGVzKFwiKF58Lio6aWQvKSR7ZXNjYXBlSmF2YVN0cmluZyhlc2NhcGVSZWdFeHAodGVzdElkKSl9JFwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgdmlzaWJsZSB0ZXh0LlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVpQXV0b21hdG9yIHNlbGVjdG9yIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLnRleHRDb250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciB0aGF0IG1hdGNoZXMgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVaUF1dG9tYXRvciBzZWxlY3RvciBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkge1xuICByZXR1cm4gYG5ldyBVaVNlbGVjdG9yKCkuZGVzY3JpcHRpb25Db250YWlucyhcIiR7ZXNjYXBlSmF2YVN0cmluZyhleHBlY3RlZFRleHQpfVwiKWBcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBuYXRpdmUgbG9va3VwIGZhaWxlZCBiZWNhdXNlIHRoZSBjb250cm9sIGlzIG5vdCBjdXJyZW50bHkgbW91bnRlZCBvbnNjcmVlbi5cbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3IgVmFsdWUgdGhyb3duIGJ5IEFwcGl1bSBsb29rdXAuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBuYXRpdmUgc2Nyb2xsaW5nIHNob3VsZCBiZSBhdHRlbXB0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpIHtcbiAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHJldHVybiBmYWxzZVxuXG4gIHJldHVybiBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZFwiKSB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiQ291bGRuJ3QgZ2V0IGVsZW1lbnRzXCIpXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIGhvc3RlZCBBcHBpdW0gZHJpdmVyIGxhY2tzIHRoZSBtb2JpbGUgZ2VzdHVyZSBleHRlbnNpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIFZhbHVlIHRocm93biBieSBBcHBpdW0uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBXM0MgYWN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICovXG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIk5vdFlldEltcGxlbWVudGVkRXJyb3JcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiTWV0aG9kIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWRcIikgfHxcbiAgICBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwiVW5rbm93biBtb2JpbGUgY29tbWFuZFwiKVxufVxuXG4vKipcbiAqIEFkZHMgYSBVaUF1dG9tYXRvciB0ZXh0IHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsdGVyU2VsZWN0b3IgVWlBdXRvbWF0b3IgdGV4dCBvciBkZXNjcmlwdGlvbiBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBmaWx0ZXJTZWxlY3Rvcikge1xuICBjb25zdCBwcmVmaXggPSBcIm5ldyBVaVNlbGVjdG9yKClcIlxuXG4gIGlmICghZmlsdGVyU2VsZWN0b3Iuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBBbmRyb2lkIHNlbGVjdG9yIHRvIHN0YXJ0IHdpdGggJHtwcmVmaXh9LCBnb3QgJHtmaWx0ZXJTZWxlY3Rvcn1gKVxuICB9XG5cbiAgcmV0dXJuIGAke3Jlc291cmNlU2VsZWN0b3J9JHtmaWx0ZXJTZWxlY3Rvci5zbGljZShwcmVmaXgubGVuZ3RoKX1gXG59XG5cbi8qKlxuICogQWRkcyBhIFVpQXV0b21hdG9yIGNoaWxkIHByZWRpY2F0ZSB0byBhIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlc291cmNlU2VsZWN0b3IgVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgc2VsZWN0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hpbGRTZWxlY3RvciBVaUF1dG9tYXRvciBjaGlsZCBzZWxlY3Rvci5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbWJpbmVkIHNlbGVjdG9yLlxuICovXG5mdW5jdGlvbiBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBjaGlsZFNlbGVjdG9yKSB7XG4gIHJldHVybiBgJHtyZXNvdXJjZVNlbGVjdG9yfS5jaGlsZFNlbGVjdG9yKCR7Y2hpbGRTZWxlY3Rvcn0pYFxufVxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCBmb3IgdXNlIGFzIGFuIFhQYXRoIHN0cmluZyBsaXRlcmFsLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFVuZXNjYXBlZCBYUGF0aCB0ZXh0LlxuICogQHJldHVybnMge3N0cmluZ30gUXVvdGVkIGxpdGVyYWwgb3IgY29uY2F0IGV4cHJlc3Npb24gc2FmZSBmb3IgWFBhdGguXG4gKi9cbmZ1bmN0aW9uIHhwYXRoU3RyaW5nTGl0ZXJhbCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlLmluY2x1ZGVzKCdcIicpKSByZXR1cm4gYFwiJHt2YWx1ZX1cImBcbiAgaWYgKCF2YWx1ZS5pbmNsdWRlcyhcIidcIikpIHJldHVybiBgJyR7dmFsdWV9J2BcblxuICByZXR1cm4gYGNvbmNhdCgke3ZhbHVlLnNwbGl0KCdcIicpLm1hcCgocGFydCkgPT4gYFwiJHtwYXJ0fVwiYCkuam9pbihcIiwgJ1xcXCInLCBcIil9KWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgYW4gWFBhdGggc2VsZWN0b3IgZm9yIHRleHQgdW5kZXIgb25lIG5hdGl2ZSBBbmRyb2lkIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBSZXNvdXJjZSBpZCBzdWZmaXggdG8gc2NvcGUgdW5kZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdG8gbG9jYXRlIGluc2lkZSB0aGF0IHNjb3BlLlxuICogQHJldHVybnMge3N0cmluZ30gWFBhdGggc2VsZWN0b3Igc291cmNlLlxuICovXG5mdW5jdGlvbiBhbmRyb2lkU2NvcGVkVGV4dFhwYXRoKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlSWQgPSB4cGF0aFN0cmluZ0xpdGVyYWwodGVzdElkKVxuICBjb25zdCB0ZXh0ID0geHBhdGhTdHJpbmdMaXRlcmFsKGV4cGVjdGVkVGV4dClcbiAgY29uc3QgcmVzb3VyY2VQcmVkaWNhdGUgPSBgKEByZXNvdXJjZS1pZCA9ICR7cmVzb3VyY2VJZH0gb3Igc3Vic3RyaW5nKEByZXNvdXJjZS1pZCwgc3RyaW5nLWxlbmd0aChAcmVzb3VyY2UtaWQpIC0gc3RyaW5nLWxlbmd0aCgke3Jlc291cmNlSWR9KSArIDEpID0gJHtyZXNvdXJjZUlkfSlgXG4gIGNvbnN0IHRleHRQcmVkaWNhdGUgPSBgKGNvbnRhaW5zKEB0ZXh0LCAke3RleHR9KSBvciBjb250YWlucyhAY29udGVudC1kZXNjLCAke3RleHR9KSlgXG5cbiAgcmV0dXJuIGAvLypbJHtyZXNvdXJjZVByZWRpY2F0ZX0gYW5kICR7dGV4dFByZWRpY2F0ZX1dIHwgLy8qWyR7cmVzb3VyY2VQcmVkaWNhdGV9XS8vKlske3RleHRQcmVkaWNhdGV9XWBcbn1cblxuLyoqXG4gKiBCdWlsZHMgc2VsZWN0b3JzIHRoYXQgc2NvcGUgdGV4dCBtYXRjaGluZyB0byBvbmUgbmF0aXZlIHJlc291cmNlIGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgdGVzdCBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0aGF0IG11c3QgYXBwZWFyIG9uIHRoYXQgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVWlBdXRvbWF0b3Igc2VsZWN0b3JzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIGNvbnN0IHJlc291cmNlU2VsZWN0b3IgPSBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcblxuICByZXR1cm4gW1xuICAgIGNvbWJpbmVBbmRyb2lkU2VsZWN0b3JzKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpLFxuICAgIGNoaWxkQW5kcm9pZFNlbGVjdG9yKHJlc291cmNlU2VsZWN0b3IsIGFuZHJvaWRUZXh0Q29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkRGVzY3JpcHRpb25Db250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCkpXG4gIF1cbn1cblxuLyoqXG4gKiBCdWlsZHMgbmF0aXZlIEFuZHJvaWQgc2Nyb2xsIHNlbGVjdG9ycyBmb3IgYSBzY29wZWQgdGV4dCBhc3NlcnRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSB0ZXN0IGlkLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRoYXQgbXVzdCBhcHBlYXIgb24gdGhhdCBlbGVtZW50LlxuICogQHJldHVybnMge3N0cmluZ1tdfSBVaUF1dG9tYXRvciBzZWxlY3RvcnMuXG4gKi9cbmZ1bmN0aW9uIG5hdGl2ZVRlc3RJRFRleHRTY3JvbGxTZWxlY3RvcnModGVzdElkLCBleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSxcbiAgICBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZClcbiAgXVxufVxuXG4vKipcbiAqIEVuc3VyZXMgQ2hyb21lIEFwcGl1bSBjYXBhYmlsaXRpZXMgdXNlIGEgY2FsbGVyLW93bmVkIHVzZXItZGF0YSBkaXJlY3RvcnkuXG4gKiBUaGlzIGF2b2lkcyByZXBlYXRlZCBzZXNzaW9ucyBsZWFraW5nIHRlbXAgcHJvZmlsZXMgdW5kZXIgYC90bXBgIGluIENJLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5icm93c2VyTmFtZV1cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gYXJncy5jYXBhYmlsaXRpZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy50ZW1wUm9vdERpcl1cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVDaHJvbWVVc2VyRGF0YURpckNhcGFiaWxpdHkoe2Jyb3dzZXJOYW1lLCBjYXBhYmlsaXRpZXMsIHRlbXBSb290RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwidG1wXCIsIFwiYXBwaXVtLWNocm9tZS11c2VyLWRhdGFcIil9KSB7XG4gIGNvbnN0IHJlc29sdmVkQnJvd3Nlck5hbWUgPSBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPz8gYnJvd3Nlck5hbWVcblxuICBpZiAodHlwZW9mIHJlc29sdmVkQnJvd3Nlck5hbWUgIT09IFwic3RyaW5nXCIgfHwgcmVzb2x2ZWRCcm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImNocm9tZVwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgY29uc3QgcGxhdGZvcm1OYW1lID0gY2FwYWJpbGl0aWVzLnBsYXRmb3JtTmFtZVxuXG4gIGlmICh0eXBlb2YgcGxhdGZvcm1OYW1lID09PSBcInN0cmluZ1wiICYmIHBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFuZHJvaWRcIikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IGNocm9tZU9wdGlvbnMgPSBjYXBhYmlsaXRpZXNbXCJnb29nOmNocm9tZU9wdGlvbnNcIl1cbiAgY29uc3QgYXJncyA9IEFycmF5LmlzQXJyYXkoY2hyb21lT3B0aW9ucz8uYXJncykgPyBbLi4uY2hyb21lT3B0aW9ucy5hcmdzXSA6IFtdXG5cbiAgaWYgKGFyZ3Muc29tZSgoYXJnKSA9PiB0eXBlb2YgYXJnID09PSBcInN0cmluZ1wiICYmIGFyZy5zdGFydHNXaXRoKFwiLS11c2VyLWRhdGEtZGlyPVwiKSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBhd2FpdCBmcy5ta2Rpcih0ZW1wUm9vdERpciwge3JlY3Vyc2l2ZTogdHJ1ZX0pXG5cbiAgY29uc3QgdXNlckRhdGFEaXIgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbih0ZW1wUm9vdERpciwgXCJwcm9maWxlLVwiKSlcblxuICBhcmdzLnB1c2goYC0tdXNlci1kYXRhLWRpcj0ke3VzZXJEYXRhRGlyfWApXG4gIGNhcGFiaWxpdGllc1tcImdvb2c6Y2hyb21lT3B0aW9uc1wiXSA9IHtcbiAgICAuLi4oY2hyb21lT3B0aW9ucyA/PyB7fSksXG4gICAgYXJnc1xuICB9XG5cbiAgcmV0dXJuIHVzZXJEYXRhRGlyXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXBwaXVtRHJpdmVyT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZXJ2ZXJVcmxdIFJlbW90ZSBBcHBpdW0gc2VydmVyIFVSTCB0byBjb25uZWN0IHRvLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbc2VydmVyQXJnc10gT3B0aW9ucyBwYXNzZWQgdG8gdGhlIEFwcGl1bSBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbdXNlRHJpdmVyc10gQXBwaXVtIGRyaXZlciBuYW1lcyB0byBsb2FkIHdoZW4gc3RhcnRpbmcgdGhlIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2NhcGFiaWxpdGllc10gRGVzaXJlZCBjYXBhYmlsaXRpZXMgZm9yIHRoZSBzZXNzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFticm93c2VyTmFtZV0gQnJvd3NlciBuYW1lIGZvciB3ZWIgc2Vzc2lvbnMuXG4gKiBAcHJvcGVydHkge1wiYWNjZXNzaWJpbGl0eUlkXCJ8XCJjc3NcInxcImlkXCJ9IFt0ZXN0SWRTdHJhdGVneV0gU3RyYXRlZ3kgZm9yIHJlc29sdmluZyB0ZXN0IElEcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGVzdElkQXR0cmlidXRlXSBBdHRyaWJ1dGUgbmFtZSB3aGVuIHVzaW5nIHRoZSBDU1MgdGVzdCBJRCBzdHJhdGVneS5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaW5kQXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aW1lb3V0IGZvciBsb29rdXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBudWxsfSBbdmlzaWJsZV0gV2hldGhlciB0byByZXF1aXJlIGVsZW1lbnRzIHRvIGJlIHZpc2libGUgKGB0cnVlYCkgb3IgaGlkZGVuIChgZmFsc2VgKS4gVXNlIGBudWxsYCB0byBkaXNhYmxlIHZpc2liaWxpdHkgZmlsdGVyaW5nLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2Nyb2xsVG9dIFdoZXRoZXIgdG8gc2Nyb2xsIGZvdW5kIGVsZW1lbnRzIGludG8gdmlldyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbc2Nyb2xsQ29udGFpbmVyVGVzdElEc10gTmF0aXZlIHRlc3QgSURzIHRoYXQgc2hvdWxkIGJlIHRyaWVkIGFzIHNjcm9sbCBjb250YWluZXJzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gdmlld3BvcnQgZ2VzdHVyZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gKi9cblxuLyoqXG4gKiBBcHBpdW0gZHJpdmVyIGJhY2tlZCBieSB0aGUgQXBwaXVtIHNlcnZlciBwYWNrYWdlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcHBpdW1Ecml2ZXIgZXh0ZW5kcyBXZWJEcml2ZXJEcml2ZXIge1xuICAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbiAgY2hyb21lVXNlckRhdGFEaXIgPSB1bmRlZmluZWRcblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdGFydCgpIHtcbiAgICBjb25zdCBzZXJ2ZXJBcmdzID0gey4uLih0aGlzLm9wdGlvbnMuc2VydmVyQXJncyA/PyB7fSl9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZURyaXZlcnMgJiYgIXNlcnZlckFyZ3MudXNlRHJpdmVycykge1xuICAgICAgc2VydmVyQXJncy51c2VEcml2ZXJzID0gdGhpcy5vcHRpb25zLnVzZURyaXZlcnNcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnNlcnZlclVybCkge1xuICAgICAgdGhpcy5zZXJ2ZXJVcmwgPSB0aGlzLm9wdGlvbnMuc2VydmVyVXJsXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGFwcGl1bU1vZHVsZSA9IGF3YWl0IGltcG9ydChcImFwcGl1bVwiKVxuICAgICAgY29uc3QgYXBwaXVtTWFpbiA9IGFwcGl1bU1vZHVsZS5tYWluID8/IGFwcGl1bU1vZHVsZS5kZWZhdWx0Py5tYWluXG5cbiAgICAgIGlmICghYXBwaXVtTWFpbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBcHBpdW0gbWFpbigpIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGFwcGl1bSBwYWNrYWdlXCIpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwaXVtU2VydmVyID0gYXdhaXQgYXBwaXVtTWFpbihzZXJ2ZXJBcmdzKVxuICAgICAgdGhpcy5zZXJ2ZXJVcmwgPSB0aGlzLmJ1aWxkU2VydmVyVXJsKHNlcnZlckFyZ3MpXG4gICAgfVxuXG4gICAgY29uc3QgY2FwYWJpbGl0aWVzID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcyA/IHsuLi50aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzfSA6IHt9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lICYmICFjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpIHtcbiAgICAgIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZVxuICAgIH1cbiAgICBpZiAoY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9IFwiXCJcbiAgICB9XG5cbiAgICB0aGlzLmNocm9tZVVzZXJEYXRhRGlyID0gYXdhaXQgZW5zdXJlQ2hyb21lVXNlckRhdGFEaXJDYXBhYmlsaXR5KHtcbiAgICAgIGJyb3dzZXJOYW1lOiB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWUsXG4gICAgICBjYXBhYmlsaXRpZXNcbiAgICB9KVxuXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCkudXNpbmdTZXJ2ZXIodGhpcy5zZXJ2ZXJVcmwpXG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY2FwYWJpbGl0aWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICBidWlsZGVyLndpdGhDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWJEcml2ZXIgPSBhd2FpdCBidWlsZGVyLmJ1aWxkKClcblxuICAgICAgdGhpcy5zZXRXZWJEcml2ZXIod2ViRHJpdmVyKVxuICAgICAgdGhpcy5pbnN0YWxsRXhpdEhhbmRsZXJzKClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy5jbGVhbnVwQ2hyb21lVXNlckRhdGFEaXIoKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzdXBlci5zdG9wKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHRoaXMuYXBwaXVtU2VydmVyPy5jbG9zZSkge1xuICAgICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIGNsb3NpbmcgQXBwaXVtIHNlcnZlclwifSwgYXN5bmMgKCkgPT4gYXdhaXQgLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgdGhpcy5hcHBpdW1TZXJ2ZXI+fSAqLyAodGhpcy5hcHBpdW1TZXJ2ZXIpLmNsb3NlKCkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXBwaXVtU2VydmVyID0gdW5kZWZpbmVkXG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuICBhc3luYyBjbGVhbnVwQ2hyb21lVXNlckRhdGFEaXIoKSB7XG4gICAgaWYgKCF0aGlzLmNocm9tZVVzZXJEYXRhRGlyKSByZXR1cm5cblxuICAgIGNvbnN0IGNocm9tZVVzZXJEYXRhRGlyID0gdGhpcy5jaHJvbWVVc2VyRGF0YURpclxuXG4gICAgdGhpcy5jaHJvbWVVc2VyRGF0YURpciA9IHVuZGVmaW5lZFxuICAgIGF3YWl0IGZzLnJtKGNocm9tZVVzZXJEYXRhRGlyLCB7cmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZX0pXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbGwgY29va2llcy4gU2tpcHBlZCBmb3IgbmF0aXZlIGFwcCBjb250ZXh0cyB3aGVyZSBjb29raWVcbiAgICogbWFuYWdlbWVudCBpcyBub3Qgc3VwcG9ydGVkIGJ5IFVpQXV0b21hdG9yMi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkZWxldGVBbGxDb29raWVzKCkge1xuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICBpZiAoIWJyb3dzZXJOYW1lKSByZXR1cm5cblxuICAgIGF3YWl0IHN1cGVyLmRlbGV0ZUFsbENvb2tpZXMoKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIGFzeW5jIGdldEJyb3dzZXJMb2dzKCkge1xuICAgIGNvbnN0IHBsYXRmb3JtTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LnBsYXRmb3JtTmFtZVxuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG4gICAgY29uc3QgaXNBbmRyb2lkID0gdHlwZW9mIHBsYXRmb3JtTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhbmRyb2lkXCJcblxuICAgIGlmIChpc0FuZHJvaWQgJiYgIWJyb3dzZXJOYW1lKSB7XG4gICAgICBsZXQgZW50cmllc1xuXG4gICAgICB0cnkge1xuICAgICAgICBlbnRyaWVzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5sb2dzKCkuZ2V0KFwibG9nY2F0XCIpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvZ2NhdExvZ3MgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZU1hdGNoID0gZW50cnkubWVzc2FnZS5tYXRjaCgvXiguKykgKFxcZCspOihcXGQrKSAoLispJC8pXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlTWF0Y2ggPyBtZXNzYWdlTWF0Y2hbNF0gOiBlbnRyeS5tZXNzYWdlXG5cbiAgICAgICAgbG9nY2F0TG9ncy5wdXNoKGAke2VudHJ5LmxldmVsLm5hbWV9OiAke21lc3NhZ2V9YClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvZ2NhdExvZ3NcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgc3VwZXIuZ2V0QnJvd3NlckxvZ3MoKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgdGVzdCBJRC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIGNvbnN0IHRlc3RJZFN0cmF0ZWd5ID0gdGhpcy5vcHRpb25zLnRlc3RJZFN0cmF0ZWd5ID8/IFwiYWNjZXNzaWJpbGl0eUlkXCJcblxuICAgIGlmICh0ZXN0SWRTdHJhdGVneSA9PT0gXCJjc3NcIikge1xuICAgICAgY29uc3QgdGVzdElkQXR0cmlidXRlID0gdGhpcy5vcHRpb25zLnRlc3RJZEF0dHJpYnV0ZSA/PyBcImRhdGEtdGVzdGlkXCJcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmQoYFske3Rlc3RJZEF0dHJpYnV0ZX09JyR7dGVzdElEfSddYCwgYXJncylcbiAgICB9XG4gICAgaWYgKHRlc3RJZFN0cmF0ZWd5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRCeUlkKHRlc3RJRCwgYXJncylcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kQnlBY2Nlc3NpYmlsaXR5SWQodGVzdElELCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGFuIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGVzdCBJRCBpcyBjdXJyZW50bHkgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgaGFzVGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIHsuLi5hcmdzLCB0aW1lb3V0OiAwfSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aChcIkVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYWZ0ZXIgXCIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlBY2Nlc3NpYmlsaXR5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50c1xuXG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGxCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9IC0gJHtlcnJvci5tZXNzYWdlfSAoYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHt0eXBlb2YgZXJyb3J9IC0gJHtlcnJvcn0gKGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfSlgLCBlcnJvcilcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSBlbGVtZW50cyAoJHtlbGVtZW50cy5sZW5ndGh9KSB3YXMgZm91bmQgYnkgYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9YClcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnRzWzBdKSB7XG4gICAgICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDBcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciAke2VsYXBzZWRTZWNvbmRzLnRvRml4ZWQoMil9cyBieSBhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsQnlBY2Nlc3NpYmlsaXR5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7c2Nyb2xsQ29udGFpbmVyVGVzdElEcywgc2Nyb2xsVG8gPSBmYWxzZSwgdmlzaWJsZSA9IHRydWUsIHRpbWVvdXQsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICB2b2lkIHNjcm9sbENvbnRhaW5lclRlc3RJRHNcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncykuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJ1c2VCYXNlU2VsZWN0b3JcIilcbiAgICBsZXQgYWN0dWFsVGltZW91dFxuXG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRoaXMuX2RyaXZlclRpbWVvdXRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICBjb25zdCBnZXRUaW1lTGVmdCA9ICgpID0+IE1hdGgubWF4KGFjdHVhbFRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSksIDApXG4gICAgY29uc3QgZ2V0RWxlbWVudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmb3VuZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiYWNjZXNzaWJpbGl0eSBpZFwiLCB0ZXN0SWQpKVxuXG4gICAgICBpZiAodmlzaWJsZSAhPT0gdHJ1ZSAmJiB2aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZm91bmRFbGVtZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gW11cblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZvdW5kRWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCB0aGlzLmlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KVxuXG4gICAgICAgIGlmICh2aXNpYmxlICYmICFpc0Rpc3BsYXllZCkgY29udGludWVcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBjb250aW51ZVxuXG4gICAgICAgIGZpbHRlcmVkRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsdGVyZWRFbGVtZW50c1xuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzID0gW11cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB0aW1lTGVmdCA9IGFjdHVhbFRpbWVvdXQgPT0gMCA/IDAgOiBnZXRUaW1lTGVmdCgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aW1lTGVmdCA9PSAwKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgIH0sIHRpbWVMZWZ0KVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVGltZW91dEVycm9yXCIgJiYgZ2V0VGltZUxlZnQoKSA+IDApIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYENvdWxkbid0IGdldCBlbGVtZW50cyB3aXRoIGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWAsIGVycm9yKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzY3JvbGxUbykge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KGVsZW1lbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGFuIGVsZW1lbnQgaXMgZGlzcGxheWVkLiBGb3IgbmF0aXZlIGFwcCBjb250ZXh0cywgYWx3YXlzXG4gICAqIHJldHVybnMgdHJ1ZSBiZWNhdXNlIFNlbGVuaXVtJ3MgaXNEaXNwbGF5ZWQoKSBKUyBhdG9tIGlzIG5vdCBzdXBwb3J0ZWRcbiAgICogYnkgVWlBdXRvbWF0b3IyIGluIG5hdGl2ZSBtb2RlLCBhbmQgZWxlbWVudHMgZm91bmQgYnkgVWlBdXRvbWF0b3IyJ3NcbiAgICogYWNjZXNzaWJpbGl0eSBpZCAvIGlkIHNlYXJjaCBhcmUgYWxyZWFkeSBpbiB0aGUgcmVuZGVyZWQgdmlldyBoaWVyYXJjaHkuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBpc0VsZW1lbnREaXNwbGF5ZWQoZWxlbWVudCkge1xuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICBpZiAoIWJyb3dzZXJOYW1lKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGF3YWl0IGVsZW1lbnQuaXNEaXNwbGF5ZWQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeUlkKHRlc3RJZCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpICYmIGFyZ3Muc2Nyb2xsVG8pIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sQnlJZCh0ZXN0SWQsIGFyZ3MpXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHNcblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50cyA9IGF3YWl0IHRoaXMuYWxsQnlJZCh0ZXN0SWQsIGFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9IC0gJHtlcnJvci5tZXNzYWdlfSAoaWQ6ICR7dGVzdElkfSlgLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7dHlwZW9mIGVycm9yfSAtICR7ZXJyb3J9IChpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiAxIGVsZW1lbnRzICgke2VsZW1lbnRzLmxlbmd0aH0pIHdhcyBmb3VuZCBieSBpZDogJHt0ZXN0SWR9YClcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnRzWzBdKSB7XG4gICAgICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDBcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciAke2VsYXBzZWRTZWNvbmRzLnRvRml4ZWQoMil9cyBieSBpZDogJHt0ZXN0SWR9YClcbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNbMF1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdPn1cbiAgICovXG4gIGFzeW5jIGFsbEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7c2Nyb2xsQ29udGFpbmVyVGVzdElEcywgc2Nyb2xsVG8gPSBmYWxzZSwgdmlzaWJsZSA9IHRydWUsIHRpbWVvdXQsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICB2b2lkIHNjcm9sbENvbnRhaW5lclRlc3RJRHNcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncykuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJ1c2VCYXNlU2VsZWN0b3JcIilcbiAgICBsZXQgYWN0dWFsVGltZW91dFxuXG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRoaXMuX2RyaXZlclRpbWVvdXRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICBjb25zdCBnZXRUaW1lTGVmdCA9ICgpID0+IE1hdGgubWF4KGFjdHVhbFRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSksIDApXG4gICAgY29uc3QgZ2V0RWxlbWVudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmb3VuZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHModGhpcy5pZExvY2F0b3IodGVzdElkKSlcblxuICAgICAgaWYgKHZpc2libGUgIT09IHRydWUgJiYgdmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyZWRFbGVtZW50cyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBmb3VuZEVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgdGhpcy5pc0VsZW1lbnREaXNwbGF5ZWQoZWxlbWVudClcblxuICAgICAgICBpZiAodmlzaWJsZSAmJiAhaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG4gICAgICAgIGlmICghdmlzaWJsZSAmJiBpc0Rpc3BsYXllZCkgY29udGludWVcblxuICAgICAgICBmaWx0ZXJlZEVsZW1lbnRzLnB1c2goZWxlbWVudClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpbHRlcmVkRWxlbWVudHNcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50cyA9IFtdXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgdGltZUxlZnQgPSBhY3R1YWxUaW1lb3V0ID09IDAgPyAwIDogZ2V0VGltZUxlZnQoKVxuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGltZUxlZnQgPT0gMCkge1xuICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkud2FpdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcblxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICB9LCB0aW1lTGVmdClcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIlRpbWVvdXRFcnJvclwiICYmIGdldFRpbWVMZWZ0KCkgPiAwKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBDb3VsZG4ndCBnZXQgZWxlbWVudHMgd2l0aCBpZDogJHt0ZXN0SWR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gaWQgbG9jYXRvciBmb3IgdGhlIGFjdGl2ZSBBcHBpdW0gY29udGV4dC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBUZXN0IGlkIG9yIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEByZXR1cm5zIHtCeX0gU2VsZW5pdW0vQXBwaXVtIGxvY2F0b3IuXG4gICAqL1xuICBpZExvY2F0b3IodGVzdElkKSB7XG4gICAgaWYgKHRoaXMuaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpKSB7XG4gICAgICByZXR1cm4gbmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpKVxuICAgIH1cblxuICAgIHJldHVybiBCeS5pZCh0ZXN0SWQpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbmF0aXZlIEFuZHJvaWQgdmlzaWJsZSB0ZXh0IG9yIGFuIGFjY2Vzc2liaWxpdHkgbGFiZWwsIHNjcm9sbGluZyBpdCBpbnRvIHZpZXcgd2hlbiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTmF0aXZlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgdGV4dC5cbiAgICovXG4gIGFzeW5jIGZpbmRCeU5hdGl2ZVRleHQoZXhwZWN0ZWRUZXh0LCBhcmdzID0ge30pIHtcbiAgICBpZiAoIXRoaXMuaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaW5kQnlOYXRpdmVUZXh0IGlzIG9ubHkgc3VwcG9ydGVkIGZvciBuYXRpdmUgQW5kcm9pZCBBcHBpdW0gc2Vzc2lvbnNcIilcbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RvcnMgPSBbYW5kcm9pZFRleHRDb250YWluc1NlbGVjdG9yKGV4cGVjdGVkVGV4dCksIGFuZHJvaWREZXNjcmlwdGlvbkNvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KV1cbiAgICBjb25zdCBkaXJlY3RGaW5kID0gYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBvZiBzZWxlY3RvcnMpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhuZXcgQnkoXCItYW5kcm9pZCB1aWF1dG9tYXRvclwiLCBzZWxlY3RvcikpXG5cbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHJldHVybiBlbGVtZW50c1swXVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYnkgdGV4dCBvciBhY2Nlc3NpYmlsaXR5IGxhYmVsOiAke2V4cGVjdGVkVGV4dH1gKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhOYXRpdmVJbXBsaWNpdFdhaXQoMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUNvbnRyb2xXaXRoU2Nyb2xsaW5nKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGB0ZXh0IG9yIGFjY2Vzc2liaWxpdHkgbGFiZWw6ICR7ZXhwZWN0ZWRUZXh0fWAsXG4gICAgICAgIGRpcmVjdEZpbmQsXG4gICAgICAgIHNjcm9sbFNlbGVjdG9yczogc2VsZWN0b3JzXG4gICAgICB9LCB7Li4uYXJncywgc2Nyb2xsVG86IGFyZ3Muc2Nyb2xsVG8gPz8gdHJ1ZX0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCBhIHRlc3QgaWQgb3ducyBleHBlY3RlZCB2aXNpYmxlIHRleHQgb3IgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgbmF0aXZlIHJlc291cmNlIGlkIHN1ZmZpeC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRoYXQgbXVzdCBhcHBlYXIgdW5kZXIgdGhlIHRlc3QgaWQuXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgd2FpdEZvclRlc3RJRFRleHQodGVzdElkLCBleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIGF3YWl0IHN1cGVyLndhaXRGb3JUZXN0SURUZXh0KHRlc3RJZCwgZXhwZWN0ZWRUZXh0LCBhcmdzKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0b3JzID0gbmF0aXZlVGVzdElEVGV4dFNlbGVjdG9ycyh0ZXN0SWQsIGV4cGVjdGVkVGV4dClcbiAgICBjb25zdCBzY29wZWRUZXh0WHBhdGggPSBhbmRyb2lkU2NvcGVkVGV4dFhwYXRoKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KVxuICAgIGNvbnN0IGRpcmVjdEZpbmQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIHNlbGVjdG9yKSlcblxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2VyZSBmb3VuZCBieSBpZCAke3Rlc3RJZH0gd2l0aCB0ZXh0ICR7ZXhwZWN0ZWRUZXh0fWApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW1lbnRzWzBdKSByZXR1cm4gZWxlbWVudHNbMF1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2NvcGVkVGV4dEVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMoQnkueHBhdGgoc2NvcGVkVGV4dFhwYXRoKSlcbiAgICAgIGlmIChzY29wZWRUZXh0RWxlbWVudHNbMF0pIHJldHVybiBzY29wZWRUZXh0RWxlbWVudHNbMF1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGJ5IGlkICR7dGVzdElkfSB3aXRoIHRleHQgJHtleHBlY3RlZFRleHR9YClcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLndpdGhOYXRpdmVJbXBsaWNpdFdhaXQoMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYGlkICR7dGVzdElkfSB3aXRoIHRleHQgJHtleHBlY3RlZFRleHR9YCxcbiAgICAgICAgZGlyZWN0RmluZCxcbiAgICAgICAgc2Nyb2xsU2VsZWN0b3JzOiBuYXRpdmVUZXN0SURUZXh0U2Nyb2xsU2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KVxuICAgICAgfSwgey4uLmFyZ3MsIHNjcm9sbFRvOiBhcmdzLnNjcm9sbFRvID8/IHRydWV9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBuYXRpdmUgQW5kcm9pZCBjb250cm9sIGJ5IHJlc291cmNlIGlkLCBzY3JvbGxpbmcgaXQgaW50byB2aWV3IGZpcnN0IHdoZW4gcmVxdWVzdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSBuYXRpdmUgcmVzb3VyY2UgaWQgc3VmZml4LlxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc10gT3B0aW9uYWwgbG9va3VwIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59IE1hdGNoaW5nIG5hdGl2ZSBlbGVtZW50LlxuICAgKi9cbiAgYXN5bmMgZmluZE5hdGl2ZUNvbnRyb2xCeUlkKHRlc3RJZCwgYXJncyA9IHt9KSB7XG4gICAgY29uc3QgZGlyZWN0RmluZCA9IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuZmluZEJ5SWQodGVzdElkLCB7Li4uYXJncywgdGltZW91dDogMCwgc2Nyb2xsVG86IGZhbHNlfSlcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLndpdGhOYXRpdmVJbXBsaWNpdFdhaXQoMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUNvbnRyb2xXaXRoU2Nyb2xsaW5nKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBpZDogJHt0ZXN0SWR9YCxcbiAgICAgICAgZGlyZWN0RmluZCxcbiAgICAgICAgc2Nyb2xsU2VsZWN0b3JzOiBbYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpXVxuICAgICAgfSwgYXJncylcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgbmF0aXZlIGNvbnRyb2wsIHRyeWluZyBkaXJlY3QgbG9va3VwLCBVaVNjcm9sbGFibGUsIGFuZCB2aWV3cG9ydCBnZXN0dXJlIHNjcm9sbGluZy5cbiAgICogQHBhcmFtIHtOYXRpdmVDb250cm9sTG9va3VwfSBsb29rdXAgTG9va3VwIGNhbGxiYWNrcyBhbmQgZGlhZ25vc3RpY3MuXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgbmF0aXZlIGVsZW1lbnQuXG4gICAqL1xuICBhc3luYyBmaW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcobG9va3VwLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7c2Nyb2xsQ29udGFpbmVyVGVzdElEcyA9IFtdLCBzY3JvbGxUbyA9IHRydWUsIHRpbWVvdXQgPSAxMDAwMH0gPSBhcmdzXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGxldCBhdHRlbXB0ZWRVaVNlbGVjdG9yU2Nyb2xsID0gZmFsc2VcbiAgICAvKiogQHR5cGUge3Vua25vd259ICovXG4gICAgbGV0IGxhc3RFcnJvclxuXG4gICAgZG8ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGxvb2t1cC5kaXJlY3RGaW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGlmIChzY3JvbGxUbykge1xuICAgICAgICBpZiAoIWF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwpIHtcbiAgICAgICAgICBhdHRlbXB0ZWRVaVNlbGVjdG9yU2Nyb2xsID0gdHJ1ZVxuICAgICAgICAgIGZvciAoY29uc3Qgc2Nyb2xsU2VsZWN0b3Igb2YgbG9va3VwLnNjcm9sbFNlbGVjdG9ycykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxOYXRpdmVVaVNlbGVjdG9ySW50b1ZpZXcoc2Nyb2xsU2VsZWN0b3IsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICB2b2lkIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgbG9va3VwLmRpcmVjdEZpbmQoKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICAgICAgdm9pZCBlcnJvclxuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhWaWV3cG9ydFNjYW4obG9va3VwLmRpcmVjdEZpbmQsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgICBsYXN0RXJyb3IgPSBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aW1lb3V0ID09PSAwKSBicmVha1xuICAgICAgYXdhaXQgd2FpdCgxMDApXG4gICAgfSB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IHRpbWVvdXQpXG5cbiAgICBjb25zdCBlbGFwc2VkU2Vjb25kcyA9IChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDBcbiAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciAke2VsYXBzZWRTZWNvbmRzLnRvRml4ZWQoMil9cyBieSAke2xvb2t1cC5kZXNjcmlwdGlvbn1gLCBsYXN0RXJyb3IpXG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoZXMgbmF0aXZlIGNvbnRlbnQgYXJvdW5kIHRoZSBjdXJyZW50IHZpZXdwb3J0IHNvIHJldGFpbmVkIG9mZnNldHMgYW5kXG4gICAqIGJlbG93LWZvbGQgdGFyZ2V0cyBhcmUgYm90aCByZWFjaGFibGUgd2l0aG91dCBleGhhdXN0aW5nIHRoZSB0aW1lb3V0IGJ1ZGdldC5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gZGlyZWN0RmluZCBMb29rdXAgdG8gcmV0cnkgYWZ0ZXIgZWFjaCBzY3JvbGwuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNjcm9sbENvbnRhaW5lclRlc3RJRHMgTmF0aXZlIHRlc3QgSURzIHRoYXQgbWF5IGlkZW50aWZ5IHNjcm9sbCBjb250YWluZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59IE1hdGNoaW5nIGNvbnRyb2wuXG4gICAqL1xuICBhc3luYyBmaW5kTmF0aXZlQ29udHJvbFdpdGhWaWV3cG9ydFNjYW4oZGlyZWN0RmluZCwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcykge1xuICAgIGNvbnN0IHVwU2Nyb2xsU3RhdGUgPSB0aGlzLm5ld05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGUoKVxuICAgIGNvbnN0IGRvd25TY3JvbGxTdGF0ZSA9IHRoaXMubmV3TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZSgpXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgTUFYX05BVElWRV9WSUVXUE9SVF9TQ1JPTExfU1RFUFM7IGluZGV4ICs9IDEpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlVmlld3BvcnQodXBTY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcywgXCJ1cFwiKVxuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZGlyZWN0RmluZCgpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoIWlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnNjcm9sbE5hdGl2ZVZpZXdwb3J0KGRvd25TY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcywgXCJkb3duXCIpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBkaXJlY3RGaW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBuYXRpdmUgdmlld3BvcnQgc2NhblwiKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlfSBGcmVzaCBzY3JvbGwgZmFsbGJhY2sgc3RhdGUuXG4gICAqL1xuICBuZXdOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0cnlFbGVtZW50U2Nyb2xsOiB0cnVlLFxuICAgICAgdHJ5Vmlld3BvcnRTY3JvbGw6IHRydWVcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBleHBsaWNpdCBuYXRpdmUgcG9sbGluZyB3aXRob3V0IEFwcGl1bSdzIGltcGxpY2l0IHdhaXQgZXh0ZW5kaW5nIGV2ZXJ5IGZhaWxlZCBwcm9iZS5cbiAgICogQHRlbXBsYXRlIFRSZXN1bHQgUmVzdWx0IHR5cGUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbXBsaWNpdFdhaXRNcyBJbXBsaWNpdCB3YWl0IGR1cmF0aW9uIHRvIGFwcGx5IGR1cmluZyB0aGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUUmVzdWx0Pn0gY2FsbGJhY2sgV29yayB0aGF0IG93bnMgaXRzIG93biBwb2xsaW5nIHRpbWVvdXQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFRSZXN1bHQ+fSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB3aXRoTmF0aXZlSW1wbGljaXRXYWl0KGltcGxpY2l0V2FpdE1zLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IHRpbWVvdXRzID0gLyoqIEB0eXBlIHtOYXRpdmVUaW1lb3V0c30gKi8gKGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuZ2V0VGltZW91dHMoKSlcblxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuc2V0VGltZW91dHMoLyoqIEB0eXBlIHtOYXRpdmVUaW1lb3V0T3B0aW9uc30gKi8gKHtpbXBsaWNpdDogaW1wbGljaXRXYWl0TXN9KSlcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cygvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRPcHRpb25zfSAqLyAoe2ltcGxpY2l0OiB0aW1lb3V0cy5pbXBsaWNpdH0pKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIHRoZSB2aXNpYmxlIG5hdGl2ZSB2aWV3cG9ydCB3aGVuIFVpU2Nyb2xsYWJsZSBjYW5ub3QgaWRlbnRpZnkgdGhlIG93bmluZyBTY3JvbGxWaWV3LlxuICAgKiBAcGFyYW0ge05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGV9IHNjcm9sbFN0YXRlIFBlci1sb29rdXAgQXBwaXVtIHNjcm9sbCBzdGF0ZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxEaXJlY3Rpb259IGRpcmVjdGlvbiBEaXJlY3Rpb24gdG8gc2Nyb2xsIHRoZSBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgQXBwaXVtIHBlcmZvcm1zIHRoZSBnZXN0dXJlLlxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsTmF0aXZlVmlld3BvcnQoc2Nyb2xsU3RhdGUsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMsIGRpcmVjdGlvbikge1xuICAgIGNvbnN0IHdpbmRvd1JlY3QgPSAvKiogQHR5cGUge05hdGl2ZVdpbmRvd1JlY3R9ICovIChhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLndpbmRvdygpLmdldFJlY3QoKSlcbiAgICBjb25zdCBob3Jpem9udGFsSW5zZXQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHdpbmRvd1JlY3Qud2lkdGggKiAwLjEpKVxuICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iod2luZG93UmVjdC5oZWlnaHQgKiAwLjIpKVxuICAgIGNvbnN0IHdpZHRoID0gTWF0aC5tYXgoMSwgd2luZG93UmVjdC53aWR0aCAtIGhvcml6b250YWxJbnNldCAqIDIpXG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aW5kb3dSZWN0LmhlaWdodCAqIDAuNikpXG5cbiAgICBpZiAoc2Nyb2xsU3RhdGUudHJ5RWxlbWVudFNjcm9sbCAmJiBzY3JvbGxDb250YWluZXJUZXN0SURzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3Qgc2Nyb2xsQ29udGFpbmVyVGVzdElEIG9mIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkaWRTY3JvbGwgPSBhd2FpdCB0aGlzLnNjcm9sbE5hdGl2ZUVsZW1lbnQoc2Nyb2xsQ29udGFpbmVyVGVzdElELCBkaXJlY3Rpb24pXG4gICAgICAgICAgaWYgKGRpZFNjcm9sbCkgcmV0dXJuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgc2Nyb2xsU3RhdGUudHJ5RWxlbWVudFNjcm9sbCA9IGZhbHNlXG4gICAgICAgICAgaWYgKCFpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRpZFNjcm9sbCA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChcIm1vYmlsZTogc2Nyb2xsR2VzdHVyZVwiLCB7XG4gICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICBsZWZ0OiBob3Jpem9udGFsSW5zZXQsXG4gICAgICAgICAgcGVyY2VudDogMC43NSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgd2lkdGhcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKGRpZFNjcm9sbCA9PT0gdHJ1ZSkgcmV0dXJuXG4gICAgICAgIHNjcm9sbFN0YXRlLnRyeVZpZXdwb3J0U2Nyb2xsID0gZmFsc2VcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNjcm9sbFN0YXRlLnRyeVZpZXdwb3J0U2Nyb2xsID0gZmFsc2VcbiAgICAgICAgaWYgKCFpc1Vuc3VwcG9ydGVkTW9iaWxlR2VzdHVyZUVycm9yKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjZW50ZXJYID0gTWF0aC5mbG9vcih3aW5kb3dSZWN0LnggKyB3aW5kb3dSZWN0LndpZHRoIC8gMilcbiAgICBjb25zdCBzdGFydFkgPSBNYXRoLmZsb29yKHdpbmRvd1JlY3QueSArIHdpbmRvd1JlY3QuaGVpZ2h0ICogKGRpcmVjdGlvbiA9PT0gXCJkb3duXCIgPyAwLjc4IDogMC4yOCkpXG4gICAgY29uc3QgZW5kWSA9IE1hdGguZmxvb3Iod2luZG93UmVjdC55ICsgd2luZG93UmVjdC5oZWlnaHQgKiAoZGlyZWN0aW9uID09PSBcImRvd25cIiA/IDAuMjggOiAwLjc4KSlcblxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZShuZXcgQ29tbWFuZChOYW1lLkFDVElPTlMpLnNldFBhcmFtZXRlcihcImFjdGlvbnNcIiwgW1xuICAgICAge1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAge2R1cmF0aW9uOiAxMDAsIG9yaWdpbjogT3JpZ2luLlZJRVdQT1JULCB0eXBlOiBcInBvaW50ZXJNb3ZlXCIsIHg6IGNlbnRlclgsIHk6IHN0YXJ0WX0sXG4gICAgICAgICAge2J1dHRvbjogMCwgdHlwZTogXCJwb2ludGVyRG93blwifSxcbiAgICAgICAgICB7ZHVyYXRpb246IDI1MCwgb3JpZ2luOiBPcmlnaW4uVklFV1BPUlQsIHR5cGU6IFwicG9pbnRlck1vdmVcIiwgeDogY2VudGVyWCwgeTogZW5kWX0sXG4gICAgICAgICAge2J1dHRvbjogMCwgdHlwZTogXCJwb2ludGVyVXBcIn1cbiAgICAgICAgXSxcbiAgICAgICAgaWQ6IFwibmF0aXZlIHNjcm9sbCBmaW5nZXJcIixcbiAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgIHBvaW50ZXJUeXBlOiBcInRvdWNoXCJcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogXCJwb2ludGVyXCJcbiAgICAgIH1cbiAgICBdKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIGEgc3BlY2lmaWMgbmF0aXZlIEFuZHJvaWQgZWxlbWVudCBieSB0ZXN0IGlkIHdoZW4gQXBwaXVtIGV4cG9zZXMgaXQgYXMgYSBzY3JvbGwgY29udGFpbmVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSBuYXRpdmUgcmVzb3VyY2UgaWQgc3VmZml4LlxuICAgKiBAcGFyYW0ge05hdGl2ZVZpZXdwb3J0U2Nyb2xsRGlyZWN0aW9ufSBkaXJlY3Rpb24gRGlyZWN0aW9uIHRvIHNjcm9sbCB0aGUgY29udGVudC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgQXBwaXVtIHJlcG9ydGVkIG1vcmUgY29udGVudCB0byBzY3JvbGwuXG4gICAqL1xuICBhc3luYyBzY3JvbGxOYXRpdmVFbGVtZW50KHRlc3RJZCwgZGlyZWN0aW9uKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhuZXcgQnkoXCItYW5kcm9pZCB1aWF1dG9tYXRvclwiLCBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCkpKVxuICAgIGNvbnN0IHNjcm9sbEVsZW1lbnQgPSBlbGVtZW50c1swXVxuXG4gICAgaWYgKCFzY3JvbGxFbGVtZW50KSByZXR1cm4gZmFsc2VcblxuICAgIGNvbnN0IGRpZFNjcm9sbCA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChcIm1vYmlsZTogc2Nyb2xsR2VzdHVyZVwiLCB7XG4gICAgICBkaXJlY3Rpb24sXG4gICAgICBlbGVtZW50SWQ6IGF3YWl0IHNjcm9sbEVsZW1lbnQuZ2V0SWQoKSxcbiAgICAgIHBlcmNlbnQ6IDAuNzVcbiAgICB9KVxuXG4gICAgcmV0dXJuIGRpZFNjcm9sbCA9PT0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmVzIGFuIG9mZnNjcmVlbiBBbmRyb2lkIGNvbnRyb2wgaW50byBhIFNjcm9sbFZpZXctYmFja2VkIG5hdGl2ZSBoaWVyYXJjaHkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1aVNlbGVjdG9yIFVpQXV0b21hdG9yIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IGNvbnRyb2wuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHNjcm9sbENvbnRhaW5lclRlc3RJRHMgTmF0aXZlIHRlc3QgSURzIHRoYXQgbWF5IGlkZW50aWZ5IHNjcm9sbCBjb250YWluZXJzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgVWlBdXRvbWF0b3IgYXR0ZW1wdHMgdGhlIHNjcm9sbC5cbiAgICovXG4gIGFzeW5jIHNjcm9sbE5hdGl2ZVVpU2VsZWN0b3JJbnRvVmlldyh1aVNlbGVjdG9yLCBzY3JvbGxDb250YWluZXJUZXN0SURzKSB7XG4gICAgY29uc3Qgc2Nyb2xsYWJsZVNlbGVjdG9ycyA9IFtcbiAgICAgIC4uLnNjcm9sbENvbnRhaW5lclRlc3RJRHMubWFwKChzY3JvbGxDb250YWluZXJUZXN0SUQpID0+IGFuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3Ioc2Nyb2xsQ29udGFpbmVyVGVzdElEKSksXG4gICAgICBcIm5ldyBVaVNlbGVjdG9yKCkuc2Nyb2xsYWJsZSh0cnVlKVwiXG4gICAgXVxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgbGFzdEVycm9yXG5cbiAgICBmb3IgKGNvbnN0IHNjcm9sbGFibGVTZWxlY3RvciBvZiBzY3JvbGxhYmxlU2VsZWN0b3JzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIGBuZXcgVWlTY3JvbGxhYmxlKCR7c2Nyb2xsYWJsZVNlbGVjdG9yfSkuc2Nyb2xsSW50b1ZpZXcoJHt1aVNlbGVjdG9yfSlgKSlcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobGFzdEVycm9yKSB0aHJvdyBsYXN0RXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgY3VycmVudCBzZXNzaW9uIGlzIGEgbmF0aXZlIEFuZHJvaWQgYXBwLCBub3QgQW5kcm9pZCBDaHJvbWUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIHdoZW4gVWlBdXRvbWF0b3IgcmVzb3VyY2UtaWQgbG9va3VwIHNob3VsZCBiZSB1c2VkLlxuICAgKi9cbiAgaXNBbmRyb2lkTmF0aXZlQXBwQ29udGV4dCgpIHtcbiAgICBjb25zdCBwbGF0Zm9ybU5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5wbGF0Zm9ybU5hbWVcbiAgICBjb25zdCBicm93c2VyTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LmJyb3dzZXJOYW1lID8/IHRoaXMub3B0aW9ucy5icm93c2VyTmFtZVxuXG4gICAgcmV0dXJuIHR5cGVvZiBwbGF0Zm9ybU5hbWUgPT09IFwic3RyaW5nXCIgJiYgcGxhdGZvcm1OYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYW5kcm9pZFwiICYmICFicm93c2VyTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gc2VydmVyQXJnc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgYnVpbGRTZXJ2ZXJVcmwoc2VydmVyQXJncykge1xuICAgIGNvbnN0IGFkZHJlc3MgPSBzZXJ2ZXJBcmdzLmFkZHJlc3MgPz8gXCIxMjcuMC4wLjFcIlxuICAgIGNvbnN0IHBvcnQgPSBzZXJ2ZXJBcmdzLnBvcnQgPz8gNDcyM1xuICAgIGNvbnN0IGJhc2VQYXRoID0gc2VydmVyQXJncy5iYXNlUGF0aCA/IChzZXJ2ZXJBcmdzLmJhc2VQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gc2VydmVyQXJncy5iYXNlUGF0aCA6IGAvJHtzZXJ2ZXJBcmdzLmJhc2VQYXRofWApIDogXCJcIlxuXG4gICAgcmV0dXJuIGBodHRwOi8vJHthZGRyZXNzfToke3BvcnR9JHtiYXNlUGF0aH1gXG4gIH1cbn1cbiJdfQ==
935
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwaXVtLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL2FwcGl1bS1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDakMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBQyxPQUFPLEVBQUUsRUFBRSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDOUMsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQTtBQUMvRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUNBQWlDLENBQUE7QUFDdEQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFVBQVUsQ0FBQTtBQUM3QixPQUFPLE9BQU8sTUFBTSwyQkFBMkIsQ0FBQTtBQUMvQyxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVuRCxNQUFNLGdDQUFnQyxHQUFHLENBQUMsQ0FBQTtBQUMxQyxNQUFNLDBDQUEwQyxHQUFHLEdBQUcsQ0FBQTtBQUV0RDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFDSDs7O0dBR0c7QUFFSDs7OztHQUlHO0FBQ0gsU0FBUyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUs7SUFDcEMsTUFBTSxLQUFLLEdBQUcsdUNBQXVDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO0lBQzFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ25CLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFLO0lBQ3pCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUNyRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNB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QVEsRUFBRSxDQUFBO0lBQy9DLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7QnVpbGRlciwgQnl9IGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXJcIlxuaW1wb3J0IHtDb21tYW5kLCBOYW1lfSBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyL2xpYi9jb21tYW5kLmpzXCJcbmltcG9ydCB7T3JpZ2lufSBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyL2xpYi9pbnB1dC5qc1wiXG5pbXBvcnQge3dhaXR9IGZyb20gXCJhd2FpdGVyeVwiXG5pbXBvcnQgdGltZW91dCBmcm9tIFwiYXdhaXRlcnkvYnVpbGQvdGltZW91dC5qc1wiXG5pbXBvcnQgV2ViRHJpdmVyRHJpdmVyIGZyb20gXCIuL3dlYmRyaXZlci1kcml2ZXIuanNcIlxuXG5jb25zdCBNQVhfTkFUSVZFX1ZJRVdQT1JUX1NDUk9MTF9TVEVQUyA9IDhcbmNvbnN0IERFRkFVTFRfTkFUSVZFX05FV19DT01NQU5EX1RJTUVPVVRfU0VDT05EUyA9IDE4MFxuXG4vKipcbiAqIEFwcGl1bSB0aW1lb3V0IHZhbHVlcyByZXR1cm5lZCBieSBTZWxlbml1bS5cbiAqIEB0eXBlZGVmIHt7aW1wbGljaXQ6IG51bWJlciwgcGFnZUxvYWQ/OiBudW1iZXIsIHNjcmlwdD86IG51bWJlcn19IE5hdGl2ZVRpbWVvdXRzXG4gKi9cbi8qKlxuICogQXBwaXVtIHRpbWVvdXQgdXBkYXRlIHNoYXBlIGFjY2VwdGVkIGJ5IFNlbGVuaXVtLlxuICogQHR5cGVkZWYge3tpbXBsaWNpdD86IG51bWJlciwgcGFnZUxvYWQ/OiBudW1iZXIsIHNjcmlwdD86IG51bWJlcn19IE5hdGl2ZVRpbWVvdXRPcHRpb25zXG4gKi9cbi8qKlxuICogTmF0aXZlIEFwcGl1bSB3aW5kb3cgZGltZW5zaW9ucy5cbiAqIEB0eXBlZGVmIHt7eDogbnVtYmVyLCB5OiBudW1iZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyfX0gTmF0aXZlV2luZG93UmVjdFxuICovXG4vKipcbiAqIFRyYWNrcyBuYXRpdmUgc2Nyb2xsIGZhbGxiYWNrcyB0aGF0IGFscmVhZHkgcmVwb3J0ZWQgbm8gbW92ZW1lbnQuXG4gKiBAdHlwZWRlZiB7e3RyeUVsZW1lbnRTY3JvbGw6IGJvb2xlYW4sIHRyeVZpZXdwb3J0U2Nyb2xsOiBib29sZWFufX0gTmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZVxuICovXG4vKipcbiAqIE5hdGl2ZSB2aWV3cG9ydCBzY3JvbGwgZGlyZWN0aW9uLlxuICogQHR5cGVkZWYge1wiZG93blwifFwidXBcIn0gTmF0aXZlVmlld3BvcnRTY3JvbGxEaXJlY3Rpb25cbiAqL1xuLyoqXG4gKiBOYXRpdmUgQW5kcm9pZCBsb29rdXAgd29yayBleGVjdXRlZCBieSB0aGUgc2Nyb2xsaW5nIHBvbGxlci5cbiAqIEB0eXBlZGVmIHt7ZGVzY3JpcHRpb246IHN0cmluZywgZGlyZWN0RmluZDogKCkgPT4gUHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD4sIHNjcm9sbFNlbGVjdG9yczogc3RyaW5nW119fSBOYXRpdmVDb250cm9sTG9va3VwXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHBhcmFtIHt1bmtub3dufSBjYXVzZVxuICogQHJldHVybnMge0Vycm9yICYge2NhdXNlOiB1bmtub3dufX1cbiAqL1xuZnVuY3Rpb24gZXJyb3JXaXRoQ2F1c2UobWVzc2FnZSwgY2F1c2UpIHtcbiAgY29uc3QgZXJyb3IgPSAvKiogQHR5cGUge0Vycm9yICYge2NhdXNlOiB1bmtub3dufX0gKi8gKG5ldyBFcnJvcihtZXNzYWdlKSlcbiAgZXJyb3IuY2F1c2UgPSBjYXVzZVxuICByZXR1cm4gZXJyb3Jcbn1cblxuLyoqXG4gKiBFc2NhcGVzIHRleHQgZm9yIHVzZSBpbnNpZGUgYSBKYXZhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBVbmVzY2FwZWQgcmVnZXggdGV4dC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJlZ2V4LXNhZmUgdGV4dC5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZywgXCJcXFxcJCZcIilcbn1cblxuLyoqXG4gKiBFc2NhcGVzIHRleHQgZm9yIHVzZSBpbnNpZGUgYSBxdW90ZWQgVWlBdXRvbWF0b3IgSmF2YSBzdHJpbmcuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgVW5lc2NhcGVkIEphdmEgc3RyaW5nIHRleHQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBKYXZhLXN0cmluZy1zYWZlIHRleHQuXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUphdmFTdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJylcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBVaUF1dG9tYXRvciBzZWxlY3RvciBmb3IgUmVhY3QgTmF0aXZlIGFuZCBwYWNrYWdlLXF1YWxpZmllZCByZXNvdXJjZSBJRHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFJlc291cmNlIGlkIHN1ZmZpeCB0byBtYXRjaC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFVpQXV0b21hdG9yIHNlbGVjdG9yIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3IodGVzdElkKSB7XG4gIHJldHVybiBgbmV3IFVpU2VsZWN0b3IoKS5yZXNvdXJjZUlkTWF0Y2hlcyhcIihefC4qOmlkLykke2VzY2FwZUphdmFTdHJpbmcoZXNjYXBlUmVnRXhwKHRlc3RJZCkpfSRcIilgXG59XG5cbi8qKlxuICogQnVpbGRzIGEgVWlBdXRvbWF0b3Igc2VsZWN0b3IgdGhhdCBtYXRjaGVzIHZpc2libGUgdGV4dC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVaUF1dG9tYXRvciBzZWxlY3RvciBzb3VyY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmRyb2lkVGV4dENvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KSB7XG4gIHJldHVybiBgbmV3IFVpU2VsZWN0b3IoKS50ZXh0Q29udGFpbnMoXCIke2VzY2FwZUphdmFTdHJpbmcoZXhwZWN0ZWRUZXh0KX1cIilgXG59XG5cbi8qKlxuICogQnVpbGRzIGEgVWlBdXRvbWF0b3Igc2VsZWN0b3IgdGhhdCBtYXRjaGVzIGFuIGFjY2Vzc2liaWxpdHkgbGFiZWwuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdG8gbG9jYXRlLlxuICogQHJldHVybnMge3N0cmluZ30gVWlBdXRvbWF0b3Igc2VsZWN0b3Igc291cmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5kcm9pZERlc2NyaXB0aW9uQ29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpIHtcbiAgcmV0dXJuIGBuZXcgVWlTZWxlY3RvcigpLmRlc2NyaXB0aW9uQ29udGFpbnMoXCIke2VzY2FwZUphdmFTdHJpbmcoZXhwZWN0ZWRUZXh0KX1cIilgXG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgbmF0aXZlIGxvb2t1cCBmYWlsZWQgYmVjYXVzZSB0aGUgY29udHJvbCBpcyBub3QgY3VycmVudGx5IG1vdW50ZWQgb25zY3JlZW4uXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yIFZhbHVlIHRocm93biBieSBBcHBpdW0gbG9va3VwLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgbmF0aXZlIHNjcm9sbGluZyBzaG91bGQgYmUgYXR0ZW1wdGVkLlxuICovXG5mdW5jdGlvbiBpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSB7XG4gIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIkVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmRcIikgfHwgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIkNvdWxkbid0IGdldCBlbGVtZW50c1wiKVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBob3N0ZWQgQXBwaXVtIGRyaXZlciBsYWNrcyB0aGUgbW9iaWxlIGdlc3R1cmUgZXh0ZW5zaW9uLlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvciBWYWx1ZSB0aHJvd24gYnkgQXBwaXVtLlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgVzNDIGFjdGlvbnMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gaXNVbnN1cHBvcnRlZE1vYmlsZUdlc3R1cmVFcnJvcihlcnJvcikge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkgcmV0dXJuIGZhbHNlXG5cbiAgcmV0dXJuIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yXCIpIHx8XG4gICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIk1ldGhvZCBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkXCIpIHx8XG4gICAgZXJyb3IubWVzc2FnZS5pbmNsdWRlcyhcIlVua25vd24gbW9iaWxlIGNvbW1hbmRcIilcbn1cblxuLyoqXG4gKiBBZGRzIGEgVWlBdXRvbWF0b3IgdGV4dCBwcmVkaWNhdGUgdG8gYSByZXNvdXJjZS1pZCBzZWxlY3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZVNlbGVjdG9yIFVpQXV0b21hdG9yIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGZpbHRlclNlbGVjdG9yIFVpQXV0b21hdG9yIHRleHQgb3IgZGVzY3JpcHRpb24gc2VsZWN0b3IuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb21iaW5lZCBzZWxlY3Rvci5cbiAqL1xuZnVuY3Rpb24gY29tYmluZUFuZHJvaWRTZWxlY3RvcnMocmVzb3VyY2VTZWxlY3RvciwgZmlsdGVyU2VsZWN0b3IpIHtcbiAgY29uc3QgcHJlZml4ID0gXCJuZXcgVWlTZWxlY3RvcigpXCJcblxuICBpZiAoIWZpbHRlclNlbGVjdG9yLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgQW5kcm9pZCBzZWxlY3RvciB0byBzdGFydCB3aXRoICR7cHJlZml4fSwgZ290ICR7ZmlsdGVyU2VsZWN0b3J9YClcbiAgfVxuXG4gIHJldHVybiBgJHtyZXNvdXJjZVNlbGVjdG9yfSR7ZmlsdGVyU2VsZWN0b3Iuc2xpY2UocHJlZml4Lmxlbmd0aCl9YFxufVxuXG4vKipcbiAqIEFkZHMgYSBVaUF1dG9tYXRvciBjaGlsZCBwcmVkaWNhdGUgdG8gYSByZXNvdXJjZS1pZCBzZWxlY3Rvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZXNvdXJjZVNlbGVjdG9yIFVpQXV0b21hdG9yIHJlc291cmNlLWlkIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IGNoaWxkU2VsZWN0b3IgVWlBdXRvbWF0b3IgY2hpbGQgc2VsZWN0b3IuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb21iaW5lZCBzZWxlY3Rvci5cbiAqL1xuZnVuY3Rpb24gY2hpbGRBbmRyb2lkU2VsZWN0b3IocmVzb3VyY2VTZWxlY3RvciwgY2hpbGRTZWxlY3Rvcikge1xuICByZXR1cm4gYCR7cmVzb3VyY2VTZWxlY3Rvcn0uY2hpbGRTZWxlY3Rvcigke2NoaWxkU2VsZWN0b3J9KWBcbn1cblxuLyoqXG4gKiBFc2NhcGVzIHRleHQgZm9yIHVzZSBhcyBhbiBYUGF0aCBzdHJpbmcgbGl0ZXJhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBVbmVzY2FwZWQgWFBhdGggdGV4dC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFF1b3RlZCBsaXRlcmFsIG9yIGNvbmNhdCBleHByZXNzaW9uIHNhZmUgZm9yIFhQYXRoLlxuICovXG5mdW5jdGlvbiB4cGF0aFN0cmluZ0xpdGVyYWwodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZS5pbmNsdWRlcygnXCInKSkgcmV0dXJuIGBcIiR7dmFsdWV9XCJgXG4gIGlmICghdmFsdWUuaW5jbHVkZXMoXCInXCIpKSByZXR1cm4gYCcke3ZhbHVlfSdgXG5cbiAgcmV0dXJuIGBjb25jYXQoJHt2YWx1ZS5zcGxpdCgnXCInKS5tYXAoKHBhcnQpID0+IGBcIiR7cGFydH1cImApLmpvaW4oXCIsICdcXFwiJywgXCIpfSlgXG59XG5cbi8qKlxuICogQnVpbGRzIGFuIFhQYXRoIHNlbGVjdG9yIGZvciB0ZXh0IHVuZGVyIG9uZSBuYXRpdmUgQW5kcm9pZCByZXNvdXJjZSBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgUmVzb3VyY2UgaWQgc3VmZml4IHRvIHNjb3BlIHVuZGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZSBpbnNpZGUgdGhhdCBzY29wZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFhQYXRoIHNlbGVjdG9yIHNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gYW5kcm9pZFNjb3BlZFRleHRYcGF0aCh0ZXN0SWQsIGV4cGVjdGVkVGV4dCkge1xuICBjb25zdCByZXNvdXJjZUlkID0geHBhdGhTdHJpbmdMaXRlcmFsKHRlc3RJZClcbiAgY29uc3QgdGV4dCA9IHhwYXRoU3RyaW5nTGl0ZXJhbChleHBlY3RlZFRleHQpXG4gIGNvbnN0IHJlc291cmNlUHJlZGljYXRlID0gYChAcmVzb3VyY2UtaWQgPSAke3Jlc291cmNlSWR9IG9yIHN1YnN0cmluZyhAcmVzb3VyY2UtaWQsIHN0cmluZy1sZW5ndGgoQHJlc291cmNlLWlkKSAtIHN0cmluZy1sZW5ndGgoJHtyZXNvdXJjZUlkfSkgKyAxKSA9ICR7cmVzb3VyY2VJZH0pYFxuICBjb25zdCB0ZXh0UHJlZGljYXRlID0gYChjb250YWlucyhAdGV4dCwgJHt0ZXh0fSkgb3IgY29udGFpbnMoQGNvbnRlbnQtZGVzYywgJHt0ZXh0fSkpYFxuXG4gIHJldHVybiBgLy8qWyR7cmVzb3VyY2VQcmVkaWNhdGV9IGFuZCAke3RleHRQcmVkaWNhdGV9XSB8IC8vKlske3Jlc291cmNlUHJlZGljYXRlfV0vLypbJHt0ZXh0UHJlZGljYXRlfV1gXG59XG5cbi8qKlxuICogQnVpbGRzIHNlbGVjdG9ycyB0aGF0IHNjb3BlIHRleHQgbWF0Y2hpbmcgdG8gb25lIG5hdGl2ZSByZXNvdXJjZSBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgU3RhYmxlIHRlc3QgaWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdGhhdCBtdXN0IGFwcGVhciBvbiB0aGF0IGVsZW1lbnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nW119IFVpQXV0b21hdG9yIHNlbGVjdG9ycy5cbiAqL1xuZnVuY3Rpb24gbmF0aXZlVGVzdElEVGV4dFNlbGVjdG9ycyh0ZXN0SWQsIGV4cGVjdGVkVGV4dCkge1xuICBjb25zdCByZXNvdXJjZVNlbGVjdG9yID0gYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpXG5cbiAgcmV0dXJuIFtcbiAgICBjb21iaW5lQW5kcm9pZFNlbGVjdG9ycyhyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkVGV4dENvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KSksXG4gICAgY29tYmluZUFuZHJvaWRTZWxlY3RvcnMocmVzb3VyY2VTZWxlY3RvciwgYW5kcm9pZERlc2NyaXB0aW9uQ29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKSxcbiAgICBjaGlsZEFuZHJvaWRTZWxlY3RvcihyZXNvdXJjZVNlbGVjdG9yLCBhbmRyb2lkVGV4dENvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KSksXG4gICAgY2hpbGRBbmRyb2lkU2VsZWN0b3IocmVzb3VyY2VTZWxlY3RvciwgYW5kcm9pZERlc2NyaXB0aW9uQ29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpKVxuICBdXG59XG5cbi8qKlxuICogQnVpbGRzIG5hdGl2ZSBBbmRyb2lkIHNjcm9sbCBzZWxlY3RvcnMgZm9yIGEgc2NvcGVkIHRleHQgYXNzZXJ0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZCBTdGFibGUgdGVzdCBpZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0aGF0IG11c3QgYXBwZWFyIG9uIHRoYXQgZWxlbWVudC5cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gVWlBdXRvbWF0b3Igc2VsZWN0b3JzLlxuICovXG5mdW5jdGlvbiBuYXRpdmVUZXN0SURUZXh0U2Nyb2xsU2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KSB7XG4gIHJldHVybiBbXG4gICAgLi4ubmF0aXZlVGVzdElEVGV4dFNlbGVjdG9ycyh0ZXN0SWQsIGV4cGVjdGVkVGV4dCksXG4gICAgYW5kcm9pZFJlc291cmNlSWRTZWxlY3Rvcih0ZXN0SWQpXG4gIF1cbn1cblxuLyoqXG4gKiBFbnN1cmVzIENocm9tZSBBcHBpdW0gY2FwYWJpbGl0aWVzIHVzZSBhIGNhbGxlci1vd25lZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICogVGhpcyBhdm9pZHMgcmVwZWF0ZWQgc2Vzc2lvbnMgbGVha2luZyB0ZW1wIHByb2ZpbGVzIHVuZGVyIGAvdG1wYCBpbiBDSS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYnJvd3Nlck5hbWVdXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MuY2FwYWJpbGl0aWVzXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MudGVtcFJvb3REaXJdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ2hyb21lVXNlckRhdGFEaXJDYXBhYmlsaXR5KHticm93c2VyTmFtZSwgY2FwYWJpbGl0aWVzLCB0ZW1wUm9vdERpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInRtcFwiLCBcImFwcGl1bS1jaHJvbWUtdXNlci1kYXRhXCIpfSkge1xuICBjb25zdCByZXNvbHZlZEJyb3dzZXJOYW1lID0gY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lID8/IGJyb3dzZXJOYW1lXG5cbiAgaWYgKHR5cGVvZiByZXNvbHZlZEJyb3dzZXJOYW1lICE9PSBcInN0cmluZ1wiIHx8IHJlc29sdmVkQnJvd3Nlck5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJjaHJvbWVcIikge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGNvbnN0IHBsYXRmb3JtTmFtZSA9IGNhcGFiaWxpdGllcy5wbGF0Zm9ybU5hbWVcblxuICBpZiAodHlwZW9mIHBsYXRmb3JtTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhbmRyb2lkXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBjaHJvbWVPcHRpb25zID0gY2FwYWJpbGl0aWVzW1wiZ29vZzpjaHJvbWVPcHRpb25zXCJdXG4gIGNvbnN0IGFyZ3MgPSBBcnJheS5pc0FycmF5KGNocm9tZU9wdGlvbnM/LmFyZ3MpID8gWy4uLmNocm9tZU9wdGlvbnMuYXJnc10gOiBbXVxuXG4gIGlmIChhcmdzLnNvbWUoKGFyZykgPT4gdHlwZW9mIGFyZyA9PT0gXCJzdHJpbmdcIiAmJiBhcmcuc3RhcnRzV2l0aChcIi0tdXNlci1kYXRhLWRpcj1cIikpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgYXdhaXQgZnMubWtkaXIodGVtcFJvb3REaXIsIHtyZWN1cnNpdmU6IHRydWV9KVxuXG4gIGNvbnN0IHVzZXJEYXRhRGlyID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4odGVtcFJvb3REaXIsIFwicHJvZmlsZS1cIikpXG5cbiAgYXJncy5wdXNoKGAtLXVzZXItZGF0YS1kaXI9JHt1c2VyRGF0YURpcn1gKVxuICBjYXBhYmlsaXRpZXNbXCJnb29nOmNocm9tZU9wdGlvbnNcIl0gPSB7XG4gICAgLi4uKGNocm9tZU9wdGlvbnMgPz8ge30pLFxuICAgIGFyZ3NcbiAgfVxuXG4gIHJldHVybiB1c2VyRGF0YURpclxufVxuXG4vKipcbiAqIEtlZXBzIG5hdGl2ZSBBcHBpdW0gc2Vzc2lvbnMgYWxpdmUgd2hpbGUgdGhlIFJlYWN0IE5hdGl2ZSBhcHAgb3BlbnMgdGhlIHN5c3RlbS10ZXN0IFdlYlNvY2tldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MuY2FwYWJpbGl0aWVzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZU5hdGl2ZU5ld0NvbW1hbmRUaW1lb3V0Q2FwYWJpbGl0eSh7Y2FwYWJpbGl0aWVzfSkge1xuICBjb25zdCBwbGF0Zm9ybU5hbWUgPSBjYXBhYmlsaXRpZXMucGxhdGZvcm1OYW1lXG5cbiAgaWYgKHR5cGVvZiBwbGF0Zm9ybU5hbWUgIT09IFwic3RyaW5nXCIgfHwgcGxhdGZvcm1OYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiYW5kcm9pZFwiKSByZXR1cm5cbiAgaWYgKHR5cGVvZiBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPT09IFwic3RyaW5nXCIgJiYgY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lLmxlbmd0aCA+IDApIHJldHVyblxuICBpZiAoY2FwYWJpbGl0aWVzW1wiYXBwaXVtOm5ld0NvbW1hbmRUaW1lb3V0XCJdICE9PSB1bmRlZmluZWQpIHJldHVyblxuICBpZiAoY2FwYWJpbGl0aWVzLm5ld0NvbW1hbmRUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHJldHVyblxuXG4gIGNhcGFiaWxpdGllc1tcImFwcGl1bTpuZXdDb21tYW5kVGltZW91dFwiXSA9IERFRkFVTFRfTkFUSVZFX05FV19DT01NQU5EX1RJTUVPVVRfU0VDT05EU1xufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFwcGl1bURyaXZlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VydmVyVXJsXSBSZW1vdGUgQXBwaXVtIHNlcnZlciBVUkwgdG8gY29ubmVjdCB0by5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3NlcnZlckFyZ3NdIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBBcHBpdW0gc2VydmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3VzZURyaXZlcnNdIEFwcGl1bSBkcml2ZXIgbmFtZXMgdG8gbG9hZCB3aGVuIHN0YXJ0aW5nIHRoZSBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtjYXBhYmlsaXRpZXNdIERlc2lyZWQgY2FwYWJpbGl0aWVzIGZvciB0aGUgc2Vzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYnJvd3Nlck5hbWVdIEJyb3dzZXIgbmFtZSBmb3Igd2ViIHNlc3Npb25zLlxuICogQHByb3BlcnR5IHtcImFjY2Vzc2liaWxpdHlJZFwifFwiY3NzXCJ8XCJpZFwifSBbdGVzdElkU3RyYXRlZ3ldIFN0cmF0ZWd5IGZvciByZXNvbHZpbmcgdGVzdCBJRHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rlc3RJZEF0dHJpYnV0ZV0gQXR0cmlidXRlIG5hbWUgd2hlbiB1c2luZyB0aGUgQ1NTIHRlc3QgSUQgc3RyYXRlZ3kuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmluZEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgbG9va3VwLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlIChgdHJ1ZWApIG9yIGhpZGRlbiAoYGZhbHNlYCkuIFVzZSBgbnVsbGAgdG8gZGlzYWJsZSB2aXNpYmlsaXR5IGZpbHRlcmluZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Njcm9sbFRvXSBXaGV0aGVyIHRvIHNjcm9sbCBmb3VuZCBlbGVtZW50cyBpbnRvIHZpZXcgYmVmb3JlIHJldHVybmluZyB0aGVtLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3Njcm9sbENvbnRhaW5lclRlc3RJRHNdIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IHNob3VsZCBiZSB0cmllZCBhcyBzY3JvbGwgY29udGFpbmVycyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHZpZXdwb3J0IGdlc3R1cmVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG5cbi8qKlxuICogQXBwaXVtIGRyaXZlciBiYWNrZWQgYnkgdGhlIEFwcGl1bSBzZXJ2ZXIgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBwaXVtRHJpdmVyIGV4dGVuZHMgV2ViRHJpdmVyRHJpdmVyIHtcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGNocm9tZVVzZXJEYXRhRGlyID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3Qgc2VydmVyQXJncyA9IHsuLi4odGhpcy5vcHRpb25zLnNlcnZlckFyZ3MgPz8ge30pfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VEcml2ZXJzICYmICFzZXJ2ZXJBcmdzLnVzZURyaXZlcnMpIHtcbiAgICAgIHNlcnZlckFyZ3MudXNlRHJpdmVycyA9IHRoaXMub3B0aW9ucy51c2VEcml2ZXJzXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zZXJ2ZXJVcmwpIHtcbiAgICAgIHRoaXMuc2VydmVyVXJsID0gdGhpcy5vcHRpb25zLnNlcnZlclVybFxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhcHBpdW1Nb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJhcHBpdW1cIilcbiAgICAgIGNvbnN0IGFwcGl1bU1haW4gPSBhcHBpdW1Nb2R1bGUubWFpbiA/PyBhcHBpdW1Nb2R1bGUuZGVmYXVsdD8ubWFpblxuXG4gICAgICBpZiAoIWFwcGl1bU1haW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXBwaXVtIG1haW4oKSBpcyB1bmF2YWlsYWJsZSBmcm9tIHRoZSBhcHBpdW0gcGFja2FnZVwiKVxuICAgICAgfVxuXG4gICAgICB0aGlzLmFwcGl1bVNlcnZlciA9IGF3YWl0IGFwcGl1bU1haW4oc2VydmVyQXJncylcbiAgICAgIHRoaXMuc2VydmVyVXJsID0gdGhpcy5idWlsZFNlcnZlclVybChzZXJ2ZXJBcmdzKVxuICAgIH1cblxuICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXMgPyB7Li4udGhpcy5vcHRpb25zLmNhcGFiaWxpdGllc30gOiB7fVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5icm93c2VyTmFtZSAmJiAhY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lKSB7XG4gICAgICBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcbiAgICB9XG4gICAgaWYgKGNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUgPSBcIlwiXG4gICAgfVxuXG4gICAgdGhpcy5jaHJvbWVVc2VyRGF0YURpciA9IGF3YWl0IGVuc3VyZUNocm9tZVVzZXJEYXRhRGlyQ2FwYWJpbGl0eSh7XG4gICAgICBicm93c2VyTmFtZTogdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lLFxuICAgICAgY2FwYWJpbGl0aWVzXG4gICAgfSlcbiAgICBlbnN1cmVOYXRpdmVOZXdDb21tYW5kVGltZW91dENhcGFiaWxpdHkoe2NhcGFiaWxpdGllc30pXG5cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKS51c2luZ1NlcnZlcih0aGlzLnNlcnZlclVybClcblxuICAgIGlmIChPYmplY3Qua2V5cyhjYXBhYmlsaXRpZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGJ1aWxkZXIud2l0aENhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXMpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdlYkRyaXZlciA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKVxuXG4gICAgICB0aGlzLnNldFdlYkRyaXZlcih3ZWJEcml2ZXIpXG4gICAgICB0aGlzLmluc3RhbGxFeGl0SGFuZGxlcnMoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHN1cGVyLnN0b3AoKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAodGhpcy5hcHBpdW1TZXJ2ZXI/LmNsb3NlKSB7XG4gICAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgY2xvc2luZyBBcHBpdW0gc2VydmVyXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLmFwcGl1bVNlcnZlcj59ICovICh0aGlzLmFwcGl1bVNlcnZlcikuY2xvc2UoKSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5hcHBpdW1TZXJ2ZXIgPSB1bmRlZmluZWRcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cENocm9tZVVzZXJEYXRhRGlyKClcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG4gIGFzeW5jIGNsZWFudXBDaHJvbWVVc2VyRGF0YURpcigpIHtcbiAgICBpZiAoIXRoaXMuY2hyb21lVXNlckRhdGFEaXIpIHJldHVyblxuXG4gICAgY29uc3QgY2hyb21lVXNlckRhdGFEaXIgPSB0aGlzLmNocm9tZVVzZXJEYXRhRGlyXG5cbiAgICB0aGlzLmNocm9tZVVzZXJEYXRhRGlyID0gdW5kZWZpbmVkXG4gICAgYXdhaXQgZnMucm0oY2hyb21lVXNlckRhdGFEaXIsIHtyZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFsbCBjb29raWVzLiBTa2lwcGVkIGZvciBuYXRpdmUgYXBwIGNvbnRleHRzIHdoZXJlIGNvb2tpZVxuICAgKiBtYW5hZ2VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgVWlBdXRvbWF0b3IyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbENvb2tpZXMoKSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICAgIGlmICghYnJvd3Nlck5hbWUpIHJldHVyblxuXG4gICAgYXdhaXQgc3VwZXIuZGVsZXRlQWxsQ29va2llcygpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgZ2V0QnJvd3NlckxvZ3MoKSB7XG4gICAgY29uc3QgcGxhdGZvcm1OYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8ucGxhdGZvcm1OYW1lXG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcbiAgICBjb25zdCBpc0FuZHJvaWQgPSB0eXBlb2YgcGxhdGZvcm1OYW1lID09PSBcInN0cmluZ1wiICYmIHBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFuZHJvaWRcIlxuXG4gICAgaWYgKGlzQW5kcm9pZCAmJiAhYnJvd3Nlck5hbWUpIHtcbiAgICAgIGxldCBlbnRyaWVzXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGVudHJpZXMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLmxvZ3MoKS5nZXQoXCJsb2djYXRcIilcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW11cbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9nY2F0TG9ncyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjb25zdCBtZXNzYWdlTWF0Y2ggPSBlbnRyeS5tZXNzYWdlLm1hdGNoKC9eKC4rKSAoXFxkKyk6KFxcZCspICguKykkLylcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VNYXRjaCA/IG1lc3NhZ2VNYXRjaFs0XSA6IGVudHJ5Lm1lc3NhZ2VcblxuICAgICAgICBsb2djYXRMb2dzLnB1c2goYCR7ZW50cnkubGV2ZWwubmFtZX06ICR7bWVzc2FnZX1gKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9nY2F0TG9nc1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBzdXBlci5nZXRCcm93c2VyTG9ncygpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSB0ZXN0IElELlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kQnlUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgY29uc3QgdGVzdElkU3RyYXRlZ3kgPSB0aGlzLm9wdGlvbnMudGVzdElkU3RyYXRlZ3kgPz8gXCJhY2Nlc3NpYmlsaXR5SWRcIlxuXG4gICAgaWYgKHRlc3RJZFN0cmF0ZWd5ID09PSBcImNzc1wiKSB7XG4gICAgICBjb25zdCB0ZXN0SWRBdHRyaWJ1dGUgPSB0aGlzLm9wdGlvbnMudGVzdElkQXR0cmlidXRlID8/IFwiZGF0YS10ZXN0aWRcIlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZChgWyR7dGVzdElkQXR0cmlidXRlfT0nJHt0ZXN0SUR9J11gLCBhcmdzKVxuICAgIH1cbiAgICBpZiAodGVzdElkU3RyYXRlZ3kgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZEJ5SWQodGVzdElELCBhcmdzKVxuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SUQsIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGlzIGN1cnJlbnRseSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBoYXNUZXN0SUQodGVzdElELCBhcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRCwgey4uLmFyZ3MsIHRpbWVvdXQ6IDB9KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKFwiRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBhZnRlciBcIikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzXG5cbiAgICB0cnkge1xuICAgICAgZWxlbWVudHMgPSBhd2FpdCB0aGlzLmFsbEJ5QWNjZXNzaWJpbGl0eUlkKHRlc3RJZCwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke3R5cGVvZiBlcnJvcn0gLSAke2Vycm9yfSAoYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgIH1cblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiAxIGVsZW1lbnRzICgke2VsZW1lbnRzLmxlbmd0aH0pIHdhcyBmb3VuZCBieSBhY2Nlc3NpYmlsaXR5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IGFjY2Vzc2liaWxpdHkgaWQ6ICR7dGVzdElkfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzWzBdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGxCeUFjY2Vzc2liaWxpdHlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInVzZUJhc2VTZWxlY3RvclwiKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhuZXcgQnkoXCJhY2Nlc3NpYmlsaXR5IGlkXCIsIHRlc3RJZCkpXG5cbiAgICAgIGlmICh2aXNpYmxlICE9PSB0cnVlICYmIHZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmb3VuZEVsZW1lbnRzXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbHRlcmVkRWxlbWVudHMgPSBbXVxuXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm91bmRFbGVtZW50cykge1xuICAgICAgICBjb25zdCBpc0Rpc3BsYXllZCA9IGF3YWl0IHRoaXMuaXNFbGVtZW50RGlzcGxheWVkKGVsZW1lbnQpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIWlzRGlzcGxheWVkKSBjb250aW51ZVxuICAgICAgICBpZiAoIXZpc2libGUgJiYgaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG5cbiAgICAgICAgZmlsdGVyZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZEVsZW1lbnRzXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHMgPSBbXVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gYWN0dWFsVGltZW91dCA9PSAwID8gMCA6IGdldFRpbWVMZWZ0KClcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRpbWVMZWZ0ID09IDApIHtcbiAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG5cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgfSwgdGltZUxlZnQpXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJUaW1lb3V0RXJyb3JcIiAmJiBnZXRUaW1lTGVmdCgpID4gMCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgQ291bGRuJ3QgZ2V0IGVsZW1lbnRzIHdpdGggYWNjZXNzaWJpbGl0eSBpZDogJHt0ZXN0SWR9OiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3J9YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYW4gZWxlbWVudCBpcyBkaXNwbGF5ZWQuIEZvciBuYXRpdmUgYXBwIGNvbnRleHRzLCBhbHdheXNcbiAgICogcmV0dXJucyB0cnVlIGJlY2F1c2UgU2VsZW5pdW0ncyBpc0Rpc3BsYXllZCgpIEpTIGF0b20gaXMgbm90IHN1cHBvcnRlZFxuICAgKiBieSBVaUF1dG9tYXRvcjIgaW4gbmF0aXZlIG1vZGUsIGFuZCBlbGVtZW50cyBmb3VuZCBieSBVaUF1dG9tYXRvcjInc1xuICAgKiBhY2Nlc3NpYmlsaXR5IGlkIC8gaWQgc2VhcmNoIGFyZSBhbHJlYWR5IGluIHRoZSByZW5kZXJlZCB2aWV3IGhpZXJhcmNoeS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KSB7XG4gICAgY29uc3QgYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzPy5icm93c2VyTmFtZSA/PyB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWVcblxuICAgIGlmICghYnJvd3Nlck5hbWUpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJZFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkgJiYgYXJncy5zY3JvbGxUbykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE5hdGl2ZUNvbnRyb2xCeUlkKHRlc3RJZCwgYXJncylcbiAgICB9XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50c1xuXG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGxCeUlkKHRlc3RJZCwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX0gLSAke2Vycm9yLm1lc3NhZ2V9IChpZDogJHt0ZXN0SWR9KWAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHt0eXBlb2YgZXJyb3J9IC0gJHtlcnJvcn0gKGlkOiAke3Rlc3RJZH0pYCwgZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IGlkOiAke3Rlc3RJZH1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWRcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsQnlJZCh0ZXN0SWQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKS5maWx0ZXIoKGtleSkgPT4ga2V5ICE9PSBcInVzZUJhc2VTZWxlY3RvclwiKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyh0aGlzLmlkTG9jYXRvcih0ZXN0SWQpKVxuXG4gICAgICBpZiAodmlzaWJsZSAhPT0gdHJ1ZSAmJiB2aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZm91bmRFbGVtZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gW11cblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZvdW5kRWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCB0aGlzLmlzRWxlbWVudERpc3BsYXllZChlbGVtZW50KVxuXG4gICAgICAgIGlmICh2aXNpYmxlICYmICFpc0Rpc3BsYXllZCkgY29udGludWVcbiAgICAgICAgaWYgKCF2aXNpYmxlICYmIGlzRGlzcGxheWVkKSBjb250aW51ZVxuXG4gICAgICAgIGZpbHRlcmVkRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmlsdGVyZWRFbGVtZW50c1xuICAgIH1cbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W119ICovXG4gICAgbGV0IGVsZW1lbnRzID0gW11cblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCB0aW1lTGVmdCA9IGFjdHVhbFRpbWVvdXQgPT0gMCA/IDAgOiBnZXRUaW1lTGVmdCgpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aW1lTGVmdCA9PSAwKSB7XG4gICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuXG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgIH0sIHRpbWVMZWZ0KVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVGltZW91dEVycm9yXCIgJiYgZ2V0VGltZUxlZnQoKSA+IDApIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYENvdWxkbid0IGdldCBlbGVtZW50cyB3aXRoIGlkOiAke3Rlc3RJZH06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLCBlcnJvcilcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsVG8pIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBpZCBsb2NhdG9yIGZvciB0aGUgYWN0aXZlIEFwcGl1bSBjb250ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFRlc3QgaWQgb3IgbmF0aXZlIHJlc291cmNlIGlkIHN1ZmZpeC5cbiAgICogQHJldHVybnMge0J5fSBTZWxlbml1bS9BcHBpdW0gbG9jYXRvci5cbiAgICovXG4gIGlkTG9jYXRvcih0ZXN0SWQpIHtcbiAgICBpZiAodGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIHJldHVybiBuZXcgQnkoXCItYW5kcm9pZCB1aWF1dG9tYXRvclwiLCBhbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCkpXG4gICAgfVxuXG4gICAgcmV0dXJuIEJ5LmlkKHRlc3RJZClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBuYXRpdmUgQW5kcm9pZCB2aXNpYmxlIHRleHQgb3IgYW4gYWNjZXNzaWJpbGl0eSBsYWJlbCwgc2Nyb2xsaW5nIGl0IGludG8gdmlldyB3aGVuIG5lZWRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkVGV4dCBUZXh0IHRvIGxvY2F0ZS5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBOYXRpdmUgZWxlbWVudCBjb250YWluaW5nIHRoZSB0ZXh0LlxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmF0aXZlVGV4dChleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIGlmICghdGhpcy5pc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmRCeU5hdGl2ZVRleHQgaXMgb25seSBzdXBwb3J0ZWQgZm9yIG5hdGl2ZSBBbmRyb2lkIEFwcGl1bSBzZXNzaW9uc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdG9ycyA9IFthbmRyb2lkVGV4dENvbnRhaW5zU2VsZWN0b3IoZXhwZWN0ZWRUZXh0KSwgYW5kcm9pZERlc2NyaXB0aW9uQ29udGFpbnNTZWxlY3RvcihleHBlY3RlZFRleHQpXVxuICAgIGNvbnN0IGRpcmVjdEZpbmQgPSBhc3luYyAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIG9mIHNlbGVjdG9ycykge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIHNlbGVjdG9yKSlcblxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuIGVsZW1lbnRzWzBdXG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgRWxlbWVudCBjb3VsZG4ndCBiZSBmb3VuZCBieSB0ZXh0IG9yIGFjY2Vzc2liaWxpdHkgbGFiZWw6ICR7ZXhwZWN0ZWRUZXh0fWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYHRleHQgb3IgYWNjZXNzaWJpbGl0eSBsYWJlbDogJHtleHBlY3RlZFRleHR9YCxcbiAgICAgICAgZGlyZWN0RmluZCxcbiAgICAgICAgc2Nyb2xsU2VsZWN0b3JzOiBzZWxlY3RvcnNcbiAgICAgIH0sIHsuLi5hcmdzLCBzY3JvbGxUbzogYXJncy5zY3JvbGxUbyA/PyB0cnVlfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIGEgdGVzdCBpZCBvd25zIGV4cGVjdGVkIHZpc2libGUgdGV4dCBvciBhbiBhY2Nlc3NpYmlsaXR5IGxhYmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElkIFN0YWJsZSBuYXRpdmUgcmVzb3VyY2UgaWQgc3VmZml4LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdGhhdCBtdXN0IGFwcGVhciB1bmRlciB0aGUgdGVzdCBpZC5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVGVzdElEVGV4dCh0ZXN0SWQsIGV4cGVjdGVkVGV4dCwgYXJncyA9IHt9KSB7XG4gICAgaWYgKCF0aGlzLmlzQW5kcm9pZE5hdGl2ZUFwcENvbnRleHQoKSkge1xuICAgICAgYXdhaXQgc3VwZXIud2FpdEZvclRlc3RJRFRleHQodGVzdElkLCBleHBlY3RlZFRleHQsIGFyZ3MpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzZWxlY3RvcnMgPSBuYXRpdmVUZXN0SURUZXh0U2VsZWN0b3JzKHRlc3RJZCwgZXhwZWN0ZWRUZXh0KVxuICAgIGNvbnN0IHNjb3BlZFRleHRYcGF0aCA9IGFuZHJvaWRTY29wZWRUZXh0WHBhdGgodGVzdElkLCBleHBlY3RlZFRleHQpXG4gICAgY29uc3QgZGlyZWN0RmluZCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgc2VsZWN0b3Igb2Ygc2VsZWN0b3JzKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgc2VsZWN0b3IpKVxuXG4gICAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSBlbGVtZW50cyAoJHtlbGVtZW50cy5sZW5ndGh9KSB3ZXJlIGZvdW5kIGJ5IGlkICR7dGVzdElkfSB3aXRoIHRleHQgJHtleHBlY3RlZFRleHR9YClcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbWVudHNbMF0pIHJldHVybiBlbGVtZW50c1swXVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzY29wZWRUZXh0RWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhCeS54cGF0aChzY29wZWRUZXh0WHBhdGgpKVxuICAgICAgaWYgKHNjb3BlZFRleHRFbGVtZW50c1swXSkgcmV0dXJuIHNjb3BlZFRleHRFbGVtZW50c1swXVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYnkgaWQgJHt0ZXN0SWR9IHdpdGggdGV4dCAke2V4cGVjdGVkVGV4dH1gKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sV2l0aFNjcm9sbGluZyh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgaWQgJHt0ZXN0SWR9IHdpdGggdGV4dCAke2V4cGVjdGVkVGV4dH1gLFxuICAgICAgICBkaXJlY3RGaW5kLFxuICAgICAgICBzY3JvbGxTZWxlY3RvcnM6IG5hdGl2ZVRlc3RJRFRleHRTY3JvbGxTZWxlY3RvcnModGVzdElkLCBleHBlY3RlZFRleHQpXG4gICAgICB9LCB7Li4uYXJncywgc2Nyb2xsVG86IGFyZ3Muc2Nyb2xsVG8gPz8gdHJ1ZX0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIG5hdGl2ZSBBbmRyb2lkIGNvbnRyb2wgYnkgcmVzb3VyY2UgaWQsIHNjcm9sbGluZyBpdCBpbnRvIHZpZXcgZmlyc3Qgd2hlbiByZXF1ZXN0ZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgU3RhYmxlIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgbmF0aXZlIGVsZW1lbnQuXG4gICAqL1xuICBhc3luYyBmaW5kTmF0aXZlQ29udHJvbEJ5SWQodGVzdElkLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBkaXJlY3RGaW5kID0gYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5maW5kQnlJZCh0ZXN0SWQsIHsuLi5hcmdzLCB0aW1lb3V0OiAwLCBzY3JvbGxUbzogZmFsc2V9KVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMud2l0aE5hdGl2ZUltcGxpY2l0V2FpdCgwLCBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kTmF0aXZlQ29udHJvbFdpdGhTY3JvbGxpbmcoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYGlkOiAke3Rlc3RJZH1gLFxuICAgICAgICBkaXJlY3RGaW5kLFxuICAgICAgICBzY3JvbGxTZWxlY3RvcnM6IFthbmRyb2lkUmVzb3VyY2VJZFNlbGVjdG9yKHRlc3RJZCldXG4gICAgICB9LCBhcmdzKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBuYXRpdmUgY29udHJvbCwgdHJ5aW5nIGRpcmVjdCBsb29rdXAsIFVpU2Nyb2xsYWJsZSwgYW5kIHZpZXdwb3J0IGdlc3R1cmUgc2Nyb2xsaW5nLlxuICAgKiBAcGFyYW0ge05hdGl2ZUNvbnRyb2xMb29rdXB9IGxvb2t1cCBMb29rdXAgY2FsbGJhY2tzIGFuZCBkaWFnbm9zdGljcy5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBNYXRjaGluZyBuYXRpdmUgZWxlbWVudC5cbiAgICovXG4gIGFzeW5jIGZpbmROYXRpdmVDb250cm9sV2l0aFNjcm9sbGluZyhsb29rdXAsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzID0gW10sIHNjcm9sbFRvID0gdHJ1ZSwgdGltZW91dCA9IDEwMDAwfSA9IGFyZ3NcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgbGV0IGF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwgPSBmYWxzZVxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgICBsZXQgbGFzdEVycm9yXG5cbiAgICBkbyB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgbG9va3VwLmRpcmVjdEZpbmQoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgbGFzdEVycm9yID0gZXJyb3JcbiAgICAgIH1cblxuICAgICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICAgIGlmICghYXR0ZW1wdGVkVWlTZWxlY3RvclNjcm9sbCkge1xuICAgICAgICAgIGF0dGVtcHRlZFVpU2VsZWN0b3JTY3JvbGwgPSB0cnVlXG4gICAgICAgICAgZm9yIChjb25zdCBzY3JvbGxTZWxlY3RvciBvZiBsb29rdXAuc2Nyb2xsU2VsZWN0b3JzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbE5hdGl2ZVVpU2VsZWN0b3JJbnRvVmlldyhzY3JvbGxTZWxlY3Rvciwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcylcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHZvaWQgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBsb29rdXAuZGlyZWN0RmluZCgpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgICAgICB2b2lkIGVycm9yXG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmROYXRpdmVDb250cm9sV2l0aFZpZXdwb3J0U2Nhbihsb29rdXAuZGlyZWN0RmluZCwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcylcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoIWlzTmF0aXZlQ29udHJvbExvb2t1cE1pc3MoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgICAgIGxhc3RFcnJvciA9IGVycm9yXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRpbWVvdXQgPT09IDApIGJyZWFrXG4gICAgICBhd2FpdCB3YWl0KDEwMClcbiAgICB9IHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgdGltZW91dClcblxuICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5ICR7bG9va3VwLmRlc2NyaXB0aW9ufWAsIGxhc3RFcnJvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyBuYXRpdmUgY29udGVudCBhcm91bmQgdGhlIGN1cnJlbnQgdmlld3BvcnQgc28gcmV0YWluZWQgb2Zmc2V0cyBhbmRcbiAgICogYmVsb3ctZm9sZCB0YXJnZXRzIGFyZSBib3RoIHJlYWNoYWJsZSB3aXRob3V0IGV4aGF1c3RpbmcgdGhlIHRpbWVvdXQgYnVkZ2V0LlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fSBkaXJlY3RGaW5kIExvb2t1cCB0byByZXRyeSBhZnRlciBlYWNoIHNjcm9sbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgY29udHJvbC5cbiAgICovXG4gIGFzeW5jIGZpbmROYXRpdmVDb250cm9sV2l0aFZpZXdwb3J0U2NhbihkaXJlY3RGaW5kLCBzY3JvbGxDb250YWluZXJUZXN0SURzKSB7XG4gICAgY29uc3QgdXBTY3JvbGxTdGF0ZSA9IHRoaXMubmV3TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZSgpXG4gICAgY29uc3QgZG93blNjcm9sbFN0YXRlID0gdGhpcy5uZXdOYXRpdmVWaWV3cG9ydFNjcm9sbFN0YXRlKClcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBNQVhfTkFUSVZFX1ZJRVdQT1JUX1NDUk9MTF9TVEVQUzsgaW5kZXggKz0gMSkge1xuICAgICAgYXdhaXQgdGhpcy5zY3JvbGxOYXRpdmVWaWV3cG9ydCh1cFNjcm9sbFN0YXRlLCBzY3JvbGxDb250YWluZXJUZXN0SURzLCBcInVwXCIpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBkaXJlY3RGaW5kKClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghaXNOYXRpdmVDb250cm9sTG9va3VwTWlzcyhlcnJvcikpIHRocm93IGVycm9yXG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlVmlld3BvcnQoZG93blNjcm9sbFN0YXRlLCBzY3JvbGxDb250YWluZXJUZXN0SURzLCBcImRvd25cIilcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGRpcmVjdEZpbmQoKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKCFpc05hdGl2ZUNvbnRyb2xMb29rdXBNaXNzKGVycm9yKSkgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyIG5hdGl2ZSB2aWV3cG9ydCBzY2FuXCIpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGV9IEZyZXNoIHNjcm9sbCBmYWxsYmFjayBzdGF0ZS5cbiAgICovXG4gIG5ld05hdGl2ZVZpZXdwb3J0U2Nyb2xsU3RhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRyeUVsZW1lbnRTY3JvbGw6IHRydWUsXG4gICAgICB0cnlWaWV3cG9ydFNjcm9sbDogdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGV4cGxpY2l0IG5hdGl2ZSBwb2xsaW5nIHdpdGhvdXQgQXBwaXVtJ3MgaW1wbGljaXQgd2FpdCBleHRlbmRpbmcgZXZlcnkgZmFpbGVkIHByb2JlLlxuICAgKiBAdGVtcGxhdGUgVFJlc3VsdCBSZXN1bHQgdHlwZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGltcGxpY2l0V2FpdE1zIEltcGxpY2l0IHdhaXQgZHVyYXRpb24gdG8gYXBwbHkgZHVyaW5nIHRoZSBjYWxsYmFjay5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFRSZXN1bHQ+fSBjYWxsYmFjayBXb3JrIHRoYXQgb3ducyBpdHMgb3duIHBvbGxpbmcgdGltZW91dC5cbiAgICogQHJldHVybnMge1Byb21pc2U8VFJlc3VsdD59IENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHdpdGhOYXRpdmVJbXBsaWNpdFdhaXQoaW1wbGljaXRXYWl0TXMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdGltZW91dHMgPSAvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRzfSAqLyAoYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5nZXRUaW1lb3V0cygpKVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cygvKiogQHR5cGUge05hdGl2ZVRpbWVvdXRPcHRpb25zfSAqLyAoe2ltcGxpY2l0OiBpbXBsaWNpdFdhaXRNc30pKVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLnNldFRpbWVvdXRzKC8qKiBAdHlwZSB7TmF0aXZlVGltZW91dE9wdGlvbnN9ICovICh7aW1wbGljaXQ6IHRpbWVvdXRzLmltcGxpY2l0fSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIHZpc2libGUgbmF0aXZlIHZpZXdwb3J0IHdoZW4gVWlTY3JvbGxhYmxlIGNhbm5vdCBpZGVudGlmeSB0aGUgb3duaW5nIFNjcm9sbFZpZXcuXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxTdGF0ZX0gc2Nyb2xsU3RhdGUgUGVyLWxvb2t1cCBBcHBpdW0gc2Nyb2xsIHN0YXRlLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBzY3JvbGxDb250YWluZXJUZXN0SURzIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IG1heSBpZGVudGlmeSBzY3JvbGwgY29udGFpbmVycy5cbiAgICogQHBhcmFtIHtOYXRpdmVWaWV3cG9ydFNjcm9sbERpcmVjdGlvbn0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBzY3JvbGwgdGhlIGNvbnRlbnQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBBcHBpdW0gcGVyZm9ybXMgdGhlIGdlc3R1cmUuXG4gICAqL1xuICBhc3luYyBzY3JvbGxOYXRpdmVWaWV3cG9ydChzY3JvbGxTdGF0ZSwgc2Nyb2xsQ29udGFpbmVyVGVzdElEcywgZGlyZWN0aW9uKSB7XG4gICAgY29uc3Qgd2luZG93UmVjdCA9IC8qKiBAdHlwZSB7TmF0aXZlV2luZG93UmVjdH0gKi8gKGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkud2luZG93KCkuZ2V0UmVjdCgpKVxuICAgIGNvbnN0IGhvcml6b250YWxJbnNldCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iod2luZG93UmVjdC53aWR0aCAqIDAuMSkpXG4gICAgY29uc3QgdG9wID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcih3aW5kb3dSZWN0LmhlaWdodCAqIDAuMikpXG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heCgxLCB3aW5kb3dSZWN0LndpZHRoIC0gaG9yaXpvbnRhbEluc2V0ICogMilcbiAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHdpbmRvd1JlY3QuaGVpZ2h0ICogMC42KSlcblxuICAgIGlmIChzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsICYmIHNjcm9sbENvbnRhaW5lclRlc3RJRHMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBzY3JvbGxDb250YWluZXJUZXN0SUQgb2Ygc2Nyb2xsQ29udGFpbmVyVGVzdElEcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRpZFNjcm9sbCA9IGF3YWl0IHRoaXMuc2Nyb2xsTmF0aXZlRWxlbWVudChzY3JvbGxDb250YWluZXJUZXN0SUQsIGRpcmVjdGlvbilcbiAgICAgICAgICBpZiAoZGlkU2Nyb2xsKSByZXR1cm5cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBzY3JvbGxTdGF0ZS50cnlFbGVtZW50U2Nyb2xsID0gZmFsc2VcbiAgICAgICAgICBpZiAoIWlzVW5zdXBwb3J0ZWRNb2JpbGVHZXN0dXJlRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNjcm9sbFN0YXRlLnRyeUVsZW1lbnRTY3JvbGwgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmIChzY3JvbGxTdGF0ZS50cnlWaWV3cG9ydFNjcm9sbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZGlkU2Nyb2xsID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwibW9iaWxlOiBzY3JvbGxHZXN0dXJlXCIsIHtcbiAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGxlZnQ6IGhvcml6b250YWxJbnNldCxcbiAgICAgICAgICBwZXJjZW50OiAwLjc1LFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICB3aWR0aFxuICAgICAgICB9KVxuICAgICAgICBpZiAoZGlkU2Nyb2xsID09PSB0cnVlKSByZXR1cm5cbiAgICAgICAgc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwgPSBmYWxzZVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2Nyb2xsU3RhdGUudHJ5Vmlld3BvcnRTY3JvbGwgPSBmYWxzZVxuICAgICAgICBpZiAoIWlzVW5zdXBwb3J0ZWRNb2JpbGVHZXN0dXJlRXJyb3IoZXJyb3IpKSB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNlbnRlclggPSBNYXRoLmZsb29yKHdpbmRvd1JlY3QueCArIHdpbmRvd1JlY3Qud2lkdGggLyAyKVxuICAgIGNvbnN0IHN0YXJ0WSA9IE1hdGguZmxvb3Iod2luZG93UmVjdC55ICsgd2luZG93UmVjdC5oZWlnaHQgKiAoZGlyZWN0aW9uID09PSBcImRvd25cIiA/IDAuNzggOiAwLjI4KSlcbiAgICBjb25zdCBlbmRZID0gTWF0aC5mbG9vcih3aW5kb3dSZWN0LnkgKyB3aW5kb3dSZWN0LmhlaWdodCAqIChkaXJlY3Rpb24gPT09IFwiZG93blwiID8gMC4yOCA6IDAuNzgpKVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlKG5ldyBDb21tYW5kKE5hbWUuQUNUSU9OUykuc2V0UGFyYW1ldGVyKFwiYWN0aW9uc1wiLCBbXG4gICAgICB7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICB7ZHVyYXRpb246IDEwMCwgb3JpZ2luOiBPcmlnaW4uVklFV1BPUlQsIHR5cGU6IFwicG9pbnRlck1vdmVcIiwgeDogY2VudGVyWCwgeTogc3RhcnRZfSxcbiAgICAgICAgICB7YnV0dG9uOiAwLCB0eXBlOiBcInBvaW50ZXJEb3duXCJ9LFxuICAgICAgICAgIHtkdXJhdGlvbjogMjUwLCBvcmlnaW46IE9yaWdpbi5WSUVXUE9SVCwgdHlwZTogXCJwb2ludGVyTW92ZVwiLCB4OiBjZW50ZXJYLCB5OiBlbmRZfSxcbiAgICAgICAgICB7YnV0dG9uOiAwLCB0eXBlOiBcInBvaW50ZXJVcFwifVxuICAgICAgICBdLFxuICAgICAgICBpZDogXCJuYXRpdmUgc2Nyb2xsIGZpbmdlclwiLFxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgcG9pbnRlclR5cGU6IFwidG91Y2hcIlxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBcInBvaW50ZXJcIlxuICAgICAgfVxuICAgIF0pKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgYSBzcGVjaWZpYyBuYXRpdmUgQW5kcm9pZCBlbGVtZW50IGJ5IHRlc3QgaWQgd2hlbiBBcHBpdW0gZXhwb3NlcyBpdCBhcyBhIHNjcm9sbCBjb250YWluZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SWQgU3RhYmxlIG5hdGl2ZSByZXNvdXJjZSBpZCBzdWZmaXguXG4gICAqIEBwYXJhbSB7TmF0aXZlVmlld3BvcnRTY3JvbGxEaXJlY3Rpb259IGRpcmVjdGlvbiBEaXJlY3Rpb24gdG8gc2Nyb2xsIHRoZSBjb250ZW50LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciBBcHBpdW0gcmVwb3J0ZWQgbW9yZSBjb250ZW50IHRvIHNjcm9sbC5cbiAgICovXG4gIGFzeW5jIHNjcm9sbE5hdGl2ZUVsZW1lbnQodGVzdElkLCBkaXJlY3Rpb24pIHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZmluZEVsZW1lbnRzKG5ldyBCeShcIi1hbmRyb2lkIHVpYXV0b21hdG9yXCIsIGFuZHJvaWRSZXNvdXJjZUlkU2VsZWN0b3IodGVzdElkKSkpXG4gICAgY29uc3Qgc2Nyb2xsRWxlbWVudCA9IGVsZW1lbnRzWzBdXG5cbiAgICBpZiAoIXNjcm9sbEVsZW1lbnQpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgZGlkU2Nyb2xsID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwibW9iaWxlOiBzY3JvbGxHZXN0dXJlXCIsIHtcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGVsZW1lbnRJZDogYXdhaXQgc2Nyb2xsRWxlbWVudC5nZXRJZCgpLFxuICAgICAgcGVyY2VudDogMC43NVxuICAgIH0pXG5cbiAgICByZXR1cm4gZGlkU2Nyb2xsID09PSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgYW4gb2Zmc2NyZWVuIEFuZHJvaWQgY29udHJvbCBpbnRvIGEgU2Nyb2xsVmlldy1iYWNrZWQgbmF0aXZlIGhpZXJhcmNoeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHVpU2VsZWN0b3IgVWlBdXRvbWF0b3Igc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgY29udHJvbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gc2Nyb2xsQ29udGFpbmVyVGVzdElEcyBOYXRpdmUgdGVzdCBJRHMgdGhhdCBtYXkgaWRlbnRpZnkgc2Nyb2xsIGNvbnRhaW5lcnMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBVaUF1dG9tYXRvciBhdHRlbXB0cyB0aGUgc2Nyb2xsLlxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsTmF0aXZlVWlTZWxlY3RvckludG9WaWV3KHVpU2VsZWN0b3IsIHNjcm9sbENvbnRhaW5lclRlc3RJRHMpIHtcbiAgICBjb25zdCBzY3JvbGxhYmxlU2VsZWN0b3JzID0gW1xuICAgICAgLi4uc2Nyb2xsQ29udGFpbmVyVGVzdElEcy5tYXAoKHNjcm9sbENvbnRhaW5lclRlc3RJRCkgPT4gYW5kcm9pZFJlc291cmNlSWRTZWxlY3RvcihzY3JvbGxDb250YWluZXJUZXN0SUQpKSxcbiAgICAgIFwibmV3IFVpU2VsZWN0b3IoKS5zY3JvbGxhYmxlKHRydWUpXCJcbiAgICBdXG4gICAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICAgIGxldCBsYXN0RXJyb3JcblxuICAgIGZvciAoY29uc3Qgc2Nyb2xsYWJsZVNlbGVjdG9yIG9mIHNjcm9sbGFibGVTZWxlY3RvcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMobmV3IEJ5KFwiLWFuZHJvaWQgdWlhdXRvbWF0b3JcIiwgYG5ldyBVaVNjcm9sbGFibGUoJHtzY3JvbGxhYmxlU2VsZWN0b3J9KS5zY3JvbGxJbnRvVmlldygke3VpU2VsZWN0b3J9KWApKVxuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgcmV0dXJuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsYXN0RXJyb3IgPSBlcnJvclxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsYXN0RXJyb3IpIHRocm93IGxhc3RFcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IHNlc3Npb24gaXMgYSBuYXRpdmUgQW5kcm9pZCBhcHAsIG5vdCBBbmRyb2lkIENocm9tZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgd2hlbiBVaUF1dG9tYXRvciByZXNvdXJjZS1pZCBsb29rdXAgc2hvdWxkIGJlIHVzZWQuXG4gICAqL1xuICBpc0FuZHJvaWROYXRpdmVBcHBDb250ZXh0KCkge1xuICAgIGNvbnN0IHBsYXRmb3JtTmFtZSA9IHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXM/LnBsYXRmb3JtTmFtZVxuICAgIGNvbnN0IGJyb3dzZXJOYW1lID0gdGhpcy5vcHRpb25zLmNhcGFiaWxpdGllcz8uYnJvd3Nlck5hbWUgPz8gdGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lXG5cbiAgICByZXR1cm4gdHlwZW9mIHBsYXRmb3JtTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBwbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJhbmRyb2lkXCIgJiYgIWJyb3dzZXJOYW1lXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBzZXJ2ZXJBcmdzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBidWlsZFNlcnZlclVybChzZXJ2ZXJBcmdzKSB7XG4gICAgY29uc3QgYWRkcmVzcyA9IHNlcnZlckFyZ3MuYWRkcmVzcyA/PyBcIjEyNy4wLjAuMVwiXG4gICAgY29uc3QgcG9ydCA9IHNlcnZlckFyZ3MucG9ydCA/PyA0NzIzXG4gICAgY29uc3QgYmFzZVBhdGggPSBzZXJ2ZXJBcmdzLmJhc2VQYXRoID8gKHNlcnZlckFyZ3MuYmFzZVBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBzZXJ2ZXJBcmdzLmJhc2VQYXRoIDogYC8ke3NlcnZlckFyZ3MuYmFzZVBhdGh9YCkgOiBcIlwiXG5cbiAgICByZXR1cm4gYGh0dHA6Ly8ke2FkZHJlc3N9OiR7cG9ydH0ke2Jhc2VQYXRofWBcbiAgfVxufVxuIl19
@@ -1,11 +1,3 @@
1
- /**
2
- * @typedef {object} SeleniumDriverOptions
3
- * @property {string} [browserName] Browser name used by the WebDriver session.
4
- * @property {string[]} [chromeArguments] Chrome CLI arguments.
5
- * @property {import("selenium-webdriver/chrome.js").Options} [chromeOptions] Preconfigured Chrome options instance.
6
- * @property {Record<string, any>} [capabilities] Extra WebDriver capabilities.
7
- * @property {Record<string, any>} [loggingPrefs] Logging preferences for browser logs.
8
- */
9
1
  /**
10
2
  * Selenium WebDriver implementation.
11
3
  */
@@ -20,6 +12,10 @@ export type SeleniumDriverOptions = {
20
12
  * Chrome CLI arguments.
21
13
  */
22
14
  chromeArguments?: string[] | undefined;
15
+ /**
16
+ * Path to the Chromedriver executable.
17
+ */
18
+ chromedriverPath?: string | undefined;
23
19
  /**
24
20
  * Preconfigured Chrome options instance.
25
21
  */
@@ -28,6 +24,10 @@ export type SeleniumDriverOptions = {
28
24
  * Extra WebDriver capabilities.
29
25
  */
30
26
  capabilities?: Record<string, any> | undefined;
27
+ /**
28
+ * Timeout while waiting for Selenium to create a WebDriver session.
29
+ */
30
+ driverStartTimeout?: number | undefined;
31
31
  /**
32
32
  * Logging preferences for browser logs.
33
33
  */
@@ -1,14 +1,53 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
1
3
  import { Builder } from "selenium-webdriver";
4
+ import timeout from "awaitery/build/timeout.js";
2
5
  import chrome from "selenium-webdriver/chrome.js";
3
6
  import WebDriverDriver from "./webdriver-driver.js";
7
+ const DEFAULT_DRIVER_START_TIMEOUT_MS = 60000;
4
8
  /**
5
9
  * @typedef {object} SeleniumDriverOptions
6
10
  * @property {string} [browserName] Browser name used by the WebDriver session.
7
11
  * @property {string[]} [chromeArguments] Chrome CLI arguments.
12
+ * @property {string} [chromedriverPath] Path to the Chromedriver executable.
8
13
  * @property {import("selenium-webdriver/chrome.js").Options} [chromeOptions] Preconfigured Chrome options instance.
9
14
  * @property {Record<string, any>} [capabilities] Extra WebDriver capabilities.
15
+ * @property {number} [driverStartTimeout] Timeout while waiting for Selenium to create a WebDriver session.
10
16
  * @property {Record<string, any>} [loggingPrefs] Logging preferences for browser logs.
11
17
  */
18
+ /** @returns {string | undefined} */
19
+ function findChromedriverOnPath() {
20
+ const pathEnv = process.env.PATH;
21
+ if (!pathEnv)
22
+ return undefined;
23
+ const executableNames = process.platform === "win32" ? ["chromedriver.exe", "chromedriver.cmd", "chromedriver.bat", "chromedriver"] : ["chromedriver"];
24
+ for (const directory of pathEnv.split(path.delimiter)) {
25
+ if (!directory)
26
+ continue;
27
+ for (const executableName of executableNames) {
28
+ const executablePath = path.join(directory, executableName);
29
+ if (isExecutableFile(executablePath))
30
+ return executablePath;
31
+ }
32
+ }
33
+ return undefined;
34
+ }
35
+ /**
36
+ * @param {string} filePath
37
+ * @returns {boolean}
38
+ */
39
+ function isExecutableFile(filePath) {
40
+ try {
41
+ fs.accessSync(filePath, fs.constants.X_OK);
42
+ return true;
43
+ }
44
+ catch (error) {
45
+ if (error && typeof error === "object" && "code" in error && (error.code === "ENOENT" || error.code === "EACCES" || error.code === "ENOTDIR")) {
46
+ return false;
47
+ }
48
+ throw error;
49
+ }
50
+ }
12
51
  /**
13
52
  * Selenium WebDriver implementation.
14
53
  */
@@ -30,6 +69,10 @@ export default class SeleniumDriver extends WebDriverDriver {
30
69
  }
31
70
  const builder = new Builder().forBrowser(this.options.browserName ?? "chrome").setChromeOptions(chromeOptions);
32
71
  const capabilities = builder.getCapabilities();
72
+ const chromedriverPath = this.options.chromedriverPath ?? process.env.SYSTEM_TEST_CHROMEDRIVER_PATH ?? findChromedriverOnPath();
73
+ if (chromedriverPath) {
74
+ builder.setChromeService(new chrome.ServiceBuilder(chromedriverPath));
75
+ }
33
76
  const loggingPrefs = this.options.loggingPrefs ?? { browser: "ALL" };
34
77
  capabilities.set("goog:loggingPrefs", loggingPrefs);
35
78
  if (this.options.capabilities) {
@@ -37,9 +80,11 @@ export default class SeleniumDriver extends WebDriverDriver {
37
80
  capabilities.set(key, value);
38
81
  }
39
82
  }
40
- const webDriver = await builder.build();
83
+ const webDriver = await timeout({ timeout: this.options.driverStartTimeout ?? DEFAULT_DRIVER_START_TIMEOUT_MS, errorMessage: "timeout while starting Selenium WebDriver" }, async () => {
84
+ return await builder.build();
85
+ });
41
86
  this.setWebDriver(webDriver);
42
87
  this.installExitHandlers();
43
88
  }
44
89
  }
45
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZW5pdW0tZHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RyaXZlcnMvc2VsZW5pdW0tZHJpdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUMxQyxPQUFPLE1BQU0sTUFBTSw4QkFBOEIsQ0FBQTtBQUNqRCxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQTtBQUVuRDs7Ozs7OztHQU9HO0FBRUg7O0dBRUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLGNBQWUsU0FBUSxlQUFlO0lBQ3pEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQUs7UUFDVCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3BHLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJO1lBQ3RELHlCQUF5QjtZQUN6QixlQUFlO1lBQ2YsZ0JBQWdCO1lBQ2hCLGNBQWM7WUFDZCx5QkFBeUI7U0FDMUIsQ0FBQTtRQUVELEtBQUssTUFBTSxRQUFRLElBQUksZUFBZSxFQUFFLENBQUM7WUFDdkMsYUFBYSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUN0QyxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksUUFBUSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDOUcsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBRTlDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxDQUFBO1FBQ2xFLFlBQVksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUE7UUFFbkQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzlCLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDckUsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDOUIsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUV2QyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO0lBQzVCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QnVpbGRlcn0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQgY2hyb21lIGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvY2hyb21lLmpzXCJcbmltcG9ydCBXZWJEcml2ZXJEcml2ZXIgZnJvbSBcIi4vd2ViZHJpdmVyLWRyaXZlci5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VsZW5pdW1Ecml2ZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Jyb3dzZXJOYW1lXSBCcm93c2VyIG5hbWUgdXNlZCBieSB0aGUgV2ViRHJpdmVyIHNlc3Npb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbY2hyb21lQXJndW1lbnRzXSBDaHJvbWUgQ0xJIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyL2Nocm9tZS5qc1wiKS5PcHRpb25zfSBbY2hyb21lT3B0aW9uc10gUHJlY29uZmlndXJlZCBDaHJvbWUgb3B0aW9ucyBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2NhcGFiaWxpdGllc10gRXh0cmEgV2ViRHJpdmVyIGNhcGFiaWxpdGllcy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2xvZ2dpbmdQcmVmc10gTG9nZ2luZyBwcmVmZXJlbmNlcyBmb3IgYnJvd3NlciBsb2dzLlxuICovXG5cbi8qKlxuICogU2VsZW5pdW0gV2ViRHJpdmVyIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWxlbml1bURyaXZlciBleHRlbmRzIFdlYkRyaXZlckRyaXZlciB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIGNvbnN0IGNocm9tZU9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuY2hyb21lT3B0aW9ucyA/IHRoaXMub3B0aW9ucy5jaHJvbWVPcHRpb25zIDogbmV3IGNocm9tZS5PcHRpb25zKClcbiAgICBjb25zdCBjaHJvbWVBcmd1bWVudHMgPSB0aGlzLm9wdGlvbnMuY2hyb21lQXJndW1lbnRzID8/IFtcbiAgICAgIFwiLS1kaXNhYmxlLWRldi1zaG0tdXNhZ2VcIixcbiAgICAgIFwiLS1kaXNhYmxlLWdwdVwiLFxuICAgICAgXCItLWhlYWRsZXNzPW5ld1wiLFxuICAgICAgXCItLW5vLXNhbmRib3hcIixcbiAgICAgIFwiLS13aW5kb3ctc2l6ZT0xOTIwLDEwODBcIlxuICAgIF1cblxuICAgIGZvciAoY29uc3QgYXJndW1lbnQgb2YgY2hyb21lQXJndW1lbnRzKSB7XG4gICAgICBjaHJvbWVPcHRpb25zLmFkZEFyZ3VtZW50cyhhcmd1bWVudClcbiAgICB9XG5cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKS5mb3JCcm93c2VyKHRoaXMub3B0aW9ucy5icm93c2VyTmFtZSA/PyBcImNocm9tZVwiKS5zZXRDaHJvbWVPcHRpb25zKGNocm9tZU9wdGlvbnMpXG4gICAgY29uc3QgY2FwYWJpbGl0aWVzID0gYnVpbGRlci5nZXRDYXBhYmlsaXRpZXMoKVxuXG4gICAgY29uc3QgbG9nZ2luZ1ByZWZzID0gdGhpcy5vcHRpb25zLmxvZ2dpbmdQcmVmcyA/PyB7YnJvd3NlcjogXCJBTExcIn1cbiAgICBjYXBhYmlsaXRpZXMuc2V0KFwiZ29vZzpsb2dnaW5nUHJlZnNcIiwgbG9nZ2luZ1ByZWZzKVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXMpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub3B0aW9ucy5jYXBhYmlsaXRpZXMpKSB7XG4gICAgICAgIGNhcGFiaWxpdGllcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB3ZWJEcml2ZXIgPSBhd2FpdCBidWlsZGVyLmJ1aWxkKClcblxuICAgIHRoaXMuc2V0V2ViRHJpdmVyKHdlYkRyaXZlcilcbiAgICB0aGlzLmluc3RhbGxFeGl0SGFuZGxlcnMoKVxuICB9XG59XG4iXX0=
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZW5pdW0tZHJpdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RyaXZlcnMvc2VsZW5pdW0tZHJpdmVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQzFDLE9BQU8sT0FBTyxNQUFNLDJCQUEyQixDQUFBO0FBQy9DLE9BQU8sTUFBTSxNQUFNLDhCQUE4QixDQUFBO0FBQ2pELE9BQU8sZUFBZSxNQUFNLHVCQUF1QixDQUFBO0FBRW5ELE1BQU0sK0JBQStCLEdBQUcsS0FBSyxDQUFBO0FBRTdDOzs7Ozs7Ozs7R0FTRztBQUVILG9DQUFvQztBQUNwQyxTQUFTLHNCQUFzQjtJQUM3QixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQTtJQUVoQyxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sU0FBUyxDQUFBO0lBRTlCLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBRXRKLEtBQUssTUFBTSxTQUFTLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsU0FBUztZQUFFLFNBQVE7UUFFeEIsS0FBSyxNQUFNLGNBQWMsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUM3QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQTtZQUUzRCxJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FB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QUU7WUFDbkwsT0FBTyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUM5QixDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7SUFDNUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCJcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIlxuaW1wb3J0IHtCdWlsZGVyfSBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyXCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCBjaHJvbWUgZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlci9jaHJvbWUuanNcIlxuaW1wb3J0IFdlYkRyaXZlckRyaXZlciBmcm9tIFwiLi93ZWJkcml2ZXItZHJpdmVyLmpzXCJcblxuY29uc3QgREVGQVVMVF9EUklWRVJfU1RBUlRfVElNRU9VVF9NUyA9IDYwMDAwXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VsZW5pdW1Ecml2ZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Jyb3dzZXJOYW1lXSBCcm93c2VyIG5hbWUgdXNlZCBieSB0aGUgV2ViRHJpdmVyIHNlc3Npb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbY2hyb21lQXJndW1lbnRzXSBDaHJvbWUgQ0xJIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY2hyb21lZHJpdmVyUGF0aF0gUGF0aCB0byB0aGUgQ2hyb21lZHJpdmVyIGV4ZWN1dGFibGUuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlci9jaHJvbWUuanNcIikuT3B0aW9uc30gW2Nocm9tZU9wdGlvbnNdIFByZWNvbmZpZ3VyZWQgQ2hyb21lIG9wdGlvbnMgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IFtjYXBhYmlsaXRpZXNdIEV4dHJhIFdlYkRyaXZlciBjYXBhYmlsaXRpZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RyaXZlclN0YXJ0VGltZW91dF0gVGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBTZWxlbml1bSB0byBjcmVhdGUgYSBXZWJEcml2ZXIgc2Vzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2xvZ2dpbmdQcmVmc10gTG9nZ2luZyBwcmVmZXJlbmNlcyBmb3IgYnJvd3NlciBsb2dzLlxuICovXG5cbi8qKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xuZnVuY3Rpb24gZmluZENocm9tZWRyaXZlck9uUGF0aCgpIHtcbiAgY29uc3QgcGF0aEVudiA9IHByb2Nlc3MuZW52LlBBVEhcblxuICBpZiAoIXBhdGhFbnYpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBleGVjdXRhYmxlTmFtZXMgPSBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBbXCJjaHJvbWVkcml2ZXIuZXhlXCIsIFwiY2hyb21lZHJpdmVyLmNtZFwiLCBcImNocm9tZWRyaXZlci5iYXRcIiwgXCJjaHJvbWVkcml2ZXJcIl0gOiBbXCJjaHJvbWVkcml2ZXJcIl1cblxuICBmb3IgKGNvbnN0IGRpcmVjdG9yeSBvZiBwYXRoRW52LnNwbGl0KHBhdGguZGVsaW1pdGVyKSkge1xuICAgIGlmICghZGlyZWN0b3J5KSBjb250aW51ZVxuXG4gICAgZm9yIChjb25zdCBleGVjdXRhYmxlTmFtZSBvZiBleGVjdXRhYmxlTmFtZXMpIHtcbiAgICAgIGNvbnN0IGV4ZWN1dGFibGVQYXRoID0gcGF0aC5qb2luKGRpcmVjdG9yeSwgZXhlY3V0YWJsZU5hbWUpXG5cbiAgICAgIGlmIChpc0V4ZWN1dGFibGVGaWxlKGV4ZWN1dGFibGVQYXRoKSkgcmV0dXJuIGV4ZWN1dGFibGVQYXRoXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlUGF0aFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRXhlY3V0YWJsZUZpbGUoZmlsZVBhdGgpIHtcbiAgdHJ5IHtcbiAgICBmcy5hY2Nlc3NTeW5jKGZpbGVQYXRoLCBmcy5jb25zdGFudHMuWF9PSylcbiAgICByZXR1cm4gdHJ1ZVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiYgXCJjb2RlXCIgaW4gZXJyb3IgJiYgKGVycm9yLmNvZGUgPT09IFwiRU5PRU5UXCIgfHwgZXJyb3IuY29kZSA9PT0gXCJFQUNDRVNcIiB8fCBlcnJvci5jb2RlID09PSBcIkVOT1RESVJcIikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHRocm93IGVycm9yXG4gIH1cbn1cblxuLyoqXG4gKiBTZWxlbml1bSBXZWJEcml2ZXIgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlbGVuaXVtRHJpdmVyIGV4dGVuZHMgV2ViRHJpdmVyRHJpdmVyIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3QgY2hyb21lT3B0aW9ucyA9IHRoaXMub3B0aW9ucy5jaHJvbWVPcHRpb25zID8gdGhpcy5vcHRpb25zLmNocm9tZU9wdGlvbnMgOiBuZXcgY2hyb21lLk9wdGlvbnMoKVxuICAgIGNvbnN0IGNocm9tZUFyZ3VtZW50cyA9IHRoaXMub3B0aW9ucy5jaHJvbWVBcmd1bWVudHMgPz8gW1xuICAgICAgXCItLWRpc2FibGUtZGV2LXNobS11c2FnZVwiLFxuICAgICAgXCItLWRpc2FibGUtZ3B1XCIsXG4gICAgICBcIi0taGVhZGxlc3M9bmV3XCIsXG4gICAgICBcIi0tbm8tc2FuZGJveFwiLFxuICAgICAgXCItLXdpbmRvdy1zaXplPTE5MjAsMTA4MFwiXG4gICAgXVxuXG4gICAgZm9yIChjb25zdCBhcmd1bWVudCBvZiBjaHJvbWVBcmd1bWVudHMpIHtcbiAgICAgIGNocm9tZU9wdGlvbnMuYWRkQXJndW1lbnRzKGFyZ3VtZW50KVxuICAgIH1cblxuICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQnVpbGRlcigpLmZvckJyb3dzZXIodGhpcy5vcHRpb25zLmJyb3dzZXJOYW1lID8/IFwiY2hyb21lXCIpLnNldENocm9tZU9wdGlvbnMoY2hyb21lT3B0aW9ucylcbiAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSBidWlsZGVyLmdldENhcGFiaWxpdGllcygpXG4gICAgY29uc3QgY2hyb21lZHJpdmVyUGF0aCA9IHRoaXMub3B0aW9ucy5jaHJvbWVkcml2ZXJQYXRoID8/IHByb2Nlc3MuZW52LlNZU1RFTV9URVNUX0NIUk9NRURSSVZFUl9QQVRIID8/IGZpbmRDaHJvbWVkcml2ZXJPblBhdGgoKVxuXG4gICAgaWYgKGNocm9tZWRyaXZlclBhdGgpIHtcbiAgICAgIGJ1aWxkZXIuc2V0Q2hyb21lU2VydmljZShuZXcgY2hyb21lLlNlcnZpY2VCdWlsZGVyKGNocm9tZWRyaXZlclBhdGgpKVxuICAgIH1cblxuICAgIGNvbnN0IGxvZ2dpbmdQcmVmcyA9IHRoaXMub3B0aW9ucy5sb2dnaW5nUHJlZnMgPz8ge2Jyb3dzZXI6IFwiQUxMXCJ9XG4gICAgY2FwYWJpbGl0aWVzLnNldChcImdvb2c6bG9nZ2luZ1ByZWZzXCIsIGxvZ2dpbmdQcmVmcylcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9wdGlvbnMuY2FwYWJpbGl0aWVzKSkge1xuICAgICAgICBjYXBhYmlsaXRpZXMuc2V0KGtleSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViRHJpdmVyID0gYXdhaXQgdGltZW91dCh7dGltZW91dDogdGhpcy5vcHRpb25zLmRyaXZlclN0YXJ0VGltZW91dCA/PyBERUZBVUxUX0RSSVZFUl9TVEFSVF9USU1FT1VUX01TLCBlcnJvck1lc3NhZ2U6IFwidGltZW91dCB3aGlsZSBzdGFydGluZyBTZWxlbml1bSBXZWJEcml2ZXJcIn0sIGFzeW5jICgpID0+IHtcbiAgICAgIHJldHVybiBhd2FpdCBidWlsZGVyLmJ1aWxkKClcbiAgICB9KVxuXG4gICAgdGhpcy5zZXRXZWJEcml2ZXIod2ViRHJpdmVyKVxuICAgIHRoaXMuaW5zdGFsbEV4aXRIYW5kbGVycygpXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Resets an Expo Router stack to a target path for a system-test run.
3
+ * @param {object} args
4
+ * @param {ExpoNavigationContainerRef} args.navigationContainerRef
5
+ * @param {string} args.path
6
+ * @param {ExpoRouter} args.router
7
+ * @returns {Promise<void>}
8
+ */
9
+ export function dismissExpoRouterToPath({ navigationContainerRef, path, router }: {
10
+ navigationContainerRef: ExpoNavigationContainerRef;
11
+ path: string;
12
+ router: ExpoRouter;
13
+ }): Promise<void>;
14
+ export type ExpoNavigationState = {
15
+ addListener: (eventName: "state", callback: () => void) => () => void;
16
+ canGoBack: () => boolean;
17
+ };
18
+ export type ExpoNavigationContainerRef = {
19
+ current: ExpoNavigationState | null | undefined;
20
+ };
21
+ export type ExpoRouter = {
22
+ dismissAll: () => void;
23
+ dismissTo: (path: string) => void;
24
+ };