@appium/base-driver 8.0.0 → 8.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/protocol/protocol.js +2 -2
- package/index.d.ts +121 -0
- package/lib/protocol/protocol.js +9 -7
- package/package.json +7 -6
|
@@ -199,7 +199,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
|
|
|
199
199
|
throw new _errors.errors.NoSuchDriverError();
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
-
if (isSessCmd && driverShouldDoJwpProxy(driver, req, spec.command)) {
|
|
202
|
+
if (isSessCmd && !spec.neverProxy && driverShouldDoJwpProxy(driver, req, spec.command)) {
|
|
203
203
|
await doJwpProxy(driver, req, res);
|
|
204
204
|
return;
|
|
205
205
|
}
|
|
@@ -387,4 +387,4 @@ async function doJwpProxy(driver, req, res) {
|
|
|
387
387
|
}require('source-map-support').install();
|
|
388
388
|
|
|
389
389
|
|
|
390
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIlByb3RvY29sIiwiZGV0ZXJtaW5lUHJvdG9jb2wiLCJkZXNpcmVkQ2FwYWJpbGl0aWVzIiwicmVxdWlyZWRDYXBhYmlsaXRpZXMiLCJjYXBhYmlsaXRpZXMiLCJfIiwiaXNQbGFpbk9iamVjdCIsIlBST1RPQ09MUyIsIlczQyIsIk1KU09OV1AiLCJleHRyYWN0UHJvdG9jb2wiLCJkcml2ZXIiLCJzZXNzaW9uSWQiLCJkc3REcml2ZXIiLCJpc0Z1bmN0aW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsInByb3RvY29sIiwiU0VTU0lPTlNfQ0FDSEUiLCJnZXRQcm90b2NvbCIsImlzU2Vzc2lvbkNvbW1hbmQiLCJjb21tYW5kIiwiaW5jbHVkZXMiLCJOT19TRVNTSU9OX0lEX0NPTU1BTkRTIiwid3JhcFBhcmFtcyIsInBhcmFtU2V0cyIsImpzb25PYmoiLCJyZXMiLCJpc0FycmF5IiwiaXNPYmplY3QiLCJ3cmFwIiwidW53cmFwUGFyYW1zIiwidW53cmFwIiwiY2hlY2tQYXJhbXMiLCJyZXF1aXJlZFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwicmVjZWl2ZWRQYXJhbXMiLCJrZXlzIiwicmVxdWlyZWQiLCJmaXJzdCIsIm9wdGlvbmFsIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiZXJyb3JzIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJwYXJhbXMiLCJkaWZmZXJlbmNlIiwibWFrZUFyZ3MiLCJyZXF1ZXN0UGFyYW1zIiwicGF5bG9hZFBhcmFtcyIsInVybFBhcmFtcyIsInJldmVyc2UiLCJ3aXRob3V0IiwiYXJncyIsImZsYXR0ZW4iLCJtYXAiLCJwIiwiY29uY2F0IiwidSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlc3Npb25FeGlzdHMiLCJFcnJvciIsImV4ZWN1dGVDb21tYW5kIiwiZXhlY3V0ZSIsImFkZFJvdXRlcyIsImFwcCIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsImFsbE1ldGhvZHMiLCJNRVRIT0RfTUFQIiwicGF0aCIsIm1ldGhvZHMiLCJ0b1BhaXJzIiwibWV0aG9kIiwic3BlYyIsImJ1aWxkSGFuZGxlciIsImlzU2Vzc0NtZCIsImFzeW5jSGFuZGxlciIsInJlcSIsImJvZHkiLCJodHRwUmVzQm9keSIsImh0dHBTdGF0dXMiLCJuZXdTZXNzaW9uSWQiLCJjdXJyZW50UHJvdG9jb2wiLCJOb1N1Y2hEcml2ZXJFcnJvciIsImRyaXZlclNob3VsZERvSndwUHJveHkiLCJkb0p3cFByb3h5IiwiTm90SW1wbGVtZW50ZWRFcnJvciIsImRyaXZlclJlcyIsInZhbGlkYXRvcnMiLCJnZXRMb2dnZXIiLCJkZWJ1ZyIsImNvbnN0cnVjdG9yIiwibmFtZSIsInRydW5jYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsIk1BWF9MT0dfQk9EWV9MRU5HVEgiLCJoYXMiLCJlcnJvciIsInZhbHVlIiwicHV0U2Vzc2lvbiIsInV0aWwiLCJoYXNWYWx1ZSIsInN0YXR1cyIsImlzTmFOIiwicGFyc2VJbnQiLCJzdGFja3RyYWNlIiwicmVzZXRMb2dnZXIiLCJlcnIiLCJhY3R1YWxFcnIiLCJlcnJNc2ciLCJzdGFjayIsIlByb3h5UmVxdWVzdEVycm9yIiwiZ2V0QWN0dWFsRXJyb3IiLCJqc29ud3BSZXMiLCJ3M2NSZXMiLCJpc1N0cmluZyIsInNlbmQiLCJqc29uIiwidG9Mb3dlckNhc2UiLCJCIiwicmVzb2x2ZSIsImRvbmUiLCJwcm94eUFjdGl2ZSIsInByb3h5Um91dGVJc0F2b2lkZWQiLCJvcmlnaW5hbFVybCIsImluZm8iLCJjYW5Qcm94eSIsInByb3hpZWRSZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUlBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztB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QVcsaUNBQWdDaUQsR0FBRyxDQUFDdkUsT0FBUSxFQUF2RCxDQUFOO0FBQ0Q7QUFDRjtBQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgdmFsaWRhdG9ycyB9IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuICBlcnJvcnMsIGlzRXJyb3JUeXBlLCBnZXRSZXNwb25zZUZvclczQ0Vycm9yLCBnZXRSZXNwb25zZUZvckpzb253cEVycm9yLFxuICBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSwgZXJyb3JGcm9tVzNDSnNvbkNvZGUsXG59IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IE1FVEhPRF9NQVAsIE5PX1NFU1NJT05fSURfQ09NTUFORFMgfSBmcm9tICcuL3JvdXRlcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQge1xuICBmb3JtYXRSZXNwb25zZVZhbHVlLCBmb3JtYXRTdGF0dXMsXG59IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBNQVhfTE9HX0JPRFlfTEVOR1RILCBQUk9UT0NPTFMsIERFRkFVTFRfQkFTRV9QQVRIIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCBTRVNTSU9OU19DQUNIRSBmcm9tICcuL3Nlc3Npb25zLWNhY2hlJztcblxuXG5jb25zdCBDUkVBVEVfU0VTU0lPTl9DT01NQU5EID0gJ2NyZWF0ZVNlc3Npb24nO1xuY29uc3QgREVMRVRFX1NFU1NJT05fQ09NTUFORCA9ICdkZWxldGVTZXNzaW9uJztcblxuY2xhc3MgUHJvdG9jb2wge31cblxuZnVuY3Rpb24gZGV0ZXJtaW5lUHJvdG9jb2wgKGRlc2lyZWRDYXBhYmlsaXRpZXMsIHJlcXVpcmVkQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpIHtcbiAgcmV0dXJuIF8uaXNQbGFpbk9iamVjdChjYXBhYmlsaXRpZXMpID9cbiAgICBQUk9UT0NPTFMuVzNDIDpcbiAgICBQUk9UT0NPTFMuTUpTT05XUDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFByb3RvY29sIChkcml2ZXIsIHNlc3Npb25JZCA9IG51bGwpIHtcbiAgY29uc3QgZHN0RHJpdmVyID0gXy5pc0Z1bmN0aW9uKGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uKVxuICAgID8gZHJpdmVyLmRyaXZlckZvclNlc3Npb24oc2Vzc2lvbklkKVxuICAgIDogZHJpdmVyO1xuICBpZiAoZHN0RHJpdmVyID09PSBkcml2ZXIpIHtcbiAgICAvLyBTaG9ydGNpcmN1aXQgaWYgdGhlIGRyaXZlciBpbnN0YW5jZSBpcyBub3QgYW4gdW1icmVsbGEgZHJpdmVyXG4gICAgLy8gb3IgaXQgaXMgRmFrZSBkcml2ZXIgaW5zdGFuY2UsIHdoZXJlIGBkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbmBcbiAgICAvLyBhbHdheXMgcmV0dXJucyBzZWxmIGluc3RhbmNlXG4gICAgcmV0dXJuIGRyaXZlci5wcm90b2NvbDtcbiAgfVxuXG4gIC8vIEV4dHJhY3QgdGhlIHByb3RvY29sIGZvciB0aGUgY3VycmVudCBzZXNzaW9uIGlmIHRoZSBnaXZlbiBkcml2ZXIgaXMgdGhlIHVtYnJlbGxhIG9uZVxuICByZXR1cm4gZHN0RHJpdmVyID8gZHN0RHJpdmVyLnByb3RvY29sIDogU0VTU0lPTlNfQ0FDSEUuZ2V0UHJvdG9jb2woc2Vzc2lvbklkKTtcbn1cblxuZnVuY3Rpb24gaXNTZXNzaW9uQ29tbWFuZCAoY29tbWFuZCkge1xuICByZXR1cm4gIV8uaW5jbHVkZXMoTk9fU0VTU0lPTl9JRF9DT01NQU5EUywgY29tbWFuZCk7XG59XG5cbmZ1bmN0aW9uIHdyYXBQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBwZXJmb3JtVG91Y2ggd2hpY2ggdGFrZSBhIHNpbmdsZSBwYXJhbWV0ZXIgKHByaW1pdGl2ZSB0eXBlIG9yIGFycmF5KS5cbiAgICogU29tZSBkcml2ZXJzIGNob29zZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFzIGEgdmFsdWUgKGVnLiBbYWN0aW9uMSwgYWN0aW9uMi4uLl0pIHdoaWxlIG90aGVycyB0b1xuICAgKiB3cmFwIGl0IHdpdGhpbiBhbiBvYmplY3QoZWcnIHtnZXN0dXJlOiAgW2FjdGlvbjEsIGFjdGlvbjIuLi5dfSksIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gdmFsaWRhdGUuXG4gICAqIFRoZSB3cmFwIG9wdGlvbiBpbiB0aGUgc3BlYyBlbmZvcmNlIHdyYXBwaW5nIGJlZm9yZSB2YWxpZGF0aW9uLCBzbyB0aGF0IGFsbCBwYXJhbXMgYXJlIHdyYXBwZWQgYXRcbiAgICogdGhlIHRpbWUgdGhleSBhcmUgdmFsaWRhdGVkIGFuZCBsYXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmRzLlxuICAgKi9cbiAgbGV0IHJlcyA9IGpzb25PYmo7XG4gIGlmIChfLmlzQXJyYXkoanNvbk9iaikgfHwgIV8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICByZXMgPSB7fTtcbiAgICByZXNbcGFyYW1TZXRzLndyYXBdID0ganNvbk9iajtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBzZXROZXR3b3JrQ29ubmVjdGlvbiB3aGljaCBzZW5kIHBhcmFtZXRlcnMgd3JhcHBlZCBpbnNpZGUgYSBrZXkgc3VjaCBhc1xuICAgKiBcInBhcmFtZXRlcnNcIi4gVGhpcyBmdW5jdGlvbiB1bndyYXBzIHRoZW0gKGVnLiB7XCJwYXJhbWV0ZXJzXCI6IHtcInR5cGVcIjogMX19IGJlY29tZXMge1widHlwZVwiOiAxfSkuXG4gICAqL1xuICBsZXQgcmVzID0ganNvbk9iajtcbiAgaWYgKF8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICAvLyBzb21lIGNsaWVudHMsIGxpa2UgcnVieSwgZG9uJ3Qgd3JhcFxuICAgIGlmIChqc29uT2JqW3BhcmFtU2V0cy51bndyYXBdKSB7XG4gICAgICByZXMgPSBqc29uT2JqW3BhcmFtU2V0cy51bndyYXBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBjaGVja1BhcmFtcyAocGFyYW1TZXRzLCBqc29uT2JqLCBwcm90b2NvbCkge1xuICBsZXQgcmVxdWlyZWRQYXJhbXMgPSBbXTtcbiAgbGV0IG9wdGlvbmFsUGFyYW1zID0gW107XG4gIGxldCByZWNlaXZlZFBhcmFtcyA9IF8ua2V5cyhqc29uT2JqKTtcblxuICBpZiAocGFyYW1TZXRzKSB7XG4gICAgaWYgKHBhcmFtU2V0cy5yZXF1aXJlZCkge1xuICAgICAgLy8gd2UgbWlnaHQgaGF2ZSBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLFxuICAgICAgLy8gb3IgYW4gYXJyYXkgb2YgYXJyYXlzIG9mIHBhcmFtZXRlcnMsIHNvIHN0YW5kYXJkaXplXG4gICAgICBpZiAoIV8uaXNBcnJheShfLmZpcnN0KHBhcmFtU2V0cy5yZXF1aXJlZCkpKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gW3BhcmFtU2V0cy5yZXF1aXJlZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1aXJlZFBhcmFtcyA9IHBhcmFtU2V0cy5yZXF1aXJlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUganVzdCBhbiBhcnJheVxuICAgIGlmIChwYXJhbVNldHMub3B0aW9uYWwpIHtcbiAgICAgIG9wdGlvbmFsUGFyYW1zID0gcGFyYW1TZXRzLm9wdGlvbmFsO1xuICAgIH1cblxuICAgIC8vIElmIGEgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGFzIHRoZSAndmFsaWRhdGUnIGtleSwgaXQgd2lsbCBoZXJlIGJlIGNhbGxlZCB3aXRoXG4gICAgLy8ganNvbk9iaiBhcyB0aGUgcGFyYW0uIElmIGl0IHJldHVybnMgc29tZXRoaW5nIGZhbHN5LCB2ZXJpZmljYXRpb24gd2lsbCBiZVxuICAgIC8vIGNvbnNpZGVyZWQgdG8gaGF2ZSBwYXNzZWQuIElmIGl0IHJldHVybnMgc29tZXRoaW5nIGVsc2UsIHRoYXQgd2lsbCBiZSB0aGVcbiAgICAvLyBhcmd1bWVudCB0byBhbiBlcnJvciB3aGljaCBpcyB0aHJvd24gdG8gdGhlIHVzZXJcbiAgICBpZiAocGFyYW1TZXRzLnZhbGlkYXRlKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IHBhcmFtU2V0cy52YWxpZGF0ZShqc29uT2JqLCBwcm90b2NvbCk7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcihtZXNzYWdlLCBqc29uT2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBpZiB3ZSBoYXZlIG5vIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGFsbCBpcyB3ZWxsXG4gIGlmIChyZXF1aXJlZFBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBzb21lIGNsaWVudHMgcGFzcyBpbiB0aGUgc2Vzc2lvbiBpZCBpbiB0aGUgcGFyYW1zXG4gIGlmIChvcHRpb25hbFBhcmFtcy5pbmRleE9mKCdzZXNzaW9uSWQnKSA9PT0gLTEpIHtcbiAgICBvcHRpb25hbFBhcmFtcy5wdXNoKCdzZXNzaW9uSWQnKTtcbiAgfVxuXG4gIC8vIHNvbWUgY2xpZW50cyBwYXNzIGluIGFuIGVsZW1lbnQgaWQgaW4gdGhlIHBhcmFtc1xuICBpZiAob3B0aW9uYWxQYXJhbXMuaW5kZXhPZignaWQnKSA9PT0gLTEpIHtcbiAgICBvcHRpb25hbFBhcmFtcy5wdXNoKCdpZCcpO1xuICB9XG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhbmQgY2hlY2sgYWdhaW5zdCBvdXIgYXJndW1lbnRzXG4gIGZvciAobGV0IHBhcmFtcyBvZiByZXF1aXJlZFBhcmFtcykge1xuICAgIGlmIChfLmRpZmZlcmVuY2UocmVjZWl2ZWRQYXJhbXMsIHBhcmFtcywgb3B0aW9uYWxQYXJhbXMpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICBfLmRpZmZlcmVuY2UocGFyYW1zLCByZWNlaXZlZFBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyB3ZSBoYXZlIGEgc2V0IG9mIHBhcmFtZXRlcnMgdGhhdCBpcyBjb3JyZWN0XG4gICAgICAvLyBzbyBzaG9ydC1jaXJjdWl0XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKHBhcmFtU2V0cywgcmVjZWl2ZWRQYXJhbXMpO1xufVxuXG4vKlxuICogVGhpcyBtZXRob2QgdGFrZXMgMyBwaWVjZXMgb2YgZGF0YTogcmVxdWVzdCBwYXJhbWV0ZXJzICgncmVxdWVzdFBhcmFtcycpLFxuICogYSByZXF1ZXN0IEpTT04gYm9keSAoJ2pzb25PYmonKSwgYW5kICdwYXlsb2FkUGFyYW1zJywgd2hpY2ggaXMgdGhlIHNlY3Rpb25cbiAqIGZyb20gdGhlIHJvdXRlIGRlZmluaXRpb24gZm9yIGEgcGFydGljdWxhciBlbmRwb2ludCB3aGljaCBoYXMgaW5zdHJ1Y3Rpb25zXG4gKiBvbiBoYW5kbGluZyBwYXJhbWV0ZXJzLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsXG4gKiBiZSBhcHBsaWVkIHRvIGEgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gbWFrZUFyZ3MgKHJlcXVlc3RQYXJhbXMsIGpzb25PYmosIHBheWxvYWRQYXJhbXMsIHByb3RvY29sKSB7XG4gIC8vIFdlIHdhbnQgdG8gcGFzcyB0aGUgXCJ1cmxcIiBwYXJhbWV0ZXJzIHRvIHRoZSBjb21tYW5kcyBpbiByZXZlcnNlIG9yZGVyXG4gIC8vIHNpbmNlIHRoZSBjb21tYW5kIHdpbGwgc29tZXRpbWVzIHdhbnQgdG8gaWdub3JlLCBzYXksIHRoZSBzZXNzaW9uSWQuXG4gIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcHV0dGluZyBzZXNzaW9uSWQgbGFzdCwgd2hpY2ggbWVhbnMgaW4gSlMgd2UgY2FuXG4gIC8vIG9taXQgaXQgZnJvbSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlmIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQuXG4gIGxldCB1cmxQYXJhbXMgPSBfLmtleXMocmVxdWVzdFBhcmFtcykucmV2ZXJzZSgpO1xuXG4gIC8vIEluIHRoZSBzaW1wbGUgY2FzZSwgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIGEgYmFzaWMgYXJyYXkgaW5cbiAgLy8gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gc3RhcnQgdGhlcmUuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVyZSBhcmVcbiAgLy8gbXVsdGlwbGUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRob3VnaCwgc28gaGFuZGxlIHRoYXQgY2FzZVxuICAvLyB0b28uXG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IHBheWxvYWRQYXJhbXMucmVxdWlyZWQ7XG4gIGlmIChfLmlzQXJyYXkoXy5maXJzdChwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSkpIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRoZW4gd2Ugd2lsbCBoYXZlIGFuXG4gICAgLy8gYXJyYXkgb2YgYXJyYXlzIGluIHBheWxvYWRQYXJhbXMucmVxdWlyZWQsIHNvIGxvb3AgdGhyb3VnaCBlYWNoIHNldCBhbmRcbiAgICAvLyBwaWNrIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHdoaWNoIEpTT04gcGFyYW1zIHdlcmUgYWN0dWFsbHkgc2VudC4gV2UndmVcbiAgICAvLyBhbHJlYWR5IGJlZW4gdGhyb3VnaCB2YWxpZGF0aW9uIHNvIHdlJ3JlIGd1YXJhbnRlZWQgdG8gZmluZCBhIG1hdGNoLlxuICAgIGxldCBrZXlzID0gXy5rZXlzKGpzb25PYmopO1xuICAgIGZvciAobGV0IHBhcmFtcyBvZiBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSB7XG4gICAgICBpZiAoXy53aXRob3V0KHBhcmFtcywgLi4ua2V5cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1zO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBOb3cgd2UgY29uc3RydWN0IG91ciBsaXN0IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY29tbWFuZFxuICBsZXQgYXJncztcbiAgaWYgKF8uaXNGdW5jdGlvbihwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKSkge1xuICAgIC8vIEluIHRoZSByb3V0ZSBzcGVjLCBhIHBhcnRpY3VsYXIgcm91dGUgbWlnaHQgZGVmaW5lIGEgJ21ha2VBcmdzJyBmdW5jdGlvblxuICAgIC8vIGlmIGl0IHdhbnRzIGZ1bGwgY29udHJvbCBvdmVyIGhvdyB0byB0dXJuIEpTT04gcGFyYW1ldGVycyBpbnRvIGNvbW1hbmRcbiAgICAvLyBhcmd1bWVudHMuIFNvIHdlIHBhc3MgaXQgdGhlIEpTT04gcGFyYW1ldGVycyBhbmQgaXQgcmV0dXJucyBhbiBhcnJheVxuICAgIC8vIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgaGFuZGxpbmcgY29tbWFuZC4gRm9yIGV4YW1wbGUgaWYgaXQgcmV0dXJuc1xuICAgIC8vIFsxLCAyLCAzXSwgd2Ugd2lsbCBjYWxsIGBjb21tYW5kKDEsIDIsIDMsIC4uLilgICh1cmwgcGFyYW1zIGFyZSBzZXBhcmF0ZVxuICAgIC8vIGZyb20gSlNPTiBwYXJhbXMgYW5kIGdldCBjb25jYXRlbmF0ZWQgYmVsb3cpLlxuICAgIGFyZ3MgPSBwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKGpzb25PYmosIHByb3RvY29sKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIGNvbGxlY3QgYWxsIHRoZSByZXF1aXJlZCBhbmQgb3B0aW9uYWwgcGFyYW1zIGFuZCBmbGF0dGVuIHRoZW1cbiAgICAvLyBpbnRvIGFuIGFyZ3VtZW50IGFycmF5XG4gICAgYXJncyA9IF8uZmxhdHRlbihyZXF1aXJlZFBhcmFtcykubWFwKChwKSA9PiBqc29uT2JqW3BdKTtcbiAgICBpZiAocGF5bG9hZFBhcmFtcy5vcHRpb25hbCkge1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KF8uZmxhdHRlbihwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKS5tYXAoKHApID0+IGpzb25PYmpbcF0pKTtcbiAgICB9XG4gIH1cbiAgLy8gRmluYWxseSwgZ2V0IG91ciB1cmwgcGFyYW1zIChzZXNzaW9uIGlkLCBlbGVtZW50IGlkLCBldGMuLi4pIG9uIHRoZSBlbmQgb2ZcbiAgLy8gdGhlIGxpc3RcbiAgYXJncyA9IGFyZ3MuY29uY2F0KHVybFBhcmFtcy5tYXAoKHUpID0+IHJlcXVlc3RQYXJhbXNbdV0pKTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiAoZHJpdmVyKSB7XG4gIGlmICghZHJpdmVyLnNlc3Npb25FeGlzdHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgdXNlZCB3aXRoIE1KU09OV1AgbXVzdCBpbXBsZW1lbnQgYHNlc3Npb25FeGlzdHNgJyk7XG4gIH1cblxuICBpZiAoIShkcml2ZXIuZXhlY3V0ZUNvbW1hbmQgfHwgZHJpdmVyLmV4ZWN1dGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEcml2ZXJzIHVzZWQgd2l0aCBNSlNPTldQIG11c3QgaW1wbGVtZW50IGBleGVjdXRlQ29tbWFuZGAgb3IgYGV4ZWN1dGVgJyk7XG4gIH1cblxuICAvLyByZXR1cm4gYSBmdW5jdGlvbiB3aGljaCB3aWxsIGFkZCBhbGwgdGhlIHJvdXRlcyB0byB0aGUgZHJpdmVyLiBIZXJlIGV4dHJhTWV0aG9kcyBtaWdodCBiZVxuICAvLyBwYXNzZWQgaW4gYXMgZGVmaW5lZCBieSBBcHBpdW0gcGx1Z2lucywgc28gd2UgbmVlZCB0byBhZGQgdGhvc2UgdG8gdGhlIGRlZmF1bHQgbGlzdFxuICByZXR1cm4gZnVuY3Rpb24gYWRkUm91dGVzIChhcHAsIHtiYXNlUGF0aCA9IERFRkFVTFRfQkFTRV9QQVRILCBleHRyYU1ldGhvZE1hcCA9IHt9fSkge1xuICAgIC8vIHN0b3JlIGJhc2VQYXRoIG9uIHRoZSBkcml2ZXIgaW5zdGFuY2Ugc28gaXQgY2FuIHVzZSBpdCBpZiBuZWNlc3NhcnlcbiAgICAvLyBmb3IgZXhhbXBsZSBpbiBkZXRlcm1pbmluZyBwcm94eSBhdm9pZGFuY2VcbiAgICBkcml2ZXIuYmFzZVBhdGggPSBiYXNlUGF0aDtcblxuICAgIGNvbnN0IGFsbE1ldGhvZHMgPSB7Li4uTUVUSE9EX01BUCwgLi4uZXh0cmFNZXRob2RNYXB9O1xuXG4gICAgZm9yIChjb25zdCBbcGF0aCwgbWV0aG9kc10gb2YgXy50b1BhaXJzKGFsbE1ldGhvZHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2QsIHNwZWNdIG9mIF8udG9QYWlycyhtZXRob2RzKSkge1xuICAgICAgICAvLyBzZXQgdXAgdGhlIGV4cHJlc3Mgcm91dGUgaGFuZGxlclxuICAgICAgICBidWlsZEhhbmRsZXIoYXBwLCBtZXRob2QsIGAke2Jhc2VQYXRofSR7cGF0aH1gLCBzcGVjLCBkcml2ZXIsIGlzU2Vzc2lvbkNvbW1hbmQoc3BlYy5jb21tYW5kKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEhhbmRsZXIgKGFwcCwgbWV0aG9kLCBwYXRoLCBzcGVjLCBkcml2ZXIsIGlzU2Vzc0NtZCkge1xuICBsZXQgYXN5bmNIYW5kbGVyID0gYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgbGV0IGpzb25PYmogPSByZXEuYm9keTtcbiAgICBsZXQgaHR0cFJlc0JvZHkgPSB7fTtcbiAgICBsZXQgaHR0cFN0YXR1cyA9IDIwMDtcbiAgICBsZXQgbmV3U2Vzc2lvbklkO1xuICAgIGxldCBjdXJyZW50UHJvdG9jb2wgPSBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gaWYgdGhpcyBpcyBhIHNlc3Npb24gY29tbWFuZCBidXQgd2UgZG9uJ3QgaGF2ZSBhIHNlc3Npb24sXG4gICAgICAvLyBlcnJvciBvdXQgZWFybHkgKGVzcGVjaWFsbHkgYmVmb3JlIHByb3h5aW5nKVxuICAgICAgaWYgKGlzU2Vzc0NtZCAmJiAhZHJpdmVyLnNlc3Npb25FeGlzdHMocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgcHJveHlpbmcgY29tbWFuZHMgdG8gYW5vdGhlciBKU09OV1BcbiAgICAgIC8vIHNlcnZlciwgYnlwYXNzIGFsbCBvdXIgY2hlY2tzIGFuZCBhc3N1bWUgdGhlIHVwc3RyZWFtIHNlcnZlciBrbm93c1xuICAgICAgLy8gd2hhdCBpdCdzIGRvaW5nLiBCdXQga2VlcCB0aGlzIGluIHRoZSB0cnkvY2F0Y2ggYmxvY2sgc28gaWYgcHJveHlpbmdcbiAgICAgIC8vIGl0c2VsZiBmYWlscywgd2UgZ2l2ZSBhIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC4gT2YgY291cnNlIHdlIG9ubHlcbiAgICAgIC8vIHdhbnQgdG8gZG8gdGhlc2Ugd2hlbiB3ZSBoYXZlIGEgc2Vzc2lvbiBjb21tYW5kOyB0aGUgQXBwaXVtIGRyaXZlclxuICAgICAgLy8gbXVzdCBiZSByZXNwb25zaWJsZSBmb3Igc3RhcnQvc3RvcCBzZXNzaW9uLCBldGMuLi5cbiAgICAgIGlmIChpc1Nlc3NDbWQgJiYgZHJpdmVyU2hvdWxkRG9Kd3BQcm94eShkcml2ZXIsIHJlcSwgc3BlYy5jb21tYW5kKSkge1xuICAgICAgICBhd2FpdCBkb0p3cFByb3h5KGRyaXZlciwgcmVxLCByZXMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIGEgY29tbWFuZCBpcyBub3QgaW4gb3VyIG1ldGhvZCBtYXAsIGl0J3MgYmVjYXVzZSB3ZVxuICAgICAgLy8gaGF2ZSBubyBwbGFucyB0byBldmVyIGltcGxlbWVudCBpdFxuICAgICAgaWYgKCFzcGVjLmNvbW1hbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIHdyYXAgcGFyYW1zIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHNwZWMucGF5bG9hZFBhcmFtcyAmJiBzcGVjLnBheWxvYWRQYXJhbXMud3JhcCkge1xuICAgICAgICBqc29uT2JqID0gd3JhcFBhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmopO1xuICAgICAgfVxuXG4gICAgICAvLyB1bndyYXAgcGFyYW1zIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHNwZWMucGF5bG9hZFBhcmFtcyAmJiBzcGVjLnBheWxvYWRQYXJhbXMudW53cmFwKSB7XG4gICAgICAgIGpzb25PYmogPSB1bndyYXBQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICAvLyB0cnkgdG8gZGV0ZXJtaW5lIHByb3RvY29sIGJ5IHNlc3Npb24gY3JlYXRpb24gYXJncywgc28gd2UgY2FuIHRocm93IGFcbiAgICAgICAgLy8gcHJvcGVybHkgZm9ybWF0dGVkIGVycm9yIGlmIGFyZ3VtZW50cyB2YWxpZGF0aW9uIGZhaWxzXG4gICAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGRldGVybWluZVByb3RvY29sKC4uLm1ha2VBcmdzKHJlcS5wYXJhbXMsIGpzb25PYmosIHNwZWMucGF5bG9hZFBhcmFtcyB8fCB7fSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUganNvbiBwYXlsb2FkIGNvbmZvcm1zIHRvIHRoZSBzcGVjXG4gICAgICBjaGVja1BhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmosIGN1cnJlbnRQcm90b2NvbCk7XG5cbiAgICAgIC8vIHR1cm4gdGhlIGNvbW1hbmQgYW5kIGpzb24gcGF5bG9hZCBpbnRvIGFuIGFyZ3VtZW50IGxpc3QgZm9yXG4gICAgICAvLyB0aGUgZHJpdmVyIG1ldGhvZHNcbiAgICAgIGxldCBhcmdzID0gbWFrZUFyZ3MocmVxLnBhcmFtcywganNvbk9iaiwgc3BlYy5wYXlsb2FkUGFyYW1zIHx8IHt9LCBjdXJyZW50UHJvdG9jb2wpO1xuICAgICAgbGV0IGRyaXZlclJlcztcbiAgICAgIC8vIHZhbGlkYXRlIGNvbW1hbmQgYXJncyBhY2NvcmRpbmcgdG8gTUpTT05XUFxuICAgICAgaWYgKHZhbGlkYXRvcnNbc3BlYy5jb21tYW5kXSkge1xuICAgICAgICB2YWxpZGF0b3JzW3NwZWMuY29tbWFuZF0oLi4uYXJncyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHJ1biB0aGUgZHJpdmVyIGNvbW1hbmQgd3JhcHBlZCBpbnNpZGUgdGhlIGFyZ3VtZW50IHZhbGlkYXRvcnNcbiAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKS5kZWJ1ZyhgQ2FsbGluZyBgICtcbiAgICAgICAgYCR7ZHJpdmVyLmNvbnN0cnVjdG9yLm5hbWV9LiR7c3BlYy5jb21tYW5kfSgpIHdpdGggYXJnczogYCArXG4gICAgICAgIF8udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoYXJncyksIHtsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEh9KSk7XG5cbiAgICAgIGlmIChkcml2ZXIuZXhlY3V0ZUNvbW1hbmQpIHtcbiAgICAgICAgZHJpdmVyUmVzID0gYXdhaXQgZHJpdmVyLmV4ZWN1dGVDb21tYW5kKHNwZWMuY29tbWFuZCwgLi4uYXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkcml2ZXJSZXMgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZShzcGVjLmNvbW1hbmQsIC4uLmFyZ3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIHByb3RvY29sIGFmdGVyIGV4ZWN1dGVDb21tYW5kXG4gICAgICBjdXJyZW50UHJvdG9jb2wgPSBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkgfHwgY3VycmVudFByb3RvY29sO1xuXG4gICAgICAvLyBJZiBgZXhlY3V0ZUNvbW1hbmRgIHdhcyBvdmVycmlkZGVuIGFuZCB0aGUgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0XG4gICAgICAvLyB3aXRoIGEgcHJvdG9jb2wgYW5kIHZhbHVlL2Vycm9yIHByb3BlcnR5LCByZS1hc3NpZ24gdGhlIHByb3RvY29sXG4gICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGRyaXZlclJlcykgJiYgXy5oYXMoZHJpdmVyUmVzLCAncHJvdG9jb2wnKSkge1xuICAgICAgICBjdXJyZW50UHJvdG9jb2wgPSBkcml2ZXJSZXMucHJvdG9jb2wgfHwgY3VycmVudFByb3RvY29sO1xuICAgICAgICBpZiAoZHJpdmVyUmVzLmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZHJpdmVyUmVzLmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGRyaXZlclJlcyA9IGRyaXZlclJlcy52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdW5wYWNrIGNyZWF0ZVNlc3Npb24gcmVzcG9uc2VcbiAgICAgIGlmIChzcGVjLmNvbW1hbmQgPT09IENSRUFURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgICAgbmV3U2Vzc2lvbklkID0gZHJpdmVyUmVzWzBdO1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5wdXRTZXNzaW9uKG5ld1Nlc3Npb25JZCwgY3VycmVudFByb3RvY29sKTtcbiAgICAgICAgU0VTU0lPTlNfQ0FDSEUuZ2V0TG9nZ2VyKG5ld1Nlc3Npb25JZCwgY3VycmVudFByb3RvY29sKVxuICAgICAgICAgIC5kZWJ1ZyhgQ2FjaGVkIHRoZSBwcm90b2NvbCB2YWx1ZSAnJHtjdXJyZW50UHJvdG9jb2x9JyBmb3IgdGhlIG5ldyBzZXNzaW9uICR7bmV3U2Vzc2lvbklkfWApO1xuICAgICAgICBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuTUpTT05XUCkge1xuICAgICAgICAgIGRyaXZlclJlcyA9IGRyaXZlclJlc1sxXTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgICBkcml2ZXJSZXMgPSB7XG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IGRyaXZlclJlc1sxXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRyaXZlclJlcyA9IGZvcm1hdFJlc3BvbnNlVmFsdWUoZHJpdmVyUmVzKTtcblxuICAgICAgLy8gZGVsZXRlIHNob3VsZCBub3QgcmV0dXJuIGFueXRoaW5nIGV2ZW4gaWYgc3VjY2Vzc2Z1bFxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbClcbiAgICAgICAgICAuZGVidWcoYFJlY2VpdmVkIHJlc3BvbnNlOiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoZHJpdmVyUmVzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pfWApO1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbCkuZGVidWcoJ0J1dCBkZWxldGluZyBzZXNzaW9uLCBzbyBub3QgcmV0dXJuaW5nJyk7XG4gICAgICAgIGRyaXZlclJlcyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBzdGF0dXMgaXMgbm90IDAsICB0aHJvdyB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgZm9yIHN0YXR1cyBjb2RlLlxuICAgICAgaWYgKHV0aWwuaGFzVmFsdWUoZHJpdmVyUmVzKSkge1xuICAgICAgICBpZiAodXRpbC5oYXNWYWx1ZShkcml2ZXJSZXMuc3RhdHVzKSAmJiAhaXNOYU4oZHJpdmVyUmVzLnN0YXR1cykgJiYgcGFyc2VJbnQoZHJpdmVyUmVzLnN0YXR1cywgMTApICE9PSAwKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUoZHJpdmVyUmVzLnN0YXR1cywgZHJpdmVyUmVzLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3QoZHJpdmVyUmVzLnZhbHVlKSAmJiBkcml2ZXJSZXMudmFsdWUuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvckZyb21XM0NKc29uQ29kZShkcml2ZXJSZXMudmFsdWUuZXJyb3IsIGRyaXZlclJlcy52YWx1ZS5tZXNzYWdlLCBkcml2ZXJSZXMudmFsdWUuc3RhY2t0cmFjZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaHR0cFJlc0JvZHkudmFsdWUgPSBkcml2ZXJSZXM7XG4gICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpLmRlYnVnKGBSZXNwb25kaW5nIGAgK1xuICAgICAgICBgdG8gY2xpZW50IHdpdGggZHJpdmVyLiR7c3BlYy5jb21tYW5kfSgpIHJlc3VsdDogJHtfLnRydW5jYXRlKEpTT04uc3RyaW5naWZ5KGRyaXZlclJlcyksIHtsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEh9KX1gKTtcblxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGtlZXAgdGhlIGxvZ2dlciBpbnN0YW5jZSBpbiB0aGUgY2FjaGVcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIHNlc3Npb24gaXMgZGVsZXRlZCwgYmVjYXVzZSBpdCBjb250YWlucyB0aGUgbG9nZ2luZyBoaXN0b3J5XG4gICAgICAgIC8vIGFuZCBjb25zdW1lcyB0aGUgbWVtb3J5XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLnJlc2V0TG9nZ2VyKHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIGZpZ3VyZSBvdXQgd2hhdCBvdXIgcmVzcG9uc2Ugc2hvdWxkIGJlXG4gICAgICAvLyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBlcnJvciB0aGF0IHdlIGVuY291bnRlcmVkXG4gICAgICBsZXQgYWN0dWFsRXJyID0gZXJyO1xuXG4gICAgICBjdXJyZW50UHJvdG9jb2wgPSBjdXJyZW50UHJvdG9jb2wgfHwgZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkKTtcblxuICAgICAgbGV0IGVyck1zZyA9IGVyci5zdGFja3RyYWNlIHx8IGVyci5zdGFjaztcbiAgICAgIGlmICghXy5pbmNsdWRlcyhlcnJNc2csIGVyci5tZXNzYWdlKSkge1xuICAgICAgICAvLyBpZiB0aGUgbWVzc2FnZSBoYXMgbW9yZSBpbmZvcm1hdGlvbiwgYWRkIGl0LiBidXQgb2Z0ZW4gdGhlIG1lc3NhZ2VcbiAgICAgICAgLy8gaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHN0YWNrIHRyYWNlXG4gICAgICAgIGVyck1zZyA9IGAke2Vyci5tZXNzYWdlfSR7ZXJyTXNnID8gKCdcXG4nICsgZXJyTXNnKSA6ICcnfWA7XG4gICAgICB9XG4gICAgICBpZiAoaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IpKSB7XG4gICAgICAgIGFjdHVhbEVyciA9IGVyci5nZXRBY3R1YWxFcnJvcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgU0VTU0lPTlNfQ0FDSEUuZ2V0TG9nZ2VyKHJlcS5wYXJhbXMuc2Vzc2lvbklkIHx8IG5ld1Nlc3Npb25JZCwgY3VycmVudFByb3RvY29sKVxuICAgICAgICAgIC5kZWJ1ZyhgRW5jb3VudGVyZWQgaW50ZXJuYWwgZXJyb3IgcnVubmluZyBjb21tYW5kOiAke2Vyck1zZ31gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICBbaHR0cFN0YXR1cywgaHR0cFJlc0JvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihhY3R1YWxFcnIpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5NSlNPTldQKSB7XG4gICAgICAgIFtodHRwU3RhdHVzLCBodHRwUmVzQm9keV0gPSBnZXRSZXNwb25zZUZvckpzb253cEVycm9yKGFjdHVhbEVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiBpdCdzIHVua25vd24gd2hhdCB0aGUgcHJvdG9jb2wgaXMgKGxpa2UgaWYgaXQncyBgZ2V0U3RhdHVzYCBwcmlvciB0byBgY3JlYXRlU2Vzc2lvbmApLCBtZXJnZSB0aGUgcmVzcG9uc2VzXG4gICAgICAgIC8vIHRvZ2V0aGVyIHRvIGJlIHByb3RvY29sLWFnbm9zdGljXG4gICAgICAgIGxldCBqc29ud3BSZXMgPSBnZXRSZXNwb25zZUZvckpzb253cEVycm9yKGFjdHVhbEVycik7XG4gICAgICAgIGxldCB3M2NSZXMgPSBnZXRSZXNwb25zZUZvclczQ0Vycm9yKGFjdHVhbEVycik7XG5cbiAgICAgICAgaHR0cFJlc0JvZHkgPSB7XG4gICAgICAgICAgLi4uanNvbndwUmVzWzFdLFxuICAgICAgICAgIC4uLnczY1Jlc1sxXSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBVc2UgdGhlIEpTT05XUCBzdGF0dXMgY29kZSAod2hpY2ggaXMgdXN1YWxseSA1MDApXG4gICAgICAgIGh0dHBTdGF0dXMgPSBqc29ud3BSZXNbMF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGVjb2RlIHRoZSByZXNwb25zZSwgd2hpY2ggaXMgZWl0aGVyIGEgc3RyaW5nIG9yIGpzb25cbiAgICBpZiAoXy5pc1N0cmluZyhodHRwUmVzQm9keSkpIHtcbiAgICAgIHJlcy5zdGF0dXMoaHR0cFN0YXR1cykuc2VuZChodHRwUmVzQm9keSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuZXdTZXNzaW9uSWQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICAgIGh0dHBSZXNCb2R5LnZhbHVlLnNlc3Npb25JZCA9IG5ld1Nlc3Npb25JZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBodHRwUmVzQm9keS5zZXNzaW9uSWQgPSBuZXdTZXNzaW9uSWQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0dHBSZXNCb2R5LnNlc3Npb25JZCA9IHJlcS5wYXJhbXMuc2Vzc2lvbklkIHx8IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCBpbmNsdWRlIHNlc3Npb25JZCBpbiBXM0MgcmVzcG9uc2VzXG4gICAgICBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDKSB7XG4gICAgICAgIGRlbGV0ZSBodHRwUmVzQm9keS5zZXNzaW9uSWQ7XG4gICAgICB9XG5cbiAgICAgIGh0dHBSZXNCb2R5ID0gZm9ybWF0U3RhdHVzKGh0dHBSZXNCb2R5LCBodHRwU3RhdHVzLCBjdXJyZW50UHJvdG9jb2wpO1xuICAgICAgcmVzLnN0YXR1cyhodHRwU3RhdHVzKS5qc29uKGh0dHBSZXNCb2R5KTtcbiAgICB9XG4gIH07XG4gIC8vIGFkZCB0aGUgbWV0aG9kIHRvIHRoZSBhcHBcbiAgYXBwW21ldGhvZC50b0xvd2VyQ2FzZSgpXShwYXRoLCAocmVxLCByZXMpID0+IHtcbiAgICBCLnJlc29sdmUoYXN5bmNIYW5kbGVyKHJlcSwgcmVzKSkuZG9uZSgpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSAoZHJpdmVyLCByZXEsIGNvbW1hbmQpIHtcbiAgLy8gZHJpdmVycyBuZWVkIHRvIGV4cGxpY2l0bHkgc2F5IHdoZW4gdGhlIHByb3h5IGlzIGFjdGl2ZVxuICBpZiAoIWRyaXZlci5wcm94eUFjdGl2ZShyZXEucGFyYW1zLnNlc3Npb25JZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB3ZSBzaG91bGQgbmV2ZXIgcHJveHkgZGVsZXRlU2Vzc2lvbiBiZWNhdXNlIHdlIG5lZWQgdG8gZ2l2ZSB0aGUgY29udGFpbmluZ1xuICAvLyBkcml2ZXIgYW4gb3Bwb3J0dW5pdHkgdG8gY2xlYW4gaXRzZWxmIHVwXG4gIGlmIChjb21tYW5kID09PSAnZGVsZXRlU2Vzc2lvbicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBhdm9pZGFuY2Ugc2NoZW1hLCBhbmQgc2F5IHdlIHNob3VsZG4ndCBwcm94eSBpZiBhbnl0aGluZyBpbiB0aGVcbiAgLy8gYXZvaWQgbGlzdCBtYXRjaGVzIG91ciByZXFcbiAgaWYgKGRyaXZlci5wcm94eVJvdXRlSXNBdm9pZGVkKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCByZXEubWV0aG9kLCByZXEub3JpZ2luYWxVcmwsIHJlcS5ib2R5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgcmVzKSB7XG4gIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpKVxuICAgIC5pbmZvKCdEcml2ZXIgcHJveHkgYWN0aXZlLCBwYXNzaW5nIHJlcXVlc3Qgb24gdmlhIEhUVFAgcHJveHknKTtcblxuICAvLyBjaGVjayB0aGF0IHRoZSBpbm5lciBkcml2ZXIgaGFzIGEgcHJveHkgZnVuY3Rpb25cbiAgaWYgKCFkcml2ZXIuY2FuUHJveHkocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUcnlpbmcgdG8gcHJveHkgdG8gYSBKU09OV1Agc2VydmVyIGJ1dCBkcml2ZXIgaXMgdW5hYmxlIHRvIHByb3h5Jyk7XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm94aWVkUmVzID0gYXdhaXQgZHJpdmVyLmV4ZWN1dGVDb21tYW5kKCdwcm94eVJlcVJlcycsIHJlcSwgcmVzLCByZXEucGFyYW1zLnNlc3Npb25JZCk7XG4gICAgaWYgKHByb3hpZWRSZXMgJiYgcHJveGllZFJlcy5lcnJvcikgdGhyb3cgcHJveGllZFJlcy5lcnJvcjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IpKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHByb3h5LiBQcm94eSBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbn1cblxuXG5leHBvcnQge1xuICBQcm90b2NvbCwgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLCBpc1Nlc3Npb25Db21tYW5kLFxuICBkcml2ZXJTaG91bGREb0p3cFByb3h5LCBkZXRlcm1pbmVQcm90b2NvbFxufTtcbiJdLCJmaWxlIjoibGliL3Byb3RvY29sL3Byb3RvY29sLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
|
|
390
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIlByb3RvY29sIiwiZGV0ZXJtaW5lUHJvdG9jb2wiLCJkZXNpcmVkQ2FwYWJpbGl0aWVzIiwicmVxdWlyZWRDYXBhYmlsaXRpZXMiLCJjYXBhYmlsaXRpZXMiLCJfIiwiaXNQbGFpbk9iamVjdCIsIlBST1RPQ09MUyIsIlczQyIsIk1KU09OV1AiLCJleHRyYWN0UHJvdG9jb2wiLCJkcml2ZXIiLCJzZXNzaW9uSWQiLCJkc3REcml2ZXIiLCJpc0Z1bmN0aW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsInByb3RvY29sIiwiU0VTU0lPTlNfQ0FDSEUiLCJnZXRQcm90b2NvbCIsImlzU2Vzc2lvbkNvbW1hbmQiLCJjb21tYW5kIiwiaW5jbHVkZXMiLCJOT19TRVNTSU9OX0lEX0NPTU1BTkRTIiwid3JhcFBhcmFtcyIsInBhcmFtU2V0cyIsImpzb25PYmoiLCJyZXMiLCJpc0FycmF5IiwiaXNPYmplY3QiLCJ3cmFwIiwidW53cmFwUGFyYW1zIiwidW53cmFwIiwiY2hlY2tQYXJhbXMiLCJyZXF1aXJlZFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwicmVjZWl2ZWRQYXJhbXMiLCJrZXlzIiwicmVxdWlyZWQiLCJmaXJzdCIsIm9wdGlvbmFsIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiZXJyb3JzIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJwYXJhbXMiLCJkaWZmZXJlbmNlIiwibWFrZUFyZ3MiLCJyZXF1ZXN0UGFyYW1zIiwicGF5bG9hZFBhcmFtcyIsInVybFBhcmFtcyIsInJldmVyc2UiLCJ3aXRob3V0IiwiYXJncyIsImZsYXR0ZW4iLCJtYXAiLCJwIiwiY29uY2F0IiwidSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlc3Npb25FeGlzdHMiLCJFcnJvciIsImV4ZWN1dGVDb21tYW5kIiwiZXhlY3V0ZSIsImFkZFJvdXRlcyIsImFwcCIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsImFsbE1ldGhvZHMiLCJNRVRIT0RfTUFQIiwicGF0aCIsIm1ldGhvZHMiLCJ0b1BhaXJzIiwibWV0aG9kIiwic3BlYyIsImJ1aWxkSGFuZGxlciIsImlzU2Vzc0NtZCIsImFzeW5jSGFuZGxlciIsInJlcSIsImJvZHkiLCJodHRwUmVzQm9keSIsImh0dHBTdGF0dXMiLCJuZXdTZXNzaW9uSWQiLCJjdXJyZW50UHJvdG9jb2wiLCJOb1N1Y2hEcml2ZXJFcnJvciIsIm5ldmVyUHJveHkiLCJkcml2ZXJTaG91bGREb0p3cFByb3h5IiwiZG9Kd3BQcm94eSIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJkcml2ZXJSZXMiLCJ2YWxpZGF0b3JzIiwiZ2V0TG9nZ2VyIiwiZGVidWciLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJ0cnVuY2F0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJNQVhfTE9HX0JPRFlfTEVOR1RIIiwiaGFzIiwiZXJyb3IiLCJ2YWx1ZSIsInB1dFNlc3Npb24iLCJ1dGlsIiwiaGFzVmFsdWUiLCJzdGF0dXMiLCJpc05hTiIsInBhcnNlSW50Iiwic3RhY2t0cmFjZSIsInJlc2V0TG9nZ2VyIiwiZXJyIiwiYWN0dWFsRXJyIiwiZXJyTXNnIiwic3RhY2siLCJQcm94eVJlcXVlc3RFcnJvciIsImdldEFjdHVhbEVycm9yIiwianNvbndwUmVzIiwidzNjUmVzIiwiaXNTdHJpbmciLCJzZW5kIiwianNvbiIsInRvTG93ZXJDYXNlIiwiQiIsInJlc29sdmUiLCJkb25lIiwicHJveHlBY3RpdmUiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwib3JpZ2luYWxVcmwiLCJpbmZvIiwiY2FuUHJveHkiLCJwcm94aWVkUmVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7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R0FBTjtBQUNELEtBRkQsTUFFTztBQUNMLFlBQU0sSUFBSWxELEtBQUosQ0FBVyxpQ0FBZ0NrRCxHQUFHLENBQUN4RSxPQUFRLEVBQXZELENBQU47QUFDRDtBQUNGO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyB2YWxpZGF0b3JzIH0gZnJvbSAnLi92YWxpZGF0b3JzJztcbmltcG9ydCB7XG4gIGVycm9ycywgaXNFcnJvclR5cGUsIGdldFJlc3BvbnNlRm9yVzNDRXJyb3IsIGdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IsXG4gIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlLCBlcnJvckZyb21XM0NKc29uQ29kZSxcbn0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgTUVUSE9EX01BUCwgTk9fU0VTU0lPTl9JRF9DT01NQU5EUyB9IGZyb20gJy4vcm91dGVzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIGZvcm1hdFJlc3BvbnNlVmFsdWUsIGZvcm1hdFN0YXR1cyxcbn0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IE1BWF9MT0dfQk9EWV9MRU5HVEgsIFBST1RPQ09MUywgREVGQVVMVF9CQVNFX1BBVEggfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IFNFU1NJT05TX0NBQ0hFIGZyb20gJy4vc2Vzc2lvbnMtY2FjaGUnO1xuXG5cbmNvbnN0IENSRUFURV9TRVNTSU9OX0NPTU1BTkQgPSAnY3JlYXRlU2Vzc2lvbic7XG5jb25zdCBERUxFVEVfU0VTU0lPTl9DT01NQU5EID0gJ2RlbGV0ZVNlc3Npb24nO1xuXG5jbGFzcyBQcm90b2NvbCB7fVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVQcm90b2NvbCAoZGVzaXJlZENhcGFiaWxpdGllcywgcmVxdWlyZWRDYXBhYmlsaXRpZXMsIGNhcGFiaWxpdGllcykge1xuICByZXR1cm4gXy5pc1BsYWluT2JqZWN0KGNhcGFiaWxpdGllcykgP1xuICAgIFBST1RPQ09MUy5XM0MgOlxuICAgIFBST1RPQ09MUy5NSlNPTldQO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UHJvdG9jb2wgKGRyaXZlciwgc2Vzc2lvbklkID0gbnVsbCkge1xuICBjb25zdCBkc3REcml2ZXIgPSBfLmlzRnVuY3Rpb24oZHJpdmVyLmRyaXZlckZvclNlc3Npb24pXG4gICAgPyBkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbihzZXNzaW9uSWQpXG4gICAgOiBkcml2ZXI7XG4gIGlmIChkc3REcml2ZXIgPT09IGRyaXZlcikge1xuICAgIC8vIFNob3J0Y2lyY3VpdCBpZiB0aGUgZHJpdmVyIGluc3RhbmNlIGlzIG5vdCBhbiB1bWJyZWxsYSBkcml2ZXJcbiAgICAvLyBvciBpdCBpcyBGYWtlIGRyaXZlciBpbnN0YW5jZSwgd2hlcmUgYGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uYFxuICAgIC8vIGFsd2F5cyByZXR1cm5zIHNlbGYgaW5zdGFuY2VcbiAgICByZXR1cm4gZHJpdmVyLnByb3RvY29sO1xuICB9XG5cbiAgLy8gRXh0cmFjdCB0aGUgcHJvdG9jb2wgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24gaWYgdGhlIGdpdmVuIGRyaXZlciBpcyB0aGUgdW1icmVsbGEgb25lXG4gIHJldHVybiBkc3REcml2ZXIgPyBkc3REcml2ZXIucHJvdG9jb2wgOiBTRVNTSU9OU19DQUNIRS5nZXRQcm90b2NvbChzZXNzaW9uSWQpO1xufVxuXG5mdW5jdGlvbiBpc1Nlc3Npb25Db21tYW5kIChjb21tYW5kKSB7XG4gIHJldHVybiAhXy5pbmNsdWRlcyhOT19TRVNTSU9OX0lEX0NPTU1BTkRTLCBjb21tYW5kKTtcbn1cblxuZnVuY3Rpb24gd3JhcFBhcmFtcyAocGFyYW1TZXRzLCBqc29uT2JqKSB7XG4gIC8qIFRoZXJlIGFyZSBjb21tYW5kcyBsaWtlIHBlcmZvcm1Ub3VjaCB3aGljaCB0YWtlIGEgc2luZ2xlIHBhcmFtZXRlciAocHJpbWl0aXZlIHR5cGUgb3IgYXJyYXkpLlxuICAgKiBTb21lIGRyaXZlcnMgY2hvb3NlIHRvIHBhc3MgdGhpcyBwYXJhbWV0ZXIgYXMgYSB2YWx1ZSAoZWcuIFthY3Rpb24xLCBhY3Rpb24yLi4uXSkgd2hpbGUgb3RoZXJzIHRvXG4gICAqIHdyYXAgaXQgd2l0aGluIGFuIG9iamVjdChlZycge2dlc3R1cmU6ICBbYWN0aW9uMSwgYWN0aW9uMi4uLl19KSwgd2hpY2ggbWFrZXMgaXQgaGFyZCB0byB2YWxpZGF0ZS5cbiAgICogVGhlIHdyYXAgb3B0aW9uIGluIHRoZSBzcGVjIGVuZm9yY2Ugd3JhcHBpbmcgYmVmb3JlIHZhbGlkYXRpb24sIHNvIHRoYXQgYWxsIHBhcmFtcyBhcmUgd3JhcHBlZCBhdFxuICAgKiB0aGUgdGltZSB0aGV5IGFyZSB2YWxpZGF0ZWQgYW5kIGxhdGVyIHBhc3NlZCB0byB0aGUgY29tbWFuZHMuXG4gICAqL1xuICBsZXQgcmVzID0ganNvbk9iajtcbiAgaWYgKF8uaXNBcnJheShqc29uT2JqKSB8fCAhXy5pc09iamVjdChqc29uT2JqKSkge1xuICAgIHJlcyA9IHt9O1xuICAgIHJlc1twYXJhbVNldHMud3JhcF0gPSBqc29uT2JqO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIHVud3JhcFBhcmFtcyAocGFyYW1TZXRzLCBqc29uT2JqKSB7XG4gIC8qIFRoZXJlIGFyZSBjb21tYW5kcyBsaWtlIHNldE5ldHdvcmtDb25uZWN0aW9uIHdoaWNoIHNlbmQgcGFyYW1ldGVycyB3cmFwcGVkIGluc2lkZSBhIGtleSBzdWNoIGFzXG4gICAqIFwicGFyYW1ldGVyc1wiLiBUaGlzIGZ1bmN0aW9uIHVud3JhcHMgdGhlbSAoZWcuIHtcInBhcmFtZXRlcnNcIjoge1widHlwZVwiOiAxfX0gYmVjb21lcyB7XCJ0eXBlXCI6IDF9KS5cbiAgICovXG4gIGxldCByZXMgPSBqc29uT2JqO1xuICBpZiAoXy5pc09iamVjdChqc29uT2JqKSkge1xuICAgIC8vIHNvbWUgY2xpZW50cywgbGlrZSBydWJ5LCBkb24ndCB3cmFwXG4gICAgaWYgKGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF0pIHtcbiAgICAgIHJlcyA9IGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGNoZWNrUGFyYW1zIChwYXJhbVNldHMsIGpzb25PYmosIHByb3RvY29sKSB7XG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IFtdO1xuICBsZXQgb3B0aW9uYWxQYXJhbXMgPSBbXTtcbiAgbGV0IHJlY2VpdmVkUGFyYW1zID0gXy5rZXlzKGpzb25PYmopO1xuXG4gIGlmIChwYXJhbVNldHMpIHtcbiAgICBpZiAocGFyYW1TZXRzLnJlcXVpcmVkKSB7XG4gICAgICAvLyB3ZSBtaWdodCBoYXZlIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMsXG4gICAgICAvLyBvciBhbiBhcnJheSBvZiBhcnJheXMgb2YgcGFyYW1ldGVycywgc28gc3RhbmRhcmRpemVcbiAgICAgIGlmICghXy5pc0FycmF5KF8uZmlyc3QocGFyYW1TZXRzLnJlcXVpcmVkKSkpIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBbcGFyYW1TZXRzLnJlcXVpcmVkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1TZXRzLnJlcXVpcmVkO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBqdXN0IGFuIGFycmF5XG4gICAgaWYgKHBhcmFtU2V0cy5vcHRpb25hbCkge1xuICAgICAgb3B0aW9uYWxQYXJhbXMgPSBwYXJhbVNldHMub3B0aW9uYWw7XG4gICAgfVxuXG4gICAgLy8gSWYgYSBmdW5jdGlvbiB3YXMgcHJvdmlkZWQgYXMgdGhlICd2YWxpZGF0ZScga2V5LCBpdCB3aWxsIGhlcmUgYmUgY2FsbGVkIHdpdGhcbiAgICAvLyBqc29uT2JqIGFzIHRoZSBwYXJhbS4gSWYgaXQgcmV0dXJucyBzb21ldGhpbmcgZmFsc3ksIHZlcmlmaWNhdGlvbiB3aWxsIGJlXG4gICAgLy8gY29uc2lkZXJlZCB0byBoYXZlIHBhc3NlZC4gSWYgaXQgcmV0dXJucyBzb21ldGhpbmcgZWxzZSwgdGhhdCB3aWxsIGJlIHRoZVxuICAgIC8vIGFyZ3VtZW50IHRvIGFuIGVycm9yIHdoaWNoIGlzIHRocm93biB0byB0aGUgdXNlclxuICAgIGlmIChwYXJhbVNldHMudmFsaWRhdGUpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gcGFyYW1TZXRzLnZhbGlkYXRlKGpzb25PYmosIHByb3RvY29sKTtcbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKG1lc3NhZ2UsIGpzb25PYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHdlIGhhdmUgbm8gcmVxdWlyZWQgcGFyYW1ldGVycywgYWxsIGlzIHdlbGxcbiAgaWYgKHJlcXVpcmVkUGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHNvbWUgY2xpZW50cyBwYXNzIGluIHRoZSBzZXNzaW9uIGlkIGluIHRoZSBwYXJhbXNcbiAgaWYgKG9wdGlvbmFsUGFyYW1zLmluZGV4T2YoJ3Nlc3Npb25JZCcpID09PSAtMSkge1xuICAgIG9wdGlvbmFsUGFyYW1zLnB1c2goJ3Nlc3Npb25JZCcpO1xuICB9XG5cbiAgLy8gc29tZSBjbGllbnRzIHBhc3MgaW4gYW4gZWxlbWVudCBpZCBpbiB0aGUgcGFyYW1zXG4gIGlmIChvcHRpb25hbFBhcmFtcy5pbmRleE9mKCdpZCcpID09PSAtMSkge1xuICAgIG9wdGlvbmFsUGFyYW1zLnB1c2goJ2lkJyk7XG4gIH1cblxuICAvLyBnbyB0aHJvdWdoIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzIGFuZCBjaGVjayBhZ2FpbnN0IG91ciBhcmd1bWVudHNcbiAgZm9yIChsZXQgcGFyYW1zIG9mIHJlcXVpcmVkUGFyYW1zKSB7XG4gICAgaWYgKF8uZGlmZmVyZW5jZShyZWNlaXZlZFBhcmFtcywgcGFyYW1zLCBvcHRpb25hbFBhcmFtcykubGVuZ3RoID09PSAwICYmXG4gICAgICAgIF8uZGlmZmVyZW5jZShwYXJhbXMsIHJlY2VpdmVkUGFyYW1zKS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIHdlIGhhdmUgYSBzZXQgb2YgcGFyYW1ldGVycyB0aGF0IGlzIGNvcnJlY3RcbiAgICAgIC8vIHNvIHNob3J0LWNpcmN1aXRcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IGVycm9ycy5CYWRQYXJhbWV0ZXJzRXJyb3IocGFyYW1TZXRzLCByZWNlaXZlZFBhcmFtcyk7XG59XG5cbi8qXG4gKiBUaGlzIG1ldGhvZCB0YWtlcyAzIHBpZWNlcyBvZiBkYXRhOiByZXF1ZXN0IHBhcmFtZXRlcnMgKCdyZXF1ZXN0UGFyYW1zJyksXG4gKiBhIHJlcXVlc3QgSlNPTiBib2R5ICgnanNvbk9iaicpLCBhbmQgJ3BheWxvYWRQYXJhbXMnLCB3aGljaCBpcyB0aGUgc2VjdGlvblxuICogZnJvbSB0aGUgcm91dGUgZGVmaW5pdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGVuZHBvaW50IHdoaWNoIGhhcyBpbnN0cnVjdGlvbnNcbiAqIG9uIGhhbmRsaW5nIHBhcmFtZXRlcnMuIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgb2YgYXJndW1lbnRzIHdoaWNoIHdpbGxcbiAqIGJlIGFwcGxpZWQgdG8gYSBjb21tYW5kLlxuICovXG5mdW5jdGlvbiBtYWtlQXJncyAocmVxdWVzdFBhcmFtcywganNvbk9iaiwgcGF5bG9hZFBhcmFtcywgcHJvdG9jb2wpIHtcbiAgLy8gV2Ugd2FudCB0byBwYXNzIHRoZSBcInVybFwiIHBhcmFtZXRlcnMgdG8gdGhlIGNvbW1hbmRzIGluIHJldmVyc2Ugb3JkZXJcbiAgLy8gc2luY2UgdGhlIGNvbW1hbmQgd2lsbCBzb21ldGltZXMgd2FudCB0byBpZ25vcmUsIHNheSwgdGhlIHNlc3Npb25JZC5cbiAgLy8gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBwdXR0aW5nIHNlc3Npb25JZCBsYXN0LCB3aGljaCBtZWFucyBpbiBKUyB3ZSBjYW5cbiAgLy8gb21pdCBpdCBmcm9tIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgaWYgd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdC5cbiAgbGV0IHVybFBhcmFtcyA9IF8ua2V5cyhyZXF1ZXN0UGFyYW1zKS5yZXZlcnNlKCk7XG5cbiAgLy8gSW4gdGhlIHNpbXBsZSBjYXNlLCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgYSBiYXNpYyBhcnJheSBpblxuICAvLyBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkLCBzbyBzdGFydCB0aGVyZS4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXJlIGFyZVxuICAvLyBtdWx0aXBsZSBvcHRpb25hbCBzZXRzIG9mIHJlcXVpcmVkIHBhcmFtcywgdGhvdWdoLCBzbyBoYW5kbGUgdGhhdCBjYXNlXG4gIC8vIHRvby5cbiAgbGV0IHJlcXVpcmVkUGFyYW1zID0gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZDtcbiAgaWYgKF8uaXNBcnJheShfLmZpcnN0KHBheWxvYWRQYXJhbXMucmVxdWlyZWQpKSkge1xuICAgIC8vIElmIHRoZXJlIGFyZSBvcHRpb25hbCBzZXRzIG9mIHJlcXVpcmVkIHBhcmFtcywgdGhlbiB3ZSB3aWxsIGhhdmUgYW5cbiAgICAvLyBhcnJheSBvZiBhcnJheXMgaW4gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gbG9vcCB0aHJvdWdoIGVhY2ggc2V0IGFuZFxuICAgIC8vIHBpY2sgdGhlIG9uZSB0aGF0IG1hdGNoZXMgd2hpY2ggSlNPTiBwYXJhbXMgd2VyZSBhY3R1YWxseSBzZW50LiBXZSd2ZVxuICAgIC8vIGFscmVhZHkgYmVlbiB0aHJvdWdoIHZhbGlkYXRpb24gc28gd2UncmUgZ3VhcmFudGVlZCB0byBmaW5kIGEgbWF0Y2guXG4gICAgbGV0IGtleXMgPSBfLmtleXMoanNvbk9iaik7XG4gICAgZm9yIChsZXQgcGFyYW1zIG9mIHBheWxvYWRQYXJhbXMucmVxdWlyZWQpIHtcbiAgICAgIGlmIChfLndpdGhvdXQocGFyYW1zLCAuLi5rZXlzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB3ZSBjb25zdHJ1Y3Qgb3VyIGxpc3Qgb2YgYXJndW1lbnRzIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kXG4gIGxldCBhcmdzO1xuICBpZiAoXy5pc0Z1bmN0aW9uKHBheWxvYWRQYXJhbXMubWFrZUFyZ3MpKSB7XG4gICAgLy8gSW4gdGhlIHJvdXRlIHNwZWMsIGEgcGFydGljdWxhciByb3V0ZSBtaWdodCBkZWZpbmUgYSAnbWFrZUFyZ3MnIGZ1bmN0aW9uXG4gICAgLy8gaWYgaXQgd2FudHMgZnVsbCBjb250cm9sIG92ZXIgaG93IHRvIHR1cm4gSlNPTiBwYXJhbWV0ZXJzIGludG8gY29tbWFuZFxuICAgIC8vIGFyZ3VtZW50cy4gU28gd2UgcGFzcyBpdCB0aGUgSlNPTiBwYXJhbWV0ZXJzIGFuZCBpdCByZXR1cm5zIGFuIGFycmF5XG4gICAgLy8gd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBoYW5kbGluZyBjb21tYW5kLiBGb3IgZXhhbXBsZSBpZiBpdCByZXR1cm5zXG4gICAgLy8gWzEsIDIsIDNdLCB3ZSB3aWxsIGNhbGwgYGNvbW1hbmQoMSwgMiwgMywgLi4uKWAgKHVybCBwYXJhbXMgYXJlIHNlcGFyYXRlXG4gICAgLy8gZnJvbSBKU09OIHBhcmFtcyBhbmQgZ2V0IGNvbmNhdGVuYXRlZCBiZWxvdykuXG4gICAgYXJncyA9IHBheWxvYWRQYXJhbXMubWFrZUFyZ3MoanNvbk9iaiwgcHJvdG9jb2wpO1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZSwgY29sbGVjdCBhbGwgdGhlIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBwYXJhbXMgYW5kIGZsYXR0ZW4gdGhlbVxuICAgIC8vIGludG8gYW4gYXJndW1lbnQgYXJyYXlcbiAgICBhcmdzID0gXy5mbGF0dGVuKHJlcXVpcmVkUGFyYW1zKS5tYXAoKHApID0+IGpzb25PYmpbcF0pO1xuICAgIGlmIChwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKSB7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoXy5mbGF0dGVuKHBheWxvYWRQYXJhbXMub3B0aW9uYWwpLm1hcCgocCkgPT4ganNvbk9ialtwXSkpO1xuICAgIH1cbiAgfVxuICAvLyBGaW5hbGx5LCBnZXQgb3VyIHVybCBwYXJhbXMgKHNlc3Npb24gaWQsIGVsZW1lbnQgaWQsIGV0Yy4uLikgb24gdGhlIGVuZCBvZlxuICAvLyB0aGUgbGlzdFxuICBhcmdzID0gYXJncy5jb25jYXQodXJsUGFyYW1zLm1hcCgodSkgPT4gcmVxdWVzdFBhcmFtc1t1XSkpO1xuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIChkcml2ZXIpIHtcbiAgaWYgKCFkcml2ZXIuc2Vzc2lvbkV4aXN0cykge1xuICAgIHRocm93IG5ldyBFcnJvcignRHJpdmVycyB1c2VkIHdpdGggTUpTT05XUCBtdXN0IGltcGxlbWVudCBgc2Vzc2lvbkV4aXN0c2AnKTtcbiAgfVxuXG4gIGlmICghKGRyaXZlci5leGVjdXRlQ29tbWFuZCB8fCBkcml2ZXIuZXhlY3V0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgdXNlZCB3aXRoIE1KU09OV1AgbXVzdCBpbXBsZW1lbnQgYGV4ZWN1dGVDb21tYW5kYCBvciBgZXhlY3V0ZWAnKTtcbiAgfVxuXG4gIC8vIHJldHVybiBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYWRkIGFsbCB0aGUgcm91dGVzIHRvIHRoZSBkcml2ZXIuIEhlcmUgZXh0cmFNZXRob2RzIG1pZ2h0IGJlXG4gIC8vIHBhc3NlZCBpbiBhcyBkZWZpbmVkIGJ5IEFwcGl1bSBwbHVnaW5zLCBzbyB3ZSBuZWVkIHRvIGFkZCB0aG9zZSB0byB0aGUgZGVmYXVsdCBsaXN0XG4gIHJldHVybiBmdW5jdGlvbiBhZGRSb3V0ZXMgKGFwcCwge2Jhc2VQYXRoID0gREVGQVVMVF9CQVNFX1BBVEgsIGV4dHJhTWV0aG9kTWFwID0ge319KSB7XG4gICAgLy8gc3RvcmUgYmFzZVBhdGggb24gdGhlIGRyaXZlciBpbnN0YW5jZSBzbyBpdCBjYW4gdXNlIGl0IGlmIG5lY2Vzc2FyeVxuICAgIC8vIGZvciBleGFtcGxlIGluIGRldGVybWluaW5nIHByb3h5IGF2b2lkYW5jZVxuICAgIGRyaXZlci5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuXG4gICAgY29uc3QgYWxsTWV0aG9kcyA9IHsuLi5NRVRIT0RfTUFQLCAuLi5leHRyYU1ldGhvZE1hcH07XG5cbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBtZXRob2RzXSBvZiBfLnRvUGFpcnMoYWxsTWV0aG9kcykpIHtcbiAgICAgIGZvciAoY29uc3QgW21ldGhvZCwgc3BlY10gb2YgXy50b1BhaXJzKG1ldGhvZHMpKSB7XG4gICAgICAgIC8vIHNldCB1cCB0aGUgZXhwcmVzcyByb3V0ZSBoYW5kbGVyXG4gICAgICAgIGJ1aWxkSGFuZGxlcihhcHAsIG1ldGhvZCwgYCR7YmFzZVBhdGh9JHtwYXRofWAsIHNwZWMsIGRyaXZlciwgaXNTZXNzaW9uQ29tbWFuZChzcGVjLmNvbW1hbmQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSGFuZGxlciAoYXBwLCBtZXRob2QsIHBhdGgsIHNwZWMsIGRyaXZlciwgaXNTZXNzQ21kKSB7XG4gIGxldCBhc3luY0hhbmRsZXIgPSBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBsZXQganNvbk9iaiA9IHJlcS5ib2R5O1xuICAgIGxldCBodHRwUmVzQm9keSA9IHt9O1xuICAgIGxldCBodHRwU3RhdHVzID0gMjAwO1xuICAgIGxldCBuZXdTZXNzaW9uSWQ7XG4gICAgbGV0IGN1cnJlbnRQcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBpZiB0aGlzIGlzIGEgc2Vzc2lvbiBjb21tYW5kIGJ1dCB3ZSBkb24ndCBoYXZlIGEgc2Vzc2lvbixcbiAgICAgIC8vIGVycm9yIG91dCBlYXJseSAoZXNwZWNpYWxseSBiZWZvcmUgcHJveHlpbmcpXG4gICAgICBpZiAoaXNTZXNzQ21kICYmICFkcml2ZXIuc2Vzc2lvbkV4aXN0cyhyZXEucGFyYW1zLnNlc3Npb25JZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hEcml2ZXJFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgZHJpdmVyIGlzIGN1cnJlbnRseSBwcm94eWluZyBjb21tYW5kcyB0byBhbm90aGVyIEpTT05XUCBzZXJ2ZXIsIGJ5cGFzcyBhbGwgb3VyXG4gICAgICAvLyBjaGVja3MgYW5kIGFzc3VtZSB0aGUgdXBzdHJlYW0gc2VydmVyIGtub3dzIHdoYXQgaXQncyBkb2luZy4gQnV0IGtlZXAgdGhpcyBpbiB0aGVcbiAgICAgIC8vIHRyeS9jYXRjaCBibG9jayBzbyBpZiBwcm94eWluZyBpdHNlbGYgZmFpbHMsIHdlIGdpdmUgYSBtZXNzYWdlIHRvIHRoZSBjbGllbnQuIE9mIGNvdXJzZSB3ZVxuICAgICAgLy8gb25seSB3YW50IHRvIGRvIHRoZXNlIHdoZW4gd2UgaGF2ZSBhIHNlc3Npb24gY29tbWFuZDsgdGhlIEFwcGl1bSBkcml2ZXIgbXVzdCBiZVxuICAgICAgLy8gcmVzcG9uc2libGUgZm9yIHN0YXJ0L3N0b3Agc2Vzc2lvbiwgZXRjLi4uIFdlIGFsc28gYWxsb3cgdGhlIGNvbW1hbmQgc3BlYyB0byBkZWNsYXJlIHRoYXRcbiAgICAgIC8vIHRoaXMgY29tbWFuZCBzaG91bGQgbmV2ZXIgYmUgcHJveGllZCAod2hpY2ggaXMgdXNlZnVsIGZvciBwbHVnaW4gZGV2ZWxvcGVycyB3aG8gYWRkXG4gICAgICAvLyBjb21tYW5kcyBhbmQgZ2VuZXJhbGx5IHdvdWxkIG5vdCB3YW50IHRoYXQgY29tbWFuZCB0byBiZSBwcm94aWVkIGluc3RlYWQgb2YgaGFuZGxlZCBieSB0aGVcbiAgICAgIC8vIHBsdWdpbilcbiAgICAgIGlmIChpc1Nlc3NDbWQgJiYgIXNwZWMubmV2ZXJQcm94eSAmJiBkcml2ZXJTaG91bGREb0p3cFByb3h5KGRyaXZlciwgcmVxLCBzcGVjLmNvbW1hbmQpKSB7XG4gICAgICAgIGF3YWl0IGRvSndwUHJveHkoZHJpdmVyLCByZXEsIHJlcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYSBjb21tYW5kIGlzIG5vdCBpbiBvdXIgbWV0aG9kIG1hcCwgaXQncyBiZWNhdXNlIHdlXG4gICAgICAvLyBoYXZlIG5vIHBsYW5zIHRvIGV2ZXIgaW1wbGVtZW50IGl0XG4gICAgICBpZiAoIXNwZWMuY29tbWFuZCkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgLy8gd3JhcCBwYXJhbXMgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoc3BlYy5wYXlsb2FkUGFyYW1zICYmIHNwZWMucGF5bG9hZFBhcmFtcy53cmFwKSB7XG4gICAgICAgIGpzb25PYmogPSB3cmFwUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaik7XG4gICAgICB9XG5cbiAgICAgIC8vIHVud3JhcCBwYXJhbXMgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoc3BlYy5wYXlsb2FkUGFyYW1zICYmIHNwZWMucGF5bG9hZFBhcmFtcy51bndyYXApIHtcbiAgICAgICAganNvbk9iaiA9IHVud3JhcFBhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmopO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIC8vIHRyeSB0byBkZXRlcm1pbmUgcHJvdG9jb2wgYnkgc2Vzc2lvbiBjcmVhdGlvbiBhcmdzLCBzbyB3ZSBjYW4gdGhyb3cgYVxuICAgICAgICAvLyBwcm9wZXJseSBmb3JtYXR0ZWQgZXJyb3IgaWYgYXJndW1lbnRzIHZhbGlkYXRpb24gZmFpbHNcbiAgICAgICAgY3VycmVudFByb3RvY29sID0gZGV0ZXJtaW5lUHJvdG9jb2woLi4ubWFrZUFyZ3MocmVxLnBhcmFtcywganNvbk9iaiwgc3BlYy5wYXlsb2FkUGFyYW1zIHx8IHt9KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBqc29uIHBheWxvYWQgY29uZm9ybXMgdG8gdGhlIHNwZWNcbiAgICAgIGNoZWNrUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaiwgY3VycmVudFByb3RvY29sKTtcblxuICAgICAgLy8gdHVybiB0aGUgY29tbWFuZCBhbmQganNvbiBwYXlsb2FkIGludG8gYW4gYXJndW1lbnQgbGlzdCBmb3JcbiAgICAgIC8vIHRoZSBkcml2ZXIgbWV0aG9kc1xuICAgICAgbGV0IGFyZ3MgPSBtYWtlQXJncyhyZXEucGFyYW1zLCBqc29uT2JqLCBzcGVjLnBheWxvYWRQYXJhbXMgfHwge30sIGN1cnJlbnRQcm90b2NvbCk7XG4gICAgICBsZXQgZHJpdmVyUmVzO1xuICAgICAgLy8gdmFsaWRhdGUgY29tbWFuZCBhcmdzIGFjY29yZGluZyB0byBNSlNPTldQXG4gICAgICBpZiAodmFsaWRhdG9yc1tzcGVjLmNvbW1hbmRdKSB7XG4gICAgICAgIHZhbGlkYXRvcnNbc3BlYy5jb21tYW5kXSguLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gcnVuIHRoZSBkcml2ZXIgY29tbWFuZCB3cmFwcGVkIGluc2lkZSB0aGUgYXJndW1lbnQgdmFsaWRhdG9yc1xuICAgICAgU0VTU0lPTlNfQ0FDSEUuZ2V0TG9nZ2VyKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpLmRlYnVnKGBDYWxsaW5nIGAgK1xuICAgICAgICBgJHtkcml2ZXIuY29uc3RydWN0b3IubmFtZX0uJHtzcGVjLmNvbW1hbmR9KCkgd2l0aCBhcmdzOiBgICtcbiAgICAgICAgXy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShhcmdzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pKTtcblxuICAgICAgaWYgKGRyaXZlci5leGVjdXRlQ29tbWFuZCkge1xuICAgICAgICBkcml2ZXJSZXMgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoc3BlYy5jb21tYW5kLCAuLi5hcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyaXZlclJlcyA9IGF3YWl0IGRyaXZlci5leGVjdXRlKHNwZWMuY29tbWFuZCwgLi4uYXJncyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgcHJvdG9jb2wgYWZ0ZXIgZXhlY3V0ZUNvbW1hbmRcbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKSB8fCBjdXJyZW50UHJvdG9jb2w7XG5cbiAgICAgIC8vIElmIGBleGVjdXRlQ29tbWFuZGAgd2FzIG92ZXJyaWRkZW4gYW5kIHRoZSBtZXRob2QgcmV0dXJucyBhbiBvYmplY3RcbiAgICAgIC8vIHdpdGggYSBwcm90b2NvbCBhbmQgdmFsdWUvZXJyb3IgcHJvcGVydHksIHJlLWFzc2lnbiB0aGUgcHJvdG9jb2xcbiAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoZHJpdmVyUmVzKSAmJiBfLmhhcyhkcml2ZXJSZXMsICdwcm90b2NvbCcpKSB7XG4gICAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGRyaXZlclJlcy5wcm90b2NvbCB8fCBjdXJyZW50UHJvdG9jb2w7XG4gICAgICAgIGlmIChkcml2ZXJSZXMuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBkcml2ZXJSZXMuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyB1bnBhY2sgY3JlYXRlU2Vzc2lvbiByZXNwb25zZVxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICBuZXdTZXNzaW9uSWQgPSBkcml2ZXJSZXNbMF07XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLnB1dFNlc3Npb24obmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpO1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIobmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpXG4gICAgICAgICAgLmRlYnVnKGBDYWNoZWQgdGhlIHByb3RvY29sIHZhbHVlICcke2N1cnJlbnRQcm90b2NvbH0nIGZvciB0aGUgbmV3IHNlc3Npb24gJHtuZXdTZXNzaW9uSWR9YCk7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5NSlNPTldQKSB7XG4gICAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICAgIGRyaXZlclJlcyA9IHtcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogZHJpdmVyUmVzWzFdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZHJpdmVyUmVzID0gZm9ybWF0UmVzcG9uc2VWYWx1ZShkcml2ZXJSZXMpO1xuXG4gICAgICAvLyBkZWxldGUgc2hvdWxkIG5vdCByZXR1cm4gYW55dGhpbmcgZXZlbiBpZiBzdWNjZXNzZnVsXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKVxuICAgICAgICAgIC5kZWJ1ZyhgUmVjZWl2ZWQgcmVzcG9uc2U6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkcml2ZXJSZXMpLCB7bGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIfSl9YCk7XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKS5kZWJ1ZygnQnV0IGRlbGV0aW5nIHNlc3Npb24sIHNvIG5vdCByZXR1cm5pbmcnKTtcbiAgICAgICAgZHJpdmVyUmVzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHN0YXR1cyBpcyBub3QgMCwgIHRocm93IHRoZSBhcHByb3ByaWF0ZSBlcnJvciBmb3Igc3RhdHVzIGNvZGUuXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZShkcml2ZXJSZXMpKSB7XG4gICAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKGRyaXZlclJlcy5zdGF0dXMpICYmICFpc05hTihkcml2ZXJSZXMuc3RhdHVzKSAmJiBwYXJzZUludChkcml2ZXJSZXMuc3RhdHVzLCAxMCkgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZShkcml2ZXJSZXMuc3RhdHVzLCBkcml2ZXJSZXMudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChkcml2ZXJSZXMudmFsdWUpICYmIGRyaXZlclJlcy52YWx1ZS5lcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yRnJvbVczQ0pzb25Db2RlKGRyaXZlclJlcy52YWx1ZS5lcnJvciwgZHJpdmVyUmVzLnZhbHVlLm1lc3NhZ2UsIGRyaXZlclJlcy52YWx1ZS5zdGFja3RyYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keS52YWx1ZSA9IGRyaXZlclJlcztcbiAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbCkuZGVidWcoYFJlc3BvbmRpbmcgYCArXG4gICAgICAgIGB0byBjbGllbnQgd2l0aCBkcml2ZXIuJHtzcGVjLmNvbW1hbmR9KCkgcmVzdWx0OiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoZHJpdmVyUmVzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pfWApO1xuXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8ga2VlcCB0aGUgbG9nZ2VyIGluc3RhbmNlIGluIHRoZSBjYWNoZVxuICAgICAgICAvLyBhZnRlciB0aGUgc2Vzc2lvbiBpcyBkZWxldGVkLCBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBsb2dnaW5nIGhpc3RvcnlcbiAgICAgICAgLy8gYW5kIGNvbnN1bWVzIHRoZSBtZW1vcnlcbiAgICAgICAgU0VTU0lPTlNfQ0FDSEUucmVzZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgZmlndXJlIG91dCB3aGF0IG91ciByZXNwb25zZSBzaG91bGQgYmVcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGVycm9yIHRoYXQgd2UgZW5jb3VudGVyZWRcbiAgICAgIGxldCBhY3R1YWxFcnIgPSBlcnI7XG5cbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGN1cnJlbnRQcm90b2NvbCB8fCBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpO1xuXG4gICAgICBsZXQgZXJyTXNnID0gZXJyLnN0YWNrdHJhY2UgfHwgZXJyLnN0YWNrO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKGVyck1zZywgZXJyLm1lc3NhZ2UpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBtZXNzYWdlIGhhcyBtb3JlIGluZm9ybWF0aW9uLCBhZGQgaXQuIGJ1dCBvZnRlbiB0aGUgbWVzc2FnZVxuICAgICAgICAvLyBpcyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc3RhY2sgdHJhY2VcbiAgICAgICAgZXJyTXNnID0gYCR7ZXJyLm1lc3NhZ2V9JHtlcnJNc2cgPyAoJ1xcbicgKyBlcnJNc2cpIDogJyd9YDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcikpIHtcbiAgICAgICAgYWN0dWFsRXJyID0gZXJyLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpXG4gICAgICAgICAgLmRlYnVnKGBFbmNvdW50ZXJlZCBpbnRlcm5hbCBlcnJvciBydW5uaW5nIGNvbW1hbmQ6ICR7ZXJyTXNnfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDKSB7XG4gICAgICAgIFtodHRwU3RhdHVzLCBodHRwUmVzQm9keV0gPSBnZXRSZXNwb25zZUZvclczQ0Vycm9yKGFjdHVhbEVycik7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLk1KU09OV1ApIHtcbiAgICAgICAgW2h0dHBTdGF0dXMsIGh0dHBSZXNCb2R5XSA9IGdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IoYWN0dWFsRXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIGl0J3MgdW5rbm93biB3aGF0IHRoZSBwcm90b2NvbCBpcyAobGlrZSBpZiBpdCdzIGBnZXRTdGF0dXNgIHByaW9yIHRvIGBjcmVhdGVTZXNzaW9uYCksIG1lcmdlIHRoZSByZXNwb25zZXNcbiAgICAgICAgLy8gdG9nZXRoZXIgdG8gYmUgcHJvdG9jb2wtYWdub3N0aWNcbiAgICAgICAgbGV0IGpzb253cFJlcyA9IGdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IoYWN0dWFsRXJyKTtcbiAgICAgICAgbGV0IHczY1JlcyA9IGdldFJlc3BvbnNlRm9yVzNDRXJyb3IoYWN0dWFsRXJyKTtcblxuICAgICAgICBodHRwUmVzQm9keSA9IHtcbiAgICAgICAgICAuLi5qc29ud3BSZXNbMV0sXG4gICAgICAgICAgLi4udzNjUmVzWzFdLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFVzZSB0aGUgSlNPTldQIHN0YXR1cyBjb2RlICh3aGljaCBpcyB1c3VhbGx5IDUwMClcbiAgICAgICAgaHR0cFN0YXR1cyA9IGpzb253cFJlc1swXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkZWNvZGUgdGhlIHJlc3BvbnNlLCB3aGljaCBpcyBlaXRoZXIgYSBzdHJpbmcgb3IganNvblxuICAgIGlmIChfLmlzU3RyaW5nKGh0dHBSZXNCb2R5KSkge1xuICAgICAgcmVzLnN0YXR1cyhodHRwU3RhdHVzKS5zZW5kKGh0dHBSZXNCb2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5ld1Nlc3Npb25JZCkge1xuICAgICAgICBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDKSB7XG4gICAgICAgICAgaHR0cFJlc0JvZHkudmFsdWUuc2Vzc2lvbklkID0gbmV3U2Vzc2lvbklkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGh0dHBSZXNCb2R5LnNlc3Npb25JZCA9IG5ld1Nlc3Npb25JZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHR0cFJlc0JvZHkuc2Vzc2lvbklkID0gcmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IGluY2x1ZGUgc2Vzc2lvbklkIGluIFczQyByZXNwb25zZXNcbiAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgZGVsZXRlIGh0dHBSZXNCb2R5LnNlc3Npb25JZDtcbiAgICAgIH1cblxuICAgICAgaHR0cFJlc0JvZHkgPSBmb3JtYXRTdGF0dXMoaHR0cFJlc0JvZHksIGh0dHBTdGF0dXMsIGN1cnJlbnRQcm90b2NvbCk7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLmpzb24oaHR0cFJlc0JvZHkpO1xuICAgIH1cbiAgfTtcbiAgLy8gYWRkIHRoZSBtZXRob2QgdG8gdGhlIGFwcFxuICBhcHBbbWV0aG9kLnRvTG93ZXJDYXNlKCldKHBhdGgsIChyZXEsIHJlcykgPT4ge1xuICAgIEIucmVzb2x2ZShhc3luY0hhbmRsZXIocmVxLCByZXMpKS5kb25lKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkcml2ZXJTaG91bGREb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgY29tbWFuZCkge1xuICAvLyBkcml2ZXJzIG5lZWQgdG8gZXhwbGljaXRseSBzYXkgd2hlbiB0aGUgcHJveHkgaXMgYWN0aXZlXG4gIGlmICghZHJpdmVyLnByb3h5QWN0aXZlKHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHdlIHNob3VsZCBuZXZlciBwcm94eSBkZWxldGVTZXNzaW9uIGJlY2F1c2Ugd2UgbmVlZCB0byBnaXZlIHRoZSBjb250YWluaW5nXG4gIC8vIGRyaXZlciBhbiBvcHBvcnR1bml0eSB0byBjbGVhbiBpdHNlbGYgdXBcbiAgaWYgKGNvbW1hbmQgPT09ICdkZWxldGVTZXNzaW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHZhbGlkYXRlIGF2b2lkYW5jZSBzY2hlbWEsIGFuZCBzYXkgd2Ugc2hvdWxkbid0IHByb3h5IGlmIGFueXRoaW5nIGluIHRoZVxuICAvLyBhdm9pZCBsaXN0IG1hdGNoZXMgb3VyIHJlcVxuICBpZiAoZHJpdmVyLnByb3h5Um91dGVJc0F2b2lkZWQocmVxLnBhcmFtcy5zZXNzaW9uSWQsIHJlcS5tZXRob2QsIHJlcS5vcmlnaW5hbFVybCwgcmVxLmJvZHkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvSndwUHJveHkgKGRyaXZlciwgcmVxLCByZXMpIHtcbiAgU0VTU0lPTlNfQ0FDSEUuZ2V0TG9nZ2VyKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkpXG4gICAgLmluZm8oJ0RyaXZlciBwcm94eSBhY3RpdmUsIHBhc3NpbmcgcmVxdWVzdCBvbiB2aWEgSFRUUCBwcm94eScpO1xuXG4gIC8vIGNoZWNrIHRoYXQgdGhlIGlubmVyIGRyaXZlciBoYXMgYSBwcm94eSBmdW5jdGlvblxuICBpZiAoIWRyaXZlci5jYW5Qcm94eShyZXEucGFyYW1zLnNlc3Npb25JZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyeWluZyB0byBwcm94eSB0byBhIEpTT05XUCBzZXJ2ZXIgYnV0IGRyaXZlciBpcyB1bmFibGUgdG8gcHJveHknKTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHByb3hpZWRSZXMgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoJ3Byb3h5UmVxUmVzJywgcmVxLCByZXMsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgICBpZiAocHJveGllZFJlcyAmJiBwcm94aWVkUmVzLmVycm9yKSB0aHJvdyBwcm94aWVkUmVzLmVycm9yOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcikpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcHJveHkuIFByb3h5IGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5cbmV4cG9ydCB7XG4gIFByb3RvY29sLCByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24sIGlzU2Vzc2lvbkNvbW1hbmQsXG4gIGRyaXZlclNob3VsZERvSndwUHJveHksIGRldGVybWluZVByb3RvY29sXG59O1xuIl0sImZpbGUiOiJsaWIvcHJvdG9jb2wvcHJvdG9jb2wuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { W3C_ELEMENT_KEY } from './lib/protocol/helpers'
|
|
2
|
+
|
|
3
|
+
declare class BaseDriver {
|
|
4
|
+
// class variables
|
|
5
|
+
static baseVersion: string;
|
|
6
|
+
static get argsConstraints(): {};
|
|
7
|
+
|
|
8
|
+
constructor(opts?: {}, shouldValidateCaps?: boolean);
|
|
9
|
+
|
|
10
|
+
// fields
|
|
11
|
+
sessionId: string;
|
|
12
|
+
opts: DriverOpts;
|
|
13
|
+
initialOpts: DriverOpts;
|
|
14
|
+
caps?: {};
|
|
15
|
+
originalCaps?: {};
|
|
16
|
+
helpers: DriverHelpers;
|
|
17
|
+
basePath: string;
|
|
18
|
+
relaxedSecurityEnabled: boolean;
|
|
19
|
+
allowInsecure: string[];
|
|
20
|
+
denyInsecure: string[];
|
|
21
|
+
newCommandTimeoutMs: number;
|
|
22
|
+
implicitWaitMs: number;
|
|
23
|
+
locatorStrategies: string[];
|
|
24
|
+
webLocatorStrategies: string[];
|
|
25
|
+
settings: DeviceSettings;
|
|
26
|
+
protocol?: string;
|
|
27
|
+
supportedLogTypes: {[type: string]: LogType};
|
|
28
|
+
|
|
29
|
+
// getters/setters
|
|
30
|
+
get driverData(): {};
|
|
31
|
+
get isCommandsQueueEnabled(): boolean;
|
|
32
|
+
get eventHistory(): {};
|
|
33
|
+
get desiredCapConstraints(): {};
|
|
34
|
+
|
|
35
|
+
set desiredCapConstraints(constraints: {});
|
|
36
|
+
|
|
37
|
+
// non-command methods
|
|
38
|
+
onUnexpectedShutdown(handler: () => any): void;
|
|
39
|
+
logEvent(eventName: string): void;
|
|
40
|
+
getStatus(): Promise<{}>;
|
|
41
|
+
sessionExists(sessionId: string): boolean;
|
|
42
|
+
logExtraCaps(caps: {}): void;
|
|
43
|
+
validateDesiredCaps(caps: {}): boolean;
|
|
44
|
+
isFeatureEnabled(name: string): boolean;
|
|
45
|
+
ensureFeatureEnabled(name: string): void;
|
|
46
|
+
executeCommand(cmd: string, ...args: any[]): Promise<any>;
|
|
47
|
+
startUnexpectedShutdown(err?: Error): Promise<void>;
|
|
48
|
+
validateLocatorStrategy(strategy: string, webContext?: boolean): void;
|
|
49
|
+
reset(): Promise<void>;
|
|
50
|
+
proxyActive(): boolean;
|
|
51
|
+
getProxyAvoidList(): [string, RegExp][];
|
|
52
|
+
canProxy(): boolean;
|
|
53
|
+
proxyRouteIsAvoided(sessionId: string, method: string, url: string): boolean;
|
|
54
|
+
addManagedDriver(driver: BaseDriver): void;
|
|
55
|
+
getManagedDrivers(): BaseDriver[];
|
|
56
|
+
clearNewCommandTimeout(): Promise<void>;
|
|
57
|
+
startNewCommandTimeout(): Promise<void>;
|
|
58
|
+
implicitWaitForCondition(condition: () => Promise<any>): Promise<any>;
|
|
59
|
+
|
|
60
|
+
// commands
|
|
61
|
+
createSession(jwpCaps: {}, jwpReqCaps: {}, w3cCaps: {}): Promise<[string, {}]>;
|
|
62
|
+
getSessions(): Promise<{id: string, capabilities: {}}>
|
|
63
|
+
getSession(): Promise<{}>
|
|
64
|
+
deleteSession(): Promise<void>;
|
|
65
|
+
getSettings(): Promise<DeviceSettings>;
|
|
66
|
+
updateSettings(newSettings: {}): Promise<DeviceSettings>;
|
|
67
|
+
logCustomEvent(vendor: string, event: string): void;
|
|
68
|
+
getLogEvents(type?: string | string[]): {};
|
|
69
|
+
executeDriverScript(script: string, scriptType: string, timeout: number): Promise<{}>;
|
|
70
|
+
findElement(strategy: string, selector: string): Promise<Element>;
|
|
71
|
+
findElements(strategy: string, selector: string): Promise<Element[]>;
|
|
72
|
+
|
|
73
|
+
findElementFromElement(strategy: string, selector: string, elementId: string): Promise<Element>;
|
|
74
|
+
findElementsFromElement(strategy: string, selector: string, elementId: string): Promise<Element[]>;
|
|
75
|
+
findElOrEls(strategy: string, selector: string, mult: boolean, context: string): Promise<Element>;
|
|
76
|
+
getLogTypes(): Promise<string[]>
|
|
77
|
+
getLog(logType: string): Promise<{}[]>
|
|
78
|
+
timeouts(type: string, ms: number, script: number, pageLoad: number, implicit: number): Promise<void>;
|
|
79
|
+
getTimeouts(): Promise<{command: number, implicit: number}>;
|
|
80
|
+
implicitWait(ms: number): Promise<void>;
|
|
81
|
+
newCommandTimeout(ms: number): Promise<void>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
declare type DriverOpts = {
|
|
85
|
+
tmpDir: string
|
|
86
|
+
[key: string]: any
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
declare type Element = {
|
|
90
|
+
'element-6066-11e4-a52e-4f735466cecf': string
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
declare interface DriverHelpers {
|
|
94
|
+
configureApp: (
|
|
95
|
+
app: string,
|
|
96
|
+
supportedAppExtensions: string[]
|
|
97
|
+
) => Promise<string>;
|
|
98
|
+
isPackageOrBundle: (app: string) => boolean;
|
|
99
|
+
duplicateKeys: <T>(
|
|
100
|
+
input: T,
|
|
101
|
+
firstKey: string,
|
|
102
|
+
secondKey: string
|
|
103
|
+
) => T;
|
|
104
|
+
parseCapsArray: (cap: string|string[]) => string[]
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
declare type SettingsUpdater = (prop: string, newValue: {}, curValue: {}) => Promise<void>;
|
|
108
|
+
|
|
109
|
+
declare class DeviceSettings {
|
|
110
|
+
constructor(defaultSettings: {}, onSettingsUpdate: SettingsUpdater);
|
|
111
|
+
update(newSettings: {}): Promise<void>;
|
|
112
|
+
getSettings(): DeviceSettings;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
declare type LogType = {
|
|
116
|
+
description: string
|
|
117
|
+
getter: (driver: BaseDriver) => Promise<{}[]>
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export { BaseDriver, DriverHelpers, DriverOpts, Element, LogType };
|
|
121
|
+
export default BaseDriver;
|
package/lib/protocol/protocol.js
CHANGED
|
@@ -231,13 +231,15 @@ function buildHandler (app, method, path, spec, driver, isSessCmd) {
|
|
|
231
231
|
throw new errors.NoSuchDriverError();
|
|
232
232
|
}
|
|
233
233
|
|
|
234
|
-
// if the driver is currently proxying commands to another JSONWP
|
|
235
|
-
//
|
|
236
|
-
//
|
|
237
|
-
//
|
|
238
|
-
//
|
|
239
|
-
//
|
|
240
|
-
|
|
234
|
+
// if the driver is currently proxying commands to another JSONWP server, bypass all our
|
|
235
|
+
// checks and assume the upstream server knows what it's doing. But keep this in the
|
|
236
|
+
// try/catch block so if proxying itself fails, we give a message to the client. Of course we
|
|
237
|
+
// only want to do these when we have a session command; the Appium driver must be
|
|
238
|
+
// responsible for start/stop session, etc... We also allow the command spec to declare that
|
|
239
|
+
// this command should never be proxied (which is useful for plugin developers who add
|
|
240
|
+
// commands and generally would not want that command to be proxied instead of handled by the
|
|
241
|
+
// plugin)
|
|
242
|
+
if (isSessCmd && !spec.neverProxy && driverShouldDoJwpProxy(driver, req, spec.command)) {
|
|
241
243
|
await doJwpProxy(driver, req, res);
|
|
242
244
|
return;
|
|
243
245
|
}
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"firefoxos",
|
|
12
12
|
"testing"
|
|
13
13
|
],
|
|
14
|
-
"version": "8.
|
|
14
|
+
"version": "8.1.1",
|
|
15
15
|
"author": "https://github.com/appium",
|
|
16
16
|
"license": "Apache-2.0",
|
|
17
17
|
"repository": {
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
},
|
|
32
32
|
"files": [
|
|
33
33
|
"index.js",
|
|
34
|
+
"index.d.ts",
|
|
34
35
|
"lib",
|
|
35
36
|
"static",
|
|
36
37
|
"test/basedriver",
|
|
@@ -41,10 +42,10 @@
|
|
|
41
42
|
"!build/test/basedriver/fixtures"
|
|
42
43
|
],
|
|
43
44
|
"dependencies": {
|
|
44
|
-
"@appium/support": "^2.54.
|
|
45
|
+
"@appium/support": "^2.54.2",
|
|
45
46
|
"@babel/runtime": "7.15.4",
|
|
46
47
|
"async-lock": "1.3.0",
|
|
47
|
-
"asyncbox": "2.
|
|
48
|
+
"asyncbox": "2.9.1",
|
|
48
49
|
"axios": "0.21.4",
|
|
49
50
|
"bluebird": "3.7.2",
|
|
50
51
|
"body-parser": "1.19.0",
|
|
@@ -63,12 +64,12 @@
|
|
|
63
64
|
"ws": "7.5.5"
|
|
64
65
|
},
|
|
65
66
|
"devDependencies": {
|
|
66
|
-
"@appium/eslint-config-appium": "^4.7.
|
|
67
|
-
"@appium/gulp-plugins": "^5.5.
|
|
67
|
+
"@appium/eslint-config-appium": "^4.7.2",
|
|
68
|
+
"@appium/gulp-plugins": "^5.5.3"
|
|
68
69
|
},
|
|
69
70
|
"publishConfig": {
|
|
70
71
|
"access": "public"
|
|
71
72
|
},
|
|
72
73
|
"homepage": "https://appium.io",
|
|
73
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "01dd42ee1778509664d422a0c26e7061bae8402e"
|
|
74
75
|
}
|