appium-android-driver 4.54.0 → 5.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +1 -2
  2. package/build/index.js +6 -4
  3. package/build/lib/android-helpers.js +12 -9
  4. package/build/lib/bootstrap.js +7 -7
  5. package/build/lib/commands/actions.js +13 -13
  6. package/build/lib/commands/alert.js +7 -7
  7. package/build/lib/commands/app-management.js +6 -6
  8. package/build/lib/commands/context.js +10 -8
  9. package/build/lib/commands/element.js +5 -5
  10. package/build/lib/commands/execute.js +5 -5
  11. package/build/lib/commands/file-actions.js +12 -12
  12. package/build/lib/commands/find.js +6 -6
  13. package/build/lib/commands/general.js +7 -69
  14. package/build/lib/commands/ime.js +4 -4
  15. package/build/lib/commands/index.js +4 -2
  16. package/build/lib/commands/intent.js +7 -7
  17. package/build/lib/commands/log.js +6 -6
  18. package/build/lib/commands/network.js +4 -4
  19. package/build/lib/commands/performance.js +1 -1
  20. package/build/lib/commands/recordscreen.js +15 -15
  21. package/build/lib/commands/shell.js +3 -3
  22. package/build/lib/commands/streamscreen.js +7 -7
  23. package/build/lib/commands/system-bars.js +144 -0
  24. package/build/lib/commands/touch.js +8 -8
  25. package/build/lib/desired-caps.js +1 -1
  26. package/build/lib/driver.js +12 -12
  27. package/build/lib/logger.js +3 -3
  28. package/build/lib/server.js +4 -4
  29. package/build/lib/uiautomator.js +3 -3
  30. package/build/lib/unlock-helpers.js +8 -8
  31. package/build/lib/webview-helpers.js +7 -7
  32. package/lib/android-helpers.js +1 -1
  33. package/lib/bootstrap.js +2 -2
  34. package/lib/commands/actions.js +1 -1
  35. package/lib/commands/alert.js +1 -1
  36. package/lib/commands/app-management.js +4 -2
  37. package/lib/commands/context.js +2 -2
  38. package/lib/commands/element.js +1 -1
  39. package/lib/commands/execute.js +1 -1
  40. package/lib/commands/file-actions.js +1 -1
  41. package/lib/commands/find.js +2 -2
  42. package/lib/commands/general.js +1 -83
  43. package/lib/commands/ime.js +1 -1
  44. package/lib/commands/index.js +2 -0
  45. package/lib/commands/intent.js +1 -1
  46. package/lib/commands/log.js +1 -1
  47. package/lib/commands/network.js +1 -1
  48. package/lib/commands/recordscreen.js +1 -1
  49. package/lib/commands/shell.js +1 -1
  50. package/lib/commands/streamscreen.js +1 -1
  51. package/lib/commands/system-bars.js +131 -0
  52. package/lib/commands/touch.js +2 -2
  53. package/lib/driver.js +2 -2
  54. package/lib/logger.js +1 -1
  55. package/lib/server.js +1 -1
  56. package/lib/uiautomator.js +1 -1
  57. package/lib/unlock-helpers.js +1 -1
  58. package/lib/webview-helpers.js +1 -1
  59. package/package.json +14 -12
  60. package/lib/.DS_Store +0 -0
@@ -13,7 +13,7 @@ var _lodash = _interopRequireDefault(require("lodash"));
13
13
 
14
14
  var _asyncbox = require("asyncbox");
15
15
 
16
- var _appiumSupport = require("appium-support");
16
+ var _support = require("@appium/support");
17
17
 
18
18
  var _logger = _interopRequireDefault(require("../logger"));
19
19
 
@@ -32,17 +32,17 @@ const PROCESS_SHUTDOWN_TIMEOUT = 10 * 1000;
32
32
  const SCREENRECORD_BINARY = 'screenrecord';
33
33
  const DEFAULT_EXT = '.mp4';
34
34
  const MIN_EMULATOR_API_LEVEL = 27;
35
- const FFMPEG_BINARY = `ffmpeg${_appiumSupport.system.isWindows() ? '.exe' : ''}`;
35
+ const FFMPEG_BINARY = `ffmpeg${_support.system.isWindows() ? '.exe' : ''}`;
36
36
 
37
37
  async function uploadRecordedMedia(localFile, remotePath = null, uploadOptions = {}) {
38
38
  if (_lodash.default.isEmpty(remotePath)) {
39
39
  const {
40
40
  size
41
- } = await _appiumSupport.fs.stat(localFile);
41
+ } = await _support.fs.stat(localFile);
42
42
 
43
- _logger.default.debug(`The size of the resulting screen recording is ${_appiumSupport.util.toReadableSizeString(size)}`);
43
+ _logger.default.debug(`The size of the resulting screen recording is ${_support.util.toReadableSizeString(size)}`);
44
44
 
45
- return (await _appiumSupport.util.toInMemoryBase64(localFile)).toString();
45
+ return (await _support.util.toInMemoryBase64(localFile)).toString();
46
46
  }
47
47
 
48
48
  const {
@@ -67,7 +67,7 @@ async function uploadRecordedMedia(localFile, remotePath = null, uploadOptions =
67
67
  };
68
68
  }
69
69
 
70
- await _appiumSupport.net.uploadFile(localFile, remotePath, options);
70
+ await _support.net.uploadFile(localFile, remotePath, options);
71
71
  return '';
72
72
  }
73
73
 
@@ -97,7 +97,7 @@ async function scheduleScreenRecord(adb, recordingProperties) {
97
97
  } = recordingProperties;
98
98
  let currentTimeLimit = MAX_RECORDING_TIME_SEC;
99
99
 
