appium-xcode 4.0.2 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1 @@
1
+ ## [4.0.3](https://github.com/appium/appium-xcode/compare/v4.0.2...v4.0.3) (2022-11-06)
package/build/index.js CHANGED
@@ -4,13 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getVersion = exports.getPath = exports.getMaxTVOSSDKWithoutRetry = exports.getMaxTVOSSDK = exports.getMaxIOSSDKWithoutRetry = exports.getMaxIOSSDK = exports.getInstrumentsPath = exports.getConnectedDevices = exports.getCommandLineToolsVersion = exports.getClangVersion = exports.getAutomationTraceTemplatePathWithoutRetry = exports.getAutomationTraceTemplatePath = exports.default = exports.clearInternalCache = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  var xcode = _interopRequireWildcard(require("./lib/xcode"));
11
-
12
9
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
-
14
10
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
15
11
 
16
12
  const {
@@ -43,4 +39,4 @@ exports.getVersion = getVersion;
43
39
  exports.getPath = getPath;
44
40
  var _default = xcode;
45
41
  exports.default = _default;
46
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRQYXRoIiwiZ2V0VmVyc2lvbiIsImdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCIsImdldE1heElPU1NESyIsImdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSIsImdldE1heElPU1NES1dpdGhvdXRSZXRyeSIsImdldENvbm5lY3RlZERldmljZXMiLCJjbGVhckludGVybmFsQ2FjaGUiLCJnZXRJbnN0cnVtZW50c1BhdGgiLCJnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiIsImdldE1heFRWT1NTREsiLCJnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5IiwiZ2V0Q2xhbmdWZXJzaW9uIiwieGNvZGUiXSwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgKiBhcyB4Y29kZSBmcm9tICcuL2xpYi94Y29kZSc7XG5cblxuY29uc3Qge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufSA9IHhjb2RlO1xuXG5leHBvcnQge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufTtcbmV4cG9ydCBkZWZhdWx0IHhjb2RlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFQTs7Ozs7O0FBR0EsTUFBTTtFQUNKQSxPQURJO0VBQ0tDLFVBREw7RUFDaUJDLDhCQURqQjtFQUNpREMsWUFEakQ7RUFFSkMsMENBRkk7RUFFd0NDLHdCQUZ4QztFQUdKQyxtQkFISTtFQUdpQkMsa0JBSGpCO0VBR3FDQyxrQkFIckM7RUFJSkMsMEJBSkk7RUFJd0JDLGFBSnhCO0VBSXVDQyx5QkFKdkM7RUFLSkM7QUFMSSxJQU1GQyxLQU5KOzs7Ozs7Ozs7Ozs7OztlQWVlQSxLIn0=
42
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJnZXRQYXRoIiwiZ2V0VmVyc2lvbiIsImdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCIsImdldE1heElPU1NESyIsImdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSIsImdldE1heElPU1NES1dpdGhvdXRSZXRyeSIsImdldENvbm5lY3RlZERldmljZXMiLCJjbGVhckludGVybmFsQ2FjaGUiLCJnZXRJbnN0cnVtZW50c1BhdGgiLCJnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiIsImdldE1heFRWT1NTREsiLCJnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5IiwiZ2V0Q2xhbmdWZXJzaW9uIiwieGNvZGUiXSwic291cmNlcyI6WyIuLi9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0cmFuc3BpbGU6bWFpblxuXG5pbXBvcnQgKiBhcyB4Y29kZSBmcm9tICcuL2xpYi94Y29kZSc7XG5cblxuY29uc3Qge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufSA9IHhjb2RlO1xuXG5leHBvcnQge1xuICBnZXRQYXRoLCBnZXRWZXJzaW9uLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5LCBnZXRNYXhJT1NTREtXaXRob3V0UmV0cnksXG4gIGdldENvbm5lY3RlZERldmljZXMsIGNsZWFySW50ZXJuYWxDYWNoZSwgZ2V0SW5zdHJ1bWVudHNQYXRoLFxuICBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiwgZ2V0TWF4VFZPU1NESywgZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q2xhbmdWZXJzaW9uLFxufTtcbmV4cG9ydCBkZWZhdWx0IHhjb2RlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUE7QUFBcUM7QUFBQTs7QUFHckMsTUFBTTtFQUNKQSxPQUFPO0VBQUVDLFVBQVU7RUFBRUMsOEJBQThCO0VBQUVDLFlBQVk7RUFDakVDLDBDQUEwQztFQUFFQyx3QkFBd0I7RUFDcEVDLG1CQUFtQjtFQUFFQyxrQkFBa0I7RUFBRUMsa0JBQWtCO0VBQzNEQywwQkFBMEI7RUFBRUMsYUFBYTtFQUFFQyx5QkFBeUI7RUFDcEVDO0FBQ0YsQ0FBQyxHQUFHQyxLQUFLO0FBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxlQVNLQSxLQUFLO0FBQUEifQ==
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
@@ -17,54 +16,38 @@ exports.getMaxTVOSSDK = void 0;
17
16
  exports.getMaxTVOSSDKWithoutRetry = getMaxTVOSSDKWithoutRetry;
18
17
  exports.getPath = void 0;
19
18
  exports.getVersion = getVersion;
20
-
21
19
  require("source-map-support/register");
22
-
23
20
  var _support = require("@appium/support");
24
-
25
21
  var _path = _interopRequireDefault(require("path"));
26
-
27
22
  var _asyncbox = require("asyncbox");
28
-
29
23
  var _lodash = _interopRequireDefault(require("lodash"));
30
-
31
24
  var _plist = require("plist");
32
-
33
25
  var _teen_process = require("teen_process");
34
-
35
26
  var _semver = _interopRequireDefault(require("semver"));
36
-
37
27
  const env = process.env;
38
28
  const XCRUN_TIMEOUT = 15000;
39
29
  const XCODE_SUBDIR = '/Contents/Developer';
40
30
  const DEFAULT_NUMBER_OF_RETRIES = 3;
41
-
42
31
  const log = _support.logger.getLogger('Xcode');
43
-
44
32
  function hasExpectedSubDir(path) {
45
33
  return path.substring(path.length - XCODE_SUBDIR.length) === XCODE_SUBDIR;
46
34
  }
47
-
48
35
  async function runXcrunCommand(args, timeout = XCRUN_TIMEOUT) {
49
36
  try {
50
37
  const res = await (0, _teen_process.exec)('xcrun', args, {
51
38
  timeout
52
39
  });
53
-
54
40
  if (_lodash.default.isUndefined(res)) {
55
41
  throw new Error(`Nothing returned from trying to run 'xcrun ${args.join(' ')}'`);
56
42
  }
57
-
58
43
  return res;
59
44
  } catch (err) {
60
45
  if (err.stderr) {
61
46
  err.message = `${err.message}: ${err.stderr}`;
62
47
  }
63
-
64
48
  throw err;
65
49
  }
66
50
  }
67
-
68
51
  async function getPathFromSymlink(failMessage) {
69
52
  log.warn(`Finding XcodePath by symlink because ${failMessage}`);
70
53
  const symlinkPath = '/var/db/xcode_select_link';
@@ -73,7 +56,6 @@ async function getPathFromSymlink(failMessage) {
73
56
 
74
57
  if (_support.util.hasContent(env.DEVELOPER_DIR)) {
75
58
  const customPath = hasExpectedSubDir(env.DEVELOPER_DIR) ? env.DEVELOPER_DIR : env.DEVELOPER_DIR + XCODE_SUBDIR;
76
-
77
59
  if (await _support.fs.exists(customPath)) {
78
60
  xcodePath = customPath;
79
61
  } else {
@@ -86,7 +68,6 @@ async function getPathFromSymlink(failMessage) {
86
68
  } else if (await _support.fs.exists(legacySymlinkPath)) {
87
69
  xcodePath = await _support.fs.readlink(legacySymlinkPath);
88
70
  }
89
-
90
71
  if (xcodePath) {
91
72
  return xcodePath.replace(new RegExp('/$'), '').trim();
92
73
  }
@@ -95,19 +76,17 @@ async function getPathFromSymlink(failMessage) {
95
76
  log.warn(msg);
96
77
  throw new Error(msg);
97
78
  }
98
-
99
79
  async function getPathFromXcodeSelect(timeout = XCRUN_TIMEOUT) {
100
80
  let {
101
81
  stdout
102
82
  } = await (0, _teen_process.exec)('xcode-select', ['--print-path'], {
103
83
  timeout
104
84
  });
105
- const xcodeFolderPath = stdout.replace(/\/$/, '').trim();
106
85
 
86
+ const xcodeFolderPath = stdout.replace(/\/$/, '').trim();
107
87
  if (!_support.util.hasContent(xcodeFolderPath)) {
108
88
  log.errorAndThrow('xcode-select returned an empty string');
109
89
  }
110
-
111
90
  if (await _support.fs.exists(xcodeFolderPath)) {
112
91
  return xcodeFolderPath;
113
92
  } else {
@@ -115,7 +94,6 @@ async function getPathFromXcodeSelect(timeout = XCRUN_TIMEOUT) {
115
94
  log.errorAndThrow(msg);
116
95
  }
117
96
  }
118
-
119
97
  const getPath = _lodash.default.memoize(function getPath(timeout = XCRUN_TIMEOUT) {
120
98
  return (async () => {
121
99
  try {
@@ -125,55 +103,43 @@ const getPath = _lodash.default.memoize(function getPath(timeout = XCRUN_TIMEOUT
125
103
  }
126
104
  })();
127
105
  });
128
-
129
106
  exports.getPath = getPath;
130
-
131
107
  async function getVersionWithoutRetry(timeout = XCRUN_TIMEOUT) {
132
108
  const xcodePath = await getPath(timeout);
133
109
 
134
110
  const plistPath = _path.default.resolve(xcodePath, '..', 'Info.plist');
135
-
136
111
  if (!(await _support.fs.exists(plistPath))) {
137
112
  throw new Error(`Could not get Xcode version. ${plistPath} does not exist on disk.`);
138
113
  }
139
-
140
114
  const version = await _support.plist.parsePlistFile(plistPath);
141
115
  return _semver.default.coerce(version.CFBundleShortVersionString);
142
116
  }
143
-
144
117
  const getVersionMemoized = _lodash.default.memoize(function getVersionMemoized(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
145
118
  return (0, _asyncbox.retry)(retries, getVersionWithoutRetry, timeout);
146
119
  });
147
-
148
120
  async function getVersion(parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
149
121
  const version = await getVersionMemoized(retries, timeout);
150
122
  const versionString = version.patch > 0 ? version.version : `${version.major}.${version.minor}`;
151
-
152
123
  if (!parse) {
153
124
  return versionString;
154
125
  }
155
-
156
126
  return {
157
127
  versionString,
158
128
  versionFloat: parseFloat(versionString),
159
129
  major: version.major,
160
130
  minor: version.minor,
161
131
  patch: version.patch > 0 ? version.patch : undefined,
162
-
163
132
  toString() {
164
133
  return versionString;
165
134
  }
166
-
167
135
  };
168
136
  }
169
-
170
137
  async function getCommandLineToolsVersion() {
171
138
  const getVersionFunctions = [async () => {
172
139
  let pkg = (await (0, _teen_process.exec)('pkgutil', ['--pkgs=com.apple.pkg.DevSDK_.*'])).stdout;
173
140
  return (await (0, _teen_process.exec)('pkgutil', [`--pkg-info=${pkg.trim()}`])).stdout;
174
141
  }, async () => (await (0, _teen_process.exec)('pkgutil', [`--pkg-info=com.apple.pkg.CLTools_Executables`])).stdout, async () => (await (0, _teen_process.exec)('pkgutil', [`--pkg-info=com.apple.pkg.DeveloperToolsCLI`])).stdout];
175
142
  let stdout;
176
-
177
143
  for (let getVersion of getVersionFunctions) {
178
144
  try {
179
145
  stdout = await getVersion();
@@ -194,74 +160,57 @@ async function getClangVersion() {
194
160
  log.info('Cannot find clang executable on the local system. ' + 'Are Xcode Command Line Tools installed?');
195
161
  return null;
196
162
  }
197
-
198
163
  const {
199
164
  stdout
200
165
  } = await (0, _teen_process.exec)('clang', ['--version']);
201
166
  const match = /clang-([0-9.]+)/.exec(stdout);
202
-
203
167
  if (!match) {
204
168
  log.info(`Cannot parse clang version from ${stdout}`);
205
169
  return null;
206
170
  }
207
-
208
171
  return match[1];
209
172
  }
210
-
211
173
  async function getAutomationTraceTemplatePathWithoutRetry(timeout = XCRUN_TIMEOUT) {
212
174
  const xcodePath = await getPath(timeout);
213
- const extensions = ['xrplugin', 'bundle'];
214
175
 
176
+ const extensions = ['xrplugin', 'bundle'];
215
177
  const pathPrefix = _path.default.resolve(xcodePath, '../Applications/Instruments.app/Contents/PlugIns');
216
-
217
178
  const pathSuffix = 'Contents/Resources/Automation.tracetemplate';
218
179
  let automationTraceTemplatePaths = [_path.default.resolve(pathPrefix, `AutomationInstrument.${extensions[0]}`, pathSuffix), _path.default.resolve(pathPrefix, `AutomationInstrument.${extensions[1]}`, pathSuffix)];
219
-
220
180
  if (await _support.fs.exists(automationTraceTemplatePaths[0])) {
221
181
  return automationTraceTemplatePaths[0];
222
182
  }
223
-
224
183
  if (await _support.fs.exists(automationTraceTemplatePaths[1])) {
225
184
  return automationTraceTemplatePaths[1];
226
185
  }
227
-
228
186
  const msg = 'Could not find Automation.tracetemplate in any of the following' + `locations ${automationTraceTemplatePaths.toString()}`;
229
187
  log.error(msg);
230
188
  throw new Error(msg);
231
189
  }
232
-
233
190
  const getAutomationTraceTemplatePath = _lodash.default.memoize(function getAutomationTraceTemplatePath(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
234
191
  return (0, _asyncbox.retry)(retries, getAutomationTraceTemplatePathWithoutRetry, timeout);
235
192
  });
236
-
237
193
  exports.getAutomationTraceTemplatePath = getAutomationTraceTemplatePath;
238
-
239
194
  async function getMaxIOSSDKWithoutRetry(timeout = XCRUN_TIMEOUT) {
240
195
  const version = await getVersion(false, DEFAULT_NUMBER_OF_RETRIES, timeout);
241
-
242
196
  if (version[0] === '4') {
243
197
  return '6.1';
244
198
  }
245
-
246
199
  const args = ['--sdk', 'iphonesimulator', '--show-sdk-version'];
247
200
  const {
248
201
  stdout
249
202
  } = await runXcrunCommand(args, timeout);
250
203
  const sdkVersion = stdout.trim();
251
204
  const match = /\d.\d/.exec(stdout);
252
-
253
205
  if (!match) {
254
206
  throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);
255
207
  }
256
-
257
208
  return sdkVersion;
258
209
  }
259
-
260
210
  async function getMaxIOSSDKFromXcodeVersion(timeout = XCRUN_TIMEOUT) {
261
211
  const version = await getVersion(true, DEFAULT_NUMBER_OF_RETRIES, timeout);
262
212
  return `${version.major + 2}.${version.minor}`;
263
213
  }
264
-
265
214
  const getMaxIOSSDK = _lodash.default.memoize(function getMaxIOSSDK(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
266
215
  try {
267
216
  return (0, _asyncbox.retry)(retries, getMaxIOSSDKWithoutRetry, timeout);
@@ -271,29 +220,22 @@ const getMaxIOSSDK = _lodash.default.memoize(function getMaxIOSSDK(retries = DEF
271
220
  return getMaxIOSSDKFromXcodeVersion(timeout);
272
221
  }
273
222
  });
274
-
275
223
  exports.getMaxIOSSDK = getMaxIOSSDK;
276
-
277
224
  async function getMaxTVOSSDKWithoutRetry(timeout = XCRUN_TIMEOUT) {
278
225
  const args = ['--sdk', 'appletvsimulator', '--show-sdk-version'];
279
226
  const {
280
227
  stdout
281
228
  } = await runXcrunCommand(args, timeout);
282
229
  const sdkVersion = stdout.trim();
283
-
284
230
  if (isNaN(parseFloat(sdkVersion))) {
285
231
  throw new Error(`xcrun returned a non-numeric tvOS SDK version: '${sdkVersion}'`);
286
232
  }
287
-
288
233
  return sdkVersion;
289
234
  }
290
-
291
235
  const getMaxTVOSSDK = _lodash.default.memoize(function getMaxTVOSSDK(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
292
236
  return (0, _asyncbox.retry)(retries, getMaxTVOSSDKWithoutRetry, timeout);
293
237
  });
294
-
295
238
  exports.getMaxTVOSSDK = getMaxTVOSSDK;
296
-
297
239
  async function getConnectedDevices(timeout = XCRUN_TIMEOUT) {
298
240
  const cmd = '/usr/sbin/system_profiler';
299
241
  const args = ['-xml', 'SPUSBDataType'];
@@ -305,10 +247,8 @@ async function getConnectedDevices(timeout = XCRUN_TIMEOUT) {
305
247
  let plistContent = (0, _plist.parse)(stdout);
306
248
  let devicesFound = [];
307
249
  let entriesToSearch = [plistContent[0]];
308
-
309
250
  while (entriesToSearch.length > 0) {
310
251
  let currentEntry = entriesToSearch.pop();
311
-
312
252
  if (currentEntry instanceof Array) {
313
253
  entriesToSearch = entriesToSearch.concat(currentEntry);
314
254
  } else if (currentEntry._name && currentEntry._name.substring(0, 4) === 'iPad' || currentEntry._name && currentEntry._name.substring(0, 6) === 'iPhone' || currentEntry._name && _lodash.default.includes(currentEntry._name, 'Apple TV')) {
@@ -323,35 +263,26 @@ async function getConnectedDevices(timeout = XCRUN_TIMEOUT) {
323
263
  entriesToSearch = entriesToSearch.concat(currentEntry._items);
324
264
  }
325
265
  }
326
-
327
266
  return devicesFound;
328
267
  }
329
-
330
268
  async function getInstrumentsPathWithoutRetry(timeout = XCRUN_TIMEOUT) {
331
269
  const args = ['-find', 'instruments'];
332
270
  let {
333
271
  stdout
334
272
  } = await runXcrunCommand(args, timeout);
335
-
336
273
  if (!stdout) {
337
274
  stdout = '';
338
275
  }
339
-
340
276
  let instrumentsPath = stdout.trim();
341
-
342
277
  if (!instrumentsPath) {
343
278
  throw new Error(`Could not find path to instruments binary using 'xcrun ${args.join(' ')}'`);
344
279
  }
345
-
346
280
  return instrumentsPath;
347
281
  }
348
-
349
282
  const getInstrumentsPath = _lodash.default.memoize(function getInstrumentsPath(retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {
350
283
  return (0, _asyncbox.retry)(retries, getInstrumentsPathWithoutRetry, timeout);
351
284
  });
352
-
353
285
  exports.getInstrumentsPath = getInstrumentsPath;
354
-
355
286
  function clearInternalCache() {
356
287
  const memoized = [getPath, getVersionMemoized, getAutomationTraceTemplatePath, getMaxIOSSDK, getMaxTVOSSDK, getInstrumentsPath];
357
288
  memoized.forEach(f => {
@@ -360,4 +291,4 @@ function clearInternalCache() {
360
291
  }
361
292
  });
362
293
  }
363
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnYiLCJwcm9jZXNzIiwiWENSVU5fVElNRU9VVCIsIlhDT0RFX1NVQkRJUiIsIkRFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJoYXNFeHBlY3RlZFN1YkRpciIsInBhdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJydW5YY3J1bkNvbW1hbmQiLCJhcmdzIiwidGltZW91dCIsInJlcyIsImV4ZWMiLCJfIiwiaXNVbmRlZmluZWQiLCJFcnJvciIsImpvaW4iLCJlcnIiLCJzdGRlcnIiLCJtZXNzYWdlIiwiZ2V0UGF0aEZyb21TeW1saW5rIiwiZmFpbE1lc3NhZ2UiLCJ3YXJuIiwic3ltbGlua1BhdGgiLCJsZWdhY3lTeW1saW5rUGF0aCIsInhjb2RlUGF0aCIsInV0aWwiLCJoYXNDb250ZW50IiwiREVWRUxPUEVSX0RJUiIsImN1c3RvbVBhdGgiLCJmcyIsImV4aXN0cyIsIm1lc2ciLCJyZWFkbGluayIsInJlcGxhY2UiLCJSZWdFeHAiLCJ0cmltIiwibXNnIiwiZ2V0UGF0aEZyb21YY29kZVNlbGVjdCIsInN0ZG91dCIsInhjb2RlRm9sZGVyUGF0aCIsImVycm9yQW5kVGhyb3ciLCJnZXRQYXRoIiwibWVtb2l6ZSIsImUiLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwicGxpc3RQYXRoIiwicmVzb2x2ZSIsInZlcnNpb24iLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIiwic2VtdmVyIiwiY29lcmNlIiwiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciLCJnZXRWZXJzaW9uTWVtb2l6ZWQiLCJyZXRyaWVzIiwicmV0cnkiLCJnZXRWZXJzaW9uIiwicGFyc2UiLCJ2ZXJzaW9uU3RyaW5nIiwicGF0Y2giLCJtYWpvciIsIm1pbm9yIiwidmVyc2lvbkZsb2F0IiwicGFyc2VGbG9hdCIsInVuZGVmaW5lZCIsInRvU3RyaW5nIiwiZ2V0Q29tbWFuZExpbmVUb29sc1ZlcnNpb24iLCJnZXRWZXJzaW9uRnVuY3Rpb25zIiwicGtnIiwiaWduIiwibWF0Y2giLCJnZXRDbGFuZ1ZlcnNpb24iLCJ3aGljaCIsImluZm8iLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnkiLCJleHRlbnNpb25zIiwicGF0aFByZWZpeCIsInBhdGhTdWZmaXgiLCJhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzIiwiZXJyb3IiLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgiLCJnZXRNYXhJT1NTREtXaXRob3V0UmV0cnkiLCJzZGtWZXJzaW9uIiwiZ2V0TWF4SU9TU0RLRnJvbVhjb2RlVmVyc2lvbiIsImdldE1heElPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJpc05hTiIsImdldE1heFRWT1NTREsiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwiY21kIiwicGxpc3RDb250ZW50IiwicGFyc2VQbGlzdERhdGEiLCJkZXZpY2VzRm91bmQiLCJlbnRyaWVzVG9TZWFyY2giLCJjdXJyZW50RW50cnkiLCJwb3AiLCJBcnJheSIsImNvbmNhdCIsIl9uYW1lIiwiaW5jbHVkZXMiLCJkZXZpY2VJbmZvIiwibmFtZSIsInVkaWQiLCJzZXJpYWxfbnVtIiwicHJvZHVjdElkIiwicHJvZHVjdF9pZCIsImRldmljZVZlcnNpb24iLCJiY2RfZGV2aWNlIiwicHVzaCIsIl9pdGVtcyIsImdldEluc3RydW1lbnRzUGF0aFdpdGhvdXRSZXRyeSIsImluc3RydW1lbnRzUGF0aCIsImdldEluc3RydW1lbnRzUGF0aCIsImNsZWFySW50ZXJuYWxDYWNoZSIsIm1lbW9pemVkIiwiZm9yRWFjaCIsImYiLCJjYWNoZSIsIkNhY2hlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3hjb2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0aWwsIGZzLCBwbGlzdCwgbG9nZ2VyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmV0cnkgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VQbGlzdERhdGEgfSBmcm9tICdwbGlzdCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuXG5jb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcblxuY29uc3QgWENSVU5fVElNRU9VVCA9IDE1MDAwO1xuY29uc3QgWENPREVfU1VCRElSID0gJy9Db250ZW50cy9EZXZlbG9wZXInO1xuY29uc3QgREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUyA9IDM7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1hjb2RlJyk7XG5cblxuZnVuY3Rpb24gaGFzRXhwZWN0ZWRTdWJEaXIgKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKHBhdGgubGVuZ3RoIC0gWENPREVfU1VCRElSLmxlbmd0aCkgPT09IFhDT0RFX1NVQkRJUjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuWGNydW5Db21tYW5kIChhcmdzLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4ZWMoJ3hjcnVuJywgYXJncywge3RpbWVvdXR9KTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChyZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdGhpbmcgcmV0dXJuZWQgZnJvbSB0cnlpbmcgdG8gcnVuICd4Y3J1biAke2FyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gdGhlIHRydWUgZXJyb3IgY2FuIGJlIGhpZGRlbiB3aXRoaW4gdGhlIHN0ZGVyclxuICAgIGlmIChlcnIuc3RkZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGAke2Vyci5tZXNzYWdlfTogJHtlcnIuc3RkZXJyfWA7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFBhdGhGcm9tU3ltbGluayAoZmFpbE1lc3NhZ2UpIHtcbiAgLy8gTm9kZSdzIGludm9jYXRpb24gb2YgeGNvZGUtc2VsZWN0IHNvbWV0aW1lcyBmbGFrZXMgYW5kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAvLyBOb3QgY2xlYXIgd2h5LiBBcyBhIHdvcmthcm91bmQsIEFwcGl1bSBjYW4gcmVsaWFibHkgZGVkdWNlIHRoZSB2ZXJzaW9uIGluIHVzZSBieSBjaGVja2luZ1xuICAvLyB0aGUgbG9jYXRpb25zIHhjb2RlLXNlbGVjdCB1c2VzIHRvIHN0b3JlIHRoZSBzZWxlY3RlZCB2ZXJzaW9uJ3MgcGF0aC4gVGhpcyBzaG91bGQgYmUgMTAwJVxuICAvLyByZWxpYWJsZSBzbyBsb25nIGFzIHRoZSBsaW5rIGxvY2F0aW9ucyByZW1haW4gdGhlIHNhbWUuIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIHJlbHlpbmcgb25cbiAgLy8gaGFyZGNvZGVkIHBhdGhzLCB0aGlzIGFwcHJvYWNoIHdpbGwgYnJlYWsgdGhlIG5leHQgdGltZSBBcHBsZSBjaGFuZ2VzIHRoZSBzeW1saW5rIGxvY2F0aW9uLlxuICBsb2cud2FybihgRmluZGluZyBYY29kZVBhdGggYnkgc3ltbGluayBiZWNhdXNlICR7ZmFpbE1lc3NhZ2V9YCk7XG5cbiAgY29uc3Qgc3ltbGlua1BhdGggPSAnL3Zhci9kYi94Y29kZV9zZWxlY3RfbGluayc7XG4gIGNvbnN0IGxlZ2FjeVN5bWxpbmtQYXRoID0gJy91c3Ivc2hhcmUveGNvZGUtc2VsZWN0L3hjb2RlX2Rpcl9saW5rJzsgLy8gIFhjb2RlIDwgNS54XG4gIGxldCB4Y29kZVBhdGggPSBudWxsO1xuXG4gIC8vIHhjb2RlLXNlbGVjdCBhbGxvd3MgdXNlcnMgdG8gb3ZlcnJpZGUgaXRzIHNldHRpbmdzIHdpdGggdGhlIERFVkVMT1BFUl9ESVIgZW52IHZhcixcbiAgLy8gc28gY2hlY2sgdGhhdCBmaXJzdFxuICBpZiAodXRpbC5oYXNDb250ZW50KGVudi5ERVZFTE9QRVJfRElSKSkge1xuICAgIGNvbnN0IGN1c3RvbVBhdGggPSBoYXNFeHBlY3RlZFN1YkRpcihlbnYuREVWRUxPUEVSX0RJUilcbiAgICAgID8gZW52LkRFVkVMT1BFUl9ESVJcbiAgICAgIDogZW52LkRFVkVMT1BFUl9ESVIgKyBYQ09ERV9TVUJESVI7XG5cbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGN1c3RvbVBhdGgpKSB7XG4gICAgICB4Y29kZVBhdGggPSBjdXN0b21QYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbWVzZyA9IGBDb3VsZCBub3QgZmluZCBwYXRoIHRvIFhjb2RlLCBlbnZpcm9ubWVudCB2YXJpYWJsZSBgICtcbiAgICAgICAgICAgICAgICAgYERFVkVMT1BFUl9ESVIgc2V0IHRvOiAke2Vudi5ERVZFTE9QRVJfRElSfSBgICtcbiAgICAgICAgICAgICAgICAgYGJ1dCBubyBYY29kZSBmb3VuZGA7XG4gICAgICBsb2cud2FybihtZXNnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXdhaXQgZnMuZXhpc3RzKHN5bWxpbmtQYXRoKSkge1xuICAgIHhjb2RlUGF0aCA9IGF3YWl0IGZzLnJlYWRsaW5rKHN5bWxpbmtQYXRoKTtcbiAgfSBlbHNlIGlmIChhd2FpdCBmcy5leGlzdHMobGVnYWN5U3ltbGlua1BhdGgpKSB7XG4gICAgeGNvZGVQYXRoID0gYXdhaXQgZnMucmVhZGxpbmsobGVnYWN5U3ltbGlua1BhdGgpO1xuICB9XG5cbiAgaWYgKHhjb2RlUGF0aCkge1xuICAgIHJldHVybiB4Y29kZVBhdGgucmVwbGFjZShuZXcgUmVnRXhwKCcvJCcpLCAnJykudHJpbSgpO1xuICB9XG5cbiAgLy8gV2Ugc2hvdWxkIG9ubHkgZ2V0IGhlcmUgaXMgd2UgZmFpbGVkIHRvIGNhcHR1cmUgeGNvZGUtc2VsZWN0J3Mgc3Rkb3V0IGFuZCBvdXJcbiAgLy8gb3RoZXIgY2hlY2tzIGZhaWxlZC4gRWl0aGVyIEFwcGxlIGhhcyBtb3ZlZCB0aGUgc3ltbGluayB0byBhIG5ldyBsb2NhdGlvbiBvciB0aGUgdXNlclxuICAvLyBpcyBub3QgdXNpbmcgdGhlIGRlZmF1bHQgaW5zdGFsbC4gOTkuOTk5JSBjaGFuY2UgaXQncyB0aGUgbGF0dGVyLCBzbyBpc3N1ZSBhIHdhcm5pbmdcbiAgLy8gc2hvdWxkIHdlIGV2ZXIgaGl0IHRoZSBlZGdlIGNhc2UuXG4gIGxldCBtc2cgPSBgQ291bGQgbm90IGZpbmQgcGF0aCB0byBYY29kZSBieSBzeW1saW5rcyBsb2NhdGVkIGluICR7c3ltbGlua1BhdGh9LCBvciAke2xlZ2FjeVN5bWxpbmtQYXRofWA7XG4gIGxvZy53YXJuKG1zZyk7XG4gIHRocm93IG5ldyBFcnJvcihtc2cpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQYXRoRnJvbVhjb2RlU2VsZWN0ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBsZXQge3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZS1zZWxlY3QnLCBbJy0tcHJpbnQtcGF0aCddLCB7dGltZW91dH0pO1xuXG4gIC8vIHRyaW0gYW5kIHJlbW92ZSB0cmFpbGluZyBzbGFzaFxuICBjb25zdCB4Y29kZUZvbGRlclBhdGggPSBzdGRvdXQucmVwbGFjZSgvXFwvJC8sICcnKS50cmltKCk7XG5cbiAgaWYgKCF1dGlsLmhhc0NvbnRlbnQoeGNvZGVGb2xkZXJQYXRoKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KCd4Y29kZS1zZWxlY3QgcmV0dXJuZWQgYW4gZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoYXdhaXQgZnMuZXhpc3RzKHhjb2RlRm9sZGVyUGF0aCkpIHtcbiAgICByZXR1cm4geGNvZGVGb2xkZXJQYXRoO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG1zZyA9IGB4Y29kZS1zZWxlY3QgY291bGQgbm90IGZpbmQgeGNvZGUuIFBhdGggJyR7eGNvZGVGb2xkZXJQYXRofScgZG9lcyBub3QgZXhpc3QuYDtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhtc2cpO1xuICB9XG59XG5cbmNvbnN0IGdldFBhdGggPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0UGF0aCAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgLy8gZmlyc3Qgd2UgdHJ5IHVzaW5nIHhjb2RlLXNlbGVjdCB0byBmaW5kIHRoZSBwYXRoXG4gIC8vIHRoZW4gd2UgdHJ5IHVzaW5nIHRoZSBzeW1saW5rcyB0aGF0IEFwcGxlIGhhcyBieSBkZWZhdWx0XG4gIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0UGF0aEZyb21YY29kZVNlbGVjdCh0aW1lb3V0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0UGF0aEZyb21TeW1saW5rKGUubWVzc2FnZSk7XG4gICAgfVxuICB9KSgpO1xufSk7XG5cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgeGNvZGVQYXRoID0gYXdhaXQgZ2V0UGF0aCh0aW1lb3V0KTtcblxuICAvLyB3ZSB3YW50IHRvIHJlYWQgdGhlIENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIGZyb20gWGNvZGUncyBwbGlzdC5cbiAgLy8gSXQgc2hvdWxkIGJlIGluIC9bcm9vdF0vWENvZGUuYXBwL0NvbnRlbnRzL1xuICBjb25zdCBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4nLCAnSW5mby5wbGlzdCcpO1xuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHBsaXN0UGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgWGNvZGUgdmVyc2lvbi4gJHtwbGlzdFBhdGh9IGRvZXMgbm90IGV4aXN0IG9uIGRpc2suYCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocGxpc3RQYXRoKTtcbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UodmVyc2lvbi5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyk7XG59XG5cbmNvbnN0IGdldFZlcnNpb25NZW1vaXplZCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0VmVyc2lvbk1lbW9pemVkIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFZlcnNpb24gKHBhcnNlID0gZmFsc2UsIHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbk1lbW9pemVkKHJldHJpZXMsIHRpbWVvdXQpO1xuICAvLyB4Y29kZSB2ZXJzaW9uIHN0cmluZ3MgYXJlIG5vdCBleGFjdGx5IHNlbXZlciBzdHJpbmc6IHBhdGNoIHZlcnNpb25zIG9mIDBcbiAgLy8gYXJlIHJlbW92ZWQgKGUuZy4sICcxMC4wLjAnID0+ICcxMC4wJylcbiAgY29uc3QgdmVyc2lvblN0cmluZyA9IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi52ZXJzaW9uIDogYCR7dmVyc2lvbi5tYWpvcn0uJHt2ZXJzaW9uLm1pbm9yfWA7XG4gIGlmICghcGFyc2UpIHtcbiAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvblN0cmluZyxcbiAgICB2ZXJzaW9uRmxvYXQ6IHBhcnNlRmxvYXQodmVyc2lvblN0cmluZyksXG4gICAgbWFqb3I6IHZlcnNpb24ubWFqb3IsXG4gICAgbWlub3I6IHZlcnNpb24ubWlub3IsXG4gICAgcGF0Y2g6IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi5wYXRjaCA6IHVuZGVmaW5lZCxcbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiAoKSB7XG4gIC8vIHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cyB0aGF0IHRoZSBDTEkgdG9vbHMgdmVyc2lvbiBoYXMgYmVlblxuICAvLyByZXByZXNlbnRlZC4gVHJ5IHRoZW0gZnJvbSBtb3N0IHJlbGlhYmxlIHRvIGxlYXN0LCBmYWxsaW5nIGRvd24gdGhlIGNoYWluXG4gIGNvbnN0IGdldFZlcnNpb25GdW5jdGlvbnMgPSBbXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHBrZyA9IChhd2FpdCBleGVjKCdwa2d1dGlsJywgWyctLXBrZ3M9Y29tLmFwcGxlLnBrZy5EZXZTREtfLionXSkpLnN0ZG91dDtcbiAgICAgIHJldHVybiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz0ke3BrZy50cmltKCl9YF0pKS5zdGRvdXQ7XG4gICAgfSxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkNMVG9vbHNfRXhlY3V0YWJsZXNgXSkpLnN0ZG91dCxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkRldmVsb3BlclRvb2xzQ0xJYF0pKS5zdGRvdXQsXG4gIF07XG4gIGxldCBzdGRvdXQ7XG4gIGZvciAobGV0IGdldFZlcnNpb24gb2YgZ2V0VmVyc2lvbkZ1bmN0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBzdGRvdXQgPSBhd2FpdCBnZXRWZXJzaW9uKCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIHN0ZG91dCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN0ZG91dCBzaG91bGQgaGF2ZSBhIGxpbmUgbGlrZSBgdmVyc2lvbjogOC4wLjAuMC4xLjE0NzI0MzU4ODFgXG4gIGxldCBtYXRjaCA9IC9edmVyc2lvbjogKC4rKSQvbS5leGVjKHN0ZG91dCk7IC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvSFYzeDRkLzFcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaHR0cHM6Ly90cmFjLm1hY3BvcnRzLm9yZy93aWtpL1hjb2RlVmVyc2lvbkluZm9cbiAqIHRvIHNlZSB0aGUgYWN0dWFsIG1hcHBpbmcgYmV0d2VlbiBjbGFuZyBhbmQgb3RoZXIgY29tcG9uZW50cy5cbiAqXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGFjdHVhbCBDbGFuZyB2ZXJzaW9uIGluIHgueC54Lnggb3IgeC54LnggZm9ybWF0LFxuICogd2hpY2ggaXMgc3VwcGxpZWQgd2l0aCBDb21tYW5kIExpbmUgVG9vbHMuIGBudWxsYCBpcyByZXR1cm5lZFxuICogaWYgQ0xUIGFyZSBub3QgaW5zdGFsbGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDbGFuZ1ZlcnNpb24gKCkge1xuICB0cnkge1xuICAgIGF3YWl0IGZzLndoaWNoKCdjbGFuZycpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmluZm8oJ0Nhbm5vdCBmaW5kIGNsYW5nIGV4ZWN1dGFibGUgb24gdGhlIGxvY2FsIHN5c3RlbS4gJyArXG4gICAgICAnQXJlIFhjb2RlIENvbW1hbmQgTGluZSBUb29scyBpbnN0YWxsZWQ/Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdjbGFuZycsIFsnLS12ZXJzaW9uJ10pO1xuICBjb25zdCBtYXRjaCA9IC9jbGFuZy0oWzAtOS5dKykvLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIGxvZy5pbmZvKGBDYW5ub3QgcGFyc2UgY2xhbmcgdmVyc2lvbiBmcm9tICR7c3Rkb3V0fWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBtYXRjaFsxXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB4Y29kZVBhdGggPSBhd2FpdCBnZXRQYXRoKHRpbWVvdXQpO1xuXG4gIC8vIGZvciBpb3MgOCBhbmQgdXAsIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgQXV0aW9tYXRpb25JbnN0cnVtZW50IGNoYW5nZWQuXG4gIC8vIHJhdGhlciB0aGFuIHdhc3RlIHRpbWUgZ2V0dGluZyB0aGUgaU9TU0RLVmVyc2lvbiwganVzdCBnZXQgYm90aCBwYXRocyBhbmQgc2VlIHdoaWNoIG9uZSBleGlzdHNcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsneHJwbHVnaW4nLCAnYnVuZGxlJ107XG4gIGNvbnN0IHBhdGhQcmVmaXggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4vQXBwbGljYXRpb25zL0luc3RydW1lbnRzLmFwcC9Db250ZW50cy9QbHVnSW5zJyk7XG4gIGNvbnN0IHBhdGhTdWZmaXggPSAnQ29udGVudHMvUmVzb3VyY2VzL0F1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSc7XG4gIGxldCBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzID0gW1xuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzBdfWAsIHBhdGhTdWZmaXgpLFxuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzFdfWAsIHBhdGhTdWZmaXgpXG4gIF07XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdO1xuICB9XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdO1xuICB9XG5cbiAgY29uc3QgbXNnID0gJ0NvdWxkIG5vdCBmaW5kIEF1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZycgK1xuICAgICAgICAgICAgICBgbG9jYXRpb25zICR7YXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRocy50b1N0cmluZygpfWA7XG4gIGxvZy5lcnJvcihtc2cpO1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcblxufVxuXG5jb25zdCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGggPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCAocmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHJldHJ5KHJldHJpZXMsIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldFZlcnNpb24oZmFsc2UsIERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQpO1xuICBpZiAodmVyc2lvblswXSA9PT0gJzQnKSB7XG4gICAgcmV0dXJuICc2LjEnO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnaXBob25lc2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBjb25zdCBzZGtWZXJzaW9uID0gc3Rkb3V0LnRyaW0oKTtcbiAgY29uc3QgbWF0Y2ggPSAvXFxkLlxcZC8uZXhlYyhzdGRvdXQpO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHhjcnVuIHJldHVybmVkIGEgbm9uLW51bWVyaWMgaU9TIFNESyB2ZXJzaW9uOiAnJHtzZGtWZXJzaW9ufSdgKTtcbiAgfVxuXG4gIHJldHVybiBzZGtWZXJzaW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbih0cnVlLCBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0KTtcbiAgLy8gYXMgb2Ygbm93LCB0aGUgaU9TIHZlcnNpb24gYXNzb2NpYXRlZCB3aXRoIGFuIFhjb2RlIHZlcnNpb24gaXNcbiAgLy8ganVzdCB0aGUgWGNvZGUgdmVyc2lvbiArIDJcbiAgcmV0dXJuIGAke3ZlcnNpb24ubWFqb3IgKyAyfS4ke3ZlcnNpb24ubWlub3J9YDtcbn1cblxuY29uc3QgZ2V0TWF4SU9TU0RLID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiBnZXRNYXhJT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gcmV0cmlldmUgbWF4aW11bSBpT1MgdmVyc2lvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGxvZy53YXJuKCdHdWVzc2luZyBmcm9tIFhjb2RlIHZlcnNpb24nKTtcbiAgICAgIHJldHVybiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uKHRpbWVvdXQpO1xuICAgIH1cbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnYXBwbGV0dnNpbXVsYXRvcicsICctLXNob3ctc2RrLXZlcnNpb24nXTtcbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBydW5YY3J1bkNvbW1hbmQoYXJncywgdGltZW91dCk7XG5cbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKGlzTmFOKHBhcnNlRmxvYXQoc2RrVmVyc2lvbikpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB4Y3J1biByZXR1cm5lZCBhIG5vbi1udW1lcmljIHR2T1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG5cbiAgcmV0dXJuIHNka1ZlcnNpb247XG59XG5cbmNvbnN0IGdldE1heFRWT1NTREsgPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldE1heFRWT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ubmVjdGVkRGV2aWNlcyAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgY21kID0gJy91c3Ivc2Jpbi9zeXN0ZW1fcHJvZmlsZXInO1xuICBjb25zdCBhcmdzID0gWycteG1sJywgJ1NQVVNCRGF0YVR5cGUnXTtcbiAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyhjbWQsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIGxldCBwbGlzdENvbnRlbnQgPSBwYXJzZVBsaXN0RGF0YShzdGRvdXQpO1xuXG4gIGxldCBkZXZpY2VzRm91bmQgPSBbXTtcbiAgbGV0IGVudHJpZXNUb1NlYXJjaCA9IFtwbGlzdENvbnRlbnRbMF1dO1xuICB3aGlsZSAoZW50cmllc1RvU2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgY3VycmVudEVudHJ5ID0gZW50cmllc1RvU2VhcmNoLnBvcCgpO1xuICAgIGlmIChjdXJyZW50RW50cnkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZW50cmllc1RvU2VhcmNoID0gZW50cmllc1RvU2VhcmNoLmNvbmNhdChjdXJyZW50RW50cnkpO1xuICAgIH0gZWxzZSBpZiAoKGN1cnJlbnRFbnRyeS5fbmFtZSAmJlxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5fbmFtZS5zdWJzdHJpbmcoMCwgNCkgPT09ICdpUGFkJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiZcbiAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkuX25hbWUuc3Vic3RyaW5nKDAsIDYpID09PSAnaVBob25lJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiYgXy5pbmNsdWRlcyhjdXJyZW50RW50cnkuX25hbWUsICdBcHBsZSBUVicpKSkge1xuICAgICAgbGV0IGRldmljZUluZm8gPSB7XG4gICAgICAgIG5hbWU6IGN1cnJlbnRFbnRyeS5fbmFtZSxcbiAgICAgICAgdWRpZDogY3VycmVudEVudHJ5LnNlcmlhbF9udW0sXG4gICAgICAgIHByb2R1Y3RJZDogY3VycmVudEVudHJ5LnByb2R1Y3RfaWQsXG4gICAgICAgIGRldmljZVZlcnNpb246IGN1cnJlbnRFbnRyeS5iY2RfZGV2aWNlXG4gICAgICB9O1xuICAgICAgZGV2aWNlc0ZvdW5kLnB1c2goZGV2aWNlSW5mbyk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50RW50cnkuX2l0ZW1zKSB7XG4gICAgICBlbnRyaWVzVG9TZWFyY2ggPSBlbnRyaWVzVG9TZWFyY2guY29uY2F0KGN1cnJlbnRFbnRyeS5faXRlbXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGV2aWNlc0ZvdW5kO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnkgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IGFyZ3MgPSBbJy1maW5kJywgJ2luc3RydW1lbnRzJ107XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBpZiAoIXN0ZG91dCkge1xuICAgIHN0ZG91dCA9ICcnO1xuICB9XG5cbiAgbGV0IGluc3RydW1lbnRzUGF0aCA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKCFpbnN0cnVtZW50c1BhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gaW5zdHJ1bWVudHMgYmluYXJ5IHVzaW5nICd4Y3J1biAke2FyZ3Muam9pbignICcpfSdgKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVtZW50c1BhdGg7XG59XG5cbmNvbnN0IGdldEluc3RydW1lbnRzUGF0aCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0SW5zdHJ1bWVudHNQYXRoIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0SW5zdHJ1bWVudHNQYXRoV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuZnVuY3Rpb24gY2xlYXJJbnRlcm5hbENhY2hlICgpIHtcblxuICAvLyBtZW1vaXplZCBmdW5jdGlvbnNcbiAgY29uc3QgbWVtb2l6ZWQgPSBbXG4gICAgZ2V0UGF0aCwgZ2V0VmVyc2lvbk1lbW9pemVkLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgICBnZXRNYXhUVk9TU0RLLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIF07XG5cbiAgbWVtb2l6ZWQuZm9yRWFjaCgoZikgPT4ge1xuICAgIGlmIChmLmNhY2hlKSB7XG4gICAgICBmLmNhY2hlID0gbmV3IF8ubWVtb2l6ZS5DYWNoZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCB7XG4gIGdldFBhdGgsIGdldFZlcnNpb24sIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCwgZ2V0TWF4SU9TU0RLLFxuICBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnksIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q29ubmVjdGVkRGV2aWNlcywgY2xlYXJJbnRlcm5hbENhY2hlLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIGdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uLCBnZXRNYXhUVk9TU0RLLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LFxuICBnZXRDbGFuZ1ZlcnNpb24sXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0EsTUFBTUEsR0FBRyxHQUFHQyxPQUFPLENBQUNELEdBQXBCO0FBRUEsTUFBTUUsYUFBYSxHQUFHLEtBQXRCO0FBQ0EsTUFBTUMsWUFBWSxHQUFHLHFCQUFyQjtBQUNBLE1BQU1DLHlCQUF5QixHQUFHLENBQWxDOztBQUVBLE1BQU1DLEdBQUcsR0FBR0MsZUFBQSxDQUFPQyxTQUFQLENBQWlCLE9BQWpCLENBQVo7O0FBR0EsU0FBU0MsaUJBQVQsQ0FBNEJDLElBQTVCLEVBQWtDO0VBQ2hDLE9BQU9BLElBQUksQ0FBQ0MsU0FBTCxDQUFlRCxJQUFJLENBQUNFLE1BQUwsR0FBY1IsWUFBWSxDQUFDUSxNQUExQyxNQUFzRFIsWUFBN0Q7QUFDRDs7QUFFRCxlQUFlUyxlQUFmLENBQWdDQyxJQUFoQyxFQUFzQ0MsT0FBTyxHQUFHWixhQUFoRCxFQUErRDtFQUM3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
294
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnYiLCJwcm9jZXNzIiwiWENSVU5fVElNRU9VVCIsIlhDT0RFX1NVQkRJUiIsIkRFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMiLCJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJoYXNFeHBlY3RlZFN1YkRpciIsInBhdGgiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJydW5YY3J1bkNvbW1hbmQiLCJhcmdzIiwidGltZW91dCIsInJlcyIsImV4ZWMiLCJfIiwiaXNVbmRlZmluZWQiLCJFcnJvciIsImpvaW4iLCJlcnIiLCJzdGRlcnIiLCJtZXNzYWdlIiwiZ2V0UGF0aEZyb21TeW1saW5rIiwiZmFpbE1lc3NhZ2UiLCJ3YXJuIiwic3ltbGlua1BhdGgiLCJsZWdhY3lTeW1saW5rUGF0aCIsInhjb2RlUGF0aCIsInV0aWwiLCJoYXNDb250ZW50IiwiREVWRUxPUEVSX0RJUiIsImN1c3RvbVBhdGgiLCJmcyIsImV4aXN0cyIsIm1lc2ciLCJyZWFkbGluayIsInJlcGxhY2UiLCJSZWdFeHAiLCJ0cmltIiwibXNnIiwiZ2V0UGF0aEZyb21YY29kZVNlbGVjdCIsInN0ZG91dCIsInhjb2RlRm9sZGVyUGF0aCIsImVycm9yQW5kVGhyb3ciLCJnZXRQYXRoIiwibWVtb2l6ZSIsImUiLCJnZXRWZXJzaW9uV2l0aG91dFJldHJ5IiwicGxpc3RQYXRoIiwicmVzb2x2ZSIsInZlcnNpb24iLCJwbGlzdCIsInBhcnNlUGxpc3RGaWxlIiwic2VtdmVyIiwiY29lcmNlIiwiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciLCJnZXRWZXJzaW9uTWVtb2l6ZWQiLCJyZXRyaWVzIiwicmV0cnkiLCJnZXRWZXJzaW9uIiwicGFyc2UiLCJ2ZXJzaW9uU3RyaW5nIiwicGF0Y2giLCJtYWpvciIsIm1pbm9yIiwidmVyc2lvbkZsb2F0IiwicGFyc2VGbG9hdCIsInVuZGVmaW5lZCIsInRvU3RyaW5nIiwiZ2V0Q29tbWFuZExpbmVUb29sc1ZlcnNpb24iLCJnZXRWZXJzaW9uRnVuY3Rpb25zIiwicGtnIiwiaWduIiwibWF0Y2giLCJnZXRDbGFuZ1ZlcnNpb24iLCJ3aGljaCIsImluZm8iLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnkiLCJleHRlbnNpb25zIiwicGF0aFByZWZpeCIsInBhdGhTdWZmaXgiLCJhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzIiwiZXJyb3IiLCJnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgiLCJnZXRNYXhJT1NTREtXaXRob3V0UmV0cnkiLCJzZGtWZXJzaW9uIiwiZ2V0TWF4SU9TU0RLRnJvbVhjb2RlVmVyc2lvbiIsImdldE1heElPU1NESyIsImdldE1heFRWT1NTREtXaXRob3V0UmV0cnkiLCJpc05hTiIsImdldE1heFRWT1NTREsiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwiY21kIiwicGxpc3RDb250ZW50IiwicGFyc2VQbGlzdERhdGEiLCJkZXZpY2VzRm91bmQiLCJlbnRyaWVzVG9TZWFyY2giLCJjdXJyZW50RW50cnkiLCJwb3AiLCJBcnJheSIsImNvbmNhdCIsIl9uYW1lIiwiaW5jbHVkZXMiLCJkZXZpY2VJbmZvIiwibmFtZSIsInVkaWQiLCJzZXJpYWxfbnVtIiwicHJvZHVjdElkIiwicHJvZHVjdF9pZCIsImRldmljZVZlcnNpb24iLCJiY2RfZGV2aWNlIiwicHVzaCIsIl9pdGVtcyIsImdldEluc3RydW1lbnRzUGF0aFdpdGhvdXRSZXRyeSIsImluc3RydW1lbnRzUGF0aCIsImdldEluc3RydW1lbnRzUGF0aCIsImNsZWFySW50ZXJuYWxDYWNoZSIsIm1lbW9pemVkIiwiZm9yRWFjaCIsImYiLCJjYWNoZSIsIkNhY2hlIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3hjb2RlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV0aWwsIGZzLCBwbGlzdCwgbG9nZ2VyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmV0cnkgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VQbGlzdERhdGEgfSBmcm9tICdwbGlzdCc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuXG5jb25zdCBlbnYgPSBwcm9jZXNzLmVudjtcblxuY29uc3QgWENSVU5fVElNRU9VVCA9IDE1MDAwO1xuY29uc3QgWENPREVfU1VCRElSID0gJy9Db250ZW50cy9EZXZlbG9wZXInO1xuY29uc3QgREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUyA9IDM7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1hjb2RlJyk7XG5cblxuZnVuY3Rpb24gaGFzRXhwZWN0ZWRTdWJEaXIgKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKHBhdGgubGVuZ3RoIC0gWENPREVfU1VCRElSLmxlbmd0aCkgPT09IFhDT0RFX1NVQkRJUjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuWGNydW5Db21tYW5kIChhcmdzLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4ZWMoJ3hjcnVuJywgYXJncywge3RpbWVvdXR9KTtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZChyZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdGhpbmcgcmV0dXJuZWQgZnJvbSB0cnlpbmcgdG8gcnVuICd4Y3J1biAke2FyZ3Muam9pbignICcpfSdgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gdGhlIHRydWUgZXJyb3IgY2FuIGJlIGhpZGRlbiB3aXRoaW4gdGhlIHN0ZGVyclxuICAgIGlmIChlcnIuc3RkZXJyKSB7XG4gICAgICBlcnIubWVzc2FnZSA9IGAke2Vyci5tZXNzYWdlfTogJHtlcnIuc3RkZXJyfWA7XG4gICAgfVxuXG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFBhdGhGcm9tU3ltbGluayAoZmFpbE1lc3NhZ2UpIHtcbiAgLy8gTm9kZSdzIGludm9jYXRpb24gb2YgeGNvZGUtc2VsZWN0IHNvbWV0aW1lcyBmbGFrZXMgYW5kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAvLyBOb3QgY2xlYXIgd2h5LiBBcyBhIHdvcmthcm91bmQsIEFwcGl1bSBjYW4gcmVsaWFibHkgZGVkdWNlIHRoZSB2ZXJzaW9uIGluIHVzZSBieSBjaGVja2luZ1xuICAvLyB0aGUgbG9jYXRpb25zIHhjb2RlLXNlbGVjdCB1c2VzIHRvIHN0b3JlIHRoZSBzZWxlY3RlZCB2ZXJzaW9uJ3MgcGF0aC4gVGhpcyBzaG91bGQgYmUgMTAwJVxuICAvLyByZWxpYWJsZSBzbyBsb25nIGFzIHRoZSBsaW5rIGxvY2F0aW9ucyByZW1haW4gdGhlIHNhbWUuIEhvd2V2ZXIsIHNpbmNlIHdlJ3JlIHJlbHlpbmcgb25cbiAgLy8gaGFyZGNvZGVkIHBhdGhzLCB0aGlzIGFwcHJvYWNoIHdpbGwgYnJlYWsgdGhlIG5leHQgdGltZSBBcHBsZSBjaGFuZ2VzIHRoZSBzeW1saW5rIGxvY2F0aW9uLlxuICBsb2cud2FybihgRmluZGluZyBYY29kZVBhdGggYnkgc3ltbGluayBiZWNhdXNlICR7ZmFpbE1lc3NhZ2V9YCk7XG5cbiAgY29uc3Qgc3ltbGlua1BhdGggPSAnL3Zhci9kYi94Y29kZV9zZWxlY3RfbGluayc7XG4gIGNvbnN0IGxlZ2FjeVN5bWxpbmtQYXRoID0gJy91c3Ivc2hhcmUveGNvZGUtc2VsZWN0L3hjb2RlX2Rpcl9saW5rJzsgLy8gIFhjb2RlIDwgNS54XG4gIGxldCB4Y29kZVBhdGggPSBudWxsO1xuXG4gIC8vIHhjb2RlLXNlbGVjdCBhbGxvd3MgdXNlcnMgdG8gb3ZlcnJpZGUgaXRzIHNldHRpbmdzIHdpdGggdGhlIERFVkVMT1BFUl9ESVIgZW52IHZhcixcbiAgLy8gc28gY2hlY2sgdGhhdCBmaXJzdFxuICBpZiAodXRpbC5oYXNDb250ZW50KGVudi5ERVZFTE9QRVJfRElSKSkge1xuICAgIGNvbnN0IGN1c3RvbVBhdGggPSBoYXNFeHBlY3RlZFN1YkRpcihlbnYuREVWRUxPUEVSX0RJUilcbiAgICAgID8gZW52LkRFVkVMT1BFUl9ESVJcbiAgICAgIDogZW52LkRFVkVMT1BFUl9ESVIgKyBYQ09ERV9TVUJESVI7XG5cbiAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKGN1c3RvbVBhdGgpKSB7XG4gICAgICB4Y29kZVBhdGggPSBjdXN0b21QYXRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbWVzZyA9IGBDb3VsZCBub3QgZmluZCBwYXRoIHRvIFhjb2RlLCBlbnZpcm9ubWVudCB2YXJpYWJsZSBgICtcbiAgICAgICAgICAgICAgICAgYERFVkVMT1BFUl9ESVIgc2V0IHRvOiAke2Vudi5ERVZFTE9QRVJfRElSfSBgICtcbiAgICAgICAgICAgICAgICAgYGJ1dCBubyBYY29kZSBmb3VuZGA7XG4gICAgICBsb2cud2FybihtZXNnKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNnKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoYXdhaXQgZnMuZXhpc3RzKHN5bWxpbmtQYXRoKSkge1xuICAgIHhjb2RlUGF0aCA9IGF3YWl0IGZzLnJlYWRsaW5rKHN5bWxpbmtQYXRoKTtcbiAgfSBlbHNlIGlmIChhd2FpdCBmcy5leGlzdHMobGVnYWN5U3ltbGlua1BhdGgpKSB7XG4gICAgeGNvZGVQYXRoID0gYXdhaXQgZnMucmVhZGxpbmsobGVnYWN5U3ltbGlua1BhdGgpO1xuICB9XG5cbiAgaWYgKHhjb2RlUGF0aCkge1xuICAgIHJldHVybiB4Y29kZVBhdGgucmVwbGFjZShuZXcgUmVnRXhwKCcvJCcpLCAnJykudHJpbSgpO1xuICB9XG5cbiAgLy8gV2Ugc2hvdWxkIG9ubHkgZ2V0IGhlcmUgaXMgd2UgZmFpbGVkIHRvIGNhcHR1cmUgeGNvZGUtc2VsZWN0J3Mgc3Rkb3V0IGFuZCBvdXJcbiAgLy8gb3RoZXIgY2hlY2tzIGZhaWxlZC4gRWl0aGVyIEFwcGxlIGhhcyBtb3ZlZCB0aGUgc3ltbGluayB0byBhIG5ldyBsb2NhdGlvbiBvciB0aGUgdXNlclxuICAvLyBpcyBub3QgdXNpbmcgdGhlIGRlZmF1bHQgaW5zdGFsbC4gOTkuOTk5JSBjaGFuY2UgaXQncyB0aGUgbGF0dGVyLCBzbyBpc3N1ZSBhIHdhcm5pbmdcbiAgLy8gc2hvdWxkIHdlIGV2ZXIgaGl0IHRoZSBlZGdlIGNhc2UuXG4gIGxldCBtc2cgPSBgQ291bGQgbm90IGZpbmQgcGF0aCB0byBYY29kZSBieSBzeW1saW5rcyBsb2NhdGVkIGluICR7c3ltbGlua1BhdGh9LCBvciAke2xlZ2FjeVN5bWxpbmtQYXRofWA7XG4gIGxvZy53YXJuKG1zZyk7XG4gIHRocm93IG5ldyBFcnJvcihtc2cpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRQYXRoRnJvbVhjb2RlU2VsZWN0ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBsZXQge3N0ZG91dH0gPSBhd2FpdCBleGVjKCd4Y29kZS1zZWxlY3QnLCBbJy0tcHJpbnQtcGF0aCddLCB7dGltZW91dH0pO1xuXG4gIC8vIHRyaW0gYW5kIHJlbW92ZSB0cmFpbGluZyBzbGFzaFxuICBjb25zdCB4Y29kZUZvbGRlclBhdGggPSBzdGRvdXQucmVwbGFjZSgvXFwvJC8sICcnKS50cmltKCk7XG5cbiAgaWYgKCF1dGlsLmhhc0NvbnRlbnQoeGNvZGVGb2xkZXJQYXRoKSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KCd4Y29kZS1zZWxlY3QgcmV0dXJuZWQgYW4gZW1wdHkgc3RyaW5nJyk7XG4gIH1cblxuICBpZiAoYXdhaXQgZnMuZXhpc3RzKHhjb2RlRm9sZGVyUGF0aCkpIHtcbiAgICByZXR1cm4geGNvZGVGb2xkZXJQYXRoO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG1zZyA9IGB4Y29kZS1zZWxlY3QgY291bGQgbm90IGZpbmQgeGNvZGUuIFBhdGggJyR7eGNvZGVGb2xkZXJQYXRofScgZG9lcyBub3QgZXhpc3QuYDtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhtc2cpO1xuICB9XG59XG5cbmNvbnN0IGdldFBhdGggPSBfLm1lbW9pemUoZnVuY3Rpb24gZ2V0UGF0aCAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgLy8gZmlyc3Qgd2UgdHJ5IHVzaW5nIHhjb2RlLXNlbGVjdCB0byBmaW5kIHRoZSBwYXRoXG4gIC8vIHRoZW4gd2UgdHJ5IHVzaW5nIHRoZSBzeW1saW5rcyB0aGF0IEFwcGxlIGhhcyBieSBkZWZhdWx0XG4gIHJldHVybiAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0UGF0aEZyb21YY29kZVNlbGVjdCh0aW1lb3V0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgZ2V0UGF0aEZyb21TeW1saW5rKGUubWVzc2FnZSk7XG4gICAgfVxuICB9KSgpO1xufSk7XG5cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgeGNvZGVQYXRoID0gYXdhaXQgZ2V0UGF0aCh0aW1lb3V0KTtcblxuICAvLyB3ZSB3YW50IHRvIHJlYWQgdGhlIENGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIGZyb20gWGNvZGUncyBwbGlzdC5cbiAgLy8gSXQgc2hvdWxkIGJlIGluIC9bcm9vdF0vWENvZGUuYXBwL0NvbnRlbnRzL1xuICBjb25zdCBwbGlzdFBhdGggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4nLCAnSW5mby5wbGlzdCcpO1xuXG4gIGlmICghYXdhaXQgZnMuZXhpc3RzKHBsaXN0UGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgWGNvZGUgdmVyc2lvbi4gJHtwbGlzdFBhdGh9IGRvZXMgbm90IGV4aXN0IG9uIGRpc2suYCk7XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgcGxpc3QucGFyc2VQbGlzdEZpbGUocGxpc3RQYXRoKTtcbiAgcmV0dXJuIHNlbXZlci5jb2VyY2UodmVyc2lvbi5DRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyk7XG59XG5cbmNvbnN0IGdldFZlcnNpb25NZW1vaXplZCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0VmVyc2lvbk1lbW9pemVkIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0VmVyc2lvbldpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFZlcnNpb24gKHBhcnNlID0gZmFsc2UsIHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbk1lbW9pemVkKHJldHJpZXMsIHRpbWVvdXQpO1xuICAvLyB4Y29kZSB2ZXJzaW9uIHN0cmluZ3MgYXJlIG5vdCBleGFjdGx5IHNlbXZlciBzdHJpbmc6IHBhdGNoIHZlcnNpb25zIG9mIDBcbiAgLy8gYXJlIHJlbW92ZWQgKGUuZy4sICcxMC4wLjAnID0+ICcxMC4wJylcbiAgY29uc3QgdmVyc2lvblN0cmluZyA9IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi52ZXJzaW9uIDogYCR7dmVyc2lvbi5tYWpvcn0uJHt2ZXJzaW9uLm1pbm9yfWA7XG4gIGlmICghcGFyc2UpIHtcbiAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvblN0cmluZyxcbiAgICB2ZXJzaW9uRmxvYXQ6IHBhcnNlRmxvYXQodmVyc2lvblN0cmluZyksXG4gICAgbWFqb3I6IHZlcnNpb24ubWFqb3IsXG4gICAgbWlub3I6IHZlcnNpb24ubWlub3IsXG4gICAgcGF0Y2g6IHZlcnNpb24ucGF0Y2ggPiAwID8gdmVyc2lvbi5wYXRjaCA6IHVuZGVmaW5lZCxcbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gdmVyc2lvblN0cmluZztcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRDb21tYW5kTGluZVRvb2xzVmVyc2lvbiAoKSB7XG4gIC8vIHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2F5cyB0aGF0IHRoZSBDTEkgdG9vbHMgdmVyc2lvbiBoYXMgYmVlblxuICAvLyByZXByZXNlbnRlZC4gVHJ5IHRoZW0gZnJvbSBtb3N0IHJlbGlhYmxlIHRvIGxlYXN0LCBmYWxsaW5nIGRvd24gdGhlIGNoYWluXG4gIGNvbnN0IGdldFZlcnNpb25GdW5jdGlvbnMgPSBbXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHBrZyA9IChhd2FpdCBleGVjKCdwa2d1dGlsJywgWyctLXBrZ3M9Y29tLmFwcGxlLnBrZy5EZXZTREtfLionXSkpLnN0ZG91dDtcbiAgICAgIHJldHVybiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz0ke3BrZy50cmltKCl9YF0pKS5zdGRvdXQ7XG4gICAgfSxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkNMVG9vbHNfRXhlY3V0YWJsZXNgXSkpLnN0ZG91dCxcbiAgICBhc3luYyAoKSA9PiAoYXdhaXQgZXhlYygncGtndXRpbCcsIFtgLS1wa2ctaW5mbz1jb20uYXBwbGUucGtnLkRldmVsb3BlclRvb2xzQ0xJYF0pKS5zdGRvdXQsXG4gIF07XG4gIGxldCBzdGRvdXQ7XG4gIGZvciAobGV0IGdldFZlcnNpb24gb2YgZ2V0VmVyc2lvbkZ1bmN0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBzdGRvdXQgPSBhd2FpdCBnZXRWZXJzaW9uKCk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgIHN0ZG91dCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vIHN0ZG91dCBzaG91bGQgaGF2ZSBhIGxpbmUgbGlrZSBgdmVyc2lvbjogOC4wLjAuMC4xLjE0NzI0MzU4ODFgXG4gIGxldCBtYXRjaCA9IC9edmVyc2lvbjogKC4rKSQvbS5leGVjKHN0ZG91dCk7IC8vIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvSFYzeDRkLzFcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaHR0cHM6Ly90cmFjLm1hY3BvcnRzLm9yZy93aWtpL1hjb2RlVmVyc2lvbkluZm9cbiAqIHRvIHNlZSB0aGUgYWN0dWFsIG1hcHBpbmcgYmV0d2VlbiBjbGFuZyBhbmQgb3RoZXIgY29tcG9uZW50cy5cbiAqXG4gKiBAcmV0dXJucyB7P3N0cmluZ30gVGhlIGFjdHVhbCBDbGFuZyB2ZXJzaW9uIGluIHgueC54Lnggb3IgeC54LnggZm9ybWF0LFxuICogd2hpY2ggaXMgc3VwcGxpZWQgd2l0aCBDb21tYW5kIExpbmUgVG9vbHMuIGBudWxsYCBpcyByZXR1cm5lZFxuICogaWYgQ0xUIGFyZSBub3QgaW5zdGFsbGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDbGFuZ1ZlcnNpb24gKCkge1xuICB0cnkge1xuICAgIGF3YWl0IGZzLndoaWNoKCdjbGFuZycpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmluZm8oJ0Nhbm5vdCBmaW5kIGNsYW5nIGV4ZWN1dGFibGUgb24gdGhlIGxvY2FsIHN5c3RlbS4gJyArXG4gICAgICAnQXJlIFhjb2RlIENvbW1hbmQgTGluZSBUb29scyBpbnN0YWxsZWQ/Jyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKCdjbGFuZycsIFsnLS12ZXJzaW9uJ10pO1xuICBjb25zdCBtYXRjaCA9IC9jbGFuZy0oWzAtOS5dKykvLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIGxvZy5pbmZvKGBDYW5ub3QgcGFyc2UgY2xhbmcgdmVyc2lvbiBmcm9tICR7c3Rkb3V0fWApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBtYXRjaFsxXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRoV2l0aG91dFJldHJ5ICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB4Y29kZVBhdGggPSBhd2FpdCBnZXRQYXRoKHRpbWVvdXQpO1xuXG4gIC8vIGZvciBpb3MgOCBhbmQgdXAsIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgQXV0aW9tYXRpb25JbnN0cnVtZW50IGNoYW5nZWQuXG4gIC8vIHJhdGhlciB0aGFuIHdhc3RlIHRpbWUgZ2V0dGluZyB0aGUgaU9TU0RLVmVyc2lvbiwganVzdCBnZXQgYm90aCBwYXRocyBhbmQgc2VlIHdoaWNoIG9uZSBleGlzdHNcbiAgY29uc3QgZXh0ZW5zaW9ucyA9IFsneHJwbHVnaW4nLCAnYnVuZGxlJ107XG4gIGNvbnN0IHBhdGhQcmVmaXggPSBwYXRoLnJlc29sdmUoeGNvZGVQYXRoLCAnLi4vQXBwbGljYXRpb25zL0luc3RydW1lbnRzLmFwcC9Db250ZW50cy9QbHVnSW5zJyk7XG4gIGNvbnN0IHBhdGhTdWZmaXggPSAnQ29udGVudHMvUmVzb3VyY2VzL0F1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSc7XG4gIGxldCBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzID0gW1xuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzBdfWAsIHBhdGhTdWZmaXgpLFxuICAgIHBhdGgucmVzb2x2ZShwYXRoUHJlZml4LCBgQXV0b21hdGlvbkluc3RydW1lbnQuJHtleHRlbnNpb25zWzFdfWAsIHBhdGhTdWZmaXgpXG4gIF07XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzBdO1xuICB9XG5cbiAgaWYgKGF3YWl0IGZzLmV4aXN0cyhhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdKSkge1xuICAgIHJldHVybiBhdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhzWzFdO1xuICB9XG5cbiAgY29uc3QgbXNnID0gJ0NvdWxkIG5vdCBmaW5kIEF1dG9tYXRpb24udHJhY2V0ZW1wbGF0ZSBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZycgK1xuICAgICAgICAgICAgICBgbG9jYXRpb25zICR7YXV0b21hdGlvblRyYWNlVGVtcGxhdGVQYXRocy50b1N0cmluZygpfWA7XG4gIGxvZy5lcnJvcihtc2cpO1xuICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcblxufVxuXG5jb25zdCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGggPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCAocmV0cmllcyA9IERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHJldHJ5KHJldHJpZXMsIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aFdpdGhvdXRSZXRyeSwgdGltZW91dCk7XG4gIH1cbik7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgdmVyc2lvbiA9IGF3YWl0IGdldFZlcnNpb24oZmFsc2UsIERFRkFVTFRfTlVNQkVSX09GX1JFVFJJRVMsIHRpbWVvdXQpO1xuICBpZiAodmVyc2lvblswXSA9PT0gJzQnKSB7XG4gICAgcmV0dXJuICc2LjEnO1xuICB9XG5cbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnaXBob25lc2ltdWxhdG9yJywgJy0tc2hvdy1zZGstdmVyc2lvbiddO1xuICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBjb25zdCBzZGtWZXJzaW9uID0gc3Rkb3V0LnRyaW0oKTtcbiAgY29uc3QgbWF0Y2ggPSAvXFxkLlxcZC8uZXhlYyhzdGRvdXQpO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHhjcnVuIHJldHVybmVkIGEgbm9uLW51bWVyaWMgaU9TIFNESyB2ZXJzaW9uOiAnJHtzZGtWZXJzaW9ufSdgKTtcbiAgfVxuXG4gIHJldHVybiBzZGtWZXJzaW9uO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uICh0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICBjb25zdCB2ZXJzaW9uID0gYXdhaXQgZ2V0VmVyc2lvbih0cnVlLCBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0KTtcbiAgLy8gYXMgb2Ygbm93LCB0aGUgaU9TIHZlcnNpb24gYXNzb2NpYXRlZCB3aXRoIGFuIFhjb2RlIHZlcnNpb24gaXNcbiAgLy8ganVzdCB0aGUgWGNvZGUgdmVyc2lvbiArIDJcbiAgcmV0dXJuIGAke3ZlcnNpb24ubWFqb3IgKyAyfS4ke3ZlcnNpb24ubWlub3J9YDtcbn1cblxuY29uc3QgZ2V0TWF4SU9TU0RLID0gXy5tZW1vaXplKFxuICBmdW5jdGlvbiBnZXRNYXhJT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0TWF4SU9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBVbmFibGUgdG8gcmV0cmlldmUgbWF4aW11bSBpT1MgdmVyc2lvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGxvZy53YXJuKCdHdWVzc2luZyBmcm9tIFhjb2RlIHZlcnNpb24nKTtcbiAgICAgIHJldHVybiBnZXRNYXhJT1NTREtGcm9tWGNvZGVWZXJzaW9uKHRpbWVvdXQpO1xuICAgIH1cbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TWF4VFZPU1NES1dpdGhvdXRSZXRyeSAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgYXJncyA9IFsnLS1zZGsnLCAnYXBwbGV0dnNpbXVsYXRvcicsICctLXNob3ctc2RrLXZlcnNpb24nXTtcbiAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBydW5YY3J1bkNvbW1hbmQoYXJncywgdGltZW91dCk7XG5cbiAgY29uc3Qgc2RrVmVyc2lvbiA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKGlzTmFOKHBhcnNlRmxvYXQoc2RrVmVyc2lvbikpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB4Y3J1biByZXR1cm5lZCBhIG5vbi1udW1lcmljIHR2T1MgU0RLIHZlcnNpb246ICcke3Nka1ZlcnNpb259J2ApO1xuICB9XG5cbiAgcmV0dXJuIHNka1ZlcnNpb247XG59XG5cbmNvbnN0IGdldE1heFRWT1NTREsgPSBfLm1lbW9pemUoXG4gIGZ1bmN0aW9uIGdldE1heFRWT1NTREsgKHJldHJpZXMgPSBERUZBVUxUX05VTUJFUl9PRl9SRVRSSUVTLCB0aW1lb3V0ID0gWENSVU5fVElNRU9VVCkge1xuICAgIHJldHVybiByZXRyeShyZXRyaWVzLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q29ubmVjdGVkRGV2aWNlcyAodGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgY29uc3QgY21kID0gJy91c3Ivc2Jpbi9zeXN0ZW1fcHJvZmlsZXInO1xuICBjb25zdCBhcmdzID0gWycteG1sJywgJ1NQVVNCRGF0YVR5cGUnXTtcbiAgbGV0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyhjbWQsIGFyZ3MsIHt0aW1lb3V0fSk7XG4gIGxldCBwbGlzdENvbnRlbnQgPSBwYXJzZVBsaXN0RGF0YShzdGRvdXQpO1xuXG4gIGxldCBkZXZpY2VzRm91bmQgPSBbXTtcbiAgbGV0IGVudHJpZXNUb1NlYXJjaCA9IFtwbGlzdENvbnRlbnRbMF1dO1xuICB3aGlsZSAoZW50cmllc1RvU2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICBsZXQgY3VycmVudEVudHJ5ID0gZW50cmllc1RvU2VhcmNoLnBvcCgpO1xuICAgIGlmIChjdXJyZW50RW50cnkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZW50cmllc1RvU2VhcmNoID0gZW50cmllc1RvU2VhcmNoLmNvbmNhdChjdXJyZW50RW50cnkpO1xuICAgIH0gZWxzZSBpZiAoKGN1cnJlbnRFbnRyeS5fbmFtZSAmJlxuICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeS5fbmFtZS5zdWJzdHJpbmcoMCwgNCkgPT09ICdpUGFkJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiZcbiAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkuX25hbWUuc3Vic3RyaW5nKDAsIDYpID09PSAnaVBob25lJykgfHxcbiAgICAgICAgICAgICAgIChjdXJyZW50RW50cnkuX25hbWUgJiYgXy5pbmNsdWRlcyhjdXJyZW50RW50cnkuX25hbWUsICdBcHBsZSBUVicpKSkge1xuICAgICAgbGV0IGRldmljZUluZm8gPSB7XG4gICAgICAgIG5hbWU6IGN1cnJlbnRFbnRyeS5fbmFtZSxcbiAgICAgICAgdWRpZDogY3VycmVudEVudHJ5LnNlcmlhbF9udW0sXG4gICAgICAgIHByb2R1Y3RJZDogY3VycmVudEVudHJ5LnByb2R1Y3RfaWQsXG4gICAgICAgIGRldmljZVZlcnNpb246IGN1cnJlbnRFbnRyeS5iY2RfZGV2aWNlXG4gICAgICB9O1xuICAgICAgZGV2aWNlc0ZvdW5kLnB1c2goZGV2aWNlSW5mbyk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50RW50cnkuX2l0ZW1zKSB7XG4gICAgICBlbnRyaWVzVG9TZWFyY2ggPSBlbnRyaWVzVG9TZWFyY2guY29uY2F0KGN1cnJlbnRFbnRyeS5faXRlbXMpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGV2aWNlc0ZvdW5kO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRJbnN0cnVtZW50c1BhdGhXaXRob3V0UmV0cnkgKHRpbWVvdXQgPSBYQ1JVTl9USU1FT1VUKSB7XG4gIGNvbnN0IGFyZ3MgPSBbJy1maW5kJywgJ2luc3RydW1lbnRzJ107XG4gIGxldCB7c3Rkb3V0fSA9IGF3YWl0IHJ1blhjcnVuQ29tbWFuZChhcmdzLCB0aW1lb3V0KTtcblxuICBpZiAoIXN0ZG91dCkge1xuICAgIHN0ZG91dCA9ICcnO1xuICB9XG5cbiAgbGV0IGluc3RydW1lbnRzUGF0aCA9IHN0ZG91dC50cmltKCk7XG5cbiAgaWYgKCFpbnN0cnVtZW50c1BhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHBhdGggdG8gaW5zdHJ1bWVudHMgYmluYXJ5IHVzaW5nICd4Y3J1biAke2FyZ3Muam9pbignICcpfSdgKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0cnVtZW50c1BhdGg7XG59XG5cbmNvbnN0IGdldEluc3RydW1lbnRzUGF0aCA9IF8ubWVtb2l6ZShcbiAgZnVuY3Rpb24gZ2V0SW5zdHJ1bWVudHNQYXRoIChyZXRyaWVzID0gREVGQVVMVF9OVU1CRVJfT0ZfUkVUUklFUywgdGltZW91dCA9IFhDUlVOX1RJTUVPVVQpIHtcbiAgICByZXR1cm4gcmV0cnkocmV0cmllcywgZ2V0SW5zdHJ1bWVudHNQYXRoV2l0aG91dFJldHJ5LCB0aW1lb3V0KTtcbiAgfVxuKTtcblxuZnVuY3Rpb24gY2xlYXJJbnRlcm5hbENhY2hlICgpIHtcblxuICAvLyBtZW1vaXplZCBmdW5jdGlvbnNcbiAgY29uc3QgbWVtb2l6ZWQgPSBbXG4gICAgZ2V0UGF0aCwgZ2V0VmVyc2lvbk1lbW9pemVkLCBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGgsIGdldE1heElPU1NESyxcbiAgICBnZXRNYXhUVk9TU0RLLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIF07XG5cbiAgbWVtb2l6ZWQuZm9yRWFjaCgoZikgPT4ge1xuICAgIGlmIChmLmNhY2hlKSB7XG4gICAgICBmLmNhY2hlID0gbmV3IF8ubWVtb2l6ZS5DYWNoZSgpO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCB7XG4gIGdldFBhdGgsIGdldFZlcnNpb24sIGdldEF1dG9tYXRpb25UcmFjZVRlbXBsYXRlUGF0aCwgZ2V0TWF4SU9TU0RLLFxuICBnZXRBdXRvbWF0aW9uVHJhY2VUZW1wbGF0ZVBhdGhXaXRob3V0UmV0cnksIGdldE1heElPU1NES1dpdGhvdXRSZXRyeSxcbiAgZ2V0Q29ubmVjdGVkRGV2aWNlcywgY2xlYXJJbnRlcm5hbENhY2hlLCBnZXRJbnN0cnVtZW50c1BhdGgsXG4gIGdldENvbW1hbmRMaW5lVG9vbHNWZXJzaW9uLCBnZXRNYXhUVk9TU0RLLCBnZXRNYXhUVk9TU0RLV2l0aG91dFJldHJ5LFxuICBnZXRDbGFuZ1ZlcnNpb24sXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQSxNQUFNQSxHQUFHLEdBQUdDLE9BQU8sQ0FBQ0QsR0FBRztBQUV2QixNQUFNRSxhQUFhLEdBQUcsS0FBSztBQUMzQixNQUFNQyxZQUFZLEdBQUcscUJBQXFCO0FBQzFDLE1BQU1DLHlCQUF5QixHQUFHLENBQUM7QUFFbkMsTUFBTUMsR0FBRyxHQUFHQyxlQUFNLENBQUNDLFNBQVMsQ0FBQyxPQUFPLENBQUM7QUFHckMsU0FBU0MsaUJBQWlCLENBQUVDLElBQUksRUFBRTtFQUNoQyxPQUFPQSxJQUFJLENBQUNDLFNBQVMsQ0FBQ0QsSUFBSSxDQUFDRSxNQUFNLEdBQUdSLFlBQVksQ0FBQ1EsTUFBTSxDQUFDLEtBQUtSLFlBQVk7QUFDM0U7QUFFQSxlQUFlUyxlQUFlLENBQUVDLElBQUksRUFBRUMsT0FBTyxHQUFHWixhQUFhLEVBQUU7RUFDN0QsSUFBSTtJQUNGLE1BQU1h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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xcode.js","names":["env","process","XCRUN_TIMEOUT","XCODE_SUBDIR","DEFAULT_NUMBER_OF_RETRIES","log","logger","getLogger","hasExpectedSubDir","path","substring","length","runXcrunCommand","args","timeout","res","exec","_","isUndefined","Error","join","err","stderr","message","getPathFromSymlink","failMessage","warn","symlinkPath","legacySymlinkPath","xcodePath","util","hasContent","DEVELOPER_DIR","customPath","fs","exists","mesg","readlink","replace","RegExp","trim","msg","getPathFromXcodeSelect","stdout","xcodeFolderPath","errorAndThrow","getPath","memoize","e","getVersionWithoutRetry","plistPath","resolve","version","plist","parsePlistFile","semver","coerce","CFBundleShortVersionString","getVersionMemoized","retries","retry","getVersion","parse","versionString","patch","major","minor","versionFloat","parseFloat","undefined","toString","getCommandLineToolsVersion","getVersionFunctions","pkg","ign","match","getClangVersion","which","info","getAutomationTraceTemplatePathWithoutRetry","extensions","pathPrefix","pathSuffix","automationTraceTemplatePaths","error","getAutomationTraceTemplatePath","getMaxIOSSDKWithoutRetry","sdkVersion","getMaxIOSSDKFromXcodeVersion","getMaxIOSSDK","getMaxTVOSSDKWithoutRetry","isNaN","getMaxTVOSSDK","getConnectedDevices","cmd","plistContent","parsePlistData","devicesFound","entriesToSearch","currentEntry","pop","Array","concat","_name","includes","deviceInfo","name","udid","serial_num","productId","product_id","deviceVersion","bcd_device","push","_items","getInstrumentsPathWithoutRetry","instrumentsPath","getInstrumentsPath","clearInternalCache","memoized","forEach","f","cache","Cache"],"sources":["../../lib/xcode.js"],"sourcesContent":["import { util, fs, plist, logger } from '@appium/support';\nimport path from 'path';\nimport { retry } from 'asyncbox';\nimport _ from 'lodash';\nimport { parse as parsePlistData } from 'plist';\nimport { exec } from 'teen_process';\nimport semver from 'semver';\n\n\nconst env = process.env;\n\nconst XCRUN_TIMEOUT = 15000;\nconst XCODE_SUBDIR = '/Contents/Developer';\nconst DEFAULT_NUMBER_OF_RETRIES = 3;\n\nconst log = logger.getLogger('Xcode');\n\n\nfunction hasExpectedSubDir (path) {\n return path.substring(path.length - XCODE_SUBDIR.length) === XCODE_SUBDIR;\n}\n\nasync function runXcrunCommand (args, timeout = XCRUN_TIMEOUT) {\n try {\n const res = await exec('xcrun', args, {timeout});\n if (_.isUndefined(res)) {\n throw new Error(`Nothing returned from trying to run 'xcrun ${args.join(' ')}'`);\n }\n return res;\n } catch (err) {\n // the true error can be hidden within the stderr\n if (err.stderr) {\n err.message = `${err.message}: ${err.stderr}`;\n }\n\n throw err;\n }\n}\n\nasync function getPathFromSymlink (failMessage) {\n // Node's invocation of xcode-select sometimes flakes and returns an empty string.\n // Not clear why. As a workaround, Appium can reliably deduce the version in use by checking\n // the locations xcode-select uses to store the selected version's path. This should be 100%\n // reliable so long as the link locations remain the same. However, since we're relying on\n // hardcoded paths, this approach will break the next time Apple changes the symlink location.\n log.warn(`Finding XcodePath by symlink because ${failMessage}`);\n\n const symlinkPath = '/var/db/xcode_select_link';\n const legacySymlinkPath = '/usr/share/xcode-select/xcode_dir_link'; // Xcode < 5.x\n let xcodePath = null;\n\n // xcode-select allows users to override its settings with the DEVELOPER_DIR env var,\n // so check that first\n if (util.hasContent(env.DEVELOPER_DIR)) {\n const customPath = hasExpectedSubDir(env.DEVELOPER_DIR)\n ? env.DEVELOPER_DIR\n : env.DEVELOPER_DIR + XCODE_SUBDIR;\n\n if (await fs.exists(customPath)) {\n xcodePath = customPath;\n } else {\n let mesg = `Could not find path to Xcode, environment variable ` +\n `DEVELOPER_DIR set to: ${env.DEVELOPER_DIR} ` +\n `but no Xcode found`;\n log.warn(mesg);\n throw new Error(mesg);\n }\n } else if (await fs.exists(symlinkPath)) {\n xcodePath = await fs.readlink(symlinkPath);\n } else if (await fs.exists(legacySymlinkPath)) {\n xcodePath = await fs.readlink(legacySymlinkPath);\n }\n\n if (xcodePath) {\n return xcodePath.replace(new RegExp('/$'), '').trim();\n }\n\n // We should only get here is we failed to capture xcode-select's stdout and our\n // other checks failed. Either Apple has moved the symlink to a new location or the user\n // is not using the default install. 99.999% chance it's the latter, so issue a warning\n // should we ever hit the edge case.\n let msg = `Could not find path to Xcode by symlinks located in ${symlinkPath}, or ${legacySymlinkPath}`;\n log.warn(msg);\n throw new Error(msg);\n}\n\nasync function getPathFromXcodeSelect (timeout = XCRUN_TIMEOUT) {\n let {stdout} = await exec('xcode-select', ['--print-path'], {timeout});\n\n // trim and remove trailing slash\n const xcodeFolderPath = stdout.replace(/\\/$/, '').trim();\n\n if (!util.hasContent(xcodeFolderPath)) {\n log.errorAndThrow('xcode-select returned an empty string');\n }\n\n if (await fs.exists(xcodeFolderPath)) {\n return xcodeFolderPath;\n } else {\n const msg = `xcode-select could not find xcode. Path '${xcodeFolderPath}' does not exist.`;\n log.errorAndThrow(msg);\n }\n}\n\nconst getPath = _.memoize(function getPath (timeout = XCRUN_TIMEOUT) {\n // first we try using xcode-select to find the path\n // then we try using the symlinks that Apple has by default\n return (async () => {\n try {\n return await getPathFromXcodeSelect(timeout);\n } catch (e) {\n return await getPathFromSymlink(e.message);\n }\n })();\n});\n\n\nasync function getVersionWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const xcodePath = await getPath(timeout);\n\n // we want to read the CFBundleShortVersionString from Xcode's plist.\n // It should be in /[root]/XCode.app/Contents/\n const plistPath = path.resolve(xcodePath, '..', 'Info.plist');\n\n if (!await fs.exists(plistPath)) {\n throw new Error(`Could not get Xcode version. ${plistPath} does not exist on disk.`);\n }\n\n const version = await plist.parsePlistFile(plistPath);\n return semver.coerce(version.CFBundleShortVersionString);\n}\n\nconst getVersionMemoized = _.memoize(\n function getVersionMemoized (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getVersionWithoutRetry, timeout);\n }\n);\n\nasync function getVersion (parse = false, retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n const version = await getVersionMemoized(retries, timeout);\n // xcode version strings are not exactly semver string: patch versions of 0\n // are removed (e.g., '10.0.0' => '10.0')\n const versionString = version.patch > 0 ? version.version : `${version.major}.${version.minor}`;\n if (!parse) {\n return versionString;\n }\n\n return {\n versionString,\n versionFloat: parseFloat(versionString),\n major: version.major,\n minor: version.minor,\n patch: version.patch > 0 ? version.patch : undefined,\n toString () {\n return versionString;\n },\n };\n}\n\nasync function getCommandLineToolsVersion () {\n // there are a number of different ways that the CLI tools version has been\n // represented. Try them from most reliable to least, falling down the chain\n const getVersionFunctions = [\n async () => {\n let pkg = (await exec('pkgutil', ['--pkgs=com.apple.pkg.DevSDK_.*'])).stdout;\n return (await exec('pkgutil', [`--pkg-info=${pkg.trim()}`])).stdout;\n },\n async () => (await exec('pkgutil', [`--pkg-info=com.apple.pkg.CLTools_Executables`])).stdout,\n async () => (await exec('pkgutil', [`--pkg-info=com.apple.pkg.DeveloperToolsCLI`])).stdout,\n ];\n let stdout;\n for (let getVersion of getVersionFunctions) {\n try {\n stdout = await getVersion();\n break;\n } catch (ign) {\n stdout = '';\n }\n }\n\n // stdout should have a line like `version: 8.0.0.0.1.1472435881`\n let match = /^version: (.+)$/m.exec(stdout); // https://regex101.com/r/HV3x4d/1\n return match ? match[1] : undefined;\n}\n\n/**\n * Check https://trac.macports.org/wiki/XcodeVersionInfo\n * to see the actual mapping between clang and other components.\n *\n * @returns {?string} The actual Clang version in x.x.x.x or x.x.x format,\n * which is supplied with Command Line Tools. `null` is returned\n * if CLT are not installed.\n */\nasync function getClangVersion () {\n try {\n await fs.which('clang');\n } catch (e) {\n log.info('Cannot find clang executable on the local system. ' +\n 'Are Xcode Command Line Tools installed?');\n return null;\n }\n const {stdout} = await exec('clang', ['--version']);\n const match = /clang-([0-9.]+)/.exec(stdout);\n if (!match) {\n log.info(`Cannot parse clang version from ${stdout}`);\n return null;\n }\n return match[1];\n}\n\nasync function getAutomationTraceTemplatePathWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const xcodePath = await getPath(timeout);\n\n // for ios 8 and up, the file extension for AutiomationInstrument changed.\n // rather than waste time getting the iOSSDKVersion, just get both paths and see which one exists\n const extensions = ['xrplugin', 'bundle'];\n const pathPrefix = path.resolve(xcodePath, '../Applications/Instruments.app/Contents/PlugIns');\n const pathSuffix = 'Contents/Resources/Automation.tracetemplate';\n let automationTraceTemplatePaths = [\n path.resolve(pathPrefix, `AutomationInstrument.${extensions[0]}`, pathSuffix),\n path.resolve(pathPrefix, `AutomationInstrument.${extensions[1]}`, pathSuffix)\n ];\n\n if (await fs.exists(automationTraceTemplatePaths[0])) {\n return automationTraceTemplatePaths[0];\n }\n\n if (await fs.exists(automationTraceTemplatePaths[1])) {\n return automationTraceTemplatePaths[1];\n }\n\n const msg = 'Could not find Automation.tracetemplate in any of the following' +\n `locations ${automationTraceTemplatePaths.toString()}`;\n log.error(msg);\n throw new Error(msg);\n\n}\n\nconst getAutomationTraceTemplatePath = _.memoize(\n function getAutomationTraceTemplatePath (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getAutomationTraceTemplatePathWithoutRetry, timeout);\n }\n);\n\nasync function getMaxIOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const version = await getVersion(false, DEFAULT_NUMBER_OF_RETRIES, timeout);\n if (version[0] === '4') {\n return '6.1';\n }\n\n const args = ['--sdk', 'iphonesimulator', '--show-sdk-version'];\n const {stdout} = await runXcrunCommand(args, timeout);\n\n const sdkVersion = stdout.trim();\n const match = /\\d.\\d/.exec(stdout);\n\n if (!match) {\n throw new Error(`xcrun returned a non-numeric iOS SDK version: '${sdkVersion}'`);\n }\n\n return sdkVersion;\n}\n\nasync function getMaxIOSSDKFromXcodeVersion (timeout = XCRUN_TIMEOUT) {\n const version = await getVersion(true, DEFAULT_NUMBER_OF_RETRIES, timeout);\n // as of now, the iOS version associated with an Xcode version is\n // just the Xcode version + 2\n return `${version.major + 2}.${version.minor}`;\n}\n\nconst getMaxIOSSDK = _.memoize(\n function getMaxIOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n try {\n return retry(retries, getMaxIOSSDKWithoutRetry, timeout);\n } catch (err) {\n log.warn(`Unable to retrieve maximum iOS version: ${err.message}`);\n log.warn('Guessing from Xcode version');\n return getMaxIOSSDKFromXcodeVersion(timeout);\n }\n }\n);\n\nasync function getMaxTVOSSDKWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const args = ['--sdk', 'appletvsimulator', '--show-sdk-version'];\n const {stdout} = await runXcrunCommand(args, timeout);\n\n const sdkVersion = stdout.trim();\n\n if (isNaN(parseFloat(sdkVersion))) {\n throw new Error(`xcrun returned a non-numeric tvOS SDK version: '${sdkVersion}'`);\n }\n\n return sdkVersion;\n}\n\nconst getMaxTVOSSDK = _.memoize(\n function getMaxTVOSSDK (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getMaxTVOSSDKWithoutRetry, timeout);\n }\n);\n\nasync function getConnectedDevices (timeout = XCRUN_TIMEOUT) {\n const cmd = '/usr/sbin/system_profiler';\n const args = ['-xml', 'SPUSBDataType'];\n let {stdout} = await exec(cmd, args, {timeout});\n let plistContent = parsePlistData(stdout);\n\n let devicesFound = [];\n let entriesToSearch = [plistContent[0]];\n while (entriesToSearch.length > 0) {\n let currentEntry = entriesToSearch.pop();\n if (currentEntry instanceof Array) {\n entriesToSearch = entriesToSearch.concat(currentEntry);\n } else if ((currentEntry._name &&\n currentEntry._name.substring(0, 4) === 'iPad') ||\n (currentEntry._name &&\n currentEntry._name.substring(0, 6) === 'iPhone') ||\n (currentEntry._name && _.includes(currentEntry._name, 'Apple TV'))) {\n let deviceInfo = {\n name: currentEntry._name,\n udid: currentEntry.serial_num,\n productId: currentEntry.product_id,\n deviceVersion: currentEntry.bcd_device\n };\n devicesFound.push(deviceInfo);\n } else if (currentEntry._items) {\n entriesToSearch = entriesToSearch.concat(currentEntry._items);\n }\n }\n return devicesFound;\n}\n\nasync function getInstrumentsPathWithoutRetry (timeout = XCRUN_TIMEOUT) {\n const args = ['-find', 'instruments'];\n let {stdout} = await runXcrunCommand(args, timeout);\n\n if (!stdout) {\n stdout = '';\n }\n\n let instrumentsPath = stdout.trim();\n\n if (!instrumentsPath) {\n throw new Error(`Could not find path to instruments binary using 'xcrun ${args.join(' ')}'`);\n }\n\n return instrumentsPath;\n}\n\nconst getInstrumentsPath = _.memoize(\n function getInstrumentsPath (retries = DEFAULT_NUMBER_OF_RETRIES, timeout = XCRUN_TIMEOUT) {\n return retry(retries, getInstrumentsPathWithoutRetry, timeout);\n }\n);\n\nfunction clearInternalCache () {\n\n // memoized functions\n const memoized = [\n getPath, getVersionMemoized, getAutomationTraceTemplatePath, getMaxIOSSDK,\n getMaxTVOSSDK, getInstrumentsPath,\n ];\n\n memoized.forEach((f) => {\n if (f.cache) {\n f.cache = new _.memoize.Cache();\n }\n });\n}\n\nexport {\n getPath, getVersion, getAutomationTraceTemplatePath, getMaxIOSSDK,\n getAutomationTraceTemplatePathWithoutRetry, getMaxIOSSDKWithoutRetry,\n getConnectedDevices, clearInternalCache, getInstrumentsPath,\n getCommandLineToolsVersion, getMaxTVOSSDK, getMaxTVOSSDKWithoutRetry,\n getClangVersion,\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "ios",
7
7
  "xcode"
8
8
  ],
9
- "version": "4.0.2",
9
+ "version": "4.0.3",
10
10
  "author": "Appium Contributors",
11
11
  "license": "Apache-2.0",
12
12
  "repository": {
@@ -29,7 +29,8 @@
29
29
  "index.js",
30
30
  "lib",
31
31
  "build/index.js",
32
- "build/lib"
32
+ "build/lib",
33
+ "CHANGELOG.md"
33
34
  ],
34
35
  "dependencies": {
35
36
  "@appium/support": "^2.55.3",
@@ -74,6 +75,7 @@
74
75
  "@babel/plugin-transform-runtime": "^7.18.10",
75
76
  "@babel/preset-env": "^7.18.10",
76
77
  "@babel/register": "^7.18.9",
78
+ "@semantic-release/changelog": "^6.0.1",
77
79
  "@semantic-release/git": "^10.0.1",
78
80
  "babel-plugin-source-map-support": "^2.2.0",
79
81
  "chai": "^4.1.2",