appium-android-driver 5.11.2 → 5.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [5.12.0](https://github.com/appium/appium-android-driver/compare/v5.11.2...v5.12.0) (2023-05-05)
2
+
3
+
4
+ ### Features
5
+
6
+ * Add mobile endpoint for getting performance data ([#810](https://github.com/appium/appium-android-driver/issues/810)) ([70a0144](https://github.com/appium/appium-android-driver/commit/70a0144751c085d5e4c4c28ffa61ca49cfc59553))
7
+
1
8
  ## [5.11.2](https://github.com/appium/appium-android-driver/compare/v5.11.1...v5.11.2) (2023-04-29)
2
9
 
3
10
 
@@ -4,14 +4,16 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.helpers = exports.default = exports.commands = exports.SUPPORTED_PERFORMANCE_DATA_TYPES = exports.NETWORK_KEYS = exports.MEMORY_KEYS = exports.CPU_KEYS = exports.BATTERY_KEYS = void 0;
7
+ exports.default = exports.commands = exports.SUPPORTED_PERFORMANCE_DATA_TYPES = exports.NETWORK_KEYS = exports.MEMORY_KEYS = exports.CPU_KEYS = exports.BATTERY_KEYS = void 0;
8
+ exports.getBatteryInfo = getBatteryInfo;
9
+ exports.getCPUInfo = getCPUInfo;
10
+ exports.getMemoryInfo = getMemoryInfo;
11
+ exports.getNetworkTrafficInfo = getNetworkTrafficInfo;
8
12
  require("source-map-support/register");
9
13
  var _lodash = _interopRequireDefault(require("lodash"));
10
14
  var _asyncbox = require("asyncbox");
11
- const commands = {},
12
- helpers = {},
13
- extensions = {};
14
- exports.helpers = helpers;
15
+ var _utils = require("../utils");
16
+ const commands = {};
15
17
  exports.commands = commands;
16
18
  const NETWORK_KEYS = [['bucketStart', 'activeTime', 'rxBytes', 'rxPackets', 'txBytes', 'txPackets', 'operations', 'bucketDuration'], ['st', 'activeTime', 'rb', 'rp', 'tb', 'tp', 'op', 'bucketDuration']];
17
19
  exports.NETWORK_KEYS = NETWORK_KEYS;
@@ -80,57 +82,7 @@ function parseMeminfoForApiAbove29(entries, valDict) {
80
82
  [, valDict.totalPss, valDict.totalPrivateDirty,,, valDict.totalRss] = entries;
81
83
  }
82
84
  }
83
- commands.getPerformanceDataTypes = function getPerformanceDataTypes() {
84
- return _lodash.default.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);
85
- };
86
- commands.getPerformanceData = async function getPerformanceData(packageName, dataType, retries = 2) {
87
- switch (_lodash.default.toLower(dataType)) {
88
- case 'batteryinfo':
89
- return await this.getBatteryInfo(retries);
90
- case 'cpuinfo':
91
- return await this.getCPUInfo(packageName, retries);
92
- case 'memoryinfo':
93
- return await this.getMemoryInfo(packageName, retries);
94
- case 'networkinfo':
95
- return await this.getNetworkTrafficInfo(retries);
96
- default:
97
- throw new Error(`No performance data of type '${dataType}' found. ` + `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);
98
- }
99
- };
100
- helpers.getCPUInfo = async function getCPUInfo(packageName, retries = 2) {
101
- return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
102
- let output;
103
- try {
104
- output = await this.adb.shell(['dumpsys', 'cpuinfo']);
105
- } catch (e) {
106
- if (e.stderr) {
107
- this.log.info(e.stderr);
108
- }
109
- throw e;
110
- }
111
- const usagesPattern = new RegExp(`^.+\\/${_lodash.default.escapeRegExp(packageName)}:\\D+([\\d.]+)%\\s+user\\s+\\+\\s+([\\d.]+)%\\s+kernel`, 'm');
112
- const match = usagesPattern.exec(output);
113
- if (!match) {
114
- this.log.debug(output);
115
- throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);
116
- }
117
- return [CPU_KEYS, [match[1], match[2]]];
118
- });
119
- };
120
- helpers.getBatteryInfo = async function getBatteryInfo(retries = 2) {
121
- return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
122
- let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];
123
- let data = await this.adb.shell(cmd);
124
- if (!data) throw new Error('No data from dumpsys');
125
- let power = parseInt((data.split(':')[1] || '').trim(), 10);
126
- if (!Number.isNaN(power)) {
127
- return [_lodash.default.clone(BATTERY_KEYS), [power.toString()]];
128
- } else {
129
- throw new Error(`Unable to parse battery data: '${data}'`);
130
- }
131
- });
132
- };
133
- helpers.getMemoryInfo = async function getMemoryInfo(packageName, retries = 2) {
85
+ async function getMemoryInfo(packageName, retries = 2) {
134
86
  return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
135
87
  const cmd = ['dumpsys', 'meminfo', `'${packageName}'`, '|', 'grep', '-E', `'${MEMINFO_TITLES.NATIVE}|${MEMINFO_TITLES.DALVIK}|${MEMINFO_TITLES.EGL}` + `|${MEMINFO_TITLES.GL}|${MEMINFO_TITLES.TOTAL}'`];
136
88
  const data = await this.adb.shell(cmd);
@@ -158,8 +110,9 @@ helpers.getMemoryInfo = async function getMemoryInfo(packageName, retries = 2) {
158
110
  }
159
111
  throw new Error(`Unable to parse memory data: '${data}'`);
160
112
  });
161
- };
162
- helpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo(retries = 2) {
113
+ }
114
+ ;
115
+ async function getNetworkTrafficInfo(retries = 2) {
163
116
  return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
164
117
  let returnValue = [];
165
118
  let bucketDuration, bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations;
@@ -261,8 +214,64 @@ helpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo(retries = 2
261
214
  throw new Error(`Unable to parse network traffic data: '${data}'`);
262
215
  }
263
216
  });
217
+ }
218
+ async function getCPUInfo(packageName, retries = 2) {
219
+ return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
220
+ let output;
221
+ try {
222
+ output = await this.adb.shell(['dumpsys', 'cpuinfo']);
223
+ } catch (e) {
224
+ if (e.stderr) {
225
+ this.log.info(e.stderr);
226
+ }
227
+ throw e;
228
+ }
229
+ const usagesPattern = new RegExp(`^.+\\/${_lodash.default.escapeRegExp(packageName)}:\\D+([\\d.]+)%\\s+user\\s+\\+\\s+([\\d.]+)%\\s+kernel`, 'm');
230
+ const match = usagesPattern.exec(output);
231
+ if (!match) {
232
+ this.log.debug(output);
233
+ throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);
234
+ }
235
+ return [CPU_KEYS, [match[1], match[2]]];
236
+ });
237
+ }
238
+ async function getBatteryInfo(retries = 2) {
239
+ return await (0, _asyncbox.retryInterval)(retries, RETRY_PAUSE_MS, async () => {
240
+ let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];
241
+ let data = await this.adb.shell(cmd);
242
+ if (!data) throw new Error('No data from dumpsys');
243
+ let power = parseInt((data.split(':')[1] || '').trim(), 10);
244
+ if (!Number.isNaN(power)) {
245
+ return [_lodash.default.clone(BATTERY_KEYS), [power.toString()]];
246
+ } else {
247
+ throw new Error(`Unable to parse battery data: '${data}'`);
248
+ }
249
+ });
250
+ }
251
+ commands.getPerformanceDataTypes = function getPerformanceDataTypes() {
252
+ return _lodash.default.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);
253
+ };
254
+ commands.getPerformanceData = async function getPerformanceData(packageName, dataType, retries = 2) {
255
+ switch (_lodash.default.toLower(dataType)) {
256
+ case 'batteryinfo':
257
+ return await getBatteryInfo.bind(this)(retries);
258
+ case 'cpuinfo':
259
+ return await getCPUInfo.bind(this)(packageName, retries);
260
+ case 'memoryinfo':
261
+ return await getMemoryInfo.bind(this)(packageName, retries);
262
+ case 'networkinfo':
263
+ return await getNetworkTrafficInfo.bind(this)(retries);
264
+ default:
265
+ throw new Error(`No performance data of type '${dataType}' found. ` + `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);
266
+ }
267
+ };
268
+ commands.mobileGetPerformanceData = async function mobileGetPerformanceData(opts = {}) {
269
+ const {
270
+ packageName,
271
+ dataType
272
+ } = (0, _utils.requireArgs)(['packageName', 'dataType'], opts);
273
+ return await this.getPerformanceData(packageName, dataType);
264
274
  };
265
- Object.assign(extensions, commands, helpers);
266
- var _default = extensions;
275
+ var _default = commands;
267
276
  exports.default = _default;
268
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmNib3giLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZXhwb3J0cyIsIk5FVFdPUktfS0VZUyIsIkNQVV9LRVlTIiwiQkFUVEVSWV9LRVlTIiwiTUVNT1JZX0tFWVMiLCJTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUyIsIk9iamVjdCIsImZyZWV6ZSIsImNwdWluZm8iLCJtZW1vcnlpbmZvIiwiYmF0dGVyeWluZm8iLCJuZXR3b3JraW5mbyIsIk1FTUlORk9fVElUTEVTIiwiTkFUSVZFIiwiREFMVklLIiwiRUdMIiwiR0wiLCJNVFJBQ0siLCJUT1RBTCIsIkhFQVAiLCJSRVRSWV9QQVVTRV9NUyIsInBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOSIsImVudHJpZXMiLCJ2YWxEaWN0IiwidHlwZSIsInN1YlR5cGUiLCJuYXRpdmVQc3MiLCJuYXRpdmVQcml2YXRlRGlydHkiLCJuYXRpdmVIZWFwU2l6ZSIsIm5hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplIiwiZGFsdmlrUHNzIiwiZGFsdmlrUHJpdmF0ZURpcnR5IiwiZWdsUHNzIiwiZWdsUHJpdmF0ZURpcnR5IiwiZ2xQc3MiLCJnbFByaXZhdGVEaXJ0eSIsImxlbmd0aCIsInRvdGFsUHNzIiwidG90YWxQcml2YXRlRGlydHkiLCJwYXJzZU1lbWluZm9Gb3JBcGlCZWxvdzE5IiwicGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOSIsIm5hdGl2ZVJzcyIsImRhbHZpa1JzcyIsInRvdGFsUnNzIiwiZ2V0UGVyZm9ybWFuY2VEYXRhVHlwZXMiLCJfIiwia2V5cyIsImdldFBlcmZvcm1hbmNlRGF0YSIsInBhY2thZ2VOYW1lIiwiZGF0YVR5cGUiLCJyZXRyaWVzIiwidG9Mb3dlciIsImdldEJhdHRlcnlJbmZvIiwiZ2V0Q1BVSW5mbyIsImdldE1lbW9yeUluZm8iLCJnZXROZXR3b3JrVHJhZmZpY0luZm8iLCJFcnJvciIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXRyeUludGVydmFsIiwib3V0cHV0IiwiYWRiIiwic2hlbGwiLCJlIiwic3RkZXJyIiwibG9nIiwiaW5mbyIsInVzYWdlc1BhdHRlcm4iLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJtYXRjaCIsImV4ZWMiLCJkZWJ1ZyIsImNtZCIsImRhdGEiLCJwb3dlciIsInBhcnNlSW50Iiwic3BsaXQiLCJ0cmltIiwiTnVtYmVyIiwiaXNOYU4iLCJjbG9uZSIsInRvU3RyaW5nIiwiYXBpTGV2ZWwiLCJnZXRBcGlMZXZlbCIsImxpbmUiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaGVhZGVycyIsInZhbHVlcyIsIm1hcCIsImhlYWRlciIsInJldHVyblZhbHVlIiwiYnVja2V0RHVyYXRpb24iLCJidWNrZXRTdGFydCIsImFjdGl2ZVRpbWUiLCJyeEJ5dGVzIiwicnhQYWNrZXRzIiwidHhCeXRlcyIsInR4UGFja2V0cyIsIm9wZXJhdGlvbnMiLCJpbmRleCIsImZyb21YdHN0YXRzIiwiaW5kZXhPZiIsInN0YXJ0IiwiZGVsaW1pdGVyIiwiZW5kIiwicGVuZGluZ0J5dGVzIiwic3Vic3RyaW5nIiwiYXJyYXlMaXN0IiwiaiIsImsiLCJyZXR1cm5JbmRleCIsImkiLCJpc0VxdWFsIiwiaXNVbmRlZmluZWQiLCJhc3NpZ24iLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvcGVyZm9ybWFuY2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5cbmNvbnN0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBORVRXT1JLX0tFWVMgPSBbXG4gIFsnYnVja2V0U3RhcnQnLCAnYWN0aXZlVGltZScsICdyeEJ5dGVzJywgJ3J4UGFja2V0cycsICd0eEJ5dGVzJywgJ3R4UGFja2V0cycsICdvcGVyYXRpb25zJywgJ2J1Y2tldER1cmF0aW9uJ10sXG4gIFsnc3QnLCAnYWN0aXZlVGltZScsICdyYicsICdycCcsICd0YicsICd0cCcsICdvcCcsICdidWNrZXREdXJhdGlvbiddXG5dO1xuY29uc3QgQ1BVX0tFWVMgPSBbJ3VzZXInLCAna2VybmVsJ107XG5jb25zdCBCQVRURVJZX0tFWVMgPSBbJ3Bvd2VyJ107XG5jb25zdCBNRU1PUllfS0VZUyA9IFtcbiAgJ3RvdGFsUHJpdmF0ZURpcnR5JywgJ25hdGl2ZVByaXZhdGVEaXJ0eScsICdkYWx2aWtQcml2YXRlRGlydHknLFxuICAnZWdsUHJpdmF0ZURpcnR5JywgJ2dsUHJpdmF0ZURpcnR5JyxcbiAgJ3RvdGFsUHNzJywgJ25hdGl2ZVBzcycsICdkYWx2aWtQc3MnLCAnZWdsUHNzJywgJ2dsUHNzJyxcbiAgJ25hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplJywgJ25hdGl2ZUhlYXBTaXplJyxcbiAgJ25hdGl2ZVJzcycsICdkYWx2aWtSc3MnLCAndG90YWxSc3MnXG5dO1xuY29uc3QgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMgPSBPYmplY3QuZnJlZXplKHtcbiAgY3B1aW5mbzogJ3RoZSBhbW91bnQgb2YgY3B1IGJ5IHVzZXIgYW5kIGtlcm5lbCBwcm9jZXNzIC0gY3B1IGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2VzIGFuZCBzaW11bGF0b3JzJyxcbiAgbWVtb3J5aW5mbzogJ3RoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHByb2Nlc3MgLSBtZW1vcnkgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBiYXR0ZXJ5aW5mbzogJ3RoZSByZW1haW5pbmcgYmF0dGVyeSBwb3dlciAtIGJhdHRlcnkgcG93ZXIgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBuZXR3b3JraW5mbzogJ3RoZSBuZXR3b3JrIHN0YXRpc3RpY3MgLSBuZXR3b3JrIHJ4L3R4IGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2VzIGFuZCBzaW11bGF0b3JzJ1xufSk7XG5jb25zdCBNRU1JTkZPX1RJVExFUyA9IE9iamVjdC5mcmVlemUoe1xuICBOQVRJVkU6ICdOYXRpdmUnLFxuICBEQUxWSUs6ICdEYWx2aWsnLFxuICBFR0w6ICdFR0wnLFxuICBHTDogJ0dMJyxcbiAgTVRSQUNLOiAnbXRyYWNrJyxcbiAgVE9UQUw6ICdUT1RBTCcsXG4gIEhFQVA6ICdIZWFwJ1xufSk7XG5jb25zdCBSRVRSWV9QQVVTRV9NUyA9IDEwMDA7XG5cbi8qKlxuICogQVBJIGxldmVsIGJldHdlZW4gMTggYW5kIDMwXG4gKiBbJzxTeXN0ZW0gVHlwZT4nLCAnPE1lbW9yeSBUeXBlPicsIDxwc3MgdG90YWw+LCA8cHJpdmF0ZSBkaXJ0eT4sIDxwcml2YXRlIGNsZWFuPiwgPHN3YXBQc3MgZGlydHk+LCA8aGVhcCBzaXplPiwgPGhlYXAgYWxsb2M+LCA8aGVhcCBmcmVlPl1cbiAqIGV4Y2VwdCAnVE9UQUwnLCB3aGljaCBza2lwcyB0aGUgc2Vjb25kIHR5cGUgbmFtZVxuICogISEhIHZhbERpY3QgZ2V0cyBtdXRhdGVkXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCBbdHlwZSwgc3ViVHlwZV0gPSBlbnRyaWVzO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5uYXRpdmVQc3MsIHZhbERpY3QubmF0aXZlUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUsgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0LmRhbHZpa1BzcywgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZWdsUHNzLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmdsUHNzLCB2YWxEaWN0LmdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuVE9UQUwgJiYgZW50cmllcy5sZW5ndGggPT09IDgpIHtcbiAgICAvLyB0aGVyZSBhcmUgdHdvIHRvdGFscywgYW5kIHdlIG9ubHkgd2FudCB0aGUgZnVsbCBsaXN0aW5nLCB3aGljaCBoYXMgOCBlbnRyaWVzXG4gICAgWywgdmFsRGljdC50b3RhbFBzcywgdmFsRGljdC50b3RhbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9XG59XG5cbi8qKlxuICogWyc8U3lzdGVtIFR5cGUnLCAnPHBwcz4nLCAnPHNoYXJlZCBkaXJ0eT4nLCAnPHByaXZhdGUgZGlydHk+JywgJzxoZWFwIHNpemU+JywgJzxoZWFwIGFsbG9jPicsICc8aGVhcCBmcmVlPiddXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpQmVsb3cxOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCB0eXBlID0gZW50cmllc1swXTtcbiAgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLk5BVElWRSkge1xuICAgIFssIHZhbERpY3QubmF0aXZlUHNzLCwgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUspIHtcbiAgICBbLCB2YWxEaWN0LmRhbHZpa1BzcywsIHZhbERpY3QuZGFsdmlrUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuRUdMKSB7XG4gICAgWywgdmFsRGljdC5lZ2xQc3MsLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMKSB7XG4gICAgWywgdmFsRGljdC5nbFBzcywsIHZhbERpY3QuZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5UT1RBTCkge1xuICAgIFssIHZhbERpY3QudG90YWxQc3MsLCB2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBBUEkgbGV2ZWwgMzAgYW5kIGFib3ZlXG4gKiBbJzxTeXN0ZW0gVHlwZT4nLCAnPE1lbW9yeSBUeXBlPicsIDxwc3MgdG90YWw+LCA8cHJpdmF0ZSBkaXJ0eT4sIDxwcml2YXRlIGNsZWFuPiwgPHN3YXBQc3MgZGlydHk+LCA8cnNzIHRvdGFsPiwgPGhlYXAgc2l6ZT4sIDxoZWFwIGFsbG9jPiwgPGhlYXAgZnJlZT5dXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCBbdHlwZSwgc3ViVHlwZV0gPSBlbnRyaWVzO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5uYXRpdmVQc3MsIHZhbERpY3QubmF0aXZlUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QubmF0aXZlUnNzLCB2YWxEaWN0Lm5hdGl2ZUhlYXBTaXplLCB2YWxEaWN0Lm5hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplXSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuREFMVklLICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5kYWx2aWtQc3MsIHZhbERpY3QuZGFsdmlrUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QuZGFsdmlrUnNzXSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuRUdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmVnbFBzcywgdmFsRGljdC5lZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5HTCAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5NVFJBQ0spIHtcbiAgICBbLCwgdmFsRGljdC5nbFBzcywgdmFsRGljdC5nbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLlRPVEFMICYmIGVudHJpZXMubGVuZ3RoID09PSA5KSB7XG4gICAgLy8gaGFzIDkgZW50cmllc1xuICAgIFssIHZhbERpY3QudG90YWxQc3MsIHZhbERpY3QudG90YWxQcml2YXRlRGlydHksLCwgdmFsRGljdC50b3RhbFJzc10gPSBlbnRyaWVzO1xuICB9XG59XG5cbi8vXG4vLyByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiB0eXBlIG9mIHRoZSBzeXN0ZW0gc3RhdGUgd2hpY2ggaXMgc3VwcG9ydGVkIHRvIHJlYWQgYXMgbGlrZSBjcHUsIG1lbW9yeSwgbmV0d29yayB0cmFmZmljLCBhbmQgYmF0dGVyeS5cbi8vIG91dHB1dCAtIGFycmF5IGxpa2UgYmVsb3dcbi8vIFtjcHVpbmZvLCBiYXR0ZXJ5aW5mbywgbmV0d29ya2luZm8sIG1lbW9yeWluZm9dXG4vL1xuY29tbWFuZHMuZ2V0UGVyZm9ybWFuY2VEYXRhVHlwZXMgPSBmdW5jdGlvbiBnZXRQZXJmb3JtYW5jZURhdGFUeXBlcyAoKSB7XG4gIHJldHVybiBfLmtleXMoU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJucyBUaGUgaW5mb3JtYXRpb24gdHlwZSBvZiB0aGUgc3lzdGVtIHN0YXRlIHdoaWNoIGlzIHN1cHBvcnRlZCB0byByZWFkIGFzIGxpa2UgY3B1LCBtZW1vcnksIG5ldHdvcmsgdHJhZmZpYywgYW5kIGJhdHRlcnkuXG4gKiBpbnB1dCAtIChwYWNrYWdlTmFtZSkgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb25cbiAqICAgICAgICAoZGF0YVR5cGUpIHRoZSB0eXBlIG9mIHN5c3RlbSBzdGF0ZSB3aGljaCB3YW50cyB0byByZWFkLiBJdCBzaG91bGQgYmUgb25lIG9mIHRoZSBrZXlzIG9mIHRoZSBTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFU1xuICogICAgICAgIChkYXRhUmVhZFRpbWVvdXQpIHRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgdG8gcmVhZFxuICogb3V0cHV0IC0gdGFibGUgb2YgdGhlIHBlcmZvcm1hbmNlIGRhdGEsIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSB0YWJsZSByZXByZXNlbnRzIHRoZSB0eXBlIG9mIGRhdGEuIFRoZSByZW1haW5pbmcgbGluZXMgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgdGhlIGRhdGEuXG4gKlxuICogaW4gY2FzZSBvZiBiYXR0ZXJ5IGluZm8gOiBbW3Bvd2VyXSwgWzIzXV1cbiAqIGluIGNhc2Ugb2YgbWVtb3J5IGluZm8gOiAgW1t0b3RhbFByaXZhdGVEaXJ0eSwgbmF0aXZlUHJpdmF0ZURpcnR5LCBkYWx2aWtQcml2YXRlRGlydHksIGVnbFByaXZhdGVEaXJ0eSwgZ2xQcml2YXRlRGlydHksIHRvdGFsUHNzLFxuICogICBuYXRpdmVQc3MsIGRhbHZpa1BzcywgZWdsUHNzLCBnbFBzcywgbmF0aXZlSGVhcEFsbG9jYXRlZFNpemUsIG5hdGl2ZUhlYXBTaXplXSwgWzE4MzYwLCA4Mjk2LCA2MTMyLCBudWxsLCBudWxsLCA0MjU4OCwgODQwNiwgNzAyNCwgbnVsbCwgbnVsbCwgMjY1MTksIDEwMzQ0XV1cbiAqIGluIGNhc2Ugb2YgbmV0d29yayBpbmZvIDogW1tidWNrZXRTdGFydCwgYWN0aXZlVGltZSwgcnhCeXRlcywgcnhQYWNrZXRzLCB0eEJ5dGVzLCB0eFBhY2tldHMsIG9wZXJhdGlvbnMsIGJ1Y2tldER1cmF0aW9uLF0sXG4gKiAgIFsxNDc4MDkxNjAwMDAwLCBudWxsLCAxMDk5MDc1LCA2MTA5NDcsIDkyOCwgMTE0MzYyLCA3NjksIDAsIDM2MDAwMDBdLCBbMTQ3ODA5NTIwMDAwMCwgbnVsbCwgMTMwNjMwMCwgNDA1OTk3LCA1MDksIDQ2MzU5LCAzNzAsIDAsIDM2MDAwMDBdXVxuICogaW4gY2FzZSBvZiBuZXR3b3JrIGluZm8gOiBbW3N0LCBhY3RpdmVUaW1lLCByYiwgcnAsIHRiLCB0cCwgb3AsIGJ1Y2tldER1cmF0aW9uXSwgWzE0NzgwODgwMDAsIG51bGwsIG51bGwsIDMyMTE1Mjk2LCAzNDI5MSwgMjk1NjgwNSwgMjU3MDUsIDAsIDM2MDBdLFxuICogICBbMTQ3ODA5MTYwMCwgbnVsbCwgbnVsbCwgMjcxNDY4MywgMTE4MjEsIDE0MjA1NjQsIDEyNjUwLCAwLCAzNjAwXSwgWzE0NzgwOTUyMDAsIG51bGwsIG51bGwsIDEwMDc5MjEzLCAxOTk2MiwgMjQ4NzcwNSwgMjAwMTUsIDAsIDM2MDBdLFxuICogICBbMTQ3ODA5ODgwMCwgbnVsbCwgbnVsbCwgNDQ0NDQzMywgMTAyMjcsIDE0MzAzNTYsIDEwNDkzLCAwLCAzNjAwXV1cbiAqIGluIGNhc2Ugb2YgY3B1IGluZm8gOiBbW3VzZXIsIGtlcm5lbF0sIFswLjksIDEuM11dXG4gKi9cbmNvbW1hbmRzLmdldFBlcmZvcm1hbmNlRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIGdldFBlcmZvcm1hbmNlRGF0YSAocGFja2FnZU5hbWUsIGRhdGFUeXBlLCByZXRyaWVzID0gMikge1xuICBzd2l0Y2ggKF8udG9Mb3dlcihkYXRhVHlwZSkpIHtcbiAgICBjYXNlICdiYXR0ZXJ5aW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRCYXR0ZXJ5SW5mbyhyZXRyaWVzKTtcbiAgICBjYXNlICdjcHVpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldENQVUluZm8ocGFja2FnZU5hbWUsIHJldHJpZXMpO1xuICAgIGNhc2UgJ21lbW9yeWluZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TWVtb3J5SW5mbyhwYWNrYWdlTmFtZSwgcmV0cmllcyk7XG4gICAgY2FzZSAnbmV0d29ya2luZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvKHJldHJpZXMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBlcmZvcm1hbmNlIGRhdGEgb2YgdHlwZSAnJHtkYXRhVHlwZX0nIGZvdW5kLiBgICtcbiAgICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHN1cHBvcnRlZDogJHtKU09OLnN0cmluZ2lmeShTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUywgJyAnLCAyKX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIENQVSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBnaXZlbiBwYWNrYWdlTmFtZS5cbiAqIEl0IHJhaXNlcyBhbiBleGNlcHRpb24gaWYgdGhlIGR1bXBlZCBDUFUgaW5mb3JtYXRpb24gZGlkIG5vdCBpbmNsdWRlIHRoZSBnaXZlbiBwYWNrYWdlTmFtZVxuICogb3IgdGhlIGZvcm1hdCB3YXMgd3JvbmcuXG4gKiBUaGUgQ1BVIGluZm9ybWF0aW9uJ3Mgc2FtcGxpbmcgaW50ZXJ2YWwgZGVwZW5kcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBGb3IgZXhhbXBsZSwgc29tZSBkZXZpY2VzIGhhdmUgNSBtaW51dGVzIGludGVydmFsLiBXaGVuIHlvdSBnZXQgdGhlIGluZm9ybWF0aW9uXG4gKiBmcm9tIDIwMjMtMDItMDcgMTE6NTk6NDAuNDY4IHRvIDIwMjMtMDItMDcgMTI6MDQ6NDAuNTU2LCB0aGVuIHRoZSBuZXh0IHdpbGwgYmVcbiAqIGZyb20gMjAyMy0wMi0wNyAxMjowNDo0MC41NTYgdG8gMjAyMy0wMi0wNyAxMjowOTo0MC42NjguIE5vIHByb2Nlc3MgaW5mb3JtYXRpb25cbiAqIGV4aXN0cyBpbiB0aGUgcmVzdWx0IGlmIHRoZSBwcm9jZXNzIHdhcyBub3QgcnVubmluZyBkdXJpbmcgdGhlIHBlcmlvZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFja2FnZU5hbWUgVGhlIHBhY2thZ2UgbmFtZSB0byBnZXQgdGhlIENQVSBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFRoZSBudW1iZXIgb2YgcmV0cnkgY291bnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBhcnJheSBvZiB0aGUgcGFyc2VkIENQVSB1cHNhZ2UgcGVyY2VudGFnZXMuXG4gKiAgICAgICAgICAgICAgICAgIGUuZy4gWydjcHVpbmZvJywgWycxNC4zJywgJzI4LjInXV1cbiAqICAgICAgICAgICAgICAgICAgJzE0LjMnIGlzIHVzYWdlIGJ5IHRoZSB1c2VyICglKSwgJzI4LjInIGlzIHVzYWdlIGJ5IHRoZSBrZXJuZWwgKCUpXG4gKiBAdGhyb3cge0Vycm9yfSBJZiBpdCBmYWlsZWQgdG8gcGFyc2UgdGhlIHJlc3VsdCBvZiBkdW1wc3lzLCBvciBubyBwYWNrYWdlIG5hbWUgZXhpc3RzLlxuICovXG5oZWxwZXJzLmdldENQVUluZm8gPSBhc3luYyBmdW5jdGlvbiBnZXRDUFVJbmZvIChwYWNrYWdlTmFtZSwgcmV0cmllcyA9IDIpIHtcbiAgLy8gVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpc1xuICAvLyBzb21ldGltZXMsIHRoZSBmdW5jdGlvbiBvZiAnYWRiLnNoZWxsJyBmYWlscy4gd2hlbiBJIHRlc3RlZCB0aGlzIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQgb2YgJ0dhbGF4eSBOb3RlNScsXG4gIC8vIGFkYi5zaGVsbChkdW1wc3lzIGNwdWluZm8pIHJldHVybnMgY3B1IGRhdGFzIGZvciBvdGhlciBhcHBsaWNhdGlvbiBwYWNrYWdlcywgYnV0IEkgY2FuJ3QgZmluZCB0aGUgZGF0YSBmb3IgcGFja2FnZU5hbWUuXG4gIC8vIEl0IHVzdWFsbHkgZmFpbHMgMzAgdGltZXMgYW5kIHN1Y2Nlc3MgZm9yIHRoZSBuZXh0IHRpbWUsXG4gIC8vIFNpbmNlIHRoZW4sIGhlIGhhcyBjb250aW51ZWQgdG8gc3VjY2VlZC5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgb3V0cHV0O1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnY3B1aW5mbyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5zdGRlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhlLnN0ZGVycik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBgb3V0cHV0YCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gICAgKzAlIDIyMDkvaW8uYXBwaXVtLmFuZHJvaWQuYXBpczogMC4xJSB1c2VyICsgMC4yJSBrZXJuZWwgLyBmYXVsdHM6IDcwIG1pbm9yXG4gICAgY29uc3QgdXNhZ2VzUGF0dGVybiA9XG4gICAgICBuZXcgUmVnRXhwKGBeLitcXFxcLyR7Xy5lc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfTpcXFxcRCsoW1xcXFxkLl0rKSVcXFxccyt1c2VyXFxcXHMrXFxcXCtcXFxccysoW1xcXFxkLl0rKSVcXFxccytrZXJuZWxgLCAnbScpO1xuICAgIGNvbnN0IG1hdGNoID0gdXNhZ2VzUGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGNwdSB1c2FnZSBkYXRhIGZvciAnJHtwYWNrYWdlTmFtZX0nLiBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHJldHVybiBbQ1BVX0tFWVMsIFttYXRjaFsxXSwgbWF0Y2hbMl1dXTtcbiAgfSk7XG59O1xuXG5oZWxwZXJzLmdldEJhdHRlcnlJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0QmF0dGVyeUluZm8gKHJldHJpZXMgPSAyKSB7XG4gIHJldHVybiBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIFJFVFJZX1BBVVNFX01TLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICdiYXR0ZXJ5JywgJ3wnLCAnZ3JlcCcsICdsZXZlbCddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICBsZXQgcG93ZXIgPSBwYXJzZUludCgoZGF0YS5zcGxpdCgnOicpWzFdIHx8ICcnKS50cmltKCksIDEwKTtcblxuICAgIGlmICghTnVtYmVyLmlzTmFOKHBvd2VyKSkge1xuICAgICAgcmV0dXJuIFtfLmNsb25lKEJBVFRFUllfS0VZUyksIFtwb3dlci50b1N0cmluZygpXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGJhdHRlcnkgZGF0YTogJyR7ZGF0YX0nYCk7XG4gICAgfVxuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TWVtb3J5SW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldE1lbW9yeUluZm8gKHBhY2thZ2VOYW1lLCByZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICdkdW1wc3lzJywgJ21lbWluZm8nLCBgJyR7cGFja2FnZU5hbWV9J2AsXG4gICAgICAnfCcsICdncmVwJywgJy1FJyxcbiAgICAgIGAnJHtNRU1JTkZPX1RJVExFUy5OQVRJVkV9fCR7TUVNSU5GT19USVRMRVMuREFMVklLfXwke01FTUlORk9fVElUTEVTLkVHTH1gICtcbiAgICAgIGB8JHtNRU1JTkZPX1RJVExFUy5HTH18JHtNRU1JTkZPX1RJVExFUy5UT1RBTH0nYFxuICAgIF07XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgZnJvbSBkdW1wc3lzJyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbERpY3QgPSB7dG90YWxQcml2YXRlRGlydHk6ICcnfTtcbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMzApIHtcbiAgICAgICAgcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPiAxOCAmJiBhcGlMZXZlbCA8IDMwKSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkoZW50cmllcywgdmFsRGljdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5ICYmIHZhbERpY3QudG90YWxQcml2YXRlRGlydHkgIT09ICdub2RleCcpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBfLmNsb25lKE1FTU9SWV9LRVlTKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHZhbERpY3RbaGVhZGVyXSk7XG4gICAgICByZXR1cm4gW2hlYWRlcnMsIHZhbHVlc107XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVtb3J5IGRhdGE6ICcke2RhdGF9J2ApO1xuICB9KTtcbn07XG5cbmhlbHBlcnMuZ2V0TmV0d29ya1RyYWZmaWNJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmV0d29ya1RyYWZmaWNJbmZvIChyZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IFtdO1xuICAgIGxldCBidWNrZXREdXJhdGlvbiwgYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zO1xuXG4gICAgbGV0IGNtZCA9IFsnZHVtcHN5cycsICduZXRzdGF0cyddO1xuICAgIGxldCBkYXRhID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoY21kKTtcbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBmcm9tIGR1bXBzeXMnKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIGN1cmx5XG5cbiAgICAvLyBJbiBjYXNlIG9mIG5ldHdvcmsgdHJhZmZpYyBpbmZvcm1hdGlvbiwgaXQgaXMgZGlmZmVyZW50IGZvciB0aGUgcmV0dXJuIGRhdGEgYmV0d2VlbiBlbXVsYXRvciBhbmQgcmVhbCBkZXZpY2UuXG4gICAgLy8gdGhlIHJldHVybiBkYXRhIG9mIGVtdWxhdG9yXG4gICAgLy8gICBYdCBzdGF0czpcbiAgICAvLyAgIFBlbmRpbmcgYnl0ZXM6IDM5MjUwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1bW3R5cGU9V0lGSSwgc3ViVHlwZT1DT01CSU5FRCwgbmV0d29ya0lkPVwiV2lyZWRTU0lEXCJdXSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICBOZXR3b3JrU3RhdHNIaXN0b3J5OiBidWNrZXREdXJhdGlvbj0zNjAwMDAwXG4gICAgLy8gICBidWNrZXRTdGFydD0xNDc4MDk4ODAwMDAwIGFjdGl2ZVRpbWU9MzE4MjQgcnhCeXRlcz0yMTUwMiByeFBhY2tldHM9NzggdHhCeXRlcz0xNzc0OCB0eFBhY2tldHM9OTAgb3BlcmF0aW9ucz0wXG4gICAgLy9cbiAgICAvLyA3LjFcbiAgICAvLyAgIFh0IHN0YXRzOlxuICAgIC8vICAgUGVuZGluZyBieXRlczogNDgxNDg3XG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9MzEwMjYwLi4uLCBtZXRlcmVkPXRydWV9XSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICAgIE5ldHdvcmtTdGF0c0hpc3Rvcnk6IGJ1Y2tldER1cmF0aW9uPTM2MDBcbiAgICAvLyAgICAgICBzdD0xNDgzOTg0ODAwIHJiPTAgcnA9MCB0Yj0xMjAzMSB0cD0xODQgb3A9MFxuICAgIC8vICAgICAgIHN0PTE0ODM5ODg0MDAgcmI9MCBycD0wIHRiPTM4NDc2IHRwPTU4NyBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4Mzk5OTIwMCByYj0zMTU2MTYgcnA9NDAwIHRiPTk0ODAwIHRwPTM2MiBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4NDAwMjgwMCByYj0xNTgyNiBycD0yMCB0Yj00NzM4IHRwPTE2IG9wPTBcbiAgICAvL1xuICAgIC8vIHRoZSByZXR1cm4gZGF0YSBvZiByZWFsIGRldmljZVxuICAgIC8vICAgWHQgc3RhdHM6XG4gICAgLy8gICBQZW5kaW5nIGJ5dGVzOiAwXG4gICAgLy8gICBIaXN0b3J5IHNpbmNlIGJvb3Q6XG4gICAgLy8gICBpZGVudD1be3R5cGU9TU9CSUxFLCBzdWJUeXBlPUNPTUJJTkVELCBzdWJzY3JpYmVySWQ9NDUwMDUwLi4ufV0gdWlkPS0xIHNldD1BTEwgdGFnPTB4MFxuICAgIC8vICAgTmV0d29ya1N0YXRzSGlzdG9yeTogYnVja2V0RHVyYXRpb249MzYwMFxuICAgIC8vICAgc3Q9MTQ3ODA4ODAwMCByYj0zMjExNTI5NiBycD0zNDI5MSB0Yj0yOTU2ODA1IHRwPTI1NzA1IG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTE2MDAgcmI9MjcxNDY4MyBycD0xMTgyMSB0Yj0xNDIwNTY0IHRwPTEyNjUwIG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTUyMDAgcmI9MTAwNzkyMTMgcnA9MTk5NjIgdGI9MjQ4NzcwNSB0cD0yMDAxNSBvcD0wXG4gICAgLy8gICBzdD0xNDc4MDk4ODAwIHJiPTQ0NDQ0MzMgcnA9MTAyMjcgdGI9MTQzMDM1NiB0cD0xMDQ5MyBvcD0wXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgZnJvbVh0c3RhdHMgPSBkYXRhLmluZGV4T2YoJ1h0IHN0YXRzOicpO1xuXG4gICAgbGV0IHN0YXJ0ID0gZGF0YS5pbmRleE9mKCdQZW5kaW5nIGJ5dGVzOicsIGZyb21YdHN0YXRzKTtcbiAgICBsZXQgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc6Jywgc3RhcnQgKyAxKTtcbiAgICBsZXQgZW5kID0gZGF0YS5pbmRleE9mKCdcXG4nLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICBsZXQgcGVuZGluZ0J5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG5cbiAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZignYnVja2V0RHVyYXRpb24nLCBlbmQgKyAxKTtcbiAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJ1xcbicsIGRlbGltaXRlciArIDEpO1xuICAgICAgYnVja2V0RHVyYXRpb24gPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGVuZCArIDEsIGRhdGEubGVuZ3RoKTtcbiAgICAgIGxldCBhcnJheUxpc3QgPSBkYXRhLnNwbGl0KCdcXG4nKTtcblxuICAgICAgaWYgKGFycmF5TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLTE7XG5cbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBORVRXT1JLX0tFWVMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICBzdGFydCA9IGFycmF5TGlzdFswXS5pbmRleE9mKE5FVFdPUktfS0VZU1tqXVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgaW5kZXggPSBqO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF0gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBORVRXT1JLX0tFWVNbal0ubGVuZ3RoOyArK2spIHtcbiAgICAgICAgICAgICAgcmV0dXJuVmFsdWVbMF1ba10gPSBORVRXT1JLX0tFWVNbal1ba107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0dXJuSW5kZXggPSAxO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGRhdGEgPSBhcnJheUxpc3RbaV07XG4gICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVswXSk7XG5cbiAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgYnVja2V0U3RhcnQgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzFdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIGFjdGl2ZVRpbWUgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bMl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgcnhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVszXSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICByeFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNF0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgdHhCeXRlcyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs1XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICB0eFBhY2tldHMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bNl0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgb3BlcmF0aW9ucyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVyblZhbHVlW3JldHVybkluZGV4KytdID0gW2J1Y2tldFN0YXJ0LCBhY3RpdmVUaW1lLCByeEJ5dGVzLCByeFBhY2tldHMsIHR4Qnl0ZXMsIHR4UGFja2V0cywgb3BlcmF0aW9ucywgYnVja2V0RHVyYXRpb25dO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghXy5pc0VxdWFsKHBlbmRpbmdCeXRlcywgJycpICYmICFfLmlzVW5kZWZpbmVkKHBlbmRpbmdCeXRlcykgJiYgIV8uaXNFcXVhbChwZW5kaW5nQnl0ZXMsICdub2RleCcpKSB7XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIG5ldHdvcmsgdHJhZmZpYyBkYXRhOiAnJHtkYXRhfSdgKTtcbiAgICB9XG4gIH0pO1xufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQge1xuICBjb21tYW5kcywgaGVscGVycywgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMsIENQVV9LRVlTLCBNRU1PUllfS0VZUyxcbiAgQkFUVEVSWV9LRVlTLCBORVRXT1JLX0tFWVMsXG59O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcblxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUQsT0FBQTtBQUVBLE1BQU1FLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUNDLE9BQUEsQ0FBQUYsT0FBQSxHQUFBQSxPQUFBO0FBQUFFLE9BQUEsQ0FBQUgsUUFBQSxHQUFBQSxRQUFBO0FBRW5ELE1BQU1JLFlBQVksR0FBRyxDQUNuQixDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxnQkFB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
277
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXN5bmNib3giLCJfdXRpbHMiLCJjb21tYW5kcyIsImV4cG9ydHMiLCJORVRXT1JLX0tFWVMiLCJDUFVfS0VZUyIsIkJBVFRFUllfS0VZUyIsIk1FTU9SWV9LRVlTIiwiU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMiLCJPYmplY3QiLCJmcmVlemUiLCJjcHVpbmZvIiwibWVtb3J5aW5mbyIsImJhdHRlcnlpbmZvIiwibmV0d29ya2luZm8iLCJNRU1JTkZPX1RJVExFUyIsIk5BVElWRSIsIkRBTFZJSyIsIkVHTCIsIkdMIiwiTVRSQUNLIiwiVE9UQUwiLCJIRUFQIiwiUkVUUllfUEFVU0VfTVMiLCJwYXJzZU1lbWluZm9Gb3JBcGkxOVRvMjkiLCJlbnRyaWVzIiwidmFsRGljdCIsInR5cGUiLCJzdWJUeXBlIiwibmF0aXZlUHNzIiwibmF0aXZlUHJpdmF0ZURpcnR5IiwibmF0aXZlSGVhcFNpemUiLCJuYXRpdmVIZWFwQWxsb2NhdGVkU2l6ZSIsImRhbHZpa1BzcyIsImRhbHZpa1ByaXZhdGVEaXJ0eSIsImVnbFBzcyIsImVnbFByaXZhdGVEaXJ0eSIsImdsUHNzIiwiZ2xQcml2YXRlRGlydHkiLCJsZW5ndGgiLCJ0b3RhbFBzcyIsInRvdGFsUHJpdmF0ZURpcnR5IiwicGFyc2VNZW1pbmZvRm9yQXBpQmVsb3cxOSIsInBhcnNlTWVtaW5mb0ZvckFwaUFib3ZlMjkiLCJuYXRpdmVSc3MiLCJkYWx2aWtSc3MiLCJ0b3RhbFJzcyIsImdldE1lbW9yeUluZm8iLCJwYWNrYWdlTmFtZSIsInJldHJpZXMiLCJyZXRyeUludGVydmFsIiwiY21kIiwiZGF0YSIsImFkYiIsInNoZWxsIiwiRXJyb3IiLCJhcGlMZXZlbCIsImdldEFwaUxldmVsIiwibGluZSIsInNwbGl0IiwidHJpbSIsImZpbHRlciIsIkJvb2xlYW4iLCJoZWFkZXJzIiwiXyIsImNsb25lIiwidmFsdWVzIiwibWFwIiwiaGVhZGVyIiwiZ2V0TmV0d29ya1RyYWZmaWNJbmZvIiwicmV0dXJuVmFsdWUiLCJidWNrZXREdXJhdGlvbiIsImJ1Y2tldFN0YXJ0IiwiYWN0aXZlVGltZSIsInJ4Qnl0ZXMiLCJyeFBhY2tldHMiLCJ0eEJ5dGVzIiwidHhQYWNrZXRzIiwib3BlcmF0aW9ucyIsImluZGV4IiwiZnJvbVh0c3RhdHMiLCJpbmRleE9mIiwic3RhcnQiLCJkZWxpbWl0ZXIiLCJlbmQiLCJwZW5kaW5nQnl0ZXMiLCJzdWJzdHJpbmciLCJhcnJheUxpc3QiLCJqIiwiayIsInJldHVybkluZGV4IiwiaSIsImlzRXF1YWwiLCJpc1VuZGVmaW5lZCIsImdldENQVUluZm8iLCJvdXRwdXQiLCJlIiwic3RkZXJyIiwibG9nIiwiaW5mbyIsInVzYWdlc1BhdHRlcm4iLCJSZWdFeHAiLCJlc2NhcGVSZWdFeHAiLCJtYXRjaCIsImV4ZWMiLCJkZWJ1ZyIsImdldEJhdHRlcnlJbmZvIiwicG93ZXIiLCJwYXJzZUludCIsIk51bWJlciIsImlzTmFOIiwidG9TdHJpbmciLCJnZXRQZXJmb3JtYW5jZURhdGFUeXBlcyIsImtleXMiLCJnZXRQZXJmb3JtYW5jZURhdGEiLCJkYXRhVHlwZSIsInRvTG93ZXIiLCJiaW5kIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1vYmlsZUdldFBlcmZvcm1hbmNlRGF0YSIsIm9wdHMiLCJyZXF1aXJlQXJncyIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9wZXJmb3JtYW5jZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHJlcXVpcmVBcmdzIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5jb25zdCBORVRXT1JLX0tFWVMgPSBbXG4gIFsnYnVja2V0U3RhcnQnLCAnYWN0aXZlVGltZScsICdyeEJ5dGVzJywgJ3J4UGFja2V0cycsICd0eEJ5dGVzJywgJ3R4UGFja2V0cycsICdvcGVyYXRpb25zJywgJ2J1Y2tldER1cmF0aW9uJ10sXG4gIFsnc3QnLCAnYWN0aXZlVGltZScsICdyYicsICdycCcsICd0YicsICd0cCcsICdvcCcsICdidWNrZXREdXJhdGlvbiddXG5dO1xuY29uc3QgQ1BVX0tFWVMgPSBbJ3VzZXInLCAna2VybmVsJ107XG5jb25zdCBCQVRURVJZX0tFWVMgPSBbJ3Bvd2VyJ107XG5jb25zdCBNRU1PUllfS0VZUyA9IFtcbiAgJ3RvdGFsUHJpdmF0ZURpcnR5JywgJ25hdGl2ZVByaXZhdGVEaXJ0eScsICdkYWx2aWtQcml2YXRlRGlydHknLFxuICAnZWdsUHJpdmF0ZURpcnR5JywgJ2dsUHJpdmF0ZURpcnR5JyxcbiAgJ3RvdGFsUHNzJywgJ25hdGl2ZVBzcycsICdkYWx2aWtQc3MnLCAnZWdsUHNzJywgJ2dsUHNzJyxcbiAgJ25hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplJywgJ25hdGl2ZUhlYXBTaXplJyxcbiAgJ25hdGl2ZVJzcycsICdkYWx2aWtSc3MnLCAndG90YWxSc3MnXG5dO1xuY29uc3QgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMgPSBPYmplY3QuZnJlZXplKHtcbiAgY3B1aW5mbzogJ3RoZSBhbW91bnQgb2YgY3B1IGJ5IHVzZXIgYW5kIGtlcm5lbCBwcm9jZXNzIC0gY3B1IGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2VzIGFuZCBzaW11bGF0b3JzJyxcbiAgbWVtb3J5aW5mbzogJ3RoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHByb2Nlc3MgLSBtZW1vcnkgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBiYXR0ZXJ5aW5mbzogJ3RoZSByZW1haW5pbmcgYmF0dGVyeSBwb3dlciAtIGJhdHRlcnkgcG93ZXIgaW5mb3JtYXRpb24gZm9yIGFwcGxpY2F0aW9ucyBvbiByZWFsIGRldmljZXMgYW5kIHNpbXVsYXRvcnMnLFxuICBuZXR3b3JraW5mbzogJ3RoZSBuZXR3b3JrIHN0YXRpc3RpY3MgLSBuZXR3b3JrIHJ4L3R4IGluZm9ybWF0aW9uIGZvciBhcHBsaWNhdGlvbnMgb24gcmVhbCBkZXZpY2VzIGFuZCBzaW11bGF0b3JzJ1xufSk7XG5jb25zdCBNRU1JTkZPX1RJVExFUyA9IE9iamVjdC5mcmVlemUoe1xuICBOQVRJVkU6ICdOYXRpdmUnLFxuICBEQUxWSUs6ICdEYWx2aWsnLFxuICBFR0w6ICdFR0wnLFxuICBHTDogJ0dMJyxcbiAgTVRSQUNLOiAnbXRyYWNrJyxcbiAgVE9UQUw6ICdUT1RBTCcsXG4gIEhFQVA6ICdIZWFwJ1xufSk7XG5jb25zdCBSRVRSWV9QQVVTRV9NUyA9IDEwMDA7XG5cbi8qKlxuICogQVBJIGxldmVsIGJldHdlZW4gMTggYW5kIDMwXG4gKiBbJzxTeXN0ZW0gVHlwZT4nLCAnPE1lbW9yeSBUeXBlPicsIDxwc3MgdG90YWw+LCA8cHJpdmF0ZSBkaXJ0eT4sIDxwcml2YXRlIGNsZWFuPiwgPHN3YXBQc3MgZGlydHk+LCA8aGVhcCBzaXplPiwgPGhlYXAgYWxsb2M+LCA8aGVhcCBmcmVlPl1cbiAqIGV4Y2VwdCAnVE9UQUwnLCB3aGljaCBza2lwcyB0aGUgc2Vjb25kIHR5cGUgbmFtZVxuICogISEhIHZhbERpY3QgZ2V0cyBtdXRhdGVkXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCBbdHlwZSwgc3ViVHlwZV0gPSBlbnRyaWVzO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5uYXRpdmVQc3MsIHZhbERpY3QubmF0aXZlUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUsgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuSEVBUCkge1xuICAgIFssLCB2YWxEaWN0LmRhbHZpa1BzcywgdmFsRGljdC5kYWx2aWtQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5FR0wgJiYgc3ViVHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTVRSQUNLKSB7XG4gICAgWywsIHZhbERpY3QuZWdsUHNzLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmdsUHNzLCB2YWxEaWN0LmdsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuVE9UQUwgJiYgZW50cmllcy5sZW5ndGggPT09IDgpIHtcbiAgICAvLyB0aGVyZSBhcmUgdHdvIHRvdGFscywgYW5kIHdlIG9ubHkgd2FudCB0aGUgZnVsbCBsaXN0aW5nLCB3aGljaCBoYXMgOCBlbnRyaWVzXG4gICAgWywgdmFsRGljdC50b3RhbFBzcywgdmFsRGljdC50b3RhbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9XG59XG5cbi8qKlxuICogWyc8U3lzdGVtIFR5cGUnLCAnPHBwcz4nLCAnPHNoYXJlZCBkaXJ0eT4nLCAnPHByaXZhdGUgZGlydHk+JywgJzxoZWFwIHNpemU+JywgJzxoZWFwIGFsbG9jPicsICc8aGVhcCBmcmVlPiddXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpQmVsb3cxOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCB0eXBlID0gZW50cmllc1swXTtcbiAgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLk5BVElWRSkge1xuICAgIFssIHZhbERpY3QubmF0aXZlUHNzLCwgdmFsRGljdC5uYXRpdmVQcml2YXRlRGlydHksIHZhbERpY3QubmF0aXZlSGVhcFNpemUsIHZhbERpY3QubmF0aXZlSGVhcEFsbG9jYXRlZFNpemVdID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5EQUxWSUspIHtcbiAgICBbLCB2YWxEaWN0LmRhbHZpa1BzcywsIHZhbERpY3QuZGFsdmlrUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuRUdMKSB7XG4gICAgWywgdmFsRGljdC5lZ2xQc3MsLCB2YWxEaWN0LmVnbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLkdMKSB7XG4gICAgWywgdmFsRGljdC5nbFBzcywsIHZhbERpY3QuZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5UT1RBTCkge1xuICAgIFssIHZhbERpY3QudG90YWxQc3MsLCB2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5XSA9IGVudHJpZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBBUEkgbGV2ZWwgMzAgYW5kIGFib3ZlXG4gKiBbJzxTeXN0ZW0gVHlwZT4nLCAnPE1lbW9yeSBUeXBlPicsIDxwc3MgdG90YWw+LCA8cHJpdmF0ZSBkaXJ0eT4sIDxwcml2YXRlIGNsZWFuPiwgPHN3YXBQc3MgZGlydHk+LCA8cnNzIHRvdGFsPiwgPGhlYXAgc2l6ZT4sIDxoZWFwIGFsbG9jPiwgPGhlYXAgZnJlZT5dXG4gKiAhISEgdmFsRGljdCBnZXRzIG11dGF0ZWRcbiAqL1xuZnVuY3Rpb24gcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOSAoZW50cmllcywgdmFsRGljdCkge1xuICBjb25zdCBbdHlwZSwgc3ViVHlwZV0gPSBlbnRyaWVzO1xuICBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuTkFUSVZFICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5uYXRpdmVQc3MsIHZhbERpY3QubmF0aXZlUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QubmF0aXZlUnNzLCB2YWxEaWN0Lm5hdGl2ZUhlYXBTaXplLCB2YWxEaWN0Lm5hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplXSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuREFMVklLICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLkhFQVApIHtcbiAgICBbLCwgdmFsRGljdC5kYWx2aWtQc3MsIHZhbERpY3QuZGFsdmlrUHJpdmF0ZURpcnR5LCwsIHZhbERpY3QuZGFsdmlrUnNzXSA9IGVudHJpZXM7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTUVNSU5GT19USVRMRVMuRUdMICYmIHN1YlR5cGUgPT09IE1FTUlORk9fVElUTEVTLk1UUkFDSykge1xuICAgIFssLCB2YWxEaWN0LmVnbFBzcywgdmFsRGljdC5lZ2xQcml2YXRlRGlydHldID0gZW50cmllcztcbiAgfSBlbHNlIGlmICh0eXBlID09PSBNRU1JTkZPX1RJVExFUy5HTCAmJiBzdWJUeXBlID09PSBNRU1JTkZPX1RJVExFUy5NVFJBQ0spIHtcbiAgICBbLCwgdmFsRGljdC5nbFBzcywgdmFsRGljdC5nbFByaXZhdGVEaXJ0eV0gPSBlbnRyaWVzO1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IE1FTUlORk9fVElUTEVTLlRPVEFMICYmIGVudHJpZXMubGVuZ3RoID09PSA5KSB7XG4gICAgLy8gaGFzIDkgZW50cmllc1xuICAgIFssIHZhbERpY3QudG90YWxQc3MsIHZhbERpY3QudG90YWxQcml2YXRlRGlydHksLCwgdmFsRGljdC50b3RhbFJzc10gPSBlbnRyaWVzO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE1lbW9yeUluZm8gKHBhY2thZ2VOYW1lLCByZXRyaWVzID0gMikge1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbChyZXRyaWVzLCBSRVRSWV9QQVVTRV9NUywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNtZCA9IFtcbiAgICAgICdkdW1wc3lzJywgJ21lbWluZm8nLCBgJyR7cGFja2FnZU5hbWV9J2AsXG4gICAgICAnfCcsICdncmVwJywgJy1FJyxcbiAgICAgIGAnJHtNRU1JTkZPX1RJVExFUy5OQVRJVkV9fCR7TUVNSU5GT19USVRMRVMuREFMVklLfXwke01FTUlORk9fVElUTEVTLkVHTH1gICtcbiAgICAgIGB8JHtNRU1JTkZPX1RJVExFUy5HTH18JHtNRU1JTkZPX1RJVExFUy5UT1RBTH0nYFxuICAgIF07XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKGNtZCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGRhdGEgZnJvbSBkdW1wc3lzJyk7XG4gICAgfVxuICAgIGNvbnN0IHZhbERpY3QgPSB7dG90YWxQcml2YXRlRGlydHk6ICcnfTtcbiAgICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGRhdGEuc3BsaXQoJ1xcbicpKSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gbGluZS50cmltKCkuc3BsaXQoL1xccysvKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAoYXBpTGV2ZWwgPj0gMzApIHtcbiAgICAgICAgcGFyc2VNZW1pbmZvRm9yQXBpQWJvdmUyOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSBpZiAoYXBpTGV2ZWwgPiAxOCAmJiBhcGlMZXZlbCA8IDMwKSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaTE5VG8yOShlbnRyaWVzLCB2YWxEaWN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnNlTWVtaW5mb0ZvckFwaUJlbG93MTkoZW50cmllcywgdmFsRGljdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh2YWxEaWN0LnRvdGFsUHJpdmF0ZURpcnR5ICYmIHZhbERpY3QudG90YWxQcml2YXRlRGlydHkgIT09ICdub2RleCcpIHtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBfLmNsb25lKE1FTU9SWV9LRVlTKTtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IGhlYWRlcnMubWFwKChoZWFkZXIpID0+IHZhbERpY3RbaGVhZGVyXSk7XG4gICAgICByZXR1cm4gW2hlYWRlcnMsIHZhbHVlc107XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbWVtb3J5IGRhdGE6ICcke2RhdGF9J2ApO1xuICB9KTtcbn07XG5cbi8qKlxuICogQHRoaXMge0FuZHJvaWREcml2ZXJ9XG4gKiBAcGFyYW0ge251bWJlcn0gcmV0cmllc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXROZXR3b3JrVHJhZmZpY0luZm8gKHJldHJpZXMgPSAyKSB7XG4gIHJldHVybiBhd2FpdCByZXRyeUludGVydmFsKHJldHJpZXMsIFJFVFJZX1BBVVNFX01TLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gW107XG4gICAgbGV0IGJ1Y2tldER1cmF0aW9uLCBidWNrZXRTdGFydCwgYWN0aXZlVGltZSwgcnhCeXRlcywgcnhQYWNrZXRzLCB0eEJ5dGVzLCB0eFBhY2tldHMsIG9wZXJhdGlvbnM7XG5cbiAgICBsZXQgY21kID0gWydkdW1wc3lzJywgJ25ldHN0YXRzJ107XG4gICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChjbWQpO1xuICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKCdObyBkYXRhIGZyb20gZHVtcHN5cycpOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgIC8vIEluIGNhc2Ugb2YgbmV0d29yayB0cmFmZmljIGluZm9ybWF0aW9uLCBpdCBpcyBkaWZmZXJlbnQgZm9yIHRoZSByZXR1cm4gZGF0YSBiZXR3ZWVuIGVtdWxhdG9yIGFuZCByZWFsIGRldmljZS5cbiAgICAvLyB0aGUgcmV0dXJuIGRhdGEgb2YgZW11bGF0b3JcbiAgICAvLyAgIFh0IHN0YXRzOlxuICAgIC8vICAgUGVuZGluZyBieXRlczogMzkyNTBcbiAgICAvLyAgIEhpc3Rvcnkgc2luY2UgYm9vdDpcbiAgICAvLyAgIGlkZW50PVtbdHlwZT1XSUZJLCBzdWJUeXBlPUNPTUJJTkVELCBuZXR3b3JrSWQ9XCJXaXJlZFNTSURcIl1dIHVpZD0tMSBzZXQ9QUxMIHRhZz0weDBcbiAgICAvLyAgIE5ldHdvcmtTdGF0c0hpc3Rvcnk6IGJ1Y2tldER1cmF0aW9uPTM2MDAwMDBcbiAgICAvLyAgIGJ1Y2tldFN0YXJ0PTE0NzgwOTg4MDAwMDAgYWN0aXZlVGltZT0zMTgyNCByeEJ5dGVzPTIxNTAyIHJ4UGFja2V0cz03OCB0eEJ5dGVzPTE3NzQ4IHR4UGFja2V0cz05MCBvcGVyYXRpb25zPTBcbiAgICAvL1xuICAgIC8vIDcuMVxuICAgIC8vICAgWHQgc3RhdHM6XG4gICAgLy8gICBQZW5kaW5nIGJ5dGVzOiA0ODE0ODdcbiAgICAvLyAgIEhpc3Rvcnkgc2luY2UgYm9vdDpcbiAgICAvLyAgIGlkZW50PVt7dHlwZT1NT0JJTEUsIHN1YlR5cGU9Q09NQklORUQsIHN1YnNjcmliZXJJZD0zMTAyNjAuLi4sIG1ldGVyZWQ9dHJ1ZX1dIHVpZD0tMSBzZXQ9QUxMIHRhZz0weDBcbiAgICAvLyAgICAgTmV0d29ya1N0YXRzSGlzdG9yeTogYnVja2V0RHVyYXRpb249MzYwMFxuICAgIC8vICAgICAgIHN0PTE0ODM5ODQ4MDAgcmI9MCBycD0wIHRiPTEyMDMxIHRwPTE4NCBvcD0wXG4gICAgLy8gICAgICAgc3Q9MTQ4Mzk4ODQwMCByYj0wIHJwPTAgdGI9Mzg0NzYgdHA9NTg3IG9wPTBcbiAgICAvLyAgICAgICBzdD0xNDgzOTk5MjAwIHJiPTMxNTYxNiBycD00MDAgdGI9OTQ4MDAgdHA9MzYyIG9wPTBcbiAgICAvLyAgICAgICBzdD0xNDg0MDAyODAwIHJiPTE1ODI2IHJwPTIwIHRiPTQ3MzggdHA9MTYgb3A9MFxuICAgIC8vXG4gICAgLy8gdGhlIHJldHVybiBkYXRhIG9mIHJlYWwgZGV2aWNlXG4gICAgLy8gICBYdCBzdGF0czpcbiAgICAvLyAgIFBlbmRpbmcgYnl0ZXM6IDBcbiAgICAvLyAgIEhpc3Rvcnkgc2luY2UgYm9vdDpcbiAgICAvLyAgIGlkZW50PVt7dHlwZT1NT0JJTEUsIHN1YlR5cGU9Q09NQklORUQsIHN1YnNjcmliZXJJZD00NTAwNTAuLi59XSB1aWQ9LTEgc2V0PUFMTCB0YWc9MHgwXG4gICAgLy8gICBOZXR3b3JrU3RhdHNIaXN0b3J5OiBidWNrZXREdXJhdGlvbj0zNjAwXG4gICAgLy8gICBzdD0xNDc4MDg4MDAwIHJiPTMyMTE1Mjk2IHJwPTM0MjkxIHRiPTI5NTY4MDUgdHA9MjU3MDUgb3A9MFxuICAgIC8vICAgc3Q9MTQ3ODA5MTYwMCByYj0yNzE0NjgzIHJwPTExODIxIHRiPTE0MjA1NjQgdHA9MTI2NTAgb3A9MFxuICAgIC8vICAgc3Q9MTQ3ODA5NTIwMCByYj0xMDA3OTIxMyBycD0xOTk2MiB0Yj0yNDg3NzA1IHRwPTIwMDE1IG9wPTBcbiAgICAvLyAgIHN0PTE0NzgwOTg4MDAgcmI9NDQ0NDQzMyBycD0xMDIyNyB0Yj0xNDMwMzU2IHRwPTEwNDkzIG9wPTBcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGxldCBmcm9tWHRzdGF0cyA9IGRhdGEuaW5kZXhPZignWHQgc3RhdHM6Jyk7XG5cbiAgICBsZXQgc3RhcnQgPSBkYXRhLmluZGV4T2YoJ1BlbmRpbmcgYnl0ZXM6JywgZnJvbVh0c3RhdHMpO1xuICAgIGxldCBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJzonLCBzdGFydCArIDEpO1xuICAgIGxldCBlbmQgPSBkYXRhLmluZGV4T2YoJ1xcbicsIGRlbGltaXRlciArIDEpO1xuICAgIGxldCBwZW5kaW5nQnl0ZXMgPSBkYXRhLnN1YnN0cmluZyhkZWxpbWl0ZXIgKyAxLCBlbmQpLnRyaW0oKTtcblxuICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKCdidWNrZXREdXJhdGlvbicsIGVuZCArIDEpO1xuICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignXFxuJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICBidWNrZXREdXJhdGlvbiA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICBkYXRhID0gZGF0YS5zdWJzdHJpbmcoZW5kICsgMSwgZGF0YS5sZW5ndGgpO1xuICAgICAgbGV0IGFycmF5TGlzdCA9IGRhdGEuc3BsaXQoJ1xcbicpO1xuXG4gICAgICBpZiAoYXJyYXlMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RhcnQgPSAtMTtcblxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IE5FVFdPUktfS0VZUy5sZW5ndGg7ICsraikge1xuICAgICAgICAgIHN0YXJ0ID0gYXJyYXlMaXN0WzBdLmluZGV4T2YoTkVUV09SS19LRVlTW2pdWzBdKTtcblxuICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBpbmRleCA9IGo7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZVswXSA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IE5FVFdPUktfS0VZU1tqXS5sZW5ndGg7ICsraykge1xuICAgICAgICAgICAgICByZXR1cm5WYWx1ZVswXVtrXSA9IE5FVFdPUktfS0VZU1tqXVtrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXR1cm5JbmRleCA9IDE7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZGF0YSA9IGFycmF5TGlzdFtpXTtcbiAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzBdKTtcblxuICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICBidWNrZXRTdGFydCA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoZW5kID4gZGVsaW1pdGVyKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gZGF0YS5pbmRleE9mKE5FVFdPUktfS0VZU1tpbmRleF1bMV0sIGVuZCArIDEpO1xuICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gMCkge1xuICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGRhdGEuaW5kZXhPZignPScsIHN0YXJ0ICsgMSk7XG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS5pbmRleE9mKCcgJywgZGVsaW1pdGVyICsgMSk7XG4gICAgICAgICAgICAgICAgYWN0aXZlVGltZSA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVsyXSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICByeEJ5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzNdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIHJ4UGFja2V0cyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs0XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmluZGV4T2YoJyAnLCBkZWxpbWl0ZXIgKyAxKTtcbiAgICAgICAgICAgICAgICB0eEJ5dGVzID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVuZCA+IGRlbGltaXRlcikge1xuICAgICAgICAgICAgICBzdGFydCA9IGRhdGEuaW5kZXhPZihORVRXT1JLX0tFWVNbaW5kZXhdWzVdLCBlbmQgKyAxKTtcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IDApIHtcbiAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgPSBkYXRhLmluZGV4T2YoJz0nLCBzdGFydCArIDEpO1xuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEuaW5kZXhPZignICcsIGRlbGltaXRlciArIDEpO1xuICAgICAgICAgICAgICAgIHR4UGFja2V0cyA9IGRhdGEuc3Vic3RyaW5nKGRlbGltaXRlciArIDEsIGVuZCkudHJpbSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbmQgPiBkZWxpbWl0ZXIpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBkYXRhLmluZGV4T2YoTkVUV09SS19LRVlTW2luZGV4XVs2XSwgZW5kICsgMSk7XG4gICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsaW1pdGVyID0gZGF0YS5pbmRleE9mKCc9Jywgc3RhcnQgKyAxKTtcbiAgICAgICAgICAgICAgICBlbmQgPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25zID0gZGF0YS5zdWJzdHJpbmcoZGVsaW1pdGVyICsgMSwgZW5kKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuVmFsdWVbcmV0dXJuSW5kZXgrK10gPSBbYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zLCBidWNrZXREdXJhdGlvbl07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzRXF1YWwocGVuZGluZ0J5dGVzLCAnJykgJiYgIV8uaXNVbmRlZmluZWQocGVuZGluZ0J5dGVzKSAmJiAhXy5pc0VxdWFsKHBlbmRpbmdCeXRlcywgJ25vZGV4JykpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgbmV0d29yayB0cmFmZmljIGRhdGE6ICcke2RhdGF9J2ApO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBDUFUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZ2l2ZW4gcGFja2FnZU5hbWUuXG4gKiBJdCByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHRoZSBkdW1wZWQgQ1BVIGluZm9ybWF0aW9uIGRpZCBub3QgaW5jbHVkZSB0aGUgZ2l2ZW4gcGFja2FnZU5hbWVcbiAqIG9yIHRoZSBmb3JtYXQgd2FzIHdyb25nLlxuICogVGhlIENQVSBpbmZvcm1hdGlvbidzIHNhbXBsaW5nIGludGVydmFsIGRlcGVuZHMgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogRm9yIGV4YW1wbGUsIHNvbWUgZGV2aWNlcyBoYXZlIDUgbWludXRlcyBpbnRlcnZhbC4gV2hlbiB5b3UgZ2V0IHRoZSBpbmZvcm1hdGlvblxuICogZnJvbSAyMDIzLTAyLTA3IDExOjU5OjQwLjQ2OCB0byAyMDIzLTAyLTA3IDEyOjA0OjQwLjU1NiwgdGhlbiB0aGUgbmV4dCB3aWxsIGJlXG4gKiBmcm9tIDIwMjMtMDItMDcgMTI6MDQ6NDAuNTU2IHRvIDIwMjMtMDItMDcgMTI6MDk6NDAuNjY4LiBObyBwcm9jZXNzIGluZm9ybWF0aW9uXG4gKiBleGlzdHMgaW4gdGhlIHJlc3VsdCBpZiB0aGUgcHJvY2VzcyB3YXMgbm90IHJ1bm5pbmcgZHVyaW5nIHRoZSBwZXJpb2QuXG4gKlxuICogQHRoaXMge0FuZHJvaWREcml2ZXJ9XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFja2FnZU5hbWUgVGhlIHBhY2thZ2UgbmFtZSB0byBnZXQgdGhlIENQVSBpbmZvcm1hdGlvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSByZXRyaWVzIFRoZSBudW1iZXIgb2YgcmV0cnkgY291bnQuXG4gKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBhcnJheSBvZiB0aGUgcGFyc2VkIENQVSB1cHNhZ2UgcGVyY2VudGFnZXMuXG4gKiAgICAgICAgICAgICAgICAgIGUuZy4gWydjcHVpbmZvJywgWycxNC4zJywgJzI4LjInXV1cbiAqICAgICAgICAgICAgICAgICAgJzE0LjMnIGlzIHVzYWdlIGJ5IHRoZSB1c2VyICglKSwgJzI4LjInIGlzIHVzYWdlIGJ5IHRoZSBrZXJuZWwgKCUpXG4gKiBAdGhyb3cge0Vycm9yfSBJZiBpdCBmYWlsZWQgdG8gcGFyc2UgdGhlIHJlc3VsdCBvZiBkdW1wc3lzLCBvciBubyBwYWNrYWdlIG5hbWUgZXhpc3RzLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDUFVJbmZvIChwYWNrYWdlTmFtZSwgcmV0cmllcyA9IDIpIHtcbiAgLy8gVE9ETzogZmlndXJlIG91dCB3aHkgdGhpcyBpc1xuICAvLyBzb21ldGltZXMsIHRoZSBmdW5jdGlvbiBvZiAnYWRiLnNoZWxsJyBmYWlscy4gd2hlbiBJIHRlc3RlZCB0aGlzIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQgb2YgJ0dhbGF4eSBOb3RlNScsXG4gIC8vIGFkYi5zaGVsbChkdW1wc3lzIGNwdWluZm8pIHJldHVybnMgY3B1IGRhdGFzIGZvciBvdGhlciBhcHBsaWNhdGlvbiBwYWNrYWdlcywgYnV0IEkgY2FuJ3QgZmluZCB0aGUgZGF0YSBmb3IgcGFja2FnZU5hbWUuXG4gIC8vIEl0IHVzdWFsbHkgZmFpbHMgMzAgdGltZXMgYW5kIHN1Y2Nlc3MgZm9yIHRoZSBuZXh0IHRpbWUsXG4gIC8vIFNpbmNlIHRoZW4sIGhlIGhhcyBjb250aW51ZWQgdG8gc3VjY2VlZC5cbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgb3V0cHV0O1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnY3B1aW5mbyddKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZS5zdGRlcnIpIHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhlLnN0ZGVycik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICAvLyBgb3V0cHV0YCB3aWxsIGJlIHNvbWV0aGluZyBsaWtlXG4gICAgLy8gICAgKzAlIDIyMDkvaW8uYXBwaXVtLmFuZHJvaWQuYXBpczogMC4xJSB1c2VyICsgMC4yJSBrZXJuZWwgLyBmYXVsdHM6IDcwIG1pbm9yXG4gICAgY29uc3QgdXNhZ2VzUGF0dGVybiA9XG4gICAgICBuZXcgUmVnRXhwKGBeLitcXFxcLyR7Xy5lc2NhcGVSZWdFeHAocGFja2FnZU5hbWUpfTpcXFxcRCsoW1xcXFxkLl0rKSVcXFxccyt1c2VyXFxcXHMrXFxcXCtcXFxccysoW1xcXFxkLl0rKSVcXFxccytrZXJuZWxgLCAnbScpO1xuICAgIGNvbnN0IG1hdGNoID0gdXNhZ2VzUGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIGNwdSB1c2FnZSBkYXRhIGZvciAnJHtwYWNrYWdlTmFtZX0nLiBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzYCk7XG4gICAgfVxuICAgIHJldHVybiBbQ1BVX0tFWVMsIFttYXRjaFsxXSwgbWF0Y2hbMl1dXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQHRoaXMge0FuZHJvaWREcml2ZXJ9XG4gKiBAcGFyYW0ge251bWJlcn0gcmV0cmllc1xuICovXG5hc3luYyBmdW5jdGlvbiBnZXRCYXR0ZXJ5SW5mbyAocmV0cmllcyA9IDIpIHtcbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwocmV0cmllcywgUkVUUllfUEFVU0VfTVMsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgY21kID0gWydkdW1wc3lzJywgJ2JhdHRlcnknLCAnfCcsICdncmVwJywgJ2xldmVsJ107XG4gICAgbGV0IGRhdGEgPSBhd2FpdCB0aGlzLmFkYi5zaGVsbChjbWQpO1xuICAgIGlmICghZGF0YSkgdGhyb3cgbmV3IEVycm9yKCdObyBkYXRhIGZyb20gZHVtcHN5cycpOyAvL2VzbGludC1kaXNhYmxlLWxpbmUgY3VybHlcblxuICAgIGxldCBwb3dlciA9IHBhcnNlSW50KChkYXRhLnNwbGl0KCc6JylbMV0gfHwgJycpLnRyaW0oKSwgMTApO1xuXG4gICAgaWYgKCFOdW1iZXIuaXNOYU4ocG93ZXIpKSB7XG4gICAgICByZXR1cm4gW18uY2xvbmUoQkFUVEVSWV9LRVlTKSwgW3Bvd2VyLnRvU3RyaW5nKCldXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcGFyc2UgYmF0dGVyeSBkYXRhOiAnJHtkYXRhfSdgKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vL1xuLy8gcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gdHlwZSBvZiB0aGUgc3lzdGVtIHN0YXRlIHdoaWNoIGlzIHN1cHBvcnRlZCB0byByZWFkIGFzIGxpa2UgY3B1LCBtZW1vcnksIG5ldHdvcmsgdHJhZmZpYywgYW5kIGJhdHRlcnkuXG4vLyBvdXRwdXQgLSBhcnJheSBsaWtlIGJlbG93XG4vLyBbY3B1aW5mbywgYmF0dGVyeWluZm8sIG5ldHdvcmtpbmZvLCBtZW1vcnlpbmZvXVxuLy9cbmNvbW1hbmRzLmdldFBlcmZvcm1hbmNlRGF0YVR5cGVzID0gZnVuY3Rpb24gZ2V0UGVyZm9ybWFuY2VEYXRhVHlwZXMgKCkge1xuICByZXR1cm4gXy5rZXlzKFNVUFBPUlRFRF9QRVJGT1JNQU5DRV9EQVRBX1RZUEVTKTtcbn07XG5cbi8qKlxuICogQHJldHVybnMgVGhlIGluZm9ybWF0aW9uIHR5cGUgb2YgdGhlIHN5c3RlbSBzdGF0ZSB3aGljaCBpcyBzdXBwb3J0ZWQgdG8gcmVhZCBhcyBsaWtlIGNwdSwgbWVtb3J5LCBuZXR3b3JrIHRyYWZmaWMsIGFuZCBiYXR0ZXJ5LlxuICogaW5wdXQgLSAocGFja2FnZU5hbWUpIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gKiAgICAgICAgKGRhdGFUeXBlKSB0aGUgdHlwZSBvZiBzeXN0ZW0gc3RhdGUgd2hpY2ggd2FudHMgdG8gcmVhZC4gSXQgc2hvdWxkIGJlIG9uZSBvZiB0aGUga2V5cyBvZiB0aGUgU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVNcbiAqICAgICAgICAoZGF0YVJlYWRUaW1lb3V0KSB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzIHRvIHJlYWRcbiAqIG91dHB1dCAtIHRhYmxlIG9mIHRoZSBwZXJmb3JtYW5jZSBkYXRhLCBUaGUgZmlyc3QgbGluZSBvZiB0aGUgdGFibGUgcmVwcmVzZW50cyB0aGUgdHlwZSBvZiBkYXRhLiBUaGUgcmVtYWluaW5nIGxpbmVzIHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIHRoZSBkYXRhLlxuICpcbiAqIGluIGNhc2Ugb2YgYmF0dGVyeSBpbmZvIDogW1twb3dlcl0sIFsyM11dXG4gKiBpbiBjYXNlIG9mIG1lbW9yeSBpbmZvIDogIFtbdG90YWxQcml2YXRlRGlydHksIG5hdGl2ZVByaXZhdGVEaXJ0eSwgZGFsdmlrUHJpdmF0ZURpcnR5LCBlZ2xQcml2YXRlRGlydHksIGdsUHJpdmF0ZURpcnR5LCB0b3RhbFBzcyxcbiAqICAgbmF0aXZlUHNzLCBkYWx2aWtQc3MsIGVnbFBzcywgZ2xQc3MsIG5hdGl2ZUhlYXBBbGxvY2F0ZWRTaXplLCBuYXRpdmVIZWFwU2l6ZV0sIFsxODM2MCwgODI5NiwgNjEzMiwgbnVsbCwgbnVsbCwgNDI1ODgsIDg0MDYsIDcwMjQsIG51bGwsIG51bGwsIDI2NTE5LCAxMDM0NF1dXG4gKiBpbiBjYXNlIG9mIG5ldHdvcmsgaW5mbyA6IFtbYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zLCBidWNrZXREdXJhdGlvbixdLFxuICogICBbMTQ3ODA5MTYwMDAwMCwgbnVsbCwgMTA5OTA3NSwgNjEwOTQ3LCA5MjgsIDExNDM2MiwgNzY5LCAwLCAzNjAwMDAwXSwgWzE0NzgwOTUyMDAwMDAsIG51bGwsIDEzMDYzMDAsIDQwNTk5NywgNTA5LCA0NjM1OSwgMzcwLCAwLCAzNjAwMDAwXV1cbiAqIGluIGNhc2Ugb2YgbmV0d29yayBpbmZvIDogW1tzdCwgYWN0aXZlVGltZSwgcmIsIHJwLCB0YiwgdHAsIG9wLCBidWNrZXREdXJhdGlvbl0sIFsxNDc4MDg4MDAwLCBudWxsLCBudWxsLCAzMjExNTI5NiwgMzQyOTEsIDI5NTY4MDUsIDI1NzA1LCAwLCAzNjAwXSxcbiAqICAgWzE0NzgwOTE2MDAsIG51bGwsIG51bGwsIDI3MTQ2ODMsIDExODIxLCAxNDIwNTY0LCAxMjY1MCwgMCwgMzYwMF0sIFsxNDc4MDk1MjAwLCBudWxsLCBudWxsLCAxMDA3OTIxMywgMTk5NjIsIDI0ODc3MDUsIDIwMDE1LCAwLCAzNjAwXSxcbiAqICAgWzE0NzgwOTg4MDAsIG51bGwsIG51bGwsIDQ0NDQ0MzMsIDEwMjI3LCAxNDMwMzU2LCAxMDQ5MywgMCwgMzYwMF1dXG4gKiBpbiBjYXNlIG9mIGNwdSBpbmZvIDogW1t1c2VyLCBrZXJuZWxdLCBbMC45LCAxLjNdXVxuICovXG5jb21tYW5kcy5nZXRQZXJmb3JtYW5jZURhdGEgPSBhc3luYyBmdW5jdGlvbiBnZXRQZXJmb3JtYW5jZURhdGEgKHBhY2thZ2VOYW1lLCBkYXRhVHlwZSwgcmV0cmllcyA9IDIpIHtcbiAgc3dpdGNoIChfLnRvTG93ZXIoZGF0YVR5cGUpKSB7XG4gICAgY2FzZSAnYmF0dGVyeWluZm8nOlxuICAgICAgcmV0dXJuIGF3YWl0IGdldEJhdHRlcnlJbmZvLmJpbmQodGhpcykocmV0cmllcyk7XG4gICAgY2FzZSAnY3B1aW5mbyc6XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0Q1BVSW5mby5iaW5kKHRoaXMpKHBhY2thZ2VOYW1lLCByZXRyaWVzKTtcbiAgICBjYXNlICdtZW1vcnlpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCBnZXRNZW1vcnlJbmZvLmJpbmQodGhpcykocGFja2FnZU5hbWUsIHJldHJpZXMpO1xuICAgIGNhc2UgJ25ldHdvcmtpbmZvJzpcbiAgICAgIHJldHVybiBhd2FpdCBnZXROZXR3b3JrVHJhZmZpY0luZm8uYmluZCh0aGlzKShyZXRyaWVzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwZXJmb3JtYW5jZSBkYXRhIG9mIHR5cGUgJyR7ZGF0YVR5cGV9JyBmb3VuZC4gYCArXG4gICAgICAgIGBPbmx5IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBzdXBwb3J0ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoU1VQUE9SVEVEX1BFUkZPUk1BTkNFX0RBVEFfVFlQRVMsICcgJywgMil9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gUGVyZm9ybWFuY2VEYXRhT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhY2thZ2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIGlkZW50aWZpZXIgdG8gZmV0Y2ggdGhlIGRhdGEgZm9yXG4gKiBAcHJvcGVydHkgeydiYXR0ZXJ5aW5mbycgfCAnY3B1aW5mbycgfCAnbWVtb3J5aW5mbycgfCAnbmV0d29ya2luZm8nfSBkYXRhVHlwZSBPbmUgb2Ygc3VwcG9ydGVkIHN1YnN5c3RlbVxuICogdG8gZmV0Y2ggdGhlIGRhdGEgZm9yLlxuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHBlcmZvcm1hbmNlIGRhdGEgYWJvdXQgdGhlIGdpdmVuIEFuZHJvaWQgc3Vic3lzdGVtLlxuICogVGhlIGRhdGEgaXMgcGFyc2VkIGZyb20gdGhlIG91dHB1dCBvZiB0aGUgZHVtcHN5cyB1dGlsaXR5LlxuICpcbiAqIEBwYXJhbSB7UGVyZm9ybWFuY2VEYXRhT3B0aW9uc30gb3B0c1xuICogQHJldHVybnMge1Byb21pc2U8YW55W11bXT59IFRoZSBvdXRwdXQgZGVwZW5kcyBvbiB0aGUgc2VsZWN0ZWQgc3Vic3lzdGVtLlxuICogSXQgaXMgb3JnaW5pemVkIGludG8gYSB0YWJsZSwgd2hlcmUgdGhlIGZpcnN0IHJvdyByZXByZXNlbnQgY29sdW1uIG5hbWVzXG4gKiBhbmQgdGhlIGZvbGxvd2luZyByb3dzIHJlcHJlc2VudCB0aGUgc2FtcGxlZCBkYXRhIGZvciBlYWNoIGNvbHVtbi5cbiAqIEV4YW1wbGUgb3V0cHV0IGZvciBkaWZmZXJlbnQgZGF0YSB0eXBlczpcbiAqIC0gYmF0dGVyeWluZm86IFtbcG93ZXJdLCBbMjNdXVxuICogLSBtZW1vcnkgaW5mbzogW1t0b3RhbFByaXZhdGVEaXJ0eSwgbmF0aXZlUHJpdmF0ZURpcnR5LCBkYWx2aWtQcml2YXRlRGlydHksIGVnbFByaXZhdGVEaXJ0eSwgZ2xQcml2YXRlRGlydHksIHRvdGFsUHNzLFxuICogICBuYXRpdmVQc3MsIGRhbHZpa1BzcywgZWdsUHNzLCBnbFBzcywgbmF0aXZlSGVhcEFsbG9jYXRlZFNpemUsIG5hdGl2ZUhlYXBTaXplXSwgWzE4MzYwLCA4Mjk2LCA2MTMyLCBudWxsLCBudWxsLCA0MjU4OCwgODQwNiwgNzAyNCwgbnVsbCwgbnVsbCwgMjY1MTksIDEwMzQ0XV1cbiAqIC0gbmV0d29ya2luZm86IFtbYnVja2V0U3RhcnQsIGFjdGl2ZVRpbWUsIHJ4Qnl0ZXMsIHJ4UGFja2V0cywgdHhCeXRlcywgdHhQYWNrZXRzLCBvcGVyYXRpb25zLCBidWNrZXREdXJhdGlvbixdLFxuICogICBbMTQ3ODA5MTYwMDAwMCwgbnVsbCwgMTA5OTA3NSwgNjEwOTQ3LCA5MjgsIDExNDM2MiwgNzY5LCAwLCAzNjAwMDAwXSwgWzE0NzgwOTUyMDAwMDAsIG51bGwsIDEzMDYzMDAsIDQwNTk5NywgNTA5LCA0NjM1OSwgMzcwLCAwLCAzNjAwMDAwXV1cbiAqXG4gKiAgIFtbc3QsIGFjdGl2ZVRpbWUsIHJiLCBycCwgdGIsIHRwLCBvcCwgYnVja2V0RHVyYXRpb25dLCBbMTQ3ODA4ODAwMCwgbnVsbCwgbnVsbCwgMzIxMTUyOTYsIDM0MjkxLCAyOTU2ODA1LCAyNTcwNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDkxNjAwLCBudWxsLCBudWxsLCAyNzE0NjgzLCAxMTgyMSwgMTQyMDU2NCwgMTI2NTAsIDAsIDM2MDBdLCBbMTQ3ODA5NTIwMCwgbnVsbCwgbnVsbCwgMTAwNzkyMTMsIDE5OTYyLCAyNDg3NzA1LCAyMDAxNSwgMCwgMzYwMF0sXG4gKiAgIFsxNDc4MDk4ODAwLCBudWxsLCBudWxsLCA0NDQ0NDMzLCAxMDIyNywgMTQzMDM1NiwgMTA0OTMsIDAsIDM2MDBdXVxuICogLSBjcHVpbmZvOiBbW3VzZXIsIGtlcm5lbF0sIFswLjksIDEuM11dXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldFBlcmZvcm1hbmNlRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZUdldFBlcmZvcm1hbmNlRGF0YSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgcGFja2FnZU5hbWUsIGRhdGFUeXBlIH0gPSByZXF1aXJlQXJncyhbJ3BhY2thZ2VOYW1lJywgJ2RhdGFUeXBlJ10sIG9wdHMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRQZXJmb3JtYW5jZURhdGEocGFja2FnZU5hbWUsIGRhdGFUeXBlKTtcbn07XG5cbmV4cG9ydCB7XG4gIGNvbW1hbmRzLCBTVVBQT1JURURfUEVSRk9STUFOQ0VfREFUQV9UWVBFUywgQ1BVX0tFWVMsIE1FTU9SWV9LRVlTLFxuICBCQVRURVJZX0tFWVMsIE5FVFdPUktfS0VZUywgZ2V0TWVtb3J5SW5mbywgZ2V0TmV0d29ya1RyYWZmaWNJbmZvLFxuICBnZXRDUFVJbmZvLCBnZXRCYXR0ZXJ5SW5mbyxcbn07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxP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
@@ -1 +1 @@
1
- {"version":3,"file":"performance.js","names":["_lodash","_interopRequireDefault","require","_asyncbox","commands","helpers","extensions","exports","NETWORK_KEYS","CPU_KEYS","BATTERY_KEYS","MEMORY_KEYS","SUPPORTED_PERFORMANCE_DATA_TYPES","Object","freeze","cpuinfo","memoryinfo","batteryinfo","networkinfo","MEMINFO_TITLES","NATIVE","DALVIK","EGL","GL","MTRACK","TOTAL","HEAP","RETRY_PAUSE_MS","parseMeminfoForApi19To29","entries","valDict","type","subType","nativePss","nativePrivateDirty","nativeHeapSize","nativeHeapAllocatedSize","dalvikPss","dalvikPrivateDirty","eglPss","eglPrivateDirty","glPss","glPrivateDirty","length","totalPss","totalPrivateDirty","parseMeminfoForApiBelow19","parseMeminfoForApiAbove29","nativeRss","dalvikRss","totalRss","getPerformanceDataTypes","_","keys","getPerformanceData","packageName","dataType","retries","toLower","getBatteryInfo","getCPUInfo","getMemoryInfo","getNetworkTrafficInfo","Error","JSON","stringify","retryInterval","output","adb","shell","e","stderr","log","info","usagesPattern","RegExp","escapeRegExp","match","exec","debug","cmd","data","power","parseInt","split","trim","Number","isNaN","clone","toString","apiLevel","getApiLevel","line","filter","Boolean","headers","values","map","header","returnValue","bucketDuration","bucketStart","activeTime","rxBytes","rxPackets","txBytes","txPackets","operations","index","fromXtstats","indexOf","start","delimiter","end","pendingBytes","substring","arrayList","j","k","returnIndex","i","isEqual","isUndefined","assign","_default","default"],"sources":["../../../lib/commands/performance.js"],"sourcesContent":["import _ from 'lodash';\nimport { retryInterval } from 'asyncbox';\n\nconst commands = {}, helpers = {}, extensions = {};\n\nconst NETWORK_KEYS = [\n ['bucketStart', 'activeTime', 'rxBytes', 'rxPackets', 'txBytes', 'txPackets', 'operations', 'bucketDuration'],\n ['st', 'activeTime', 'rb', 'rp', 'tb', 'tp', 'op', 'bucketDuration']\n];\nconst CPU_KEYS = ['user', 'kernel'];\nconst BATTERY_KEYS = ['power'];\nconst MEMORY_KEYS = [\n 'totalPrivateDirty', 'nativePrivateDirty', 'dalvikPrivateDirty',\n 'eglPrivateDirty', 'glPrivateDirty',\n 'totalPss', 'nativePss', 'dalvikPss', 'eglPss', 'glPss',\n 'nativeHeapAllocatedSize', 'nativeHeapSize',\n 'nativeRss', 'dalvikRss', 'totalRss'\n];\nconst SUPPORTED_PERFORMANCE_DATA_TYPES = Object.freeze({\n cpuinfo: 'the amount of cpu by user and kernel process - cpu information for applications on real devices and simulators',\n memoryinfo: 'the amount of memory used by the process - memory information for applications on real devices and simulators',\n batteryinfo: 'the remaining battery power - battery power information for applications on real devices and simulators',\n networkinfo: 'the network statistics - network rx/tx information for applications on real devices and simulators'\n});\nconst MEMINFO_TITLES = Object.freeze({\n NATIVE: 'Native',\n DALVIK: 'Dalvik',\n EGL: 'EGL',\n GL: 'GL',\n MTRACK: 'mtrack',\n TOTAL: 'TOTAL',\n HEAP: 'Heap'\n});\nconst RETRY_PAUSE_MS = 1000;\n\n/**\n * API level between 18 and 30\n * ['<System Type>', '<Memory Type>', <pss total>, <private dirty>, <private clean>, <swapPss dirty>, <heap size>, <heap alloc>, <heap free>]\n * except 'TOTAL', which skips the second type name\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApi19To29 (entries, valDict) {\n const [type, subType] = entries;\n if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.dalvikPss, valDict.dalvikPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.EGL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.eglPss, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.glPss, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL && entries.length === 8) {\n // there are two totals, and we only want the full listing, which has 8 entries\n [, valDict.totalPss, valDict.totalPrivateDirty] = entries;\n }\n}\n\n/**\n * ['<System Type', '<pps>', '<shared dirty>', '<private dirty>', '<heap size>', '<heap alloc>', '<heap free>']\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApiBelow19 (entries, valDict) {\n const type = entries[0];\n if (type === MEMINFO_TITLES.NATIVE) {\n [, valDict.nativePss,, valDict.nativePrivateDirty, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK) {\n [, valDict.dalvikPss,, valDict.dalvikPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.EGL) {\n [, valDict.eglPss,, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL) {\n [, valDict.glPss,, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL) {\n [, valDict.totalPss,, valDict.totalPrivateDirty] = entries;\n }\n}\n\n/**\n * API level 30 and above\n * ['<System Type>', '<Memory Type>', <pss total>, <private dirty>, <private clean>, <swapPss dirty>, <rss total>, <heap size>, <heap alloc>, <heap free>]\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApiAbove29 (entries, valDict) {\n const [type, subType] = entries;\n if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeRss, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.dalvikPss, valDict.dalvikPrivateDirty,,, valDict.dalvikRss] = entries;\n } else if (type === MEMINFO_TITLES.EGL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.eglPss, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.glPss, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL && entries.length === 9) {\n // has 9 entries\n [, valDict.totalPss, valDict.totalPrivateDirty,,, valDict.totalRss] = entries;\n }\n}\n\n//\n// returns the information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.\n// output - array like below\n// [cpuinfo, batteryinfo, networkinfo, memoryinfo]\n//\ncommands.getPerformanceDataTypes = function getPerformanceDataTypes () {\n return _.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);\n};\n\n/**\n * @returns The information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.\n * input - (packageName) the package name of the application\n * (dataType) the type of system state which wants to read. It should be one of the keys of the SUPPORTED_PERFORMANCE_DATA_TYPES\n * (dataReadTimeout) the number of attempts to read\n * output - table of the performance data, The first line of the table represents the type of data. The remaining lines represent the values of the data.\n *\n * in case of battery info : [[power], [23]]\n * in case of memory info : [[totalPrivateDirty, nativePrivateDirty, dalvikPrivateDirty, eglPrivateDirty, glPrivateDirty, totalPss,\n * nativePss, dalvikPss, eglPss, glPss, nativeHeapAllocatedSize, nativeHeapSize], [18360, 8296, 6132, null, null, 42588, 8406, 7024, null, null, 26519, 10344]]\n * in case of network info : [[bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration,],\n * [1478091600000, null, 1099075, 610947, 928, 114362, 769, 0, 3600000], [1478095200000, null, 1306300, 405997, 509, 46359, 370, 0, 3600000]]\n * in case of network info : [[st, activeTime, rb, rp, tb, tp, op, bucketDuration], [1478088000, null, null, 32115296, 34291, 2956805, 25705, 0, 3600],\n * [1478091600, null, null, 2714683, 11821, 1420564, 12650, 0, 3600], [1478095200, null, null, 10079213, 19962, 2487705, 20015, 0, 3600],\n * [1478098800, null, null, 4444433, 10227, 1430356, 10493, 0, 3600]]\n * in case of cpu info : [[user, kernel], [0.9, 1.3]]\n */\ncommands.getPerformanceData = async function getPerformanceData (packageName, dataType, retries = 2) {\n switch (_.toLower(dataType)) {\n case 'batteryinfo':\n return await this.getBatteryInfo(retries);\n case 'cpuinfo':\n return await this.getCPUInfo(packageName, retries);\n case 'memoryinfo':\n return await this.getMemoryInfo(packageName, retries);\n case 'networkinfo':\n return await this.getNetworkTrafficInfo(retries);\n default:\n throw new Error(`No performance data of type '${dataType}' found. ` +\n `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);\n }\n};\n\n/**\n * Return the CPU information related to the given packageName.\n * It raises an exception if the dumped CPU information did not include the given packageName\n * or the format was wrong.\n * The CPU information's sampling interval depends on the device under test.\n * For example, some devices have 5 minutes interval. When you get the information\n * from 2023-02-07 11:59:40.468 to 2023-02-07 12:04:40.556, then the next will be\n * from 2023-02-07 12:04:40.556 to 2023-02-07 12:09:40.668. No process information\n * exists in the result if the process was not running during the period.\n *\n * @param {string} packageName The package name to get the CPU information.\n * @param {number} retries The number of retry count.\n * @returns {Array} The array of the parsed CPU upsage percentages.\n * e.g. ['cpuinfo', ['14.3', '28.2']]\n * '14.3' is usage by the user (%), '28.2' is usage by the kernel (%)\n * @throw {Error} If it failed to parse the result of dumpsys, or no package name exists.\n */\nhelpers.getCPUInfo = async function getCPUInfo (packageName, retries = 2) {\n // TODO: figure out why this is\n // sometimes, the function of 'adb.shell' fails. when I tested this function on the target of 'Galaxy Note5',\n // adb.shell(dumpsys cpuinfo) returns cpu datas for other application packages, but I can't find the data for packageName.\n // It usually fails 30 times and success for the next time,\n // Since then, he has continued to succeed.\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let output;\n try {\n output = await this.adb.shell(['dumpsys', 'cpuinfo']);\n } catch (e) {\n if (e.stderr) {\n this.log.info(e.stderr);\n }\n throw e;\n }\n // `output` will be something like\n // +0% 2209/io.appium.android.apis: 0.1% user + 0.2% kernel / faults: 70 minor\n const usagesPattern =\n new RegExp(`^.+\\\\/${_.escapeRegExp(packageName)}:\\\\D+([\\\\d.]+)%\\\\s+user\\\\s+\\\\+\\\\s+([\\\\d.]+)%\\\\s+kernel`, 'm');\n const match = usagesPattern.exec(output);\n if (!match) {\n this.log.debug(output);\n throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);\n }\n return [CPU_KEYS, [match[1], match[2]]];\n });\n};\n\nhelpers.getBatteryInfo = async function getBatteryInfo (retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];\n let data = await this.adb.shell(cmd);\n if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly\n\n let power = parseInt((data.split(':')[1] || '').trim(), 10);\n\n if (!Number.isNaN(power)) {\n return [_.clone(BATTERY_KEYS), [power.toString()]];\n } else {\n throw new Error(`Unable to parse battery data: '${data}'`);\n }\n });\n};\n\nhelpers.getMemoryInfo = async function getMemoryInfo (packageName, retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n const cmd = [\n 'dumpsys', 'meminfo', `'${packageName}'`,\n '|', 'grep', '-E',\n `'${MEMINFO_TITLES.NATIVE}|${MEMINFO_TITLES.DALVIK}|${MEMINFO_TITLES.EGL}` +\n `|${MEMINFO_TITLES.GL}|${MEMINFO_TITLES.TOTAL}'`\n ];\n const data = await this.adb.shell(cmd);\n if (!data) {\n throw new Error('No data from dumpsys');\n }\n const valDict = {totalPrivateDirty: ''};\n const apiLevel = await this.adb.getApiLevel();\n for (const line of data.split('\\n')) {\n const entries = line.trim().split(/\\s+/).filter(Boolean);\n if (apiLevel >= 30) {\n parseMeminfoForApiAbove29(entries, valDict);\n } else if (apiLevel > 18 && apiLevel < 30) {\n parseMeminfoForApi19To29(entries, valDict);\n } else {\n parseMeminfoForApiBelow19(entries, valDict);\n }\n }\n if (valDict.totalPrivateDirty && valDict.totalPrivateDirty !== 'nodex') {\n const headers = _.clone(MEMORY_KEYS);\n const values = headers.map((header) => valDict[header]);\n return [headers, values];\n }\n\n throw new Error(`Unable to parse memory data: '${data}'`);\n });\n};\n\nhelpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo (retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let returnValue = [];\n let bucketDuration, bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations;\n\n let cmd = ['dumpsys', 'netstats'];\n let data = await this.adb.shell(cmd);\n if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly\n\n // In case of network traffic information, it is different for the return data between emulator and real device.\n // the return data of emulator\n // Xt stats:\n // Pending bytes: 39250\n // History since boot:\n // ident=[[type=WIFI, subType=COMBINED, networkId=\"WiredSSID\"]] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600000\n // bucketStart=1478098800000 activeTime=31824 rxBytes=21502 rxPackets=78 txBytes=17748 txPackets=90 operations=0\n //\n // 7.1\n // Xt stats:\n // Pending bytes: 481487\n // History since boot:\n // ident=[{type=MOBILE, subType=COMBINED, subscriberId=310260..., metered=true}] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600\n // st=1483984800 rb=0 rp=0 tb=12031 tp=184 op=0\n // st=1483988400 rb=0 rp=0 tb=38476 tp=587 op=0\n // st=1483999200 rb=315616 rp=400 tb=94800 tp=362 op=0\n // st=1484002800 rb=15826 rp=20 tb=4738 tp=16 op=0\n //\n // the return data of real device\n // Xt stats:\n // Pending bytes: 0\n // History since boot:\n // ident=[{type=MOBILE, subType=COMBINED, subscriberId=450050...}] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600\n // st=1478088000 rb=32115296 rp=34291 tb=2956805 tp=25705 op=0\n // st=1478091600 rb=2714683 rp=11821 tb=1420564 tp=12650 op=0\n // st=1478095200 rb=10079213 rp=19962 tb=2487705 tp=20015 op=0\n // st=1478098800 rb=4444433 rp=10227 tb=1430356 tp=10493 op=0\n let index = 0;\n let fromXtstats = data.indexOf('Xt stats:');\n\n let start = data.indexOf('Pending bytes:', fromXtstats);\n let delimiter = data.indexOf(':', start + 1);\n let end = data.indexOf('\\n', delimiter + 1);\n let pendingBytes = data.substring(delimiter + 1, end).trim();\n\n if (end > delimiter) {\n start = data.indexOf('bucketDuration', end + 1);\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf('\\n', delimiter + 1);\n bucketDuration = data.substring(delimiter + 1, end).trim();\n }\n\n if (start >= 0) {\n data = data.substring(end + 1, data.length);\n let arrayList = data.split('\\n');\n\n if (arrayList.length > 0) {\n start = -1;\n\n for (let j = 0; j < NETWORK_KEYS.length; ++j) {\n start = arrayList[0].indexOf(NETWORK_KEYS[j][0]);\n\n if (start >= 0) {\n index = j;\n returnValue[0] = [];\n\n for (let k = 0; k < NETWORK_KEYS[j].length; ++k) {\n returnValue[0][k] = NETWORK_KEYS[j][k];\n }\n break;\n }\n }\n\n let returnIndex = 1;\n for (let i = 0; i < arrayList.length; i++) {\n data = arrayList[i];\n start = data.indexOf(NETWORK_KEYS[index][0]);\n\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n bucketStart = data.substring(delimiter + 1, end).trim();\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][1], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n activeTime = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][2], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n rxBytes = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][3], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n rxPackets = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][4], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n txBytes = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][5], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n txPackets = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][6], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.length;\n operations = data.substring(delimiter + 1, end).trim();\n\n }\n }\n returnValue[returnIndex++] = [bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration];\n }\n }\n }\n }\n\n if (!_.isEqual(pendingBytes, '') && !_.isUndefined(pendingBytes) && !_.isEqual(pendingBytes, 'nodex')) {\n return returnValue;\n } else {\n throw new Error(`Unable to parse network traffic data: '${data}'`);\n }\n });\n};\n\nObject.assign(extensions, commands, helpers);\nexport {\n commands, helpers, SUPPORTED_PERFORMANCE_DATA_TYPES, CPU_KEYS, MEMORY_KEYS,\n BATTERY_KEYS, NETWORK_KEYS,\n};\nexport default extensions;\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"performance.js","names":["_lodash","_interopRequireDefault","require","_asyncbox","_utils","commands","exports","NETWORK_KEYS","CPU_KEYS","BATTERY_KEYS","MEMORY_KEYS","SUPPORTED_PERFORMANCE_DATA_TYPES","Object","freeze","cpuinfo","memoryinfo","batteryinfo","networkinfo","MEMINFO_TITLES","NATIVE","DALVIK","EGL","GL","MTRACK","TOTAL","HEAP","RETRY_PAUSE_MS","parseMeminfoForApi19To29","entries","valDict","type","subType","nativePss","nativePrivateDirty","nativeHeapSize","nativeHeapAllocatedSize","dalvikPss","dalvikPrivateDirty","eglPss","eglPrivateDirty","glPss","glPrivateDirty","length","totalPss","totalPrivateDirty","parseMeminfoForApiBelow19","parseMeminfoForApiAbove29","nativeRss","dalvikRss","totalRss","getMemoryInfo","packageName","retries","retryInterval","cmd","data","adb","shell","Error","apiLevel","getApiLevel","line","split","trim","filter","Boolean","headers","_","clone","values","map","header","getNetworkTrafficInfo","returnValue","bucketDuration","bucketStart","activeTime","rxBytes","rxPackets","txBytes","txPackets","operations","index","fromXtstats","indexOf","start","delimiter","end","pendingBytes","substring","arrayList","j","k","returnIndex","i","isEqual","isUndefined","getCPUInfo","output","e","stderr","log","info","usagesPattern","RegExp","escapeRegExp","match","exec","debug","getBatteryInfo","power","parseInt","Number","isNaN","toString","getPerformanceDataTypes","keys","getPerformanceData","dataType","toLower","bind","JSON","stringify","mobileGetPerformanceData","opts","requireArgs","_default","default"],"sources":["../../../lib/commands/performance.js"],"sourcesContent":["import _ from 'lodash';\nimport { retryInterval } from 'asyncbox';\nimport { requireArgs } from '../utils';\n\nconst commands = {};\n\nconst NETWORK_KEYS = [\n ['bucketStart', 'activeTime', 'rxBytes', 'rxPackets', 'txBytes', 'txPackets', 'operations', 'bucketDuration'],\n ['st', 'activeTime', 'rb', 'rp', 'tb', 'tp', 'op', 'bucketDuration']\n];\nconst CPU_KEYS = ['user', 'kernel'];\nconst BATTERY_KEYS = ['power'];\nconst MEMORY_KEYS = [\n 'totalPrivateDirty', 'nativePrivateDirty', 'dalvikPrivateDirty',\n 'eglPrivateDirty', 'glPrivateDirty',\n 'totalPss', 'nativePss', 'dalvikPss', 'eglPss', 'glPss',\n 'nativeHeapAllocatedSize', 'nativeHeapSize',\n 'nativeRss', 'dalvikRss', 'totalRss'\n];\nconst SUPPORTED_PERFORMANCE_DATA_TYPES = Object.freeze({\n cpuinfo: 'the amount of cpu by user and kernel process - cpu information for applications on real devices and simulators',\n memoryinfo: 'the amount of memory used by the process - memory information for applications on real devices and simulators',\n batteryinfo: 'the remaining battery power - battery power information for applications on real devices and simulators',\n networkinfo: 'the network statistics - network rx/tx information for applications on real devices and simulators'\n});\nconst MEMINFO_TITLES = Object.freeze({\n NATIVE: 'Native',\n DALVIK: 'Dalvik',\n EGL: 'EGL',\n GL: 'GL',\n MTRACK: 'mtrack',\n TOTAL: 'TOTAL',\n HEAP: 'Heap'\n});\nconst RETRY_PAUSE_MS = 1000;\n\n/**\n * API level between 18 and 30\n * ['<System Type>', '<Memory Type>', <pss total>, <private dirty>, <private clean>, <swapPss dirty>, <heap size>, <heap alloc>, <heap free>]\n * except 'TOTAL', which skips the second type name\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApi19To29 (entries, valDict) {\n const [type, subType] = entries;\n if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.dalvikPss, valDict.dalvikPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.EGL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.eglPss, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.glPss, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL && entries.length === 8) {\n // there are two totals, and we only want the full listing, which has 8 entries\n [, valDict.totalPss, valDict.totalPrivateDirty] = entries;\n }\n}\n\n/**\n * ['<System Type', '<pps>', '<shared dirty>', '<private dirty>', '<heap size>', '<heap alloc>', '<heap free>']\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApiBelow19 (entries, valDict) {\n const type = entries[0];\n if (type === MEMINFO_TITLES.NATIVE) {\n [, valDict.nativePss,, valDict.nativePrivateDirty, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK) {\n [, valDict.dalvikPss,, valDict.dalvikPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.EGL) {\n [, valDict.eglPss,, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL) {\n [, valDict.glPss,, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL) {\n [, valDict.totalPss,, valDict.totalPrivateDirty] = entries;\n }\n}\n\n/**\n * API level 30 and above\n * ['<System Type>', '<Memory Type>', <pss total>, <private dirty>, <private clean>, <swapPss dirty>, <rss total>, <heap size>, <heap alloc>, <heap free>]\n * !!! valDict gets mutated\n */\nfunction parseMeminfoForApiAbove29 (entries, valDict) {\n const [type, subType] = entries;\n if (type === MEMINFO_TITLES.NATIVE && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.nativePss, valDict.nativePrivateDirty,,, valDict.nativeRss, valDict.nativeHeapSize, valDict.nativeHeapAllocatedSize] = entries;\n } else if (type === MEMINFO_TITLES.DALVIK && subType === MEMINFO_TITLES.HEAP) {\n [,, valDict.dalvikPss, valDict.dalvikPrivateDirty,,, valDict.dalvikRss] = entries;\n } else if (type === MEMINFO_TITLES.EGL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.eglPss, valDict.eglPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.GL && subType === MEMINFO_TITLES.MTRACK) {\n [,, valDict.glPss, valDict.glPrivateDirty] = entries;\n } else if (type === MEMINFO_TITLES.TOTAL && entries.length === 9) {\n // has 9 entries\n [, valDict.totalPss, valDict.totalPrivateDirty,,, valDict.totalRss] = entries;\n }\n}\n\nasync function getMemoryInfo (packageName, retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n const cmd = [\n 'dumpsys', 'meminfo', `'${packageName}'`,\n '|', 'grep', '-E',\n `'${MEMINFO_TITLES.NATIVE}|${MEMINFO_TITLES.DALVIK}|${MEMINFO_TITLES.EGL}` +\n `|${MEMINFO_TITLES.GL}|${MEMINFO_TITLES.TOTAL}'`\n ];\n const data = await this.adb.shell(cmd);\n if (!data) {\n throw new Error('No data from dumpsys');\n }\n const valDict = {totalPrivateDirty: ''};\n const apiLevel = await this.adb.getApiLevel();\n for (const line of data.split('\\n')) {\n const entries = line.trim().split(/\\s+/).filter(Boolean);\n if (apiLevel >= 30) {\n parseMeminfoForApiAbove29(entries, valDict);\n } else if (apiLevel > 18 && apiLevel < 30) {\n parseMeminfoForApi19To29(entries, valDict);\n } else {\n parseMeminfoForApiBelow19(entries, valDict);\n }\n }\n if (valDict.totalPrivateDirty && valDict.totalPrivateDirty !== 'nodex') {\n const headers = _.clone(MEMORY_KEYS);\n const values = headers.map((header) => valDict[header]);\n return [headers, values];\n }\n\n throw new Error(`Unable to parse memory data: '${data}'`);\n });\n};\n\n/**\n * @this {AndroidDriver}\n * @param {number} retries\n */\nasync function getNetworkTrafficInfo (retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let returnValue = [];\n let bucketDuration, bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations;\n\n let cmd = ['dumpsys', 'netstats'];\n let data = await this.adb.shell(cmd);\n if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly\n\n // In case of network traffic information, it is different for the return data between emulator and real device.\n // the return data of emulator\n // Xt stats:\n // Pending bytes: 39250\n // History since boot:\n // ident=[[type=WIFI, subType=COMBINED, networkId=\"WiredSSID\"]] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600000\n // bucketStart=1478098800000 activeTime=31824 rxBytes=21502 rxPackets=78 txBytes=17748 txPackets=90 operations=0\n //\n // 7.1\n // Xt stats:\n // Pending bytes: 481487\n // History since boot:\n // ident=[{type=MOBILE, subType=COMBINED, subscriberId=310260..., metered=true}] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600\n // st=1483984800 rb=0 rp=0 tb=12031 tp=184 op=0\n // st=1483988400 rb=0 rp=0 tb=38476 tp=587 op=0\n // st=1483999200 rb=315616 rp=400 tb=94800 tp=362 op=0\n // st=1484002800 rb=15826 rp=20 tb=4738 tp=16 op=0\n //\n // the return data of real device\n // Xt stats:\n // Pending bytes: 0\n // History since boot:\n // ident=[{type=MOBILE, subType=COMBINED, subscriberId=450050...}] uid=-1 set=ALL tag=0x0\n // NetworkStatsHistory: bucketDuration=3600\n // st=1478088000 rb=32115296 rp=34291 tb=2956805 tp=25705 op=0\n // st=1478091600 rb=2714683 rp=11821 tb=1420564 tp=12650 op=0\n // st=1478095200 rb=10079213 rp=19962 tb=2487705 tp=20015 op=0\n // st=1478098800 rb=4444433 rp=10227 tb=1430356 tp=10493 op=0\n let index = 0;\n let fromXtstats = data.indexOf('Xt stats:');\n\n let start = data.indexOf('Pending bytes:', fromXtstats);\n let delimiter = data.indexOf(':', start + 1);\n let end = data.indexOf('\\n', delimiter + 1);\n let pendingBytes = data.substring(delimiter + 1, end).trim();\n\n if (end > delimiter) {\n start = data.indexOf('bucketDuration', end + 1);\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf('\\n', delimiter + 1);\n bucketDuration = data.substring(delimiter + 1, end).trim();\n }\n\n if (start >= 0) {\n data = data.substring(end + 1, data.length);\n let arrayList = data.split('\\n');\n\n if (arrayList.length > 0) {\n start = -1;\n\n for (let j = 0; j < NETWORK_KEYS.length; ++j) {\n start = arrayList[0].indexOf(NETWORK_KEYS[j][0]);\n\n if (start >= 0) {\n index = j;\n returnValue[0] = [];\n\n for (let k = 0; k < NETWORK_KEYS[j].length; ++k) {\n returnValue[0][k] = NETWORK_KEYS[j][k];\n }\n break;\n }\n }\n\n let returnIndex = 1;\n for (let i = 0; i < arrayList.length; i++) {\n data = arrayList[i];\n start = data.indexOf(NETWORK_KEYS[index][0]);\n\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n bucketStart = data.substring(delimiter + 1, end).trim();\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][1], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n activeTime = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][2], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n rxBytes = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][3], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n rxPackets = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][4], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n txBytes = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][5], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.indexOf(' ', delimiter + 1);\n txPackets = data.substring(delimiter + 1, end).trim();\n }\n }\n\n if (end > delimiter) {\n start = data.indexOf(NETWORK_KEYS[index][6], end + 1);\n if (start >= 0) {\n delimiter = data.indexOf('=', start + 1);\n end = data.length;\n operations = data.substring(delimiter + 1, end).trim();\n\n }\n }\n returnValue[returnIndex++] = [bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration];\n }\n }\n }\n }\n\n if (!_.isEqual(pendingBytes, '') && !_.isUndefined(pendingBytes) && !_.isEqual(pendingBytes, 'nodex')) {\n return returnValue;\n } else {\n throw new Error(`Unable to parse network traffic data: '${data}'`);\n }\n });\n}\n\n/**\n * Return the CPU information related to the given packageName.\n * It raises an exception if the dumped CPU information did not include the given packageName\n * or the format was wrong.\n * The CPU information's sampling interval depends on the device under test.\n * For example, some devices have 5 minutes interval. When you get the information\n * from 2023-02-07 11:59:40.468 to 2023-02-07 12:04:40.556, then the next will be\n * from 2023-02-07 12:04:40.556 to 2023-02-07 12:09:40.668. No process information\n * exists in the result if the process was not running during the period.\n *\n * @this {AndroidDriver}\n * @param {string} packageName The package name to get the CPU information.\n * @param {number} retries The number of retry count.\n * @returns {Array} The array of the parsed CPU upsage percentages.\n * e.g. ['cpuinfo', ['14.3', '28.2']]\n * '14.3' is usage by the user (%), '28.2' is usage by the kernel (%)\n * @throw {Error} If it failed to parse the result of dumpsys, or no package name exists.\n */\nasync function getCPUInfo (packageName, retries = 2) {\n // TODO: figure out why this is\n // sometimes, the function of 'adb.shell' fails. when I tested this function on the target of 'Galaxy Note5',\n // adb.shell(dumpsys cpuinfo) returns cpu datas for other application packages, but I can't find the data for packageName.\n // It usually fails 30 times and success for the next time,\n // Since then, he has continued to succeed.\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let output;\n try {\n output = await this.adb.shell(['dumpsys', 'cpuinfo']);\n } catch (e) {\n if (e.stderr) {\n this.log.info(e.stderr);\n }\n throw e;\n }\n // `output` will be something like\n // +0% 2209/io.appium.android.apis: 0.1% user + 0.2% kernel / faults: 70 minor\n const usagesPattern =\n new RegExp(`^.+\\\\/${_.escapeRegExp(packageName)}:\\\\D+([\\\\d.]+)%\\\\s+user\\\\s+\\\\+\\\\s+([\\\\d.]+)%\\\\s+kernel`, 'm');\n const match = usagesPattern.exec(output);\n if (!match) {\n this.log.debug(output);\n throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);\n }\n return [CPU_KEYS, [match[1], match[2]]];\n });\n}\n\n/**\n * @this {AndroidDriver}\n * @param {number} retries\n */\nasync function getBatteryInfo (retries = 2) {\n return await retryInterval(retries, RETRY_PAUSE_MS, async () => {\n let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];\n let data = await this.adb.shell(cmd);\n if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly\n\n let power = parseInt((data.split(':')[1] || '').trim(), 10);\n\n if (!Number.isNaN(power)) {\n return [_.clone(BATTERY_KEYS), [power.toString()]];\n } else {\n throw new Error(`Unable to parse battery data: '${data}'`);\n }\n });\n}\n\n//\n// returns the information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.\n// output - array like below\n// [cpuinfo, batteryinfo, networkinfo, memoryinfo]\n//\ncommands.getPerformanceDataTypes = function getPerformanceDataTypes () {\n return _.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);\n};\n\n/**\n * @returns The information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.\n * input - (packageName) the package name of the application\n * (dataType) the type of system state which wants to read. It should be one of the keys of the SUPPORTED_PERFORMANCE_DATA_TYPES\n * (dataReadTimeout) the number of attempts to read\n * output - table of the performance data, The first line of the table represents the type of data. The remaining lines represent the values of the data.\n *\n * in case of battery info : [[power], [23]]\n * in case of memory info : [[totalPrivateDirty, nativePrivateDirty, dalvikPrivateDirty, eglPrivateDirty, glPrivateDirty, totalPss,\n * nativePss, dalvikPss, eglPss, glPss, nativeHeapAllocatedSize, nativeHeapSize], [18360, 8296, 6132, null, null, 42588, 8406, 7024, null, null, 26519, 10344]]\n * in case of network info : [[bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration,],\n * [1478091600000, null, 1099075, 610947, 928, 114362, 769, 0, 3600000], [1478095200000, null, 1306300, 405997, 509, 46359, 370, 0, 3600000]]\n * in case of network info : [[st, activeTime, rb, rp, tb, tp, op, bucketDuration], [1478088000, null, null, 32115296, 34291, 2956805, 25705, 0, 3600],\n * [1478091600, null, null, 2714683, 11821, 1420564, 12650, 0, 3600], [1478095200, null, null, 10079213, 19962, 2487705, 20015, 0, 3600],\n * [1478098800, null, null, 4444433, 10227, 1430356, 10493, 0, 3600]]\n * in case of cpu info : [[user, kernel], [0.9, 1.3]]\n */\ncommands.getPerformanceData = async function getPerformanceData (packageName, dataType, retries = 2) {\n switch (_.toLower(dataType)) {\n case 'batteryinfo':\n return await getBatteryInfo.bind(this)(retries);\n case 'cpuinfo':\n return await getCPUInfo.bind(this)(packageName, retries);\n case 'memoryinfo':\n return await getMemoryInfo.bind(this)(packageName, retries);\n case 'networkinfo':\n return await getNetworkTrafficInfo.bind(this)(retries);\n default:\n throw new Error(`No performance data of type '${dataType}' found. ` +\n `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);\n }\n};\n\n/**\n * @typedef {Object} PerformanceDataOptions\n * @property {string} packageName The name of the package identifier to fetch the data for\n * @property {'batteryinfo' | 'cpuinfo' | 'memoryinfo' | 'networkinfo'} dataType One of supported subsystem\n * to fetch the data for.\n */\n\n/**\n * Retrieves performance data about the given Android subsystem.\n * The data is parsed from the output of the dumpsys utility.\n *\n * @param {PerformanceDataOptions} opts\n * @returns {Promise<any[][]>} The output depends on the selected subsystem.\n * It is orginized into a table, where the first row represent column names\n * and the following rows represent the sampled data for each column.\n * Example output for different data types:\n * - batteryinfo: [[power], [23]]\n * - memory info: [[totalPrivateDirty, nativePrivateDirty, dalvikPrivateDirty, eglPrivateDirty, glPrivateDirty, totalPss,\n * nativePss, dalvikPss, eglPss, glPss, nativeHeapAllocatedSize, nativeHeapSize], [18360, 8296, 6132, null, null, 42588, 8406, 7024, null, null, 26519, 10344]]\n * - networkinfo: [[bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration,],\n * [1478091600000, null, 1099075, 610947, 928, 114362, 769, 0, 3600000], [1478095200000, null, 1306300, 405997, 509, 46359, 370, 0, 3600000]]\n *\n * [[st, activeTime, rb, rp, tb, tp, op, bucketDuration], [1478088000, null, null, 32115296, 34291, 2956805, 25705, 0, 3600],\n * [1478091600, null, null, 2714683, 11821, 1420564, 12650, 0, 3600], [1478095200, null, null, 10079213, 19962, 2487705, 20015, 0, 3600],\n * [1478098800, null, null, 4444433, 10227, 1430356, 10493, 0, 3600]]\n * - cpuinfo: [[user, kernel], [0.9, 1.3]]\n */\ncommands.mobileGetPerformanceData = async function mobileGetPerformanceData (opts = {}) {\n const { packageName, dataType } = requireArgs(['packageName', 'dataType'], opts);\n return await this.getPerformanceData(packageName, dataType);\n};\n\nexport {\n commands, SUPPORTED_PERFORMANCE_DATA_TYPES, CPU_KEYS, MEMORY_KEYS,\n BATTERY_KEYS, NETWORK_KEYS, getMemoryInfo, getNetworkTrafficInfo,\n getCPUInfo, getBatteryInfo,\n};\nexport default commands;\n"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAEA,MAAMG,QAAQ,GAAG,CAAC,CAAC;AAACC,OAAA,CAAAD,QAAA,GAAAA,QAAA;AAEpB,MAAME,YAAY,GAAG,CACnB,CAAC,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAAC,EAC7G,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CACrE;AAACD,OAAA,CAAAC,YAAA,GAAAA,YAAA;AACF,MAAMC,QAAQ,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;AAACF,OAAA,CAAAE,QAAA,GAAAA,QAAA;AACpC,MAAMC,YAAY,GAAG,CAAC,OAAO,CAAC;AAACH,OAAA,CAAAG,YAAA,GAAAA,YAAA;AAC/B,MAAMC,WAAW,GAAG,CAClB,mBAAmB,EAAE,oBAAoB,EAAE,oBAAoB,EAC/D,iBAAiB,EAAE,gBAAgB,EACnC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EACvD,yBAAyB,EAAE,gBAAgB,EAC3C,WAAW,EAAE,WAAW,EAAE,UAAU,CACrC;AAACJ,OAAA,CAAAI,WAAA,GAAAA,WAAA;AACF,MAAMC,gCAAgC,GAAGC,MAAM,CAACC,MAAM,CAAC;EACrDC,OAAO,EAAE,gHAAgH;EACzHC,UAAU,EAAE,+GAA+G;EAC3HC,WAAW,EAAE,yGAAyG;EACtHC,WAAW,EAAE;AACf,CAAC,CAAC;AAACX,OAAA,CAAAK,gCAAA,GAAAA,gCAAA;AACH,MAAMO,cAAc,GAAGN,MAAM,CAACC,MAAM,CAAC;EACnCM,MAAM,EAAE,QAAQ;EAChBC,MAAM,EAAE,QAAQ;EAChBC,GAAG,EAAE,KAAK;EACVC,EAAE,EAAE,IAAI;EACRC,MAAM,EAAE,QAAQ;EAChBC,KAAK,EAAE,OAAO;EACdC,IAAI,EAAE;AACR,CAAC,CAAC;AACF,MAAMC,cAAc,GAAG,IAAI;AAQ3B,SAASC,wBAAwBA,CAAEC,OAAO,EAAEC,OAAO,EAAE;EACnD,MAAM,CAACC,IAAI,EAAEC,OAAO,CAAC,GAAGH,OAAO;EAC/B,IAAIE,IAAI,KAAKZ,cAAc,CAACC,MAAM,IAAIY,OAAO,KAAKb,cAAc,CAACO,IAAI,EAAE;IACrE,IAAII,OAAO,CAACG,SAAS,EAAEH,OAAO,CAACI,kBAAkB,IAAIJ,OAAO,CAACK,cAAc,EAAEL,OAAO,CAACM,uBAAuB,CAAC,GAAGP,OAAO;EACzH,CAAC,MAAM,IAAIE,IAAI,KAAKZ,cAAc,CAACE,MAAM,IAAIW,OAAO,KAAKb,cAAc,CAACO,IAAI,EAAE;IAC5E,IAAII,OAAO,CAACO,SAAS,EAAEP,OAAO,CAACQ,kBAAkB,CAAC,GAAGT,OAAO;EAC9D,CAAC,MAAM,IAAIE,IAAI,KAAKZ,cAAc,CAACG,GAAG,IAAIU,OAAO,KAAKb,cAAc,CAACK,MAAM,EAAE;IAC3E,IAAIM,OAAO,CAACS,MAAM,EAAET,OAAO,CAACU,eAAe,CAAC,GAAGX,OAAO;EACxD,CAAC,MAAM,IAAIE,IAAI,KAAKZ,cAAc,CAACI,EAAE,IAAIS,OAAO,KAAKb,cAAc,CAACK,MAAM,EAAE;IAC1E,IAAIM,OAAO,CAACW,KAAK,EAAEX,OAAO,CAACY,cAAc,CAAC,GAAGb,OAAO;EACtD,CAAC,MAAM,IAAIE,IAAI,KAAKZ,cAAc,CAACM,KAAK,IAAII,OAAO,CAACc,MAAM,KAAK,CAAC,EAAE;IAEhE,GAAGb,OAAO,CAACc,QAAQ,EAAEd,OAAO,CAACe,iBAAiB,CAAC,GAAGhB,OAAO;EAC3D;AACF;AAMA,SAASiB,yBAAyBA,CAAEjB,OAAO,EAAEC,OAAO,EAAE;EACpD,MAAMC,IAAI,GAAGF,OAAO,CAAC,CAAC,CAAC;EACvB,IAAIE,IAAI,KAAKZ,cAAc,CAACC,MAAM,EAAE;IAClC,GAAGU,OAAO,CAACG,SAAS,GAAGH,OAAO,CAACI,kBAAkB,EAAEJ,OAAO,CAACK,cAAc,EAAEL,OAAO,CAACM,uBAAuB,CAAC,GAAGP,OAAO;EACvH,CAAC,MAAM,IAAIE,IAAI,KAAKZ,cAAc,CAACE,MAAM,EAAE;IACzC,GAAGS,OAAO,CAACO,SAAS,GAAGP,OAAO,CAACQ,kBAAkB,CAAC,GAAGT,OAAO;EAC9D,CAAC,MAAM,IAAIE,IAAI,KAAKZ,cAAc,CAACG,GAAG,EAAE;IACtC,GAAGQ,OAAO,CAACS,MAAM,GAAGT,OAAO,CAACU,eAAe,CAAC,GAAGX,OAAO;EACxD,CAAC,MAAM,IAAIE,IAAI,KAAKZ,cAAc,CAACI,EAAE,EAAE;IACrC,GAAGO,OAAO,CAACW,KAAK,GAAGX,OAAO,CAACY,cAAc,CAAC,GAAGb,OAAO;EACtD,CAAC,MAAM,IAAIE,IAAI,KAAKZ,cAAc,CAACM,KAAK,EAAE;IACxC,GAAGK,OAAO,CAACc,QAAQ,GAAGd,OAAO,CAACe,iBAAiB,CAAC,GAAGhB,OAAO;EAC5D;AACF;AAOA,SAASkB,yBAAyBA,CAAElB,OAAO,EAAEC,OAAO,EAAE;EACpD,MAAM,CAACC,IAAI,EAAEC,OAAO,CAAC,GAAGH,OAAO;EAC/B,IAAIE,IAAI,KAAKZ,cAAc,CAACC,MAAM,IAAIY,OAAO,KAAKb,cAAc,CAACO,IAAI,EAAE;IACrE,IAAII,OAAO,CAACG,SAAS,EAAEH,OAAO,CAACI,kBAAkB,IAAIJ,OAAO,CAACkB,SAAS,EAAElB,OAAO,CAACK,cAAc,EAAEL,OAAO,CAACM,uBAAuB,CAAC,GAAGP,OAAO;EAC5I,CAAC,MAAM,IAAIE,IAAI,KAAKZ,cAAc,CAACE,MAAM,IAAIW,OAAO,KAAKb,cAAc,CAACO,IAAI,EAAE;IAC5E,IAAII,OAAO,CAACO,SAAS,EAAEP,OAAO,CAACQ,kBAAkB,IAAIR,OAAO,CAACmB,SAAS,CAAC,GAAGpB,OAAO;EACnF,CAAC,MAAM,IAAIE,IAAI,KAAKZ,cAAc,CAACG,GAAG,IAAIU,OAAO,KAAKb,cAAc,CAACK,MAAM,EAAE;IAC3E,IAAIM,OAAO,CAACS,MAAM,EAAET,OAAO,CAACU,eAAe,CAAC,GAAGX,OAAO;EACxD,CAAC,MAAM,IAAIE,IAAI,KAAKZ,cAAc,CAACI,EAAE,IAAIS,OAAO,KAAKb,cAAc,CAACK,MAAM,EAAE;IAC1E,IAAIM,OAAO,CAACW,KAAK,EAAEX,OAAO,CAACY,cAAc,CAAC,GAAGb,OAAO;EACtD,CAAC,MAAM,IAAIE,IAAI,KAAKZ,cAAc,CAACM,KAAK,IAAII,OAAO,CAACc,MAAM,KAAK,CAAC,EAAE;IAEhE,GAAGb,OAAO,CAACc,QAAQ,EAAEd,OAAO,CAACe,iBAAiB,IAAIf,OAAO,CAACoB,QAAQ,CAAC,GAAGrB,OAAO;EAC/E;AACF;AAEA,eAAesB,aAAaA,CAAEC,WAAW,EAAEC,OAAO,GAAG,CAAC,EAAE;EACtD,OAAO,MAAM,IAAAC,uBAAa,EAACD,OAAO,EAAE1B,cAAc,EAAE,YAAY;IAC9D,MAAM4B,GAAG,GAAG,CACV,SAAS,EAAE,SAAS,EAAG,IAAGH,WAAY,GAAE,EACxC,GAAG,EAAE,MAAM,EAAE,IAAI,EAChB,IAAGjC,cAAc,CAACC,MAAO,IAAGD,cAAc,CAACE,MAAO,IAAGF,cAAc,CAACG,GAAI,EAAC,GACzE,IAAGH,cAAc,CAACI,EAAG,IAAGJ,cAAc,CAACM,KAAM,GAAE,CACjD;IACD,MAAM+B,IAAI,GAAG,MAAM,IAAI,CAACC,GAAG,CAACC,KAAK,CAACH,GAAG,CAAC;IACtC,IAAI,CAACC,IAAI,EAAE;MACT,MAAM,IAAIG,KAAK,CAAC,sBAAsB,CAAC;IACzC;IACA,MAAM7B,OAAO,GAAG;MAACe,iBAAiB,EAAE;IAAE,CAAC;IACvC,MAAMe,QAAQ,GAAG,MAAM,IAAI,CAACH,GAAG,CAACI,WAAW,CAAC,CAAC;IAC7C,KAAK,MAAMC,IAAI,IAAIN,IAAI,CAACO,KAAK,CAAC,IAAI,CAAC,EAAE;MACnC,MAAMlC,OAAO,GAAGiC,IAAI,CAACE,IAAI,CAAC,CAAC,CAACD,KAAK,CAAC,KAAK,CAAC,CAACE,MAAM,CAACC,OAAO,CAAC;MACxD,IAAIN,QAAQ,IAAI,EAAE,EAAE;QAClBb,yBAAyB,CAAClB,OAAO,EAAEC,OAAO,CAAC;MAC7C,CAAC,MAAM,IAAI8B,QAAQ,GAAG,EAAE,IAAIA,QAAQ,GAAG,EAAE,EAAE;QACzChC,wBAAwB,CAACC,OAAO,EAAEC,OAAO,CAAC;MAC5C,CAAC,MAAM;QACLgB,yBAAyB,CAACjB,OAAO,EAAEC,OAAO,CAAC;MAC7C;IACF;IACA,IAAIA,OAAO,CAACe,iBAAiB,IAAIf,OAAO,CAACe,iBAAiB,KAAK,OAAO,EAAE;MACtE,MAAMsB,OAAO,GAAGC,eAAC,CAACC,KAAK,CAAC1D,WAAW,CAAC;MACpC,MAAM2D,MAAM,GAAGH,OAAO,CAACI,GAAG,CAAEC,MAAM,IAAK1C,OAAO,CAAC0C,MAAM,CAAC,CAAC;MACvD,OAAO,CAACL,OAAO,EAAEG,MAAM,CAAC;IAC1B;IAEA,MAAM,IAAIX,KAAK,CAAE,iCAAgCH,IAAK,GAAE,CAAC;EAC3D,CAAC,CAAC;AACJ;AAAC;AAMD,eAAeiB,qBAAqBA,CAAEpB,OAAO,GAAG,CAAC,EAAE;EACjD,OAAO,MAAM,IAAAC,uBAAa,EAACD,OAAO,EAAE1B,cAAc,EAAE,YAAY;IAC9D,IAAI+C,WAAW,GAAG,EAAE;IACpB,IAAIC,cAAc,EAAEC,WAAW,EAAEC,UAAU,EAAEC,OAAO,EAAEC,SAAS,EAAEC,OAAO,EAAEC,SAAS,EAAEC,UAAU;IAE/F,IAAI3B,GAAG,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC;IACjC,IAAIC,IAAI,GAAG,MAAM,IAAI,CAACC,GAAG,CAACC,KAAK,CAACH,GAAG,CAAC;IACpC,IAAI,CAACC,IAAI,EAAE,MAAM,IAAIG,KAAK,CAAC,sBAAsB,CAAC;IAgClD,IAAIwB,KAAK,GAAG,CAAC;IACb,IAAIC,WAAW,GAAG5B,IAAI,CAAC6B,OAAO,CAAC,WAAW,CAAC;IAE3C,IAAIC,KAAK,GAAG9B,IAAI,CAAC6B,OAAO,CAAC,gBAAgB,EAAED,WAAW,CAAC;IACvD,IAAIG,SAAS,GAAG/B,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEC,KAAK,GAAG,CAAC,CAAC;IAC5C,IAAIE,GAAG,GAAGhC,IAAI,CAAC6B,OAAO,CAAC,IAAI,EAAEE,SAAS,GAAG,CAAC,CAAC;IAC3C,IAAIE,YAAY,GAAGjC,IAAI,CAACkC,SAAS,CAACH,SAAS,GAAG,CAAC,EAAEC,GAAG,CAAC,CAACxB,IAAI,CAAC,CAAC;IAE5D,IAAIwB,GAAG,GAAGD,SAAS,EAAE;MACnBD,KAAK,GAAG9B,IAAI,CAAC6B,OAAO,CAAC,gBAAgB,EAAEG,GAAG,GAAG,CAAC,CAAC;MAC/CD,SAAS,GAAG/B,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEC,KAAK,GAAG,CAAC,CAAC;MACxCE,GAAG,GAAGhC,IAAI,CAAC6B,OAAO,CAAC,IAAI,EAAEE,SAAS,GAAG,CAAC,CAAC;MACvCZ,cAAc,GAAGnB,IAAI,CAACkC,SAAS,CAACH,SAAS,GAAG,CAAC,EAAEC,GAAG,CAAC,CAACxB,IAAI,CAAC,CAAC;IAC5D;IAEA,IAAIsB,KAAK,IAAI,CAAC,EAAE;MACd9B,IAAI,GAAGA,IAAI,CAACkC,SAAS,CAACF,GAAG,GAAG,CAAC,EAAEhC,IAAI,CAACb,MAAM,CAAC;MAC3C,IAAIgD,SAAS,GAAGnC,IAAI,CAACO,KAAK,CAAC,IAAI,CAAC;MAEhC,IAAI4B,SAAS,CAAChD,MAAM,GAAG,CAAC,EAAE;QACxB2C,KAAK,GAAG,CAAC,CAAC;QAEV,KAAK,IAAIM,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGpF,YAAY,CAACmC,MAAM,EAAE,EAAEiD,CAAC,EAAE;UAC5CN,KAAK,GAAGK,SAAS,CAAC,CAAC,CAAC,CAACN,OAAO,CAAC7E,YAAY,CAACoF,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;UAEhD,IAAIN,KAAK,IAAI,CAAC,EAAE;YACdH,KAAK,GAAGS,CAAC;YACTlB,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE;YAEnB,KAAK,IAAImB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGrF,YAAY,CAACoF,CAAC,CAAC,CAACjD,MAAM,EAAE,EAAEkD,CAAC,EAAE;cAC/CnB,WAAW,CAAC,CAAC,CAAC,CAACmB,CAAC,CAAC,GAAGrF,YAAY,CAACoF,CAAC,CAAC,CAACC,CAAC,CAAC;YACxC;YACA;UACF;QACF;QAEA,IAAIC,WAAW,GAAG,CAAC;QACnB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,SAAS,CAAChD,MAAM,EAAEoD,CAAC,EAAE,EAAE;UACzCvC,IAAI,GAAGmC,SAAS,CAACI,CAAC,CAAC;UACnBT,KAAK,GAAG9B,IAAI,CAAC6B,OAAO,CAAC7E,YAAY,CAAC2E,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;UAE5C,IAAIG,KAAK,IAAI,CAAC,EAAE;YACdC,SAAS,GAAG/B,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEC,KAAK,GAAG,CAAC,CAAC;YACxCE,GAAG,GAAGhC,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEE,SAAS,GAAG,CAAC,CAAC;YACtCX,WAAW,GAAGpB,IAAI,CAACkC,SAAS,CAACH,SAAS,GAAG,CAAC,EAAEC,GAAG,CAAC,CAACxB,IAAI,CAAC,CAAC;YAEvD,IAAIwB,GAAG,GAAGD,SAAS,EAAE;cACnBD,KAAK,GAAG9B,IAAI,CAAC6B,OAAO,CAAC7E,YAAY,CAAC2E,KAAK,CAAC,CAAC,CAAC,CAAC,EAAEK,GAAG,GAAG,CAAC,CAAC;cACrD,IAAIF,KAAK,IAAI,CAAC,EAAE;gBACdC,SAAS,GAAG/B,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEC,KAAK,GAAG,CAAC,CAAC;gBACxCE,GAAG,GAAGhC,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEE,SAAS,GAAG,CAAC,CAAC;gBACtCV,UAAU,GAAGrB,IAAI,CAACkC,SAAS,CAACH,SAAS,GAAG,CAAC,EAAEC,GAAG,CAAC,CAACxB,IAAI,CAAC,CAAC;cACxD;YACF;YAEA,IAAIwB,GAAG,GAAGD,SAAS,EAAE;cACnBD,KAAK,GAAG9B,IAAI,CAAC6B,OAAO,CAAC7E,YAAY,CAAC2E,KAAK,CAAC,CAAC,CAAC,CAAC,EAAEK,GAAG,GAAG,CAAC,CAAC;cACrD,IAAIF,KAAK,IAAI,CAAC,EAAE;gBACdC,SAAS,GAAG/B,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEC,KAAK,GAAG,CAAC,CAAC;gBACxCE,GAAG,GAAGhC,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEE,SAAS,GAAG,CAAC,CAAC;gBACtCT,OAAO,GAAGtB,IAAI,CAACkC,SAAS,CAACH,SAAS,GAAG,CAAC,EAAEC,GAAG,CAAC,CAACxB,IAAI,CAAC,CAAC;cACrD;YACF;YAEA,IAAIwB,GAAG,GAAGD,SAAS,EAAE;cACnBD,KAAK,GAAG9B,IAAI,CAAC6B,OAAO,CAAC7E,YAAY,CAAC2E,KAAK,CAAC,CAAC,CAAC,CAAC,EAAEK,GAAG,GAAG,CAAC,CAAC;cACrD,IAAIF,KAAK,IAAI,CAAC,EAAE;gBACdC,SAAS,GAAG/B,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEC,KAAK,GAAG,CAAC,CAAC;gBACxCE,GAAG,GAAGhC,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEE,SAAS,GAAG,CAAC,CAAC;gBACtCR,SAAS,GAAGvB,IAAI,CAACkC,SAAS,CAACH,SAAS,GAAG,CAAC,EAAEC,GAAG,CAAC,CAACxB,IAAI,CAAC,CAAC;cACvD;YACF;YAEA,IAAIwB,GAAG,GAAGD,SAAS,EAAE;cACnBD,KAAK,GAAG9B,IAAI,CAAC6B,OAAO,CAAC7E,YAAY,CAAC2E,KAAK,CAAC,CAAC,CAAC,CAAC,EAAEK,GAAG,GAAG,CAAC,CAAC;cACrD,IAAIF,KAAK,IAAI,CAAC,EAAE;gBACdC,SAAS,GAAG/B,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEC,KAAK,GAAG,CAAC,CAAC;gBACxCE,GAAG,GAAGhC,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEE,SAAS,GAAG,CAAC,CAAC;gBACtCP,OAAO,GAAGxB,IAAI,CAACkC,SAAS,CAACH,SAAS,GAAG,CAAC,EAAEC,GAAG,CAAC,CAACxB,IAAI,CAAC,CAAC;cACrD;YACF;YAEA,IAAIwB,GAAG,GAAGD,SAAS,EAAE;cACnBD,KAAK,GAAG9B,IAAI,CAAC6B,OAAO,CAAC7E,YAAY,CAAC2E,KAAK,CAAC,CAAC,CAAC,CAAC,EAAEK,GAAG,GAAG,CAAC,CAAC;cACrD,IAAIF,KAAK,IAAI,CAAC,EAAE;gBACdC,SAAS,GAAG/B,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEC,KAAK,GAAG,CAAC,CAAC;gBACxCE,GAAG,GAAGhC,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEE,SAAS,GAAG,CAAC,CAAC;gBACtCN,SAAS,GAAGzB,IAAI,CAACkC,SAAS,CAACH,SAAS,GAAG,CAAC,EAAEC,GAAG,CAAC,CAACxB,IAAI,CAAC,CAAC;cACvD;YACF;YAEA,IAAIwB,GAAG,GAAGD,SAAS,EAAE;cACnBD,KAAK,GAAG9B,IAAI,CAAC6B,OAAO,CAAC7E,YAAY,CAAC2E,KAAK,CAAC,CAAC,CAAC,CAAC,EAAEK,GAAG,GAAG,CAAC,CAAC;cACrD,IAAIF,KAAK,IAAI,CAAC,EAAE;gBACdC,SAAS,GAAG/B,IAAI,CAAC6B,OAAO,CAAC,GAAG,EAAEC,KAAK,GAAG,CAAC,CAAC;gBACxCE,GAAG,GAAGhC,IAAI,CAACb,MAAM;gBACjBuC,UAAU,GAAG1B,IAAI,CAACkC,SAAS,CAACH,SAAS,GAAG,CAAC,EAAEC,GAAG,CAAC,CAACxB,IAAI,CAAC,CAAC;cAExD;YACF;YACAU,WAAW,CAACoB,WAAW,EAAE,CAAC,GAAG,CAAClB,WAAW,EAAEC,UAAU,EAAEC,OAAO,EAAEC,SAAS,EAAEC,OAAO,EAAEC,SAAS,EAAEC,UAAU,EAAEP,cAAc,CAAC;UAC5H;QACF;MACF;IACF;IAEA,IAAI,CAACP,eAAC,CAAC4B,OAAO,CAACP,YAAY,EAAE,EAAE,CAAC,IAAI,CAACrB,eAAC,CAAC6B,WAAW,CAACR,YAAY,CAAC,IAAI,CAACrB,eAAC,CAAC4B,OAAO,CAACP,YAAY,EAAE,OAAO,CAAC,EAAE;MACrG,OAAOf,WAAW;IACpB,CAAC,MAAM;MACL,MAAM,IAAIf,KAAK,CAAE,0CAAyCH,IAAK,GAAE,CAAC;IACpE;EACF,CAAC,CAAC;AACJ;AAoBA,eAAe0C,UAAUA,CAAE9C,WAAW,EAAEC,OAAO,GAAG,CAAC,EAAE;EAMnD,OAAO,MAAM,IAAAC,uBAAa,EAACD,OAAO,EAAE1B,cAAc,EAAE,YAAY;IAC9D,IAAIwE,MAAM;IACV,IAAI;MACFA,MAAM,GAAG,MAAM,IAAI,CAAC1C,GAAG,CAACC,KAAK,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,OAAO0C,CAAC,EAAE;MACV,IAAIA,CAAC,CAACC,MAAM,EAAE;QACZ,IAAI,CAACC,GAAG,CAACC,IAAI,CAACH,CAAC,CAACC,MAAM,CAAC;MACzB;MACA,MAAMD,CAAC;IACT;IAGA,MAAMI,aAAa,GACjB,IAAIC,MAAM,CAAE,SAAQrC,eAAC,CAACsC,YAAY,CAACtD,WAAW,CAAE,wDAAuD,EAAE,GAAG,CAAC;IAC/G,MAAMuD,KAAK,GAAGH,aAAa,CAACI,IAAI,CAACT,MAAM,CAAC;IACxC,IAAI,CAACQ,KAAK,EAAE;MACV,IAAI,CAACL,GAAG,CAACO,KAAK,CAACV,MAAM,CAAC;MACtB,MAAM,IAAIxC,KAAK,CAAE,uCAAsCP,WAAY,0CAAyC,CAAC;IAC/G;IACA,OAAO,CAAC3C,QAAQ,EAAE,CAACkG,KAAK,CAAC,CAAC,CAAC,EAAEA,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;EACzC,CAAC,CAAC;AACJ;AAMA,eAAeG,cAAcA,CAAEzD,OAAO,GAAG,CAAC,EAAE;EAC1C,OAAO,MAAM,IAAAC,uBAAa,EAACD,OAAO,EAAE1B,cAAc,EAAE,YAAY;IAC9D,IAAI4B,GAAG,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC;IACtD,IAAIC,IAAI,GAAG,MAAM,IAAI,CAACC,GAAG,CAACC,KAAK,CAACH,GAAG,CAAC;IACpC,IAAI,CAACC,IAAI,EAAE,MAAM,IAAIG,KAAK,CAAC,sBAAsB,CAAC;IAElD,IAAIoD,KAAK,GAAGC,QAAQ,CAAC,CAACxD,IAAI,CAACO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAEC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;IAE3D,IAAI,CAACiD,MAAM,CAACC,KAAK,CAACH,KAAK,CAAC,EAAE;MACxB,OAAO,CAAC3C,eAAC,CAACC,KAAK,CAAC3D,YAAY,CAAC,EAAE,CAACqG,KAAK,CAACI,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,MAAM;MACL,MAAM,IAAIxD,KAAK,CAAE,kCAAiCH,IAAK,GAAE,CAAC;IAC5D;EACF,CAAC,CAAC;AACJ;AAOAlD,QAAQ,CAAC8G,uBAAuB,GAAG,SAASA,uBAAuBA,CAAA,EAAI;EACrE,OAAOhD,eAAC,CAACiD,IAAI,CAACzG,gCAAgC,CAAC;AACjD,CAAC;AAmBDN,QAAQ,CAACgH,kBAAkB,GAAG,eAAeA,kBAAkBA,CAAElE,WAAW,EAAEmE,QAAQ,EAAElE,OAAO,GAAG,CAAC,EAAE;EACnG,QAAQe,eAAC,CAACoD,OAAO,CAACD,QAAQ,CAAC;IACzB,KAAK,aAAa;MAChB,OAAO,MAAMT,cAAc,CAACW,IAAI,CAAC,IAAI,CAAC,CAACpE,OAAO,CAAC;IACjD,KAAK,SAAS;MACZ,OAAO,MAAM6C,UAAU,CAACuB,IAAI,CAAC,IAAI,CAAC,CAACrE,WAAW,EAAEC,OAAO,CAAC;IAC1D,KAAK,YAAY;MACf,OAAO,MAAMF,aAAa,CAACsE,IAAI,CAAC,IAAI,CAAC,CAACrE,WAAW,EAAEC,OAAO,CAAC;IAC7D,KAAK,aAAa;MAChB,OAAO,MAAMoB,qBAAqB,CAACgD,IAAI,CAAC,IAAI,CAAC,CAACpE,OAAO,CAAC;IACxD;MACE,MAAM,IAAIM,KAAK,CAAE,gCAA+B4D,QAAS,WAAU,GAChE,4CAA2CG,IAAI,CAACC,SAAS,CAAC/G,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAE,EAAC,CAAC;EAC7G;AACF,CAAC;AA6BDN,QAAQ,CAACsH,wBAAwB,GAAG,eAAeA,wBAAwBA,CAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EACtF,MAAM;IAAEzE,WAAW;IAAEmE;EAAS,CAAC,GAAG,IAAAO,kBAAW,EAAC,CAAC,aAAa,EAAE,UAAU,CAAC,EAAED,IAAI,CAAC;EAChF,OAAO,MAAM,IAAI,CAACP,kBAAkB,CAAClE,WAAW,EAAEmE,QAAQ,CAAC;AAC7D,CAAC;AAAC,IAAAQ,QAAA,GAOazH,QAAQ;AAAAC,OAAA,CAAAyH,OAAA,GAAAD,QAAA"}
@@ -1,7 +1,8 @@
1
1
  import _ from 'lodash';
2
2
  import { retryInterval } from 'asyncbox';
3
+ import { requireArgs } from '../utils';
3
4
 
4
- const commands = {}, helpers = {}, extensions = {};
5
+ const commands = {};
5
6
 
6
7
  const NETWORK_KEYS = [
7
8
  ['bucketStart', 'activeTime', 'rxBytes', 'rxPackets', 'txBytes', 'txPackets', 'operations', 'bucketDuration'],
@@ -95,111 +96,7 @@ function parseMeminfoForApiAbove29 (entries, valDict) {
95
96
  }
96
97
  }
97
98
 
98
- //
99
- // returns the information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.
100
- // output - array like below
101
- // [cpuinfo, batteryinfo, networkinfo, memoryinfo]
102
- //
103
- commands.getPerformanceDataTypes = function getPerformanceDataTypes () {
104
- return _.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);
105
- };
106
-
107
- /**
108
- * @returns The information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.
109
- * input - (packageName) the package name of the application
110
- * (dataType) the type of system state which wants to read. It should be one of the keys of the SUPPORTED_PERFORMANCE_DATA_TYPES
111
- * (dataReadTimeout) the number of attempts to read
112
- * output - table of the performance data, The first line of the table represents the type of data. The remaining lines represent the values of the data.
113
- *
114
- * in case of battery info : [[power], [23]]
115
- * in case of memory info : [[totalPrivateDirty, nativePrivateDirty, dalvikPrivateDirty, eglPrivateDirty, glPrivateDirty, totalPss,
116
- * nativePss, dalvikPss, eglPss, glPss, nativeHeapAllocatedSize, nativeHeapSize], [18360, 8296, 6132, null, null, 42588, 8406, 7024, null, null, 26519, 10344]]
117
- * in case of network info : [[bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration,],
118
- * [1478091600000, null, 1099075, 610947, 928, 114362, 769, 0, 3600000], [1478095200000, null, 1306300, 405997, 509, 46359, 370, 0, 3600000]]
119
- * in case of network info : [[st, activeTime, rb, rp, tb, tp, op, bucketDuration], [1478088000, null, null, 32115296, 34291, 2956805, 25705, 0, 3600],
120
- * [1478091600, null, null, 2714683, 11821, 1420564, 12650, 0, 3600], [1478095200, null, null, 10079213, 19962, 2487705, 20015, 0, 3600],
121
- * [1478098800, null, null, 4444433, 10227, 1430356, 10493, 0, 3600]]
122
- * in case of cpu info : [[user, kernel], [0.9, 1.3]]
123
- */
124
- commands.getPerformanceData = async function getPerformanceData (packageName, dataType, retries = 2) {
125
- switch (_.toLower(dataType)) {
126
- case 'batteryinfo':
127
- return await this.getBatteryInfo(retries);
128
- case 'cpuinfo':
129
- return await this.getCPUInfo(packageName, retries);
130
- case 'memoryinfo':
131
- return await this.getMemoryInfo(packageName, retries);
132
- case 'networkinfo':
133
- return await this.getNetworkTrafficInfo(retries);
134
- default:
135
- throw new Error(`No performance data of type '${dataType}' found. ` +
136
- `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);
137
- }
138
- };
139
-
140
- /**
141
- * Return the CPU information related to the given packageName.
142
- * It raises an exception if the dumped CPU information did not include the given packageName
143
- * or the format was wrong.
144
- * The CPU information's sampling interval depends on the device under test.
145
- * For example, some devices have 5 minutes interval. When you get the information
146
- * from 2023-02-07 11:59:40.468 to 2023-02-07 12:04:40.556, then the next will be
147
- * from 2023-02-07 12:04:40.556 to 2023-02-07 12:09:40.668. No process information
148
- * exists in the result if the process was not running during the period.
149
- *
150
- * @param {string} packageName The package name to get the CPU information.
151
- * @param {number} retries The number of retry count.
152
- * @returns {Array} The array of the parsed CPU upsage percentages.
153
- * e.g. ['cpuinfo', ['14.3', '28.2']]
154
- * '14.3' is usage by the user (%), '28.2' is usage by the kernel (%)
155
- * @throw {Error} If it failed to parse the result of dumpsys, or no package name exists.
156
- */
157
- helpers.getCPUInfo = async function getCPUInfo (packageName, retries = 2) {
158
- // TODO: figure out why this is
159
- // sometimes, the function of 'adb.shell' fails. when I tested this function on the target of 'Galaxy Note5',
160
- // adb.shell(dumpsys cpuinfo) returns cpu datas for other application packages, but I can't find the data for packageName.
161
- // It usually fails 30 times and success for the next time,
162
- // Since then, he has continued to succeed.
163
- return await retryInterval(retries, RETRY_PAUSE_MS, async () => {
164
- let output;
165
- try {
166
- output = await this.adb.shell(['dumpsys', 'cpuinfo']);
167
- } catch (e) {
168
- if (e.stderr) {
169
- this.log.info(e.stderr);
170
- }
171
- throw e;
172
- }
173
- // `output` will be something like
174
- // +0% 2209/io.appium.android.apis: 0.1% user + 0.2% kernel / faults: 70 minor
175
- const usagesPattern =
176
- new RegExp(`^.+\\/${_.escapeRegExp(packageName)}:\\D+([\\d.]+)%\\s+user\\s+\\+\\s+([\\d.]+)%\\s+kernel`, 'm');
177
- const match = usagesPattern.exec(output);
178
- if (!match) {
179
- this.log.debug(output);
180
- throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);
181
- }
182
- return [CPU_KEYS, [match[1], match[2]]];
183
- });
184
- };
185
-
186
- helpers.getBatteryInfo = async function getBatteryInfo (retries = 2) {
187
- return await retryInterval(retries, RETRY_PAUSE_MS, async () => {
188
- let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];
189
- let data = await this.adb.shell(cmd);
190
- if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly
191
-
192
- let power = parseInt((data.split(':')[1] || '').trim(), 10);
193
-
194
- if (!Number.isNaN(power)) {
195
- return [_.clone(BATTERY_KEYS), [power.toString()]];
196
- } else {
197
- throw new Error(`Unable to parse battery data: '${data}'`);
198
- }
199
- });
200
- };
201
-
202
- helpers.getMemoryInfo = async function getMemoryInfo (packageName, retries = 2) {
99
+ async function getMemoryInfo (packageName, retries = 2) {
203
100
  return await retryInterval(retries, RETRY_PAUSE_MS, async () => {
204
101
  const cmd = [
205
102
  'dumpsys', 'meminfo', `'${packageName}'`,
@@ -233,7 +130,11 @@ helpers.getMemoryInfo = async function getMemoryInfo (packageName, retries = 2)
233
130
  });
234
131
  };
235
132
 
236
- helpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo (retries = 2) {
133
+ /**
134
+ * @this {AndroidDriver}
135
+ * @param {number} retries
136
+ */
137
+ async function getNetworkTrafficInfo (retries = 2) {
237
138
  return await retryInterval(retries, RETRY_PAUSE_MS, async () => {
238
139
  let returnValue = [];
239
140
  let bucketDuration, bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations;
@@ -384,12 +285,152 @@ helpers.getNetworkTrafficInfo = async function getNetworkTrafficInfo (retries =
384
285
  throw new Error(`Unable to parse network traffic data: '${data}'`);
385
286
  }
386
287
  });
288
+ }
289
+
290
+ /**
291
+ * Return the CPU information related to the given packageName.
292
+ * It raises an exception if the dumped CPU information did not include the given packageName
293
+ * or the format was wrong.
294
+ * The CPU information's sampling interval depends on the device under test.
295
+ * For example, some devices have 5 minutes interval. When you get the information
296
+ * from 2023-02-07 11:59:40.468 to 2023-02-07 12:04:40.556, then the next will be
297
+ * from 2023-02-07 12:04:40.556 to 2023-02-07 12:09:40.668. No process information
298
+ * exists in the result if the process was not running during the period.
299
+ *
300
+ * @this {AndroidDriver}
301
+ * @param {string} packageName The package name to get the CPU information.
302
+ * @param {number} retries The number of retry count.
303
+ * @returns {Array} The array of the parsed CPU upsage percentages.
304
+ * e.g. ['cpuinfo', ['14.3', '28.2']]
305
+ * '14.3' is usage by the user (%), '28.2' is usage by the kernel (%)
306
+ * @throw {Error} If it failed to parse the result of dumpsys, or no package name exists.
307
+ */
308
+ async function getCPUInfo (packageName, retries = 2) {
309
+ // TODO: figure out why this is
310
+ // sometimes, the function of 'adb.shell' fails. when I tested this function on the target of 'Galaxy Note5',
311
+ // adb.shell(dumpsys cpuinfo) returns cpu datas for other application packages, but I can't find the data for packageName.
312
+ // It usually fails 30 times and success for the next time,
313
+ // Since then, he has continued to succeed.
314
+ return await retryInterval(retries, RETRY_PAUSE_MS, async () => {
315
+ let output;
316
+ try {
317
+ output = await this.adb.shell(['dumpsys', 'cpuinfo']);
318
+ } catch (e) {
319
+ if (e.stderr) {
320
+ this.log.info(e.stderr);
321
+ }
322
+ throw e;
323
+ }
324
+ // `output` will be something like
325
+ // +0% 2209/io.appium.android.apis: 0.1% user + 0.2% kernel / faults: 70 minor
326
+ const usagesPattern =
327
+ new RegExp(`^.+\\/${_.escapeRegExp(packageName)}:\\D+([\\d.]+)%\\s+user\\s+\\+\\s+([\\d.]+)%\\s+kernel`, 'm');
328
+ const match = usagesPattern.exec(output);
329
+ if (!match) {
330
+ this.log.debug(output);
331
+ throw new Error(`Unable to parse cpu usage data for '${packageName}'. Check the server log for more details`);
332
+ }
333
+ return [CPU_KEYS, [match[1], match[2]]];
334
+ });
335
+ }
336
+
337
+ /**
338
+ * @this {AndroidDriver}
339
+ * @param {number} retries
340
+ */
341
+ async function getBatteryInfo (retries = 2) {
342
+ return await retryInterval(retries, RETRY_PAUSE_MS, async () => {
343
+ let cmd = ['dumpsys', 'battery', '|', 'grep', 'level'];
344
+ let data = await this.adb.shell(cmd);
345
+ if (!data) throw new Error('No data from dumpsys'); //eslint-disable-line curly
346
+
347
+ let power = parseInt((data.split(':')[1] || '').trim(), 10);
348
+
349
+ if (!Number.isNaN(power)) {
350
+ return [_.clone(BATTERY_KEYS), [power.toString()]];
351
+ } else {
352
+ throw new Error(`Unable to parse battery data: '${data}'`);
353
+ }
354
+ });
355
+ }
356
+
357
+ //
358
+ // returns the information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.
359
+ // output - array like below
360
+ // [cpuinfo, batteryinfo, networkinfo, memoryinfo]
361
+ //
362
+ commands.getPerformanceDataTypes = function getPerformanceDataTypes () {
363
+ return _.keys(SUPPORTED_PERFORMANCE_DATA_TYPES);
387
364
  };
388
365
 
389
- Object.assign(extensions, commands, helpers);
390
- export {
391
- commands, helpers, SUPPORTED_PERFORMANCE_DATA_TYPES, CPU_KEYS, MEMORY_KEYS,
392
- BATTERY_KEYS, NETWORK_KEYS,
366
+ /**
367
+ * @returns The information type of the system state which is supported to read as like cpu, memory, network traffic, and battery.
368
+ * input - (packageName) the package name of the application
369
+ * (dataType) the type of system state which wants to read. It should be one of the keys of the SUPPORTED_PERFORMANCE_DATA_TYPES
370
+ * (dataReadTimeout) the number of attempts to read
371
+ * output - table of the performance data, The first line of the table represents the type of data. The remaining lines represent the values of the data.
372
+ *
373
+ * in case of battery info : [[power], [23]]
374
+ * in case of memory info : [[totalPrivateDirty, nativePrivateDirty, dalvikPrivateDirty, eglPrivateDirty, glPrivateDirty, totalPss,
375
+ * nativePss, dalvikPss, eglPss, glPss, nativeHeapAllocatedSize, nativeHeapSize], [18360, 8296, 6132, null, null, 42588, 8406, 7024, null, null, 26519, 10344]]
376
+ * in case of network info : [[bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration,],
377
+ * [1478091600000, null, 1099075, 610947, 928, 114362, 769, 0, 3600000], [1478095200000, null, 1306300, 405997, 509, 46359, 370, 0, 3600000]]
378
+ * in case of network info : [[st, activeTime, rb, rp, tb, tp, op, bucketDuration], [1478088000, null, null, 32115296, 34291, 2956805, 25705, 0, 3600],
379
+ * [1478091600, null, null, 2714683, 11821, 1420564, 12650, 0, 3600], [1478095200, null, null, 10079213, 19962, 2487705, 20015, 0, 3600],
380
+ * [1478098800, null, null, 4444433, 10227, 1430356, 10493, 0, 3600]]
381
+ * in case of cpu info : [[user, kernel], [0.9, 1.3]]
382
+ */
383
+ commands.getPerformanceData = async function getPerformanceData (packageName, dataType, retries = 2) {
384
+ switch (_.toLower(dataType)) {
385
+ case 'batteryinfo':
386
+ return await getBatteryInfo.bind(this)(retries);
387
+ case 'cpuinfo':
388
+ return await getCPUInfo.bind(this)(packageName, retries);
389
+ case 'memoryinfo':
390
+ return await getMemoryInfo.bind(this)(packageName, retries);
391
+ case 'networkinfo':
392
+ return await getNetworkTrafficInfo.bind(this)(retries);
393
+ default:
394
+ throw new Error(`No performance data of type '${dataType}' found. ` +
395
+ `Only the following values are supported: ${JSON.stringify(SUPPORTED_PERFORMANCE_DATA_TYPES, ' ', 2)}`);
396
+ }
397
+ };
398
+
399
+ /**
400
+ * @typedef {Object} PerformanceDataOptions
401
+ * @property {string} packageName The name of the package identifier to fetch the data for
402
+ * @property {'batteryinfo' | 'cpuinfo' | 'memoryinfo' | 'networkinfo'} dataType One of supported subsystem
403
+ * to fetch the data for.
404
+ */
405
+
406
+ /**
407
+ * Retrieves performance data about the given Android subsystem.
408
+ * The data is parsed from the output of the dumpsys utility.
409
+ *
410
+ * @param {PerformanceDataOptions} opts
411
+ * @returns {Promise<any[][]>} The output depends on the selected subsystem.
412
+ * It is orginized into a table, where the first row represent column names
413
+ * and the following rows represent the sampled data for each column.
414
+ * Example output for different data types:
415
+ * - batteryinfo: [[power], [23]]
416
+ * - memory info: [[totalPrivateDirty, nativePrivateDirty, dalvikPrivateDirty, eglPrivateDirty, glPrivateDirty, totalPss,
417
+ * nativePss, dalvikPss, eglPss, glPss, nativeHeapAllocatedSize, nativeHeapSize], [18360, 8296, 6132, null, null, 42588, 8406, 7024, null, null, 26519, 10344]]
418
+ * - networkinfo: [[bucketStart, activeTime, rxBytes, rxPackets, txBytes, txPackets, operations, bucketDuration,],
419
+ * [1478091600000, null, 1099075, 610947, 928, 114362, 769, 0, 3600000], [1478095200000, null, 1306300, 405997, 509, 46359, 370, 0, 3600000]]
420
+ *
421
+ * [[st, activeTime, rb, rp, tb, tp, op, bucketDuration], [1478088000, null, null, 32115296, 34291, 2956805, 25705, 0, 3600],
422
+ * [1478091600, null, null, 2714683, 11821, 1420564, 12650, 0, 3600], [1478095200, null, null, 10079213, 19962, 2487705, 20015, 0, 3600],
423
+ * [1478098800, null, null, 4444433, 10227, 1430356, 10493, 0, 3600]]
424
+ * - cpuinfo: [[user, kernel], [0.9, 1.3]]
425
+ */
426
+ commands.mobileGetPerformanceData = async function mobileGetPerformanceData (opts = {}) {
427
+ const { packageName, dataType } = requireArgs(['packageName', 'dataType'], opts);
428
+ return await this.getPerformanceData(packageName, dataType);
393
429
  };
394
- export default extensions;
395
430
 
431
+ export {
432
+ commands, SUPPORTED_PERFORMANCE_DATA_TYPES, CPU_KEYS, MEMORY_KEYS,
433
+ BATTERY_KEYS, NETWORK_KEYS, getMemoryInfo, getNetworkTrafficInfo,
434
+ getCPUInfo, getBatteryInfo,
435
+ };
436
+ export default commands;
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "mobile",
10
10
  "mobile testing"
11
11
  ],
12
- "version": "5.11.2",
12
+ "version": "5.12.0",
13
13
  "author": "Appium Contributors",
14
14
  "license": "Apache-2.0",
15
15
  "repository": {