system-testing 1.0.120 → 1.0.122

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.
@@ -2,6 +2,7 @@ import { By, error as SeleniumError } from "selenium-webdriver";
2
2
  import logging from "selenium-webdriver/lib/logging.js";
3
3
  import { wait, waitFor } from "awaitery";
4
4
  import timeout from "awaitery/build/timeout.js";
5
+ import { testIdSelector } from "../test-id-selector.js";
5
6
  /**
6
7
  * @param {string} message
7
8
  * @param {unknown} cause
@@ -531,7 +532,7 @@ export default class WebDriverDriver {
531
532
  * @returns {Promise<import("selenium-webdriver").WebElement>}
532
533
  */
533
534
  async findByTestID(testID, args) {
534
- return await this.find(`[data-testid='${testID}']`, args);
535
+ return await this.find(testIdSelector(testID), args);
535
536
  }
536
537
  /**
537
538
  * Finds native Android visible text or an accessibility label.
@@ -817,7 +818,7 @@ export default class WebDriverDriver {
817
818
  * @returns {Promise<void>}
818
819
  */
819
820
  async scrollTestIdIntoView(testID, args) {
820
- const element = await this.findScrollTarget(`[data-testid='${testID}']`, args);
821
+ const element = await this.findScrollTarget(testIdSelector(testID), args);
821
822
  await this.scrollElementIntoView(element);
822
823
  }
