appium-android-driver 5.4.2 → 5.4.4
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/build/index.js +1 -9
- package/build/lib/android-helpers.js +10 -194
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +4 -45
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +3 -78
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +3 -10
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +4 -32
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +6 -78
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.js +1 -6
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.js +4 -47
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.js +2 -7
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.js +1 -13
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.js +3 -44
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +3 -16
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +4 -78
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.js +3 -14
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.js +3 -27
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -40
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/log.js +3 -35
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +2 -47
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +4 -40
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +5 -57
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -59
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.js +1 -15
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.js +7 -74
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.js +1 -23
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.js +13 -79
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.js +3 -4
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.js +8 -97
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.js +1 -5
- package/build/lib/logger.js.map +1 -1
- package/build/lib/uiautomator.js +3 -24
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -61
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.js +1 -7
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -94
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/android-helpers.js +2 -1
- package/package.json +2 -2
|
@@ -1,22 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.helpers = exports.default = exports.PIN_UNLOCK_KEY_EVENT = exports.PIN_UNLOCK = exports.PATTERN_UNLOCK = exports.PASSWORD_UNLOCK = exports.FINGERPRINT_UNLOCK = void 0;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _logger = _interopRequireDefault(require("./logger"));
|
|
13
|
-
|
|
14
10
|
var _asyncbox = require("asyncbox");
|
|
15
|
-
|
|
16
11
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
17
|
-
|
|
18
12
|
var _support = require("appium/support");
|
|
19
|
-
|
|
20
13
|
const PIN_UNLOCK = 'pin';
|
|
21
14
|
exports.PIN_UNLOCK = PIN_UNLOCK;
|
|
22
15
|
const PIN_UNLOCK_KEY_EVENT = 'pinWithKeyEvent';
|
|
@@ -34,17 +27,14 @@ const INPUT_KEYS_WAIT_TIME = 100;
|
|
|
34
27
|
const NUMBER_ZERO_KEYCODE = 7;
|
|
35
28
|
const helpers = {};
|
|
36
29
|
exports.helpers = helpers;
|
|
37
|
-
|
|
38
30
|
helpers.validateUnlockCapabilities = function validateUnlockCapabilities(caps = {}) {
|
|
39
31
|
const {
|
|
40
32
|
unlockKey,
|
|
41
33
|
unlockType
|
|
42
34
|
} = caps;
|
|
43
|
-
|
|
44
35
|
if (_lodash.default.isNil(unlockKey) || unlockKey === '') {
|
|
45
36
|
throw new Error('A non-empty unlock key value must be provided');
|
|
46
37
|
}
|
|
47
|
-
|
|
48
38
|
if ([PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, FINGERPRINT_UNLOCK].includes(unlockType)) {
|
|
49
39
|
if (!/^[0-9]+$/.test(_lodash.default.trim(unlockKey))) {
|
|
50
40
|
throw new Error(`Unlock key value '${unlockKey}' must only consist of digits`);
|
|
@@ -53,7 +43,6 @@ helpers.validateUnlockCapabilities = function validateUnlockCapabilities(caps =
|
|
|
53
43
|
if (!/^[1-9]{2,9}$/.test(_lodash.default.trim(unlockKey))) {
|
|
54
44
|
throw new Error(`Unlock key value '${unlockKey}' must only include from two to nine digits in range 1..9`);
|
|
55
45
|
}
|
|
56
|
-
|
|
57
46
|
if (/([1-9]).*?\1/.test(_lodash.default.trim(unlockKey))) {
|
|
58
47
|
throw new Error(`Unlock key value '${unlockKey}' must define a valid pattern where repeats are not allowed`);
|
|
59
48
|
}
|
|
@@ -64,27 +53,21 @@ helpers.validateUnlockCapabilities = function validateUnlockCapabilities(caps =
|
|
|
64
53
|
} else {
|
|
65
54
|
throw new Error(`Invalid unlock type '${unlockType}'. ` + `Only the following unlock types are supported: ${UNLOCK_TYPES}`);
|
|
66
55
|
}
|
|
67
|
-
|
|
68
56
|
return caps;
|
|
69
57
|
};
|
|
70
|
-
|
|
71
58
|
helpers.fastUnlock = async function fastUnlock(adb, opts = {}) {
|
|
72
59
|
const {
|
|
73
60
|
credential,
|
|
74
61
|
credentialType
|
|
75
62
|
} = opts;
|
|
76
|
-
|
|
77
63
|
_logger.default.info(`Unlocking the device via ADB using ${credentialType} credential '${credential}'`);
|
|
78
|
-
|
|
79
64
|
const wasLockEnabled = await adb.isLockEnabled();
|
|
80
|
-
|
|
81
65
|
if (wasLockEnabled) {
|
|
82
66
|
await adb.clearLockCredential(credential);
|
|
83
67
|
await adb.cycleWakeUp();
|
|
84
68
|
} else {
|
|
85
69
|
_logger.default.info('No active lock has been detected. Proceeding to the keyguard dismissal');
|
|
86
70
|
}
|
|
87
|
-
|
|
88
71
|
try {
|
|
89
72
|
await adb.dismissKeyguard();
|
|
90
73
|
} finally {
|
|
@@ -93,44 +76,33 @@ helpers.fastUnlock = async function fastUnlock(adb, opts = {}) {
|
|
|
93
76
|
}
|
|
94
77
|
}
|
|
95
78
|
};
|
|
96
|
-
|
|
97
79
|
helpers.encodePassword = function encodePassword(key) {
|
|
98
80
|
return `${key}`.replace(/\s/ig, '%s');
|
|
99
81
|
};
|
|
100
|
-
|
|
101
82
|
helpers.stringKeyToArr = function stringKeyToArr(key) {
|
|
102
83
|
return `${key}`.trim().replace(/\s+/g, '').split(/\s*/);
|
|
103
84
|
};
|
|
104
|
-
|
|
105
85
|
helpers.fingerprintUnlock = async function fingerprintUnlock(adb, driver, capabilities) {
|
|
106
86
|
if ((await adb.getApiLevel()) < 23) {
|
|
107
87
|
throw new Error('Fingerprint unlock only works for Android 6+ emulators');
|
|
108
88
|
}
|
|
109
|
-
|
|
110
89
|
await adb.fingerprint(capabilities.unlockKey);
|
|
111
90
|
await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
|
|
112
91
|
};
|
|
113
|
-
|
|
114
92
|
helpers.pinUnlock = async function pinUnlock(adb, driver, capabilities) {
|
|
115
93
|
_logger.default.info(`Trying to unlock device using pin ${capabilities.unlockKey}`);
|
|
116
|
-
|
|
117
94
|
await adb.dismissKeyguard();
|
|
118
95
|
const keys = helpers.stringKeyToArr(capabilities.unlockKey);
|
|
119
|
-
|
|
120
96
|
if ((await adb.getApiLevel()) >= 21) {
|
|
121
97
|
const els = await driver.findElOrEls('id', 'com.android.systemui:id/digit_text', true);
|
|
122
|
-
|
|
123
98
|
if (_lodash.default.isEmpty(els)) {
|
|
124
99
|
return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);
|
|
125
100
|
}
|
|
126
|
-
|
|
127
101
|
const pins = {};
|
|
128
|
-
|
|
129
102
|
for (const el of els) {
|
|
130
103
|
const text = await driver.getAttribute('text', _support.util.unwrapElement(el));
|
|
131
104
|
pins[text] = el;
|
|
132
105
|
}
|
|
133
|
-
|
|
134
106
|
for (const pin of keys) {
|
|
135
107
|
const el = pins[pin];
|
|
136
108
|
await driver.click(_support.util.unwrapElement(el));
|
|
@@ -138,49 +110,38 @@ helpers.pinUnlock = async function pinUnlock(adb, driver, capabilities) {
|
|
|
138
110
|
} else {
|
|
139
111
|
for (const pin of keys) {
|
|
140
112
|
const el = await driver.findElOrEls('id', `com.android.keyguard:id/key${pin}`, false);
|
|
141
|
-
|
|
142
113
|
if (el === null) {
|
|
143
114
|
return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);
|
|
144
115
|
}
|
|
145
|
-
|
|
146
116
|
await driver.click(_support.util.unwrapElement(el));
|
|
147
117
|
}
|
|
148
118
|
}
|
|
149
|
-
|
|
150
119
|
await waitForUnlock(adb);
|
|
151
120
|
};
|
|
152
121
|
|
|
153
122
|
async function waitForUnlock(adb) {
|
|
154
123
|
await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
|
|
155
|
-
|
|
156
124
|
if (!(await adb.isScreenLocked())) {
|
|
157
125
|
return;
|
|
158
126
|
}
|
|
159
|
-
|
|
160
127
|
await adb.keyevent(KEYCODE_NUMPAD_ENTER);
|
|
161
128
|
await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
|
|
162
129
|
}
|
|
163
|
-
|
|
164
130
|
helpers.pinUnlockWithKeyEvent = async function pinUnlockWithKeyEvent(adb, driver, capabilities) {
|
|
165
131
|
_logger.default.info(`Trying to unlock device using pin with keycode ${capabilities.unlockKey}`);
|
|
166
|
-
|
|
167
132
|
await adb.dismissKeyguard();
|
|
168
133
|
const keys = helpers.stringKeyToArr(capabilities.unlockKey);
|
|
169
134
|
|
|
170
135
|
for (const pin of keys) {
|
|
171
136
|
await adb.shell(['input', 'keyevent', parseInt(pin, 10) + NUMBER_ZERO_KEYCODE]);
|
|
172
137
|
}
|
|
173
|
-
|
|
174
138
|
await waitForUnlock(adb, driver);
|
|
175
139
|
};
|
|
176
|
-
|
|
177
140
|
helpers.passwordUnlock = async function passwordUnlock(adb, driver, capabilities) {
|
|
178
141
|
const {
|
|
179
142
|
unlockKey
|
|
180
143
|
} = capabilities;
|
|
181
|
-
|
|
182
144
|
_logger.default.info(`Trying to unlock device using password ${unlockKey}`);
|
|
183
|
-
|
|
184
145
|
await adb.dismissKeyguard();
|
|
185
146
|
const key = helpers.encodePassword(unlockKey);
|
|
186
147
|
await adb.shell(['input', 'text', key]);
|
|
@@ -188,28 +149,21 @@ helpers.passwordUnlock = async function passwordUnlock(adb, driver, capabilities
|
|
|
188
149
|
await adb.shell(['input', 'keyevent', KEYCODE_NUMPAD_ENTER]);
|
|
189
150
|
await waitForUnlock(adb, driver);
|
|
190
151
|
};
|
|
191
|
-
|
|
192
152
|
helpers.getPatternKeyPosition = function getPatternKeyPosition(key, initPos, piece) {
|
|
193
153
|
const cols = 3;
|
|
194
154
|
const pins = 9;
|
|
195
|
-
|
|
196
155
|
const xPos = (key, x, piece) => Math.round(x + (key % cols || cols) * piece - piece / 2);
|
|
197
|
-
|
|
198
156
|
const yPos = (key, y, piece) => Math.round(y + (Math.ceil((key % pins || pins) / cols) * piece - piece / 2));
|
|
199
|
-
|
|
200
157
|
return {
|
|
201
158
|
x: xPos(key, initPos.x, piece),
|
|
202
159
|
y: yPos(key, initPos.y, piece)
|
|
203
160
|
};
|
|
204
161
|
};
|
|
205
|
-
|
|
206
162
|
helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
|
|
207
163
|
const actions = [];
|
|
208
164
|
let lastPos;
|
|
209
|
-
|
|
210
165
|
for (let key of keys) {
|
|
211
166
|
const keyPos = helpers.getPatternKeyPosition(key, initPos, piece);
|
|
212
|
-
|
|
213
167
|
if (key === keys[0]) {
|
|
214
168
|
actions.push({
|
|
215
169
|
action: 'press',
|
|
@@ -222,43 +176,34 @@ helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
|
|
|
222
176
|
lastPos = keyPos;
|
|
223
177
|
continue;
|
|
224
178
|
}
|
|
225
|
-
|
|
226
179
|
const moveTo = {
|
|
227
180
|
x: 0,
|
|
228
181
|
y: 0
|
|
229
182
|
};
|
|
230
183
|
const diffX = keyPos.x - lastPos.x;
|
|
231
|
-
|
|
232
184
|
if (diffX > 0) {
|
|
233
185
|
moveTo.x = piece;
|
|
234
|
-
|
|
235
186
|
if (Math.abs(diffX) > piece) {
|
|
236
187
|
moveTo.x += piece;
|
|
237
188
|
}
|
|
238
189
|
} else if (diffX < 0) {
|
|
239
190
|
moveTo.x = -1 * piece;
|
|
240
|
-
|
|
241
191
|
if (Math.abs(diffX) > piece) {
|
|
242
192
|
moveTo.x -= piece;
|
|
243
193
|
}
|
|
244
194
|
}
|
|
245
|
-
|
|
246
195
|
const diffY = keyPos.y - lastPos.y;
|
|
247
|
-
|
|
248
196
|
if (diffY > 0) {
|
|
249
197
|
moveTo.y = piece;
|
|
250
|
-
|
|
251
198
|
if (Math.abs(diffY) > piece) {
|
|
252
199
|
moveTo.y += piece;
|
|
253
200
|
}
|
|
254
201
|
} else if (diffY < 0) {
|
|
255
202
|
moveTo.y = -1 * piece;
|
|
256
|
-
|
|
257
203
|
if (Math.abs(diffY) > piece) {
|
|
258
204
|
moveTo.y -= piece;
|
|
259
205
|
}
|
|
260
206
|
}
|
|
261
|
-
|
|
262
207
|
actions.push({
|
|
263
208
|
action: 'moveTo',
|
|
264
209
|
options: {
|
|
@@ -269,20 +214,16 @@ helpers.getPatternActions = function getPatternActions(keys, initPos, piece) {
|
|
|
269
214
|
});
|
|
270
215
|
lastPos = keyPos;
|
|
271
216
|
}
|
|
272
|
-
|
|
273
217
|
actions.push({
|
|
274
218
|
action: 'release'
|
|
275
219
|
});
|
|
276
220
|
return actions;
|
|
277
221
|
};
|
|
278
|
-
|
|
279
222
|
helpers.patternUnlock = async function patternUnlock(adb, driver, capabilities) {
|
|
280
223
|
const {
|
|
281
224
|
unlockKey
|
|
282
225
|
} = capabilities;
|
|
283
|
-
|
|
284
226
|
_logger.default.info(`Trying to unlock device using pattern ${unlockKey}`);
|
|
285
|
-
|
|
286
227
|
await adb.dismissKeyguard();
|
|
287
228
|
const keys = helpers.stringKeyToArr(unlockKey);
|
|
288
229
|
const apiLevel = await adb.getApiLevel();
|
|
@@ -293,7 +234,6 @@ helpers.patternUnlock = async function patternUnlock(adb, driver, capabilities)
|
|
|
293
234
|
await driver.performTouch(actions);
|
|
294
235
|
await (0, _asyncbox.sleep)(UNLOCK_WAIT_TIME);
|
|
295
236
|
};
|
|
296
|
-
|
|
297
237
|
helpers.PIN_UNLOCK = PIN_UNLOCK;
|
|
298
238
|
helpers.PIN_UNLOCK_KEY_EVENT = PIN_UNLOCK_KEY_EVENT;
|
|
299
239
|
helpers.PASSWORD_UNLOCK = PASSWORD_UNLOCK;
|
|
@@ -301,4 +241,4 @@ helpers.PATTERN_UNLOCK = PATTERN_UNLOCK;
|
|
|
301
241
|
helpers.FINGERPRINT_UNLOCK = FINGERPRINT_UNLOCK;
|
|
302
242
|
var _default = helpers;
|
|
303
243
|
exports.default = _default;
|
|
304
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQSU5fVU5MT0NLIiwiUElOX1VOTE9DS19LRVlfRVZFTlQiLCJQQVNTV09SRF9VTkxPQ0siLCJQQVRURVJOX1VOTE9DSyIsIkZJTkdFUlBSSU5UX1VOTE9DSyIsIlVOTE9DS19UWVBFUyIsIktFWUNPREVfTlVNUEFEX0VOVEVSIiwiVU5MT0NLX1dBSVRfVElNRSIsIklOUFVUX0tFWVNfV0FJVF9USU1FIiwiTlVNQkVSX1pFUk9fS0VZQ09ERSIsImhlbHBlcnMiLCJ2YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyIsImNhcHMiLCJ1bmxvY2tLZXkiLCJ1bmxvY2tUeXBlIiwiXyIsImlzTmlsIiwiRXJyb3IiLCJpbmNsdWRlcyIsInRlc3QiLCJ0cmltIiwiZmFzdFVubG9jayIsImFkYiIsIm9wdHMiLCJjcmVkZW50aWFsIiwiY3JlZGVudGlhbFR5cGUiLCJsb2dnZXIiLCJpbmZvIiwid2FzTG9ja0VuYWJsZWQiLCJpc0xvY2tFbmFibGVkIiwiY2xlYXJMb2NrQ3JlZGVudGlhbCIsImN5Y2xlV2FrZVVwIiwiZGlzbWlzc0tleWd1YXJkIiwic2V0TG9ja0NyZWRlbnRpYWwiLCJlbmNvZGVQYXNzd29yZCIsImtleSIsInJlcGxhY2UiLCJzdHJpbmdLZXlUb0FyciIsInNwbGl0IiwiZmluZ2VycHJpbnRVbmxvY2siLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJnZXRBcGlMZXZlbCIsImZpbmdlcnByaW50Iiwic2xlZXAiLCJwaW5VbmxvY2siLCJrZXlzIiwiZWxzIiwiZmluZEVsT3JFbHMiLCJpc0VtcHR5IiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGlucyIsImVsIiwidGV4dCIsImdldEF0dHJpYnV0ZSIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwicGluIiwiY2xpY2siLCJ3YWl0Rm9yVW5sb2NrIiwiaXNTY3JlZW5Mb2NrZWQiLCJrZXlldmVudCIsInNoZWxsIiwicGFyc2VJbnQiLCJwYXNzd29yZFVubG9jayIsImdldFBhdHRlcm5LZXlQb3NpdGlvbiIsImluaXRQb3MiLCJwaWVjZSIsImNvbHMiLCJ4UG9zIiwieCIsIk1hdGgiLCJyb3VuZCIsInlQb3MiLCJ5IiwiY2VpbCIsImdldFBhdHRlcm5BY3Rpb25zIiwiYWN0aW9ucyIsImxhc3RQb3MiLCJrZXlQb3MiLCJwdXNoIiwiYWN0aW9uIiwib3B0aW9ucyIsImVsZW1lbnQiLCJtb3ZlVG8iLCJkaWZmWCIsImFicyIsImRpZmZZIiwicGF0dGVyblVubG9jayIsImFwaUxldmVsIiwiZ2V0TG9jYXRpb24iLCJzaXplIiwiZ2V0U2l6ZSIsIndpZHRoIiwicGVyZm9ybVRvdWNoIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3VubG9jay1oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcblxuY29uc3QgUElOX1VOTE9DSyA9ICdwaW4nO1xuY29uc3QgUElOX1VOTE9DS19LRVlfRVZFTlQgPSAncGluV2l0aEtleUV2ZW50JztcbmNvbnN0IFBBU1NXT1JEX1VOTE9DSyA9ICdwYXNzd29yZCc7XG5jb25zdCBQQVRURVJOX1VOTE9DSyA9ICdwYXR0ZXJuJztcbmNvbnN0IEZJTkdFUlBSSU5UX1VOTE9DSyA9ICdmaW5nZXJwcmludCc7XG5jb25zdCBVTkxPQ0tfVFlQRVMgPSBbXG4gIFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULCBQQVNTV09SRF9VTkxPQ0ssXG4gIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0tcbl07XG5jb25zdCBLRVlDT0RFX05VTVBBRF9FTlRFUiA9IDY2O1xuY29uc3QgVU5MT0NLX1dBSVRfVElNRSA9IDEwMDtcbmNvbnN0IElOUFVUX0tFWVNfV0FJVF9USU1FID0gMTAwO1xuY29uc3QgTlVNQkVSX1pFUk9fS0VZQ09ERSA9IDc7XG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuaGVscGVycy52YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzIChjYXBzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tUeXBlLFxuICB9ID0gY2FwcztcbiAgaWYgKF8uaXNOaWwodW5sb2NrS2V5KSB8fCB1bmxvY2tLZXkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vbi1lbXB0eSB1bmxvY2sga2V5IHZhbHVlIG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChbUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIEZJTkdFUlBSSU5UX1VOTE9DS10uaW5jbHVkZXModW5sb2NrVHlwZSkpIHtcbiAgICBpZiAoIS9eWzAtOV0rJC8udGVzdChfLnRyaW0odW5sb2NrS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIGtleSB2YWx1ZSAnJHt1bmxvY2tLZXl9JyBtdXN0IG9ubHkgY29uc2lzdCBvZiBkaWdpdHNgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodW5sb2NrVHlwZSA9PT0gUEFUVEVSTl9VTkxPQ0spIHtcbiAgICBpZiAoIS9eWzEtOV17Miw5fSQvLnRlc3QoXy50cmltKHVubG9ja0tleSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgbXVzdCBvbmx5IGluY2x1ZGUgZnJvbSB0d28gdG8gbmluZSBkaWdpdHMgaW4gcmFuZ2UgMS4uOWApO1xuICAgIH1cbiAgICBpZiAoLyhbMS05XSkuKj9cXDEvLnRlc3QoXy50cmltKHVubG9ja0tleSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgbXVzdCBkZWZpbmUgYSB2YWxpZCBwYXR0ZXJuIHdoZXJlIHJlcGVhdHMgYXJlIG5vdCBhbGxvd2VkYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHVubG9ja1R5cGUgPT09IFBBU1NXT1JEX1VOTE9DSykge1xuICAgIC8vIERvbnQgdHJpbSBwYXNzd29yZCBrZXksIHlvdSBjYW4gdXNlIGJsYW5rIHNwYWNlcyBpbiB5b3VyIGFuZHJvaWQgcGFzc3dvcmRcbiAgICAvLyDCr1xcXyjjg4QpXy/Cr1xuICAgIGlmICghLy57NCx9L2cudGVzdCh1bmxvY2tLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBtaW5pbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgaXMgNCBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1bmxvY2sgdHlwZSAnJHt1bmxvY2tUeXBlfScuIGAgK1xuICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyB1bmxvY2sgdHlwZXMgYXJlIHN1cHBvcnRlZDogJHtVTkxPQ0tfVFlQRVN9YCk7XG4gIH1cbiAgcmV0dXJuIGNhcHM7XG59O1xuXG5oZWxwZXJzLmZhc3RVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBmYXN0VW5sb2NrIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgY3JlZGVudGlhbCxcbiAgICBjcmVkZW50aWFsVHlwZSxcbiAgfSA9IG9wdHM7XG4gIGxvZ2dlci5pbmZvKGBVbmxvY2tpbmcgdGhlIGRldmljZSB2aWEgQURCIHVzaW5nICR7Y3JlZGVudGlhbFR5cGV9IGNyZWRlbnRpYWwgJyR7Y3JlZGVudGlhbH0nYCk7XG4gIGNvbnN0IHdhc0xvY2tFbmFibGVkID0gYXdhaXQgYWRiLmlzTG9ja0VuYWJsZWQoKTtcbiAgaWYgKHdhc0xvY2tFbmFibGVkKSB7XG4gICAgYXdhaXQgYWRiLmNsZWFyTG9ja0NyZWRlbnRpYWwoY3JlZGVudGlhbCk7XG4gICAgLy8gbm90IHN1cmUgd2h5LCBidXQgdGhlIGRldmljZSdzIHNjcmVlbiBzdGlsbCByZW1haW5zIGxvY2tlZFxuICAgIC8vIGlmIGEgcHJlbGltaW5hcnkgd2FrZSB1cCBjeWNsZSBoYXMgbm90IGJlZW4gcGVyZm9ybWVkXG4gICAgYXdhaXQgYWRiLmN5Y2xlV2FrZVVwKCk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ05vIGFjdGl2ZSBsb2NrIGhhcyBiZWVuIGRldGVjdGVkLiBQcm9jZWVkaW5nIHRvIHRoZSBrZXlndWFyZCBkaXNtaXNzYWwnKTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAod2FzTG9ja0VuYWJsZWQpIHtcbiAgICAgIGF3YWl0IGFkYi5zZXRMb2NrQ3JlZGVudGlhbChjcmVkZW50aWFsVHlwZSwgY3JlZGVudGlhbCk7XG4gICAgfVxuICB9XG59O1xuXG5oZWxwZXJzLmVuY29kZVBhc3N3b3JkID0gZnVuY3Rpb24gZW5jb2RlUGFzc3dvcmQgKGtleSkge1xuICByZXR1cm4gYCR7a2V5fWAucmVwbGFjZSgvXFxzL2lnLCAnJXMnKTtcbn07XG5cbmhlbHBlcnMuc3RyaW5nS2V5VG9BcnIgPSBmdW5jdGlvbiBzdHJpbmdLZXlUb0FyciAoa2V5KSB7XG4gIHJldHVybiBgJHtrZXl9YC50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnJykuc3BsaXQoL1xccyovKTtcbn07XG5cbmhlbHBlcnMuZmluZ2VycHJpbnRVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBmaW5nZXJwcmludFVubG9jayAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmluZ2VycHJpbnQgdW5sb2NrIG9ubHkgd29ya3MgZm9yIEFuZHJvaWQgNisgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgYWRiLmZpbmdlcnByaW50KGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbn07XG5cbmhlbHBlcnMucGluVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gcGluVW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwaW4gJHtjYXBhYmlsaXRpZXMudW5sb2NrS2V5fWApO1xuICBhd2FpdCBhZGIuZGlzbWlzc0tleWd1YXJkKCk7XG4gIGNvbnN0IGtleXMgPSBoZWxwZXJzLnN0cmluZ0tleVRvQXJyKGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPj0gMjEpIHtcbiAgICBjb25zdCBlbHMgPSBhd2FpdCBkcml2ZXIuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLnN5c3RlbXVpOmlkL2RpZ2l0X3RleHQnLCB0cnVlKTtcbiAgICBpZiAoXy5pc0VtcHR5KGVscykpIHtcbiAgICAgIC8vIGZhbGxiYWNrIHRvIHBpbiB3aXRoIGtleSBldmVudFxuICAgICAgcmV0dXJuIGF3YWl0IGhlbHBlcnMucGluVW5sb2NrV2l0aEtleUV2ZW50KGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpO1xuICAgIH1cbiAgICBjb25zdCBwaW5zID0ge307XG4gICAgZm9yIChjb25zdCBlbCBvZiBlbHMpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBkcml2ZXIuZ2V0QXR0cmlidXRlKCd0ZXh0JywgdXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgICBwaW5zW3RleHRdID0gZWw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGluIG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGVsID0gcGluc1twaW5dO1xuICAgICAgYXdhaXQgZHJpdmVyLmNsaWNrKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBpbiBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBlbCA9IGF3YWl0IGRyaXZlci5maW5kRWxPckVscygnaWQnLCBgY29tLmFuZHJvaWQua2V5Z3VhcmQ6aWQva2V5JHtwaW59YCwgZmFsc2UpO1xuICAgICAgaWYgKGVsID09PSBudWxsKSB7XG4gICAgICAgIC8vIGZhbGxiYWNrIHRvIHBpbiB3aXRoIGtleSBldmVudFxuICAgICAgICByZXR1cm4gYXdhaXQgaGVscGVycy5waW5VbmxvY2tXaXRoS2V5RXZlbnQoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcyk7XG4gICAgICB9XG4gICAgICBhd2FpdCBkcml2ZXIuY2xpY2sodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiKTtcbn07XG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGRpc3BsYXkgdG8gYmUgdW5sb2NrZWQuXG4gKiBTb21lIGRldmljZXMgYXV0b21hdGljYWxseSBhY2NlcHQgdHlwZWQgJ3BpbicgYW5kICdwYXNzd29yZCcgY29kZVxuICogd2l0aG91dCBwcmVzc2luZyB0aGUgRW50ZXIga2V5LiBCdXQgc29tZSBkZXZpY2VzIG5lZWQgaXQuXG4gKiBUaGlzIG1ldGhvZCB3YWl0cyBhIGZldyBzZWNvbmRzIGZpcnN0IGZvciBzdWNoIGF1dG9tYXRpYyBhY2NlcHRhbmNlIGNhc2UuXG4gKiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIGxvY2tlZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBzZW5kXG4gKiB0aGUgZW50ZXIga2V5IGNvZGUuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBUaGUgaW5zdGFuY2Ugb2YgQURCXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JVbmxvY2sgKGFkYikge1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbiAgaWYgKCFhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFkYi5rZXlldmVudChLRVlDT0RFX05VTVBBRF9FTlRFUik7XG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xufVxuXG5oZWxwZXJzLnBpblVubG9ja1dpdGhLZXlFdmVudCA9IGFzeW5jIGZ1bmN0aW9uIHBpblVubG9ja1dpdGhLZXlFdmVudCAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvIHVubG9jayBkZXZpY2UgdXNpbmcgcGluIHdpdGgga2V5Y29kZSAke2NhcGFiaWxpdGllcy51bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIoY2FwYWJpbGl0aWVzLnVubG9ja0tleSk7XG5cbiAgLy8gU29tZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBzeXN0ZW0ga2V5IGlkcyBsaWtlICdjb20uYW5kcm9pZC5rZXlndWFyZDppZC9rZXknXG4gIC8vIFRoZW4sIHNlbmRpbmcga2V5ZXZlbnRzIGFyZSBtb3JlIHJlbGlhYmxlIHRvIHVubG9jayB0aGUgc2NyZWVuLlxuICBmb3IgKGNvbnN0IHBpbiBvZiBrZXlzKSB7XG4gICAgLy8gJ3BpbicgaXMgbnVtYmVyICgwLTkpIGluIHN0cmluZy5cbiAgICAvLyBOdW1iZXIgJzAnIGlzIGtleWNvZGUgJzcnLiBudW1iZXIgJzknIGlzIGtleWNvZGUgJzE2Jy5cbiAgICBhd2FpdCBhZGIuc2hlbGwoWydpbnB1dCcsICdrZXlldmVudCcsIHBhcnNlSW50KHBpbiwgMTApICsgTlVNQkVSX1pFUk9fS0VZQ09ERV0pO1xuICB9XG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiLCBkcml2ZXIpO1xufTtcblxuaGVscGVycy5wYXNzd29yZFVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHBhc3N3b3JkVW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGNvbnN0IHsgdW5sb2NrS2V5IH0gPSBjYXBhYmlsaXRpZXM7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwYXNzd29yZCAke3VubG9ja0tleX1gKTtcbiAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICAvLyBSZXBsYWNlIGJsYW5rIHNwYWNlcyB3aXRoICVzXG4gIGNvbnN0IGtleSA9IGhlbHBlcnMuZW5jb2RlUGFzc3dvcmQodW5sb2NrS2V5KTtcbiAgLy8gV2h5IGFkYiA/IEl0IHdhcyBsZXNzIGZsYWt5XG4gIGF3YWl0IGFkYi5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCBrZXldKTtcbiAgLy8gV2h5IHNsZWVwcyA/IEF2b2lkIHNvbWUgZmxha3luZXNzIHdhaXRpbmcgZm9yIHRoZSBpbnB1dCB0byByZWNlaXZlIHRoZSBrZXlzXG4gIGF3YWl0IHNsZWVwKElOUFVUX0tFWVNfV0FJVF9USU1FKTtcbiAgYXdhaXQgYWRiLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBLRVlDT0RFX05VTVBBRF9FTlRFUl0pO1xuICAvLyBXYWl0cyBhIGJpdCBmb3IgdGhlIGRldmljZSB0byBiZSB1bmxvY2tlZFxuICBhd2FpdCB3YWl0Rm9yVW5sb2NrKGFkYiwgZHJpdmVyKTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybktleVBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0UGF0dGVybktleVBvc2l0aW9uIChrZXksIGluaXRQb3MsIHBpZWNlKSB7XG4gIC8qXG4gIEhvdyB0aGUgbWF0aCB3b3JrczpcbiAgV2UgaGF2ZSA5IGJ1dHRvbnMgZGl2aWRlZCBpbiAzIGNvbHVtbnMgYW5kIDMgcm93cyBpbnNpZGUgdGhlIGxvY2tQYXR0ZXJuVmlldyxcbiAgZXZlcnkgYnV0dG9uIGhhcyBhIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4gY29ycmVzcG9uZGluZyB0byB0aGUgbG9ja1BhdHRlcm5WaWV3IHNpbmNlXG4gIGl0IGlzIHRoZSBwYXJlbnQgdmlldyByaWdodCBhdCB0aGUgbWlkZGxlIG9mIGVhY2ggY29sdW1uIG9yIHJvdy5cbiAgKi9cbiAgY29uc3QgY29scyA9IDM7XG4gIGNvbnN0IHBpbnMgPSA5O1xuICBjb25zdCB4UG9zID0gKGtleSwgeCwgcGllY2UpID0+IE1hdGgucm91bmQoeCArICgoa2V5ICUgY29scykgfHwgY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMik7XG4gIGNvbnN0IHlQb3MgPSAoa2V5LCB5LCBwaWVjZSkgPT4gTWF0aC5yb3VuZCh5ICsgKE1hdGguY2VpbCgoKGtleSAlIHBpbnMpIHx8IHBpbnMpIC8gY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMikpO1xuICByZXR1cm4ge1xuICAgIHg6IHhQb3Moa2V5LCBpbml0UG9zLngsIHBpZWNlKSxcbiAgICB5OiB5UG9zKGtleSwgaW5pdFBvcy55LCBwaWVjZSlcbiAgfTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMgPSBmdW5jdGlvbiBnZXRQYXR0ZXJuQWN0aW9ucyAoa2V5cywgaW5pdFBvcywgcGllY2UpIHtcbiAgY29uc3QgYWN0aW9ucyA9IFtdO1xuICBsZXQgbGFzdFBvcztcbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCBrZXlQb3MgPSBoZWxwZXJzLmdldFBhdHRlcm5LZXlQb3NpdGlvbihrZXksIGluaXRQb3MsIHBpZWNlKTtcbiAgICBpZiAoa2V5ID09PSBrZXlzWzBdKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe2FjdGlvbjogJ3ByZXNzJywgb3B0aW9uczoge2VsZW1lbnQ6IG51bGwsIHg6IGtleVBvcy54LCB5OiBrZXlQb3MueX19KTtcbiAgICAgIGxhc3RQb3MgPSBrZXlQb3M7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbW92ZVRvID0ge3g6IDAsIHk6IDB9O1xuICAgIGNvbnN0IGRpZmZYID0ga2V5UG9zLnggLSBsYXN0UG9zLng7XG4gICAgaWYgKGRpZmZYID4gMCkge1xuICAgICAgbW92ZVRvLnggPSBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWCkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueCArPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpZmZYIDwgMCkge1xuICAgICAgbW92ZVRvLnggPSAtMSAqIHBpZWNlO1xuICAgICAgaWYgKE1hdGguYWJzKGRpZmZYKSA+IHBpZWNlKSB7XG4gICAgICAgIG1vdmVUby54IC09IHBpZWNlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaWZmWSA9IGtleVBvcy55IC0gbGFzdFBvcy55O1xuICAgIGlmIChkaWZmWSA+IDApIHtcbiAgICAgIG1vdmVUby55ID0gcGllY2U7XG4gICAgICBpZiAoTWF0aC5hYnMoZGlmZlkpID4gcGllY2UpIHtcbiAgICAgICAgbW92ZVRvLnkgKz0gcGllY2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkaWZmWSA8IDApIHtcbiAgICAgIG1vdmVUby55ID0gLTEgKiBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWSkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueSAtPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ21vdmVUbycsXG4gICAgICBvcHRpb25zOiB7ZWxlbWVudDogbnVsbCwgeDogbW92ZVRvLnggKyBsYXN0UG9zLngsIHk6IG1vdmVUby55ICsgbGFzdFBvcy55fVxuICAgIH0pO1xuICAgIGxhc3RQb3MgPSBrZXlQb3M7XG4gIH1cbiAgYWN0aW9ucy5wdXNoKHthY3Rpb246ICdyZWxlYXNlJ30pO1xuICByZXR1cm4gYWN0aW9ucztcbn07XG5cbmhlbHBlcnMucGF0dGVyblVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHBhdHRlcm5VbmxvY2sgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgY29uc3QgeyB1bmxvY2tLZXkgfSA9IGNhcGFiaWxpdGllcztcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBhdHRlcm4gJHt1bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIodW5sb2NrS2V5KTtcbiAgLyogV2Ugc2V0IHRoZSBkZXZpY2UgcGF0dGVybiBidXR0b25zIGFzIG51bWJlciBvZiBhIHJlZ3VsYXIgcGhvbmVcbiAgICogIHwg4oCiIOKAoiDigKIgfCAgICAgfCAxIDIgMyB8XG4gICAqICB8IOKAoiDigKIg4oCiIHwgLS0+IHwgNCA1IDYgfFxuICAgKiAgfCDigKIg4oCiIOKAoiB8ICAgICB8IDcgOCA5IHxcblxuICBUaGUgcGF0dGVybiB2aWV3IGJ1dHRvbnMgYXJlIG5vdCBzZWVpbmcgYnkgdGhlIHVpYXV0b21hdG9yIHNpbmNlIHRoZXkgYXJlXG4gIGluY2x1ZGVkIGluc2lkZSBhIEZyYW1lTGF5b3V0LCBzbyB3ZSBhcmUgZ29pbmcgdG8gdHJ5IGNsaWNraW5nIG9uIHRoZSBidXR0b25zXG4gIHVzaW5nIHRoZSBwYXJlbnQgdmlldyBib3VuZHMgYW5kIG1hdGguXG4gICovXG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgYWRiLmdldEFwaUxldmVsKCk7XG4gIGNvbnN0IGVsID0gYXdhaXQgZHJpdmVyLmZpbmRFbE9yRWxzKCdpZCcsXG4gICAgYGNvbS5hbmRyb2lkLiR7YXBpTGV2ZWwgPj0gMjEgPyAnc3lzdGVtdWknIDogJ2tleWd1YXJkJ306aWQvbG9ja1BhdHRlcm5WaWV3YCxcbiAgICBmYWxzZVxuICApO1xuICBjb25zdCBpbml0UG9zID0gYXdhaXQgZHJpdmVyLmdldExvY2F0aW9uKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICBjb25zdCBzaXplID0gYXdhaXQgZHJpdmVyLmdldFNpemUodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gIC8vIEdldCBhY3Rpb25zIHRvIHBlcmZvcm1cbiAgY29uc3QgYWN0aW9ucyA9IGhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMoa2V5cywgaW5pdFBvcywgc2l6ZS53aWR0aCAvIDMpO1xuICAvLyBQZXJmb3JtIGdlc3R1cmVcbiAgYXdhaXQgZHJpdmVyLnBlcmZvcm1Ub3VjaChhY3Rpb25zKTtcbiAgLy8gV2FpdHMgYSBiaXQgZm9yIHRoZSBkZXZpY2UgdG8gYmUgdW5sb2NrZWRcbiAgYXdhaXQgc2xlZXAoVU5MT0NLX1dBSVRfVElNRSk7XG59O1xuXG5oZWxwZXJzLlBJTl9VTkxPQ0sgPSBQSU5fVU5MT0NLO1xuaGVscGVycy5QSU5fVU5MT0NLX0tFWV9FVkVOVCA9IFBJTl9VTkxPQ0tfS0VZX0VWRU5UO1xuaGVscGVycy5QQVNTV09SRF9VTkxPQ0sgPSBQQVNTV09SRF9VTkxPQ0s7XG5oZWxwZXJzLlBBVFRFUk5fVU5MT0NLID0gUEFUVEVSTl9VTkxPQ0s7XG5oZWxwZXJzLkZJTkdFUlBSSU5UX1VOTE9DSyA9IEZJTkdFUlBSSU5UX1VOTE9DSztcblxuZXhwb3J0IHtcbiAgUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIFBBU1NXT1JEX1VOTE9DSywgUEFUVEVSTl9VTkxPQ0ssXG4gIEZJTkdFUlBSSU5UX1VOTE9DSywgaGVscGVyc1xufTtcbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsVUFBVSxHQUFHLEtBQW5COztBQUNBLE1BQU1DLG9CQUFvQixHQUFHLGlCQUE3Qjs7QUFDQSxNQUFNQyxlQUFlLEdBQUcsVUFBeEI7O0FBQ0EsTUFBTUMsY0FBYyxHQUFHLFNBQXZCOztBQUNBLE1BQU1DLGtCQUFrQixHQUFHLGFBQTNCOztBQUNBLE1BQU1DLFlBQVksR0FBRyxDQUNuQkwsVUFEbUIsRUFDUEMsb0JBRE8sRUFDZUMsZUFEZixFQUVuQkMsY0FGbUIsRUFFSEMsa0JBRkcsQ0FBckI7QUFJQSxNQUFNRSxvQkFBb0IsR0FBRyxFQUE3QjtBQUNBLE1BQU1DLGdCQUFnQixHQUFHLEdBQXpCO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsR0FBN0I7QUFDQSxNQUFNQyxtQkFBbUIsR0FBRyxDQUE1QjtBQUVB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
|
|
244
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQSU5fVU5MT0NLIiwiUElOX1VOTE9DS19LRVlfRVZFTlQiLCJQQVNTV09SRF9VTkxPQ0siLCJQQVRURVJOX1VOTE9DSyIsIkZJTkdFUlBSSU5UX1VOTE9DSyIsIlVOTE9DS19UWVBFUyIsIktFWUNPREVfTlVNUEFEX0VOVEVSIiwiVU5MT0NLX1dBSVRfVElNRSIsIklOUFVUX0tFWVNfV0FJVF9USU1FIiwiTlVNQkVSX1pFUk9fS0VZQ09ERSIsImhlbHBlcnMiLCJ2YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyIsImNhcHMiLCJ1bmxvY2tLZXkiLCJ1bmxvY2tUeXBlIiwiXyIsImlzTmlsIiwiRXJyb3IiLCJpbmNsdWRlcyIsInRlc3QiLCJ0cmltIiwiZmFzdFVubG9jayIsImFkYiIsIm9wdHMiLCJjcmVkZW50aWFsIiwiY3JlZGVudGlhbFR5cGUiLCJsb2dnZXIiLCJpbmZvIiwid2FzTG9ja0VuYWJsZWQiLCJpc0xvY2tFbmFibGVkIiwiY2xlYXJMb2NrQ3JlZGVudGlhbCIsImN5Y2xlV2FrZVVwIiwiZGlzbWlzc0tleWd1YXJkIiwic2V0TG9ja0NyZWRlbnRpYWwiLCJlbmNvZGVQYXNzd29yZCIsImtleSIsInJlcGxhY2UiLCJzdHJpbmdLZXlUb0FyciIsInNwbGl0IiwiZmluZ2VycHJpbnRVbmxvY2siLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJnZXRBcGlMZXZlbCIsImZpbmdlcnByaW50Iiwic2xlZXAiLCJwaW5VbmxvY2siLCJrZXlzIiwiZWxzIiwiZmluZEVsT3JFbHMiLCJpc0VtcHR5IiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGlucyIsImVsIiwidGV4dCIsImdldEF0dHJpYnV0ZSIsInV0aWwiLCJ1bndyYXBFbGVtZW50IiwicGluIiwiY2xpY2siLCJ3YWl0Rm9yVW5sb2NrIiwiaXNTY3JlZW5Mb2NrZWQiLCJrZXlldmVudCIsInNoZWxsIiwicGFyc2VJbnQiLCJwYXNzd29yZFVubG9jayIsImdldFBhdHRlcm5LZXlQb3NpdGlvbiIsImluaXRQb3MiLCJwaWVjZSIsImNvbHMiLCJ4UG9zIiwieCIsIk1hdGgiLCJyb3VuZCIsInlQb3MiLCJ5IiwiY2VpbCIsImdldFBhdHRlcm5BY3Rpb25zIiwiYWN0aW9ucyIsImxhc3RQb3MiLCJrZXlQb3MiLCJwdXNoIiwiYWN0aW9uIiwib3B0aW9ucyIsImVsZW1lbnQiLCJtb3ZlVG8iLCJkaWZmWCIsImFicyIsImRpZmZZIiwicGF0dGVyblVubG9jayIsImFwaUxldmVsIiwiZ2V0TG9jYXRpb24iLCJzaXplIiwiZ2V0U2l6ZSIsIndpZHRoIiwicGVyZm9ybVRvdWNoIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3VubG9jay1oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcblxuY29uc3QgUElOX1VOTE9DSyA9ICdwaW4nO1xuY29uc3QgUElOX1VOTE9DS19LRVlfRVZFTlQgPSAncGluV2l0aEtleUV2ZW50JztcbmNvbnN0IFBBU1NXT1JEX1VOTE9DSyA9ICdwYXNzd29yZCc7XG5jb25zdCBQQVRURVJOX1VOTE9DSyA9ICdwYXR0ZXJuJztcbmNvbnN0IEZJTkdFUlBSSU5UX1VOTE9DSyA9ICdmaW5nZXJwcmludCc7XG5jb25zdCBVTkxPQ0tfVFlQRVMgPSBbXG4gIFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULCBQQVNTV09SRF9VTkxPQ0ssXG4gIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0tcbl07XG5jb25zdCBLRVlDT0RFX05VTVBBRF9FTlRFUiA9IDY2O1xuY29uc3QgVU5MT0NLX1dBSVRfVElNRSA9IDEwMDtcbmNvbnN0IElOUFVUX0tFWVNfV0FJVF9USU1FID0gMTAwO1xuY29uc3QgTlVNQkVSX1pFUk9fS0VZQ09ERSA9IDc7XG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuaGVscGVycy52YWxpZGF0ZVVubG9ja0NhcGFiaWxpdGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzIChjYXBzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tUeXBlLFxuICB9ID0gY2FwcztcbiAgaWYgKF8uaXNOaWwodW5sb2NrS2V5KSB8fCB1bmxvY2tLZXkgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBIG5vbi1lbXB0eSB1bmxvY2sga2V5IHZhbHVlIG11c3QgYmUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChbUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIEZJTkdFUlBSSU5UX1VOTE9DS10uaW5jbHVkZXModW5sb2NrVHlwZSkpIHtcbiAgICBpZiAoIS9eWzAtOV0rJC8udGVzdChfLnRyaW0odW5sb2NrS2V5KSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIGtleSB2YWx1ZSAnJHt1bmxvY2tLZXl9JyBtdXN0IG9ubHkgY29uc2lzdCBvZiBkaWdpdHNgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodW5sb2NrVHlwZSA9PT0gUEFUVEVSTl9VTkxPQ0spIHtcbiAgICBpZiAoIS9eWzEtOV17Miw5fSQvLnRlc3QoXy50cmltKHVubG9ja0tleSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgbXVzdCBvbmx5IGluY2x1ZGUgZnJvbSB0d28gdG8gbmluZSBkaWdpdHMgaW4gcmFuZ2UgMS4uOWApO1xuICAgIH1cbiAgICBpZiAoLyhbMS05XSkuKj9cXDEvLnRlc3QoXy50cmltKHVubG9ja0tleSkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgbXVzdCBkZWZpbmUgYSB2YWxpZCBwYXR0ZXJuIHdoZXJlIHJlcGVhdHMgYXJlIG5vdCBhbGxvd2VkYCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHVubG9ja1R5cGUgPT09IFBBU1NXT1JEX1VOTE9DSykge1xuICAgIC8vIERvbnQgdHJpbSBwYXNzd29yZCBrZXksIHlvdSBjYW4gdXNlIGJsYW5rIHNwYWNlcyBpbiB5b3VyIGFuZHJvaWQgcGFzc3dvcmRcbiAgICAvLyDCr1xcXyjjg4QpXy/Cr1xuICAgIGlmICghLy57NCx9L2cudGVzdCh1bmxvY2tLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBtaW5pbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHVubG9jayBrZXkgdmFsdWUgJyR7dW5sb2NrS2V5fScgaXMgNCBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB1bmxvY2sgdHlwZSAnJHt1bmxvY2tUeXBlfScuIGAgK1xuICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyB1bmxvY2sgdHlwZXMgYXJlIHN1cHBvcnRlZDogJHtVTkxPQ0tfVFlQRVN9YCk7XG4gIH1cbiAgcmV0dXJuIGNhcHM7XG59O1xuXG5oZWxwZXJzLmZhc3RVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBmYXN0VW5sb2NrIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgY3JlZGVudGlhbCxcbiAgICBjcmVkZW50aWFsVHlwZSxcbiAgfSA9IG9wdHM7XG4gIGxvZ2dlci5pbmZvKGBVbmxvY2tpbmcgdGhlIGRldmljZSB2aWEgQURCIHVzaW5nICR7Y3JlZGVudGlhbFR5cGV9IGNyZWRlbnRpYWwgJyR7Y3JlZGVudGlhbH0nYCk7XG4gIGNvbnN0IHdhc0xvY2tFbmFibGVkID0gYXdhaXQgYWRiLmlzTG9ja0VuYWJsZWQoKTtcbiAgaWYgKHdhc0xvY2tFbmFibGVkKSB7XG4gICAgYXdhaXQgYWRiLmNsZWFyTG9ja0NyZWRlbnRpYWwoY3JlZGVudGlhbCk7XG4gICAgLy8gbm90IHN1cmUgd2h5LCBidXQgdGhlIGRldmljZSdzIHNjcmVlbiBzdGlsbCByZW1haW5zIGxvY2tlZFxuICAgIC8vIGlmIGEgcHJlbGltaW5hcnkgd2FrZSB1cCBjeWNsZSBoYXMgbm90IGJlZW4gcGVyZm9ybWVkXG4gICAgYXdhaXQgYWRiLmN5Y2xlV2FrZVVwKCk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLmluZm8oJ05vIGFjdGl2ZSBsb2NrIGhhcyBiZWVuIGRldGVjdGVkLiBQcm9jZWVkaW5nIHRvIHRoZSBrZXlndWFyZCBkaXNtaXNzYWwnKTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAod2FzTG9ja0VuYWJsZWQpIHtcbiAgICAgIGF3YWl0IGFkYi5zZXRMb2NrQ3JlZGVudGlhbChjcmVkZW50aWFsVHlwZSwgY3JlZGVudGlhbCk7XG4gICAgfVxuICB9XG59O1xuXG5oZWxwZXJzLmVuY29kZVBhc3N3b3JkID0gZnVuY3Rpb24gZW5jb2RlUGFzc3dvcmQgKGtleSkge1xuICByZXR1cm4gYCR7a2V5fWAucmVwbGFjZSgvXFxzL2lnLCAnJXMnKTtcbn07XG5cbmhlbHBlcnMuc3RyaW5nS2V5VG9BcnIgPSBmdW5jdGlvbiBzdHJpbmdLZXlUb0FyciAoa2V5KSB7XG4gIHJldHVybiBgJHtrZXl9YC50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnJykuc3BsaXQoL1xccyovKTtcbn07XG5cbmhlbHBlcnMuZmluZ2VycHJpbnRVbmxvY2sgPSBhc3luYyBmdW5jdGlvbiBmaW5nZXJwcmludFVubG9jayAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmluZ2VycHJpbnQgdW5sb2NrIG9ubHkgd29ya3MgZm9yIEFuZHJvaWQgNisgZW11bGF0b3JzJyk7XG4gIH1cbiAgYXdhaXQgYWRiLmZpbmdlcnByaW50KGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbn07XG5cbmhlbHBlcnMucGluVW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gcGluVW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwaW4gJHtjYXBhYmlsaXRpZXMudW5sb2NrS2V5fWApO1xuICBhd2FpdCBhZGIuZGlzbWlzc0tleWd1YXJkKCk7XG4gIGNvbnN0IGtleXMgPSBoZWxwZXJzLnN0cmluZ0tleVRvQXJyKGNhcGFiaWxpdGllcy51bmxvY2tLZXkpO1xuICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPj0gMjEpIHtcbiAgICBjb25zdCBlbHMgPSBhd2FpdCBkcml2ZXIuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLnN5c3RlbXVpOmlkL2RpZ2l0X3RleHQnLCB0cnVlKTtcbiAgICBpZiAoXy5pc0VtcHR5KGVscykpIHtcbiAgICAgIC8vIGZhbGxiYWNrIHRvIHBpbiB3aXRoIGtleSBldmVudFxuICAgICAgcmV0dXJuIGF3YWl0IGhlbHBlcnMucGluVW5sb2NrV2l0aEtleUV2ZW50KGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpO1xuICAgIH1cbiAgICBjb25zdCBwaW5zID0ge307XG4gICAgZm9yIChjb25zdCBlbCBvZiBlbHMpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBkcml2ZXIuZ2V0QXR0cmlidXRlKCd0ZXh0JywgdXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgICBwaW5zW3RleHRdID0gZWw7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGluIG9mIGtleXMpIHtcbiAgICAgIGNvbnN0IGVsID0gcGluc1twaW5dO1xuICAgICAgYXdhaXQgZHJpdmVyLmNsaWNrKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGNvbnN0IHBpbiBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBlbCA9IGF3YWl0IGRyaXZlci5maW5kRWxPckVscygnaWQnLCBgY29tLmFuZHJvaWQua2V5Z3VhcmQ6aWQva2V5JHtwaW59YCwgZmFsc2UpO1xuICAgICAgaWYgKGVsID09PSBudWxsKSB7XG4gICAgICAgIC8vIGZhbGxiYWNrIHRvIHBpbiB3aXRoIGtleSBldmVudFxuICAgICAgICByZXR1cm4gYXdhaXQgaGVscGVycy5waW5VbmxvY2tXaXRoS2V5RXZlbnQoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcyk7XG4gICAgICB9XG4gICAgICBhd2FpdCBkcml2ZXIuY2xpY2sodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiKTtcbn07XG5cbi8qKlxuICogV2FpdCBmb3IgdGhlIGRpc3BsYXkgdG8gYmUgdW5sb2NrZWQuXG4gKiBTb21lIGRldmljZXMgYXV0b21hdGljYWxseSBhY2NlcHQgdHlwZWQgJ3BpbicgYW5kICdwYXNzd29yZCcgY29kZVxuICogd2l0aG91dCBwcmVzc2luZyB0aGUgRW50ZXIga2V5LiBCdXQgc29tZSBkZXZpY2VzIG5lZWQgaXQuXG4gKiBUaGlzIG1ldGhvZCB3YWl0cyBhIGZldyBzZWNvbmRzIGZpcnN0IGZvciBzdWNoIGF1dG9tYXRpYyBhY2NlcHRhbmNlIGNhc2UuXG4gKiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIGxvY2tlZCwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHRyeSB0byBzZW5kXG4gKiB0aGUgZW50ZXIga2V5IGNvZGUuXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBUaGUgaW5zdGFuY2Ugb2YgQURCXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JVbmxvY2sgKGFkYikge1xuICBhd2FpdCBzbGVlcChVTkxPQ0tfV0FJVF9USU1FKTtcbiAgaWYgKCFhd2FpdCBhZGIuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGF3YWl0IGFkYi5rZXlldmVudChLRVlDT0RFX05VTVBBRF9FTlRFUik7XG4gIGF3YWl0IHNsZWVwKFVOTE9DS19XQUlUX1RJTUUpO1xufVxuXG5oZWxwZXJzLnBpblVubG9ja1dpdGhLZXlFdmVudCA9IGFzeW5jIGZ1bmN0aW9uIHBpblVubG9ja1dpdGhLZXlFdmVudCAoYWRiLCBkcml2ZXIsIGNhcGFiaWxpdGllcykge1xuICBsb2dnZXIuaW5mbyhgVHJ5aW5nIHRvIHVubG9jayBkZXZpY2UgdXNpbmcgcGluIHdpdGgga2V5Y29kZSAke2NhcGFiaWxpdGllcy51bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIoY2FwYWJpbGl0aWVzLnVubG9ja0tleSk7XG5cbiAgLy8gU29tZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBzeXN0ZW0ga2V5IGlkcyBsaWtlICdjb20uYW5kcm9pZC5rZXlndWFyZDppZC9rZXknXG4gIC8vIFRoZW4sIHNlbmRpbmcga2V5ZXZlbnRzIGFyZSBtb3JlIHJlbGlhYmxlIHRvIHVubG9jayB0aGUgc2NyZWVuLlxuICBmb3IgKGNvbnN0IHBpbiBvZiBrZXlzKSB7XG4gICAgLy8gJ3BpbicgaXMgbnVtYmVyICgwLTkpIGluIHN0cmluZy5cbiAgICAvLyBOdW1iZXIgJzAnIGlzIGtleWNvZGUgJzcnLiBudW1iZXIgJzknIGlzIGtleWNvZGUgJzE2Jy5cbiAgICBhd2FpdCBhZGIuc2hlbGwoWydpbnB1dCcsICdrZXlldmVudCcsIHBhcnNlSW50KHBpbiwgMTApICsgTlVNQkVSX1pFUk9fS0VZQ09ERV0pO1xuICB9XG4gIGF3YWl0IHdhaXRGb3JVbmxvY2soYWRiLCBkcml2ZXIpO1xufTtcblxuaGVscGVycy5wYXNzd29yZFVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHBhc3N3b3JkVW5sb2NrIChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKSB7XG4gIGNvbnN0IHsgdW5sb2NrS2V5IH0gPSBjYXBhYmlsaXRpZXM7XG4gIGxvZ2dlci5pbmZvKGBUcnlpbmcgdG8gdW5sb2NrIGRldmljZSB1c2luZyBwYXNzd29yZCAke3VubG9ja0tleX1gKTtcbiAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICAvLyBSZXBsYWNlIGJsYW5rIHNwYWNlcyB3aXRoICVzXG4gIGNvbnN0IGtleSA9IGhlbHBlcnMuZW5jb2RlUGFzc3dvcmQodW5sb2NrS2V5KTtcbiAgLy8gV2h5IGFkYiA/IEl0IHdhcyBsZXNzIGZsYWt5XG4gIGF3YWl0IGFkYi5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCBrZXldKTtcbiAgLy8gV2h5IHNsZWVwcyA/IEF2b2lkIHNvbWUgZmxha3luZXNzIHdhaXRpbmcgZm9yIHRoZSBpbnB1dCB0byByZWNlaXZlIHRoZSBrZXlzXG4gIGF3YWl0IHNsZWVwKElOUFVUX0tFWVNfV0FJVF9USU1FKTtcbiAgYXdhaXQgYWRiLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBLRVlDT0RFX05VTVBBRF9FTlRFUl0pO1xuICAvLyBXYWl0cyBhIGJpdCBmb3IgdGhlIGRldmljZSB0byBiZSB1bmxvY2tlZFxuICBhd2FpdCB3YWl0Rm9yVW5sb2NrKGFkYiwgZHJpdmVyKTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybktleVBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0UGF0dGVybktleVBvc2l0aW9uIChrZXksIGluaXRQb3MsIHBpZWNlKSB7XG4gIC8qXG4gIEhvdyB0aGUgbWF0aCB3b3JrczpcbiAgV2UgaGF2ZSA5IGJ1dHRvbnMgZGl2aWRlZCBpbiAzIGNvbHVtbnMgYW5kIDMgcm93cyBpbnNpZGUgdGhlIGxvY2tQYXR0ZXJuVmlldyxcbiAgZXZlcnkgYnV0dG9uIGhhcyBhIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4gY29ycmVzcG9uZGluZyB0byB0aGUgbG9ja1BhdHRlcm5WaWV3IHNpbmNlXG4gIGl0IGlzIHRoZSBwYXJlbnQgdmlldyByaWdodCBhdCB0aGUgbWlkZGxlIG9mIGVhY2ggY29sdW1uIG9yIHJvdy5cbiAgKi9cbiAgY29uc3QgY29scyA9IDM7XG4gIGNvbnN0IHBpbnMgPSA5O1xuICBjb25zdCB4UG9zID0gKGtleSwgeCwgcGllY2UpID0+IE1hdGgucm91bmQoeCArICgoa2V5ICUgY29scykgfHwgY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMik7XG4gIGNvbnN0IHlQb3MgPSAoa2V5LCB5LCBwaWVjZSkgPT4gTWF0aC5yb3VuZCh5ICsgKE1hdGguY2VpbCgoKGtleSAlIHBpbnMpIHx8IHBpbnMpIC8gY29scykgKiBwaWVjZSAtIHBpZWNlIC8gMikpO1xuICByZXR1cm4ge1xuICAgIHg6IHhQb3Moa2V5LCBpbml0UG9zLngsIHBpZWNlKSxcbiAgICB5OiB5UG9zKGtleSwgaW5pdFBvcy55LCBwaWVjZSlcbiAgfTtcbn07XG5cbmhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMgPSBmdW5jdGlvbiBnZXRQYXR0ZXJuQWN0aW9ucyAoa2V5cywgaW5pdFBvcywgcGllY2UpIHtcbiAgY29uc3QgYWN0aW9ucyA9IFtdO1xuICBsZXQgbGFzdFBvcztcbiAgZm9yIChsZXQga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCBrZXlQb3MgPSBoZWxwZXJzLmdldFBhdHRlcm5LZXlQb3NpdGlvbihrZXksIGluaXRQb3MsIHBpZWNlKTtcbiAgICBpZiAoa2V5ID09PSBrZXlzWzBdKSB7XG4gICAgICBhY3Rpb25zLnB1c2goe2FjdGlvbjogJ3ByZXNzJywgb3B0aW9uczoge2VsZW1lbnQ6IG51bGwsIHg6IGtleVBvcy54LCB5OiBrZXlQb3MueX19KTtcbiAgICAgIGxhc3RQb3MgPSBrZXlQb3M7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbW92ZVRvID0ge3g6IDAsIHk6IDB9O1xuICAgIGNvbnN0IGRpZmZYID0ga2V5UG9zLnggLSBsYXN0UG9zLng7XG4gICAgaWYgKGRpZmZYID4gMCkge1xuICAgICAgbW92ZVRvLnggPSBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWCkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueCArPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRpZmZYIDwgMCkge1xuICAgICAgbW92ZVRvLnggPSAtMSAqIHBpZWNlO1xuICAgICAgaWYgKE1hdGguYWJzKGRpZmZYKSA+IHBpZWNlKSB7XG4gICAgICAgIG1vdmVUby54IC09IHBpZWNlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkaWZmWSA9IGtleVBvcy55IC0gbGFzdFBvcy55O1xuICAgIGlmIChkaWZmWSA+IDApIHtcbiAgICAgIG1vdmVUby55ID0gcGllY2U7XG4gICAgICBpZiAoTWF0aC5hYnMoZGlmZlkpID4gcGllY2UpIHtcbiAgICAgICAgbW92ZVRvLnkgKz0gcGllY2U7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkaWZmWSA8IDApIHtcbiAgICAgIG1vdmVUby55ID0gLTEgKiBwaWVjZTtcbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWSkgPiBwaWVjZSkge1xuICAgICAgICBtb3ZlVG8ueSAtPSBwaWVjZTtcbiAgICAgIH1cbiAgICB9XG4gICAgYWN0aW9ucy5wdXNoKHtcbiAgICAgIGFjdGlvbjogJ21vdmVUbycsXG4gICAgICBvcHRpb25zOiB7ZWxlbWVudDogbnVsbCwgeDogbW92ZVRvLnggKyBsYXN0UG9zLngsIHk6IG1vdmVUby55ICsgbGFzdFBvcy55fVxuICAgIH0pO1xuICAgIGxhc3RQb3MgPSBrZXlQb3M7XG4gIH1cbiAgYWN0aW9ucy5wdXNoKHthY3Rpb246ICdyZWxlYXNlJ30pO1xuICByZXR1cm4gYWN0aW9ucztcbn07XG5cbmhlbHBlcnMucGF0dGVyblVubG9jayA9IGFzeW5jIGZ1bmN0aW9uIHBhdHRlcm5VbmxvY2sgKGFkYiwgZHJpdmVyLCBjYXBhYmlsaXRpZXMpIHtcbiAgY29uc3QgeyB1bmxvY2tLZXkgfSA9IGNhcGFiaWxpdGllcztcbiAgbG9nZ2VyLmluZm8oYFRyeWluZyB0byB1bmxvY2sgZGV2aWNlIHVzaW5nIHBhdHRlcm4gJHt1bmxvY2tLZXl9YCk7XG4gIGF3YWl0IGFkYi5kaXNtaXNzS2V5Z3VhcmQoKTtcbiAgY29uc3Qga2V5cyA9IGhlbHBlcnMuc3RyaW5nS2V5VG9BcnIodW5sb2NrS2V5KTtcbiAgLyogV2Ugc2V0IHRoZSBkZXZpY2UgcGF0dGVybiBidXR0b25zIGFzIG51bWJlciBvZiBhIHJlZ3VsYXIgcGhvbmVcbiAgICogIHwg4oCiIOKAoiDigKIgfCAgICAgfCAxIDIgMyB8XG4gICAqICB8IOKAoiDigKIg4oCiIHwgLS0+IHwgNCA1IDYgfFxuICAgKiAgfCDigKIg4oCiIOKAoiB8ICAgICB8IDcgOCA5IHxcblxuICBUaGUgcGF0dGVybiB2aWV3IGJ1dHRvbnMgYXJlIG5vdCBzZWVpbmcgYnkgdGhlIHVpYXV0b21hdG9yIHNpbmNlIHRoZXkgYXJlXG4gIGluY2x1ZGVkIGluc2lkZSBhIEZyYW1lTGF5b3V0LCBzbyB3ZSBhcmUgZ29pbmcgdG8gdHJ5IGNsaWNraW5nIG9uIHRoZSBidXR0b25zXG4gIHVzaW5nIHRoZSBwYXJlbnQgdmlldyBib3VuZHMgYW5kIG1hdGguXG4gICovXG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgYWRiLmdldEFwaUxldmVsKCk7XG4gIGNvbnN0IGVsID0gYXdhaXQgZHJpdmVyLmZpbmRFbE9yRWxzKCdpZCcsXG4gICAgYGNvbS5hbmRyb2lkLiR7YXBpTGV2ZWwgPj0gMjEgPyAnc3lzdGVtdWknIDogJ2tleWd1YXJkJ306aWQvbG9ja1BhdHRlcm5WaWV3YCxcbiAgICBmYWxzZVxuICApO1xuICBjb25zdCBpbml0UG9zID0gYXdhaXQgZHJpdmVyLmdldExvY2F0aW9uKHV0aWwudW53cmFwRWxlbWVudChlbCkpO1xuICBjb25zdCBzaXplID0gYXdhaXQgZHJpdmVyLmdldFNpemUodXRpbC51bndyYXBFbGVtZW50KGVsKSk7XG4gIC8vIEdldCBhY3Rpb25zIHRvIHBlcmZvcm1cbiAgY29uc3QgYWN0aW9ucyA9IGhlbHBlcnMuZ2V0UGF0dGVybkFjdGlvbnMoa2V5cywgaW5pdFBvcywgc2l6ZS53aWR0aCAvIDMpO1xuICAvLyBQZXJmb3JtIGdlc3R1cmVcbiAgYXdhaXQgZHJpdmVyLnBlcmZvcm1Ub3VjaChhY3Rpb25zKTtcbiAgLy8gV2FpdHMgYSBiaXQgZm9yIHRoZSBkZXZpY2UgdG8gYmUgdW5sb2NrZWRcbiAgYXdhaXQgc2xlZXAoVU5MT0NLX1dBSVRfVElNRSk7XG59O1xuXG5oZWxwZXJzLlBJTl9VTkxPQ0sgPSBQSU5fVU5MT0NLO1xuaGVscGVycy5QSU5fVU5MT0NLX0tFWV9FVkVOVCA9IFBJTl9VTkxPQ0tfS0VZX0VWRU5UO1xuaGVscGVycy5QQVNTV09SRF9VTkxPQ0sgPSBQQVNTV09SRF9VTkxPQ0s7XG5oZWxwZXJzLlBBVFRFUk5fVU5MT0NLID0gUEFUVEVSTl9VTkxPQ0s7XG5oZWxwZXJzLkZJTkdFUlBSSU5UX1VOTE9DSyA9IEZJTkdFUlBSSU5UX1VOTE9DSztcblxuZXhwb3J0IHtcbiAgUElOX1VOTE9DSywgUElOX1VOTE9DS19LRVlfRVZFTlQsIFBBU1NXT1JEX1VOTE9DSywgUEFUVEVSTl9VTkxPQ0ssXG4gIEZJTkdFUlBSSU5UX1VOTE9DSywgaGVscGVyc1xufTtcbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxVQUFVLEdBQUcsS0FBSztBQUFDO0FBQ3pCLE1BQU1DLG9CQUFvQixHQUFHLGlCQUFpQjtBQUFDO0FBQy9DLE1BQU1DLGVBQWUsR0FBRyxVQUFVO0FBQUM7QUFDbkMsTUFBTUMsY0FBYyxHQUFHLFNBQVM7QUFBQztBQUNqQyxNQUFNQyxrQkFBa0IsR0FBRyxhQUFhO0FBQUM7QUFDekMsTUFBTUMsWUFBWSxHQUFHLENBQ25CTCxVQUFVLEVBQUVDLG9CQUFvQixFQUFFQyxlQUFlLEVBQ2pEQyxjQUFjLEVBQUVDLGtCQUFrQixDQUNuQztBQUNELE1BQU1FLG9CQUFvQixHQUFHLEVBQUU7QUFDL0IsTUFBTUMsZ0JBQWdCLEdBQUcsR0FBRztBQUM1QixNQUFNQyxvQkFBb0IsR0FBRyxHQUFHO0FBQ2hDLE1BQU1DLG1CQUFtQixHQUFHLENBQUM7QUFFN0IsTUFBTUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUFDO0FBRW5CQSxPQUFPLENBQUNDLDBCQUEwQixHQUFHLFNBQVNBLDBCQUEwQixDQUFFQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDbkYsTUFBTTtJQUNKQyxTQUFTO0lBQ1RDO0VBQ0YsQ0FBQyxHQUFHRixJQUFJO0VBQ1IsSUFBSUcsZUFBQyxDQUFDQyxLQUFLLENBQUNILFNBQVMsQ0FBQyxJQUFJQSxTQUFTLEtBQUssRUFBRSxFQUFFO0lBQzFDLE1BQU0sSUFBSUksS0FBSyxDQUFDLCtDQUErQyxDQUFDO0VBQ2xFO0VBRUEsSUFBSSxDQUFDakIsVUFBVSxFQUFFQyxvQkFBb0IsRUFBRUcsa0JBQWtCLENBQUMsQ0FBQ2MsUUFBUSxDQUFDSixVQUFVLENBQUMsRUFBRTtJQUMvRSxJQUFJLENBQUMsVUFBVSxDQUFDSyxJQUFJLENBQUNKLGVBQUMsQ0FBQ0ssSUFBSSxDQUFDUCxTQUFTLENBQUMsQ0FBQyxFQUFFO01BQ3ZDLE1BQU0sSUFBSUksS0FBSyxDQUFFLHFCQUFvQkosU0FBVSwrQkFBOEIsQ0FBQztJQUNoRjtFQUNGLENBQUMsTUFBTSxJQUFJQyxVQUFVLEtBQUtYLGNBQWMsRUFBRTtJQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDZ0IsSUFBSSxDQUFDSixlQUFDLENBQUNLLElBQUksQ0FBQ1AsU0FBUyxDQUFDLENBQUMsRUFBRTtNQUMzQyxNQUFNLElBQUlJLEtBQUssQ0FBRSxxQkFBb0JKLFNBQVUsMkRBQTBELENBQUM7SUFDNUc7SUFDQSxJQUFJLGNBQWMsQ0FBQ00sSUFBSSxDQUFDSixlQUFDLENBQUNLLElBQUksQ0FBQ1AsU0FBUyxDQUFDLENBQUMsRUFBRTtNQUMxQyxNQUFNLElBQUlJLEtBQUssQ0FBRSxxQkFBb0JKLFNBQVUsNkRBQTRELENBQUM7SUFDOUc7RUFDRixDQUFDLE1BQU0sSUFBSUMsVUFBVSxLQUFLWixlQUFlLEVBQUU7SUFHekMsSUFBSSxDQUFDLFFBQVEsQ0FBQ2lCLElBQUksQ0FBQ04sU0FBUyxDQUFDLEVBQUU7TUFDN0IsTUFBTSxJQUFJSSxLQUFLLENBQUUsbURBQWtESixTQUFVLG1CQUFrQixDQUFDO0lBQ2xHO0VBQ0YsQ0FBQyxNQUFNO0lBQ0wsTUFBTSxJQUFJSSxLQUFLLENBQUUsd0JBQXVCSCxVQUFXLEtBQUksR0FDcEQsa0RBQWlEVCxZQUFhLEVBQUMsQ0FBQztFQUNyRTtFQUNBLE9BQU9PLElBQUk7QUFDYixDQUFDO0FBRURGLE9BQU8sQ0FBQ1csVUFBVSxHQUFHLGVBQWVBLFVBQVUsQ0FBRUMsR0FBRyxFQUFFQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDOUQsTUFBTTtJQUNKQyxVQUFVO0lBQ1ZDO0VBQ0YsQ0FBQyxHQUFHRixJQUFJO0VBQ1JHLGVBQU0sQ0FBQ0MsSUFBSSxDQUFFLHNDQUFxQ0YsY0FBZSxnQkFBZUQsVUFBVyxHQUFFLENBQUM7RUFDOUYsTUFBTUksY0FBYyxHQUFHLE1BQU1OLEdBQUcsQ0FBQ08sYUFBYSxFQUFFO0VBQ2hELElBQUlELGNBQWMsRUFBRTtJQUNsQixNQUFNTixHQUFHLENBQUNRLG1CQUFtQixDQUFDTixVQUFVLENBQUM7SUFHekMsTUFBTUYsR0FBRyxDQUFDUyxXQUFXLEVBQUU7RUFDekIsQ0FBQyxNQUFNO0lBQ0xMLGVBQU0sQ0FBQ0MsSUFBSSxDQUFDLHdFQUF3RSxDQUFDO0VBQ3ZGO0VBQ0EsSUFBSTtJQUNGLE1BQU1MLEdBQUcsQ0FBQ1UsZUFBZSxFQUFFO0VBQzdCLENBQUMsU0FBUztJQUNSLElBQUlKLGNBQWMsRUFBRTtNQUNsQixNQUFNTixHQUFHLENBQUNXLGlCQUFpQixDQUFDUixjQUFjLEVBQUVELFVBQVUsQ0FBQztJQUN6RDtFQUNGO0FBQ0YsQ0FBQztBQUVEZCxPQUFPLENBQUN3QixjQUFjLEdBQUcsU0FBU0EsY0FBYyxDQUFFQyxHQUFHLEVBQUU7RUFDckQsT0FBUSxHQUFFQSxHQUFJLEVBQUMsQ0FBQ0MsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7QUFDdkMsQ0FBQztBQUVEMUIsT0FBTyxDQUFDMkIsY0FBYyxHQUFHLFNBQVNBLGNBQWMsQ0FBRUYsR0FBRyxFQUFFO0VBQ3JELE9BQVEsR0FBRUEsR0FBSSxFQUFDLENBQUNmLElBQUksRUFBRSxDQUFDZ0IsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQ0UsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUN6RCxDQUFDO0FBRUQ1QixPQUFPLENBQUM2QixpQkFBaUIsR0FBRyxlQUFlQSxpQkFBaUIsQ0FBRWpCLEdBQUcsRUFBRWtCLE1BQU0sRUFBRUMsWUFBWSxFQUFFO0VBQ3ZGLElBQUksT0FBTW5CLEdBQUcsQ0FBQ29CLFdBQVcsRUFBRSxJQUFHLEVBQUUsRUFBRTtJQUNoQyxNQUFNLElBQUl6QixLQUFLLENBQUMsd0RBQXdELENBQUM7RUFDM0U7RUFDQSxNQUFNSyxHQUFHLENBQUNxQixXQUFXLENBQUNGLFlBQVksQ0FBQzVCLFNBQVMsQ0FBQztFQUM3QyxNQUFNLElBQUErQixlQUFLLEVBQUNyQyxnQkFBZ0IsQ0FBQztBQUMvQixDQUFDO0FBRURHLE9BQU8sQ0FBQ21DLFNBQVMsR0FBRyxlQUFlQSxTQUFTLENBQUV2QixHQUFHLEVBQUVrQixNQUFNLEVBQUVDLFlBQVksRUFBRTtFQUN2RWYsZUFBTSxDQUFDQyxJQUFJLENBQUUscUNBQW9DYyxZQUFZLENBQUM1QixTQUFVLEVBQUMsQ0FBQztFQUMxRSxNQUFNUyxHQUFHLENBQUNVLGVBQWUsRUFBRTtFQUMzQixNQUFNYyxJQUFJLEdBQUdwQyxPQUFPLENBQUMyQixjQUFjLENBQUNJLFlBQVksQ0FBQzVCLFNBQVMsQ0FBQztFQUMzRCxJQUFJLE9BQU1TLEdBQUcsQ0FBQ29CLFdBQVcsRUFBRSxLQUFJLEVBQUUsRUFBRTtJQUNqQyxNQUFNSyxHQUFHLEdBQUcsTUFBTVAsTUFBTSxDQUFDUSxXQUFXLENBQUMsSUFBSSxFQUFFLG9DQUFvQyxFQUFFLElBQUksQ0FBQztJQUN0RixJQUFJakMsZUFBQyxDQUFDa0MsT0FBTyxDQUFDRixHQUFHLENBQUMsRUFBRTtNQUVsQixPQUFPLE1BQU1yQyxPQUFPLENBQUN3QyxxQkFBcUIsQ0FBQzVCLEdBQUcsRUFBRWtCLE1BQU0sRUFBRUMsWUFBWSxDQUFDO0lBQ3ZFO0lBQ0EsTUFBTVUsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNmLEtBQUssTUFBTUMsRUFBRSxJQUFJTCxHQUFHLEVBQUU7TUFDcEIsTUFBTU0sSUFBSSxHQUFHLE1BQU1iLE1BQU0sQ0FBQ2MsWUFBWSxDQUFDLE1BQU0sRUFBRUMsYUFBSSxDQUFDQyxhQUFhLENBQUNKLEVBQUUsQ0FBQyxDQUFDO01BQ3RFRCxJQUFJLENBQUNFLElBQUksQ0FBQyxHQUFHRCxFQUFFO0lBQ2pCO0lBQ0EsS0FBSyxNQUFNSyxHQUFHLElBQUlYLElBQUksRUFBRTtNQUN0QixNQUFNTSxFQUFFLEdBQUdELElBQUksQ0FBQ00sR0FBRyxDQUFDO01BQ3BCLE1BQU1qQixNQUFNLENBQUNrQixLQUFLLENBQUNILGFBQUksQ0FBQ0MsYUFBYSxDQUFDSixFQUFFLENBQUMsQ0FBQztJQUM1QztFQUNGLENBQUMsTUFBTTtJQUNMLEtBQUssTUFBTUssR0FBRyxJQUFJWCxJQUFJLEVBQUU7TUFDdEIsTUFBTU0sRUFBRSxHQUFHLE1BQU1aLE1BQU0sQ0FBQ1EsV0FBVyxDQUFDLElBQUksRUFBRyw4QkFBNkJTLEdBQUksRUFBQyxFQUFFLEtBQUssQ0FBQztNQUNyRixJQUFJTCxFQUFFLEtBQUssSUFBSSxFQUFFO1FBRWYsT0FBTyxNQUFNMUMsT0FBTyxDQUFDd0MscUJBQXFCLENBQUM1QixHQUFHLEVBQUVrQixNQUFNLEVBQUVDLFlBQVksQ0FBQztNQUN2RTtNQUNBLE1BQU1ELE1BQU0sQ0FBQ2tCLEtBQUssQ0FBQ0gsYUFBSSxDQUFDQyxhQUFhLENBQUNKLEVBQUUsQ0FBQyxDQUFDO0lBQzVDO0VBQ0Y7RUFDQSxNQUFNTyxhQUFhLENBQUNyQyxHQUFHLENBQUM7QUFDMUIsQ0FBQzs7QUFZRCxlQUFlcUMsYUFBYSxDQUFFckMsR0FBRyxFQUFFO0VBQ2pDLE1BQU0sSUFBQXNCLGVBQUssRUFBQ3JDLGdCQUFnQixDQUFDO0VBQzdCLElBQUksRUFBQyxNQUFNZSxHQUFHLENBQUNzQyxjQUFjLEVBQUUsR0FBRTtJQUMvQjtFQUNGO0VBRUEsTUFBTXRDLEdBQUcsQ0FBQ3VDLFFBQVEsQ0FBQ3ZELG9CQUFvQixDQUFDO0VBQ3hDLE1BQU0sSUFBQXNDLGVBQUssRUFBQ3JDLGdCQUFnQixDQUFDO0FBQy9CO0FBRUFHLE9BQU8sQ0FBQ3dDLHFCQUFxQixHQUFHLGVBQWVBLHFCQUFxQixDQUFFNUIsR0FBRyxFQUFFa0IsTUFBTSxFQUFFQyxZQUFZLEVBQUU7RUFDL0ZmLGVBQU0sQ0FBQ0MsSUFBSSxDQUFFLGtEQUFpRGMsWUFBWSxDQUFDNUIsU0FBVSxFQUFDLENBQUM7RUFDdkYsTUFBTVMsR0FBRyxDQUFDVSxlQUFlLEVBQUU7RUFDM0IsTUFBTWMsSUFBSSxHQUFHcEMsT0FBTyxDQUFDMkIsY0FBYyxDQUFDSSxZQUFZLENBQUM1QixTQUFTLENBQUM7O0VBSTNELEtBQUssTUFBTTRDLEdBQUcsSUFBSVgsSUFBSSxFQUFFO0lBR3RCLE1BQU14QixHQUFHLENBQUN3QyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFQyxRQUFRLENBQUNOLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBR2hELG1CQUFtQixDQUFDLENBQUM7RUFDakY7RUFDQSxNQUFNa0QsYUFBYSxDQUFDckMsR0FBRyxFQUFFa0IsTUFBTSxDQUFDO0FBQ2xDLENBQUM7QUFFRDlCLE9BQU8sQ0FBQ3NELGNBQWMsR0FBRyxlQUFlQSxjQUFjLENBQUUxQyxHQUFHLEVBQUVrQixNQUFNLEVBQUVDLFlBQVksRUFBRTtFQUNqRixNQUFNO0lBQUU1QjtFQUFVLENBQUMsR0FBRzRCLFlBQVk7RUFDbENmLGVBQU0sQ0FBQ0MsSUFBSSxDQUFFLDBDQUF5Q2QsU0FBVSxFQUFDLENBQUM7RUFDbEUsTUFBTVMsR0FBRyxDQUFDVSxlQUFlLEVBQUU7RUFFM0IsTUFBTUcsR0FBRyxHQUFHekIsT0FBTyxDQUFDd0IsY0FBYyxDQUFDckIsU0FBUyxDQUFDO0VBRTdDLE1BQU1TLEdBQUcsQ0FBQ3dDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUzQixHQUFHLENBQUMsQ0FBQztFQUV2QyxNQUFNLElBQUFTLGVBQUssRUFBQ3BDLG9CQUFvQixDQUFDO0VBQ2pDLE1BQU1jLEdBQUcsQ0FBQ3dDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUV4RCxvQkFBb0IsQ0FBQyxDQUFDO0VBRTVELE1BQU1xRCxhQUFhLENBQUNyQyxHQUFHLEVBQUVrQixNQUFNLENBQUM7QUFDbEMsQ0FBQztBQUVEOUIsT0FBTyxDQUFDdUQscUJBQXFCLEdBQUcsU0FBU0EscUJBQXFCLENBQUU5QixHQUFHLEVBQUUrQixPQUFPLEVBQUVDLEtBQUssRUFBRTtFQU9uRixNQUFNQyxJQUFJLEdBQUcsQ0FBQztFQUNkLE1BQU1qQixJQUFJLEdBQUcsQ0FBQztFQUNkLE1BQU1rQixJQUFJLEdBQUcsQ0FBQ2xDLEdBQUcsRUFBRW1DLENBQUMsRUFBRUgsS0FBSyxLQUFLSSxJQUFJLENBQUNDLEtBQUssQ0FBQ0YsQ0FBQyxHQUFHLENBQUVuQyxHQUFHLEdBQUdpQyxJQUFJLElBQUtBLElBQUksSUFBSUQsS0FBSyxHQUFHQSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0VBQzFGLE1BQU1NLElBQUksR0FBRyxDQUFDdEMsR0FBRyxFQUFFdUMsQ0FBQyxFQUFFUCxLQUFLLEtBQUtJLElBQUksQ0FBQ0MsS0FBSyxDQUFDRSxDQUFDLElBQUlILElBQUksQ0FBQ0ksSUFBSSxDQUFDLENBQUV4QyxHQUFHLEdBQUdnQixJQUFJLElBQUtBLElBQUksSUFBSWlCLElBQUksQ0FBQyxHQUFHRCxLQUFLLEdBQUdBLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztFQUM5RyxPQUFPO0lBQ0xHLENBQUMsRUFBRUQsSUFBSSxDQUFDbEMsR0FBRyxFQUFFK0IsT0FBTyxDQUFDSSxDQUFDLEVBQUVILEtBQUssQ0FBQztJQUM5Qk8sQ0FBQyxFQUFFRCxJQUFJLENBQUN0QyxHQUFHLEVBQUUrQixPQUFPLENBQUNRLENBQUMsRUFBRVAsS0FBSztFQUMvQixDQUFDO0FBQ0gsQ0FBQztBQUVEekQsT0FBTyxDQUFDa0UsaUJBQWlCLEdBQUcsU0FBU0EsaUJBQWlCLENBQUU5QixJQUFJLEVBQUVvQixPQUFPLEVBQUVDLEtBQUssRUFBRTtFQUM1RSxNQUFNVSxPQUFPLEdBQUcsRUFBRTtFQUNsQixJQUFJQyxPQUFPO0VBQ1gsS0FBSyxJQUFJM0MsR0FBRyxJQUFJVyxJQUFJLEVBQUU7SUFDcEIsTUFBTWlDLE1BQU0sR0FBR3JFLE9BQU8sQ0FBQ3VELHFCQUFxQixDQUFDOUIsR0FBRyxFQUFFK0IsT0FBTyxFQUFFQyxLQUFLLENBQUM7SUFDakUsSUFBSWhDLEdBQUcsS0FBS1csSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO01BQ25CK0IsT0FBTyxDQUFDRyxJQUFJLENBQUM7UUFBQ0MsTUFBTSxFQUFFLE9BQU87UUFBRUMsT0FBTyxFQUFFO1VBQUNDLE9BQU8sRUFBRSxJQUFJO1VBQUViLENBQUMsRUFBRVMsTUFBTSxDQUFDVCxDQUFDO1VBQUVJLENBQUMsRUFBRUssTUFBTSxDQUFDTDtRQUFDO01BQUMsQ0FBQyxDQUFDO01BQ25GSSxPQUFPLEdBQUdDLE1BQU07TUFDaEI7SUFDRjtJQUNBLE1BQU1LLE1BQU0sR0FBRztNQUFDZCxDQUFDLEVBQUUsQ0FBQztNQUFFSSxDQUFDLEVBQUU7SUFBQyxDQUFDO0lBQzNCLE1BQU1XLEtBQUssR0FBR04sTUFBTSxDQUFDVCxDQUFDLEdBQUdRLE9BQU8sQ0FBQ1IsQ0FBQztJQUNsQyxJQUFJZSxLQUFLLEdBQUcsQ0FBQyxFQUFFO01BQ2JELE1BQU0sQ0FBQ2QsQ0FBQyxHQUFHSCxLQUFLO01BQ2hCLElBQUlJLElBQUksQ0FBQ2UsR0FBRyxDQUFDRCxLQUFLLENBQUMsR0FBR2xCLEtBQUssRUFBRTtRQUMzQmlCLE1BQU0sQ0FBQ2QsQ0FBQyxJQUFJSCxLQUFLO01BQ25CO0lBQ0YsQ0FBQyxNQUFNLElBQUlrQixLQUFLLEdBQUcsQ0FBQyxFQUFFO01BQ3BCRCxNQUFNLENBQUNkLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBR0gsS0FBSztNQUNyQixJQUFJSSxJQUFJLENBQUNlLEdBQUcsQ0FBQ0QsS0FBSyxDQUFDLEdBQUdsQixLQUFLLEVBQUU7UUFDM0JpQixNQUFNLENBQUNkLENBQUMsSUFBSUgsS0FBSztNQUNuQjtJQUNGO0lBQ0EsTUFBTW9CLEtBQUssR0FBR1IsTUFBTSxDQUFDTCxDQUFDLEdBQUdJLE9BQU8sQ0FBQ0osQ0FBQztJQUNsQyxJQUFJYSxLQUFLLEdBQUcsQ0FBQyxFQUFFO01BQ2JILE1BQU0sQ0FBQ1YsQ0FBQyxHQUFHUCxLQUFLO01BQ2hCLElBQUlJLElBQUksQ0FBQ2UsR0FBRyxDQUFDQyxLQUFLLENBQUMsR0FBR3BCLEtBQUssRUFBRTtRQUMzQmlCLE1BQU0sQ0FBQ1YsQ0FBQyxJQUFJUCxLQUFLO01BQ25CO0lBQ0YsQ0FBQyxNQUFNLElBQUlvQixLQUFLLEdBQUcsQ0FBQyxFQUFFO01BQ3BCSCxNQUFNLENBQUNWLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBR1AsS0FBSztNQUNyQixJQUFJSSxJQUFJLENBQUNlLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDLEdBQUdwQixLQUFLLEVBQUU7UUFDM0JpQixNQUFNLENBQUNWLENBQUMsSUFBSVAsS0FBSztNQUNuQjtJQUNGO0lBQ0FVLE9BQU8sQ0FBQ0csSUFBSSxDQUFDO01BQ1hDLE1BQU0sRUFBRSxRQUFRO01BQ2hCQyxPQUFPLEVBQUU7UUFBQ0MsT0FBTyxFQUFFLElBQUk7UUFBRWIsQ0FBQyxFQUFFYyxNQUFNLENBQUNkLENBQUMsR0FBR1EsT0FBTyxDQUFDUixDQUFDO1FBQUVJLENBQUMsRUFBRVUsTUFBTSxDQUFDVixDQUFDLEdBQUdJLE9BQU8sQ0FBQ0o7TUFBQztJQUMzRSxDQUFDLENBQUM7SUFDRkksT0FBTyxHQUFHQyxNQUFNO0VBQ2xCO0VBQ0FGLE9BQU8sQ0FBQ0csSUFBSSxDQUFDO0lBQUNDLE1BQU0sRUFBRTtFQUFTLENBQUMsQ0FBQztFQUNqQyxPQUFPSixPQUFPO0FBQ2hCLENBQUM7QUFFRG5FLE9BQU8sQ0FBQzhFLGFBQWEsR0FBRyxlQUFlQSxhQUFhLENBQUVsRSxHQUFHLEVBQUVrQixNQUFNLEVBQUVDLFlBQVksRUFBRTtFQUMvRSxNQUFNO0lBQUU1QjtFQUFVLENBQUMsR0FBRzRCLFlBQVk7RUFDbENmLGVBQU0sQ0FBQ0MsSUFBSSxDQUFFLHlDQUF3Q2QsU0FBVSxFQUFDLENBQUM7RUFDakUsTUFBTVMsR0FBRyxDQUFDVSxlQUFlLEVBQUU7RUFDM0IsTUFBTWMsSUFBSSxHQUFHcEMsT0FBTyxDQUFDMkIsY0FBYyxDQUFDeEIsU0FBUyxDQUFDO0VBVTlDLE1BQU00RSxRQUFRLEdBQUcsTUFBTW5FLEdBQUcsQ0FBQ29CLFdBQVcsRUFBRTtFQUN4QyxNQUFNVSxFQUFFLEdBQUcsTUFBTVosTUFBTSxDQUFDUSxXQUFXLENBQUMsSUFBSSxFQUNyQyxlQUFjeUMsUUFBUSxJQUFJLEVBQUUsR0FBRyxVQUFVLEdBQUcsVUFBVyxxQkFBb0IsRUFDNUUsS0FBSyxDQUNOO0VBQ0QsTUFBTXZCLE9BQU8sR0FBRyxNQUFNMUIsTUFBTSxDQUFDa0QsV0FBVyxDQUFDbkMsYUFBSSxDQUFDQyxhQUFhLENBQUNKLEVBQUUsQ0FBQyxDQUFDO0VBQ2hFLE1BQU11QyxJQUFJLEdBQUcsTUFBTW5ELE1BQU0sQ0FBQ29ELE9BQU8sQ0FBQ3JDLGFBQUksQ0FBQ0MsYUFBYSxDQUFDSixFQUFFLENBQUMsQ0FBQztFQUV6RCxNQUFNeUIsT0FBTyxHQUFHbkUsT0FBTyxDQUFDa0UsaUJBQWlCLENBQUM5QixJQUFJLEVBQUVvQixPQUFPLEVBQUV5QixJQUFJLENBQUNFLEtBQUssR0FBRyxDQUFDLENBQUM7RUFFeEUsTUFBTXJELE1BQU0sQ0FBQ3NELFlBQVksQ0FBQ2pCLE9BQU8sQ0FBQztFQUVsQyxNQUFNLElBQUFqQyxlQUFLLEVBQUNyQyxnQkFBZ0IsQ0FBQztBQUMvQixDQUFDO0FBRURHLE9BQU8sQ0FBQ1YsVUFBVSxHQUFHQSxVQUFVO0FBQy9CVSxPQUFPLENBQUNULG9CQUFvQixHQUFHQSxvQkFBb0I7QUFDbkRTLE9BQU8sQ0FBQ1IsZUFBZSxHQUFHQSxlQUFlO0FBQ3pDUSxPQUFPLENBQUNQLGNBQWMsR0FBR0EsY0FBYztBQUN2Q08sT0FBTyxDQUFDTixrQkFBa0IsR0FBR0Esa0JBQWtCO0FBQUMsZUFNakNNLE9BQU87QUFBQSJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unlock-helpers.js","names":["PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","FINGERPRINT_UNLOCK","UNLOCK_TYPES","KEYCODE_NUMPAD_ENTER","UNLOCK_WAIT_TIME","INPUT_KEYS_WAIT_TIME","NUMBER_ZERO_KEYCODE","helpers","validateUnlockCapabilities","caps","unlockKey","unlockType","_","isNil","Error","includes","test","trim","fastUnlock","adb","opts","credential","credentialType","logger","info","wasLockEnabled","isLockEnabled","clearLockCredential","cycleWakeUp","dismissKeyguard","setLockCredential","encodePassword","key","replace","stringKeyToArr","split","fingerprintUnlock","driver","capabilities","getApiLevel","fingerprint","sleep","pinUnlock","keys","els","findElOrEls","isEmpty","pinUnlockWithKeyEvent","pins","el","text","getAttribute","util","unwrapElement","pin","click","waitForUnlock","isScreenLocked","keyevent","shell","parseInt","passwordUnlock","getPatternKeyPosition","initPos","piece","cols","xPos","x","Math","round","yPos","y","ceil","getPatternActions","actions","lastPos","keyPos","push","action","options","element","moveTo","diffX","abs","diffY","patternUnlock","apiLevel","getLocation","size","getSize","width","performTouch"],"sources":["../../lib/unlock-helpers.js"],"sourcesContent":["import logger from './logger';\nimport { sleep } from 'asyncbox';\nimport _ from 'lodash';\nimport { util } from 'appium/support';\n\nconst PIN_UNLOCK = 'pin';\nconst PIN_UNLOCK_KEY_EVENT = 'pinWithKeyEvent';\nconst PASSWORD_UNLOCK = 'password';\nconst PATTERN_UNLOCK = 'pattern';\nconst FINGERPRINT_UNLOCK = 'fingerprint';\nconst UNLOCK_TYPES = [\n PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK,\n PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n];\nconst KEYCODE_NUMPAD_ENTER = 66;\nconst UNLOCK_WAIT_TIME = 100;\nconst INPUT_KEYS_WAIT_TIME = 100;\nconst NUMBER_ZERO_KEYCODE = 7;\n\nconst helpers = {};\n\nhelpers.validateUnlockCapabilities = function validateUnlockCapabilities (caps = {}) {\n const {\n unlockKey,\n unlockType,\n } = caps;\n if (_.isNil(unlockKey) || unlockKey === '') {\n throw new Error('A non-empty unlock key value must be provided');\n }\n\n if ([PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, FINGERPRINT_UNLOCK].includes(unlockType)) {\n if (!/^[0-9]+$/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must only consist of digits`);\n }\n } else if (unlockType === PATTERN_UNLOCK) {\n if (!/^[1-9]{2,9}$/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must only include from two to nine digits in range 1..9`);\n }\n if (/([1-9]).*?\\1/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must define a valid pattern where repeats are not allowed`);\n }\n } else if (unlockType === PASSWORD_UNLOCK) {\n // Dont trim password key, you can use blank spaces in your android password\n // ¯\\_(ツ)_/¯\n if (!/.{4,}/g.test(unlockKey)) {\n throw new Error(`The minimum allowed length of unlock key value '${unlockKey}' is 4 characters`);\n }\n } else {\n throw new Error(`Invalid unlock type '${unlockType}'. ` +\n `Only the following unlock types are supported: ${UNLOCK_TYPES}`);\n }\n return caps;\n};\n\nhelpers.fastUnlock = async function fastUnlock (adb, opts = {}) {\n const {\n credential,\n credentialType,\n } = opts;\n logger.info(`Unlocking the device via ADB using ${credentialType} credential '${credential}'`);\n const wasLockEnabled = await adb.isLockEnabled();\n if (wasLockEnabled) {\n await adb.clearLockCredential(credential);\n // not sure why, but the device's screen still remains locked\n // if a preliminary wake up cycle has not been performed\n await adb.cycleWakeUp();\n } else {\n logger.info('No active lock has been detected. Proceeding to the keyguard dismissal');\n }\n try {\n await adb.dismissKeyguard();\n } finally {\n if (wasLockEnabled) {\n await adb.setLockCredential(credentialType, credential);\n }\n }\n};\n\nhelpers.encodePassword = function encodePassword (key) {\n return `${key}`.replace(/\\s/ig, '%s');\n};\n\nhelpers.stringKeyToArr = function stringKeyToArr (key) {\n return `${key}`.trim().replace(/\\s+/g, '').split(/\\s*/);\n};\n\nhelpers.fingerprintUnlock = async function fingerprintUnlock (adb, driver, capabilities) {\n if (await adb.getApiLevel() < 23) {\n throw new Error('Fingerprint unlock only works for Android 6+ emulators');\n }\n await adb.fingerprint(capabilities.unlockKey);\n await sleep(UNLOCK_WAIT_TIME);\n};\n\nhelpers.pinUnlock = async function pinUnlock (adb, driver, capabilities) {\n logger.info(`Trying to unlock device using pin ${capabilities.unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(capabilities.unlockKey);\n if (await adb.getApiLevel() >= 21) {\n const els = await driver.findElOrEls('id', 'com.android.systemui:id/digit_text', true);\n if (_.isEmpty(els)) {\n // fallback to pin with key event\n return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);\n }\n const pins = {};\n for (const el of els) {\n const text = await driver.getAttribute('text', util.unwrapElement(el));\n pins[text] = el;\n }\n for (const pin of keys) {\n const el = pins[pin];\n await driver.click(util.unwrapElement(el));\n }\n } else {\n for (const pin of keys) {\n const el = await driver.findElOrEls('id', `com.android.keyguard:id/key${pin}`, false);\n if (el === null) {\n // fallback to pin with key event\n return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);\n }\n await driver.click(util.unwrapElement(el));\n }\n }\n await waitForUnlock(adb);\n};\n\n/**\n * Wait for the display to be unlocked.\n * Some devices automatically accept typed 'pin' and 'password' code\n * without pressing the Enter key. But some devices need it.\n * This method waits a few seconds first for such automatic acceptance case.\n * If the device is still locked, then this method will try to send\n * the enter key code.\n *\n * @param {ADB} adb The instance of ADB\n */\nasync function waitForUnlock (adb) {\n await sleep(UNLOCK_WAIT_TIME);\n if (!await adb.isScreenLocked()) {\n return;\n }\n\n await adb.keyevent(KEYCODE_NUMPAD_ENTER);\n await sleep(UNLOCK_WAIT_TIME);\n}\n\nhelpers.pinUnlockWithKeyEvent = async function pinUnlockWithKeyEvent (adb, driver, capabilities) {\n logger.info(`Trying to unlock device using pin with keycode ${capabilities.unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(capabilities.unlockKey);\n\n // Some device does not have system key ids like 'com.android.keyguard:id/key'\n // Then, sending keyevents are more reliable to unlock the screen.\n for (const pin of keys) {\n // 'pin' is number (0-9) in string.\n // Number '0' is keycode '7'. number '9' is keycode '16'.\n await adb.shell(['input', 'keyevent', parseInt(pin, 10) + NUMBER_ZERO_KEYCODE]);\n }\n await waitForUnlock(adb, driver);\n};\n\nhelpers.passwordUnlock = async function passwordUnlock (adb, driver, capabilities) {\n const { unlockKey } = capabilities;\n logger.info(`Trying to unlock device using password ${unlockKey}`);\n await adb.dismissKeyguard();\n // Replace blank spaces with %s\n const key = helpers.encodePassword(unlockKey);\n // Why adb ? It was less flaky\n await adb.shell(['input', 'text', key]);\n // Why sleeps ? Avoid some flakyness waiting for the input to receive the keys\n await sleep(INPUT_KEYS_WAIT_TIME);\n await adb.shell(['input', 'keyevent', KEYCODE_NUMPAD_ENTER]);\n // Waits a bit for the device to be unlocked\n await waitForUnlock(adb, driver);\n};\n\nhelpers.getPatternKeyPosition = function getPatternKeyPosition (key, initPos, piece) {\n /*\n How the math works:\n We have 9 buttons divided in 3 columns and 3 rows inside the lockPatternView,\n every button has a position on the screen corresponding to the lockPatternView since\n it is the parent view right at the middle of each column or row.\n */\n const cols = 3;\n const pins = 9;\n const xPos = (key, x, piece) => Math.round(x + ((key % cols) || cols) * piece - piece / 2);\n const yPos = (key, y, piece) => Math.round(y + (Math.ceil(((key % pins) || pins) / cols) * piece - piece / 2));\n return {\n x: xPos(key, initPos.x, piece),\n y: yPos(key, initPos.y, piece)\n };\n};\n\nhelpers.getPatternActions = function getPatternActions (keys, initPos, piece) {\n const actions = [];\n let lastPos;\n for (let key of keys) {\n const keyPos = helpers.getPatternKeyPosition(key, initPos, piece);\n if (key === keys[0]) {\n actions.push({action: 'press', options: {element: null, x: keyPos.x, y: keyPos.y}});\n lastPos = keyPos;\n continue;\n }\n const moveTo = {x: 0, y: 0};\n const diffX = keyPos.x - lastPos.x;\n if (diffX > 0) {\n moveTo.x = piece;\n if (Math.abs(diffX) > piece) {\n moveTo.x += piece;\n }\n } else if (diffX < 0) {\n moveTo.x = -1 * piece;\n if (Math.abs(diffX) > piece) {\n moveTo.x -= piece;\n }\n }\n const diffY = keyPos.y - lastPos.y;\n if (diffY > 0) {\n moveTo.y = piece;\n if (Math.abs(diffY) > piece) {\n moveTo.y += piece;\n }\n } else if (diffY < 0) {\n moveTo.y = -1 * piece;\n if (Math.abs(diffY) > piece) {\n moveTo.y -= piece;\n }\n }\n actions.push({\n action: 'moveTo',\n options: {element: null, x: moveTo.x + lastPos.x, y: moveTo.y + lastPos.y}\n });\n lastPos = keyPos;\n }\n actions.push({action: 'release'});\n return actions;\n};\n\nhelpers.patternUnlock = async function patternUnlock (adb, driver, capabilities) {\n const { unlockKey } = capabilities;\n logger.info(`Trying to unlock device using pattern ${unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(unlockKey);\n /* We set the device pattern buttons as number of a regular phone\n * | • • • | | 1 2 3 |\n * | • • • | --> | 4 5 6 |\n * | • • • | | 7 8 9 |\n\n The pattern view buttons are not seeing by the uiautomator since they are\n included inside a FrameLayout, so we are going to try clicking on the buttons\n using the parent view bounds and math.\n */\n const apiLevel = await adb.getApiLevel();\n const el = await driver.findElOrEls('id',\n `com.android.${apiLevel >= 21 ? 'systemui' : 'keyguard'}:id/lockPatternView`,\n false\n );\n const initPos = await driver.getLocation(util.unwrapElement(el));\n const size = await driver.getSize(util.unwrapElement(el));\n // Get actions to perform\n const actions = helpers.getPatternActions(keys, initPos, size.width / 3);\n // Perform gesture\n await driver.performTouch(actions);\n // Waits a bit for the device to be unlocked\n await sleep(UNLOCK_WAIT_TIME);\n};\n\nhelpers.PIN_UNLOCK = PIN_UNLOCK;\nhelpers.PIN_UNLOCK_KEY_EVENT = PIN_UNLOCK_KEY_EVENT;\nhelpers.PASSWORD_UNLOCK = PASSWORD_UNLOCK;\nhelpers.PATTERN_UNLOCK = PATTERN_UNLOCK;\nhelpers.FINGERPRINT_UNLOCK = FINGERPRINT_UNLOCK;\n\nexport {\n PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK, PATTERN_UNLOCK,\n FINGERPRINT_UNLOCK, helpers\n};\nexport default helpers;\n"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AAEA,MAAMA,UAAU,GAAG,KAAnB;;AACA,MAAMC,oBAAoB,GAAG,iBAA7B;;AACA,MAAMC,eAAe,GAAG,UAAxB;;AACA,MAAMC,cAAc,GAAG,SAAvB;;AACA,MAAMC,kBAAkB,GAAG,aAA3B;;AACA,MAAMC,YAAY,GAAG,CACnBL,UADmB,EACPC,oBADO,EACeC,eADf,EAEnBC,cAFmB,EAEHC,kBAFG,CAArB;AAIA,MAAME,oBAAoB,GAAG,EAA7B;AACA,MAAMC,gBAAgB,GAAG,GAAzB;AACA,MAAMC,oBAAoB,GAAG,GAA7B;AACA,MAAMC,mBAAmB,GAAG,CAA5B;AAEA,MAAMC,OAAO,GAAG,EAAhB;;;AAEAA,OAAO,CAACC,0BAAR,GAAqC,SAASA,0BAAT,CAAqCC,IAAI,GAAG,EAA5C,EAAgD;EACnF,MAAM;IACJC,SADI;IAEJC;EAFI,IAGFF,IAHJ;;EAIA,IAAIG,eAAA,CAAEC,KAAF,CAAQH,SAAR,KAAsBA,SAAS,KAAK,EAAxC,EAA4C;IAC1C,MAAM,IAAII,KAAJ,CAAU,+CAAV,CAAN;EACD;;EAED,IAAI,CAACjB,UAAD,EAAaC,oBAAb,EAAmCG,kBAAnC,EAAuDc,QAAvD,CAAgEJ,UAAhE,CAAJ,EAAiF;IAC/E,IAAI,CAAC,WAAWK,IAAX,CAAgBJ,eAAA,CAAEK,IAAF,CAAOP,SAAP,CAAhB,CAAL,EAAyC;MACvC,MAAM,IAAII,KAAJ,CAAW,qBAAoBJ,SAAU,+BAAzC,CAAN;IACD;EACF,CAJD,MAIO,IAAIC,UAAU,KAAKX,cAAnB,EAAmC;IACxC,IAAI,CAAC,eAAegB,IAAf,CAAoBJ,eAAA,CAAEK,IAAF,CAAOP,SAAP,CAApB,CAAL,EAA6C;MAC3C,MAAM,IAAII,KAAJ,CAAW,qBAAoBJ,SAAU,2DAAzC,CAAN;IACD;;IACD,IAAI,eAAeM,IAAf,CAAoBJ,eAAA,CAAEK,IAAF,CAAOP,SAAP,CAApB,CAAJ,EAA4C;MAC1C,MAAM,IAAII,KAAJ,CAAW,qBAAoBJ,SAAU,6DAAzC,CAAN;IACD;EACF,CAPM,MAOA,IAAIC,UAAU,KAAKZ,eAAnB,EAAoC;IAGzC,IAAI,CAAC,SAASiB,IAAT,CAAcN,SAAd,CAAL,EAA+B;MAC7B,MAAM,IAAII,KAAJ,CAAW,mDAAkDJ,SAAU,mBAAvE,CAAN;IACD;EACF,CANM,MAMA;IACL,MAAM,IAAII,KAAJ,CAAW,wBAAuBH,UAAW,KAAnC,GACb,kDAAiDT,YAAa,EAD3D,CAAN;EAED;;EACD,OAAOO,IAAP;AACD,CA/BD;;AAiCAF,OAAO,CAACW,UAAR,GAAqB,eAAeA,UAAf,CAA2BC,GAA3B,EAAgCC,IAAI,GAAG,EAAvC,EAA2C;EAC9D,MAAM;IACJC,UADI;IAEJC;EAFI,IAGFF,IAHJ;;EAIAG,eAAA,CAAOC,IAAP,CAAa,sCAAqCF,cAAe,gBAAeD,UAAW,GAA3F;;EACA,MAAMI,cAAc,GAAG,MAAMN,GAAG,CAACO,aAAJ,EAA7B;;EACA,IAAID,cAAJ,EAAoB;IAClB,MAAMN,GAAG,CAACQ,mBAAJ,CAAwBN,UAAxB,CAAN;IAGA,MAAMF,GAAG,CAACS,WAAJ,EAAN;EACD,CALD,MAKO;IACLL,eAAA,CAAOC,IAAP,CAAY,wEAAZ;EACD;;EACD,IAAI;IACF,MAAML,GAAG,CAACU,eAAJ,EAAN;EACD,CAFD,SAEU;IACR,IAAIJ,cAAJ,EAAoB;MAClB,MAAMN,GAAG,CAACW,iBAAJ,CAAsBR,cAAtB,EAAsCD,UAAtC,CAAN;IACD;EACF;AACF,CAtBD;;AAwBAd,OAAO,CAACwB,cAAR,GAAyB,SAASA,cAAT,CAAyBC,GAAzB,EAA8B;EACrD,OAAQ,GAAEA,GAAI,EAAP,CAASC,OAAT,CAAiB,MAAjB,EAAyB,IAAzB,CAAP;AACD,CAFD;;AAIA1B,OAAO,CAAC2B,cAAR,GAAyB,SAASA,cAAT,CAAyBF,GAAzB,EAA8B;EACrD,OAAQ,GAAEA,GAAI,EAAP,CAASf,IAAT,GAAgBgB,OAAhB,CAAwB,MAAxB,EAAgC,EAAhC,EAAoCE,KAApC,CAA0C,KAA1C,CAAP;AACD,CAFD;;AAIA5B,OAAO,CAAC6B,iBAAR,GAA4B,eAAeA,iBAAf,CAAkCjB,GAAlC,EAAuCkB,MAAvC,EAA+CC,YAA/C,EAA6D;EACvF,IAAI,OAAMnB,GAAG,CAACoB,WAAJ,EAAN,IAA0B,EAA9B,EAAkC;IAChC,MAAM,IAAIzB,KAAJ,CAAU,wDAAV,CAAN;EACD;;EACD,MAAMK,GAAG,CAACqB,WAAJ,CAAgBF,YAAY,CAAC5B,SAA7B,CAAN;EACA,MAAM,IAAA+B,eAAA,EAAMrC,gBAAN,CAAN;AACD,CAND;;AAQAG,OAAO,CAACmC,SAAR,GAAoB,eAAeA,SAAf,CAA0BvB,GAA1B,EAA+BkB,MAA/B,EAAuCC,YAAvC,EAAqD;EACvEf,eAAA,CAAOC,IAAP,CAAa,qCAAoCc,YAAY,CAAC5B,SAAU,EAAxE;;EACA,MAAMS,GAAG,CAACU,eAAJ,EAAN;EACA,MAAMc,IAAI,GAAGpC,OAAO,CAAC2B,cAAR,CAAuBI,YAAY,CAAC5B,SAApC,CAAb;;EACA,IAAI,OAAMS,GAAG,CAACoB,WAAJ,EAAN,KAA2B,EAA/B,EAAmC;IACjC,MAAMK,GAAG,GAAG,MAAMP,MAAM,CAACQ,WAAP,CAAmB,IAAnB,EAAyB,oCAAzB,EAA+D,IAA/D,CAAlB;;IACA,IAAIjC,eAAA,CAAEkC,OAAF,CAAUF,GAAV,CAAJ,EAAoB;MAElB,OAAO,MAAMrC,OAAO,CAACwC,qBAAR,CAA8B5B,GAA9B,EAAmCkB,MAAnC,EAA2CC,YAA3C,CAAb;IACD;;IACD,MAAMU,IAAI,GAAG,EAAb;;IACA,KAAK,MAAMC,EAAX,IAAiBL,GAAjB,EAAsB;MACpB,MAAMM,IAAI,GAAG,MAAMb,MAAM,CAACc,YAAP,CAAoB,MAApB,EAA4BC,aAAA,CAAKC,aAAL,CAAmBJ,EAAnB,CAA5B,CAAnB;MACAD,IAAI,CAACE,IAAD,CAAJ,GAAaD,EAAb;IACD;;IACD,KAAK,MAAMK,GAAX,IAAkBX,IAAlB,EAAwB;MACtB,MAAMM,EAAE,GAAGD,IAAI,CAACM,GAAD,CAAf;MACA,MAAMjB,MAAM,CAACkB,KAAP,CAAaH,aAAA,CAAKC,aAAL,CAAmBJ,EAAnB,CAAb,CAAN;IACD;EACF,CAfD,MAeO;IACL,KAAK,MAAMK,GAAX,IAAkBX,IAAlB,EAAwB;MACtB,MAAMM,EAAE,GAAG,MAAMZ,MAAM,CAACQ,WAAP,CAAmB,IAAnB,EAA0B,8BAA6BS,GAAI,EAA3D,EAA8D,KAA9D,CAAjB;;MACA,IAAIL,EAAE,KAAK,IAAX,EAAiB;QAEf,OAAO,MAAM1C,OAAO,CAACwC,qBAAR,CAA8B5B,GAA9B,EAAmCkB,MAAnC,EAA2CC,YAA3C,CAAb;MACD;;MACD,MAAMD,MAAM,CAACkB,KAAP,CAAaH,aAAA,CAAKC,aAAL,CAAmBJ,EAAnB,CAAb,CAAN;IACD;EACF;;EACD,MAAMO,aAAa,CAACrC,GAAD,CAAnB;AACD,CA9BD;;AA0CA,eAAeqC,aAAf,CAA8BrC,GAA9B,EAAmC;EACjC,MAAM,IAAAsB,eAAA,EAAMrC,gBAAN,CAAN;;EACA,IAAI,EAAC,MAAMe,GAAG,CAACsC,cAAJ,EAAP,CAAJ,EAAiC;IAC/B;EACD;;EAED,MAAMtC,GAAG,CAACuC,QAAJ,CAAavD,oBAAb,CAAN;EACA,MAAM,IAAAsC,eAAA,EAAMrC,gBAAN,CAAN;AACD;;AAEDG,OAAO,CAACwC,qBAAR,GAAgC,eAAeA,qBAAf,CAAsC5B,GAAtC,EAA2CkB,MAA3C,EAAmDC,YAAnD,EAAiE;EAC/Ff,eAAA,CAAOC,IAAP,CAAa,kDAAiDc,YAAY,CAAC5B,SAAU,EAArF;;EACA,MAAMS,GAAG,CAACU,eAAJ,EAAN;EACA,MAAMc,IAAI,GAAGpC,OAAO,CAAC2B,cAAR,CAAuBI,YAAY,CAAC5B,SAApC,CAAb;;EAIA,KAAK,MAAM4C,GAAX,IAAkBX,IAAlB,EAAwB;IAGtB,MAAMxB,GAAG,CAACwC,KAAJ,CAAU,CAAC,OAAD,EAAU,UAAV,EAAsBC,QAAQ,CAACN,GAAD,EAAM,EAAN,CAAR,GAAoBhD,mBAA1C,CAAV,CAAN;EACD;;EACD,MAAMkD,aAAa,CAACrC,GAAD,EAAMkB,MAAN,CAAnB;AACD,CAbD;;AAeA9B,OAAO,CAACsD,cAAR,GAAyB,eAAeA,cAAf,CAA+B1C,GAA/B,EAAoCkB,MAApC,EAA4CC,YAA5C,EAA0D;EACjF,MAAM;IAAE5B;EAAF,IAAgB4B,YAAtB;;EACAf,eAAA,CAAOC,IAAP,CAAa,0CAAyCd,SAAU,EAAhE;;EACA,MAAMS,GAAG,CAACU,eAAJ,EAAN;EAEA,MAAMG,GAAG,GAAGzB,OAAO,CAACwB,cAAR,CAAuBrB,SAAvB,CAAZ;EAEA,MAAMS,GAAG,CAACwC,KAAJ,CAAU,CAAC,OAAD,EAAU,MAAV,EAAkB3B,GAAlB,CAAV,CAAN;EAEA,MAAM,IAAAS,eAAA,EAAMpC,oBAAN,CAAN;EACA,MAAMc,GAAG,CAACwC,KAAJ,CAAU,CAAC,OAAD,EAAU,UAAV,EAAsBxD,oBAAtB,CAAV,CAAN;EAEA,MAAMqD,aAAa,CAACrC,GAAD,EAAMkB,MAAN,CAAnB;AACD,CAbD;;AAeA9B,OAAO,CAACuD,qBAAR,GAAgC,SAASA,qBAAT,CAAgC9B,GAAhC,EAAqC+B,OAArC,EAA8CC,KAA9C,EAAqD;EAOnF,MAAMC,IAAI,GAAG,CAAb;EACA,MAAMjB,IAAI,GAAG,CAAb;;EACA,MAAMkB,IAAI,GAAG,CAAClC,GAAD,EAAMmC,CAAN,EAASH,KAAT,KAAmBI,IAAI,CAACC,KAAL,CAAWF,CAAC,GAAG,CAAEnC,GAAG,GAAGiC,IAAP,IAAgBA,IAAjB,IAAyBD,KAA7B,GAAqCA,KAAK,GAAG,CAAxD,CAAhC;;EACA,MAAMM,IAAI,GAAG,CAACtC,GAAD,EAAMuC,CAAN,EAASP,KAAT,KAAmBI,IAAI,CAACC,KAAL,CAAWE,CAAC,IAAIH,IAAI,CAACI,IAAL,CAAU,CAAExC,GAAG,GAAGgB,IAAP,IAAgBA,IAAjB,IAAyBiB,IAAnC,IAA2CD,KAA3C,GAAmDA,KAAK,GAAG,CAA/D,CAAZ,CAAhC;;EACA,OAAO;IACLG,CAAC,EAAED,IAAI,CAAClC,GAAD,EAAM+B,OAAO,CAACI,CAAd,EAAiBH,KAAjB,CADF;IAELO,CAAC,EAAED,IAAI,CAACtC,GAAD,EAAM+B,OAAO,CAACQ,CAAd,EAAiBP,KAAjB;EAFF,CAAP;AAID,CAfD;;AAiBAzD,OAAO,CAACkE,iBAAR,GAA4B,SAASA,iBAAT,CAA4B9B,IAA5B,EAAkCoB,OAAlC,EAA2CC,KAA3C,EAAkD;EAC5E,MAAMU,OAAO,GAAG,EAAhB;EACA,IAAIC,OAAJ;;EACA,KAAK,IAAI3C,GAAT,IAAgBW,IAAhB,EAAsB;IACpB,MAAMiC,MAAM,GAAGrE,OAAO,CAACuD,qBAAR,CAA8B9B,GAA9B,EAAmC+B,OAAnC,EAA4CC,KAA5C,CAAf;;IACA,IAAIhC,GAAG,KAAKW,IAAI,CAAC,CAAD,CAAhB,EAAqB;MACnB+B,OAAO,CAACG,IAAR,CAAa;QAACC,MAAM,EAAE,OAAT;QAAkBC,OAAO,EAAE;UAACC,OAAO,EAAE,IAAV;UAAgBb,CAAC,EAAES,MAAM,CAACT,CAA1B;UAA6BI,CAAC,EAAEK,MAAM,CAACL;QAAvC;MAA3B,CAAb;MACAI,OAAO,GAAGC,MAAV;MACA;IACD;;IACD,MAAMK,MAAM,GAAG;MAACd,CAAC,EAAE,CAAJ;MAAOI,CAAC,EAAE;IAAV,CAAf;IACA,MAAMW,KAAK,GAAGN,MAAM,CAACT,CAAP,GAAWQ,OAAO,CAACR,CAAjC;;IACA,IAAIe,KAAK,GAAG,CAAZ,EAAe;MACbD,MAAM,CAACd,CAAP,GAAWH,KAAX;;MACA,IAAII,IAAI,CAACe,GAAL,CAASD,KAAT,IAAkBlB,KAAtB,EAA6B;QAC3BiB,MAAM,CAACd,CAAP,IAAYH,KAAZ;MACD;IACF,CALD,MAKO,IAAIkB,KAAK,GAAG,CAAZ,EAAe;MACpBD,MAAM,CAACd,CAAP,GAAW,CAAC,CAAD,GAAKH,KAAhB;;MACA,IAAII,IAAI,CAACe,GAAL,CAASD,KAAT,IAAkBlB,KAAtB,EAA6B;QAC3BiB,MAAM,CAACd,CAAP,IAAYH,KAAZ;MACD;IACF;;IACD,MAAMoB,KAAK,GAAGR,MAAM,CAACL,CAAP,GAAWI,OAAO,CAACJ,CAAjC;;IACA,IAAIa,KAAK,GAAG,CAAZ,EAAe;MACbH,MAAM,CAACV,CAAP,GAAWP,KAAX;;MACA,IAAII,IAAI,CAACe,GAAL,CAASC,KAAT,IAAkBpB,KAAtB,EAA6B;QAC3BiB,MAAM,CAACV,CAAP,IAAYP,KAAZ;MACD;IACF,CALD,MAKO,IAAIoB,KAAK,GAAG,CAAZ,EAAe;MACpBH,MAAM,CAACV,CAAP,GAAW,CAAC,CAAD,GAAKP,KAAhB;;MACA,IAAII,IAAI,CAACe,GAAL,CAASC,KAAT,IAAkBpB,KAAtB,EAA6B;QAC3BiB,MAAM,CAACV,CAAP,IAAYP,KAAZ;MACD;IACF;;IACDU,OAAO,CAACG,IAAR,CAAa;MACXC,MAAM,EAAE,QADG;MAEXC,OAAO,EAAE;QAACC,OAAO,EAAE,IAAV;QAAgBb,CAAC,EAAEc,MAAM,CAACd,CAAP,GAAWQ,OAAO,CAACR,CAAtC;QAAyCI,CAAC,EAAEU,MAAM,CAACV,CAAP,GAAWI,OAAO,CAACJ;MAA/D;IAFE,CAAb;IAIAI,OAAO,GAAGC,MAAV;EACD;;EACDF,OAAO,CAACG,IAAR,CAAa;IAACC,MAAM,EAAE;EAAT,CAAb;EACA,OAAOJ,OAAP;AACD,CA3CD;;AA6CAnE,OAAO,CAAC8E,aAAR,GAAwB,eAAeA,aAAf,CAA8BlE,GAA9B,EAAmCkB,MAAnC,EAA2CC,YAA3C,EAAyD;EAC/E,MAAM;IAAE5B;EAAF,IAAgB4B,YAAtB;;EACAf,eAAA,CAAOC,IAAP,CAAa,yCAAwCd,SAAU,EAA/D;;EACA,MAAMS,GAAG,CAACU,eAAJ,EAAN;EACA,MAAMc,IAAI,GAAGpC,OAAO,CAAC2B,cAAR,CAAuBxB,SAAvB,CAAb;EAUA,MAAM4E,QAAQ,GAAG,MAAMnE,GAAG,CAACoB,WAAJ,EAAvB;EACA,MAAMU,EAAE,GAAG,MAAMZ,MAAM,CAACQ,WAAP,CAAmB,IAAnB,EACd,eAAcyC,QAAQ,IAAI,EAAZ,GAAiB,UAAjB,GAA8B,UAAW,qBADzC,EAEf,KAFe,CAAjB;EAIA,MAAMvB,OAAO,GAAG,MAAM1B,MAAM,CAACkD,WAAP,CAAmBnC,aAAA,CAAKC,aAAL,CAAmBJ,EAAnB,CAAnB,CAAtB;EACA,MAAMuC,IAAI,GAAG,MAAMnD,MAAM,CAACoD,OAAP,CAAerC,aAAA,CAAKC,aAAL,CAAmBJ,EAAnB,CAAf,CAAnB;EAEA,MAAMyB,OAAO,GAAGnE,OAAO,CAACkE,iBAAR,CAA0B9B,IAA1B,EAAgCoB,OAAhC,EAAyCyB,IAAI,CAACE,KAAL,GAAa,CAAtD,CAAhB;EAEA,MAAMrD,MAAM,CAACsD,YAAP,CAAoBjB,OAApB,CAAN;EAEA,MAAM,IAAAjC,eAAA,EAAMrC,gBAAN,CAAN;AACD,CA3BD;;AA6BAG,OAAO,CAACV,UAAR,GAAqBA,UAArB;AACAU,OAAO,CAACT,oBAAR,GAA+BA,oBAA/B;AACAS,OAAO,CAACR,eAAR,GAA0BA,eAA1B;AACAQ,OAAO,CAACP,cAAR,GAAyBA,cAAzB;AACAO,OAAO,CAACN,kBAAR,GAA6BA,kBAA7B;eAMeM,O"}
|
|
1
|
+
{"version":3,"file":"unlock-helpers.js","names":["PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","FINGERPRINT_UNLOCK","UNLOCK_TYPES","KEYCODE_NUMPAD_ENTER","UNLOCK_WAIT_TIME","INPUT_KEYS_WAIT_TIME","NUMBER_ZERO_KEYCODE","helpers","validateUnlockCapabilities","caps","unlockKey","unlockType","_","isNil","Error","includes","test","trim","fastUnlock","adb","opts","credential","credentialType","logger","info","wasLockEnabled","isLockEnabled","clearLockCredential","cycleWakeUp","dismissKeyguard","setLockCredential","encodePassword","key","replace","stringKeyToArr","split","fingerprintUnlock","driver","capabilities","getApiLevel","fingerprint","sleep","pinUnlock","keys","els","findElOrEls","isEmpty","pinUnlockWithKeyEvent","pins","el","text","getAttribute","util","unwrapElement","pin","click","waitForUnlock","isScreenLocked","keyevent","shell","parseInt","passwordUnlock","getPatternKeyPosition","initPos","piece","cols","xPos","x","Math","round","yPos","y","ceil","getPatternActions","actions","lastPos","keyPos","push","action","options","element","moveTo","diffX","abs","diffY","patternUnlock","apiLevel","getLocation","size","getSize","width","performTouch"],"sources":["../../lib/unlock-helpers.js"],"sourcesContent":["import logger from './logger';\nimport { sleep } from 'asyncbox';\nimport _ from 'lodash';\nimport { util } from 'appium/support';\n\nconst PIN_UNLOCK = 'pin';\nconst PIN_UNLOCK_KEY_EVENT = 'pinWithKeyEvent';\nconst PASSWORD_UNLOCK = 'password';\nconst PATTERN_UNLOCK = 'pattern';\nconst FINGERPRINT_UNLOCK = 'fingerprint';\nconst UNLOCK_TYPES = [\n PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK,\n PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n];\nconst KEYCODE_NUMPAD_ENTER = 66;\nconst UNLOCK_WAIT_TIME = 100;\nconst INPUT_KEYS_WAIT_TIME = 100;\nconst NUMBER_ZERO_KEYCODE = 7;\n\nconst helpers = {};\n\nhelpers.validateUnlockCapabilities = function validateUnlockCapabilities (caps = {}) {\n const {\n unlockKey,\n unlockType,\n } = caps;\n if (_.isNil(unlockKey) || unlockKey === '') {\n throw new Error('A non-empty unlock key value must be provided');\n }\n\n if ([PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, FINGERPRINT_UNLOCK].includes(unlockType)) {\n if (!/^[0-9]+$/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must only consist of digits`);\n }\n } else if (unlockType === PATTERN_UNLOCK) {\n if (!/^[1-9]{2,9}$/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must only include from two to nine digits in range 1..9`);\n }\n if (/([1-9]).*?\\1/.test(_.trim(unlockKey))) {\n throw new Error(`Unlock key value '${unlockKey}' must define a valid pattern where repeats are not allowed`);\n }\n } else if (unlockType === PASSWORD_UNLOCK) {\n // Dont trim password key, you can use blank spaces in your android password\n // ¯\\_(ツ)_/¯\n if (!/.{4,}/g.test(unlockKey)) {\n throw new Error(`The minimum allowed length of unlock key value '${unlockKey}' is 4 characters`);\n }\n } else {\n throw new Error(`Invalid unlock type '${unlockType}'. ` +\n `Only the following unlock types are supported: ${UNLOCK_TYPES}`);\n }\n return caps;\n};\n\nhelpers.fastUnlock = async function fastUnlock (adb, opts = {}) {\n const {\n credential,\n credentialType,\n } = opts;\n logger.info(`Unlocking the device via ADB using ${credentialType} credential '${credential}'`);\n const wasLockEnabled = await adb.isLockEnabled();\n if (wasLockEnabled) {\n await adb.clearLockCredential(credential);\n // not sure why, but the device's screen still remains locked\n // if a preliminary wake up cycle has not been performed\n await adb.cycleWakeUp();\n } else {\n logger.info('No active lock has been detected. Proceeding to the keyguard dismissal');\n }\n try {\n await adb.dismissKeyguard();\n } finally {\n if (wasLockEnabled) {\n await adb.setLockCredential(credentialType, credential);\n }\n }\n};\n\nhelpers.encodePassword = function encodePassword (key) {\n return `${key}`.replace(/\\s/ig, '%s');\n};\n\nhelpers.stringKeyToArr = function stringKeyToArr (key) {\n return `${key}`.trim().replace(/\\s+/g, '').split(/\\s*/);\n};\n\nhelpers.fingerprintUnlock = async function fingerprintUnlock (adb, driver, capabilities) {\n if (await adb.getApiLevel() < 23) {\n throw new Error('Fingerprint unlock only works for Android 6+ emulators');\n }\n await adb.fingerprint(capabilities.unlockKey);\n await sleep(UNLOCK_WAIT_TIME);\n};\n\nhelpers.pinUnlock = async function pinUnlock (adb, driver, capabilities) {\n logger.info(`Trying to unlock device using pin ${capabilities.unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(capabilities.unlockKey);\n if (await adb.getApiLevel() >= 21) {\n const els = await driver.findElOrEls('id', 'com.android.systemui:id/digit_text', true);\n if (_.isEmpty(els)) {\n // fallback to pin with key event\n return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);\n }\n const pins = {};\n for (const el of els) {\n const text = await driver.getAttribute('text', util.unwrapElement(el));\n pins[text] = el;\n }\n for (const pin of keys) {\n const el = pins[pin];\n await driver.click(util.unwrapElement(el));\n }\n } else {\n for (const pin of keys) {\n const el = await driver.findElOrEls('id', `com.android.keyguard:id/key${pin}`, false);\n if (el === null) {\n // fallback to pin with key event\n return await helpers.pinUnlockWithKeyEvent(adb, driver, capabilities);\n }\n await driver.click(util.unwrapElement(el));\n }\n }\n await waitForUnlock(adb);\n};\n\n/**\n * Wait for the display to be unlocked.\n * Some devices automatically accept typed 'pin' and 'password' code\n * without pressing the Enter key. But some devices need it.\n * This method waits a few seconds first for such automatic acceptance case.\n * If the device is still locked, then this method will try to send\n * the enter key code.\n *\n * @param {ADB} adb The instance of ADB\n */\nasync function waitForUnlock (adb) {\n await sleep(UNLOCK_WAIT_TIME);\n if (!await adb.isScreenLocked()) {\n return;\n }\n\n await adb.keyevent(KEYCODE_NUMPAD_ENTER);\n await sleep(UNLOCK_WAIT_TIME);\n}\n\nhelpers.pinUnlockWithKeyEvent = async function pinUnlockWithKeyEvent (adb, driver, capabilities) {\n logger.info(`Trying to unlock device using pin with keycode ${capabilities.unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(capabilities.unlockKey);\n\n // Some device does not have system key ids like 'com.android.keyguard:id/key'\n // Then, sending keyevents are more reliable to unlock the screen.\n for (const pin of keys) {\n // 'pin' is number (0-9) in string.\n // Number '0' is keycode '7'. number '9' is keycode '16'.\n await adb.shell(['input', 'keyevent', parseInt(pin, 10) + NUMBER_ZERO_KEYCODE]);\n }\n await waitForUnlock(adb, driver);\n};\n\nhelpers.passwordUnlock = async function passwordUnlock (adb, driver, capabilities) {\n const { unlockKey } = capabilities;\n logger.info(`Trying to unlock device using password ${unlockKey}`);\n await adb.dismissKeyguard();\n // Replace blank spaces with %s\n const key = helpers.encodePassword(unlockKey);\n // Why adb ? It was less flaky\n await adb.shell(['input', 'text', key]);\n // Why sleeps ? Avoid some flakyness waiting for the input to receive the keys\n await sleep(INPUT_KEYS_WAIT_TIME);\n await adb.shell(['input', 'keyevent', KEYCODE_NUMPAD_ENTER]);\n // Waits a bit for the device to be unlocked\n await waitForUnlock(adb, driver);\n};\n\nhelpers.getPatternKeyPosition = function getPatternKeyPosition (key, initPos, piece) {\n /*\n How the math works:\n We have 9 buttons divided in 3 columns and 3 rows inside the lockPatternView,\n every button has a position on the screen corresponding to the lockPatternView since\n it is the parent view right at the middle of each column or row.\n */\n const cols = 3;\n const pins = 9;\n const xPos = (key, x, piece) => Math.round(x + ((key % cols) || cols) * piece - piece / 2);\n const yPos = (key, y, piece) => Math.round(y + (Math.ceil(((key % pins) || pins) / cols) * piece - piece / 2));\n return {\n x: xPos(key, initPos.x, piece),\n y: yPos(key, initPos.y, piece)\n };\n};\n\nhelpers.getPatternActions = function getPatternActions (keys, initPos, piece) {\n const actions = [];\n let lastPos;\n for (let key of keys) {\n const keyPos = helpers.getPatternKeyPosition(key, initPos, piece);\n if (key === keys[0]) {\n actions.push({action: 'press', options: {element: null, x: keyPos.x, y: keyPos.y}});\n lastPos = keyPos;\n continue;\n }\n const moveTo = {x: 0, y: 0};\n const diffX = keyPos.x - lastPos.x;\n if (diffX > 0) {\n moveTo.x = piece;\n if (Math.abs(diffX) > piece) {\n moveTo.x += piece;\n }\n } else if (diffX < 0) {\n moveTo.x = -1 * piece;\n if (Math.abs(diffX) > piece) {\n moveTo.x -= piece;\n }\n }\n const diffY = keyPos.y - lastPos.y;\n if (diffY > 0) {\n moveTo.y = piece;\n if (Math.abs(diffY) > piece) {\n moveTo.y += piece;\n }\n } else if (diffY < 0) {\n moveTo.y = -1 * piece;\n if (Math.abs(diffY) > piece) {\n moveTo.y -= piece;\n }\n }\n actions.push({\n action: 'moveTo',\n options: {element: null, x: moveTo.x + lastPos.x, y: moveTo.y + lastPos.y}\n });\n lastPos = keyPos;\n }\n actions.push({action: 'release'});\n return actions;\n};\n\nhelpers.patternUnlock = async function patternUnlock (adb, driver, capabilities) {\n const { unlockKey } = capabilities;\n logger.info(`Trying to unlock device using pattern ${unlockKey}`);\n await adb.dismissKeyguard();\n const keys = helpers.stringKeyToArr(unlockKey);\n /* We set the device pattern buttons as number of a regular phone\n * | • • • | | 1 2 3 |\n * | • • • | --> | 4 5 6 |\n * | • • • | | 7 8 9 |\n\n The pattern view buttons are not seeing by the uiautomator since they are\n included inside a FrameLayout, so we are going to try clicking on the buttons\n using the parent view bounds and math.\n */\n const apiLevel = await adb.getApiLevel();\n const el = await driver.findElOrEls('id',\n `com.android.${apiLevel >= 21 ? 'systemui' : 'keyguard'}:id/lockPatternView`,\n false\n );\n const initPos = await driver.getLocation(util.unwrapElement(el));\n const size = await driver.getSize(util.unwrapElement(el));\n // Get actions to perform\n const actions = helpers.getPatternActions(keys, initPos, size.width / 3);\n // Perform gesture\n await driver.performTouch(actions);\n // Waits a bit for the device to be unlocked\n await sleep(UNLOCK_WAIT_TIME);\n};\n\nhelpers.PIN_UNLOCK = PIN_UNLOCK;\nhelpers.PIN_UNLOCK_KEY_EVENT = PIN_UNLOCK_KEY_EVENT;\nhelpers.PASSWORD_UNLOCK = PASSWORD_UNLOCK;\nhelpers.PATTERN_UNLOCK = PATTERN_UNLOCK;\nhelpers.FINGERPRINT_UNLOCK = FINGERPRINT_UNLOCK;\n\nexport {\n PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT, PASSWORD_UNLOCK, PATTERN_UNLOCK,\n FINGERPRINT_UNLOCK, helpers\n};\nexport default helpers;\n"],"mappings":"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"}
|
package/build/lib/utils.js
CHANGED
|
@@ -1,25 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.requireArgs = requireArgs;
|
|
9
|
-
|
|
10
8
|
require("source-map-support/register");
|
|
11
|
-
|
|
12
9
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
13
|
-
|
|
14
10
|
var _driver = require("appium/driver");
|
|
15
|
-
|
|
16
11
|
function requireArgs(argNames, opts = {}) {
|
|
17
12
|
for (const argName of _lodash.default.isArray(argNames) ? argNames : [argNames]) {
|
|
18
13
|
if (!_lodash.default.has(opts, argName)) {
|
|
19
14
|
throw new _driver.errors.InvalidArgumentError(`'${argName}' argument must be provided`);
|
|
20
15
|
}
|
|
21
16
|
}
|
|
22
|
-
|
|
23
17
|
return opts;
|
|
24
18
|
}
|
|
25
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlQXJncyIsImFyZ05hbWVzIiwib3B0cyIsImFyZ05hbWUiLCJfIiwiaXNBcnJheSIsImhhcyIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+
|
|
19
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlQXJncyIsImFyZ05hbWVzIiwib3B0cyIsImFyZ05hbWUiLCJfIiwiaXNBcnJheSIsImhhcyIsImVycm9ycyIsIkludmFsaWRBcmd1bWVudEVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcblxuXG4vKipcbiAqIEFzc2VydCB0aGUgcHJlc2VuY2Ugb2YgcGFydGljdWxhciBrZXlzIGluIHRoZSBnaXZlbiBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xBcnJheTxzdHJpbmc+fSBhcmdOYW1lcyBvbmUgb3IgbW9yZSBrZXkgbmFtZXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIHRoZSBvYmplY3QgdG8gY2hlY2tcbiAqIEByZXR1cm5zIHtPYmplY3R9IHRoZSBzYW1lIGdpdmVuIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUFyZ3MgKGFyZ05hbWVzLCBvcHRzID0ge30pIHtcbiAgZm9yIChjb25zdCBhcmdOYW1lIG9mIChfLmlzQXJyYXkoYXJnTmFtZXMpID8gYXJnTmFtZXMgOiBbYXJnTmFtZXNdKSkge1xuICAgIGlmICghXy5oYXMob3B0cywgYXJnTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZEFyZ3VtZW50RXJyb3IoYCcke2FyZ05hbWV9JyBhcmd1bWVudCBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvcHRzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFVTyxTQUFTQSxXQUFXLENBQUVDLFFBQVEsRUFBRUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQ2hELEtBQUssTUFBTUMsT0FBTyxJQUFLQyxlQUFDLENBQUNDLE9BQU8sQ0FBQ0osUUFBUSxDQUFDLEdBQUdBLFFBQVEsR0FBRyxDQUFDQSxRQUFRLENBQUMsRUFBRztJQUNuRSxJQUFJLENBQUNHLGVBQUMsQ0FBQ0UsR0FBRyxDQUFDSixJQUFJLEVBQUVDLE9BQU8sQ0FBQyxFQUFFO01BQ3pCLE1BQU0sSUFBSUksY0FBTSxDQUFDQyxvQkFBb0IsQ0FBRSxJQUFHTCxPQUFRLDZCQUE0QixDQUFDO0lBQ2pGO0VBQ0Y7RUFDQSxPQUFPRCxJQUFJO0FBQ2IifQ==
|
package/build/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @param {string|Array<string>} argNames one or more key names\n * @param {Object} opts the object to check\n * @returns {Object} the same given object\n */\nexport function requireArgs (argNames, opts = {}) {\n for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {\n if (!_.has(opts, argName)) {\n throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);\n }\n }\n return opts;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","names":["requireArgs","argNames","opts","argName","_","isArray","has","errors","InvalidArgumentError"],"sources":["../../lib/utils.js"],"sourcesContent":["import _ from 'lodash';\nimport { errors } from 'appium/driver';\n\n\n/**\n * Assert the presence of particular keys in the given object\n *\n * @param {string|Array<string>} argNames one or more key names\n * @param {Object} opts the object to check\n * @returns {Object} the same given object\n */\nexport function requireArgs (argNames, opts = {}) {\n for (const argName of (_.isArray(argNames) ? argNames : [argNames])) {\n if (!_.has(opts, argName)) {\n throw new errors.InvalidArgumentError(`'${argName}' argument must be provided`);\n }\n }\n return opts;\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AAUO,SAASA,WAAW,CAAEC,QAAQ,EAAEC,IAAI,GAAG,CAAC,CAAC,EAAE;EAChD,KAAK,MAAMC,OAAO,IAAKC,eAAC,CAACC,OAAO,CAACJ,QAAQ,CAAC,GAAGA,QAAQ,GAAG,CAACA,QAAQ,CAAC,EAAG;IACnE,IAAI,CAACG,eAAC,CAACE,GAAG,CAACJ,IAAI,EAAEC,OAAO,CAAC,EAAE;MACzB,MAAM,IAAII,cAAM,CAACC,oBAAoB,CAAE,IAAGL,OAAQ,6BAA4B,CAAC;IACjF;EACF;EACA,OAAOD,IAAI;AACb"}
|