@appium/base-driver 8.2.2 → 8.3.0

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.
Files changed (61) hide show
  1. package/build/lib/basedriver/capabilities.js +3 -1
  2. package/build/lib/basedriver/commands/find.js +4 -11
  3. package/build/lib/basedriver/commands/log.js +3 -6
  4. package/build/lib/basedriver/commands/session.js +18 -27
  5. package/build/lib/basedriver/commands/settings.js +4 -8
  6. package/build/lib/basedriver/commands/timeout.js +10 -15
  7. package/build/lib/basedriver/device-settings.js +14 -2
  8. package/build/lib/basedriver/driver.js +25 -23
  9. package/build/lib/basedriver/helpers.js +140 -84
  10. package/build/lib/express/express-logging.js +2 -2
  11. package/build/lib/express/idempotency.js +2 -2
  12. package/build/lib/helpers/capabilities.js +39 -0
  13. package/build/lib/index.js +7 -7
  14. package/build/lib/jsonwp-proxy/protocol-converter.js +19 -16
  15. package/build/lib/jsonwp-proxy/proxy.js +20 -16
  16. package/build/lib/protocol/errors.js +4 -2
  17. package/build/lib/protocol/helpers.js +3 -20
  18. package/build/lib/protocol/protocol.js +44 -45
  19. package/build/lib/protocol/routes.js +67 -1
  20. package/build/test/basedriver/capabilities-specs.js +43 -1
  21. package/build/test/basedriver/capability-specs.js +126 -167
  22. package/build/test/basedriver/commands/log-specs.js +12 -5
  23. package/build/test/basedriver/driver-tests.js +11 -14
  24. package/build/test/basedriver/helpers-specs.js +5 -1
  25. package/build/test/basedriver/timeout-specs.js +7 -9
  26. package/build/test/express/server-e2e-specs.js +10 -5
  27. package/build/test/express/server-specs.js +22 -16
  28. package/build/test/express/static-specs.js +10 -5
  29. package/build/test/jsonwp-proxy/proxy-e2e-specs.js +1 -2
  30. package/build/test/jsonwp-proxy/proxy-specs.js +1 -6
  31. package/build/test/protocol/fake-driver.js +12 -15
  32. package/build/test/protocol/protocol-e2e-specs.js +49 -103
  33. package/build/test/protocol/routes-specs.js +2 -2
  34. package/lib/basedriver/capabilities.js +3 -0
  35. package/lib/basedriver/commands/find.js +3 -6
  36. package/lib/basedriver/commands/log.js +2 -4
  37. package/lib/basedriver/commands/session.js +21 -22
  38. package/lib/basedriver/commands/settings.js +3 -5
  39. package/lib/basedriver/commands/timeout.js +9 -10
  40. package/lib/basedriver/device-settings.js +10 -1
  41. package/lib/basedriver/driver.js +29 -16
  42. package/lib/basedriver/helpers.js +201 -83
  43. package/lib/express/express-logging.js +1 -1
  44. package/lib/express/idempotency.js +1 -1
  45. package/lib/helpers/capabilities.js +25 -0
  46. package/lib/index.js +6 -4
  47. package/lib/jsonwp-proxy/protocol-converter.js +15 -18
  48. package/lib/jsonwp-proxy/proxy.js +17 -15
  49. package/lib/protocol/errors.js +1 -1
  50. package/lib/protocol/helpers.js +5 -25
  51. package/lib/protocol/protocol.js +43 -54
  52. package/lib/protocol/routes.js +60 -1
  53. package/package.json +29 -22
  54. package/test/basedriver/capabilities-specs.js +34 -2
  55. package/test/basedriver/capability-specs.js +120 -146
  56. package/test/basedriver/commands/log-specs.js +12 -3
  57. package/test/basedriver/driver-tests.js +12 -7
  58. package/test/basedriver/helpers-specs.js +4 -0
  59. package/test/basedriver/timeout-specs.js +6 -11
  60. package/build/lib/protocol/sessions-cache.js +0 -88
  61. package/lib/protocol/sessions-cache.js +0 -74
