appium-android-driver 5.8.12 → 5.9.1

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.
@@ -18,6 +18,9 @@ const AIRPLANE_MODE_MASK = 0b001;
18
18
  const WIFI_MASK = 0b010;
19
19
  const DATA_MASK = 0b100;
20
20
  const GEO_EPSILON = Number.MIN_VALUE;
21
+ const WIFI_KEY_NAME = 'wifi';
22
+ const DATA_KEY_NAME = 'data';
23
+ const AIRPLANE_MODE_KEY_NAME = 'airplaneMode';
21
24
  commands.getNetworkConnection = async function getNetworkConnection() {
22
25
  this.log.info('Getting network connection');
23
26
  let airplaneModeOn = await this.adb.isAirplaneModeOn();
@@ -33,6 +36,52 @@ commands.getNetworkConnection = async function getNetworkConnection() {
33
36
  commands.isWifiOn = async function isWifiOn() {
34
37
  return await this.adb.isWifiOn();
35
38
  };
39
+ commands.mobileSetConnectivity = async function mobileSetConnectivity(opts = {}) {
40
+ const {
41
+ wifi,
42
+ data,
43
+ airplaneMode
44
+ } = opts;
45
+ if (_lodash.default.every([wifi, data, airplaneMode], _lodash.default.isUndefined)) {
46
+ throw new _driver.errors.InvalidArgumentError(`Either one of ['${WIFI_KEY_NAME}', '${DATA_KEY_NAME}', '${AIRPLANE_MODE_KEY_NAME}'] options must be provided`);
47
+ }
48
+ const currentState = await this.mobileGetConnectivity({
49
+ services: [...(_lodash.default.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]), ...(_lodash.default.isUndefined(data) ? [] : [DATA_KEY_NAME]), ...(_lodash.default.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME])]
50
+ });
51
+ const setters = [];
52
+ if (!_lodash.default.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {
53
+ setters.push(this.adb.setWifiState(wifi, this.isEmulator()));
54
+ }
55
+ if (!_lodash.default.isUndefined(data) && currentState.data !== Boolean(data)) {
56
+ setters.push(this.adb.setDataState(data, this.isEmulator()));
57
+ }
58
+ if (!_lodash.default.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {
59
+ setters.push(async () => {
60
+ await this.adb.setAirplaneMode(airplaneMode);
61
+ if (this.adb.getApiLevel() < 30) {
62
+ await this.adb.broadcastAirplaneMode(airplaneMode);
63
+ }
64
+ });
65
+ }
66
+ if (!_lodash.default.isEmpty(setters)) {
67
+ await _bluebird.default.all(setters);
68
+ }
69
+ };
70
+ commands.mobileGetConnectivity = async function mobileGetConnectivity(opts = {}) {
71
+ let {
72
+ services = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME]
73
+ } = opts;
74
+ if (!_lodash.default.isArray(services)) {
75
+ services = [services];
76
+ }
77
+ const statePromises = {
78
+ wifi: _bluebird.default.resolve(services.includes(WIFI_KEY_NAME) ? undefined : this.adb.isWifiOn()),
79
+ data: _bluebird.default.resolve(services.includes(DATA_KEY_NAME) ? undefined : this.adb.isDataOn()),
80
+ airplaneMode: _bluebird.default.resolve(services.includes(AIRPLANE_MODE_KEY_NAME) ? undefined : this.adb.isAirplaneModeOn())
81
+ };
82
+ await _bluebird.default.all(_lodash.default.values(statePromises));
83
+ return _lodash.default.fromPairs(services.map(k => [k, statePromises[k].value()]));
84
+ };
36
85
  commands.setNetworkConnection = async function setNetworkConnection(type) {
37
86
  this.log.info('Setting network connection');
38
87
  const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;
@@ -47,10 +96,12 @@ commands.setNetworkConnection = async function setNetworkConnection(type) {
47
96
  await this.adb.setAirplaneMode(shouldEnableAirplaneMode);
48
97
  });
49
98
  await this.wrapBootstrapDisconnect(async () => {
50
- await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);
99
+ if ((await this.adb.getApiLevel()) < 30) {
100
+ await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);
101
+ }
51
102
  });
52
103
  } else {
53
- this.log.info(`Not changing airplane mode, since it is already ` + `${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);
104
+ this.log.info(`Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);
54
105
  }
55
106
  if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {
56
107
  this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');
@@ -103,7 +154,9 @@ commands.toggleFlightMode = async function toggleFlightMode() {
103
154
  await this.adb.setAirplaneMode(flightMode);
104
155
  });
105
156
  await this.wrapBootstrapDisconnect(async () => {
106
- await this.adb.broadcastAirplaneMode(flightMode);
157
+ if ((await this.adb.getApiLevel()) < 30) {
158
+ await this.adb.broadcastAirplaneMode(flightMode);
159
+ }
107
160
  });
108
161
  };
