appium-chromedriver 4.26.4 → 4.27.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/README.md +6 -1
- package/build/lib/chromedriver.js +2 -2
- package/build/lib/install.js +24 -138
- package/build/lib/storage-client.js +14 -22
- package/build/lib/utils.js +55 -42
- package/config/mapping.json +4 -0
- package/lib/install.js +25 -117
- package/lib/storage-client.js +21 -21
- package/lib/utils.js +47 -40
- package/package.json +7 -7
|
@@ -28,21 +28,6 @@ const MAX_PARALLEL_DOWNLOADS = 5;
|
|
|
28
28
|
|
|
29
29
|
const log = _appiumSupport.logger.getLogger('ChromedriverStorageClient');
|
|
30
30
|
|
|
31
|
-
async function getOsInfo() {
|
|
32
|
-
let name = 'linux';
|
|
33
|
-
|
|
34
|
-
if (_appiumSupport.system.isWindows()) {
|
|
35
|
-
name = 'win';
|
|
36
|
-
} else if (_appiumSupport.system.isMac()) {
|
|
37
|
-
name = 'mac';
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
return {
|
|
41
|
-
name,
|
|
42
|
-
arch: await _appiumSupport.system.arch()
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
|
|
46
31
|
async function isCrcOk(src, checksum) {
|
|
47
32
|
const md5 = await _appiumSupport.fs.hash(src, 'md5');
|
|
48
33
|
return _lodash.default.toLower(md5) === _lodash.default.toLower(checksum);
|
|
@@ -153,7 +138,6 @@ class ChromedriverStorageClient {
|
|
|
153
138
|
continue;
|
|
154
139
|
}
|
|
155
140
|
|
|
156
|
-
log.debug(`Processing chromedriver entry '${key}'`);
|
|
157
141
|
const etag = extractNodeText(findChildNode(driverNode, 'ETag'));
|
|
158
142
|
|
|
159
143
|
if (!etag) {
|
|
@@ -269,15 +253,21 @@ class ChromedriverStorageClient {
|
|
|
269
253
|
if (!_lodash.default.isEmpty(osInfo)) {
|
|
270
254
|
let {
|
|
271
255
|
name,
|
|
272
|
-
arch
|
|
256
|
+
arch,
|
|
257
|
+
hardwareName
|
|
273
258
|
} = osInfo;
|
|
274
259
|
|
|
275
|
-
if (arch ===
|
|
276
|
-
arch =
|
|
260
|
+
if (arch === _utils.X64 && !driversToSync.some(cdName => cdName.includes(`_${name}${_utils.X64}`))) {
|
|
261
|
+
arch = _utils.X86;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (name === _utils.OS.mac && _lodash.default.includes(hardwareName, 'arm') && driversToSync.some(cdName => cdName.includes(_utils.M1_ARCH_SUFFIX))) {
|
|
265
|
+
arch += _utils.M1_ARCH_SUFFIX;
|
|
277
266
|
}
|
|
278
267
|
|
|
279
268
|
log.debug(`Selecting chromedrivers whose platform matches to ${name}${arch}`);
|
|
280
|
-
|
|
269
|
+
const platformRe = new RegExp(`(\\b|_)${name}${arch}\\b`);
|
|
270
|
+
driversToSync = driversToSync.filter(cdName => platformRe.test(cdName));
|
|
281
271
|
log.debug(`Got ${_appiumSupport.util.pluralize('item', driversToSync.length, true)}`);
|
|
282
272
|
}
|
|
283
273
|
|
|
@@ -343,6 +333,8 @@ class ChromedriverStorageClient {
|
|
|
343
333
|
}
|
|
344
334
|
|
|
345
335
|
async syncDrivers(opts = {}) {
|
|
336
|
+
var _opts$osInfo;
|
|
337
|
+
|
|
346
338
|
if (_lodash.default.isEmpty(this.mapping)) {
|
|
347
339
|
await this.retrieveMapping(!!opts.minBrowserVersion);
|
|
348
340
|
}
|
|
@@ -351,7 +343,7 @@ class ChromedriverStorageClient {
|
|
|
351
343
|
throw new Error('Cannot retrieve chromedrivers mapping from Google storage');
|
|
352
344
|
}
|
|
353
345
|
|
|
354
|
-
const driversToSync = this.selectMatchingDrivers(await getOsInfo(), opts);
|
|
346
|
+
const driversToSync = this.selectMatchingDrivers((_opts$osInfo = opts.osInfo) !== null && _opts$osInfo !== void 0 ? _opts$osInfo : await (0, _utils.getOsInfo)(), opts);
|
|
355
347
|
|
|
356
348
|
if (_lodash.default.isEmpty(driversToSync)) {
|
|
357
349
|
log.debug(`There are no drivers to sync. Exiting`);
|
|
@@ -396,4 +388,4 @@ var _default = ChromedriverStorageClient;
|
|
|
396
388
|
exports.default = _default;require('source-map-support').install();
|
|
397
389
|
|
|
398
390
|
|
|
399
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zdG9yYWdlLWNsaWVudC5qcyJdLCJuYW1lcyI6WyJUSU1FT1VUX01TIiwiTUFYX1BBUkFMTEVMX0RPV05MT0FEUyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImdldE9zSW5mbyIsIm5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJpc01hYyIsImFyY2giLCJpc0NyY09rIiwic3JjIiwiY2hlY2tzdW0iLCJtZDUiLCJmcyIsImhhc2giLCJfIiwidG9Mb3dlciIsImZpbmRDaGlsZE5vZGUiLCJwYXJlbnQiLCJjaGlsZE5hbWUiLCJ0ZXh0IiwiaGFzQ2hpbGROb2RlcyIsImNoaWxkTm9kZUlkeCIsImNoaWxkTm9kZXMiLCJsZW5ndGgiLCJjaGlsZE5vZGUiLCJsb2NhbE5hbWUiLCJjaGlsZFRleHQiLCJleHRyYWN0Tm9kZVRleHQiLCJub2RlIiwiZmlyc3RDaGlsZCIsInV0aWwiLCJoYXNWYWx1ZSIsIm5vZGVWYWx1ZSIsIkNocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQiLCJjb25zdHJ1Y3RvciIsImFyZ3MiLCJjaHJvbWVkcml2ZXJEaXIiLCJ0aW1lb3V0IiwibWFwcGluZyIsInBhcnNlTm90ZXMiLCJjb250ZW50IiwicmVzdWx0IiwidmVyc2lvbk1hdGNoIiwiZXhlYyIsInZlcnNpb24iLCJtaW5Ccm93c2VyVmVyc2lvbk1hdGNoIiwibWluQnJvd3NlclZlcnNpb24iLCJyZXRyaWV2ZUFkZGl0aW9uYWxEcml2ZXJJbmZvIiwiZHJpdmVyS2V5Iiwibm90ZXNVcmwiLCJpbmZvRGljdCIsIm5vdGVzIiwiYWNjZXB0IiwiZGVidWciLCJwYXJzZVN0b3JhZ2VYbWwiLCJkb2MiLCJzaG91bGRQYXJzZU5vdGVzIiwiZHJpdmVyTm9kZXMiLCJ4cGF0aCIsInNlbGVjdCIsImlzRW1wdHkiLCJwcm9taXNlcyIsImRyaXZlck5vZGUiLCJrZXkiLCJpbmNsdWRlcyIsImV0YWciLCJjZEluZm8iLCJ1cmwiLCJDRF9DRE4iLCJ0cmltIiwiZmlyc3QiLCJzcGxpdCIsIm5vdGVzUGF0aCIsImlzTm90ZXNQcmVzZW50IiwicmVkdWNlIiwiYWNjIiwiaW5mbyIsInB1c2giLCJCIiwiYWxsIiwic2l6ZSIsInJldHJpZXZlTWFwcGluZyIsInhtbCIsIkRPTVBhcnNlciIsInBhcnNlRnJvbVN0cmluZyIsImNsb25lRGVlcCIsInVuemlwRHJpdmVyIiwiZHN0IiwidG1wUm9vdCIsInRlbXBEaXIiLCJvcGVuRGlyIiwiemlwIiwiZXh0cmFjdEFsbFRvIiwiY2hyb21lZHJpdmVyUGF0aCIsIndhbGtEaXIiLCJpdGVtUGF0aCIsImlzRGlyZWN0b3J5IiwicGF0aCIsInBhcnNlIiwiRXJyb3IiLCJiYXNlbmFtZSIsIm12IiwibWtkaXJwIiwicmltcmFmIiwic2VsZWN0TWF0Y2hpbmdEcml2ZXJzIiwib3NJbmZvIiwib3B0cyIsInZlcnNpb25zIiwiZHJpdmVyc1RvU3luYyIsImtleXMiLCJmaWx0ZXIiLCJjZE5hbWUiLCJwbHVyYWxpemUiLCJpc05hTiIsIm1pbkJyb3dzZXJWZXJzaW9uSW50IiwicGFyc2VJbnQiLCJjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIiLCJjdXJyZW50TWluQnJvd3NlclZlcnNpb24iLCJ1bmlxIiwibWFwIiwic29tZSIsInJldHJpZXZlRHJpdmVyIiwiaW5kZXgiLCJhcmNoaXZlc1Jvb3QiLCJpc1N0cmljdCIsImFyY2hpdmVQYXRoIiwicmVzb2x2ZSIsIm5ldCIsImRvd25sb2FkRmlsZSIsImlzTWV0ZXJlZCIsImUiLCJtc2ciLCJtZXNzYWdlIiwiZXJyb3IiLCJmaWxlTmFtZSIsInRhcmdldFBhdGgiLCJjaG1vZCIsInN5bmNEcml2ZXJzIiwiSlNPTiIsInN0cmluZ2lmeSIsInN5bmNocm9uaXplZERyaXZlcnMiLCJpZHgiLCJlbnRyaWVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLFVBQVUsR0FBRyxLQUFuQjtBQUNBLE1BQU1DLHNCQUFzQixH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QUErQjRELGFBQWEsQ0FBQ2tDLE9BQWQsRUFBL0IsRUFBd0Q7QUFDdERqRixRQUFBQSxRQUFRLENBQUNnQixJQUFULENBQWMsQ0FBQyxZQUFZO0FBQ3pCLGNBQUksTUFBTSxLQUFLNEMsY0FBTCxDQUFvQm9CLEdBQXBCLEVBQXlCN0YsU0FBekIsRUFBb0MyRSxZQUFwQyxFQUFrRCxDQUFDN0csZ0JBQUU4QyxPQUFGLENBQVU4QyxJQUFWLENBQW5ELENBQVYsRUFBK0U7QUFDN0VrQyxZQUFBQSxtQkFBbUIsQ0FBQy9ELElBQXBCLENBQXlCN0IsU0FBekI7QUFDRDtBQUNGLFNBSmEsR0FBZDs7QUFNQSxZQUFJYSxRQUFRLENBQUN0QyxNQUFULEdBQWtCekIsc0JBQWxCLEtBQTZDLENBQWpELEVBQW9EO0FBQ2xELGdCQUFNZ0Ysa0JBQUVDLEdBQUYsQ0FBTWxCLFFBQU4sQ0FBTjtBQUNEO0FBQ0Y7O0FBQ0QsWUFBTWlCLGtCQUFFQyxHQUFGLENBQU1sQixRQUFOLENBQU47QUFDRCxLQWJELFNBYVU7QUFDUixZQUFNakQsa0JBQUcyRixNQUFILENBQVVvQixZQUFWLENBQU47QUFDRDs7QUFDRCxRQUFJLENBQUM3RyxnQkFBRThDLE9BQUYsQ0FBVWdGLG1CQUFWLENBQUwsRUFBcUM7QUFDbkM3SSxNQUFBQSxHQUFHLENBQUM2RSxJQUFKLENBQVUsNEJBQUQsR0FDTixHQUFFOUMsb0JBQUtrRixTQUFMLENBQWUsY0FBZixFQUErQjRCLG1CQUFtQixDQUFDckgsTUFBbkQsRUFBMkQsSUFBM0QsQ0FBaUUsRUFEdEU7QUFFRCxLQUhELE1BR087QUFDTHhCLE1BQUFBLEdBQUcsQ0FBQzZFLElBQUosQ0FBVSxvQ0FBVjtBQUNEOztBQUNELFdBQU9nRSxtQkFBUDtBQUNEOztBQXhYNkI7O2VBNFhqQjNHLHlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0Q2hyb21lZHJpdmVyRGlyLCBDRF9DRE4sIHJldHJpZXZlRGF0YSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB4cGF0aCBmcm9tICd4cGF0aCc7XG5pbXBvcnQgeyBET01QYXJzZXIgfSBmcm9tICd4bWxkb20nO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBzeXN0ZW0sIGZzLCBsb2dnZXIsIHRlbXBEaXIsIHppcCwgdXRpbCwgbmV0IH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuXG5cbmNvbnN0IFRJTUVPVVRfTVMgPSAxNTAwMDtcbmNvbnN0IE1BWF9QQVJBTExFTF9ET1dOTE9BRFMgPSA1O1xuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50Jyk7XG5cblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3NJbmZvICgpIHtcbiAgbGV0IG5hbWUgPSAnbGludXgnO1xuICBpZiAoc3lzdGVtLmlzV2luZG93cygpKSB7XG4gICAgbmFtZSA9ICd3aW4nO1xuICB9IGVsc2UgaWYgKHN5c3RlbS5pc01hYygpKSB7XG4gICAgbmFtZSA9ICdtYWMnO1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBhcmNoOiBhd2FpdCBzeXN0ZW0uYXJjaCgpLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBpc0NyY09rIChzcmMsIGNoZWNrc3VtKSB7XG4gIGNvbnN0IG1kNSA9IGF3YWl0IGZzLmhhc2goc3JjLCAnbWQ1Jyk7XG4gIHJldHVybiBfLnRvTG93ZXIobWQ1KSA9PT0gXy50b0xvd2VyKGNoZWNrc3VtKTtcbn1cblxuZnVuY3Rpb24gZmluZENoaWxkTm9kZSAocGFyZW50LCBjaGlsZE5hbWUgPSBudWxsLCB0ZXh0ID0gbnVsbCkge1xuICBpZiAoIWNoaWxkTmFtZSAmJiAhdGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICghcGFyZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZm9yIChsZXQgY2hpbGROb2RlSWR4ID0gMDsgY2hpbGROb2RlSWR4IDwgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoOyBjaGlsZE5vZGVJZHgrKykge1xuICAgIGNvbnN0IGNoaWxkTm9kZSA9IHBhcmVudC5jaGlsZE5vZGVzW2NoaWxkTm9kZUlkeF07XG4gICAgaWYgKGNoaWxkTmFtZSAmJiAhdGV4dCAmJiBjaGlsZE5hbWUgPT09IGNoaWxkTm9kZS5sb2NhbE5hbWUpIHtcbiAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgfVxuICAgIGlmICh0ZXh0KSB7XG4gICAgICBjb25zdCBjaGlsZFRleHQgPSBleHRyYWN0Tm9kZVRleHQoY2hpbGROb2RlKTtcbiAgICAgIGlmICghY2hpbGRUZXh0KSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkTmFtZSAmJiBjaGlsZE5hbWUgPT09IGNoaWxkTm9kZS5sb2NhbE5hbWUgJiYgdGV4dCA9PT0gY2hpbGRUZXh0KSB7XG4gICAgICAgIHJldHVybiBjaGlsZE5vZGU7XG4gICAgICB9XG4gICAgICBpZiAoIWNoaWxkTmFtZSAmJiB0ZXh0ID09PSBjaGlsZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3ROb2RlVGV4dCAobm9kZSkge1xuICByZXR1cm4gKCFub2RlIHx8ICFub2RlLmZpcnN0Q2hpbGQgfHwgIXV0aWwuaGFzVmFsdWUobm9kZS5maXJzdENoaWxkLm5vZGVWYWx1ZSkpXG4gICAgPyBudWxsXG4gICAgOiBub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlO1xufVxuXG5cbmNsYXNzIENocm9tZWRyaXZlclN0b3JhZ2VDbGllbnQge1xuICBjb25zdHJ1Y3RvciAoYXJncyA9IHt9KSB7XG4gICAgY29uc3Qge1xuICAgICAgY2hyb21lZHJpdmVyRGlyID0gZ2V0Q2hyb21lZHJpdmVyRGlyKCksXG4gICAgICB0aW1lb3V0ID0gVElNRU9VVF9NUyxcbiAgICB9ID0gYXJncztcbiAgICB0aGlzLmNocm9tZWRyaXZlckRpciA9IGNocm9tZWRyaXZlckRpcjtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIHRoaXMubWFwcGluZyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEFkZGl0aW9uYWxEcml2ZXJEZXRhaWxzXG4gICAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmVyc2lvbiAtIENocm9tZWRyaXZlciB2ZXJzaW9uXG4gICAqIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBtaW5Ccm93c2VyVmVyc2lvbiAtIFRoZSBtaW5pbXVtIGJyb3dzZXIgdmVyc2lvblxuICAgKiBzdXBwb3J0ZWQgYnkgY2hyb21lZHJpdmVyIG9yIGBudWxsYCBpZiBpdCBjYW5ub3QgYmUgZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEdldHMgYWRkaXRpb25hbCBjaHJvbWVkcml2ZXIgZGV0YWlscyBmcm9tIGNocm9tZWRyaXZlclxuICAgKiByZWxlYXNlIG5vdGVzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gUmVsZWFzZSBub3RlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjaHJvbWVkcml2ZXJcbiAgICogQHJldHVybnMge0FkZGl0aW9uYWxEcml2ZXJEZXRhaWxzfVxuICAgKi9cbiAgcGFyc2VOb3RlcyAoY29udGVudCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGNvbnN0IHZlcnNpb25NYXRjaCA9IC9eXFxzKlstXStDaHJvbWVEcml2ZXJbXFxEXSsoW1xcZC5dKykvaW0uZXhlYyhjb250ZW50KTtcbiAgICBpZiAodmVyc2lvbk1hdGNoKSB7XG4gICAgICByZXN1bHQudmVyc2lvbiA9IHZlcnNpb25NYXRjaFsxXTtcbiAgICB9XG4gICAgY29uc3QgbWluQnJvd3NlclZlcnNpb25NYXRjaCA9IC9eXFxzKlN1cHBvcnRzIENocm9tZVtcXERdKyhcXGQrKS9pbS5leGVjKGNvbnRlbnQpO1xuICAgIGlmIChtaW5Ccm93c2VyVmVyc2lvbk1hdGNoKSB7XG4gICAgICByZXN1bHQubWluQnJvd3NlclZlcnNpb24gPSBtaW5Ccm93c2VyVmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERvd25sb2FkcyBjaHJvbWVkcml2ZXIgcmVsZWFzZSBub3RlcyBhbmQgcHV0cyB0aGVtXG4gICAqIGludG8gdGhlIGRpY3Rpb25hcnkgYXJndW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRyaXZlcktleSAtIERyaXZlciB2ZXJzaW9uIHBsdXMgYXJjaGl2ZSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBub3Rlc1VybCAtIFRoZSBVUkwgb2YgY2hyb21lZHJpdmVyIG5vdGVzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvRGljdCAtIFRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgZHJpdmVyIGluZm8uXG4gICAqIFRoZSBtZXRob2QgY2FsbCBtdXRhdGVzIGJ5IG1lcmdpbmcgYEFkZGl0aW9uYWxEcml2ZXJEZXRhaWxzYFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlIHJlbGVhc2Ugbm90ZXMgY2Fubm90IGJlIGRvd25sb2FkZWRcbiAgICovXG4gIGFzeW5jIHJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8gKGRyaXZlcktleSwgbm90ZXNVcmwsIGluZm9EaWN0KSB7XG4gICAgY29uc3Qgbm90ZXMgPSBhd2FpdCByZXRyaWV2ZURhdGEobm90ZXNVcmwsIHtcbiAgICAgICd1c2VyLWFnZW50JzogJ2FwcGl1bScsXG4gICAgICBhY2NlcHQ6ICcqLyonLFxuICAgIH0sIHsgdGltZW91dDogdGhpcy50aW1lb3V0IH0pO1xuICAgIGNvbnN0IHsgbWluQnJvd3NlclZlcnNpb24gfSA9IHRoaXMucGFyc2VOb3Rlcyhub3Rlcyk7XG4gICAgaWYgKCFtaW5Ccm93c2VyVmVyc2lvbikge1xuICAgICAgbG9nLmRlYnVnKGBUaGUgZHJpdmVyICcke2RyaXZlcktleX0nIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgcmVsZWFzZSBub3RlcyBhdCAke25vdGVzVXJsfS4gYCArXG4gICAgICAgIGBTa2lwcGluZyBpdGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbmZvRGljdC5taW5Ccm93c2VyVmVyc2lvbiA9IG1pbkJyb3dzZXJWZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBjaHJvbWVkcml2ZXIgc3RvcmFnZSBYTUwgYW5kIHN0b3Jlc1xuICAgKiB0aGUgcGFyc2VkIHJlc3VsdHMgaW50byBgdGhpcy5tYXBwaW5nYFxuICAgKlxuICAgKiBAcGFyYW0ge0RPTURvY3VtZW50fSBkb2MgLSBUaGUgRE9NIHJlcHJlc2VudGF0aW9uXG4gICAqIG9mIHRoZSBjaHJvbWVkcml2ZXIgc3RvcmFnZSBYTUxcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQYXJzZU5vdGVzIFt0cnVlXSAtIElmIHNldCB0byBgdHJ1ZWBcbiAgICogdGhlbiBhZGRpdGlvbmFsIGRyaXZlcnMgaW5mb3JtYXRpb24gaXMgZ29pbmcgdG8gYmUgcGFyc2VkXG4gICAqIGFuZCBhc3NpZ25lZCB0byBgdGhpcy5tYXBwaW5nYFxuICAgKi9cbiAgYXN5bmMgcGFyc2VTdG9yYWdlWG1sIChkb2MsIHNob3VsZFBhcnNlTm90ZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgZHJpdmVyTm9kZXMgPSB4cGF0aC5zZWxlY3QoYC8vKltsb2NhbC1uYW1lKC4pPSdDb250ZW50cyddYCwgZG9jKTtcbiAgICBsb2cuZGVidWcoYFBhcnNlZCAke2RyaXZlck5vZGVzLmxlbmd0aH0gZW50cmllcyBmcm9tIHN0b3JhZ2UgWE1MYCk7XG4gICAgaWYgKF8uaXNFbXB0eShkcml2ZXJOb2RlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZHJpdmVyTm9kZSBvZiBkcml2ZXJOb2Rlcykge1xuICAgICAgY29uc3Qga2V5ID0gZXh0cmFjdE5vZGVUZXh0KGZpbmRDaGlsZE5vZGUoZHJpdmVyTm9kZSwgJ0tleScpKTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhrZXksICcvY2hyb21lZHJpdmVyXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBsb2cuZGVidWcoYFByb2Nlc3NpbmcgY2hyb21lZHJpdmVyIGVudHJ5ICcke2tleX0nYCk7XG4gICAgICBjb25zdCBldGFnID0gZXh0cmFjdE5vZGVUZXh0KGZpbmRDaGlsZE5vZGUoZHJpdmVyTm9kZSwgJ0VUYWcnKSk7XG4gICAgICBpZiAoIWV0YWcpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBUaGUgZW50cnkgJyR7a2V5fScgZG9lcyBub3QgY29udGFpbiB0aGUgY2hlY2tzdW0uIFNraXBwaW5nIGl0YCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjZEluZm8gPSB7XG4gICAgICAgIHVybDogYCR7Q0RfQ0ROfS8ke2tleX1gLFxuICAgICAgICBldGFnOiBfLnRyaW0oZXRhZywgJ1wiJyksXG4gICAgICAgIHZlcnNpb246IF8uZmlyc3Qoa2V5LnNwbGl0KCcvJykpLFxuICAgICAgfTtcbiAgICAgIHRoaXMubWFwcGluZ1trZXldID0gY2RJbmZvO1xuXG4gICAgICBjb25zdCBub3Rlc1BhdGggPSBgJHtjZEluZm8udmVyc2lvbn0vbm90ZXMudHh0YDtcbiAgICAgIGNvbnN0IGlzTm90ZXNQcmVzZW50ID0gISFkcml2ZXJOb2Rlc1xuICAgICAgICAucmVkdWNlKChhY2MsIG5vZGUpID0+IGFjYyB8fCBmaW5kQ2hpbGROb2RlKG5vZGUsICdLZXknLCBub3Rlc1BhdGgpLCBmYWxzZSk7XG4gICAgICBpZiAoIWlzTm90ZXNQcmVzZW50KSB7XG4gICAgICAgIGNkSW5mby5taW5Ccm93c2VyVmVyc2lvbiA9IG51bGw7XG4gICAgICAgIGlmIChzaG91bGRQYXJzZU5vdGVzKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFRoZSBlbnRyeSAnJHtrZXl9JyBkb2VzIG5vdCBjb250YWluIGFueSBub3Rlcy4gU2tpcHBpbmcgaXRgKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoIXNob3VsZFBhcnNlTm90ZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHByb21pc2VzLnB1c2godGhpcy5yZXRyaWV2ZUFkZGl0aW9uYWxEcml2ZXJJbmZvKGtleSwgYCR7Q0RfQ0ROfS8ke25vdGVzUGF0aH1gLCBjZEluZm8pKTtcbiAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggJSBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID09PSAwKSB7XG4gICAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgIGxvZy5pbmZvKGBUaGUgdG90YWwgY291bnQgb2YgZW50cmllcyBpbiB0aGUgbWFwcGluZzogJHtfLnNpemUodGhpcy5tYXBwaW5nKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBEcml2ZXJEZXRhaWxzXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmwgLSBUaGUgZnVsbCB1cmwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZHJpdmVyIGluXG4gICAqIHRoZSByZW1vdGUgc3RvcmFnZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gZXRhZyAtIFRoZSBDUkMgb2YgdGhlIGRyaXZlciBhcmNoaXZlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uIC0gQ2hyb21lZHJpdmVyIHZlcnNpb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IENocm9tZWRyaXZlcnNNYXBwaW5nXG4gICAqIEBwcm9wZXJ0eSB7RHJpdmVyRGV0YWlsc30gLSBUaGUga2V5cyBhcmUgdW5pcXVlIGRyaXZlciBpZGVudGlmaWVyc1xuICAgKiAodmVyc2lvbi9hcmNoaXZlIG5hbWUpLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgaGF2ZSBgRHJpdmVyRGV0YWlsc2BcbiAgICogY29udGFpbmluZyBjaHJvbWVkcml2ZXIgZGV0YWlsc1xuICAgKi9cblxuICAvKipcbiAgICogUmV0cmlldmVzIGNocm9tZWRyaXZlciBtYXBwaW5nIGZyb20gdGhlIHN0b3JhZ2VcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRQYXJzZU5vdGVzIFt0cnVlXSAtIGlmIHNldCB0byBgdHJ1ZWBcbiAgICogdGhlbiBhZGRpdGlvbmFsIGNocm9tZWRyaXZlcnMgaW5mbyBpcyBnb2luZyB0byBiZSByZXRyaWV2ZWQgYW5kXG4gICAqIHBhcnNlZCBmcm9tIHJlbGVhc2Ugbm90ZXNcbiAgICogQHJldHVybnMge0Nocm9tZWRyaXZlcnNNYXBwaW5nfVxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVNYXBwaW5nIChzaG91bGRQYXJzZU5vdGVzID0gdHJ1ZSkge1xuICAgIGNvbnN0IHhtbCA9IGF3YWl0IHJldHJpZXZlRGF0YShDRF9DRE4sIHtcbiAgICAgICd1c2VyLWFnZW50JzogJ2FwcGl1bScsXG4gICAgICBhY2NlcHQ6ICdhcHBsaWNhdGlvbi94bWwsICovKicsXG4gICAgfSwgeyB0aW1lb3V0OiB0aGlzLnRpbWVvdXQgfSk7XG4gICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWwpO1xuICAgIGF3YWl0IHRoaXMucGFyc2VTdG9yYWdlWG1sKGRvYywgc2hvdWxkUGFyc2VOb3Rlcyk7XG4gICAgcmV0dXJuIF8uY2xvbmVEZWVwKHRoaXMubWFwcGluZyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXIgYXJjaGl2ZVxuICAgKiBpbnRvIHRoZSBnaXZlbiBkZXN0aW5hdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3JjIC0gVGhlIHNvdXJjZSBhcmNoaXZlIHBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRzdCAtIFRoZSBkZXN0aW5hdGlvbiBjaHJvbWVkcml2ZXIgcGF0aFxuICAgKi9cbiAgYXN5bmMgdW56aXBEcml2ZXIgKHNyYywgZHN0KSB7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB6aXAuZXh0cmFjdEFsbFRvKHNyYywgdG1wUm9vdCk7XG4gICAgICBjb25zdCBjaHJvbWVkcml2ZXJQYXRoID0gYXdhaXQgZnMud2Fsa0Rpcih0bXBSb290LCB0cnVlLCAoaXRlbVBhdGgsIGlzRGlyZWN0b3J5KSA9PlxuICAgICAgICAhaXNEaXJlY3RvcnkgJiYgXy50b0xvd2VyKHBhdGgucGFyc2UoaXRlbVBhdGgpLm5hbWUpID09PSAnY2hyb21lZHJpdmVyJyk7XG4gICAgICBpZiAoIWNocm9tZWRyaXZlclBhdGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYXJjaGl2ZSB3YXMgdW56aXBwZWQgcHJvcGVybHksIGJ1dCB3ZSBjb3VsZCBub3QgZmluZCBhbnkgY2hyb21lZHJpdmVyIGV4ZWN1dGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgTW92aW5nIHRoZSBleHRyYWN0ZWQgJyR7cGF0aC5iYXNlbmFtZShjaHJvbWVkcml2ZXJQYXRoKX0nIHRvICcke2RzdH0nYCk7XG4gICAgICBhd2FpdCBmcy5tdihjaHJvbWVkcml2ZXJQYXRoLCBkc3QsIHtcbiAgICAgICAgbWtkaXJwOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPU0luZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgaG9zdCBPU1xuICAgKiBDYW4gYmUgZWl0aGVyIGBtYWNgLCBgd2luZG93c2Agb3IgYGxpbnV4YFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYXJjaCAtIFRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIGhvc3QgT0QuXG4gICAqIENhbiBiZSBlaXRoZXIgYDMyYCBvciBgNjRgXG4gICAqL1xuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGB0aGlzLm1hcHBpbmdgIHRvIG9ubHkgc2VsZWN0IG1hdGNoaW5nXG4gICAqIGNocm9tZWRyaXZlciBlbnRyaWVzIGJ5IG9wZXJhdGluZyBzeXN0ZW0gaW5mb3JtYXRpb25cbiAgICogYW5kL29yIGFkZGl0aW9uYWwgc3luY2hyb25pemF0aW9uIG9wdGlvbnMgKGlmIHByb3ZpZGVkKVxuICAgKlxuICAgKiBAcGFyYW0ge09TSW5mb30gb3NJbmZvXG4gICAqIEBwYXJhbSB7P1N5bmNPcHRpb25zfSBvcHRzXG4gICAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBmaWx0ZXJlZCBjaHJvbWVkcml2ZXJcbiAgICogZW50cnkgbmFtZXMgKHZlcnNpb24vYXJjaGl2ZSBuYW1lKVxuICAgKi9cbiAgc2VsZWN0TWF0Y2hpbmdEcml2ZXJzIChvc0luZm8sIG9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1pbkJyb3dzZXJWZXJzaW9uLFxuICAgICAgdmVyc2lvbnMgPSBbXSxcbiAgICB9ID0gb3B0cztcbiAgICBsZXQgZHJpdmVyc1RvU3luYyA9IF8ua2V5cyh0aGlzLm1hcHBpbmcpO1xuXG4gICAgaWYgKCFfLmlzRW1wdHkodmVyc2lvbnMpKSB7XG4gICAgICAvLyBIYW5kbGUgb25seSBzZWxlY3RlZCB2ZXJzaW9ucyBpZiByZXF1ZXN0ZWRcbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgdmVyc2lvbnMgbWF0Y2ggdG8gJHt2ZXJzaW9uc31gKTtcbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jXG4gICAgICAgIC5maWx0ZXIoKGNkTmFtZSkgPT4gdmVyc2lvbnMuaW5jbHVkZXMoYCR7dGhpcy5tYXBwaW5nW2NkTmFtZV0udmVyc2lvbn1gKSk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWlzTmFOKG1pbkJyb3dzZXJWZXJzaW9uKSkge1xuICAgICAgLy8gT25seSBzZWxlY3QgZHJpdmVycyB0aGF0IHN1cHBvcnQgdGhlIGN1cnJlbnQgYnJvd3NlciB3aG9zZSBtYWpvciB2ZXJzaW9uIG51bWJlciBlcXVhbHMgdG8gYG1pbkJyb3dzZXJWZXJzaW9uYFxuICAgICAgY29uc3QgbWluQnJvd3NlclZlcnNpb25JbnQgPSBwYXJzZUludChtaW5Ccm93c2VyVmVyc2lvbiwgMTApO1xuICAgICAgbG9nLmRlYnVnKGBTZWxlY3RpbmcgY2hyb21lZHJpdmVycyB3aG9zZSBtaW5pbXVtIHN1cHBvcnRlZCBicm93c2VyIHZlcnNpb24gbWF0Y2hlcyB0byAke21pbkJyb3dzZXJWZXJzaW9uSW50fWApO1xuICAgICAgbGV0IGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA9IDA7XG4gICAgICAvLyBTZWxlY3QgdGhlIG5ld2VzdCBhdmFpbGFibGUgYW5kIGNvbXBhdGlibGUgY2hyb21lZHJpdmVyXG4gICAgICBmb3IgKGNvbnN0IGNkTmFtZSBvZiBkcml2ZXJzVG9TeW5jKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbiA9IHBhcnNlSW50KHRoaXMubWFwcGluZ1tjZE5hbWVdLm1pbkJyb3dzZXJWZXJzaW9uLCAxMCk7XG4gICAgICAgIGlmICghaXNOYU4oY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uKVxuICAgICAgICAgICAgJiYgY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uIDw9IG1pbkJyb3dzZXJWZXJzaW9uSW50XG4gICAgICAgICAgICAmJiBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPCBjdXJyZW50TWluQnJvd3NlclZlcnNpb24pIHtcbiAgICAgICAgICBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPSBjdXJyZW50TWluQnJvd3NlclZlcnNpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jLmZpbHRlcigoY2ROYW1lKSA9PiBgJHt0aGlzLm1hcHBpbmdbY2ROYW1lXS5taW5Ccm93c2VyVmVyc2lvbn1gID09PVxuICAgICAgICBgJHtjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPiAwID8gY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyIDogbWluQnJvd3NlclZlcnNpb25JbnR9YCk7XG5cbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGxvZy5kZWJ1ZyhgV2lsbCBzZWxlY3QgY2FuZGlkYXRlICR7dXRpbC5wbHVyYWxpemUoJ2RyaXZlcicsIGRyaXZlcnNUb1N5bmMubGVuZ3RoKX0gYCArXG4gICAgICAgIGB2ZXJzaW9uZWQgYXMgJyR7Xy51bmlxKGRyaXZlcnNUb1N5bmMubWFwKChjZE5hbWUpID0+IHRoaXMubWFwcGluZ1tjZE5hbWVdLnZlcnNpb24pKX0nYCk7XG4gICAgfVxuXG4gICAgaWYgKCFfLmlzRW1wdHkob3NJbmZvKSkge1xuICAgICAgLy8gRmlsdGVyIG91dCBkcml2ZXJzIGZvciB1bnN1cHBvcnRlZCBzeXN0ZW0gYXJjaGl0ZWN0dXJlc1xuICAgICAgbGV0IHtuYW1lLCBhcmNofSA9IG9zSW5mbztcbiAgICAgIGlmIChhcmNoID09PSAnNjQnICYmICFkcml2ZXJzVG9TeW5jLnNvbWUoKGNkTmFtZSkgPT4gY2ROYW1lLmluY2x1ZGVzKGBfJHtuYW1lfTY0YCkpKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB4ODYgYnVpbGQgaWYgeDY0IG9uZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gT1NcbiAgICAgICAgYXJjaCA9ICczMic7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFNlbGVjdGluZyBjaHJvbWVkcml2ZXJzIHdob3NlIHBsYXRmb3JtIG1hdGNoZXMgdG8gJHtuYW1lfSR7YXJjaH1gKTtcbiAgICAgIGRyaXZlcnNUb1N5bmMgPSBkcml2ZXJzVG9TeW5jLmZpbHRlcigoY2ROYW1lKSA9PiBjZE5hbWUuaW5jbHVkZXMoYF8ke25hbWV9JHthcmNofWApKTtcbiAgICAgIGxvZy5kZWJ1ZyhgR290ICR7dXRpbC5wbHVyYWxpemUoJ2l0ZW0nLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyaXZlcnNUb1N5bmM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBnaXZlbiBjaHJvbWVkcml2ZXIgZnJvbSB0aGUgc3RvcmFnZVxuICAgKiBhbmQgdW5wYWNrcyBpdCBpbnRvIGB0aGlzLmNocm9tZWRyaXZlckRpcmAgZm9sZGVyXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIFRoZSB1bmlxdWUgZHJpdmVyIGluZGV4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkcml2ZXJLZXkgLSBUaGUgZHJpdmVyIGtleSBpbiBgdGhpcy5tYXBwaW5nYFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZXNSb290IC0gVGhlIHRlbXBvcmFyeSBmb2xkZXIgcGF0aCB0byBleHRyYWN0XG4gICAqIGRvd25sb2FkZWQgYXJjaGl2ZXMgdG9cbiAgICogQHBhcmFtIHtib29sZWFufSBpc1N0cmljdCBbdHJ1ZV0gLSBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIChgdHJ1ZWApXG4gICAqIG9yIHJldHVybiBhIGJvb2xlYW4gcmVzdWx0IGlmIHRoZSBkcml2ZXIgcmV0cmlldmFsIHByb2Nlc3MgZmFpbHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcmV0cmlldmluZyB0aGUgZHJpdmVyXG4gICAqIGFuZCBgaXNTdHJpY3RgIGlzIHNldCB0byBgdHJ1ZWBcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGlmIGB0cnVlYCB0aGVuIHRoZSBjaHJvbWVkcml2ZXIgaXMgc3VjY2Vzc2Z1bGx5XG4gICAqIGRvd25sb2FkZWQgYW5kIGV4dHJhY3RlZC5cbiAgICovXG4gIGFzeW5jIHJldHJpZXZlRHJpdmVyIChpbmRleCwgZHJpdmVyS2V5LCBhcmNoaXZlc1Jvb3QsIGlzU3RyaWN0ID0gZmFsc2UpIHtcbiAgICBjb25zdCB7IHVybCwgZXRhZywgdmVyc2lvbiB9ID0gdGhpcy5tYXBwaW5nW2RyaXZlcktleV07XG4gICAgY29uc3QgYXJjaGl2ZVBhdGggPSBwYXRoLnJlc29sdmUoYXJjaGl2ZXNSb290LCBgJHtpbmRleH0uemlwYCk7XG4gICAgbG9nLmRlYnVnKGBSZXRyaWV2aW5nICcke3VybH0nIHRvICcke2FyY2hpdmVQYXRofSdgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV0LmRvd25sb2FkRmlsZSh1cmwsIGFyY2hpdmVQYXRoLCB7XG4gICAgICAgIGlzTWV0ZXJlZDogZmFsc2UsXG4gICAgICAgIHRpbWVvdXQ6IFRJTUVPVVRfTVNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBDYW5ub3QgZG93bmxvYWQgY2hyb21lZHJpdmVyIGFyY2hpdmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gO1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICghYXdhaXQgaXNDcmNPayhhcmNoaXZlUGF0aCwgZXRhZykpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGBUaGUgY2hlY2tzdW0gZm9yIHRoZSBkb3dubG9hZGVkIGNocm9tZWRyaXZlciAnJHtkcml2ZXJLZXl9JyBkaWQgbm90IG1hdGNoYDtcbiAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcihtc2cpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBmaWxlTmFtZSA9IGAke3BhdGgucGFyc2UodXJsKS5uYW1lfV92JHt2ZXJzaW9ufWAgK1xuICAgICAgKHN5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnKTtcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMuY2hyb21lZHJpdmVyRGlyLCBmaWxlTmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudW56aXBEcml2ZXIoYXJjaGl2ZVBhdGgsIHRhcmdldFBhdGgpO1xuICAgICAgYXdhaXQgZnMuY2htb2QodGFyZ2V0UGF0aCwgMG83NTUpO1xuICAgICAgbG9nLmRlYnVnKGBQZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSAnJHt0YXJnZXRQYXRofScgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gNzU1YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gU3luY09wdGlvbnNcbiAgICogQHByb3BlcnR5IHtBcnJheTxTdHJpbmc+fSB2ZXJzaW9ucyAtIFRoZSBsaXN0IG9mIGNocm9tZWRyaXZlclxuICAgKiB2ZXJzaW9ucyB0byBzeW5jLiBJZiBlbXB0eSAodGhlIGRlZmF1bHQgdmFsdWUpIHRoZW4gYWxsIGF2YWlsYWJsZVxuICAgKiBjaHJvbWVkcml2ZXJzIGFyZSBnb2luZyB0byBiZSBkb3dubG9hZGVkIGFuZCBleHRyYWN0ZWRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVtYmVyfSBtaW5Ccm93c2VyVmVyc2lvbiAtIFRoZSBtaW51bXVtIHN1cHBvcnRlZFxuICAgKiBDaHJvbWUgdmVyc2lvbiB0aGF0IGRvd25sb2FkZWQgY2hyb21lZHJpdmVycyBzaG91bGQgc3VwcG9ydC4gQ2FuIG1hdGNoXG4gICAqIG11bHRpcGxlIGRyaXZlcnMuXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgY2hyb21lZHJpdmVycyBmcm9tIHRoZSByZW1vdGUgc3RvcmFnZVxuICAgKiB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW1cbiAgICpcbiAgICogQHBhcmFtIHs/U3luY09wdGlvbnN9IG9wdHNcbiAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2hpbGUgcmV0cmlldmluZ1xuICAgKiB0aGUgZHJpdmVyc1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nfSBUaGUgbGlzdCBvZiBzdWNjZXNzZnVsbHkgc3luY2hyb25pemVkIGRyaXZlciBrZXlzXG4gICAqL1xuICBhc3luYyBzeW5jRHJpdmVycyAob3B0cyA9IHt9KSB7XG4gICAgaWYgKF8uaXNFbXB0eSh0aGlzLm1hcHBpbmcpKSB7XG4gICAgICBhd2FpdCB0aGlzLnJldHJpZXZlTWFwcGluZyghIW9wdHMubWluQnJvd3NlclZlcnNpb24pO1xuICAgIH1cbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMubWFwcGluZykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJldHJpZXZlIGNocm9tZWRyaXZlcnMgbWFwcGluZyBmcm9tIEdvb2dsZSBzdG9yYWdlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZHJpdmVyc1RvU3luYyA9IHRoaXMuc2VsZWN0TWF0Y2hpbmdEcml2ZXJzKGF3YWl0IGdldE9zSW5mbygpLCBvcHRzKTtcbiAgICBpZiAoXy5pc0VtcHR5KGRyaXZlcnNUb1N5bmMpKSB7XG4gICAgICBsb2cuZGVidWcoYFRoZXJlIGFyZSBubyBkcml2ZXJzIHRvIHN5bmMuIEV4aXRpbmdgKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnZHJpdmVyJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfSB0byBzeW5jOiBgICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRyaXZlcnNUb1N5bmMsIG51bGwsIDIpKTtcblxuICAgIGNvbnN0IHN5bmNocm9uaXplZERyaXZlcnMgPSBbXTtcbiAgICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICAgIGNvbnN0IGFyY2hpdmVzUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IFtpZHgsIGRyaXZlcktleV0gb2YgZHJpdmVyc1RvU3luYy5lbnRyaWVzKCkpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmIChhd2FpdCB0aGlzLnJldHJpZXZlRHJpdmVyKGlkeCwgZHJpdmVyS2V5LCBhcmNoaXZlc1Jvb3QsICFfLmlzRW1wdHkob3B0cykpKSB7XG4gICAgICAgICAgICBzeW5jaHJvbml6ZWREcml2ZXJzLnB1c2goZHJpdmVyS2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCkpO1xuXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggJSBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID09PSAwKSB7XG4gICAgICAgICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGZzLnJpbXJhZihhcmNoaXZlc1Jvb3QpO1xuICAgIH1cbiAgICBpZiAoIV8uaXNFbXB0eShzeW5jaHJvbml6ZWREcml2ZXJzKSkge1xuICAgICAgbG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBzeW5jaHJvbml6ZWQgYCArXG4gICAgICAgIGAke3V0aWwucGx1cmFsaXplKCdjaHJvbWVkcml2ZXInLCBzeW5jaHJvbml6ZWREcml2ZXJzLmxlbmd0aCwgdHJ1ZSl9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKGBObyBjaHJvbWVkcml2ZXJzIHdlcmUgc3luY2hyb25pemVkYCk7XG4gICAgfVxuICAgIHJldHVybiBzeW5jaHJvbml6ZWREcml2ZXJzO1xuICB9XG59XG5cblxuZXhwb3J0IGRlZmF1bHQgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudDtcbiJdLCJmaWxlIjoibGliL3N0b3JhZ2UtY2xpZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
|
|
391
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zdG9yYWdlLWNsaWVudC5qcyJdLCJuYW1lcyI6WyJUSU1FT1VUX01TIiwiTUFYX1BBUkFMTEVMX0RPV05MT0FEUyIsImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsImlzQ3JjT2siLCJzcmMiLCJjaGVja3N1bSIsIm1kNSIsImZzIiwiaGFzaCIsIl8iLCJ0b0xvd2VyIiwiZmluZENoaWxkTm9kZSIsInBhcmVudCIsImNoaWxkTmFtZSIsInRleHQiLCJoYXNDaGlsZE5vZGVzIiwiY2hpbGROb2RlSWR4IiwiY2hpbGROb2RlcyIsImxlbmd0aCIsImNoaWxkTm9kZSIsImxvY2FsTmFtZSIsImNoaWxkVGV4dCIsImV4dHJhY3ROb2RlVGV4dCIsIm5vZGUiLCJmaXJzdENoaWxkIiwidXRpbCIsImhhc1ZhbHVlIiwibm9kZVZhbHVlIiwiQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsImNocm9tZWRyaXZlckRpciIsInRpbWVvdXQiLCJtYXBwaW5nIiwicGFyc2VOb3RlcyIsImNvbnRlbnQiLCJyZXN1bHQiLCJ2ZXJzaW9uTWF0Y2giLCJleGVjIiwidmVyc2lvbiIsIm1pbkJyb3dzZXJWZXJzaW9uTWF0Y2giLCJtaW5Ccm93c2VyVmVyc2lvbiIsInJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8iLCJkcml2ZXJLZXkiLCJub3Rlc1VybCIsImluZm9EaWN0Iiwibm90ZXMiLCJhY2NlcHQiLCJkZWJ1ZyIsInBhcnNlU3RvcmFnZVhtbCIsImRvYyIsInNob3VsZFBhcnNlTm90ZXMiLCJkcml2ZXJOb2RlcyIsInhwYXRoIiwic2VsZWN0IiwiaXNFbXB0eSIsInByb21pc2VzIiwiZHJpdmVyTm9kZSIsImtleSIsImluY2x1ZGVzIiwiZXRhZyIsImNkSW5mbyIsInVybCIsIkNEX0NETiIsInRyaW0iLCJmaXJzdCIsInNwbGl0Iiwibm90ZXNQYXRoIiwiaXNOb3Rlc1ByZXNlbnQiLCJyZWR1Y2UiLCJhY2MiLCJpbmZvIiwicHVzaCIsIkIiLCJhbGwiLCJzaXplIiwicmV0cmlldmVNYXBwaW5nIiwieG1sIiwiRE9NUGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwiY2xvbmVEZWVwIiwidW56aXBEcml2ZXIiLCJkc3QiLCJ0bXBSb290IiwidGVtcERpciIsIm9wZW5EaXIiLCJ6aXAiLCJleHRyYWN0QWxsVG8iLCJjaHJvbWVkcml2ZXJQYXRoIiwid2Fsa0RpciIsIml0ZW1QYXRoIiwiaXNEaXJlY3RvcnkiLCJwYXRoIiwicGFyc2UiLCJuYW1lIiwiRXJyb3IiLCJiYXNlbmFtZSIsIm12IiwibWtkaXJwIiwicmltcmFmIiwic2VsZWN0TWF0Y2hpbmdEcml2ZXJzIiwib3NJbmZvIiwib3B0cyIsInZlcnNpb25zIiwiZHJpdmVyc1RvU3luYyIsImtleXMiLCJmaWx0ZXIiLCJjZE5hbWUiLCJwbHVyYWxpemUiLCJpc05hTiIsIm1pbkJyb3dzZXJWZXJzaW9uSW50IiwicGFyc2VJbnQiLCJjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIiLCJjdXJyZW50TWluQnJvd3NlclZlcnNpb24iLCJ1bmlxIiwibWFwIiwiYXJjaCIsImhhcmR3YXJlTmFtZSIsIlg2NCIsInNvbWUiLCJYODYiLCJPUyIsIm1hYyIsIk0xX0FSQ0hfU1VGRklYIiwicGxhdGZvcm1SZSIsIlJlZ0V4cCIsInRlc3QiLCJyZXRyaWV2ZURyaXZlciIsImluZGV4IiwiYXJjaGl2ZXNSb290IiwiaXNTdHJpY3QiLCJhcmNoaXZlUGF0aCIsInJlc29sdmUiLCJuZXQiLCJkb3dubG9hZEZpbGUiLCJpc01ldGVyZWQiLCJlIiwibXNnIiwibWVzc2FnZSIsImVycm9yIiwiZmlsZU5hbWUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJ0YXJnZXRQYXRoIiwiY2htb2QiLCJzeW5jRHJpdmVycyIsIkpTT04iLCJzdHJpbmdpZnkiLCJzeW5jaHJvbml6ZWREcml2ZXJzIiwiaWR4IiwiZW50cmllcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFJQTs7QUFDQTs7QUFDQTs7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YSwgZ2V0T3NJbmZvLFxuICBPUywgWDY0LCBYODYsIE0xX0FSQ0hfU1VGRklYLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeHBhdGggZnJvbSAneHBhdGgnO1xuaW1wb3J0IHsgRE9NUGFyc2VyIH0gZnJvbSAneG1sZG9tJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcywgbG9nZ2VyLCB0ZW1wRGlyLCB6aXAsIHV0aWwsIG5ldCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcblxuXG5jb25zdCBUSU1FT1VUX01TID0gMTUwMDA7XG5jb25zdCBNQVhfUEFSQUxMRUxfRE9XTkxPQURTID0gNTtcblxuY29uc3QgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCcpO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIGlzQ3JjT2sgKHNyYywgY2hlY2tzdW0pIHtcbiAgY29uc3QgbWQ1ID0gYXdhaXQgZnMuaGFzaChzcmMsICdtZDUnKTtcbiAgcmV0dXJuIF8udG9Mb3dlcihtZDUpID09PSBfLnRvTG93ZXIoY2hlY2tzdW0pO1xufVxuXG5mdW5jdGlvbiBmaW5kQ2hpbGROb2RlIChwYXJlbnQsIGNoaWxkTmFtZSA9IG51bGwsIHRleHQgPSBudWxsKSB7XG4gIGlmICghY2hpbGROYW1lICYmICF0ZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFwYXJlbnQuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmb3IgKGxldCBjaGlsZE5vZGVJZHggPSAwOyBjaGlsZE5vZGVJZHggPCBwYXJlbnQuY2hpbGROb2Rlcy5sZW5ndGg7IGNoaWxkTm9kZUlkeCsrKSB7XG4gICAgY29uc3QgY2hpbGROb2RlID0gcGFyZW50LmNoaWxkTm9kZXNbY2hpbGROb2RlSWR4XTtcbiAgICBpZiAoY2hpbGROYW1lICYmICF0ZXh0ICYmIGNoaWxkTmFtZSA9PT0gY2hpbGROb2RlLmxvY2FsTmFtZSkge1xuICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICB9XG4gICAgaWYgKHRleHQpIHtcbiAgICAgIGNvbnN0IGNoaWxkVGV4dCA9IGV4dHJhY3ROb2RlVGV4dChjaGlsZE5vZGUpO1xuICAgICAgaWYgKCFjaGlsZFRleHQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGROYW1lICYmIGNoaWxkTmFtZSA9PT0gY2hpbGROb2RlLmxvY2FsTmFtZSAmJiB0ZXh0ID09PSBjaGlsZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkTm9kZTtcbiAgICAgIH1cbiAgICAgIGlmICghY2hpbGROYW1lICYmIHRleHQgPT09IGNoaWxkVGV4dCkge1xuICAgICAgICByZXR1cm4gY2hpbGROb2RlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdE5vZGVUZXh0IChub2RlKSB7XG4gIHJldHVybiAoIW5vZGUgfHwgIW5vZGUuZmlyc3RDaGlsZCB8fCAhdXRpbC5oYXNWYWx1ZShub2RlLmZpcnN0Q2hpbGQubm9kZVZhbHVlKSlcbiAgICA/IG51bGxcbiAgICA6IG5vZGUuZmlyc3RDaGlsZC5ub2RlVmFsdWU7XG59XG5cblxuY2xhc3MgQ2hyb21lZHJpdmVyU3RvcmFnZUNsaWVudCB7XG4gIGNvbnN0cnVjdG9yIChhcmdzID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBjaHJvbWVkcml2ZXJEaXIgPSBnZXRDaHJvbWVkcml2ZXJEaXIoKSxcbiAgICAgIHRpbWVvdXQgPSBUSU1FT1VUX01TLFxuICAgIH0gPSBhcmdzO1xuICAgIHRoaXMuY2hyb21lZHJpdmVyRGlyID0gY2hyb21lZHJpdmVyRGlyO1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgdGhpcy5tYXBwaW5nID0ge307XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gQWRkaXRpb25hbERyaXZlckRldGFpbHNcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSB2ZXJzaW9uIC0gQ2hyb21lZHJpdmVyIHZlcnNpb25cbiAgICogb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICAgKiBAcHJvcGVydHkgez9zdHJpbmd9IG1pbkJyb3dzZXJWZXJzaW9uIC0gVGhlIG1pbmltdW0gYnJvd3NlciB2ZXJzaW9uXG4gICAqIHN1cHBvcnRlZCBieSBjaHJvbWVkcml2ZXIgb3IgYG51bGxgIGlmIGl0IGNhbm5vdCBiZSBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogR2V0cyBhZGRpdGlvbmFsIGNocm9tZWRyaXZlciBkZXRhaWxzIGZyb20gY2hyb21lZHJpdmVyXG4gICAqIHJlbGVhc2Ugbm90ZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBSZWxlYXNlIG5vdGVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNocm9tZWRyaXZlclxuICAgKiBAcmV0dXJucyB7QWRkaXRpb25hbERyaXZlckRldGFpbHN9XG4gICAqL1xuICBwYXJzZU5vdGVzIChjb250ZW50KSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgY29uc3QgdmVyc2lvbk1hdGNoID0gL15cXHMqWy1dK0Nocm9tZURyaXZlcltcXERdKyhbXFxkLl0rKS9pbS5leGVjKGNvbnRlbnQpO1xuICAgIGlmICh2ZXJzaW9uTWF0Y2gpIHtcbiAgICAgIHJlc3VsdC52ZXJzaW9uID0gdmVyc2lvbk1hdGNoWzFdO1xuICAgIH1cbiAgICBjb25zdCBtaW5Ccm93c2VyVmVyc2lvbk1hdGNoID0gL15cXHMqU3VwcG9ydHMgQ2hyb21lW1xcRF0rKFxcZCspL2ltLmV4ZWMoY29udGVudCk7XG4gICAgaWYgKG1pbkJyb3dzZXJWZXJzaW9uTWF0Y2gpIHtcbiAgICAgIHJlc3VsdC5taW5Ccm93c2VyVmVyc2lvbiA9IG1pbkJyb3dzZXJWZXJzaW9uTWF0Y2hbMV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWRzIGNocm9tZWRyaXZlciByZWxlYXNlIG5vdGVzIGFuZCBwdXRzIHRoZW1cbiAgICogaW50byB0aGUgZGljdGlvbmFyeSBhcmd1bWVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZHJpdmVyS2V5IC0gRHJpdmVyIHZlcnNpb24gcGx1cyBhcmNoaXZlIG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5vdGVzVXJsIC0gVGhlIFVSTCBvZiBjaHJvbWVkcml2ZXIgbm90ZXNcbiAgICogQHBhcmFtIHtPYmplY3R9IGluZm9EaWN0IC0gVGhlIGRpY3Rpb25hcnkgY29udGFpbmluZyBkcml2ZXIgaW5mby5cbiAgICogVGhlIG1ldGhvZCBjYWxsIG11dGF0ZXMgYnkgbWVyZ2luZyBgQWRkaXRpb25hbERyaXZlckRldGFpbHNgXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgcmVsZWFzZSBub3RlcyBjYW5ub3QgYmUgZG93bmxvYWRlZFxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVBZGRpdGlvbmFsRHJpdmVySW5mbyAoZHJpdmVyS2V5LCBub3Rlc1VybCwgaW5mb0RpY3QpIHtcbiAgICBjb25zdCBub3RlcyA9IGF3YWl0IHJldHJpZXZlRGF0YShub3Rlc1VybCwge1xuICAgICAgJ3VzZXItYWdlbnQnOiAnYXBwaXVtJyxcbiAgICAgIGFjY2VwdDogJyovKicsXG4gICAgfSwgeyB0aW1lb3V0OiB0aGlzLnRpbWVvdXQgfSk7XG4gICAgY29uc3QgeyBtaW5Ccm93c2VyVmVyc2lvbiB9ID0gdGhpcy5wYXJzZU5vdGVzKG5vdGVzKTtcbiAgICBpZiAoIW1pbkJyb3dzZXJWZXJzaW9uKSB7XG4gICAgICBsb2cuZGVidWcoYFRoZSBkcml2ZXIgJyR7ZHJpdmVyS2V5fScgZG9lcyBub3QgY29udGFpbiB2YWxpZCByZWxlYXNlIG5vdGVzIGF0ICR7bm90ZXNVcmx9LiBgICtcbiAgICAgICAgYFNraXBwaW5nIGl0YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluZm9EaWN0Lm1pbkJyb3dzZXJWZXJzaW9uID0gbWluQnJvd3NlclZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGNocm9tZWRyaXZlciBzdG9yYWdlIFhNTCBhbmQgc3RvcmVzXG4gICAqIHRoZSBwYXJzZWQgcmVzdWx0cyBpbnRvIGB0aGlzLm1hcHBpbmdgXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRG9jdW1lbnR9IGRvYyAtIFRoZSBET00gcmVwcmVzZW50YXRpb25cbiAgICogb2YgdGhlIGNocm9tZWRyaXZlciBzdG9yYWdlIFhNTFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFBhcnNlTm90ZXMgW3RydWVdIC0gSWYgc2V0IHRvIGB0cnVlYFxuICAgKiB0aGVuIGFkZGl0aW9uYWwgZHJpdmVycyBpbmZvcm1hdGlvbiBpcyBnb2luZyB0byBiZSBwYXJzZWRcbiAgICogYW5kIGFzc2lnbmVkIHRvIGB0aGlzLm1hcHBpbmdgXG4gICAqL1xuICBhc3luYyBwYXJzZVN0b3JhZ2VYbWwgKGRvYywgc2hvdWxkUGFyc2VOb3RlcyA9IHRydWUpIHtcbiAgICBjb25zdCBkcml2ZXJOb2RlcyA9IHhwYXRoLnNlbGVjdChgLy8qW2xvY2FsLW5hbWUoLik9J0NvbnRlbnRzJ11gLCBkb2MpO1xuICAgIGxvZy5kZWJ1ZyhgUGFyc2VkICR7ZHJpdmVyTm9kZXMubGVuZ3RofSBlbnRyaWVzIGZyb20gc3RvcmFnZSBYTUxgKTtcbiAgICBpZiAoXy5pc0VtcHR5KGRyaXZlck5vZGVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgZm9yIChjb25zdCBkcml2ZXJOb2RlIG9mIGRyaXZlck5vZGVzKSB7XG4gICAgICBjb25zdCBrZXkgPSBleHRyYWN0Tm9kZVRleHQoZmluZENoaWxkTm9kZShkcml2ZXJOb2RlLCAnS2V5JykpO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKGtleSwgJy9jaHJvbWVkcml2ZXJfJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV0YWcgPSBleHRyYWN0Tm9kZVRleHQoZmluZENoaWxkTm9kZShkcml2ZXJOb2RlLCAnRVRhZycpKTtcbiAgICAgIGlmICghZXRhZykge1xuICAgICAgICBsb2cuZGVidWcoYFRoZSBlbnRyeSAnJHtrZXl9JyBkb2VzIG5vdCBjb250YWluIHRoZSBjaGVja3N1bS4gU2tpcHBpbmcgaXRgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNkSW5mbyA9IHtcbiAgICAgICAgdXJsOiBgJHtDRF9DRE59LyR7a2V5fWAsXG4gICAgICAgIGV0YWc6IF8udHJpbShldGFnLCAnXCInKSxcbiAgICAgICAgdmVyc2lvbjogXy5maXJzdChrZXkuc3BsaXQoJy8nKSksXG4gICAgICB9O1xuICAgICAgdGhpcy5tYXBwaW5nW2tleV0gPSBjZEluZm87XG5cbiAgICAgIGNvbnN0IG5vdGVzUGF0aCA9IGAke2NkSW5mby52ZXJzaW9ufS9ub3Rlcy50eHRgO1xuICAgICAgY29uc3QgaXNOb3Rlc1ByZXNlbnQgPSAhIWRyaXZlck5vZGVzXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgbm9kZSkgPT4gYWNjIHx8IGZpbmRDaGlsZE5vZGUobm9kZSwgJ0tleScsIG5vdGVzUGF0aCksIGZhbHNlKTtcbiAgICAgIGlmICghaXNOb3Rlc1ByZXNlbnQpIHtcbiAgICAgICAgY2RJbmZvLm1pbkJyb3dzZXJWZXJzaW9uID0gbnVsbDtcbiAgICAgICAgaWYgKHNob3VsZFBhcnNlTm90ZXMpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgVGhlIGVudHJ5ICcke2tleX0nIGRvZXMgbm90IGNvbnRhaW4gYW55IG5vdGVzLiBTa2lwcGluZyBpdGApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmICghc2hvdWxkUGFyc2VOb3Rlcykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnJldHJpZXZlQWRkaXRpb25hbERyaXZlckluZm8oa2V5LCBgJHtDRF9DRE59LyR7bm90ZXNQYXRofWAsIGNkSW5mbykpO1xuICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCAlIE1BWF9QQVJBTExFTF9ET1dOTE9BRFMgPT09IDApIHtcbiAgICAgICAgYXdhaXQgQi5hbGwocHJvbWlzZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgbG9nLmluZm8oYFRoZSB0b3RhbCBjb3VudCBvZiBlbnRyaWVzIGluIHRoZSBtYXBwaW5nOiAke18uc2l6ZSh0aGlzLm1hcHBpbmcpfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IERyaXZlckRldGFpbHNcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybCAtIFRoZSBmdWxsIHVybCB0byB0aGUgY29ycmVzcG9uZGluZyBkcml2ZXIgaW5cbiAgICogdGhlIHJlbW90ZSBzdG9yYWdlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBldGFnIC0gVGhlIENSQyBvZiB0aGUgZHJpdmVyIGFyY2hpdmVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBDaHJvbWVkcml2ZXIgdmVyc2lvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gQ2hyb21lZHJpdmVyc01hcHBpbmdcbiAgICogQHByb3BlcnR5IHtEcml2ZXJEZXRhaWxzfSAtIFRoZSBrZXlzIGFyZSB1bmlxdWUgZHJpdmVyIGlkZW50aWZpZXJzXG4gICAqICh2ZXJzaW9uL2FyY2hpdmUgbmFtZSkuIFRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBoYXZlIGBEcml2ZXJEZXRhaWxzYFxuICAgKiBjb250YWluaW5nIGNocm9tZWRyaXZlciBkZXRhaWxzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgY2hyb21lZHJpdmVyIG1hcHBpbmcgZnJvbSB0aGUgc3RvcmFnZVxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFBhcnNlTm90ZXMgW3RydWVdIC0gaWYgc2V0IHRvIGB0cnVlYFxuICAgKiB0aGVuIGFkZGl0aW9uYWwgY2hyb21lZHJpdmVycyBpbmZvIGlzIGdvaW5nIHRvIGJlIHJldHJpZXZlZCBhbmRcbiAgICogcGFyc2VkIGZyb20gcmVsZWFzZSBub3Rlc1xuICAgKiBAcmV0dXJucyB7Q2hyb21lZHJpdmVyc01hcHBpbmd9XG4gICAqL1xuICBhc3luYyByZXRyaWV2ZU1hcHBpbmcgKHNob3VsZFBhcnNlTm90ZXMgPSB0cnVlKSB7XG4gICAgY29uc3QgeG1sID0gYXdhaXQgcmV0cmlldmVEYXRhKENEX0NETiwge1xuICAgICAgJ3VzZXItYWdlbnQnOiAnYXBwaXVtJyxcbiAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL3htbCwgKi8qJyxcbiAgICB9LCB7IHRpbWVvdXQ6IHRoaXMudGltZW91dCB9KTtcbiAgICBjb25zdCBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHhtbCk7XG4gICAgYXdhaXQgdGhpcy5wYXJzZVN0b3JhZ2VYbWwoZG9jLCBzaG91bGRQYXJzZU5vdGVzKTtcbiAgICByZXR1cm4gXy5jbG9uZURlZXAodGhpcy5tYXBwaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBkb3dubG9hZGVkIGNocm9tZWRyaXZlciBhcmNoaXZlXG4gICAqIGludG8gdGhlIGdpdmVuIGRlc3RpbmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgLSBUaGUgc291cmNlIGFyY2hpdmUgcGF0aFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZHN0IC0gVGhlIGRlc3RpbmF0aW9uIGNocm9tZWRyaXZlciBwYXRoXG4gICAqL1xuICBhc3luYyB1bnppcERyaXZlciAoc3JjLCBkc3QpIHtcbiAgICBjb25zdCB0bXBSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHppcC5leHRyYWN0QWxsVG8oc3JjLCB0bXBSb290KTtcbiAgICAgIGNvbnN0IGNocm9tZWRyaXZlclBhdGggPSBhd2FpdCBmcy53YWxrRGlyKHRtcFJvb3QsIHRydWUsIChpdGVtUGF0aCwgaXNEaXJlY3RvcnkpID0+XG4gICAgICAgICFpc0RpcmVjdG9yeSAmJiBfLnRvTG93ZXIocGF0aC5wYXJzZShpdGVtUGF0aCkubmFtZSkgPT09ICdjaHJvbWVkcml2ZXInKTtcbiAgICAgIGlmICghY2hyb21lZHJpdmVyUGF0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBhcmNoaXZlIHdhcyB1bnppcHBlZCBwcm9wZXJseSwgYnV0IHdlIGNvdWxkIG5vdCBmaW5kIGFueSBjaHJvbWVkcml2ZXIgZXhlY3V0YWJsZScpO1xuICAgICAgfVxuICAgICAgbG9nLmRlYnVnKGBNb3ZpbmcgdGhlIGV4dHJhY3RlZCAnJHtwYXRoLmJhc2VuYW1lKGNocm9tZWRyaXZlclBhdGgpfScgdG8gJyR7ZHN0fSdgKTtcbiAgICAgIGF3YWl0IGZzLm12KGNocm9tZWRyaXZlclBhdGgsIGRzdCwge1xuICAgICAgICBta2RpcnA6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBmcy5yaW1yYWYodG1wUm9vdCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9TSW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBob3N0IE9TXG4gICAqIENhbiBiZSBlaXRoZXIgYG1hY2AsIGB3aW5kb3dzYCBvciBgbGludXhgXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcmNoIC0gVGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgaG9zdCBPRC5cbiAgICogQ2FuIGJlIGVpdGhlciBgMzJgIG9yIGA2NGBcbiAgICogQHByb3BlcnR5IHs/c3RyaW5nfSBoYXJkd2FyZU5hbWUgLSBUaGUgb3V0cHV0IG9mIGB1bmFtZSAtbWAgY29tbWFuZFxuICAgKiBvbiBsaW51eCBhbmQgbWFjIHN5c3RlbXMuIGBudWxsYCBvbiBXaW5kb3dzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGB0aGlzLm1hcHBpbmdgIHRvIG9ubHkgc2VsZWN0IG1hdGNoaW5nXG4gICAqIGNocm9tZWRyaXZlciBlbnRyaWVzIGJ5IG9wZXJhdGluZyBzeXN0ZW0gaW5mb3JtYXRpb25cbiAgICogYW5kL29yIGFkZGl0aW9uYWwgc3luY2hyb25pemF0aW9uIG9wdGlvbnMgKGlmIHByb3ZpZGVkKVxuICAgKlxuICAgKiBAcGFyYW0gez9PU0luZm99IG9zSW5mb1xuICAgKiBAcGFyYW0gez9TeW5jT3B0aW9uc30gb3B0c1xuICAgKiBAcmV0dXJucyB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZmlsdGVyZWQgY2hyb21lZHJpdmVyXG4gICAqIGVudHJ5IG5hbWVzICh2ZXJzaW9uL2FyY2hpdmUgbmFtZSlcbiAgICovXG4gIHNlbGVjdE1hdGNoaW5nRHJpdmVycyAob3NJbmZvLCBvcHRzID0ge30pIHtcbiAgICBjb25zdCB7XG4gICAgICBtaW5Ccm93c2VyVmVyc2lvbixcbiAgICAgIHZlcnNpb25zID0gW10sXG4gICAgfSA9IG9wdHM7XG4gICAgbGV0IGRyaXZlcnNUb1N5bmMgPSBfLmtleXModGhpcy5tYXBwaW5nKTtcblxuICAgIGlmICghXy5pc0VtcHR5KHZlcnNpb25zKSkge1xuICAgICAgLy8gSGFuZGxlIG9ubHkgc2VsZWN0ZWQgdmVyc2lvbnMgaWYgcmVxdWVzdGVkXG4gICAgICBsb2cuZGVidWcoYFNlbGVjdGluZyBjaHJvbWVkcml2ZXJzIHdob3NlIHZlcnNpb25zIG1hdGNoIHRvICR7dmVyc2lvbnN9YCk7XG4gICAgICBkcml2ZXJzVG9TeW5jID0gZHJpdmVyc1RvU3luY1xuICAgICAgICAuZmlsdGVyKChjZE5hbWUpID0+IHZlcnNpb25zLmluY2x1ZGVzKGAke3RoaXMubWFwcGluZ1tjZE5hbWVdLnZlcnNpb259YCkpO1xuXG4gICAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfWApO1xuICAgICAgaWYgKF8uaXNFbXB0eShkcml2ZXJzVG9TeW5jKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc05hTihtaW5Ccm93c2VyVmVyc2lvbikpIHtcbiAgICAgIC8vIE9ubHkgc2VsZWN0IGRyaXZlcnMgdGhhdCBzdXBwb3J0IHRoZSBjdXJyZW50IGJyb3dzZXIgd2hvc2UgbWFqb3IgdmVyc2lvbiBudW1iZXIgZXF1YWxzIHRvIGBtaW5Ccm93c2VyVmVyc2lvbmBcbiAgICAgIGNvbnN0IG1pbkJyb3dzZXJWZXJzaW9uSW50ID0gcGFyc2VJbnQobWluQnJvd3NlclZlcnNpb24sIDEwKTtcbiAgICAgIGxvZy5kZWJ1ZyhgU2VsZWN0aW5nIGNocm9tZWRyaXZlcnMgd2hvc2UgbWluaW11bSBzdXBwb3J0ZWQgYnJvd3NlciB2ZXJzaW9uIG1hdGNoZXMgdG8gJHttaW5Ccm93c2VyVmVyc2lvbkludH1gKTtcbiAgICAgIGxldCBjbG9zZXN0TWF0Y2hlZFZlcnNpb25OdW1iZXIgPSAwO1xuICAgICAgLy8gU2VsZWN0IHRoZSBuZXdlc3QgYXZhaWxhYmxlIGFuZCBjb21wYXRpYmxlIGNocm9tZWRyaXZlclxuICAgICAgZm9yIChjb25zdCBjZE5hbWUgb2YgZHJpdmVyc1RvU3luYykge1xuICAgICAgICBjb25zdCBjdXJyZW50TWluQnJvd3NlclZlcnNpb24gPSBwYXJzZUludCh0aGlzLm1hcHBpbmdbY2ROYW1lXS5taW5Ccm93c2VyVmVyc2lvbiwgMTApO1xuICAgICAgICBpZiAoIWlzTmFOKGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbilcbiAgICAgICAgICAgICYmIGN1cnJlbnRNaW5Ccm93c2VyVmVyc2lvbiA8PSBtaW5Ccm93c2VyVmVyc2lvbkludFxuICAgICAgICAgICAgJiYgY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyIDwgY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uKSB7XG4gICAgICAgICAgY2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyID0gY3VycmVudE1pbkJyb3dzZXJWZXJzaW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkcml2ZXJzVG9TeW5jID0gZHJpdmVyc1RvU3luYy5maWx0ZXIoKGNkTmFtZSkgPT4gYCR7dGhpcy5tYXBwaW5nW2NkTmFtZV0ubWluQnJvd3NlclZlcnNpb259YCA9PT1cbiAgICAgICAgYCR7Y2xvc2VzdE1hdGNoZWRWZXJzaW9uTnVtYmVyID4gMCA/IGNsb3Nlc3RNYXRjaGVkVmVyc2lvbk51bWJlciA6IG1pbkJyb3dzZXJWZXJzaW9uSW50fWApO1xuXG4gICAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdpdGVtJywgZHJpdmVyc1RvU3luYy5sZW5ndGgsIHRydWUpfWApO1xuICAgICAgaWYgKF8uaXNFbXB0eShkcml2ZXJzVG9TeW5jKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFdpbGwgc2VsZWN0IGNhbmRpZGF0ZSAke3V0aWwucGx1cmFsaXplKCdkcml2ZXInLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCl9IGAgK1xuICAgICAgICBgdmVyc2lvbmVkIGFzICcke18udW5pcShkcml2ZXJzVG9TeW5jLm1hcCgoY2ROYW1lKSA9PiB0aGlzLm1hcHBpbmdbY2ROYW1lXS52ZXJzaW9uKSl9J2ApO1xuICAgIH1cblxuICAgIGlmICghXy5pc0VtcHR5KG9zSW5mbykpIHtcbiAgICAgIC8vIEZpbHRlciBvdXQgZHJpdmVycyBmb3IgdW5zdXBwb3J0ZWQgc3lzdGVtIGFyY2hpdGVjdHVyZXNcbiAgICAgIGxldCB7bmFtZSwgYXJjaCwgaGFyZHdhcmVOYW1lfSA9IG9zSW5mbztcbiAgICAgIGlmIChhcmNoID09PSBYNjQgJiYgIWRyaXZlcnNUb1N5bmMuc29tZSgoY2ROYW1lKSA9PiBjZE5hbWUuaW5jbHVkZXMoYF8ke25hbWV9JHtYNjR9YCkpKSB7XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB4ODYgYnVpbGQgaWYgeDY0IG9uZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgZ2l2ZW4gT1NcbiAgICAgICAgYXJjaCA9IFg4NjtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSBPUy5tYWMgJiYgXy5pbmNsdWRlcyhoYXJkd2FyZU5hbWUsICdhcm0nKVxuICAgICAgICAgICYmIGRyaXZlcnNUb1N5bmMuc29tZSgoY2ROYW1lKSA9PiBjZE5hbWUuaW5jbHVkZXMoTTFfQVJDSF9TVUZGSVgpKSkge1xuICAgICAgICAvLyBwcmVmZXIgZXhlY3V0YWJsZSBmb3IgTTEgYXJjaCBpZiBwcmVzZW50XG4gICAgICAgIGFyY2ggKz0gTTFfQVJDSF9TVUZGSVg7XG4gICAgICB9XG4gICAgICBsb2cuZGVidWcoYFNlbGVjdGluZyBjaHJvbWVkcml2ZXJzIHdob3NlIHBsYXRmb3JtIG1hdGNoZXMgdG8gJHtuYW1lfSR7YXJjaH1gKTtcbiAgICAgIGNvbnN0IHBsYXRmb3JtUmUgPSBuZXcgUmVnRXhwKGAoXFxcXGJ8Xykke25hbWV9JHthcmNofVxcXFxiYCk7XG4gICAgICBkcml2ZXJzVG9TeW5jID0gZHJpdmVyc1RvU3luYy5maWx0ZXIoKGNkTmFtZSkgPT4gcGxhdGZvcm1SZS50ZXN0KGNkTmFtZSkpO1xuICAgICAgbG9nLmRlYnVnKGBHb3QgJHt1dGlsLnBsdXJhbGl6ZSgnaXRlbScsIGRyaXZlcnNUb1N5bmMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZHJpdmVyc1RvU3luYztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGdpdmVuIGNocm9tZWRyaXZlciBmcm9tIHRoZSBzdG9yYWdlXG4gICAqIGFuZCB1bnBhY2tzIGl0IGludG8gYHRoaXMuY2hyb21lZHJpdmVyRGlyYCBmb2xkZXJcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gVGhlIHVuaXF1ZSBkcml2ZXIgaW5kZXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRyaXZlcktleSAtIFRoZSBkcml2ZXIga2V5IGluIGB0aGlzLm1hcHBpbmdgXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlc1Jvb3QgLSBUaGUgdGVtcG9yYXJ5IGZvbGRlciBwYXRoIHRvIGV4dHJhY3RcbiAgICogZG93bmxvYWRlZCBhcmNoaXZlcyB0b1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzU3RyaWN0IFt0cnVlXSAtIFdoZXRoZXIgdG8gdGhyb3cgYW4gZXJyb3IgKGB0cnVlYClcbiAgICogb3IgcmV0dXJuIGEgYm9vbGVhbiByZXN1bHQgaWYgdGhlIGRyaXZlciByZXRyaWV2YWwgcHJvY2VzcyBmYWlsc1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGEgZmFpbHVyZSB3aGlsZSByZXRyaWV2aW5nIHRoZSBkcml2ZXJcbiAgICogYW5kIGBpc1N0cmljdGAgaXMgc2V0IHRvIGB0cnVlYFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gaWYgYHRydWVgIHRoZW4gdGhlIGNocm9tZWRyaXZlciBpcyBzdWNjZXNzZnVsbHlcbiAgICogZG93bmxvYWRlZCBhbmQgZXh0cmFjdGVkLlxuICAgKi9cbiAgYXN5bmMgcmV0cmlldmVEcml2ZXIgKGluZGV4LCBkcml2ZXJLZXksIGFyY2hpdmVzUm9vdCwgaXNTdHJpY3QgPSBmYWxzZSkge1xuICAgIGNvbnN0IHsgdXJsLCBldGFnLCB2ZXJzaW9uIH0gPSB0aGlzLm1hcHBpbmdbZHJpdmVyS2V5XTtcbiAgICBjb25zdCBhcmNoaXZlUGF0aCA9IHBhdGgucmVzb2x2ZShhcmNoaXZlc1Jvb3QsIGAke2luZGV4fS56aXBgKTtcbiAgICBsb2cuZGVidWcoYFJldHJpZXZpbmcgJyR7dXJsfScgdG8gJyR7YXJjaGl2ZVBhdGh9J2ApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuZXQuZG93bmxvYWRGaWxlKHVybCwgYXJjaGl2ZVBhdGgsIHtcbiAgICAgICAgaXNNZXRlcmVkOiBmYWxzZSxcbiAgICAgICAgdGltZW91dDogVElNRU9VVF9NU1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgbXNnID0gYENhbm5vdCBkb3dubG9hZCBjaHJvbWVkcml2ZXIgYXJjaGl2ZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWA7XG4gICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICBsb2cuZXJyb3IobXNnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFhd2FpdCBpc0NyY09rKGFyY2hpdmVQYXRoLCBldGFnKSkge1xuICAgICAgY29uc3QgbXNnID0gYFRoZSBjaGVja3N1bSBmb3IgdGhlIGRvd25sb2FkZWQgY2hyb21lZHJpdmVyICcke2RyaXZlcktleX0nIGRpZCBub3QgbWF0Y2hgO1xuICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKG1zZyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7cGF0aC5wYXJzZSh1cmwpLm5hbWV9X3Yke3ZlcnNpb259YCArXG4gICAgICAoc3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJycpO1xuICAgIGNvbnN0IHRhcmdldFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5jaHJvbWVkcml2ZXJEaXIsIGZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy51bnppcERyaXZlcihhcmNoaXZlUGF0aCwgdGFyZ2V0UGF0aCk7XG4gICAgICBhd2FpdCBmcy5jaG1vZCh0YXJnZXRQYXRoLCAwbzc1NSk7XG4gICAgICBsb2cuZGVidWcoYFBlcm1pc3Npb25zIG9mIHRoZSBmaWxlICcke3RhcmdldFBhdGh9JyBoYXZlIGJlZW4gY2hhbmdlZCB0byA3NTVgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBTeW5jT3B0aW9uc1xuICAgKiBAcHJvcGVydHkge0FycmF5PFN0cmluZz59IHZlcnNpb25zIC0gVGhlIGxpc3Qgb2YgY2hyb21lZHJpdmVyXG4gICAqIHZlcnNpb25zIHRvIHN5bmMuIElmIGVtcHR5ICh0aGUgZGVmYXVsdCB2YWx1ZSkgdGhlbiBhbGwgYXZhaWxhYmxlXG4gICAqIGNocm9tZWRyaXZlcnMgYXJlIGdvaW5nIHRvIGJlIGRvd25sb2FkZWQgYW5kIGV4dHJhY3RlZFxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudW1iZXJ9IG1pbkJyb3dzZXJWZXJzaW9uIC0gVGhlIG1pbnVtdW0gc3VwcG9ydGVkXG4gICAqIENocm9tZSB2ZXJzaW9uIHRoYXQgZG93bmxvYWRlZCBjaHJvbWVkcml2ZXJzIHNob3VsZCBzdXBwb3J0LiBDYW4gbWF0Y2hcbiAgICogbXVsdGlwbGUgZHJpdmVycy5cbiAgICogQHByb3BlcnR5IHs/T1NJbmZvfSBvc0luZm8gLSBTeXN0ZW0gaW5mb3JtYXRpb24gdXNlZCB0byBmaWx0ZXIgb3V0XG4gICAqIHRoZSBsaXN0IG9mIHRoZSByZXRyaWV2ZWQgZHJpdmVycy4gSWYgbm90IHByb3ZpZGVkIHRoZW4gdGhlIHNjcmlwdFxuICAgKiB3aWxsIHRyeSB0byByZXRyaWV2ZSBpdC5cbiAgICovXG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBjaHJvbWVkcml2ZXJzIGZyb20gdGhlIHJlbW90ZSBzdG9yYWdlXG4gICAqIHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbVxuICAgKlxuICAgKiBAcGFyYW0gez9TeW5jT3B0aW9uc30gb3B0c1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSB3aGlsZSByZXRyaWV2aW5nXG4gICAqIHRoZSBkcml2ZXJzXG4gICAqIEByZXR1cm5zIHtBcnJheTxTdHJpbmd9IFRoZSBsaXN0IG9mIHN1Y2Nlc3NmdWxseSBzeW5jaHJvbml6ZWQgZHJpdmVyIGtleXNcbiAgICovXG4gIGFzeW5jIHN5bmNEcml2ZXJzIChvcHRzID0ge30pIHtcbiAgICBpZiAoXy5pc0VtcHR5KHRoaXMubWFwcGluZykpIHtcbiAgICAgIGF3YWl0IHRoaXMucmV0cmlldmVNYXBwaW5nKCEhb3B0cy5taW5Ccm93c2VyVmVyc2lvbik7XG4gICAgfVxuICAgIGlmIChfLmlzRW1wdHkodGhpcy5tYXBwaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmV0cmlldmUgY2hyb21lZHJpdmVycyBtYXBwaW5nIGZyb20gR29vZ2xlIHN0b3JhZ2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCBkcml2ZXJzVG9TeW5jID0gdGhpcy5zZWxlY3RNYXRjaGluZ0RyaXZlcnMob3B0cy5vc0luZm8gPz8gYXdhaXQgZ2V0T3NJbmZvKCksIG9wdHMpO1xuICAgIGlmIChfLmlzRW1wdHkoZHJpdmVyc1RvU3luYykpIHtcbiAgICAgIGxvZy5kZWJ1ZyhgVGhlcmUgYXJlIG5vIGRyaXZlcnMgdG8gc3luYy4gRXhpdGluZ2ApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsb2cuZGVidWcoYEdvdCAke3V0aWwucGx1cmFsaXplKCdkcml2ZXInLCBkcml2ZXJzVG9TeW5jLmxlbmd0aCwgdHJ1ZSl9IHRvIHN5bmM6IGAgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkoZHJpdmVyc1RvU3luYywgbnVsbCwgMikpO1xuXG4gICAgY29uc3Qgc3luY2hyb25pemVkRHJpdmVycyA9IFtdO1xuICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgY29uc3QgYXJjaGl2ZXNSb290ID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgW2lkeCwgZHJpdmVyS2V5XSBvZiBkcml2ZXJzVG9TeW5jLmVudHJpZXMoKSkge1xuICAgICAgICBwcm9taXNlcy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKGF3YWl0IHRoaXMucmV0cmlldmVEcml2ZXIoaWR4LCBkcml2ZXJLZXksIGFyY2hpdmVzUm9vdCwgIV8uaXNFbXB0eShvcHRzKSkpIHtcbiAgICAgICAgICAgIHN5bmNocm9uaXplZERyaXZlcnMucHVzaChkcml2ZXJLZXkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKSk7XG5cbiAgICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCAlIE1BWF9QQVJBTExFTF9ET1dOTE9BRFMgPT09IDApIHtcbiAgICAgICAgICBhd2FpdCBCLmFsbChwcm9taXNlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGF3YWl0IEIuYWxsKHByb21pc2VzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKGFyY2hpdmVzUm9vdCk7XG4gICAgfVxuICAgIGlmICghXy5pc0VtcHR5KHN5bmNocm9uaXplZERyaXZlcnMpKSB7XG4gICAgICBsb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IHN5bmNocm9uaXplZCBgICtcbiAgICAgICAgYCR7dXRpbC5wbHVyYWxpemUoJ2Nocm9tZWRyaXZlcicsIHN5bmNocm9uaXplZERyaXZlcnMubGVuZ3RoLCB0cnVlKX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oYE5vIGNocm9tZWRyaXZlcnMgd2VyZSBzeW5jaHJvbml6ZWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHN5bmNocm9uaXplZERyaXZlcnM7XG4gIH1cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBDaHJvbWVkcml2ZXJTdG9yYWdlQ2xpZW50O1xuIl0sImZpbGUiOiJsaWIvc3RvcmFnZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/build/lib/utils.js
CHANGED
|
@@ -8,11 +8,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
8
8
|
exports.getChromeVersion = getChromeVersion;
|
|
9
9
|
exports.getChromedriverDir = getChromedriverDir;
|
|
10
10
|
exports.getChromedriverBinaryPath = getChromedriverBinaryPath;
|
|
11
|
-
exports.getCurPlatform = getCurPlatform;
|
|
12
|
-
exports.getPlatforms = getPlatforms;
|
|
13
11
|
exports.getMostRecentChromedriver = getMostRecentChromedriver;
|
|
14
12
|
exports.retrieveData = retrieveData;
|
|
15
|
-
exports.
|
|
13
|
+
exports.M1_ARCH_SUFFIX = exports.X86 = exports.X64 = exports.OS = exports.getOsInfo = exports.CHROMEDRIVER_CHROME_MAPPING = exports.CD_VER = exports.CD_CDN = exports.CD_BASE_DIR = exports.getOsName = void 0;
|
|
16
14
|
|
|
17
15
|
require("source-map-support/register");
|
|
18
16
|
|
|
@@ -22,12 +20,12 @@ var _appiumSupport = require("appium-support");
|
|
|
22
20
|
|
|
23
21
|
var _path = _interopRequireDefault(require("path"));
|
|
24
22
|
|
|
25
|
-
var _semver = _interopRequireDefault(require("semver"));
|
|
26
|
-
|
|
27
23
|
var _compareVersions = _interopRequireDefault(require("compare-versions"));
|
|
28
24
|
|
|
29
25
|
var _axios = _interopRequireDefault(require("axios"));
|
|
30
26
|
|
|
27
|
+
var _teen_process = require("teen_process");
|
|
28
|
+
|
|
31
29
|
const rootDir = _path.default.basename(__dirname) === 'lib' ? _path.default.resolve(__dirname, process.env.NO_PRECOMPILE ? '..' : '../..') : __dirname;
|
|
32
30
|
|
|
33
31
|
const CHROMEDRIVER_CHROME_MAPPING = require(_path.default.resolve(rootDir, 'config', 'mapping.json'));
|
|
@@ -41,10 +39,19 @@ const CD_BASE_DIR = _path.default.resolve(__dirname, '..', '..', 'chromedriver')
|
|
|
41
39
|
exports.CD_BASE_DIR = CD_BASE_DIR;
|
|
42
40
|
const CD_CDN = process.env.npm_config_chromedriver_cdnurl || process.env.CHROMEDRIVER_CDNURL || 'https://chromedriver.storage.googleapis.com';
|
|
43
41
|
exports.CD_CDN = CD_CDN;
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
42
|
+
const OS = {
|
|
43
|
+
linux: 'linux',
|
|
44
|
+
windows: 'win',
|
|
45
|
+
mac: 'mac'
|
|
46
|
+
};
|
|
47
|
+
exports.OS = OS;
|
|
48
|
+
const X64 = '64';
|
|
49
|
+
exports.X64 = X64;
|
|
50
|
+
const X86 = '32';
|
|
51
|
+
exports.X86 = X86;
|
|
52
|
+
const M1_ARCH_SUFFIX = '_m1';
|
|
53
|
+
exports.M1_ARCH_SUFFIX = M1_ARCH_SUFFIX;
|
|
54
|
+
const CD_EXECUTABLE_PREFIX = 'chromedriver';
|
|
48
55
|
|
|
49
56
|
function getMostRecentChromedriver(mapping = CHROMEDRIVER_CHROME_MAPPING) {
|
|
50
57
|
if (_lodash.default.isEmpty(mapping)) {
|
|
@@ -61,39 +68,21 @@ async function getChromeVersion(adb, bundleId) {
|
|
|
61
68
|
return versionName;
|
|
62
69
|
}
|
|
63
70
|
|
|
64
|
-
function getChromedriverDir(
|
|
65
|
-
return _path.default.resolve(CD_BASE_DIR,
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async function getChromedriverBinaryPath(platform = getCurPlatform(), arch = null) {
|
|
69
|
-
const baseDir = getChromedriverDir(platform);
|
|
70
|
-
let ext = '';
|
|
71
|
-
|
|
72
|
-
if (platform === 'win') {
|
|
73
|
-
ext = '.exe';
|
|
74
|
-
} else if (platform === 'linux') {
|
|
75
|
-
ext = `_${arch || (await _appiumSupport.system.arch())}`;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
return _path.default.resolve(baseDir, `chromedriver${ext}`);
|
|
71
|
+
function getChromedriverDir(osName = getOsName()) {
|
|
72
|
+
return _path.default.resolve(CD_BASE_DIR, osName);
|
|
79
73
|
}
|
|
80
74
|
|
|
81
|
-
function
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (_semver.default.lt(cdVer, LINUX_32_ONLY)) {
|
|
93
|
-
plats.push(['linux', '32']);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return plats;
|
|
75
|
+
async function getChromedriverBinaryPath(osName = getOsName()) {
|
|
76
|
+
const rootDir = getChromedriverDir(osName);
|
|
77
|
+
const pathSuffix = osName === OS.windows ? '.exe' : '';
|
|
78
|
+
const paths = await _appiumSupport.fs.glob(`${CD_EXECUTABLE_PREFIX}*${pathSuffix}`, {
|
|
79
|
+
cwd: rootDir,
|
|
80
|
+
absolute: true,
|
|
81
|
+
nocase: true,
|
|
82
|
+
nodir: true,
|
|
83
|
+
strict: false
|
|
84
|
+
});
|
|
85
|
+
return _lodash.default.isEmpty(paths) ? _path.default.resolve(rootDir, `${CD_EXECUTABLE_PREFIX}${pathSuffix}`) : _lodash.default.first(paths);
|
|
97
86
|
}
|
|
98
87
|
|
|
99
88
|
async function retrieveData(url, headers, opts = {}) {
|
|
@@ -107,7 +96,31 @@ async function retrieveData(url, headers, opts = {}) {
|
|
|
107
96
|
timeout,
|
|
108
97
|
responseType
|
|
109
98
|
})).data;
|
|
110
|
-
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const getOsName = _lodash.default.memoize(function getOsName() {
|
|
102
|
+
if (_appiumSupport.system.isWindows()) {
|
|
103
|
+
return OS.windows;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (_appiumSupport.system.isMac()) {
|
|
107
|
+
return OS.mac;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return OS.linux;
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
exports.getOsName = getOsName;
|
|
114
|
+
|
|
115
|
+
const getOsInfo = _lodash.default.memoize(async function getOsInfo() {
|
|
116
|
+
return {
|
|
117
|
+
name: getOsName(),
|
|
118
|
+
arch: await _appiumSupport.system.arch(),
|
|
119
|
+
hardwareName: _appiumSupport.system.isWindows() ? null : _lodash.default.trim(await (0, _teen_process.exec)('uname', ['-m']))
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
exports.getOsInfo = getOsInfo;require('source-map-support').install();
|
|
111
124
|
|
|
112
125
|
|
|
113
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
126
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJyb290RGlyIiwicGF0aCIsImJhc2VuYW1lIiwiX19kaXJuYW1lIiwicmVzb2x2ZSIsInByb2Nlc3MiLCJlbnYiLCJOT19QUkVDT01QSUxFIiwiQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HIiwicmVxdWlyZSIsIkNEX1ZFUiIsIm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb24iLCJDSFJPTUVEUklWRVJfVkVSU0lPTiIsImdldE1vc3RSZWNlbnRDaHJvbWVkcml2ZXIiLCJDRF9CQVNFX0RJUiIsIkNEX0NETiIsIm5wbV9jb25maWdfY2hyb21lZHJpdmVyX2NkbnVybCIsIkNIUk9NRURSSVZFUl9DRE5VUkwiLCJPUyIsImxpbnV4Iiwid2luZG93cyIsIm1hYyIsIlg2NCIsIlg4NiIsIk0xX0FSQ0hfU1VGRklYIiwiQ0RfRVhFQ1VUQUJMRV9QUkVGSVgiLCJtYXBwaW5nIiwiXyIsImlzRW1wdHkiLCJFcnJvciIsImxhc3QiLCJrZXlzIiwic29ydCIsImNvbXBhcmVWZXJzaW9ucyIsImdldENocm9tZVZlcnNpb24iLCJhZGIiLCJidW5kbGVJZCIsInZlcnNpb25OYW1lIiwiZ2V0UGFja2FnZUluZm8iLCJnZXRDaHJvbWVkcml2ZXJEaXIiLCJvc05hbWUiLCJnZXRPc05hbWUiLCJnZXRDaHJvbWVkcml2ZXJCaW5hcnlQYXRoIiwicGF0aFN1ZmZpeCIsInBhdGhzIiwiZnMiLCJnbG9iIiwiY3dkIiwiYWJzb2x1dGUiLCJub2Nhc2UiLCJub2RpciIsInN0cmljdCIsImZpcnN0IiwicmV0cmlldmVEYXRhIiwidXJsIiwiaGVhZGVycyIsIm9wdHMiLCJ0aW1lb3V0IiwicmVzcG9uc2VUeXBlIiwiZGF0YSIsIm1lbW9pemUiLCJzeXN0ZW0iLCJpc1dpbmRvd3MiLCJpc01hYyIsImdldE9zSW5mbyIsIm5hbWUiLCJhcmNoIiwiaGFyZHdhcmVOYW1lIiwidHJpbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBLE1BQU1BLE9BQU8sR0FBR0MsY0FBS0MsUUFBTCxDQUFjQyxTQUFkLE1BQTZCLEtBQTdCLEdBQ1pGLGNBQUtHLE9BQUwsQ0FBYUQsU0FBYixFQUF3QkUsT0FBTyxDQUFDQyxHQUFSLENBQVlDLGFBQVosR0FBNEIsSUFBNUIsR0FBbUMsT0FBM0QsQ0FEWSxHQUVaSixTQUZKOztBQUlBLE1BQU1LLDJCQUEyQixHQUFHQyxPQUFPLENBQUNSLGNBQUtHLE9BQUwsQ0FBYUosT0FBYixFQUFzQixRQUF0QixFQUFnQyxjQUFoQyxDQUFELENBQTNDOzs7QUFFQSxNQUFNVSxNQUFNLEdBQUdMLE9BQU8sQ0FBQ0MsR0FBUixDQUFZSywrQkFBWixJQUNWTixPQUFPLENBQUNDLEdBQVIsQ0FBWU0sb0JBREYsSUFFVkMseUJBQXlCLEVBRjlCOzs7QUFHQSxNQUFNQyxXQUFXLEdBQUdiLGNBQUtHLE9BQUwsQ0FBYUQsU0FBYixFQUF3QixJQUF4QixFQUE4QixJQUE5QixFQUFvQyxjQUFwQyxDQUFwQjs7O0FBQ0EsTUFBTVksTUFBTSxHQUFHVixPQUFPLENBQUNDLEdBQVIsQ0FBWVUsOEJBQVosSUFDVlgsT0FBTyxDQUFDQyxHQUFSLENBQVlXLG1CQURGLElBRVYsNkNBRkw7O0FBR0EsTUFBTUMsRUFBRSxHQUFHO0FBQ1RDLEVBQUFBLEtBQUssRUFBRSxPQURFO0FBRVRDLEVBQUFBLE9BQU8sRUFBRSxLQUZBO0FBR1RDLEVBQUFBLEdBQUcsRUFBRTtBQUhJLENBQVg7O0FBS0EsTUFBTUMsR0FBRyxHQUFHLElBQVo7O0FBQ0EsTUFBTUMsR0FBRyxHQUFHLElBQVo7O0FBQ0EsTUFBTUMsY0FBYyxHQUFHLEtBQXZCOztBQUNBLE1BQU1DLG9CQUFvQixHQUFHLGNBQTdCOztBQUdBLFNBQVNaLHlCQUFULENBQW9DYSxPQUFPLEdBQUdsQiwyQkFBOUMsRUFBMkU7QUFDekUsTUFBSW1CLGdCQUFFQyxPQUFGLENBQVVGLE9BQVYsQ0FBSixFQUF3QjtBQUN0QixVQUFNLElBQUlHLEtBQUosQ0FBVSxtRUFBVixDQUFOO0FBQ0Q7O0FBQ0QsU0FBT0YsZ0JBQUVHLElBQUYsQ0FBT0gsZ0JBQUVJLElBQUYsQ0FBT0wsT0FBUCxFQUFnQk0sSUFBaEIsQ0FBcUJDLHdCQUFyQixDQUFQLENBQVA7QUFDRDs7QUFFRCxlQUFlQyxnQkFBZixDQUFpQ0MsR0FBakMsRUFBc0NDLFFBQXRDLEVBQWdEO0FBQzlDLFFBQU07QUFBQ0MsSUFBQUE7QUFBRCxNQUFnQixNQUFNRixHQUFHLENBQUNHLGNBQUosQ0FBbUJGLFFBQW5CLENBQTVCO0FBQ0EsU0FBT0MsV0FBUDtBQUNEOztBQUVELFNBQVNFLGtCQUFULENBQTZCQyxNQUFNLEdBQUdDLFNBQVMsRUFBL0MsRUFBbUQ7QUFDakQsU0FBT3hDLGNBQUtHLE9BQUwsQ0FBYVUsV0FBYixFQUEwQjBCLE1BQTFCLENBQVA7QUFDRDs7QUFFRCxlQUFlRSx5QkFBZixDQUEwQ0YsTUFBTSxHQUFHQyxTQUFTLEVBQTVELEVBQWdFO0FBQzlELFFBQU16QyxPQUFPLEdBQUd1QyxrQkFBa0IsQ0FBQ0MsTUFBRCxDQUFsQztBQUNBLFFBQU1HLFVBQVUsR0FBR0gsTUFBTSxLQUFLdEIsRUFBRSxDQUFDRSxPQUFkLEdBQXdCLE1BQXhCLEdBQWlDLEVBQXBEO0FBQ0EsUUFBTXdCLEtBQUssR0FBRyxNQUFNQyxrQkFBR0MsSUFBSCxDQUFTLEdBQUVyQixvQkFBcUIsSUFBR2tCLFVBQVcsRUFBOUMsRUFBaUQ7QUFDbkVJLElBQUFBLEdBQUcsRUFBRS9DLE9BRDhEO0FBRW5FZ0QsSUFBQUEsUUFBUSxFQUFFLElBRnlEO0FBR25FQyxJQUFBQSxNQUFNLEVBQUUsSUFIMkQ7QUFJbkVDLElBQUFBLEtBQUssRUFBRSxJQUo0RDtBQUtuRUMsSUFBQUEsTUFBTSxFQUFFO0FBTDJELEdBQWpELENBQXBCO0FBT0EsU0FBT3hCLGdCQUFFQyxPQUFGLENBQVVnQixLQUFWLElBQ0gzQyxjQUFLRyxPQUFMLENBQWFKLE9BQWIsRUFBdUIsR0FBRXlCLG9CQUFxQixHQUFFa0IsVUFBVyxFQUEzRCxDQURHLEdBRUhoQixnQkFBRXlCLEtBQUYsQ0FBUVIsS0FBUixDQUZKO0FBR0Q7O0FBRUQsZUFBZVMsWUFBZixDQUE2QkMsR0FBN0IsRUFBa0NDLE9BQWxDLEVBQTJDQyxJQUFJLEdBQUcsRUFBbEQsRUFBc0Q7QUFDcEQsUUFBTTtBQUNKQyxJQUFBQSxPQUFPLEdBQUcsSUFETjtBQUVKQyxJQUFBQSxZQUFZLEdBQUc7QUFGWCxNQUdGRixJQUhKO0FBSUEsU0FBTyxDQUFDLE1BQU0sb0JBQU07QUFDbEJGLElBQUFBLEdBRGtCO0FBRWxCQyxJQUFBQSxPQUZrQjtBQUdsQkUsSUFBQUEsT0FIa0I7QUFJbEJDLElBQUFBO0FBSmtCLEdBQU4sQ0FBUCxFQUtIQyxJQUxKO0FBTUQ7O0FBRUQsTUFBTWxCLFNBQVMsR0FBR2QsZ0JBQUVpQyxPQUFGLENBQVUsU0FBU25CLFNBQVQsR0FBc0I7QUFDaEQsTUFBSW9CLHNCQUFPQyxTQUFQLEVBQUosRUFBd0I7QUFDdEIsV0FBTzVDLEVBQUUsQ0FBQ0UsT0FBVjtBQUNEOztBQUNELE1BQUl5QyxzQkFBT0UsS0FBUCxFQUFKLEVBQW9CO0FBQ2xCLFdBQU83QyxFQUFFLENBQUNHLEdBQVY7QUFDRDs7QUFDRCxTQUFPSCxFQUFFLENBQUNDLEtBQVY7QUFDRCxDQVJpQixDQUFsQjs7OztBQVVBLE1BQU02QyxTQUFTLEdBQUdyQyxnQkFBRWlDLE9BQUYsQ0FBVSxlQUFlSSxTQUFmLEdBQTRCO0FBQ3RELFNBQU87QUFDTEMsSUFBQUEsSUFBSSxFQUFFeEIsU0FBUyxFQURWO0FBRUx5QixJQUFBQSxJQUFJLEVBQUUsTUFBTUwsc0JBQU9LLElBQVAsRUFGUDtBQUdMQyxJQUFBQSxZQUFZLEVBQUVOLHNCQUFPQyxTQUFQLEtBQXFCLElBQXJCLEdBQTRCbkMsZ0JBQUV5QyxJQUFGLENBQU8sTUFBTSx3QkFBSyxPQUFMLEVBQWMsQ0FBQyxJQUFELENBQWQsQ0FBYjtBQUhyQyxHQUFQO0FBS0QsQ0FOaUIsQ0FBbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgc3lzdGVtLCBmcyB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGNvbXBhcmVWZXJzaW9ucyBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcblxuXG5jb25zdCByb290RGlyID0gcGF0aC5iYXNlbmFtZShfX2Rpcm5hbWUpID09PSAnbGliJ1xuICA/IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIHByb2Nlc3MuZW52Lk5PX1BSRUNPTVBJTEUgPyAnLi4nIDogJy4uLy4uJylcbiAgOiBfX2Rpcm5hbWU7XG4vLyBDaHJvbWVkcml2ZXIgdmVyc2lvbjogbWluaW11bSBDaHJvbWUgdmVyc2lvblxuY29uc3QgQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HID0gcmVxdWlyZShwYXRoLnJlc29sdmUocm9vdERpciwgJ2NvbmZpZycsICdtYXBwaW5nLmpzb24nKSk7XG5cbmNvbnN0IENEX1ZFUiA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfY2hyb21lZHJpdmVyX3ZlcnNpb25cbiAgfHwgcHJvY2Vzcy5lbnYuQ0hST01FRFJJVkVSX1ZFUlNJT05cbiAgfHwgZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlcigpO1xuY29uc3QgQ0RfQkFTRV9ESVIgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4nLCAnLi4nLCAnY2hyb21lZHJpdmVyJyk7XG5jb25zdCBDRF9DRE4gPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2Nocm9tZWRyaXZlcl9jZG51cmxcbiAgfHwgcHJvY2Vzcy5lbnYuQ0hST01FRFJJVkVSX0NETlVSTFxuICB8fCAnaHR0cHM6Ly9jaHJvbWVkcml2ZXIuc3RvcmFnZS5nb29nbGVhcGlzLmNvbSc7XG5jb25zdCBPUyA9IHtcbiAgbGludXg6ICdsaW51eCcsXG4gIHdpbmRvd3M6ICd3aW4nLFxuICBtYWM6ICdtYWMnXG59O1xuY29uc3QgWDY0ID0gJzY0JztcbmNvbnN0IFg4NiA9ICczMic7XG5jb25zdCBNMV9BUkNIX1NVRkZJWCA9ICdfbTEnO1xuY29uc3QgQ0RfRVhFQ1VUQUJMRV9QUkVGSVggPSAnY2hyb21lZHJpdmVyJztcblxuXG5mdW5jdGlvbiBnZXRNb3N0UmVjZW50Q2hyb21lZHJpdmVyIChtYXBwaW5nID0gQ0hST01FRFJJVkVSX0NIUk9NRV9NQVBQSU5HKSB7XG4gIGlmIChfLmlzRW1wdHkobWFwcGluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZXQgbW9zdCByZWNlbnQgQ2hyb21lZHJpdmVyIHZlcnNpb24gZnJvbSBlbXB0eSBtYXBwaW5nJyk7XG4gIH1cbiAgcmV0dXJuIF8ubGFzdChfLmtleXMobWFwcGluZykuc29ydChjb21wYXJlVmVyc2lvbnMpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hyb21lVmVyc2lvbiAoYWRiLCBidW5kbGVJZCkge1xuICBjb25zdCB7dmVyc2lvbk5hbWV9ID0gYXdhaXQgYWRiLmdldFBhY2thZ2VJbmZvKGJ1bmRsZUlkKTtcbiAgcmV0dXJuIHZlcnNpb25OYW1lO1xufVxuXG5mdW5jdGlvbiBnZXRDaHJvbWVkcml2ZXJEaXIgKG9zTmFtZSA9IGdldE9zTmFtZSgpKSB7XG4gIHJldHVybiBwYXRoLnJlc29sdmUoQ0RfQkFTRV9ESVIsIG9zTmFtZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZWRyaXZlckJpbmFyeVBhdGggKG9zTmFtZSA9IGdldE9zTmFtZSgpKSB7XG4gIGNvbnN0IHJvb3REaXIgPSBnZXRDaHJvbWVkcml2ZXJEaXIob3NOYW1lKTtcbiAgY29uc3QgcGF0aFN1ZmZpeCA9IG9zTmFtZSA9PT0gT1Mud2luZG93cyA/ICcuZXhlJyA6ICcnO1xuICBjb25zdCBwYXRocyA9IGF3YWl0IGZzLmdsb2IoYCR7Q0RfRVhFQ1VUQUJMRV9QUkVGSVh9KiR7cGF0aFN1ZmZpeH1gLCB7XG4gICAgY3dkOiByb290RGlyLFxuICAgIGFic29sdXRlOiB0cnVlLFxuICAgIG5vY2FzZTogdHJ1ZSxcbiAgICBub2RpcjogdHJ1ZSxcbiAgICBzdHJpY3Q6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIF8uaXNFbXB0eShwYXRocylcbiAgICA/IHBhdGgucmVzb2x2ZShyb290RGlyLCBgJHtDRF9FWEVDVVRBQkxFX1BSRUZJWH0ke3BhdGhTdWZmaXh9YClcbiAgICA6IF8uZmlyc3QocGF0aHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXRyaWV2ZURhdGEgKHVybCwgaGVhZGVycywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB0aW1lb3V0ID0gNTAwMCxcbiAgICByZXNwb25zZVR5cGUgPSAndGV4dCcsXG4gIH0gPSBvcHRzO1xuICByZXR1cm4gKGF3YWl0IGF4aW9zKHtcbiAgICB1cmwsXG4gICAgaGVhZGVycyxcbiAgICB0aW1lb3V0LFxuICAgIHJlc3BvbnNlVHlwZSxcbiAgfSkpLmRhdGE7XG59XG5cbmNvbnN0IGdldE9zTmFtZSA9IF8ubWVtb2l6ZShmdW5jdGlvbiBnZXRPc05hbWUgKCkge1xuICBpZiAoc3lzdGVtLmlzV2luZG93cygpKSB7XG4gICAgcmV0dXJuIE9TLndpbmRvd3M7XG4gIH1cbiAgaWYgKHN5c3RlbS5pc01hYygpKSB7XG4gICAgcmV0dXJuIE9TLm1hYztcbiAgfVxuICByZXR1cm4gT1MubGludXg7XG59KTtcblxuY29uc3QgZ2V0T3NJbmZvID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldE9zSW5mbyAoKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogZ2V0T3NOYW1lKCksXG4gICAgYXJjaDogYXdhaXQgc3lzdGVtLmFyY2goKSxcbiAgICBoYXJkd2FyZU5hbWU6IHN5c3RlbS5pc1dpbmRvd3MoKSA/IG51bGwgOiBfLnRyaW0oYXdhaXQgZXhlYygndW5hbWUnLCBbJy1tJ10pKSxcbiAgfTtcbn0pO1xuXG5cbmV4cG9ydCB7XG4gIGdldENocm9tZVZlcnNpb24sIGdldENocm9tZWRyaXZlckRpciwgZ2V0Q2hyb21lZHJpdmVyQmluYXJ5UGF0aCwgZ2V0T3NOYW1lLFxuICBDRF9CQVNFX0RJUiwgQ0RfQ0ROLCBDRF9WRVIsIENIUk9NRURSSVZFUl9DSFJPTUVfTUFQUElORywgZ2V0TW9zdFJlY2VudENocm9tZWRyaXZlcixcbiAgcmV0cmlldmVEYXRhLCBnZXRPc0luZm8sIE9TLCBYNjQsIFg4NiwgTTFfQVJDSF9TVUZGSVgsXG59O1xuIl0sImZpbGUiOiJsaWIvdXRpbHMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
|
package/config/mapping.json
CHANGED
package/lib/install.js
CHANGED
|
@@ -1,135 +1,43 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import { parallel as ll } from 'asyncbox';
|
|
4
|
-
import { system, tempDir, fs, zip, mkdirp, net } from 'appium-support';
|
|
1
|
+
import { fs, mkdirp } from 'appium-support';
|
|
2
|
+
import ChromedriverStorageClient from './storage-client';
|
|
5
3
|
import {
|
|
6
|
-
CD_CDN, CD_VER,
|
|
7
|
-
getCurPlatform, getPlatforms, MAC_32_ONLY, retrieveData,
|
|
4
|
+
CD_CDN, CD_VER, retrieveData, getOsInfo, getChromedriverDir,
|
|
8
5
|
} from './utils';
|
|
9
|
-
import logger from 'fancy-log';
|
|
10
|
-
import semver from 'semver';
|
|
11
6
|
|
|
12
7
|
|
|
13
|
-
function log (line) {
|
|
14
|
-
logger(`[Chromedriver Install] ${line}`);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const CD_PLATS = ['linux', 'win', 'mac'];
|
|
18
|
-
const CD_ARCHS = ['32', '64'];
|
|
19
8
|
const DOWNLOAD_TIMEOUT_MS = 15 * 1000;
|
|
9
|
+
const LATEST_VERSION = 'LATEST';
|
|
20
10
|
|
|
21
|
-
async function
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
if (platform !== 'linux' && platform !== 'mac') {
|
|
25
|
-
arch = '32';
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const cdVer = semver.coerce(CD_VER);
|
|
29
|
-
if (platform === 'mac' && semver.lt(cdVer, MAC_32_ONLY)) {
|
|
30
|
-
arch = '32';
|
|
31
|
-
}
|
|
32
|
-
return {arch, platform};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function getDownloadUrl (version, platform, arch) {
|
|
36
|
-
return `${CD_CDN}/${version}/chromedriver_${platform}${arch}.zip`;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function validatePlatform (platform, arch) {
|
|
40
|
-
if (!_.includes(CD_PLATS, platform)) {
|
|
41
|
-
throw new Error(`Invalid platform: ${platform}`);
|
|
42
|
-
}
|
|
43
|
-
if (!_.includes(CD_ARCHS, arch)) {
|
|
44
|
-
throw new Error(`Invalid arch: ${arch}`);
|
|
45
|
-
}
|
|
46
|
-
if (arch === '64' && platform !== 'linux' && platform !== 'mac') {
|
|
47
|
-
throw new Error('Only linux has a 64-bit version of Chromedriver');
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async function installForPlatform (version, platform, arch) {
|
|
52
|
-
if (version === 'LATEST') {
|
|
53
|
-
version = (await retrieveData(`${CD_CDN}/LATEST_RELEASE`, {
|
|
11
|
+
async function formatCdVersion (ver) {
|
|
12
|
+
return ver === LATEST_VERSION
|
|
13
|
+
? (await retrieveData(`${CD_CDN}/LATEST_RELEASE`, {
|
|
54
14
|
'user-agent': 'appium',
|
|
55
15
|
accept: '*/*',
|
|
56
|
-
}, { timeout: DOWNLOAD_TIMEOUT_MS })).trim()
|
|
57
|
-
|
|
58
|
-
validatePlatform(platform, arch);
|
|
59
|
-
|
|
60
|
-
const url = getDownloadUrl(version, platform, arch);
|
|
61
|
-
|
|
62
|
-
log(`Installing Chromedriver version '${version}' for platform '${platform}' and architecture '${arch}'`);
|
|
63
|
-
|
|
64
|
-
// set up a temp file to download the chromedriver zipfile to
|
|
65
|
-
const binarySpec = `chromedriver_${platform}${arch}`;
|
|
66
|
-
log(`Opening temp file to write '${binarySpec}' to...`);
|
|
67
|
-
const tempFile = await tempDir.open({
|
|
68
|
-
prefix: binarySpec,
|
|
69
|
-
suffix: '.zip'
|
|
70
|
-
});
|
|
71
|
-
log(`Opened temp file '${tempFile.path}'`);
|
|
72
|
-
|
|
73
|
-
// actually download the zipfile and write it with appropriate perms
|
|
74
|
-
log(`Downloading ${url} to '${tempFile.path}'`);
|
|
75
|
-
await net.downloadFile(url, tempFile.path, {timeout: DOWNLOAD_TIMEOUT_MS});
|
|
76
|
-
await fs.chmod(tempFile.path, 0o0644);
|
|
77
|
-
|
|
78
|
-
// extract downloaded zipfile to tempdir
|
|
79
|
-
const tempUnzipped = path.resolve(path.dirname(tempFile.path), binarySpec);
|
|
80
|
-
log(`Extracting ${tempFile.path} to ${tempUnzipped}`);
|
|
81
|
-
await mkdirp(tempUnzipped);
|
|
82
|
-
await zip.extractAllTo(tempFile.path, tempUnzipped);
|
|
83
|
-
let extractedBin = path.resolve(tempUnzipped, 'chromedriver');
|
|
84
|
-
if (platform === 'win') {
|
|
85
|
-
extractedBin += '.exe';
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// make build dirs that will hold the chromedriver binary
|
|
89
|
-
log(`Creating ${path.resolve(CD_BASE_DIR, platform)}...`);
|
|
90
|
-
await mkdirp(path.resolve(CD_BASE_DIR, platform));
|
|
91
|
-
|
|
92
|
-
// copy the extracted binary to the correct build dir
|
|
93
|
-
const newBin = await getChromedriverBinaryPath(platform, arch);
|
|
94
|
-
log(`Copying unzipped binary, reading from ${extractedBin}...`);
|
|
95
|
-
const binContents = await fs.readFile(extractedBin, {encoding: 'binary'});
|
|
96
|
-
log(`Writing to ${newBin}...`);
|
|
97
|
-
await fs.writeFile(newBin, binContents, {encoding: 'binary', mode: 0o755});
|
|
98
|
-
log(`${newBin} successfully put in place`);
|
|
16
|
+
}, { timeout: DOWNLOAD_TIMEOUT_MS })).trim()
|
|
17
|
+
: ver;
|
|
99
18
|
}
|
|
100
19
|
|
|
101
|
-
async function
|
|
102
|
-
const
|
|
103
|
-
await
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
async function conditionalInstall () {
|
|
107
|
-
const {arch, platform} = await getArchAndPlatform();
|
|
108
|
-
const binPath = await getChromedriverBinaryPath(platform, arch);
|
|
109
|
-
if (!await fs.exists(binPath)) {
|
|
110
|
-
await installForPlatform(CD_VER, platform, arch);
|
|
111
|
-
} else {
|
|
112
|
-
log(`No need to install chromedriver, ${binPath} exists`);
|
|
20
|
+
async function prepareChromedriverDir (platformName) {
|
|
21
|
+
const chromedriverDir = getChromedriverDir(platformName);
|
|
22
|
+
if (!await fs.exists(chromedriverDir)) {
|
|
23
|
+
await mkdirp(chromedriverDir);
|
|
113
24
|
}
|
|
25
|
+
return chromedriverDir;
|
|
114
26
|
}
|
|
115
27
|
|
|
116
|
-
async function
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
await
|
|
28
|
+
async function install () {
|
|
29
|
+
const osInfo = await getOsInfo();
|
|
30
|
+
const client = new ChromedriverStorageClient({
|
|
31
|
+
chromedriverDir: await prepareChromedriverDir(osInfo.name),
|
|
32
|
+
});
|
|
33
|
+
await client.syncDrivers({
|
|
34
|
+
osInfo,
|
|
35
|
+
versions: [await formatCdVersion(CD_VER)],
|
|
36
|
+
});
|
|
122
37
|
}
|
|
123
38
|
|
|
124
39
|
async function doInstall () {
|
|
125
|
-
|
|
126
|
-
process.env.npm_config_chromedriver_install_all) {
|
|
127
|
-
await installAll();
|
|
128
|
-
} else if (_.includes(process.argv, '--conditional')) {
|
|
129
|
-
await conditionalInstall();
|
|
130
|
-
} else {
|
|
131
|
-
await install();
|
|
132
|
-
}
|
|
40
|
+
await install();
|
|
133
41
|
}
|
|
134
42
|
|
|
135
|
-
export { install,
|
|
43
|
+
export { install, doInstall };
|