100
- if (_appiumSupport.util.hasValue(recordingProperties.currentTimeLimit)) {
100
+ if (_support.util.hasValue(recordingProperties.currentTimeLimit)) {
101
101
  const currentTimeLimitInt = parseInt(recordingProperties.currentTimeLimit, 10);
102
102
 
103
103
  if (!isNaN(currentTimeLimitInt) && currentTimeLimitInt < MAX_RECORDING_TIME_SEC) {
@@ -105,7 +105,7 @@ async function scheduleScreenRecord(adb, recordingProperties) {
105
105
  }
106
106
  }
107
107
 
108
- const pathOnDevice = `/sdcard/${_appiumSupport.util.uuidV4().substring(0, 8)}${DEFAULT_EXT}`;
108
+ const pathOnDevice = `/sdcard/${_support.util.uuidV4().substring(0, 8)}${DEFAULT_EXT}`;
109
109
  const recordingProc = adb.screenrecord(pathOnDevice, {
110
110
  videoSize,
111
111
  bitRate,
@@ -113,7 +113,7 @@ async function scheduleScreenRecord(adb, recordingProperties) {
113
113
  bugReport
114
114
  });
115
115
  recordingProc.on('end', () => {
116
- if (recordingProperties.stopped || !_appiumSupport.util.hasValue(timeLimit)) {
116
+ if (recordingProperties.stopped || !_support.util.hasValue(timeLimit)) {
117
117
  return;
118
118
  }
119
119
 
@@ -157,7 +157,7 @@ async function scheduleScreenRecord(adb, recordingProperties) {
157
157
 
158
158
  async function mergeScreenRecords(mediaFiles) {
159
159
  try {
160
- await _appiumSupport.fs.which(FFMPEG_BINARY);
160
+ await _support.fs.which(FFMPEG_BINARY);
161
161
  } catch (e) {
162
162
  throw new Error(`${FFMPEG_BINARY} utility is not available in PATH. Please install it from https://www.ffmpeg.org/`);
163
163
  }
@@ -166,7 +166,7 @@ async function mergeScreenRecords(mediaFiles) {
166
166
 
167
167
  const configFile = _path.default.resolve(_path.default.dirname(mediaFiles[0]), 'config.txt');
168
168
 
169
- await _appiumSupport.fs.writeFile(configFile, configContent, 'utf8');
169
+ await _support.fs.writeFile(configFile, configContent, 'utf8');
170
170
 
171
171
  _logger.default.debug(`Generated ffmpeg merging config '${configFile}' with items:\n${configContent}`);
172
172
 
@@ -233,7 +233,7 @@ commands.startRecordingScreen = async function startRecordingScreen(options = {}
233
233
  }
234
234
 
235
235
  this._screenRecordingProperties = {
236
- timer: new _appiumSupport.timing.Timer().start(),
236
+ timer: new _support.timing.Timer().start(),
237
237
  videoSize,
238
238
  timeLimit,
239
239
  currentTimeLimit: timeLimit,
@@ -284,7 +284,7 @@ commands.stopRecordingScreen = async function stopRecordingScreen(options = {})
284
284
  _logger.default.errorAndThrow(`No screen recordings have been stored on the device so far. ` + `Are you sure the ${SCREENRECORD_BINARY} utility works as expected?`);
285
285
  }
286
286
 
287
- const tmpRoot = await _appiumSupport.tempDir.openDir();
287
+ const tmpRoot = await _support.tempDir.openDir();
288
288
 
289
289
  try {
290
290
  const localRecords = [];
@@ -309,7 +309,7 @@ commands.stopRecordingScreen = async function stopRecordingScreen(options = {})
309
309
 
310
310
  return await uploadRecordedMedia(resultFilePath, options.remotePath, options);
311
311
  } finally {
312
- await _appiumSupport.fs.rimraf(tmpRoot);
312
+ await _support.fs.rimraf(tmpRoot);
313
313
  this._screenRecordingProperties = null;
314
314
  }
315
315
  };
@@ -318,4 +318,4 @@ var _default = commands;
318
318
  exports.default = _default;require('source-map-support').install();
319
319
 
320
320
 
321
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9yZWNvcmRzY3JlZW4uanMiXSwibmFtZXMiOlsiY29tbWFuZHMiLCJSRVRSWV9QQVVTRSIsIlJFVFJZX1RJTUVPVVQiLCJNQVhfUkVDT1JESU5HX1RJTUVfU0VDIiwiTUFYX1RJTUVfU0VDIiwiREVGQVVMVF9SRUNPUkRJTkdfVElNRV9TRUMiLCJQUk9DRVNTX1NIVVRET1dOX1RJTUVPVVQiLCJTQ1JFRU5SRUNPUkRfQklOQVJZIiwiREVGQVVMVF9FWFQiLCJNSU5fRU1VTEFUT1JfQVBJX0xFVkVMIiwiRkZNUEVHX0JJTkFSWSIsInN5c3RlbSIsImlzV2luZG93cyIsInVwbG9hZFJlY29yZGVkTWVkaWEiLCJsb2NhbEZpbGUiLCJyZW1vdGVQYXRoIiwidXBsb2FkT3B0aW9ucyIsIl8iLCJpc0VtcHR5Iiwic2l6ZSIsImZzIiwic3RhdCIsImxvZyIsImRlYnVnIiwidXRpbCIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwidXNlciIsInBhc3MiLCJtZXRob2QiLCJoZWFkZXJzIiwiZmlsZUZpZWxkTmFtZSIsImZvcm1GaWVsZHMiLCJvcHRpb25zIiwiYXV0aCIsIm5ldCIsInVwbG9hZEZpbGUiLCJ2ZXJpZnlTY3JlZW5SZWNvcmRJc1N1cHBvcnRlZCIsImFkYiIsImlzRW11bGF0b3IiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiRXJyb3IiLCJzY2hlZHVsZVNjcmVlblJlY29yZCIsInJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wcGVkIiwidGltZXIiLCJ2aWRlb1NpemUiLCJiaXRSYXRlIiwidGltZUxpbWl0IiwiYnVnUmVwb3J0IiwiY3VycmVudFRpbWVMaW1pdCIsImhhc1ZhbHVlIiwiY3VycmVudFRpbWVMaW1pdEludCIsInBhcnNlSW50IiwiaXNOYU4iLCJwYXRoT25EZXZpY2UiLCJ1dWlkVjQiLCJzdWJzdHJpbmciLCJyZWNvcmRpbmdQcm9jIiwic2NyZWVucmVjb3JkIiwib24iLCJjdXJyZW50RHVyYXRpb24iLCJnZXREdXJhdGlvbiIsImFzU2Vjb25kcyIsInRvRml4ZWQiLCJ0aW1lTGltaXRJbnQiLCJjaHVua0R1cmF0aW9uIiwiY2F0Y2giLCJlIiwiZXJyb3IiLCJzdGFjayIsInN0YXJ0IiwiZmlsZUV4aXN0cyIsIndhaXRNcyIsImludGVydmFsTXMiLCJyZWNvcmRzIiwicHVzaCIsInJlY29yZGluZ1Byb2Nlc3MiLCJtZXJnZVNjcmVlblJlY29yZHMiLCJtZWRpYUZpbGVzIiwid2hpY2giLCJjb25maWdDb250ZW50IiwibWFwIiwieCIsImpvaW4iLCJjb25maWdGaWxlIiwicGF0aCIsInJlc29sdmUiLCJkaXJuYW1lIiwid3JpdGVGaWxlIiwicmVzdWx0IiwiTWF0aCIsImZsb29yIiwiRGF0ZSIsImFyZ3MiLCJpbmZvIiwidGVybWluYXRlQmFja2dyb3VuZFNjcmVlblJlY29yZGluZyIsImZvcmNlIiwicGlkcyIsImdldFBJRHNCeU5hbWUiLCJwIiwic2hlbGwiLCJlcnIiLCJtZXNzYWdlIiwic3RhcnRSZWNvcmRpbmdTY3JlZW4iLCJmb3JjZVJlc3RhcnQiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwid2FybiIsIl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzIiwicmVjb3JkIiwicmltcmFmIiwidGltZW91dCIsInBhcnNlRmxvYXQiLCJ0aW1pbmciLCJUaW1lciIsImlzUnVubmluZyIsInN0b3AiLCJlcnJvckFuZFRocm93IiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwibG9jYWxSZWNvcmRzIiwicG9zaXgiLCJiYXNlbmFtZSIsInB1bGwiLCJsYXN0IiwicmVzdWx0RmlsZVBhdGgiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsUUFBUSxHQUFHLEVBQWpCOztBQUVBLE1BQU1DLFdBQVcsR0FBRyxHQUFwQjtBQUNBLE1BQU1DLGFBQWEsR0FBRyxJQUF0QjtB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SXVGLElBQUosQ0FBVSwyR0FBRCxHQUNOLG1CQUFrQnZDLENBQUMsQ0FBQ21DLE9BQVEsRUFEL0I7QUFFRDtBQUNGOztBQUNELFdBQU8sTUFBTTVGLG1CQUFtQixDQUFDbUgsY0FBRCxFQUFpQjlGLE9BQU8sQ0FBQ25CLFVBQXpCLEVBQXFDbUIsT0FBckMsQ0FBaEM7QUFDRCxHQWxCRCxTQWtCVTtBQUNSLFVBQU1kLGtCQUFHNEYsTUFBSCxDQUFVUSxPQUFWLENBQU47QUFDQSxTQUFLViwwQkFBTCxHQUFrQyxJQUFsQztBQUNEO0FBQ0YsQ0ExREQ7O2VBOERlOUcsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgdXRpbCwgZnMsIG5ldCwgdGVtcERpciwgc3lzdGVtLCB0aW1pbmcgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbmNvbnN0IFJFVFJZX1BBVVNFID0gMzAwO1xuY29uc3QgUkVUUllfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBNQVhfUkVDT1JESU5HX1RJTUVfU0VDID0gNjAgKiAzO1xuY29uc3QgTUFYX1RJTUVfU0VDID0gNjAgKiAzMDtcbmNvbnN0IERFRkFVTFRfUkVDT1JESU5HX1RJTUVfU0VDID0gTUFYX1JFQ09SRElOR19USU1FX1NFQztcbmNvbnN0IFBST0NFU1NfU0hVVERPV05fVElNRU9VVCA9IDEwICogMTAwMDtcbmNvbnN0IFNDUkVFTlJFQ09SRF9CSU5BUlkgPSAnc2NyZWVucmVjb3JkJztcbmNvbnN0IERFRkFVTFRfRVhUID0gJy5tcDQnO1xuY29uc3QgTUlOX0VNVUxBVE9SX0FQSV9MRVZFTCA9IDI3O1xuY29uc3QgRkZNUEVHX0JJTkFSWSA9IGBmZm1wZWcke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZFJlY29yZGVkTWVkaWEgKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCA9IG51bGwsIHVwbG9hZE9wdGlvbnMgPSB7fSkge1xuICBpZiAoXy5pc0VtcHR5KHJlbW90ZVBhdGgpKSB7XG4gICAgY29uc3Qge3NpemV9ID0gYXdhaXQgZnMuc3RhdChsb2NhbEZpbGUpO1xuICAgIGxvZy5kZWJ1ZyhgVGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBzY3JlZW4gcmVjb3JkaW5nIGlzICR7dXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZyhzaXplKX1gKTtcbiAgICByZXR1cm4gKGF3YWl0IHV0aWwudG9Jbk1lbW9yeUJhc2U2NChsb2NhbEZpbGUpKS50b1N0cmluZygpO1xuICB9XG5cbiAgY29uc3Qge3VzZXIsIHBhc3MsIG1ldGhvZCwgaGVhZGVycywgZmlsZUZpZWxkTmFtZSwgZm9ybUZpZWxkc30gPSB1cGxvYWRPcHRpb25zO1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIG1ldGhvZDogbWV0aG9kIHx8ICdQVVQnLFxuICAgIGhlYWRlcnMsXG4gICAgZmlsZUZpZWxkTmFtZSxcbiAgICBmb3JtRmllbGRzLFxuICB9O1xuICBpZiAodXNlciAmJiBwYXNzKSB7XG4gICAgb3B0aW9ucy5hdXRoID0ge3VzZXIsIHBhc3N9O1xuICB9XG4gIGF3YWl0IG5ldC51cGxvYWRGaWxlKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCwgb3B0aW9ucyk7XG4gIHJldHVybiAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U2NyZWVuUmVjb3JkSXNTdXBwb3J0ZWQgKGFkYiwgaXNFbXVsYXRvcikge1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpO1xuICBpZiAoaXNFbXVsYXRvciAmJiBhcGlMZXZlbCA8IE1JTl9FTVVMQVRPUl9BUElfTEVWRUwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmVlbiByZWNvcmRpbmcgZG9lcyBub3Qgd29yayBvbiBlbXVsYXRvcnMgcnVubmluZyBBbmRyb2lkIEFQSSBsZXZlbCBsZXNzIHRoYW4gJHtNSU5fRU1VTEFUT1JfQVBJX0xFVkVMfWApO1xuICB9XG4gIGlmIChhcGlMZXZlbCA8IDE5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY3JlZW4gcmVjb3JkaW5nIG5vdCBhdmFpbGFibGUgb24gQVBJIExldmVsICR7YXBpTGV2ZWx9LiBNaW5pbXVtIEFQSSBMZXZlbCBpcyAxOS5gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzY2hlZHVsZVNjcmVlblJlY29yZCAoYWRiLCByZWNvcmRpbmdQcm9wZXJ0aWVzKSB7XG4gIGlmIChyZWNvcmRpbmdQcm9wZXJ0aWVzLnN0b3BwZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgdGltZXIsXG4gICAgdmlkZW9TaXplLFxuICAgIGJpdFJhdGUsXG4gICAgdGltZUxpbWl0LFxuICAgIGJ1Z1JlcG9ydCxcbiAgfSA9IHJlY29yZGluZ1Byb3BlcnRpZXM7XG5cbiAgbGV0IGN1cnJlbnRUaW1lTGltaXQgPSBNQVhfUkVDT1JESU5HX1RJTUVfU0VDO1xuICBpZiAodXRpbC5oYXNWYWx1ZShyZWNvcmRpbmdQcm9wZXJ0aWVzLmN1cnJlbnRUaW1lTGltaXQpKSB7XG4gICAgY29uc3QgY3VycmVudFRpbWVMaW1pdEludCA9IHBhcnNlSW50KHJlY29yZGluZ1Byb3BlcnRpZXMuY3VycmVudFRpbWVMaW1pdCwgMTApO1xuICAgIGlmICghaXNOYU4oY3VycmVudFRpbWVMaW1pdEludCkgJiYgY3VycmVudFRpbWVMaW1pdEludCA8IE1BWF9SRUNPUkRJTkdfVElNRV9TRUMpIHtcbiAgICAgIGN1cnJlbnRUaW1lTGltaXQgPSBjdXJyZW50VGltZUxpbWl0SW50O1xuICAgIH1cbiAgfVxuICBjb25zdCBwYXRoT25EZXZpY2UgPSBgL3NkY2FyZC8ke3V0aWwudXVpZFY0KCkuc3Vic3RyaW5nKDAsIDgpfSR7REVGQVVMVF9FWFR9YDtcbiAgY29uc3QgcmVjb3JkaW5nUHJvYyA9IGFkYi5zY3JlZW5yZWNvcmQocGF0aE9uRGV2aWNlLCB7XG4gICAgdmlkZW9TaXplLFxuICAgIGJpdFJhdGUsXG4gICAgdGltZUxpbWl0OiBjdXJyZW50VGltZUxpbWl0LFxuICAgIGJ1Z1JlcG9ydCxcbiAgfSk7XG5cbiAgcmVjb3JkaW5nUHJvYy5vbignZW5kJywgKCkgPT4ge1xuICAgIGlmIChyZWNvcmRpbmdQcm9wZXJ0aWVzLnN0b3BwZWQgfHwgIXV0aWwuaGFzVmFsdWUodGltZUxpbWl0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50RHVyYXRpb24gPSB0aW1lci5nZXREdXJhdGlvbigpLmFzU2Vjb25kcy50b0ZpeGVkKDApO1xuICAgIGxvZy5kZWJ1ZyhgVGhlIG92ZXJhbGwgc2NyZWVuIHJlY29yZGluZyBkdXJhdGlvbiBpcyAke2N1cnJlbnREdXJhdGlvbn1zIHNvIGZhcmApO1xuICAgIGNvbnN0IHRpbWVMaW1pdEludCA9IHBhcnNlSW50KHRpbWVMaW1pdCwgMTApO1xuICAgIGlmIChpc05hTih0aW1lTGltaXRJbnQpIHx8IGN1cnJlbnREdXJhdGlvbiA+PSB0aW1lTGltaXRJbnQpIHtcbiAgICAgIGxvZy5kZWJ1ZygnVGhlcmUgaXMgbm8gbmVlZCB0byBzdGFydCB0aGUgbmV4dCByZWNvcmRpbmcgY2h1bmsnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZWNvcmRpbmdQcm9wZXJ0aWVzLmN1cnJlbnRUaW1lTGltaXQgPSB0aW1lTGltaXRJbnQgLSBjdXJyZW50RHVyYXRpb247XG4gICAgY29uc3QgY2h1bmtEdXJhdGlvbiA9IHJlY29yZGluZ1Byb3BlcnRpZXMuY3VycmVudFRpbWVMaW1pdCA8IE1BWF9SRUNPUkRJTkdfVElNRV9TRUNcbiAgICAgID8gcmVjb3JkaW5nUHJvcGVydGllcy5jdXJyZW50VGltZUxpbWl0XG4gICAgICA6IE1BWF9SRUNPUkRJTkdfVElNRV9TRUM7XG4gICAgbG9nLmRlYnVnKGBTdGFydGluZyB0aGUgbmV4dCAke2NodW5rRHVyYXRpb259cy1jaHVuayBgICtcbiAgICAgIGBvZiBzY3JlZW4gcmVjb3JkaW5nIGluIG9yZGVyIHRvIGFjaGlldmUgJHt0aW1lTGltaXRJbnR9cyB0b3RhbCBkdXJhdGlvbmApO1xuICAgIHNjaGVkdWxlU2NyZWVuUmVjb3JkKGFkYiwgcmVjb3JkaW5nUHJvcGVydGllcylcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBsb2cuZXJyb3IoZS5zdGFjayk7XG4gICAgICAgIHJlY29yZGluZ1Byb3BlcnRpZXMuc3RvcHBlZCA9IHRydWU7XG4gICAgICB9KTtcbiAgfSk7XG5cbiAgYXdhaXQgcmVjb3JkaW5nUHJvYy5zdGFydCgwKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IGFkYi5maWxlRXhpc3RzKHBhdGhPbkRldmljZSksXG4gICAgICB7d2FpdE1zOiBSRVRSWV9USU1FT1VULCBpbnRlcnZhbE1zOiBSRVRSWV9QQVVTRX0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZXhwZWN0ZWQgc2NyZWVuIHJlY29yZCBmaWxlICcke3BhdGhPbkRldmljZX0nIGRvZXMgbm90IGV4aXN0IGFmdGVyICR7UkVUUllfVElNRU9VVH1tcy4gYCArXG4gICAgICBgSXMgJHtTQ1JFRU5SRUNPUkRfQklOQVJZfSB1dGlsaXR5IGF2YWlsYWJsZSBhbmQgb3BlcmF0aW9uYWwgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0P2ApO1xuICB9XG5cbiAgcmVjb3JkaW5nUHJvcGVydGllcy5yZWNvcmRzLnB1c2gocGF0aE9uRGV2aWNlKTtcbiAgcmVjb3JkaW5nUHJvcGVydGllcy5yZWNvcmRpbmdQcm9jZXNzID0gcmVjb3JkaW5nUHJvYztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWVyZ2VTY3JlZW5SZWNvcmRzIChtZWRpYUZpbGVzKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud2hpY2goRkZNUEVHX0JJTkFSWSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RkZNUEVHX0JJTkFSWX0gdXRpbGl0eSBpcyBub3QgYXZhaWxhYmxlIGluIFBBVEguIFBsZWFzZSBpbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly93d3cuZmZtcGVnLm9yZy9gKTtcbiAgfVxuICBjb25zdCBjb25maWdDb250ZW50ID0gbWVkaWFGaWxlc1xuICAgIC5tYXAoKHgpID0+IGBmaWxlICcke3h9J2ApXG4gICAgLmpvaW4oJ1xcbicpO1xuICBjb25zdCBjb25maWdGaWxlID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShtZWRpYUZpbGVzWzBdKSwgJ2NvbmZpZy50eHQnKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKGNvbmZpZ0ZpbGUsIGNvbmZpZ0NvbnRlbnQsICd1dGY4Jyk7XG4gIGxvZy5kZWJ1ZyhgR2VuZXJhdGVkIGZmbXBlZyBtZXJnaW5nIGNvbmZpZyAnJHtjb25maWdGaWxlfScgd2l0aCBpdGVtczpcXG4ke2NvbmZpZ0NvbnRlbnR9YCk7XG4gIGNvbnN0IHJlc3VsdCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUobWVkaWFGaWxlc1swXSksIGBtZXJnZV8ke01hdGguZmxvb3IobmV3IERhdGUoKSl9JHtERUZBVUxUX0VYVH1gKTtcbiAgY29uc3QgYXJncyA9IFsnLXNhZmUnLCAnMCcsICctZicsICdjb25jYXQnLCAnLWknLCBjb25maWdGaWxlLCAnLWMnLCAnY29weScsIHJlc3VsdF07XG4gIGxvZy5pbmZvKGBJbml0aWF0aW5nIHNjcmVlbiByZWNvcmRzIG1lcmdpbmcgdXNpbmcgdGhlIGNvbW1hbmQgJyR7RkZNUEVHX0JJTkFSWX0gJHthcmdzLmpvaW4oJyAnKX0nYCk7XG4gIGF3YWl0IGV4ZWMoRkZNUEVHX0JJTkFSWSwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUJhY2tncm91bmRTY3JlZW5SZWNvcmRpbmcgKGFkYiwgZm9yY2UgPSB0cnVlKSB7XG4gIGNvbnN0IHBpZHMgPSAoYXdhaXQgYWRiLmdldFBJRHNCeU5hbWUoU0NSRUVOUkVDT1JEX0JJTkFSWSkpXG4gICAgLm1hcCgocCkgPT4gYCR7cH1gKTtcbiAgaWYgKF8uaXNFbXB0eShwaWRzKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFsna2lsbCcsIGZvcmNlID8gJy0xNScgOiAnLTInLCAuLi5waWRzXSk7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBfLmlzRW1wdHkoYXdhaXQgYWRiLmdldFBJRHNCeU5hbWUoU0NSRUVOUkVDT1JEX0JJTkFSWSkpLCB7XG4gICAgICB3YWl0TXM6IFBST0NFU1NfU0hVVERPV05fVElNRU9VVCxcbiAgICAgIGludGVydmFsTXM6IDUwMCxcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gc3RvcCB0aGUgYmFja2dyb3VuZCBzY3JlZW4gcmVjb3JkaW5nOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFJlY29yZGluZ09wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgcGF0aCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uLCB3aGVyZSB0aGUgY2FwdHVyZWQgdmlkZW8gc2hvdWxkIGJlIHVwbG9hZGVkLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZDogaHR0cC9odHRwcywgZnRwLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVsbCBvciBlbXB0eSBzdHJpbmcgdmFsdWUgKHRoZSBkZWZhdWx0IHNldHRpbmcpIG1lYW5zIHRoZSBjb250ZW50IG9mIHJlc3VsdGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBzaG91bGQgYmUgZW5jb2RlZCBhcyBCYXNlNjQgYW5kIHBhc3NlZCBhcyB0aGUgZW5kcG91bnQgcmVzcG9uc2UgdmFsdWUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGdlbmVyYXRlZCBtZWRpYSBmaWxlIGlzIHRvbyBiaWcgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdCBpbnRvIHRoZSBhdmFpbGFibGUgcHJvY2VzcyBtZW1vcnkuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBvbmx5IGhhcyBhbiBlZmZlY3QgaWYgdGhlcmUgaXMgc2NyZWVuIHJlY29yZGluZyBwcm9jZXNzIGluIHByb2dyZWVzc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGBmb3JjZVJlc3RhcnRgIHBhcmFtZXRlciBpcyBub3Qgc2V0IHRvIGB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXNlciAtIFRoZSBuYW1lIG9mIHRoZSB1c2VyIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLiBPbmx5IHdvcmtzIGlmIGByZW1vdGVQYXRoYCBpcyBwcm92aWRlZC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGFzcyAtIFRoZSBwYXNzd29yZCBmb3IgdGhlIHJlbW90ZSBhdXRoZW50aWNhdGlvbi4gT25seSB3b3JrcyBpZiBgcmVtb3RlUGF0aGAgaXMgcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1ldGhvZCBbUFVUXSAtIFRoZSBodHRwIG11bHRpcGFydCB1cGxvYWQgbWV0aG9kIG5hbWUuIE9ubHkgd29ya3MgaWYgYHJlbW90ZVBhdGhgIGlzIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBoZWFkZXJzIC0gQWRkaXRpb25hbCBoZWFkZXJzIG1hcHBpbmcgZm9yIG11bHRpcGFydCBodHRwKHMpIHVwbG9hZHNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmlsZUZpZWxkTmFtZSBbZmlsZV0gLSBUaGUgbmFtZSBvZiB0aGUgZm9ybSBmaWVsZCwgd2hlcmUgdGhlIGZpbGUgY29udGVudCBCTE9CIHNob3VsZCBiZSBzdG9yZWQgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkgez9PYmplY3R8QXJyYXk8UGFpcj59IGZvcm1GaWVsZHMgLSBBZGRpdGlvbmFsIGZvcm0gZmllbGRzIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZpZGVvU2l6ZSAtIFRoZSBmb3JtYXQgaXMgd2lkdGh4aGVpZ2h0LlxuICogICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgZGV2aWNlJ3MgbmF0aXZlIGRpc3BsYXkgcmVzb2x1dGlvbiAoaWYgc3VwcG9ydGVkKSxcbiAqICAgICAgICAgICAgICAgICAgMTI4MHg3MjAgaWYgbm90LiBGb3IgYmVzdCByZXN1bHRzLFxuICogICAgICAgICAgICAgICAgICB1c2UgYSBzaXplIHN1cHBvcnRlZCBieSB5b3VyIGRldmljZSdzIEFkdmFuY2VkIFZpZGVvIENvZGluZyAoQVZDKSBlbmNvZGVyLlxuICogICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgXCIxMjgweDcyMFwiXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBidWdSZXBvcnQgLSBTZXQgaXQgdG8gYHRydWVgIGluIG9yZGVyIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgdmlkZW8gb3ZlcmxheSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgYSB0aW1lc3RhbXAsIHRoYXQgaXMgaGVscGZ1bCBpbiB2aWRlb3MgY2FwdHVyZWQgdG8gaWxsdXN0cmF0ZSBidWdzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgc2luY2UgQVBJIGxldmVsIDI3IChBbmRyb2lkIFApLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gdGltZUxpbWl0IC0gVGhlIG1heGltdW0gcmVjb3JkaW5nIHRpbWUsIGluIHNlY29uZHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE4MCAoMyBtaW51dGVzKS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIGlzIDE4MDAgKDMwIG1pbnV0ZXMpLiBJZiB0aGUgcGFzc2VkIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAxODAgdGhlblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFsZ29yaXRobSB3aWxsIHRyeSB0byBzY2hlZHVsZSBtdWx0aXBsZSBzY3JlZW4gcmVjb3JkaW5nIGNodW5rcyBhbmQgbWVyZ2UgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmcgdmlkZW9zIGludG8gYSBzaW5nbGUgbWVkaWEgZmlsZSB1c2luZyBgZmZtcGVnYCB1dGlsaXR5LlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHV0aWxpdHkgaXMgbm90IGF2YWlsYWJsZSBpbiBQQVRIIHRoZW4gdGhlIG1vc3QgcmVjZW50IHNjcmVlbiByZWNvcmRpbmcgY2h1bmsgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvaW5nIHRvIGJlIHJldHVybmVkLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gYml0UmF0ZSAtIFRoZSB2aWRlbyBiaXQgcmF0ZSBmb3IgdGhlIHZpZGVvLCBpbiBiaXRzIHBlciBzZWNvbmQuXG4gKiAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA0MDAwMDAwICg0IE1iaXQvcykuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqICAgICAgICAgICAgICAgIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGZvcmNlUmVzdGFydCAtIFdoZXRoZXIgdG8gdHJ5IHRvIGNhdGNoIGFuZCB1cGxvYWQvcmV0dXJuIHRoZSBjdXJyZW50bHkgcnVubmluZyBzY3JlZW4gcmVjb3JkaW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYGZhbHNlYCwgdGhlIGRlZmF1bHQgc2V0dGluZykgb3IgaWdub3JlIHRoZSByZXN1bHQgb2YgaXQgYW5kIHN0YXJ0IGEgbmV3IHJlY29yZGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlbHkgKGB0cnVlYCkuXG4gKi9cblxuLyoqXG4gKiBSZWNvcmQgdGhlIGRpc3BsYXkgb2YgYSByZWFsIGRldmljZXMgcnVubmluZyBBbmRyb2lkIDQuNCAoQVBJIGxldmVsIDE5KSBhbmQgaGlnaGVyLlxuICogRW11bGF0b3JzIGFyZSBzdXBwb3J0ZWQgc2luY2UgQVBJIGxldmVsIDI3IChBbmRyb2lkIFApLlxuICogSXQgcmVjb3JkcyBzY3JlZW4gYWN0aXZpdHkgdG8gYW4gTVBFRy00IGZpbGUuIEF1ZGlvIGlzIG5vdCByZWNvcmRlZCB3aXRoIHRoZSB2aWRlbyBmaWxlLlxuICogSWYgc2NyZWVuIHJlY29yZGluZyBoYXMgYmVlbiBhbHJlYWR5IHN0YXJ0ZWQgdGhlbiB0aGUgY29tbWFuZCB3aWxsIHN0b3AgaXQgZm9yY2VmdWxseSBhbmQgc3RhcnQgYSBuZXcgb25lLlxuICogVGhlIHByZXZpb3VzbHkgcmVjb3JkZWQgdmlkZW8gZmlsZSB3aWxsIGJlIGRlbGV0ZWQuXG4gKlxuICogQHBhcmFtIHs/U3RhcnRSZWNvcmRpbmdPcHRpb25zfSBvcHRpb25zIC0gVGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgcmVjb3JkZWQgbWVkaWEgZmlsZSBpZlxuICogICAgICAgICAgICAgICAgICAgYW55IHNjcmVlbiByZWNvcmRpbmcgaXMgY3VycmVudGx5IHJ1bm5pbmcgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICogQHRocm93cyB7RXJyb3J9IElmIHNjcmVlbiByZWNvcmRpbmcgaGFzIGZhaWxlZCB0byBzdGFydCBvciBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xuY29tbWFuZHMuc3RhcnRSZWNvcmRpbmdTY3JlZW4gPSBhc3luYyBmdW5jdGlvbiBzdGFydFJlY29yZGluZ1NjcmVlbiAob3B0aW9ucyA9IHt9KSB7XG4gIGF3YWl0IHZlcmlmeVNjcmVlblJlY29yZElzU3VwcG9ydGVkKHRoaXMuYWRiLCB0aGlzLmlzRW11bGF0b3IoKSk7XG5cbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBjb25zdCB7dmlkZW9TaXplLCB0aW1lTGltaXQgPSBERUZBVUxUX1JFQ09SRElOR19USU1FX1NFQywgYnVnUmVwb3J0LCBiaXRSYXRlLCBmb3JjZVJlc3RhcnR9ID0gb3B0aW9ucztcbiAgaWYgKCFmb3JjZVJlc3RhcnQpIHtcbiAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4ob3B0aW9ucyk7XG4gIH1cblxuICBpZiAoYXdhaXQgdGVybWluYXRlQmFja2dyb3VuZFNjcmVlblJlY29yZGluZyh0aGlzLmFkYiwgdHJ1ZSkpIHtcbiAgICBsb2cud2FybihgVGhlcmUgd2VyZSBzb21lICR7U0NSRUVOUkVDT1JEX0JJTkFSWX0gcHJvY2VzcyBsZWZ0b3ZlcnMgcnVubmluZyBgICtcbiAgICAgIGBpbiB0aGUgYmFja2dyb3VuZC4gTWFrZSBzdXJlIHlvdSBzdG9wIHNjcmVlbiByZWNvcmRpbmcgZWFjaCB0aW1lIGFmdGVyIGl0IGlzIHN0YXJ0ZWQsIGAgK1xuICAgICAgYG90aGVyd2lzZSB0aGUgcmVjb3JkZWQgbWVkaWEgbWlnaHQgcXVpY2tseSBleGNlZWQgYWxsIHRoZSBmcmVlIHNwYWNlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5gKTtcbiAgfVxuXG4gIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgKHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMucmVjb3JkcyB8fCBbXSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJpbXJhZihyZWNvcmQpO1xuICAgIH1cbiAgICB0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzID0gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHRpbWVvdXQgPSBwYXJzZUZsb2F0KHRpbWVMaW1pdCk7XG4gIGlmIChpc05hTih0aW1lb3V0KSB8fCB0aW1lb3V0ID4gTUFYX1RJTUVfU0VDIHx8IHRpbWVvdXQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHRpbWVMaW1pdCB2YWx1ZSBtdXN0IGJlIGluIHJhbmdlIFsxLCAke01BWF9USU1FX1NFQ31dIHNlY29uZHMuIGAgK1xuICAgICAgYFRoZSB2YWx1ZSBvZiAnJHt0aW1lTGltaXR9JyBoYXMgYmVlbiBwYXNzZWQgaW5zdGVhZC5gKTtcbiAgfVxuXG4gIHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMgPSB7XG4gICAgdGltZXI6IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpLFxuICAgIHZpZGVvU2l6ZSxcbiAgICB0aW1lTGltaXQsXG4gICAgY3VycmVudFRpbWVMaW1pdDogdGltZUxpbWl0LFxuICAgIGJpdFJhdGUsXG4gICAgYnVnUmVwb3J0LFxuICAgIHJlY29yZHM6IFtdLFxuICAgIHJlY29yZGluZ1Byb2Nlc3M6IG51bGwsXG4gICAgc3RvcHBlZDogZmFsc2UsXG4gIH07XG4gIGF3YWl0IHNjaGVkdWxlU2NyZWVuUmVjb3JkKHRoaXMuYWRiLCB0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RvcFJlY29yZGluZ09wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgcGF0aCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uLCB3aGVyZSB0aGUgcmVzdWx0aW5nIHZpZGVvIHNob3VsZCBiZSB1cGxvYWRlZC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWQ6IGh0dHAvaHR0cHMsIGZ0cC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bGwgb3IgZW1wdHkgc3RyaW5nIHZhbHVlICh0aGUgZGVmYXVsdCBzZXR0aW5nKSBtZWFucyB0aGUgY29udGVudCBvZiByZXN1bHRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2hvdWxkIGJlIGVuY29kZWQgYXMgQmFzZTY0IGFuZCBwYXNzZWQgYXMgdGhlIGVuZHBvdW50IHJlc3BvbnNlIHZhbHVlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBnZW5lcmF0ZWQgbWVkaWEgZmlsZSBpcyB0b28gYmlnIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXQgaW50byB0aGUgYXZhaWxhYmxlIHByb2Nlc3MgbWVtb3J5LlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB1c2VyIC0gVGhlIG5hbWUgb2YgdGhlIHVzZXIgZm9yIHRoZSByZW1vdGUgYXV0aGVudGljYXRpb24uXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhc3MgLSBUaGUgcGFzc3dvcmQgZm9yIHRoZSByZW1vdGUgYXV0aGVudGljYXRpb24uXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1ldGhvZCAtIFRoZSBodHRwIG11bHRpcGFydCB1cGxvYWQgbWV0aG9kIG5hbWUuIFRoZSAnUFVUJyBvbmUgaXMgdXNlZCBieSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBoZWFkZXJzIC0gQWRkaXRpb25hbCBoZWFkZXJzIG1hcHBpbmcgZm9yIG11bHRpcGFydCBodHRwKHMpIHVwbG9hZHNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmlsZUZpZWxkTmFtZSBbZmlsZV0gLSBUaGUgbmFtZSBvZiB0aGUgZm9ybSBmaWVsZCwgd2hlcmUgdGhlIGZpbGUgY29udGVudCBCTE9CIHNob3VsZCBiZSBzdG9yZWQgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkgez9PYmplY3R8QXJyYXk8UGFpcj59IGZvcm1GaWVsZHMgLSBBZGRpdGlvbmFsIGZvcm0gZmllbGRzIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKi9cblxuLyoqXG4gKiBTdG9wIHJlY29yZGluZyB0aGUgc2NyZWVuLlxuICogSWYgbm8gc2NyZWVuIHJlY29yZGluZyBoYXMgYmVlbiBzdGFydGVkIGJlZm9yZSB0aGVuIHRoZSBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHs/U3RvcFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSByZWNvcmRlZCBtZWRpYSBmaWxlIGlmICdyZW1vdGVQYXRoJ1xuICogICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGlzIGZhbHN5IG9yIGFuIGVtcHR5IHN0cmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgbmFtZSBvZiBhIG1lZGlhIGZpbGVcbiAqICAgICAgICAgICAgICAgICBvciB0aGUgZmlsZSBjb250ZW50IGNhbm5vdCBiZSB1cGxvYWRlZCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uXG4gKiAgICAgICAgICAgICAgICAgb3Igc2NyZWVuIHJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xuY29tbWFuZHMuc3RvcFJlY29yZGluZ1NjcmVlbiA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BSZWNvcmRpbmdTY3JlZW4gKG9wdGlvbnMgPSB7fSkge1xuICBhd2FpdCB2ZXJpZnlTY3JlZW5SZWNvcmRJc1N1cHBvcnRlZCh0aGlzLmFkYiwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuXG4gIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgdGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcy5zdG9wcGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgdGVybWluYXRlQmFja2dyb3VuZFNjcmVlblJlY29yZGluZyh0aGlzLmFkYiwgZmFsc2UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihlcnIubWVzc2FnZSk7XG4gICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcykpIHtcbiAgICAgIGxvZy53YXJuKCdUaGUgcmVzdWx0aW5nIHZpZGVvIG1pZ2h0IGJlIGNvcnJ1cHRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChfLmlzRW1wdHkodGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcykpIHtcbiAgICBsb2cuaW5mbyhgU2NyZWVuIHJlY29yZGluZyBoYXMgbm90IGJlZW4gcHJldmlvdXNseSBzdGFydGVkIGJ5IEFwcGl1bS4gVGhlcmUgaXMgbm90aGluZyB0byBzdG9wYCk7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMucmVjb3JkaW5nUHJvY2VzcyAmJiB0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzLnJlY29yZGluZ1Byb2Nlc3MuaXNSdW5uaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMucmVjb3JkaW5nUHJvY2Vzcy5zdG9wKCdTSUdJTlQnLCBQUk9DRVNTX1NIVVRET1dOX1RJTUVPVVQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBVbmFibGUgdG8gc3RvcCBzY3JlZW4gcmVjb3JkaW5nIHdpdGhpbiAke1BST0NFU1NfU0hVVERPV05fVElNRU9VVH1tc2ApO1xuICAgIH1cbiAgICB0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzLnJlY29yZGluZ1Byb2Nlc3MgPSBudWxsO1xuICB9XG5cbiAgaWYgKF8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzLnJlY29yZHMpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYE5vIHNjcmVlbiByZWNvcmRpbmdzIGhhdmUgYmVlbiBzdG9yZWQgb24gdGhlIGRldmljZSBzbyBmYXIuIGAgK1xuICAgICAgYEFyZSB5b3Ugc3VyZSB0aGUgJHtTQ1JFRU5SRUNPUkRfQklOQVJZfSB1dGlsaXR5IHdvcmtzIGFzIGV4cGVjdGVkP2ApO1xuICB9XG5cbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICB0cnkge1xuICAgIGNvbnN0IGxvY2FsUmVjb3JkcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcGF0aE9uRGV2aWNlIG9mIHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMucmVjb3Jkcykge1xuICAgICAgbG9jYWxSZWNvcmRzLnB1c2gocGF0aC5yZXNvbHZlKHRtcFJvb3QsIHBhdGgucG9zaXguYmFzZW5hbWUocGF0aE9uRGV2aWNlKSkpO1xuICAgICAgYXdhaXQgdGhpcy5hZGIucHVsbChwYXRoT25EZXZpY2UsIF8ubGFzdChsb2NhbFJlY29yZHMpKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJpbXJhZihwYXRoT25EZXZpY2UpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0RmlsZVBhdGggPSBfLmxhc3QobG9jYWxSZWNvcmRzKTtcbiAgICBpZiAobG9jYWxSZWNvcmRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGxvZy5pbmZvKGBHb3QgJHtsb2NhbFJlY29yZHMubGVuZ3RofSBzY3JlZW4gcmVjb3JkaW5ncy4gVHJ5aW5nIHRvIG1lcmdlIHRoZW1gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdEZpbGVQYXRoID0gYXdhaXQgbWVyZ2VTY3JlZW5SZWNvcmRzKGxvY2FsUmVjb3Jkcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGBDYW5ub3QgbWVyZ2UgdGhlIHJlY29yZGVkIGZpbGVzLiBUaGUgbW9zdCByZWNlbnQgc2NyZWVuIHJlY29yZGluZyBpcyBnb2luZyB0byBiZSByZXR1cm5lZCBhcyB0aGUgcmVzdWx0LiBgICtcbiAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdXBsb2FkUmVjb3JkZWRNZWRpYShyZXN1bHRGaWxlUGF0aCwgb3B0aW9ucy5yZW1vdGVQYXRoLCBvcHRpb25zKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgdGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcyA9IG51bGw7XG4gIH1cbn07XG5cblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvcmVjb3Jkc2NyZWVuLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
321
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9yZWNvcmRzY3JlZW4uanMiXSwibmFtZXMiOlsiY29tbWFuZHMiLCJSRVRSWV9QQVVTRSIsIlJFVFJZX1RJTUVPVVQiLCJNQVhfUkVDT1JESU5HX1RJTUVfU0VDIiwiTUFYX1RJTUVfU0VDIiwiREVGQVVMVF9SRUNPUkRJTkdfVElNRV9TRUMiLCJQUk9DRVNTX1NIVVRET1dOX1RJTUVPVVQiLCJTQ1JFRU5SRUNPUkRfQklOQVJZIiwiREVGQVVMVF9FWFQiLCJNSU5fRU1VTEFUT1JfQVBJX0xFVkVMIiwiRkZNUEVHX0JJTkFSWSIsInN5c3RlbSIsImlzV2luZG93cyIsInVwbG9hZFJlY29yZGVkTWVkaWEiLCJsb2NhbEZpbGUiLCJyZW1vdGVQYXRoIiwidXBsb2FkT3B0aW9ucyIsIl8iLCJpc0VtcHR5Iiwic2l6ZSIsImZzIiwic3RhdCIsImxvZyIsImRlYnVnIiwidXRpbCIsInRvUmVhZGFibGVTaXplU3RyaW5nIiwidG9Jbk1lbW9yeUJhc2U2NCIsInRvU3RyaW5nIiwidXNlciIsInBhc3MiLCJtZXRob2QiLCJoZWFkZXJzIiwiZmlsZUZpZWxkTmFtZSIsImZvcm1GaWVsZHMiLCJvcHRpb25zIiwiYXV0aCIsIm5ldCIsInVwbG9hZEZpbGUiLCJ2ZXJpZnlTY3JlZW5SZWNvcmRJc1N1cHBvcnRlZCIsImFkYiIsImlzRW11bGF0b3IiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwiRXJyb3IiLCJzY2hlZHVsZVNjcmVlblJlY29yZCIsInJlY29yZGluZ1Byb3BlcnRpZXMiLCJzdG9wcGVkIiwidGltZXIiLCJ2aWRlb1NpemUiLCJiaXRSYXRlIiwidGltZUxpbWl0IiwiYnVnUmVwb3J0IiwiY3VycmVudFRpbWVMaW1pdCIsImhhc1ZhbHVlIiwiY3VycmVudFRpbWVMaW1pdEludCIsInBhcnNlSW50IiwiaXNOYU4iLCJwYXRoT25EZXZpY2UiLCJ1dWlkVjQiLCJzdWJzdHJpbmciLCJyZWNvcmRpbmdQcm9jIiwic2NyZWVucmVjb3JkIiwib24iLCJjdXJyZW50RHVyYXRpb24iLCJnZXREdXJhdGlvbiIsImFzU2Vjb25kcyIsInRvRml4ZWQiLCJ0aW1lTGltaXRJbnQiLCJjaHVua0R1cmF0aW9uIiwiY2F0Y2giLCJlIiwiZXJyb3IiLCJzdGFjayIsInN0YXJ0IiwiZmlsZUV4aXN0cyIsIndhaXRNcyIsImludGVydmFsTXMiLCJyZWNvcmRzIiwicHVzaCIsInJlY29yZGluZ1Byb2Nlc3MiLCJtZXJnZVNjcmVlblJlY29yZHMiLCJtZWRpYUZpbGVzIiwid2hpY2giLCJjb25maWdDb250ZW50IiwibWFwIiwieCIsImpvaW4iLCJjb25maWdGaWxlIiwicGF0aCIsInJlc29sdmUiLCJkaXJuYW1lIiwid3JpdGVGaWxlIiwicmVzdWx0IiwiTWF0aCIsImZsb29yIiwiRGF0ZSIsImFyZ3MiLCJpbmZvIiwidGVybWluYXRlQmFja2dyb3VuZFNjcmVlblJlY29yZGluZyIsImZvcmNlIiwicGlkcyIsImdldFBJRHNCeU5hbWUiLCJwIiwic2hlbGwiLCJlcnIiLCJtZXNzYWdlIiwic3RhcnRSZWNvcmRpbmdTY3JlZW4iLCJmb3JjZVJlc3RhcnQiLCJzdG9wUmVjb3JkaW5nU2NyZWVuIiwid2FybiIsIl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzIiwicmVjb3JkIiwicmltcmFmIiwidGltZW91dCIsInBhcnNlRmxvYXQiLCJ0aW1pbmciLCJUaW1lciIsImlzUnVubmluZyIsInN0b3AiLCJlcnJvckFuZFRocm93IiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwibG9jYWxSZWNvcmRzIiwicG9zaXgiLCJiYXNlbmFtZSIsInB1bGwiLCJsYXN0IiwicmVzdWx0RmlsZVBhdGgiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsUUFBUSxHQUFHLEVBQWpCOztBQUVBLE1BQU1DLFdBQVcsR0FBRyxHQUFwQjtBQUNBLE1BQU1DLGFBQWEsR0FBRyxJQUF0QjtB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Q0FBVSwyR0FBRCxHQUNOLG1CQUFrQnZDLENBQUMsQ0FBQ21DLE9BQVEsRUFEL0I7QUFFRDtBQUNGOztBQUNELFdBQU8sTUFBTTVGLG1CQUFtQixDQUFDbUgsY0FBRCxFQUFpQjlGLE9BQU8sQ0FBQ25CLFVBQXpCLEVBQXFDbUIsT0FBckMsQ0FBaEM7QUFDRCxHQWxCRCxTQWtCVTtBQUNSLFVBQU1kLFlBQUc0RixNQUFILENBQVVRLE9BQVYsQ0FBTjtBQUNBLFNBQUtWLDBCQUFMLEdBQWtDLElBQWxDO0FBQ0Q7QUFDRixDQTFERDs7ZUE4RGU5RyxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsLCBmcywgbmV0LCB0ZW1wRGlyLCBzeXN0ZW0sIHRpbWluZyB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbmNvbnN0IFJFVFJZX1BBVVNFID0gMzAwO1xuY29uc3QgUkVUUllfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBNQVhfUkVDT1JESU5HX1RJTUVfU0VDID0gNjAgKiAzO1xuY29uc3QgTUFYX1RJTUVfU0VDID0gNjAgKiAzMDtcbmNvbnN0IERFRkFVTFRfUkVDT1JESU5HX1RJTUVfU0VDID0gTUFYX1JFQ09SRElOR19USU1FX1NFQztcbmNvbnN0IFBST0NFU1NfU0hVVERPV05fVElNRU9VVCA9IDEwICogMTAwMDtcbmNvbnN0IFNDUkVFTlJFQ09SRF9CSU5BUlkgPSAnc2NyZWVucmVjb3JkJztcbmNvbnN0IERFRkFVTFRfRVhUID0gJy5tcDQnO1xuY29uc3QgTUlOX0VNVUxBVE9SX0FQSV9MRVZFTCA9IDI3O1xuY29uc3QgRkZNUEVHX0JJTkFSWSA9IGBmZm1wZWcke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5cbmFzeW5jIGZ1bmN0aW9uIHVwbG9hZFJlY29yZGVkTWVkaWEgKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCA9IG51bGwsIHVwbG9hZE9wdGlvbnMgPSB7fSkge1xuICBpZiAoXy5pc0VtcHR5KHJlbW90ZVBhdGgpKSB7XG4gICAgY29uc3Qge3NpemV9ID0gYXdhaXQgZnMuc3RhdChsb2NhbEZpbGUpO1xuICAgIGxvZy5kZWJ1ZyhgVGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBzY3JlZW4gcmVjb3JkaW5nIGlzICR7dXRpbC50b1JlYWRhYmxlU2l6ZVN0cmluZyhzaXplKX1gKTtcbiAgICByZXR1cm4gKGF3YWl0IHV0aWwudG9Jbk1lbW9yeUJhc2U2NChsb2NhbEZpbGUpKS50b1N0cmluZygpO1xuICB9XG5cbiAgY29uc3Qge3VzZXIsIHBhc3MsIG1ldGhvZCwgaGVhZGVycywgZmlsZUZpZWxkTmFtZSwgZm9ybUZpZWxkc30gPSB1cGxvYWRPcHRpb25zO1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIG1ldGhvZDogbWV0aG9kIHx8ICdQVVQnLFxuICAgIGhlYWRlcnMsXG4gICAgZmlsZUZpZWxkTmFtZSxcbiAgICBmb3JtRmllbGRzLFxuICB9O1xuICBpZiAodXNlciAmJiBwYXNzKSB7XG4gICAgb3B0aW9ucy5hdXRoID0ge3VzZXIsIHBhc3N9O1xuICB9XG4gIGF3YWl0IG5ldC51cGxvYWRGaWxlKGxvY2FsRmlsZSwgcmVtb3RlUGF0aCwgb3B0aW9ucyk7XG4gIHJldHVybiAnJztcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U2NyZWVuUmVjb3JkSXNTdXBwb3J0ZWQgKGFkYiwgaXNFbXVsYXRvcikge1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpO1xuICBpZiAoaXNFbXVsYXRvciAmJiBhcGlMZXZlbCA8IE1JTl9FTVVMQVRPUl9BUElfTEVWRUwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmVlbiByZWNvcmRpbmcgZG9lcyBub3Qgd29yayBvbiBlbXVsYXRvcnMgcnVubmluZyBBbmRyb2lkIEFQSSBsZXZlbCBsZXNzIHRoYW4gJHtNSU5fRU1VTEFUT1JfQVBJX0xFVkVMfWApO1xuICB9XG4gIGlmIChhcGlMZXZlbCA8IDE5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTY3JlZW4gcmVjb3JkaW5nIG5vdCBhdmFpbGFibGUgb24gQVBJIExldmVsICR7YXBpTGV2ZWx9LiBNaW5pbXVtIEFQSSBMZXZlbCBpcyAxOS5gKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzY2hlZHVsZVNjcmVlblJlY29yZCAoYWRiLCByZWNvcmRpbmdQcm9wZXJ0aWVzKSB7XG4gIGlmIChyZWNvcmRpbmdQcm9wZXJ0aWVzLnN0b3BwZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgdGltZXIsXG4gICAgdmlkZW9TaXplLFxuICAgIGJpdFJhdGUsXG4gICAgdGltZUxpbWl0LFxuICAgIGJ1Z1JlcG9ydCxcbiAgfSA9IHJlY29yZGluZ1Byb3BlcnRpZXM7XG5cbiAgbGV0IGN1cnJlbnRUaW1lTGltaXQgPSBNQVhfUkVDT1JESU5HX1RJTUVfU0VDO1xuICBpZiAodXRpbC5oYXNWYWx1ZShyZWNvcmRpbmdQcm9wZXJ0aWVzLmN1cnJlbnRUaW1lTGltaXQpKSB7XG4gICAgY29uc3QgY3VycmVudFRpbWVMaW1pdEludCA9IHBhcnNlSW50KHJlY29yZGluZ1Byb3BlcnRpZXMuY3VycmVudFRpbWVMaW1pdCwgMTApO1xuICAgIGlmICghaXNOYU4oY3VycmVudFRpbWVMaW1pdEludCkgJiYgY3VycmVudFRpbWVMaW1pdEludCA8IE1BWF9SRUNPUkRJTkdfVElNRV9TRUMpIHtcbiAgICAgIGN1cnJlbnRUaW1lTGltaXQgPSBjdXJyZW50VGltZUxpbWl0SW50O1xuICAgIH1cbiAgfVxuICBjb25zdCBwYXRoT25EZXZpY2UgPSBgL3NkY2FyZC8ke3V0aWwudXVpZFY0KCkuc3Vic3RyaW5nKDAsIDgpfSR7REVGQVVMVF9FWFR9YDtcbiAgY29uc3QgcmVjb3JkaW5nUHJvYyA9IGFkYi5zY3JlZW5yZWNvcmQocGF0aE9uRGV2aWNlLCB7XG4gICAgdmlkZW9TaXplLFxuICAgIGJpdFJhdGUsXG4gICAgdGltZUxpbWl0OiBjdXJyZW50VGltZUxpbWl0LFxuICAgIGJ1Z1JlcG9ydCxcbiAgfSk7XG5cbiAgcmVjb3JkaW5nUHJvYy5vbignZW5kJywgKCkgPT4ge1xuICAgIGlmIChyZWNvcmRpbmdQcm9wZXJ0aWVzLnN0b3BwZWQgfHwgIXV0aWwuaGFzVmFsdWUodGltZUxpbWl0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJyZW50RHVyYXRpb24gPSB0aW1lci5nZXREdXJhdGlvbigpLmFzU2Vjb25kcy50b0ZpeGVkKDApO1xuICAgIGxvZy5kZWJ1ZyhgVGhlIG92ZXJhbGwgc2NyZWVuIHJlY29yZGluZyBkdXJhdGlvbiBpcyAke2N1cnJlbnREdXJhdGlvbn1zIHNvIGZhcmApO1xuICAgIGNvbnN0IHRpbWVMaW1pdEludCA9IHBhcnNlSW50KHRpbWVMaW1pdCwgMTApO1xuICAgIGlmIChpc05hTih0aW1lTGltaXRJbnQpIHx8IGN1cnJlbnREdXJhdGlvbiA+PSB0aW1lTGltaXRJbnQpIHtcbiAgICAgIGxvZy5kZWJ1ZygnVGhlcmUgaXMgbm8gbmVlZCB0byBzdGFydCB0aGUgbmV4dCByZWNvcmRpbmcgY2h1bmsnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZWNvcmRpbmdQcm9wZXJ0aWVzLmN1cnJlbnRUaW1lTGltaXQgPSB0aW1lTGltaXRJbnQgLSBjdXJyZW50RHVyYXRpb247XG4gICAgY29uc3QgY2h1bmtEdXJhdGlvbiA9IHJlY29yZGluZ1Byb3BlcnRpZXMuY3VycmVudFRpbWVMaW1pdCA8IE1BWF9SRUNPUkRJTkdfVElNRV9TRUNcbiAgICAgID8gcmVjb3JkaW5nUHJvcGVydGllcy5jdXJyZW50VGltZUxpbWl0XG4gICAgICA6IE1BWF9SRUNPUkRJTkdfVElNRV9TRUM7XG4gICAgbG9nLmRlYnVnKGBTdGFydGluZyB0aGUgbmV4dCAke2NodW5rRHVyYXRpb259cy1jaHVuayBgICtcbiAgICAgIGBvZiBzY3JlZW4gcmVjb3JkaW5nIGluIG9yZGVyIHRvIGFjaGlldmUgJHt0aW1lTGltaXRJbnR9cyB0b3RhbCBkdXJhdGlvbmApO1xuICAgIHNjaGVkdWxlU2NyZWVuUmVjb3JkKGFkYiwgcmVjb3JkaW5nUHJvcGVydGllcylcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICBsb2cuZXJyb3IoZS5zdGFjayk7XG4gICAgICAgIHJlY29yZGluZ1Byb3BlcnRpZXMuc3RvcHBlZCA9IHRydWU7XG4gICAgICB9KTtcbiAgfSk7XG5cbiAgYXdhaXQgcmVjb3JkaW5nUHJvYy5zdGFydCgwKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IGFkYi5maWxlRXhpc3RzKHBhdGhPbkRldmljZSksXG4gICAgICB7d2FpdE1zOiBSRVRSWV9USU1FT1VULCBpbnRlcnZhbE1zOiBSRVRSWV9QQVVTRX0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZXhwZWN0ZWQgc2NyZWVuIHJlY29yZCBmaWxlICcke3BhdGhPbkRldmljZX0nIGRvZXMgbm90IGV4aXN0IGFmdGVyICR7UkVUUllfVElNRU9VVH1tcy4gYCArXG4gICAgICBgSXMgJHtTQ1JFRU5SRUNPUkRfQklOQVJZfSB1dGlsaXR5IGF2YWlsYWJsZSBhbmQgb3BlcmF0aW9uYWwgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0P2ApO1xuICB9XG5cbiAgcmVjb3JkaW5nUHJvcGVydGllcy5yZWNvcmRzLnB1c2gocGF0aE9uRGV2aWNlKTtcbiAgcmVjb3JkaW5nUHJvcGVydGllcy5yZWNvcmRpbmdQcm9jZXNzID0gcmVjb3JkaW5nUHJvYztcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWVyZ2VTY3JlZW5SZWNvcmRzIChtZWRpYUZpbGVzKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMud2hpY2goRkZNUEVHX0JJTkFSWSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7RkZNUEVHX0JJTkFSWX0gdXRpbGl0eSBpcyBub3QgYXZhaWxhYmxlIGluIFBBVEguIFBsZWFzZSBpbnN0YWxsIGl0IGZyb20gaHR0cHM6Ly93d3cuZmZtcGVnLm9yZy9gKTtcbiAgfVxuICBjb25zdCBjb25maWdDb250ZW50ID0gbWVkaWFGaWxlc1xuICAgIC5tYXAoKHgpID0+IGBmaWxlICcke3h9J2ApXG4gICAgLmpvaW4oJ1xcbicpO1xuICBjb25zdCBjb25maWdGaWxlID0gcGF0aC5yZXNvbHZlKHBhdGguZGlybmFtZShtZWRpYUZpbGVzWzBdKSwgJ2NvbmZpZy50eHQnKTtcbiAgYXdhaXQgZnMud3JpdGVGaWxlKGNvbmZpZ0ZpbGUsIGNvbmZpZ0NvbnRlbnQsICd1dGY4Jyk7XG4gIGxvZy5kZWJ1ZyhgR2VuZXJhdGVkIGZmbXBlZyBtZXJnaW5nIGNvbmZpZyAnJHtjb25maWdGaWxlfScgd2l0aCBpdGVtczpcXG4ke2NvbmZpZ0NvbnRlbnR9YCk7XG4gIGNvbnN0IHJlc3VsdCA9IHBhdGgucmVzb2x2ZShwYXRoLmRpcm5hbWUobWVkaWFGaWxlc1swXSksIGBtZXJnZV8ke01hdGguZmxvb3IobmV3IERhdGUoKSl9JHtERUZBVUxUX0VYVH1gKTtcbiAgY29uc3QgYXJncyA9IFsnLXNhZmUnLCAnMCcsICctZicsICdjb25jYXQnLCAnLWknLCBjb25maWdGaWxlLCAnLWMnLCAnY29weScsIHJlc3VsdF07XG4gIGxvZy5pbmZvKGBJbml0aWF0aW5nIHNjcmVlbiByZWNvcmRzIG1lcmdpbmcgdXNpbmcgdGhlIGNvbW1hbmQgJyR7RkZNUEVHX0JJTkFSWX0gJHthcmdzLmpvaW4oJyAnKX0nYCk7XG4gIGF3YWl0IGV4ZWMoRkZNUEVHX0JJTkFSWSwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUJhY2tncm91bmRTY3JlZW5SZWNvcmRpbmcgKGFkYiwgZm9yY2UgPSB0cnVlKSB7XG4gIGNvbnN0IHBpZHMgPSAoYXdhaXQgYWRiLmdldFBJRHNCeU5hbWUoU0NSRUVOUkVDT1JEX0JJTkFSWSkpXG4gICAgLm1hcCgocCkgPT4gYCR7cH1gKTtcbiAgaWYgKF8uaXNFbXB0eShwaWRzKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLnNoZWxsKFsna2lsbCcsIGZvcmNlID8gJy0xNScgOiAnLTInLCAuLi5waWRzXSk7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBfLmlzRW1wdHkoYXdhaXQgYWRiLmdldFBJRHNCeU5hbWUoU0NSRUVOUkVDT1JEX0JJTkFSWSkpLCB7XG4gICAgICB3YWl0TXM6IFBST0NFU1NfU0hVVERPV05fVElNRU9VVCxcbiAgICAgIGludGVydmFsTXM6IDUwMCxcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gc3RvcCB0aGUgYmFja2dyb3VuZCBzY3JlZW4gcmVjb3JkaW5nOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFJlY29yZGluZ09wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgcGF0aCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uLCB3aGVyZSB0aGUgY2FwdHVyZWQgdmlkZW8gc2hvdWxkIGJlIHVwbG9hZGVkLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBwcm90b2NvbHMgYXJlIHN1cHBvcnRlZDogaHR0cC9odHRwcywgZnRwLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVsbCBvciBlbXB0eSBzdHJpbmcgdmFsdWUgKHRoZSBkZWZhdWx0IHNldHRpbmcpIG1lYW5zIHRoZSBjb250ZW50IG9mIHJlc3VsdGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBzaG91bGQgYmUgZW5jb2RlZCBhcyBCYXNlNjQgYW5kIHBhc3NlZCBhcyB0aGUgZW5kcG91bnQgcmVzcG9uc2UgdmFsdWUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGdlbmVyYXRlZCBtZWRpYSBmaWxlIGlzIHRvbyBiaWcgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpdCBpbnRvIHRoZSBhdmFpbGFibGUgcHJvY2VzcyBtZW1vcnkuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBvbmx5IGhhcyBhbiBlZmZlY3QgaWYgdGhlcmUgaXMgc2NyZWVuIHJlY29yZGluZyBwcm9jZXNzIGluIHByb2dyZWVzc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGBmb3JjZVJlc3RhcnRgIHBhcmFtZXRlciBpcyBub3Qgc2V0IHRvIGB0cnVlYC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdXNlciAtIFRoZSBuYW1lIG9mIHRoZSB1c2VyIGZvciB0aGUgcmVtb3RlIGF1dGhlbnRpY2F0aW9uLiBPbmx5IHdvcmtzIGlmIGByZW1vdGVQYXRoYCBpcyBwcm92aWRlZC5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGFzcyAtIFRoZSBwYXNzd29yZCBmb3IgdGhlIHJlbW90ZSBhdXRoZW50aWNhdGlvbi4gT25seSB3b3JrcyBpZiBgcmVtb3RlUGF0aGAgaXMgcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1ldGhvZCBbUFVUXSAtIFRoZSBodHRwIG11bHRpcGFydCB1cGxvYWQgbWV0aG9kIG5hbWUuIE9ubHkgd29ya3MgaWYgYHJlbW90ZVBhdGhgIGlzIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBoZWFkZXJzIC0gQWRkaXRpb25hbCBoZWFkZXJzIG1hcHBpbmcgZm9yIG11bHRpcGFydCBodHRwKHMpIHVwbG9hZHNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmlsZUZpZWxkTmFtZSBbZmlsZV0gLSBUaGUgbmFtZSBvZiB0aGUgZm9ybSBmaWVsZCwgd2hlcmUgdGhlIGZpbGUgY29udGVudCBCTE9CIHNob3VsZCBiZSBzdG9yZWQgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkgez9PYmplY3R8QXJyYXk8UGFpcj59IGZvcm1GaWVsZHMgLSBBZGRpdGlvbmFsIGZvcm0gZmllbGRzIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZpZGVvU2l6ZSAtIFRoZSBmb3JtYXQgaXMgd2lkdGh4aGVpZ2h0LlxuICogICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgZGV2aWNlJ3MgbmF0aXZlIGRpc3BsYXkgcmVzb2x1dGlvbiAoaWYgc3VwcG9ydGVkKSxcbiAqICAgICAgICAgICAgICAgICAgMTI4MHg3MjAgaWYgbm90LiBGb3IgYmVzdCByZXN1bHRzLFxuICogICAgICAgICAgICAgICAgICB1c2UgYSBzaXplIHN1cHBvcnRlZCBieSB5b3VyIGRldmljZSdzIEFkdmFuY2VkIFZpZGVvIENvZGluZyAoQVZDKSBlbmNvZGVyLlxuICogICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgXCIxMjgweDcyMFwiXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBidWdSZXBvcnQgLSBTZXQgaXQgdG8gYHRydWVgIGluIG9yZGVyIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgdmlkZW8gb3ZlcmxheSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgYSB0aW1lc3RhbXAsIHRoYXQgaXMgaGVscGZ1bCBpbiB2aWRlb3MgY2FwdHVyZWQgdG8gaWxsdXN0cmF0ZSBidWdzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgc2luY2UgQVBJIGxldmVsIDI3IChBbmRyb2lkIFApLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gdGltZUxpbWl0IC0gVGhlIG1heGltdW0gcmVjb3JkaW5nIHRpbWUsIGluIHNlY29uZHMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE4MCAoMyBtaW51dGVzKS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIGlzIDE4MDAgKDMwIG1pbnV0ZXMpLiBJZiB0aGUgcGFzc2VkIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAxODAgdGhlblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFsZ29yaXRobSB3aWxsIHRyeSB0byBzY2hlZHVsZSBtdWx0aXBsZSBzY3JlZW4gcmVjb3JkaW5nIGNodW5rcyBhbmQgbWVyZ2UgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmcgdmlkZW9zIGludG8gYSBzaW5nbGUgbWVkaWEgZmlsZSB1c2luZyBgZmZtcGVnYCB1dGlsaXR5LlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHV0aWxpdHkgaXMgbm90IGF2YWlsYWJsZSBpbiBQQVRIIHRoZW4gdGhlIG1vc3QgcmVjZW50IHNjcmVlbiByZWNvcmRpbmcgY2h1bmsgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvaW5nIHRvIGJlIHJldHVybmVkLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gYml0UmF0ZSAtIFRoZSB2aWRlbyBiaXQgcmF0ZSBmb3IgdGhlIHZpZGVvLCBpbiBiaXRzIHBlciBzZWNvbmQuXG4gKiAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA0MDAwMDAwICg0IE1iaXQvcykuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqICAgICAgICAgICAgICAgIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGZvcmNlUmVzdGFydCAtIFdoZXRoZXIgdG8gdHJ5IHRvIGNhdGNoIGFuZCB1cGxvYWQvcmV0dXJuIHRoZSBjdXJyZW50bHkgcnVubmluZyBzY3JlZW4gcmVjb3JkaW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYGZhbHNlYCwgdGhlIGRlZmF1bHQgc2V0dGluZykgb3IgaWdub3JlIHRoZSByZXN1bHQgb2YgaXQgYW5kIHN0YXJ0IGEgbmV3IHJlY29yZGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlbHkgKGB0cnVlYCkuXG4gKi9cblxuLyoqXG4gKiBSZWNvcmQgdGhlIGRpc3BsYXkgb2YgYSByZWFsIGRldmljZXMgcnVubmluZyBBbmRyb2lkIDQuNCAoQVBJIGxldmVsIDE5KSBhbmQgaGlnaGVyLlxuICogRW11bGF0b3JzIGFyZSBzdXBwb3J0ZWQgc2luY2UgQVBJIGxldmVsIDI3IChBbmRyb2lkIFApLlxuICogSXQgcmVjb3JkcyBzY3JlZW4gYWN0aXZpdHkgdG8gYW4gTVBFRy00IGZpbGUuIEF1ZGlvIGlzIG5vdCByZWNvcmRlZCB3aXRoIHRoZSB2aWRlbyBmaWxlLlxuICogSWYgc2NyZWVuIHJlY29yZGluZyBoYXMgYmVlbiBhbHJlYWR5IHN0YXJ0ZWQgdGhlbiB0aGUgY29tbWFuZCB3aWxsIHN0b3AgaXQgZm9yY2VmdWxseSBhbmQgc3RhcnQgYSBuZXcgb25lLlxuICogVGhlIHByZXZpb3VzbHkgcmVjb3JkZWQgdmlkZW8gZmlsZSB3aWxsIGJlIGRlbGV0ZWQuXG4gKlxuICogQHBhcmFtIHs/U3RhcnRSZWNvcmRpbmdPcHRpb25zfSBvcHRpb25zIC0gVGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICogQHJldHVybnMge3N0cmluZ30gQmFzZTY0LWVuY29kZWQgY29udGVudCBvZiB0aGUgcmVjb3JkZWQgbWVkaWEgZmlsZSBpZlxuICogICAgICAgICAgICAgICAgICAgYW55IHNjcmVlbiByZWNvcmRpbmcgaXMgY3VycmVudGx5IHJ1bm5pbmcgb3IgYW4gZW1wdHkgc3RyaW5nLlxuICogQHRocm93cyB7RXJyb3J9IElmIHNjcmVlbiByZWNvcmRpbmcgaGFzIGZhaWxlZCB0byBzdGFydCBvciBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xuY29tbWFuZHMuc3RhcnRSZWNvcmRpbmdTY3JlZW4gPSBhc3luYyBmdW5jdGlvbiBzdGFydFJlY29yZGluZ1NjcmVlbiAob3B0aW9ucyA9IHt9KSB7XG4gIGF3YWl0IHZlcmlmeVNjcmVlblJlY29yZElzU3VwcG9ydGVkKHRoaXMuYWRiLCB0aGlzLmlzRW11bGF0b3IoKSk7XG5cbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBjb25zdCB7dmlkZW9TaXplLCB0aW1lTGltaXQgPSBERUZBVUxUX1JFQ09SRElOR19USU1FX1NFQywgYnVnUmVwb3J0LCBiaXRSYXRlLCBmb3JjZVJlc3RhcnR9ID0gb3B0aW9ucztcbiAgaWYgKCFmb3JjZVJlc3RhcnQpIHtcbiAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnN0b3BSZWNvcmRpbmdTY3JlZW4ob3B0aW9ucyk7XG4gIH1cblxuICBpZiAoYXdhaXQgdGVybWluYXRlQmFja2dyb3VuZFNjcmVlblJlY29yZGluZyh0aGlzLmFkYiwgdHJ1ZSkpIHtcbiAgICBsb2cud2FybihgVGhlcmUgd2VyZSBzb21lICR7U0NSRUVOUkVDT1JEX0JJTkFSWX0gcHJvY2VzcyBsZWZ0b3ZlcnMgcnVubmluZyBgICtcbiAgICAgIGBpbiB0aGUgYmFja2dyb3VuZC4gTWFrZSBzdXJlIHlvdSBzdG9wIHNjcmVlbiByZWNvcmRpbmcgZWFjaCB0aW1lIGFmdGVyIGl0IGlzIHN0YXJ0ZWQsIGAgK1xuICAgICAgYG90aGVyd2lzZSB0aGUgcmVjb3JkZWQgbWVkaWEgbWlnaHQgcXVpY2tseSBleGNlZWQgYWxsIHRoZSBmcmVlIHNwYWNlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5gKTtcbiAgfVxuXG4gIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgKHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMucmVjb3JkcyB8fCBbXSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJpbXJhZihyZWNvcmQpO1xuICAgIH1cbiAgICB0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzID0gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHRpbWVvdXQgPSBwYXJzZUZsb2F0KHRpbWVMaW1pdCk7XG4gIGlmIChpc05hTih0aW1lb3V0KSB8fCB0aW1lb3V0ID4gTUFYX1RJTUVfU0VDIHx8IHRpbWVvdXQgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHRpbWVMaW1pdCB2YWx1ZSBtdXN0IGJlIGluIHJhbmdlIFsxLCAke01BWF9USU1FX1NFQ31dIHNlY29uZHMuIGAgK1xuICAgICAgYFRoZSB2YWx1ZSBvZiAnJHt0aW1lTGltaXR9JyBoYXMgYmVlbiBwYXNzZWQgaW5zdGVhZC5gKTtcbiAgfVxuXG4gIHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMgPSB7XG4gICAgdGltZXI6IG5ldyB0aW1pbmcuVGltZXIoKS5zdGFydCgpLFxuICAgIHZpZGVvU2l6ZSxcbiAgICB0aW1lTGltaXQsXG4gICAgY3VycmVudFRpbWVMaW1pdDogdGltZUxpbWl0LFxuICAgIGJpdFJhdGUsXG4gICAgYnVnUmVwb3J0LFxuICAgIHJlY29yZHM6IFtdLFxuICAgIHJlY29yZGluZ1Byb2Nlc3M6IG51bGwsXG4gICAgc3RvcHBlZDogZmFsc2UsXG4gIH07XG4gIGF3YWl0IHNjaGVkdWxlU2NyZWVuUmVjb3JkKHRoaXMuYWRiLCB0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RvcFJlY29yZGluZ09wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgcGF0aCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uLCB3aGVyZSB0aGUgcmVzdWx0aW5nIHZpZGVvIHNob3VsZCBiZSB1cGxvYWRlZC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvdG9jb2xzIGFyZSBzdXBwb3J0ZWQ6IGh0dHAvaHR0cHMsIGZ0cC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bGwgb3IgZW1wdHkgc3RyaW5nIHZhbHVlICh0aGUgZGVmYXVsdCBzZXR0aW5nKSBtZWFucyB0aGUgY29udGVudCBvZiByZXN1bHRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgc2hvdWxkIGJlIGVuY29kZWQgYXMgQmFzZTY0IGFuZCBwYXNzZWQgYXMgdGhlIGVuZHBvdW50IHJlc3BvbnNlIHZhbHVlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBnZW5lcmF0ZWQgbWVkaWEgZmlsZSBpcyB0b28gYmlnIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXQgaW50byB0aGUgYXZhaWxhYmxlIHByb2Nlc3MgbWVtb3J5LlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSB1c2VyIC0gVGhlIG5hbWUgb2YgdGhlIHVzZXIgZm9yIHRoZSByZW1vdGUgYXV0aGVudGljYXRpb24uXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhc3MgLSBUaGUgcGFzc3dvcmQgZm9yIHRoZSByZW1vdGUgYXV0aGVudGljYXRpb24uXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IG1ldGhvZCAtIFRoZSBodHRwIG11bHRpcGFydCB1cGxvYWQgbWV0aG9kIG5hbWUuIFRoZSAnUFVUJyBvbmUgaXMgdXNlZCBieSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBoZWFkZXJzIC0gQWRkaXRpb25hbCBoZWFkZXJzIG1hcHBpbmcgZm9yIG11bHRpcGFydCBodHRwKHMpIHVwbG9hZHNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gZmlsZUZpZWxkTmFtZSBbZmlsZV0gLSBUaGUgbmFtZSBvZiB0aGUgZm9ybSBmaWVsZCwgd2hlcmUgdGhlIGZpbGUgY29udGVudCBCTE9CIHNob3VsZCBiZSBzdG9yZWQgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cChzKSB1cGxvYWRzXG4gKiBAcHJvcGVydHkgez9PYmplY3R8QXJyYXk8UGFpcj59IGZvcm1GaWVsZHMgLSBBZGRpdGlvbmFsIGZvcm0gZmllbGRzIGZvciBtdWx0aXBhcnQgaHR0cChzKSB1cGxvYWRzXG4gKi9cblxuLyoqXG4gKiBTdG9wIHJlY29yZGluZyB0aGUgc2NyZWVuLlxuICogSWYgbm8gc2NyZWVuIHJlY29yZGluZyBoYXMgYmVlbiBzdGFydGVkIGJlZm9yZSB0aGVuIHRoZSBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHs/U3RvcFJlY29yZGluZ09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBCYXNlNjQtZW5jb2RlZCBjb250ZW50IG9mIHRoZSByZWNvcmRlZCBtZWRpYSBmaWxlIGlmICdyZW1vdGVQYXRoJ1xuICogICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGlzIGZhbHN5IG9yIGFuIGVtcHR5IHN0cmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgbmFtZSBvZiBhIG1lZGlhIGZpbGVcbiAqICAgICAgICAgICAgICAgICBvciB0aGUgZmlsZSBjb250ZW50IGNhbm5vdCBiZSB1cGxvYWRlZCB0byB0aGUgcmVtb3RlIGxvY2F0aW9uXG4gKiAgICAgICAgICAgICAgICAgb3Igc2NyZWVuIHJlY29yZGluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xuY29tbWFuZHMuc3RvcFJlY29yZGluZ1NjcmVlbiA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BSZWNvcmRpbmdTY3JlZW4gKG9wdGlvbnMgPSB7fSkge1xuICBhd2FpdCB2ZXJpZnlTY3JlZW5SZWNvcmRJc1N1cHBvcnRlZCh0aGlzLmFkYiwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuXG4gIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMpKSB7XG4gICAgdGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcy5zdG9wcGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgdGVybWluYXRlQmFja2dyb3VuZFNjcmVlblJlY29yZGluZyh0aGlzLmFkYiwgZmFsc2UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybihlcnIubWVzc2FnZSk7XG4gICAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcykpIHtcbiAgICAgIGxvZy53YXJuKCdUaGUgcmVzdWx0aW5nIHZpZGVvIG1pZ2h0IGJlIGNvcnJ1cHRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChfLmlzRW1wdHkodGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcykpIHtcbiAgICBsb2cuaW5mbyhgU2NyZWVuIHJlY29yZGluZyBoYXMgbm90IGJlZW4gcHJldmlvdXNseSBzdGFydGVkIGJ5IEFwcGl1bS4gVGhlcmUgaXMgbm90aGluZyB0byBzdG9wYCk7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMucmVjb3JkaW5nUHJvY2VzcyAmJiB0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzLnJlY29yZGluZ1Byb2Nlc3MuaXNSdW5uaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMucmVjb3JkaW5nUHJvY2Vzcy5zdG9wKCdTSUdJTlQnLCBQUk9DRVNTX1NIVVRET1dOX1RJTUVPVVQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBVbmFibGUgdG8gc3RvcCBzY3JlZW4gcmVjb3JkaW5nIHdpdGhpbiAke1BST0NFU1NfU0hVVERPV05fVElNRU9VVH1tc2ApO1xuICAgIH1cbiAgICB0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzLnJlY29yZGluZ1Byb2Nlc3MgPSBudWxsO1xuICB9XG5cbiAgaWYgKF8uaXNFbXB0eSh0aGlzLl9zY3JlZW5SZWNvcmRpbmdQcm9wZXJ0aWVzLnJlY29yZHMpKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYE5vIHNjcmVlbiByZWNvcmRpbmdzIGhhdmUgYmVlbiBzdG9yZWQgb24gdGhlIGRldmljZSBzbyBmYXIuIGAgK1xuICAgICAgYEFyZSB5b3Ugc3VyZSB0aGUgJHtTQ1JFRU5SRUNPUkRfQklOQVJZfSB1dGlsaXR5IHdvcmtzIGFzIGV4cGVjdGVkP2ApO1xuICB9XG5cbiAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICB0cnkge1xuICAgIGNvbnN0IGxvY2FsUmVjb3JkcyA9IFtdO1xuICAgIGZvciAoY29uc3QgcGF0aE9uRGV2aWNlIG9mIHRoaXMuX3NjcmVlblJlY29yZGluZ1Byb3BlcnRpZXMucmVjb3Jkcykge1xuICAgICAgbG9jYWxSZWNvcmRzLnB1c2gocGF0aC5yZXNvbHZlKHRtcFJvb3QsIHBhdGgucG9zaXguYmFzZW5hbWUocGF0aE9uRGV2aWNlKSkpO1xuICAgICAgYXdhaXQgdGhpcy5hZGIucHVsbChwYXRoT25EZXZpY2UsIF8ubGFzdChsb2NhbFJlY29yZHMpKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnJpbXJhZihwYXRoT25EZXZpY2UpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0RmlsZVBhdGggPSBfLmxhc3QobG9jYWxSZWNvcmRzKTtcbiAgICBpZiAobG9jYWxSZWNvcmRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGxvZy5pbmZvKGBHb3QgJHtsb2NhbFJlY29yZHMubGVuZ3RofSBzY3JlZW4gcmVjb3JkaW5ncy4gVHJ5aW5nIHRvIG1lcmdlIHRoZW1gKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdEZpbGVQYXRoID0gYXdhaXQgbWVyZ2VTY3JlZW5SZWNvcmRzKGxvY2FsUmVjb3Jkcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGBDYW5ub3QgbWVyZ2UgdGhlIHJlY29yZGVkIGZpbGVzLiBUaGUgbW9zdCByZWNlbnQgc2NyZWVuIHJlY29yZGluZyBpcyBnb2luZyB0byBiZSByZXR1cm5lZCBhcyB0aGUgcmVzdWx0LiBgICtcbiAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdXBsb2FkUmVjb3JkZWRNZWRpYShyZXN1bHRGaWxlUGF0aCwgb3B0aW9ucy5yZW1vdGVQYXRoLCBvcHRpb25zKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgdGhpcy5fc2NyZWVuUmVjb3JkaW5nUHJvcGVydGllcyA9IG51bGw7XG4gIH1cbn07XG5cblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvcmVjb3Jkc2NyZWVuLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
@@ -15,7 +15,7 @@ var _lodash = _interopRequireDefault(require("lodash"));
15
15
 
16
16
  var _teen_process = require("teen_process");
17
17
 
18
- var _appiumSupport = require("appium-support");
18
+ var _support = require("@appium/support");
19
19
 
20
20
  const ADB_SHELL_FEATURE = 'adb_shell';
21
21
  let commands = {};
@@ -36,7 +36,7 @@ commands.mobileShell = async function mobileShell(opts = {}) {
36
36
 
37
37
  const adbArgs = [...this.adb.executable.defaultArgs, 'shell', command, ...(_lodash.default.isArray(args) ? args : [args])];
38
38
 
39
- _logger.default.debug(`Running '${this.adb.executable.path} ${_appiumSupport.util.quote(adbArgs)}'`);
39
+ _logger.default.debug(`Running '${this.adb.executable.path} ${_support.util.quote(adbArgs)}'`);
40
40
 
41
41
  try {
42
42
  const {
@@ -63,4 +63,4 @@ var _default = commands;
63
63
  exports.default = _default;require('source-map-support').install();
64
64
 
65
65
 
66
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9zaGVsbC5qcyJdLCJuYW1lcyI6WyJBREJfU0hFTExfRkVBVFVSRSIsImNvbW1hbmRzIiwibW9iaWxlU2hlbGwiLCJvcHRzIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJjb21tYW5kIiwiYXJncyIsInRpbWVvdXQiLCJpbmNsdWRlU3RkZXJyIiwiXyIsImlzU3RyaW5nIiwibG9nIiwiZXJyb3JBbmRUaHJvdyIsImFkYkFyZ3MiLCJhZGIiLCJleGVjdXRhYmxlIiwiZGVmYXVsdEFyZ3MiLCJpc0FycmF5IiwiZGVidWciLCJwYXRoIiwidXRpbCIsInF1b3RlIiwic3Rkb3V0Iiwic3RkZXJyIiwiZXJyIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxpQkFBaUIsR0FBRyxXQUExQjtBQUVBLElBQUlDLFFBQVEsR0FBRyxFQUFmOzs7QUFFQUEsUUFBUSxDQUFDQyxXQUFULEdBQXVCLGVBQWVBLFdBQWYsQ0FBNEJDLElBQUksR0FBRyxFQUFuQyxFQUF1QztBQUM1RCxPQUFLQyxvQkFBTCxDQUEwQkosaUJBQTFCO0FBRUEsUUFBTTtBQUNKSyxJQUFBQSxPQURJO0FBRUpDLElBQUFBLElBQUksR0FBRyxFQUZIO0FBR0pDLElBQUFBLE9BQU8sR0FBRyxLQUhOO0FBSUpDLElBQUFBO0FBSkksTUFLRkwsSUFMSjs7QUFPQSxNQUFJLENBQUNNLGdCQUFFQyxRQUFGLENBQVdMLE9BQVgsQ0FBTCxFQUEwQjtBQUN4Qk0sb0JBQUlDLGFBQUosQ0FBbUIscUNBQW5CO0FBQ0Q7O0FBRUQsUUFBTUMsT0FBTyxHQUFHLENBQ2QsR0FBRyxLQUFLQyxHQUFMLENBQVNDLFVBQVQsQ0FBb0JDLFdBRFQsRUFFZCxPQUZjLEVBR2RYLE9BSGMsRUFJZCxJQUFJSSxnQkFBRVEsT0FBRixDQUFVWCxJQUFWLElBQWtCQSxJQUFsQixHQUF5QixDQUFDQSxJQUFELENBQTdCLENBSmMsQ0FBaEI7O0FBTUFLLGtCQUFJTyxLQUFKLENBQVcsWUFBVyxLQUFLSixHQUFMLENBQVNDLFVBQVQsQ0FBb0JJLElBQUssSUFBR0Msb0JBQUtDLEtBQUwsQ0FBV1IsT0FBWCxDQUFvQixHQUF0RTs7QUFDQSxNQUFJO0FBQ0YsVUFBTTtBQUFDUyxNQUFBQSxNQUFEO0FBQVNDLE1BQUFBO0FBQVQsUUFBbUIsTUFBTSx3QkFBSyxLQUFLVCxHQUFMLENBQVNDLFVBQVQsQ0FBb0JJLElBQXpCLEVBQStCTixPQUEvQixFQUF3QztBQUFDTixNQUFBQTtBQUFELEtBQXhDLENBQS9COztBQUNBLFFBQUlDLGFBQUosRUFBbUI7QUFDakIsYUFBTztBQUNMYyxRQUFBQSxNQURLO0FBRUxDLFFBQUFBO0FBRkssT0FBUDtBQUlEOztBQUNELFdBQU9ELE1BQVA7QUFDRCxHQVRELENBU0UsT0FBT0UsR0FBUCxFQUFZO0FBQ1piLG9CQUFJQyxhQUFKLENBQW1CLHVCQUFzQlAsT0FBUSxtQkFBL0IsR0FDQyxtQkFBa0JtQixHQUFHLENBQUNDLE9BQVEsSUFEL0IsR0FFQyxXQUFVRCxHQUFHLENBQUNGLE1BQU8sYUFBWUUsR0FBRyxDQUFDRCxNQUFPLEVBRi9EO0FBR0Q7QUFDRixDQW5DRDs7ZUFzQ2V0QixRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGV4ZWMgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcblxuY29uc3QgQURCX1NIRUxMX0ZFQVRVUkUgPSAnYWRiX3NoZWxsJztcblxubGV0IGNvbW1hbmRzID0ge307XG5cbmNvbW1hbmRzLm1vYmlsZVNoZWxsID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2hlbGwgKG9wdHMgPSB7fSkge1xuICB0aGlzLmVuc3VyZUZlYXR1cmVFbmFibGVkKEFEQl9TSEVMTF9GRUFUVVJFKTtcblxuICBjb25zdCB7XG4gICAgY29tbWFuZCxcbiAgICBhcmdzID0gW10sXG4gICAgdGltZW91dCA9IDIwMDAwLFxuICAgIGluY2x1ZGVTdGRlcnIsXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghXy5pc1N0cmluZyhjb21tYW5kKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgJ2NvbW1hbmQnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG5cbiAgY29uc3QgYWRiQXJncyA9IFtcbiAgICAuLi50aGlzLmFkYi5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLFxuICAgICdzaGVsbCcsXG4gICAgY29tbWFuZCxcbiAgICAuLi4oXy5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFthcmdzXSlcbiAgXTtcbiAgbG9nLmRlYnVnKGBSdW5uaW5nICcke3RoaXMuYWRiLmV4ZWN1dGFibGUucGF0aH0gJHt1dGlsLnF1b3RlKGFkYkFyZ3MpfSdgKTtcbiAgdHJ5IHtcbiAgICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgZXhlYyh0aGlzLmFkYi5leGVjdXRhYmxlLnBhdGgsIGFkYkFyZ3MsIHt0aW1lb3V0fSk7XG4gICAgaWYgKGluY2x1ZGVTdGRlcnIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0ZG91dCxcbiAgICAgICAgc3RkZXJyXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gc3Rkb3V0O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGV4ZWN1dGUgdGhlICcke2NvbW1hbmR9JyBzaGVsbCBjb21tYW5kLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgU3RkT3V0OiAke2Vyci5zdGRvdXR9LiBTdGRFcnI6ICR7ZXJyLnN0ZGVycn1gKTtcbiAgfVxufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvc2hlbGwuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
66
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9zaGVsbC5qcyJdLCJuYW1lcyI6WyJBREJfU0hFTExfRkVBVFVSRSIsImNvbW1hbmRzIiwibW9iaWxlU2hlbGwiLCJvcHRzIiwiZW5zdXJlRmVhdHVyZUVuYWJsZWQiLCJjb21tYW5kIiwiYXJncyIsInRpbWVvdXQiLCJpbmNsdWRlU3RkZXJyIiwiXyIsImlzU3RyaW5nIiwibG9nIiwiZXJyb3JBbmRUaHJvdyIsImFkYkFyZ3MiLCJhZGIiLCJleGVjdXRhYmxlIiwiZGVmYXVsdEFyZ3MiLCJpc0FycmF5IiwiZGVidWciLCJwYXRoIiwidXRpbCIsInF1b3RlIiwic3Rkb3V0Iiwic3RkZXJyIiwiZXJyIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxpQkFBaUIsR0FBRyxXQUExQjtBQUVBLElBQUlDLFFBQVEsR0FBRyxFQUFmOzs7QUFFQUEsUUFBUSxDQUFDQyxXQUFULEdBQXVCLGVBQWVBLFdBQWYsQ0FBNEJDLElBQUksR0FBRyxFQUFuQyxFQUF1QztBQUM1RCxPQUFLQyxvQkFBTCxDQUEwQkosaUJBQTFCO0FBRUEsUUFBTTtBQUNKSyxJQUFBQSxPQURJO0FBRUpDLElBQUFBLElBQUksR0FBRyxFQUZIO0FBR0pDLElBQUFBLE9BQU8sR0FBRyxLQUhOO0FBSUpDLElBQUFBO0FBSkksTUFLRkwsSUFMSjs7QUFPQSxNQUFJLENBQUNNLGdCQUFFQyxRQUFGLENBQVdMLE9BQVgsQ0FBTCxFQUEwQjtBQUN4Qk0sb0JBQUlDLGFBQUosQ0FBbUIscUNBQW5CO0FBQ0Q7O0FBRUQsUUFBTUMsT0FBTyxHQUFHLENBQ2QsR0FBRyxLQUFLQyxHQUFMLENBQVNDLFVBQVQsQ0FBb0JDLFdBRFQsRUFFZCxPQUZjLEVBR2RYLE9BSGMsRUFJZCxJQUFJSSxnQkFBRVEsT0FBRixDQUFVWCxJQUFWLElBQWtCQSxJQUFsQixHQUF5QixDQUFDQSxJQUFELENBQTdCLENBSmMsQ0FBaEI7O0FBTUFLLGtCQUFJTyxLQUFKLENBQVcsWUFBVyxLQUFLSixHQUFMLENBQVNDLFVBQVQsQ0FBb0JJLElBQUssSUFBR0MsY0FBS0MsS0FBTCxDQUFXUixPQUFYLENBQW9CLEdBQXRFOztBQUNBLE1BQUk7QUFDRixVQUFNO0FBQUNTLE1BQUFBLE1BQUQ7QUFBU0MsTUFBQUE7QUFBVCxRQUFtQixNQUFNLHdCQUFLLEtBQUtULEdBQUwsQ0FBU0MsVUFBVCxDQUFvQkksSUFBekIsRUFBK0JOLE9BQS9CLEVBQXdDO0FBQUNOLE1BQUFBO0FBQUQsS0FBeEMsQ0FBL0I7O0FBQ0EsUUFBSUMsYUFBSixFQUFtQjtBQUNqQixhQUFPO0FBQ0xjLFFBQUFBLE1BREs7QUFFTEMsUUFBQUE7QUFGSyxPQUFQO0FBSUQ7O0FBQ0QsV0FBT0QsTUFBUDtBQUNELEdBVEQsQ0FTRSxPQUFPRSxHQUFQLEVBQVk7QUFDWmIsb0JBQUlDLGFBQUosQ0FBbUIsdUJBQXNCUCxPQUFRLG1CQUEvQixHQUNDLG1CQUFrQm1CLEdBQUcsQ0FBQ0MsT0FBUSxJQUQvQixHQUVDLFdBQVVELEdBQUcsQ0FBQ0YsTUFBTyxhQUFZRSxHQUFHLENBQUNELE1BQU8sRUFGL0Q7QUFHRDtBQUNGLENBbkNEOztlQXNDZXRCLFEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuY29uc3QgQURCX1NIRUxMX0ZFQVRVUkUgPSAnYWRiX3NoZWxsJztcblxubGV0IGNvbW1hbmRzID0ge307XG5cbmNvbW1hbmRzLm1vYmlsZVNoZWxsID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU2hlbGwgKG9wdHMgPSB7fSkge1xuICB0aGlzLmVuc3VyZUZlYXR1cmVFbmFibGVkKEFEQl9TSEVMTF9GRUFUVVJFKTtcblxuICBjb25zdCB7XG4gICAgY29tbWFuZCxcbiAgICBhcmdzID0gW10sXG4gICAgdGltZW91dCA9IDIwMDAwLFxuICAgIGluY2x1ZGVTdGRlcnIsXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghXy5pc1N0cmluZyhjb21tYW5kKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgJ2NvbW1hbmQnIGFyZ3VtZW50IGlzIG1hbmRhdG9yeWApO1xuICB9XG5cbiAgY29uc3QgYWRiQXJncyA9IFtcbiAgICAuLi50aGlzLmFkYi5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLFxuICAgICdzaGVsbCcsXG4gICAgY29tbWFuZCxcbiAgICAuLi4oXy5pc0FycmF5KGFyZ3MpID8gYXJncyA6IFthcmdzXSlcbiAgXTtcbiAgbG9nLmRlYnVnKGBSdW5uaW5nICcke3RoaXMuYWRiLmV4ZWN1dGFibGUucGF0aH0gJHt1dGlsLnF1b3RlKGFkYkFyZ3MpfSdgKTtcbiAgdHJ5IHtcbiAgICBjb25zdCB7c3Rkb3V0LCBzdGRlcnJ9ID0gYXdhaXQgZXhlYyh0aGlzLmFkYi5leGVjdXRhYmxlLnBhdGgsIGFkYkFyZ3MsIHt0aW1lb3V0fSk7XG4gICAgaWYgKGluY2x1ZGVTdGRlcnIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0ZG91dCxcbiAgICAgICAgc3RkZXJyXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gc3Rkb3V0O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhgQ2Fubm90IGV4ZWN1dGUgdGhlICcke2NvbW1hbmR9JyBzaGVsbCBjb21tYW5kLiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9LiBgICtcbiAgICAgICAgICAgICAgICAgICAgICBgU3RkT3V0OiAke2Vyci5zdGRvdXR9LiBTdGRFcnI6ICR7ZXJyLnN0ZGVycn1gKTtcbiAgfVxufTtcblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvc2hlbGwuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -11,7 +11,7 @@ require("source-map-support/register");
11
11
 
12
12
  var _lodash = _interopRequireDefault(require("lodash"));
13
13
 
14
- var _appiumSupport = require("appium-support");
14
+ var _support = require("@appium/support");
15
15
 
16
16
  var _logger = _interopRequireDefault(require("../logger"));
17
17
 
@@ -34,8 +34,8 @@ var _url = _interopRequireDefault(require("url"));
34
34
  const commands = {};
35
35
  const RECORDING_INTERVAL_SEC = 5;
36
36
  const STREAMING_STARTUP_TIMEOUT_MS = 5000;
37
- const GSTREAMER_BINARY = `gst-launch-1.0${_appiumSupport.system.isWindows() ? '.exe' : ''}`;
38
- const GST_INSPECT_BINARY = `gst-inspect-1.0${_appiumSupport.system.isWindows() ? '.exe' : ''}`;
37
+ const GSTREAMER_BINARY = `gst-launch-1.0${_support.system.isWindows() ? '.exe' : ''}`;
38
+ const GST_INSPECT_BINARY = `gst-inspect-1.0${_support.system.isWindows() ? '.exe' : ''}`;
39
39
  const REQUIRED_GST_PLUGINS = {
40
40
  avdec_h264: 'gst-libav',
41
41
  h264parse: 'gst-plugins-bad',
@@ -54,7 +54,7 @@ const BOUNDARY_STRING = '--2ae9746887f170b8cf7c271047ce314c';
54
54
  const ADB_SCREEN_STREAMING_FEATURE = 'adb_screen_streaming';
55
55
 
56
56
  function createStreamingLogger(streamName, udid) {
57
- return _appiumSupport.logger.getLogger(`${streamName}@` + _lodash.default.truncate(udid, {
57
+ return _support.logger.getLogger(`${streamName}@` + _lodash.default.truncate(udid, {
58
58
  length: 8,
59
59
  omission: ''
60
60
  }));
@@ -70,7 +70,7 @@ async function verifyStreamingRequirements(adb) {
70
70
  for (const binaryName of [GSTREAMER_BINARY, GST_INSPECT_BINARY]) {
71
71
  gstreamerCheckPromises.push((async () => {
72
72
  try {
73
- await _appiumSupport.fs.which(binaryName);
73
+ await _support.fs.which(binaryName);
74
74
  } catch (e) {
75
75
  throw new Error(`The '${binaryName}' binary is not available in the PATH on the host system. ` + `See ${GST_TUTORIAL_URL} for more details on how to install it.`);
76
76
  }
@@ -161,7 +161,7 @@ async function initDeviceStreamingProc(adb, deviceInfo, opts = {}) {
161
161
  deviceStreaming.stdout.on('data', startupListener);
162
162
 
163
163
  try {
164
- _logger.default.info(`Starting device streaming: ${_appiumSupport.util.quote([adb.executable.path, ...adbArgs])}`);
164
+ _logger.default.info(`Starting device streaming: ${_support.util.quote([adb.executable.path, ...adbArgs])}`);
165
165
 
166
166
  await (0, _asyncbox.waitForCondition)(() => isStarted, {
167
167
  waitMs: STREAMING_STARTUP_TIMEOUT_MS,
@@ -434,4 +434,4 @@ var _default = commands;
434
434
  exports.default = _default;require('source-map-support').install();
435
435
 
436
436
 
437
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9zdHJlYW1zY3JlZW4uanMiXSwibmFtZXMiOlsiY29tbWFuZHMiLCJSRUNPUkRJTkdfSU5URVJWQUxfU0VDIiwiU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyIsIkdTVFJFQU1FUl9CSU5BUlkiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJHU1RfSU5TUEVDVF9CSU5BUlkiLCJSRVFVSVJFRF9HU1RfUExVR0lOUyIsImF2ZGVjX2gyNjQiLCJoMjY0cGFyc2UiLCJqcGVnZW5jIiwidGNwc2VydmVyc2luayIsIm11bHRpcGFydG11eCIsIlNDUkVFTlJFQ09SRF9CSU5BUlkiLCJHU1RfVFVUT1JJQUxfVVJMIiwiREVGQVVMVF9IT1NUIiwiVENQX0hPU1QiLCJERUZBVUxUX1BPUlQiLCJERUZBVUxUX1FVQUxJVFkiLCJERUZBVUxUX0JJVFJBVEUiLCJCT1VOREFSWV9TVFJJTkciLCJBREJfU0NSRUVOX1NUUkVBTUlOR19GRUFUVVJFIiwiY3JlYXRlU3RyZWFtaW5nTG9nZ2VyIiwic3RyZWFtTmFtZSIsInVkaWQiLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJfIiwidHJ1bmNhdGUiLCJsZW5ndGgiLCJvbWlzc2lvbiIsInZlcmlmeVN0cmVhbWluZ1JlcXVpcmVtZW50cyIsImFkYiIsInRyaW0iLCJzaGVsbCIsIkVycm9yIiwiZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcyIsImJpbmFyeU5hbWUiLCJwdXNoIiwiZnMiLCJ3aGljaCIsImUiLCJCIiwiYWxsIiwibW9kdWxlQ2hlY2tQcm9taXNlcyIsIm5hbWUiLCJtb2ROYW1lIiwidG9QYWlycyIsInN0ZG91dCIsImluY2x1ZGVzIiwiZ2V0RGV2aWNlSW5mbyIsIm91dHB1dCIsInJlc3VsdCIsImtleSIsInBhdHRlcm4iLCJtYXRjaCIsImV4ZWMiLCJsb2ciLCJkZWJ1ZyIsInBhcnNlSW50IiwiY3VyRGV2aWNlSWQiLCJpbml0RGV2aWNlU3RyZWFtaW5nUHJvYyIsImRldmljZUluZm8iLCJvcHRzIiwid2lkdGgiLCJoZWlnaHQiLCJiaXRSYXRlIiwiYWRqdXN0ZWRXaWR0aCIsImFkanVzdGVkSGVpZ2h0IiwiYWRqdXN0ZWRCaXRyYXRlIiwic2NyZWVuUmVjb3JkQ21kIiwiYWRiQXJncyIsImV4ZWN1dGFibGUiLCJkZWZhdWx0QXJncyIsImRldmljZVN0cmVhbWluZyIsInBhdGgiLCJvbiIsImNvZGUiLCJzaWduYWwiLCJpc1N0YXJ0ZWQiLCJkZXZpY2VTdHJlYW1pbmdMb2dnZXIiLCJlcnJvcnNMaXN0ZW5lciIsImNodW5rIiwic3RkZXJyIiwidG9TdHJpbmciLCJzdGFydHVwTGlzdGVuZXIiLCJpc0VtcHR5IiwiaW5mbyIsInV0aWwiLCJxdW90ZSIsIndhaXRNcyIsImludGVydmFsTXMiLCJlcnJvckFuZFRocm93IiwibWVzc2FnZSIsInJlbW92ZUxpc3RlbmVyIiwiaW5pdEdzdHJlYW1lclBpcGVsaW5lIiwiZGV2aWNlU3RyZWFtaW5nUHJvYyIsInF1YWxpdHkiLCJ0Y3BQb3J0IiwiY29uc2lkZXJSb3RhdGlvbiIsImxvZ1BpcGVsaW5lRGV0YWlscyIsImdzdHJlYW1lclBpcGVsaW5lIiwiU3ViUHJvY2VzcyIsIk1hdGgiLCJtYXgiLCJmcHMiLCJzdGRpbyIsImdzdHJlYW1lckxvZ2dlciIsImdzdE91dHB1dExpc3RlbmVyIiwiZGlkRmFpbCIsInJlcCIsInN0YXJ0IiwiaWduIiwiZXh0cmFjdFJlbW90ZUFkZHJlc3MiLCJyZXEiLCJoZWFkZXJzIiwic29ja2V0IiwicmVtb3RlQWRkcmVzcyIsImNvbm5lY3Rpb24iLCJtb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZyIsIm9wdGlvbnMiLCJlbnN1cmVGZWF0dXJlRW5hYmxlZCIsImhvc3QiLCJwb3J0IiwicGF0aG5hbWUiLCJpc1VuZGVmaW5lZCIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsImtpbGwiLCJtanBlZ1NvY2tldCIsIm1qcGVnU2VydmVyIiwicmVzb2x2ZSIsInJlamVjdCIsIm5ldCIsImNyZWF0ZUNvbm5lY3Rpb24iLCJodHRwIiwiY3JlYXRlU2VydmVyIiwicmVzIiwiY3VycmVudFBhdGhuYW1lIiwidXJsIiwicGFyc2UiLCJ3cml0ZUhlYWQiLCJDb25uZWN0aW9uIiwid3JpdGUiLCJlbmQiLCJQcmFnbWEiLCJwaXBlIiwid2FybiIsImxpc3RlbiIsImVycm9yIiwidGltZW91dCIsImlzUnVubmluZyIsInN0b3AiLCJkZXN0cm95IiwibGlzdGVuaW5nIiwiY2xvc2UiLCJtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nIiwiZTEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLEVBQWpCO0FBRUEsTUFBTUMsc0JBQXNCLEdBQUcsQ0FBL0I7QUFDQSxNQUFNQyw0QkFBNEIsR0FBRyxJQUFyQztBQUNBLE1BQU1DLGdCQUFnQixHQUFJLGlCQUFnQkMsc0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUEzRTtBQUNBLE1BQU1DLGtCQUFrQixHQUFJLGtCQUFpQkYsc0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUE5RTtBQUNBLE1BQU1FLG9CQUFvQixHQUFHO0FBQzNCQyxFQUFBQSxVQUFVLEVBQUUsV0FEZTtBQUUzQkMsRUFBQUEsU0FBUyxFQUFFLGlCQUZnQjtBQUczQkMsRUFBQUEsT0FBTyxFQUFFLGtCQUhrQjtBQUkzQkMsRUFBQUEsYUFBYSxFQUFFLGtCQUpZO0FBSzNCQyxFQUFBQSxZQUFZLEVBQUU7QUFMYSxDQUE3QjtBQU9BLE1BQU1DLG1CQUFtQixHQUFHLGNBQTVCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsdUVBQXpCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLFdBQXJCO0FBQ0EsTUFBTUMsUUFBUSxHQUFHLFdBQWpCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLElBQXJCO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLEVBQXhCO0FBQ0EsTUFBTUMsZUFBZSxHQUFH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QUFNNEQsaUJBQWlCLENBQUNrRCxJQUFsQixDQUF1QixTQUF2QixDQUFOO0FBQ0QsU0FGRCxDQUVFLE9BQU9LLEVBQVAsRUFBVztBQUNYbkcsMEJBQUkyRixLQUFKLENBQVVRLEVBQVY7QUFDRDtBQUNGO0FBQ0Y7O0FBQ0RuRyxvQkFBSThCLElBQUosQ0FBVSwyREFBVjtBQUNELEdBckJELFNBcUJVO0FBQ1IsU0FBS3VDLHFCQUFMLEdBQTZCLElBQTdCO0FBQ0Q7QUFDRixDQXZDRDs7ZUEwQ2U5SCxRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCBzeXN0ZW0sIGxvZ2dlciwgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IGV4ZWMsIFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY2hlY2tQb3J0U3RhdHVzIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuY29uc3QgUkVDT1JESU5HX0lOVEVSVkFMX1NFQyA9IDU7XG5jb25zdCBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TID0gNTAwMDtcbmNvbnN0IEdTVFJFQU1FUl9CSU5BUlkgPSBgZ3N0LWxhdW5jaC0xLjAke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5jb25zdCBHU1RfSU5TUEVDVF9CSU5BUlkgPSBgZ3N0LWluc3BlY3QtMS4wJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gO1xuY29uc3QgUkVRVUlSRURfR1NUX1BMVUdJTlMgPSB7XG4gIGF2ZGVjX2gyNjQ6ICdnc3QtbGliYXYnLFxuICBoMjY0cGFyc2U6ICdnc3QtcGx1Z2lucy1iYWQnLFxuICBqcGVnZW5jOiAnZ3N0LXBsdWdpbnMtZ29vZCcsXG4gIHRjcHNlcnZlcnNpbms6ICdnc3QtcGx1Z2lucy1iYXNlJyxcbiAgbXVsdGlwYXJ0bXV4OiAnZ3N0LXBsdWdpbnMtZ29vZCcsXG59O1xuY29uc3QgU0NSRUVOUkVDT1JEX0JJTkFSWSA9ICdzY3JlZW5yZWNvcmQnO1xuY29uc3QgR1NUX1RVVE9SSUFMX1VSTCA9ICdodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZG9jdW1lbnRhdGlvbi9pbnN0YWxsaW5nL2luZGV4Lmh0bWwnO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBUQ1BfSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgREVGQVVMVF9QT1JUID0gODA5MztcbmNvbnN0IERFRkFVTFRfUVVBTElUWSA9IDcwO1xuY29uc3QgREVGQVVMVF9CSVRSQVRFID0gNDAwMDAwMDsgLy8gNCBNYnBzXG5jb25zdCBCT1VOREFSWV9TVFJJTkcgPSAnLS0yYWU5NzQ2ODg3ZjE3MGI4Y2Y3YzI3MTA0N2NlMzE0Yyc7XG5cbmNvbnN0IEFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUgPSAnYWRiX3NjcmVlbl9zdHJlYW1pbmcnO1xuXG5mdW5jdGlvbiBjcmVhdGVTdHJlYW1pbmdMb2dnZXIgKHN0cmVhbU5hbWUsIHVkaWQpIHtcbiAgcmV0dXJuIGxvZ2dlci5nZXRMb2dnZXIoYCR7c3RyZWFtTmFtZX1AYCArIF8udHJ1bmNhdGUodWRpZCwge1xuICAgIGxlbmd0aDogOCxcbiAgICBvbWlzc2lvbjogJycsXG4gIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzIChhZGIpIHtcbiAgaWYgKCFfLnRyaW0oYXdhaXQgYWRiLnNoZWxsKFsnd2hpY2gnLCBTQ1JFRU5SRUNPUkRfQklOQVJZXSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSByZXF1aXJlZCAnJHtTQ1JFRU5SRUNPUkRfQklOQVJZfScgYmluYXJ5IGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0YCk7XG4gIH1cblxuICBjb25zdCBnc3RyZWFtZXJDaGVja1Byb21pc2VzID0gW107XG4gIGZvciAoY29uc3QgYmluYXJ5TmFtZSBvZiBbR1NUUkVBTUVSX0JJTkFSWSwgR1NUX0lOU1BFQ1RfQklOQVJZXSkge1xuICAgIGdzdHJlYW1lckNoZWNrUHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMud2hpY2goYmluYXJ5TmFtZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICcke2JpbmFyeU5hbWV9JyBiaW5hcnkgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgUEFUSCBvbiB0aGUgaG9zdCBzeXN0ZW0uIGAgK1xuICAgICAgICAgIGBTZWUgJHtHU1RfVFVUT1JJQUxfVVJMfSBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBpbnN0YWxsIGl0LmApO1xuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKGdzdHJlYW1lckNoZWNrUHJvbWlzZXMpO1xuXG4gIGNvbnN0IG1vZHVsZUNoZWNrUHJvbWlzZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgbW9kTmFtZV0gb2YgXy50b1BhaXJzKFJFUVVJUkVEX0dTVF9QTFVHSU5TKSkge1xuICAgIG1vZHVsZUNoZWNrUHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKEdTVF9JTlNQRUNUX0JJTkFSWSwgW25hbWVdKTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhzdGRvdXQsIG1vZE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIHJlcXVpcmVkIEdTdHJlYW1lciBwbHVnaW4gJyR7bmFtZX0nIGZyb20gJyR7bW9kTmFtZX0nIG1vZHVsZSBpcyBub3QgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgU2VlICR7R1NUX1RVVE9SSUFMX1VSTH0gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gaW5zdGFsbCBpdC5gKTtcbiAgICAgIH1cbiAgICB9KSgpKTtcbiAgfVxuICBhd2FpdCBCLmFsbChtb2R1bGVDaGVja1Byb21pc2VzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSW5mbyAoYWRiKSB7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnZGlzcGxheSddKTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgcGF0dGVybl0gb2YgW1xuICAgIFsnd2lkdGgnLCAvXFxiZGV2aWNlV2lkdGg9KFxcZCspL10sXG4gICAgWydoZWlnaHQnLCAvXFxiZGV2aWNlSGVpZ2h0PShcXGQrKS9dLFxuICAgIFsnZnBzJywgL1xcYmZwcz0oXFxkKykvXSxcbiAgXSkge1xuICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgbG9nLmRlYnVnKG91dHB1dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgZGV2aWNlICR7a2V5fSBmcm9tIHRoZSBhZGIgY29tbWFuZCBvdXRwdXQuIGAgK1xuICAgICAgICBgQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscy5gKTtcbiAgICB9XG4gICAgcmVzdWx0W2tleV0gPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICB9XG4gIHJlc3VsdC51ZGlkID0gYWRiLmN1ckRldmljZUlkO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbml0RGV2aWNlU3RyZWFtaW5nUHJvYyAoYWRiLCBkZXZpY2VJbmZvLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBiaXRSYXRlLFxuICB9ID0gb3B0cztcbiAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCkgfHwgZGV2aWNlSW5mby53aWR0aDtcbiAgY29uc3QgYWRqdXN0ZWRIZWlnaHQgPSBwYXJzZUludChoZWlnaHQsIDEwKSB8fCBkZXZpY2VJbmZvLmhlaWdodDtcbiAgY29uc3QgYWRqdXN0ZWRCaXRyYXRlID0gcGFyc2VJbnQoYml0UmF0ZSwgMTApIHx8IERFRkFVTFRfQklUUkFURTtcbiAgbGV0IHNjcmVlblJlY29yZENtZCA9IFNDUkVFTlJFQ09SRF9CSU5BUlkgK1xuICAgIGAgLS1vdXRwdXQtZm9ybWF0PWgyNjRgICtcbiAgICAvLyA1IHNlY29uZHMgaXMgZmluZSB0byBkZXRlY3Qgcm90YXRpb24gY2hhbmdlc1xuICAgIGAgLS10aW1lLWxpbWl0PSR7UkVDT1JESU5HX0lOVEVSVkFMX1NFQ31gO1xuICBpZiAod2lkdGggfHwgaGVpZ2h0KSB7XG4gICAgc2NyZWVuUmVjb3JkQ21kICs9IGAgLS1zaXplPSR7YWRqdXN0ZWRXaWR0aH14JHthZGp1c3RlZEhlaWdodH1gO1xuICB9XG4gIGlmIChiaXRSYXRlKSB7XG4gICAgc2NyZWVuUmVjb3JkQ21kICs9IGAgLS1iaXQtcmF0ZT0ke2FkanVzdGVkQml0cmF0ZX1gO1xuICB9XG4gIGNvbnN0IGFkYkFyZ3MgPSBbXG4gICAgLi4uYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgJ2V4ZWMtb3V0JyxcbiAgICAvLyBUaGUgbG9vcCBpcyByZXF1aXJlZCwgYmVjYXVzZSBieSBkZWZhdWx0IHRoZSBtYXhpbXVtIHJlY29yZCBkdXJhdGlvblxuICAgIC8vIGZvciBzY3JlZW5yZWNvcmQgaXMgYWx3YXlzIGxpbWl0ZWRcbiAgICBgd2hpbGUgdHJ1ZTsgZG8gJHtzY3JlZW5SZWNvcmRDbWR9IC07IGRvbmVgLFxuICBdO1xuICBjb25zdCBkZXZpY2VTdHJlYW1pbmcgPSBzcGF3bihhZGIuZXhlY3V0YWJsZS5wYXRoLCBhZGJBcmdzKTtcbiAgZGV2aWNlU3RyZWFtaW5nLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGxvZy5kZWJ1ZyhgRGV2aWNlIHN0cmVhbWluZyBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICB9KTtcblxuICBsZXQgaXNTdGFydGVkID0gZmFsc2U7XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZ0xvZ2dlciA9IGNyZWF0ZVN0cmVhbWluZ0xvZ2dlcihTQ1JFRU5SRUNPUkRfQklOQVJZLCBkZXZpY2VJbmZvLnVkaWQpO1xuICBjb25zdCBlcnJvcnNMaXN0ZW5lciA9IChjaHVuaykgPT4ge1xuICAgIGNvbnN0IHN0ZGVyciA9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgaWYgKF8udHJpbShzdGRlcnIpKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdMb2dnZXIuZGVidWcoc3RkZXJyKTtcbiAgICB9XG4gIH07XG4gIGRldmljZVN0cmVhbWluZy5zdGRlcnIub24oJ2RhdGEnLCBlcnJvcnNMaXN0ZW5lcik7XG5cbiAgY29uc3Qgc3RhcnR1cExpc3RlbmVyID0gKGNodW5rKSA9PiB7XG4gICAgaWYgKCFpc1N0YXJ0ZWQpIHtcbiAgICAgIGlzU3RhcnRlZCA9ICFfLmlzRW1wdHkoY2h1bmspO1xuICAgIH1cbiAgfTtcbiAgZGV2aWNlU3RyZWFtaW5nLnN0ZG91dC5vbignZGF0YScsIHN0YXJ0dXBMaXN0ZW5lcik7XG5cbiAgdHJ5IHtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgZGV2aWNlIHN0cmVhbWluZzogJHt1dGlsLnF1b3RlKFthZGIuZXhlY3V0YWJsZS5wYXRoLCAuLi5hZGJBcmdzXSl9YCk7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbigoKSA9PiBpc1N0YXJ0ZWQsIHtcbiAgICAgIHdhaXRNczogU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgIGludGVydmFsTXM6IDMwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KFxuICAgICAgYENhbm5vdCBzdGFydCB0aGUgc2NyZWVuIHN0cmVhbWluZyBwcm9jZXNzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgZGV2aWNlU3RyZWFtaW5nLnN0ZGVyci5yZW1vdmVMaXN0ZW5lcignZGF0YScsIGVycm9yc0xpc3RlbmVyKTtcbiAgICBkZXZpY2VTdHJlYW1pbmcuc3Rkb3V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgc3RhcnR1cExpc3RlbmVyKTtcbiAgfVxuICByZXR1cm4gZGV2aWNlU3RyZWFtaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbml0R3N0cmVhbWVyUGlwZWxpbmUgKGRldmljZVN0cmVhbWluZ1Byb2MsIGRldmljZUluZm8sIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHF1YWxpdHksXG4gICAgdGNwUG9ydCxcbiAgICBjb25zaWRlclJvdGF0aW9uLFxuICAgIGxvZ1BpcGVsaW5lRGV0YWlscyxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGFkanVzdGVkV2lkdGggPSBwYXJzZUludCh3aWR0aCwgMTApIHx8IGRldmljZUluZm8ud2lkdGg7XG4gIGNvbnN0IGFkanVzdGVkSGVpZ2h0ID0gcGFyc2VJbnQoaGVpZ2h0LCAxMCkgfHwgZGV2aWNlSW5mby5oZWlnaHQ7XG4gIGNvbnN0IGdzdHJlYW1lclBpcGVsaW5lID0gbmV3IFN1YlByb2Nlc3MoR1NUUkVBTUVSX0JJTkFSWSwgW1xuICAgICctdicsXG4gICAgJ2Zkc3JjJywgJ2ZkPTAnLFxuICAgICchJywgJ3ZpZGVvL3gtaDI2NCwnICtcbiAgICAgIGB3aWR0aD0ke2NvbnNpZGVyUm90YXRpb24gPyBNYXRoLm1heChhZGp1c3RlZFdpZHRoLCBhZGp1c3RlZEhlaWdodCkgOiBhZGp1c3RlZFdpZHRofSxgICtcbiAgICAgIGBoZWlnaHQ9JHtjb25zaWRlclJvdGF0aW9uID8gTWF0aC5tYXgoYWRqdXN0ZWRXaWR0aCwgYWRqdXN0ZWRIZWlnaHQpIDogYWRqdXN0ZWRIZWlnaHR9LGAgK1xuICAgICAgYGZyYW1lcmF0ZT0ke2RldmljZUluZm8uZnBzfS8xLGAgK1xuICAgICAgJ2J5dGUtc3RyZWFtPXRydWUnLFxuICAgICchJywgJ2gyNjRwYXJzZScsXG4gICAgJyEnLCAncXVldWUnLCAnbGVha3k9ZG93bnN0cmVhbScsXG4gICAgJyEnLCAnYXZkZWNfaDI2NCcsXG4gICAgJyEnLCAncXVldWUnLCAnbGVha3k9ZG93bnN0cmVhbScsXG4gICAgJyEnLCAnanBlZ2VuYycsIGBxdWFsaXR5PSR7cXVhbGl0eX1gLFxuICAgICchJywgJ211bHRpcGFydG11eCcsIGBib3VuZGFyeT0ke0JPVU5EQVJZX1NUUklOR31gLFxuICAgICchJywgJ3RjcHNlcnZlcnNpbmsnLCBgaG9zdD0ke1RDUF9IT1NUfWAsIGBwb3J0PSR7dGNwUG9ydH1gLFxuICBdLCB7XG4gICAgc3RkaW86IFtkZXZpY2VTdHJlYW1pbmdQcm9jLnN0ZG91dCwgJ3BpcGUnLCAncGlwZSddXG4gIH0pO1xuICBnc3RyZWFtZXJQaXBlbGluZS5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICBsb2cuZGVidWcoYFBpcGVsaW5lIHN0cmVhbWluZyBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICB9KTtcbiAgY29uc3QgZ3N0cmVhbWVyTG9nZ2VyID0gY3JlYXRlU3RyZWFtaW5nTG9nZ2VyKCdnc3QnLCBkZXZpY2VJbmZvLnVkaWQpO1xuICBjb25zdCBnc3RPdXRwdXRMaXN0ZW5lciA9IChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgIGlmIChfLnRyaW0oc3RkZXJyIHx8IHN0ZG91dCkpIHtcbiAgICAgIGdzdHJlYW1lckxvZ2dlci5kZWJ1ZyhzdGRlcnIgfHwgc3Rkb3V0KTtcbiAgICB9XG4gIH07XG4gIGdzdHJlYW1lclBpcGVsaW5lLm9uKCdvdXRwdXQnLCBnc3RPdXRwdXRMaXN0ZW5lcik7XG4gIGxldCBkaWRGYWlsID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgbG9nLmluZm8oYFN0YXJ0aW5nIEdTdHJlYW1lciBwaXBlbGluZTogJHtnc3RyZWFtZXJQaXBlbGluZS5yZXB9YCk7XG4gICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RhcnQoMCk7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyh0Y3BQb3J0LCBUQ1BfSE9TVCkpID09PSAnb3Blbic7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIHdhaXRNczogU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgIGludGVydmFsTXM6IDMwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRpZEZhaWwgPSB0cnVlO1xuICAgIGxvZy5lcnJvckFuZFRocm93KFxuICAgICAgYENhbm5vdCBzdGFydCB0aGUgc2NyZWVuIHN0cmVhbWluZyBwaXBlbGluZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICghbG9nUGlwZWxpbmVEZXRhaWxzIHx8IGRpZEZhaWwpIHtcbiAgICAgIGdzdHJlYW1lclBpcGVsaW5lLnJlbW92ZUxpc3RlbmVyKCdvdXRwdXQnLCBnc3RPdXRwdXRMaXN0ZW5lcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBnc3RyZWFtZXJQaXBlbGluZTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFJlbW90ZUFkZHJlc3MgKHJlcSkge1xuICByZXR1cm4gcmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddXG4gICAgfHwgcmVxLnNvY2tldC5yZW1vdGVBZGRyZXNzXG4gICAgfHwgcmVxLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzc1xuICAgIHx8IHJlcS5jb25uZWN0aW9uLnNvY2tldC5yZW1vdGVBZGRyZXNzO1xufVxuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRTY3JlZW5TdHJlYW1pbmdPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3aWR0aCAtIFRoZSBzY2FsZWQgd2lkdGggb2YgdGhlIGRldmljZSdzIHNjcmVlbi4gSWYgdW5zZXQgdGhlbiB0aGUgc2NyaXB0IHdpbGwgYXNzaWduIGl0XG4gKiB0byB0aGUgYWN0dWFsIHNjcmVlbiB3aWR0aCBtZWFzdXJlZCBpbiBwaXhlbHMuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBzY2FsZWQgaGVpZ2h0IG9mIHRoZSBkZXZpY2UncyBzY3JlZW4uIElmIHVuc2V0IHRoZW4gdGhlIHNjcmlwdCB3aWxsIGFzc2lnbiBpdFxuICogdG8gdGhlIGFjdHVhbCBzY3JlZW4gaGVpZ2h0IG1lYXN1cmVkIGluIHBpeGVscy5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gYml0UmF0ZSAtIFRoZSB2aWRlbyBiaXQgcmF0ZSBmb3IgdGhlIHZpZGVvLCBpbiBiaXRzIHBlciBzZWNvbmQuXG4gKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA0MDAwMDAwICg0IE1iL3MpLiBZb3UgY2FuIGluY3JlYXNlIHRoZSBiaXQgcmF0ZSB0byBpbXByb3ZlIHZpZGVvIHF1YWxpdHksXG4gKiBidXQgZG9pbmcgc28gcmVzdWx0cyBpbiBsYXJnZXIgbW92aWUgZmlsZXMuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGhvc3QgWzEyNy4wLjAuMV0gLSBUaGUgSVAgYWRkcmVzcy9ob3N0IG5hbWUgdG8gc3RhcnQgdGhlIE1KUEVHIHNlcnZlciBvbi5cbiAqIFlvdSBjYW4gc2V0IGl0IHRvIGAwLjAuMC4wYCB0byB0cmlnZ2VyIHRoZSBicm9hZGNhc3Qgb24gYWxsIGF2YWlsYWJsZSBuZXR3b3JrIGludGVyZmFjZXMuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhdGhuYW1lIC0gVGhlIEhUVFAgcmVxdWVzdCBwYXRoIHRoZSBNSlBFRyBzZXJ2ZXIgc2hvdWxkIGJlIGF2YWlsYWJsZSBvbi5cbiAqIElmIHVuc2V0IHRoZW4gYW55IHBhdGhuYW1lIG9uIHRoZSBnaXZlbiBgaG9zdGAvYHBvcnRgIGNvbWJpbmF0aW9uIHdpbGwgd29yay4gTm90ZSB0aGF0IHRoZSB2YWx1ZVxuICogc2hvdWxkIGFsd2F5cyBzdGFydCB3aXRoIGEgc2luZ2xlIHNsYXNoOiBgL2BcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdGNwUG9ydCBbODA5NF0gLSBUaGUgcG9ydCBudW1iZXIgdG8gc3RhcnQgdGhlIGludGVybmFsIFRDUCBNSlBFRyBicm9hZGNhc3Qgb24uXG4gKiBUaGlzIHR5cGUgb2YgYnJvYWRjYXN0IGFsd2F5cyBzdGFydHMgb24gdGhlIGxvb3BiYWNrIGludGVyZmFjZSAoYDEyNy4wLjAuMWApLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBwb3J0IFs4MDkzXSAtIFRoZSBwb3J0IG51bWJlciB0byBzdGFydCB0aGUgTUpQRUcgc2VydmVyIG9uLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBxdWFsaXR5IFs3MF0gLSBUaGUgcXVhbGl0eSB2YWx1ZSBmb3IgdGhlIHN0cmVhbWVkIEpQRUcgaW1hZ2VzLlxuICogVGhpcyBudW1iZXIgc2hvdWxkIGJlIGluIHJhbmdlIFsxLCAxMDBdLCB3aGVyZSAxMDAgaXMgdGhlIGJlc3QgcXVhbGl0eS5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGNvbnNpZGVyUm90YXRpb24gW2ZhbHNlXSAtIElmIHNldCB0byBgdHJ1ZWAgdGhlbiBHU3RyZWFtZXIgcGlwZWxpbmUgd2lsbFxuICogaW5jcmVhc2UgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHJlc3VsdGluZyBpbWFnZXMgdG8gcHJvcGVybHkgZml0IGltYWdlcyBpbiBib3RoIGxhbmRzY2FwZSBhbmRcbiAqIHBvcnRyYWl0IG9yaWVudGF0aW9ucy4gU2V0IGl0IHRvIGB0cnVlYCBpZiB0aGUgZGV2aWNlIHJvdGF0aW9uIGlzIG5vdCBnb2luZyB0byBiZSB0aGUgc2FtZSBkdXJpbmcgdGhlXG4gKiBicm9hZGNhc3Rpbmcgc2Vzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGxvZ1BpcGVsaW5lRGV0YWlscyBbZmFsc2VdIC0gV2hldGhlciB0byBsb2cgR1N0cmVhbWVyIHBpcGVsaW5lIGV2ZW50cyBpbnRvXG4gKiB0aGUgc3RhbmRhcmQgbG9nIG91dHB1dC4gTWlnaHQgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gKi9cblxuLyoqXG4gKiBTdGFydHMgZGV2aWNlIHNjcmVlbiBicm9hZGNhc3QgYnkgY3JlYXRpbmcgTUpQRUcgc2VydmVyLlxuICogTXVsdGlwbGUgY2FsbHMgdG8gdGhpcyBtZXRob2QgaGF2ZSBubyBlZmZlY3QgdW5sZXNzIHRoZSBwcmV2aW91cyBzdHJlYW1pbmdcbiAqIHNlc3Npb24gaXMgc3RvcHBlZC5cbiAqIFRoaXMgbWV0aG9kIG9ubHkgd29ya3MgaWYgdGhlIGBhZGJfc2NyZWVuX3N0cmVhbWluZ2AgZmVhdHVyZSBpc1xuICogZW5hYmxlZCBvbiB0aGUgc2VydmVyIHNpZGUuXG4gKlxuICogQHBhcmFtIHs/U3RhcnRTY3JlZW5TdHJlYW1pbmdPcHRpb25zfSBvcHRpb25zIC0gVGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICogQHRocm93cyB7RXJyb3J9IElmIHNjcmVlbiBzdHJlYW1pbmcgaGFzIGZhaWxlZCB0byBzdGFydCBvclxuICogaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgaG9zdCBzeXN0ZW0gb3JcbiAqIHRoZSBjb3JyZXNwb25kaW5nIHNlcnZlciBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLlxuICovXG5jb21tYW5kcy5tb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nIChvcHRpb25zID0ge30pIHtcbiAgdGhpcy5lbnN1cmVGZWF0dXJlRW5hYmxlZChBREJfU0NSRUVOX1NUUkVBTUlOR19GRUFUVVJFKTtcblxuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGJpdFJhdGUsXG4gICAgaG9zdCA9IERFRkFVTFRfSE9TVCxcbiAgICBwb3J0ID0gREVGQVVMVF9QT1JULFxuICAgIHBhdGhuYW1lLFxuICAgIHRjcFBvcnQgPSBERUZBVUxUX1BPUlQgKyAxLFxuICAgIHF1YWxpdHkgPSBERUZBVUxUX1FVQUxJVFksXG4gICAgY29uc2lkZXJSb3RhdGlvbiA9IGZhbHNlLFxuICAgIGxvZ1BpcGVsaW5lRGV0YWlscyA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcykpIHtcbiAgICBhd2FpdCB2ZXJpZnlTdHJlYW1pbmdSZXF1aXJlbWVudHModGhpcy5hZGIpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgIGxvZy5pbmZvKGBUaGUgc2NyZWVuIHN0cmVhbWluZyBzZXNzaW9uIGlzIGFscmVhZHkgcnVubmluZy4gYCArXG4gICAgICBgU3RvcCBpdCBmaXJzdCBpbiBvcmRlciB0byBzdGFydCBhIG5ldyBvbmUuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHBvcnQsIGhvc3QpKSA9PT0gJ29wZW4nKSB7XG4gICAgbG9nLmluZm8oYFRoZSBwb3J0ICMke3BvcnR9IGF0ICR7aG9zdH0gaXMgYnVzeS4gYCArXG4gICAgICBgQXNzdW1pbmcgdGhlIHNjcmVlbiBzdHJlYW1pbmcgaXMgYWxyZWFkeSBydW5uaW5nYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRjcFBvcnQsIFRDUF9IT1NUKSkgPT09ICdvcGVuJykge1xuICAgIGxvZy5lcnJvckFuZFRocm93KGBUaGUgcG9ydCAjJHt0Y3BQb3J0fSBhdCAke1RDUF9IT1NUfSBpcyBidXN5LiBgICtcbiAgICAgIGBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGxlZnRvdmVycyBmcm9tIHByZXZpb3VzIHNlc3Npb25zLmApO1xuICB9XG4gIHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzID0gbnVsbDtcblxuICBjb25zdCBkZXZpY2VJbmZvID0gYXdhaXQgZ2V0RGV2aWNlSW5mbyh0aGlzLmFkYik7XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZ1Byb2MgPSBhd2FpdCBpbml0RGV2aWNlU3RyZWFtaW5nUHJvYyh0aGlzLmFkYiwgZGV2aWNlSW5mbywge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBiaXRSYXRlLFxuICB9KTtcbiAgbGV0IGdzdHJlYW1lclBpcGVsaW5lO1xuICB0cnkge1xuICAgIGdzdHJlYW1lclBpcGVsaW5lID0gYXdhaXQgaW5pdEdzdHJlYW1lclBpcGVsaW5lKGRldmljZVN0cmVhbWluZ1Byb2MsIGRldmljZUluZm8sIHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgcXVhbGl0eSxcbiAgICAgIHRjcFBvcnQsXG4gICAgICBjb25zaWRlclJvdGF0aW9uLFxuICAgICAgbG9nUGlwZWxpbmVEZXRhaWxzLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCk7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cblxuICBsZXQgbWpwZWdTb2NrZXQ7XG4gIGxldCBtanBlZ1NlcnZlcjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBtanBlZ1NvY2tldCA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKHRjcFBvcnQsIFRDUF9IT1NULCAoKSA9PiB7XG4gICAgICAgIGxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIE1KUEVHIHN0cmVhbSBhdCB0Y3A6Ly8ke1RDUF9IT1NUfToke3RjcFBvcnR9YCk7XG4gICAgICAgIG1qcGVnU2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVtb3RlQWRkcmVzcyA9IGV4dHJhY3RSZW1vdGVBZGRyZXNzKHJlcSk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFBhdGhuYW1lID0gdXJsLnBhcnNlKHJlcS51cmwpLnBhdGhuYW1lO1xuICAgICAgICAgIGxvZy5pbmZvKGBHb3QgYW4gaW5jb21pbmcgc2NyZWVuIGJyYWRjYXN0aW5nIHJlcXVlc3QgZnJvbSAke3JlbW90ZUFkZHJlc3N9IGAgK1xuICAgICAgICAgICAgYCgke3JlcS5oZWFkZXJzWyd1c2VyLWFnZW50J10gfHwgJ1VzZXIgQWdlbnQgdW5rbm93bid9KSBhdCAke2N1cnJlbnRQYXRobmFtZX1gKTtcblxuICAgICAgICAgIGlmIChwYXRobmFtZSAmJiBjdXJyZW50UGF0aG5hbWUgIT09IHBhdGhuYW1lKSB7XG4gICAgICAgICAgICBsb2cuaW5mbygnUmVqZWN0aW5nIHRoZSBicm9hZGNhc3QgcmVxdWVzdCBzaW5jZSBpdCBkb2VzIG5vdCBtYXRjaCB0aGUgZ2l2ZW4gcGF0aG5hbWUnKTtcbiAgICAgICAgICAgIHJlcy53cml0ZUhlYWQoNDA0LCB7XG4gICAgICAgICAgICAgIENvbm5lY3Rpb246ICdjbG9zZScsXG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAndGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlcy53cml0ZShgJyR7Y3VycmVudFBhdGhuYW1lfScgZGlkIG5vdCBtYXRjaCBhbnkga25vd24gZW5kcG9pbnRzYCk7XG4gICAgICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbG9nLmluZm8oJ1N0YXJ0aW5nIE1KUEVHIGJyb2FkY2FzdCcpO1xuICAgICAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7XG4gICAgICAgICAgICAnQ2FjaGUtQ29udHJvbCc6ICduby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wJyxcbiAgICAgICAgICAgIFByYWdtYTogJ25vLWNhY2hlJyxcbiAgICAgICAgICAgIENvbm5lY3Rpb246ICdjbG9zZScsXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogYG11bHRpcGFydC94LW1peGVkLXJlcGxhY2U7IGJvdW5kYXJ5PSR7Qk9VTkRBUllfU1RSSU5HfWBcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1qcGVnU29ja2V0LnBpcGUocmVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgICAgbG9nLndhcm4oZSk7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgTUpQRUcgc2VydmVyIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH0gaGFzIGJlZW4gY2xvc2VkYCk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5vbignbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgICAgIGxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgc3RhcnRlZCBNSlBFRyBzZXJ2ZXIgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fWApO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgICAgIH0pO1xuICAgICAgbWpwZWdTb2NrZXQub24oJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgbG9nLmVycm9yKGUpO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9KTtcbiAgICB9KS50aW1lb3V0KFNUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVMsXG4gICAgICBgQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHN0cmVhbWluZyBzZXJ2ZXIgd2l0aGluICR7U1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NU31tc2ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCk7XG4gICAgfVxuICAgIGlmIChnc3RyZWFtZXJQaXBlbGluZS5pc1J1bm5pbmcpIHtcbiAgICAgIGF3YWl0IGdzdHJlYW1lclBpcGVsaW5lLnN0b3AoKTtcbiAgICB9XG4gICAgaWYgKG1qcGVnU29ja2V0KSB7XG4gICAgICBtanBlZ1NvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuICAgIGlmIChtanBlZ1NlcnZlciAmJiBtanBlZ1NlcnZlci5saXN0ZW5pbmcpIHtcbiAgICAgIG1qcGVnU2VydmVyLmNsb3NlKCk7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cblxuICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IHtcbiAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLFxuICAgIGdzdHJlYW1lclBpcGVsaW5lLFxuICAgIG1qcGVnU29ja2V0LFxuICAgIG1qcGVnU2VydmVyLFxuICB9O1xufTtcblxuLyoqXG4gKiBTdG9wIHNjcmVlbiBzdHJlYW1pbmcuXG4gKiBJZiBubyBzY3JlZW4gc3RyZWFtaW5nIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkIHRoZW4gbm90aGluZyBpcyBkb25lLlxuICovXG5jb21tYW5kcy5tb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyAoLyogb3B0aW9ucyA9IHt9ICovKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgICAgbG9nLmRlYnVnKGBTY3JlZW4gc3RyZWFtaW5nIGlzIG5vdCBydW5uaW5nLiBUaGVyZSBpcyBub3RoaW5nIHRvIHN0b3BgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGRldmljZVN0cmVhbWluZ1Byb2MsXG4gICAgZ3N0cmVhbWVyUGlwZWxpbmUsXG4gICAgbWpwZWdTb2NrZXQsXG4gICAgbWpwZWdTZXJ2ZXIsXG4gIH0gPSB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcztcblxuICB0cnkge1xuICAgIG1qcGVnU29ja2V0LmVuZCgpO1xuICAgIGlmIChtanBlZ1NlcnZlci5saXN0ZW5pbmcpIHtcbiAgICAgIG1qcGVnU2VydmVyLmNsb3NlKCk7XG4gICAgfVxuICAgIGlmIChkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoMCkpIHtcbiAgICAgIGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgnU0lHSU5UJyk7XG4gICAgfVxuICAgIGlmIChnc3RyZWFtZXJQaXBlbGluZS5pc1J1bm5pbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGdzdHJlYW1lclBpcGVsaW5lLnN0b3AoJ1NJR0lOVCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2cud2FybihlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBnc3RyZWFtZXJQaXBlbGluZS5zdG9wKCdTSUdLSUxMJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUxKSB7XG4gICAgICAgICAgbG9nLmVycm9yKGUxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBsb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWQgdGhlIHNjcmVlbiBzdHJlYW1pbmcgTUpQRUcgc2VydmVyYCk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMgPSBudWxsO1xuICB9XG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvY29tbWFuZHMvc3RyZWFtc2NyZWVuLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
437
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21tYW5kcy9zdHJlYW1zY3JlZW4uanMiXSwibmFtZXMiOlsiY29tbWFuZHMiLCJSRUNPUkRJTkdfSU5URVJWQUxfU0VDIiwiU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyIsIkdTVFJFQU1FUl9CSU5BUlkiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJHU1RfSU5TUEVDVF9CSU5BUlkiLCJSRVFVSVJFRF9HU1RfUExVR0lOUyIsImF2ZGVjX2gyNjQiLCJoMjY0cGFyc2UiLCJqcGVnZW5jIiwidGNwc2VydmVyc2luayIsIm11bHRpcGFydG11eCIsIlNDUkVFTlJFQ09SRF9CSU5BUlkiLCJHU1RfVFVUT1JJQUxfVVJMIiwiREVGQVVMVF9IT1NUIiwiVENQX0hPU1QiLCJERUZBVUxUX1BPUlQiLCJERUZBVUxUX1FVQUxJVFkiLCJERUZBVUxUX0JJVFJBVEUiLCJCT1VOREFSWV9TVFJJTkciLCJBREJfU0NSRUVOX1NUUkVBTUlOR19GRUFUVVJFIiwiY3JlYXRlU3RyZWFtaW5nTG9nZ2VyIiwic3RyZWFtTmFtZSIsInVkaWQiLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJfIiwidHJ1bmNhdGUiLCJsZW5ndGgiLCJvbWlzc2lvbiIsInZlcmlmeVN0cmVhbWluZ1JlcXVpcmVtZW50cyIsImFkYiIsInRyaW0iLCJzaGVsbCIsIkVycm9yIiwiZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcyIsImJpbmFyeU5hbWUiLCJwdXNoIiwiZnMiLCJ3aGljaCIsImUiLCJCIiwiYWxsIiwibW9kdWxlQ2hlY2tQcm9taXNlcyIsIm5hbWUiLCJtb2ROYW1lIiwidG9QYWlycyIsInN0ZG91dCIsImluY2x1ZGVzIiwiZ2V0RGV2aWNlSW5mbyIsIm91dHB1dCIsInJlc3VsdCIsImtleSIsInBhdHRlcm4iLCJtYXRjaCIsImV4ZWMiLCJsb2ciLCJkZWJ1ZyIsInBhcnNlSW50IiwiY3VyRGV2aWNlSWQiLCJpbml0RGV2aWNlU3RyZWFtaW5nUHJvYyIsImRldmljZUluZm8iLCJvcHRzIiwid2lkdGgiLCJoZWlnaHQiLCJiaXRSYXRlIiwiYWRqdXN0ZWRXaWR0aCIsImFkanVzdGVkSGVpZ2h0IiwiYWRqdXN0ZWRCaXRyYXRlIiwic2NyZWVuUmVjb3JkQ21kIiwiYWRiQXJncyIsImV4ZWN1dGFibGUiLCJkZWZhdWx0QXJncyIsImRldmljZVN0cmVhbWluZyIsInBhdGgiLCJvbiIsImNvZGUiLCJzaWduYWwiLCJpc1N0YXJ0ZWQiLCJkZXZpY2VTdHJlYW1pbmdMb2dnZXIiLCJlcnJvcnNMaXN0ZW5lciIsImNodW5rIiwic3RkZXJyIiwidG9TdHJpbmciLCJzdGFydHVwTGlzdGVuZXIiLCJpc0VtcHR5IiwiaW5mbyIsInV0aWwiLCJxdW90ZSIsIndhaXRNcyIsImludGVydmFsTXMiLCJlcnJvckFuZFRocm93IiwibWVzc2FnZSIsInJlbW92ZUxpc3RlbmVyIiwiaW5pdEdzdHJlYW1lclBpcGVsaW5lIiwiZGV2aWNlU3RyZWFtaW5nUHJvYyIsInF1YWxpdHkiLCJ0Y3BQb3J0IiwiY29uc2lkZXJSb3RhdGlvbiIsImxvZ1BpcGVsaW5lRGV0YWlscyIsImdzdHJlYW1lclBpcGVsaW5lIiwiU3ViUHJvY2VzcyIsIk1hdGgiLCJtYXgiLCJmcHMiLCJzdGRpbyIsImdzdHJlYW1lckxvZ2dlciIsImdzdE91dHB1dExpc3RlbmVyIiwiZGlkRmFpbCIsInJlcCIsInN0YXJ0IiwiaWduIiwiZXh0cmFjdFJlbW90ZUFkZHJlc3MiLCJyZXEiLCJoZWFkZXJzIiwic29ja2V0IiwicmVtb3RlQWRkcmVzcyIsImNvbm5lY3Rpb24iLCJtb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZyIsIm9wdGlvbnMiLCJlbnN1cmVGZWF0dXJlRW5hYmxlZCIsImhvc3QiLCJwb3J0IiwicGF0aG5hbWUiLCJpc1VuZGVmaW5lZCIsIl9zY3JlZW5TdHJlYW1pbmdQcm9wcyIsImtpbGwiLCJtanBlZ1NvY2tldCIsIm1qcGVnU2VydmVyIiwicmVzb2x2ZSIsInJlamVjdCIsIm5ldCIsImNyZWF0ZUNvbm5lY3Rpb24iLCJodHRwIiwiY3JlYXRlU2VydmVyIiwicmVzIiwiY3VycmVudFBhdGhuYW1lIiwidXJsIiwicGFyc2UiLCJ3cml0ZUhlYWQiLCJDb25uZWN0aW9uIiwid3JpdGUiLCJlbmQiLCJQcmFnbWEiLCJwaXBlIiwid2FybiIsImxpc3RlbiIsImVycm9yIiwidGltZW91dCIsImlzUnVubmluZyIsInN0b3AiLCJkZXN0cm95IiwibGlzdGVuaW5nIiwiY2xvc2UiLCJtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nIiwiZTEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsUUFBUSxHQUFHLEVBQWpCO0FBRUEsTUFBTUMsc0JBQXNCLEdBQUcsQ0FBL0I7QUFDQSxNQUFNQyw0QkFBNEIsR0FBRyxJQUFyQztBQUNBLE1BQU1DLGdCQUFnQixHQUFJLGlCQUFnQkMsZ0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUEzRTtBQUNBLE1BQU1DLGtCQUFrQixHQUFJLGtCQUFpQkYsZ0JBQU9DLFNBQVAsS0FBcUIsTUFBckIsR0FBOEIsRUFBRyxFQUE5RTtBQUNBLE1BQU1FLG9CQUFvQixHQUFHO0FBQzNCQyxFQUFBQSxVQUFVLEVBQUUsV0FEZTtBQUUzQkMsRUFBQUEsU0FBUyxFQUFFLGlCQUZnQjtBQUczQkMsRUFBQUEsT0FBTyxFQUFFLGtCQUhrQjtBQUkzQkMsRUFBQUEsYUFBYSxFQUFFLGtCQUpZO0FBSzNCQyxFQUFBQSxZQUFZLEVBQUU7QUFMYSxDQUE3QjtBQU9BLE1BQU1DLG1CQUFtQixHQUFHLGNBQTVCO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsdUVBQXpCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLFdBQXJCO0FBQ0EsTUFBTUMsUUFBUSxHQUFHLFdBQWpCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLElBQXJCO0FBQ0EsTUFBTUMsZUFBZSxHQUFHLEVBQXhCO0FBQ0EsTUFBTUMsZUFBZSxHQUFH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TTRELGlCQUFpQixDQUFDa0QsSUFBbEIsQ0FBdUIsU0FBdkIsQ0FBTjtBQUNELFNBRkQsQ0FFRSxPQUFPSyxFQUFQLEVBQVc7QUFDWG5HLDBCQUFJMkYsS0FBSixDQUFVUSxFQUFWO0FBQ0Q7QUFDRjtBQUNGOztBQUNEbkcsb0JBQUk4QixJQUFKLENBQVUsMkRBQVY7QUFDRCxHQXJCRCxTQXFCVTtBQUNSLFNBQUt1QyxxQkFBTCxHQUE2QixJQUE3QjtBQUNEO0FBQ0YsQ0F2Q0Q7O2VBMENlOUgsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcywgc3lzdGVtLCBsb2dnZXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgZXhlYywgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBjaGVja1BvcnRTdGF0dXMgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5jb25zdCBSRUNPUkRJTkdfSU5URVJWQUxfU0VDID0gNTtcbmNvbnN0IFNUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVMgPSA1MDAwO1xuY29uc3QgR1NUUkVBTUVSX0JJTkFSWSA9IGBnc3QtbGF1bmNoLTEuMCR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbmNvbnN0IEdTVF9JTlNQRUNUX0JJTkFSWSA9IGBnc3QtaW5zcGVjdC0xLjAke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5jb25zdCBSRVFVSVJFRF9HU1RfUExVR0lOUyA9IHtcbiAgYXZkZWNfaDI2NDogJ2dzdC1saWJhdicsXG4gIGgyNjRwYXJzZTogJ2dzdC1wbHVnaW5zLWJhZCcsXG4gIGpwZWdlbmM6ICdnc3QtcGx1Z2lucy1nb29kJyxcbiAgdGNwc2VydmVyc2luazogJ2dzdC1wbHVnaW5zLWJhc2UnLFxuICBtdWx0aXBhcnRtdXg6ICdnc3QtcGx1Z2lucy1nb29kJyxcbn07XG5jb25zdCBTQ1JFRU5SRUNPUkRfQklOQVJZID0gJ3NjcmVlbnJlY29yZCc7XG5jb25zdCBHU1RfVFVUT1JJQUxfVVJMID0gJ2h0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kb2N1bWVudGF0aW9uL2luc3RhbGxpbmcvaW5kZXguaHRtbCc7XG5jb25zdCBERUZBVUxUX0hPU1QgPSAnMTI3LjAuMC4xJztcbmNvbnN0IFRDUF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA4MDkzO1xuY29uc3QgREVGQVVMVF9RVUFMSVRZID0gNzA7XG5jb25zdCBERUZBVUxUX0JJVFJBVEUgPSA0MDAwMDAwOyAvLyA0IE1icHNcbmNvbnN0IEJPVU5EQVJZX1NUUklORyA9ICctLTJhZTk3NDY4ODdmMTcwYjhjZjdjMjcxMDQ3Y2UzMTRjJztcblxuY29uc3QgQURCX1NDUkVFTl9TVFJFQU1JTkdfRkVBVFVSRSA9ICdhZGJfc2NyZWVuX3N0cmVhbWluZyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0cmVhbWluZ0xvZ2dlciAoc3RyZWFtTmFtZSwgdWRpZCkge1xuICByZXR1cm4gbG9nZ2VyLmdldExvZ2dlcihgJHtzdHJlYW1OYW1lfUBgICsgXy50cnVuY2F0ZSh1ZGlkLCB7XG4gICAgbGVuZ3RoOiA4LFxuICAgIG9taXNzaW9uOiAnJyxcbiAgfSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlTdHJlYW1pbmdSZXF1aXJlbWVudHMgKGFkYikge1xuICBpZiAoIV8udHJpbShhd2FpdCBhZGIuc2hlbGwoWyd3aGljaCcsIFNDUkVFTlJFQ09SRF9CSU5BUlldKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHJlcXVpcmVkICcke1NDUkVFTlJFQ09SRF9CSU5BUll9JyBiaW5hcnkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3RgKTtcbiAgfVxuXG4gIGNvbnN0IGdzdHJlYW1lckNoZWNrUHJvbWlzZXMgPSBbXTtcbiAgZm9yIChjb25zdCBiaW5hcnlOYW1lIG9mIFtHU1RSRUFNRVJfQklOQVJZLCBHU1RfSU5TUEVDVF9CSU5BUlldKSB7XG4gICAgZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy53aGljaChiaW5hcnlOYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJyR7YmluYXJ5TmFtZX0nIGJpbmFyeSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBQQVRIIG9uIHRoZSBob3N0IHN5c3RlbS4gYCArXG4gICAgICAgICAgYFNlZSAke0dTVF9UVVRPUklBTF9VUkx9IGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIGluc3RhbGwgaXQuYCk7XG4gICAgICB9XG4gICAgfSkoKSk7XG4gIH1cbiAgYXdhaXQgQi5hbGwoZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcyk7XG5cbiAgY29uc3QgbW9kdWxlQ2hlY2tQcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBtb2ROYW1lXSBvZiBfLnRvUGFpcnMoUkVRVUlSRURfR1NUX1BMVUdJTlMpKSB7XG4gICAgbW9kdWxlQ2hlY2tQcm9taXNlcy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoR1NUX0lOU1BFQ1RfQklOQVJZLCBbbmFtZV0pO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKHN0ZG91dCwgbW9kTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgcmVxdWlyZWQgR1N0cmVhbWVyIHBsdWdpbiAnJHtuYW1lfScgZnJvbSAnJHttb2ROYW1lfScgbW9kdWxlIGlzIG5vdCBpbnN0YWxsZWQuIGAgK1xuICAgICAgICAgIGBTZWUgJHtHU1RfVFVUT1JJQUxfVVJMfSBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBpbnN0YWxsIGl0LmApO1xuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKG1vZHVsZUNoZWNrUHJvbWlzZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJbmZvIChhZGIpIHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgYWRiLnNoZWxsKFsnZHVtcHN5cycsICdkaXNwbGF5J10pO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCBwYXR0ZXJuXSBvZiBbXG4gICAgWyd3aWR0aCcsIC9cXGJkZXZpY2VXaWR0aD0oXFxkKykvXSxcbiAgICBbJ2hlaWdodCcsIC9cXGJkZXZpY2VIZWlnaHQ9KFxcZCspL10sXG4gICAgWydmcHMnLCAvXFxiZnBzPShcXGQrKS9dLFxuICBdKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMob3V0cHV0KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBsb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSBkZXZpY2UgJHtrZXl9IGZyb20gdGhlIGFkYiBjb21tYW5kIG91dHB1dC4gYCArXG4gICAgICAgIGBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzLmApO1xuICAgIH1cbiAgICByZXN1bHRba2V5XSA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gIH1cbiAgcmVzdWx0LnVkaWQgPSBhZGIuY3VyRGV2aWNlSWQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluaXREZXZpY2VTdHJlYW1pbmdQcm9jIChhZGIsIGRldmljZUluZm8sIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGJpdFJhdGUsXG4gIH0gPSBvcHRzO1xuICBjb25zdCBhZGp1c3RlZFdpZHRoID0gcGFyc2VJbnQod2lkdGgsIDEwKSB8fCBkZXZpY2VJbmZvLndpZHRoO1xuICBjb25zdCBhZGp1c3RlZEhlaWdodCA9IHBhcnNlSW50KGhlaWdodCwgMTApIHx8IGRldmljZUluZm8uaGVpZ2h0O1xuICBjb25zdCBhZGp1c3RlZEJpdHJhdGUgPSBwYXJzZUludChiaXRSYXRlLCAxMCkgfHwgREVGQVVMVF9CSVRSQVRFO1xuICBsZXQgc2NyZWVuUmVjb3JkQ21kID0gU0NSRUVOUkVDT1JEX0JJTkFSWSArXG4gICAgYCAtLW91dHB1dC1mb3JtYXQ9aDI2NGAgK1xuICAgIC8vIDUgc2Vjb25kcyBpcyBmaW5lIHRvIGRldGVjdCByb3RhdGlvbiBjaGFuZ2VzXG4gICAgYCAtLXRpbWUtbGltaXQ9JHtSRUNPUkRJTkdfSU5URVJWQUxfU0VDfWA7XG4gIGlmICh3aWR0aCB8fCBoZWlnaHQpIHtcbiAgICBzY3JlZW5SZWNvcmRDbWQgKz0gYCAtLXNpemU9JHthZGp1c3RlZFdpZHRofXgke2FkanVzdGVkSGVpZ2h0fWA7XG4gIH1cbiAgaWYgKGJpdFJhdGUpIHtcbiAgICBzY3JlZW5SZWNvcmRDbWQgKz0gYCAtLWJpdC1yYXRlPSR7YWRqdXN0ZWRCaXRyYXRlfWA7XG4gIH1cbiAgY29uc3QgYWRiQXJncyA9IFtcbiAgICAuLi5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJncyxcbiAgICAnZXhlYy1vdXQnLFxuICAgIC8vIFRoZSBsb29wIGlzIHJlcXVpcmVkLCBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlIG1heGltdW0gcmVjb3JkIGR1cmF0aW9uXG4gICAgLy8gZm9yIHNjcmVlbnJlY29yZCBpcyBhbHdheXMgbGltaXRlZFxuICAgIGB3aGlsZSB0cnVlOyBkbyAke3NjcmVlblJlY29yZENtZH0gLTsgZG9uZWAsXG4gIF07XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZyA9IHNwYXduKGFkYi5leGVjdXRhYmxlLnBhdGgsIGFkYkFyZ3MpO1xuICBkZXZpY2VTdHJlYW1pbmcub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgbG9nLmRlYnVnKGBEZXZpY2Ugc3RyZWFtaW5nIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LCBzaWduYWwgJHtzaWduYWx9YCk7XG4gIH0pO1xuXG4gIGxldCBpc1N0YXJ0ZWQgPSBmYWxzZTtcbiAgY29uc3QgZGV2aWNlU3RyZWFtaW5nTG9nZ2VyID0gY3JlYXRlU3RyZWFtaW5nTG9nZ2VyKFNDUkVFTlJFQ09SRF9CSU5BUlksIGRldmljZUluZm8udWRpZCk7XG4gIGNvbnN0IGVycm9yc0xpc3RlbmVyID0gKGNodW5rKSA9PiB7XG4gICAgY29uc3Qgc3RkZXJyID0gY2h1bmsudG9TdHJpbmcoKTtcbiAgICBpZiAoXy50cmltKHN0ZGVycikpIHtcbiAgICAgIGRldmljZVN0cmVhbWluZ0xvZ2dlci5kZWJ1ZyhzdGRlcnIpO1xuICAgIH1cbiAgfTtcbiAgZGV2aWNlU3RyZWFtaW5nLnN0ZGVyci5vbignZGF0YScsIGVycm9yc0xpc3RlbmVyKTtcblxuICBjb25zdCBzdGFydHVwTGlzdGVuZXIgPSAoY2h1bmspID0+IHtcbiAgICBpZiAoIWlzU3RhcnRlZCkge1xuICAgICAgaXNTdGFydGVkID0gIV8uaXNFbXB0eShjaHVuayk7XG4gICAgfVxuICB9O1xuICBkZXZpY2VTdHJlYW1pbmcuc3Rkb3V0Lm9uKCdkYXRhJywgc3RhcnR1cExpc3RlbmVyKTtcblxuICB0cnkge1xuICAgIGxvZy5pbmZvKGBTdGFydGluZyBkZXZpY2Ugc3RyZWFtaW5nOiAke3V0aWwucXVvdGUoW2FkYi5leGVjdXRhYmxlLnBhdGgsIC4uLmFkYkFyZ3NdKX1gKTtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKCgpID0+IGlzU3RhcnRlZCwge1xuICAgICAgd2FpdE1zOiBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TLFxuICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coXG4gICAgICBgQ2Fubm90IHN0YXJ0IHRoZSBzY3JlZW4gc3RyZWFtaW5nIHByb2Nlc3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBkZXZpY2VTdHJlYW1pbmcuc3RkZXJyLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgZXJyb3JzTGlzdGVuZXIpO1xuICAgIGRldmljZVN0cmVhbWluZy5zdGRvdXQucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBzdGFydHVwTGlzdGVuZXIpO1xuICB9XG4gIHJldHVybiBkZXZpY2VTdHJlYW1pbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluaXRHc3RyZWFtZXJQaXBlbGluZSAoZGV2aWNlU3RyZWFtaW5nUHJvYywgZGV2aWNlSW5mbywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgcXVhbGl0eSxcbiAgICB0Y3BQb3J0LFxuICAgIGNvbnNpZGVyUm90YXRpb24sXG4gICAgbG9nUGlwZWxpbmVEZXRhaWxzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCkgfHwgZGV2aWNlSW5mby53aWR0aDtcbiAgY29uc3QgYWRqdXN0ZWRIZWlnaHQgPSBwYXJzZUludChoZWlnaHQsIDEwKSB8fCBkZXZpY2VJbmZvLmhlaWdodDtcbiAgY29uc3QgZ3N0cmVhbWVyUGlwZWxpbmUgPSBuZXcgU3ViUHJvY2VzcyhHU1RSRUFNRVJfQklOQVJZLCBbXG4gICAgJy12JyxcbiAgICAnZmRzcmMnLCAnZmQ9MCcsXG4gICAgJyEnLCAndmlkZW8veC1oMjY0LCcgK1xuICAgICAgYHdpZHRoPSR7Y29uc2lkZXJSb3RhdGlvbiA/IE1hdGgubWF4KGFkanVzdGVkV2lkdGgsIGFkanVzdGVkSGVpZ2h0KSA6IGFkanVzdGVkV2lkdGh9LGAgK1xuICAgICAgYGhlaWdodD0ke2NvbnNpZGVyUm90YXRpb24gPyBNYXRoLm1heChhZGp1c3RlZFdpZHRoLCBhZGp1c3RlZEhlaWdodCkgOiBhZGp1c3RlZEhlaWdodH0sYCArXG4gICAgICBgZnJhbWVyYXRlPSR7ZGV2aWNlSW5mby5mcHN9LzEsYCArXG4gICAgICAnYnl0ZS1zdHJlYW09dHJ1ZScsXG4gICAgJyEnLCAnaDI2NHBhcnNlJyxcbiAgICAnIScsICdxdWV1ZScsICdsZWFreT1kb3duc3RyZWFtJyxcbiAgICAnIScsICdhdmRlY19oMjY0JyxcbiAgICAnIScsICdxdWV1ZScsICdsZWFreT1kb3duc3RyZWFtJyxcbiAgICAnIScsICdqcGVnZW5jJywgYHF1YWxpdHk9JHtxdWFsaXR5fWAsXG4gICAgJyEnLCAnbXVsdGlwYXJ0bXV4JywgYGJvdW5kYXJ5PSR7Qk9VTkRBUllfU1RSSU5HfWAsXG4gICAgJyEnLCAndGNwc2VydmVyc2luaycsIGBob3N0PSR7VENQX0hPU1R9YCwgYHBvcnQ9JHt0Y3BQb3J0fWAsXG4gIF0sIHtcbiAgICBzdGRpbzogW2RldmljZVN0cmVhbWluZ1Byb2Muc3Rkb3V0LCAncGlwZScsICdwaXBlJ11cbiAgfSk7XG4gIGdzdHJlYW1lclBpcGVsaW5lLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGxvZy5kZWJ1ZyhgUGlwZWxpbmUgc3RyZWFtaW5nIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LCBzaWduYWwgJHtzaWduYWx9YCk7XG4gIH0pO1xuICBjb25zdCBnc3RyZWFtZXJMb2dnZXIgPSBjcmVhdGVTdHJlYW1pbmdMb2dnZXIoJ2dzdCcsIGRldmljZUluZm8udWRpZCk7XG4gIGNvbnN0IGdzdE91dHB1dExpc3RlbmVyID0gKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgaWYgKF8udHJpbShzdGRlcnIgfHwgc3Rkb3V0KSkge1xuICAgICAgZ3N0cmVhbWVyTG9nZ2VyLmRlYnVnKHN0ZGVyciB8fCBzdGRvdXQpO1xuICAgIH1cbiAgfTtcbiAgZ3N0cmVhbWVyUGlwZWxpbmUub24oJ291dHB1dCcsIGdzdE91dHB1dExpc3RlbmVyKTtcbiAgbGV0IGRpZEZhaWwgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgR1N0cmVhbWVyIHBpcGVsaW5lOiAke2dzdHJlYW1lclBpcGVsaW5lLnJlcH1gKTtcbiAgICBhd2FpdCBnc3RyZWFtZXJQaXBlbGluZS5zdGFydCgwKTtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRjcFBvcnQsIFRDUF9IT1NUKSkgPT09ICdvcGVuJztcbiAgICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgd2FpdE1zOiBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TLFxuICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZGlkRmFpbCA9IHRydWU7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coXG4gICAgICBgQ2Fubm90IHN0YXJ0IHRoZSBzY3JlZW4gc3RyZWFtaW5nIHBpcGVsaW5lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKCFsb2dQaXBlbGluZURldGFpbHMgfHwgZGlkRmFpbCkge1xuICAgICAgZ3N0cmVhbWVyUGlwZWxpbmUucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIGdzdE91dHB1dExpc3RlbmVyKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdzdHJlYW1lclBpcGVsaW5lO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UmVtb3RlQWRkcmVzcyAocmVxKSB7XG4gIHJldHVybiByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ11cbiAgICB8fCByZXEuc29ja2V0LnJlbW90ZUFkZHJlc3NcbiAgICB8fCByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzXG4gICAgfHwgcmVxLmNvbm5lY3Rpb24uc29ja2V0LnJlbW90ZUFkZHJlc3M7XG59XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFNjcmVlblN0cmVhbWluZ09wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHNjYWxlZCB3aWR0aCBvZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuLiBJZiB1bnNldCB0aGVuIHRoZSBzY3JpcHQgd2lsbCBhc3NpZ24gaXRcbiAqIHRvIHRoZSBhY3R1YWwgc2NyZWVuIHdpZHRoIG1lYXN1cmVkIGluIHBpeGVscy5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIHNjYWxlZCBoZWlnaHQgb2YgdGhlIGRldmljZSdzIHNjcmVlbi4gSWYgdW5zZXQgdGhlbiB0aGUgc2NyaXB0IHdpbGwgYXNzaWduIGl0XG4gKiB0byB0aGUgYWN0dWFsIHNjcmVlbiBoZWlnaHQgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBiaXRSYXRlIC0gVGhlIHZpZGVvIGJpdCByYXRlIGZvciB0aGUgdmlkZW8sIGluIGJpdHMgcGVyIHNlY29uZC5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQwMDAwMDAgKDQgTWIvcykuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaG9zdCBbMTI3LjAuMC4xXSAtIFRoZSBJUCBhZGRyZXNzL2hvc3QgbmFtZSB0byBzdGFydCB0aGUgTUpQRUcgc2VydmVyIG9uLlxuICogWW91IGNhbiBzZXQgaXQgdG8gYDAuMC4wLjBgIHRvIHRyaWdnZXIgdGhlIGJyb2FkY2FzdCBvbiBhbGwgYXZhaWxhYmxlIG5ldHdvcmsgaW50ZXJmYWNlcy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGF0aG5hbWUgLSBUaGUgSFRUUCByZXF1ZXN0IHBhdGggdGhlIE1KUEVHIHNlcnZlciBzaG91bGQgYmUgYXZhaWxhYmxlIG9uLlxuICogSWYgdW5zZXQgdGhlbiBhbnkgcGF0aG5hbWUgb24gdGhlIGdpdmVuIGBob3N0YC9gcG9ydGAgY29tYmluYXRpb24gd2lsbCB3b3JrLiBOb3RlIHRoYXQgdGhlIHZhbHVlXG4gKiBzaG91bGQgYWx3YXlzIHN0YXJ0IHdpdGggYSBzaW5nbGUgc2xhc2g6IGAvYFxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0Y3BQb3J0IFs4MDk0XSAtIFRoZSBwb3J0IG51bWJlciB0byBzdGFydCB0aGUgaW50ZXJuYWwgVENQIE1KUEVHIGJyb2FkY2FzdCBvbi5cbiAqIFRoaXMgdHlwZSBvZiBicm9hZGNhc3QgYWx3YXlzIHN0YXJ0cyBvbiB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlIChgMTI3LjAuMC4xYCkuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHBvcnQgWzgwOTNdIC0gVGhlIHBvcnQgbnVtYmVyIHRvIHN0YXJ0IHRoZSBNSlBFRyBzZXJ2ZXIgb24uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHF1YWxpdHkgWzcwXSAtIFRoZSBxdWFsaXR5IHZhbHVlIGZvciB0aGUgc3RyZWFtZWQgSlBFRyBpbWFnZXMuXG4gKiBUaGlzIG51bWJlciBzaG91bGQgYmUgaW4gcmFuZ2UgWzEsIDEwMF0sIHdoZXJlIDEwMCBpcyB0aGUgYmVzdCBxdWFsaXR5LlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gY29uc2lkZXJSb3RhdGlvbiBbZmFsc2VdIC0gSWYgc2V0IHRvIGB0cnVlYCB0aGVuIEdTdHJlYW1lciBwaXBlbGluZSB3aWxsXG4gKiBpbmNyZWFzZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcmVzdWx0aW5nIGltYWdlcyB0byBwcm9wZXJseSBmaXQgaW1hZ2VzIGluIGJvdGggbGFuZHNjYXBlIGFuZFxuICogcG9ydHJhaXQgb3JpZW50YXRpb25zLiBTZXQgaXQgdG8gYHRydWVgIGlmIHRoZSBkZXZpY2Ugcm90YXRpb24gaXMgbm90IGdvaW5nIHRvIGJlIHRoZSBzYW1lIGR1cmluZyB0aGVcbiAqIGJyb2FkY2FzdGluZyBzZXNzaW9uLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gbG9nUGlwZWxpbmVEZXRhaWxzIFtmYWxzZV0gLSBXaGV0aGVyIHRvIGxvZyBHU3RyZWFtZXIgcGlwZWxpbmUgZXZlbnRzIGludG9cbiAqIHRoZSBzdGFuZGFyZCBsb2cgb3V0cHV0LiBNaWdodCBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAqL1xuXG4vKipcbiAqIFN0YXJ0cyBkZXZpY2Ugc2NyZWVuIGJyb2FkY2FzdCBieSBjcmVhdGluZyBNSlBFRyBzZXJ2ZXIuXG4gKiBNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCBoYXZlIG5vIGVmZmVjdCB1bmxlc3MgdGhlIHByZXZpb3VzIHN0cmVhbWluZ1xuICogc2Vzc2lvbiBpcyBzdG9wcGVkLlxuICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB0aGUgYGFkYl9zY3JlZW5fc3RyZWFtaW5nYCBmZWF0dXJlIGlzXG4gKiBlbmFibGVkIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFNjcmVlblN0cmVhbWluZ09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2NyZWVuIHN0cmVhbWluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0IG9yXG4gKiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBob3N0IHN5c3RlbSBvclxuICogdGhlIGNvcnJlc3BvbmRpbmcgc2VydmVyIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcgKG9wdGlvbnMgPSB7fSkge1xuICB0aGlzLmVuc3VyZUZlYXR1cmVFbmFibGVkKEFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUpO1xuXG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYml0UmF0ZSxcbiAgICBob3N0ID0gREVGQVVMVF9IT1NULFxuICAgIHBvcnQgPSBERUZBVUxUX1BPUlQsXG4gICAgcGF0aG5hbWUsXG4gICAgdGNwUG9ydCA9IERFRkFVTFRfUE9SVCArIDEsXG4gICAgcXVhbGl0eSA9IERFRkFVTFRfUVVBTElUWSxcbiAgICBjb25zaWRlclJvdGF0aW9uID0gZmFsc2UsXG4gICAgbG9nUGlwZWxpbmVEZXRhaWxzID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgIGF3YWl0IHZlcmlmeVN0cmVhbWluZ1JlcXVpcmVtZW50cyh0aGlzLmFkYik7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgbG9nLmluZm8oYFRoZSBzY3JlZW4gc3RyZWFtaW5nIHNlc3Npb24gaXMgYWxyZWFkeSBydW5uaW5nLiBgICtcbiAgICAgIGBTdG9wIGl0IGZpcnN0IGluIG9yZGVyIHRvIHN0YXJ0IGEgbmV3IG9uZS5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKChhd2FpdCBjaGVja1BvcnRTdGF0dXMocG9ydCwgaG9zdCkpID09PSAnb3BlbicpIHtcbiAgICBsb2cuaW5mbyhgVGhlIHBvcnQgIyR7cG9ydH0gYXQgJHtob3N0fSBpcyBidXN5LiBgICtcbiAgICAgIGBBc3N1bWluZyB0aGUgc2NyZWVuIHN0cmVhbWluZyBpcyBhbHJlYWR5IHJ1bm5pbmdgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKChhd2FpdCBjaGVja1BvcnRTdGF0dXModGNwUG9ydCwgVENQX0hPU1QpKSA9PT0gJ29wZW4nKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coYFRoZSBwb3J0ICMke3RjcFBvcnR9IGF0ICR7VENQX0hPU1R9IGlzIGJ1c3kuIGAgK1xuICAgICAgYE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbGVmdG92ZXJzIGZyb20gcHJldmlvdXMgc2Vzc2lvbnMuYCk7XG4gIH1cbiAgdGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMgPSBudWxsO1xuXG4gIGNvbnN0IGRldmljZUluZm8gPSBhd2FpdCBnZXREZXZpY2VJbmZvKHRoaXMuYWRiKTtcbiAgY29uc3QgZGV2aWNlU3RyZWFtaW5nUHJvYyA9IGF3YWl0IGluaXREZXZpY2VTdHJlYW1pbmdQcm9jKHRoaXMuYWRiLCBkZXZpY2VJbmZvLCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGJpdFJhdGUsXG4gIH0pO1xuICBsZXQgZ3N0cmVhbWVyUGlwZWxpbmU7XG4gIHRyeSB7XG4gICAgZ3N0cmVhbWVyUGlwZWxpbmUgPSBhd2FpdCBpbml0R3N0cmVhbWVyUGlwZWxpbmUoZGV2aWNlU3RyZWFtaW5nUHJvYywgZGV2aWNlSW5mbywge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBxdWFsaXR5LFxuICAgICAgdGNwUG9ydCxcbiAgICAgIGNvbnNpZGVyUm90YXRpb24sXG4gICAgICBsb2dQaXBlbGluZURldGFpbHMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKDApKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoKTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIGxldCBtanBlZ1NvY2tldDtcbiAgbGV0IG1qcGVnU2VydmVyO1xuICB0cnkge1xuICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG1qcGVnU29ja2V0ID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24odGNwUG9ydCwgVENQX0hPU1QsICgpID0+IHtcbiAgICAgICAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gTUpQRUcgc3RyZWFtIGF0IHRjcDovLyR7VENQX0hPU1R9OiR7dGNwUG9ydH1gKTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcigocmVxLCByZXMpID0+IHtcbiAgICAgICAgICBjb25zdCByZW1vdGVBZGRyZXNzID0gZXh0cmFjdFJlbW90ZUFkZHJlc3MocmVxKTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aG5hbWUgPSB1cmwucGFyc2UocmVxLnVybCkucGF0aG5hbWU7XG4gICAgICAgICAgbG9nLmluZm8oYEdvdCBhbiBpbmNvbWluZyBzY3JlZW4gYnJhZGNhc3RpbmcgcmVxdWVzdCBmcm9tICR7cmVtb3RlQWRkcmVzc30gYCArXG4gICAgICAgICAgICBgKCR7cmVxLmhlYWRlcnNbJ3VzZXItYWdlbnQnXSB8fCAnVXNlciBBZ2VudCB1bmtub3duJ30pIGF0ICR7Y3VycmVudFBhdGhuYW1lfWApO1xuXG4gICAgICAgICAgaWYgKHBhdGhuYW1lICYmIGN1cnJlbnRQYXRobmFtZSAhPT0gcGF0aG5hbWUpIHtcbiAgICAgICAgICAgIGxvZy5pbmZvKCdSZWplY3RpbmcgdGhlIGJyb2FkY2FzdCByZXF1ZXN0IHNpbmNlIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBnaXZlbiBwYXRobmFtZScpO1xuICAgICAgICAgICAgcmVzLndyaXRlSGVhZCg0MDQsIHtcbiAgICAgICAgICAgICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzLndyaXRlKGAnJHtjdXJyZW50UGF0aG5hbWV9JyBkaWQgbm90IG1hdGNoIGFueSBrbm93biBlbmRwb2ludHNgKTtcbiAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsb2cuaW5mbygnU3RhcnRpbmcgTUpQRUcgYnJvYWRjYXN0Jyk7XG4gICAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgICAgICAgICdDYWNoZS1Db250cm9sJzogJ25vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAnLFxuICAgICAgICAgICAgUHJhZ21hOiAnbm8tY2FjaGUnLFxuICAgICAgICAgICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiBgbXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZTsgYm91bmRhcnk9JHtCT1VOREFSWV9TVFJJTkd9YFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWpwZWdTb2NrZXQucGlwZShyZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIub24oJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgICBsb2cud2FybihlKTtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBNSlBFRyBzZXJ2ZXIgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fSBoYXMgYmVlbiBjbG9zZWRgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLm9uKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICAgICAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBzdGFydGVkIE1KUEVHIHNlcnZlciBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9YCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICAgICAgfSk7XG4gICAgICBtanBlZ1NvY2tldC5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICBsb2cuZXJyb3IoZSk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0pO1xuICAgIH0pLnRpbWVvdXQoU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgIGBDYW5ub3QgY29ubmVjdCB0byB0aGUgc3RyZWFtaW5nIHNlcnZlciB3aXRoaW4gJHtTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TfW1zYCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKDApKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoKTtcbiAgICB9XG4gICAgaWYgKGdzdHJlYW1lclBpcGVsaW5lLmlzUnVubmluZykge1xuICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgpO1xuICAgIH1cbiAgICBpZiAobWpwZWdTb2NrZXQpIHtcbiAgICAgIG1qcGVnU29ja2V0LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKG1qcGVnU2VydmVyICYmIG1qcGVnU2VydmVyLmxpc3RlbmluZykge1xuICAgICAgbWpwZWdTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzID0ge1xuICAgIGRldmljZVN0cmVhbWluZ1Byb2MsXG4gICAgZ3N0cmVhbWVyUGlwZWxpbmUsXG4gICAgbWpwZWdTb2NrZXQsXG4gICAgbWpwZWdTZXJ2ZXIsXG4gIH07XG59O1xuXG4vKipcbiAqIFN0b3Agc2NyZWVuIHN0cmVhbWluZy5cbiAqIElmIG5vIHNjcmVlbiBzdHJlYW1pbmcgc2VydmVyIGhhcyBiZWVuIHN0YXJ0ZWQgdGhlbiBub3RoaW5nIGlzIGRvbmUuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nICgvKiBvcHRpb25zID0ge30gKi8pIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcykpIHtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgICBsb2cuZGVidWcoYFNjcmVlbiBzdHJlYW1pbmcgaXMgbm90IHJ1bm5pbmcuIFRoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcGApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgZGV2aWNlU3RyZWFtaW5nUHJvYyxcbiAgICBnc3RyZWFtZXJQaXBlbGluZSxcbiAgICBtanBlZ1NvY2tldCxcbiAgICBtanBlZ1NlcnZlcixcbiAgfSA9IHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzO1xuXG4gIHRyeSB7XG4gICAgbWpwZWdTb2NrZXQuZW5kKCk7XG4gICAgaWYgKG1qcGVnU2VydmVyLmxpc3RlbmluZykge1xuICAgICAgbWpwZWdTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCdTSUdJTlQnKTtcbiAgICB9XG4gICAgaWYgKGdzdHJlYW1lclBpcGVsaW5lLmlzUnVubmluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgnU0lHSU5UJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy53YXJuKGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGdzdHJlYW1lclBpcGVsaW5lLnN0b3AoJ1NJR0tJTEwnKTtcbiAgICAgICAgfSBjYXRjaCAoZTEpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoZTEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgdGVybWluYXRlZCB0aGUgc2NyZWVuIHN0cmVhbWluZyBNSlBFRyBzZXJ2ZXJgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IG51bGw7XG4gIH1cbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwiZmlsZSI6ImxpYi9jb21tYW5kcy9zdHJlYW1zY3JlZW4uanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==