@@ -5,7 +5,6 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.JSONWP_SUCCESS_STATUS_CODE = void 0;
9
8
  Object.defineProperty(exports, "MJSONWP_ELEMENT_KEY", {
10
9
  enumerable: true,
11
10
  get: function () {
@@ -29,10 +28,6 @@ var _helpers = require("../basedriver/helpers");
29
28
 
30
29
  var _constants = require("../constants");
31
30
 
32
- const JSONWP_SUCCESS_STATUS_CODE = 0;
33
- exports.JSONWP_SUCCESS_STATUS_CODE = JSONWP_SUCCESS_STATUS_CODE;
34
- const JSONWP_UNKNOWN_ERROR_STATUS_CODE = 13;
35
-
36
31
  function formatResponseValue(resValue) {
37
32
  if (_lodash.default.isUndefined(resValue)) {
38
33
  return null;
@@ -41,21 +36,9 @@ function formatResponseValue(resValue) {
41
36
  return (0, _helpers.duplicateKeys)(resValue, _constants.MJSONWP_ELEMENT_KEY, _constants.W3C_ELEMENT_KEY);
42
37
  }
43
38
 
44
- function formatStatus(responseBody, responseCode = 200, protocol = null) {
45
- if (!_lodash.default.isPlainObject(responseBody)) {
46
- return responseBody;
47
- }
48
-
49
- const isError = _lodash.default.has(responseBody.value, 'error') || responseCode >= 400;
50
-
51
- if (protocol === _constants.PROTOCOLS.MJSONWP && !_lodash.default.isInteger(responseBody.status) || !protocol && !_lodash.default.has(responseBody, 'status')) {
52
- responseBody.status = isError ? JSONWP_UNKNOWN_ERROR_STATUS_CODE : JSONWP_SUCCESS_STATUS_CODE;
53
- } else if (protocol === _constants.PROTOCOLS.W3C && _lodash.default.has(responseBody, 'status')) {
54
- delete responseBody.status;
55
- }
56
-
57
- return responseBody;
39
+ function formatStatus(responseBody) {
40
+ return _lodash.default.isPlainObject(responseBody) ? _lodash.default.omit(responseBody, ['status']) : responseBody;
58
41
  }require('source-map-support').install();
59
42
 
60
43
 
61
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9oZWxwZXJzLmpzIl0sIm5hbWVzIjpbIkpTT05XUF9TVUNDRVNTX1NUQVRVU19DT0RFIiwiSlNPTldQX1VOS05PV05fRVJST1JfU1RBVFVTX0NPREUiLCJmb3JtYXRSZXNwb25zZVZhbHVlIiwicmVzVmFsdWUiLCJfIiwiaXNVbmRlZmluZWQiLCJNSlNPTldQX0VMRU1FTlRfS0VZIiwiVzNDX0VMRU1FTlRfS0VZIiwiZm9ybWF0U3RhdHVzIiwicmVzcG9uc2VCb2R5IiwicmVzcG9uc2VDb2RlIiwicHJvdG9jb2wiLCJpc1BsYWluT2JqZWN0IiwiaXNFcnJvciIsImhhcyIsInZhbHVlIiwiUFJPVE9DT0xTIiwiTUpTT05XUCIsImlzSW50ZWdlciIsInN0YXR1cyIsIlczQyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLDBCQUEwQixHQUFHLENBQW5DOztBQUNBLE1BQU1DLGdDQUFnQyxHQUFHLEVBQXpDOztBQVdBLFNBQVNDLG1CQUFULENBQThCQyxRQUE5QixFQUF3QztBQUN0QyxNQUFJQyxnQkFBRUMsV0FBRixDQUFjRixRQUFkLENBQUosRUFBNkI7QUFFM0IsV0FBTyxJQUFQO0FBQ0Q7O0FBR0QsU0FBTyw0QkFBY0EsUUFBZCxFQUF3QkcsOEJBQXhCLEVBQTZDQywwQkFBN0MsQ0FBUDtBQUNEOztBQWFELFNBQVNDLFlBQVQsQ0FBdUJDLFlBQXZCLEVBQXFDQyxZQUFZLEdBQUcsR0FBcEQsRUFBeURDLFFBQVEsR0FBRyxJQUFwRSxFQUEwRTtBQUN4RSxNQUFJLENBQUNQLGdCQUFFUSxhQUFGLENBQWdCSCxZQUFoQixDQUFMLEVBQW9DO0FBQ2xDLFdBQU9BLFlBQVA7QUFDRDs7QUFDRCxRQUFNSSxPQUFPLEdBQUdULGdCQUFFVSxHQUFGLENBQU1MLFlBQVksQ0FBQ00sS0FBbkIsRUFBMEIsT0FBMUIsS0FBc0NMLFlBQVksSUFBSSxHQUF0RTs7QUFDQSxNQUFLQyxRQUFRLEtBQUtLLHFCQUFVQyxPQUF2QixJQUFrQyxDQUFDYixnQkFBRWMsU0FBRixDQUFZVCxZQUFZLENBQUNVLE1BQXpCLENBQXBDLElBQ0UsQ0FBQ1IsUUFBRCxJQUFhLENBQUNQLGdCQUFFVSxHQUFGLENBQU1MLFlBQU4sRUFBb0IsUUFBcEIsQ0FEcEIsRUFDb0Q7QUFDbERBLElBQUFBLFlBQVksQ0FBQ1UsTUFBYixHQUFzQk4sT0FBTyxHQUN6QlosZ0NBRHlCLEdBRXpCRCwwQkFGSjtBQUdELEdBTEQsTUFLTyxJQUFJVyxRQUFRLEtBQUtLLHFCQUFVSSxHQUF2QixJQUE4QmhCLGdCQUFFVSxHQUFGLENBQU1MLFlBQU4sRUFBb0IsUUFBcEIsQ0FBbEMsRUFBaUU7QUFDdEUsV0FBT0EsWUFBWSxDQUFDVSxNQUFwQjtBQUNEOztBQUNELFNBQU9WLFlBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBkdXBsaWNhdGVLZXlzIH0gZnJvbSAnLi4vYmFzZWRyaXZlci9oZWxwZXJzJztcbmltcG9ydCB7IE1KU09OV1BfRUxFTUVOVF9LRVksIFczQ19FTEVNRU5UX0tFWSwgUFJPVE9DT0xTIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuY29uc3QgSlNPTldQX1NVQ0NFU1NfU1RBVFVTX0NPREUgPSAwO1xuY29uc3QgSlNPTldQX1VOS05PV05fRVJST1JfU1RBVFVTX0NPREUgPSAxMztcblxuLyoqXG4gKiBQcmVwcm9jZXNzZXMgdGhlIHJlc3VsdGluZyB2YWx1ZSBmb3IgQVBJIHJlc3BvbnNlcyxcbiAqIHNvIHRoZXkgaGF2ZSBrZXlzIGZvciBib3RoIFczQyBhbmQgSlNPTldQIHByb3RvY29scy5cbiAqIFRoZSBhcmd1bWVudCB2YWx1ZSBpcyBOT1QgbXV0YXRlZFxuICpcbiAqIEBwYXJhbSB7P09iamVjdH0gcmVzVmFsdWUgVGhlIGFjdHVhbCByZXNwb25zZSB2YWx1ZVxuICogQHJldHVybnMgez9PYmplY3R9IEVpdGhlciBtb2RpZmllZCB2YWx1ZSBvciB0aGUgc2FtZSBvbmUgaWZcbiAqIG5vdGhpbmcgaGFzIGJlZW4gbW9kaWZpZWRcbiAqL1xuZnVuY3Rpb24gZm9ybWF0UmVzcG9uc2VWYWx1ZSAocmVzVmFsdWUpIHtcbiAgaWYgKF8uaXNVbmRlZmluZWQocmVzVmFsdWUpKSB7XG4gICAgLy8gY29udmVydCB1bmRlZmluZWQgdG8gbnVsbFxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIElmIHRoZSBNSlNPTldQIGVsZW1lbnQga2V5IGZvcm1hdCAoRUxFTUVOVCkgd2FzIHByb3ZpZGVkLCBhZGQgYSBkdXBsaWNhdGUga2V5IChlbGVtZW50LTYwNjYtMTFlNC1hNTJlLTRmNzM1NDY2Y2VjZilcbiAgLy8gSWYgdGhlIFczQyBlbGVtZW50IGtleSBmb3JtYXQgKGVsZW1lbnQtNjA2Ni0xMWU0LWE1MmUtNGY3MzU0NjZjZWNmKSB3YXMgcHJvdmlkZWQsIGFkZCBhIGR1cGxpY2F0ZSBrZXkgKEVMRU1FTlQpXG4gIHJldHVybiBkdXBsaWNhdGVLZXlzKHJlc1ZhbHVlLCBNSlNPTldQX0VMRU1FTlRfS0VZLCBXM0NfRUxFTUVOVF9LRVkpO1xufVxuXG4vKipcbiAqIFByb3Blcmx5IGZvcm1hdHMgdGhlIHN0YXR1cyBmb3IgQVBJIHJlc3BvbnNlcyxcbiAqIHNvIHRoZXkgYXJlIGNvcnJlY3QgZm9yIGJvdGggVzNDIGFuZCBKU09OV1AgcHJvdG9jb2xzLlxuICogVGhpcyBtZXRob2QgRE9FUyBtdXRhdGUgdGhlIGByZXNwb25zZUJvZHlgIGFyZ3VtZW50IGlmIG5lZWRlZFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZUJvZHlcbiAqIEBwYXJhbSB7bnVtYmVyfSByZXNwb25zZUNvZGUgdGhlIEhUVFAgcmVzcG9uc2UgY29kZVxuICogQHBhcmFtIHs/c3RyaW5nfSBwcm90b2NvbCBUaGUgbmFtZSBvZiB0aGUgcHJvdG9jb2wsIGVpdGhlclxuICogYFBST1RPQ09MUy5XM0NgIG9yIGBQUk9UT0NPTFMuTUpTT05XUGBcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBmaXhlZCByZXNwb25zZSBib2R5XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFN0YXR1cyAocmVzcG9uc2VCb2R5LCByZXNwb25zZUNvZGUgPSAyMDAsIHByb3RvY29sID0gbnVsbCkge1xuICBpZiAoIV8uaXNQbGFpbk9iamVjdChyZXNwb25zZUJvZHkpKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlQm9keTtcbiAgfVxuICBjb25zdCBpc0Vycm9yID0gXy5oYXMocmVzcG9uc2VCb2R5LnZhbHVlLCAnZXJyb3InKSB8fCByZXNwb25zZUNvZGUgPj0gNDAwO1xuICBpZiAoKHByb3RvY29sID09PSBQUk9UT0NPTFMuTUpTT05XUCAmJiAhXy5pc0ludGVnZXIocmVzcG9uc2VCb2R5LnN0YXR1cykpXG4gICAgfHwgKCFwcm90b2NvbCAmJiAhXy5oYXMocmVzcG9uc2VCb2R5LCAnc3RhdHVzJykpKSB7XG4gICAgcmVzcG9uc2VCb2R5LnN0YXR1cyA9IGlzRXJyb3JcbiAgICAgID8gSlNPTldQX1VOS05PV05fRVJST1JfU1RBVFVTX0NPREVcbiAgICAgIDogSlNPTldQX1NVQ0NFU1NfU1RBVFVTX0NPREU7XG4gIH0gZWxzZSBpZiAocHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MgJiYgXy5oYXMocmVzcG9uc2VCb2R5LCAnc3RhdHVzJykpIHtcbiAgICBkZWxldGUgcmVzcG9uc2VCb2R5LnN0YXR1cztcbiAgfVxuICByZXR1cm4gcmVzcG9uc2VCb2R5O1xufVxuXG5cbmV4cG9ydCB7XG4gIE1KU09OV1BfRUxFTUVOVF9LRVksIFczQ19FTEVNRU5UX0tFWSwgZm9ybWF0UmVzcG9uc2VWYWx1ZSxcbiAgSlNPTldQX1NVQ0NFU1NfU1RBVFVTX0NPREUsIGZvcm1hdFN0YXR1cyxcbn07XG4iXSwiZmlsZSI6ImxpYi9wcm90b2NvbC9oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
44
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9oZWxwZXJzLmpzIl0sIm5hbWVzIjpbImZvcm1hdFJlc3BvbnNlVmFsdWUiLCJyZXNWYWx1ZSIsIl8iLCJpc1VuZGVmaW5lZCIsIk1KU09OV1BfRUxFTUVOVF9LRVkiLCJXM0NfRUxFTUVOVF9LRVkiLCJmb3JtYXRTdGF0dXMiLCJyZXNwb25zZUJvZHkiLCJpc1BsYWluT2JqZWN0Iiwib21pdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBV0EsU0FBU0EsbUJBQVQsQ0FBOEJDLFFBQTlCLEVBQXdDO0FBQ3RDLE1BQUlDLGdCQUFFQyxXQUFGLENBQWNGLFFBQWQsQ0FBSixFQUE2QjtBQUUzQixXQUFPLElBQVA7QUFDRDs7QUFHRCxTQUFPLDRCQUFjQSxRQUFkLEVBQXdCRyw4QkFBeEIsRUFBNkNDLDBCQUE3QyxDQUFQO0FBQ0Q7O0FBU0QsU0FBU0MsWUFBVCxDQUF1QkMsWUFBdkIsRUFBcUM7QUFDbkMsU0FBT0wsZ0JBQUVNLGFBQUYsQ0FBZ0JELFlBQWhCLElBQWdDTCxnQkFBRU8sSUFBRixDQUFPRixZQUFQLEVBQXFCLENBQUMsUUFBRCxDQUFyQixDQUFoQyxHQUFtRUEsWUFBMUU7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBkdXBsaWNhdGVLZXlzIH0gZnJvbSAnLi4vYmFzZWRyaXZlci9oZWxwZXJzJztcbmltcG9ydCB7IE1KU09OV1BfRUxFTUVOVF9LRVksIFczQ19FTEVNRU5UX0tFWSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbi8qKlxuICogUHJlcHJvY2Vzc2VzIHRoZSByZXN1bHRpbmcgdmFsdWUgZm9yIEFQSSByZXNwb25zZXMsXG4gKiBzbyB0aGV5IGhhdmUga2V5cyBmb3IgYm90aCBXM0MgYW5kIEpTT05XUCBwcm90b2NvbHMuXG4gKiBUaGUgYXJndW1lbnQgdmFsdWUgaXMgTk9UIG11dGF0ZWRcbiAqXG4gKiBAcGFyYW0gez9PYmplY3R9IHJlc1ZhbHVlIFRoZSBhY3R1YWwgcmVzcG9uc2UgdmFsdWVcbiAqIEByZXR1cm5zIHs/T2JqZWN0fSBFaXRoZXIgbW9kaWZpZWQgdmFsdWUgb3IgdGhlIHNhbWUgb25lIGlmXG4gKiBub3RoaW5nIGhhcyBiZWVuIG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFJlc3BvbnNlVmFsdWUgKHJlc1ZhbHVlKSB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHJlc1ZhbHVlKSkge1xuICAgIC8vIGNvbnZlcnQgdW5kZWZpbmVkIHRvIG51bGxcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBJZiB0aGUgTUpTT05XUCBlbGVtZW50IGtleSBmb3JtYXQgKEVMRU1FTlQpIHdhcyBwcm92aWRlZCwgYWRkIGEgZHVwbGljYXRlIGtleSAoZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2YpXG4gIC8vIElmIHRoZSBXM0MgZWxlbWVudCBrZXkgZm9ybWF0IChlbGVtZW50LTYwNjYtMTFlNC1hNTJlLTRmNzM1NDY2Y2VjZikgd2FzIHByb3ZpZGVkLCBhZGQgYSBkdXBsaWNhdGUga2V5IChFTEVNRU5UKVxuICByZXR1cm4gZHVwbGljYXRlS2V5cyhyZXNWYWx1ZSwgTUpTT05XUF9FTEVNRU5UX0tFWSwgVzNDX0VMRU1FTlRfS0VZKTtcbn1cblxuLyoqXG4gKiBQcm9wZXJseSBmb3JtYXRzIHRoZSBzdGF0dXMgZm9yIEFQSSByZXNwb25zZXMsXG4gKiBzbyB0aGV5IGFyZSBjb3JyZWN0IGZvciB0aGUgVzNDIHByb3RvY29sLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZUJvZHlcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBmaXhlZCByZXNwb25zZSBib2R5XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFN0YXR1cyAocmVzcG9uc2VCb2R5KSB7XG4gIHJldHVybiBfLmlzUGxhaW5PYmplY3QocmVzcG9uc2VCb2R5KSA/IF8ub21pdChyZXNwb25zZUJvZHksIFsnc3RhdHVzJ10pIDogcmVzcG9uc2VCb2R5O1xufVxuXG5cbmV4cG9ydCB7XG4gIE1KU09OV1BfRUxFTUVOVF9LRVksIFczQ19FTEVNRU5UX0tFWSwgZm9ybWF0UmVzcG9uc2VWYWx1ZSwgZm9ybWF0U3RhdHVzXG59O1xuIl0sImZpbGUiOiJsaWIvcHJvdG9jb2wvaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.Protocol = exports.DELETE_SESSION_COMMAND = exports.CREATE_SESSION_COMMAND = void 0;
8
+ exports.Protocol = exports.GET_STATUS_COMMAND = exports.DELETE_SESSION_COMMAND = exports.CREATE_SESSION_COMMAND = void 0;
9
9
  exports.determineProtocol = determineProtocol;
10
10
  exports.driverShouldDoJwpProxy = driverShouldDoJwpProxy;
11
11
  exports.isSessionCommand = isSessionCommand;
@@ -29,35 +29,57 @@ var _helpers = require("./helpers");
29
29
 
30
30
  var _constants = require("../constants");
31
31
 
32
- var _sessionsCache = _interopRequireDefault(require("./sessions-cache"));
32
+ var _capabilities = require("../helpers/capabilities");
33
33
 
34
34
  const CREATE_SESSION_COMMAND = 'createSession';
35
35
  exports.CREATE_SESSION_COMMAND = CREATE_SESSION_COMMAND;
36
36
  const DELETE_SESSION_COMMAND = 'deleteSession';
37
37
  exports.DELETE_SESSION_COMMAND = DELETE_SESSION_COMMAND;
38
+ const GET_STATUS_COMMAND = 'getStatus';
39
+ exports.GET_STATUS_COMMAND = GET_STATUS_COMMAND;
38
40
 
39
41
  class Protocol {}
40
42
 
41
43
  exports.Protocol = Protocol;
42
44
 
43
- function determineProtocol(desiredCapabilities, requiredCapabilities, capabilities) {
44
- return _lodash.default.isPlainObject(capabilities) ? _constants.PROTOCOLS.W3C : _constants.PROTOCOLS.MJSONWP;
45
+ function determineProtocol(createSessionArgs) {
46
+ return _lodash.default.some(createSessionArgs, _capabilities.isW3cCaps) ? _constants.PROTOCOLS.W3C : _constants.PROTOCOLS.MJSONWP;
45
47
  }
46
48
 
47
49
  function extractProtocol(driver, sessionId = null) {
50
+ var _dstDriver$protocol;
51
+
48
52
  const dstDriver = _lodash.default.isFunction(driver.driverForSession) ? driver.driverForSession(sessionId) : driver;
49
53
 
50
54
  if (dstDriver === driver) {
51
55
  return driver.protocol;
52
56
  }
53
57
 
54
- return dstDriver ? dstDriver.protocol : _sessionsCache.default.getProtocol(sessionId);
58
+ return (_dstDriver$protocol = dstDriver === null || dstDriver === void 0 ? void 0 : dstDriver.protocol) !== null && _dstDriver$protocol !== void 0 ? _dstDriver$protocol : _constants.PROTOCOLS.W3C;
55
59
  }
56
60
 
57
61
  function isSessionCommand(command) {
58
62
  return !_lodash.default.includes(_routes.NO_SESSION_ID_COMMANDS, command);
59
63
  }
60
64
 
65
+ function getLogger(driver, sessionId = null) {
66
+ var _driver$driverForSess, _dstDriver$log;
67
+
68
+ const dstDriver = sessionId && _lodash.default.isFunction(driver.driverForSession) ? (_driver$driverForSess = driver.driverForSession(sessionId)) !== null && _driver$driverForSess !== void 0 ? _driver$driverForSess : driver : driver;
69
+
70
+ if (_lodash.default.isFunction((_dstDriver$log = dstDriver.log) === null || _dstDriver$log === void 0 ? void 0 : _dstDriver$log.info)) {
71
+ return dstDriver.log;
72
+ }
73
+
74
+ let logPrefix = dstDriver.constructor ? `${dstDriver.constructor.name}@${_support.node.getObjectId(dstDriver).substring(0, 8)}` : 'AppiumDriver';
75
+
76
+ if (sessionId) {
77
+ logPrefix += ` (${sessionId.substring(0, 8)})`;
78
+ }
79
+
80
+ return _support.logger.getLogger(logPrefix);
81
+ }
82
+
61
83
  function wrapParams(paramSets, jsonObj) {
62
84
  let res = jsonObj;
63
85
 
@@ -164,11 +186,11 @@ function makeArgs(requestParams, jsonObj, payloadParams, protocol) {
164
186
 
165
187
  function routeConfiguringFunction(driver) {
166
188
  if (!driver.sessionExists) {
167
- throw new Error('Drivers used with MJSONWP must implement `sessionExists`');
189
+ throw new Error('Drivers must implement `sessionExists` property');
168
190
  }
169
191
 
170
192
  if (!(driver.executeCommand || driver.execute)) {
171
- throw new Error('Drivers used with MJSONWP must implement `executeCommand` or `execute`');
193
+ throw new Error('Drivers must implement `executeCommand` or `execute` method');
172
194
  }
173
195
 
174
196
  return function addRoutes(app, {
@@ -209,8 +231,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
209
231
  return;
210
232
  }
211
233
 
212
- _sessionsCache.default.getLogger(req.params.sessionId, currentProtocol).debug(`Would have proxied ` + `command directly, but a plugin exists which might require its value, so will let ` + `its value be collected internally and made part of plugin chain`);
213
-
234
+ getLogger(driver, req.params.sessionId).debug(`Would have proxied ` + `command directly, but a plugin exists which might require its value, so will let ` + `its value be collected internally and made part of plugin chain`);
214
235
  didPluginOverrideProxy = true;
215
236
  }
216
237
 
@@ -227,7 +248,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
227
248
  }
228
249
 
229
250
  if (spec.command === CREATE_SESSION_COMMAND) {
230
- currentProtocol = determineProtocol(...makeArgs(req.params, jsonObj, spec.payloadParams || {}));
251
+ currentProtocol = determineProtocol(makeArgs(req.params, jsonObj, spec.payloadParams || {}));
231
252
  }
232
253
 
233
254
  checkParams(spec.payloadParams, jsonObj, currentProtocol);
@@ -238,7 +259,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
238
259
  _validators.validators[spec.command](...args);
239
260
  }
240
261
 
241
- _sessionsCache.default.getLogger(req.params.sessionId, currentProtocol).debug(`Calling ` + `${driver.constructor.name}.${spec.command}() with args: ` + _lodash.default.truncate(JSON.stringify(args), {
262
+ getLogger(driver, req.params.sessionId).debug(`Calling ` + `${driver.constructor.name}.${spec.command}() with args: ` + _lodash.default.truncate(JSON.stringify(args), {
242
263
  length: _constants.MAX_LOG_BODY_LENGTH
243
264
  }));
244
265
 
@@ -263,10 +284,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
263
284
 
264
285
  if (spec.command === CREATE_SESSION_COMMAND) {
265
286
  newSessionId = driverRes[0];
266
-
267
- _sessionsCache.default.putSession(newSessionId, currentProtocol);
268
-
269
- _sessionsCache.default.getLogger(newSessionId, currentProtocol).debug(`Cached the protocol value '${currentProtocol}' for the new session ${newSessionId}`);
287
+ getLogger(driver, newSessionId).debug(`Cached the protocol value '${currentProtocol}' for the new session ${newSessionId}`);
270
288
 
271
289
  if (currentProtocol === _constants.PROTOCOLS.MJSONWP) {
272
290
  driverRes = driverRes[1];
@@ -280,12 +298,10 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
280
298
  driverRes = (0, _helpers.formatResponseValue)(driverRes);
281
299
 
282
300
  if (spec.command === DELETE_SESSION_COMMAND) {
283
- _sessionsCache.default.getLogger(req.params.sessionId, currentProtocol).debug(`Received response: ${_lodash.default.truncate(JSON.stringify(driverRes), {
301
+ getLogger(driver, req.params.sessionId).debug(`Received response: ${_lodash.default.truncate(JSON.stringify(driverRes), {
284
302
  length: _constants.MAX_LOG_BODY_LENGTH
285
303
  })}`);
286
-
287
- _sessionsCache.default.getLogger(req.params.sessionId, currentProtocol).debug('But deleting session, so not returning');
288
-
304
+ getLogger(driver, req.params.sessionId).debug('But deleting session, so not returning');
289
305
  driverRes = null;
290
306
  }
291
307
 
@@ -298,14 +314,9 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
298
314
  }
299
315
 
300
316
  httpResBody.value = driverRes;
301
-
302
- _sessionsCache.default.getLogger(req.params.sessionId || newSessionId, currentProtocol).debug(`Responding ` + `to client with driver.${spec.command}() result: ${_lodash.default.truncate(JSON.stringify(driverRes), {
317
+ getLogger(driver, req.params.sessionId || newSessionId).debug(`Responding ` + `to client with driver.${spec.command}() result: ${_lodash.default.truncate(JSON.stringify(driverRes), {
303
318
  length: _constants.MAX_LOG_BODY_LENGTH
304
319
  })}`);
305
-
306
- if (spec.command === DELETE_SESSION_COMMAND) {
307
- _sessionsCache.default.resetLogger(req.params.sessionId);
308
- }
309
320
  } catch (err) {
310
321
  let actualErr = err;
311
322
  currentProtocol = currentProtocol || extractProtocol(driver, req.params.sessionId || newSessionId);
@@ -318,21 +329,10 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
318
329
  if ((0, _errors.isErrorType)(err, _errors.errors.ProxyRequestError)) {
319
330
  actualErr = err.getActualError();
320
331
  } else {
321
- _sessionsCache.default.getLogger(req.params.sessionId || newSessionId, currentProtocol).debug(`Encountered internal error running command: ${errMsg}`);
332
+ getLogger(driver, req.params.sessionId || newSessionId).debug(`Encountered internal error running command: ${errMsg}`);
322
333
  }
323
334
 
324
- if (currentProtocol === _constants.PROTOCOLS.W3C) {
325
- [httpStatus, httpResBody] = (0, _errors.getResponseForW3CError)(actualErr);
326
- } else if (currentProtocol === _constants.PROTOCOLS.MJSONWP) {
327
- [httpStatus, httpResBody] = (0, _errors.getResponseForJsonwpError)(actualErr);
328
- } else {
329
- let jsonwpRes = (0, _errors.getResponseForJsonwpError)(actualErr);
330
- let w3cRes = (0, _errors.getResponseForW3CError)(actualErr);
331
- httpResBody = { ...jsonwpRes[1],
332
- ...w3cRes[1]
333
- };
334
- httpStatus = jsonwpRes[0];
335
- }
335
+ [httpStatus, httpResBody] = (0, _errors.getResponseForW3CError)(actualErr);
336
336
  }
337
337
 
338
338
  if (_lodash.default.isString(httpResBody)) {
@@ -352,7 +352,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
352
352
  delete httpResBody.sessionId;
353
353
  }
354
354
 
355
- httpResBody = (0, _helpers.formatStatus)(httpResBody, httpStatus, currentProtocol);
355
+ httpResBody = (0, _helpers.formatStatus)(httpResBody);
356
356
  res.status(httpStatus).json(httpResBody);
357
357
  }
358
358
  };
@@ -367,7 +367,7 @@ function driverShouldDoJwpProxy(driver, req, command) {
367
367
  return false;
368
368
  }
369
369
 
370
- if (command === 'deleteSession') {
370
+ if (command === DELETE_SESSION_COMMAND) {
371
371
  return false;
372
372
  }
373
373
 
@@ -379,15 +379,14 @@ function driverShouldDoJwpProxy(driver, req, command) {
379
379
  }
380
380
 
381
381
  async function doJwpProxy(driver, req, res) {
382
- _sessionsCache.default.getLogger(req.params.sessionId, extractProtocol(driver, req.params.sessionId)).info('Driver proxy active, passing request on via HTTP proxy');
382
+ getLogger(driver, req.params.sessionId).info('Driver proxy active, passing request on via HTTP proxy');
383
383
 
384
384
  if (!driver.canProxy(req.params.sessionId)) {
385
- throw new Error('Trying to proxy to a JSONWP server but driver is unable to proxy');
385
+ throw new Error('Trying to proxy to a server but the driver is unable to proxy');
386
386
  }
387
387
 
388
388
  try {
389
- const proxiedRes = await driver.executeCommand('proxyReqRes', req, res, req.params.sessionId);
390
- if (proxiedRes && proxiedRes.error) throw proxiedRes.error;
389
+ await driver.executeCommand('proxyReqRes', req, res, req.params.sessionId);
391
390
  } catch (err) {
392
391
  if ((0, _errors.isErrorType)(err, _errors.errors.ProxyRequestError)) {
393
392
  throw err;
@@ -398,4 +397,4 @@ async function doJwpProxy(driver, req, res) {
398
397
  }require('source-map-support').install();
399
398
 
400
399
 
401
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIlByb3RvY29sIiwiZGV0ZXJtaW5lUHJvdG9jb2wiLCJkZXNpcmVkQ2FwYWJpbGl0aWVzIiwicmVxdWlyZWRDYXBhYmlsaXRpZXMiLCJjYXBhYmlsaXRpZXMiLCJfIiwiaXNQbGFpbk9iamVjdCIsIlBST1RPQ09MUyIsIlczQyIsIk1KU09OV1AiLCJleHRyYWN0UHJvdG9jb2wiLCJkcml2ZXIiLCJzZXNzaW9uSWQiLCJkc3REcml2ZXIiLCJpc0Z1bmN0aW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsInByb3RvY29sIiwiU0VTU0lPTlNfQ0FDSEUiLCJnZXRQcm90b2NvbCIsImlzU2Vzc2lvbkNvbW1hbmQiLCJjb21tYW5kIiwiaW5jbHVkZXMiLCJOT19TRVNTSU9OX0lEX0NPTU1BTkRTIiwid3JhcFBhcmFtcyIsInBhcmFtU2V0cyIsImpzb25PYmoiLCJyZXMiLCJpc0FycmF5IiwiaXNPYmplY3QiLCJ3cmFwIiwidW53cmFwUGFyYW1zIiwidW53cmFwIiwiY2hlY2tQYXJhbXMiLCJyZXF1aXJlZFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwicmVjZWl2ZWRQYXJhbXMiLCJrZXlzIiwicmVxdWlyZWQiLCJmaXJzdCIsIm9wdGlvbmFsIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiZXJyb3JzIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJwYXJhbXMiLCJkaWZmZXJlbmNlIiwibWFrZUFyZ3MiLCJyZXF1ZXN0UGFyYW1zIiwicGF5bG9hZFBhcmFtcyIsInVybFBhcmFtcyIsInJldmVyc2UiLCJ3aXRob3V0IiwiYXJncyIsImZsYXR0ZW4iLCJtYXAiLCJwIiwiY29uY2F0IiwidSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlc3Npb25FeGlzdHMiLCJFcnJvciIsImV4ZWN1dGVDb21tYW5kIiwiZXhlY3V0ZSIsImFkZFJvdXRlcyIsImFwcCIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsImFsbE1ldGhvZHMiLCJNRVRIT0RfTUFQIiwicGF0aCIsIm1ldGhvZHMiLCJ0b1BhaXJzIiwibWV0aG9kIiwic3BlYyIsImJ1aWxkSGFuZGxlciIsImlzU2Vzc0NtZCIsImFzeW5jSGFuZGxlciIsInJlcSIsImJvZHkiLCJodHRwUmVzQm9keSIsImh0dHBTdGF0dXMiLCJuZXdTZXNzaW9uSWQiLCJjdXJyZW50UHJvdG9jb2wiLCJOb1N1Y2hEcml2ZXJFcnJvciIsImRpZFBsdWdpbk92ZXJyaWRlUHJveHkiLCJuZXZlclByb3h5IiwiZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImRvSndwUHJveHkiLCJnZXRMb2dnZXIiLCJkZWJ1ZyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJkcml2ZXJSZXMiLCJ2YWxpZGF0b3JzIiwiY29uc3RydWN0b3IiLCJuYW1lIiwidHJ1bmNhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiTUFYX0xPR19CT0RZX0xFTkdUSCIsInJlcUZvclByb3h5IiwiaGFzIiwiZXJyb3IiLCJ2YWx1ZSIsInB1dFNlc3Npb24iLCJ1dGlsIiwiaGFzVmFsdWUiLCJzdGF0dXMiLCJpc05hTiIsInBhcnNlSW50Iiwic3RhY2t0cmFjZSIsInJlc2V0TG9nZ2VyIiwiZXJyIiwiYWN0dWFsRXJyIiwiZXJyTXNnIiwic3RhY2siLCJQcm94eVJlcXVlc3RFcnJvciIsImdldEFjdHVhbEVycm9yIiwianNvbndwUmVzIiwidzNjUmVzIiwiaXNTdHJpbmciLCJzZW5kIiwianNvbiIsInRvTG93ZXJDYXNlIiwiQiIsInJlc29sdmUiLCJkb25lIiwicHJveHlBY3RpdmUiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwib3JpZ2luYWxVcmwiLCJpbmZvIiwiY2FuUHJveHkiLCJwcm94aWVkUmVzIl0sIm1hcHBpbmdz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SUFBSW1ELEtBQUosQ0FBVSxrRUFBVixDQUFOO0FBQ0Q7O0FBQ0QsTUFBSTtBQUNGLFVBQU15RSxVQUFVLEdBQUcsTUFBTTdILE1BQU0sQ0FBQ3FELGNBQVAsQ0FBc0IsYUFBdEIsRUFBcUNpQixHQUFyQyxFQUEwQ3ZELEdBQTFDLEVBQStDdUQsR0FBRyxDQUFDbEMsTUFBSixDQUFXbkMsU0FBMUQsQ0FBekI7QUFDQSxRQUFJNEgsVUFBVSxJQUFJQSxVQUFVLENBQUM5QixLQUE3QixFQUFvQyxNQUFNOEIsVUFBVSxDQUFDOUIsS0FBakI7QUFDckMsR0FIRCxDQUdFLE9BQU9VLEdBQVAsRUFBWTtBQUNaLFFBQUkseUJBQVlBLEdBQVosRUFBaUIxRSxlQUFPOEUsaUJBQXhCLENBQUosRUFBZ0Q7QUFDOUMsWUFBTUosR0FBTjtBQUNELEtBRkQsTUFFTztBQUNMLFlBQU0sSUFBSXJELEtBQUosQ0FBVyxpQ0FBZ0NxRCxHQUFHLENBQUMzRSxPQUFRLEVBQXZELENBQU47QUFDRDtBQUNGO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyB2YWxpZGF0b3JzIH0gZnJvbSAnLi92YWxpZGF0b3JzJztcbmltcG9ydCB7XG4gIGVycm9ycywgaXNFcnJvclR5cGUsIGdldFJlc3BvbnNlRm9yVzNDRXJyb3IsIGdldFJlc3BvbnNlRm9ySnNvbndwRXJyb3IsXG4gIGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlLCBlcnJvckZyb21XM0NKc29uQ29kZSxcbn0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgTUVUSE9EX01BUCwgTk9fU0VTU0lPTl9JRF9DT01NQU5EUyB9IGZyb20gJy4vcm91dGVzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7XG4gIGZvcm1hdFJlc3BvbnNlVmFsdWUsIGZvcm1hdFN0YXR1cyxcbn0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IE1BWF9MT0dfQk9EWV9MRU5HVEgsIFBST1RPQ09MUywgREVGQVVMVF9CQVNFX1BBVEggfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IFNFU1NJT05TX0NBQ0hFIGZyb20gJy4vc2Vzc2lvbnMtY2FjaGUnO1xuXG5cbmNvbnN0IENSRUFURV9TRVNTSU9OX0NPTU1BTkQgPSAnY3JlYXRlU2Vzc2lvbic7XG5jb25zdCBERUxFVEVfU0VTU0lPTl9DT01NQU5EID0gJ2RlbGV0ZVNlc3Npb24nO1xuXG5jbGFzcyBQcm90b2NvbCB7fVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVQcm90b2NvbCAoZGVzaXJlZENhcGFiaWxpdGllcywgcmVxdWlyZWRDYXBhYmlsaXRpZXMsIGNhcGFiaWxpdGllcykge1xuICByZXR1cm4gXy5pc1BsYWluT2JqZWN0KGNhcGFiaWxpdGllcykgP1xuICAgIFBST1RPQ09MUy5XM0MgOlxuICAgIFBST1RPQ09MUy5NSlNPTldQO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UHJvdG9jb2wgKGRyaXZlciwgc2Vzc2lvbklkID0gbnVsbCkge1xuICBjb25zdCBkc3REcml2ZXIgPSBfLmlzRnVuY3Rpb24oZHJpdmVyLmRyaXZlckZvclNlc3Npb24pXG4gICAgPyBkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbihzZXNzaW9uSWQpXG4gICAgOiBkcml2ZXI7XG4gIGlmIChkc3REcml2ZXIgPT09IGRyaXZlcikge1xuICAgIC8vIFNob3J0Y2lyY3VpdCBpZiB0aGUgZHJpdmVyIGluc3RhbmNlIGlzIG5vdCBhbiB1bWJyZWxsYSBkcml2ZXJcbiAgICAvLyBvciBpdCBpcyBGYWtlIGRyaXZlciBpbnN0YW5jZSwgd2hlcmUgYGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uYFxuICAgIC8vIGFsd2F5cyByZXR1cm5zIHNlbGYgaW5zdGFuY2VcbiAgICByZXR1cm4gZHJpdmVyLnByb3RvY29sO1xuICB9XG5cbiAgLy8gRXh0cmFjdCB0aGUgcHJvdG9jb2wgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24gaWYgdGhlIGdpdmVuIGRyaXZlciBpcyB0aGUgdW1icmVsbGEgb25lXG4gIHJldHVybiBkc3REcml2ZXIgPyBkc3REcml2ZXIucHJvdG9jb2wgOiBTRVNTSU9OU19DQUNIRS5nZXRQcm90b2NvbChzZXNzaW9uSWQpO1xufVxuXG5mdW5jdGlvbiBpc1Nlc3Npb25Db21tYW5kIChjb21tYW5kKSB7XG4gIHJldHVybiAhXy5pbmNsdWRlcyhOT19TRVNTSU9OX0lEX0NPTU1BTkRTLCBjb21tYW5kKTtcbn1cblxuZnVuY3Rpb24gd3JhcFBhcmFtcyAocGFyYW1TZXRzLCBqc29uT2JqKSB7XG4gIC8qIFRoZXJlIGFyZSBjb21tYW5kcyBsaWtlIHBlcmZvcm1Ub3VjaCB3aGljaCB0YWtlIGEgc2luZ2xlIHBhcmFtZXRlciAocHJpbWl0aXZlIHR5cGUgb3IgYXJyYXkpLlxuICAgKiBTb21lIGRyaXZlcnMgY2hvb3NlIHRvIHBhc3MgdGhpcyBwYXJhbWV0ZXIgYXMgYSB2YWx1ZSAoZWcuIFthY3Rpb24xLCBhY3Rpb24yLi4uXSkgd2hpbGUgb3RoZXJzIHRvXG4gICAqIHdyYXAgaXQgd2l0aGluIGFuIG9iamVjdChlZycge2dlc3R1cmU6ICBbYWN0aW9uMSwgYWN0aW9uMi4uLl19KSwgd2hpY2ggbWFrZXMgaXQgaGFyZCB0byB2YWxpZGF0ZS5cbiAgICogVGhlIHdyYXAgb3B0aW9uIGluIHRoZSBzcGVjIGVuZm9yY2Ugd3JhcHBpbmcgYmVmb3JlIHZhbGlkYXRpb24sIHNvIHRoYXQgYWxsIHBhcmFtcyBhcmUgd3JhcHBlZCBhdFxuICAgKiB0aGUgdGltZSB0aGV5IGFyZSB2YWxpZGF0ZWQgYW5kIGxhdGVyIHBhc3NlZCB0byB0aGUgY29tbWFuZHMuXG4gICAqL1xuICBsZXQgcmVzID0ganNvbk9iajtcbiAgaWYgKF8uaXNBcnJheShqc29uT2JqKSB8fCAhXy5pc09iamVjdChqc29uT2JqKSkge1xuICAgIHJlcyA9IHt9O1xuICAgIHJlc1twYXJhbVNldHMud3JhcF0gPSBqc29uT2JqO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIHVud3JhcFBhcmFtcyAocGFyYW1TZXRzLCBqc29uT2JqKSB7XG4gIC8qIFRoZXJlIGFyZSBjb21tYW5kcyBsaWtlIHNldE5ldHdvcmtDb25uZWN0aW9uIHdoaWNoIHNlbmQgcGFyYW1ldGVycyB3cmFwcGVkIGluc2lkZSBhIGtleSBzdWNoIGFzXG4gICAqIFwicGFyYW1ldGVyc1wiLiBUaGlzIGZ1bmN0aW9uIHVud3JhcHMgdGhlbSAoZWcuIHtcInBhcmFtZXRlcnNcIjoge1widHlwZVwiOiAxfX0gYmVjb21lcyB7XCJ0eXBlXCI6IDF9KS5cbiAgICovXG4gIGxldCByZXMgPSBqc29uT2JqO1xuICBpZiAoXy5pc09iamVjdChqc29uT2JqKSkge1xuICAgIC8vIHNvbWUgY2xpZW50cywgbGlrZSBydWJ5LCBkb24ndCB3cmFwXG4gICAgaWYgKGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF0pIHtcbiAgICAgIHJlcyA9IGpzb25PYmpbcGFyYW1TZXRzLnVud3JhcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGNoZWNrUGFyYW1zIChwYXJhbVNldHMsIGpzb25PYmosIHByb3RvY29sKSB7XG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IFtdO1xuICBsZXQgb3B0aW9uYWxQYXJhbXMgPSBbXTtcbiAgbGV0IHJlY2VpdmVkUGFyYW1zID0gXy5rZXlzKGpzb25PYmopO1xuXG4gIGlmIChwYXJhbVNldHMpIHtcbiAgICBpZiAocGFyYW1TZXRzLnJlcXVpcmVkKSB7XG4gICAgICAvLyB3ZSBtaWdodCBoYXZlIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMsXG4gICAgICAvLyBvciBhbiBhcnJheSBvZiBhcnJheXMgb2YgcGFyYW1ldGVycywgc28gc3RhbmRhcmRpemVcbiAgICAgIGlmICghXy5pc0FycmF5KF8uZmlyc3QocGFyYW1TZXRzLnJlcXVpcmVkKSkpIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBbcGFyYW1TZXRzLnJlcXVpcmVkXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1TZXRzLnJlcXVpcmVkO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBqdXN0IGFuIGFycmF5XG4gICAgaWYgKHBhcmFtU2V0cy5vcHRpb25hbCkge1xuICAgICAgb3B0aW9uYWxQYXJhbXMgPSBwYXJhbVNldHMub3B0aW9uYWw7XG4gICAgfVxuXG4gICAgLy8gSWYgYSBmdW5jdGlvbiB3YXMgcHJvdmlkZWQgYXMgdGhlICd2YWxpZGF0ZScga2V5LCBpdCB3aWxsIGhlcmUgYmUgY2FsbGVkIHdpdGhcbiAgICAvLyBqc29uT2JqIGFzIHRoZSBwYXJhbS4gSWYgaXQgcmV0dXJucyBzb21ldGhpbmcgZmFsc3ksIHZlcmlmaWNhdGlvbiB3aWxsIGJlXG4gICAgLy8gY29uc2lkZXJlZCB0byBoYXZlIHBhc3NlZC4gSWYgaXQgcmV0dXJucyBzb21ldGhpbmcgZWxzZSwgdGhhdCB3aWxsIGJlIHRoZVxuICAgIC8vIGFyZ3VtZW50IHRvIGFuIGVycm9yIHdoaWNoIGlzIHRocm93biB0byB0aGUgdXNlclxuICAgIGlmIChwYXJhbVNldHMudmFsaWRhdGUpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gcGFyYW1TZXRzLnZhbGlkYXRlKGpzb25PYmosIHByb3RvY29sKTtcbiAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKG1lc3NhZ2UsIGpzb25PYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHdlIGhhdmUgbm8gcmVxdWlyZWQgcGFyYW1ldGVycywgYWxsIGlzIHdlbGxcbiAgaWYgKHJlcXVpcmVkUGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHNvbWUgY2xpZW50cyBwYXNzIGluIHRoZSBzZXNzaW9uIGlkIGluIHRoZSBwYXJhbXNcbiAgaWYgKG9wdGlvbmFsUGFyYW1zLmluZGV4T2YoJ3Nlc3Npb25JZCcpID09PSAtMSkge1xuICAgIG9wdGlvbmFsUGFyYW1zLnB1c2goJ3Nlc3Npb25JZCcpO1xuICB9XG5cbiAgLy8gc29tZSBjbGllbnRzIHBhc3MgaW4gYW4gZWxlbWVudCBpZCBpbiB0aGUgcGFyYW1zXG4gIGlmIChvcHRpb25hbFBhcmFtcy5pbmRleE9mKCdpZCcpID09PSAtMSkge1xuICAgIG9wdGlvbmFsUGFyYW1zLnB1c2goJ2lkJyk7XG4gIH1cblxuICAvLyBnbyB0aHJvdWdoIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzIGFuZCBjaGVjayBhZ2FpbnN0IG91ciBhcmd1bWVudHNcbiAgZm9yIChsZXQgcGFyYW1zIG9mIHJlcXVpcmVkUGFyYW1zKSB7XG4gICAgaWYgKF8uZGlmZmVyZW5jZShyZWNlaXZlZFBhcmFtcywgcGFyYW1zLCBvcHRpb25hbFBhcmFtcykubGVuZ3RoID09PSAwICYmXG4gICAgICAgIF8uZGlmZmVyZW5jZShwYXJhbXMsIHJlY2VpdmVkUGFyYW1zKS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIHdlIGhhdmUgYSBzZXQgb2YgcGFyYW1ldGVycyB0aGF0IGlzIGNvcnJlY3RcbiAgICAgIC8vIHNvIHNob3J0LWNpcmN1aXRcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IGVycm9ycy5CYWRQYXJhbWV0ZXJzRXJyb3IocGFyYW1TZXRzLCByZWNlaXZlZFBhcmFtcyk7XG59XG5cbi8qXG4gKiBUaGlzIG1ldGhvZCB0YWtlcyAzIHBpZWNlcyBvZiBkYXRhOiByZXF1ZXN0IHBhcmFtZXRlcnMgKCdyZXF1ZXN0UGFyYW1zJyksXG4gKiBhIHJlcXVlc3QgSlNPTiBib2R5ICgnanNvbk9iaicpLCBhbmQgJ3BheWxvYWRQYXJhbXMnLCB3aGljaCBpcyB0aGUgc2VjdGlvblxuICogZnJvbSB0aGUgcm91dGUgZGVmaW5pdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGVuZHBvaW50IHdoaWNoIGhhcyBpbnN0cnVjdGlvbnNcbiAqIG9uIGhhbmRsaW5nIHBhcmFtZXRlcnMuIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgb2YgYXJndW1lbnRzIHdoaWNoIHdpbGxcbiAqIGJlIGFwcGxpZWQgdG8gYSBjb21tYW5kLlxuICovXG5mdW5jdGlvbiBtYWtlQXJncyAocmVxdWVzdFBhcmFtcywganNvbk9iaiwgcGF5bG9hZFBhcmFtcywgcHJvdG9jb2wpIHtcbiAgLy8gV2Ugd2FudCB0byBwYXNzIHRoZSBcInVybFwiIHBhcmFtZXRlcnMgdG8gdGhlIGNvbW1hbmRzIGluIHJldmVyc2Ugb3JkZXJcbiAgLy8gc2luY2UgdGhlIGNvbW1hbmQgd2lsbCBzb21ldGltZXMgd2FudCB0byBpZ25vcmUsIHNheSwgdGhlIHNlc3Npb25JZC5cbiAgLy8gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBwdXR0aW5nIHNlc3Npb25JZCBsYXN0LCB3aGljaCBtZWFucyBpbiBKUyB3ZSBjYW5cbiAgLy8gb21pdCBpdCBmcm9tIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgaWYgd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdC5cbiAgbGV0IHVybFBhcmFtcyA9IF8ua2V5cyhyZXF1ZXN0UGFyYW1zKS5yZXZlcnNlKCk7XG5cbiAgLy8gSW4gdGhlIHNpbXBsZSBjYXNlLCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUgYSBiYXNpYyBhcnJheSBpblxuICAvLyBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkLCBzbyBzdGFydCB0aGVyZS4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZXJlIGFyZVxuICAvLyBtdWx0aXBsZSBvcHRpb25hbCBzZXRzIG9mIHJlcXVpcmVkIHBhcmFtcywgdGhvdWdoLCBzbyBoYW5kbGUgdGhhdCBjYXNlXG4gIC8vIHRvby5cbiAgbGV0IHJlcXVpcmVkUGFyYW1zID0gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZDtcbiAgaWYgKF8uaXNBcnJheShfLmZpcnN0KHBheWxvYWRQYXJhbXMucmVxdWlyZWQpKSkge1xuICAgIC8vIElmIHRoZXJlIGFyZSBvcHRpb25hbCBzZXRzIG9mIHJlcXVpcmVkIHBhcmFtcywgdGhlbiB3ZSB3aWxsIGhhdmUgYW5cbiAgICAvLyBhcnJheSBvZiBhcnJheXMgaW4gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gbG9vcCB0aHJvdWdoIGVhY2ggc2V0IGFuZFxuICAgIC8vIHBpY2sgdGhlIG9uZSB0aGF0IG1hdGNoZXMgd2hpY2ggSlNPTiBwYXJhbXMgd2VyZSBhY3R1YWxseSBzZW50LiBXZSd2ZVxuICAgIC8vIGFscmVhZHkgYmVlbiB0aHJvdWdoIHZhbGlkYXRpb24gc28gd2UncmUgZ3VhcmFudGVlZCB0byBmaW5kIGEgbWF0Y2guXG4gICAgbGV0IGtleXMgPSBfLmtleXMoanNvbk9iaik7XG4gICAgZm9yIChsZXQgcGFyYW1zIG9mIHBheWxvYWRQYXJhbXMucmVxdWlyZWQpIHtcbiAgICAgIGlmIChfLndpdGhvdXQocGFyYW1zLCAuLi5rZXlzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBwYXJhbXM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB3ZSBjb25zdHJ1Y3Qgb3VyIGxpc3Qgb2YgYXJndW1lbnRzIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kXG4gIGxldCBhcmdzO1xuICBpZiAoXy5pc0Z1bmN0aW9uKHBheWxvYWRQYXJhbXMubWFrZUFyZ3MpKSB7XG4gICAgLy8gSW4gdGhlIHJvdXRlIHNwZWMsIGEgcGFydGljdWxhciByb3V0ZSBtaWdodCBkZWZpbmUgYSAnbWFrZUFyZ3MnIGZ1bmN0aW9uXG4gICAgLy8gaWYgaXQgd2FudHMgZnVsbCBjb250cm9sIG92ZXIgaG93IHRvIHR1cm4gSlNPTiBwYXJhbWV0ZXJzIGludG8gY29tbWFuZFxuICAgIC8vIGFyZ3VtZW50cy4gU28gd2UgcGFzcyBpdCB0aGUgSlNPTiBwYXJhbWV0ZXJzIGFuZCBpdCByZXR1cm5zIGFuIGFycmF5XG4gICAgLy8gd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBoYW5kbGluZyBjb21tYW5kLiBGb3IgZXhhbXBsZSBpZiBpdCByZXR1cm5zXG4gICAgLy8gWzEsIDIsIDNdLCB3ZSB3aWxsIGNhbGwgYGNvbW1hbmQoMSwgMiwgMywgLi4uKWAgKHVybCBwYXJhbXMgYXJlIHNlcGFyYXRlXG4gICAgLy8gZnJvbSBKU09OIHBhcmFtcyBhbmQgZ2V0IGNvbmNhdGVuYXRlZCBiZWxvdykuXG4gICAgYXJncyA9IHBheWxvYWRQYXJhbXMubWFrZUFyZ3MoanNvbk9iaiwgcHJvdG9jb2wpO1xuICB9IGVsc2Uge1xuICAgIC8vIE90aGVyd2lzZSwgY29sbGVjdCBhbGwgdGhlIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBwYXJhbXMgYW5kIGZsYXR0ZW4gdGhlbVxuICAgIC8vIGludG8gYW4gYXJndW1lbnQgYXJyYXlcbiAgICBhcmdzID0gXy5mbGF0dGVuKHJlcXVpcmVkUGFyYW1zKS5tYXAoKHApID0+IGpzb25PYmpbcF0pO1xuICAgIGlmIChwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKSB7XG4gICAgICBhcmdzID0gYXJncy5jb25jYXQoXy5mbGF0dGVuKHBheWxvYWRQYXJhbXMub3B0aW9uYWwpLm1hcCgocCkgPT4ganNvbk9ialtwXSkpO1xuICAgIH1cbiAgfVxuICAvLyBGaW5hbGx5LCBnZXQgb3VyIHVybCBwYXJhbXMgKHNlc3Npb24gaWQsIGVsZW1lbnQgaWQsIGV0Yy4uLikgb24gdGhlIGVuZCBvZlxuICAvLyB0aGUgbGlzdFxuICBhcmdzID0gYXJncy5jb25jYXQodXJsUGFyYW1zLm1hcCgodSkgPT4gcmVxdWVzdFBhcmFtc1t1XSkpO1xuICByZXR1cm4gYXJncztcbn1cblxuZnVuY3Rpb24gcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIChkcml2ZXIpIHtcbiAgaWYgKCFkcml2ZXIuc2Vzc2lvbkV4aXN0cykge1xuICAgIHRocm93IG5ldyBFcnJvcignRHJpdmVycyB1c2VkIHdpdGggTUpTT05XUCBtdXN0IGltcGxlbWVudCBgc2Vzc2lvbkV4aXN0c2AnKTtcbiAgfVxuXG4gIGlmICghKGRyaXZlci5leGVjdXRlQ29tbWFuZCB8fCBkcml2ZXIuZXhlY3V0ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgdXNlZCB3aXRoIE1KU09OV1AgbXVzdCBpbXBsZW1lbnQgYGV4ZWN1dGVDb21tYW5kYCBvciBgZXhlY3V0ZWAnKTtcbiAgfVxuXG4gIC8vIHJldHVybiBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYWRkIGFsbCB0aGUgcm91dGVzIHRvIHRoZSBkcml2ZXIuIEhlcmUgZXh0cmFNZXRob2RzIG1pZ2h0IGJlXG4gIC8vIHBhc3NlZCBpbiBhcyBkZWZpbmVkIGJ5IEFwcGl1bSBwbHVnaW5zLCBzbyB3ZSBuZWVkIHRvIGFkZCB0aG9zZSB0byB0aGUgZGVmYXVsdCBsaXN0XG4gIHJldHVybiBmdW5jdGlvbiBhZGRSb3V0ZXMgKGFwcCwge2Jhc2VQYXRoID0gREVGQVVMVF9CQVNFX1BBVEgsIGV4dHJhTWV0aG9kTWFwID0ge319KSB7XG4gICAgLy8gc3RvcmUgYmFzZVBhdGggb24gdGhlIGRyaXZlciBpbnN0YW5jZSBzbyBpdCBjYW4gdXNlIGl0IGlmIG5lY2Vzc2FyeVxuICAgIC8vIGZvciBleGFtcGxlIGluIGRldGVybWluaW5nIHByb3h5IGF2b2lkYW5jZVxuICAgIGRyaXZlci5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuXG4gICAgY29uc3QgYWxsTWV0aG9kcyA9IHsuLi5NRVRIT0RfTUFQLCAuLi5leHRyYU1ldGhvZE1hcH07XG5cbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBtZXRob2RzXSBvZiBfLnRvUGFpcnMoYWxsTWV0aG9kcykpIHtcbiAgICAgIGZvciAoY29uc3QgW21ldGhvZCwgc3BlY10gb2YgXy50b1BhaXJzKG1ldGhvZHMpKSB7XG4gICAgICAgIC8vIHNldCB1cCB0aGUgZXhwcmVzcyByb3V0ZSBoYW5kbGVyXG4gICAgICAgIGJ1aWxkSGFuZGxlcihhcHAsIG1ldGhvZCwgYCR7YmFzZVBhdGh9JHtwYXRofWAsIHNwZWMsIGRyaXZlciwgaXNTZXNzaW9uQ29tbWFuZChzcGVjLmNvbW1hbmQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSGFuZGxlciAoYXBwLCBtZXRob2QsIHBhdGgsIHNwZWMsIGRyaXZlciwgaXNTZXNzQ21kKSB7XG4gIGxldCBhc3luY0hhbmRsZXIgPSBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBsZXQganNvbk9iaiA9IHJlcS5ib2R5O1xuICAgIGxldCBodHRwUmVzQm9keSA9IHt9O1xuICAgIGxldCBodHRwU3RhdHVzID0gMjAwO1xuICAgIGxldCBuZXdTZXNzaW9uSWQ7XG4gICAgbGV0IGN1cnJlbnRQcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBpZiB0aGlzIGlzIGEgc2Vzc2lvbiBjb21tYW5kIGJ1dCB3ZSBkb24ndCBoYXZlIGEgc2Vzc2lvbixcbiAgICAgIC8vIGVycm9yIG91dCBlYXJseSAoZXNwZWNpYWxseSBiZWZvcmUgcHJveHlpbmcpXG4gICAgICBpZiAoaXNTZXNzQ21kICYmICFkcml2ZXIuc2Vzc2lvbkV4aXN0cyhyZXEucGFyYW1zLnNlc3Npb25JZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hEcml2ZXJFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgZHJpdmVyIGlzIGN1cnJlbnRseSBwcm94eWluZyBjb21tYW5kcyB0byBhbm90aGVyIEpTT05XUCBzZXJ2ZXIsIGJ5cGFzcyBhbGwgb3VyXG4gICAgICAvLyBjaGVja3MgYW5kIGFzc3VtZSB0aGUgdXBzdHJlYW0gc2VydmVyIGtub3dzIHdoYXQgaXQncyBkb2luZy4gQnV0IGtlZXAgdGhpcyBpbiB0aGVcbiAgICAgIC8vIHRyeS9jYXRjaCBibG9jayBzbyBpZiBwcm94eWluZyBpdHNlbGYgZmFpbHMsIHdlIGdpdmUgYSBtZXNzYWdlIHRvIHRoZSBjbGllbnQuIE9mIGNvdXJzZSB3ZVxuICAgICAgLy8gb25seSB3YW50IHRvIGRvIHRoZXNlIHdoZW4gd2UgaGF2ZSBhIHNlc3Npb24gY29tbWFuZDsgdGhlIEFwcGl1bSBkcml2ZXIgbXVzdCBiZVxuICAgICAgLy8gcmVzcG9uc2libGUgZm9yIHN0YXJ0L3N0b3Agc2Vzc2lvbiwgZXRjLi4uIFdlIGFsc28gYWxsb3cgdGhlIGNvbW1hbmQgc3BlYyB0byBkZWNsYXJlIHRoYXRcbiAgICAgIC8vIHRoaXMgY29tbWFuZCBzaG91bGQgbmV2ZXIgYmUgcHJveGllZCAod2hpY2ggaXMgdXNlZnVsIGZvciBwbHVnaW4gZGV2ZWxvcGVycyB3aG8gYWRkXG4gICAgICAvLyBjb21tYW5kcyBhbmQgZ2VuZXJhbGx5IHdvdWxkIG5vdCB3YW50IHRoYXQgY29tbWFuZCB0byBiZSBwcm94aWVkIGluc3RlYWQgb2YgaGFuZGxlZCBieSB0aGVcbiAgICAgIC8vIHBsdWdpbilcbiAgICAgIGxldCBkaWRQbHVnaW5PdmVycmlkZVByb3h5ID0gZmFsc2U7XG4gICAgICBpZiAoaXNTZXNzQ21kICYmICFzcGVjLm5ldmVyUHJveHkgJiYgZHJpdmVyU2hvdWxkRG9Kd3BQcm94eShkcml2ZXIsIHJlcSwgc3BlYy5jb21tYW5kKSkge1xuICAgICAgICBpZiAoIWRyaXZlci5wbHVnaW5zVG9IYW5kbGVDbWQgfHxcbiAgICAgICAgICAgIGRyaXZlci5wbHVnaW5zVG9IYW5kbGVDbWQoc3BlYy5jb21tYW5kLCByZXEucGFyYW1zLnNlc3Npb25JZCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYXdhaXQgZG9Kd3BQcm94eShkcml2ZXIsIHJlcSwgcmVzKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgU0VTU0lPTlNfQ0FDSEUuZ2V0TG9nZ2VyKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpLmRlYnVnKGBXb3VsZCBoYXZlIHByb3hpZWQgYCArXG4gICAgICAgICAgYGNvbW1hbmQgZGlyZWN0bHksIGJ1dCBhIHBsdWdpbiBleGlzdHMgd2hpY2ggbWlnaHQgcmVxdWlyZSBpdHMgdmFsdWUsIHNvIHdpbGwgbGV0IGAgK1xuICAgICAgICAgIGBpdHMgdmFsdWUgYmUgY29sbGVjdGVkIGludGVybmFsbHkgYW5kIG1hZGUgcGFydCBvZiBwbHVnaW4gY2hhaW5gKTtcbiAgICAgICAgZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIGEgY29tbWFuZCBpcyBub3QgaW4gb3VyIG1ldGhvZCBtYXAsIGl0J3MgYmVjYXVzZSB3ZVxuICAgICAgLy8gaGF2ZSBubyBwbGFucyB0byBldmVyIGltcGxlbWVudCBpdFxuICAgICAgaWYgKCFzcGVjLmNvbW1hbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIHdyYXAgcGFyYW1zIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHNwZWMucGF5bG9hZFBhcmFtcyAmJiBzcGVjLnBheWxvYWRQYXJhbXMud3JhcCkge1xuICAgICAgICBqc29uT2JqID0gd3JhcFBhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmopO1xuICAgICAgfVxuXG4gICAgICAvLyB1bndyYXAgcGFyYW1zIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHNwZWMucGF5bG9hZFBhcmFtcyAmJiBzcGVjLnBheWxvYWRQYXJhbXMudW53cmFwKSB7XG4gICAgICAgIGpzb25PYmogPSB1bndyYXBQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICAvLyB0cnkgdG8gZGV0ZXJtaW5lIHByb3RvY29sIGJ5IHNlc3Npb24gY3JlYXRpb24gYXJncywgc28gd2UgY2FuIHRocm93IGFcbiAgICAgICAgLy8gcHJvcGVybHkgZm9ybWF0dGVkIGVycm9yIGlmIGFyZ3VtZW50cyB2YWxpZGF0aW9uIGZhaWxzXG4gICAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGRldGVybWluZVByb3RvY29sKC4uLm1ha2VBcmdzKHJlcS5wYXJhbXMsIGpzb25PYmosIHNwZWMucGF5bG9hZFBhcmFtcyB8fCB7fSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUganNvbiBwYXlsb2FkIGNvbmZvcm1zIHRvIHRoZSBzcGVjXG4gICAgICBjaGVja1BhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmosIGN1cnJlbnRQcm90b2NvbCk7XG5cbiAgICAgIC8vIHR1cm4gdGhlIGNvbW1hbmQgYW5kIGpzb24gcGF5bG9hZCBpbnRvIGFuIGFyZ3VtZW50IGxpc3QgZm9yXG4gICAgICAvLyB0aGUgZHJpdmVyIG1ldGhvZHNcbiAgICAgIGxldCBhcmdzID0gbWFrZUFyZ3MocmVxLnBhcmFtcywganNvbk9iaiwgc3BlYy5wYXlsb2FkUGFyYW1zIHx8IHt9LCBjdXJyZW50UHJvdG9jb2wpO1xuICAgICAgbGV0IGRyaXZlclJlcztcbiAgICAgIC8vIHZhbGlkYXRlIGNvbW1hbmQgYXJncyBhY2NvcmRpbmcgdG8gTUpTT05XUFxuICAgICAgaWYgKHZhbGlkYXRvcnNbc3BlYy5jb21tYW5kXSkge1xuICAgICAgICB2YWxpZGF0b3JzW3NwZWMuY29tbWFuZF0oLi4uYXJncyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHJ1biB0aGUgZHJpdmVyIGNvbW1hbmQgd3JhcHBlZCBpbnNpZGUgdGhlIGFyZ3VtZW50IHZhbGlkYXRvcnNcbiAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKS5kZWJ1ZyhgQ2FsbGluZyBgICtcbiAgICAgICAgYCR7ZHJpdmVyLmNvbnN0cnVjdG9yLm5hbWV9LiR7c3BlYy5jb21tYW5kfSgpIHdpdGggYXJnczogYCArXG4gICAgICAgIF8udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoYXJncyksIHtsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEh9KSk7XG5cbiAgICAgIGlmIChkaWRQbHVnaW5PdmVycmlkZVByb3h5KSB7XG4gICAgICAgIC8vIFRPRE8gZm9yIG5vdyB3ZSBhZGQgdGhpcyBpbmZvcm1hdGlvbiBvbiB0aGUgYXJncyBsaXN0LCBidXQgdGhhdCdzIG1peGluZyBwdXJwb3NlcyBoZXJlLlxuICAgICAgICAvLyBXZSByZWFsbHkgc2hvdWxkIGFkZCBhbm90aGVyICdvcHRpb25zJyBwYXJhbWV0ZXIgdG8gJ2V4ZWN1dGVDb21tYW5kJywgYnV0IHRoaXMgd291bGQgYmVcbiAgICAgICAgLy8gYSBicmVha2luZyBjaGFuZ2UgZm9yIGFsbCBkcml2ZXJzIHNvIHdvdWxkIG5lZWQgdG8gYmUgaGFuZGxlZCBjYXJlZnVsbHkuXG4gICAgICAgIGFyZ3MucHVzaCh7cmVxRm9yUHJveHk6IHJlcX0pO1xuICAgICAgfVxuXG4gICAgICBkcml2ZXJSZXMgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoc3BlYy5jb21tYW5kLCAuLi5hcmdzKTtcblxuICAgICAgLy8gR2V0IHRoZSBwcm90b2NvbCBhZnRlciBleGVjdXRlQ29tbWFuZFxuICAgICAgY3VycmVudFByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpIHx8IGN1cnJlbnRQcm90b2NvbDtcblxuICAgICAgLy8gSWYgYGV4ZWN1dGVDb21tYW5kYCB3YXMgb3ZlcnJpZGRlbiBhbmQgdGhlIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdFxuICAgICAgLy8gd2l0aCBhIHByb3RvY29sIGFuZCB2YWx1ZS9lcnJvciBwcm9wZXJ0eSwgcmUtYXNzaWduIHRoZSBwcm90b2NvbFxuICAgICAgaWYgKF8uaXNQbGFpbk9iamVjdChkcml2ZXJSZXMpICYmIF8uaGFzKGRyaXZlclJlcywgJ3Byb3RvY29sJykpIHtcbiAgICAgICAgY3VycmVudFByb3RvY29sID0gZHJpdmVyUmVzLnByb3RvY29sIHx8IGN1cnJlbnRQcm90b2NvbDtcbiAgICAgICAgaWYgKGRyaXZlclJlcy5lcnJvcikge1xuICAgICAgICAgIHRocm93IGRyaXZlclJlcy5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBkcml2ZXJSZXMgPSBkcml2ZXJSZXMudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHVucGFjayBjcmVhdGVTZXNzaW9uIHJlc3BvbnNlXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIG5ld1Nlc3Npb25JZCA9IGRyaXZlclJlc1swXTtcbiAgICAgICAgU0VTU0lPTlNfQ0FDSEUucHV0U2Vzc2lvbihuZXdTZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbCk7XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihuZXdTZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbClcbiAgICAgICAgICAuZGVidWcoYENhY2hlZCB0aGUgcHJvdG9jb2wgdmFsdWUgJyR7Y3VycmVudFByb3RvY29sfScgZm9yIHRoZSBuZXcgc2Vzc2lvbiAke25ld1Nlc3Npb25JZH1gKTtcbiAgICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLk1KU09OV1ApIHtcbiAgICAgICAgICBkcml2ZXJSZXMgPSBkcml2ZXJSZXNbMV07XG4gICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDKSB7XG4gICAgICAgICAgZHJpdmVyUmVzID0ge1xuICAgICAgICAgICAgY2FwYWJpbGl0aWVzOiBkcml2ZXJSZXNbMV0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBkcml2ZXJSZXMgPSBmb3JtYXRSZXNwb25zZVZhbHVlKGRyaXZlclJlcyk7XG5cbiAgICAgIC8vIGRlbGV0ZSBzaG91bGQgbm90IHJldHVybiBhbnl0aGluZyBldmVuIGlmIHN1Y2Nlc3NmdWxcbiAgICAgIGlmIChzcGVjLmNvbW1hbmQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgICAgU0VTU0lPTlNfQ0FDSEUuZ2V0TG9nZ2VyKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpXG4gICAgICAgICAgLmRlYnVnKGBSZWNlaXZlZCByZXNwb25zZTogJHtfLnRydW5jYXRlKEpTT04uc3RyaW5naWZ5KGRyaXZlclJlcyksIHtsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEh9KX1gKTtcbiAgICAgICAgU0VTU0lPTlNfQ0FDSEUuZ2V0TG9nZ2VyKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpLmRlYnVnKCdCdXQgZGVsZXRpbmcgc2Vzc2lvbiwgc28gbm90IHJldHVybmluZycpO1xuICAgICAgICBkcml2ZXJSZXMgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgc3RhdHVzIGlzIG5vdCAwLCAgdGhyb3cgdGhlIGFwcHJvcHJpYXRlIGVycm9yIGZvciBzdGF0dXMgY29kZS5cbiAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKGRyaXZlclJlcykpIHtcbiAgICAgICAgaWYgKHV0aWwuaGFzVmFsdWUoZHJpdmVyUmVzLnN0YXR1cykgJiYgIWlzTmFOKGRyaXZlclJlcy5zdGF0dXMpICYmIHBhcnNlSW50KGRyaXZlclJlcy5zdGF0dXMsIDEwKSAhPT0gMCkge1xuICAgICAgICAgIHRocm93IGVycm9yRnJvbU1KU09OV1BTdGF0dXNDb2RlKGRyaXZlclJlcy5zdGF0dXMsIGRyaXZlclJlcy52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXy5pc1BsYWluT2JqZWN0KGRyaXZlclJlcy52YWx1ZSkgJiYgZHJpdmVyUmVzLnZhbHVlLmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JGcm9tVzNDSnNvbkNvZGUoZHJpdmVyUmVzLnZhbHVlLmVycm9yLCBkcml2ZXJSZXMudmFsdWUubWVzc2FnZSwgZHJpdmVyUmVzLnZhbHVlLnN0YWNrdHJhY2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGh0dHBSZXNCb2R5LnZhbHVlID0gZHJpdmVyUmVzO1xuICAgICAgU0VTU0lPTlNfQ0FDSEUuZ2V0TG9nZ2VyKHJlcS5wYXJhbXMuc2Vzc2lvbklkIHx8IG5ld1Nlc3Npb25JZCwgY3VycmVudFByb3RvY29sKS5kZWJ1ZyhgUmVzcG9uZGluZyBgICtcbiAgICAgICAgYHRvIGNsaWVudCB3aXRoIGRyaXZlci4ke3NwZWMuY29tbWFuZH0oKSByZXN1bHQ6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkcml2ZXJSZXMpLCB7bGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIfSl9YCk7XG5cbiAgICAgIGlmIChzcGVjLmNvbW1hbmQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBrZWVwIHRoZSBsb2dnZXIgaW5zdGFuY2UgaW4gdGhlIGNhY2hlXG4gICAgICAgIC8vIGFmdGVyIHRoZSBzZXNzaW9uIGlzIGRlbGV0ZWQsIGJlY2F1c2UgaXQgY29udGFpbnMgdGhlIGxvZ2dpbmcgaGlzdG9yeVxuICAgICAgICAvLyBhbmQgY29uc3VtZXMgdGhlIG1lbW9yeVxuICAgICAgICBTRVNTSU9OU19DQUNIRS5yZXNldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBmaWd1cmUgb3V0IHdoYXQgb3VyIHJlc3BvbnNlIHNob3VsZCBiZVxuICAgICAgLy8gYmFzZWQgb24gdGhlIHR5cGUgb2YgZXJyb3IgdGhhdCB3ZSBlbmNvdW50ZXJlZFxuICAgICAgbGV0IGFjdHVhbEVyciA9IGVycjtcblxuICAgICAgY3VycmVudFByb3RvY29sID0gY3VycmVudFByb3RvY29sIHx8IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkIHx8IG5ld1Nlc3Npb25JZCk7XG5cbiAgICAgIGxldCBlcnJNc2cgPSBlcnIuc3RhY2t0cmFjZSB8fCBlcnIuc3RhY2s7XG4gICAgICBpZiAoIV8uaW5jbHVkZXMoZXJyTXNnLCBlcnIubWVzc2FnZSkpIHtcbiAgICAgICAgLy8gaWYgdGhlIG1lc3NhZ2UgaGFzIG1vcmUgaW5mb3JtYXRpb24sIGFkZCBpdC4gYnV0IG9mdGVuIHRoZSBtZXNzYWdlXG4gICAgICAgIC8vIGlzIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBzdGFjayB0cmFjZVxuICAgICAgICBlcnJNc2cgPSBgJHtlcnIubWVzc2FnZX0ke2Vyck1zZyA/ICgnXFxuJyArIGVyck1zZykgOiAnJ31gO1xuICAgICAgfVxuICAgICAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKSkge1xuICAgICAgICBhY3R1YWxFcnIgPSBlcnIuZ2V0QWN0dWFsRXJyb3IoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbClcbiAgICAgICAgICAuZGVidWcoYEVuY291bnRlcmVkIGludGVybmFsIGVycm9yIHJ1bm5pbmcgY29tbWFuZDogJHtlcnJNc2d9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgW2h0dHBTdGF0dXMsIGh0dHBSZXNCb2R5XSA9IGdldFJlc3BvbnNlRm9yVzNDRXJyb3IoYWN0dWFsRXJyKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuTUpTT05XUCkge1xuICAgICAgICBbaHR0cFN0YXR1cywgaHR0cFJlc0JvZHldID0gZ2V0UmVzcG9uc2VGb3JKc29ud3BFcnJvcihhY3R1YWxFcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgaXQncyB1bmtub3duIHdoYXQgdGhlIHByb3RvY29sIGlzIChsaWtlIGlmIGl0J3MgYGdldFN0YXR1c2AgcHJpb3IgdG8gYGNyZWF0ZVNlc3Npb25gKSwgbWVyZ2UgdGhlIHJlc3BvbnNlc1xuICAgICAgICAvLyB0b2dldGhlciB0byBiZSBwcm90b2NvbC1hZ25vc3RpY1xuICAgICAgICBsZXQganNvbndwUmVzID0gZ2V0UmVzcG9uc2VGb3JKc29ud3BFcnJvcihhY3R1YWxFcnIpO1xuICAgICAgICBsZXQgdzNjUmVzID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihhY3R1YWxFcnIpO1xuXG4gICAgICAgIGh0dHBSZXNCb2R5ID0ge1xuICAgICAgICAgIC4uLmpzb253cFJlc1sxXSxcbiAgICAgICAgICAuLi53M2NSZXNbMV0sXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVXNlIHRoZSBKU09OV1Agc3RhdHVzIGNvZGUgKHdoaWNoIGlzIHVzdWFsbHkgNTAwKVxuICAgICAgICBodHRwU3RhdHVzID0ganNvbndwUmVzWzBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRlY29kZSB0aGUgcmVzcG9uc2UsIHdoaWNoIGlzIGVpdGhlciBhIHN0cmluZyBvciBqc29uXG4gICAgaWYgKF8uaXNTdHJpbmcoaHR0cFJlc0JvZHkpKSB7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLnNlbmQoaHR0cFJlc0JvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV3U2Vzc2lvbklkKSB7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgICBodHRwUmVzQm9keS52YWx1ZS5zZXNzaW9uSWQgPSBuZXdTZXNzaW9uSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHR0cFJlc0JvZHkuc2Vzc2lvbklkID0gbmV3U2Vzc2lvbklkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodHRwUmVzQm9keS5zZXNzaW9uSWQgPSByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBudWxsO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBzZXNzaW9uSWQgaW4gVzNDIHJlc3BvbnNlc1xuICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICBkZWxldGUgaHR0cFJlc0JvZHkuc2Vzc2lvbklkO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keSA9IGZvcm1hdFN0YXR1cyhodHRwUmVzQm9keSwgaHR0cFN0YXR1cywgY3VycmVudFByb3RvY29sKTtcbiAgICAgIHJlcy5zdGF0dXMoaHR0cFN0YXR1cykuanNvbihodHRwUmVzQm9keSk7XG4gICAgfVxuICB9O1xuICAvLyBhZGQgdGhlIG1ldGhvZCB0byB0aGUgYXBwXG4gIGFwcFttZXRob2QudG9Mb3dlckNhc2UoKV0ocGF0aCwgKHJlcSwgcmVzKSA9PiB7XG4gICAgQi5yZXNvbHZlKGFzeW5jSGFuZGxlcihyZXEsIHJlcykpLmRvbmUoKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRyaXZlclNob3VsZERvSndwUHJveHkgKGRyaXZlciwgcmVxLCBjb21tYW5kKSB7XG4gIC8vIGRyaXZlcnMgbmVlZCB0byBleHBsaWNpdGx5IHNheSB3aGVuIHRoZSBwcm94eSBpcyBhY3RpdmVcbiAgaWYgKCFkcml2ZXIucHJveHlBY3RpdmUocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gd2Ugc2hvdWxkIG5ldmVyIHByb3h5IGRlbGV0ZVNlc3Npb24gYmVjYXVzZSB3ZSBuZWVkIHRvIGdpdmUgdGhlIGNvbnRhaW5pbmdcbiAgLy8gZHJpdmVyIGFuIG9wcG9ydHVuaXR5IHRvIGNsZWFuIGl0c2VsZiB1cFxuICBpZiAoY29tbWFuZCA9PT0gJ2RlbGV0ZVNlc3Npb24nKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gdmFsaWRhdGUgYXZvaWRhbmNlIHNjaGVtYSwgYW5kIHNheSB3ZSBzaG91bGRuJ3QgcHJveHkgaWYgYW55dGhpbmcgaW4gdGhlXG4gIC8vIGF2b2lkIGxpc3QgbWF0Y2hlcyBvdXIgcmVxXG4gIGlmIChkcml2ZXIucHJveHlSb3V0ZUlzQXZvaWRlZChyZXEucGFyYW1zLnNlc3Npb25JZCwgcmVxLm1ldGhvZCwgcmVxLm9yaWdpbmFsVXJsLCByZXEuYm9keSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9Kd3BQcm94eSAoZHJpdmVyLCByZXEsIHJlcykge1xuICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQsIGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKSlcbiAgICAuaW5mbygnRHJpdmVyIHByb3h5IGFjdGl2ZSwgcGFzc2luZyByZXF1ZXN0IG9uIHZpYSBIVFRQIHByb3h5Jyk7XG5cbiAgLy8gY2hlY2sgdGhhdCB0aGUgaW5uZXIgZHJpdmVyIGhhcyBhIHByb3h5IGZ1bmN0aW9uXG4gIGlmICghZHJpdmVyLmNhblByb3h5KHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVHJ5aW5nIHRvIHByb3h5IHRvIGEgSlNPTldQIHNlcnZlciBidXQgZHJpdmVyIGlzIHVuYWJsZSB0byBwcm94eScpO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcHJveGllZFJlcyA9IGF3YWl0IGRyaXZlci5leGVjdXRlQ29tbWFuZCgncHJveHlSZXFSZXMnLCByZXEsIHJlcywgcmVxLnBhcmFtcy5zZXNzaW9uSWQpO1xuICAgIGlmIChwcm94aWVkUmVzICYmIHByb3hpZWRSZXMuZXJyb3IpIHRocm93IHByb3hpZWRSZXMuZXJyb3I7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwcm94eS4gUHJveHkgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IHtcbiAgUHJvdG9jb2wsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgaXNTZXNzaW9uQ29tbWFuZCxcbiAgZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSwgZGV0ZXJtaW5lUHJvdG9jb2wsIENSRUFURV9TRVNTSU9OX0NPTU1BTkQsIERFTEVURV9TRVNTSU9OX0NPTU1BTkQsXG59O1xuIl0sImZpbGUiOiJsaWIvcHJvdG9jb2wvcHJvdG9jb2wuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
400
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIkdFVF9TVEFUVVNfQ09NTUFORCIsIlByb3RvY29sIiwiZGV0ZXJtaW5lUHJvdG9jb2wiLCJjcmVhdGVTZXNzaW9uQXJncyIsIl8iLCJzb21lIiwiaXNXM2NDYXBzIiwiUFJPVE9DT0xTIiwiVzNDIiwiTUpTT05XUCIsImV4dHJhY3RQcm90b2NvbCIsImRyaXZlciIsInNlc3Npb25JZCIsImRzdERyaXZlciIsImlzRnVuY3Rpb24iLCJkcml2ZXJGb3JTZXNzaW9uIiwicHJvdG9jb2wiLCJpc1Nlc3Npb25Db21tYW5kIiwiY29tbWFuZCIsImluY2x1ZGVzIiwiTk9fU0VTU0lPTl9JRF9DT01NQU5EUyIsImdldExvZ2dlciIsImxvZyIsImluZm8iLCJsb2dQcmVmaXgiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJub2RlIiwiZ2V0T2JqZWN0SWQiLCJzdWJzdHJpbmciLCJsb2dnZXIiLCJ3cmFwUGFyYW1zIiwicGFyYW1TZXRzIiwianNvbk9iaiIsInJlcyIsImlzQXJyYXkiLCJpc09iamVjdCIsIndyYXAiLCJ1bndyYXBQYXJhbXMiLCJ1bndyYXAiLCJjaGVja1BhcmFtcyIsInJlcXVpcmVkUGFyYW1zIiwib3B0aW9uYWxQYXJhbXMiLCJyZWNlaXZlZFBhcmFtcyIsImtleXMiLCJyZXF1aXJlZCIsImZpcnN0Iiwib3B0aW9uYWwiLCJ2YWxpZGF0ZSIsIm1lc3NhZ2UiLCJlcnJvcnMiLCJCYWRQYXJhbWV0ZXJzRXJyb3IiLCJsZW5ndGgiLCJpbmRleE9mIiwicHVzaCIsInBhcmFtcyIsImRpZmZlcmVuY2UiLCJtYWtlQXJncyIsInJlcXVlc3RQYXJhbXMiLCJwYXlsb2FkUGFyYW1zIiwidXJsUGFyYW1zIiwicmV2ZXJzZSIsIndpdGhvdXQiLCJhcmdzIiwiZmxhdHRlbiIsIm1hcCIsInAiLCJjb25jYXQiLCJ1Iiwicm91dGVDb25maWd1cmluZ0Z1bmN0aW9uIiwic2Vzc2lvbkV4aXN0cyIsIkVycm9yIiwiZXhlY3V0ZUNvbW1hbmQiLCJleGVjdXRlIiwiYWRkUm91dGVzIiwiYXBwIiwiYmFzZVBhdGgiLCJERUZBVUxUX0JBU0VfUEFUSCIsImV4dHJhTWV0aG9kTWFwIiwiYWxsTWV0aG9kcyIsIk1FVEhPRF9NQVAiLCJwYXRoIiwibWV0aG9kcyIsInRvUGFpcnMiLCJtZXRob2QiLCJzcGVjIiwiYnVpbGRIYW5kbGVyIiwiaXNTZXNzQ21kIiwiYXN5bmNIYW5kbGVyIiwicmVxIiwiYm9keSIsImh0dHBSZXNCb2R5IiwiaHR0cFN0YXR1cyIsIm5ld1Nlc3Npb25JZCIsImN1cnJlbnRQcm90b2NvbCIsIk5vU3VjaERyaXZlckVycm9yIiwiZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSIsIm5ldmVyUHJveHkiLCJkcml2ZXJTaG91bGREb0p3cFByb3h5IiwicGx1Z2luc1RvSGFuZGxlQ21kIiwiZG9Kd3BQcm94eSIsImRlYnVnIiwiTm90SW1wbGVtZW50ZWRFcnJvciIsImRyaXZlclJlcyIsInZhbGlkYXRvcnMiLCJ0cnVuY2F0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJNQVhfTE9HX0JPRFlfTEVOR1RIIiwicmVxRm9yUHJveHkiLCJpc1BsYWluT2JqZWN0IiwiaGFzIiwiZXJyb3IiLCJ2YWx1ZSIsImNhcGFiaWxpdGllcyIsInV0aWwiLCJoYXNWYWx1ZSIsInN0YXR1cyIsImlzTmFOIiwicGFyc2VJbnQiLCJzdGFja3RyYWNlIiwiZXJyIiwiYWN0dWFsRXJyIiwiZXJyTXNnIiwic3RhY2siLCJQcm94eVJlcXVlc3RFcnJvciIsImdldEFjdHVhbEVycm9yIiwiaXNTdHJpbmciLCJzZW5kIiwianNvbiIsInRvTG93ZXJDYXNlIiwiQiIsInJlc29sdmUiLCJkb25lIiwicHJveHlBY3RpdmUiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwib3JpZ2luYWxVcmwiLCJjYW5Qcm94eSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7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MUMsVUFBTSxJQUFJMkQsS0FBSixDQUFVLCtEQUFWLENBQU47QUFDRDs7QUFDRCxNQUFJO0FBQ0YsVUFBTTVELE1BQU0sQ0FBQzZELGNBQVAsQ0FBc0IsYUFBdEIsRUFBcUNpQixHQUFyQyxFQUEwQ3ZELEdBQTFDLEVBQStDdUQsR0FBRyxDQUFDbEMsTUFBSixDQUFXM0MsU0FBMUQsQ0FBTjtBQUNELEdBRkQsQ0FFRSxPQUFPNkcsR0FBUCxFQUFZO0FBQ1osUUFBSSx5QkFBWUEsR0FBWixFQUFpQnZFLGVBQU8yRSxpQkFBeEIsQ0FBSixFQUFnRDtBQUM5QyxZQUFNSixHQUFOO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsWUFBTSxJQUFJbEQsS0FBSixDQUFXLGlDQUFnQ2tELEdBQUcsQ0FBQ3hFLE9BQVEsRUFBdkQsQ0FBTjtBQUNEO0FBQ0Y7QUFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyB1dGlsLCBsb2dnZXIsIG5vZGUgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgdmFsaWRhdG9ycyB9IGZyb20gJy4vdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuICBlcnJvcnMsIGlzRXJyb3JUeXBlLCBnZXRSZXNwb25zZUZvclczQ0Vycm9yLFxuICBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSwgZXJyb3JGcm9tVzNDSnNvbkNvZGUsXG59IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IE1FVEhPRF9NQVAsIE5PX1NFU1NJT05fSURfQ09NTUFORFMgfSBmcm9tICcuL3JvdXRlcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBmb3JtYXRSZXNwb25zZVZhbHVlLCBmb3JtYXRTdGF0dXMgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgTUFYX0xPR19CT0RZX0xFTkdUSCwgUFJPVE9DT0xTLCBERUZBVUxUX0JBU0VfUEFUSCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBpc1czY0NhcHMgfSBmcm9tICcuLi9oZWxwZXJzL2NhcGFiaWxpdGllcyc7XG5cblxuY29uc3QgQ1JFQVRFX1NFU1NJT05fQ09NTUFORCA9ICdjcmVhdGVTZXNzaW9uJztcbmNvbnN0IERFTEVURV9TRVNTSU9OX0NPTU1BTkQgPSAnZGVsZXRlU2Vzc2lvbic7XG5jb25zdCBHRVRfU1RBVFVTX0NPTU1BTkQgPSAnZ2V0U3RhdHVzJztcblxuY2xhc3MgUHJvdG9jb2wge31cblxuZnVuY3Rpb24gZGV0ZXJtaW5lUHJvdG9jb2wgKGNyZWF0ZVNlc3Npb25BcmdzKSB7XG4gIHJldHVybiBfLnNvbWUoY3JlYXRlU2Vzc2lvbkFyZ3MsIGlzVzNjQ2FwcykgPyBQUk9UT0NPTFMuVzNDIDogUFJPVE9DT0xTLk1KU09OV1A7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQcm90b2NvbCAoZHJpdmVyLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IGRzdERyaXZlciA9IF8uaXNGdW5jdGlvbihkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbilcbiAgICA/IGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uKHNlc3Npb25JZClcbiAgICA6IGRyaXZlcjtcbiAgaWYgKGRzdERyaXZlciA9PT0gZHJpdmVyKSB7XG4gICAgLy8gU2hvcnRjaXJjdWl0IGlmIHRoZSBkcml2ZXIgaW5zdGFuY2UgaXMgbm90IGFuIHVtYnJlbGxhIGRyaXZlclxuICAgIC8vIG9yIGl0IGlzIEZha2UgZHJpdmVyIGluc3RhbmNlLCB3aGVyZSBgZHJpdmVyLmRyaXZlckZvclNlc3Npb25gXG4gICAgLy8gYWx3YXlzIHJldHVybnMgc2VsZiBpbnN0YW5jZVxuICAgIHJldHVybiBkcml2ZXIucHJvdG9jb2w7XG4gIH1cblxuICAvLyBFeHRyYWN0IHRoZSBwcm90b2NvbCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZiB0aGUgZ2l2ZW4gZHJpdmVyIGlzIHRoZSB1bWJyZWxsYSBvbmVcbiAgcmV0dXJuIGRzdERyaXZlcj8ucHJvdG9jb2wgPz8gUFJPVE9DT0xTLlczQztcbn1cblxuZnVuY3Rpb24gaXNTZXNzaW9uQ29tbWFuZCAoY29tbWFuZCkge1xuICByZXR1cm4gIV8uaW5jbHVkZXMoTk9fU0VTU0lPTl9JRF9DT01NQU5EUywgY29tbWFuZCk7XG59XG5cbmZ1bmN0aW9uIGdldExvZ2dlciAoZHJpdmVyLCBzZXNzaW9uSWQgPSBudWxsKSB7XG4gIGNvbnN0IGRzdERyaXZlciA9IHNlc3Npb25JZCAmJiBfLmlzRnVuY3Rpb24oZHJpdmVyLmRyaXZlckZvclNlc3Npb24pXG4gICAgPyAoZHJpdmVyLmRyaXZlckZvclNlc3Npb24oc2Vzc2lvbklkKSA/PyBkcml2ZXIpXG4gICAgOiBkcml2ZXI7XG4gIGlmIChfLmlzRnVuY3Rpb24oZHN0RHJpdmVyLmxvZz8uaW5mbykpIHtcbiAgICByZXR1cm4gZHN0RHJpdmVyLmxvZztcbiAgfVxuXG4gIGxldCBsb2dQcmVmaXggPSBkc3REcml2ZXIuY29uc3RydWN0b3JcbiAgICA/IGAke2RzdERyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfUAke25vZGUuZ2V0T2JqZWN0SWQoZHN0RHJpdmVyKS5zdWJzdHJpbmcoMCwgOCl9YFxuICAgIDogJ0FwcGl1bURyaXZlcic7XG4gIGlmIChzZXNzaW9uSWQpIHtcbiAgICBsb2dQcmVmaXggKz0gYCAoJHtzZXNzaW9uSWQuc3Vic3RyaW5nKDAsIDgpfSlgO1xuICB9XG4gIHJldHVybiBsb2dnZXIuZ2V0TG9nZ2VyKGxvZ1ByZWZpeCk7XG59XG5cbmZ1bmN0aW9uIHdyYXBQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBwZXJmb3JtVG91Y2ggd2hpY2ggdGFrZSBhIHNpbmdsZSBwYXJhbWV0ZXIgKHByaW1pdGl2ZSB0eXBlIG9yIGFycmF5KS5cbiAgICogU29tZSBkcml2ZXJzIGNob29zZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFzIGEgdmFsdWUgKGVnLiBbYWN0aW9uMSwgYWN0aW9uMi4uLl0pIHdoaWxlIG90aGVycyB0b1xuICAgKiB3cmFwIGl0IHdpdGhpbiBhbiBvYmplY3QoZWcnIHtnZXN0dXJlOiAgW2FjdGlvbjEsIGFjdGlvbjIuLi5dfSksIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gdmFsaWRhdGUuXG4gICAqIFRoZSB3cmFwIG9wdGlvbiBpbiB0aGUgc3BlYyBlbmZvcmNlIHdyYXBwaW5nIGJlZm9yZSB2YWxpZGF0aW9uLCBzbyB0aGF0IGFsbCBwYXJhbXMgYXJlIHdyYXBwZWQgYXRcbiAgICogdGhlIHRpbWUgdGhleSBhcmUgdmFsaWRhdGVkIGFuZCBsYXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmRzLlxuICAgKi9cbiAgbGV0IHJlcyA9IGpzb25PYmo7XG4gIGlmIChfLmlzQXJyYXkoanNvbk9iaikgfHwgIV8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICByZXMgPSB7fTtcbiAgICByZXNbcGFyYW1TZXRzLndyYXBdID0ganNvbk9iajtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBzZXROZXR3b3JrQ29ubmVjdGlvbiB3aGljaCBzZW5kIHBhcmFtZXRlcnMgd3JhcHBlZCBpbnNpZGUgYSBrZXkgc3VjaCBhc1xuICAgKiBcInBhcmFtZXRlcnNcIi4gVGhpcyBmdW5jdGlvbiB1bndyYXBzIHRoZW0gKGVnLiB7XCJwYXJhbWV0ZXJzXCI6IHtcInR5cGVcIjogMX19IGJlY29tZXMge1widHlwZVwiOiAxfSkuXG4gICAqL1xuICBsZXQgcmVzID0ganNvbk9iajtcbiAgaWYgKF8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICAvLyBzb21lIGNsaWVudHMsIGxpa2UgcnVieSwgZG9uJ3Qgd3JhcFxuICAgIGlmIChqc29uT2JqW3BhcmFtU2V0cy51bndyYXBdKSB7XG4gICAgICByZXMgPSBqc29uT2JqW3BhcmFtU2V0cy51bndyYXBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBjaGVja1BhcmFtcyAocGFyYW1TZXRzLCBqc29uT2JqLCBwcm90b2NvbCkge1xuICBsZXQgcmVxdWlyZWRQYXJhbXMgPSBbXTtcbiAgbGV0IG9wdGlvbmFsUGFyYW1zID0gW107XG4gIGxldCByZWNlaXZlZFBhcmFtcyA9IF8ua2V5cyhqc29uT2JqKTtcblxuICBpZiAocGFyYW1TZXRzKSB7XG4gICAgaWYgKHBhcmFtU2V0cy5yZXF1aXJlZCkge1xuICAgICAgLy8gd2UgbWlnaHQgaGF2ZSBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLFxuICAgICAgLy8gb3IgYW4gYXJyYXkgb2YgYXJyYXlzIG9mIHBhcmFtZXRlcnMsIHNvIHN0YW5kYXJkaXplXG4gICAgICBpZiAoIV8uaXNBcnJheShfLmZpcnN0KHBhcmFtU2V0cy5yZXF1aXJlZCkpKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gW3BhcmFtU2V0cy5yZXF1aXJlZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1aXJlZFBhcmFtcyA9IHBhcmFtU2V0cy5yZXF1aXJlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUganVzdCBhbiBhcnJheVxuICAgIGlmIChwYXJhbVNldHMub3B0aW9uYWwpIHtcbiAgICAgIG9wdGlvbmFsUGFyYW1zID0gcGFyYW1TZXRzLm9wdGlvbmFsO1xuICAgIH1cblxuICAgIC8vIElmIGEgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGFzIHRoZSAndmFsaWRhdGUnIGtleSwgaXQgd2lsbCBoZXJlIGJlIGNhbGxlZCB3aXRoXG4gICAgLy8ganNvbk9iaiBhcyB0aGUgcGFyYW0uIElmIGl0IHJldHVybnMgc29tZXRoaW5nIGZhbHN5LCB2ZXJpZmljYXRpb24gd2lsbCBiZVxuICAgIC8vIGNvbnNpZGVyZWQgdG8gaGF2ZSBwYXNzZWQuIElmIGl0IHJldHVybnMgc29tZXRoaW5nIGVsc2UsIHRoYXQgd2lsbCBiZSB0aGVcbiAgICAvLyBhcmd1bWVudCB0byBhbiBlcnJvciB3aGljaCBpcyB0aHJvd24gdG8gdGhlIHVzZXJcbiAgICBpZiAocGFyYW1TZXRzLnZhbGlkYXRlKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IHBhcmFtU2V0cy52YWxpZGF0ZShqc29uT2JqLCBwcm90b2NvbCk7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcihtZXNzYWdlLCBqc29uT2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBpZiB3ZSBoYXZlIG5vIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGFsbCBpcyB3ZWxsXG4gIGlmIChyZXF1aXJlZFBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBzb21lIGNsaWVudHMgcGFzcyBpbiB0aGUgc2Vzc2lvbiBpZCBpbiB0aGUgcGFyYW1zXG4gIGlmIChvcHRpb25hbFBhcmFtcy5pbmRleE9mKCdzZXNzaW9uSWQnKSA9PT0gLTEpIHtcbiAgICBvcHRpb25hbFBhcmFtcy5wdXNoKCdzZXNzaW9uSWQnKTtcbiAgfVxuXG4gIC8vIHNvbWUgY2xpZW50cyBwYXNzIGluIGFuIGVsZW1lbnQgaWQgaW4gdGhlIHBhcmFtc1xuICBpZiAob3B0aW9uYWxQYXJhbXMuaW5kZXhPZignaWQnKSA9PT0gLTEpIHtcbiAgICBvcHRpb25hbFBhcmFtcy5wdXNoKCdpZCcpO1xuICB9XG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhbmQgY2hlY2sgYWdhaW5zdCBvdXIgYXJndW1lbnRzXG4gIGZvciAobGV0IHBhcmFtcyBvZiByZXF1aXJlZFBhcmFtcykge1xuICAgIGlmIChfLmRpZmZlcmVuY2UocmVjZWl2ZWRQYXJhbXMsIHBhcmFtcywgb3B0aW9uYWxQYXJhbXMpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICBfLmRpZmZlcmVuY2UocGFyYW1zLCByZWNlaXZlZFBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyB3ZSBoYXZlIGEgc2V0IG9mIHBhcmFtZXRlcnMgdGhhdCBpcyBjb3JyZWN0XG4gICAgICAvLyBzbyBzaG9ydC1jaXJjdWl0XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKHBhcmFtU2V0cywgcmVjZWl2ZWRQYXJhbXMpO1xufVxuXG4vKlxuICogVGhpcyBtZXRob2QgdGFrZXMgMyBwaWVjZXMgb2YgZGF0YTogcmVxdWVzdCBwYXJhbWV0ZXJzICgncmVxdWVzdFBhcmFtcycpLFxuICogYSByZXF1ZXN0IEpTT04gYm9keSAoJ2pzb25PYmonKSwgYW5kICdwYXlsb2FkUGFyYW1zJywgd2hpY2ggaXMgdGhlIHNlY3Rpb25cbiAqIGZyb20gdGhlIHJvdXRlIGRlZmluaXRpb24gZm9yIGEgcGFydGljdWxhciBlbmRwb2ludCB3aGljaCBoYXMgaW5zdHJ1Y3Rpb25zXG4gKiBvbiBoYW5kbGluZyBwYXJhbWV0ZXJzLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsXG4gKiBiZSBhcHBsaWVkIHRvIGEgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gbWFrZUFyZ3MgKHJlcXVlc3RQYXJhbXMsIGpzb25PYmosIHBheWxvYWRQYXJhbXMsIHByb3RvY29sKSB7XG4gIC8vIFdlIHdhbnQgdG8gcGFzcyB0aGUgXCJ1cmxcIiBwYXJhbWV0ZXJzIHRvIHRoZSBjb21tYW5kcyBpbiByZXZlcnNlIG9yZGVyXG4gIC8vIHNpbmNlIHRoZSBjb21tYW5kIHdpbGwgc29tZXRpbWVzIHdhbnQgdG8gaWdub3JlLCBzYXksIHRoZSBzZXNzaW9uSWQuXG4gIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcHV0dGluZyBzZXNzaW9uSWQgbGFzdCwgd2hpY2ggbWVhbnMgaW4gSlMgd2UgY2FuXG4gIC8vIG9taXQgaXQgZnJvbSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlmIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQuXG4gIGxldCB1cmxQYXJhbXMgPSBfLmtleXMocmVxdWVzdFBhcmFtcykucmV2ZXJzZSgpO1xuXG4gIC8vIEluIHRoZSBzaW1wbGUgY2FzZSwgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIGEgYmFzaWMgYXJyYXkgaW5cbiAgLy8gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gc3RhcnQgdGhlcmUuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVyZSBhcmVcbiAgLy8gbXVsdGlwbGUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRob3VnaCwgc28gaGFuZGxlIHRoYXQgY2FzZVxuICAvLyB0b28uXG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IHBheWxvYWRQYXJhbXMucmVxdWlyZWQ7XG4gIGlmIChfLmlzQXJyYXkoXy5maXJzdChwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSkpIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRoZW4gd2Ugd2lsbCBoYXZlIGFuXG4gICAgLy8gYXJyYXkgb2YgYXJyYXlzIGluIHBheWxvYWRQYXJhbXMucmVxdWlyZWQsIHNvIGxvb3AgdGhyb3VnaCBlYWNoIHNldCBhbmRcbiAgICAvLyBwaWNrIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHdoaWNoIEpTT04gcGFyYW1zIHdlcmUgYWN0dWFsbHkgc2VudC4gV2UndmVcbiAgICAvLyBhbHJlYWR5IGJlZW4gdGhyb3VnaCB2YWxpZGF0aW9uIHNvIHdlJ3JlIGd1YXJhbnRlZWQgdG8gZmluZCBhIG1hdGNoLlxuICAgIGxldCBrZXlzID0gXy5rZXlzKGpzb25PYmopO1xuICAgIGZvciAobGV0IHBhcmFtcyBvZiBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSB7XG4gICAgICBpZiAoXy53aXRob3V0KHBhcmFtcywgLi4ua2V5cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1zO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBOb3cgd2UgY29uc3RydWN0IG91ciBsaXN0IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY29tbWFuZFxuICBsZXQgYXJncztcbiAgaWYgKF8uaXNGdW5jdGlvbihwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKSkge1xuICAgIC8vIEluIHRoZSByb3V0ZSBzcGVjLCBhIHBhcnRpY3VsYXIgcm91dGUgbWlnaHQgZGVmaW5lIGEgJ21ha2VBcmdzJyBmdW5jdGlvblxuICAgIC8vIGlmIGl0IHdhbnRzIGZ1bGwgY29udHJvbCBvdmVyIGhvdyB0byB0dXJuIEpTT04gcGFyYW1ldGVycyBpbnRvIGNvbW1hbmRcbiAgICAvLyBhcmd1bWVudHMuIFNvIHdlIHBhc3MgaXQgdGhlIEpTT04gcGFyYW1ldGVycyBhbmQgaXQgcmV0dXJucyBhbiBhcnJheVxuICAgIC8vIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgaGFuZGxpbmcgY29tbWFuZC4gRm9yIGV4YW1wbGUgaWYgaXQgcmV0dXJuc1xuICAgIC8vIFsxLCAyLCAzXSwgd2Ugd2lsbCBjYWxsIGBjb21tYW5kKDEsIDIsIDMsIC4uLilgICh1cmwgcGFyYW1zIGFyZSBzZXBhcmF0ZVxuICAgIC8vIGZyb20gSlNPTiBwYXJhbXMgYW5kIGdldCBjb25jYXRlbmF0ZWQgYmVsb3cpLlxuICAgIGFyZ3MgPSBwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKGpzb25PYmosIHByb3RvY29sKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIGNvbGxlY3QgYWxsIHRoZSByZXF1aXJlZCBhbmQgb3B0aW9uYWwgcGFyYW1zIGFuZCBmbGF0dGVuIHRoZW1cbiAgICAvLyBpbnRvIGFuIGFyZ3VtZW50IGFycmF5XG4gICAgYXJncyA9IF8uZmxhdHRlbihyZXF1aXJlZFBhcmFtcykubWFwKChwKSA9PiBqc29uT2JqW3BdKTtcbiAgICBpZiAocGF5bG9hZFBhcmFtcy5vcHRpb25hbCkge1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KF8uZmxhdHRlbihwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKS5tYXAoKHApID0+IGpzb25PYmpbcF0pKTtcbiAgICB9XG4gIH1cbiAgLy8gRmluYWxseSwgZ2V0IG91ciB1cmwgcGFyYW1zIChzZXNzaW9uIGlkLCBlbGVtZW50IGlkLCBldGMuLi4pIG9uIHRoZSBlbmQgb2ZcbiAgLy8gdGhlIGxpc3RcbiAgYXJncyA9IGFyZ3MuY29uY2F0KHVybFBhcmFtcy5tYXAoKHUpID0+IHJlcXVlc3RQYXJhbXNbdV0pKTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiAoZHJpdmVyKSB7XG4gIGlmICghZHJpdmVyLnNlc3Npb25FeGlzdHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgbXVzdCBpbXBsZW1lbnQgYHNlc3Npb25FeGlzdHNgIHByb3BlcnR5Jyk7XG4gIH1cblxuICBpZiAoIShkcml2ZXIuZXhlY3V0ZUNvbW1hbmQgfHwgZHJpdmVyLmV4ZWN1dGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEcml2ZXJzIG11c3QgaW1wbGVtZW50IGBleGVjdXRlQ29tbWFuZGAgb3IgYGV4ZWN1dGVgIG1ldGhvZCcpO1xuICB9XG5cbiAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gd2hpY2ggd2lsbCBhZGQgYWxsIHRoZSByb3V0ZXMgdG8gdGhlIGRyaXZlci4gSGVyZSBleHRyYU1ldGhvZHMgbWlnaHQgYmVcbiAgLy8gcGFzc2VkIGluIGFzIGRlZmluZWQgYnkgQXBwaXVtIHBsdWdpbnMsIHNvIHdlIG5lZWQgdG8gYWRkIHRob3NlIHRvIHRoZSBkZWZhdWx0IGxpc3RcbiAgcmV0dXJuIGZ1bmN0aW9uIGFkZFJvdXRlcyAoYXBwLCB7YmFzZVBhdGggPSBERUZBVUxUX0JBU0VfUEFUSCwgZXh0cmFNZXRob2RNYXAgPSB7fX0pIHtcbiAgICAvLyBzdG9yZSBiYXNlUGF0aCBvbiB0aGUgZHJpdmVyIGluc3RhbmNlIHNvIGl0IGNhbiB1c2UgaXQgaWYgbmVjZXNzYXJ5XG4gICAgLy8gZm9yIGV4YW1wbGUgaW4gZGV0ZXJtaW5pbmcgcHJveHkgYXZvaWRhbmNlXG4gICAgZHJpdmVyLmJhc2VQYXRoID0gYmFzZVBhdGg7XG5cbiAgICBjb25zdCBhbGxNZXRob2RzID0gey4uLk1FVEhPRF9NQVAsIC4uLmV4dHJhTWV0aG9kTWFwfTtcblxuICAgIGZvciAoY29uc3QgW3BhdGgsIG1ldGhvZHNdIG9mIF8udG9QYWlycyhhbGxNZXRob2RzKSkge1xuICAgICAgZm9yIChjb25zdCBbbWV0aG9kLCBzcGVjXSBvZiBfLnRvUGFpcnMobWV0aG9kcykpIHtcbiAgICAgICAgLy8gc2V0IHVwIHRoZSBleHByZXNzIHJvdXRlIGhhbmRsZXJcbiAgICAgICAgYnVpbGRIYW5kbGVyKGFwcCwgbWV0aG9kLCBgJHtiYXNlUGF0aH0ke3BhdGh9YCwgc3BlYywgZHJpdmVyLCBpc1Nlc3Npb25Db21tYW5kKHNwZWMuY29tbWFuZCkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRIYW5kbGVyIChhcHAsIG1ldGhvZCwgcGF0aCwgc3BlYywgZHJpdmVyLCBpc1Nlc3NDbWQpIHtcbiAgbGV0IGFzeW5jSGFuZGxlciA9IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGxldCBqc29uT2JqID0gcmVxLmJvZHk7XG4gICAgbGV0IGh0dHBSZXNCb2R5ID0ge307XG4gICAgbGV0IGh0dHBTdGF0dXMgPSAyMDA7XG4gICAgbGV0IG5ld1Nlc3Npb25JZDtcbiAgICBsZXQgY3VycmVudFByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGlmIHRoaXMgaXMgYSBzZXNzaW9uIGNvbW1hbmQgYnV0IHdlIGRvbid0IGhhdmUgYSBzZXNzaW9uLFxuICAgICAgLy8gZXJyb3Igb3V0IGVhcmx5IChlc3BlY2lhbGx5IGJlZm9yZSBwcm94eWluZylcbiAgICAgIGlmIChpc1Nlc3NDbWQgJiYgIWRyaXZlci5zZXNzaW9uRXhpc3RzKHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaERyaXZlckVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBkcml2ZXIgaXMgY3VycmVudGx5IHByb3h5aW5nIGNvbW1hbmRzIHRvIGFub3RoZXIgSlNPTldQIHNlcnZlciwgYnlwYXNzIGFsbCBvdXJcbiAgICAgIC8vIGNoZWNrcyBhbmQgYXNzdW1lIHRoZSB1cHN0cmVhbSBzZXJ2ZXIga25vd3Mgd2hhdCBpdCdzIGRvaW5nLiBCdXQga2VlcCB0aGlzIGluIHRoZVxuICAgICAgLy8gdHJ5L2NhdGNoIGJsb2NrIHNvIGlmIHByb3h5aW5nIGl0c2VsZiBmYWlscywgd2UgZ2l2ZSBhIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC4gT2YgY291cnNlIHdlXG4gICAgICAvLyBvbmx5IHdhbnQgdG8gZG8gdGhlc2Ugd2hlbiB3ZSBoYXZlIGEgc2Vzc2lvbiBjb21tYW5kOyB0aGUgQXBwaXVtIGRyaXZlciBtdXN0IGJlXG4gICAgICAvLyByZXNwb25zaWJsZSBmb3Igc3RhcnQvc3RvcCBzZXNzaW9uLCBldGMuLi4gV2UgYWxzbyBhbGxvdyB0aGUgY29tbWFuZCBzcGVjIHRvIGRlY2xhcmUgdGhhdFxuICAgICAgLy8gdGhpcyBjb21tYW5kIHNob3VsZCBuZXZlciBiZSBwcm94aWVkICh3aGljaCBpcyB1c2VmdWwgZm9yIHBsdWdpbiBkZXZlbG9wZXJzIHdobyBhZGRcbiAgICAgIC8vIGNvbW1hbmRzIGFuZCBnZW5lcmFsbHkgd291bGQgbm90IHdhbnQgdGhhdCBjb21tYW5kIHRvIGJlIHByb3hpZWQgaW5zdGVhZCBvZiBoYW5kbGVkIGJ5IHRoZVxuICAgICAgLy8gcGx1Z2luKVxuICAgICAgbGV0IGRpZFBsdWdpbk92ZXJyaWRlUHJveHkgPSBmYWxzZTtcbiAgICAgIGlmIChpc1Nlc3NDbWQgJiYgIXNwZWMubmV2ZXJQcm94eSAmJiBkcml2ZXJTaG91bGREb0p3cFByb3h5KGRyaXZlciwgcmVxLCBzcGVjLmNvbW1hbmQpKSB7XG4gICAgICAgIGlmICghZHJpdmVyLnBsdWdpbnNUb0hhbmRsZUNtZCB8fFxuICAgICAgICAgICAgZHJpdmVyLnBsdWdpbnNUb0hhbmRsZUNtZChzcGVjLmNvbW1hbmQsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBhd2FpdCBkb0p3cFByb3h5KGRyaXZlciwgcmVxLCByZXMpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkuZGVidWcoYFdvdWxkIGhhdmUgcHJveGllZCBgICtcbiAgICAgICAgICBgY29tbWFuZCBkaXJlY3RseSwgYnV0IGEgcGx1Z2luIGV4aXN0cyB3aGljaCBtaWdodCByZXF1aXJlIGl0cyB2YWx1ZSwgc28gd2lsbCBsZXQgYCArXG4gICAgICAgICAgYGl0cyB2YWx1ZSBiZSBjb2xsZWN0ZWQgaW50ZXJuYWxseSBhbmQgbWFkZSBwYXJ0IG9mIHBsdWdpbiBjaGFpbmApO1xuICAgICAgICBkaWRQbHVnaW5PdmVycmlkZVByb3h5ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYSBjb21tYW5kIGlzIG5vdCBpbiBvdXIgbWV0aG9kIG1hcCwgaXQncyBiZWNhdXNlIHdlXG4gICAgICAvLyBoYXZlIG5vIHBsYW5zIHRvIGV2ZXIgaW1wbGVtZW50IGl0XG4gICAgICBpZiAoIXNwZWMuY29tbWFuZCkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLk5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgLy8gd3JhcCBwYXJhbXMgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoc3BlYy5wYXlsb2FkUGFyYW1zICYmIHNwZWMucGF5bG9hZFBhcmFtcy53cmFwKSB7XG4gICAgICAgIGpzb25PYmogPSB3cmFwUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaik7XG4gICAgICB9XG5cbiAgICAgIC8vIHVud3JhcCBwYXJhbXMgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAoc3BlYy5wYXlsb2FkUGFyYW1zICYmIHNwZWMucGF5bG9hZFBhcmFtcy51bndyYXApIHtcbiAgICAgICAganNvbk9iaiA9IHVud3JhcFBhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmopO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIC8vIHRyeSB0byBkZXRlcm1pbmUgcHJvdG9jb2wgYnkgc2Vzc2lvbiBjcmVhdGlvbiBhcmdzLCBzbyB3ZSBjYW4gdGhyb3cgYVxuICAgICAgICAvLyBwcm9wZXJseSBmb3JtYXR0ZWQgZXJyb3IgaWYgYXJndW1lbnRzIHZhbGlkYXRpb24gZmFpbHNcbiAgICAgICAgY3VycmVudFByb3RvY29sID0gZGV0ZXJtaW5lUHJvdG9jb2wobWFrZUFyZ3MocmVxLnBhcmFtcywganNvbk9iaiwgc3BlYy5wYXlsb2FkUGFyYW1zIHx8IHt9KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBqc29uIHBheWxvYWQgY29uZm9ybXMgdG8gdGhlIHNwZWNcbiAgICAgIGNoZWNrUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaiwgY3VycmVudFByb3RvY29sKTtcblxuICAgICAgLy8gdHVybiB0aGUgY29tbWFuZCBhbmQganNvbiBwYXlsb2FkIGludG8gYW4gYXJndW1lbnQgbGlzdCBmb3JcbiAgICAgIC8vIHRoZSBkcml2ZXIgbWV0aG9kc1xuICAgICAgbGV0IGFyZ3MgPSBtYWtlQXJncyhyZXEucGFyYW1zLCBqc29uT2JqLCBzcGVjLnBheWxvYWRQYXJhbXMgfHwge30sIGN1cnJlbnRQcm90b2NvbCk7XG4gICAgICBsZXQgZHJpdmVyUmVzO1xuICAgICAgLy8gdmFsaWRhdGUgY29tbWFuZCBhcmdzIGFjY29yZGluZyB0byBNSlNPTldQXG4gICAgICBpZiAodmFsaWRhdG9yc1tzcGVjLmNvbW1hbmRdKSB7XG4gICAgICAgIHZhbGlkYXRvcnNbc3BlYy5jb21tYW5kXSguLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gcnVuIHRoZSBkcml2ZXIgY29tbWFuZCB3cmFwcGVkIGluc2lkZSB0aGUgYXJndW1lbnQgdmFsaWRhdG9yc1xuICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmRlYnVnKGBDYWxsaW5nIGAgK1xuICAgICAgICBgJHtkcml2ZXIuY29uc3RydWN0b3IubmFtZX0uJHtzcGVjLmNvbW1hbmR9KCkgd2l0aCBhcmdzOiBgICtcbiAgICAgICAgXy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShhcmdzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pKTtcblxuICAgICAgaWYgKGRpZFBsdWdpbk92ZXJyaWRlUHJveHkpIHtcbiAgICAgICAgLy8gVE9ETyBmb3Igbm93IHdlIGFkZCB0aGlzIGluZm9ybWF0aW9uIG9uIHRoZSBhcmdzIGxpc3QsIGJ1dCB0aGF0J3MgbWl4aW5nIHB1cnBvc2VzIGhlcmUuXG4gICAgICAgIC8vIFdlIHJlYWxseSBzaG91bGQgYWRkIGFub3RoZXIgJ29wdGlvbnMnIHBhcmFtZXRlciB0byAnZXhlY3V0ZUNvbW1hbmQnLCBidXQgdGhpcyB3b3VsZCBiZVxuICAgICAgICAvLyBhIGJyZWFraW5nIGNoYW5nZSBmb3IgYWxsIGRyaXZlcnMgc28gd291bGQgbmVlZCB0byBiZSBoYW5kbGVkIGNhcmVmdWxseS5cbiAgICAgICAgYXJncy5wdXNoKHtyZXFGb3JQcm94eTogcmVxfSk7XG4gICAgICB9XG5cbiAgICAgIGRyaXZlclJlcyA9IGF3YWl0IGRyaXZlci5leGVjdXRlQ29tbWFuZChzcGVjLmNvbW1hbmQsIC4uLmFyZ3MpO1xuXG4gICAgICAvLyBHZXQgdGhlIHByb3RvY29sIGFmdGVyIGV4ZWN1dGVDb21tYW5kXG4gICAgICBjdXJyZW50UHJvdG9jb2wgPSBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkgfHwgY3VycmVudFByb3RvY29sO1xuXG4gICAgICAvLyBJZiBgZXhlY3V0ZUNvbW1hbmRgIHdhcyBvdmVycmlkZGVuIGFuZCB0aGUgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0XG4gICAgICAvLyB3aXRoIGEgcHJvdG9jb2wgYW5kIHZhbHVlL2Vycm9yIHByb3BlcnR5LCByZS1hc3NpZ24gdGhlIHByb3RvY29sXG4gICAgICBpZiAoXy5pc1BsYWluT2JqZWN0KGRyaXZlclJlcykgJiYgXy5oYXMoZHJpdmVyUmVzLCAncHJvdG9jb2wnKSkge1xuICAgICAgICBjdXJyZW50UHJvdG9jb2wgPSBkcml2ZXJSZXMucHJvdG9jb2wgfHwgY3VycmVudFByb3RvY29sO1xuICAgICAgICBpZiAoZHJpdmVyUmVzLmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZHJpdmVyUmVzLmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGRyaXZlclJlcyA9IGRyaXZlclJlcy52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdW5wYWNrIGNyZWF0ZVNlc3Npb24gcmVzcG9uc2VcbiAgICAgIGlmIChzcGVjLmNvbW1hbmQgPT09IENSRUFURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgICAgbmV3U2Vzc2lvbklkID0gZHJpdmVyUmVzWzBdO1xuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCBuZXdTZXNzaW9uSWQpXG4gICAgICAgICAgLmRlYnVnKGBDYWNoZWQgdGhlIHByb3RvY29sIHZhbHVlICcke2N1cnJlbnRQcm90b2NvbH0nIGZvciB0aGUgbmV3IHNlc3Npb24gJHtuZXdTZXNzaW9uSWR9YCk7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5NSlNPTldQKSB7XG4gICAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICAgIGRyaXZlclJlcyA9IHtcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogZHJpdmVyUmVzWzFdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZHJpdmVyUmVzID0gZm9ybWF0UmVzcG9uc2VWYWx1ZShkcml2ZXJSZXMpO1xuXG4gICAgICAvLyBkZWxldGUgc2hvdWxkIG5vdCByZXR1cm4gYW55dGhpbmcgZXZlbiBpZiBzdWNjZXNzZnVsXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKVxuICAgICAgICAgIC5kZWJ1ZyhgUmVjZWl2ZWQgcmVzcG9uc2U6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkcml2ZXJSZXMpLCB7bGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIfSl9YCk7XG4gICAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKS5kZWJ1ZygnQnV0IGRlbGV0aW5nIHNlc3Npb24sIHNvIG5vdCByZXR1cm5pbmcnKTtcbiAgICAgICAgZHJpdmVyUmVzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHN0YXR1cyBpcyBub3QgMCwgIHRocm93IHRoZSBhcHByb3ByaWF0ZSBlcnJvciBmb3Igc3RhdHVzIGNvZGUuXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZShkcml2ZXJSZXMpKSB7XG4gICAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKGRyaXZlclJlcy5zdGF0dXMpICYmICFpc05hTihkcml2ZXJSZXMuc3RhdHVzKSAmJiBwYXJzZUludChkcml2ZXJSZXMuc3RhdHVzLCAxMCkgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZShkcml2ZXJSZXMuc3RhdHVzLCBkcml2ZXJSZXMudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChkcml2ZXJSZXMudmFsdWUpICYmIGRyaXZlclJlcy52YWx1ZS5lcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yRnJvbVczQ0pzb25Db2RlKGRyaXZlclJlcy52YWx1ZS5lcnJvciwgZHJpdmVyUmVzLnZhbHVlLm1lc3NhZ2UsIGRyaXZlclJlcy52YWx1ZS5zdGFja3RyYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keS52YWx1ZSA9IGRyaXZlclJlcztcbiAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkIHx8IG5ld1Nlc3Npb25JZCkuZGVidWcoYFJlc3BvbmRpbmcgYCArXG4gICAgICAgIGB0byBjbGllbnQgd2l0aCBkcml2ZXIuJHtzcGVjLmNvbW1hbmR9KCkgcmVzdWx0OiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoZHJpdmVyUmVzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pfWApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgZmlndXJlIG91dCB3aGF0IG91ciByZXNwb25zZSBzaG91bGQgYmVcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGVycm9yIHRoYXQgd2UgZW5jb3VudGVyZWRcbiAgICAgIGxldCBhY3R1YWxFcnIgPSBlcnI7XG5cbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGN1cnJlbnRQcm90b2NvbCB8fCBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpO1xuXG4gICAgICBsZXQgZXJyTXNnID0gZXJyLnN0YWNrdHJhY2UgfHwgZXJyLnN0YWNrO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKGVyck1zZywgZXJyLm1lc3NhZ2UpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBtZXNzYWdlIGhhcyBtb3JlIGluZm9ybWF0aW9uLCBhZGQgaXQuIGJ1dCBvZnRlbiB0aGUgbWVzc2FnZVxuICAgICAgICAvLyBpcyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc3RhY2sgdHJhY2VcbiAgICAgICAgZXJyTXNnID0gYCR7ZXJyLm1lc3NhZ2V9JHtlcnJNc2cgPyAoJ1xcbicgKyBlcnJNc2cpIDogJyd9YDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcikpIHtcbiAgICAgICAgYWN0dWFsRXJyID0gZXJyLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpXG4gICAgICAgICAgLmRlYnVnKGBFbmNvdW50ZXJlZCBpbnRlcm5hbCBlcnJvciBydW5uaW5nIGNvbW1hbmQ6ICR7ZXJyTXNnfWApO1xuICAgICAgfVxuXG4gICAgICBbaHR0cFN0YXR1cywgaHR0cFJlc0JvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihhY3R1YWxFcnIpO1xuICAgIH1cblxuICAgIC8vIGRlY29kZSB0aGUgcmVzcG9uc2UsIHdoaWNoIGlzIGVpdGhlciBhIHN0cmluZyBvciBqc29uXG4gICAgaWYgKF8uaXNTdHJpbmcoaHR0cFJlc0JvZHkpKSB7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLnNlbmQoaHR0cFJlc0JvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV3U2Vzc2lvbklkKSB7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgICBodHRwUmVzQm9keS52YWx1ZS5zZXNzaW9uSWQgPSBuZXdTZXNzaW9uSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHR0cFJlc0JvZHkuc2Vzc2lvbklkID0gbmV3U2Vzc2lvbklkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodHRwUmVzQm9keS5zZXNzaW9uSWQgPSByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBudWxsO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBzZXNzaW9uSWQgaW4gVzNDIHJlc3BvbnNlc1xuICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICBkZWxldGUgaHR0cFJlc0JvZHkuc2Vzc2lvbklkO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keSA9IGZvcm1hdFN0YXR1cyhodHRwUmVzQm9keSk7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLmpzb24oaHR0cFJlc0JvZHkpO1xuICAgIH1cbiAgfTtcbiAgLy8gYWRkIHRoZSBtZXRob2QgdG8gdGhlIGFwcFxuICBhcHBbbWV0aG9kLnRvTG93ZXJDYXNlKCldKHBhdGgsIChyZXEsIHJlcykgPT4ge1xuICAgIEIucmVzb2x2ZShhc3luY0hhbmRsZXIocmVxLCByZXMpKS5kb25lKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkcml2ZXJTaG91bGREb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgY29tbWFuZCkge1xuICAvLyBkcml2ZXJzIG5lZWQgdG8gZXhwbGljaXRseSBzYXkgd2hlbiB0aGUgcHJveHkgaXMgYWN0aXZlXG4gIGlmICghZHJpdmVyLnByb3h5QWN0aXZlKHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHdlIHNob3VsZCBuZXZlciBwcm94eSBkZWxldGVTZXNzaW9uIGJlY2F1c2Ugd2UgbmVlZCB0byBnaXZlIHRoZSBjb250YWluaW5nXG4gIC8vIGRyaXZlciBhbiBvcHBvcnR1bml0eSB0byBjbGVhbiBpdHNlbGYgdXBcbiAgaWYgKGNvbW1hbmQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBhdm9pZGFuY2Ugc2NoZW1hLCBhbmQgc2F5IHdlIHNob3VsZG4ndCBwcm94eSBpZiBhbnl0aGluZyBpbiB0aGVcbiAgLy8gYXZvaWQgbGlzdCBtYXRjaGVzIG91ciByZXFcbiAgaWYgKGRyaXZlci5wcm94eVJvdXRlSXNBdm9pZGVkKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCByZXEubWV0aG9kLCByZXEub3JpZ2luYWxVcmwsIHJlcS5ib2R5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgcmVzKSB7XG4gIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKVxuICAgIC5pbmZvKCdEcml2ZXIgcHJveHkgYWN0aXZlLCBwYXNzaW5nIHJlcXVlc3Qgb24gdmlhIEhUVFAgcHJveHknKTtcblxuICAvLyBjaGVjayB0aGF0IHRoZSBpbm5lciBkcml2ZXIgaGFzIGEgcHJveHkgZnVuY3Rpb25cbiAgaWYgKCFkcml2ZXIuY2FuUHJveHkocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUcnlpbmcgdG8gcHJveHkgdG8gYSBzZXJ2ZXIgYnV0IHRoZSBkcml2ZXIgaXMgdW5hYmxlIHRvIHByb3h5Jyk7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoJ3Byb3h5UmVxUmVzJywgcmVxLCByZXMsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwcm94eS4gUHJveHkgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IHtcbiAgUHJvdG9jb2wsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgaXNTZXNzaW9uQ29tbWFuZCxcbiAgZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSwgZGV0ZXJtaW5lUHJvdG9jb2wsIENSRUFURV9TRVNTSU9OX0NPTU1BTkQsXG4gIERFTEVURV9TRVNTSU9OX0NPTU1BTkQsIEdFVF9TVEFUVVNfQ09NTUFORCxcbn07XG4iXSwiZmlsZSI6ImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9