823
824
  /**
@@ -1042,4 +1043,4 @@ export default class WebDriverDriver {
1042
1043
  }
1043
1044
  }
1044
1045
  }
1045
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViZHJpdmVyLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDN0QsT0FBTyxPQUFPLE1BQU0sbUNBQW1DLENBQUE7QUFDdkQsT0FBTyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFDdEMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUE7QUFFL0M7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLO0lBQ3BDLE1BQU0sS0FBSyxHQUFHLHVDQUF1QyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUMxRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUNuQixPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLE9BQU87SUFDakMsT0FBTyxPQUFPLENBQ1osT0FBTztRQUNQLE9BQU8sT0FBTyxLQUFLLFFBQVE7UUFDM0IsT0FBTyxJQUFJLE9BQU87UUFDbEIsT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FDcEMsQ0FBQTtBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLFlBQVksQ0FBQyxLQUFLO0lBQ3pCLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO1FBQzNCLE9BQU8sS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUE7SUFDL0IsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFBO0FBQ2xCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFTLDZCQUE2QixDQUFDLEtBQUs7SUFDMUMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFBO0lBRXhC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QUFjLENBQUMsWUFBWSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDckYsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sS0FBSyxDQUFBO1lBQ2IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0J5LCBlcnJvciBhcyBTZWxlbml1bUVycm9yfSBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyXCJcbmltcG9ydCBsb2dnaW5nIGZyb20gXCJzZWxlbml1bS13ZWJkcml2ZXIvbGliL2xvZ2dpbmcuanNcIlxuaW1wb3J0IHt3YWl0LCB3YWl0Rm9yfSBmcm9tIFwiYXdhaXRlcnlcIlxuaW1wb3J0IHRpbWVvdXQgZnJvbSBcImF3YWl0ZXJ5L2J1aWxkL3RpbWVvdXQuanNcIlxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcGFyYW0ge3Vua25vd259IGNhdXNlXG4gKiBAcmV0dXJucyB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fVxuICovXG5mdW5jdGlvbiBlcnJvcldpdGhDYXVzZShtZXNzYWdlLCBjYXVzZSkge1xuICBjb25zdCBlcnJvciA9IC8qKiBAdHlwZSB7RXJyb3IgJiB7Y2F1c2U6IHVua25vd259fSAqLyAobmV3IEVycm9yKG1lc3NhZ2UpKVxuICBlcnJvci5jYXVzZSA9IGNhdXNlXG4gIHJldHVybiBlcnJvclxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZWxlbWVudFxuICogQHJldHVybnMge2VsZW1lbnQgaXMgaW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGlzV2ViRHJpdmVyRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgIGVsZW1lbnQgJiZcbiAgICB0eXBlb2YgZWxlbWVudCA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwiZ2V0SWRcIiBpbiBlbGVtZW50ICYmXG4gICAgdHlwZW9mIGVsZW1lbnQuZ2V0SWQgPT09IFwiZnVuY3Rpb25cIlxuICApXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvclxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZ2V0RXJyb3JOYW1lKGVycm9yKSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIGVycm9yLmNvbnN0cnVjdG9yLm5hbWVcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICovXG5mdW5jdGlvbiBnZXRSZXRyeWFibGVJbnRlcmFjdEVycm9yTmFtZShlcnJvcikge1xuICBsZXQgY3VycmVudEVycm9yID0gZXJyb3JcblxuICB3aGlsZSAoY3VycmVudEVycm9yKSB7XG4gICAgY29uc3QgZXJyb3JOYW1lID0gZ2V0RXJyb3JOYW1lKGN1cnJlbnRFcnJvcilcblxuICAgIGlmIChlcnJvck5hbWUgPT09IFwiRWxlbWVudE5vdEludGVyYWN0YWJsZUVycm9yXCIgfHwgZXJyb3JOYW1lID09PSBcIkVsZW1lbnRDbGlja0ludGVyY2VwdGVkRXJyb3JcIiB8fCBlcnJvck5hbWUgPT09IFwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3JcIikge1xuICAgICAgcmV0dXJuIGVycm9yTmFtZVxuICAgIH1cblxuICAgIGlmICghKGN1cnJlbnRFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB8fCAhKFwiY2F1c2VcIiBpbiBjdXJyZW50RXJyb3IpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY3VycmVudEVycm9yID0gY3VycmVudEVycm9yLmNhdXNlXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldFNlbmRLZXlzVGV4dEFwcGVuZCguLi5hcmdzKSB7XG4gIHJldHVybiBhcmdzXG4gICAgLm1hcCgoYXJnKSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmdBcmcgPSBTdHJpbmcoYXJnKVxuXG4gICAgICBpZiAoL1tcXHVFMDA5XFx1RTAzRF1hXFx1RTAwMC9pLnRlc3Qoc3RyaW5nQXJnKSkge1xuICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RyaW5nQXJnLnJlcGxhY2UoL1tcXHVFMDAwLVxcdUY4RkZdL2csIFwiXCIpXG4gICAgfSlcbiAgICAuam9pbihcIlwiKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gZ2V0U2VuZEtleXNVc2VzU2VsZWN0QWxsQW5kRGVsZXRlKC4uLmFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3Muc29tZSgoYXJnKSA9PiAvW1xcdUUwMDlcXHVFMDNEXWFcXHVFMDAwL2kudGVzdChTdHJpbmcoYXJnKSkpICYmXG4gICAgYXJncy5zb21lKChhcmcpID0+IFN0cmluZyhhcmcpLmluY2x1ZGVzKFwiXFx1RTAwM1wiKSB8fCBTdHJpbmcoYXJnKS5pbmNsdWRlcyhcIlxcdUUwMTdcIikpXG59XG5cbi8qKlxuICogQHBhcmFtIHt7bGV2ZWw6IHtuYW1lOiBzdHJpbmd9LCBtZXNzYWdlOiBzdHJpbmd9fSBlbnRyeVxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVCcm93c2VyTG9nRW50cnkoZW50cnksIG1lc3NhZ2UpIHtcbiAgcmV0dXJuIGVudHJ5LmxldmVsLm5hbWUgPT09IFwiREVCVUdcIiAmJlxuICAgIC8oPzpefFxccy1cXHMpXFxbRE9NXFxdIFBhc3N3b3JkIGZpZWxkIGlzIG5vdCBjb250YWluZWQgaW4gYSBmb3JtOi9pLnRlc3QobWVzc2FnZSlcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaW5kQXJnc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XSBPdmVycmlkZSB0aW1lb3V0IGZvciBsb29rdXAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBudWxsfSBbdmlzaWJsZV0gV2hldGhlciB0byByZXF1aXJlIGVsZW1lbnRzIHRvIGJlIHZpc2libGUgKGB0cnVlYCkgb3IgaGlkZGVuIChgZmFsc2VgKS4gVXNlIGBudWxsYCB0byBkaXNhYmxlIHZpc2liaWxpdHkgZmlsdGVyaW5nLlxuICogQHByb3BlcnR5IHtcImFjdGlvbnNcIiB8IFwiaHVtYW5cIiB8IFwianNcIn0gW21ldGhvZF0gT3ZlcnJpZGUgdGhlIGNsaWNrIHBhdGguIGBcImFjdGlvbnNcImAgdXNlcyB0aGUgU2VsZW5pdW0gQWN0aW9ucyBBUEkgKHJlYWwgcG9pbnRlciBtb3ZlICsgY2xpY2spOyBgXCJodW1hblwiYCB1c2VzIG11bHRpcGxlIHBvaW50ZXIgbW92ZXMgYW5kIHBhdXNlcyBiZWZvcmUgY2xpY2tpbmc7IGBcImpzXCJgIGRpc3BhdGNoZXMgYGVsZW1lbnQuY2xpY2soKWAgdmlhIGBleGVjdXRlU2NyaXB0YCBpbnNpZGUgdGhlIHBhZ2UncyBKUyBjb250ZXh0IGFuZCBpcyBmb3IgZGlhZ25vc3RpY3Mgb25seSwgbm90IGNvbW1pdHRlZCBzdGFiaWxpemF0aW9uIGZpeGVzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjbGlja09mZnNldFhdIFggb2Zmc2V0IGZvciBgYWN0aW9uc2AvYGh1bWFuYCBwb2ludGVyIGNsaWNrcyByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NsaWNrT2Zmc2V0WV0gWSBvZmZzZXQgZm9yIGBhY3Rpb25zYC9gaHVtYW5gIHBvaW50ZXIgY2xpY2tzIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgZWxlbWVudC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaHVtYW5TdGVwRGVsYXldIFBhdXNlIGR1cmF0aW9uIGluIG1zIGJldHdlZW4gaHVtYW4gcG9pbnRlciBtb3Zlcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaHVtYW5TdGVwc10gTnVtYmVyIG9mIGludGVybWVkaWF0ZSBwb2ludGVyIG1vdmVzIGJlZm9yZSB0aGUgZmluYWwgY2xpY2sgdGFyZ2V0LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2Nyb2xsVG9dIFdoZXRoZXIgdG8gc2Nyb2xsIGZvdW5kIGVsZW1lbnRzIGludG8gdmlldyBiZWZvcmUgcmV0dXJuaW5nIHRoZW0uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbc2Nyb2xsQ29udGFpbmVyVGVzdElEc10gTmF0aXZlIHRlc3QgSURzIHRoYXQgc2hvdWxkIGJlIHRyaWVkIGFzIHNjcm9sbCBjb250YWluZXJzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gdmlld3BvcnQgZ2VzdHVyZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge0ZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59fSBJbnRlcmFjdEFyZ3NcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXYWl0Rm9yTm9TZWxlY3RvckFyZ3NcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3VzZUJhc2VTZWxlY3Rvcl0gV2hldGhlciB0byBzY29wZSBieSB0aGUgYmFzZSBzZWxlY3Rvci5cbiAqL1xuXG5jbGFzcyBFbGVtZW50Tm90Rm91bmRFcnJvciBleHRlbmRzIEVycm9yIHsgfVxuY29uc3Qge1dlYkRyaXZlckVycm9yfSA9IFNlbGVuaXVtRXJyb3JcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWR9IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBoYXNPd25BcmcoYXJncywga2V5KSB7XG4gIHJldHVybiBCb29sZWFuKGFyZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFyZ3MsIGtleSkpXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvclxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRWxlbWVudE5vdEZvdW5kRXJyb3IoZXJyb3IpIHtcbiAgbGV0IGN1cnJlbnRFcnJvciA9IGVycm9yXG5cbiAgd2hpbGUgKGN1cnJlbnRFcnJvcikge1xuICAgIGlmIChjdXJyZW50RXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikgcmV0dXJuIHRydWVcblxuICAgIGlmICghKGN1cnJlbnRFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB8fCAhKFwiY2F1c2VcIiBpbiBjdXJyZW50RXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjdXJyZW50RXJyb3IgPSBjdXJyZW50RXJyb3IuY2F1c2VcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3JcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VsZW1lbnRMb29rdXBUaW1lb3V0RXJyb3IoZXJyb3IpIHtcbiAgbGV0IGN1cnJlbnRFcnJvciA9IGVycm9yXG5cbiAgd2hpbGUgKGN1cnJlbnRFcnJvcikge1xuICAgIGlmIChjdXJyZW50RXJyb3IgaW5zdGFuY2VvZiBTZWxlbml1bUVycm9yLlRpbWVvdXRFcnJvcikgcmV0dXJuIHRydWVcblxuICAgIGlmICghKGN1cnJlbnRFcnJvciBpbnN0YW5jZW9mIEVycm9yKSB8fCAhKFwiY2F1c2VcIiBpbiBjdXJyZW50RXJyb3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjdXJyZW50RXJyb3IgPSBjdXJyZW50RXJyb3IuY2F1c2VcbiAgfVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3JcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VsZW1lbnRVbmF2YWlsYWJsZUZvclNjcm9sbEVycm9yKGVycm9yKSB7XG4gIHJldHVybiBpc0VsZW1lbnROb3RGb3VuZEVycm9yKGVycm9yKSB8fCBpc0VsZW1lbnRMb29rdXBUaW1lb3V0RXJyb3IoZXJyb3IpXG59XG5cbi8qKlxuICogQmFzZSBkcml2ZXIgdXNpbmcgc2VsZW5pdW0td2ViZHJpdmVyIHNlc3Npb25zLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJEcml2ZXJEcml2ZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9icm93c2VyLmpzXCIpLmRlZmF1bHR9IGFyZ3MuYnJvd3NlclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFthcmdzLm9wdGlvbnNdXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7YnJvd3Nlciwgb3B0aW9ucyA9IHt9fSkge1xuICAgIHRoaXMuYnJvd3NlciA9IGJyb3dzZXJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5iYXNlVXJsID0gdW5kZWZpbmVkXG4gICAgdGhpcy53ZWJEcml2ZXIgPSB1bmRlZmluZWRcbiAgICB0aGlzLl9kcml2ZXJUaW1lb3V0cyA9IDUwMDBcbiAgICB0aGlzLl90aW1lb3V0cyA9IDUwMDBcbiAgICAvKipcbiAgICAgKiBQcm9jZXNzLWV4aXQgaGFuZGxlcnMgaW5zdGFsbGVkIHdoaWxlIGEgV2ViRHJpdmVyIHNlc3Npb24gaXMgYWxpdmUuXG4gICAgICogUmV0YWluZWQgc28gYHN0b3AoKWAgY2FuIGRlcmVnaXN0ZXIgdGhlbSBiZWZvcmUgcmVtb3ZpbmcgdGhlXG4gICAgICogV2ViRHJpdmVyIHJlZmVyZW5jZS5cbiAgICAgKiBAdHlwZSB7e3NpZ2ludDogKCkgPT4gdm9pZCwgc2lndGVybTogKCkgPT4gdm9pZCwgYmVmb3JlRXhpdDogKCkgPT4gdm9pZH0gfCBudWxsfVxuICAgICAqL1xuICAgIHRoaXMuX2V4aXRIYW5kbGVycyA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVybFxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldEJhc2VVcmwoYmFzZVVybCkge1xuICAgIHRoaXMuYmFzZVVybCA9IGJhc2VVcmxcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7c3RyaW5nfSAqL1xuICBnZXRCYXNlVXJsKCkge1xuICAgIGlmICghdGhpcy5iYXNlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJEcml2ZXIgYmFzZSBVUkwgaGFzIG5vdCBiZWVuIHNldFwiKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmJhc2VVcmxcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7bnVtYmVyfSAqL1xuICBnZXRUaW1lb3V0cygpIHsgcmV0dXJuIHRoaXMuX3RpbWVvdXRzIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJEcml2ZXJ9XG4gICAqL1xuICBnZXRXZWJEcml2ZXIoKSB7XG4gICAgaWYgKCF0aGlzLndlYkRyaXZlcikgdGhyb3cgbmV3IEVycm9yKFwiRHJpdmVyIGhhc24ndCBiZWVuIGluaXRpYWxpemVkIHlldFwiKVxuICAgIHRoaXMuYnJvd3Nlci50aHJvd0lmSHR0cFNlcnZlckVycm9yKClcblxuICAgIHJldHVybiB0aGlzLndlYkRyaXZlclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkRyaXZlcn0gd2ViRHJpdmVyXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2V0V2ViRHJpdmVyKHdlYkRyaXZlcikge1xuICAgIHRoaXMud2ViRHJpdmVyID0gd2ViRHJpdmVyXG4gICAgdGhpcy5icm93c2VyLmRyaXZlciA9IHdlYkRyaXZlclxuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGxzIHByb2Nlc3MtbGV2ZWwgaGFuZGxlcnMgdGhhdCB0ZXJtaW5hdGUgdGhlIFdlYkRyaXZlciBzZXNzaW9uXG4gICAqIGlmIHRoZSBOb2RlIHByb2Nlc3MgZXhpdHMgd2l0aG91dCBhbiBleHBsaWNpdCBgc3RvcCgpYCBjYWxsLiBXaXRob3V0XG4gICAqIHRoaXMsIHRoZSBjaHJvbWVkcml2ZXItc3Bhd25lZCBDaHJvbWUgaXMgb3JwaGFuZWQgdG8gaW5pdCAoUFBJRD0xKVxuICAgKiB3aGVuIHRoZSB0ZXN0IHJ1bm5lciBleGl0cyDigJQgZWFjaCBgbnB4IHZlbG9jaW91cyB0ZXN0YCBydW4gdGhhdFxuICAgKiBza2lwcyBleHBsaWNpdCBjbGVhbnVwIGxlYXZlcyBhIENocm9tZSBwbHVzIHRob3VzYW5kcyBvZlxuICAgKiBgL3RtcC9vcmcuY2hyb21pdW0uQ2hyb21pdW0uc2NvcGVkX2Rpci4qYCBiZWhpbmQuIERyaXZlciBzdWJjbGFzc1xuICAgKiBgc3RhcnQoKWAgaW1wbGVtZW50YXRpb25zIG11c3QgY2FsbCB0aGlzIGFmdGVyIHNldHRpbmcgdGhlXG4gICAqIFdlYkRyaXZlciBvbiBhIGZyZXNoIHNlc3Npb247IHRlc3RzIHRoYXQgc3R1YiBgc2V0V2ViRHJpdmVyYFxuICAgKiBkaXJlY3RseSBkZWxpYmVyYXRlbHkgYnlwYXNzIGl0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGluc3RhbGxFeGl0SGFuZGxlcnMoKSB7XG4gICAgaWYgKHRoaXMuX2V4aXRIYW5kbGVycykgcmV0dXJuXG4gICAgY29uc3Qgc2lnaW50ID0gKCkgPT4geyB2b2lkIHRoaXMuX29uRXhpdFNpZ25hbChcIlNJR0lOVFwiKSB9XG4gICAgY29uc3Qgc2lndGVybSA9ICgpID0+IHsgdm9pZCB0aGlzLl9vbkV4aXRTaWduYWwoXCJTSUdURVJNXCIpIH1cbiAgICBjb25zdCBiZWZvcmVFeGl0ID0gKCkgPT4geyB2b2lkIHRoaXMuX29uRXhpdFNpZ25hbChcImJlZm9yZUV4aXRcIikgfVxuICAgIHByb2Nlc3Mub25jZShcIlNJR0lOVFwiLCBzaWdpbnQpXG4gICAgcHJvY2Vzcy5vbmNlKFwiU0lHVEVSTVwiLCBzaWd0ZXJtKVxuICAgIHByb2Nlc3Mub25jZShcImJlZm9yZUV4aXRcIiwgYmVmb3JlRXhpdClcbiAgICB0aGlzLl9leGl0SGFuZGxlcnMgPSB7c2lnaW50LCBzaWd0ZXJtLCBiZWZvcmVFeGl0fVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBfcmVtb3ZlRXhpdEhhbmRsZXJzKCkge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5fZXhpdEhhbmRsZXJzXG4gICAgaWYgKCFoYW5kbGVycykgcmV0dXJuXG4gICAgdGhpcy5fZXhpdEhhbmRsZXJzID0gbnVsbFxuICAgIHByb2Nlc3Mub2ZmKFwiU0lHSU5UXCIsIGhhbmRsZXJzLnNpZ2ludClcbiAgICBwcm9jZXNzLm9mZihcIlNJR1RFUk1cIiwgaGFuZGxlcnMuc2lndGVybSlcbiAgICBwcm9jZXNzLm9mZihcImJlZm9yZUV4aXRcIiwgaGFuZGxlcnMuYmVmb3JlRXhpdClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1wiU0lHSU5UXCIgfCBcIlNJR1RFUk1cIiB8IFwiYmVmb3JlRXhpdFwifSBzaWduYWxcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBfb25FeGl0U2lnbmFsKHNpZ25hbCkge1xuICAgIHRoaXMuX3JlbW92ZUV4aXRIYW5kbGVycygpXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcCgpXG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0LWVmZm9ydCDigJQgdGhlIHByb2Nlc3MgaXMgZ29pbmcgZG93biBhbnl3YXksIGFuZCB3ZSdkIHJhdGhlclxuICAgICAgLy8gb3JwaGFuIGEgYnJvd3NlciB0aGFuIHRocm93IGZyb20gYSBzaWduYWwgaGFuZGxlci5cbiAgICB9XG4gICAgLy8gUHJlc2VydmUgdGhlIGNvbnZlbnRpb25hbCBzaWduYWwtZXhpdCBzdGF0dXMgKDEyOCArIHNpZ25hbCBudW1iZXIpXG4gICAgLy8gc28gQ0kgLyB3cmFwcGVyIHNjcmlwdHMgY2FuIHN0aWxsIHRlbGwgaW50ZXJydXB0ZWQgcnVucyBhcGFydFxuICAgIC8vIGZyb20gYSBjbGVhbiBwYXNzLiBQbGFpbiBgcHJvY2Vzcy5leGl0KDApYCB3b3VsZCBtaXNyZXBvcnQgYVxuICAgIC8vIGNhbmNlbGxlZCBydW4gYXMgc3VjY2Vzc2Z1bC5cbiAgICBpZiAoc2lnbmFsID09PSBcIlNJR0lOVFwiKSBwcm9jZXNzLmV4aXQoMTMwKVxuICAgIGlmIChzaWduYWwgPT09IFwiU0lHVEVSTVwiKSBwcm9jZXNzLmV4aXQoMTQzKVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic3RhcnQoKSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkcml2ZXJcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0b3AoKSB7XG4gICAgdGhpcy5fcmVtb3ZlRXhpdEhhbmRsZXJzKClcbiAgICBpZiAodGhpcy53ZWJEcml2ZXIpIHtcbiAgICAgIGF3YWl0IHRpbWVvdXQoe3RpbWVvdXQ6IHRoaXMuZ2V0VGltZW91dHMoKSwgZXJyb3JNZXNzYWdlOiBcInRpbWVvdXQgd2hpbGUgcXVpdHRpbmcgV2ViRHJpdmVyXCJ9LCBhc3luYyAoKSA9PiBhd2FpdCAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLndlYkRyaXZlcj59ICovICh0aGlzLndlYkRyaXZlcikucXVpdCgpKVxuICAgIH1cblxuICAgIHRoaXMud2ViRHJpdmVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy5icm93c2VyLmRyaXZlciA9IHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdUaW1lb3V0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZHJpdmVyU2V0VGltZW91dHMobmV3VGltZW91dCkge1xuICAgIHRoaXMuX2RyaXZlclRpbWVvdXRzID0gbmV3VGltZW91dFxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuc2V0VGltZW91dHMoe2ltcGxpY2l0OiBuZXdUaW1lb3V0fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgY2FsbGJhY2sgd2l0aCBTZWxlbml1bSdzIGltcGxpY2l0IHdhaXQgdGVtcG9yYXJpbHkgY2hhbmdlZC4gRmluZGVyXG4gICAqIG1ldGhvZHMgZG8gdGhlaXIgb3duIGV4cGxpY2l0IHBvbGxpbmcsIHNvIGxlYXZpbmcgU2VsZW5pdW0ncyBpbXBsaWNpdCB3YWl0XG4gICAqIGVuYWJsZWQgd291bGQgbWFrZSBzaG9ydCBsb29rdXAgdGltZW91dHMgYmxvY2sgZm9yIHRoZSBnbG9iYWwgZHJpdmVyIHdhaXQuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbXBsaWNpdFRpbWVvdXRcbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn1cbiAgICovXG4gIGFzeW5jIHdpdGhUZW1wb3JhcnlJbXBsaWNpdFRpbWVvdXQoaW1wbGljaXRUaW1lb3V0LCBjYWxsYmFjaykge1xuICAgIGNvbnN0IG9yaWdpbmFsSW1wbGljaXRUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcblxuICAgIGlmIChvcmlnaW5hbEltcGxpY2l0VGltZW91dCA9PT0gaW1wbGljaXRUaW1lb3V0KSByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cyh7aW1wbGljaXQ6IGltcGxpY2l0VGltZW91dH0pXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5zZXRUaW1lb3V0cyh7aW1wbGljaXQ6IG9yaWdpbmFsSW1wbGljaXRUaW1lb3V0fSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyByZXN0b3JlVGltZW91dHMoKSB7XG4gICAgaWYgKCF0aGlzLmdldFRpbWVvdXRzKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlRpbWVvdXRzIGhhdmVuJ3QgcHJldmlvdXNseSBiZWVuIHNldFwiKVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuZHJpdmVyU2V0VGltZW91dHModGhpcy5nZXRUaW1lb3V0cygpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBuZXdUaW1lb3V0XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2V0VGltZW91dHMobmV3VGltZW91dCkge1xuICAgIHRoaXMuX3RpbWVvdXRzID0gbmV3VGltZW91dFxuICAgIGF3YWl0IHRoaXMucmVzdG9yZVRpbWVvdXRzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuYnJvd3Nlci5nZXRTZWxlY3RvcihzZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRyaXZlclZpc2l0KHBhdGgpIHtcbiAgICBjb25zdCBpc0Fic29sdXRlVXJsID0gL15bYS16XSs6XFwvXFwvL2kudGVzdChwYXRoKVxuICAgIGNvbnN0IHVybCA9IGlzQWJzb2x1dGVVcmwgPyBwYXRoIDogYCR7dGhpcy5nZXRCYXNlVXJsKCl9JHtwYXRofWBcblxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZ2V0KHVybClcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFsbCBjb29raWVzIGZvciB0aGUgY3VycmVudCBicm93c2VyIHNlc3Npb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZGVsZXRlQWxsQ29va2llcygpIHtcbiAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLmRlbGV0ZUFsbENvb2tpZXMoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59ICovXG4gIGFzeW5jIGdldEN1cnJlbnRVcmwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmdldEN1cnJlbnRVcmwoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFwiXCJcbiAgICB9XG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgZ2V0SFRNTCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5nZXRQYWdlU291cmNlKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyB0YWtlU2NyZWVuc2hvdCgpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS50YWtlU2NyZWVuc2hvdCgpXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBicm93c2VyIGxvZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fVxuICAgKi9cbiAgYXN5bmMgZ2V0QnJvd3NlckxvZ3MoKSB7XG4gICAgbGV0IGVudHJpZXNcblxuICAgIHRyeSB7XG4gICAgICBlbnRyaWVzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5sb2dzKCkuZ2V0KGxvZ2dpbmcuVHlwZS5CUk9XU0VSKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIGNvbnN0IGJyb3dzZXJMb2dzID0gW11cblxuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgY29uc3QgbWVzc2FnZU1hdGNoID0gZW50cnkubWVzc2FnZS5tYXRjaCgvXiguKykgKFxcZCspOihcXGQrKSAoLispJC8pXG4gICAgICBsZXQgbWVzc2FnZVxuXG4gICAgICBpZiAobWVzc2FnZU1hdGNoKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlTWF0Y2hbNF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2UgPSBlbnRyeS5tZXNzYWdlXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRJZ25vcmVCcm93c2VyTG9nRW50cnkoZW50cnksIG1lc3NhZ2UpKSBjb250aW51ZVxuXG4gICAgICBicm93c2VyTG9ncy5wdXNoKGAke2VudHJ5LmxldmVsLm5hbWV9OiAke21lc3NhZ2V9YClcbiAgICB9XG5cbiAgICByZXR1cm4gYnJvd3NlckxvZ3NcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgYnkgQ1NTIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXT59XG4gICAqL1xuICBhc3luYyBhbGwoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtzY3JvbGxDb250YWluZXJUZXN0SURzLCBzY3JvbGxUbyA9IGZhbHNlLCB2aXNpYmxlID0gdHJ1ZSwgdGltZW91dCwgdXNlQmFzZVNlbGVjdG9yID0gdHJ1ZSwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuICAgIHZvaWQgc2Nyb2xsQ29udGFpbmVyVGVzdElEc1xuICAgIGNvbnN0IHJlc3RBcmdzS2V5cyA9IE9iamVjdC5rZXlzKHJlc3RBcmdzKVxuICAgIGxldCBhY3R1YWxUaW1lb3V0XG5cbiAgICBpZiAodGltZW91dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY3R1YWxUaW1lb3V0ID0gdGhpcy5fZHJpdmVyVGltZW91dHNcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRpbWVvdXRcbiAgICB9XG5cbiAgICBpZiAocmVzdEFyZ3NLZXlzLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhcmd1bWVudHM6ICR7cmVzdEFyZ3NLZXlzLmpvaW4oXCIsIFwiKX1gKVxuXG4gICAgY29uc3QgYWN0dWFsU2VsZWN0b3IgPSB1c2VCYXNlU2VsZWN0b3IgPyB0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKSA6IHNlbGVjdG9yXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIGNvbnN0IGdldFRpbWVMZWZ0ID0gKCkgPT4gTWF0aC5tYXgoYWN0dWFsVGltZW91dCAtIChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSwgMClcbiAgICBjb25zdCBnZXRFbGVtZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kRWxlbWVudHMgPSBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmZpbmRFbGVtZW50cyhCeS5jc3MoYWN0dWFsU2VsZWN0b3IpKVxuXG4gICAgICBpZiAodmlzaWJsZSAhPT0gdHJ1ZSAmJiB2aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZm91bmRFbGVtZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZEVsZW1lbnRzID0gW11cblxuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGZvdW5kRWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgaXNEaXNwbGF5ZWQgPSBhd2FpdCBlbGVtZW50LmlzRGlzcGxheWVkKClcblxuICAgICAgICBpZiAodmlzaWJsZSAmJiAhaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG4gICAgICAgIGlmICghdmlzaWJsZSAmJiBpc0Rpc3BsYXllZCkgY29udGludWVcblxuICAgICAgICBmaWx0ZXJlZEVsZW1lbnRzLnB1c2goZWxlbWVudClcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpbHRlcmVkRWxlbWVudHNcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50cyA9IFtdXG5cbiAgICBhd2FpdCB0aGlzLndpdGhUZW1wb3JhcnlJbXBsaWNpdFRpbWVvdXQoMCwgYXN5bmMgKCkgPT4ge1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgY29uc3QgdGltZUxlZnQgPSBhY3R1YWxUaW1lb3V0ID09IDAgPyAwIDogZ2V0VGltZUxlZnQoKVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHRpbWVMZWZ0ID09IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gYXdhaXQgZ2V0RWxlbWVudHMoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLndhaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcblxuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgfSwgdGltZUxlZnQpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsZXQgaXNTdGFsZUVsZW1lbnRFcnJvciA9IGZhbHNlXG5cbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZWxlbml1bUVycm9yLlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yKSB7XG4gICAgICAgICAgICBpc1N0YWxlRWxlbWVudEVycm9yID0gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXZWJEcml2ZXJFcnJvciAmJiBlcnJvci5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJzdGFsZSBlbGVtZW50IHJlZmVyZW5jZVwiKSkge1xuICAgICAgICAgICAgaXNTdGFsZUVsZW1lbnRFcnJvciA9IHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoZXJyb3IgaW5zdGFuY2VvZiBTZWxlbml1bUVycm9yLlRpbWVvdXRFcnJvciB8fCBpc1N0YWxlRWxlbWVudEVycm9yKVxuICAgICAgICAgICAgJiYgZ2V0VGltZUxlZnQoKSA+IDBcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYENvdWxkbid0IGdldCBlbGVtZW50cyB3aXRoIHNlbGVjdG9yOiAke2FjdHVhbFNlbGVjdG9yfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yfWAsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmIChzY3JvbGxUbykge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KGVsZW1lbnQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGV4aXN0cyhzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5hbGwoc2VsZWN0b3IsIGFyZ3MpKS5sZW5ndGggPiAwXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0VsZW1lbnRMb29rdXBUaW1lb3V0RXJyb3IoZXJyb3IpKSByZXR1cm4gZmFsc2VcblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudFtdfSAqL1xuICAgIGxldCBlbGVtZW50c1xuXG4gICAgdHJ5IHtcbiAgICAgIGVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoc2VsZWN0b3IsIGFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9IC0gJHtlcnJvci5tZXNzYWdlfSAoc2VsZWN0b3I6ICR7dGhpcy5nZXRTZWxlY3RvcihzZWxlY3Rvcil9KWAsIGVycm9yKVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHt0eXBlb2YgZXJyb3J9IC0gJHtlcnJvcn0gKHNlbGVjdG9yOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfSlgLCBlcnJvcilcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb3JlIHRoYW4gMSBlbGVtZW50cyAoJHtlbGVtZW50cy5sZW5ndGh9KSB3YXMgZm91bmQgYnkgQ1NTOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfWApXG4gICAgfVxuXG4gICAgaWYgKCFlbGVtZW50c1swXSkge1xuICAgICAgY29uc3QgZWxhcHNlZFNlY29uZHMgPSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSkgLyAxMDAwXG4gICAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IoYEVsZW1lbnQgY291bGRuJ3QgYmUgZm91bmQgYWZ0ZXIgJHtlbGFwc2VkU2Vjb25kcy50b0ZpeGVkKDIpfXMgYnkgQ1NTOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRzWzBdXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICAgKi9cbiAgYXN5bmMgdGV4dChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IChhd2FpdCB0aGlzLmZpbmQoc2VsZWN0b3IsIGFyZ3MpKS5nZXRUZXh0KClcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IHRlc3QgSURcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5VGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmQoYFtkYXRhLXRlc3RpZD0nJHt0ZXN0SUR9J11gLCBhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIG5hdGl2ZSBBbmRyb2lkIHZpc2libGUgdGV4dCBvciBhbiBhY2Nlc3NpYmlsaXR5IGxhYmVsLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IFRleHQgdG8gbG9jYXRlLlxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc10gT3B0aW9uYWwgbG9va3VwIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59IE1hdGNoaW5nIG5hdGl2ZSBlbGVtZW50LlxuICAgKi9cbiAgYXN5bmMgZmluZEJ5TmF0aXZlVGV4dChleHBlY3RlZFRleHQsIGFyZ3MgPSB7fSkge1xuICAgIHZvaWQgYXJnc1xuICAgIHRocm93IG5ldyBFcnJvcihgZmluZEJ5TmF0aXZlVGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgbmF0aXZlIEFwcGl1bSBzZXNzaW9uczogJHtleHBlY3RlZFRleHR9YClcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCBhIHRlc3QgaWQgY29udGFpbnMgZXhwZWN0ZWQgdmlzaWJsZSB0ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEIEVsZW1lbnQgdGVzdCBpZCB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwZWN0ZWRUZXh0IEZyYWdtZW50IHRoYXQgbXVzdCBhcHBlYXIgaW4gdGhlIGVsZW1lbnQgdGV4dC5cbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdIE9wdGlvbmFsIHRpbWVvdXQgYW5kIGxvb2t1cCBzZXR0aW5ncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yVGVzdElEVGV4dCh0ZXN0SUQsIGV4cGVjdGVkVGV4dCwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge3RpbWVvdXQ6IHdhaXRUaW1lb3V0ID0gdGhpcy5nZXRUaW1lb3V0cygpLCAuLi5maW5kQXJnc30gPSBhcmdzXG5cbiAgICBhd2FpdCB3YWl0Rm9yKHt0aW1lb3V0OiB3YWl0VGltZW91dH0sIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIHsuLi5maW5kQXJncywgdGltZW91dDogMH0pXG4gICAgICBjb25zdCBhY3R1YWxUZXh0ID0gYXdhaXQgZWxlbWVudC5nZXRUZXh0KClcblxuICAgICAgaWYgKCFhY3R1YWxUZXh0LmluY2x1ZGVzKGV4cGVjdGVkVGV4dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaW1lZCBvdXQgd2FpdGluZyBmb3IgdGV4dCAke2V4cGVjdGVkVGV4dH0uIExhc3QgdGV4dCB3YXMgJHthY3R1YWxUZXh0fWApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHRlc3QgSUQgaXMgY3VycmVudGx5IHJlbmRlcmVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGhhc1Rlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5maW5kQnlUZXN0SUQodGVzdElELCB7Li4uYXJncywgdGltZW91dDogMH0pXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFbGVtZW50Tm90Rm91bmRFcnJvcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8KHtzZWxlY3Rvcjogc3RyaW5nfSAmIEZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59KX0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgX2ZpbmRFbGVtZW50KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICAvKiogQHR5cGUge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fSAqL1xuICAgIGxldCBlbGVtZW50XG5cbiAgICBpZiAodHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT0gXCJzdHJpbmdcIikge1xuICAgICAgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT0gXCJvYmplY3RcIiAmJiBlbGVtZW50T3JJZGVudGlmaWVyICE9PSBudWxsICYmIFwic2VsZWN0b3JcIiBpbiBlbGVtZW50T3JJZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCB7c2VsZWN0b3IsIC4uLnJlc3RBcmdzfSA9IGVsZW1lbnRPcklkZW50aWZpZXJcblxuICAgICAgZGVsZXRlIHJlc3RBcmdzLndpdGhGYWxsYmFja1xuXG4gICAgICBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKHNlbGVjdG9yLCByZXN0QXJncylcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudCA9IC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9ICovIChlbGVtZW50T3JJZGVudGlmaWVyKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSBDU1Mgc2VsZWN0b3Igd2l0aG91dCB3YWl0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZE5vV2FpdChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgYXdhaXQgdGhpcy5kcml2ZXJTZXRUaW1lb3V0cygwKVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmQoc2VsZWN0b3IsIGFyZ3MpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMucmVzdG9yZVRpbWVvdXRzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xpY2tzIGFuIGVsZW1lbnQsIGFsbG93aW5nIHNlbGVjdG9yIGFyZ3Mgd2hlbiB1c2luZyBhIENTUyBzZWxlY3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgY2xpY2soZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGNvbnN0IHtjbGlja09mZnNldFgsIGNsaWNrT2Zmc2V0WSwgaHVtYW5TdGVwRGVsYXksIGh1bWFuU3RlcHMsIG1ldGhvZCwgc2Nyb2xsVG8gPSBmYWxzZSwgLi4uZmluZEFyZ3N9ID0gYXJncyB8fCB7fVxuICAgIGNvbnN0IGNsaWNrQXJncyA9IHtjbGlja09mZnNldFgsIGNsaWNrT2Zmc2V0WSwgaHVtYW5TdGVwRGVsYXksIGh1bWFuU3RlcHN9XG4gICAgbGV0IHRyaWVzID0gMFxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyaWVzKytcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuX2ZpbmRFbGVtZW50KGVsZW1lbnRPcklkZW50aWZpZXIsIGZpbmRBcmdzKVxuXG4gICAgICAgIGlmIChzY3JvbGxUbykge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KGVsZW1lbnQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kID09PSBcImFjdGlvbnNcIikge1xuICAgICAgICAgIC8qKiBAdHlwZSB7e29yaWdpbjogaW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQsIHg/OiBudW1iZXIsIHk/OiBudW1iZXJ9fSAqL1xuICAgICAgICAgIGxldCBtb3ZlQXJncyA9IHtvcmlnaW46IGVsZW1lbnR9XG5cbiAgICAgICAgICBpZiAoY2xpY2tPZmZzZXRYICE9PSB1bmRlZmluZWQgfHwgY2xpY2tPZmZzZXRZICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG1vdmVBcmdzID0ge29yaWdpbjogZWxlbWVudCwgeDogY2xpY2tPZmZzZXRYID8/IDAsIHk6IGNsaWNrT2Zmc2V0WSA/PyAwfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuYWN0aW9ucyh7YXN5bmM6IHRydWV9KS5tb3ZlKG1vdmVBcmdzKS5jbGljaygpLnBlcmZvcm0oKVxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJodW1hblwiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5odW1hbkNsaWNrKGVsZW1lbnQsIGNsaWNrQXJncylcbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IFwianNcIikge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChcImFyZ3VtZW50c1swXS5jbGljaygpXCIsIGVsZW1lbnQpXG4gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhd2FpdCBlbGVtZW50LmNsaWNrKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWV0aG9kOiAke21ldGhvZH1gKVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvclwiIHx8IGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3JcIikge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiRWxlbWVudE5vdEludGVyYWN0YWJsZUVycm9yXCIpIHtcbiAgICAgICAgICAgIGlmICh0cmllcyA+PSAzKSB7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBFbGVtZW50ICR7ZWxlbWVudE9ySWRlbnRpZmllci5jb25zdHJ1Y3Rvci5uYW1lfSBjbGljayBmYWlsZWQgYWZ0ZXIgJHt0cmllc30gdHJpZXMgLSAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCwgZXJyb3IpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhd2FpdCB3YWl0KDUwKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgRWxlbWVudCAke2VsZW1lbnRPcklkZW50aWZpZXIuY29uc3RydWN0b3IubmFtZX0gY2xpY2sgZmFpbGVkIC0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsIGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgRWxlbWVudCAke2VsZW1lbnRPcklkZW50aWZpZXIuY29uc3RydWN0b3IubmFtZX0gY2xpY2sgZmFpbGVkIC0gJHt0eXBlb2YgZXJyb3J9OiAke2Vycm9yfWAsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHt7Y2xpY2tPZmZzZXRYPzogbnVtYmVyLCBjbGlja09mZnNldFk/OiBudW1iZXIsIGh1bWFuU3RlcERlbGF5PzogbnVtYmVyLCBodW1hblN0ZXBzPzogbnVtYmVyfX0gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgaHVtYW5DbGljayhlbGVtZW50LCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7Y2xpY2tPZmZzZXRYID0gMCwgY2xpY2tPZmZzZXRZID0gMCwgaHVtYW5TdGVwRGVsYXkgPSA3NSwgaHVtYW5TdGVwcyA9IDR9ID0gYXJnc1xuICAgIGNvbnN0IHN0ZXBzID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihodW1hblN0ZXBzKSlcbiAgICBjb25zdCBhY3Rpb25zID0gdGhpcy5nZXRXZWJEcml2ZXIoKS5hY3Rpb25zKHthc3luYzogdHJ1ZX0pXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc3RlcHM7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHByb2dyZXNzID0gKGluZGV4ICsgMSkgLyAoc3RlcHMgKyAxKVxuICAgICAgY29uc3Qgd29iYmxlID0gaW5kZXggJSAyID09PSAwID8gNiA6IC00XG5cbiAgICAgIGFjdGlvbnNcbiAgICAgICAgLm1vdmUoe1xuICAgICAgICAgIG9yaWdpbjogZWxlbWVudCxcbiAgICAgICAgICB4OiBNYXRoLnJvdW5kKGNsaWNrT2Zmc2V0WCAtICgoMSAtIHByb2dyZXNzKSAqIDgwKSArIHdvYmJsZSksXG4gICAgICAgICAgeTogTWF0aC5yb3VuZChjbGlja09mZnNldFkgLSAoKDEgLSBwcm9ncmVzcykgKiAzNSkgLSB3b2JibGUpXG4gICAgICAgIH0pXG4gICAgICAgIC5wYXVzZShodW1hblN0ZXBEZWxheSlcbiAgICB9XG5cbiAgICBhd2FpdCBhY3Rpb25zXG4gICAgICAubW92ZSh7b3JpZ2luOiBlbGVtZW50LCB4OiBjbGlja09mZnNldFgsIHk6IGNsaWNrT2Zmc2V0WX0pXG4gICAgICAucGF1c2UoaHVtYW5TdGVwRGVsYXkpXG4gICAgICAuY2xpY2soKVxuICAgICAgLnBlcmZvcm0oKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuYWN0aW9ucyh7YXN5bmM6IHRydWV9KS5tb3ZlKHtvcmlnaW46IGVsZW1lbnR9KS5wZXJmb3JtKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHwoe3NlbGVjdG9yOiBzdHJpbmd9ICYgRmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn0pfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kU2Nyb2xsVGFyZ2V0KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2ZpbmRFbGVtZW50KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghaXNFbGVtZW50VW5hdmFpbGFibGVGb3JTY3JvbGxFcnJvcihlcnJvcikgfHwgdGhpcy5oYXNFeHBsaWNpdFZpc2libGVTY3JvbGxMb29rdXAoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZFJlbmRlcmVkU2Nyb2xsVGFyZ2V0KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHwoe3NlbGVjdG9yOiBzdHJpbmd9ICYgRmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn0pfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGhhc0V4cGxpY2l0VmlzaWJsZVNjcm9sbExvb2t1cChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSB7XG4gICAgaWYgKGhhc093bkFyZyhhcmdzLCBcInZpc2libGVcIikpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gQm9vbGVhbihcbiAgICAgIHR5cGVvZiBlbGVtZW50T3JJZGVudGlmaWVyID09IFwib2JqZWN0XCIgJiZcbiAgICAgIGVsZW1lbnRPcklkZW50aWZpZXIgIT09IG51bGwgJiZcbiAgICAgIFwic2VsZWN0b3JcIiBpbiBlbGVtZW50T3JJZGVudGlmaWVyICYmXG4gICAgICBoYXNPd25BcmcoZWxlbWVudE9ySWRlbnRpZmllciwgXCJ2aXNpYmxlXCIpXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fCh7c2VsZWN0b3I6IHN0cmluZ30gJiBGaW5kQXJncyAmIHt3aXRoRmFsbGJhY2s/OiBib29sZWFufSl9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJncyB8IHVuZGVmaW5lZH0gYXJnc1xuICAgKiBAcGFyYW0ge3Vua25vd259IG9yaWdpbmFsRXJyb3JcbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZFJlbmRlcmVkU2Nyb2xsVGFyZ2V0KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MsIG9yaWdpbmFsRXJyb3IpIHtcbiAgICBjb25zdCBzZWxlY3RvckFuZEFyZ3MgPSB0aGlzLmdldFNlbGVjdG9yU2Nyb2xsTG9va3VwQXJncyhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKVxuXG4gICAgaWYgKCFzZWxlY3RvckFuZEFyZ3MpIHRocm93IG9yaWdpbmFsRXJyb3JcblxuICAgIGNvbnN0IHtzZWxlY3RvciwgZmluZEFyZ3N9ID0gc2VsZWN0b3JBbmRBcmdzXG4gICAgY29uc3QgcmVuZGVyZWRFbGVtZW50cyA9IFtdXG4gICAgY29uc3QgZm91bmRFbGVtZW50cyA9IGF3YWl0IHRoaXMuYWxsKHNlbGVjdG9yLCB7Li4uZmluZEFyZ3MsIHNjcm9sbFRvOiBmYWxzZSwgdGltZW91dDogMCwgdmlzaWJsZTogbnVsbH0pXG5cbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZm91bmRFbGVtZW50cykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMuaXNSZW5kZXJlZFNjcm9sbFRhcmdldChlbGVtZW50KSkge1xuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnB1c2goZWxlbWVudClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVuZGVyZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHJldHVybiByZW5kZXJlZEVsZW1lbnRzWzBdXG5cbiAgICBpZiAocmVuZGVyZWRFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiAxIHJlbmRlcmVkIGVsZW1lbnRzICgke3JlbmRlcmVkRWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IENTUzogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX1gKVxuICAgIH1cblxuICAgIHRocm93IG9yaWdpbmFsRXJyb3JcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHwoe3NlbGVjdG9yOiBzdHJpbmd9ICYgRmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn0pfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7e3NlbGVjdG9yOiBzdHJpbmcsIGZpbmRBcmdzOiBGaW5kQXJnc30gfCB1bmRlZmluZWR9XG4gICAqL1xuICBnZXRTZWxlY3RvclNjcm9sbExvb2t1cEFyZ3MoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4ge3NlbGVjdG9yOiBlbGVtZW50T3JJZGVudGlmaWVyLCBmaW5kQXJnczogYXJncyB8fCB7fX1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT0gXCJvYmplY3RcIiAmJiBlbGVtZW50T3JJZGVudGlmaWVyICE9PSBudWxsICYmIFwic2VsZWN0b3JcIiBpbiBlbGVtZW50T3JJZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCB7c2VsZWN0b3IsIC4uLnJlc3RBcmdzfSA9IGVsZW1lbnRPcklkZW50aWZpZXJcblxuICAgICAgZGVsZXRlIHJlc3RBcmdzLndpdGhGYWxsYmFja1xuXG4gICAgICByZXR1cm4ge3NlbGVjdG9yLCBmaW5kQXJnczogcmVzdEFyZ3N9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBpc1JlbmRlcmVkU2Nyb2xsVGFyZ2V0KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gQm9vbGVhbihhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmV4ZWN1dGVTY3JpcHQoYFxuICAgICAgY29uc3QgZWxlbWVudCA9IGFyZ3VtZW50c1swXVxuICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm4gZmFsc2VcblxuICAgICAgZm9yIChsZXQgY3VycmVudCA9IGVsZW1lbnQ7IGN1cnJlbnQ7IGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShjdXJyZW50KVxuICAgICAgICBpZiAoY3VycmVudC5oaWRkZW4pIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAoY3VycmVudC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSA9PT0gXCJ0cnVlXCIpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAoc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAoc3R5bGUudmlzaWJpbGl0eSA9PT0gXCJoaWRkZW5cIiB8fCBzdHlsZS52aXNpYmlsaXR5ID09PSBcImNvbGxhcHNlXCIpIHJldHVybiBmYWxzZVxuICAgICAgICBpZiAoc3R5bGUub3BhY2l0eSA9PT0gXCIwXCIpIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShlbGVtZW50LmdldENsaWVudFJlY3RzKCkpLnNvbWUoKHJlY3QpID0+IHJlY3Qud2lkdGggPiAwICYmIHJlY3QuaGVpZ2h0ID4gMClcbiAgICBgLCBlbGVtZW50KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTY3JvbGxzIGFuIGVsZW1lbnQgaW50byB2aWV3LlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHwoe3NlbGVjdG9yOiBzdHJpbmd9ICYgRmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn0pfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNjcm9sbEludG9WaWV3KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kU2Nyb2xsVGFyZ2V0KGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG5cbiAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGVzdCBJRCBpbnRvIHZpZXcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsVGVzdElkSW50b1ZpZXcodGVzdElELCBhcmdzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZFNjcm9sbFRhcmdldChgW2RhdGEtdGVzdGlkPScke3Rlc3RJRH0nXWAsIGFyZ3MpXG5cbiAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIEludGVyYWN0cyB3aXRoIGFuIGVsZW1lbnQgYnkgY2FsbGluZyBhIG1ldGhvZCBvbiBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gICAqIFJldHJ5aW5nIG9uIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciwgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciwgb3IgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIEludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllciBUaGUgZWxlbWVudCBvciBhIENTUyBzZWxlY3RvciB0byBmaW5kIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gY2FsbCBvbiB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICBsZXQgdHJpZXMgPSAwXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJpZXMrK1xuXG4gICAgICAvKiogQHR5cGUge0ludGVyYWN0QXJncyB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCBpbnRlcmFjdEFyZ3NcblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50T3JJZGVudGlmaWVyID09PSBcIm9iamVjdFwiICYmIGVsZW1lbnRPcklkZW50aWZpZXIgJiYgIWlzV2ViRHJpdmVyRWxlbWVudChlbGVtZW50T3JJZGVudGlmaWVyKSkge1xuICAgICAgICBpbnRlcmFjdEFyZ3MgPSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAgICB9XG5cbiAgICAgIC8qKiBAdHlwZSB7RmluZEFyZ3MgfCB1bmRlZmluZWR9ICovXG4gICAgICBsZXQgZmluZEFyZ3NcblxuICAgICAgaWYgKGludGVyYWN0QXJncykge1xuICAgICAgICAvKiogQHR5cGUge0ZpbmRBcmdzICYge3NlbGVjdG9yPzogc3RyaW5nLCBtZXRob2Q/OiBhbnksIHdpdGhGYWxsYmFjaz86IGFueX19ICovXG4gICAgICAgIGNvbnN0IHNhbml0aXplZEZpbmRBcmdzID0gey4uLmludGVyYWN0QXJnc31cblxuICAgICAgICBkZWxldGUgc2FuaXRpemVkRmluZEFyZ3Muc2VsZWN0b3JcbiAgICAgICAgZGVsZXRlIHNhbml0aXplZEZpbmRBcmdzLm1ldGhvZFxuICAgICAgICBkZWxldGUgc2FuaXRpemVkRmluZEFyZ3Mud2l0aEZhbGxiYWNrXG4gICAgICAgIGZpbmRBcmdzID0gc2FuaXRpemVkRmluZEFyZ3NcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudCA9IGludGVyYWN0QXJnc1xuICAgICAgICA/IGF3YWl0IHRoaXMuX2ZpbmRFbGVtZW50KC8qKiBAdHlwZSB7e3NlbGVjdG9yOiBzdHJpbmd9fSAqLyAoaW50ZXJhY3RBcmdzKS5zZWxlY3RvciwgZmluZEFyZ3MpXG4gICAgICAgIDogYXdhaXQgdGhpcy5fZmluZEVsZW1lbnQoZWxlbWVudE9ySWRlbnRpZmllciwgZmluZEFyZ3MpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSBcInNlbmRLZXlzXCIpIHtcbiAgICAgICAgICBpZiAoaW50ZXJhY3RBcmdzPy53aXRoRmFsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmludGVyYWN0U2VuZEtleXNXaXRoRmFsbGJhY2soZWxlbWVudCwgLi4uYXJncylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgZWxlbWVudC5zZW5kS2V5cyguLi5hcmdzKVxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09IFwiY2xpY2tcIikge1xuICAgICAgICAgIGlmIChpc1dlYkRyaXZlckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7RmluZEFyZ3N9ICovXG4gICAgICAgICAgICBjb25zdCBjbGlja0FyZ3MgPSB7fVxuICAgICAgICAgICAgaWYgKGludGVyYWN0QXJncz8ubWV0aG9kICE9PSB1bmRlZmluZWQpIGNsaWNrQXJncy5tZXRob2QgPSBpbnRlcmFjdEFyZ3MubWV0aG9kXG4gICAgICAgICAgICBpZiAoaW50ZXJhY3RBcmdzPy5zY3JvbGxUbyAhPT0gdW5kZWZpbmVkKSBjbGlja0FyZ3Muc2Nyb2xsVG8gPSBpbnRlcmFjdEFyZ3Muc2Nyb2xsVG9cblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGljayhlbGVtZW50LCBjbGlja0FyZ3MpXG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgLyoqIEB0eXBlIHt7Y2xpY2s6ICguLi5jbGlja0FyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT59fSAqLyAoZWxlbWVudCkuY2xpY2soLi4uYXJncylcbiAgICAgICAgfSBlbHNlIGlmICghKC8qKiBAdHlwZSB7YW55fSAqLyAoZWxlbWVudCkpW21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gaGFzbid0IGFuIGF0dHJpYnV0ZSBuYW1lZDogJHttZXRob2ROYW1lfWApXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICgvKiogQHR5cGUge2FueX0gKi8gKGVsZW1lbnQpKVttZXRob2ROYW1lXSAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfSMke21ldGhvZE5hbWV9IGlzIG5vdCBhIGZ1bmN0aW9uYClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvbnQgY2FsbCB3aXRoIGNhbmRpZGF0ZSwgYmVjYXVzZSB0aGF0IHdpbGwgYmluZCB0aGUgZnVuY3Rpb24gd3JvbmcuXG4gICAgICAgIHJldHVybiBhd2FpdCAoLyoqIEB0eXBlIHthbnl9ICovIChlbGVtZW50KSlbbWV0aG9kTmFtZV0oLi4uYXJncylcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc3QgcmV0cnlhYmxlRXJyb3JOYW1lID0gZ2V0UmV0cnlhYmxlSW50ZXJhY3RFcnJvck5hbWUoZXJyb3IpXG5cbiAgICAgICAgICBpZiAocmV0cnlhYmxlRXJyb3JOYW1lKSB7XG4gICAgICAgICAgICAvLyBSZXRyeSBmaW5kaW5nIHRoZSBlbGVtZW50IGFuZCBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgICAgICBpZiAodHJpZXMgPj0gMykge1xuICAgICAgICAgICAgICBsZXQgZWxlbWVudERlc2NyaXB0aW9uXG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50T3JJZGVudGlmaWVyID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGVzY3JpcHRpb24gPSBgQ1NTIHNlbGVjdG9yICR7ZWxlbWVudE9ySWRlbnRpZmllcn1gXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERlc2NyaXB0aW9uID0gYCR7ZWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2VsZW1lbnREZXNjcmlwdGlvbn0gJHttZXRob2ROYW1lfSBmYWlsZWQgYWZ0ZXIgJHt0cmllc30gdHJpZXMgLSAke3JldHJ5YWJsZUVycm9yTmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGF3YWl0IHdhaXQoNTApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gJHttZXRob2ROYW1lfSBmYWlsZWQgLSAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gJHttZXRob2ROYW1lfSBmYWlsZWQgLSAke3R5cGVvZiBlcnJvcn06ICR7ZXJyb3J9YCwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVhZEludGVyYWN0YWJsZVZhbHVlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBlbGVtZW50V2l0aFByb3BlcnR5ID0gLyoqIEB0eXBlIHt7Z2V0UHJvcGVydHk/OiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPHVua25vd24+fX0gKi8gKGVsZW1lbnQpXG5cbiAgICBpZiAodHlwZW9mIGVsZW1lbnRXaXRoUHJvcGVydHkuZ2V0UHJvcGVydHkgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCB2YWx1ZVByb3BlcnR5ID0gYXdhaXQgZWxlbWVudFdpdGhQcm9wZXJ0eS5nZXRQcm9wZXJ0eShcInZhbHVlXCIpXG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWVQcm9wZXJ0eSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVByb3BlcnR5XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVQcm9wZXJ0eSA9IGF3YWl0IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidmFsdWVcIilcblxuICAgIGlmICh0eXBlb2YgdmFsdWVQcm9wZXJ0eSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdmFsdWVQcm9wZXJ0eVxuICAgIH1cblxuICAgIGNvbnN0IHRleHRDb250ZW50ID0gYXdhaXQgZWxlbWVudC5nZXRUZXh0KClcblxuICAgIGlmICh0eXBlb2YgdGV4dENvbnRlbnQgPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRleHRDb250ZW50XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAqL1xuICBhc3luYyBpbnRlcmFjdFNlbmRLZXlzV2l0aEZhbGxiYWNrKGVsZW1lbnQsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCBleHBlY3RlZEFwcGVuZCA9IGdldFNlbmRLZXlzVGV4dEFwcGVuZCguLi5hcmdzKVxuICAgIGNvbnN0IGJlZm9yZVZhbHVlID0gYXdhaXQgdGhpcy5yZWFkSW50ZXJhY3RhYmxlVmFsdWUoZWxlbWVudClcbiAgICBjb25zdCBzZW5kS2V5c1Jlc3VsdCA9IGF3YWl0IGVsZW1lbnQuc2VuZEtleXMoLi4uYXJncylcbiAgICBjb25zdCBhZnRlclZhbHVlID0gYXdhaXQgdGhpcy5yZWFkSW50ZXJhY3RhYmxlVmFsdWUoZWxlbWVudClcblxuICAgIGlmICh0eXBlb2YgYmVmb3JlVmFsdWUgPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgYWZ0ZXJWYWx1ZSA9PSBcInN0cmluZ1wiICYmIGFmdGVyVmFsdWUgIT09IGJlZm9yZVZhbHVlKSB7XG4gICAgICByZXR1cm4gc2VuZEtleXNSZXN1bHRcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0VmFsdWUgPSBnZXRTZW5kS2V5c1VzZXNTZWxlY3RBbGxBbmREZWxldGUoLi4uYXJncykgPyBleHBlY3RlZEFwcGVuZCA6IGAke2JlZm9yZVZhbHVlIHx8IFwiXCJ9JHtleHBlY3RlZEFwcGVuZH1gXG5cbiAgICBpZiAodHlwZW9mIGJlZm9yZVZhbHVlID09IFwic3RyaW5nXCIgJiYgbmV4dFZhbHVlID09PSBiZWZvcmVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHNlbmRLZXlzUmVzdWx0XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KGBcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcmd1bWVudHNbMF1cbiAgICAgIGNvbnN0IG5leHRWYWx1ZSA9IFN0cmluZyhhcmd1bWVudHNbMV0gPz8gXCJcIilcblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LmZvY3VzID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBlbGVtZW50LmZvY3VzKClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGVsZW1lbnQpXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgXCJ2YWx1ZVwiKSB8fCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MVGV4dEFyZWFFbGVtZW50LnByb3RvdHlwZSwgXCJ2YWx1ZVwiKSB8fCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MSW5wdXRFbGVtZW50LnByb3RvdHlwZSwgXCJ2YWx1ZVwiKVxuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gU3RyaW5nKGVsZW1lbnQudmFsdWUpXG5cbiAgICAgICAgaWYgKGRlc2NyaXB0b3IgJiYgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0LmNhbGwoZWxlbWVudCwgbmV4dFZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSBuZXh0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50Ll92YWx1ZVRyYWNrZXIgJiYgdHlwZW9mIGVsZW1lbnQuX3ZhbHVlVHJhY2tlci5zZXRWYWx1ZSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBlbGVtZW50Ll92YWx1ZVRyYWNrZXIuc2V0VmFsdWUocHJldmlvdXNWYWx1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7YnViYmxlczogdHJ1ZX0pKVxuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiY2hhbmdlXCIsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBuZXh0VmFsdWVcbiAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgICAgIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsXG4gICAgYCwgZWxlbWVudCwgbmV4dFZhbHVlKVxuXG4gICAgcmV0dXJuIHNlbmRLZXlzUmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7V2FpdEZvck5vU2VsZWN0b3JBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge3VzZUJhc2VTZWxlY3RvciwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3RBcmdzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXJnczogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsU2VsZWN0b3IgPSB1c2VCYXNlU2VsZWN0b3IgPyB0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKSA6IHNlbGVjdG9yXG5cbiAgICBhd2FpdCB0aGlzLmRyaXZlclNldFRpbWVvdXRzKDApXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aFJldGhyb3duRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KFxuICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKGFjdHVhbFNlbGVjdG9yKSlcblxuICAgICAgICAgICAgLy8gTm90IGZvdW5kIGF0IGFsbFxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3VuZCBidXQgbm90IHZpc2libGVcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgZWxlbWVudHNbMF0uaXNEaXNwbGF5ZWQoKVxuXG4gICAgICAgICAgICAgIHJldHVybiAhaXNEaXNwbGF5ZWRcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgICAgICAgICAgKGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3JcIiB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwic3RhbGUgZWxlbWVudCByZWZlcmVuY2VcIikpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuZ2V0VGltZW91dHMoKVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnJlc3RvcmVUaW1lb3V0cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxhbnk+fSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgX3dpdGhSZXRocm93bkVycm9ycyhjYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXZWJEcml2ZXJFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgU2VsZW5pdW0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsIGVycm9yKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
1046
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViZHJpdmVyLWRyaXZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kcml2ZXJzL3dlYmRyaXZlci1kcml2ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLEVBQUUsRUFBRSxLQUFLLElBQUksYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUE7QUFDN0QsT0FBTyxPQUFPLE1BQU0sbUNBQW1DLENBQUE7QUFDdkQsT0FBTyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFDdEMsT0FBTyxPQUFPLE1BQU0sMkJBQTJCLENBQUE7QUFDL0MsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBRXJEOzs7O0dBSUc7QUFDSCxTQUFTLGNBQWMsQ0FBQyxPQUFPLEVBQUUsS0FBSztJQUNwQyxNQUFNLEtBQUssR0FBRyx1Q0FBdUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDMUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUE7SUFDbkIsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxPQUFPO0lBQ2pDLE9BQU8sT0FBTyxDQUNaLE9BQU87UUFDUCxPQUFPLE9BQU8sS0FBSyxRQUFRO1FBQzNCLE9BQU8sSUFBSSxPQUFPO1FBQ2xCLE9BQU8sT0FBTyxDQUFDLEtBQUssS0FBSyxVQUFVLENBQ3BDLENBQUE7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxZQUFZLENBQUMsS0FBSztJQUN6QixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztRQUMzQixPQUFPLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFBO0lBQy9CLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQTtBQUNsQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyw2QkFBNkIsQ0FB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O1lBQ2YsSUFBSSxLQUFLLFlBQVksY0FBYyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sY0FBYyxDQUFDLFlBQVksS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQ3JGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLEtBQUssQ0FBQTtZQUNiLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCeSwgZXJyb3IgYXMgU2VsZW5pdW1FcnJvcn0gZnJvbSBcInNlbGVuaXVtLXdlYmRyaXZlclwiXG5pbXBvcnQgbG9nZ2luZyBmcm9tIFwic2VsZW5pdW0td2ViZHJpdmVyL2xpYi9sb2dnaW5nLmpzXCJcbmltcG9ydCB7d2FpdCwgd2FpdEZvcn0gZnJvbSBcImF3YWl0ZXJ5XCJcbmltcG9ydCB0aW1lb3V0IGZyb20gXCJhd2FpdGVyeS9idWlsZC90aW1lb3V0LmpzXCJcbmltcG9ydCB7dGVzdElkU2VsZWN0b3J9IGZyb20gXCIuLi90ZXN0LWlkLXNlbGVjdG9yLmpzXCJcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICogQHBhcmFtIHt1bmtub3dufSBjYXVzZVxuICogQHJldHVybnMge0Vycm9yICYge2NhdXNlOiB1bmtub3dufX1cbiAqL1xuZnVuY3Rpb24gZXJyb3JXaXRoQ2F1c2UobWVzc2FnZSwgY2F1c2UpIHtcbiAgY29uc3QgZXJyb3IgPSAvKiogQHR5cGUge0Vycm9yICYge2NhdXNlOiB1bmtub3dufX0gKi8gKG5ldyBFcnJvcihtZXNzYWdlKSlcbiAgZXJyb3IuY2F1c2UgPSBjYXVzZVxuICByZXR1cm4gZXJyb3Jcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtlbGVtZW50IGlzIGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fVxuICovXG5mdW5jdGlvbiBpc1dlYkRyaXZlckVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICBlbGVtZW50ICYmXG4gICAgdHlwZW9mIGVsZW1lbnQgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcImdldElkXCIgaW4gZWxlbWVudCAmJlxuICAgIHR5cGVvZiBlbGVtZW50LmdldElkID09PSBcImZ1bmN0aW9uXCJcbiAgKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3JcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9XG4gKi9cbmZ1bmN0aW9uIGdldEVycm9yTmFtZShlcnJvcikge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJvclxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmV0cnlhYmxlSW50ZXJhY3RFcnJvck5hbWUoZXJyb3IpIHtcbiAgbGV0IGN1cnJlbnRFcnJvciA9IGVycm9yXG5cbiAgd2hpbGUgKGN1cnJlbnRFcnJvcikge1xuICAgIGNvbnN0IGVycm9yTmFtZSA9IGdldEVycm9yTmFtZShjdXJyZW50RXJyb3IpXG5cbiAgICBpZiAoZXJyb3JOYW1lID09PSBcIkVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvclwiIHx8IGVycm9yTmFtZSA9PT0gXCJFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yXCIgfHwgZXJyb3JOYW1lID09PSBcIlN0YWxlRWxlbWVudFJlZmVyZW5jZUVycm9yXCIpIHtcbiAgICAgIHJldHVybiBlcnJvck5hbWVcbiAgICB9XG5cbiAgICBpZiAoIShjdXJyZW50RXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgfHwgIShcImNhdXNlXCIgaW4gY3VycmVudEVycm9yKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGN1cnJlbnRFcnJvciA9IGN1cnJlbnRFcnJvci5jYXVzZVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG4vKipcbiAqIEBwYXJhbSB7Li4uYW55fSBhcmdzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRTZW5kS2V5c1RleHRBcHBlbmQoLi4uYXJncykge1xuICByZXR1cm4gYXJnc1xuICAgIC5tYXAoKGFyZykgPT4ge1xuICAgICAgY29uc3Qgc3RyaW5nQXJnID0gU3RyaW5nKGFyZylcblxuICAgICAgaWYgKC9bXFx1RTAwOVxcdUUwM0RdYVxcdUUwMDAvaS50ZXN0KHN0cmluZ0FyZykpIHtcbiAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHN0cmluZ0FyZy5yZXBsYWNlKC9bXFx1RTAwMC1cXHVGOEZGXS9nLCBcIlwiKVxuICAgIH0pXG4gICAgLmpvaW4oXCJcIilcbn1cblxuLyoqXG4gKiBAcGFyYW0gey4uLmFueX0gYXJnc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGdldFNlbmRLZXlzVXNlc1NlbGVjdEFsbEFuZERlbGV0ZSguLi5hcmdzKSB7XG4gIHJldHVybiBhcmdzLnNvbWUoKGFyZykgPT4gL1tcXHVFMDA5XFx1RTAzRF1hXFx1RTAwMC9pLnRlc3QoU3RyaW5nKGFyZykpKSAmJlxuICAgIGFyZ3Muc29tZSgoYXJnKSA9PiBTdHJpbmcoYXJnKS5pbmNsdWRlcyhcIlxcdUUwMDNcIikgfHwgU3RyaW5nKGFyZykuaW5jbHVkZXMoXCJcXHVFMDE3XCIpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7e2xldmVsOiB7bmFtZTogc3RyaW5nfSwgbWVzc2FnZTogc3RyaW5nfX0gZW50cnlcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gc2hvdWxkSWdub3JlQnJvd3NlckxvZ0VudHJ5KGVudHJ5LCBtZXNzYWdlKSB7XG4gIHJldHVybiBlbnRyeS5sZXZlbC5uYW1lID09PSBcIkRFQlVHXCIgJiZcbiAgICAvKD86XnxcXHMtXFxzKVxcW0RPTVxcXSBQYXNzd29yZCBmaWVsZCBpcyBub3QgY29udGFpbmVkIGluIGEgZm9ybTovaS50ZXN0KG1lc3NhZ2UpXG59XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmluZEFyZ3NcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF0gT3ZlcnJpZGUgdGltZW91dCBmb3IgbG9va3VwLlxuICogQHByb3BlcnR5IHtib29sZWFuIHwgbnVsbH0gW3Zpc2libGVdIFdoZXRoZXIgdG8gcmVxdWlyZSBlbGVtZW50cyB0byBiZSB2aXNpYmxlIChgdHJ1ZWApIG9yIGhpZGRlbiAoYGZhbHNlYCkuIFVzZSBgbnVsbGAgdG8gZGlzYWJsZSB2aXNpYmlsaXR5IGZpbHRlcmluZy5cbiAqIEBwcm9wZXJ0eSB7XCJhY3Rpb25zXCIgfCBcImh1bWFuXCIgfCBcImpzXCJ9IFttZXRob2RdIE92ZXJyaWRlIHRoZSBjbGljayBwYXRoLiBgXCJhY3Rpb25zXCJgIHVzZXMgdGhlIFNlbGVuaXVtIEFjdGlvbnMgQVBJIChyZWFsIHBvaW50ZXIgbW92ZSArIGNsaWNrKTsgYFwiaHVtYW5cImAgdXNlcyBtdWx0aXBsZSBwb2ludGVyIG1vdmVzIGFuZCBwYXVzZXMgYmVmb3JlIGNsaWNraW5nOyBgXCJqc1wiYCBkaXNwYXRjaGVzIGBlbGVtZW50LmNsaWNrKClgIHZpYSBgZXhlY3V0ZVNjcmlwdGAgaW5zaWRlIHRoZSBwYWdlJ3MgSlMgY29udGV4dCBhbmQgaXMgZm9yIGRpYWdub3N0aWNzIG9ubHksIG5vdCBjb21taXR0ZWQgc3RhYmlsaXphdGlvbiBmaXhlcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY2xpY2tPZmZzZXRYXSBYIG9mZnNldCBmb3IgYGFjdGlvbnNgL2BodW1hbmAgcG9pbnRlciBjbGlja3MgcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBlbGVtZW50LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtjbGlja09mZnNldFldIFkgb2Zmc2V0IGZvciBgYWN0aW9uc2AvYGh1bWFuYCBwb2ludGVyIGNsaWNrcyByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2h1bWFuU3RlcERlbGF5XSBQYXVzZSBkdXJhdGlvbiBpbiBtcyBiZXR3ZWVuIGh1bWFuIHBvaW50ZXIgbW92ZXMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2h1bWFuU3RlcHNdIE51bWJlciBvZiBpbnRlcm1lZGlhdGUgcG9pbnRlciBtb3ZlcyBiZWZvcmUgdGhlIGZpbmFsIGNsaWNrIHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3Njcm9sbFRvXSBXaGV0aGVyIHRvIHNjcm9sbCBmb3VuZCBlbGVtZW50cyBpbnRvIHZpZXcgYmVmb3JlIHJldHVybmluZyB0aGVtLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3Njcm9sbENvbnRhaW5lclRlc3RJRHNdIE5hdGl2ZSB0ZXN0IElEcyB0aGF0IHNob3VsZCBiZSB0cmllZCBhcyBzY3JvbGwgY29udGFpbmVycyBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIHZpZXdwb3J0IGdlc3R1cmVzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdXNlQmFzZVNlbGVjdG9yXSBXaGV0aGVyIHRvIHNjb3BlIGJ5IHRoZSBiYXNlIHNlbGVjdG9yLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtGaW5kQXJncyAmIHt3aXRoRmFsbGJhY2s/OiBib29sZWFufX0gSW50ZXJhY3RBcmdzXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2FpdEZvck5vU2VsZWN0b3JBcmdzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt1c2VCYXNlU2VsZWN0b3JdIFdoZXRoZXIgdG8gc2NvcGUgYnkgdGhlIGJhc2Ugc2VsZWN0b3IuXG4gKi9cblxuY2xhc3MgRWxlbWVudE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7IH1cbmNvbnN0IHtXZWJEcml2ZXJFcnJvcn0gPSBTZWxlbml1bUVycm9yXG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgdW5kZWZpbmVkfSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaGFzT3duQXJnKGFyZ3MsIGtleSkge1xuICByZXR1cm4gQm9vbGVhbihhcmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmdzLCBrZXkpKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyb3JcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VsZW1lbnROb3RGb3VuZEVycm9yKGVycm9yKSB7XG4gIGxldCBjdXJyZW50RXJyb3IgPSBlcnJvclxuXG4gIHdoaWxlIChjdXJyZW50RXJyb3IpIHtcbiAgICBpZiAoY3VycmVudEVycm9yIGluc3RhbmNlb2YgRWxlbWVudE5vdEZvdW5kRXJyb3IpIHJldHVybiB0cnVlXG5cbiAgICBpZiAoIShjdXJyZW50RXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgfHwgIShcImNhdXNlXCIgaW4gY3VycmVudEVycm9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY3VycmVudEVycm9yID0gY3VycmVudEVycm9yLmNhdXNlXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNFbGVtZW50TG9va3VwVGltZW91dEVycm9yKGVycm9yKSB7XG4gIGxldCBjdXJyZW50RXJyb3IgPSBlcnJvclxuXG4gIHdoaWxlIChjdXJyZW50RXJyb3IpIHtcbiAgICBpZiAoY3VycmVudEVycm9yIGluc3RhbmNlb2YgU2VsZW5pdW1FcnJvci5UaW1lb3V0RXJyb3IpIHJldHVybiB0cnVlXG5cbiAgICBpZiAoIShjdXJyZW50RXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgfHwgIShcImNhdXNlXCIgaW4gY3VycmVudEVycm9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY3VycmVudEVycm9yID0gY3VycmVudEVycm9yLmNhdXNlXG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGVycm9yXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNFbGVtZW50VW5hdmFpbGFibGVGb3JTY3JvbGxFcnJvcihlcnJvcikge1xuICByZXR1cm4gaXNFbGVtZW50Tm90Rm91bmRFcnJvcihlcnJvcikgfHwgaXNFbGVtZW50TG9va3VwVGltZW91dEVycm9yKGVycm9yKVxufVxuXG4vKipcbiAqIEJhc2UgZHJpdmVyIHVzaW5nIHNlbGVuaXVtLXdlYmRyaXZlciBzZXNzaW9ucy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViRHJpdmVyRHJpdmVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYnJvd3Nlci5qc1wiKS5kZWZhdWx0fSBhcmdzLmJyb3dzZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbYXJncy5vcHRpb25zXVxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2Jyb3dzZXIsIG9wdGlvbnMgPSB7fX0pIHtcbiAgICB0aGlzLmJyb3dzZXIgPSBicm93c2VyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMuYmFzZVVybCA9IHVuZGVmaW5lZFxuICAgIHRoaXMud2ViRHJpdmVyID0gdW5kZWZpbmVkXG4gICAgdGhpcy5fZHJpdmVyVGltZW91dHMgPSA1MDAwXG4gICAgdGhpcy5fdGltZW91dHMgPSA1MDAwXG4gICAgLyoqXG4gICAgICogUHJvY2Vzcy1leGl0IGhhbmRsZXJzIGluc3RhbGxlZCB3aGlsZSBhIFdlYkRyaXZlciBzZXNzaW9uIGlzIGFsaXZlLlxuICAgICAqIFJldGFpbmVkIHNvIGBzdG9wKClgIGNhbiBkZXJlZ2lzdGVyIHRoZW0gYmVmb3JlIHJlbW92aW5nIHRoZVxuICAgICAqIFdlYkRyaXZlciByZWZlcmVuY2UuXG4gICAgICogQHR5cGUge3tzaWdpbnQ6ICgpID0+IHZvaWQsIHNpZ3Rlcm06ICgpID0+IHZvaWQsIGJlZm9yZUV4aXQ6ICgpID0+IHZvaWR9IHwgbnVsbH1cbiAgICAgKi9cbiAgICB0aGlzLl9leGl0SGFuZGxlcnMgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVcmxcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzZXRCYXNlVXJsKGJhc2VVcmwpIHtcbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsXG4gIH1cblxuICAvKiogQHJldHVybnMge3N0cmluZ30gKi9cbiAgZ2V0QmFzZVVybCgpIHtcbiAgICBpZiAoIXRoaXMuYmFzZVVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHJpdmVyIGJhc2UgVVJMIGhhcyBub3QgYmVlbiBzZXRcIilcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5iYXNlVXJsXG4gIH1cblxuICAvKiogQHJldHVybnMge251bWJlcn0gKi9cbiAgZ2V0VGltZW91dHMoKSB7IHJldHVybiB0aGlzLl90aW1lb3V0cyB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRHJpdmVyfVxuICAgKi9cbiAgZ2V0V2ViRHJpdmVyKCkge1xuICAgIGlmICghdGhpcy53ZWJEcml2ZXIpIHRocm93IG5ldyBFcnJvcihcIkRyaXZlciBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXRcIilcbiAgICB0aGlzLmJyb3dzZXIudGhyb3dJZkh0dHBTZXJ2ZXJFcnJvcigpXG5cbiAgICByZXR1cm4gdGhpcy53ZWJEcml2ZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2ltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJEcml2ZXJ9IHdlYkRyaXZlclxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHNldFdlYkRyaXZlcih3ZWJEcml2ZXIpIHtcbiAgICB0aGlzLndlYkRyaXZlciA9IHdlYkRyaXZlclxuICAgIHRoaXMuYnJvd3Nlci5kcml2ZXIgPSB3ZWJEcml2ZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxscyBwcm9jZXNzLWxldmVsIGhhbmRsZXJzIHRoYXQgdGVybWluYXRlIHRoZSBXZWJEcml2ZXIgc2Vzc2lvblxuICAgKiBpZiB0aGUgTm9kZSBwcm9jZXNzIGV4aXRzIHdpdGhvdXQgYW4gZXhwbGljaXQgYHN0b3AoKWAgY2FsbC4gV2l0aG91dFxuICAgKiB0aGlzLCB0aGUgY2hyb21lZHJpdmVyLXNwYXduZWQgQ2hyb21lIGlzIG9ycGhhbmVkIHRvIGluaXQgKFBQSUQ9MSlcbiAgICogd2hlbiB0aGUgdGVzdCBydW5uZXIgZXhpdHMg4oCUIGVhY2ggYG5weCB2ZWxvY2lvdXMgdGVzdGAgcnVuIHRoYXRcbiAgICogc2tpcHMgZXhwbGljaXQgY2xlYW51cCBsZWF2ZXMgYSBDaHJvbWUgcGx1cyB0aG91c2FuZHMgb2ZcbiAgICogYC90bXAvb3JnLmNocm9taXVtLkNocm9taXVtLnNjb3BlZF9kaXIuKmAgYmVoaW5kLiBEcml2ZXIgc3ViY2xhc3NcbiAgICogYHN0YXJ0KClgIGltcGxlbWVudGF0aW9ucyBtdXN0IGNhbGwgdGhpcyBhZnRlciBzZXR0aW5nIHRoZVxuICAgKiBXZWJEcml2ZXIgb24gYSBmcmVzaCBzZXNzaW9uOyB0ZXN0cyB0aGF0IHN0dWIgYHNldFdlYkRyaXZlcmBcbiAgICogZGlyZWN0bHkgZGVsaWJlcmF0ZWx5IGJ5cGFzcyBpdC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBpbnN0YWxsRXhpdEhhbmRsZXJzKCkge1xuICAgIGlmICh0aGlzLl9leGl0SGFuZGxlcnMpIHJldHVyblxuICAgIGNvbnN0IHNpZ2ludCA9ICgpID0+IHsgdm9pZCB0aGlzLl9vbkV4aXRTaWduYWwoXCJTSUdJTlRcIikgfVxuICAgIGNvbnN0IHNpZ3Rlcm0gPSAoKSA9PiB7IHZvaWQgdGhpcy5fb25FeGl0U2lnbmFsKFwiU0lHVEVSTVwiKSB9XG4gICAgY29uc3QgYmVmb3JlRXhpdCA9ICgpID0+IHsgdm9pZCB0aGlzLl9vbkV4aXRTaWduYWwoXCJiZWZvcmVFeGl0XCIpIH1cbiAgICBwcm9jZXNzLm9uY2UoXCJTSUdJTlRcIiwgc2lnaW50KVxuICAgIHByb2Nlc3Mub25jZShcIlNJR1RFUk1cIiwgc2lndGVybSlcbiAgICBwcm9jZXNzLm9uY2UoXCJiZWZvcmVFeGl0XCIsIGJlZm9yZUV4aXQpXG4gICAgdGhpcy5fZXhpdEhhbmRsZXJzID0ge3NpZ2ludCwgc2lndGVybSwgYmVmb3JlRXhpdH1cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgX3JlbW92ZUV4aXRIYW5kbGVycygpIHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuX2V4aXRIYW5kbGVyc1xuICAgIGlmICghaGFuZGxlcnMpIHJldHVyblxuICAgIHRoaXMuX2V4aXRIYW5kbGVycyA9IG51bGxcbiAgICBwcm9jZXNzLm9mZihcIlNJR0lOVFwiLCBoYW5kbGVycy5zaWdpbnQpXG4gICAgcHJvY2Vzcy5vZmYoXCJTSUdURVJNXCIsIGhhbmRsZXJzLnNpZ3Rlcm0pXG4gICAgcHJvY2Vzcy5vZmYoXCJiZWZvcmVFeGl0XCIsIGhhbmRsZXJzLmJlZm9yZUV4aXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtcIlNJR0lOVFwiIHwgXCJTSUdURVJNXCIgfCBcImJlZm9yZUV4aXRcIn0gc2lnbmFsXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgX29uRXhpdFNpZ25hbChzaWduYWwpIHtcbiAgICB0aGlzLl9yZW1vdmVFeGl0SGFuZGxlcnMoKVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnN0b3AoKVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQmVzdC1lZmZvcnQg4oCUIHRoZSBwcm9jZXNzIGlzIGdvaW5nIGRvd24gYW55d2F5LCBhbmQgd2UnZCByYXRoZXJcbiAgICAgIC8vIG9ycGhhbiBhIGJyb3dzZXIgdGhhbiB0aHJvdyBmcm9tIGEgc2lnbmFsIGhhbmRsZXIuXG4gICAgfVxuICAgIC8vIFByZXNlcnZlIHRoZSBjb252ZW50aW9uYWwgc2lnbmFsLWV4aXQgc3RhdHVzICgxMjggKyBzaWduYWwgbnVtYmVyKVxuICAgIC8vIHNvIENJIC8gd3JhcHBlciBzY3JpcHRzIGNhbiBzdGlsbCB0ZWxsIGludGVycnVwdGVkIHJ1bnMgYXBhcnRcbiAgICAvLyBmcm9tIGEgY2xlYW4gcGFzcy4gUGxhaW4gYHByb2Nlc3MuZXhpdCgwKWAgd291bGQgbWlzcmVwb3J0IGFcbiAgICAvLyBjYW5jZWxsZWQgcnVuIGFzIHN1Y2Nlc3NmdWwuXG4gICAgaWYgKHNpZ25hbCA9PT0gXCJTSUdJTlRcIikgcHJvY2Vzcy5leGl0KDEzMClcbiAgICBpZiAoc2lnbmFsID09PSBcIlNJR1RFUk1cIikgcHJvY2Vzcy5leGl0KDE0MylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHN0YXJ0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInN0YXJ0KCkgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZHJpdmVyXCIpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzdG9wKCkge1xuICAgIHRoaXMuX3JlbW92ZUV4aXRIYW5kbGVycygpXG4gICAgaWYgKHRoaXMud2ViRHJpdmVyKSB7XG4gICAgICBhd2FpdCB0aW1lb3V0KHt0aW1lb3V0OiB0aGlzLmdldFRpbWVvdXRzKCksIGVycm9yTWVzc2FnZTogXCJ0aW1lb3V0IHdoaWxlIHF1aXR0aW5nIFdlYkRyaXZlclwifSwgYXN5bmMgKCkgPT4gYXdhaXQgLyoqIEB0eXBlIHtOb25OdWxsYWJsZTx0eXBlb2YgdGhpcy53ZWJEcml2ZXI+fSAqLyAodGhpcy53ZWJEcml2ZXIpLnF1aXQoKSlcbiAgICB9XG5cbiAgICB0aGlzLndlYkRyaXZlciA9IHVuZGVmaW5lZFxuICAgIHRoaXMuYnJvd3Nlci5kcml2ZXIgPSB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbmV3VGltZW91dFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRyaXZlclNldFRpbWVvdXRzKG5ld1RpbWVvdXQpIHtcbiAgICB0aGlzLl9kcml2ZXJUaW1lb3V0cyA9IG5ld1RpbWVvdXRcbiAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLm1hbmFnZSgpLnNldFRpbWVvdXRzKHtpbXBsaWNpdDogbmV3VGltZW91dH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGNhbGxiYWNrIHdpdGggU2VsZW5pdW0ncyBpbXBsaWNpdCB3YWl0IHRlbXBvcmFyaWx5IGNoYW5nZWQuIEZpbmRlclxuICAgKiBtZXRob2RzIGRvIHRoZWlyIG93biBleHBsaWNpdCBwb2xsaW5nLCBzbyBsZWF2aW5nIFNlbGVuaXVtJ3MgaW1wbGljaXQgd2FpdFxuICAgKiBlbmFibGVkIHdvdWxkIG1ha2Ugc2hvcnQgbG9va3VwIHRpbWVvdXRzIGJsb2NrIGZvciB0aGUgZ2xvYmFsIGRyaXZlciB3YWl0LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge251bWJlcn0gaW1wbGljaXRUaW1lb3V0XG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gY2FsbGJhY2tcbiAgICogQHJldHVybnMge1Byb21pc2U8VD59XG4gICAqL1xuICBhc3luYyB3aXRoVGVtcG9yYXJ5SW1wbGljaXRUaW1lb3V0KGltcGxpY2l0VGltZW91dCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBvcmlnaW5hbEltcGxpY2l0VGltZW91dCA9IHRoaXMuX2RyaXZlclRpbWVvdXRzXG5cbiAgICBpZiAob3JpZ2luYWxJbXBsaWNpdFRpbWVvdXQgPT09IGltcGxpY2l0VGltZW91dCkgcmV0dXJuIGF3YWl0IGNhbGxiYWNrKClcblxuICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuc2V0VGltZW91dHMoe2ltcGxpY2l0OiBpbXBsaWNpdFRpbWVvdXR9KVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkuc2V0VGltZW91dHMoe2ltcGxpY2l0OiBvcmlnaW5hbEltcGxpY2l0VGltZW91dH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVzdG9yZVRpbWVvdXRzKCkge1xuICAgIGlmICghdGhpcy5nZXRUaW1lb3V0cygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaW1lb3V0cyBoYXZlbid0IHByZXZpb3VzbHkgYmVlbiBzZXRcIilcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmRyaXZlclNldFRpbWVvdXRzKHRoaXMuZ2V0VGltZW91dHMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gbmV3VGltZW91dFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNldFRpbWVvdXRzKG5ld1RpbWVvdXQpIHtcbiAgICB0aGlzLl90aW1lb3V0cyA9IG5ld1RpbWVvdXRcbiAgICBhd2FpdCB0aGlzLnJlc3RvcmVUaW1lb3V0cygpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBnZXRTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIHJldHVybiB0aGlzLmJyb3dzZXIuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBkcml2ZXJWaXNpdChwYXRoKSB7XG4gICAgY29uc3QgaXNBYnNvbHV0ZVVybCA9IC9eW2Etel0rOlxcL1xcLy9pLnRlc3QocGF0aClcbiAgICBjb25zdCB1cmwgPSBpc0Fic29sdXRlVXJsID8gcGF0aCA6IGAke3RoaXMuZ2V0QmFzZVVybCgpfSR7cGF0aH1gXG5cbiAgICBhd2FpdCB0aGlzLmdldFdlYkRyaXZlcigpLmdldCh1cmwpXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbGwgY29va2llcyBmb3IgdGhlIGN1cnJlbnQgYnJvd3NlciBzZXNzaW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbENvb2tpZXMoKSB7XG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5tYW5hZ2UoKS5kZWxldGVBbGxDb29raWVzKClcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAqL1xuICBhc3luYyBnZXRDdXJyZW50VXJsKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5nZXRDdXJyZW50VXJsKClcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBcIlwiXG4gICAgfVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59ICovXG4gIGFzeW5jIGdldEhUTUwoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZ2V0UGFnZVNvdXJjZSgpXG4gIH1cblxuICAvKiogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gKi9cbiAgYXN5bmMgdGFrZVNjcmVlbnNob3QoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkudGFrZVNjcmVlbnNob3QoKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYnJvd3NlciBsb2dzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn1cbiAgICovXG4gIGFzeW5jIGdldEJyb3dzZXJMb2dzKCkge1xuICAgIGxldCBlbnRyaWVzXG5cbiAgICB0cnkge1xuICAgICAgZW50cmllcyA9IGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkubWFuYWdlKCkubG9ncygpLmdldChsb2dnaW5nLlR5cGUuQlJPV1NFUilcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgICBjb25zdCBicm93c2VyTG9ncyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2VNYXRjaCA9IGVudHJ5Lm1lc3NhZ2UubWF0Y2goL14oLispIChcXGQrKTooXFxkKykgKC4rKSQvKVxuICAgICAgbGV0IG1lc3NhZ2VcblxuICAgICAgaWYgKG1lc3NhZ2VNYXRjaCkge1xuICAgICAgICBtZXNzYWdlID0gbWVzc2FnZU1hdGNoWzRdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXNzYWdlID0gZW50cnkubWVzc2FnZVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkSWdub3JlQnJvd3NlckxvZ0VudHJ5KGVudHJ5LCBtZXNzYWdlKSkgY29udGludWVcblxuICAgICAgYnJvd3NlckxvZ3MucHVzaChgJHtlbnRyeS5sZXZlbC5uYW1lfTogJHttZXNzYWdlfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIGJyb3dzZXJMb2dzXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIGJ5IENTUyBzZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50W10+fVxuICAgKi9cbiAgYXN5bmMgYWxsKHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7c2Nyb2xsQ29udGFpbmVyVGVzdElEcywgc2Nyb2xsVG8gPSBmYWxzZSwgdmlzaWJsZSA9IHRydWUsIHRpbWVvdXQsIHVzZUJhc2VTZWxlY3RvciA9IHRydWUsIC4uLnJlc3RBcmdzfSA9IGFyZ3NcbiAgICB2b2lkIHNjcm9sbENvbnRhaW5lclRlc3RJRHNcbiAgICBjb25zdCByZXN0QXJnc0tleXMgPSBPYmplY3Qua2V5cyhyZXN0QXJncylcbiAgICBsZXQgYWN0dWFsVGltZW91dFxuXG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWN0dWFsVGltZW91dCA9IHRoaXMuX2RyaXZlclRpbWVvdXRzXG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdHVhbFRpbWVvdXQgPSB0aW1lb3V0XG4gICAgfVxuXG4gICAgaWYgKHJlc3RBcmdzS2V5cy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gYXJndW1lbnRzOiAke3Jlc3RBcmdzS2V5cy5qb2luKFwiLCBcIil9YClcblxuICAgIGNvbnN0IGFjdHVhbFNlbGVjdG9yID0gdXNlQmFzZVNlbGVjdG9yID8gdGhpcy5nZXRTZWxlY3RvcihzZWxlY3RvcikgOiBzZWxlY3RvclxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KClcbiAgICBjb25zdCBnZXRUaW1lTGVmdCA9ICgpID0+IE1hdGgubWF4KGFjdHVhbFRpbWVvdXQgLSAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSksIDApXG4gICAgY29uc3QgZ2V0RWxlbWVudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmb3VuZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKGFjdHVhbFNlbGVjdG9yKSlcblxuICAgICAgaWYgKHZpc2libGUgIT09IHRydWUgJiYgdmlzaWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZvdW5kRWxlbWVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyZWRFbGVtZW50cyA9IFtdXG5cbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBmb3VuZEVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgZWxlbWVudC5pc0Rpc3BsYXllZCgpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIWlzRGlzcGxheWVkKSBjb250aW51ZVxuICAgICAgICBpZiAoIXZpc2libGUgJiYgaXNEaXNwbGF5ZWQpIGNvbnRpbnVlXG5cbiAgICAgICAgZmlsdGVyZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmaWx0ZXJlZEVsZW1lbnRzXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHMgPSBbXVxuXG4gICAgYXdhaXQgdGhpcy53aXRoVGVtcG9yYXJ5SW1wbGljaXRUaW1lb3V0KDAsIGFzeW5jICgpID0+IHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHRpbWVMZWZ0ID0gYWN0dWFsVGltZW91dCA9PSAwID8gMCA6IGdldFRpbWVMZWZ0KClcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0aW1lTGVmdCA9PSAwKSB7XG4gICAgICAgICAgICBlbGVtZW50cyA9IGF3YWl0IGdldEVsZW1lbnRzKClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgZWxlbWVudHMgPSBhd2FpdCBnZXRFbGVtZW50cygpXG5cbiAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgIH0sIHRpbWVMZWZ0KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbGV0IGlzU3RhbGVFbGVtZW50RXJyb3IgPSBmYWxzZVxuXG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgU2VsZW5pdW1FcnJvci5TdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvcikge1xuICAgICAgICAgICAgaXNTdGFsZUVsZW1lbnRFcnJvciA9IHRydWVcbiAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgV2ViRHJpdmVyRXJyb3IgJiYgZXJyb3IubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwic3RhbGUgZWxlbWVudCByZWZlcmVuY2VcIikpIHtcbiAgICAgICAgICAgIGlzU3RhbGVFbGVtZW50RXJyb3IgPSB0cnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGVycm9yIGluc3RhbmNlb2YgU2VsZW5pdW1FcnJvci5UaW1lb3V0RXJyb3IgfHwgaXNTdGFsZUVsZW1lbnRFcnJvcilcbiAgICAgICAgICAgICYmIGdldFRpbWVMZWZ0KCkgPiAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBDb3VsZG4ndCBnZXQgZWxlbWVudHMgd2l0aCBzZWxlY3RvcjogJHthY3R1YWxTZWxlY3Rvcn06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcn1gLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAoc2Nyb2xsVG8pIHtcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gICAqL1xuICBhc3luYyBleGlzdHMoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKGF3YWl0IHRoaXMuYWxsKHNlbGVjdG9yLCBhcmdzKSkubGVuZ3RoID4gMFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNFbGVtZW50TG9va3VwVGltZW91dEVycm9yKGVycm9yKSkgcmV0dXJuIGZhbHNlXG5cbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIGVsZW1lbnQgYnkgQ1NTIHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnQ+fVxuICAgKi9cbiAgYXN5bmMgZmluZChzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKVxuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnRbXX0gKi9cbiAgICBsZXQgZWxlbWVudHNcblxuICAgIHRyeSB7XG4gICAgICBlbGVtZW50cyA9IGF3YWl0IHRoaXMuYWxsKHNlbGVjdG9yLCBhcmdzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfSAtICR7ZXJyb3IubWVzc2FnZX0gKHNlbGVjdG9yOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfSlgLCBlcnJvcilcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYCR7dHlwZW9mIGVycm9yfSAtICR7ZXJyb3J9IChzZWxlY3RvcjogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX0pYCwgZXJyb3IpXG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgZWxlbWVudHMgKCR7ZWxlbWVudHMubGVuZ3RofSkgd2FzIGZvdW5kIGJ5IENTUzogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX1gKVxuICAgIH1cblxuICAgIGlmICghZWxlbWVudHNbMF0pIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRTZWNvbmRzID0gKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMFxuICAgICAgdGhyb3cgbmV3IEVsZW1lbnROb3RGb3VuZEVycm9yKGBFbGVtZW50IGNvdWxkbid0IGJlIGZvdW5kIGFmdGVyICR7ZWxhcHNlZFNlY29uZHMudG9GaXhlZCgyKX1zIGJ5IENTUzogJHt0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKX1gKVxuICAgIH1cblxuICAgIHJldHVybiBlbGVtZW50c1swXVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAgICovXG4gIGFzeW5jIHRleHQoc2VsZWN0b3IsIGFyZ3MgPSB7fSkge1xuICAgIHJldHVybiBhd2FpdCAoYXdhaXQgdGhpcy5maW5kKHNlbGVjdG9yLCBhcmdzKSkuZ2V0VGV4dCgpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYSBzaW5nbGUgZWxlbWVudCBieSB0ZXN0IElEXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRCeVRlc3RJRCh0ZXN0SUQsIGFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kKHRlc3RJZFNlbGVjdG9yKHRlc3RJRCksIGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgbmF0aXZlIEFuZHJvaWQgdmlzaWJsZSB0ZXh0IG9yIGFuIGFjY2Vzc2liaWxpdHkgbGFiZWwuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgVGV4dCB0byBsb2NhdGUuXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXSBPcHRpb25hbCBsb29rdXAgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn0gTWF0Y2hpbmcgbmF0aXZlIGVsZW1lbnQuXG4gICAqL1xuICBhc3luYyBmaW5kQnlOYXRpdmVUZXh0KGV4cGVjdGVkVGV4dCwgYXJncyA9IHt9KSB7XG4gICAgdm9pZCBhcmdzXG4gICAgdGhyb3cgbmV3IEVycm9yKGBmaW5kQnlOYXRpdmVUZXh0IGlzIG9ubHkgc3VwcG9ydGVkIGZvciBuYXRpdmUgQXBwaXVtIHNlc3Npb25zOiAke2V4cGVjdGVkVGV4dH1gKVxuICB9XG5cbiAgLyoqXG4gICAqIFdhaXRzIHVudGlsIGEgdGVzdCBpZCBjb250YWlucyBleHBlY3RlZCB2aXNpYmxlIHRleHQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SUQgRWxlbWVudCB0ZXN0IGlkIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFRleHQgRnJhZ21lbnQgdGhhdCBtdXN0IGFwcGVhciBpbiB0aGUgZWxlbWVudCB0ZXh0LlxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc10gT3B0aW9uYWwgdGltZW91dCBhbmQgbG9va3VwIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhaXRGb3JUZXN0SURUZXh0KHRlc3RJRCwgZXhwZWN0ZWRUZXh0LCBhcmdzID0ge30pIHtcbiAgICBjb25zdCB7dGltZW91dDogd2FpdFRpbWVvdXQgPSB0aGlzLmdldFRpbWVvdXRzKCksIC4uLmZpbmRBcmdzfSA9IGFyZ3NcblxuICAgIGF3YWl0IHdhaXRGb3Ioe3RpbWVvdXQ6IHdhaXRUaW1lb3V0fSwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGF3YWl0IHRoaXMuZmluZEJ5VGVzdElEKHRlc3RJRCwgey4uLmZpbmRBcmdzLCB0aW1lb3V0OiAwfSlcbiAgICAgIGNvbnN0IGFjdHVhbFRleHQgPSBhd2FpdCBlbGVtZW50LmdldFRleHQoKVxuXG4gICAgICBpZiAoIWFjdHVhbFRleHQuaW5jbHVkZXMoZXhwZWN0ZWRUZXh0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCB3YWl0aW5nIGZvciB0ZXh0ICR7ZXhwZWN0ZWRUZXh0fS4gTGFzdCB0ZXh0IHdhcyAke2FjdHVhbFRleHR9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGFuIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gdGVzdCBJRCBpcyBjdXJyZW50bHkgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0SURcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICAgKi9cbiAgYXN5bmMgaGFzVGVzdElEKHRlc3RJRCwgYXJncykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmZpbmRCeVRlc3RJRCh0ZXN0SUQsIHsuLi5hcmdzLCB0aW1lb3V0OiAwfSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVsZW1lbnROb3RGb3VuZEVycm9yKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudHwoe3NlbGVjdG9yOiBzdHJpbmd9ICYgRmluZEFyZ3MgJiB7d2l0aEZhbGxiYWNrPzogYm9vbGVhbn0pfSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBfZmluZEVsZW1lbnQoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9ICovXG4gICAgbGV0IGVsZW1lbnRcblxuICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcInN0cmluZ1wiKSB7XG4gICAgICBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcIm9iamVjdFwiICYmIGVsZW1lbnRPcklkZW50aWZpZXIgIT09IG51bGwgJiYgXCJzZWxlY3RvclwiIGluIGVsZW1lbnRPcklkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHtzZWxlY3RvciwgLi4ucmVzdEFyZ3N9ID0gZWxlbWVudE9ySWRlbnRpZmllclxuXG4gICAgICBkZWxldGUgcmVzdEFyZ3Mud2l0aEZhbGxiYWNrXG5cbiAgICAgIGVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmQoc2VsZWN0b3IsIHJlc3RBcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50ID0gLyoqIEB0eXBlIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gKi8gKGVsZW1lbnRPcklkZW50aWZpZXIpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsZW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHNpbmdsZSBlbGVtZW50IGJ5IENTUyBzZWxlY3RvciB3aXRob3V0IHdhaXRpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7RmluZEFyZ3N9IFthcmdzXVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kTm9XYWl0KHNlbGVjdG9yLCBhcmdzID0ge30pIHtcbiAgICBhd2FpdCB0aGlzLmRyaXZlclNldFRpbWVvdXRzKDApXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZChzZWxlY3RvciwgYXJncylcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlVGltZW91dHMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGlja3MgYW4gZWxlbWVudCwgYWxsb3dpbmcgc2VsZWN0b3IgYXJncyB3aGVuIHVzaW5nIGEgQ1NTIHNlbGVjdG9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ3xpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBjbGljayhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSB7XG4gICAgY29uc3Qge2NsaWNrT2Zmc2V0WCwgY2xpY2tPZmZzZXRZLCBodW1hblN0ZXBEZWxheSwgaHVtYW5TdGVwcywgbWV0aG9kLCBzY3JvbGxUbyA9IGZhbHNlLCAuLi5maW5kQXJnc30gPSBhcmdzIHx8IHt9XG4gICAgY29uc3QgY2xpY2tBcmdzID0ge2NsaWNrT2Zmc2V0WCwgY2xpY2tPZmZzZXRZLCBodW1hblN0ZXBEZWxheSwgaHVtYW5TdGVwc31cbiAgICBsZXQgdHJpZXMgPSAwXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJpZXMrK1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5fZmluZEVsZW1lbnQoZWxlbWVudE9ySWRlbnRpZmllciwgZmluZEFyZ3MpXG5cbiAgICAgICAgaWYgKHNjcm9sbFRvKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxFbGVtZW50SW50b1ZpZXcoZWxlbWVudClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QgPT09IFwiYWN0aW9uc1wiKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIHt7b3JpZ2luOiBpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudCwgeD86IG51bWJlciwgeT86IG51bWJlcn19ICovXG4gICAgICAgICAgbGV0IG1vdmVBcmdzID0ge29yaWdpbjogZWxlbWVudH1cblxuICAgICAgICAgIGlmIChjbGlja09mZnNldFggIT09IHVuZGVmaW5lZCB8fCBjbGlja09mZnNldFkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbW92ZUFyZ3MgPSB7b3JpZ2luOiBlbGVtZW50LCB4OiBjbGlja09mZnNldFggPz8gMCwgeTogY2xpY2tPZmZzZXRZID8/IDB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5hY3Rpb25zKHthc3luYzogdHJ1ZX0pLm1vdmUobW92ZUFyZ3MpLmNsaWNrKCkucGVyZm9ybSgpXG4gICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSBcImh1bWFuXCIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmh1bWFuQ2xpY2soZWxlbWVudCwgY2xpY2tBcmdzKVxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gXCJqc1wiKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KFwiYXJndW1lbnRzWzBdLmNsaWNrKClcIiwgZWxlbWVudClcbiAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGF3YWl0IGVsZW1lbnQuY2xpY2soKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtZXRob2Q6ICR7bWV0aG9kfWApXG4gICAgICAgIH1cblxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJFbGVtZW50Q2xpY2tJbnRlcmNlcHRlZEVycm9yXCIgfHwgZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJTdGFsZUVsZW1lbnRSZWZlcmVuY2VFcnJvclwiKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3IuY29uc3RydWN0b3IubmFtZSA9PT0gXCJFbGVtZW50Tm90SW50ZXJhY3RhYmxlRXJyb3JcIikge1xuICAgICAgICAgICAgaWYgKHRyaWVzID49IDMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3JXaXRoQ2F1c2UoYEVsZW1lbnQgJHtlbGVtZW50T3JJZGVudGlmaWVyLmNvbnN0cnVjdG9yLm5hbWV9IGNsaWNrIGZhaWxlZCBhZnRlciAke3RyaWVzfSB0cmllcyAtICR7ZXJyb3IuY29uc3RydWN0b3IubmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGF3YWl0IHdhaXQoNTApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBFbGVtZW50ICR7ZWxlbWVudE9ySWRlbnRpZmllci5jb25zdHJ1Y3Rvci5uYW1lfSBjbGljayBmYWlsZWQgLSAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGBFbGVtZW50ICR7ZWxlbWVudE9ySWRlbnRpZmllci5jb25zdHJ1Y3Rvci5uYW1lfSBjbGljayBmYWlsZWQgLSAke3R5cGVvZiBlcnJvcn06ICR7ZXJyb3J9YCwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcGFyYW0ge3tjbGlja09mZnNldFg/OiBudW1iZXIsIGNsaWNrT2Zmc2V0WT86IG51bWJlciwgaHVtYW5TdGVwRGVsYXk/OiBudW1iZXIsIGh1bWFuU3RlcHM/OiBudW1iZXJ9fSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBodW1hbkNsaWNrKGVsZW1lbnQsIGFyZ3MgPSB7fSkge1xuICAgIGNvbnN0IHtjbGlja09mZnNldFggPSAwLCBjbGlja09mZnNldFkgPSAwLCBodW1hblN0ZXBEZWxheSA9IDc1LCBodW1hblN0ZXBzID0gNH0gPSBhcmdzXG4gICAgY29uc3Qgc3RlcHMgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGh1bWFuU3RlcHMpKVxuICAgIGNvbnN0IGFjdGlvbnMgPSB0aGlzLmdldFdlYkRyaXZlcigpLmFjdGlvbnMoe2FzeW5jOiB0cnVlfSlcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzdGVwczsgaW5kZXgrKykge1xuICAgICAgY29uc3QgcHJvZ3Jlc3MgPSAoaW5kZXggKyAxKSAvIChzdGVwcyArIDEpXG4gICAgICBjb25zdCB3b2JibGUgPSBpbmRleCAlIDIgPT09IDAgPyA2IDogLTRcblxuICAgICAgYWN0aW9uc1xuICAgICAgICAubW92ZSh7XG4gICAgICAgICAgb3JpZ2luOiBlbGVtZW50LFxuICAgICAgICAgIHg6IE1hdGgucm91bmQoY2xpY2tPZmZzZXRYIC0gKCgxIC0gcHJvZ3Jlc3MpICogODApICsgd29iYmxlKSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKGNsaWNrT2Zmc2V0WSAtICgoMSAtIHByb2dyZXNzKSAqIDM1KSAtIHdvYmJsZSlcbiAgICAgICAgfSlcbiAgICAgICAgLnBhdXNlKGh1bWFuU3RlcERlbGF5KVxuICAgIH1cblxuICAgIGF3YWl0IGFjdGlvbnNcbiAgICAgIC5tb3ZlKHtvcmlnaW46IGVsZW1lbnQsIHg6IGNsaWNrT2Zmc2V0WCwgeTogY2xpY2tPZmZzZXRZfSlcbiAgICAgIC5wYXVzZShodW1hblN0ZXBEZWxheSlcbiAgICAgIC5jbGljaygpXG4gICAgICAucGVyZm9ybSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KSB7XG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5hY3Rpb25zKHthc3luYzogdHJ1ZX0pLm1vdmUoe29yaWdpbjogZWxlbWVudH0pLnBlcmZvcm0oKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fCh7c2VsZWN0b3I6IHN0cmluZ30gJiBGaW5kQXJncyAmIHt3aXRoRmFsbGJhY2s/OiBib29sZWFufSl9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50Pn1cbiAgICovXG4gIGFzeW5jIGZpbmRTY3JvbGxUYXJnZXQoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZmluZEVsZW1lbnQoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFpc0VsZW1lbnRVbmF2YWlsYWJsZUZvclNjcm9sbEVycm9yKGVycm9yKSB8fCB0aGlzLmhhc0V4cGxpY2l0VmlzaWJsZVNjcm9sbExvb2t1cChlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSkge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kUmVuZGVyZWRTY3JvbGxUYXJnZXQoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncywgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fCh7c2VsZWN0b3I6IHN0cmluZ30gJiBGaW5kQXJncyAmIHt3aXRoRmFsbGJhY2s/OiBib29sZWFufSl9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgaGFzRXhwbGljaXRWaXNpYmxlU2Nyb2xsTG9va3VwKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpIHtcbiAgICBpZiAoaGFzT3duQXJnKGFyZ3MsIFwidmlzaWJsZVwiKSkgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgdHlwZW9mIGVsZW1lbnRPcklkZW50aWZpZXIgPT0gXCJvYmplY3RcIiAmJlxuICAgICAgZWxlbWVudE9ySWRlbnRpZmllciAhPT0gbnVsbCAmJlxuICAgICAgXCJzZWxlY3RvclwiIGluIGVsZW1lbnRPcklkZW50aWZpZXIgJiZcbiAgICAgIGhhc093bkFyZyhlbGVtZW50T3JJZGVudGlmaWVyLCBcInZpc2libGVcIilcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd8aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8KHtzZWxlY3Rvcjogc3RyaW5nfSAmIEZpbmRBcmdzICYge3dpdGhGYWxsYmFjaz86IGJvb2xlYW59KX0gZWxlbWVudE9ySWRlbnRpZmllclxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzIHwgdW5kZWZpbmVkfSBhcmdzXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gb3JpZ2luYWxFcnJvclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudD59XG4gICAqL1xuICBhc3luYyBmaW5kUmVuZGVyZWRTY3JvbGxUYXJnZXQoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncywgb3JpZ2luYWxFcnJvcikge1xuICAgIGNvbnN0IHNlbGVjdG9yQW5kQXJncyA9IHRoaXMuZ2V0U2VsZWN0b3JTY3JvbGxMb29rdXBBcmdzKGVsZW1lbnRPcklkZW50aWZpZXIsIGFyZ3MpXG5cbiAgICBpZiAoIXNlbGVjdG9yQW5kQXJncykgdGhyb3cgb3JpZ2luYWxFcnJvclxuXG4gICAgY29uc3Qge3NlbGVjdG9yLCBmaW5kQXJnc30gPSBzZWxlY3RvckFuZEFyZ3NcbiAgICBjb25zdCByZW5kZXJlZEVsZW1lbnRzID0gW11cbiAgICBjb25zdCBmb3VuZEVsZW1lbnRzID0gYXdhaXQgdGhpcy5hbGwoc2VsZWN0b3IsIHsuLi5maW5kQXJncywgc2Nyb2xsVG86IGZhbHNlLCB0aW1lb3V0OiAwLCB2aXNpYmxlOiBudWxsfSlcblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBmb3VuZEVsZW1lbnRzKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5pc1JlbmRlcmVkU2Nyb2xsVGFyZ2V0KGVsZW1lbnQpKSB7XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMucHVzaChlbGVtZW50KVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXJlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHJlbmRlcmVkRWxlbWVudHNbMF1cblxuICAgIGlmIChyZW5kZXJlZEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9yZSB0aGFuIDEgcmVuZGVyZWQgZWxlbWVudHMgKCR7cmVuZGVyZWRFbGVtZW50cy5sZW5ndGh9KSB3YXMgZm91bmQgYnkgQ1NTOiAke3RoaXMuZ2V0U2VsZWN0b3Ioc2VsZWN0b3IpfWApXG4gICAgfVxuXG4gICAgdGhyb3cgb3JpZ2luYWxFcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fCh7c2VsZWN0b3I6IHN0cmluZ30gJiBGaW5kQXJncyAmIHt3aXRoRmFsbGJhY2s/OiBib29sZWFufSl9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHt7c2VsZWN0b3I6IHN0cmluZywgZmluZEFyZ3M6IEZpbmRBcmdzfSB8IHVuZGVmaW5lZH1cbiAgICovXG4gIGdldFNlbGVjdG9yU2Nyb2xsTG9va3VwQXJncyhlbGVtZW50T3JJZGVudGlmaWVyLCBhcmdzKSB7XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50T3JJZGVudGlmaWVyID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7c2VsZWN0b3I6IGVsZW1lbnRPcklkZW50aWZpZXIsIGZpbmRBcmdzOiBhcmdzIHx8IHt9fVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZWxlbWVudE9ySWRlbnRpZmllciA9PSBcIm9iamVjdFwiICYmIGVsZW1lbnRPcklkZW50aWZpZXIgIT09IG51bGwgJiYgXCJzZWxlY3RvclwiIGluIGVsZW1lbnRPcklkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHtzZWxlY3RvciwgLi4ucmVzdEFyZ3N9ID0gZWxlbWVudE9ySWRlbnRpZmllclxuXG4gICAgICBkZWxldGUgcmVzdEFyZ3Mud2l0aEZhbGxiYWNrXG5cbiAgICAgIHJldHVybiB7c2VsZWN0b3IsIGZpbmRBcmdzOiByZXN0QXJnc31cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIGFzeW5jIGlzUmVuZGVyZWRTY3JvbGxUYXJnZXQoZWxlbWVudCkge1xuICAgIHJldHVybiBCb29sZWFuKGF3YWl0IHRoaXMuZ2V0V2ViRHJpdmVyKCkuZXhlY3V0ZVNjcmlwdChgXG4gICAgICBjb25zdCBlbGVtZW50ID0gYXJndW1lbnRzWzBdXG4gICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybiBmYWxzZVxuXG4gICAgICBmb3IgKGxldCBjdXJyZW50ID0gZWxlbWVudDsgY3VycmVudDsgY3VycmVudCA9IGN1cnJlbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGN1cnJlbnQpXG4gICAgICAgIGlmIChjdXJyZW50LmhpZGRlbikgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChjdXJyZW50LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChzdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIikgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChzdHlsZS52aXNpYmlsaXR5ID09PSBcImhpZGRlblwiIHx8IHN0eWxlLnZpc2liaWxpdHkgPT09IFwiY29sbGFwc2VcIikgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChzdHlsZS5vcGFjaXR5ID09PSBcIjBcIikgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKSkuc29tZSgocmVjdCkgPT4gcmVjdC53aWR0aCA+IDAgJiYgcmVjdC5oZWlnaHQgPiAwKVxuICAgIGAsIGVsZW1lbnQpKVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgYW4gZWxlbWVudCBpbnRvIHZpZXcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfGltcG9ydChcInNlbGVuaXVtLXdlYmRyaXZlclwiKS5XZWJFbGVtZW50fCh7c2VsZWN0b3I6IHN0cmluZ30gJiBGaW5kQXJncyAmIHt3aXRoRmFsbGJhY2s/OiBib29sZWFufSl9IGVsZW1lbnRPcklkZW50aWZpZXJcbiAgICogQHBhcmFtIHtGaW5kQXJnc30gW2FyZ3NdXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgc2Nyb2xsSW50b1ZpZXcoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBhd2FpdCB0aGlzLmZpbmRTY3JvbGxUYXJnZXQoZWxlbWVudE9ySWRlbnRpZmllciwgYXJncylcblxuICAgIGF3YWl0IHRoaXMuc2Nyb2xsRWxlbWVudEludG9WaWV3KGVsZW1lbnQpXG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiB0ZXN0IElEIGludG8gdmlldy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RJRFxuICAgKiBAcGFyYW0ge0ZpbmRBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBzY3JvbGxUZXN0SWRJbnRvVmlldyh0ZXN0SUQsIGFyZ3MpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gYXdhaXQgdGhpcy5maW5kU2Nyb2xsVGFyZ2V0KHRlc3RJZFNlbGVjdG9yKHRlc3RJRCksIGFyZ3MpXG5cbiAgICBhd2FpdCB0aGlzLnNjcm9sbEVsZW1lbnRJbnRvVmlldyhlbGVtZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIEludGVyYWN0cyB3aXRoIGFuIGVsZW1lbnQgYnkgY2FsbGluZyBhIG1ldGhvZCBvbiBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuXG4gICAqIFJldHJ5aW5nIG9uIEVsZW1lbnROb3RJbnRlcmFjdGFibGVFcnJvciwgRWxlbWVudENsaWNrSW50ZXJjZXB0ZWRFcnJvciwgb3IgU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3IuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR8c3RyaW5nfHtzZWxlY3Rvcjogc3RyaW5nfSAmIEludGVyYWN0QXJnc30gZWxlbWVudE9ySWRlbnRpZmllciBUaGUgZWxlbWVudCBvciBhIENTUyBzZWxlY3RvciB0byBmaW5kIHRoZSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZSBUaGUgbWV0aG9kIG5hbWUgdG8gY2FsbCBvbiB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICovXG4gIGFzeW5jIGludGVyYWN0KGVsZW1lbnRPcklkZW50aWZpZXIsIG1ldGhvZE5hbWUsIC4uLmFyZ3MpIHtcbiAgICBsZXQgdHJpZXMgPSAwXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJpZXMrK1xuXG4gICAgICAvKiogQHR5cGUge0ludGVyYWN0QXJncyB8IHVuZGVmaW5lZH0gKi9cbiAgICAgIGxldCBpbnRlcmFjdEFyZ3NcblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50T3JJZGVudGlmaWVyID09PSBcIm9iamVjdFwiICYmIGVsZW1lbnRPcklkZW50aWZpZXIgJiYgIWlzV2ViRHJpdmVyRWxlbWVudChlbGVtZW50T3JJZGVudGlmaWVyKSkge1xuICAgICAgICBpbnRlcmFjdEFyZ3MgPSBlbGVtZW50T3JJZGVudGlmaWVyXG4gICAgICB9XG5cbiAgICAgIC8qKiBAdHlwZSB7RmluZEFyZ3MgfCB1bmRlZmluZWR9ICovXG4gICAgICBsZXQgZmluZEFyZ3NcblxuICAgICAgaWYgKGludGVyYWN0QXJncykge1xuICAgICAgICAvKiogQHR5cGUge0ZpbmRBcmdzICYge3NlbGVjdG9yPzogc3RyaW5nLCBtZXRob2Q/OiBhbnksIHdpdGhGYWxsYmFjaz86IGFueX19ICovXG4gICAgICAgIGNvbnN0IHNhbml0aXplZEZpbmRBcmdzID0gey4uLmludGVyYWN0QXJnc31cblxuICAgICAgICBkZWxldGUgc2FuaXRpemVkRmluZEFyZ3Muc2VsZWN0b3JcbiAgICAgICAgZGVsZXRlIHNhbml0aXplZEZpbmRBcmdzLm1ldGhvZFxuICAgICAgICBkZWxldGUgc2FuaXRpemVkRmluZEFyZ3Mud2l0aEZhbGxiYWNrXG4gICAgICAgIGZpbmRBcmdzID0gc2FuaXRpemVkRmluZEFyZ3NcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudCA9IGludGVyYWN0QXJnc1xuICAgICAgICA/IGF3YWl0IHRoaXMuX2ZpbmRFbGVtZW50KC8qKiBAdHlwZSB7e3NlbGVjdG9yOiBzdHJpbmd9fSAqLyAoaW50ZXJhY3RBcmdzKS5zZWxlY3RvciwgZmluZEFyZ3MpXG4gICAgICAgIDogYXdhaXQgdGhpcy5fZmluZEVsZW1lbnQoZWxlbWVudE9ySWRlbnRpZmllciwgZmluZEFyZ3MpXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSBcInNlbmRLZXlzXCIpIHtcbiAgICAgICAgICBpZiAoaW50ZXJhY3RBcmdzPy53aXRoRmFsbGJhY2spIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmludGVyYWN0U2VuZEtleXNXaXRoRmFsbGJhY2soZWxlbWVudCwgLi4uYXJncylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgZWxlbWVudC5zZW5kS2V5cyguLi5hcmdzKVxuICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09IFwiY2xpY2tcIikge1xuICAgICAgICAgIGlmIChpc1dlYkRyaXZlckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICAgIC8qKiBAdHlwZSB7RmluZEFyZ3N9ICovXG4gICAgICAgICAgICBjb25zdCBjbGlja0FyZ3MgPSB7fVxuICAgICAgICAgICAgaWYgKGludGVyYWN0QXJncz8ubWV0aG9kICE9PSB1bmRlZmluZWQpIGNsaWNrQXJncy5tZXRob2QgPSBpbnRlcmFjdEFyZ3MubWV0aG9kXG4gICAgICAgICAgICBpZiAoaW50ZXJhY3RBcmdzPy5zY3JvbGxUbyAhPT0gdW5kZWZpbmVkKSBjbGlja0FyZ3Muc2Nyb2xsVG8gPSBpbnRlcmFjdEFyZ3Muc2Nyb2xsVG9cblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jbGljayhlbGVtZW50LCBjbGlja0FyZ3MpXG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYXdhaXQgLyoqIEB0eXBlIHt7Y2xpY2s6ICguLi5jbGlja0FyZ3M6IGFueVtdKSA9PiBQcm9taXNlPGFueT59fSAqLyAoZWxlbWVudCkuY2xpY2soLi4uYXJncylcbiAgICAgICAgfSBlbHNlIGlmICghKC8qKiBAdHlwZSB7YW55fSAqLyAoZWxlbWVudCkpW21ldGhvZE5hbWVdKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gaGFzbid0IGFuIGF0dHJpYnV0ZSBuYW1lZDogJHttZXRob2ROYW1lfWApXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICgvKiogQHR5cGUge2FueX0gKi8gKGVsZW1lbnQpKVttZXRob2ROYW1lXSAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfSMke21ldGhvZE5hbWV9IGlzIG5vdCBhIGZ1bmN0aW9uYClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvbnQgY2FsbCB3aXRoIGNhbmRpZGF0ZSwgYmVjYXVzZSB0aGF0IHdpbGwgYmluZCB0aGUgZnVuY3Rpb24gd3JvbmcuXG4gICAgICAgIHJldHVybiBhd2FpdCAoLyoqIEB0eXBlIHthbnl9ICovIChlbGVtZW50KSlbbWV0aG9kTmFtZV0oLi4uYXJncylcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgY29uc3QgcmV0cnlhYmxlRXJyb3JOYW1lID0gZ2V0UmV0cnlhYmxlSW50ZXJhY3RFcnJvck5hbWUoZXJyb3IpXG5cbiAgICAgICAgICBpZiAocmV0cnlhYmxlRXJyb3JOYW1lKSB7XG4gICAgICAgICAgICAvLyBSZXRyeSBmaW5kaW5nIHRoZSBlbGVtZW50IGFuZCBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgICAgICBpZiAodHJpZXMgPj0gMykge1xuICAgICAgICAgICAgICBsZXQgZWxlbWVudERlc2NyaXB0aW9uXG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50T3JJZGVudGlmaWVyID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGVzY3JpcHRpb24gPSBgQ1NTIHNlbGVjdG9yICR7ZWxlbWVudE9ySWRlbnRpZmllcn1gXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERlc2NyaXB0aW9uID0gYCR7ZWxlbWVudC5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2VsZW1lbnREZXNjcmlwdGlvbn0gJHttZXRob2ROYW1lfSBmYWlsZWQgYWZ0ZXIgJHt0cmllc30gdHJpZXMgLSAke3JldHJ5YWJsZUVycm9yTmFtZX06ICR7ZXJyb3IubWVzc2FnZX1gLCBlcnJvcilcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGF3YWl0IHdhaXQoNTApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gJHttZXRob2ROYW1lfSBmYWlsZWQgLSAke2Vycm9yLmNvbnN0cnVjdG9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCwgZXJyb3IpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yV2l0aENhdXNlKGAke2VsZW1lbnQuY29uc3RydWN0b3IubmFtZX0gJHttZXRob2ROYW1lfSBmYWlsZWQgLSAke3R5cGVvZiBlcnJvcn06ICR7ZXJyb3J9YCwgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtpbXBvcnQoXCJzZWxlbml1bS13ZWJkcml2ZXJcIikuV2ViRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+fVxuICAgKi9cbiAgYXN5bmMgcmVhZEludGVyYWN0YWJsZVZhbHVlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBlbGVtZW50V2l0aFByb3BlcnR5ID0gLyoqIEB0eXBlIHt7Z2V0UHJvcGVydHk/OiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPHVua25vd24+fX0gKi8gKGVsZW1lbnQpXG5cbiAgICBpZiAodHlwZW9mIGVsZW1lbnRXaXRoUHJvcGVydHkuZ2V0UHJvcGVydHkgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCB2YWx1ZVByb3BlcnR5ID0gYXdhaXQgZWxlbWVudFdpdGhQcm9wZXJ0eS5nZXRQcm9wZXJ0eShcInZhbHVlXCIpXG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWVQcm9wZXJ0eSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZVByb3BlcnR5XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVQcm9wZXJ0eSA9IGF3YWl0IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidmFsdWVcIilcblxuICAgIGlmICh0eXBlb2YgdmFsdWVQcm9wZXJ0eSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gdmFsdWVQcm9wZXJ0eVxuICAgIH1cblxuICAgIGNvbnN0IHRleHRDb250ZW50ID0gYXdhaXQgZWxlbWVudC5nZXRUZXh0KClcblxuICAgIGlmICh0eXBlb2YgdGV4dENvbnRlbnQgPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRleHRDb250ZW50XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwic2VsZW5pdW0td2ViZHJpdmVyXCIpLldlYkVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHBhcmFtIHsuLi5hbnl9IGFyZ3NcbiAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAqL1xuICBhc3luYyBpbnRlcmFjdFNlbmRLZXlzV2l0aEZhbGxiYWNrKGVsZW1lbnQsIC4uLmFyZ3MpIHtcbiAgICBjb25zdCBleHBlY3RlZEFwcGVuZCA9IGdldFNlbmRLZXlzVGV4dEFwcGVuZCguLi5hcmdzKVxuICAgIGNvbnN0IGJlZm9yZVZhbHVlID0gYXdhaXQgdGhpcy5yZWFkSW50ZXJhY3RhYmxlVmFsdWUoZWxlbWVudClcbiAgICBjb25zdCBzZW5kS2V5c1Jlc3VsdCA9IGF3YWl0IGVsZW1lbnQuc2VuZEtleXMoLi4uYXJncylcbiAgICBjb25zdCBhZnRlclZhbHVlID0gYXdhaXQgdGhpcy5yZWFkSW50ZXJhY3RhYmxlVmFsdWUoZWxlbWVudClcblxuICAgIGlmICh0eXBlb2YgYmVmb3JlVmFsdWUgPT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgYWZ0ZXJWYWx1ZSA9PSBcInN0cmluZ1wiICYmIGFmdGVyVmFsdWUgIT09IGJlZm9yZVZhbHVlKSB7XG4gICAgICByZXR1cm4gc2VuZEtleXNSZXN1bHRcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0VmFsdWUgPSBnZXRTZW5kS2V5c1VzZXNTZWxlY3RBbGxBbmREZWxldGUoLi4uYXJncykgPyBleHBlY3RlZEFwcGVuZCA6IGAke2JlZm9yZVZhbHVlIHx8IFwiXCJ9JHtleHBlY3RlZEFwcGVuZH1gXG5cbiAgICBpZiAodHlwZW9mIGJlZm9yZVZhbHVlID09IFwic3RyaW5nXCIgJiYgbmV4dFZhbHVlID09PSBiZWZvcmVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHNlbmRLZXlzUmVzdWx0XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5leGVjdXRlU2NyaXB0KGBcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBhcmd1bWVudHNbMF1cbiAgICAgIGNvbnN0IG5leHRWYWx1ZSA9IFN0cmluZyhhcmd1bWVudHNbMV0gPz8gXCJcIilcblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LmZvY3VzID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBlbGVtZW50LmZvY3VzKClcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGVsZW1lbnQpXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvdHlwZSwgXCJ2YWx1ZVwiKSB8fCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MVGV4dEFyZWFFbGVtZW50LnByb3RvdHlwZSwgXCJ2YWx1ZVwiKSB8fCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MSW5wdXRFbGVtZW50LnByb3RvdHlwZSwgXCJ2YWx1ZVwiKVxuICAgICAgICBjb25zdCBwcmV2aW91c1ZhbHVlID0gU3RyaW5nKGVsZW1lbnQudmFsdWUpXG5cbiAgICAgICAgaWYgKGRlc2NyaXB0b3IgJiYgdHlwZW9mIGRlc2NyaXB0b3Iuc2V0ID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0LmNhbGwoZWxlbWVudCwgbmV4dFZhbHVlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnQudmFsdWUgPSBuZXh0VmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbGVtZW50Ll92YWx1ZVRyYWNrZXIgJiYgdHlwZW9mIGVsZW1lbnQuX3ZhbHVlVHJhY2tlci5zZXRWYWx1ZSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBlbGVtZW50Ll92YWx1ZVRyYWNrZXIuc2V0VmFsdWUocHJldmlvdXNWYWx1ZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiLCB7YnViYmxlczogdHJ1ZX0pKVxuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiY2hhbmdlXCIsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIGVsZW1lbnQudGV4dENvbnRlbnQgPSBuZXh0VmFsdWVcbiAgICAgICAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgICAgIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsXG4gICAgYCwgZWxlbWVudCwgbmV4dFZhbHVlKVxuXG4gICAgcmV0dXJuIHNlbmRLZXlzUmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7V2FpdEZvck5vU2VsZWN0b3JBcmdzfSBbYXJnc11cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YWl0Rm9yTm9TZWxlY3RvcihzZWxlY3RvciwgYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge3VzZUJhc2VTZWxlY3RvciwgLi4ucmVzdEFyZ3N9ID0gYXJnc1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3RBcmdzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgYXJnczogJHtPYmplY3Qua2V5cyhyZXN0QXJncykuam9pbihcIiwgXCIpfWApXG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsU2VsZWN0b3IgPSB1c2VCYXNlU2VsZWN0b3IgPyB0aGlzLmdldFNlbGVjdG9yKHNlbGVjdG9yKSA6IHNlbGVjdG9yXG5cbiAgICBhd2FpdCB0aGlzLmRyaXZlclNldFRpbWVvdXRzKDApXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aFJldGhyb3duRXJyb3JzKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS53YWl0KFxuICAgICAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gYXdhaXQgdGhpcy5nZXRXZWJEcml2ZXIoKS5maW5kRWxlbWVudHMoQnkuY3NzKGFjdHVhbFNlbGVjdG9yKSlcblxuICAgICAgICAgICAgLy8gTm90IGZvdW5kIGF0IGFsbFxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3VuZCBidXQgbm90IHZpc2libGVcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlzRGlzcGxheWVkID0gYXdhaXQgZWxlbWVudHNbMF0uaXNEaXNwbGF5ZWQoKVxuXG4gICAgICAgICAgICAgIHJldHVybiAhaXNEaXNwbGF5ZWRcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICAgICAgICAgICAgKGVycm9yLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiU3RhbGVFbGVtZW50UmVmZXJlbmNlRXJyb3JcIiB8fCBlcnJvci5tZXNzYWdlLmluY2x1ZGVzKFwic3RhbGUgZWxlbWVudCByZWZlcmVuY2VcIikpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuZ2V0VGltZW91dHMoKVxuICAgICAgICApXG4gICAgICB9KVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnJlc3RvcmVUaW1lb3V0cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxhbnk+fSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhbnk+fVxuICAgKi9cbiAgYXN5bmMgX3dpdGhSZXRocm93bkVycm9ycyhjYWxsYmFjaykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FsbGJhY2soKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXZWJEcml2ZXJFcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcldpdGhDYXVzZShgU2VsZW5pdW0gJHtlcnJvci5jb25zdHJ1Y3Rvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWAsIGVycm9yKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -324,7 +324,7 @@ export type SystemTestDriverConfig = {
324
324
  /**
325
325
  * Driver implementation to use.
326
326
  */