109
162
  commands.setGeoLocation = async function setGeoLocation(location) {
@@ -212,4 +265,4 @@ helpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect(wrapped
212
265
  Object.assign(extensions, commands, helpers);
213
266
  var _default = extensions;
214
267
  exports.default = _default;
215
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2JsdWViaXJkIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJBSVJQTEFORV9NT0RFX01BU0siLCJXSUZJX01BU0siLCJEQVRBX01BU0siLCJHRU9fRVBTSUxPTiIsIk51bWJlciIsIk1JTl9WQUxVRSIsImdldE5ldHdvcmtDb25uZWN0aW9uIiwibG9nIiwiaW5mbyIsImFpcnBsYW5lTW9kZU9uIiwiYWRiIiwiaXNBaXJwbGFuZU1vZGVPbiIsImNvbm5lY3Rpb24iLCJ3aWZpT24iLCJpc1dpZmlPbiIsImRhdGFPbiIsImlzRGF0YU9uIiwic2V0TmV0d29ya0Nvbm5lY3Rpb24iLCJ0eXBlIiwic2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlIiwic2hvdWxkRW5hYmxlV2lmaSIsInNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uIiwiY3VycmVudFN0YXRlIiwiaXNBaXJwbGFuZU1vZGVFbmFibGVkIiwiaXNXaUZpRW5hYmxlZCIsImlzRGF0YUVuYWJsZWQiLCJ3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCIsInNldEFpcnBsYW5lTW9kZSIsImJyb2FkY2FzdEFpcnBsYW5lTW9kZSIsInNldFdpZmlTdGF0ZSIsInNldERhdGFTdGF0ZSIsImlzRW11bGF0b3IiLCJ3aWZpIiwidG9nZ2xlRGF0YSIsImRhdGEiLCJzZXRXaWZpQW5kRGF0YSIsInRvZ2dsZVdpRmkiLCJ0b2dnbGVGbGlnaHRNb2RlIiwiZmxpZ2h0TW9kZSIsInNldEdlb0xvY2F0aW9uIiwibG9jYXRpb24iLCJnZXRHZW9Mb2NhdGlvbiIsImUiLCJ3YXJuIiwibWVzc2FnZSIsImxhdGl0dWRlIiwibG9uZ2l0dWRlIiwiYWx0aXR1ZGUiLCJtb2JpbGVSZWZyZXNoR3BzQ2FjaGUiLCJvcHRzIiwidGltZW91dE1zIiwicmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUiLCJwYXJzZUZsb2F0IiwiS2V5Q29kZSIsIlVQIiwiRE9XTiIsIlJJR0hUIiwiQ0VOVEVSIiwidG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyIsImFwaSIsImdldEFwaUxldmVsIiwicHJvdmlkZXJzIiwiZ2V0TG9jYXRpb25Qcm92aWRlcnMiLCJpc0dwc0VuYWJsZWQiLCJpbmRleE9mIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsInNlcSIsInB1c2giLCJrZXlldmVudCIsInRvZ2dsZVNldHRpbmciLCJlcnJvcnMiLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIiwic2V0dGluZyIsInByZUtleVNlcSIsIl8iLCJpc051bGwiLCJvcGVuU2V0dGluZ3NBY3Rpdml0eSIsImtleSIsImRvS2V5IiwiYXBwUGFja2FnZSIsImFwcEFjdGl2aXR5IiwiZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSIsIndhaXRGb3JOb3RBY3Rpdml0eSIsImlnbiIsImJhY2siLCJCIiwiZGVsYXkiLCJ3cmFwcGVkIiwiYm9vdHN0cmFwIiwiaWdub3JlVW5leHBlY3RlZFNodXRkb3duIiwicmVzdGFydCIsInN0YXJ0IiwiZGlzYWJsZUFuZHJvaWRXYXRjaGVycyIsImFjY2VwdFNzbENlcnRzIiwiT2JqZWN0IiwiYXNzaWduIiwiX2RlZmF1bHQiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL25ldHdvcmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGVycm9ycyB9IGZyb20gJ2FwcGl1bS9kcml2ZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbnN0IEFJUlBMQU5FX01PREVfTUFTSyA9IDBiMDAxO1xuY29uc3QgV0lGSV9NQVNLID0gMGIwMTA7XG5jb25zdCBEQVRBX01BU0sgPSAwYjEwMDtcbi8vIFRoZSB2YWx1ZSBjbG9zZSB0byB6ZXJvLCBidXQgbm90IHplcm8sIGlzIG5lZWRlZFxuLy8gdG8gdHJpY2sgSlNPTiBnZW5lcmF0aW9uIGFuZCBzZW5kIGEgZmxvYXQgdmFsdWUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLFxuLy8gVGhpcyBhbGxvd3Mgc3RyaWN0bHktdHlwZWQgY2xpZW50cywgbGlrZSBKYXZhLCB0byBwcm9wZXJseVxuLy8gcGFyc2UgaXQuIE90aGVyd2lzZSBmbG9hdCAwLjAgaXMgYWx3YXlzIHJlcHJlc2VudGVkIGFzIGludGVnZXIgMCBpbiBKUy5cbi8vIFRoZSB2YWx1ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gREJMX0VQU0lMT04gKGh0dHBzOi8vb3BlbnNvdXJjZS5hcHBsZS5jb20vc291cmNlL0xpYmMvTGliYy00OTgvaW5jbHVkZS9mbG9hdC5oKVxuY29uc3QgR0VPX0VQU0lMT04gPSBOdW1iZXIuTUlOX1ZBTFVFO1xuXG5jb21tYW5kcy5nZXROZXR3b3JrQ29ubmVjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldE5ldHdvcmtDb25uZWN0aW9uICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnR2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgbGV0IGFpcnBsYW5lTW9kZU9uID0gYXdhaXQgdGhpcy5hZGIuaXNBaXJwbGFuZU1vZGVPbigpO1xuICBsZXQgY29ubmVjdGlvbiA9IGFpcnBsYW5lTW9kZU9uID8gQUlSUExBTkVfTU9ERV9NQVNLIDogMDtcblxuICAvLyBubyBuZWVkIHRvIGNoZWNrIGFueXRoaW5nIGVsc2UgaWYgd2UgYXJlIGluIGFpcnBsYW5lIG1vZGVcbiAgaWYgKCFhaXJwbGFuZU1vZGVPbikge1xuICAgIGxldCB3aWZpT24gPSBhd2FpdCB0aGlzLmlzV2lmaU9uKCk7XG4gICAgY29ubmVjdGlvbiB8PSAod2lmaU9uID8gV0lGSV9NQVNLIDogMCk7XG4gICAgbGV0IGRhdGFPbiA9IGF3YWl0IHRoaXMuYWRiLmlzRGF0YU9uKCk7XG4gICAgY29ubmVjdGlvbiB8PSAoZGF0YU9uID8gREFUQV9NQVNLIDogMCk7XG4gIH1cblxuICByZXR1cm4gY29ubmVjdGlvbjtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSB0aGUgYmVoYXZpb3VyIGluIG90aGVyIGRyaXZlcnMgbGlrZSBVaUF1dG9tYXRvcjIuXG4gKi9cbmNvbW1hbmRzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaXNXaWZpT24oKTtcbn07XG5cbmNvbW1hbmRzLnNldE5ldHdvcmtDb25uZWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0TmV0d29ya0Nvbm5lY3Rpb24gKHR5cGUpIHtcbiAgdGhpcy5sb2cuaW5mbygnU2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgLy8gZGVjb2RlIHRoZSBpbnB1dFxuICBjb25zdCBzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPSAodHlwZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZVdpZmkgPSAodHlwZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID0gKHR5cGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbiAgY29uc3QgaXNBaXJwbGFuZU1vZGVFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzV2lGaUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgV0lGSV9NQVNLKSAhPT0gMDtcbiAgY29uc3QgaXNEYXRhRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgIT09IGlzQWlycGxhbmVNb2RlRW5hYmxlZCkge1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoc2hvdWxkRW5hYmxlQWlycGxhbmVNb2RlKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgYWlycGxhbmUgbW9kZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgICAgICBgJHtzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWApO1xuICB9XG5cbiAgaWYgKHNob3VsZEVuYWJsZVdpZmkgPT09IGlzV2lGaUVuYWJsZWQgJiYgc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPT09IGlzRGF0YUVuYWJsZWQpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uL1dpLUZpIHN0YXRlcywgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBzZXQgdG8gZXhwZWN0ZWQgdmFsdWVzJyk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSkge1xuICAgICAgcmV0dXJuIEFJUlBMQU5FX01PREVfTUFTSyB8IGN1cnJlbnRTdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIH5BSVJQTEFORV9NT0RFX01BU0sgJiBjdXJyZW50U3RhdGU7XG4gIH1cblxuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2hvdWxkRW5hYmxlV2lmaSAhPT0gaXNXaUZpRW5hYmxlZCkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUoc2hvdWxkRW5hYmxlV2lmaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vdCBjaGFuZ2luZyBXaS1GaSBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlV2lmaSA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgYmVjYXVzZSBhaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQnKTtcbiAgICB9IGVsc2UgaWYgKHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uIHN0YXRlLCBzaW5jZSBpdCBpcyBhbHJlYWR5IGAgK1xuICAgICAgICBgJHtzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERhdGFTdGF0ZShzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSBiZWhhdmlvdXIgaW4gb3RoZXIgZHJpdmVycyBsaWtlIFVpQXV0b21hdG9yMi5cbiAqL1xuY29tbWFuZHMuc2V0V2lmaVN0YXRlID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaVN0YXRlICh3aWZpKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlTdGF0ZSh3aWZpLCB0aGlzLmlzRW11bGF0b3IoKSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVEYXRhID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRGF0YSAoKSB7XG4gIGxldCBkYXRhID0gIShhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBuZXR3b3JrIGRhdGEgJHtkYXRhID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpQW5kRGF0YSh7ZGF0YX0sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgfSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVXaUZpID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlV2lGaSAoKSB7XG4gIGxldCB3aWZpID0gIShhd2FpdCB0aGlzLmFkYi5pc1dpZmlPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBXaUZpICR7d2lmaSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe3dpZml9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRmxpZ2h0TW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUZsaWdodE1vZGUgKCkge1xuICAvKlxuICAgKiBUT0RPOiBJbXBsZW1lbnQgaXNSZWFsRGV2aWNlKCkuIFRoaXMgbWV0aG9kIGZhaWxzIG9uXG4gICAqIHJlYWwgZGV2aWNlcywgaXQgc2hvdWxkIHRocm93IGEgTm90WWV0SW1wbGVtZW50ZWRFcnJvclxuICAgKi9cbiAgbGV0IGZsaWdodE1vZGUgPSAhKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgZmxpZ2h0IG1vZGUgJHtmbGlnaHRNb2RlID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gIH0pO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMuc2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBzZXRHZW9Mb2NhdGlvbiAobG9jYXRpb24pIHtcbiAgYXdhaXQgdGhpcy5hZGIuc2V0R2VvTG9jYXRpb24obG9jYXRpb24sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXRHZW9Mb2NhdGlvbigpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhpcy5sb2cud2FybihgQ291bGQgbm90IGdldCB0aGUgY3VycmVudCBnZW9sb2NhdGlvbiBpbmZvOiAke2UubWVzc2FnZX1gKTtcbiAgICB0aGlzLmxvZy53YXJuKGBSZXR1cm5pbmcgdGhlIGRlZmF1bHQgemVybydlZCB2YWx1ZXNgKTtcbiAgICByZXR1cm4ge1xuICAgICAgbGF0aXR1ZGU6IEdFT19FUFNJTE9OLFxuICAgICAgbG9uZ2l0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGFsdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICB9O1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEdwc0NhY2hlUmVmcmVzaE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0TXMgWzIwMDAwXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG4gKiB0byBibG9jayB1bnRpbCBHUFMgY2FjaGUgaXMgcmVmcmVzaGVkLiBQcm92aWRpbmcgemVybyBvciBhIG5lZ2F0aXZlXG4gKiB2YWx1ZSB0byBpdCBza2lwcyB3YWl0aW5nIGNvbXBsZXRlbHkuXG4gKi9cblxuLyoqXG4gKiBTZW5kcyBhbiBhc3luYyByZXF1ZXN0IHRvIHJlZnJlc2ggdGhlIEdQUyBjYWNoZS5cbiAqIFRoaXMgZmVhdHVyZSBvbmx5IHdvcmtzIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBoYXNcbiAqIEdvb2dsZSBQbGF5IFNlcnZpY2VzIGluc3RhbGxlZC4gSW4gY2FzZSB0aGUgdmFuaWxsYVxuICogTG9jYXRpb25NYW5hZ2VyIGlzIHVzZWQgdGhlIGRldmljZSBBUEkgbGV2ZWwgbXVzdCBiZSBhdFxuICogdmVyc2lvbiAzMCAoQW5kcm9pZCBSKSBvciBoaWdoZXIuXG4gKlxuICogQHBhcmFtIHtHcHNDYWNoZVJlZnJlc2hPcHRpb25zfSBvcHRzXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVJlZnJlc2hHcHNDYWNoZSA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVJlZnJlc2hHcHNDYWNoZSAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHsgdGltZW91dE1zIH0gPSBvcHRzO1xuICBhd2FpdCB0aGlzLmFkYi5yZWZyZXNoR2VvTG9jYXRpb25DYWNoZSh0aW1lb3V0TXMpO1xufTtcblxuY29tbWFuZHMuZ2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRHZW9Mb2NhdGlvbiAoKSB7XG4gIGNvbnN0IHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhbHRpdHVkZX0gPSBhd2FpdCB0aGlzLmFkYi5nZXRHZW9Mb2NhdGlvbigpO1xuICByZXR1cm4ge1xuICAgIGxhdGl0dWRlOiBwYXJzZUZsb2F0KGxhdGl0dWRlKSB8fCBHRU9fRVBTSUxPTixcbiAgICBsb25naXR1ZGU6IHBhcnNlRmxvYXQobG9uZ2l0dWRlKSB8fCBHRU9fRVBTSUxPTixcbiAgICBhbHRpdHVkZTogcGFyc2VGbG9hdChhbHRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gIH07XG59O1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfRFBBRF9DRU5URVJcbi8vIGluIHRoZSBhbmRyb2lkIGRvY3MsIHRoaXMgaXMgaG93IHRoZSBrZXljb2RlcyBhcmUgZGVmaW5lZFxuY29uc3QgS2V5Q29kZSA9IHtcbiAgVVA6IDE5LFxuICBET1dOOiAyMCxcbiAgUklHSFQ6IDIyLFxuICBDRU5URVI6IDIzXG59O1xuY29tbWFuZHMudG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUxvY2F0aW9uU2VydmljZXMgKCkge1xuICB0aGlzLmxvZy5pbmZvKCdUb2dnbGluZyBsb2NhdGlvbiBzZXJ2aWNlcycpO1xuICBsZXQgYXBpID0gYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKHRoaXMuaXNFbXVsYXRvcigpKSB7XG4gICAgbGV0IHByb3ZpZGVycyA9IGF3YWl0IHRoaXMuYWRiLmdldExvY2F0aW9uUHJvdmlkZXJzKCk7XG4gICAgbGV0IGlzR3BzRW5hYmxlZCA9IHByb3ZpZGVycy5pbmRleE9mKCdncHMnKSAhPT0gLTE7XG4gICAgYXdhaXQgdGhpcy5hZGIudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlcighaXNHcHNFbmFibGVkKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYXBpID4gMTUpIHtcbiAgICBsZXQgc2VxID0gW0tleUNvZGUuVVAsIEtleUNvZGUuVVBdO1xuICAgIGlmIChhcGkgPT09IDE2KSB7XG4gICAgICAvLyBUaGlzIHZlcnNpb24gb2YgQW5kcm9pZCBoYXMgYSBcInBhcmVudFwiIGJ1dHRvbiBpbiBpdHMgYWN0aW9uIGJhclxuICAgICAgc2VxLnB1c2goS2V5Q29kZS5ET1dOKTtcbiAgICB9IGVsc2UgaWYgKGFwaSA8IDI4KSB7XG4gICAgICAvLyBOZXdlciB2ZXJzaW9ucyBvZiBBbmRyb2lkIGhhdmUgdGhlIHRvZ2dsZSBpbiB0aGUgQWN0aW9uIGJhclxuICAgICAgc2VxID0gW0tleUNvZGUuUklHSFQsIEtleUNvZGUuUklHSFQsIEtleUNvZGUuVVBdO1xuICAgICAgLypcbiAgICAgICAqIE9uY2UgdGhlIExvY2F0aW9uIHNlcnZpY2VzIHN3aXRjaCBpcyBPRkYsIGl0IHdvbid0IHJlY2VpdmUgZm9jdXNcbiAgICAgICAqIHdoZW4gZ29pbmcgYmFjayB0byB0aGUgTG9jYXRpb24gU2VydmljZXMgc2V0dGluZ3Mgc2NyZWVuIHVubGVzcyB3ZVxuICAgICAgICogc2VuZCBhIGR1bW15IGtleWV2ZW50IChVUCkgKmJlZm9yZSogb3BlbmluZyB0aGUgc2V0dGluZ3Mgc2NyZWVuXG4gICAgICAgKi9cbiAgICAgIGF3YWl0IHRoaXMuYWRiLmtleWV2ZW50KEtleUNvZGUuVVApO1xuICAgIH0gZWxzZSBpZiAoYXBpID49IDI4KSB7XG4gICAgICAvLyBFdmVuIG5ld2VyIHZlcnNpb25zIG9mIGFuZHJvaWQgaGF2ZSB0aGUgdG9nZ2xlIGluIGEgYmFyIGJlbG93IHRoZSBhY3Rpb24gYmFyXG4gICAgICAvLyB0aGlzIG1lYW5zIGEgc2luZ2xlIHJpZ2h0IGNsaWNrIHdpbGwgY2F1c2UgaXQgdG8gYmUgc2VsZWN0ZWQuXG4gICAgICBzZXEgPSBbS2V5Q29kZS5SSUdIVF07XG4gICAgICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChLZXlDb2RlLlVQKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy50b2dnbGVTZXR0aW5nKCdMT0NBVElPTl9TT1VSQ0VfU0VUVElOR1MnLCBzZXEpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZXJlJ3Mgbm8gZ2xvYmFsIGxvY2F0aW9uIHNlcnZpY2VzIHRvZ2dsZSBvbiBvbGRlciBBbmRyb2lkIHZlcnNpb25zXG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RZZXRJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbn07XG5cbmhlbHBlcnMudG9nZ2xlU2V0dGluZyA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZVNldHRpbmcgKHNldHRpbmcsIHByZUtleVNlcSkge1xuICAvKlxuICAgKiBwcmVLZXlTZXEgaXMgdGhlIGtleWV2ZW50IHNlcXVlbmNlIHRvIHNlbmQgb3ZlciBBREIgaW4gb3JkZXJcbiAgICogdG8gcG9zaXRpb24gdGhlIGN1cnNvciBvbiB0aGUgcmlnaHQgb3B0aW9uLlxuICAgKiBCeSBkZWZhdWx0IGl0J3MgW3VwLCB1cCwgZG93bl0gYmVjYXVzZSB3ZSB1c3VhbGx5IHRhcmdldCB0aGUgMXN0IGl0ZW0gaW5cbiAgICogdGhlIHNjcmVlbiwgYW5kIHNvbWV0aW1lcyB3aGVuIG9wZW5pbmcgc2V0dGluZ3MgYWN0aXZpdGllcyB0aGUgY3Vyc29yIGlzXG4gICAqIGFscmVhZHkgcG9zaXRpb25uZWQgb24gdGhlIDFzdCBpdGVtLCBidXQgd2UgY2FuJ3Qga25vdyBmb3Igc3VyZVxuICAgKi9cbiAgaWYgKF8uaXNOdWxsKHByZUtleVNlcSkpIHtcbiAgICBwcmVLZXlTZXEgPSBbS2V5Q29kZS5VUCwgS2V5Q29kZS5VUCwgS2V5Q29kZS5ET1dOXTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMub3BlblNldHRpbmdzQWN0aXZpdHkoc2V0dGluZyk7XG5cbiAgZm9yIChsZXQga2V5IG9mIHByZUtleVNlcSkge1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoa2V5KTtcbiAgfVxuXG4gIGxldCB7YXBwUGFja2FnZSwgYXBwQWN0aXZpdHl9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0Rm9jdXNlZFBhY2thZ2VBbmRBY3Rpdml0eSgpO1xuXG4gIC8qXG4gICAqIENsaWNrIGFuZCBoYW5kbGUgcG90ZW50aWFsIEFEQiBkaXNjb25uZWN0IHRoYXQgb2NjdXJzIG9uIG9mZmljaWFsXG4gICAqIGVtdWxhdG9yIHdoZW4gdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBpcyBkaXNhYmxlZFxuICAgKi9cbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5kb0tleShLZXlDb2RlLkNFTlRFUik7XG4gIH0pO1xuXG4gIC8qXG4gICAqIEluIG9uZSBwYXJ0aWN1bGFyIGNhc2UgKGVuYWJsZSBMb2NhdGlvbiBTZXJ2aWNlcyksIGEgcG9wLXVwIGlzXG4gICAqIGRpc3BsYXllZCBvbiBzb21lIHBsYXRmb3JtcyBzbyB0aGUgdXNlciBhY2NlcHRzIG9yIHJlZnVzZXMgdGhhdCBHb29nbGVcbiAgICogY29sbGVjdHMgbG9jYXRpb24gZGF0YS4gU28gd2Ugd2FpdCBmb3IgdGhhdCBwb3AtdXAgdG8gb3BlbiwgaWYgaXRcbiAgICogZG9lc24ndCB0aGVuIHByb2NlZWRcbiAgICovXG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5hZGIud2FpdEZvck5vdEFjdGl2aXR5KGFwcFBhY2thZ2UsIGFwcEFjdGl2aXR5LCA1MDAwKTtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KEtleUNvZGUuUklHSFQpO1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoS2V5Q29kZS5DRU5URVIpO1xuICAgIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG4gIH0gY2F0Y2ggKGlnbikge31cblxuICBhd2FpdCB0aGlzLmFkYi5iYWNrKCk7XG59O1xuXG5oZWxwZXJzLmRvS2V5ID0gYXN5bmMgZnVuY3Rpb24gZG9LZXkgKGtleSkge1xuICAvLyBUT0RPOiBDb25maXJtIHdlIG5lZWQgdGhpcyBkZWxheS4gU2VlbXMgdG8gd29yayB3aXRob3V0IGl0LlxuICBhd2FpdCBCLmRlbGF5KDIwMDApO1xuICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChrZXkpO1xufTtcblxuaGVscGVycy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdCA9IGFzeW5jIGZ1bmN0aW9uIHdyYXBCb290c3RyYXBEaXNjb25uZWN0ICh3cmFwcGVkKSB7XG4gIGlmICghdGhpcy5ib290c3RyYXApIHtcbiAgICByZXR1cm4gYXdhaXQgd3JhcHBlZCgpO1xuICB9XG5cbiAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3cmFwcGVkKCk7XG4gICAgYXdhaXQgdGhpcy5hZGIucmVzdGFydCgpO1xuICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnN0YXJ0KHRoaXMub3B0cy5hcHBQYWNrYWdlLCB0aGlzLm9wdHMuZGlzYWJsZUFuZHJvaWRXYXRjaGVycywgdGhpcy5vcHRzLmFjY2VwdFNzbENlcnRzKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLmJvb3RzdHJhcC5pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gPSBmYWxzZTtcbiAgfVxufTtcblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycyB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxTQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFJRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFBRUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFGLE9BQUEsR0FBQUEsT0FBQTtBQUFBRSxPQUFBLENBQUFILFFBQUEsR0FBQUEsUUFBQTtBQUVqRCxNQUFNSSxrQkFBa0IsR0FBRyxLQUFLO0FBQ2hDLE1BQU1DLFNBQVMsR0FBRyxLQUFLO0FBQ3ZCLE1BQU1DLFNBQVMsR0FBRyxLQUFLO0FBTXZCLE1BQU1DLFdBQVcsR0FBR0MsTUFBTSxDQUFDQyxTQUFTO0FBRXBDVCxRQUFRLENBQUNVLG9CQUFvQixHQUFHLGVBQWVBLG9CQUFvQkEsQ0FBQSxFQUFJO0VBQ3JFLElBQUksQ0FBQ0MsR0FBRyxDQUFDQyxJQUFJLENBQUMsNEJBQTRCLENBQUM7RUFDM0MsSUFBSUMsY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDQyxHQUFHLENBQUNDLGdCQUFnQixFQUFFO0VBQ3RELElBQUlD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
268
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfZHJpdmVyIiwiX2JsdWViaXJkIiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJBSVJQTEFORV9NT0RFX01BU0siLCJXSUZJX01BU0siLCJEQVRBX01BU0siLCJHRU9fRVBTSUxPTiIsIk51bWJlciIsIk1JTl9WQUxVRSIsIldJRklfS0VZX05BTUUiLCJEQVRBX0tFWV9OQU1FIiwiQUlSUExBTkVfTU9ERV9LRVlfTkFNRSIsImdldE5ldHdvcmtDb25uZWN0aW9uIiwibG9nIiwiaW5mbyIsImFpcnBsYW5lTW9kZU9uIiwiYWRiIiwiaXNBaXJwbGFuZU1vZGVPbiIsImNvbm5lY3Rpb24iLCJ3aWZpT24iLCJpc1dpZmlPbiIsImRhdGFPbiIsImlzRGF0YU9uIiwibW9iaWxlU2V0Q29ubmVjdGl2aXR5Iiwib3B0cyIsIndpZmkiLCJkYXRhIiwiYWlycGxhbmVNb2RlIiwiXyIsImV2ZXJ5IiwiaXNVbmRlZmluZWQiLCJlcnJvcnMiLCJJbnZhbGlkQXJndW1lbnRFcnJvciIsImN1cnJlbnRTdGF0ZSIsIm1vYmlsZUdldENvbm5lY3Rpdml0eSIsInNlcnZpY2VzIiwic2V0dGVycyIsIkJvb2xlYW4iLCJwdXNoIiwic2V0V2lmaVN0YXRlIiwiaXNFbXVsYXRvciIsInNldERhdGFTdGF0ZSIsInNldEFpcnBsYW5lTW9kZSIsImdldEFwaUxldmVsIiwiYnJvYWRjYXN0QWlycGxhbmVNb2RlIiwiaXNFbXB0eSIsIkIiLCJhbGwiLCJpc0FycmF5Iiwic3RhdGVQcm9taXNlcyIsInJlc29sdmUiLCJpbmNsdWRlcyIsInVuZGVmaW5lZCIsInZhbHVlcyIsImZyb21QYWlycyIsIm1hcCIsImsiLCJ2YWx1ZSIsInNldE5ldHdvcmtDb25uZWN0aW9uIiwidHlwZSIsInNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSIsInNob3VsZEVuYWJsZVdpZmkiLCJzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiIsImlzQWlycGxhbmVNb2RlRW5hYmxlZCIsImlzV2lGaUVuYWJsZWQiLCJpc0RhdGFFbmFibGVkIiwid3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QiLCJ0b2dnbGVEYXRhIiwic2V0V2lmaUFuZERhdGEiLCJ0b2dnbGVXaUZpIiwidG9nZ2xlRmxpZ2h0TW9kZSIsImZsaWdodE1vZGUiLCJzZXRHZW9Mb2NhdGlvbiIsImxvY2F0aW9uIiwiZ2V0R2VvTG9jYXRpb24iLCJlIiwid2FybiIsIm1lc3NhZ2UiLCJsYXRpdHVkZSIsImxvbmdpdHVkZSIsImFsdGl0dWRlIiwibW9iaWxlUmVmcmVzaEdwc0NhY2hlIiwidGltZW91dE1zIiwicmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUiLCJwYXJzZUZsb2F0IiwiS2V5Q29kZSIsIlVQIiwiRE9XTiIsIlJJR0hUIiwiQ0VOVEVSIiwidG9nZ2xlTG9jYXRpb25TZXJ2aWNlcyIsImFwaSIsInByb3ZpZGVycyIsImdldExvY2F0aW9uUHJvdmlkZXJzIiwiaXNHcHNFbmFibGVkIiwiaW5kZXhPZiIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJzZXEiLCJrZXlldmVudCIsInRvZ2dsZVNldHRpbmciLCJOb3RZZXRJbXBsZW1lbnRlZEVycm9yIiwic2V0dGluZyIsInByZUtleVNlcSIsImlzTnVsbCIsIm9wZW5TZXR0aW5nc0FjdGl2aXR5Iiwia2V5IiwiZG9LZXkiLCJhcHBQYWNrYWdlIiwiYXBwQWN0aXZpdHkiLCJnZXRGb2N1c2VkUGFja2FnZUFuZEFjdGl2aXR5Iiwid2FpdEZvck5vdEFjdGl2aXR5IiwiaWduIiwiYmFjayIsImRlbGF5Iiwid3JhcHBlZCIsImJvb3RzdHJhcCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsInJlc3RhcnQiLCJzdGFydCIsImRpc2FibGVBbmRyb2lkV2F0Y2hlcnMiLCJhY2NlcHRTc2xDZXJ0cyIsIk9iamVjdCIsImFzc2lnbiIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9uZXR3b3JrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5jb25zdCBBSVJQTEFORV9NT0RFX01BU0sgPSAwYjAwMTtcbmNvbnN0IFdJRklfTUFTSyA9IDBiMDEwO1xuY29uc3QgREFUQV9NQVNLID0gMGIxMDA7XG4vLyBUaGUgdmFsdWUgY2xvc2UgdG8gemVybywgYnV0IG5vdCB6ZXJvLCBpcyBuZWVkZWRcbi8vIHRvIHRyaWNrIEpTT04gZ2VuZXJhdGlvbiBhbmQgc2VuZCBhIGZsb2F0IHZhbHVlIGluc3RlYWQgb2YgYW4gaW50ZWdlcixcbi8vIFRoaXMgYWxsb3dzIHN0cmljdGx5LXR5cGVkIGNsaWVudHMsIGxpa2UgSmF2YSwgdG8gcHJvcGVybHlcbi8vIHBhcnNlIGl0LiBPdGhlcndpc2UgZmxvYXQgMC4wIGlzIGFsd2F5cyByZXByZXNlbnRlZCBhcyBpbnRlZ2VyIDAgaW4gSlMuXG4vLyBUaGUgdmFsdWUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIERCTF9FUFNJTE9OIChodHRwczovL29wZW5zb3VyY2UuYXBwbGUuY29tL3NvdXJjZS9MaWJjL0xpYmMtNDk4L2luY2x1ZGUvZmxvYXQuaClcbmNvbnN0IEdFT19FUFNJTE9OID0gTnVtYmVyLk1JTl9WQUxVRTtcbmNvbnN0IFdJRklfS0VZX05BTUUgPSAnd2lmaSc7XG5jb25zdCBEQVRBX0tFWV9OQU1FID0gJ2RhdGEnO1xuY29uc3QgQUlSUExBTkVfTU9ERV9LRVlfTkFNRSA9ICdhaXJwbGFuZU1vZGUnO1xuXG5jb21tYW5kcy5nZXROZXR3b3JrQ29ubmVjdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldE5ldHdvcmtDb25uZWN0aW9uICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnR2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgbGV0IGFpcnBsYW5lTW9kZU9uID0gYXdhaXQgdGhpcy5hZGIuaXNBaXJwbGFuZU1vZGVPbigpO1xuICBsZXQgY29ubmVjdGlvbiA9IGFpcnBsYW5lTW9kZU9uID8gQUlSUExBTkVfTU9ERV9NQVNLIDogMDtcblxuICAvLyBubyBuZWVkIHRvIGNoZWNrIGFueXRoaW5nIGVsc2UgaWYgd2UgYXJlIGluIGFpcnBsYW5lIG1vZGVcbiAgaWYgKCFhaXJwbGFuZU1vZGVPbikge1xuICAgIGxldCB3aWZpT24gPSBhd2FpdCB0aGlzLmlzV2lmaU9uKCk7XG4gICAgY29ubmVjdGlvbiB8PSAod2lmaU9uID8gV0lGSV9NQVNLIDogMCk7XG4gICAgbGV0IGRhdGFPbiA9IGF3YWl0IHRoaXMuYWRiLmlzRGF0YU9uKCk7XG4gICAgY29ubmVjdGlvbiB8PSAoZGF0YU9uID8gREFUQV9NQVNLIDogMCk7XG4gIH1cblxuICByZXR1cm4gY29ubmVjdGlvbjtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSB0aGUgYmVoYXZpb3VyIGluIG90aGVyIGRyaXZlcnMgbGlrZSBVaUF1dG9tYXRvcjIuXG4gKi9cbmNvbW1hbmRzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGIuaXNXaWZpT24oKTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2V0Q29ubmVjdGl2aXR5T3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFuP30gd2lmaSBFaXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgV2ktRmkuXG4gKiBBbiB1bnNldCB2YWx1ZSBtZWFucyB0byBub3QgY2hhbmdlIHRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIHNlcnZpY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4/fSBkYXRhIEVpdGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBtb2JpbGUgZGF0YSBjb25uZWN0aW9uLlxuICogQW4gdW5zZXQgdmFsdWUgbWVhbnMgdG8gbm90IGNoYW5nZSB0aGUgc3RhdGUgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlLlxuICogQHByb3BlcnR5IHtib29sZWFuP30gYWlycGxhbmVNb2RlIEVpdGhlciB0byBlbmFibGUgdG8gZGlzYWJsZSB0aGUgQWlycGxhbmUgTW9kZVxuICogQW4gdW5zZXQgdmFsdWUgbWVhbnMgdG8gbm90IGNoYW5nZSB0aGUgc3RhdGUgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlLlxuICovXG5cbi8qKlxuICogU2V0IHRoZSBjb25uZWN0aXZpdHkgc3RhdGUgZm9yIGRpZmZlcmVudCBzZXJ2aWNlc1xuICpcbiAqIEBwYXJhbSB7U2V0Q29ubmVjdGl2aXR5T3B0aW9uc30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIG5vbmUgb2Yga25vd24gcHJvcGVydGllcyB3ZXJlIHByb3ZpZGVkIG9yIHRoZXJlIHdhcyBhbiBlcnJvclxuICogd2hpbGUgY2hhbmdpbmcgY29ubmVjdGl2aXR5IHN0YXRlc1xuICovXG5jb21tYW5kcy5tb2JpbGVTZXRDb25uZWN0aXZpdHkgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTZXRDb25uZWN0aXZpdHkgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2lmaSxcbiAgICBkYXRhLFxuICAgIGFpcnBsYW5lTW9kZSxcbiAgfSA9IG9wdHM7XG5cbiAgaWYgKF8uZXZlcnkoW3dpZmksIGRhdGEsIGFpcnBsYW5lTW9kZV0sIF8uaXNVbmRlZmluZWQpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgIGBFaXRoZXIgb25lIG9mIFsnJHtXSUZJX0tFWV9OQU1FfScsICcke0RBVEFfS0VZX05BTUV9JywgJyR7QUlSUExBTkVfTU9ERV9LRVlfTkFNRX0nXSBvcHRpb25zIG11c3QgYmUgcHJvdmlkZWRgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IHRoaXMubW9iaWxlR2V0Q29ubmVjdGl2aXR5KHtcbiAgICBzZXJ2aWNlczogW1xuICAgICAgLi4uKF8uaXNVbmRlZmluZWQod2lmaSkgPyBbXSA6IFtXSUZJX0tFWV9OQU1FXSksXG4gICAgICAuLi4oXy5pc1VuZGVmaW5lZChkYXRhKSA/IFtdIDogW0RBVEFfS0VZX05BTUVdKSxcbiAgICAgIC4uLihfLmlzVW5kZWZpbmVkKGFpcnBsYW5lTW9kZSkgPyBbXSA6IFtBSVJQTEFORV9NT0RFX0tFWV9OQU1FXSksXG4gICAgXVxuICB9KTtcbiAgY29uc3Qgc2V0dGVycyA9IFtdO1xuICBpZiAoIV8uaXNVbmRlZmluZWQod2lmaSkgJiYgY3VycmVudFN0YXRlLndpZmkgIT09IEJvb2xlYW4od2lmaSkpIHtcbiAgICBzZXR0ZXJzLnB1c2godGhpcy5hZGIuc2V0V2lmaVN0YXRlKHdpZmksIHRoaXMuaXNFbXVsYXRvcigpKSk7XG4gIH1cbiAgaWYgKCFfLmlzVW5kZWZpbmVkKGRhdGEpICYmIGN1cnJlbnRTdGF0ZS5kYXRhICE9PSBCb29sZWFuKGRhdGEpKSB7XG4gICAgc2V0dGVycy5wdXNoKHRoaXMuYWRiLnNldERhdGFTdGF0ZShkYXRhLCB0aGlzLmlzRW11bGF0b3IoKSkpO1xuICB9XG4gIGlmICghXy5pc1VuZGVmaW5lZChhaXJwbGFuZU1vZGUpICYmIGN1cnJlbnRTdGF0ZS5haXJwbGFuZU1vZGUgIT09IEJvb2xlYW4oYWlycGxhbmVNb2RlKSkge1xuICAgIHNldHRlcnMucHVzaChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoYWlycGxhbmVNb2RlKTtcbiAgICAgIGlmICh0aGlzLmFkYi5nZXRBcGlMZXZlbCgpIDwgMzApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0QWlycGxhbmVNb2RlKGFpcnBsYW5lTW9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoc2V0dGVycykpIHtcbiAgICBhd2FpdCBCLmFsbChzZXR0ZXJzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRDb25uZWN0aXZpdHlSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2lmaSBUcnVlIGlmIHdpZmkgaXMgZW5hYmxlZFxuICogQHByb3BlcnR5IHtib29sZWFufSBkYXRhIFRydWUgaWYgbW9iaWxlIGRhdGEgY29ubmVjdGlvbiBpcyBlbmFibGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFpcnBsYW5lTW9kZSBUcnVlIGlmIEFpcnBsYW5lIE1vZGUgaXMgZW5hYmxlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gR2V0Q29ubmVjdGl2aXR5T3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmdbXXxzdHJpbmc/fSBzZXJ2aWNlcyBvbmUgb3IgbW9yZSBzZXJ2aWNlcyB0byBnZXQgdGhlIGNvbm5lY3Rpdml0eSBmb3IuXG4gKiBTdXBwb3J0ZWQgc2VydmljZSBuYW1lcyBhcmU6IHdpZmksIGRhdGEsIGFpcnBsYW5lTW9kZS5cbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY29ubmVjdGl2aXR5IHByb3BlcnRpZXMgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcGFyYW0ge0dldENvbm5lY3Rpdml0eU9wdGlvbnM/fSBvcHRzIElmIG5vIHNlcnZpY2UgbmFtZXMgYXJlIHByb3ZpZGVkIHRoZW4gdGhlXG4gKiBjb25uZWN0aXZpdHkgc3RhdGUgaXMgcmV0dXJuZWQgZm9yIGFsbCBvZiB0aGVtLlxuICogQHJldHVybnMge0dldENvbm5lY3Rpdml0eVJlc3VsdH1cbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Q29ubmVjdGl2aXR5ID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Q29ubmVjdGl2aXR5IChvcHRzID0ge30pIHtcbiAgbGV0IHtcbiAgICBzZXJ2aWNlcyA9IFtXSUZJX0tFWV9OQU1FLCBEQVRBX0tFWV9OQU1FLCBBSVJQTEFORV9NT0RFX0tFWV9OQU1FXSxcbiAgfSA9IG9wdHM7XG4gIGlmICghXy5pc0FycmF5KHNlcnZpY2VzKSkge1xuICAgIHNlcnZpY2VzID0gW3NlcnZpY2VzXTtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlUHJvbWlzZXMgPSB7XG4gICAgd2lmaTogQi5yZXNvbHZlKHNlcnZpY2VzLmluY2x1ZGVzKFdJRklfS0VZX05BTUUpID8gdW5kZWZpbmVkIDogdGhpcy5hZGIuaXNXaWZpT24oKSksXG4gICAgZGF0YTogQi5yZXNvbHZlKHNlcnZpY2VzLmluY2x1ZGVzKERBVEFfS0VZX05BTUUpID8gdW5kZWZpbmVkIDogdGhpcy5hZGIuaXNEYXRhT24oKSksXG4gICAgYWlycGxhbmVNb2RlOiBCLnJlc29sdmUoXG4gICAgICBzZXJ2aWNlcy5pbmNsdWRlcyhBSVJQTEFORV9NT0RFX0tFWV9OQU1FKSA/IHVuZGVmaW5lZCA6IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKVxuICAgICksXG4gIH07XG4gIGF3YWl0IEIuYWxsKF8udmFsdWVzKHN0YXRlUHJvbWlzZXMpKTtcbiAgcmV0dXJuIF8uZnJvbVBhaXJzKHNlcnZpY2VzLm1hcCgoaykgPT4gW2ssIHN0YXRlUHJvbWlzZXNba10udmFsdWUoKV0pKTtcbn07XG5cbmNvbW1hbmRzLnNldE5ldHdvcmtDb25uZWN0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0TmV0d29ya0Nvbm5lY3Rpb24gKHR5cGUpIHtcbiAgdGhpcy5sb2cuaW5mbygnU2V0dGluZyBuZXR3b3JrIGNvbm5lY3Rpb24nKTtcbiAgLy8gZGVjb2RlIHRoZSBpbnB1dFxuICBjb25zdCBzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPSAodHlwZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZVdpZmkgPSAodHlwZSAmIFdJRklfTUFTSykgIT09IDA7XG4gIGNvbnN0IHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID0gKHR5cGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbiAgY29uc3QgaXNBaXJwbGFuZU1vZGVFbmFibGVkID0gKGN1cnJlbnRTdGF0ZSAmIEFJUlBMQU5FX01PREVfTUFTSykgIT09IDA7XG4gIGNvbnN0IGlzV2lGaUVuYWJsZWQgPSAoY3VycmVudFN0YXRlICYgV0lGSV9NQVNLKSAhPT0gMDtcbiAgY29uc3QgaXNEYXRhRW5hYmxlZCA9IChjdXJyZW50U3RhdGUgJiBEQVRBX01BU0spICE9PSAwO1xuXG4gIGlmIChzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgIT09IGlzQWlycGxhbmVNb2RlRW5hYmxlZCkge1xuICAgIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hZGIuc2V0QWlycGxhbmVNb2RlKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSk7XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDMwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRiLmJyb2FkY2FzdEFpcnBsYW5lTW9kZShzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRoaXMubG9nLmluZm8oXG4gICAgICBgTm90IGNoYW5naW5nIGFpcnBsYW5lIG1vZGUsIHNpbmNlIGl0IGlzIGFscmVhZHkgJHtzaG91bGRFbmFibGVBaXJwbGFuZU1vZGUgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHNob3VsZEVuYWJsZVdpZmkgPT09IGlzV2lGaUVuYWJsZWQgJiYgc2hvdWxkRW5hYmxlRGF0YUNvbm5lY3Rpb24gPT09IGlzRGF0YUVuYWJsZWQpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uL1dpLUZpIHN0YXRlcywgc2luY2UgdGhleSBhcmUgYWxyZWFkeSBzZXQgdG8gZXhwZWN0ZWQgdmFsdWVzJyk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSkge1xuICAgICAgcmV0dXJuIEFJUlBMQU5FX01PREVfTUFTSyB8IGN1cnJlbnRTdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIH5BSVJQTEFORV9NT0RFX01BU0sgJiBjdXJyZW50U3RhdGU7XG4gIH1cblxuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoc2hvdWxkRW5hYmxlV2lmaSAhPT0gaXNXaUZpRW5hYmxlZCkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUoc2hvdWxkRW5hYmxlV2lmaSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYE5vdCBjaGFuZ2luZyBXaS1GaSBzdGF0ZSwgc2luY2UgaXQgaXMgYWxyZWFkeSBgICtcbiAgICAgICAgYCR7c2hvdWxkRW5hYmxlV2lmaSA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEVuYWJsZUFpcnBsYW5lTW9kZSkge1xuICAgICAgdGhpcy5sb2cuaW5mbygnTm90IGNoYW5naW5nIGRhdGEgY29ubmVjdGlvbiBzdGF0ZSwgYmVjYXVzZSBhaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQnKTtcbiAgICB9IGVsc2UgaWYgKHNob3VsZEVuYWJsZURhdGFDb25uZWN0aW9uID09PSBpc0RhdGFFbmFibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBOb3QgY2hhbmdpbmcgZGF0YSBjb25uZWN0aW9uIHN0YXRlLCBzaW5jZSBpdCBpcyBhbHJlYWR5IGAgK1xuICAgICAgICBgJHtzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCd9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLnNldERhdGFTdGF0ZShzaG91bGRFbmFibGVEYXRhQ29ubmVjdGlvbiwgdGhpcy5pc0VtdWxhdG9yKCkpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TmV0d29ya0Nvbm5lY3Rpb24oKTtcbn07XG5cbi8qKlxuICogZGVjb3VwbGluZyB0byBvdmVycmlkZSBiZWhhdmlvdXIgaW4gb3RoZXIgZHJpdmVycyBsaWtlIFVpQXV0b21hdG9yMi5cbiAqL1xuY29tbWFuZHMuc2V0V2lmaVN0YXRlID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaVN0YXRlICh3aWZpKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldFdpZmlTdGF0ZSh3aWZpLCB0aGlzLmlzRW11bGF0b3IoKSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVEYXRhID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlRGF0YSAoKSB7XG4gIGxldCBkYXRhID0gIShhd2FpdCB0aGlzLmFkYi5pc0RhdGFPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBuZXR3b3JrIGRhdGEgJHtkYXRhID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRXaWZpQW5kRGF0YSh7ZGF0YX0sIHRoaXMuaXNFbXVsYXRvcigpKTtcbiAgfSk7XG59O1xuXG5jb21tYW5kcy50b2dnbGVXaUZpID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlV2lGaSAoKSB7XG4gIGxldCB3aWZpID0gIShhd2FpdCB0aGlzLmFkYi5pc1dpZmlPbigpKTtcbiAgdGhpcy5sb2cuaW5mbyhgVHVybmluZyBXaUZpICR7d2lmaSA/ICdvbicgOiAnb2ZmJ31gKTtcbiAgYXdhaXQgdGhpcy53cmFwQm9vdHN0cmFwRGlzY29ubmVjdChhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5hZGIuc2V0V2lmaUFuZERhdGEoe3dpZml9LCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIH0pO1xufTtcblxuY29tbWFuZHMudG9nZ2xlRmxpZ2h0TW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUZsaWdodE1vZGUgKCkge1xuICAvKlxuICAgKiBUT0RPOiBJbXBsZW1lbnQgaXNSZWFsRGV2aWNlKCkuIFRoaXMgbWV0aG9kIGZhaWxzIG9uXG4gICAqIHJlYWwgZGV2aWNlcywgaXQgc2hvdWxkIHRocm93IGEgTm90WWV0SW1wbGVtZW50ZWRFcnJvclxuICAgKi9cbiAgbGV0IGZsaWdodE1vZGUgPSAhKGF3YWl0IHRoaXMuYWRiLmlzQWlycGxhbmVNb2RlT24oKSk7XG4gIHRoaXMubG9nLmluZm8oYFR1cm5pbmcgZmxpZ2h0IG1vZGUgJHtmbGlnaHRNb2RlID8gJ29uJyA6ICdvZmYnfWApO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0aGlzLmFkYi5zZXRBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gIH0pO1xuICBhd2FpdCB0aGlzLndyYXBCb290c3RyYXBEaXNjb25uZWN0KGFzeW5jICgpID0+IHtcbiAgICBpZiAoYXdhaXQgdGhpcy5hZGIuZ2V0QXBpTGV2ZWwoKSA8IDMwKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkYi5icm9hZGNhc3RBaXJwbGFuZU1vZGUoZmxpZ2h0TW9kZSk7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uKSB7XG4gIGF3YWl0IHRoaXMuYWRiLnNldEdlb0xvY2F0aW9uKGxvY2F0aW9uLCB0aGlzLmlzRW11bGF0b3IoKSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0R2VvTG9jYXRpb24oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRoaXMubG9nLndhcm4oYENvdWxkIG5vdCBnZXQgdGhlIGN1cnJlbnQgZ2VvbG9jYXRpb24gaW5mbzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgdGhpcy5sb2cud2FybihgUmV0dXJuaW5nIHRoZSBkZWZhdWx0IHplcm8nZWQgdmFsdWVzYCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGl0dWRlOiBHRU9fRVBTSUxPTixcbiAgICAgIGxvbmdpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgICBhbHRpdHVkZTogR0VPX0VQU0lMT04sXG4gICAgfTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHcHNDYWNoZVJlZnJlc2hPcHRpb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dE1zIFsyMDAwMF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIG1pbGxpc2Vjb25kc1xuICogdG8gYmxvY2sgdW50aWwgR1BTIGNhY2hlIGlzIHJlZnJlc2hlZC4gUHJvdmlkaW5nIHplcm8gb3IgYSBuZWdhdGl2ZVxuICogdmFsdWUgdG8gaXQgc2tpcHMgd2FpdGluZyBjb21wbGV0ZWx5LlxuICovXG5cbi8qKlxuICogU2VuZHMgYW4gYXN5bmMgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBHUFMgY2FjaGUuXG4gKiBUaGlzIGZlYXR1cmUgb25seSB3b3JrcyBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaGFzXG4gKiBHb29nbGUgUGxheSBTZXJ2aWNlcyBpbnN0YWxsZWQuIEluIGNhc2UgdGhlIHZhbmlsbGFcbiAqIExvY2F0aW9uTWFuYWdlciBpcyB1c2VkIHRoZSBkZXZpY2UgQVBJIGxldmVsIG11c3QgYmUgYXRcbiAqIHZlcnNpb24gMzAgKEFuZHJvaWQgUikgb3IgaGlnaGVyLlxuICpcbiAqIEBwYXJhbSB7R3BzQ2FjaGVSZWZyZXNoT3B0aW9uc30gb3B0c1xuICovXG5jb21tYW5kcy5tb2JpbGVSZWZyZXNoR3BzQ2FjaGUgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVSZWZyZXNoR3BzQ2FjaGUgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7IHRpbWVvdXRNcyB9ID0gb3B0cztcbiAgYXdhaXQgdGhpcy5hZGIucmVmcmVzaEdlb0xvY2F0aW9uQ2FjaGUodGltZW91dE1zKTtcbn07XG5cbmNvbW1hbmRzLmdldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0R2VvTG9jYXRpb24gKCkge1xuICBjb25zdCB7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWx0aXR1ZGV9ID0gYXdhaXQgdGhpcy5hZGIuZ2V0R2VvTG9jYXRpb24oKTtcbiAgcmV0dXJuIHtcbiAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChsYXRpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgbG9uZ2l0dWRlOiBwYXJzZUZsb2F0KGxvbmdpdHVkZSkgfHwgR0VPX0VQU0lMT04sXG4gICAgYWx0aXR1ZGU6IHBhcnNlRmxvYXQoYWx0aXR1ZGUpIHx8IEdFT19FUFNJTE9OLFxuICB9O1xufTtcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0RQQURfQ0VOVEVSXG4vLyBpbiB0aGUgYW5kcm9pZCBkb2NzLCB0aGlzIGlzIGhvdyB0aGUga2V5Y29kZXMgYXJlIGRlZmluZWRcbmNvbnN0IEtleUNvZGUgPSB7XG4gIFVQOiAxOSxcbiAgRE9XTjogMjAsXG4gIFJJR0hUOiAyMixcbiAgQ0VOVEVSOiAyM1xufTtcbmNvbW1hbmRzLnRvZ2dsZUxvY2F0aW9uU2VydmljZXMgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVMb2NhdGlvblNlcnZpY2VzICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnVG9nZ2xpbmcgbG9jYXRpb24gc2VydmljZXMnKTtcbiAgbGV0IGFwaSA9IGF3YWl0IHRoaXMuYWRiLmdldEFwaUxldmVsKCk7XG4gIGlmICh0aGlzLmlzRW11bGF0b3IoKSkge1xuICAgIGxldCBwcm92aWRlcnMgPSBhd2FpdCB0aGlzLmFkYi5nZXRMb2NhdGlvblByb3ZpZGVycygpO1xuICAgIGxldCBpc0dwc0VuYWJsZWQgPSBwcm92aWRlcnMuaW5kZXhPZignZ3BzJykgIT09IC0xO1xuICAgIGF3YWl0IHRoaXMuYWRiLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIoIWlzR3BzRW5hYmxlZCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwaSA+IDE1KSB7XG4gICAgbGV0IHNlcSA9IFtLZXlDb2RlLlVQLCBLZXlDb2RlLlVQXTtcbiAgICBpZiAoYXBpID09PSAxNikge1xuICAgICAgLy8gVGhpcyB2ZXJzaW9uIG9mIEFuZHJvaWQgaGFzIGEgXCJwYXJlbnRcIiBidXR0b24gaW4gaXRzIGFjdGlvbiBiYXJcbiAgICAgIHNlcS5wdXNoKEtleUNvZGUuRE9XTik7XG4gICAgfSBlbHNlIGlmIChhcGkgPCAyOCkge1xuICAgICAgLy8gTmV3ZXIgdmVyc2lvbnMgb2YgQW5kcm9pZCBoYXZlIHRoZSB0b2dnbGUgaW4gdGhlIEFjdGlvbiBiYXJcbiAgICAgIHNlcSA9IFtLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlJJR0hULCBLZXlDb2RlLlVQXTtcbiAgICAgIC8qXG4gICAgICAgKiBPbmNlIHRoZSBMb2NhdGlvbiBzZXJ2aWNlcyBzd2l0Y2ggaXMgT0ZGLCBpdCB3b24ndCByZWNlaXZlIGZvY3VzXG4gICAgICAgKiB3aGVuIGdvaW5nIGJhY2sgdG8gdGhlIExvY2F0aW9uIFNlcnZpY2VzIHNldHRpbmdzIHNjcmVlbiB1bmxlc3Mgd2VcbiAgICAgICAqIHNlbmQgYSBkdW1teSBrZXlldmVudCAoVVApICpiZWZvcmUqIG9wZW5pbmcgdGhlIHNldHRpbmdzIHNjcmVlblxuICAgICAgICovXG4gICAgICBhd2FpdCB0aGlzLmFkYi5rZXlldmVudChLZXlDb2RlLlVQKTtcbiAgICB9IGVsc2UgaWYgKGFwaSA+PSAyOCkge1xuICAgICAgLy8gRXZlbiBuZXdlciB2ZXJzaW9ucyBvZiBhbmRyb2lkIGhhdmUgdGhlIHRvZ2dsZSBpbiBhIGJhciBiZWxvdyB0aGUgYWN0aW9uIGJhclxuICAgICAgLy8gdGhpcyBtZWFucyBhIHNpbmdsZSByaWdodCBjbGljayB3aWxsIGNhdXNlIGl0IHRvIGJlIHNlbGVjdGVkLlxuICAgICAgc2VxID0gW0tleUNvZGUuUklHSFRdO1xuICAgICAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoS2V5Q29kZS5VUCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudG9nZ2xlU2V0dGluZygnTE9DQVRJT05fU09VUkNFX1NFVFRJTkdTJywgc2VxKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBUaGVyZSdzIG5vIGdsb2JhbCBsb2NhdGlvbiBzZXJ2aWNlcyB0b2dnbGUgb24gb2xkZXIgQW5kcm9pZCB2ZXJzaW9uc1xuICAgIHRocm93IG5ldyBlcnJvcnMuTm90WWV0SW1wbGVtZW50ZWRFcnJvcigpO1xuICB9XG59O1xuXG5oZWxwZXJzLnRvZ2dsZVNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVTZXR0aW5nIChzZXR0aW5nLCBwcmVLZXlTZXEpIHtcbiAgLypcbiAgICogcHJlS2V5U2VxIGlzIHRoZSBrZXlldmVudCBzZXF1ZW5jZSB0byBzZW5kIG92ZXIgQURCIGluIG9yZGVyXG4gICAqIHRvIHBvc2l0aW9uIHRoZSBjdXJzb3Igb24gdGhlIHJpZ2h0IG9wdGlvbi5cbiAgICogQnkgZGVmYXVsdCBpdCdzIFt1cCwgdXAsIGRvd25dIGJlY2F1c2Ugd2UgdXN1YWxseSB0YXJnZXQgdGhlIDFzdCBpdGVtIGluXG4gICAqIHRoZSBzY3JlZW4sIGFuZCBzb21ldGltZXMgd2hlbiBvcGVuaW5nIHNldHRpbmdzIGFjdGl2aXRpZXMgdGhlIGN1cnNvciBpc1xuICAgKiBhbHJlYWR5IHBvc2l0aW9ubmVkIG9uIHRoZSAxc3QgaXRlbSwgYnV0IHdlIGNhbid0IGtub3cgZm9yIHN1cmVcbiAgICovXG4gIGlmIChfLmlzTnVsbChwcmVLZXlTZXEpKSB7XG4gICAgcHJlS2V5U2VxID0gW0tleUNvZGUuVVAsIEtleUNvZGUuVVAsIEtleUNvZGUuRE9XTl07XG4gIH1cblxuICBhd2FpdCB0aGlzLm9wZW5TZXR0aW5nc0FjdGl2aXR5KHNldHRpbmcpO1xuXG4gIGZvciAobGV0IGtleSBvZiBwcmVLZXlTZXEpIHtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KGtleSk7XG4gIH1cblxuICBsZXQge2FwcFBhY2thZ2UsIGFwcEFjdGl2aXR5fSA9IGF3YWl0IHRoaXMuYWRiLmdldEZvY3VzZWRQYWNrYWdlQW5kQWN0aXZpdHkoKTtcblxuICAvKlxuICAgKiBDbGljayBhbmQgaGFuZGxlIHBvdGVudGlhbCBBREIgZGlzY29ubmVjdCB0aGF0IG9jY3VycyBvbiBvZmZpY2lhbFxuICAgKiBlbXVsYXRvciB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGF3YWl0IHRoaXMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHRoaXMuZG9LZXkoS2V5Q29kZS5DRU5URVIpO1xuICB9KTtcblxuICAvKlxuICAgKiBJbiBvbmUgcGFydGljdWxhciBjYXNlIChlbmFibGUgTG9jYXRpb24gU2VydmljZXMpLCBhIHBvcC11cCBpc1xuICAgKiBkaXNwbGF5ZWQgb24gc29tZSBwbGF0Zm9ybXMgc28gdGhlIHVzZXIgYWNjZXB0cyBvciByZWZ1c2VzIHRoYXQgR29vZ2xlXG4gICAqIGNvbGxlY3RzIGxvY2F0aW9uIGRhdGEuIFNvIHdlIHdhaXQgZm9yIHRoYXQgcG9wLXVwIHRvIG9wZW4sIGlmIGl0XG4gICAqIGRvZXNuJ3QgdGhlbiBwcm9jZWVkXG4gICAqL1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuYWRiLndhaXRGb3JOb3RBY3Rpdml0eShhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgNTAwMCk7XG4gICAgYXdhaXQgdGhpcy5kb0tleShLZXlDb2RlLlJJR0hUKTtcbiAgICBhd2FpdCB0aGlzLmRvS2V5KEtleUNvZGUuQ0VOVEVSKTtcbiAgICBhd2FpdCB0aGlzLmFkYi53YWl0Rm9yTm90QWN0aXZpdHkoYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIDUwMDApO1xuICB9IGNhdGNoIChpZ24pIHt9XG5cbiAgYXdhaXQgdGhpcy5hZGIuYmFjaygpO1xufTtcblxuaGVscGVycy5kb0tleSA9IGFzeW5jIGZ1bmN0aW9uIGRvS2V5IChrZXkpIHtcbiAgLy8gVE9ETzogQ29uZmlybSB3ZSBuZWVkIHRoaXMgZGVsYXkuIFNlZW1zIHRvIHdvcmsgd2l0aG91dCBpdC5cbiAgYXdhaXQgQi5kZWxheSgyMDAwKTtcbiAgYXdhaXQgdGhpcy5hZGIua2V5ZXZlbnQoa2V5KTtcbn07XG5cbmhlbHBlcnMud3JhcEJvb3RzdHJhcERpc2Nvbm5lY3QgPSBhc3luYyBmdW5jdGlvbiB3cmFwQm9vdHN0cmFwRGlzY29ubmVjdCAod3JhcHBlZCkge1xuICBpZiAoIXRoaXMuYm9vdHN0cmFwKSB7XG4gICAgcmV0dXJuIGF3YWl0IHdyYXBwZWQoKTtcbiAgfVxuXG4gIHRoaXMuYm9vdHN0cmFwLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JhcHBlZCgpO1xuICAgIGF3YWl0IHRoaXMuYWRiLnJlc3RhcnQoKTtcbiAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zdGFydCh0aGlzLm9wdHMuYXBwUGFja2FnZSwgdGhpcy5vcHRzLmRpc2FibGVBbmRyb2lkV2F0Y2hlcnMsIHRoaXMub3B0cy5hY2NlcHRTc2xDZXJ0cyk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5ib290c3RyYXAuaWdub3JlVW5leHBlY3RlZFNodXRkb3duID0gZmFsc2U7XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBSUcsUUFB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
@@ -1 +1 @@
1
- {"version":3,"file":"network.js","names":["_lodash","_interopRequireDefault","require","_driver","_bluebird","commands","helpers","extensions","exports","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","currentState","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","setAirplaneMode","broadcastAirplaneMode","setWifiState","setDataState","isEmulator","wifi","toggleData","data","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","opts","timeoutMs","refreshGeoLocationCache","parseFloat","KeyCode","UP","DOWN","RIGHT","CENTER","toggleLocationServices","api","getApiLevel","providers","getLocationProviders","isGpsEnabled","indexOf","toggleGPSLocationProvider","seq","push","keyevent","toggleSetting","errors","NotYetImplementedError","setting","preKeySeq","_","isNull","openSettingsActivity","key","doKey","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","ign","back","B","delay","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","disableAndroidWatchers","acceptSslCerts","Object","assign","_default","default"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n });\n } else {\n this.log.info(`Not changing airplane mode, since it is already ` +\n `${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.broadcastAirplaneMode(flightMode);\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n// https://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_CENTER\n// in the android docs, this is how the keycodes are defined\nconst KeyCode = {\n UP: 19,\n DOWN: 20,\n RIGHT: 22,\n CENTER: 23\n};\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n let api = await this.adb.getApiLevel();\n if (this.isEmulator()) {\n let providers = await this.adb.getLocationProviders();\n let isGpsEnabled = providers.indexOf('gps') !== -1;\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n return;\n }\n\n if (api > 15) {\n let seq = [KeyCode.UP, KeyCode.UP];\n if (api === 16) {\n // This version of Android has a \"parent\" button in its action bar\n seq.push(KeyCode.DOWN);\n } else if (api < 28) {\n // Newer versions of Android have the toggle in the Action bar\n seq = [KeyCode.RIGHT, KeyCode.RIGHT, KeyCode.UP];\n /*\n * Once the Location services switch is OFF, it won't receive focus\n * when going back to the Location Services settings screen unless we\n * send a dummy keyevent (UP) *before* opening the settings screen\n */\n await this.adb.keyevent(KeyCode.UP);\n } else if (api >= 28) {\n // Even newer versions of android have the toggle in a bar below the action bar\n // this means a single right click will cause it to be selected.\n seq = [KeyCode.RIGHT];\n await this.adb.keyevent(KeyCode.UP);\n }\n await this.toggleSetting('LOCATION_SOURCE_SETTINGS', seq);\n } else {\n // There's no global location services toggle on older Android versions\n throw new errors.NotYetImplementedError();\n }\n};\n\nhelpers.toggleSetting = async function toggleSetting (setting, preKeySeq) {\n /*\n * preKeySeq is the keyevent sequence to send over ADB in order\n * to position the cursor on the right option.\n * By default it's [up, up, down] because we usually target the 1st item in\n * the screen, and sometimes when opening settings activities the cursor is\n * already positionned on the 1st item, but we can't know for sure\n */\n if (_.isNull(preKeySeq)) {\n preKeySeq = [KeyCode.UP, KeyCode.UP, KeyCode.DOWN];\n }\n\n await this.openSettingsActivity(setting);\n\n for (let key of preKeySeq) {\n await this.doKey(key);\n }\n\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n\n /*\n * Click and handle potential ADB disconnect that occurs on official\n * emulator when the network connection is disabled\n */\n await this.wrapBootstrapDisconnect(async () => {\n await this.doKey(KeyCode.CENTER);\n });\n\n /*\n * In one particular case (enable Location Services), a pop-up is\n * displayed on some platforms so the user accepts or refuses that Google\n * collects location data. So we wait for that pop-up to open, if it\n * doesn't then proceed\n */\n try {\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n await this.doKey(KeyCode.RIGHT);\n await this.doKey(KeyCode.CENTER);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n } catch (ign) {}\n\n await this.adb.back();\n};\n\nhelpers.doKey = async function doKey (key) {\n // TODO: Confirm we need this delay. Seems to work without it.\n await B.delay(2000);\n await this.adb.keyevent(key);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
1
+ {"version":3,"file":"network.js","names":["_lodash","_interopRequireDefault","require","_driver","_bluebird","commands","helpers","extensions","exports","AIRPLANE_MODE_MASK","WIFI_MASK","DATA_MASK","GEO_EPSILON","Number","MIN_VALUE","WIFI_KEY_NAME","DATA_KEY_NAME","AIRPLANE_MODE_KEY_NAME","getNetworkConnection","log","info","airplaneModeOn","adb","isAirplaneModeOn","connection","wifiOn","isWifiOn","dataOn","isDataOn","mobileSetConnectivity","opts","wifi","data","airplaneMode","_","every","isUndefined","errors","InvalidArgumentError","currentState","mobileGetConnectivity","services","setters","Boolean","push","setWifiState","isEmulator","setDataState","setAirplaneMode","getApiLevel","broadcastAirplaneMode","isEmpty","B","all","isArray","statePromises","resolve","includes","undefined","values","fromPairs","map","k","value","setNetworkConnection","type","shouldEnableAirplaneMode","shouldEnableWifi","shouldEnableDataConnection","isAirplaneModeEnabled","isWiFiEnabled","isDataEnabled","wrapBootstrapDisconnect","toggleData","setWifiAndData","toggleWiFi","toggleFlightMode","flightMode","setGeoLocation","location","getGeoLocation","e","warn","message","latitude","longitude","altitude","mobileRefreshGpsCache","timeoutMs","refreshGeoLocationCache","parseFloat","KeyCode","UP","DOWN","RIGHT","CENTER","toggleLocationServices","api","providers","getLocationProviders","isGpsEnabled","indexOf","toggleGPSLocationProvider","seq","keyevent","toggleSetting","NotYetImplementedError","setting","preKeySeq","isNull","openSettingsActivity","key","doKey","appPackage","appActivity","getFocusedPackageAndActivity","waitForNotActivity","ign","back","delay","wrapped","bootstrap","ignoreUnexpectedShutdown","restart","start","disableAndroidWatchers","acceptSslCerts","Object","assign","_default","default"],"sources":["../../../lib/commands/network.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\nimport B from 'bluebird';\n\nlet commands = {}, helpers = {}, extensions = {};\n\nconst AIRPLANE_MODE_MASK = 0b001;\nconst WIFI_MASK = 0b010;\nconst DATA_MASK = 0b100;\n// The value close to zero, but not zero, is needed\n// to trick JSON generation and send a float value instead of an integer,\n// This allows strictly-typed clients, like Java, to properly\n// parse it. Otherwise float 0.0 is always represented as integer 0 in JS.\n// The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)\nconst GEO_EPSILON = Number.MIN_VALUE;\nconst WIFI_KEY_NAME = 'wifi';\nconst DATA_KEY_NAME = 'data';\nconst AIRPLANE_MODE_KEY_NAME = 'airplaneMode';\n\ncommands.getNetworkConnection = async function getNetworkConnection () {\n this.log.info('Getting network connection');\n let airplaneModeOn = await this.adb.isAirplaneModeOn();\n let connection = airplaneModeOn ? AIRPLANE_MODE_MASK : 0;\n\n // no need to check anything else if we are in airplane mode\n if (!airplaneModeOn) {\n let wifiOn = await this.isWifiOn();\n connection |= (wifiOn ? WIFI_MASK : 0);\n let dataOn = await this.adb.isDataOn();\n connection |= (dataOn ? DATA_MASK : 0);\n }\n\n return connection;\n};\n\n/**\n * decoupling to override the behaviour in other drivers like UiAutomator2.\n */\ncommands.isWifiOn = async function isWifiOn () {\n return await this.adb.isWifiOn();\n};\n\n/**\n * @typedef {Object} SetConnectivityOptions\n * @property {boolean?} wifi Either to enable or disable Wi-Fi.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} data Either to enable or disable mobile data connection.\n * An unset value means to not change the state for the given service.\n * @property {boolean?} airplaneMode Either to enable to disable the Airplane Mode\n * An unset value means to not change the state for the given service.\n */\n\n/**\n * Set the connectivity state for different services\n *\n * @param {SetConnectivityOptions} opts\n * @throws {Error} If none of known properties were provided or there was an error\n * while changing connectivity states\n */\ncommands.mobileSetConnectivity = async function mobileSetConnectivity (opts = {}) {\n const {\n wifi,\n data,\n airplaneMode,\n } = opts;\n\n if (_.every([wifi, data, airplaneMode], _.isUndefined)) {\n throw new errors.InvalidArgumentError(\n `Either one of ['${WIFI_KEY_NAME}', '${DATA_KEY_NAME}', '${AIRPLANE_MODE_KEY_NAME}'] options must be provided`\n );\n }\n\n const currentState = await this.mobileGetConnectivity({\n services: [\n ...(_.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]),\n ...(_.isUndefined(data) ? [] : [DATA_KEY_NAME]),\n ...(_.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME]),\n ]\n });\n const setters = [];\n if (!_.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {\n setters.push(this.adb.setWifiState(wifi, this.isEmulator()));\n }\n if (!_.isUndefined(data) && currentState.data !== Boolean(data)) {\n setters.push(this.adb.setDataState(data, this.isEmulator()));\n }\n if (!_.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {\n setters.push(async () => {\n await this.adb.setAirplaneMode(airplaneMode);\n if (this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(airplaneMode);\n }\n });\n }\n if (!_.isEmpty(setters)) {\n await B.all(setters);\n }\n};\n\n/**\n * @typedef {Object} GetConnectivityResult\n * @property {boolean} wifi True if wifi is enabled\n * @property {boolean} data True if mobile data connection is enabled\n * @property {boolean} airplaneMode True if Airplane Mode is enabled\n */\n\n/**\n * @typedef {Object} GetConnectivityOptions\n * @property {string[]|string?} services one or more services to get the connectivity for.\n * Supported service names are: wifi, data, airplaneMode.\n */\n\n/**\n * Retrieves the connectivity properties from the device under test\n *\n * @param {GetConnectivityOptions?} opts If no service names are provided then the\n * connectivity state is returned for all of them.\n * @returns {GetConnectivityResult}\n */\ncommands.mobileGetConnectivity = async function mobileGetConnectivity (opts = {}) {\n let {\n services = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME],\n } = opts;\n if (!_.isArray(services)) {\n services = [services];\n }\n\n const statePromises = {\n wifi: B.resolve(services.includes(WIFI_KEY_NAME) ? undefined : this.adb.isWifiOn()),\n data: B.resolve(services.includes(DATA_KEY_NAME) ? undefined : this.adb.isDataOn()),\n airplaneMode: B.resolve(\n services.includes(AIRPLANE_MODE_KEY_NAME) ? undefined : this.adb.isAirplaneModeOn()\n ),\n };\n await B.all(_.values(statePromises));\n return _.fromPairs(services.map((k) => [k, statePromises[k].value()]));\n};\n\ncommands.setNetworkConnection = async function setNetworkConnection (type) {\n this.log.info('Setting network connection');\n // decode the input\n const shouldEnableAirplaneMode = (type & AIRPLANE_MODE_MASK) !== 0;\n const shouldEnableWifi = (type & WIFI_MASK) !== 0;\n const shouldEnableDataConnection = (type & DATA_MASK) !== 0;\n\n const currentState = await this.getNetworkConnection();\n const isAirplaneModeEnabled = (currentState & AIRPLANE_MODE_MASK) !== 0;\n const isWiFiEnabled = (currentState & WIFI_MASK) !== 0;\n const isDataEnabled = (currentState & DATA_MASK) !== 0;\n\n if (shouldEnableAirplaneMode !== isAirplaneModeEnabled) {\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(shouldEnableAirplaneMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);\n }\n });\n } else {\n this.log.info(\n `Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`\n );\n }\n\n if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {\n this.log.info('Not changing data connection/Wi-Fi states, since they are already set to expected values');\n if (await this.adb.isAirplaneModeOn()) {\n return AIRPLANE_MODE_MASK | currentState;\n }\n return ~AIRPLANE_MODE_MASK & currentState;\n }\n\n await this.wrapBootstrapDisconnect(async () => {\n if (shouldEnableWifi !== isWiFiEnabled) {\n await this.setWifiState(shouldEnableWifi);\n } else {\n this.log.info(`Not changing Wi-Fi state, since it is already ` +\n `${shouldEnableWifi ? 'enabled' : 'disabled'}`);\n }\n\n if (shouldEnableAirplaneMode) {\n this.log.info('Not changing data connection state, because airplane mode is enabled');\n } else if (shouldEnableDataConnection === isDataEnabled) {\n this.log.info(`Not changing data connection state, since it is already ` +\n `${shouldEnableDataConnection ? 'enabled' : 'disabled'}`);\n } else {\n await this.adb.setDataState(shouldEnableDataConnection, this.isEmulator());\n }\n });\n\n return await this.getNetworkConnection();\n};\n\n/**\n * decoupling to override behaviour in other drivers like UiAutomator2.\n */\ncommands.setWifiState = async function setWifiState (wifi) {\n await this.adb.setWifiState(wifi, this.isEmulator());\n};\n\ncommands.toggleData = async function toggleData () {\n let data = !(await this.adb.isDataOn());\n this.log.info(`Turning network data ${data ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({data}, this.isEmulator());\n });\n};\n\ncommands.toggleWiFi = async function toggleWiFi () {\n let wifi = !(await this.adb.isWifiOn());\n this.log.info(`Turning WiFi ${wifi ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setWifiAndData({wifi}, this.isEmulator());\n });\n};\n\ncommands.toggleFlightMode = async function toggleFlightMode () {\n /*\n * TODO: Implement isRealDevice(). This method fails on\n * real devices, it should throw a NotYetImplementedError\n */\n let flightMode = !(await this.adb.isAirplaneModeOn());\n this.log.info(`Turning flight mode ${flightMode ? 'on' : 'off'}`);\n await this.wrapBootstrapDisconnect(async () => {\n await this.adb.setAirplaneMode(flightMode);\n });\n await this.wrapBootstrapDisconnect(async () => {\n if (await this.adb.getApiLevel() < 30) {\n await this.adb.broadcastAirplaneMode(flightMode);\n }\n });\n};\n\ncommands.setGeoLocation = async function setGeoLocation (location) {\n await this.adb.setGeoLocation(location, this.isEmulator());\n try {\n return await this.getGeoLocation();\n } catch (e) {\n this.log.warn(`Could not get the current geolocation info: ${e.message}`);\n this.log.warn(`Returning the default zero'ed values`);\n return {\n latitude: GEO_EPSILON,\n longitude: GEO_EPSILON,\n altitude: GEO_EPSILON,\n };\n }\n};\n\n/**\n * @typedef {Object} GpsCacheRefreshOptions\n * @property {number} timeoutMs [20000] The maximum number of milliseconds\n * to block until GPS cache is refreshed. Providing zero or a negative\n * value to it skips waiting completely.\n */\n\n/**\n * Sends an async request to refresh the GPS cache.\n * This feature only works if the device under test has\n * Google Play Services installed. In case the vanilla\n * LocationManager is used the device API level must be at\n * version 30 (Android R) or higher.\n *\n * @param {GpsCacheRefreshOptions} opts\n */\ncommands.mobileRefreshGpsCache = async function mobileRefreshGpsCache (opts = {}) {\n const { timeoutMs } = opts;\n await this.adb.refreshGeoLocationCache(timeoutMs);\n};\n\ncommands.getGeoLocation = async function getGeoLocation () {\n const {latitude, longitude, altitude} = await this.adb.getGeoLocation();\n return {\n latitude: parseFloat(latitude) || GEO_EPSILON,\n longitude: parseFloat(longitude) || GEO_EPSILON,\n altitude: parseFloat(altitude) || GEO_EPSILON,\n };\n};\n// https://developer.android.com/reference/android/view/KeyEvent.html#KEYCODE_DPAD_CENTER\n// in the android docs, this is how the keycodes are defined\nconst KeyCode = {\n UP: 19,\n DOWN: 20,\n RIGHT: 22,\n CENTER: 23\n};\ncommands.toggleLocationServices = async function toggleLocationServices () {\n this.log.info('Toggling location services');\n let api = await this.adb.getApiLevel();\n if (this.isEmulator()) {\n let providers = await this.adb.getLocationProviders();\n let isGpsEnabled = providers.indexOf('gps') !== -1;\n await this.adb.toggleGPSLocationProvider(!isGpsEnabled);\n return;\n }\n\n if (api > 15) {\n let seq = [KeyCode.UP, KeyCode.UP];\n if (api === 16) {\n // This version of Android has a \"parent\" button in its action bar\n seq.push(KeyCode.DOWN);\n } else if (api < 28) {\n // Newer versions of Android have the toggle in the Action bar\n seq = [KeyCode.RIGHT, KeyCode.RIGHT, KeyCode.UP];\n /*\n * Once the Location services switch is OFF, it won't receive focus\n * when going back to the Location Services settings screen unless we\n * send a dummy keyevent (UP) *before* opening the settings screen\n */\n await this.adb.keyevent(KeyCode.UP);\n } else if (api >= 28) {\n // Even newer versions of android have the toggle in a bar below the action bar\n // this means a single right click will cause it to be selected.\n seq = [KeyCode.RIGHT];\n await this.adb.keyevent(KeyCode.UP);\n }\n await this.toggleSetting('LOCATION_SOURCE_SETTINGS', seq);\n } else {\n // There's no global location services toggle on older Android versions\n throw new errors.NotYetImplementedError();\n }\n};\n\nhelpers.toggleSetting = async function toggleSetting (setting, preKeySeq) {\n /*\n * preKeySeq is the keyevent sequence to send over ADB in order\n * to position the cursor on the right option.\n * By default it's [up, up, down] because we usually target the 1st item in\n * the screen, and sometimes when opening settings activities the cursor is\n * already positionned on the 1st item, but we can't know for sure\n */\n if (_.isNull(preKeySeq)) {\n preKeySeq = [KeyCode.UP, KeyCode.UP, KeyCode.DOWN];\n }\n\n await this.openSettingsActivity(setting);\n\n for (let key of preKeySeq) {\n await this.doKey(key);\n }\n\n let {appPackage, appActivity} = await this.adb.getFocusedPackageAndActivity();\n\n /*\n * Click and handle potential ADB disconnect that occurs on official\n * emulator when the network connection is disabled\n */\n await this.wrapBootstrapDisconnect(async () => {\n await this.doKey(KeyCode.CENTER);\n });\n\n /*\n * In one particular case (enable Location Services), a pop-up is\n * displayed on some platforms so the user accepts or refuses that Google\n * collects location data. So we wait for that pop-up to open, if it\n * doesn't then proceed\n */\n try {\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n await this.doKey(KeyCode.RIGHT);\n await this.doKey(KeyCode.CENTER);\n await this.adb.waitForNotActivity(appPackage, appActivity, 5000);\n } catch (ign) {}\n\n await this.adb.back();\n};\n\nhelpers.doKey = async function doKey (key) {\n // TODO: Confirm we need this delay. Seems to work without it.\n await B.delay(2000);\n await this.adb.keyevent(key);\n};\n\nhelpers.wrapBootstrapDisconnect = async function wrapBootstrapDisconnect (wrapped) {\n if (!this.bootstrap) {\n return await wrapped();\n }\n\n this.bootstrap.ignoreUnexpectedShutdown = true;\n try {\n await wrapped();\n await this.adb.restart();\n await this.bootstrap.start(this.opts.appPackage, this.opts.disableAndroidWatchers, this.opts.acceptSslCerts);\n } finally {\n this.bootstrap.ignoreUnexpectedShutdown = false;\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
@@ -797,7 +797,11 @@ helpers.initDevice = async function initDevice (adb, opts) {
797
797
  if (skipDeviceInitialization) {
798
798
  logger.info(`'skipDeviceInitialization' is set. Skipping device initialization.`);
799
799
  } else {
800
- await adb.waitForDevice();
800
+ if (helpers.isEmulator(adb, opts)) {
801
+ // Check if the device wake up only for an emulator.
802
+ // It takes 1 second or so even when the device is already awake in a real device.
803
+ await adb.waitForDevice();
804
+ }
801
805
  // pushSettingsApp required before calling ensureDeviceLocale for API Level 24+
802
806
 
803
807
  // Some feature such as location/wifi are not necessary for all users,
@@ -73,6 +73,9 @@ extensions.executeMobile = async function executeMobile (mobileCommand, opts = {
73
73
  startMediaProjectionRecording: 'mobileStartMediaProjectionRecording',
74
74
  isMediaProjectionRecordingRunning: 'mobileIsMediaProjectionRecordingRunning',
75
75
  stopMediaProjectionRecording: 'mobileStopMediaProjectionRecording',
76
+
77
+ getConnectivity: 'mobileGetConnectivity',
78
+ setConnectivity: 'mobileSetConnectivity',
76
79
  };
77
80
 
78
81
  if (!_.has(mobileCommandsMapping, mobileCommand)) {
@@ -13,6 +13,9 @@ const DATA_MASK = 0b100;
13
13
  // parse it. Otherwise float 0.0 is always represented as integer 0 in JS.
14
14
  // The value must not be greater than DBL_EPSILON (https://opensource.apple.com/source/Libc/Libc-498/include/float.h)
15
15
  const GEO_EPSILON = Number.MIN_VALUE;
16
+ const WIFI_KEY_NAME = 'wifi';
17
+ const DATA_KEY_NAME = 'data';
18
+ const AIRPLANE_MODE_KEY_NAME = 'airplaneMode';
16
19
 
17
20
  commands.getNetworkConnection = async function getNetworkConnection () {
18
21
  this.log.info('Getting network connection');
@@ -37,6 +40,102 @@ commands.isWifiOn = async function isWifiOn () {
37
40
  return await this.adb.isWifiOn();
38
41
  };
39
42
 
43
+ /**
44
+ * @typedef {Object} SetConnectivityOptions
45
+ * @property {boolean?} wifi Either to enable or disable Wi-Fi.
46
+ * An unset value means to not change the state for the given service.
47
+ * @property {boolean?} data Either to enable or disable mobile data connection.
48
+ * An unset value means to not change the state for the given service.
49
+ * @property {boolean?} airplaneMode Either to enable to disable the Airplane Mode
50
+ * An unset value means to not change the state for the given service.
51
+ */
52
+
53
+ /**
54
+ * Set the connectivity state for different services
55
+ *
56
+ * @param {SetConnectivityOptions} opts
57
+ * @throws {Error} If none of known properties were provided or there was an error
58
+ * while changing connectivity states
59
+ */
60
+ commands.mobileSetConnectivity = async function mobileSetConnectivity (opts = {}) {
61
+ const {
62
+ wifi,
63
+ data,
64
+ airplaneMode,
65
+ } = opts;
66
+
67
+ if (_.every([wifi, data, airplaneMode], _.isUndefined)) {
68
+ throw new errors.InvalidArgumentError(
69
+ `Either one of ['${WIFI_KEY_NAME}', '${DATA_KEY_NAME}', '${AIRPLANE_MODE_KEY_NAME}'] options must be provided`
70
+ );
71
+ }
72
+
73
+ const currentState = await this.mobileGetConnectivity({
74
+ services: [
75
+ ...(_.isUndefined(wifi) ? [] : [WIFI_KEY_NAME]),
76
+ ...(_.isUndefined(data) ? [] : [DATA_KEY_NAME]),
77
+ ...(_.isUndefined(airplaneMode) ? [] : [AIRPLANE_MODE_KEY_NAME]),
78
+ ]
79
+ });
80
+ const setters = [];
81
+ if (!_.isUndefined(wifi) && currentState.wifi !== Boolean(wifi)) {
82
+ setters.push(this.adb.setWifiState(wifi, this.isEmulator()));
83
+ }
84
+ if (!_.isUndefined(data) && currentState.data !== Boolean(data)) {
85
+ setters.push(this.adb.setDataState(data, this.isEmulator()));
86
+ }
87
+ if (!_.isUndefined(airplaneMode) && currentState.airplaneMode !== Boolean(airplaneMode)) {
88
+ setters.push(async () => {
89
+ await this.adb.setAirplaneMode(airplaneMode);
90
+ if (this.adb.getApiLevel() < 30) {
91
+ await this.adb.broadcastAirplaneMode(airplaneMode);
92
+ }
93
+ });
94
+ }
95
+ if (!_.isEmpty(setters)) {
96
+ await B.all(setters);
97
+ }
98
+ };
99
+
100
+ /**
101
+ * @typedef {Object} GetConnectivityResult
102
+ * @property {boolean} wifi True if wifi is enabled
103
+ * @property {boolean} data True if mobile data connection is enabled
104
+ * @property {boolean} airplaneMode True if Airplane Mode is enabled
105
+ */
106
+
107
+ /**
108
+ * @typedef {Object} GetConnectivityOptions
109
+ * @property {string[]|string?} services one or more services to get the connectivity for.
110
+ * Supported service names are: wifi, data, airplaneMode.
111
+ */
112
+
113
+ /**
114
+ * Retrieves the connectivity properties from the device under test
115
+ *
116
+ * @param {GetConnectivityOptions?} opts If no service names are provided then the
117
+ * connectivity state is returned for all of them.
118
+ * @returns {GetConnectivityResult}
119
+ */
120
+ commands.mobileGetConnectivity = async function mobileGetConnectivity (opts = {}) {
121
+ let {
122
+ services = [WIFI_KEY_NAME, DATA_KEY_NAME, AIRPLANE_MODE_KEY_NAME],
123
+ } = opts;
124
+ if (!_.isArray(services)) {
125
+ services = [services];
126
+ }
127
+
128
+ const statePromises = {
129
+ wifi: B.resolve(services.includes(WIFI_KEY_NAME) ? undefined : this.adb.isWifiOn()),
130
+ data: B.resolve(services.includes(DATA_KEY_NAME) ? undefined : this.adb.isDataOn()),
131
+ airplaneMode: B.resolve(
132
+ services.includes(AIRPLANE_MODE_KEY_NAME) ? undefined : this.adb.isAirplaneModeOn()
133
+ ),
134
+ };
135
+ await B.all(_.values(statePromises));
136
+ return _.fromPairs(services.map((k) => [k, statePromises[k].value()]));
137
+ };
138
+
40
139
  commands.setNetworkConnection = async function setNetworkConnection (type) {
41
140
  this.log.info('Setting network connection');
42
141
  // decode the input
@@ -54,11 +153,14 @@ commands.setNetworkConnection = async function setNetworkConnection (type) {
54
153
  await this.adb.setAirplaneMode(shouldEnableAirplaneMode);
55
154
  });
56
155
  await this.wrapBootstrapDisconnect(async () => {
57
- await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);
156
+ if (await this.adb.getApiLevel() < 30) {
157
+ await this.adb.broadcastAirplaneMode(shouldEnableAirplaneMode);
158
+ }
58
159
  });
59
160
  } else {
60
- this.log.info(`Not changing airplane mode, since it is already ` +
61
- `${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`);
161
+ this.log.info(
162
+ `Not changing airplane mode, since it is already ${shouldEnableAirplaneMode ? 'enabled' : 'disabled'}`
163
+ );
62
164
  }
63
165
 
64
166
  if (shouldEnableWifi === isWiFiEnabled && shouldEnableDataConnection === isDataEnabled) {
@@ -124,7 +226,9 @@ commands.toggleFlightMode = async function toggleFlightMode () {
124
226
  await this.adb.setAirplaneMode(flightMode);
125
227
  });
126
228
  await this.wrapBootstrapDisconnect(async () => {
127
- await this.adb.broadcastAirplaneMode(flightMode);
229
+ if (await this.adb.getApiLevel() < 30) {
230
+ await this.adb.broadcastAirplaneMode(flightMode);
231
+ }
128
232
  });
129
233
  };
130
234
 
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "mobile",
10
10
  "mobile testing"
11
11
  ],
12
- "version": "5.8.12",
12
+ "version": "5.9.1",
13
13
  "author": "Appium Contributors",
14
14
  "license": "Apache-2.0",
15
15
  "repository": {
@@ -48,7 +48,7 @@
48
48
  ],
49
49
  "dependencies": {
50
50
  "@babel/runtime": "^7.0.0",
51
- "appium-adb": "^9.10.9",
51
+ "appium-adb": "^9.11.0",
52
52
  "appium-chromedriver": "^5.2.0",
53
53
  "asyncbox": "^2.8.0",
54
54
  "axios": "^1.x",