327
- type?: "appium" | "selenium" | undefined;
327
+ type?: "selenium" | "appium" | undefined;
328
328
  /**
329
329
  * Driver-specific options.
330
330
  */
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Escapes a value for use inside a double-quoted CSS attribute selector.
3
+ * @param {string | number} value Raw attribute value.
4
+ * @returns {string} Value safe to embed inside double quotes.
5
+ */
6
+ export function cssAttributeValue(value: string | number): string;
7
+ /**
8
+ * Builds a `data-testid` (or custom attribute) CSS selector with a safely escaped test ID.
9
+ * @param {string} testID Raw test ID value.
10
+ * @param {string} [attribute] Attribute name, defaults to `data-testid`.
11
+ * @returns {string} CSS attribute selector like `[data-testid="value"]`.
12
+ */
13
+ export function testIdSelector(testID: string, attribute?: string): string;
@@ -0,0 +1,19 @@
1
+ // @ts-check
2
+ /**
3
+ * Escapes a value for use inside a double-quoted CSS attribute selector.
4
+ * @param {string | number} value Raw attribute value.
5
+ * @returns {string} Value safe to embed inside double quotes.
6
+ */
7
+ export function cssAttributeValue(value) {
8
+ return String(value).replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
9
+ }
10
+ /**
11
+ * Builds a `data-testid` (or custom attribute) CSS selector with a safely escaped test ID.
12
+ * @param {string} testID Raw test ID value.
13
+ * @param {string} [attribute] Attribute name, defaults to `data-testid`.
14
+ * @returns {string} CSS attribute selector like `[data-testid="value"]`.
15
+ */
16
+ export function testIdSelector(testID, attribute = "data-testid") {
17
+ return `[${attribute}="${cssAttributeValue(testID)}"]`;
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1pZC1zZWxlY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90ZXN0LWlkLXNlbGVjdG9yLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQUs7SUFDckMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ25FLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsR0FBRyxhQUFhO0lBQzlELE9BQU8sSUFBSSxTQUFTLEtBQUssaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQTtBQUN4RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogRXNjYXBlcyBhIHZhbHVlIGZvciB1c2UgaW5zaWRlIGEgZG91YmxlLXF1b3RlZCBDU1MgYXR0cmlidXRlIHNlbGVjdG9yLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IHZhbHVlIFJhdyBhdHRyaWJ1dGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBWYWx1ZSBzYWZlIHRvIGVtYmVkIGluc2lkZSBkb3VibGUgcXVvdGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzQXR0cmlidXRlVmFsdWUodmFsdWUpIHtcbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSkucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csIFwiXFxcXFxcXCJcIilcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBgZGF0YS10ZXN0aWRgIChvciBjdXN0b20gYXR0cmlidXRlKSBDU1Mgc2VsZWN0b3Igd2l0aCBhIHNhZmVseSBlc2NhcGVkIHRlc3QgSUQuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVzdElEIFJhdyB0ZXN0IElEIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IFthdHRyaWJ1dGVdIEF0dHJpYnV0ZSBuYW1lLCBkZWZhdWx0cyB0byBgZGF0YS10ZXN0aWRgLlxuICogQHJldHVybnMge3N0cmluZ30gQ1NTIGF0dHJpYnV0ZSBzZWxlY3RvciBsaWtlIGBbZGF0YS10ZXN0aWQ9XCJ2YWx1ZVwiXWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXN0SWRTZWxlY3Rvcih0ZXN0SUQsIGF0dHJpYnV0ZSA9IFwiZGF0YS10ZXN0aWRcIikge1xuICByZXR1cm4gYFske2F0dHJpYnV0ZX09XCIke2Nzc0F0dHJpYnV0ZVZhbHVlKHRlc3RJRCl9XCJdYFxufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "system-testing",
3
- "version": "1.0.120",
3
+ "version": "1.0.122",
4
4
  "description": "System testing with Selenium and browsers.",
5
5
  "bin": {
6
6
  "system-testing": "build/cli.js"
@@ -48,7 +48,6 @@
48
48
  "eslint": "eslint --max-warnings 0"
49
49
  },
50
50
  "dependencies": {
51
- "appium": "3.5.2",
52
51
  "awaitery": "^1.0.12",
53
52
  "diggerize": "^1.0.9",
54
53
  "eventemitter3": "^5.0.1",
@@ -64,10 +63,14 @@
64
63
  "ya-use-event-emitter": "^0.1.2"
65
64
  },
66
65
  "peerDependencies": {
66
+ "appium": ">= 3.5.2",
67
67
  "react": ">= 18.3.0",
68
68
  "selenium-webdriver": ">= 4.34.0"
69
69
  },
70
70
  "peerDependenciesMeta": {
71
+ "appium": {
72
+ "optional": true
73
+ },
71
74
  "react": {
72
75
  "optional": true
73
76
  }
@@ -79,6 +82,7 @@
79
82
  "@types/qs": "^6.14.0",
80
83
  "@types/react": "^19.2.7",
81
84
  "@types/selenium-webdriver": "^4.35.4",
85
+ "appium": "3.5.2",
82
86
  "appium-chromium-driver": "^2.1.6",
83
87
  "appium-uiautomator2-driver": "^7.1.0",
84
88
  "eslint": "^10.1.0",